diff --git a/Build/Resources/Public/Sass/component/_callout.scss b/Build/Resources/Public/Sass/component/_callout.scss index 938d407ff64f74799e7bdd01f7decabc168e5e55..46ac258e9f65107b4ea1f0e931cd3092ec173352 100644 --- a/Build/Resources/Public/Sass/component/_callout.scss +++ b/Build/Resources/Public/Sass/component/_callout.scss @@ -109,7 +109,20 @@ $callout-notice-border: $state-notice-border; } // -// Variants +// Size Variants +// +.callout-sm { + margin: 10px 0; + padding: $callout-padding/2; + + .callout-title { + font-size: 1em; + margin: 0; + } +} + +// +// Color Variants // @mixin callout-variant($background, $border, $text-color, $icon-color) { background-color: $background; diff --git a/Build/Resources/Public/Sass/install.scss b/Build/Resources/Public/Sass/install.scss index 83b015b9967e3b5171b7f87cd49a0685d7b974e5..dc99de20a4650dc6f487df095b25c379d3c0e75f 100644 --- a/Build/Resources/Public/Sass/install.scss +++ b/Build/Resources/Public/Sass/install.scss @@ -3,11 +3,11 @@ // ========= // Contains all needed styles for the TYPO3 Intall Tool. // - // // Load global Variables // @import "variables/main"; + $grid-float-breakpoint: $screen-md-min; // @@ -19,6 +19,18 @@ $grid-float-breakpoint: $screen-md-min; // Include chosen CSS file // @import "libs/chosen"; +@import "libs/gridder"; +@import "component/card"; + +// +// Include elements +// + +@import "typo3/element_docheader"; + +body.backend .module { + background: $gray-lighter; +} .content-area { padding-bottom: 35px; @@ -298,15 +310,15 @@ a[data-toggle="collapse"] { text-decoration: none; } -.panel-group-rst, -.panel-group-flat { +.panel-group-flat, +.panel-group-rst { .panel-body { padding-right: 0; } } -.panel-rst, .panel-flat, +.panel-rst, .panel-version { border: 0; border-left: 2px solid $gray-light; diff --git a/Build/Resources/Public/Sass/libs/_gridder.scss b/Build/Resources/Public/Sass/libs/_gridder.scss new file mode 100644 index 0000000000000000000000000000000000000000..530dc761420e7e498e46739b05a5e08d201409ee --- /dev/null +++ b/Build/Resources/Public/Sass/libs/_gridder.scss @@ -0,0 +1,119 @@ +// +// Gridder +// ==== +// Gridder for typo3 +// +// +// Variables +// +$gridder-spacing: 15px; +$gridder-padding: 10px; +$gridder-show-bg: white; +$gridder-base-color: #000; +$gridder-border-color: lighten($gridder-base-color, 80); +$gridder-border-hover-color: lighten($gridder-base-color, 70); +$gridder-shadow-color: transparentize($gridder-base-color, 0.8); +$gridder-shadow-hover-color: transparentize($gridder-base-color, 0.7); +$gridder-badge-size: 20px; + +@mixin rowMachine($numPerRow, $margin) { + width: (100% / $numPerRow); +} + +// VITAL CSS +.gridder { + margin: $gridder-spacing; + margin-left: -$gridder-spacing; + margin-right: -$gridder-spacing; + padding: 0; + list-style-type: none; + font-size: 0; +} + +.gridder-list, +.gridder-show { + font-size: $font-size-base; +} + +.gridder-list { + display: inline-block; + vertical-align: top; + padding-left: $gridder-spacing; + padding-right: $gridder-spacing; + position: relative; + + &.selectedItem:after { + position: absolute; + border: $gridder-spacing solid transparent; + border-bottom-color: $gridder-show-bg; + border-top: 0; + bottom: 0; + left: 50%; + margin-left: -$gridder-spacing/2; + content: ''; + } + + .gridder-item { + background-color: white; + box-shadow: 0 2px 0 $gridder-shadow-color; + border: 1px solid $gridder-border-color; + margin-bottom: $gridder-spacing*2; + padding: $gridder-padding; + min-height: 200px; + transition: all 0.2s ease-in-out; + transition-property: box-shadow, border, transform; + cursor: pointer; + position: relative; + + &:focus, + &:hover { + text-decoration: none; + border: 1px solid $gridder-border-hover-color; + transform: translate(0, -1px); + box-shadow: 0 3px 0 $gridder-shadow-hover-color; + } + + .label { + padding: 3px 6px; + font-size: 12px; + vertical-align: top; + border-radius: 10px; + min-width: 28px; + display: inline-block; + } + } +} + +.gridder-show { + background-color: $gridder-show-bg; + display: block; + float: left; + width: 100%; + position: relative; + margin-bottom: $gridder-spacing; + + .gridder-padding { + padding: $gridder-spacing*2; + } + + .gridder-title { + border-bottom: 1px solid $gridder-border-color; + margin-bottom: $gridder-spacing; + } +} + +.gridder-content { + display: none; +} + +.gridder-list { + @include rowMachine(1, $gridder-spacing); + + @media (min-width: $screen-sm-min) { + @include rowMachine(2, $gridder-spacing); + } + + @media (min-width: $screen-md-min) { + @include rowMachine(4, $gridder-spacing); + } +} diff --git a/Build/package-lock.json b/Build/package-lock.json index b14b75767f3b52ae168cb0f4d832333c420d9819..a5a027ee0fb162fab4fe88a4b1632e169b664625 100644 --- a/Build/package-lock.json +++ b/Build/package-lock.json @@ -76,6 +76,16 @@ "integrity": "sha1-YeH7qUYi+/pc/TbWO7bUKd9+tsY=", "dev": true }, + "JSONStream": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", + "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", + "dev": true, + "requires": { + "jsonparse": "0.0.5", + "through": "2.3.8" + } + }, "abbrev": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", @@ -3352,16 +3362,6 @@ "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", "dev": true }, - "JSONStream": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", - "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", - "dev": true, - "requires": { - "jsonparse": "0.0.5", - "through": "2.3.8" - } - }, "jsprim": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", @@ -4363,12 +4363,6 @@ } } }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -4380,6 +4374,12 @@ "strip-ansi": "3.0.1" } }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, "stringstream": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", @@ -7214,15 +7214,6 @@ "through": "2.3.8" } }, - "string_decoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", - "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -7234,6 +7225,15 @@ "strip-ansi": "3.0.1" } }, + "string_decoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", + "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, "stringstream": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", diff --git a/typo3/sysext/backend/Classes/Http/BackendModuleRequestHandler.php b/typo3/sysext/backend/Classes/Http/BackendModuleRequestHandler.php index 43a733d3c17f408f140425991bdc1093b510fd7b..64c6df3ade56dd0c3eb7326887958dd0bcc5f813 100644 --- a/typo3/sysext/backend/Classes/Http/BackendModuleRequestHandler.php +++ b/typo3/sysext/backend/Classes/Http/BackendModuleRequestHandler.php @@ -141,7 +141,6 @@ class BackendModuleRequestHandler implements RequestHandlerInterface { $moduleConfiguration = $this->getModuleConfiguration($moduleName); - /** @var Response $response */ $response = GeneralUtility::makeInstance(Response::class); // Check permissions and exit if the user has no permission for entry @@ -165,6 +164,14 @@ class BackendModuleRequestHandler implements RequestHandlerInterface if (isset($moduleConfiguration['routeTarget'])) { $dispatcher = GeneralUtility::makeInstance(Dispatcher::class); $this->request = $this->request->withAttribute('target', $moduleConfiguration['routeTarget']); + // @internal routeParameters are a helper construct for the install tool only. + // @todo: remove this, after sub-actions in install tool can be addressed directly + if (!empty($moduleConfiguration['routeParameters'])) { + $this->request = $this->request->withQueryParams(array_merge_recursive( + $this->request->getQueryParams(), + $moduleConfiguration['routeParameters'] + )); + } $response = $dispatcher->dispatch($this->request, $response); } else { // extbase module diff --git a/typo3/sysext/backend/Resources/Public/Css/backend.css b/typo3/sysext/backend/Resources/Public/Css/backend.css index f62b5078678029783e00cf5f44e0ea600e4ef8f2..34ea56d4bb83115616a91b2d7ffe06d9ccaa73da 100644 --- a/typo3/sysext/backend/Resources/Public/Css/backend.css +++ b/typo3/sysext/backend/Resources/Public/Css/backend.css @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -@charset "UTF-8";.minicolors-panel,.minicolors-picker,hr{box-sizing:content-box}.fa-ul>li,sub,sup{position:relative}.fa-fw,.fa-li{text-align:center}.cropper-container,html{-webkit-tap-highlight-color:transparent}.card,.img-thumbnail{-webkit-transition:all .2s ease-in-out}.img-responsive,.img-thumbnail,.table,label{max-width:100%}.btn,.modulemenu .modulemenu-group-header{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.t3-grid-table,.table-fixed{table-layout:fixed}#nprogress,.cropper .cropper-crop-box:after,.form-control-feedback,a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}.fa,.fa-stack{display:inline-block}a:active,a:hover{outline:0}b,optgroup,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{background:#ff0;color:#000}.btn,.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active,.btn.active,.btn:active,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover,.form-control,.open>.btn-danger.dropdown-toggle,.open>.btn-default.dropdown-toggle,.open>.btn-info.dropdown-toggle,.open>.btn-success.dropdown-toggle,.open>.btn-warning.dropdown-toggle{background-image:none}sub,sup{font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}hr{margin-top:18px;margin-bottom:18px}pre,textarea{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}.fa.fa-pull-left,.fa.pull-left{margin-right:.3em}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}td,th{padding:0}@font-face{font-family:FontAwesome;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.eot?v=4.7.0);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.eot?#iefix&v=4.7.0) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.woff2?v=4.7.0) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.woff?v=4.7.0) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.ttf?v=4.7.0) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa{font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.btn,.btn-group,.btn-group-vertical,.caret,.checkbox-inline,.fa-stack,.radio-inline,img{vertical-align:middle}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa.fa-pull-right,.fa.pull-right{margin-left:.3em}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{position:relative;width:2em;height:2em;line-height:2em}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:"ï€"}.fa-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:"ï€"}.fa-search-plus:before{content:""}.fa-search-minus:before{content:"ï€"}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:"ï€"}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before{content:"ï€"}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:"ï€"}.fa-map-marker:before{content:"ï"}.fa-adjust:before{content:"ï‚"}.fa-tint:before{content:"ïƒ"}.fa-edit:before,.fa-pencil-square-o:before{content:"ï„"}.fa-share-square-o:before{content:"ï…"}.fa-check-square-o:before{content:"ï†"}.fa-arrows:before{content:"ï‡"}.fa-step-backward:before{content:"ïˆ"}.fa-fast-backward:before{content:"ï‰"}.fa-backward:before{content:"ïŠ"}.fa-play:before{content:"ï‹"}.fa-pause:before{content:"ïŒ"}.fa-stop:before{content:"ï"}.fa-forward:before{content:"ïŽ"}.fa-fast-forward:before{content:"ï"}.fa-step-forward:before{content:"ï‘"}.fa-eject:before{content:"ï’"}.fa-chevron-left:before{content:"ï“"}.fa-chevron-right:before{content:"ï”"}.fa-plus-circle:before{content:"ï•"}.fa-minus-circle:before{content:"ï–"}.fa-times-circle:before{content:"ï—"}.fa-check-circle:before{content:"ï˜"}.fa-question-circle:before{content:"ï™"}.fa-info-circle:before{content:"ïš"}.fa-crosshairs:before{content:"ï›"}.fa-times-circle-o:before{content:"ïœ"}.fa-check-circle-o:before{content:"ï"}.fa-ban:before{content:"ïž"}.fa-arrow-left:before{content:"ï "}.fa-arrow-right:before{content:"ï¡"}.fa-arrow-up:before{content:"ï¢"}.fa-arrow-down:before{content:"ï£"}.fa-mail-forward:before,.fa-share:before{content:"ï¤"}.fa-expand:before{content:"ï¥"}.fa-compress:before{content:"ï¦"}.fa-plus:before{content:"ï§"}.fa-minus:before{content:"ï¨"}.fa-asterisk:before{content:"ï©"}.fa-exclamation-circle:before{content:"ïª"}.fa-gift:before{content:"ï«"}.fa-leaf:before{content:"ï¬"}.fa-fire:before{content:"ï"}.fa-eye:before{content:"ï®"}.fa-eye-slash:before{content:"ï°"}.fa-exclamation-triangle:before,.fa-warning:before{content:"ï±"}.fa-plane:before{content:"ï²"}.fa-calendar:before{content:"ï³"}.fa-random:before{content:"ï´"}.fa-comment:before{content:"ïµ"}.fa-magnet:before{content:"ï¶"}.fa-chevron-up:before{content:"ï·"}.fa-chevron-down:before{content:"ï¸"}.fa-retweet:before{content:"ï¹"}.fa-shopping-cart:before{content:"ïº"}.fa-folder:before{content:"ï»"}.fa-folder-open:before{content:"ï¼"}.fa-arrows-v:before{content:"ï½"}.fa-arrows-h:before{content:"ï¾"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"ï‚€"}.fa-twitter-square:before{content:"ï‚"}.fa-facebook-square:before{content:"ï‚‚"}.fa-camera-retro:before{content:""}.fa-key:before{content:"ï‚„"}.fa-cogs:before,.fa-gears:before{content:"ï‚…"}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:"ï‚Š"}.fa-sign-out:before{content:"ï‚‹"}.fa-linkedin-square:before{content:"ï‚Œ"}.fa-thumb-tack:before{content:"ï‚"}.fa-external-link:before{content:"ï‚Ž"}.fa-sign-in:before{content:"ï‚"}.fa-trophy:before{content:"ï‚‘"}.fa-github-square:before{content:"ï‚’"}.fa-upload:before{content:"ï‚“"}.fa-lemon-o:before{content:"ï‚”"}.fa-phone:before{content:"ï‚•"}.fa-square-o:before{content:"ï‚–"}.fa-bookmark-o:before{content:"ï‚—"}.fa-phone-square:before{content:""}.fa-twitter:before{content:"ï‚™"}.fa-facebook-f:before,.fa-facebook:before{content:"ï‚š"}.fa-github:before{content:"ï‚›"}.fa-unlock:before{content:"ï‚œ"}.fa-credit-card:before{content:"ï‚"}.fa-feed:before,.fa-rss:before{content:"ï‚ž"}.fa-hdd-o:before{content:"ï‚ "}.fa-bullhorn:before{content:"ï‚¡"}.fa-bell:before{content:""}.fa-certificate:before{content:"ï‚£"}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:"ï‚¥"}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before{content:""}.fa-arrow-circle-right:before{content:"ï‚©"}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:"ï‚«"}.fa-globe:before{content:""}.fa-wrench:before{content:"ï‚"}.fa-tasks:before{content:"ï‚®"}.fa-filter:before{content:"ï‚°"}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before{content:"ïƒ"}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:"ïƒ"}.fa-table:before{content:""}.fa-magic:before{content:"ïƒ"}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:"ïƒ"}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:"ïƒ "}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:"ïƒ"}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:"ï‚¢"}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:"ï„€"}.fa-angle-double-right:before{content:"ï„"}.fa-angle-double-up:before{content:"ï„‚"}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:"ï„„"}.fa-angle-right:before{content:"ï„…"}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:"ï„Š"}.fa-mobile-phone:before,.fa-mobile:before{content:"ï„‹"}.fa-circle-o:before{content:"ï„Œ"}.fa-quote-left:before{content:"ï„"}.fa-quote-right:before{content:"ï„Ž"}.fa-spinner:before{content:"ï„"}.fa-circle:before{content:"ï„‘"}.fa-mail-reply:before,.fa-reply:before{content:"ï„’"}.fa-github-alt:before{content:"ï„“"}.fa-folder-o:before{content:"ï„”"}.fa-folder-open-o:before{content:"ï„•"}.fa-smile-o:before{content:""}.fa-frown-o:before{content:"ï„™"}.fa-meh-o:before{content:"ï„š"}.fa-gamepad:before{content:"ï„›"}.fa-keyboard-o:before{content:"ï„œ"}.fa-flag-o:before{content:"ï„"}.fa-flag-checkered:before{content:"ï„ž"}.fa-terminal:before{content:"ï„ "}.fa-code:before{content:"ï„¡"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"ï„¢"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"ï„£"}.fa-location-arrow:before{content:""}.fa-crop:before{content:"ï„¥"}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:"ï„©"}.fa-exclamation:before{content:""}.fa-superscript:before{content:"ï„«"}.fa-subscript:before{content:""}.fa-eraser:before{content:"ï„"}.fa-puzzle-piece:before{content:"ï„®"}.fa-microphone:before{content:"ï„°"}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:"ï„´"}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:"ï„·"}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:"ï„»"}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:"ï…€"}.fa-ellipsis-h:before{content:"ï…"}.fa-ellipsis-v:before{content:"ï…‚"}.fa-rss-square:before{content:"ï…ƒ"}.fa-play-circle:before{content:"ï…„"}.fa-ticket:before{content:"ï……"}.fa-minus-square:before{content:"ï…†"}.fa-minus-square-o:before{content:"ï…‡"}.fa-level-up:before{content:"ï…ˆ"}.fa-level-down:before{content:"ï…‰"}.fa-check-square:before{content:"ï…Š"}.fa-pencil-square:before{content:"ï…‹"}.fa-external-link-square:before{content:"ï…Œ"}.fa-share-square:before{content:"ï…"}.fa-compass:before{content:"ï…Ž"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"ï…"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"ï…‘"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"ï…’"}.fa-eur:before,.fa-euro:before{content:"ï…“"}.fa-gbp:before{content:"ï…”"}.fa-dollar:before,.fa-usd:before{content:"ï…•"}.fa-inr:before,.fa-rupee:before{content:"ï…–"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"ï…—"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"ï…˜"}.fa-krw:before,.fa-won:before{content:"ï…™"}.fa-bitcoin:before,.fa-btc:before{content:"ï…š"}.fa-file:before{content:"ï…›"}.fa-file-text:before{content:"ï…œ"}.fa-sort-alpha-asc:before{content:"ï…"}.fa-sort-alpha-desc:before{content:"ï…ž"}.fa-sort-amount-asc:before{content:"ï… "}.fa-sort-amount-desc:before{content:"ï…¡"}.fa-sort-numeric-asc:before{content:"ï…¢"}.fa-sort-numeric-desc:before{content:"ï…£"}.fa-thumbs-up:before{content:"ï…¤"}.fa-thumbs-down:before{content:"ï…¥"}.fa-youtube-square:before{content:"ï…¦"}.fa-youtube:before{content:"ï…§"}.fa-xing:before{content:"ï…¨"}.fa-xing-square:before{content:"ï…©"}.fa-youtube-play:before{content:"ï…ª"}.fa-dropbox:before{content:"ï…«"}.fa-stack-overflow:before{content:"ï…¬"}.fa-instagram:before{content:"ï…"}.fa-flickr:before{content:"ï…®"}.fa-adn:before{content:"ï…°"}.fa-bitbucket:before{content:"ï…±"}.fa-bitbucket-square:before{content:"ï…²"}.fa-tumblr:before{content:"ï…³"}.fa-tumblr-square:before{content:"ï…´"}.fa-long-arrow-down:before{content:"ï…µ"}.fa-long-arrow-up:before{content:"ï…¶"}.fa-long-arrow-left:before{content:"ï…·"}.fa-long-arrow-right:before{content:"ï…¸"}.fa-apple:before{content:"ï…¹"}.fa-windows:before{content:"ï…º"}.fa-android:before{content:"ï…»"}.fa-linux:before{content:"ï…¼"}.fa-dribbble:before{content:"ï…½"}.fa-skype:before{content:"ï…¾"}.fa-foursquare:before{content:""}.fa-trello:before{content:"ï†"}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:"ï†"}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:"ï†"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:"ï†"}.fa-yahoo:before{content:""}.fa-google:before{content:"ï† "}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:"ï†"}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:"ï‡"}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"ï‡"}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"ï‡"}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:"ï‡"}.fa-sliders:before{content:""}.fa-share-alt:before{content:"ï‡ "}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:"ï‡"}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:"ïˆ"}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:"ïˆ"}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:"ïˆ"}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:"ïˆ"}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:"ïˆ"}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"ï‰"}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:"ï‰"}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:"ï‰"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:"ï‰"}.fa-creative-commons:before{content:""}.fa-gg:before{content:"ï‰ "}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:"ï‰"}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:"ïŠ"}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:"ïŠ"}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:"ïŠ"}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:"ïŠ"}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:"ïŠ "}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:"ïŠ"}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:"ï‹€"}.fa-id-badge:before{content:"ï‹"}.fa-drivers-license:before,.fa-id-card:before{content:"ï‹‚"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:"ï‹„"}.fa-free-code-camp:before{content:"ï‹…"}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"ï‹Š"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"ï‹‹"}.fa-shower:before{content:"ï‹Œ"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"ï‹"}.fa-podcast:before{content:"ï‹Ž"}.fa-window-maximize:before{content:"ï‹"}.fa-window-minimize:before{content:"ï‹‘"}.fa-window-restore:before{content:"ï‹’"}.fa-times-rectangle:before,.fa-window-close:before{content:"ï‹“"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"ï‹”"}.fa-bandcamp:before{content:"ï‹•"}.fa-grav:before{content:"ï‹–"}.fa-etsy:before{content:"ï‹—"}.fa-imdb:before{content:""}.fa-ravelry:before{content:"ï‹™"}.fa-eercast:before{content:"ï‹š"}.fa-microchip:before{content:"ï‹›"}.fa-snowflake-o:before{content:"ï‹œ"}.fa-superpowers:before{content:"ï‹"}.fa-wpexplorer:before{content:"ï‹ž"}.fa-meetup:before{content:"ï‹ "}@font-face{font-family:Share;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bold-webfont.eot);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bold-webfont.eot?#iefix) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bold-webfont.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bold-webfont.ttf) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bold-webfont.svg#Share-BoldRegular) format("svg");font-weight:700;font-style:normal}@font-face{font-family:Share;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-italic-webfont.eot);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-italic-webfont.eot?#iefix) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-italic-webfont.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-italic-webfont.ttf) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-italic-webfont.svg#Share-ItalicRegular) format("svg");font-weight:400;font-style:italic}@font-face{font-family:Share;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-regular-webfont.eot);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-regular-webfont.eot?#iefix) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-regular-webfont.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-regular-webfont.ttf) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-regular-webfont.svg#Share-Regular) format("svg");font-weight:400;font-style:normal}@font-face{font-family:Share;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bolditalic-webfont.eot);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bolditalic-webfont.eot?#iefix) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bolditalic-webfont.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bolditalic-webfont.ttf) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bolditalic-webfont.svg#Share-BoldItalicRegular) format("svg");font-weight:700;font-style:italic}*,:after,:before{box-sizing:border-box}html{font-size:10px}body{font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;line-height:1.5;color:#000;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{background-color:transparent;color:#212424;text-decoration:none}a:focus,a:hover{color:#000;text-decoration:underline}a:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}figure{margin:0}.img-responsive{display:block;height:auto}.img-rounded{border-radius:2px}.img-thumbnail{padding:4px;line-height:1.5;background-color:#fff;border:1px solid #ddd;border-radius:2px;transition:all .2s ease-in-out;display:inline-block;height:auto}.img-circle{border-radius:50%}.bootstrap-datetimepicker-widget .btn[data-action=incrementHours]::after,.bootstrap-datetimepicker-widget .btn[data-action=incrementMinutes]::after,.bootstrap-datetimepicker-widget .btn[data-action=decrementHours]::after,.bootstrap-datetimepicker-widget .btn[data-action=decrementMinutes]::after,.bootstrap-datetimepicker-widget .btn[data-action=showHours]::after,.bootstrap-datetimepicker-widget .btn[data-action=showMinutes]::after,.bootstrap-datetimepicker-widget .btn[data-action=togglePeriod]::after,.bootstrap-datetimepicker-widget .btn[data-action=clear]::after,.bootstrap-datetimepicker-widget .btn[data-action=today]::after,.bootstrap-datetimepicker-widget .picker-switch::after,.bootstrap-datetimepicker-widget table th.next::after,.bootstrap-datetimepicker-widget table th.prev::after,.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#737373}.h1,.h2,.h3,h1,h2,h3{margin-top:18px;margin-bottom:9px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:9px;margin-bottom:9px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:27px}.h2,h2{font-size:19px}.h3,h3{font-size:17px}.h4,h4{font-size:15px}.h5,h5{font-size:12px}.h6,h6{font-size:11px}p{margin:0 0 9px}.lead{margin-bottom:18px;font-weight:300;line-height:1.4}dt,kbd kbd,label{font-weight:700}@media (min-width:768px){.lead{font-size:18px}}.small,small{font-size:91%}.mark,mark{background-color:#fbefdd;padding:.2em}.list-inline,.list-unstyled,.modulemenu .modulemenu-group-container{padding-left:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.initialism,.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#737373}.text-primary{color:#0078e6}a.text-primary:focus,a.text-primary:hover{color:#005db3}.text-success{color:#79a548}a.text-success:focus,a.text-success:hover{color:#5f8139}.text-info{color:#6daae0}a.text-info:focus,a.text-info:hover{color:#4392d7}.text-warning{color:#e8a33d}a.text-warning:focus,a.text-warning:hover{color:#d88b1a}.text-danger{color:#c83c3c}a.text-danger:focus,a.text-danger:hover{color:#a32e2e}.bg-primary{color:#fff;background-color:#0078e6}a.bg-primary:focus,a.bg-primary:hover{background-color:#005db3}.bg-success{background-color:#d1e2bd}a.bg-success:focus,a.bg-success:hover{background-color:#b8d39a}.bg-info{background-color:#ebf3fb}a.bg-info:focus,a.bg-info:hover{background-color:#c1dbf2}.bg-warning{background-color:#fbefdd}a.bg-warning:focus,a.bg-warning:hover{background-color:#f6d9af}.bg-danger{background-color:#efc7c7}a.bg-danger:focus,a.bg-danger:hover{background-color:#e49f9f}.page-header{padding-bottom:8px;margin:36px 0 18px;border-bottom:1px solid #f5f5f5}dl,ol,ul{margin-top:0}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child,ol ol,ol ul,ul ol,ul ul{margin-bottom:0}ol,ul{margin-bottom:9px}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-bottom:18px}dd,dt{line-height:1.5}dd{margin-left:0}.dl-horizontal dd:after,.form-irre-header-body dl dd:after{content:"";display:table;clear:both}@media (min-width:768px){.dl-horizontal dt,.form-irre-header-body dl dt{float:left;width:70px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd,.form-irre-header-body dl dd{margin-left:90px}.container{width:750px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #d7d7d7}.initialism{font-size:90%}blockquote{padding:9px 18px;margin:0 0 18px;font-size:15px;border-left:5px solid #f5f5f5}.container,.container-fluid{margin-right:auto;margin-left:auto}.table,address{margin-bottom:18px}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.5;color:#d7d7d7}legend,pre{color:#5a5a5a}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #f5f5f5;border-left:0;text-align:right}code,kbd{padding:2px 4px;font-size:90%;border-radius:2px}caption,th{text-align:left}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{font-style:normal;line-height:1.5}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{color:#c7254e;background-color:#f9f2f4}kbd{color:#fff;background-color:#333;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{display:block;padding:8.5px;font-size:11px;line-height:1.5;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:2px}.container-fluid:after,.container:after,.row:after{display:table;content:"";clear:both}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.container,.container-fluid{padding-left:15px;padding-right:15px}.pre-scrollable{max-height:340px;overflow-y:scroll}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-left:-15px;margin-right:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-1{width:8.33333333%}.col-xs-2{width:16.66666667%}.col-xs-3{width:25%}.col-xs-4{width:33.33333333%}.col-xs-5{width:41.66666667%}.col-xs-6{width:50%}.col-xs-7{width:58.33333333%}.col-xs-8{width:66.66666667%}.col-xs-9{width:75%}.col-xs-10{width:83.33333333%}.col-xs-11{width:91.66666667%}.col-xs-12{width:100%}.col-xs-pull-0{right:auto}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-3{right:25%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-6{right:50%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-9{right:75%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-12{right:100%}.col-xs-push-0{left:auto}.col-xs-push-1{left:8.33333333%}.col-xs-push-2{left:16.66666667%}.col-xs-push-3{left:25%}.col-xs-push-4{left:33.33333333%}.col-xs-push-5{left:41.66666667%}.col-xs-push-6{left:50%}.col-xs-push-7{left:58.33333333%}.col-xs-push-8{left:66.66666667%}.col-xs-push-9{left:75%}.col-xs-push-10{left:83.33333333%}.col-xs-push-11{left:91.66666667%}.col-xs-push-12{left:100%}.col-xs-offset-0{margin-left:0}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-12{margin-left:100%}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-1{width:8.33333333%}.col-sm-2{width:16.66666667%}.col-sm-3{width:25%}.col-sm-4{width:33.33333333%}.col-sm-5{width:41.66666667%}.col-sm-6{width:50%}.col-sm-7{width:58.33333333%}.col-sm-8{width:66.66666667%}.col-sm-9{width:75%}.col-sm-10{width:83.33333333%}.col-sm-11{width:91.66666667%}.col-sm-12{width:100%}.col-sm-pull-0{right:auto}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-12{right:100%}.col-sm-push-0{left:auto}.col-sm-push-1{left:8.33333333%}.col-sm-push-2{left:16.66666667%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333333%}.col-sm-push-5{left:41.66666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.33333333%}.col-sm-push-8{left:66.66666667%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333333%}.col-sm-push-11{left:91.66666667%}.col-sm-push-12{left:100%}.col-sm-offset-0{margin-left:0}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-12{margin-left:100%}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-1{width:8.33333333%}.col-md-2{width:16.66666667%}.col-md-3{width:25%}.col-md-4{width:33.33333333%}.col-md-5{width:41.66666667%}.col-md-6{width:50%}.col-md-7{width:58.33333333%}.col-md-8{width:66.66666667%}.col-md-9{width:75%}.col-md-10{width:83.33333333%}.col-md-11{width:91.66666667%}.col-md-12{width:100%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.33333333%}.col-md-pull-2{right:16.66666667%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333333%}.col-md-pull-5{right:41.66666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.33333333%}.col-md-pull-8{right:66.66666667%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333333%}.col-md-pull-11{right:91.66666667%}.col-md-pull-12{right:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.33333333%}.col-md-push-2{left:16.66666667%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333333%}.col-md-push-5{left:41.66666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.33333333%}.col-md-push-8{left:66.66666667%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333333%}.col-md-push-11{left:91.66666667%}.col-md-push-12{left:100%}.col-md-offset-0{margin-left:0}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-12{margin-left:100%}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-1{width:8.33333333%}.col-lg-2{width:16.66666667%}.col-lg-3{width:25%}.col-lg-4{width:33.33333333%}.col-lg-5{width:41.66666667%}.col-lg-6{width:50%}.col-lg-7{width:58.33333333%}.col-lg-8{width:66.66666667%}.col-lg-9{width:75%}.col-lg-10{width:83.33333333%}.col-lg-11{width:91.66666667%}.col-lg-12{width:100%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-12{right:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.33333333%}.col-lg-push-2{left:16.66666667%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333333%}.col-lg-push-5{left:41.66666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.33333333%}.col-lg-push-8{left:66.66666667%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333333%}.col-lg-push-11{left:91.66666667%}.col-lg-push-12{left:100%}.col-lg-offset-0{margin-left:0}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-12{margin-left:100%}}table{border-collapse:collapse;border-spacing:0;background-color:#fafafa}.btn-group-justified,.input-group,.t3-grid-table{border-collapse:separate}caption{padding-top:6px;padding-bottom:6px;color:#737373}.table{width:100%}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:6px;line-height:1.5;border-top:1px solid #ccc}.table>thead>tr>th{border-bottom:2px solid #ccc}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ccc}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:6px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ccc}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f7f7f7}.table-hover>tbody>tr:hover,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#ededed}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.btn-group>.btn-group,.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group,.dropdown-menu{float:left}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e1e0e0}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#d1e2bd}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#c4dbab}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#ebf3fb}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#d6e7f6}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fbefdd}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#f8e4c6}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#efc7c7}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#eab3b3}.table-responsive{overflow-x:auto;min-height:.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:13.5px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ccc}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}.carousel-inner,.collapsing,.dropdown-menu .divider,.embed-responsive,.modal,.modal-open,.nav .nav-divider,.progress,html{overflow:hidden}fieldset,legend{padding:0;border:0}fieldset{margin:0;min-width:0}legend{display:block;width:100%;margin-bottom:18px;font-size:18px;line-height:inherit;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px}input[type=search]{box-sizing:border-box;-webkit-appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}.form-control,output{font-size:12px;line-height:1.5;color:#333;display:block}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=radio]:focus,input[type=file]:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}output{padding-top:7px}.form-control{width:100%;height:32px;padding:6px;background-color:#fefefe;border:1px solid #bbb;border-radius:2px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#aaa;outline:0;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(170,170,170,.6)}.form-control::-moz-placeholder{color:#d7d7d7;opacity:1}.form-control:-ms-input-placeholder{color:#d7d7d7}.form-control::-webkit-input-placeholder{color:#d7d7d7}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#79a548}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#f5f5f5;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:32px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm>.input-group-btn>input[type=date].btn,.input-group-sm>.input-group-btn>input[type=time].btn,.input-group-sm>.input-group-btn>input[type=datetime-local].btn,.input-group-sm>.input-group-btn>input[type=month].btn,.input-group-sm>input[type=date].form-control,.input-group-sm>input[type=date].input-group-addon,.input-group-sm>input[type=time].form-control,.input-group-sm>input[type=time].input-group-addon,.input-group-sm>input[type=datetime-local].form-control,.input-group-sm>input[type=datetime-local].input-group-addon,.input-group-sm>input[type=month].form-control,.input-group-sm>input[type=month].input-group-addon,input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:26px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg>.input-group-btn>input[type=date].btn,.input-group-lg>.input-group-btn>input[type=time].btn,.input-group-lg>.input-group-btn>input[type=datetime-local].btn,.input-group-lg>.input-group-btn>input[type=month].btn,.input-group-lg>input[type=date].form-control,.input-group-lg>input[type=date].input-group-addon,.input-group-lg>input[type=time].form-control,.input-group-lg>input[type=time].input-group-addon,.input-group-lg>input[type=datetime-local].form-control,.input-group-lg>input[type=datetime-local].input-group-addon,.input-group-lg>input[type=month].form-control,.input-group-lg>input[type=month].input-group-addon,input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:41.2px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:18px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px;margin-top:4px\9}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:30px}.form-control-static.input-lg,.form-control-static.input-sm,.input-group-lg>.form-control-static.form-control,.input-group-lg>.form-control-static.input-group-addon,.input-group-lg>.input-group-btn>.form-control-static.btn,.input-group-sm>.form-control-static.form-control,.input-group-sm>.form-control-static.input-group-addon,.input-group-sm>.input-group-btn>.form-control-static.btn{padding-left:0;padding-right:0}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn,.input-sm{height:26px;padding:4px;font-size:11px;line-height:1.5;border-radius:2px}.input-group-sm>.input-group-btn>select.btn,.input-group-sm>select.form-control,.input-group-sm>select.input-group-addon,select.input-sm{height:26px;line-height:26px}.input-group-sm>.input-group-btn>select[multiple].btn,.input-group-sm>.input-group-btn>textarea.btn,.input-group-sm>select[multiple].form-control,.input-group-sm>select[multiple].input-group-addon,.input-group-sm>textarea.form-control,.input-group-sm>textarea.input-group-addon,select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:26px;padding:4px;font-size:11px;line-height:1.5;border-radius:2px}.form-group-sm select.form-control{height:26px;line-height:26px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:26px;min-height:29px;padding:5px 4px;font-size:11px;line-height:1.5}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn,.input-lg{height:41.2px;padding:12px;font-size:15px;line-height:1.3333333;border-radius:2px}.input-group-lg>.input-group-btn>select.btn,.input-group-lg>select.form-control,.input-group-lg>select.input-group-addon,select.input-lg{height:41.2px;line-height:41.2px}.input-group-lg>.input-group-btn>select[multiple].btn,.input-group-lg>.input-group-btn>textarea.btn,.input-group-lg>select[multiple].form-control,.input-group-lg>select[multiple].input-group-addon,.input-group-lg>textarea.form-control,.input-group-lg>textarea.input-group-addon,select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:41.2px;padding:12px;font-size:15px;line-height:1.3333333;border-radius:2px}.form-group-lg select.form-control{height:41.2px;line-height:41.2px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:41.2px;min-height:33px;padding:13px 12px;font-size:15px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:40px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:32px;height:32px;line-height:32px;text-align:center}.collapsing,.dropdown,.dropup{position:relative}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-group-lg>.form-control+.form-control-feedback,.input-group-lg>.input-group-addon+.form-control-feedback,.input-group-lg>.input-group-btn>.btn+.form-control-feedback,.input-lg+.form-control-feedback{width:41.2px;height:41.2px;line-height:41.2px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-group-sm>.form-control+.form-control-feedback,.input-group-sm>.input-group-addon+.form-control-feedback,.input-group-sm>.input-group-btn>.btn+.form-control-feedback,.input-sm+.form-control-feedback{width:26px;height:26px;line-height:26px}.has-success .form-control{border-color:#79a548;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#5f8139;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #abcb88}.has-success .input-group-addon{color:#79a548;border-color:#79a548;background-color:#d1e2bd}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#e8a33d}.has-warning .form-control{border-color:#e8a33d;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#d88b1a;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #f3ce98}.has-warning .input-group-addon{color:#e8a33d;border-color:#e8a33d;background-color:#fbefdd}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#c83c3c}.has-error .form-control{border-color:#c83c3c;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#a32e2e;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #de8c8c}.has-error .input-group-addon{color:#c83c3c;border-color:#c83c3c;background-color:#efc7c7}.has-feedback label~.form-control-feedback{top:23px}.bootstrap-datetimepicker-widget .has-feedback label.btn[data-action=incrementHours]::after~.form-control-feedback,.bootstrap-datetimepicker-widget .has-feedback label.btn[data-action=incrementMinutes]::after~.form-control-feedback,.bootstrap-datetimepicker-widget .has-feedback label.btn[data-action=decrementHours]::after~.form-control-feedback,.bootstrap-datetimepicker-widget .has-feedback label.btn[data-action=decrementMinutes]::after~.form-control-feedback,.bootstrap-datetimepicker-widget .has-feedback label.btn[data-action=showHours]::after~.form-control-feedback,.bootstrap-datetimepicker-widget .has-feedback label.btn[data-action=showMinutes]::after~.form-control-feedback,.bootstrap-datetimepicker-widget .has-feedback label.btn[data-action=togglePeriod]::after~.form-control-feedback,.bootstrap-datetimepicker-widget .has-feedback label.btn[data-action=clear]::after~.form-control-feedback,.bootstrap-datetimepicker-widget .has-feedback label.btn[data-action=today]::after~.form-control-feedback,.bootstrap-datetimepicker-widget .has-feedback label.picker-switch::after~.form-control-feedback,.has-feedback .bootstrap-datetimepicker-widget label.btn[data-action=incrementHours]::after~.form-control-feedback,.has-feedback .bootstrap-datetimepicker-widget label.btn[data-action=incrementMinutes]::after~.form-control-feedback,.has-feedback .bootstrap-datetimepicker-widget label.btn[data-action=decrementHours]::after~.form-control-feedback,.has-feedback .bootstrap-datetimepicker-widget label.btn[data-action=decrementMinutes]::after~.form-control-feedback,.has-feedback .bootstrap-datetimepicker-widget label.btn[data-action=showHours]::after~.form-control-feedback,.has-feedback .bootstrap-datetimepicker-widget label.btn[data-action=showMinutes]::after~.form-control-feedback,.has-feedback .bootstrap-datetimepicker-widget label.btn[data-action=togglePeriod]::after~.form-control-feedback,.has-feedback .bootstrap-datetimepicker-widget label.btn[data-action=clear]::after~.form-control-feedback,.has-feedback .bootstrap-datetimepicker-widget label.btn[data-action=today]::after~.form-control-feedback,.has-feedback .bootstrap-datetimepicker-widget label.picker-switch::after~.form-control-feedback,.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#404040}@media (min-width:768px){.form-inline .form-control-static,.form-inline .form-group{display:inline-block}.form-inline .control-label,.form-inline .form-group{margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.btn-block,input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:25px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-group:after{content:"";display:table;clear:both}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:13px;font-size:15px}.form-horizontal .form-group-sm .control-label{padding-top:5px;font-size:11px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;touch-action:manipulation;cursor:pointer;border:1px solid transparent;white-space:nowrap;padding:6px;font-size:12px;line-height:1.5;border-radius:2px;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);box-shadow:none}.btn-default{color:#333;background-color:#eee;border-color:#bbb}.btn-default.focus,.btn-default:focus{color:#333;background-color:#d5d4d4;border-color:#7b7b7b}.btn-default.active,.btn-default:active,.btn-default:hover,.open>.btn-default.dropdown-toggle{color:#333;background-color:#d5d4d4;border-color:#9c9c9c}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.btn-default.dropdown-toggle.focus,.open>.btn-default.dropdown-toggle:focus,.open>.btn-default.dropdown-toggle:hover{color:#333;background-color:#c3c3c3;border-color:#7b7b7b}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#eee;border-color:#bbb}.btn-default .badge{color:#eee;background-color:#333}.btn-primary{color:#fff;background-color:#0078e6;border-color:#006bcd}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#005db3;border-color:#00284d}.btn-primary.active,.btn-primary:active,.btn-primary:hover,.open>.btn-primary.dropdown-toggle{color:#fff;background-color:#005db3;border-color:#004b8f}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.btn-primary.dropdown-toggle.focus,.open>.btn-primary.dropdown-toggle:focus,.open>.btn-primary.dropdown-toggle:hover{color:#fff;background-color:#004b8f;border-color:#00284d}.btn-primary.active,.btn-primary:active,.open>.btn-primary.dropdown-toggle{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#0078e6;border-color:#006bcd}.btn-primary .badge{color:#0078e6;background-color:#fff}.btn-success{color:#fff;background-color:#79a548;border-color:#6c9340}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#5f8139;border-color:#2b3a1a}.btn-success.active,.btn-success:active,.btn-success:hover,.open>.btn-success.dropdown-toggle{color:#fff;background-color:#5f8139;border-color:#4d692e}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.btn-success.dropdown-toggle.focus,.open>.btn-success.dropdown-toggle:focus,.open>.btn-success.dropdown-toggle:hover{color:#fff;background-color:#4d692e;border-color:#2b3a1a}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#79a548;border-color:#6c9340}.btn-success .badge{color:#79a548;background-color:#fff}.btn-info{color:#fff;background-color:#6daae0;border-color:#589edc}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#4392d7;border-color:#205e94}.btn-info.active,.btn-info:active,.btn-info:hover,.open>.btn-info.dropdown-toggle{color:#fff;background-color:#4392d7;border-color:#2b80cb}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.btn-info.dropdown-toggle.focus,.open>.btn-info.dropdown-toggle:focus,.open>.btn-info.dropdown-toggle:hover{color:#fff;background-color:#2b80cb;border-color:#205e94}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#6daae0;border-color:#589edc}.btn-info .badge{color:#6daae0;background-color:#fff}.btn-warning{color:#fff;background-color:#e8a33d;border-color:#e59826}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#d88b1a;border-color:#7d510f}.btn-warning.active,.btn-warning:active,.btn-warning:hover,.open>.btn-warning.dropdown-toggle{color:#fff;background-color:#d88b1a;border-color:#b87716}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.btn-warning.dropdown-toggle.focus,.open>.btn-warning.dropdown-toggle:focus,.open>.btn-warning.dropdown-toggle:hover{color:#fff;background-color:#b87716;border-color:#7d510f}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#e8a33d;border-color:#e59826}.btn-warning .badge{color:#e8a33d;background-color:#fff}.btn-danger{color:#fff;background-color:#c83c3c;border-color:#b73434}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#a32e2e;border-color:#531818}.btn-danger.active,.btn-danger:active,.btn-danger:hover,.open>.btn-danger.dropdown-toggle{color:#fff;background-color:#a32e2e;border-color:#872626}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.btn-danger.dropdown-toggle.focus,.open>.btn-danger.dropdown-toggle:focus,.open>.btn-danger.dropdown-toggle:hover{color:#fff;background-color:#872626;border-color:#531818}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c83c3c;border-color:#b73434}.btn-danger .badge{color:#c83c3c;background-color:#fff}.btn-link{color:#212424;font-weight:400;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#000;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#d7d7d7;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:12px;font-size:15px;line-height:1.3333333;border-radius:2px}.btn-group-sm>.btn,.btn-sm{padding:4px;font-size:11px;line-height:1.5;border-radius:2px}.btn-group-xs>.btn,.btn-xs{padding:2px 4px;font-size:11px;line-height:1.5;border-radius:2px}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle,.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child,.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-block{display:block}.btn-block+.btn-block{margin-top:5px}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{height:0;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;min-width:160px;padding:5px 0;list-style:none;font-size:12px;text-align:left;background-color:#292929;box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu-right,.dropdown-menu.pull-right{left:auto;right:0}.dropdown-header,.dropdown-menu>li>a{display:block;padding:3px 20px;line-height:1.5;white-space:nowrap}.dropdown-menu .divider{height:1px;margin:8px 0;background-color:#424242}.dropdown-menu>li>a{clear:both;font-weight:400;color:#fff}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{text-decoration:none;color:#fff;background-color:#424242}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#424242}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#d7d7d7}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.progress-bar-striped,.progress-striped .progress-bar,.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{font-size:11px;color:#d7d7d7}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar:after{content:"";display:table;clear:both}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn .caret,.btn-group>.btn:first-child{margin-left:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group-lg.btn-group>.btn+.dropdown-toggle,.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{box-shadow:none}.btn-group-lg>.btn .caret,.btn-lg .caret{border-width:5px 5px 0}.dropup .btn-group-lg>.btn .caret,.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:after{content:"";display:table;clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-radius:2px 2px 0 0}.btn-group-vertical>.btn:last-child:not(:first-child){border-radius:0 0 2px 2px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn,.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group,.input-group-btn,.input-group-btn>.btn{position:relative}.input-group{display:table}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px;font-size:12px;font-weight:400;line-height:1;color:#333;text-align:center;background-color:#f5f5f5;border:1px solid #bbb;border-radius:2px}.input-group-addon.input-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:4px;font-size:11px;border-radius:2px}.input-group-addon.input-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:12px;font-size:15px;border-radius:2px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{font-size:0;white-space:nowrap}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav:after{content:"";display:table;clear:both}.nav>li,.nav>li>a{position:relative;display:block}.nav>li>a{padding:6px 12px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#f5f5f5}.nav>li.disabled>a{color:#d7d7d7}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#5a5a5a;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#f5f5f5;border-color:#212424}.nav .nav-divider{height:1px;margin:8px 0;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ccc}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{line-height:1.5;border:1px solid transparent;border-radius:2px 2px 0 0}.nav-tabs>li>a:hover{border-color:#d7d7d7 #d7d7d7 #ccc}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#000;cursor:default}.nav-pills>li{float:left}.nav-justified>li,.nav-stacked>li,.nav-tabs.nav-justified>li{float:none}.nav-pills>li>a{border-radius:2px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#0078e6}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified,.nav-tabs.nav-justified{width:100%}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}.btn .badge,.btn .label{top:-1px;position:relative}.nav-tabs-justified,.nav-tabs.nav-justified{border-bottom:0}.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:2px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ccc}@media (min-width:768px){.nav-justified>li,.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{margin-bottom:0}.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ccc;border-radius:2px 2px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#ccc}}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.pagination{display:inline-block;padding-left:0;margin:18px 0;border-radius:2px}.label,.pagination>li{display:inline}.alert,.thumbnail{margin-bottom:18px}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px;line-height:1.5;text-decoration:none;color:#212424;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span,.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span,.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span,.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:2px;border-top-right-radius:2px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#000;background-color:#f5f5f5;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;background-color:#0078e6;border-color:#0078e6;cursor:default}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#d7d7d7;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:12px;font-size:15px;line-height:1.3333333}.pagination-sm>li>a,.pagination-sm>li>span{padding:4px;font-size:11px;line-height:1.5}.badge,.label{color:#fff;line-height:1;white-space:nowrap;font-weight:700}.label{padding:.2em .6em .3em;font-size:75%;text-align:center;vertical-align:baseline;border-radius:.25em}.badge,.progress-bar{font-size:11px;text-align:center}.label:empty{display:none}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label-default,.label-excludeFromUpdates,.label-obsolete,.label-test{background-color:#d7d7d7}.label-default[href]:focus,.label-default[href]:hover,[href].label-excludeFromUpdates:focus,[href].label-excludeFromUpdates:hover,[href].label-obsolete:focus,[href].label-obsolete:hover,[href].label-test:focus,[href].label-test:hover{background-color:#bebdbd}.label-primary{background-color:#0078e6}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#005db3}.label-stable,.label-success{background-color:#79a548}.label-success[href]:focus,.label-success[href]:hover,[href].label-stable:focus,[href].label-stable:hover{background-color:#5f8139}.label-experimental,.label-info{background-color:#6daae0}.label-info[href]:focus,.label-info[href]:hover,[href].label-experimental:focus,[href].label-experimental:hover{background-color:#4392d7}.label-beta,.label-warning{background-color:#e8a33d}.label-warning[href]:focus,.label-warning[href]:hover,[href].label-beta:focus,[href].label-beta:hover{background-color:#d88b1a}.label-alpha,.label-danger,.label-deprecated{background-color:#c83c3c}.label-danger[href]:focus,.label-danger[href]:hover,[href].label-alpha:focus,[href].label-alpha:hover,[href].label-deprecated:focus,[href].label-deprecated:hover{background-color:#a32e2e}.badge{display:inline-block;min-width:10px;padding:3px 7px;vertical-align:middle;background-color:#737373;border-radius:10px}.badge:empty{display:none}.media-object,.thumbnail{display:block}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#212424;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.thumbnail{padding:4px;line-height:1.5;background-color:#fff;border:1px solid #ddd;border-radius:2px;-webkit-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.alert,.progress{border-radius:2px}.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}.thumbnail .caption{padding:9px;color:#000}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#212424}.alert-danger,.alert-info,.alert-success,.alert-warning{border-color:transparent}.alert-danger hr,.alert-info hr,.alert-success hr,.alert-warning hr{border-top-color:transparent}.alert{padding:11px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:31px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.modal,.modal-backdrop{top:0;right:0;bottom:0;left:0}.alert-success{background-color:#79a548;color:#fff}.alert-success .alert-link{color:#e6e5e5}.alert-info{background-color:#6daae0;color:#fff}.alert-info .alert-link{color:#e6e5e5}.alert-warning{background-color:#e8a33d;color:#fff}.alert-warning .alert-link{color:#e6e5e5}.alert-danger{background-color:#c83c3c;color:#fff}.alert-danger .alert-link{color:#e6e5e5}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:18px;margin-bottom:18px;background-color:#dedede;box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;line-height:18px;color:#fff;background-color:#0078e6;box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#79a548}.progress-striped .progress-bar-success{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-striped .progress-bar-info,.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#6daae0}.progress-striped .progress-bar-info{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#e8a33d}.progress-striped .progress-bar-warning{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#c83c3c}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media-heading,.media:first-child,.panel-title{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:2px;border-top-left-radius:2px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{text-decoration:none;color:#555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{background-color:#f5f5f5;color:#d7d7d7;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#d7d7d7}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#0078e6;border-color:#0078e6}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#b3dbff}.list-group-item-success{color:#79a548;background-color:#d1e2bd}a.list-group-item-success,button.list-group-item-success{color:#79a548}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#79a548;background-color:#c4dbab}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#79a548;border-color:#79a548}.list-group-item-info{color:#6daae0;background-color:#ebf3fb}a.list-group-item-info,button.list-group-item-info{color:#6daae0}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#6daae0;background-color:#d6e7f6}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#6daae0;border-color:#6daae0}.list-group-item-warning{color:#e8a33d;background-color:#fbefdd}a.list-group-item-warning,button.list-group-item-warning{color:#e8a33d}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#e8a33d;background-color:#f8e4c6}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#e8a33d;border-color:#e8a33d}.list-group-item-danger{color:#c83c3c;background-color:#efc7c7}a.list-group-item-danger,button.list-group-item-danger{color:#c83c3c}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#c83c3c;background-color:#eab3b3}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#c83c3c;border-color:#c83c3c}.panel-heading>.dropdown .dropdown-toggle,.panel-title,.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:18px;background-color:#fff;border:1px solid transparent;border-radius:2px}.panel-title,.panel>.list-group,.panel>.panel-collapse>.list-group,.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel-body{padding:15px}.panel-body:after{content:"";display:table;clear:both}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:1px;border-top-left-radius:1px}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel-group .panel-heading,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-responsive:last-child>.table:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:1px;border-bottom-right-radius:1px}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:1px;border-top-left-radius:1px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.table-responsive:first-child>.table:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-right-radius:1px;border-top-left-radius:1px}.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-left:15px;padding-right:15px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:1px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:1px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ccc}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:18px}.panel-group .panel{margin-bottom:0;border-radius:2px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ccc}.panel-default>.panel-heading{color:#5a5a5a;background-color:#ddd;border-color:#ccc}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ccc}.panel-default>.panel-heading .badge{color:#ddd;background-color:#5a5a5a}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ccc}.panel-primary{border-color:#0078e6}.panel-primary>.panel-heading{color:#fff;background-color:#0078e6;border-color:#0078e6}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#0078e6}.panel-primary>.panel-heading .badge{color:#0078e6;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#0078e6}.panel-success{border-color:#79a548}.panel-success>.panel-heading{color:#79a548;background-color:#d1e2bd;border-color:#79a548}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#79a548}.panel-success>.panel-heading .badge{color:#d1e2bd;background-color:#79a548}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#79a548}.panel-info{border-color:#6daae0}.panel-info>.panel-heading{color:#6daae0;background-color:#ebf3fb;border-color:#6daae0}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#6daae0}.panel-info>.panel-heading .badge{color:#ebf3fb;background-color:#6daae0}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#6daae0}.panel-warning{border-color:#e8a33d}.panel-warning>.panel-heading{color:#e8a33d;background-color:#fbefdd;border-color:#e8a33d}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e8a33d}.panel-warning>.panel-heading .badge{color:#fbefdd;background-color:#e8a33d}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e8a33d}.panel-danger{border-color:#c83c3c}.panel-danger>.panel-heading{color:#c83c3c;background-color:#efc7c7;border-color:#c83c3c}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#c83c3c}.panel-danger>.panel-heading .badge{color:#efc7c7;background-color:#c83c3c}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#c83c3c}.embed-responsive{position:relative;display:block;height:0;padding:0}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#fafafa;border:1px solid #ccc;border-radius:2px;box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well-lg,.well-sm{border-radius:2px}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px}.well-sm{padding:9px}.close{float:right;font-size:18px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.popover,.tooltip{font-family:Verdana,Arial,Helvetica,sans-serif;letter-spacing:normal;line-break:auto;line-height:1.5;text-shadow:none;text-transform:none;white-space:normal;word-spacing:normal;word-wrap:normal;font-weight:400;text-decoration:none}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-content,.popover{background-clip:padding-box}.modal{display:none;position:fixed;z-index:5000;-webkit-overflow-scrolling:touch;outline:0}.modal-footer:after,.modal-header:after{display:table;clear:both;content:""}.modal-content,.modal-dialog{position:relative}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-content{background-color:#fff;border-radius:2px;box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}.modal-backdrop{position:fixed;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.5}.modal-body{position:relative;padding:15px}.modal-footer{text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;font-style:normal;text-align:left;text-align:start;word-break:normal;font-size:12px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:2px;box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover>.arrow,.popover>.arrow:after,.tooltip-arrow{position:absolute;width:0;height:0;border-style:solid}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;background-color:#f7f7f7;border-radius:1px 1px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{display:block;border-color:transparent}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.left>.arrow:after,.popover.right>.arrow:after{content:" ";bottom:-10px}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{left:1px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;border-right-width:0;border-left-color:#fff}.tooltip{position:absolute;z-index:1070;display:block;font-style:normal;text-align:left;text-align:start;word-break:normal;font-size:11px;opacity:0;filter:alpha(opacity=0)}.carousel-caption,.carousel-control{color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.diff-item-result,.table-fixed{word-break:break-all;word-wrap:break-word}.tooltip.in{opacity:1;filter:alpha(opacity=100)}.tooltip.top{margin-top:-3px;padding:3px 0}.tooltip.right{margin-left:3px;padding:0 3px}.tooltip.bottom{margin-top:3px;padding:3px 0}.tooltip.left{margin-left:-3px;padding:0 3px}.tooltip-inner{max-width:200px;color:#fff;text-align:center;background-color:#333;border-radius:2px}.carousel-control,.text-hide{background-color:transparent}.tooltip-arrow{border-color:transparent}.carousel,.carousel-inner{position:relative}.tooltip.top .tooltip-arrow,.tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow{border-width:3px 3px 0;border-top-color:#333;bottom:0}.tooltip.top .tooltip-arrow{left:50%;margin-left:-3px}.tooltip.top-left .tooltip-arrow{right:3px;margin-bottom:-3px}.tooltip.top-right .tooltip-arrow{left:3px;margin-bottom:-3px}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-3px;border-width:3px 3px 3px 0;border-right-color:#333}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-3px;border-width:3px 0 3px 3px;border-left-color:#333}.tooltip.bottom .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow{border-width:0 3px 3px;border-bottom-color:#333;top:0}.tooltip.bottom .tooltip-arrow{left:50%;margin-left:-3px}.tooltip.bottom-left .tooltip-arrow{right:3px;margin-top:-3px}.tooltip.bottom-right .tooltip-arrow{left:3px;margin-top:-3px}.carousel-inner{width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{display:block;max-width:100%;height:auto;line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:focus,.carousel-control:hover{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000\9;background-color:transparent}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px}.carousel-caption .btn,.text-hide{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}body,html{height:100%}body{overflow:auto}.scaffold{background-color:#f5f5f5;color:#333;position:relative;padding-top:45px;height:100vh}.scaffold-topbar{background-color:#151515;color:#f5f5f5;height:45px;position:fixed;top:0;right:0;left:0}.scaffold-modulemenu,.scaffold-toolbar{background-color:#292929;z-index:1000;position:fixed;top:45px;left:0;bottom:0}.scaffold-modulemenu{color:#f5f5f5;width:40px;max-width:100%;overflow:hidden}.scaffold-modulemenu a{color:rgba(245,245,245,.7)}.scaffold-modulemenu .active>a,.scaffold-modulemenu a:hover{color:#f5f5f5}.scaffold-toolbar{overflow:auto;color:#f5f5f5;right:0;display:none}.scaffold-toolbar .dropdown-menu a,.scaffold-toolbar a{color:rgba(245,245,245,.7)}.scaffold-toolbar .active>a,.scaffold-toolbar .dropdown-menu a:focus,.scaffold-toolbar .dropdown-menu a:hover,.scaffold-toolbar a:focus,.scaffold-toolbar a:hover{color:#f5f5f5}@media (min-width:992px){.scaffold-toolbar{overflow:visible;background-color:transparent;height:45px;top:0;left:auto;bottom:auto;display:block}}.scaffold-content{position:fixed!important;top:45px;left:0;right:0;bottom:0}@media (max-width:991px){.scaffold-search-expanded .scaffold-toolbar,.scaffold-toolbar-expanded .scaffold-toolbar{display:block}.scaffold-content{left:0!important}}.scaffold-content-module-iframe,.scaffold-content-navigation-iframe{display:block;border:none;height:100%;width:100%}.scaffold-content-navigation{display:none;position:absolute!important;left:0;top:0;bottom:0;width:300px}.scaffold-content-navigation-component{position:absolute;top:0;bottom:0;left:0;right:0}.scaffold-content-navigation-component #typo3-pagetree-treeContainer>div>.x-panel-body{overflow:auto}.scaffold-content-module{position:absolute!important;top:0;left:0;bottom:0;right:0}@media (max-width:767px){.scaffold-content-module{width:100%}}.scaffold-content-overlay{display:none;position:absolute;z-index:1040;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.65)}.scaffold-modulemenu-expanded .scaffold-content-overlay{display:block}@media (min-width:992px){.scaffold-modulemenu-expanded .scaffold-content-overlay{display:none}.scaffold{padding-left:40px}}.scaffold .scaffold-modulemenu{width:40px}@media (max-width:991px){.scaffold .scaffold-modulemenu{display:none}.scaffold-modulemenu-expanded .scaffold-modulemenu{display:block}}.scaffold-modulemenu-expanded{display:block;padding-left:230px}.scaffold-modulemenu-expanded .scaffold-modulemenu{width:230px}.scaffold-modulemenu-expanded .scaffold-content{-webkit-transform:translate(230px,0);transform:translate(230px,0)}.scaffold-content-navigation-expanded .scaffold-content-navigation{display:block}.scaffold-content-navigation-expanded .scaffold-content-module{left:300px}@media (min-width:992px){.scaffold .scaffold-content{left:40px}.scaffold-modulemenu-expanded .scaffold-content{left:230px;-webkit-transform:none;transform:none}}.topbar{background-color:inherit;position:relative;height:45px}.topbar a{color:inherit;text-decoration:none}.topbar-button{position:absolute;top:0;display:inline-block;border:0;background-color:#151515;height:45px;width:40px}.topbar-button:focus,.topbar-button:hover{background-color:#1d1d1d}.scaffold-content-navigation-expanded .topbar-button-navigationcomponent,.scaffold-modulemenu-expanded .topbar-button.topbar-button-modulemenu,.scaffold-search-expanded .topbar-button-search,.scaffold-toolbar-expanded .topbar-button-toolbar{background-color:#292929}.topbar-button[disabled],.topbar-button[disabled]:focus,.topbar-button[disabled]:hover{background-color:#292929;cursor:not-allowed;opacity:.5}.topbar-button.topbar-button-modulemenu{left:0}.topbar-button.topbar-button-navigationcomponent{left:40px}.topbar-button.topbar-button-toolbar{right:40px}.topbar-button.topbar-button-search{right:0}@media (max-width:991px){.scaffold-search-expanded .toolbar-item,.scaffold-toolbar-expanded .toolbar-item-search{display:none}.scaffold-search-expanded .toolbar-item-search{display:block;width:100%}.topbar-header{padding-right:80px!important}}.topbar-button-search,.topbar-button-toolbar{display:block}@media (min-width:992px){.topbar-button.topbar-button-modulemenu{background-color:#292929}.topbar-button-search,.topbar-button-toolbar{display:none}}.topbar-header{padding-left:80px}.topbar-header-site{overflow:hidden;position:relative;max-width:100%;height:45px;line-height:45px;padding-left:1em;padding-right:1em;white-space:nowrap}.topbar-header-site:after,.topbar-header-site:before{display:block;content:'';position:absolute;top:0;bottom:0;width:1em}.topbar-header-site:before{right:0;background:#151515}.topbar-header-site:after{right:1em;background:-webkit-linear-gradient(left,rgba(21,21,21,0) 0,#151515 100%);background:linear-gradient(to right,rgba(21,21,21,0) 0,#151515 100%)}.typo3-in-workspace .topbar-header-site{background-color:#6d860d}.typo3-in-workspace .topbar-header-site:before{background:#6d860d}.typo3-in-workspace .topbar-header-site:after{background:-webkit-linear-gradient(left,rgba(109,134,13,0) 0,#6d860d 100%);background:linear-gradient(to right,rgba(109,134,13,0) 0,#6d860d 100%)}.topbar-header-site-logo{height:45px;display:none;padding-right:.5em}@media (min-width:320px){.topbar-header-site-logo{display:inline-block}}.topbar-header-site-title{line-height:1.2em;display:inline-block;vertical-align:middle}.topbar-header-site-name{display:block}.toolbar-list:after,.toolbar:after{display:table;content:'';clear:both}.topbar-header-site-version{opacity:.5}.toolbar{padding:8px}.toolbar-list{list-style:none;padding:0;margin:0}@media (min-width:992px){.toolbar{padding:0;background-color:#151515}.toolbar-list li:last-child{width:300px}}.toolbar-item{padding:4px;position:relative;display:block;float:left;width:100%}@media (min-width:600px){.toolbar-item{width:50%}}@media (min-width:750px){.toolbar-item{width:33.33%}}@media (min-width:992px){.toolbar-item{padding:0;width:auto;margin-left:1px}}.toolbar-item .dropdown-menu{width:350px}.toolbar-item .dropdown-menu .text-muted{color:#8c8c8c}.toolbar-item .dropdown-menu a:focus .text-muted,.toolbar-item .dropdown-menu a:hover .text-muted{color:#a6a6a6}@media (max-width:991px){.toolbar-item .dropdown-menu{overflow:auto;padding:15px;position:fixed;max-height:90%;max-width:90%;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.toolbar-item .dropdown-backdrop{background:rgba(0,0,0,.65)}}.toolbar-item-avatar{width:28px;margin-right:2px;display:inline-block}.toolbar-item-avatar .avatar{position:absolute;top:50%;left:10px;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.toolbar-item-avatar .avatar,.toolbar-item-avatar .avatar-image{height:28px;width:28px}.toolbar-item-badge{position:absolute;bottom:4px;right:4px;padding:3px 4px;border-radius:0;font-size:10px;font-weight:400;min-width:16px}.toolbar-item-link{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid rgba(0,0,0,.5);position:relative;display:block;text-decoration:none;padding:9px 10px;height:45px;line-height:27px}.toolbar-item-link:focus,.toolbar-item-link:hover{text-decoration:none}.open .toolbar-item-link{background-color:#292929}.toolbar-item-search form{padding:0;margin:0}.toolbar-item-search .toolbar-item-link{padding:0;margin:0;height:0}.toolbar-item-search .form-group{margin:0}.toolbar-item-search .close{color:#fff;text-shadow:none;opacity:1}@media (max-width:991px){.toolbar-item-search .dropdown-menu{top:114px;left:14px;right:14px;width:auto;max-width:none;max-height:none;-webkit-transform:none;transform:none;bottom:14px}}@media (min-width:992px){.toolbar-item-link{border:none}.toolbar-item-title{display:none}.toolbar-item-search .dropdown-menu{left:auto;right:0}}.toolbar-item-search .autocomplete-suggestions{position:static!important}.toolbar-item-search .autocomplete-suggestion{border:none}.toolbar-item-search.open .toolbar-item-search-form{position:relative;z-index:991}.toolbar-item-search-field{color:inherit;background-color:#2f2f2f;margin:0;border-radius:0;border:1px solid rgba(0,0,0,.5);height:45px;box-shadow:none}@media (min-width:992px){.toolbar-item-search-field{border:none}}.toolbar-item-search-field:hover{background-color:#333}.toolbar-item-search-field:focus{box-shadow:none;background-color:#555}.module-wrapper{position:relative}.module-wrapper iframe{border:none}.modulemenu .modulemenu-group-container{clear:both}.modulemenu .modulemenu-group{position:relative;padding:5px 0;border-bottom:1px solid rgba(0,0,0,.2)}.modulemenu .modulemenu-group-header,.modulemenu .modulemenu-item-link{position:relative;display:block;cursor:pointer;padding:2px 4px;text-decoration:none}.modulemenu .modulemenu-group-header{user-select:none;text-transform:uppercase}.cropper-container,.modal .close{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.modulemenu .modulemenu-item-link:focus,.modulemenu .modulemenu-item-link:hover{outline:0;background-color:rgba(0,0,0,.1)}.modulemenu .modulemenu-item.active .modulemenu-item-link{background-color:rgba(0,0,0,.15)}.modulemenu .modulemenu-icon{float:left;margin-right:4px}.modulemenu .modulemenu-icon .fa{font-size:.5em}.modulemenu .modulemenu-group-title,.modulemenu .modulemenu-item-title{white-space:nowrap;text-overflow:ellipsis;padding-top:7px;padding-left:4px;display:none;overflow:hidden}.modulemenu .modulemenu-group-title{padding-right:20px}.modulemenu .modulemenu-group-title .caret{-webkit-transform:rotate(90deg);transform:rotate(90deg);position:absolute;top:17px;right:18px}.modulemenu .expanded .modulemenu-group-title .caret{-webkit-transform:rotate(0);transform:rotate(0)}.scaffold-modulemenu-expanded .modulemenu-group-title,.scaffold-modulemenu-expanded .modulemenu-item-title{display:block}.autocomplete{position:relative}.autocomplete-results{z-index:1000;position:absolute;margin:5px 0;top:100%;left:0;border:1px solid #ddd;border-radius:2px;background-color:#fff;overflow:hidden;box-shadow:0 1px 0 0 rgba(0,0,0,.25)}.avatar,.dropdown-list>li{position:relative}.autocomplete-suggestion{border-top:1px solid #ddd}.autocomplete-suggestion:first-child{border-top:none}.autocomplete-suggestion-link{padding:5px 13px 5px 28px;display:block;text-decoration:none}.autocomplete-selected .autocomplete-suggestion-link,.autocomplete-suggestion-link:hover{background-color:#fafafa;text-decoration:none}.autocomplete-info{padding:5px 15px}.dropdown-menu{line-height:1.45em;border:0;margin:0;border-radius:0;color:#fff}.dropdown-menu a{color:inherit;display:block}.dropdown-menu a:focus,.dropdown-menu a:hover{color:inherit;text-decoration:none}.dropdown-menu hr{border-top:1px solid rgba(0,0,0,.35);margin:1.25em -15px}.dropdown-menu>:last-child{margin-bottom:0}.dropdown-menu .form-group{margin-bottom:.75em}.dropdown-menu .form-control{border-color:#aaa;color:inherit;border-radius:0;background-color:#333}.dropdown-menu .form-control:focus{box-shadow:none;border-color:#bbb}.dropdown-menu .btn{border:none;border-radius:0;padding:6px 10px}.dropdown-headline{font-size:1.15em;margin-top:0;margin-bottom:.5em}.dropdown-text a{display:inline-block}div.dropdown-menu{padding:1.5em}.dropdown-list{padding-left:0;list-style:none}.dropdown-list>li+li{margin-top:.5em}.dropdown-list-link{display:block;text-decoration:none}.dropdown-list-link:focus,.dropdown-list-link:hover{text-decoration:none}.dropdown-table{display:table;width:100%}.dropdown-table-row{display:table-row}.dropdown-table-column{display:table-cell;padding-top:.25em;padding-bottom:.25em;vertical-align:middle}.dropdown-table-column-top{vertical-align:top}.avatar,.callout .media-body{vertical-align:middle}.dropdown-table-icon{width:16px;padding-right:.5em}.avatar,.avatar-image{height:32px;width:32px}.dropdown-table-title{white-space:nowrap;padding-right:1.5em}.dropdown-table-title-ellipsis{max-width:230px;overflow:hidden;display:block;white-space:nowrap;text-overflow:ellipsis}.dropdown-table-actions{white-space:nowrap;text-align:right}.dropdown-table-actions-btn{text-align:center;display:inline-block!important;margin-top:-4px;margin-bottom:-4px;padding:4px;vertical-align:middle}.dropdown-table-actions-btn-close:hover,.dropdown-table-actions-btn-edit:hover{background-color:#333}.dropdown-table-actions-btn-delete:hover{background-color:#c83c3c}.avatar{display:inline-block}.avatar-image{display:block;overflow:hidden;border-radius:50%}.avatar-image:after{display:block;content:'';position:absolute;top:0;left:0;height:100%;width:100%;border-radius:50%;border:1px solid rgba(255,255,255,.1)}.avatar-image>img{display:block;width:100%!important;height:auto!important}.avatar-icon{position:absolute;bottom:0;right:0;height:16px;width:16px}.callout{background-color:#f0f0f0;border-left:3px solid #ccc;margin:20px 0;padding:20px;color:#333}.callout .media{margin:0}.callout .media .fa-stack{color:#fff}.callout .media .fa-stack>.fa:first-child{color:#ccc}.callout-icon{margin-top:-2px}.callout-title{font-size:1.3em;margin:0 0 .5em}.callout-danger .media,.callout-info .media,.callout-notice .media,.callout-success .media,.callout-warning .media{margin:0}.callout-body>:last-child{margin-bottom:0}.callout-success{background-color:#d1e2bd;border-color:#79a548;color:#333}.callout-success .media .fa-stack{color:#fff}.callout-success .media .fa-stack>.fa:first-child{color:#79a548}.callout-info{background-color:#ebf3fb;border-color:#6daae0;color:#333}.callout-info .media .fa-stack{color:#fff}.callout-info .media .fa-stack>.fa:first-child{color:#6daae0}.callout-warning{background-color:#fbefdd;border-color:#e8a33d;color:#333}.callout-warning .media .fa-stack{color:#fff}.callout-warning .media .fa-stack>.fa:first-child{color:#e8a33d}.callout-danger{background-color:#efc7c7;border-color:#c83c3c;color:#333}.callout-danger .media .fa-stack{color:#fff}.callout-danger .media .fa-stack>.fa:first-child{color:#c83c3c}.callout-notice{background-color:#f9f9f9;border-color:#a0a0a0;color:#333}.callout-notice .media .fa-stack{color:#fff}.callout-notice .media .fa-stack>.fa:first-child{color:#a0a0a0}.icon{position:relative;display:inline-block;overflow:hidden;white-space:nowrap;vertical-align:-22%}.icon-markup,.icon-overlay{position:absolute;text-align:center;bottom:0;right:0}.icon img,.icon svg{display:block;height:100%;width:100%;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.icon *{display:block;line-height:inherit}.icon-markup{display:block;top:0;left:0}.icon-overlay{height:68.75%;width:68.75%}.module-docheader,.module-loading-indicator.nprogress-custom-parent{position:fixed;top:0}.icon-color{fill:currentColor}.icon-spin .icon-markup{-webkit-animation:icon-spin 2s infinite linear;animation:icon-spin 2s infinite linear}@-webkit-keyframes icon-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes icon-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.icon-state-disabled .icon-markup{opacity:.5}.icon-size-small{height:16px;width:16px;line-height:16px}.icon-size-small .icon-unify{line-height:16px;font-size:14px}.icon-size-small .icon-overlay .icon-unify{line-height:10px;font-size:9px}.icon-size-default{height:32px;width:32px;line-height:32px}.icon-size-default .icon-unify{line-height:32px;font-size:28px}.icon-size-default .icon-overlay .icon-unify{line-height:20px;font-size:18px}.icon-size-large{height:48px;width:48px;line-height:48px}.icon-size-large .icon-unify{line-height:48px;font-size:42px}.icon-size-large .icon-overlay .icon-unify{line-height:30px;font-size:26px}.icon-actions-edit-copy-release,.icon-actions-edit-cut-release,.icon-status-dialog-error,.icon-status-status-current,.icon-status-status-permission-denied{color:#c83c3c}.icon-status-status-sorting-light-asc,.icon-status-status-sorting-light-desc{color:#fff}.icon-status-status-sorting-asc,.icon-status-status-sorting-desc{color:#737373}.icon-status-dialog-information{color:#6daae0}.icon-status-dialog-ok,.icon-status-status-permission-granted{color:#79a548}.icon-status-dialog-notification{color:#333}.icon-status-dialog-warning{color:#e8a33d}.diff{background-color:#fff;border:1px solid #ccc;display:table}.diff-item{display:table-row}.diff-item+.diff-item{border-top:1px solid #ccc}.diff-item-result,.diff-item-title{padding:10px;display:table-cell}.diff-item-title{background-color:#fafafa;padding-right:10px;font-style:italic;white-space:nowrap}.diff-item-result{font-family:Menlo,Monaco,Consolas,"Courier New",monospace;width:100%;white-space:pre}.diff-item-result del{color:#c80c05;background-color:#fff6f6;text-decoration:none}.diff-item-result ins{color:#44a512;background-color:#ebfce3;text-decoration:none}.diff-item-result.diff-item-result-inline{white-space:normal}.module{min-height:100%;width:100%;background-color:#fff;color:inherit}.module-dark{background-color:#333;color:#ccc}.module-loading-indicator{min-height:5px;width:100%;z-index:999999}.module-docheader{width:100%;left:0;min-height:65px;z-index:300;background-color:#eee;border-bottom:1px solid #c3c3c3;padding:0 24px;-webkit-transition:margin-top .3s ease-in-out;transition:margin-top .3s ease-in-out}.module-docheader .module-docheader-bar{min-height:26px;margin:4px 0;line-height:26px}.module-docheader .module-docheader-bar.row{margin-left:-15px;margin-right:-15px}.module-docheader .module-docheader-bar label{margin-top:0;margin-bottom:0}.module-docheader .module-docheader-bar .form-inline .form-group{display:table}.module-docheader .module-docheader-bar .form-inline .form-group label{display:table-cell;font-size:11px;font-weight:400;line-height:16px;padding:4px;border-radius:2px 0 0 2px;border:1px solid #bbb;border-right:0;background-color:rgba(0,0,0,.05)}.module-docheader .module-docheader-bar .form-inline .form-group label+select{display:table-cell;border-top-left-radius:0;border-bottom-left-radius:0}.module-docheader .module-docheader-bar .form-group{vertical-align:top;margin:0;display:inline-block}.module-docheader .module-docheader-bar .form-group .form-control{vertical-align:top}.module-docheader .module-docheader-bar .form-inline-spaced{margin:0}.module-docheader .module-docheader-bar .panel{margin:0 -24px;border-left:none;border-right:none;border-bottom:none;border-radius:0;background-color:#fafafa;box-shadow:none}.module-docheader .module-docheader-bar .panel .panel-body{padding:8px 24px}@media (max-width:768px){.module-docheader .module-docheader-bar .text-right{text-align:left}}.bootstrap-datetimepicker-widget .picker-switch,.modal-content .loadmessage,.typo3-module-viewpage .module-body{text-align:center}.module-docheader .module-docheader-bar-search{margin-bottom:0}.module-docheader .module-docheader-bar-column-left{float:left}.module-docheader .module-docheader-bar-column-right{float:right}.module-docheader-bar-navigation .module-docheader-bar-column-left{white-space:nowrap}@media (max-width:768px){.module-docheader-bar-navigation .module-docheader-bar-column-left{white-space:normal}}.module-docheader-bar-navigation .form-group select{width:100%}.module-body{padding:24px}.module-body>.callout:first-child{margin-top:0}.module-body>.container{padding-left:0;padding-right:0}.module-body .container-small{max-width:768px;margin:0 auto}.module-docheader+.module-body{padding-top:89px}.panel{display:block}.panel:focus,.panel:hover{text-decoration:none}.panel-heading a,.panel-heading a:active,.panel-heading a:focus,.panel-heading a:hover{text-decoration:none;color:inherit}.element-browser-title a,.panel-body-highlightlinks>p>a{text-decoration:underline}.panel-heading-left{float:left}.panel-heading-right{float:right}.panel-title{font-size:12px}.panel-title-icon,.panel-title-name{display:inline-block;vertical-align:middle}.panel-body>:first-child{margin-top:0}.panel-body>:last-child{margin-bottom:0}.panel-table td:first-child,.panel-table th:first-child{padding-left:15px}.panel-table td:last-child,.panel-table th:last-child{padding-right:15px}.panel-progress{background-color:#eee;height:3px;position:relative;width:100%}.panel-progress .panel-progress-bar{display:block;height:100%;background-color:#444}.panel-active{border-color:#444}.panel-active>.panel-heading{color:#fff;background-color:#666;border-color:#444}.panel-active>.panel-heading+.panel-collapse>.panel-body{border-top-color:#444}.panel-active>.panel-heading .badge{color:#666;background-color:#fff}.panel-active>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#444}#typo3-debug-console .topbar:after,.clearfix:after,.distribution-detail:after,.distribution-holder:after,.dropdown-list>li:after,.module-docheader .module-docheader-bar:after,.module-docheader:after,.modulemenu .modulemenu-group-header:after,.modulemenu .modulemenu-item-link:after,.pagination-block:after,.panel-heading:after,.t3-page-ce .t3-page-ce-header:after,.typo3-login-copyright-link:after{content:"";display:table;clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;border:0}.dropzone-close,.dropzone-hint-icon{text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.c-na,.t3-flex-section-header-preview,.typo3-dblist-sysnotes .panel-sysnote .panel-body h4 span,.x-tree-node-readableRootline,em,pre.ts-hl .ts-comment{font-style:italic}.affix{position:fixed}@-ms-viewport{width:device-width}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}.hidden-lg{display:none!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}.hidden-print{display:none!important}}.minicolors{position:relative}.userTS .minicolors{position:absolute}.userTS .minicolors-panel{margin-top:31px}.userTS .minicolors-swatch{z-index:100000}.minicolors-sprite{background-image:url(../../../../../../typo3/sysext/core/Resources/Public/Images/colorpicker/jquery.minicolors.png)}.minicolors-swatch{position:absolute;vertical-align:middle;background-position:-80px 0;cursor:text;padding:0;margin:0;display:inline-block;top:50%;left:6px;z-index:2;-webkit-transform:translate(0,-50%);transform:translate(0,-50%);width:20px;height:20px;border-radius:1px}.minicolors-swatch-color{position:absolute;top:0;left:0;right:0;bottom:0;border-radius:inherit}.minicolors-input{float:none;padding-left:32px}.minicolors-panel{margin-top:1px;overflow:hidden;border-radius:2px;position:absolute;width:173px;height:152px;background:#fff;border:1px solid #bbb;box-shadow:0 0 20px rgba(0,0,0,.2);z-index:99999;display:none}.minicolors-panel.minicolors-with-swatches{height:182px}.minicolors-panel.minicolors-visible{display:block}.minicolors-position-top .minicolors-panel{top:-154px}.minicolors-position-right .minicolors-panel{right:0}.minicolors-position-bottom .minicolors-panel{top:auto}.minicolors-position-left .minicolors-panel{left:0}.minicolors-with-opacity .minicolors-panel{width:194px}.minicolors .minicolors-grid{position:absolute;top:1px;left:1px;width:150px;height:150px;background-position:-120px 0;cursor:crosshair}.minicolors .minicolors-grid-inner{position:absolute;top:0;left:0;width:150px;height:150px}.minicolors-slider-saturation .minicolors-grid{background-position:-420px 0}.minicolors-slider-saturation .minicolors-grid-inner{background-position:-270px 0;background-image:inherit}.minicolors-slider-brightness .minicolors-grid{background-position:-570px 0}.minicolors-slider-brightness .minicolors-grid-inner{background-color:#000}.minicolors-slider-wheel .minicolors-grid{background-position:-720px 0}.minicolors-opacity-slider,.minicolors-slider{position:absolute;top:1px;left:152px;width:20px;height:150px;background-color:#fff;background-position:0 0;cursor:row-resize}.minicolors-slider-saturation .minicolors-slider{background-position:-60px 0}.minicolors-slider-brightness .minicolors-slider,.minicolors-slider-wheel .minicolors-slider{background-position:-20px 0}.minicolors-opacity-slider{left:173px;background-position:-40px 0;display:none}.minicolors-with-opacity .minicolors-opacity-slider{display:block}.element-browser,.modal-dialog{display:-webkit-box;display:-webkit-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal}.minicolors-grid .minicolors-picker{position:absolute;top:70px;left:70px;width:12px;height:12px;border:1px solid #000;border-radius:10px;margin-top:-6px;margin-left:-6px;background:0 0}.minicolors-grid .minicolors-picker>div{position:absolute;top:0;left:0;width:8px;height:8px;border-radius:8px;border:2px solid #fff;box-sizing:content-box}.minicolors-picker{position:absolute;top:0;left:0;width:18px;height:2px;background:#fff;border:1px solid #000;margin-top:-2px}.minicolors-swatches,.minicolors-swatches li{margin:0;padding:0;list-style:none;overflow:hidden;position:absolute;top:157px;left:5px}.minicolors-swatches .minicolors-swatch{position:relative;float:left;cursor:pointer;margin:0 4px 0 0;top:0;left:0;width:20px;height:20px}.element-browser-attributes>.form-horizontal:last-child .form-group,.element-browser-body>:last-child{margin-bottom:0}.minicolors-with-opacity .minicolors-swatches .minicolors-swatch{margin-right:7px}.minicolors-swatch.selected{border-color:#000}.svg-tree-wrapper{overflow-y:scroll}.svg-tree-wrapper path.link{fill:none;shape-rendering:crispEdges;stroke:#ddd;stroke-width:1}.svg-tree-wrapper .node .chevron,.svg-tree-wrapper .node .tree-check,.svg-tree-wrapper .node text{cursor:pointer}.element-browser{display:flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-direction:column;flex-direction:column;width:100%}@media (min-width:600px){.element-browser{height:100vh}.element-browser-main{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-flex:1;-webkit-flex:1 auto;flex:1 auto}}.element-browser h3{font-size:1.2em}.element-browser-body{overflow:auto;height:100%;padding:15px}.element-browser-body>:first-child{margin-top:0}.element-browser-title{padding:15px;color:#fff;background-color:#292929}.element-browser-title a{color:inherit}.element-browser-tabs .nav-tabs{padding:15px 15px 0}.element-browser-attributes{padding:15px;background-color:#fafafa;border-bottom:1px solid #ddd}.element-browser-main-sidebar,.element-browser-main-sidebar .list-tree li:last-child:before,.element-browser-main-sidebar .list-tree-control>.fa:before{background-color:#f2f2f2}@media (min-width:600px){.element-browser-main-sidebar{-webkit-flex-shrink:0;flex-shrink:0;width:260px;border-right:1px solid #ddd}.element-browser-main-content{overflow:auto;-webkit-box-flex:1;-webkit-flex:1 auto;flex:1 auto}}@media (min-width:720px){.element-browser-main-sidebar{width:280px}}@media (min-width:840px){.element-browser-main-sidebar{width:300px}}@media (min-width:960px){.element-browser-main-sidebar{width:320px}}.modal .close{color:inherit;padding:0;margin:0;text-shadow:rgba(0,0,0,.5) 0 0 3px;opacity:.5;user-select:none}.modal .close:active,.modal .close:hover{box-shadow:none;outline:0;background:0 0;opacity:1}.modal-dialog{display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-box-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;margin:0 auto!important;height:100vh;width:100vw}.modal-content{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;margin:0 auto;max-height:calc(100vh - 40px);max-width:calc(100vw - 40px);-webkit-transition:margin-top .1s ease-in;transition:margin-top .1s ease-in;border:none}.modal-body{-webkit-box-flex:1;-webkit-flex:1 1 auto;flex:1 1 auto;overflow-y:auto}.modal-footer,.modal-header{padding:10px 15px}.modal-footer .btn{margin-right:0;padding-left:1em;padding-right:1em}.modal-footer .btn .icon{margin-left:-2px;margin-right:4px}.modal-footer .btn span{vertical-align:middle}.modal-content .loadmessage{color:#1e1e1e}.modal-image-manipulation .modal-body{padding:0;display:-webkit-box;display:-webkit-flex;display:flex}.modal-image-manipulation .modal-panel-main{overflow:visible;background-image:url(../Images/cropper-background.png);display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;padding:20px;width:100%}.modal-image-manipulation .modal-panel-main img{max-width:100%}.cropper-container img,.cropper-hide{min-width:0!important;min-height:0!important;max-width:none!important;max-height:none!important}.modal-image-manipulation .modal-panel-sidebar{padding:15px;-webkit-flex-shrink:0;flex-shrink:0;border-left:1px solid rgba(0,0,0,.25);position:relative;overflow:auto;-webkit-overflow-scrolling:touch;width:200px}@media (min-width:768px){.modal-image-manipulation .modal-panel-sidebar{width:250px}}@media (min-width:992px){.modal-image-manipulation .modal-panel-sidebar{width:300px}}.modal-type-iframe,.modal-type-iframe .modal-body{padding:0}.modal-iframe{display:block;border:0;height:100%;width:100%;position:absolute;top:0;left:0}.modal-size-small .modal-content{width:440px}.modal-size-default .modal-content{width:600px}.modal-size-large .modal-content{width:1000px;height:800px}.modal-size-full .modal-content{width:1800px;height:1200px}.modal-severity-notice .modal-header{background-color:#eee;color:#333;border-bottom-color:#bbb}.modal-severity-info .modal-header{background-color:#6daae0;color:#fff;border-bottom-color:#589edc}.modal-severity-success .modal-header{background-color:#79a548;color:#fff;border-bottom-color:#6c9340}.modal-severity-warning .modal-header{background-color:#e8a33d;color:#fff;border-bottom-color:#e59826}.modal-severity-danger .modal-header{background-color:#c83c3c;color:#fff;border-bottom-color:#b73434}.modal-style-dark{color:#fff}.modal-style-dark .modal-header{color:#fff;background-color:#484848;border-bottom-color:#000}.modal-style-dark .modal-content{overflow:hidden;background-color:#292929}.modal-style-dark .modal-body,.modal-style-dark .modal-footer{background-color:#292929;color:#fff}.modal-style-dark .modal-footer{border-top:1px solid #000}.card{display:-webkit-box;display:-webkit-flex;display:flex;padding:15px;box-shadow:0 2px 0 rgba(0,0,0,.2);border:1px solid #ccc;margin-bottom:20px;transition:all .2s ease-in-out;-webkit-transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,transform;transition-property:box-shadow,border,transform,-webkit-transform}.card-container,.viewpage-topbar{display:-webkit-box;display:-webkit-flex}.card:hover{text-decoration:none;border:1px solid #b3b2b2;-webkit-transform:translate(0,-1px);transform:translate(0,-1px);box-shadow:0 3px 0 rgba(0,0,0,.3)}.card-container{display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;margin:10px -10px}.card-container .card{margin-left:10px;margin-right:10px}.card-size-large,.card-size-medium,.card-size-small{width:calc(100% - 20px)}@media (min-width:768px){.card-size-small{width:calc(50% - 20px)}}@media (min-width:992px){.card-size-small{width:calc(25% - 20px)}}@media (min-width:768px){.card-size-medium{width:calc(50% - 20px)}.card-size-large{width:calc(100% - 20px)}}.typo3-module-viewpage{background-color:#494949}.typo3-module-viewpage .module{background-color:transparent}.typo3-module-viewpage .ui-resizable-w{left:-5px;height:100%;width:5px}.typo3-module-viewpage .ui-resizable-s{bottom:-5px;height:5px}.typo3-module-viewpage .ui-resizable-e{right:-5px;height:100%;width:5px}.typo3-module-viewpage .ui-resizable-se,.typo3-module-viewpage .ui-resizable-sw{height:5px;width:5px;background-image:none;bottom:-5px}.typo3-module-viewpage .ui-resizable-sw{left:-5px}.typo3-module-viewpage .ui-resizable-se{right:-5px}.viewpage-item{position:relative;display:inline-block;background-color:#292929;box-shadow:0 2px 0 rgba(0,0,0,.2);color:#fafafa}.viewpage-item a{color:#fafafa}.viewpage-item iframe{display:block}.viewpage-topbar{height:40px;-webkit-flex-shrink:0;flex-shrink:0;padding:.75em 1em;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.viewpage-topbar-orientation a{opacity:.5;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.viewpage-topbar-orientation a:hover{opacity:1}.viewpage-topbar-preset button{background-color:transparent;border:none;padding-left:20px;padding-right:20px}.viewpage-topbar-preset button span{vertical-align:middle}.viewpage-topbar-size input{background-color:transparent;padding-left:0;padding-right:0;border:0;border-bottom:1px solid rgba(0,120,230,.5);-webkit-transition:all .5s ease-in-out;transition:all .5s ease-in-out}.viewpage-topbar-size input:focus,.viewpage-topbar-size input:hover{outline:0;border-bottom-color:#0078e6}.viewpage-resizeable{background-color:#fafafa}.viewpage-preset-item{display:-webkit-box;display:-webkit-flex;display:flex}.viewpage-preset-item-icon{padding-right:.5em}.viewpage-preset-item-label{-webkit-box-flex:1;-webkit-flex:1 1 auto;flex:1 1 auto}.viewpage-preset-item-size{padding-left:1em;opacity:.5}.bootstrap-datetimepicker-widget{list-style:none}.bootstrap-datetimepicker-widget.dropdown-menu{margin:2px 0;padding:4px;width:19em}@media (min-width:768px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width:992px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width:1200px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}.bootstrap-datetimepicker-widget.dropdown-menu:after,.bootstrap-datetimepicker-widget.dropdown-menu:before{content:'';display:inline-block;position:absolute}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:before{border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #292929;border-bottom-color:rgba(0,0,0,.2);top:-7px;left:7px}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:after{border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #292929;top:-6px;left:8px}.bootstrap-datetimepicker-widget.dropdown-menu.top:before{border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #292929;border-top-color:rgba(0,0,0,.2);bottom:-7px;left:6px}.bootstrap-datetimepicker-widget.dropdown-menu.top:after{border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #292929;bottom:-6px;left:7px}.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:after{left:auto;right:7px}.bootstrap-datetimepicker-widget .list-unstyled,.bootstrap-datetimepicker-widget .modulemenu .modulemenu-group-container,.modulemenu .bootstrap-datetimepicker-widget .modulemenu-group-container{margin:0}.bootstrap-datetimepicker-widget a[data-action]{padding:6px 0}.bootstrap-datetimepicker-widget a[data-action]:active{box-shadow:none}.bootstrap-datetimepicker-widget .timepicker-hour,.bootstrap-datetimepicker-widget .timepicker-minute,.bootstrap-datetimepicker-widget .timepicker-second{width:54px;font-weight:700;font-size:12px;margin:0}.bootstrap-datetimepicker-widget button[data-action]{padding:6px}.bootstrap-datetimepicker-widget .btn[data-action=incrementHours]::after{content:"Increment Hours"}.bootstrap-datetimepicker-widget .btn[data-action=incrementMinutes]::after{content:"Increment Minutes"}.bootstrap-datetimepicker-widget .btn[data-action=decrementHours]::after{content:"Decrement Hours"}.bootstrap-datetimepicker-widget .btn[data-action=decrementMinutes]::after{content:"Decrement Minutes"}.bootstrap-datetimepicker-widget .btn[data-action=showHours]::after{content:"Show Hours"}.bootstrap-datetimepicker-widget .btn[data-action=showMinutes]::after{content:"Show Minutes"}.bootstrap-datetimepicker-widget .btn[data-action=togglePeriod]::after{content:"Toggle AM/PM"}.bootstrap-datetimepicker-widget .btn[data-action=clear]::after{content:"Clear the picker"}.bootstrap-datetimepicker-widget .btn[data-action=today]::after{content:"Set the date to today"}.bootstrap-datetimepicker-widget .picker-switch::after{content:"Toggle Date and Time Screens"}.bootstrap-datetimepicker-widget .picker-switch td{padding:0;margin:0;height:auto;width:auto;line-height:inherit}.bootstrap-datetimepicker-widget .picker-switch td span{line-height:2.5;height:2.5em;width:100%}.bootstrap-datetimepicker-widget table{width:100%;margin:0}.bootstrap-datetimepicker-widget table td,.bootstrap-datetimepicker-widget table th{text-align:center;border-radius:0}.bootstrap-datetimepicker-widget table th{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table th.picker-switch{width:145px}.bootstrap-datetimepicker-widget table th.disabled,.bootstrap-datetimepicker-widget table th.disabled:hover{background:0 0;color:#737373;cursor:not-allowed}.bootstrap-datetimepicker-widget table th.prev::after{content:"Previous Month"}.bootstrap-datetimepicker-widget table th.next::after{content:"Next Month"}.bootstrap-datetimepicker-widget table thead tr:first-child th{cursor:pointer}.bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#434242}.bootstrap-datetimepicker-widget table td{height:54px;line-height:54px;width:54px}.bootstrap-datetimepicker-widget table td.cw{font-size:.8em;height:20px;line-height:20px;color:#8c8c8c}.bootstrap-datetimepicker-widget table td.day{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table td.day:hover,.bootstrap-datetimepicker-widget table td.hour:hover,.bootstrap-datetimepicker-widget table td.minute:hover,.bootstrap-datetimepicker-widget table td.second:hover{background:#434242;cursor:pointer}.bootstrap-datetimepicker-widget table td.new,.bootstrap-datetimepicker-widget table td.old{color:#8c8c8c}.bootstrap-datetimepicker-widget table td.today{position:relative}.bootstrap-datetimepicker-widget table td.today:before{content:'';display:inline-block;border:solid transparent;border-width:0 0 7px 7px;border-bottom-color:#0078e6;border-top-color:rgba(0,0,0,.2);position:absolute;bottom:4px;right:4px}.bootstrap-datetimepicker-widget table td.active,.bootstrap-datetimepicker-widget table td.active:hover{background-color:#0078e6;color:#fff;text-shadow:none}.bootstrap-datetimepicker-widget table td.active.today:before{border-bottom-color:#fff}.bootstrap-datetimepicker-widget table td.disabled,.bootstrap-datetimepicker-widget table td.disabled:hover{background:0 0;color:#737373;cursor:not-allowed}.bootstrap-datetimepicker-widget table td span{display:inline-block;width:54px;height:54px;line-height:54px;margin:2px 1.5px;cursor:pointer;border-radius:0}.bootstrap-datetimepicker-widget table td span:hover{background:#434242}.bootstrap-datetimepicker-widget table td span.active{background-color:#0078e6;color:#fff;text-shadow:none}.bootstrap-datetimepicker-widget table td span.old{color:#8c8c8c}.bootstrap-datetimepicker-widget table td span.disabled,.bootstrap-datetimepicker-widget table td span.disabled:hover{background:0 0;color:#737373;cursor:not-allowed}.bootstrap-datetimepicker-widget.usetwentyfour td.hour{height:27px;line-height:27px}.input-group.date .input-group-addon{cursor:pointer}.cropper-container{position:relative;overflow:hidden;user-select:none;-webkit-touch-callout:none}.cropper-container img{display:block;image-orientation:0deg!important;width:100%;height:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal{position:absolute;top:0;right:0;bottom:0;left:0}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;width:100%;height:100%;overflow:hidden;outline:#69f solid 1px;outline-color:rgba(102,153,255,.75)}.cropper-dashed{position:absolute;display:block;border:0 dashed #fff;opacity:.5}.cropper-dashed.dashed-h{top:33.33333333%;left:0;width:100%;height:33.33333333%;border-top-width:1px;border-bottom-width:1px}.cropper-dashed.dashed-v{top:0;left:33.33333333%;width:33.33333333%;height:100%;border-right-width:1px;border-left-width:1px}.cropper-face,.cropper-line,.cropper-point{position:absolute;display:block;width:100%;height:100%;opacity:.1}.cropper-face{top:0;left:0;cursor:move;background-color:#fff}.cropper-line,.cropper-point{background-color:#69f}.cropper-line.line-e{top:0;right:-3px;width:5px;cursor:e-resize}.cropper-line.line-n{top:-3px;left:0;height:5px;cursor:n-resize}.cropper-line.line-w{top:0;left:-3px;width:5px;cursor:w-resize}.cropper-line.line-s{bottom:-3px;left:0;height:5px;cursor:s-resize}.cropper-point{width:5px;height:5px;opacity:.75}.cropper-point.point-e{top:50%;right:-3px;margin-top:-3px;cursor:e-resize}.cropper-point.point-n{top:-3px;left:50%;margin-left:-3px;cursor:n-resize}.cropper-point.point-w{top:50%;left:-3px;margin-top:-3px;cursor:w-resize}.cropper-point.point-s{bottom:-3px;left:50%;margin-left:-3px;cursor:s-resize}.cropper-point.point-ne{top:-3px;right:-3px;cursor:ne-resize}.cropper-point.point-nw{top:-3px;left:-3px;cursor:nw-resize}.cropper-point.point-sw{bottom:-3px;left:-3px;cursor:sw-resize}.cropper-point.point-se{right:-3px;bottom:-3px;width:20px;height:20px;cursor:se-resize;opacity:1}.cropper-point.point-se:before{position:absolute;right:-50%;bottom:-50%;display:block;width:200%;height:200%;content:" ";background-color:#69f;opacity:0}@media (min-width:768px){.cropper-point.point-se{width:15px;height:15px}.dl-horizontal dt,.form-irre-header-body dl dt{text-align:left}}@media (min-width:992px){.cropper-point.point-se{width:10px;height:10px}}@media (min-width:1200px){.cropper-point.point-se{width:5px;height:5px;opacity:.75}}.cropper-bg{background-image:url(../img/bg.png)}.cropper-invisible{opacity:0}.cropper-hide{position:fixed;top:0;left:0;z-index:-1;width:auto!important;height:auto!important;opacity:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}#nprogress .bar{background:#ff8700;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #ff8700,0 0 5px #ff8700;opacity:1;-webkit-transform:rotate(3deg) translate(0,-4px);transform:rotate(3deg) translate(0,-4px)}.t3-help-inline,.typo3-csh-inline{box-shadow:0 1px 3px rgba(0,0,0,.3);line-height:16px}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#ff8700;border-left-color:#ff8700;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@keyframes nprogress-spinner{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.t3-help-link span.t3-help-inline{display:none}.t3-help-link:hover span.t3-help-inline{display:block}@media print{div#typo3-docbody{overflow:visible}}.t3-page-ce .t3-page-ce-footer,.text-monospace{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}.text-normal{font-weight:400}.text-pre-wrap{white-space:pre-wrap}.lead{font-size:1.25em}@media (min-width:768px){.dl-horizontal-wide dt{width:115px}.dl-horizontal-wide dd{margin-left:135px}.table .col-word-break{word-wrap:break-word;word-break:break-all}}.t3-page-ce,.table-fit,.x-viewport,.x-viewport body,[id=typo3-debug-console] .messages,[id=typo3-docbody],[id=typo3-module-menu] .x-panel-body,[id=typo3-navigationContainer] .x-panel-body,[id=typo3-pagetree-filteringTree] .x-panel-body,[id=typo3-pagetree-tree] .x-panel-body,[id=typo3-side-menu],iframe{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.collapse-horizontal{height:auto;width:0;vertical-align:middle;overflow:hidden}.collapse-horizontal.in{display:inline-block;width:auto}.collapse-horizontal.collapsing{display:inline-block;width:0;-webkit-transition-property:width,visibility;transition-property:width,visibility}.cropper .cropper-line{background-color:transparent}.cropper .cropper-dashed{border:1px dashed #ff8700}.cropper .cropper-point{background-color:#ff8700}.cropper .cropper-point.point-nw{left:0;top:0}.cropper .cropper-point.point-w{left:0}.cropper .cropper-point.point-sw{left:0;bottom:0}.cropper .cropper-point.point-ne{right:0;top:0}.cropper .cropper-point.point-e{right:0}.cropper .cropper-point.point-se{right:0;bottom:0}.cropper .cropper-point.point-se:before{background-color:#fff}.cropper .cropper-point.point-n{top:0}.cropper .cropper-point.point-s{bottom:0}.cropper .cropper-view-box{outline:#ff8700 dashed 1px}.cropper .cropper-bg{background-image:url(../Images/cropper-background.png)}.cropper .cropper-image-container{height:100%!important;width:100%!important;max-width:1000px!important}.cropper .ratio-buttons{margin-bottom:10px}.cropper .ratio-buttons .btn.btn-default{margin-bottom:5px}.cropper .ratio-buttons .btn:not(.active) .fa{display:none}.cropper .panel-group{position:relative;margin:-15px}.cropper .panel-group [aria-expanded=true]{border-left:2px solid #ff8700;position:relative}.cropper .panel-group [aria-expanded=true][data-toggle=collapse]{background-color:#333}.cropper .panel-group [aria-expanded=false]{border-left:2px solid #444;position:relative}.cropper .panel-group label,.cropper .panel-group table{color:#fff}.cropper .panel-collapse.collapse{background-color:#2c2c2c!important;border-left:2px solid #ff8700}.cropper .panel-heading{padding:0}.cropper .panel-heading .panel-title>[data-crop-variant]{display:-webkit-box;display:-webkit-flex;display:flex;padding:10px 15px;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.cropper .panel-heading .panel-title>a{text-decoration:none!important;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:13px}.alert a,div.typo3-view-help a{text-decoration:underline}.cropper .panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#333}.cropper .panel,.cropper .panel-default .panel-heading,.cropper .panel-group{background:#222;border:none;color:#fff}.cropper .btn-secondary,.cropper .open .dropdown-toggle.btn-secondary{color:#fff;background-color:#777;border-color:#555}.cropper .btn-secondary.active,.cropper .btn-secondary:active,.cropper .btn-secondary:focus,.cropper .btn-secondary:hover,.cropper .open .active.dropdown-toggle.btn-secondary,.cropper .open .dropdown-toggle.btn-secondary:active,.cropper .open .dropdown-toggle.btn-secondary:focus,.cropper .open .dropdown-toggle.btn-secondary:hover{color:#fff;background-color:#888;border-color:#444}.cropper .cropper-container.cropper-bg{overflow:visible}.cropper .cropper-crop-box{overflow:hidden}.cropper .cropper-crop-box:after{background-color:#ff8700;content:"Cropped area";position:absolute;left:0;top:0;font-size:10px;color:#000;height:16px;width:100%;max-width:80px;text-overflow:ellipsis;white-space:nowrap;padding:0 4px;overflow:hidden}.cropper .cropper-line.line-w{left:0}.cropper .cropper-line.line-e{right:0}.cropper .cropper-line.line-n{top:0}.cropper .cropper-line.line-s{bottom:0}.cropper .ui-resizable-handle.ui-resizable-e,.cropper .ui-resizable-handle.ui-resizable-n,.cropper .ui-resizable-handle.ui-resizable-s,.cropper .ui-resizable-handle.ui-resizable-w{border-color:transparent;-webkit-transform:none;transform:none}.cropper .ui-resizable-handle.ui-resizable-e,.cropper .ui-resizable-handle.ui-resizable-w{width:6px}.cropper .ui-resizable-handle.ui-resizable-n,.cropper .ui-resizable-handle.ui-resizable-s{height:6px}.cropper .ui-resizable-handle.ui-resizable-e{right:0}.cropper .ui-resizable-handle.ui-resizable-w{left:0}.cropper .ui-resizable-handle.ui-resizable-n{top:0}.cropper .ui-resizable-handle.ui-resizable-s{bottom:0}.cropper .ui-resizable-handle.ui-resizable-ne,.cropper .ui-resizable-handle.ui-resizable-nw,.cropper .ui-resizable-handle.ui-resizable-se,.cropper .ui-resizable-handle.ui-resizable-sw{-webkit-transform:none;transform:none;background-color:#ccc;height:6px;width:6px}.cropper .ui-resizable-handle.ui-resizable-nw{top:0;left:0}.cropper .ui-resizable-handle.ui-resizable-ne{top:0;right:0}.cropper .ui-resizable-handle.ui-resizable-se{bottom:0;right:0}.cropper .ui-resizable-handle.ui-resizable-sw{bottom:0;left:0}.cropper .cropper-focus-area{cursor:move;height:200px;width:200px;background-color:rgba(215,187,0,.5);position:absolute;z-index:999999;opacity:1;overflow:hidden;-webkit-transition:background-color .3s;transition:background-color .3s}.cropper .cropper-cover-area:after,.cropper .cropper-focus-area:after{position:absolute;font-size:10px;height:16px;width:100%;white-space:nowrap;top:0;color:#000;overflow:hidden;left:0;pointer-events:none;text-overflow:ellipsis}.cropper .cropper-focus-area.has-nodrop,.cropper .cropper-focus-area.has-nodrop:hover{background-color:rgba(211,35,46,.6)!important;-webkit-transition:background-color .3s;transition:background-color .3s}.cropper .cropper-focus-area:focus,.cropper .cropper-focus-area:hover{background-color:rgba(215,187,0,.7)}.cropper .cropper-focus-area:after{background-color:rgba(255,255,255,.95);content:"Focus";max-width:44px;padding:0 4px 0 8px}.cropper .cropper-cover-area{background:url(../Images/cropper-background-cover-area.svg);pointer-events:none;cursor:not-allowed;position:absolute;opacity:1;z-index:99999}.cropper .cropper-cover-area:after{background-color:rgba(255,255,255,.95);content:"Cover area";max-width:80px;padding:0 4px}a.t3-help-link,a.typo3-csh-link{white-space:normal}.cropper .cropper-preview-thumbnail{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;max-width:100px;max-height:100px;overflow:hidden}.cropper .cropper-preview-thumbnail:after{background-color:rgba(0,0,0,.5);content:" ";top:0;left:0;bottom:0;right:0;position:absolute;z-index:9}a.t3-help-link .t3-help-inline.show-right,a.typo3-csh-link .typo3-csh-inline.show-right{right:10px}.cropper .cropper-preview-thumbnail.wide{width:100px;height:auto}.cropper .cropper-preview-thumbnail.tall{width:auto;height:80px}.cropper .cropper-preview-thumbnail-image{left:0;top:0}.cropper .wide .cropper-preview-thumbnail-image{width:100%;height:auto}.cropper .tall .cropper-preview-thumbnail-image{width:auto;height:100%}.cropper .cropper-preview-thumbnail-crop-area{border:1px solid #ff8700;position:absolute;z-index:10;overflow:hidden}.cropper .cropper-preview-thumbnail-focus-area{background-color:rgba(215,187,0,.7);position:absolute;z-index:11}:root .cropper-preview-thumbnail-crop-image{image-orientation:0deg;display:block;height:100%;width:100%;min-width:0;max-width:none;min-height:0;max-height:none}.cropper-preview-container{overflow:hidden;position:relative}.cropper-preview-container img{display:block;position:absolute;width:100%;min-width:0!important;min-height:0!important;max-width:none!important;max-height:none!important}.typo3-csh-inline{padding:4px}table.typo3-csh-inline{margin:5px 4px 20px 0}table.typo3-csh-inline a.typo3-csh-link{float:none;margin-right:0;height:16px}a.typo3-csh-link .typo3-csh-inline{display:none;position:absolute;width:200px;z-index:100}a.typo3-csh-link:hover .typo3-csh-inline,table.typo3-csh-inline a.typo3-csh-link{display:block}table.typo3-csh-inline tr td h4{margin-top:0;margin-bottom:0}a.typo3-csh-link span.typo3-csh-inline span.paragraph,table.typo3-csh-inline span.paragraph{display:block;padding:3px}img.typo3-csh-icon{vertical-align:middle;cursor:help}div.typo3-view-help{margin:0;width:100%}div.typo3-view-help h1{background:0 0;margin-bottom:0;padding:10px;color:#000;text-align:left}div.typo3-view-help h2{margin-top:0;padding:4px 2px 4px 10px}div.typo3-view-help h3{padding:5px 10px}div.typo3-view-help h4{padding:2px 10px}div.typo3-view-help p{margin:4px 4px 12px 10px}div.typo3-view-help p.c-nav a{background-color:transparent}div.typo3-view-help div.c-toc{padding-left:6px}div.typo3-view-help div.c-toc p{margin:0}div.typo3-view-help .introduction,div.typo3-view-help .manual-title{padding:0 12px 6px}div.typo3-view-help img.c-inlineimg{margin-left:10px}div.typo3-view-help p div.c-toc{background:0 0;border:none}a.typo3-csh-link .typo3-csh-inline,table.t3-help-inline,table.typo3-csh-inline{background-color:#ffffc7;border:1px solid #ccc}.t3-help-inline{padding:4px}table.t3-help-inline{margin:3px 4px 20px 0}table.t3-help-inline a.t3-help-link{float:none;margin-right:0;height:16px;display:block}table.t3-help-inline tr td h4{margin-top:0;margin-bottom:0}a.t3-help-link .t3-help-inline{display:none;position:absolute;width:200px;z-index:100;background:#ffffc7;color:#000;font-weight:400}a.t3-help-link:hover .t3-help-inline{display:block}a.t3-help-link span.t3-help-inline span.paragraph,table.t3-help-inline span.paragraph{display:block;padding:3px}img.t3-help-icon{vertical-align:middle}div.t3-view-help{margin:0;width:100%}div.t3-view-help h1{margin-bottom:0;padding:10px}div.t3-view-help h2{margin-top:0;padding:4px 2px 4px 10px}div.t3-view-help h3{padding:5px 10px}div.t3-view-help h4{padding:2px 10px}div.t3-view-help p{margin:4px 4px 12px 10px}div.t3-view-help .c-toc{padding-left:6px}div.t3-view-help .c-toc p{margin:0}div.t3-view-help .introduction,div.t3-view-help .manual-title{padding:0 12px 6px}div.t3-view-help img.c-inlineimg{margin-left:10px}.x-tip.typo3-csh-tooltip .x-tip-cl,.x-tip.typo3-csh-tooltip .x-tip-tl{padding-left:8px}.x-tip.typo3-csh-tooltip .x-tip-cr,.x-tip.typo3-csh-tooltip .x-tip-tr{padding-right:8px}a.typo3-csh-link .typo3-csh-inline{color:#000;font-weight:400}p.t3-help-short.tipIsLinked{cursor:pointer}.t3-help-teaser,.t3-help-teaser label,.t3-help-teaser-icon,img.t3-help-icon{cursor:help}div#contentMenu0{position:absolute;z-index:300}div#contentMenu1{position:absolute;z-index:310}.context-menu .list-group{margin-bottom:0;background-color:#fff;min-width:150px}.context-menu .list-group-item{cursor:pointer;padding:5px;border-bottom-color:transparent;border-top-color:transparent}.context-menu .list-group-item:first-child{border-top-color:#d7d7d7}.context-menu .list-group-item:last-child{border-bottom-color:#d7d7d7}.context-menu .list-group-item-divider{display:block;padding:0 0 1px;margin:0 0 1px;width:100%;border-bottom-color:#d7d7d7}.context-menu .list-group-item-icon{width:1.28571429em;text-align:center}#typo3-docheader{background:#eee}#typo3-docheader img,#typo3-docheader input{cursor:pointer}#typo3-docheader .t3-icon{margin-bottom:3px}#typo3-docheader .left{float:left}#typo3-docheader .left .t3-icon{margin-right:6px}#typo3-docheader .right{float:right}#typo3-docheader .right .t3-icon{margin-left:6px}#typo3-docheader .buttongroup{float:left;margin-right:6px}#typo3-docheader .buttongroup .c-inputButton{color:inherit;padding:0}#typo3-docheader .buttongroup input.c-inputButton{text-indent:-1000px}#typo3-docheader select{margin-right:12px}#typo3-docheader a{color:#2d2d2d}#typo3-docheader a:hover{color:#000}#typo3-docheader a.active{color:#c3c3c3}#typo3-docheader a.active span{cursor:default}#typo3-docheader .typo3-docheader-buttons,#typo3-docheader .typo3-docheader-functions{color:#2d2d2d;overflow:hidden;padding:0 24px}#typo3-docheader .typo3-docheader-functions{height:27px;line-height:27px}#typo3-docheader .typo3-docheader-functions select{color:#2d2d2d}#typo3-docheader .typo3-docheader-buttons{height:22px;padding-top:3px;padding-bottom:3px;border-bottom:1px solid #c3c3c3}.alert-notice{background-color:#333;border-color:transparent;color:#fff}.alert-notice hr{border-top-color:transparent}.alert-notice .alert-link{color:#e6e5e5}.alert{box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);border:0}.alert a{color:inherit}.alert .media{margin:0}.alert .media .fa-stack>.fa:first-child{opacity:.2}.alert .media-body{vertical-align:middle}.alert-title{font-size:1.12em;font-weight:700;margin:0 0 .25em}.alert-body,.alert-message{margin:0;font-size:.9em}.alert-body>:last-child,.alert-message>:last-child{margin-bottom:0}.alert-body>ul,.alert-message>ul{padding-left:1.5em}.alert-dismissible .close{opacity:.5;padding:1px;top:-3px;right:-22px;color:inherit}.alert-dismissible .close:hover{opacity:1;color:inherit}#alert-container{width:400px;position:absolute;right:5px;top:46px;z-index:10000}#alert-container .alert{box-shadow:inset 0 0 0 1px rgba(0,0,0,.1),0 2px 0 0 rgba(0,0,0,.15);position:relative;margin:5px auto}#alert-container .alert.fade.in{opacity:.95}#typo3-pagetree-topPanelItems{background-color:#eee}#typo3-pagetree,#typo3-pagetree .x-panel-body,#typo3-pagetree .x-panel-bwrap{height:100%}#typo3-pagetree ul{padding-left:0;list-style:none}#typo3-pagetree .x-toolbar{padding:0;border:none}#typo3-pagetree ul.x-tree-root-ct{padding-top:24px;margin-bottom:50px}#typo3-pagetree .x-panel-body{background:0 0}#typo3-pagetree .x-tree-node .x-tree-node-el{line-height:18px;height:20px;margin-right:3px;border-top:1px solid transparent;border-bottom:1px solid transparent;border-left:1px solid transparent}#typo3-pagetree .x-tree-node .x-tree-node-over,#typo3-pagetree .x-tree-node .x-tree-selected{border-bottom:1px solid #d7d7d7;border-top:1px solid #d7d7d7;border-right:1px solid #d7d7d7}#typo3-pagetree .x-tree-node .x-tree-node-over{background-color:#f2f2f2;border-top-right-radius:3px;border-bottom-right-radius:3px}#typo3-pagetree .x-tree-node .x-tree-selected{background-color:#fff}#typo3-pagetree .x-tree-node .x-tree-selected.x-tree-node-over{background-image:none;border-radius:0}#typo3-pagetree .x-tree-node-readableRootline{padding:10px 0 3px 10px}#typo3-pagetree .x-unselectable,#typo3-pagetree .x-unselectable *{cursor:pointer}#typo3-pagetree .ver-element,#typo3-pagetree .ver-page,#typo3-pagetree .ver-versions{background-color:#f7c898}#typo3-pagetree .x-tree-node-over.ver-element,#typo3-pagetree .x-tree-node-over.ver-page,#typo3-pagetree .x-tree-node-over.ver-versions,#typo3-pagetree .x-tree-selected.ver-element,#typo3-pagetree .x-tree-selected.ver-page,#typo3-pagetree .x-tree-selected.ver-versions{background-color:#fee4c9}#typo3-pagetree .typo3-pagetree-filteringTree-highlight{background-color:#f48e0c;color:#fff;padding:0}.x-tree-lines .typo3-pagetree-node-notExpandable .x-tree-ec-icon{visibility:hidden}.x-tree-lines .typo3-pagetree-node-notExpandable ul .x-tree-ec-icon{visibility:visible}.x-dd-drag-ghost a .typo3-pagetree-status,.x-tree-node a .typo3-pagetree-status{padding:0;margin:0 3px 0 0}.typo3-pagetree-tree-copy{color:#666;margin-top:5px}.x-dd-drag-ghost-pagetree-text{display:inline-block;vertical-align:middle}.x-dd-drag-ghost,.x-dd-drag-ghost-pagetree{padding-bottom:5px}.x-dd-drop-icon{padding-top:6px}.x-dd-drag-ghost-pagetree span{margin:3px 3px 0}.x-dd-drag-ghost{background-color:inherit;border:none;box-shadow:0 1px 3px rgba(0,0,0,.3)}.x-dd-drag-ghost span{margin:0 1px 0 3px}.x-dd-drop-nodrop{background-color:#f6d3cf;border:1px solid #d66c68}.typo3-pagetree-deletionDropZone-proxyOver,.x-tree-drop-ok-above,.x-tree-drop-ok-append,.x-tree-drop-ok-below,.x-tree-drop-ok-between{background-color:#dce8f4;border:1px solid #9eb2c5}.x-dd-drop-nodrop .x-dd-drop-icon{background-image:url(../../../../backend/Resources/Public/Images/pagetree-drag-place-denied.png)}.x-tree-drop-ok-append.typo3-pagetree-copy .x-dd-drop-icon{background-image:url(../../../../backend/Resources/Public/Images/pagetree-drag-new-inside.png)}.x-tree-drop-ok-below.typo3-pagetree-copy .x-dd-drop-icon{background-image:url(../../../../backend/Resources/Public/Images/pagetree-drag-copy-below.png)}.x-tree-drop-ok-above.typo3-pagetree-copy .x-dd-drop-icon{background-image:url(../../../../backend/Resources/Public/Images/pagetree-drag-copy-above.png)}.x-tree-drop-ok-between.typo3-pagetree-copy .x-dd-drop-icon{background-image:url(../../../../backend/Resources/Public/Images/pagetree-drag-new-between.png)}.x-tree-drop-ok-append .x-dd-drop-icon{background-image:url(../../../../backend/Resources/Public/Images/pagetree-drag-move-into.png)}.x-tree-drop-ok-between .x-dd-drop-icon{background-image:url(../../../../backend/Resources/Public/Images/pagetree-drag-move-between.png)}.x-tree-drop-ok-below .x-dd-drop-icon{background-image:url(../../../../backend/Resources/Public/Images/pagetree-drag-move-below.png)}.x-tree-drop-ok-above .x-dd-drop-icon{background-image:url(../../../../backend/Resources/Public/Images/pagetree-drag-move-above.png)}#typo3-pagetree .x-tree-node .x-tree-drag-insert-below,.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below a,.x-tree-node div.x-tree-drag-insert-below{border-bottom:1px solid #9eb2c5}#typo3-pagetree .x-tree-node .x-tree-drag-insert-above,.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above a,.x-tree-node .x-tree-drag-insert-above{border-top:1px solid #9eb2c5}.x-tree-node .x-tree-drag-append{background:#d7e4f1}.x-tree-node .x-tree-drag-append a span{background-color:inherit;border:none}.typo3-pagetree-toppanel{padding:0 10px;border-bottom:1px solid #c3c3c3}.typo3-pagetree-toppanel .btn{line-height:16px}.typo3-pagetree-toppanel .x-toolbar{padding:0;border:0!important}.typo3-pagetree-toppanel .x-toolbar-left-row .btn{margin-right:4px}.typo3-pagetree-toppanel .x-toolbar-right-row .btn{margin-left:4px}.typo3-pagetree-toppanel .x-panel-body,.typo3-pagetree-toppanel .x-panel-tbar{margin:4px 0;min-height:26px;height:auto!important}.typo3-pagetree-toppanel .x-panel-bwrap{height:auto!important;overflow:visible}.typo3-pagetree-toppanel .x-btn button{padding:0;font-size:inherit}.typo3-pagetree-toppanel-filter{width:100%!important;height:26px!important;padding-right:25px;padding-left:8px;box-sizing:inherit}.slider-handle,.table *{box-sizing:border-box}.typo3-pagetree-toppanel-filter-clear{position:absolute;right:5px;top:50%;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.typo3-pagetree-toppanel-item .x-form-field-wrap{width:100%!important}.typo3-pagetree-toppanel-item .x-panel-body{margin:0}.typo3-pagetree-toppanel-drag-node{cursor:move;padding:5px;border:none;background:0 0;font-size:11px;line-height:16px}#typo3-pagetree-deletionDropZone{color:#fff;background-color:#585858;box-shadow:inset 0 2px 5px #414141}#typo3-pagetree-deletionDropZone p{padding:5px}#typo3-pagetree-deletionDropZone #typo3-pagetree-deletionDropZone-text{cursor:default;font-size:.9em;padding:0 0 0 5px;display:inline}.typo3-pagetree-deletionDropZone-restore{background-color:#d5d5d5;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,#f6f6f6 10%,#d5d5d5 90%);background-image:linear-gradient(to bottom,#f6f6f6 10%,#d5d5d5 90%);border:1px solid #7c7c7c;border-radius:1px;color:#434343;cursor:pointer;display:inline-block;padding:0 6px;margin-left:24px}.typo3-pagetree-deletionDropZone-restore:hover{background-color:#c8c8c8;background-image:-webkit-linear-gradient(top,#f6f6f6 10%,#c8c8c8 90%);background-image:linear-gradient(to bottom,#f6f6f6 10%,#c8c8c8 90%);background-position:bottom;background-repeat:repeat-x;border:1px solid #737f91;color:#1e1e1e}.typo3-pagetree-deletionDropZone-restoreText{display:inline-block;padding:4px 4px 4px 18px}#typo3-pagetree .typo3-pagetree-deletionDropZone-activateProxyOver{background-color:#644d2d}[id=typo3-pagetree-indicatorBar] .alert{margin:10px 10px 0}.x-shadow{z-index:40!important}[id=typo3-pagetree-indicatorBar-temporaryMountPoint] .media-right{position:absolute;right:16px;-webkit-transform:translateY(-100%);transform:translateY(-100%);background-color:#6daae0}.slider{display:inline-block;position:relative}.slider .hide,.slider input{display:none}.slider .tooltip.top{margin-top:-36px}.slider .tooltip-inner{white-space:nowrap}.form-wizards-items>.slider.slider-horizontal{margin-left:8px;margin-right:8px}.slider-track{position:absolute;cursor:pointer;background-color:#ddd;border-radius:2px;box-shadow:inset 0 0 2px rgba(0,0,0,.25)}.slider-track-high,.slider-track-low{position:absolute;background:0 0;box-sizing:border-box;border-radius:2px}.slider-handle{position:absolute;background-color:#eee;border:1px solid #959595;border-radius:2px;box-shadow:0 1px 0 rgba(0,0,0,.15)}.slider-handle:active,.slider-handle:focus,.slider-handle:hover{background-color:#d5d4d4;border-color:#767676}.slider-handle:after,.slider-handle:before{content:"";display:block;position:absolute;background-color:#333}.slider-horizontal .slider-tick[style="left: 0%;"],.slider-horizontal .slider-tick[style="left: 100%;"],.slider-vertical .slider-tick[style="top: 0%;"],.slider-vertical .slider-tick[style="top: 100%;"]{display:none}.slider-selection{position:absolute;background-color:#999;border-radius:2px;box-shadow:inset 0 0 2px rgba(0,0,0,.25)}.slider-tick{position:absolute;background-color:#c4c3c3}.slider-tick.in-selection{background-color:#807f7f}.slider-horizontal{width:210px;height:32px}.slider-horizontal .slider-selection,.slider-horizontal .slider-track-high,.slider-horizontal .slider-track-low{height:100%;top:0;bottom:0}.slider-horizontal .slider-track{top:50%;left:0;margin-top:-8px;height:16px;width:100%}.slider-horizontal .slider-tick{height:16px;width:1px}.slider-horizontal .slider-handle{top:50%;height:20px;width:16px;margin-top:-10px;margin-left:-8px}.slider-horizontal .slider-handle:after,.slider-horizontal .slider-handle:before{height:50%;width:2px;top:25%}.slider-horizontal .slider-handle:before{left:4px}.slider-horizontal .slider-handle:after{right:4px}.slider-vertical{width:32px;height:210px}.slider-vertical .slider-selection,.slider-vertical .slider-track-high,.slider-vertical .slider-track-low{width:100%;left:0;right:0}.slider-vertical .slider-selection{bottom:0}.slider-vertical .slider-track{top:0;left:50%;margin-left:-8px;height:100%;width:16px}.slider-vertical .slider-tick{height:1px;width:16px}.slider-vertical .slider-handle{left:50%;height:16px;width:20px;margin-top:-8px;margin-left:-10px}.slider-vertical .slider-handle:after,.slider-vertical .slider-handle:before{height:2px;width:50%;left:25%}.slider-vertical .slider-handle:before{top:4px}.slider-vertical .slider-handle:after{bottom:4px}.slider-vertical .slider-selection{left:0;right:0}.slider-disabled .slider-handle{background-color:#c83c3c;border:1px solid #7b2323}.slider-disabled .slider-handle:active,.slider-disabled .slider-handle:focus,.slider-disabled .slider-handle:hover{background-color:#a32e2e;border-color:#4c1515}.slider-disabled .slider-handle:after,.slider-disabled .slider-handle:before{background-color:#fff}.slider-disabled .slider-track{cursor:not-allowed}.panel-heading[data-toggle=formengine-flex],.panel-heading[data-toggle=formengine-inline],.taskGroup{cursor:pointer}span.checkbox-spinner{position:absolute;margin-left:-20px;margin-top:4px}.nav-tabs{border-radius:2px 2px 0 0;background-color:#ededed}.nav-tabs>li+li{margin-left:2px}.nav-tabs>li>a{margin-right:0;-webkit-transition:all .25s ease-in-out;transition:all .25s ease-in-out}.nav-tabs>li>a:focus,.nav-tabs>li>a:hover{border-color:#d7d7d7 #d7d7d7 #ccc;background:#e1e0e0}.nav-tabs>li[class*=has-]>a:before{font-family:FontAwesome;margin-right:2px;margin-top:-2px;vertical-align:middle;font-size:10px;text-align:center;background-color:rgba(255,255,255,.25);border-radius:50%;width:15px;height:15px;display:inline-block;-webkit-transition:all .25s ease-in-out;transition:all .25s ease-in-out}.nav-tabs>li.has-validation-error>a{background-color:#c83c3c;border-color:#a32e2e;color:#fff}.nav-tabs>li.has-validation-error>a:focus,.nav-tabs>li.has-validation-error>a:hover{color:#fff;background-color:#ce5050;border-color:#b73434}.nav-tabs>li.has-validation-error>a:before{content:""}.nav-tabs>li.has-validation-error.active>a{color:inherit;background-color:#fafafa}.nav-tabs>li.has-validation-error.active>a:before{background-color:#c83c3c;color:#fff}.nav-tabs>li.active>a,.nav-tabs>li.active>a:active,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{border:1px solid #ccc;border-bottom-color:#fafafa;background-color:#fafafa}.tab-content>.tab-pane{display:block;height:0;width:0;overflow:hidden}.tab-content>.tab-pane.active{height:auto;width:auto;overflow:visible}.t3-overview-list dt{padding:0 0 2px 20px}.t3-overview-list dt img{vertical-align:middle;margin-right:5px}.t3-overview-list dd{margin:2px 0 15px 20px;padding-left:22px}table{background:0 0;font-size:inherit;line-height:inherit}.table{background-color:#fafafa;border:1px solid #ccc}.table .table{margin:0}.table .table+.table{margin-top:6px}.table .col-icon .t3-icon,.table .pagination{margin:0}.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>th{white-space:nowrap;vertical-align:middle}.table>tbody>tr>td,.table>tfoot>tr>td,.table>thead>tr>td{vertical-align:middle}.table>thead>tr{background-color:#ededed}.table>thead>tr th.col-checkbox+th.col-title label{margin-bottom:0}.table>thead>tr td,.table>thead>tr th{border-bottom:1px solid #ccc}.table>thead>tr td i,.table>thead>tr th i{font-weight:400}.table .btn-group>.btn,.table .btn-group>.btn-group{float:none}.table .btn-default{color:#333;background-color:#dedede;border-color:#c4c4c4}.table .btn-default.focus,.table .btn-default:focus{color:#333;background-color:#c4c4c4;border-color:#858585}.open>.table .btn-default.dropdown-toggle,.table .btn-default.active,.table .btn-default:active,.table .btn-default:hover{color:#333;background-color:#c4c4c4;border-color:#a6a6a6}.open>.table .btn-default.dropdown-toggle.focus,.open>.table .btn-default.dropdown-toggle:focus,.open>.table .btn-default.dropdown-toggle:hover,.table .btn-default.active.focus,.table .btn-default.active:focus,.table .btn-default.active:hover,.table .btn-default:active.focus,.table .btn-default:active:focus,.table .btn-default:active:hover{color:#333;background-color:#b3b3b3;border-color:#858585}.open>.table .btn-default.dropdown-toggle,.table .btn-default.active,.table .btn-default:active{background-image:none}.table .btn-default.disabled.focus,.table .btn-default.disabled:focus,.table .btn-default.disabled:hover,.table .btn-default[disabled].focus,.table .btn-default[disabled]:focus,.table .btn-default[disabled]:hover,fieldset[disabled] .table .btn-default.focus,fieldset[disabled] .table .btn-default:focus,fieldset[disabled] .table .btn-default:hover{background-color:#dedede;border-color:#c4c4c4}.table .btn-default .badge{color:#dedede;background-color:#333}.table .col-icon{text-align:center}.table .col-checkbox,.table .col-icon{padding-right:0}.table .col-title{width:99%}.table-basic,.table-fit{width:100%}.table .col-clipboard,.table .col-control,.table .col-nowrap{white-space:nowrap!important}.table .col-clipboard,.table .col-control{text-align:right}.table .col-control{padding:4px 6px}.table .col-border-left{border-left:1px solid #ccc}.table .col-min{min-width:150px}.table .col-responsive{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.table-white{background-color:#fff}.table-transparent{background-color:transparent}.table-center td,.table-center th{text-align:center}.table-basic td,.table-basic th{vertical-align:middle}.table-vertical-top>tbody>tr>td,.table-vertical-top>tbody>tr>th,.table-vertical-top>tfoot>tr>td,.table-vertical-top>tfoot>tr>th,.table-vertical-top>thead>tr>td,.table-vertical-top>thead>tr>th{vertical-align:top}.table-vertical-bottom>tbody>tr>td,.table-vertical-bottom>tbody>tr>th,.table-vertical-bottom>tfoot>tr>td,.table-vertical-bottom>tfoot>tr>th,.table-vertical-bottom>thead>tr>td,.table-vertical-bottom>thead>tr>th{vertical-align:bottom}.table-no-borders{border:none}.table-no-borders>tbody>tr>td,.table-no-borders>tbody>tr>th,.table-no-borders>tfoot>tr>td,.table-no-borders>tfoot>tr>th,.table-no-borders>thead>tr>td,.table-no-borders>thead>tr>th{border:none;padding:2px}.table-fit{margin-bottom:1.5em;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-fit-block,.table-fit-block>.table,.table-fit-inline-block>.table{width:auto}.table-fit>.dataTables_wrapper>.table,.table-fit>.table{margin-top:0;margin-bottom:0;border:0}.table-fit>.dataTables_wrapper>.table colgroup:first-child+tbody tr:first-child td,.table-fit>.dataTables_wrapper>.table colgroup:first-child+tbody tr:first-child th,.table-fit>.dataTables_wrapper>.table tbody:first-child tr:first-child td,.table-fit>.dataTables_wrapper>.table tbody:first-child tr:first-child th,.table-fit>.table colgroup:first-child+tbody tr:first-child td,.table-fit>.table colgroup:first-child+tbody tr:first-child th,.table-fit>.table tbody:first-child tr:first-child td,.table-fit>.table tbody:first-child tr:first-child th{border-top:0}.table-fit>.dataTables_wrapper>.table tr>td,.table-fit>.dataTables_wrapper>.table tr>th,.table-fit>.table tr>td,.table-fit>.table tr>th{white-space:nowrap}@media (min-width:768px){.table-fit>.dataTables_wrapper>.table tr>td.col-word-break,.table-fit>.dataTables_wrapper>.table tr>th.col-word-break,.table-fit>.table tr>td.col-word-break,.table-fit>.table tr>th.col-word-break{white-space:normal}}.table-fit>.dataTables_wrapper>.table tr>td:first-child,.table-fit>.dataTables_wrapper>.table tr>th:first-child,.table-fit>.table tr>td:first-child,.table-fit>.table tr>th:first-child{border-left:0}.table-fit>.dataTables_wrapper>.table tr>td:last-child,.table-fit>.dataTables_wrapper>.table tr>th:last-child,.table-fit>.table tr>td:last-child,.table-fit>.table tr>th:last-child{border-right:0}.table-fit>.dataTables_wrapper>.table tr:last-child td,.table-fit>.dataTables_wrapper>.table tr:last-child th,.table-fit>.table tr:last-child td,.table-fit>.table tr:last-child th{border-bottom:0}.table-fit-wrap>.table tr>td,.table-fit-wrap>.table tr>th{white-space:normal}#dragIcon,.form-irre-header-cell,.list-tree-group,.nowrap,.t3-flex-section-header-preview,.treeline-icon,.typo3-TCEforms table.typo3-TCEforms-select-checkbox tr td.c-labelCell{white-space:nowrap}.table-fit-inline-block{max-width:100%;width:auto;display:inline-block;margin:0}.table-fit-block{max-width:100%;display:block;margin:0}.table-spacer-wrap{margin-top:10px;margin-bottom:10px}.taskGroup--close .icon-actions-view-list-collapse{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.taskGroup--close td{padding:0!important;border:0!important}.taskGroup--close .t-span{height:0;overflow:hidden;padding:0;line-height:0;display:block}.tooltip-inner{padding:5px 10px}.panel{box-shadow:0 2px 0 rgba(0,0,0,.1)}.panel.ui-sortable-helper{border-style:dashed}.panel .panel-heading{font-weight:700}.panel-carousel{padding:15px}.panel-heading{position:relative}.panel-condensed .panel-heading{padding:5px}.panel-heading-collapse-indicator{position:absolute;left:2px;margin-top:-2px;top:50%}.panel-collapsed .panel-heading .caret{-webkit-transition:all .25s ease-in-out;transition:all .25s ease-in-out;-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.panel-collapsed .panel-collapse{display:none;visibility:hidden}.panel-collapse>.alert,.panel>.alert{border:none;border-top:1px solid #ccc;margin:0;padding:9px 12px}.panel-collapse>.form-section,.panel-collapse>.tab-content>.form-section,.panel-collapse>.tab-content>.tab-pane>.form-section,.panel>.form-section,.panel>.tab-content>.form-section,.panel>.tab-content>.tab-pane>.form-section{border-left:0;border-right:0;border-bottom:0}.panel-collapse>.nav-tabs,.panel>.nav-tabs{border-top:1px solid #ccc;padding-top:8px}.panel-collapse>.nav-tabs>li,.panel>.nav-tabs>li{margin-left:-1px}.panel-collapse>.table,.panel-collapse>.table-fit,.panel>.table,.panel>.table-fit{border:0;margin:0}.recordlist .table-fit{margin-bottom:0}.panel-hover .panel-default:hover>.panel-heading{background-color:#e5e5e5}.panel-space{margin:3em 0}.panel-tab{border-radius:0;border:1px solid #ccc;background-color:#fafafa}.popover-content .list-group .list-group-item:last-child,.popover-title{border-bottom:0}.panel-tab+.form-section,.panel-tab+.panel-tab{margin-top:-19px}.tab-pane>.panel-tab:first-child{border-top:none}.panel-lg .panel-body{padding:35px}.panel-lg .panel-footer,.panel-lg .panel-heading{padding:18px 35px}.panel-lg .panel-carousel{padding:35px}.popover{padding:0}.popover-title{font-size:15px;padding:12px 14px}.popover-content p{margin:0}.popover-content .list-group{margin:-9px -14px}.popover-content .list-group .list-group-item{border-radius:0;border-left:0;border-right:0}.popover .close{margin-right:10px;margin-top:10px}.popover.bottom .arrow:after{border-bottom-color:#f7f7f7}.popover.no-title .arrow:after{border-bottom-color:#fff}.typo3-TCEforms{width:100%}.t3-form-field-container{display:block}.typo3-TCEforms .typo3-csh-link{margin-left:5px}.t3-flex-section,.t3-form-field-container-flexsections,.t3-form-flex{margin:5px 0;clear:both}.t3-form-field-container-inline-placeHolder .t3-form-field-header-inline>span{display:none}.sortableHandle{cursor:move}.t3-form-field-header-flexsection{width:100%;height:16px}.t3-form-field-add-flexsection{border-top:1px solid #cdcdcd;padding:10px 5px 5px 0}.c-inputButton,.c-inputButton:hover,.typo3-TCEforms table#typo3-altdoc-header input:hover,table#typo3-altdoc-header input{border:0;background:0 0}.t3-flex-section-content,.t3-form-field-record-flexsection{background:#eee;padding:5px 0}.t3-flex-section-content>div,.t3-form-field-record-flexsection>div{margin:0 10px}.t3-flex-section-header-preview{width:100px;display:inline-block;padding-left:10px;overflow:hidden;text-overflow:ellipsis}img.t3-tceforms-sysfile-imagepreview{float:left;margin-right:10px;margin-bottom:10px}* html div#typo3-docbody .typo3-TCEforms{margin-top:20px}.typo3-TCEforms img[src*="clear.gif"]{z-index:0}.t3-tceforms-input-wrapper-datetime .t3-icon-edit-pick-date{top:-4px}.typo3-TCEforms span.typo3-TCEforms-newToken{color:#900;font-weight:700}.typo3-TCEforms span.typo3-TCEforms-helpText{background:0 0;color:#fff}table.typo3-TCEforms-select-checkbox{background-color:#fff;border:1px solid #aaa}.t3-form-original-language,.t3-form-original-language-diff{border:1px solid silver;font-size:.9em;margin-top:4px}.typo3-TCEforms table.typo3-TCEforms-select-checkbox tr.c-header td{background-color:#fff;font-weight:700}.typo3-TCEforms table.typo3-TCEforms-select-checkbox tr:nth-child(2n){background-color:#f7f7f7}.typo3-TCEforms table.typo3-TCEforms-select-checkbox tr.c-selectedItem{background-color:#d8ecd0}.typo3-TCEforms table.typo3-TCEforms-select-checkbox tr.c-invalidItem{color:#ddd}.typo3-TCEforms table.typo3-TCEforms-select-checkbox tr:hover{background-color:#dedede}.typo3-TCEforms table.typo3-TCEforms-select-checkbox tr.c-selectedItem:hover{background-color:#abd99a}.typo3-TCEforms table.typo3-TCEforms-select-checkbox tr.c-invalidItem:hover{background-color:transparent}.form-field-inputlink-explanation{background:#eee}.t3-form-original-language{background-color:#dadada;padding:2px}.t3-form-original-language-diffheader{background-color:#c83c3c;font-weight:700;padding:2px}.t3-form-original-language-diffheader[href]:focus,.t3-form-original-language-diffheader[href]:hover{background-color:#a32e2e}.t3-form-original-language-diffcontent{padding:2px}.t3-form-original-language .icon{margin-right:5px}.typo3-TCEforms .typo3-TCEforms-checkboxArray td{padding-right:5px}div.typo3-TCEforms-suggest-choises a{cursor:pointer}div.t3-form-field-container:first-child .t3-form-field-label-flex{border-top:0}.t3-form-field-container-inline-hidden,.t3-form-field-container-inline-placeHolder{opacity:.3}.t3-form-field-header-inline table{vertical-align:top}.t3-tceforms-fieldReadOnly span.t3-icon{position:absolute;right:3px;top:4px}.t3-tceforms-widget-null-wrapper+.t3-form-field-item{display:inline-block}.t3-form-field-disable{display:none}.formengine-field-item.disabled{position:relative}.formengine-field-item.disabled .t3-form-field-disable{z-index:100;background:#fafafa;display:block;position:absolute;width:100%;height:100%;opacity:.5;filter:alpha(opacity=50)}.t3-form-field-eval-null-checkbox{z-index:150}.t3-form-palette-field-label{text-indent:2px}.t3-form-field-item .x-tree input.x-tree-node-cb{height:auto;margin:0 0 0 1px;vertical-align:middle}.t3-form-field-label.t3-form-field-state-changed{color:#004fb0}.icon-list{background:#fff;margin-top:9px;border:1px solid #ccc}.icon-list .row{margin:0}.icon-list .item{float:left;padding:6px;max-width:128px}.icon-list .item img{max-width:128px;max-height:128px}.list-tree,.list-tree ul{margin-left:8px;padding:0;list-style:none;position:relative}.list-tree ul:before,.list-tree:before{content:"";display:block;width:0;position:absolute;top:0;bottom:11px;left:0;margin-bottom:-2px;border-left:1px dotted #666}.list-tree li{margin:0;padding-left:16px;line-height:21px;position:relative}.list-tree li .icon,.treeline-icon{margin-right:2px}.list-tree li.active>.list-tree-group:before,.list-tree li:before{position:absolute;display:block;content:''}.list-tree li.active>.list-tree-group:before{right:-6px;left:-6px;top:-1px;bottom:-1px;border:1px solid rgba(0,0,0,.25);background-color:rgba(255,255,255,.75);border-radius:2px}.list-tree li:before{width:9px;height:0;border-top:1px dotted #666;margin-top:-2px;top:12px;left:2px}.list-tree li:last-child:before{background:#fff;height:auto;left:0;width:11px;bottom:0}.list-tree-control,.list-tree-show{position:relative;width:20px;text-align:center}.list-tree-group{position:relative;display:block}.list-tree-group>span{position:relative}.list-tree-value{font-weight:700}.list-tree-icon{top:-2px}.list-tree-show{display:inline-block;margin-left:-2px}.list-tree-control{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:block;float:left;margin-top:1px;margin-left:-26px;line-height:20px;height:20px}.list-tree-control:before{content:'';position:absolute;top:50%;left:50%;margin-top:-6px;margin-left:-6px;width:12px;height:12px}.list-tree-control:active,.list-tree-control:focus,.list-tree-control:hover{outline:0;text-decoration:none}.list-tree-control>.fa{display:inline-block;text-align:center;cursor:pointer}.list-tree-control>.fa:before{width:12px;height:12px;background-color:#fff;display:block}.list-tree-root:before,.list-tree-root>li:before{display:none}.list-tree-control.list-tree-control-open>.fa:before{content:"\f0d7"}.list-tree-control.list-tree-control-closed>.fa:before{content:"\f0da"}.list-tree-root{margin-left:0}.list-tree-root>li{padding-left:20px}.list-tree-root>li.list-tree-path,.list-tree-root>li>.list-tree-group>.list-tree-control{margin-left:-20px}.list-tree-root>li>.list-tree-group>.list-tree-control:before{background-color:transparent}.list-tree-root-clean>li{padding-left:0}[id=imp-exp-mod] .list-tree li:last-child:before,[id=imp-exp-mod] .list-tree-control>.fa:before{background-color:#f1f1f1}[id=ext-backend-Modules-FileSystemNavigationFrame-index-php] .list-tree li:last-child:before,[id=ext-backend-Modules-FileSystemNavigationFrame-index-php] .list-tree-control>.fa:before{background-color:#f5f5f5}[id=ext-backend-Modules-FileSystemNavigationFrame-index-php] .module-body{padding-left:10px;padding-right:10px}[id=ext-lowlevel-Modules-Configuration-index-php] .active>.list-tree-group{display:inline-block;color:#c83c3c}.treeline-icon{position:relative;display:inline-block;margin-top:-6px;margin-bottom:-6px;padding:0;height:31px;width:16px;overflow:hidden;vertical-align:top}.treeline-icon:after,.treeline-icon:before{position:absolute;content:'';left:50%}.treeline-icon:before{top:0;height:100%;width:2px;margin-left:-1px;border-left:1px dotted #666}.treeline-icon:after{border-top:1px dotted #666;height:2px;width:100%;top:50%;margin-top:-1px}.treeline-icon-jointop:before{top:50%}.treeline-icon-joinbottom:before{top:-50%}.treeline-icon-blank,.treeline-icon-clear:after,.treeline-icon-clear:before,.treeline-icon-line:after{display:none}#typo3-pagetree #typo3-docheader div.buttonsright{margin-right:3px}body#typo3-alt-db-navframe-php div.c-notice{border:1px solid #000;margin-top:5px;margin-bottom:10px;padding:5px;width:95%}body#typo3-pagetree{margin:0;padding:0}#typo3-pagetree #typo3-inner-docbody{padding:10px 0}span.dragIcon{display:inline-block;height:16px}#dragIcon{position:absolute;visibility:hidden;z-index:20;filter:alpha(opacity=50);opacity:.5}#typo3-pagetree-deletionDropZone .x-panel-body{background-position:right;background-repeat:repeat-y}[id=ext-backend-Modules-FileSystemNavigationFrame-index-php],[id=ext-backend-Modules-FileSystemNavigationFrame-index-php] .module-body,[id=typo3-pagetree-treeContainer]{background-color:#f5f5f5;height:100%}[id=typo3-pagetree-tree]{height:100%}[id=typo3-pagetree-tree] .x-panel-body{height:100%!important}[id=ext-backend-Modules-FileSystemNavigationFrame-index-php] .module-docheader{padding-left:10px;padding-right:10px}.x-layout-split{width:1px;background-color:#c3c3c3}[id=InfoModuleController] a.btn-default{margin-right:5px}[id=InfoModuleController] a.t3js-contextmenutrigger{margin-right:4px}.ui-block{text-align:center;padding-top:200px;position:absolute;z-index:3000;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.3)}.pagination .t3-icon{margin:0}.pagination .paginator-input{display:inline-block;width:auto;margin:-6px 0}.label-block,.pagination-block{display:block}.fieldSelectBox .table-scrollable{overflow:auto;max-height:210px}.fieldSelectBox table .col-title{padding:0 6px}.fieldSelectBox table .label-block{line-height:32px;height:32px}.label-block,.label-inline{margin:0;font-weight:400}.label-space-left{margin-left:1em}.label-space-right{margin-right:1em}.badge-info{background-color:#6daae0}.badge-info[href]:focus,.badge-info[href]:hover{background-color:#4392d7}.badge-success{background-color:#79a548}.badge-success[href]:focus,.badge-success[href]:hover{background-color:#5f8139}.badge-warning{background-color:#e8a33d}.badge-warning[href]:focus,.badge-warning[href]:hover{background-color:#d88b1a}.badge-danger{background-color:#c83c3c}.badge-danger[href]:focus,.badge-danger[href]:hover{background-color:#a32e2e}.btn-group-sm>.btn,.btn-sm{height:26px}.btn-group{font-size:0}.btn-group .collapse+.btn.collapsed:last-child{border-radius:2px}.btn-group .btn-default.disabled{color:#999}.dropzone,.dropzone-close{cursor:pointer;color:#333}.btn-checkbox input[type=checkbox],.btn-checkbox input[type=radio],.btn-radio input[type=checkbox],.btn-radio input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-checkbox .fa:before,.btn-radio .fa:before{content:"\f096"}.btn-checkbox input[type=checkbox]:checked+.fa:before,.btn-checkbox input[type=radio]:checked+.fa:before,.btn-radio input[type=checkbox]:checked+.fa:before,.btn-radio input[type=radio]:checked+.fa:before{content:"\f00c"}.dropzone{position:relative;margin:15px 0;padding:1.25em 46px 1.25em 1.25em;border:1px dashed #ccc;-webkit-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.dropzone:hover{border-color:#999}.dropzone-mask{position:absolute;left:0;right:0;bottom:0;top:0}.dropzone-close{position:absolute;top:5px;right:5px;height:26px;width:26px;font-family:FontAwesome;font-size:14px;line-height:26px;text-align:center;-webkit-transform:translate(0,0);transform:translate(0,0);overflow:hidden;background-color:#eaeaea}.dropzone-close:hover{color:#fff;background-color:#c83c3c}.dropzone-close:before{content:"\f00d"}.dropzone-hint{display:table}.dropzone-hint-body,.dropzone-hint-media{display:table-cell;vertical-align:middle}.dropzone-hint-body :first-child{margin-top:0}.dropzone-hint-body :last-child{margin-bottom:0}.dropzone-hint-media{padding-right:1em}.dropzone-hint-icon{height:40px;width:40px;text-align:center;line-height:40px;font-size:16px;background-color:#eee;border-radius:50%;font-family:FontAwesome;-webkit-transform:translate(0,0);transform:translate(0,0)}.dropzone-hint-icon:before{content:"\f093"}.dropzone-hint-title{font-size:12px;font-weight:700;margin-bottom:.25em}.drop-status-ok .dropzone-hint-icon{color:#fff;background:#79a548}.drop-in-progress .dropzone-hint-icon:before{content:"\f063"}.upload-queue{margin:15px 0}.upload-queue-progress{position:relative;padding:5px;color:#fff;background-color:#999;border:1px solid rgba(0,0,0,.15);text-align:right}.upload-queue-progress-bar{position:absolute;z-index:1;top:0;left:0;bottom:0;background-color:#79a548}.upload-queue-progress-message,.upload-queue-progress-percentage{display:inline;position:relative;z-index:2}.t3-icon,.t3-icon .c-inputButton{display:inline-block;height:16px;width:16px}.upload-file-picker{position:fixed;bottom:0;right:0;height:1px;width:1px;visibility:hidden}.uploading .upload-queue-progress-bar{background-color:#6daae0}.error .upload-queue-progress-bar{background-color:#c83c3c}.t3-icon{position:relative;vertical-align:middle;background-image:url(../../../../backend/Resources/Public/Icons/icon_fatalerror.gif);background-repeat:no-repeat;margin-right:2px;text-align:center}.t3-icon.fa{background:0 0;font-size:14px}.btn-login.active,.btn-login:active,.open>.btn-login.dropdown-toggle,.t3-icon-empty{background-image:none}.t3-icon-overlay{display:block;position:absolute;left:0;top:0;width:16px;height:16px;text-decoration:none;padding:0}.typo3-login{background-color:#eee;background-repeat:no-repeat;background-size:cover;background-position:center center;display:table;position:absolute;top:0;left:0;padding:10px;width:100%;min-height:100%;height:100%}.typo3-login-container{display:table-cell;vertical-align:middle}.typo3-login-wrap{max-width:360px;margin:0 auto}.typo3-login-links{padding-top:inherit;margin-top:20px;margin-bottom:20px}.typo3-login-links .disabled{cursor:not-allowed!important;text-decoration:none!important;color:#737373!important}.typo3-login-links .disabled span{cursor:inherit}.t3-btn,a span{cursor:pointer}.typo3-login-logo{margin-bottom:30px}.typo3-login-logo>img{display:block;max-width:100%;height:auto;margin:0 auto}.typo3-login-news-heading{font-size:14px;line-height:1.3em;margin-top:0}.panel-login{border-color:#d5d4d4;border-radius:5px}.panel-login .panel-heading{border-top-right-radius:4px;border-top-left-radius:4px}.panel-login .panel-body{border-bottom:3px solid #f80}.panel-login .panel-footer{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-login,.input-login{padding:12px;font-size:12px;border-radius:2px}.panel-login a{font-weight:700}@media (max-width:767px){.panel-login{margin-bottom:0}}.input-login{height:41.2px;line-height:1.3333333;border-color:#ccc}select.input-login{height:41.2px;line-height:41.2px}select[multiple].input-login,textarea.input-login{height:auto}.input-login:focus{box-shadow:none}.btn-login{color:#fff;background-color:#f80;border-color:rgba(0,0,0,.1);line-height:1.3em}.btn-login.active,.btn-login.focus,.btn-login:active,.btn-login:focus,.btn-login:hover,.open>.btn-login.dropdown-toggle{color:#fff;background-color:#cc6d00;border-color:rgba(0,0,0,.1)}.btn-login.active.focus,.btn-login.active:focus,.btn-login.active:hover,.btn-login:active.focus,.btn-login:active:focus,.btn-login:active:hover,.open>.btn-login.dropdown-toggle.focus,.open>.btn-login.dropdown-toggle:focus,.open>.btn-login.dropdown-toggle:hover{color:#fff;background-color:#a85a00;border-color:rgba(0,0,0,.1)}.btn-login.disabled.focus,.btn-login.disabled:focus,.btn-login.disabled:hover,.btn-login[disabled].focus,.btn-login[disabled]:focus,.btn-login[disabled]:hover,fieldset[disabled] .btn-login.focus,fieldset[disabled] .btn-login:focus,fieldset[disabled] .btn-login:hover{background-color:#f80;border-color:rgba(0,0,0,.1)}.btn-login .badge{color:#f80;background-color:#fff}.btn-login:active,.btn-login:active:focus,.btn-login:active:hover,.btn-login:focus,.btn-login:hover,.btn-login:visited{background-color:#f80}.btn-login:active:focus,.btn-login:focus{outline:0}.btn-login:hover{box-shadow:inset 0 0 100px rgba(0,0,0,.125)}.btn-login:active:focus,.btn-login:active:hover{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-login:focus{box-shadow:none}.typo3-login-carousel-control{top:50%;margin-top:-30px;height:60px;line-height:60px;width:10px;background-color:#fff;text-align:center;position:absolute;opacity:.25;-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.typo3-login-carousel-control:hover{opacity:1}.typo3-login-carousel-control.left{left:-10px;border:1px solid #d5d4d4;border-right:0;border-radius:2px 0 0 2px}.typo3-login-carousel-control.right{right:-10px;border:1px solid #d5d4d4;border-left:0;border-radius:0 2px 2px 0}@media (min-width:768px){.typo3-login-carousel-control{width:20px}.typo3-login-carousel-control.left{left:-20px}.typo3-login-carousel-control.right{right:-20px}}.typo3-login-copyright-link>img{float:right;margin-top:-4px}.typo3-login-copyright-text{margin-top:18px;color:#444}.typo3-login-copyright-text .fa{font-size:13px}.typo3-login-copyright-text>:first-child{margin-top:0}.typo3-login-copyright-text>:last-child{margin-bottom:0}div.typo3-noDoc{margin-left:10px;margin-top:5px;width:740px}div.typo3-noDoc h2{width:740px}div.typo3-fullDoc{height:100%;width:100%}div#typo3-docbody{position:absolute;top:49px;bottom:0;overflow:auto;width:100%;z-index:2}[id=typo3-inner-docbody]{padding:24px;margin-top:0;-webkit-transition:border .2s ease;transition:border .2s ease}body#typo3-show-item-php{padding:12px 24px}h1{font-family:Share,Verdana,Arial,Helvetica,sans-serif;font-variant:normal;font-weight:400;margin-top:0;margin-bottom:22px}.t3-overview-list dt,a.typo3-goBack,div.warningbox{font-weight:700}h2,h3{margin:24px 0 12px}blockquote,ol,ul{margin-bottom:9px}ol,ul{padding-left:3em}pre{margin:0}div.hr,hr{background:0 0;border:none;height:1px}.divider{padding-bottom:12px}li.divider{padding:0}video{background-color:#000}img.absmiddle{vertical-align:middle}.smallCheckboxes{height:12px;margin:0;width:12px}.alignToInputText,.alignToInputText:hover{margin-top:5px;margin-right:2px;vertical-align:top}tr:hover .t3-page-ce a,tr:hover .x-tree a{text-decoration:none}a.t3-link,table.warningbox td a{text-decoration:underline}.typo3-app-icon{position:relative;display:inline-block;padding:0;height:32px;width:32px;overflow:hidden;border-radius:2px;background-color:#484848;vertical-align:middle;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.typo3-app-icon>span{display:table;height:100%;width:100%}.typo3-app-icon>span>span{display:table-cell;text-align:center;vertical-align:middle}.typo3-app-icon img{max-height:32px;max-width:32px;margin:0 auto}.typo3-app-icon .fa{font-size:21px;vertical-align:middle}.typo3-app-icon:after{position:absolute;content:'';display:block;top:0;left:0;right:0;bottom:0;border:1px solid rgba(255,255,255,.1);border-radius:2px}.section{margin-bottom:15px}.diff-r{color:red}div.diff-r{background-color:red;color:#000}.diff-g{color:green}div.diff-g{background-color:green;color:#000}div.warningbox,table.warningbox{border:2px solid #000;background-color:#ff0}div.diff-g,div.diff-r{padding:3px}.c-na{color:#666}.not-found a{color:#ccc}.has-change .checkbox,.has-change .checkbox-inline,.has-change .control-label,.has-change .form-control-feedback,.has-change .help-block,.has-change .radio,.has-change .radio-inline,.has-change.checkbox label,.has-change.checkbox-inline label,.has-change.radio label,.has-change.radio-inline label{color:#6daae0}table.warningbox{margin:20px 0}table.warningbox td{padding:20px;font-weight:700}div.warningbox{margin:10px 0;padding:10px}span.warningboxheader{margin-left:5px}.media-gallery__list .media-gallery__item{display:inline-block;float:none;margin-bottom:15px;margin-right:-4px;vertical-align:top}.grideditor td,.input-group-icon,a.typo3-goBack img,span.typo3-moduleHeader img{vertical-align:middle}.media-gallery__list .media-gallery__item .media-object{max-height:158px;overflow:hidden}.media-gallery__list .media-gallery__item img.thumbnail{height:auto;margin-bottom:0;max-height:150px;max-width:100%}.grideditor div#editor,.grideditor td.editor_cell{height:100%}.media-gallery__list .media-gallery__item span.thumbnail{display:inline-block;margin-bottom:0}.grideditor table.editor{border:0;border-left:1px #d7d7d7 solid;border-top:1px #d7d7d7 solid}.grideditor table.editor td{vertical-align:middle;border:0;border-bottom:1px #d7d7d7 solid;border-right:1px #d7d7d7 solid;text-align:center;background-color:#fff;min-height:100px}.grideditor div.cell_container{width:80px;height:80px;position:relative;left:50%;margin-top:30px;margin-left:-30px;opacity:.3}.grideditor div.cell_container:hover{opacity:.5}.grideditor .grideditor-preview{margin-top:5px}.grideditor .link{display:block;position:absolute;width:20px;height:40px;overflow:hidden;opacity:.5}.form-control-holder,.form-group .t3js-formengine-field-item{position:relative}.grideditor .link:hover{text-decoration:none;opacity:1}.grideditor .link_expand_down,.grideditor .link_shrink_up{width:40px;height:20px}.grideditor .link_expand_right{left:52px;top:0}.grideditor .link_expand_right:before{font-family:FontAwesome;content:"";font-size:42px;line-height:42px}.grideditor .link_shrink_left{left:-8px;top:0}.grideditor .link_shrink_left:before{font-family:FontAwesome;content:"";font-size:42px;line-height:42px}.grideditor .link_expand_down{left:12px;top:40px}.grideditor .link_expand_down:before{font-family:FontAwesome;content:"";font-size:42px;line-height:19px}.grideditor .link_shrink_up{left:12px;top:-20px}.grideditor .link_shrink_up:before{font-family:FontAwesome;content:"";font-size:42px;line-height:20px}.grideditor .link_editor{width:40px;height:40px;left:12px;top:0}.grideditor .link_editor:before{font-family:FontAwesome;content:"ï…‹";font-size:42px;line-height:42px}::-ms-clear{display:none}#typo3-docbody form{margin-bottom:1.25em}a.typo3-goBack img{margin-right:5px}span.typo3-moduleHeader img{margin-right:4px}.has-change .form-control{border-color:#6daae0;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-change .form-control:focus{border-color:#4392d7;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c1dbf2}.has-change .input-group-addon{color:#6daae0;border-color:#6daae0;background-color:#ebf3fb}.has-change .thumbnail-status{border:1px solid #6daae0}.input-group-icon{width:32px}.input-group-icon img{width:100%;max-height:18px}.input-group-addon{min-width:2.5em}label .icon img{pointer-events:none}.form-control{min-width:120px}.form-control-adapt{width:auto;max-width:100%}.form-control-wrap{margin:9px 0}.row>.form-group>.form-control-wrap{margin-bottom:0}.form-group .t3js-formengine-field-item>.t3js-charcounter{left:0;position:absolute;top:100%}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{color:#737373}.form-control-icon{position:absolute;top:50%;left:15px;-webkit-transform:translate(0,-50%);transform:translate(0,-50%);z-index:1}.form-control-icon+.form-control,.form-control-icon+.form-control-clearable .form-control{padding-left:3.25em}.form-group.has-error label:before{font-family:FontAwesome;font-size:12px;text-align:center;content:"ïª";color:#c83c3c;display:inline-block}.form-group.has-error .btn-toolbar label:before,.form-group.has-error .input-group-btn label:before{font-family:inherit;font-size:inherit;margin-right:inherit;text-align:inherit;content:'';display:block}.form-group.has-error .btn-toolbar label:before{color:inherit}.form-group.has-error .input-group-btn label{border-color:#c83c3c}.form-group.has-error .input-group-btn label .t3-icon{color:#c83c3c}.form-group.has-error .input-group-btn label:before{color:inherit}select.form-control[multiple],select.form-control[size]{min-height:156px;width:100%!important}select.form-control[size="1"]{height:32px;min-height:0}select.form-control:not([size]),select.form-control[size="1"]{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:not([size])::-ms-expand,select.form-control[size="1"]::-ms-expand{display:none}select.form-control:not([size]):not(.form-select-no-siblings),select.form-control[size="1"]:not(.form-select-no-siblings){background-image:url(../../../../../../typo3/sysext/core/Resources/Public/Icons/T3Icons/actions/actions-view-list-expand.svg);background-position:right 4px center;background-repeat:no-repeat;background-size:16px 16px;padding-right:24px}.form-group-sm select.form-control:not([size]),.form-group-sm select.form-control[size="1"],.input-group-sm>.input-group-btn>select.form-control.btn:not([size]),.input-group-sm>.input-group-btn>select.form-control[size="1"].btn,.input-group-sm>select.form-control:not([size]),.input-group-sm>select.form-control[size="1"],select.form-control:not([size]).input-sm,select.form-control[size="1"].input-sm{line-height:16px}select.form-control>optgroup{margin-top:9px}select.form-control>optgroup:first-child{margin-top:0}select.form-control option{padding-top:2px;padding-bottom:2px}select.icon-select option{padding-left:22px}.form-control-clearable{position:relative}.form-control-clearable .form-control{padding-right:2.3em}.form-control-clearable .close{position:absolute;height:16px;z-index:3;top:50%;right:.5em;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.form-control-clearable .close .icon{vertical-align:0}.input-group .form-control-clearable{display:table-cell}.input-group .form-control-clearable .form-control{display:block}.form-notice-capslock{position:absolute;right:6px;top:50%;margin-top:-10px;height:20px;width:20px;padding:3px;z-index:10;background-color:#fff}.form-notice-capslock>img{display:block;opacity:.5}.form-inline-spaced{margin:0 -.5em 18px}.form-inline-spaced .form-group{margin:.5em .5em 0}.form-inline-spaced .form-group label{margin-right:.5em}.form-group-dashed+.form-group-dashed{padding-top:15px;border-top:1px dashed #ccc}.form-section{border:1px solid #ccc;background-color:#fafafa;padding:15px 12px 3px}.form-section+.form-section{margin-top:-1px}.tab-pane>.form-section:first-child{border-top:none}.form-section-headline{margin-top:0;margin-bottom:10px}.form-wizards-wrap{display:table;width:100%}.form-wizards-wrap>.form-wizards-element{display:table-cell;width:100%}.form-wizards-wrap>.form-wizards-items-top{display:table-row}.form-wizards-wrap>.form-wizards-items-aside{display:table-cell;vertical-align:top;padding-left:5px;white-space:nowrap}.form-wizards-wrap>.form-wizards-items-bottom{display:table-row}.form-wizards-wrap>.form-wizards-items-bottom:first-child{margin-top:4px}.form-irre-header{display:table;margin:-5px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.form-irre-header-cell{display:table-cell;vertical-align:middle;padding:5px}.form-irre-header-body{width:100%;font-weight:400;white-space:normal}.form-irre-header-body dl{margin-bottom:0}.checkbox-column,.form-multigroup-wrap .form-multigroup-item-wizard,.radio-column{margin-bottom:5px}.form-irre-header-icon{padding-right:0}.form-irre-header-control{cursor:auto}.form-irre-header-control .btn-group>.btn{float:none}.form-multigroup-wrap{width:100%;display:table}.form-multigroup-wrap .form-multigroup-item{display:table-cell;width:50%;vertical-align:top}.form-multigroup-wrap .form-multigroup-item+.form-multigroup-item{padding-left:5px}.form-multigroup-wrap .form-multigroup-item-wizard+select.form-control[multiple],.form-multigroup-wrap .form-multigroup-item-wizard+select.form-control[size]{min-height:125px}.form-multigroup-wrap .form-wizards-wrap{width:100%}.checkbox-row,.radio-row{margin-top:10px;margin-bottom:5px}.checkbox-column>.checkbox,.checkbox-column>.radio,.radio-column>.checkbox,.radio-column>.radio{margin:0}.checkbox-inline.checkbox,.checkbox-inline.radio,.radio-inline.checkbox,.radio-inline.radio{display:block;margin-left:0;margin-right:10px;margin-bottom:10px;padding:0}@media (max-width:767px){.checkbox-inline.checkbox+.checkbox,.checkbox-inline.checkbox+.radio,.checkbox-inline.radio+.checkbox,.checkbox-inline.radio+.radio,.radio-inline.checkbox+.checkbox,.radio-inline.checkbox+.radio,.radio-inline.radio+.checkbox,.radio-inline.radio+.radio{margin-top:-5px}}@media (min-width:768px){.checkbox-inline.checkbox,.checkbox-inline.radio,.radio-inline.checkbox,.radio-inline.radio{display:inline-block;margin-top:10px}.checkbox-inline.checkbox label,.checkbox-inline.radio label,.radio-inline.checkbox label,.radio-inline.radio label{white-space:nowrap}}textarea.formengine-textarea{resize:none}.media-new-content-element-wizard .media-left input{margin-left:2px}.query-builder .form-inline>.form-control-clearable{display:inline}.query-builder .form-group-with-button-addon .input-group{margin-bottom:10px}.query-builder .form-group-with-button-addon .input-group .input-group-addon{padding:0 0 0 1px}.query-builder .form-group-with-button-addon .input-group .input-group-addon .btn-default{border:0}.query-builder .from-control-operator{width:70px;min-width:70px}.t3-grid-table,.t3-page-columns{min-width:100%}.query-builder .action-button-group{margin:10px 0}.query-builder .row-group{margin:10px 0;padding:10px;border-color:#999;box-shadow:0 2px 5px 0 #999}.query-builder .indent{padding-left:20px}.tx_recycler_recycler tr.collapse{display:none}.tx_recycler_recycler tr.collapse.in{display:table-row}.tx_scheduler_mod1 .table td{vertical-align:top}.tx_scheduler_mod1 .table span.name{display:block}.tx_scheduler_mod1 .table span.description{font-style:italic;white-space:normal;color:#737373}.tstemplate-constanteditor .input-group.userTS .input-group-addon.colorbox{display:inline-block;height:100%;position:absolute}.t3-grid-table{border-spacing:10px 0}.t3-grid-container{margin:0 -10px 18px}.t3-grid-cell{background-color:#fafafa;border-bottom:1px solid #cdcdcd}.t3-grid-cell-restricted{background-color:#efc7c7}.t3-grid-cell-unassigned{background:url(../../../../backend/Resources/Public/Images/Backgrounds/layout-not-assigned.png)}.t3-page-column{min-width:150px;max-width:300px}.t3-page-column>h2{margin-top:0}.t3-page-column-header-icons{-webkit-transition:opacity .15s ease-in;transition:opacity .15s ease-in;opacity:.3;position:absolute;right:10px;bottom:5px}.t3-page-column-header{padding:20px 10px 5px;position:relative;background:#fff;border-bottom:1px solid #cdcdcd;color:#999;text-align:left}[data-colpos=unused] .t3-page-column-header{color:#e8a33d;padding-top:60px}.t3-page-column-header a{position:relative}.t3-page-column-header:hover .t3-page-column-header-icons{opacity:1}.t3-page-columns-mode img.c-divider{margin:10px 0 5px}.t3-page-ce,.t3-page-lang-copyce{margin:10px}.t3-page-ce-wrapper{min-height:2em}.t3-page-ce{-webkit-transition:opacity .15s ease-in;transition:opacity .15s ease-in}.t3-page-ce.active-drag{z-index:4500}.t3-page-ce *{border-spacing:0}.t3-page-ce>.t3-page-ce{margin-left:0;margin-right:0}.t3-page-ce .t3-page-ce-body-inner{padding:10px;word-wrap:break-word}.t3-page-ce .t3-page-ce-body-inner img{max-width:100%;height:auto}.t3-page-ce .t3-page-ce-header{-webkit-transition:background .15s ease-in;transition:background .15s ease-in;padding:5px;border:1px solid #ccc;border-bottom:0;border-radius:2px 2px 0 0;background:#eaeaea}.t3-page-ce .t3-page-ce-header-icons-left{float:left}.t3-page-ce .t3-page-ce-header-icons-left>a{display:inline-block;padding:4px}.t3-page-ce .t3-page-ce-header-icons-right{-webkit-transition:opacity .15s ease-in;transition:opacity .15s ease-in;opacity:.3;float:right}.t3-page-ce .t3-page-ce-body{margin-bottom:10px;border:1px solid #ccc;border-top:0;border-radius:0 0 2px 2px;background-color:#fff}.t3-page-ce .t3-page-ce-footer{font-size:11px;padding:5px 10px;background:#fafafa}.t3-page-ce:hover .t3-page-ce-header{background:#d0d0d0}.t3-page-ce:hover .t3-page-ce-body,.t3-page-ce:hover .t3-page-ce-header{border-color:#aaa}.t3-page-ce:hover .t3-page-ce-body{box-shadow:0 1px 0 rgba(0,0,0,.15)}.t3-page-ce:hover .t3-page-ce-header-icons-right{opacity:1}.t3-page-ce-danger:hover .t3-page-ce-header{background-color:#a32e2e;border-color:#a32e2e}.t3-page-ce-danger:hover .t3-page-ce-body{border-color:#a32e2e}.t3-page-ce-danger .t3-page-ce-header{background-color:#c83c3c;border-color:#c83c3c}.t3-page-ce-danger .t3-page-ce-header:hover{background-color:#a32e2e;border-color:#a32e2e}.t3-page-ce-danger .t3-page-ce-body{border-color:#c83c3c}.t3-page-ce-warning:hover .t3-page-ce-header{background-color:#d88b1a;border-color:#d88b1a}.t3-page-ce-warning:hover .t3-page-ce-body{border-color:#d88b1a}.t3-page-ce-warning .t3-page-ce-header{background-color:#e8a33d;border-color:#e8a33d}.t3-page-ce-warning .t3-page-ce-header:hover{background-color:#d88b1a;border-color:#d88b1a}.t3-page-ce-warning .t3-page-ce-body{border-color:#e8a33d}.t3-page-ce-hidden{opacity:.4;-webkit-transition:opacity .15s ease-in;transition:opacity .15s ease-in}.t3-page-ce-hidden:hover{opacity:1}.t3-page-ce-dropzone-available.active{border:1px dashed #e8a33d;border-radius:2px;background-color:#fbefdd;height:27px}.t3-page-ce-dropzone-available.active.t3-page-ce-dropzone-possible{border:1px dashed #79a548;border-radius:2px;background-color:#d1e2bd;margin:-38px 0 -37px;padding:50px 10px;z-index:500;position:relative;opacity:.65}.t3-page-ce-dragitem.dragitem-shadow{opacity:.65;box-shadow:0 1px 24px rgba(0,0,0,.5)}.t3-page-ce.ui-draggable-handle{height:auto!important}.t3-page-ce-dragitem .t3-page-ce-header-draggable:hover{cursor:move}.t3-is-dragged .t3-page-ce-body{max-height:225px;overflow:hidden}.t3-page-ce-dropzone-available.active,.t3-page-ce-dropzone-possible{max-height:225px}#workspace-panel tr.collapsing{-webkit-transition:none;transition:none}#workspace-panel tr.collapse{display:none}#workspace-panel tr.collapse.in{display:table-row}span.item-state-modified{color:#f78f25}span.item-state-moved{color:#457fb8}span.item-state-new{color:#3c9934}span.item-state-hidden{color:#abaaaa}span.item-state-deleted{color:#000;text-decoration:line-through}.legend{margin:5px;height:18px;color:#888}.legend dd,.legend dt{display:inline;overflow:hidden}.legend dd span{display:inline-block;padding:4px}#typo3-debug-console{background-color:#f5f5f5;width:100%;position:absolute;bottom:0;z-index:1000;border:1px solid #b1b1b1}#typo3-debug-console .topbar{background-color:#d7d7d7;padding:6px;border-bottom:1px solid #b1b1b1}#typo3-debug-console .topbar .badge{margin-left:6px}#typo3-debug-console .messages{padding:6px;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;height:250px;overflow:auto}#typo3-debug-console .messages .table{width:auto}#typo3-debug-console .messages p{margin:0}#typo3-debug-console .messages p strong{padding-right:4px}.typo3-dblist-sysnotes{margin-top:15px}.typo3-dblist-sysnotes .panel-sysnote{border:0}.typo3-dblist-sysnotes .panel-sysnote .panel-heading{padding:5px}.typo3-dblist-sysnotes .panel-sysnote .panel-heading .typeicon{padding:4px 4px 12px}.typo3-dblist-sysnotes .panel-sysnote .panel-heading .typeicon .icon{margin-top:5px}.typo3-dblist-sysnotes .panel-sysnote .panel-body h4{margin-top:0}.typo3-dblist-sysnotes .panel-sysnote-category-1{background-color:#ebf3fb;color:#333}.typo3-dblist-sysnotes .panel-sysnote-category-2{background-color:#fbefdd;color:#333}.typo3-dblist-sysnotes .panel-sysnote-category-3{background-color:#f9f9f9;color:#333}.typo3-dblist-sysnotes .panel-sysnote-category-4{background-color:#d1e2bd;color:#333}.typo3-extensionmanager-headerRowLeft{float:left}.typo3-extensionmanager-headerRowRight{float:right}.ui-toolbar{margin-bottom:5px}.ui-toolbar .dataTables_filter{float:left}.dataTables_info{display:none}.dataTables_paginate{float:left;margin:10px 0 0}.uploadForm{background-color:#ededed;border-top:1px solid #cdcdcd;border-bottom:1px solid #cdcdcd;padding:12px;margin-bottom:24px}.uploadForm form .control-group{clear:both;margin-bottom:5px}.uploadForm form label{float:left;height:20px;padding:4px 0;line-height:20px;width:90px}.uploadForm form .control{min-height:20px;padding:4px 0;margin-left:110px}.distribution{border:1px solid #cfcfcf;background-color:#f5f5f5;margin-bottom:20px;margin-left:20px;width:300px;float:left}.distribution:hover{background-color:#ededed}.distribution:hover .distribution-hover{top:0;opacity:1}.distribution:hover .distribution-more{text-decoration:underline}.distribution .typo3-dependency-version{position:absolute;right:0}.distribution-holder{margin-top:1em;bottom:0;margin-left:-20px}.distribution-image{position:relative;width:300px;height:225px;overflow:hidden}.distribution-image img{display:block;height:100%;width:100%}.distribution-hover{background-color:#f5f5f5;position:absolute;top:100%;left:0;width:300px;height:225px;overflow:hidden;opacity:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.distribution-hover-inner{padding:15px}.distribution-meta{border-top:1px solid #dcdbdb;padding:15px}.distribution-meta .distribution-title{margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:14px}.distribution-meta .distribution-install{margin-top:.5em}.distribution-detail{min-width:750px}.distribution-detail-previewpane{float:left;margin-right:30px}.distribution-detail-preview{display:block;border:1px solid #cfcfcf}.distribution-detail-body{overflow:hidden;zoom:1}.distribution-detail-header{margin-bottom:2.5em}.distribution-detail-header h1{margin-bottom:.5em}.distribution-detail-header p{padding:0;max-width:500px;margin-bottom:1.25em}.distribution-detail-summary{margin-top:2.5em;margin-bottom:2.5em}.distribution-installed hr{margin:2.5em 0;border:0;border-top:1px solid #cfcfcf}.ui-widget-header{background:0 0;border:none;font-weight:400}.dataTables_info{font-size:10px;color:#444;float:left}.paging_two_button .ui-button{float:left;cursor:pointer}.paging_full_numbers{float:right}.paging_full_numbers .ui-button{padding:2px 6px;margin:0;cursor:pointer;color:#333!important}.dataTables_paginate{width:auto}.dataTables_paginate .ui-button{margin-right:-.1em!important}.typo3-extension-list .ext-icon{max-height:16px;max-width:16px}.typo3-extension-list tr.installed td{background-color:#c8ffaa}.typo3-extension-list tr.available td{background-color:#e1e1aa}.typo3-extension-list .inactive{color:#aaa}.typo3-extension-list .insecure{color:#ff2262}.typo3-extension-list .insecure a{color:inherit}.typo3-extension-list .outdated{color:#0c08ff}.typo3-extension-list .outdated a{color:inherit}.typo3-extension-list .author{display:none}#extensionUploadForm div.control-group:last-child{margin-bottom:0}.headerTooltip{box-shadow:2px 2px 11px #666;display:none;width:150px;background-color:#ffa;border:1px solid #cc9;padding:3px;font-size:13px;z-index:1000}#terTableWrapper{position:relative;margin-top:1em}#terTableWrapper .splash-receivedata{display:none;position:absolute;top:50px;left:50%;margin:0 0 0 -150px}#typo3-docbody form.download,div.typo3-module-lang table.t3-datatable div.progress{margin-bottom:0}#terTableWrapper .splash-receivedata a{display:inline-block;width:200px;vertical-align:top;padding:3px 20px}#terTableWrapper .splash-receivedata.is-shown{display:block}#terTableWrapper .spinner{display:inline-block}#terTableWrapper .ui-icon{width:16px;height:16px}.time-since-last-update{font-weight:700;padding-right:.4em;cursor:help}.is-loading{opacity:0}.is-hidden{display:none}.typo3-extensionmanager-headerRowLeft,.versions-all{display:inline-block}.versions-all{width:20px;text-indent:-200px;overflow:hidden}.currentVersionInfo{padding:0 0 20px}.currentVersionInfo td{padding:4px 0}.currentVersionInfo th{font-weight:400;color:#8c8c8c;padding:4px 20px 4px 0}span.ter-ext-state{padding:0 0 0 5px;font-weight:700;text-transform:capitalize}.typo3-extensionmanager-headerRowLeft .typo3-extensionmanager-searchTerFieldWrapper{display:inline-block;position:relative}.typo3-extensionmanager-headerRowLeft .typo3-extensionmanager-searchTerFieldWrapper input{height:15px}.typo3-extensionmanager-headerRowLeft .typo3-extensionmanager-searchTerFieldWrapper .t3-icon-input-clear{position:absolute;right:3px;top:4px}div.typo3-module-lang table.t3-datatable{width:100%!important}div.typo3-module-lang table.t3-datatable th.sorting,div.typo3-module-lang table.t3-datatable th.sorting_asc,div.typo3-module-lang table.t3-datatable th.sorting_desc{cursor:pointer}div.typo3-module-lang table.t3-datatable tr>.extensionName{padding-left:0!important}div.typo3-module-lang table.t3-datatable tr>.dt-center{text-align:center}div.typo3-module-lang table.t3-datatable tr.disabled{color:#aaa}div.typo3-module-lang table.t3-datatable tr div.progressBar,div.typo3-module-lang table.t3-datatable tr.disabled a.deactivateLanguageLink,div.typo3-module-lang table.t3-datatable tr.disabled a.removeLanguageLink,div.typo3-module-lang table.t3-datatable tr.disabled a.updateLanguageLink,div.typo3-module-lang table.t3-datatable tr.disabled a.updateTranslationLink,div.typo3-module-lang table.t3-datatable tr.enabled a.activateLanguageLink{display:none}div.typo3-module-lang table.t3-datatable tr div.progressBar .progress{position:relative}div.typo3-module-lang table.t3-datatable tr div.progressBar .progress .progress-text{position:absolute;color:#fff;text-align:center;width:100%;text-shadow:0 0 6px #000}div.typo3-module-lang table.t3-datatable tr.complete div.progressBar,div.typo3-module-lang table.t3-datatable tr.processing div.progressBar{display:inline;cursor:default}div.typo3-module-lang table.t3-datatable td span.complete,div.typo3-module-lang table.t3-datatable td span.loading,div.typo3-module-lang table.t3-datatable td.complete a.removeLanguageLink,div.typo3-module-lang table.t3-datatable td.complete a.updateLanguageLink,div.typo3-module-lang table.t3-datatable td.complete a.updateTranslationLink,div.typo3-module-lang table.t3-datatable td.processing a.removeLanguageLink,div.typo3-module-lang table.t3-datatable td.processing a.updateLanguageLink,div.typo3-module-lang table.t3-datatable td.processing a.updateTranslationLink,div.typo3-module-lang table.t3-datatable tr.complete a.removeLanguageLink,div.typo3-module-lang table.t3-datatable tr.complete a.updateLanguageLink,div.typo3-module-lang table.t3-datatable tr.complete a.updateTranslationLink,div.typo3-module-lang table.t3-datatable tr.processing a.removeLanguageLink,div.typo3-module-lang table.t3-datatable tr.processing a.updateLanguageLink,div.typo3-module-lang table.t3-datatable tr.processing a.updateTranslationLink{display:none}div.typo3-module-lang table.t3-datatable td.actions span{cursor:pointer}div.typo3-module-lang table.t3-datatable td.processing span.loading{display:inline;cursor:default}div.typo3-module-lang table.t3-datatable td.processing span.loading .t3-icon{cursor:default;width:14px;height:14px;margin:0}div.typo3-module-lang table.t3-datatable td.complete span.complete{display:inline}div.typo3-module-lang div.menuItems.processing span.updateItem{display:none}div.typo3-module-lang div.menuItems.processing span.cancelItem,div.typo3-module-lang div.menuItems.processing span.loadingItem{display:inline}div.typo3-module-lang div.menuItems span.cancelItem,div.typo3-module-lang div.menuItems span.loadingItem{display:none}div.typo3-module-lang div.menuItems span.cancelItem .t3-icon,div.typo3-module-lang div.menuItems span.loadingItem .t3-icon{height:14px;width:14px}div.typo3-module-lang div.menuItems span.cancelItem,div.typo3-module-lang div.menuItems span.updateItem{cursor:pointer}div.typo3-module-lang .div.dataTables_filter input{margin-left:3px}div.typo3-module-lang div.progress-bar{background-color:#222}.beuser-legend{margin-bottom:18px}.beuser-legend .pull-left{margin-right:.5em}.beuser-legend td{overflow:hidden}.beuser-legend .t3-icon{margin-right:0}.beuser-legend .number{border:1px solid #000;border-radius:2px;width:16px;height:16px;display:inline-block;text-align:center;margin-right:5px;margin-left:10px;line-height:14px;font-weight:700}.beuser-legend .edge span{width:1px;height:10px;background:#000;display:block;margin-top:8px;margin-left:6px}.beuser-legend .edge span span{width:10px;height:1px;margin-left:1px}.beuser-legend .hr span{width:20px;height:1px;background:#000;display:block;margin-top:-1px;margin-left:-4px}.beuser-legend .vr span{width:1px;height:20px;background:#000;margin-top:-2px;margin-left:6px;display:block}.col-icon img{max-width:28px;max-height:28px}.tx_cshmanual .t3-copyright-notice{font-size:11px;color:#1e1e1e;border-top:1px solid #d7d7d7;padding-top:24px}.tx_cshmanual .t3-copyright-notice>:last-child{margin-bottom:0}.localization-wizard .option,[data-slide=localize-summary] .input-group{margin-bottom:4px}[data-slide=localize-summary] .input-group .form-control{height:auto;font-weight:400}.workspace-info{padding:7px}.workspace-overview td{vertical-align:top}img.c-inputButton,input.c-inputButton{margin-right:2px;vertical-align:middle}table.typo3-dblist tr td.col-icon{vertical-align:middle;width:20px}table.typo3-dblist tr td.col-icon a img.collapseIcon{margin:1px 0 0 2px}table.typo3-dblist tr td.col-title{overflow:hidden;vertical-align:middle;width:350px}table.typo3-dblist tr td.col-title.localization{padding-left:18px}table.typo3-dblist tr td.col-control{width:250px}table.typo3-dblist tr td.col-control-space{width:4px}table.typo3-dblist tr td.col-clipboard{width:74px}table.typo3-dblist-overview{margin-top:10px;margin-left:1px;width:410px}table.typo3-dblist-overview td.c-tableDescription{padding-left:10px}table.typo3-dblist-overview td.c-tableDescription img{margin-right:10px}div#typo3-newRecordLink,div.typo3-localizationLink,div.typo3-newRecordLink,div.typo3-synchronizationLink{display:inline}div#typo3-newRecordLink img,div.typo3-localizationLink img,div.typo3-newRecordLink img,div.typo3-synchronizationLink img{margin-right:5px;vertical-align:middle}input.smallCheckboxes{height:12px;margin:0;padding:0;vertical-align:middle;width:12px}div.typo3-listOptions{margin:0 0 24px}.t3-list-table-header-icon-down{display:inline-block;height:6px;padding:5px 4px;width:9px}.t3-list-table-header-icon-right{display:inline-block;height:8px;padding:4px 5px;width:7px}.db_list-searchbox-toolbar .form-inline{margin-top:-.5em;margin-bottom:0}.typo3-docheader-buttons+.db_list-searchbox-toolbar{box-shadow:0 3px 0 rgba(0,0,0,.15);position:absolute;z-index:999;width:100%}.typo3-docheader-buttons+.db_list-searchbox-toolbar .panel{border-radius:0;border:0;margin:0}.typo3-docheader-buttons+.db_list-searchbox-toolbar .panel-default{background-color:#eee}pre.ts-hl{font-family:"Lucida Console","Lucida Sans Typewriter","Bitsream Vera Sans Mono",monospace}pre.ts-hl .ts-operator{color:#000;font-weight:700}pre.ts-hl .ts-value{color:#c00}pre.ts-hl .ts-objstr{color:#00c}pre.ts-hl .ts-value_copy{color:#060}pre.ts-hl .ts-default,pre.ts-hl .ts-ignored,pre.ts-hl .ts-value_unset{background-color:#6c6}pre.ts-hl .ts-comment{color:#666}pre.ts-hl .ts-condition{background-color:maroon;color:#fff;font-weight:700}pre.ts-hl .ts-error{background-color:#ff0;border:1px dashed red;font-weight:700;color:#000}pre.ts-hl .ts-linenum{background-color:#eee;color:#212424}#typo3-pagetree .workspace-info{background-color:#ffec97;font-weight:700} \ No newline at end of file +@charset "UTF-8";.minicolors-panel,.minicolors-picker,hr{box-sizing:content-box}.fa-ul>li,sub,sup{position:relative}.fa-fw,.fa-li{text-align:center}.cropper-container,html{-webkit-tap-highlight-color:transparent}.card,.img-thumbnail{-webkit-transition:all .2s ease-in-out}.img-responsive,.img-thumbnail,.table,label{max-width:100%}.btn,.modulemenu .modulemenu-group-header{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.t3-grid-table,.table-fixed{table-layout:fixed}#nprogress,.cropper .cropper-crop-box:after,.form-control-feedback,a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}.fa,.fa-stack{display:inline-block}a:active,a:hover{outline:0}b,optgroup,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{background:#ff0;color:#000}.btn,.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active,.btn.active,.btn:active,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover,.form-control,.open>.btn-danger.dropdown-toggle,.open>.btn-default.dropdown-toggle,.open>.btn-info.dropdown-toggle,.open>.btn-success.dropdown-toggle,.open>.btn-warning.dropdown-toggle{background-image:none}sub,sup{font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}hr{margin-top:18px;margin-bottom:18px}pre,textarea{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}.fa.fa-pull-left,.fa.pull-left{margin-right:.3em}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}td,th{padding:0}@font-face{font-family:FontAwesome;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.eot?v=4.7.0);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.eot?#iefix&v=4.7.0) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.woff2?v=4.7.0) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.woff?v=4.7.0) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.ttf?v=4.7.0) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa{font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.btn,.btn-group,.btn-group-vertical,.caret,.checkbox-inline,.fa-stack,.radio-inline,img{vertical-align:middle}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa.fa-pull-right,.fa.pull-right{margin-left:.3em}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{position:relative;width:2em;height:2em;line-height:2em}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:"ï€"}.fa-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:"ï€"}.fa-search-plus:before{content:""}.fa-search-minus:before{content:"ï€"}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:"ï€"}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before{content:"ï€"}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:"ï€"}.fa-map-marker:before{content:"ï"}.fa-adjust:before{content:"ï‚"}.fa-tint:before{content:"ïƒ"}.fa-edit:before,.fa-pencil-square-o:before{content:"ï„"}.fa-share-square-o:before{content:"ï…"}.fa-check-square-o:before{content:"ï†"}.fa-arrows:before{content:"ï‡"}.fa-step-backward:before{content:"ïˆ"}.fa-fast-backward:before{content:"ï‰"}.fa-backward:before{content:"ïŠ"}.fa-play:before{content:"ï‹"}.fa-pause:before{content:"ïŒ"}.fa-stop:before{content:"ï"}.fa-forward:before{content:"ïŽ"}.fa-fast-forward:before{content:"ï"}.fa-step-forward:before{content:"ï‘"}.fa-eject:before{content:"ï’"}.fa-chevron-left:before{content:"ï“"}.fa-chevron-right:before{content:"ï”"}.fa-plus-circle:before{content:"ï•"}.fa-minus-circle:before{content:"ï–"}.fa-times-circle:before{content:"ï—"}.fa-check-circle:before{content:"ï˜"}.fa-question-circle:before{content:"ï™"}.fa-info-circle:before{content:"ïš"}.fa-crosshairs:before{content:"ï›"}.fa-times-circle-o:before{content:"ïœ"}.fa-check-circle-o:before{content:"ï"}.fa-ban:before{content:"ïž"}.fa-arrow-left:before{content:"ï "}.fa-arrow-right:before{content:"ï¡"}.fa-arrow-up:before{content:"ï¢"}.fa-arrow-down:before{content:"ï£"}.fa-mail-forward:before,.fa-share:before{content:"ï¤"}.fa-expand:before{content:"ï¥"}.fa-compress:before{content:"ï¦"}.fa-plus:before{content:"ï§"}.fa-minus:before{content:"ï¨"}.fa-asterisk:before{content:"ï©"}.fa-exclamation-circle:before{content:"ïª"}.fa-gift:before{content:"ï«"}.fa-leaf:before{content:"ï¬"}.fa-fire:before{content:"ï"}.fa-eye:before{content:"ï®"}.fa-eye-slash:before{content:"ï°"}.fa-exclamation-triangle:before,.fa-warning:before{content:"ï±"}.fa-plane:before{content:"ï²"}.fa-calendar:before{content:"ï³"}.fa-random:before{content:"ï´"}.fa-comment:before{content:"ïµ"}.fa-magnet:before{content:"ï¶"}.fa-chevron-up:before{content:"ï·"}.fa-chevron-down:before{content:"ï¸"}.fa-retweet:before{content:"ï¹"}.fa-shopping-cart:before{content:"ïº"}.fa-folder:before{content:"ï»"}.fa-folder-open:before{content:"ï¼"}.fa-arrows-v:before{content:"ï½"}.fa-arrows-h:before{content:"ï¾"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"ï‚€"}.fa-twitter-square:before{content:"ï‚"}.fa-facebook-square:before{content:"ï‚‚"}.fa-camera-retro:before{content:""}.fa-key:before{content:"ï‚„"}.fa-cogs:before,.fa-gears:before{content:"ï‚…"}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:"ï‚Š"}.fa-sign-out:before{content:"ï‚‹"}.fa-linkedin-square:before{content:"ï‚Œ"}.fa-thumb-tack:before{content:"ï‚"}.fa-external-link:before{content:"ï‚Ž"}.fa-sign-in:before{content:"ï‚"}.fa-trophy:before{content:"ï‚‘"}.fa-github-square:before{content:"ï‚’"}.fa-upload:before{content:"ï‚“"}.fa-lemon-o:before{content:"ï‚”"}.fa-phone:before{content:"ï‚•"}.fa-square-o:before{content:"ï‚–"}.fa-bookmark-o:before{content:"ï‚—"}.fa-phone-square:before{content:""}.fa-twitter:before{content:"ï‚™"}.fa-facebook-f:before,.fa-facebook:before{content:"ï‚š"}.fa-github:before{content:"ï‚›"}.fa-unlock:before{content:"ï‚œ"}.fa-credit-card:before{content:"ï‚"}.fa-feed:before,.fa-rss:before{content:"ï‚ž"}.fa-hdd-o:before{content:"ï‚ "}.fa-bullhorn:before{content:"ï‚¡"}.fa-bell:before{content:""}.fa-certificate:before{content:"ï‚£"}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:"ï‚¥"}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before{content:""}.fa-arrow-circle-right:before{content:"ï‚©"}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:"ï‚«"}.fa-globe:before{content:""}.fa-wrench:before{content:"ï‚"}.fa-tasks:before{content:"ï‚®"}.fa-filter:before{content:"ï‚°"}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before{content:"ïƒ"}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:"ïƒ"}.fa-table:before{content:""}.fa-magic:before{content:"ïƒ"}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:"ïƒ"}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:"ïƒ "}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:"ïƒ"}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:"ï‚¢"}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:"ï„€"}.fa-angle-double-right:before{content:"ï„"}.fa-angle-double-up:before{content:"ï„‚"}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:"ï„„"}.fa-angle-right:before{content:"ï„…"}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:"ï„Š"}.fa-mobile-phone:before,.fa-mobile:before{content:"ï„‹"}.fa-circle-o:before{content:"ï„Œ"}.fa-quote-left:before{content:"ï„"}.fa-quote-right:before{content:"ï„Ž"}.fa-spinner:before{content:"ï„"}.fa-circle:before{content:"ï„‘"}.fa-mail-reply:before,.fa-reply:before{content:"ï„’"}.fa-github-alt:before{content:"ï„“"}.fa-folder-o:before{content:"ï„”"}.fa-folder-open-o:before{content:"ï„•"}.fa-smile-o:before{content:""}.fa-frown-o:before{content:"ï„™"}.fa-meh-o:before{content:"ï„š"}.fa-gamepad:before{content:"ï„›"}.fa-keyboard-o:before{content:"ï„œ"}.fa-flag-o:before{content:"ï„"}.fa-flag-checkered:before{content:"ï„ž"}.fa-terminal:before{content:"ï„ "}.fa-code:before{content:"ï„¡"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"ï„¢"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"ï„£"}.fa-location-arrow:before{content:""}.fa-crop:before{content:"ï„¥"}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:"ï„©"}.fa-exclamation:before{content:""}.fa-superscript:before{content:"ï„«"}.fa-subscript:before{content:""}.fa-eraser:before{content:"ï„"}.fa-puzzle-piece:before{content:"ï„®"}.fa-microphone:before{content:"ï„°"}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:"ï„´"}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:"ï„·"}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:"ï„»"}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:"ï…€"}.fa-ellipsis-h:before{content:"ï…"}.fa-ellipsis-v:before{content:"ï…‚"}.fa-rss-square:before{content:"ï…ƒ"}.fa-play-circle:before{content:"ï…„"}.fa-ticket:before{content:"ï……"}.fa-minus-square:before{content:"ï…†"}.fa-minus-square-o:before{content:"ï…‡"}.fa-level-up:before{content:"ï…ˆ"}.fa-level-down:before{content:"ï…‰"}.fa-check-square:before{content:"ï…Š"}.fa-pencil-square:before{content:"ï…‹"}.fa-external-link-square:before{content:"ï…Œ"}.fa-share-square:before{content:"ï…"}.fa-compass:before{content:"ï…Ž"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"ï…"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"ï…‘"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"ï…’"}.fa-eur:before,.fa-euro:before{content:"ï…“"}.fa-gbp:before{content:"ï…”"}.fa-dollar:before,.fa-usd:before{content:"ï…•"}.fa-inr:before,.fa-rupee:before{content:"ï…–"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"ï…—"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"ï…˜"}.fa-krw:before,.fa-won:before{content:"ï…™"}.fa-bitcoin:before,.fa-btc:before{content:"ï…š"}.fa-file:before{content:"ï…›"}.fa-file-text:before{content:"ï…œ"}.fa-sort-alpha-asc:before{content:"ï…"}.fa-sort-alpha-desc:before{content:"ï…ž"}.fa-sort-amount-asc:before{content:"ï… "}.fa-sort-amount-desc:before{content:"ï…¡"}.fa-sort-numeric-asc:before{content:"ï…¢"}.fa-sort-numeric-desc:before{content:"ï…£"}.fa-thumbs-up:before{content:"ï…¤"}.fa-thumbs-down:before{content:"ï…¥"}.fa-youtube-square:before{content:"ï…¦"}.fa-youtube:before{content:"ï…§"}.fa-xing:before{content:"ï…¨"}.fa-xing-square:before{content:"ï…©"}.fa-youtube-play:before{content:"ï…ª"}.fa-dropbox:before{content:"ï…«"}.fa-stack-overflow:before{content:"ï…¬"}.fa-instagram:before{content:"ï…"}.fa-flickr:before{content:"ï…®"}.fa-adn:before{content:"ï…°"}.fa-bitbucket:before{content:"ï…±"}.fa-bitbucket-square:before{content:"ï…²"}.fa-tumblr:before{content:"ï…³"}.fa-tumblr-square:before{content:"ï…´"}.fa-long-arrow-down:before{content:"ï…µ"}.fa-long-arrow-up:before{content:"ï…¶"}.fa-long-arrow-left:before{content:"ï…·"}.fa-long-arrow-right:before{content:"ï…¸"}.fa-apple:before{content:"ï…¹"}.fa-windows:before{content:"ï…º"}.fa-android:before{content:"ï…»"}.fa-linux:before{content:"ï…¼"}.fa-dribbble:before{content:"ï…½"}.fa-skype:before{content:"ï…¾"}.fa-foursquare:before{content:""}.fa-trello:before{content:"ï†"}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:"ï†"}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:"ï†"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:"ï†"}.fa-yahoo:before{content:""}.fa-google:before{content:"ï† "}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:"ï†"}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:"ï‡"}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"ï‡"}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"ï‡"}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:"ï‡"}.fa-sliders:before{content:""}.fa-share-alt:before{content:"ï‡ "}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:"ï‡"}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:"ïˆ"}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:"ïˆ"}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:"ïˆ"}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:"ïˆ"}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:"ïˆ"}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"ï‰"}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:"ï‰"}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:"ï‰"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:"ï‰"}.fa-creative-commons:before{content:""}.fa-gg:before{content:"ï‰ "}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:"ï‰"}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:"ïŠ"}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:"ïŠ"}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:"ïŠ"}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:"ïŠ"}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:"ïŠ "}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:"ïŠ"}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:"ï‹€"}.fa-id-badge:before{content:"ï‹"}.fa-drivers-license:before,.fa-id-card:before{content:"ï‹‚"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:"ï‹„"}.fa-free-code-camp:before{content:"ï‹…"}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"ï‹Š"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"ï‹‹"}.fa-shower:before{content:"ï‹Œ"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"ï‹"}.fa-podcast:before{content:"ï‹Ž"}.fa-window-maximize:before{content:"ï‹"}.fa-window-minimize:before{content:"ï‹‘"}.fa-window-restore:before{content:"ï‹’"}.fa-times-rectangle:before,.fa-window-close:before{content:"ï‹“"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"ï‹”"}.fa-bandcamp:before{content:"ï‹•"}.fa-grav:before{content:"ï‹–"}.fa-etsy:before{content:"ï‹—"}.fa-imdb:before{content:""}.fa-ravelry:before{content:"ï‹™"}.fa-eercast:before{content:"ï‹š"}.fa-microchip:before{content:"ï‹›"}.fa-snowflake-o:before{content:"ï‹œ"}.fa-superpowers:before{content:"ï‹"}.fa-wpexplorer:before{content:"ï‹ž"}.fa-meetup:before{content:"ï‹ "}@font-face{font-family:Share;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bold-webfont.eot);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bold-webfont.eot?#iefix) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bold-webfont.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bold-webfont.ttf) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bold-webfont.svg#Share-BoldRegular) format("svg");font-weight:700;font-style:normal}@font-face{font-family:Share;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-italic-webfont.eot);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-italic-webfont.eot?#iefix) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-italic-webfont.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-italic-webfont.ttf) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-italic-webfont.svg#Share-ItalicRegular) format("svg");font-weight:400;font-style:italic}@font-face{font-family:Share;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-regular-webfont.eot);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-regular-webfont.eot?#iefix) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-regular-webfont.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-regular-webfont.ttf) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-regular-webfont.svg#Share-Regular) format("svg");font-weight:400;font-style:normal}@font-face{font-family:Share;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bolditalic-webfont.eot);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bolditalic-webfont.eot?#iefix) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bolditalic-webfont.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bolditalic-webfont.ttf) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bolditalic-webfont.svg#Share-BoldItalicRegular) format("svg");font-weight:700;font-style:italic}*,:after,:before{box-sizing:border-box}html{font-size:10px}body{font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;line-height:1.5;color:#000;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{background-color:transparent;color:#212424;text-decoration:none}a:focus,a:hover{color:#000;text-decoration:underline}a:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}figure{margin:0}.img-responsive{display:block;height:auto}.img-rounded{border-radius:2px}.img-thumbnail{padding:4px;line-height:1.5;background-color:#fff;border:1px solid #ddd;border-radius:2px;transition:all .2s ease-in-out;display:inline-block;height:auto}.img-circle{border-radius:50%}.bootstrap-datetimepicker-widget .btn[data-action=incrementHours]::after,.bootstrap-datetimepicker-widget .btn[data-action=incrementMinutes]::after,.bootstrap-datetimepicker-widget .btn[data-action=decrementHours]::after,.bootstrap-datetimepicker-widget .btn[data-action=decrementMinutes]::after,.bootstrap-datetimepicker-widget .btn[data-action=showHours]::after,.bootstrap-datetimepicker-widget .btn[data-action=showMinutes]::after,.bootstrap-datetimepicker-widget .btn[data-action=togglePeriod]::after,.bootstrap-datetimepicker-widget .btn[data-action=clear]::after,.bootstrap-datetimepicker-widget .btn[data-action=today]::after,.bootstrap-datetimepicker-widget .picker-switch::after,.bootstrap-datetimepicker-widget table th.next::after,.bootstrap-datetimepicker-widget table th.prev::after,.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#737373}.h1,.h2,.h3,h1,h2,h3{margin-top:18px;margin-bottom:9px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:9px;margin-bottom:9px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:27px}.h2,h2{font-size:19px}.h3,h3{font-size:17px}.h4,h4{font-size:15px}.h5,h5{font-size:12px}.h6,h6{font-size:11px}p{margin:0 0 9px}.lead{margin-bottom:18px;font-weight:300;line-height:1.4}dt,kbd kbd,label{font-weight:700}@media (min-width:768px){.lead{font-size:18px}}.small,small{font-size:91%}.mark,mark{background-color:#fbefdd;padding:.2em}.list-inline,.list-unstyled,.modulemenu .modulemenu-group-container{padding-left:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.initialism,.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#737373}.text-primary{color:#0078e6}a.text-primary:focus,a.text-primary:hover{color:#005db3}.text-success{color:#79a548}a.text-success:focus,a.text-success:hover{color:#5f8139}.text-info{color:#6daae0}a.text-info:focus,a.text-info:hover{color:#4392d7}.text-warning{color:#e8a33d}a.text-warning:focus,a.text-warning:hover{color:#d88b1a}.text-danger{color:#c83c3c}a.text-danger:focus,a.text-danger:hover{color:#a32e2e}.bg-primary{color:#fff;background-color:#0078e6}a.bg-primary:focus,a.bg-primary:hover{background-color:#005db3}.bg-success{background-color:#d1e2bd}a.bg-success:focus,a.bg-success:hover{background-color:#b8d39a}.bg-info{background-color:#ebf3fb}a.bg-info:focus,a.bg-info:hover{background-color:#c1dbf2}.bg-warning{background-color:#fbefdd}a.bg-warning:focus,a.bg-warning:hover{background-color:#f6d9af}.bg-danger{background-color:#efc7c7}a.bg-danger:focus,a.bg-danger:hover{background-color:#e49f9f}.page-header{padding-bottom:8px;margin:36px 0 18px;border-bottom:1px solid #f5f5f5}dl,ol,ul{margin-top:0}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child,ol ol,ol ul,ul ol,ul ul{margin-bottom:0}ol,ul{margin-bottom:9px}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-bottom:18px}dd,dt{line-height:1.5}dd{margin-left:0}.dl-horizontal dd:after,.form-irre-header-body dl dd:after{content:"";display:table;clear:both}@media (min-width:768px){.dl-horizontal dt,.form-irre-header-body dl dt{float:left;width:70px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd,.form-irre-header-body dl dd{margin-left:90px}.container{width:750px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #d7d7d7}.initialism{font-size:90%}blockquote{padding:9px 18px;margin:0 0 18px;font-size:15px;border-left:5px solid #f5f5f5}.container,.container-fluid{margin-right:auto;margin-left:auto}.table,address{margin-bottom:18px}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.5;color:#d7d7d7}legend,pre{color:#5a5a5a}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #f5f5f5;border-left:0;text-align:right}code,kbd{padding:2px 4px;font-size:90%;border-radius:2px}caption,th{text-align:left}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{font-style:normal;line-height:1.5}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{color:#c7254e;background-color:#f9f2f4}kbd{color:#fff;background-color:#333;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{display:block;padding:8.5px;font-size:11px;line-height:1.5;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:2px}.container-fluid:after,.container:after,.row:after{display:table;content:"";clear:both}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.container,.container-fluid{padding-left:15px;padding-right:15px}.pre-scrollable{max-height:340px;overflow-y:scroll}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-left:-15px;margin-right:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-1{width:8.33333333%}.col-xs-2{width:16.66666667%}.col-xs-3{width:25%}.col-xs-4{width:33.33333333%}.col-xs-5{width:41.66666667%}.col-xs-6{width:50%}.col-xs-7{width:58.33333333%}.col-xs-8{width:66.66666667%}.col-xs-9{width:75%}.col-xs-10{width:83.33333333%}.col-xs-11{width:91.66666667%}.col-xs-12{width:100%}.col-xs-pull-0{right:auto}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-3{right:25%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-6{right:50%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-9{right:75%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-12{right:100%}.col-xs-push-0{left:auto}.col-xs-push-1{left:8.33333333%}.col-xs-push-2{left:16.66666667%}.col-xs-push-3{left:25%}.col-xs-push-4{left:33.33333333%}.col-xs-push-5{left:41.66666667%}.col-xs-push-6{left:50%}.col-xs-push-7{left:58.33333333%}.col-xs-push-8{left:66.66666667%}.col-xs-push-9{left:75%}.col-xs-push-10{left:83.33333333%}.col-xs-push-11{left:91.66666667%}.col-xs-push-12{left:100%}.col-xs-offset-0{margin-left:0}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-12{margin-left:100%}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-1{width:8.33333333%}.col-sm-2{width:16.66666667%}.col-sm-3{width:25%}.col-sm-4{width:33.33333333%}.col-sm-5{width:41.66666667%}.col-sm-6{width:50%}.col-sm-7{width:58.33333333%}.col-sm-8{width:66.66666667%}.col-sm-9{width:75%}.col-sm-10{width:83.33333333%}.col-sm-11{width:91.66666667%}.col-sm-12{width:100%}.col-sm-pull-0{right:auto}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-12{right:100%}.col-sm-push-0{left:auto}.col-sm-push-1{left:8.33333333%}.col-sm-push-2{left:16.66666667%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333333%}.col-sm-push-5{left:41.66666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.33333333%}.col-sm-push-8{left:66.66666667%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333333%}.col-sm-push-11{left:91.66666667%}.col-sm-push-12{left:100%}.col-sm-offset-0{margin-left:0}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-12{margin-left:100%}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-1{width:8.33333333%}.col-md-2{width:16.66666667%}.col-md-3{width:25%}.col-md-4{width:33.33333333%}.col-md-5{width:41.66666667%}.col-md-6{width:50%}.col-md-7{width:58.33333333%}.col-md-8{width:66.66666667%}.col-md-9{width:75%}.col-md-10{width:83.33333333%}.col-md-11{width:91.66666667%}.col-md-12{width:100%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.33333333%}.col-md-pull-2{right:16.66666667%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333333%}.col-md-pull-5{right:41.66666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.33333333%}.col-md-pull-8{right:66.66666667%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333333%}.col-md-pull-11{right:91.66666667%}.col-md-pull-12{right:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.33333333%}.col-md-push-2{left:16.66666667%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333333%}.col-md-push-5{left:41.66666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.33333333%}.col-md-push-8{left:66.66666667%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333333%}.col-md-push-11{left:91.66666667%}.col-md-push-12{left:100%}.col-md-offset-0{margin-left:0}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-12{margin-left:100%}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-1{width:8.33333333%}.col-lg-2{width:16.66666667%}.col-lg-3{width:25%}.col-lg-4{width:33.33333333%}.col-lg-5{width:41.66666667%}.col-lg-6{width:50%}.col-lg-7{width:58.33333333%}.col-lg-8{width:66.66666667%}.col-lg-9{width:75%}.col-lg-10{width:83.33333333%}.col-lg-11{width:91.66666667%}.col-lg-12{width:100%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-12{right:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.33333333%}.col-lg-push-2{left:16.66666667%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333333%}.col-lg-push-5{left:41.66666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.33333333%}.col-lg-push-8{left:66.66666667%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333333%}.col-lg-push-11{left:91.66666667%}.col-lg-push-12{left:100%}.col-lg-offset-0{margin-left:0}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-12{margin-left:100%}}table{border-collapse:collapse;border-spacing:0;background-color:#fafafa}.btn-group-justified,.input-group,.t3-grid-table{border-collapse:separate}caption{padding-top:6px;padding-bottom:6px;color:#737373}.table{width:100%}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:6px;line-height:1.5;border-top:1px solid #ccc}.table>thead>tr>th{border-bottom:2px solid #ccc}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ccc}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:6px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ccc}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f7f7f7}.table-hover>tbody>tr:hover,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#ededed}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.btn-group>.btn-group,.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group,.dropdown-menu{float:left}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e1e0e0}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#d1e2bd}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#c4dbab}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#ebf3fb}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#d6e7f6}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fbefdd}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#f8e4c6}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#efc7c7}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#eab3b3}.table-responsive{overflow-x:auto;min-height:.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:13.5px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ccc}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}.carousel-inner,.collapsing,.dropdown-menu .divider,.embed-responsive,.modal,.modal-open,.nav .nav-divider,.progress,html{overflow:hidden}fieldset,legend{padding:0;border:0}fieldset{margin:0;min-width:0}legend{display:block;width:100%;margin-bottom:18px;font-size:18px;line-height:inherit;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px}input[type=search]{box-sizing:border-box;-webkit-appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}.form-control,output{font-size:12px;line-height:1.5;color:#333;display:block}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=radio]:focus,input[type=file]:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}output{padding-top:7px}.form-control{width:100%;height:32px;padding:6px;background-color:#fefefe;border:1px solid #bbb;border-radius:2px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#aaa;outline:0;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(170,170,170,.6)}.form-control::-moz-placeholder{color:#d7d7d7;opacity:1}.form-control:-ms-input-placeholder{color:#d7d7d7}.form-control::-webkit-input-placeholder{color:#d7d7d7}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#79a548}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#f5f5f5;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:32px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm>.input-group-btn>input[type=date].btn,.input-group-sm>.input-group-btn>input[type=time].btn,.input-group-sm>.input-group-btn>input[type=datetime-local].btn,.input-group-sm>.input-group-btn>input[type=month].btn,.input-group-sm>input[type=date].form-control,.input-group-sm>input[type=date].input-group-addon,.input-group-sm>input[type=time].form-control,.input-group-sm>input[type=time].input-group-addon,.input-group-sm>input[type=datetime-local].form-control,.input-group-sm>input[type=datetime-local].input-group-addon,.input-group-sm>input[type=month].form-control,.input-group-sm>input[type=month].input-group-addon,input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:26px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg>.input-group-btn>input[type=date].btn,.input-group-lg>.input-group-btn>input[type=time].btn,.input-group-lg>.input-group-btn>input[type=datetime-local].btn,.input-group-lg>.input-group-btn>input[type=month].btn,.input-group-lg>input[type=date].form-control,.input-group-lg>input[type=date].input-group-addon,.input-group-lg>input[type=time].form-control,.input-group-lg>input[type=time].input-group-addon,.input-group-lg>input[type=datetime-local].form-control,.input-group-lg>input[type=datetime-local].input-group-addon,.input-group-lg>input[type=month].form-control,.input-group-lg>input[type=month].input-group-addon,input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:41.2px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:18px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px;margin-top:4px\9}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:30px}.form-control-static.input-lg,.form-control-static.input-sm,.input-group-lg>.form-control-static.form-control,.input-group-lg>.form-control-static.input-group-addon,.input-group-lg>.input-group-btn>.form-control-static.btn,.input-group-sm>.form-control-static.form-control,.input-group-sm>.form-control-static.input-group-addon,.input-group-sm>.input-group-btn>.form-control-static.btn{padding-left:0;padding-right:0}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn,.input-sm{height:26px;padding:4px;font-size:11px;line-height:1.5;border-radius:2px}.input-group-sm>.input-group-btn>select.btn,.input-group-sm>select.form-control,.input-group-sm>select.input-group-addon,select.input-sm{height:26px;line-height:26px}.input-group-sm>.input-group-btn>select[multiple].btn,.input-group-sm>.input-group-btn>textarea.btn,.input-group-sm>select[multiple].form-control,.input-group-sm>select[multiple].input-group-addon,.input-group-sm>textarea.form-control,.input-group-sm>textarea.input-group-addon,select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:26px;padding:4px;font-size:11px;line-height:1.5;border-radius:2px}.form-group-sm select.form-control{height:26px;line-height:26px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:26px;min-height:29px;padding:5px 4px;font-size:11px;line-height:1.5}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn,.input-lg{height:41.2px;padding:12px;font-size:15px;line-height:1.3333333;border-radius:2px}.input-group-lg>.input-group-btn>select.btn,.input-group-lg>select.form-control,.input-group-lg>select.input-group-addon,select.input-lg{height:41.2px;line-height:41.2px}.input-group-lg>.input-group-btn>select[multiple].btn,.input-group-lg>.input-group-btn>textarea.btn,.input-group-lg>select[multiple].form-control,.input-group-lg>select[multiple].input-group-addon,.input-group-lg>textarea.form-control,.input-group-lg>textarea.input-group-addon,select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:41.2px;padding:12px;font-size:15px;line-height:1.3333333;border-radius:2px}.form-group-lg select.form-control{height:41.2px;line-height:41.2px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:41.2px;min-height:33px;padding:13px 12px;font-size:15px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:40px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:32px;height:32px;line-height:32px;text-align:center}.collapsing,.dropdown,.dropup{position:relative}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-group-lg>.form-control+.form-control-feedback,.input-group-lg>.input-group-addon+.form-control-feedback,.input-group-lg>.input-group-btn>.btn+.form-control-feedback,.input-lg+.form-control-feedback{width:41.2px;height:41.2px;line-height:41.2px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-group-sm>.form-control+.form-control-feedback,.input-group-sm>.input-group-addon+.form-control-feedback,.input-group-sm>.input-group-btn>.btn+.form-control-feedback,.input-sm+.form-control-feedback{width:26px;height:26px;line-height:26px}.has-success .form-control{border-color:#79a548;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#5f8139;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #abcb88}.has-success .input-group-addon{color:#79a548;border-color:#79a548;background-color:#d1e2bd}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#e8a33d}.has-warning .form-control{border-color:#e8a33d;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#d88b1a;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #f3ce98}.has-warning .input-group-addon{color:#e8a33d;border-color:#e8a33d;background-color:#fbefdd}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#c83c3c}.has-error .form-control{border-color:#c83c3c;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#a32e2e;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #de8c8c}.has-error .input-group-addon{color:#c83c3c;border-color:#c83c3c;background-color:#efc7c7}.has-feedback label~.form-control-feedback{top:23px}.bootstrap-datetimepicker-widget .has-feedback label.btn[data-action=incrementHours]::after~.form-control-feedback,.bootstrap-datetimepicker-widget .has-feedback label.btn[data-action=incrementMinutes]::after~.form-control-feedback,.bootstrap-datetimepicker-widget .has-feedback label.btn[data-action=decrementHours]::after~.form-control-feedback,.bootstrap-datetimepicker-widget .has-feedback label.btn[data-action=decrementMinutes]::after~.form-control-feedback,.bootstrap-datetimepicker-widget .has-feedback label.btn[data-action=showHours]::after~.form-control-feedback,.bootstrap-datetimepicker-widget .has-feedback label.btn[data-action=showMinutes]::after~.form-control-feedback,.bootstrap-datetimepicker-widget .has-feedback label.btn[data-action=togglePeriod]::after~.form-control-feedback,.bootstrap-datetimepicker-widget .has-feedback label.btn[data-action=clear]::after~.form-control-feedback,.bootstrap-datetimepicker-widget .has-feedback label.btn[data-action=today]::after~.form-control-feedback,.bootstrap-datetimepicker-widget .has-feedback label.picker-switch::after~.form-control-feedback,.has-feedback .bootstrap-datetimepicker-widget label.btn[data-action=incrementHours]::after~.form-control-feedback,.has-feedback .bootstrap-datetimepicker-widget label.btn[data-action=incrementMinutes]::after~.form-control-feedback,.has-feedback .bootstrap-datetimepicker-widget label.btn[data-action=decrementHours]::after~.form-control-feedback,.has-feedback .bootstrap-datetimepicker-widget label.btn[data-action=decrementMinutes]::after~.form-control-feedback,.has-feedback .bootstrap-datetimepicker-widget label.btn[data-action=showHours]::after~.form-control-feedback,.has-feedback .bootstrap-datetimepicker-widget label.btn[data-action=showMinutes]::after~.form-control-feedback,.has-feedback .bootstrap-datetimepicker-widget label.btn[data-action=togglePeriod]::after~.form-control-feedback,.has-feedback .bootstrap-datetimepicker-widget label.btn[data-action=clear]::after~.form-control-feedback,.has-feedback .bootstrap-datetimepicker-widget label.btn[data-action=today]::after~.form-control-feedback,.has-feedback .bootstrap-datetimepicker-widget label.picker-switch::after~.form-control-feedback,.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#404040}@media (min-width:768px){.form-inline .form-control-static,.form-inline .form-group{display:inline-block}.form-inline .control-label,.form-inline .form-group{margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.btn-block,input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:25px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-group:after{content:"";display:table;clear:both}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:13px;font-size:15px}.form-horizontal .form-group-sm .control-label{padding-top:5px;font-size:11px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;touch-action:manipulation;cursor:pointer;border:1px solid transparent;white-space:nowrap;padding:6px;font-size:12px;line-height:1.5;border-radius:2px;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);box-shadow:none}.btn-default{color:#333;background-color:#eee;border-color:#bbb}.btn-default.focus,.btn-default:focus{color:#333;background-color:#d5d4d4;border-color:#7b7b7b}.btn-default.active,.btn-default:active,.btn-default:hover,.open>.btn-default.dropdown-toggle{color:#333;background-color:#d5d4d4;border-color:#9c9c9c}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.btn-default.dropdown-toggle.focus,.open>.btn-default.dropdown-toggle:focus,.open>.btn-default.dropdown-toggle:hover{color:#333;background-color:#c3c3c3;border-color:#7b7b7b}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#eee;border-color:#bbb}.btn-default .badge{color:#eee;background-color:#333}.btn-primary{color:#fff;background-color:#0078e6;border-color:#006bcd}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#005db3;border-color:#00284d}.btn-primary.active,.btn-primary:active,.btn-primary:hover,.open>.btn-primary.dropdown-toggle{color:#fff;background-color:#005db3;border-color:#004b8f}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.btn-primary.dropdown-toggle.focus,.open>.btn-primary.dropdown-toggle:focus,.open>.btn-primary.dropdown-toggle:hover{color:#fff;background-color:#004b8f;border-color:#00284d}.btn-primary.active,.btn-primary:active,.open>.btn-primary.dropdown-toggle{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#0078e6;border-color:#006bcd}.btn-primary .badge{color:#0078e6;background-color:#fff}.btn-success{color:#fff;background-color:#79a548;border-color:#6c9340}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#5f8139;border-color:#2b3a1a}.btn-success.active,.btn-success:active,.btn-success:hover,.open>.btn-success.dropdown-toggle{color:#fff;background-color:#5f8139;border-color:#4d692e}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.btn-success.dropdown-toggle.focus,.open>.btn-success.dropdown-toggle:focus,.open>.btn-success.dropdown-toggle:hover{color:#fff;background-color:#4d692e;border-color:#2b3a1a}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#79a548;border-color:#6c9340}.btn-success .badge{color:#79a548;background-color:#fff}.btn-info{color:#fff;background-color:#6daae0;border-color:#589edc}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#4392d7;border-color:#205e94}.btn-info.active,.btn-info:active,.btn-info:hover,.open>.btn-info.dropdown-toggle{color:#fff;background-color:#4392d7;border-color:#2b80cb}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.btn-info.dropdown-toggle.focus,.open>.btn-info.dropdown-toggle:focus,.open>.btn-info.dropdown-toggle:hover{color:#fff;background-color:#2b80cb;border-color:#205e94}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#6daae0;border-color:#589edc}.btn-info .badge{color:#6daae0;background-color:#fff}.btn-warning{color:#fff;background-color:#e8a33d;border-color:#e59826}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#d88b1a;border-color:#7d510f}.btn-warning.active,.btn-warning:active,.btn-warning:hover,.open>.btn-warning.dropdown-toggle{color:#fff;background-color:#d88b1a;border-color:#b87716}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.btn-warning.dropdown-toggle.focus,.open>.btn-warning.dropdown-toggle:focus,.open>.btn-warning.dropdown-toggle:hover{color:#fff;background-color:#b87716;border-color:#7d510f}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#e8a33d;border-color:#e59826}.btn-warning .badge{color:#e8a33d;background-color:#fff}.btn-danger{color:#fff;background-color:#c83c3c;border-color:#b73434}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#a32e2e;border-color:#531818}.btn-danger.active,.btn-danger:active,.btn-danger:hover,.open>.btn-danger.dropdown-toggle{color:#fff;background-color:#a32e2e;border-color:#872626}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.btn-danger.dropdown-toggle.focus,.open>.btn-danger.dropdown-toggle:focus,.open>.btn-danger.dropdown-toggle:hover{color:#fff;background-color:#872626;border-color:#531818}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c83c3c;border-color:#b73434}.btn-danger .badge{color:#c83c3c;background-color:#fff}.btn-link{color:#212424;font-weight:400;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#000;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#d7d7d7;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:12px;font-size:15px;line-height:1.3333333;border-radius:2px}.btn-group-sm>.btn,.btn-sm{padding:4px;font-size:11px;line-height:1.5;border-radius:2px}.btn-group-xs>.btn,.btn-xs{padding:2px 4px;font-size:11px;line-height:1.5;border-radius:2px}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle,.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child,.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-block{display:block}.btn-block+.btn-block{margin-top:5px}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{height:0;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;min-width:160px;padding:5px 0;list-style:none;font-size:12px;text-align:left;background-color:#292929;box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu-right,.dropdown-menu.pull-right{left:auto;right:0}.dropdown-header,.dropdown-menu>li>a{display:block;padding:3px 20px;line-height:1.5;white-space:nowrap}.dropdown-menu .divider{height:1px;margin:8px 0;background-color:#424242}.dropdown-menu>li>a{clear:both;font-weight:400;color:#fff}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{text-decoration:none;color:#fff;background-color:#424242}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#424242}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#d7d7d7}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.progress-bar-striped,.progress-striped .progress-bar,.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{font-size:11px;color:#d7d7d7}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar:after{content:"";display:table;clear:both}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn .caret,.btn-group>.btn:first-child{margin-left:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group-lg.btn-group>.btn+.dropdown-toggle,.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{box-shadow:none}.btn-group-lg>.btn .caret,.btn-lg .caret{border-width:5px 5px 0}.dropup .btn-group-lg>.btn .caret,.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:after{content:"";display:table;clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-radius:2px 2px 0 0}.btn-group-vertical>.btn:last-child:not(:first-child){border-radius:0 0 2px 2px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn,.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group,.input-group-btn,.input-group-btn>.btn{position:relative}.input-group{display:table}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px;font-size:12px;font-weight:400;line-height:1;color:#333;text-align:center;background-color:#f5f5f5;border:1px solid #bbb;border-radius:2px}.input-group-addon.input-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:4px;font-size:11px;border-radius:2px}.input-group-addon.input-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:12px;font-size:15px;border-radius:2px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{font-size:0;white-space:nowrap}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav:after{content:"";display:table;clear:both}.nav>li,.nav>li>a{position:relative;display:block}.nav>li>a{padding:6px 12px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#f5f5f5}.nav>li.disabled>a{color:#d7d7d7}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#5a5a5a;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#f5f5f5;border-color:#212424}.nav .nav-divider{height:1px;margin:8px 0;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ccc}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{line-height:1.5;border:1px solid transparent;border-radius:2px 2px 0 0}.nav-tabs>li>a:hover{border-color:#d7d7d7 #d7d7d7 #ccc}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#000;cursor:default}.nav-pills>li{float:left}.nav-justified>li,.nav-stacked>li,.nav-tabs.nav-justified>li{float:none}.nav-pills>li>a{border-radius:2px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#0078e6}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified,.nav-tabs.nav-justified{width:100%}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}.btn .badge,.btn .label{top:-1px;position:relative}.nav-tabs-justified,.nav-tabs.nav-justified{border-bottom:0}.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:2px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ccc}@media (min-width:768px){.nav-justified>li,.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{margin-bottom:0}.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ccc;border-radius:2px 2px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#ccc}}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.pagination{display:inline-block;padding-left:0;margin:18px 0;border-radius:2px}.label,.pagination>li{display:inline}.alert,.thumbnail{margin-bottom:18px}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px;line-height:1.5;text-decoration:none;color:#212424;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span,.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span,.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span,.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:2px;border-top-right-radius:2px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#000;background-color:#f5f5f5;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;background-color:#0078e6;border-color:#0078e6;cursor:default}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#d7d7d7;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:12px;font-size:15px;line-height:1.3333333}.pagination-sm>li>a,.pagination-sm>li>span{padding:4px;font-size:11px;line-height:1.5}.badge,.label{color:#fff;line-height:1;white-space:nowrap;font-weight:700}.label{padding:.2em .6em .3em;font-size:75%;text-align:center;vertical-align:baseline;border-radius:.25em}.badge,.progress-bar{font-size:11px;text-align:center}.label:empty{display:none}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label-default,.label-excludeFromUpdates,.label-obsolete,.label-test{background-color:#d7d7d7}.label-default[href]:focus,.label-default[href]:hover,[href].label-excludeFromUpdates:focus,[href].label-excludeFromUpdates:hover,[href].label-obsolete:focus,[href].label-obsolete:hover,[href].label-test:focus,[href].label-test:hover{background-color:#bebdbd}.label-primary{background-color:#0078e6}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#005db3}.label-stable,.label-success{background-color:#79a548}.label-success[href]:focus,.label-success[href]:hover,[href].label-stable:focus,[href].label-stable:hover{background-color:#5f8139}.label-experimental,.label-info{background-color:#6daae0}.label-info[href]:focus,.label-info[href]:hover,[href].label-experimental:focus,[href].label-experimental:hover{background-color:#4392d7}.label-beta,.label-warning{background-color:#e8a33d}.label-warning[href]:focus,.label-warning[href]:hover,[href].label-beta:focus,[href].label-beta:hover{background-color:#d88b1a}.label-alpha,.label-danger,.label-deprecated{background-color:#c83c3c}.label-danger[href]:focus,.label-danger[href]:hover,[href].label-alpha:focus,[href].label-alpha:hover,[href].label-deprecated:focus,[href].label-deprecated:hover{background-color:#a32e2e}.badge{display:inline-block;min-width:10px;padding:3px 7px;vertical-align:middle;background-color:#737373;border-radius:10px}.badge:empty{display:none}.media-object,.thumbnail{display:block}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#212424;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.thumbnail{padding:4px;line-height:1.5;background-color:#fff;border:1px solid #ddd;border-radius:2px;-webkit-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.alert,.progress{border-radius:2px}.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}.thumbnail .caption{padding:9px;color:#000}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#212424}.alert-danger,.alert-info,.alert-success,.alert-warning{border-color:transparent}.alert-danger hr,.alert-info hr,.alert-success hr,.alert-warning hr{border-top-color:transparent}.alert{padding:11px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:31px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.modal,.modal-backdrop{top:0;right:0;bottom:0;left:0}.alert-success{background-color:#79a548;color:#fff}.alert-success .alert-link{color:#e6e5e5}.alert-info{background-color:#6daae0;color:#fff}.alert-info .alert-link{color:#e6e5e5}.alert-warning{background-color:#e8a33d;color:#fff}.alert-warning .alert-link{color:#e6e5e5}.alert-danger{background-color:#c83c3c;color:#fff}.alert-danger .alert-link{color:#e6e5e5}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:18px;margin-bottom:18px;background-color:#dedede;box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;line-height:18px;color:#fff;background-color:#0078e6;box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#79a548}.progress-striped .progress-bar-success{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-striped .progress-bar-info,.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#6daae0}.progress-striped .progress-bar-info{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#e8a33d}.progress-striped .progress-bar-warning{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#c83c3c}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media-heading,.media:first-child,.panel-title{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:2px;border-top-left-radius:2px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{text-decoration:none;color:#555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{background-color:#f5f5f5;color:#d7d7d7;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#d7d7d7}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#0078e6;border-color:#0078e6}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#b3dbff}.list-group-item-success{color:#79a548;background-color:#d1e2bd}a.list-group-item-success,button.list-group-item-success{color:#79a548}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#79a548;background-color:#c4dbab}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#79a548;border-color:#79a548}.list-group-item-info{color:#6daae0;background-color:#ebf3fb}a.list-group-item-info,button.list-group-item-info{color:#6daae0}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#6daae0;background-color:#d6e7f6}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#6daae0;border-color:#6daae0}.list-group-item-warning{color:#e8a33d;background-color:#fbefdd}a.list-group-item-warning,button.list-group-item-warning{color:#e8a33d}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#e8a33d;background-color:#f8e4c6}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#e8a33d;border-color:#e8a33d}.list-group-item-danger{color:#c83c3c;background-color:#efc7c7}a.list-group-item-danger,button.list-group-item-danger{color:#c83c3c}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#c83c3c;background-color:#eab3b3}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#c83c3c;border-color:#c83c3c}.panel-heading>.dropdown .dropdown-toggle,.panel-title,.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:18px;background-color:#fff;border:1px solid transparent;border-radius:2px}.panel-title,.panel>.list-group,.panel>.panel-collapse>.list-group,.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel-body{padding:15px}.panel-body:after{content:"";display:table;clear:both}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:1px;border-top-left-radius:1px}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel-group .panel-heading,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-responsive:last-child>.table:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:1px;border-bottom-right-radius:1px}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:1px;border-top-left-radius:1px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.table-responsive:first-child>.table:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-right-radius:1px;border-top-left-radius:1px}.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-left:15px;padding-right:15px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:1px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:1px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ccc}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:18px}.panel-group .panel{margin-bottom:0;border-radius:2px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ccc}.panel-default>.panel-heading{color:#5a5a5a;background-color:#ddd;border-color:#ccc}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ccc}.panel-default>.panel-heading .badge{color:#ddd;background-color:#5a5a5a}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ccc}.panel-primary{border-color:#0078e6}.panel-primary>.panel-heading{color:#fff;background-color:#0078e6;border-color:#0078e6}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#0078e6}.panel-primary>.panel-heading .badge{color:#0078e6;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#0078e6}.panel-success{border-color:#79a548}.panel-success>.panel-heading{color:#79a548;background-color:#d1e2bd;border-color:#79a548}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#79a548}.panel-success>.panel-heading .badge{color:#d1e2bd;background-color:#79a548}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#79a548}.panel-info{border-color:#6daae0}.panel-info>.panel-heading{color:#6daae0;background-color:#ebf3fb;border-color:#6daae0}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#6daae0}.panel-info>.panel-heading .badge{color:#ebf3fb;background-color:#6daae0}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#6daae0}.panel-warning{border-color:#e8a33d}.panel-warning>.panel-heading{color:#e8a33d;background-color:#fbefdd;border-color:#e8a33d}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e8a33d}.panel-warning>.panel-heading .badge{color:#fbefdd;background-color:#e8a33d}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e8a33d}.panel-danger{border-color:#c83c3c}.panel-danger>.panel-heading{color:#c83c3c;background-color:#efc7c7;border-color:#c83c3c}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#c83c3c}.panel-danger>.panel-heading .badge{color:#efc7c7;background-color:#c83c3c}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#c83c3c}.embed-responsive{position:relative;display:block;height:0;padding:0}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#fafafa;border:1px solid #ccc;border-radius:2px;box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well-lg,.well-sm{border-radius:2px}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px}.well-sm{padding:9px}.close{float:right;font-size:18px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.popover,.tooltip{font-family:Verdana,Arial,Helvetica,sans-serif;letter-spacing:normal;line-break:auto;line-height:1.5;text-shadow:none;text-transform:none;white-space:normal;word-spacing:normal;word-wrap:normal;font-weight:400;text-decoration:none}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-content,.popover{background-clip:padding-box}.modal{display:none;position:fixed;z-index:5000;-webkit-overflow-scrolling:touch;outline:0}.modal-footer:after,.modal-header:after{display:table;clear:both;content:""}.modal-content,.modal-dialog{position:relative}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-content{background-color:#fff;border-radius:2px;box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}.modal-backdrop{position:fixed;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.5}.modal-body{position:relative;padding:15px}.modal-footer{text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;font-style:normal;text-align:left;text-align:start;word-break:normal;font-size:12px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:2px;box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover>.arrow,.popover>.arrow:after,.tooltip-arrow{position:absolute;width:0;height:0;border-style:solid}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;background-color:#f7f7f7;border-radius:1px 1px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{display:block;border-color:transparent}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.left>.arrow:after,.popover.right>.arrow:after{content:" ";bottom:-10px}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{left:1px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;border-right-width:0;border-left-color:#fff}.tooltip{position:absolute;z-index:1070;display:block;font-style:normal;text-align:left;text-align:start;word-break:normal;font-size:11px;opacity:0;filter:alpha(opacity=0)}.carousel-caption,.carousel-control{color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.diff-item-result,.table-fixed{word-break:break-all;word-wrap:break-word}.tooltip.in{opacity:1;filter:alpha(opacity=100)}.tooltip.top{margin-top:-3px;padding:3px 0}.tooltip.right{margin-left:3px;padding:0 3px}.tooltip.bottom{margin-top:3px;padding:3px 0}.tooltip.left{margin-left:-3px;padding:0 3px}.tooltip-inner{max-width:200px;color:#fff;text-align:center;background-color:#333;border-radius:2px}.carousel-control,.text-hide{background-color:transparent}.tooltip-arrow{border-color:transparent}.carousel,.carousel-inner{position:relative}.tooltip.top .tooltip-arrow,.tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow{border-width:3px 3px 0;border-top-color:#333;bottom:0}.tooltip.top .tooltip-arrow{left:50%;margin-left:-3px}.tooltip.top-left .tooltip-arrow{right:3px;margin-bottom:-3px}.tooltip.top-right .tooltip-arrow{left:3px;margin-bottom:-3px}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-3px;border-width:3px 3px 3px 0;border-right-color:#333}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-3px;border-width:3px 0 3px 3px;border-left-color:#333}.tooltip.bottom .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow{border-width:0 3px 3px;border-bottom-color:#333;top:0}.tooltip.bottom .tooltip-arrow{left:50%;margin-left:-3px}.tooltip.bottom-left .tooltip-arrow{right:3px;margin-top:-3px}.tooltip.bottom-right .tooltip-arrow{left:3px;margin-top:-3px}.carousel-inner{width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{display:block;max-width:100%;height:auto;line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:focus,.carousel-control:hover{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000\9;background-color:transparent}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px}.carousel-caption .btn,.text-hide{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}body,html{height:100%}body{overflow:auto}.scaffold{background-color:#f5f5f5;color:#333;position:relative;padding-top:45px;height:100vh}.scaffold-topbar{background-color:#151515;color:#f5f5f5;height:45px;position:fixed;top:0;right:0;left:0}.scaffold-modulemenu,.scaffold-toolbar{background-color:#292929;z-index:1000;position:fixed;top:45px;left:0;bottom:0}.scaffold-modulemenu{color:#f5f5f5;width:40px;max-width:100%;overflow:hidden}.scaffold-modulemenu a{color:rgba(245,245,245,.7)}.scaffold-modulemenu .active>a,.scaffold-modulemenu a:hover{color:#f5f5f5}.scaffold-toolbar{overflow:auto;color:#f5f5f5;right:0;display:none}.scaffold-toolbar .dropdown-menu a,.scaffold-toolbar a{color:rgba(245,245,245,.7)}.scaffold-toolbar .active>a,.scaffold-toolbar .dropdown-menu a:focus,.scaffold-toolbar .dropdown-menu a:hover,.scaffold-toolbar a:focus,.scaffold-toolbar a:hover{color:#f5f5f5}@media (min-width:992px){.scaffold-toolbar{overflow:visible;background-color:transparent;height:45px;top:0;left:auto;bottom:auto;display:block}}.scaffold-content{position:fixed!important;top:45px;left:0;right:0;bottom:0}@media (max-width:991px){.scaffold-search-expanded .scaffold-toolbar,.scaffold-toolbar-expanded .scaffold-toolbar{display:block}.scaffold-content{left:0!important}}.scaffold-content-module-iframe,.scaffold-content-navigation-iframe{display:block;border:none;height:100%;width:100%}.scaffold-content-navigation{display:none;position:absolute!important;left:0;top:0;bottom:0;width:300px}.scaffold-content-navigation-component{position:absolute;top:0;bottom:0;left:0;right:0}.scaffold-content-navigation-component #typo3-pagetree-treeContainer>div>.x-panel-body{overflow:auto}.scaffold-content-module{position:absolute!important;top:0;left:0;bottom:0;right:0}@media (max-width:767px){.scaffold-content-module{width:100%}}.scaffold-content-overlay{display:none;position:absolute;z-index:1040;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.65)}.scaffold-modulemenu-expanded .scaffold-content-overlay{display:block}@media (min-width:992px){.scaffold-modulemenu-expanded .scaffold-content-overlay{display:none}.scaffold{padding-left:40px}}.scaffold .scaffold-modulemenu{width:40px}@media (max-width:991px){.scaffold .scaffold-modulemenu{display:none}.scaffold-modulemenu-expanded .scaffold-modulemenu{display:block}}.scaffold-modulemenu-expanded{display:block;padding-left:230px}.scaffold-modulemenu-expanded .scaffold-modulemenu{width:230px}.scaffold-modulemenu-expanded .scaffold-content{-webkit-transform:translate(230px,0);transform:translate(230px,0)}.scaffold-content-navigation-expanded .scaffold-content-navigation{display:block}.scaffold-content-navigation-expanded .scaffold-content-module{left:300px}@media (min-width:992px){.scaffold .scaffold-content{left:40px}.scaffold-modulemenu-expanded .scaffold-content{left:230px;-webkit-transform:none;transform:none}}.topbar{background-color:inherit;position:relative;height:45px}.topbar a{color:inherit;text-decoration:none}.topbar-button{position:absolute;top:0;display:inline-block;border:0;background-color:#151515;height:45px;width:40px}.topbar-button:focus,.topbar-button:hover{background-color:#1d1d1d}.scaffold-content-navigation-expanded .topbar-button-navigationcomponent,.scaffold-modulemenu-expanded .topbar-button.topbar-button-modulemenu,.scaffold-search-expanded .topbar-button-search,.scaffold-toolbar-expanded .topbar-button-toolbar{background-color:#292929}.topbar-button[disabled],.topbar-button[disabled]:focus,.topbar-button[disabled]:hover{background-color:#292929;cursor:not-allowed;opacity:.5}.topbar-button.topbar-button-modulemenu{left:0}.topbar-button.topbar-button-navigationcomponent{left:40px}.topbar-button.topbar-button-toolbar{right:40px}.topbar-button.topbar-button-search{right:0}@media (max-width:991px){.scaffold-search-expanded .toolbar-item,.scaffold-toolbar-expanded .toolbar-item-search{display:none}.scaffold-search-expanded .toolbar-item-search{display:block;width:100%}.topbar-header{padding-right:80px!important}}.topbar-button-search,.topbar-button-toolbar{display:block}@media (min-width:992px){.topbar-button.topbar-button-modulemenu{background-color:#292929}.topbar-button-search,.topbar-button-toolbar{display:none}}.topbar-header{padding-left:80px}.topbar-header-site{overflow:hidden;position:relative;max-width:100%;height:45px;line-height:45px;padding-left:1em;padding-right:1em;white-space:nowrap}.topbar-header-site:after,.topbar-header-site:before{display:block;content:'';position:absolute;top:0;bottom:0;width:1em}.topbar-header-site:before{right:0;background:#151515}.topbar-header-site:after{right:1em;background:-webkit-linear-gradient(left,rgba(21,21,21,0) 0,#151515 100%);background:linear-gradient(to right,rgba(21,21,21,0) 0,#151515 100%)}.typo3-in-workspace .topbar-header-site{background-color:#6d860d}.typo3-in-workspace .topbar-header-site:before{background:#6d860d}.typo3-in-workspace .topbar-header-site:after{background:-webkit-linear-gradient(left,rgba(109,134,13,0) 0,#6d860d 100%);background:linear-gradient(to right,rgba(109,134,13,0) 0,#6d860d 100%)}.topbar-header-site-logo{height:45px;display:none;padding-right:.5em}@media (min-width:320px){.topbar-header-site-logo{display:inline-block}}.topbar-header-site-title{line-height:1.2em;display:inline-block;vertical-align:middle}.topbar-header-site-name{display:block}.toolbar-list:after,.toolbar:after{display:table;content:'';clear:both}.topbar-header-site-version{opacity:.5}.toolbar{padding:8px}.toolbar-list{list-style:none;padding:0;margin:0}@media (min-width:992px){.toolbar{padding:0;background-color:#151515}.toolbar-list li:last-child{width:300px}}.toolbar-item{padding:4px;position:relative;display:block;float:left;width:100%}@media (min-width:600px){.toolbar-item{width:50%}}@media (min-width:750px){.toolbar-item{width:33.33%}}@media (min-width:992px){.toolbar-item{padding:0;width:auto;margin-left:1px}}.toolbar-item .dropdown-menu{width:350px}.toolbar-item .dropdown-menu .text-muted{color:#8c8c8c}.toolbar-item .dropdown-menu a:focus .text-muted,.toolbar-item .dropdown-menu a:hover .text-muted{color:#a6a6a6}@media (max-width:991px){.toolbar-item .dropdown-menu{overflow:auto;padding:15px;position:fixed;max-height:90%;max-width:90%;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.toolbar-item .dropdown-backdrop{background:rgba(0,0,0,.65)}}.toolbar-item-avatar{width:28px;margin-right:2px;display:inline-block}.toolbar-item-avatar .avatar{position:absolute;top:50%;left:10px;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.toolbar-item-avatar .avatar,.toolbar-item-avatar .avatar-image{height:28px;width:28px}.toolbar-item-badge{position:absolute;bottom:4px;right:4px;padding:3px 4px;border-radius:0;font-size:10px;font-weight:400;min-width:16px}.toolbar-item-link{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid rgba(0,0,0,.5);position:relative;display:block;text-decoration:none;padding:9px 10px;height:45px;line-height:27px}.toolbar-item-link:focus,.toolbar-item-link:hover{text-decoration:none}.open .toolbar-item-link{background-color:#292929}.toolbar-item-search form{padding:0;margin:0}.toolbar-item-search .toolbar-item-link{padding:0;margin:0;height:0}.toolbar-item-search .form-group{margin:0}.toolbar-item-search .close{color:#fff;text-shadow:none;opacity:1}@media (max-width:991px){.toolbar-item-search .dropdown-menu{top:114px;left:14px;right:14px;width:auto;max-width:none;max-height:none;-webkit-transform:none;transform:none;bottom:14px}}@media (min-width:992px){.toolbar-item-link{border:none}.toolbar-item-title{display:none}.toolbar-item-search .dropdown-menu{left:auto;right:0}}.toolbar-item-search .autocomplete-suggestions{position:static!important}.toolbar-item-search .autocomplete-suggestion{border:none}.toolbar-item-search.open .toolbar-item-search-form{position:relative;z-index:991}.toolbar-item-search-field{color:inherit;background-color:#2f2f2f;margin:0;border-radius:0;border:1px solid rgba(0,0,0,.5);height:45px;box-shadow:none}@media (min-width:992px){.toolbar-item-search-field{border:none}}.toolbar-item-search-field:hover{background-color:#333}.toolbar-item-search-field:focus{box-shadow:none;background-color:#555}.module-wrapper{position:relative}.module-wrapper iframe{border:none}.modulemenu .modulemenu-group-container{clear:both}.modulemenu .modulemenu-group{position:relative;padding:5px 0;border-bottom:1px solid rgba(0,0,0,.2)}.modulemenu .modulemenu-group-header,.modulemenu .modulemenu-item-link{position:relative;display:block;cursor:pointer;padding:2px 4px;text-decoration:none}.modulemenu .modulemenu-group-header{user-select:none;text-transform:uppercase}.cropper-container,.modal .close{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.modulemenu .modulemenu-item-link:focus,.modulemenu .modulemenu-item-link:hover{outline:0;background-color:rgba(0,0,0,.1)}.modulemenu .modulemenu-item.active .modulemenu-item-link{background-color:rgba(0,0,0,.15)}.modulemenu .modulemenu-icon{float:left;margin-right:4px}.modulemenu .modulemenu-icon .fa{font-size:.5em}.modulemenu .modulemenu-group-title,.modulemenu .modulemenu-item-title{white-space:nowrap;text-overflow:ellipsis;padding-top:7px;padding-left:4px;display:none;overflow:hidden}.modulemenu .modulemenu-group-title{padding-right:20px}.modulemenu .modulemenu-group-title .caret{-webkit-transform:rotate(90deg);transform:rotate(90deg);position:absolute;top:17px;right:18px}.modulemenu .expanded .modulemenu-group-title .caret{-webkit-transform:rotate(0);transform:rotate(0)}.scaffold-modulemenu-expanded .modulemenu-group-title,.scaffold-modulemenu-expanded .modulemenu-item-title{display:block}.autocomplete{position:relative}.autocomplete-results{z-index:1000;position:absolute;margin:5px 0;top:100%;left:0;border:1px solid #ddd;border-radius:2px;background-color:#fff;overflow:hidden;box-shadow:0 1px 0 0 rgba(0,0,0,.25)}.avatar,.dropdown-list>li{position:relative}.autocomplete-suggestion{border-top:1px solid #ddd}.autocomplete-suggestion:first-child{border-top:none}.autocomplete-suggestion-link{padding:5px 13px 5px 28px;display:block;text-decoration:none}.autocomplete-selected .autocomplete-suggestion-link,.autocomplete-suggestion-link:hover{background-color:#fafafa;text-decoration:none}.autocomplete-info{padding:5px 15px}.dropdown-menu{line-height:1.45em;border:0;margin:0;border-radius:0;color:#fff}.dropdown-menu a{color:inherit;display:block}.dropdown-menu a:focus,.dropdown-menu a:hover{color:inherit;text-decoration:none}.dropdown-menu hr{border-top:1px solid rgba(0,0,0,.35);margin:1.25em -15px}.dropdown-menu>:last-child{margin-bottom:0}.dropdown-menu .form-group{margin-bottom:.75em}.dropdown-menu .form-control{border-color:#aaa;color:inherit;border-radius:0;background-color:#333}.dropdown-menu .form-control:focus{box-shadow:none;border-color:#bbb}.dropdown-menu .btn{border:none;border-radius:0;padding:6px 10px}.dropdown-headline{font-size:1.15em;margin-top:0;margin-bottom:.5em}.dropdown-text a{display:inline-block}div.dropdown-menu{padding:1.5em}.dropdown-list{padding-left:0;list-style:none}.dropdown-list>li+li{margin-top:.5em}.dropdown-list-link{display:block;text-decoration:none}.dropdown-list-link:focus,.dropdown-list-link:hover{text-decoration:none}.dropdown-table{display:table;width:100%}.dropdown-table-row{display:table-row}.dropdown-table-column{display:table-cell;padding-top:.25em;padding-bottom:.25em;vertical-align:middle}.dropdown-table-column-top{vertical-align:top}.avatar,.callout .media-body{vertical-align:middle}.dropdown-table-icon{width:16px;padding-right:.5em}.avatar,.avatar-image{height:32px;width:32px}.dropdown-table-title{white-space:nowrap;padding-right:1.5em}.dropdown-table-title-ellipsis{max-width:230px;overflow:hidden;display:block;white-space:nowrap;text-overflow:ellipsis}.dropdown-table-actions{white-space:nowrap;text-align:right}.dropdown-table-actions-btn{text-align:center;display:inline-block!important;margin-top:-4px;margin-bottom:-4px;padding:4px;vertical-align:middle}.dropdown-table-actions-btn-close:hover,.dropdown-table-actions-btn-edit:hover{background-color:#333}.dropdown-table-actions-btn-delete:hover{background-color:#c83c3c}.avatar{display:inline-block}.avatar-image{display:block;overflow:hidden;border-radius:50%}.avatar-image:after{display:block;content:'';position:absolute;top:0;left:0;height:100%;width:100%;border-radius:50%;border:1px solid rgba(255,255,255,.1)}.avatar-image>img{display:block;width:100%!important;height:auto!important}.avatar-icon{position:absolute;bottom:0;right:0;height:16px;width:16px}.callout{background-color:#f0f0f0;border-left:3px solid #ccc;margin:20px 0;padding:20px;color:#333}.callout .media{margin:0}.callout .media .fa-stack{color:#fff}.callout .media .fa-stack>.fa:first-child{color:#ccc}.callout-icon{margin-top:-2px}.callout-title{font-size:1.3em;margin:0 0 .5em}.callout-body>:last-child{margin-bottom:0}.callout-sm{margin:10px 0;padding:10px}.callout-danger .media,.callout-info .media,.callout-notice .media,.callout-success .media,.callout-warning .media{margin:0}.callout-sm .callout-title{font-size:1em;margin:0}.callout-success{background-color:#d1e2bd;border-color:#79a548;color:#333}.callout-success .media .fa-stack{color:#fff}.callout-success .media .fa-stack>.fa:first-child{color:#79a548}.callout-info{background-color:#ebf3fb;border-color:#6daae0;color:#333}.callout-info .media .fa-stack{color:#fff}.callout-info .media .fa-stack>.fa:first-child{color:#6daae0}.callout-warning{background-color:#fbefdd;border-color:#e8a33d;color:#333}.callout-warning .media .fa-stack{color:#fff}.callout-warning .media .fa-stack>.fa:first-child{color:#e8a33d}.callout-danger{background-color:#efc7c7;border-color:#c83c3c;color:#333}.callout-danger .media .fa-stack{color:#fff}.callout-danger .media .fa-stack>.fa:first-child{color:#c83c3c}.callout-notice{background-color:#f9f9f9;border-color:#a0a0a0;color:#333}.callout-notice .media .fa-stack{color:#fff}.callout-notice .media .fa-stack>.fa:first-child{color:#a0a0a0}.icon{position:relative;display:inline-block;overflow:hidden;white-space:nowrap;vertical-align:-22%}.icon-markup,.icon-overlay{position:absolute;text-align:center;bottom:0;right:0}.icon img,.icon svg{display:block;height:100%;width:100%;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.icon *{display:block;line-height:inherit}.icon-markup{display:block;top:0;left:0}.icon-overlay{height:68.75%;width:68.75%}.module-docheader,.module-loading-indicator.nprogress-custom-parent{position:fixed;top:0}.icon-color{fill:currentColor}.icon-spin .icon-markup{-webkit-animation:icon-spin 2s infinite linear;animation:icon-spin 2s infinite linear}@-webkit-keyframes icon-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes icon-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.icon-state-disabled .icon-markup{opacity:.5}.icon-size-small{height:16px;width:16px;line-height:16px}.icon-size-small .icon-unify{line-height:16px;font-size:14px}.icon-size-small .icon-overlay .icon-unify{line-height:10px;font-size:9px}.icon-size-default{height:32px;width:32px;line-height:32px}.icon-size-default .icon-unify{line-height:32px;font-size:28px}.icon-size-default .icon-overlay .icon-unify{line-height:20px;font-size:18px}.icon-size-large{height:48px;width:48px;line-height:48px}.icon-size-large .icon-unify{line-height:48px;font-size:42px}.icon-size-large .icon-overlay .icon-unify{line-height:30px;font-size:26px}.icon-actions-edit-copy-release,.icon-actions-edit-cut-release,.icon-status-dialog-error,.icon-status-status-current,.icon-status-status-permission-denied{color:#c83c3c}.icon-status-status-sorting-light-asc,.icon-status-status-sorting-light-desc{color:#fff}.icon-status-status-sorting-asc,.icon-status-status-sorting-desc{color:#737373}.icon-status-dialog-information{color:#6daae0}.icon-status-dialog-ok,.icon-status-status-permission-granted{color:#79a548}.icon-status-dialog-notification{color:#333}.icon-status-dialog-warning{color:#e8a33d}.diff{background-color:#fff;border:1px solid #ccc;display:table}.diff-item{display:table-row}.diff-item+.diff-item{border-top:1px solid #ccc}.diff-item-result,.diff-item-title{padding:10px;display:table-cell}.diff-item-title{background-color:#fafafa;padding-right:10px;font-style:italic;white-space:nowrap}.diff-item-result{font-family:Menlo,Monaco,Consolas,"Courier New",monospace;width:100%;white-space:pre}.diff-item-result del{color:#c80c05;background-color:#fff6f6;text-decoration:none}.diff-item-result ins{color:#44a512;background-color:#ebfce3;text-decoration:none}.diff-item-result.diff-item-result-inline{white-space:normal}.module{min-height:100%;width:100%;background-color:#fff;color:inherit}.module-dark{background-color:#333;color:#ccc}.module-loading-indicator{min-height:5px;width:100%;z-index:999999}.module-docheader{width:100%;left:0;min-height:65px;z-index:300;background-color:#eee;border-bottom:1px solid #c3c3c3;padding:0 24px;-webkit-transition:margin-top .3s ease-in-out;transition:margin-top .3s ease-in-out}.module-docheader .module-docheader-bar{min-height:26px;margin:4px 0;line-height:26px}.module-docheader .module-docheader-bar.row{margin-left:-15px;margin-right:-15px}.module-docheader .module-docheader-bar label{margin-top:0;margin-bottom:0}.module-docheader .module-docheader-bar .form-inline .form-group{display:table}.module-docheader .module-docheader-bar .form-inline .form-group label{display:table-cell;font-size:11px;font-weight:400;line-height:16px;padding:4px;border-radius:2px 0 0 2px;border:1px solid #bbb;border-right:0;background-color:rgba(0,0,0,.05)}.module-docheader .module-docheader-bar .form-inline .form-group label+select{display:table-cell;border-top-left-radius:0;border-bottom-left-radius:0}.module-docheader .module-docheader-bar .form-group{vertical-align:top;margin:0;display:inline-block}.module-docheader .module-docheader-bar .form-group .form-control{vertical-align:top}.module-docheader .module-docheader-bar .form-inline-spaced{margin:0}.module-docheader .module-docheader-bar .panel{margin:0 -24px;border-left:none;border-right:none;border-bottom:none;border-radius:0;background-color:#fafafa;box-shadow:none}.module-docheader .module-docheader-bar .panel .panel-body{padding:8px 24px}@media (max-width:768px){.module-docheader .module-docheader-bar .text-right{text-align:left}}.bootstrap-datetimepicker-widget .picker-switch,.modal-content .loadmessage,.typo3-module-viewpage .module-body{text-align:center}.module-docheader .module-docheader-bar-search{margin-bottom:0}.module-docheader .module-docheader-bar-column-left{float:left}.module-docheader .module-docheader-bar-column-right{float:right}.module-docheader-bar-navigation .module-docheader-bar-column-left{white-space:nowrap}@media (max-width:768px){.module-docheader-bar-navigation .module-docheader-bar-column-left{white-space:normal}}.module-docheader-bar-navigation .form-group select{width:100%}.module-body{padding:24px}.module-body>.callout:first-child{margin-top:0}.module-body>.container{padding-left:0;padding-right:0}.module-body .container-small{max-width:768px;margin:0 auto}.module-docheader+.module-body{padding-top:89px}.panel{display:block}.panel:focus,.panel:hover{text-decoration:none}.panel-heading a,.panel-heading a:active,.panel-heading a:focus,.panel-heading a:hover{text-decoration:none;color:inherit}.element-browser-title a,.panel-body-highlightlinks>p>a{text-decoration:underline}.panel-heading-left{float:left}.panel-heading-right{float:right}.panel-title{font-size:12px}.panel-title-icon,.panel-title-name{display:inline-block;vertical-align:middle}.panel-body>:first-child{margin-top:0}.panel-body>:last-child{margin-bottom:0}.panel-table td:first-child,.panel-table th:first-child{padding-left:15px}.panel-table td:last-child,.panel-table th:last-child{padding-right:15px}.panel-progress{background-color:#eee;height:3px;position:relative;width:100%}.panel-progress .panel-progress-bar{display:block;height:100%;background-color:#444}.panel-active{border-color:#444}.panel-active>.panel-heading{color:#fff;background-color:#666;border-color:#444}.panel-active>.panel-heading+.panel-collapse>.panel-body{border-top-color:#444}.panel-active>.panel-heading .badge{color:#666;background-color:#fff}.panel-active>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#444}#typo3-debug-console .topbar:after,.clearfix:after,.distribution-detail:after,.distribution-holder:after,.dropdown-list>li:after,.module-docheader .module-docheader-bar:after,.module-docheader:after,.modulemenu .modulemenu-group-header:after,.modulemenu .modulemenu-item-link:after,.pagination-block:after,.panel-heading:after,.t3-page-ce .t3-page-ce-header:after,.typo3-login-copyright-link:after{content:"";display:table;clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;border:0}.dropzone-close,.dropzone-hint-icon{text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.c-na,.t3-flex-section-header-preview,.typo3-dblist-sysnotes .panel-sysnote .panel-body h4 span,.x-tree-node-readableRootline,em,pre.ts-hl .ts-comment{font-style:italic}.affix{position:fixed}@-ms-viewport{width:device-width}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}.hidden-lg{display:none!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}.hidden-print{display:none!important}}.minicolors{position:relative}.userTS .minicolors{position:absolute}.userTS .minicolors-panel{margin-top:31px}.userTS .minicolors-swatch{z-index:100000}.minicolors-sprite{background-image:url(../../../../../../typo3/sysext/core/Resources/Public/Images/colorpicker/jquery.minicolors.png)}.minicolors-swatch{position:absolute;vertical-align:middle;background-position:-80px 0;cursor:text;padding:0;margin:0;display:inline-block;top:50%;left:6px;z-index:2;-webkit-transform:translate(0,-50%);transform:translate(0,-50%);width:20px;height:20px;border-radius:1px}.minicolors-swatch-color{position:absolute;top:0;left:0;right:0;bottom:0;border-radius:inherit}.minicolors-input{float:none;padding-left:32px}.minicolors-panel{margin-top:1px;overflow:hidden;border-radius:2px;position:absolute;width:173px;height:152px;background:#fff;border:1px solid #bbb;box-shadow:0 0 20px rgba(0,0,0,.2);z-index:99999;display:none}.minicolors-panel.minicolors-with-swatches{height:182px}.minicolors-panel.minicolors-visible{display:block}.minicolors-position-top .minicolors-panel{top:-154px}.minicolors-position-right .minicolors-panel{right:0}.minicolors-position-bottom .minicolors-panel{top:auto}.minicolors-position-left .minicolors-panel{left:0}.minicolors-with-opacity .minicolors-panel{width:194px}.minicolors .minicolors-grid{position:absolute;top:1px;left:1px;width:150px;height:150px;background-position:-120px 0;cursor:crosshair}.minicolors .minicolors-grid-inner{position:absolute;top:0;left:0;width:150px;height:150px}.minicolors-slider-saturation .minicolors-grid{background-position:-420px 0}.minicolors-slider-saturation .minicolors-grid-inner{background-position:-270px 0;background-image:inherit}.minicolors-slider-brightness .minicolors-grid{background-position:-570px 0}.minicolors-slider-brightness .minicolors-grid-inner{background-color:#000}.minicolors-slider-wheel .minicolors-grid{background-position:-720px 0}.minicolors-opacity-slider,.minicolors-slider{position:absolute;top:1px;left:152px;width:20px;height:150px;background-color:#fff;background-position:0 0;cursor:row-resize}.minicolors-slider-saturation .minicolors-slider{background-position:-60px 0}.minicolors-slider-brightness .minicolors-slider,.minicolors-slider-wheel .minicolors-slider{background-position:-20px 0}.minicolors-opacity-slider{left:173px;background-position:-40px 0;display:none}.minicolors-with-opacity .minicolors-opacity-slider{display:block}.element-browser,.modal-dialog{display:-webkit-box;display:-webkit-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal}.minicolors-grid .minicolors-picker{position:absolute;top:70px;left:70px;width:12px;height:12px;border:1px solid #000;border-radius:10px;margin-top:-6px;margin-left:-6px;background:0 0}.minicolors-grid .minicolors-picker>div{position:absolute;top:0;left:0;width:8px;height:8px;border-radius:8px;border:2px solid #fff;box-sizing:content-box}.minicolors-picker{position:absolute;top:0;left:0;width:18px;height:2px;background:#fff;border:1px solid #000;margin-top:-2px}.minicolors-swatches,.minicolors-swatches li{margin:0;padding:0;list-style:none;overflow:hidden;position:absolute;top:157px;left:5px}.minicolors-swatches .minicolors-swatch{position:relative;float:left;cursor:pointer;margin:0 4px 0 0;top:0;left:0;width:20px;height:20px}.element-browser-attributes>.form-horizontal:last-child .form-group,.element-browser-body>:last-child{margin-bottom:0}.minicolors-with-opacity .minicolors-swatches .minicolors-swatch{margin-right:7px}.minicolors-swatch.selected{border-color:#000}.svg-tree-wrapper{overflow-y:scroll}.svg-tree-wrapper path.link{fill:none;shape-rendering:crispEdges;stroke:#ddd;stroke-width:1}.svg-tree-wrapper .node .chevron,.svg-tree-wrapper .node .tree-check,.svg-tree-wrapper .node text{cursor:pointer}.element-browser{display:flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-direction:column;flex-direction:column;width:100%}@media (min-width:600px){.element-browser{height:100vh}.element-browser-main{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-flex:1;-webkit-flex:1 auto;flex:1 auto}}.element-browser h3{font-size:1.2em}.element-browser-body{overflow:auto;height:100%;padding:15px}.element-browser-body>:first-child{margin-top:0}.element-browser-title{padding:15px;color:#fff;background-color:#292929}.element-browser-title a{color:inherit}.element-browser-tabs .nav-tabs{padding:15px 15px 0}.element-browser-attributes{padding:15px;background-color:#fafafa;border-bottom:1px solid #ddd}.element-browser-main-sidebar,.element-browser-main-sidebar .list-tree li:last-child:before,.element-browser-main-sidebar .list-tree-control>.fa:before{background-color:#f2f2f2}@media (min-width:600px){.element-browser-main-sidebar{-webkit-flex-shrink:0;flex-shrink:0;width:260px;border-right:1px solid #ddd}.element-browser-main-content{overflow:auto;-webkit-box-flex:1;-webkit-flex:1 auto;flex:1 auto}}@media (min-width:720px){.element-browser-main-sidebar{width:280px}}@media (min-width:840px){.element-browser-main-sidebar{width:300px}}@media (min-width:960px){.element-browser-main-sidebar{width:320px}}.modal .close{color:inherit;padding:0;margin:0;text-shadow:rgba(0,0,0,.5) 0 0 3px;opacity:.5;user-select:none}.modal .close:active,.modal .close:hover{box-shadow:none;outline:0;background:0 0;opacity:1}.modal-dialog{display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-box-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;margin:0 auto!important;height:100vh;width:100vw}.modal-content{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;margin:0 auto;max-height:calc(100vh - 40px);max-width:calc(100vw - 40px);-webkit-transition:margin-top .1s ease-in;transition:margin-top .1s ease-in;border:none}.modal-body{-webkit-box-flex:1;-webkit-flex:1 1 auto;flex:1 1 auto;overflow-y:auto}.modal-footer,.modal-header{padding:10px 15px}.modal-footer .btn{margin-right:0;padding-left:1em;padding-right:1em}.modal-footer .btn .icon{margin-left:-2px;margin-right:4px}.modal-footer .btn span{vertical-align:middle}.modal-content .loadmessage{color:#1e1e1e}.modal-image-manipulation .modal-body{padding:0;display:-webkit-box;display:-webkit-flex;display:flex}.modal-image-manipulation .modal-panel-main{overflow:visible;background-image:url(../Images/cropper-background.png);display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;padding:20px;width:100%}.modal-image-manipulation .modal-panel-main img{max-width:100%}.cropper-container img,.cropper-hide{min-width:0!important;min-height:0!important;max-width:none!important;max-height:none!important}.modal-image-manipulation .modal-panel-sidebar{padding:15px;-webkit-flex-shrink:0;flex-shrink:0;border-left:1px solid rgba(0,0,0,.25);position:relative;overflow:auto;-webkit-overflow-scrolling:touch;width:200px}@media (min-width:768px){.modal-image-manipulation .modal-panel-sidebar{width:250px}}@media (min-width:992px){.modal-image-manipulation .modal-panel-sidebar{width:300px}}.modal-type-iframe,.modal-type-iframe .modal-body{padding:0}.modal-iframe{display:block;border:0;height:100%;width:100%;position:absolute;top:0;left:0}.modal-size-small .modal-content{width:440px}.modal-size-default .modal-content{width:600px}.modal-size-large .modal-content{width:1000px;height:800px}.modal-size-full .modal-content{width:1800px;height:1200px}.modal-severity-notice .modal-header{background-color:#eee;color:#333;border-bottom-color:#bbb}.modal-severity-info .modal-header{background-color:#6daae0;color:#fff;border-bottom-color:#589edc}.modal-severity-success .modal-header{background-color:#79a548;color:#fff;border-bottom-color:#6c9340}.modal-severity-warning .modal-header{background-color:#e8a33d;color:#fff;border-bottom-color:#e59826}.modal-severity-danger .modal-header{background-color:#c83c3c;color:#fff;border-bottom-color:#b73434}.modal-style-dark{color:#fff}.modal-style-dark .modal-header{color:#fff;background-color:#484848;border-bottom-color:#000}.modal-style-dark .modal-content{overflow:hidden;background-color:#292929}.modal-style-dark .modal-body,.modal-style-dark .modal-footer{background-color:#292929;color:#fff}.modal-style-dark .modal-footer{border-top:1px solid #000}.card{display:-webkit-box;display:-webkit-flex;display:flex;padding:15px;box-shadow:0 2px 0 rgba(0,0,0,.2);border:1px solid #ccc;margin-bottom:20px;transition:all .2s ease-in-out;-webkit-transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,transform;transition-property:box-shadow,border,transform,-webkit-transform}.card-container,.viewpage-topbar{display:-webkit-box;display:-webkit-flex}.card:hover{text-decoration:none;border:1px solid #b3b2b2;-webkit-transform:translate(0,-1px);transform:translate(0,-1px);box-shadow:0 3px 0 rgba(0,0,0,.3)}.card-container{display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;margin:10px -10px}.card-container .card{margin-left:10px;margin-right:10px}.card-size-large,.card-size-medium,.card-size-small{width:calc(100% - 20px)}@media (min-width:768px){.card-size-small{width:calc(50% - 20px)}}@media (min-width:992px){.card-size-small{width:calc(25% - 20px)}}@media (min-width:768px){.card-size-medium{width:calc(50% - 20px)}.card-size-large{width:calc(100% - 20px)}}.typo3-module-viewpage{background-color:#494949}.typo3-module-viewpage .module{background-color:transparent}.typo3-module-viewpage .ui-resizable-w{left:-5px;height:100%;width:5px}.typo3-module-viewpage .ui-resizable-s{bottom:-5px;height:5px}.typo3-module-viewpage .ui-resizable-e{right:-5px;height:100%;width:5px}.typo3-module-viewpage .ui-resizable-se,.typo3-module-viewpage .ui-resizable-sw{height:5px;width:5px;background-image:none;bottom:-5px}.typo3-module-viewpage .ui-resizable-sw{left:-5px}.typo3-module-viewpage .ui-resizable-se{right:-5px}.viewpage-item{position:relative;display:inline-block;background-color:#292929;box-shadow:0 2px 0 rgba(0,0,0,.2);color:#fafafa}.viewpage-item a{color:#fafafa}.viewpage-item iframe{display:block}.viewpage-topbar{height:40px;-webkit-flex-shrink:0;flex-shrink:0;padding:.75em 1em;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.viewpage-topbar-orientation a{opacity:.5;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.viewpage-topbar-orientation a:hover{opacity:1}.viewpage-topbar-preset button{background-color:transparent;border:none;padding-left:20px;padding-right:20px}.viewpage-topbar-preset button span{vertical-align:middle}.viewpage-topbar-size input{background-color:transparent;padding-left:0;padding-right:0;border:0;border-bottom:1px solid rgba(0,120,230,.5);-webkit-transition:all .5s ease-in-out;transition:all .5s ease-in-out}.viewpage-topbar-size input:focus,.viewpage-topbar-size input:hover{outline:0;border-bottom-color:#0078e6}.viewpage-resizeable{background-color:#fafafa}.viewpage-preset-item{display:-webkit-box;display:-webkit-flex;display:flex}.viewpage-preset-item-icon{padding-right:.5em}.viewpage-preset-item-label{-webkit-box-flex:1;-webkit-flex:1 1 auto;flex:1 1 auto}.viewpage-preset-item-size{padding-left:1em;opacity:.5}.bootstrap-datetimepicker-widget{list-style:none}.bootstrap-datetimepicker-widget.dropdown-menu{margin:2px 0;padding:4px;width:19em}@media (min-width:768px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width:992px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width:1200px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}.bootstrap-datetimepicker-widget.dropdown-menu:after,.bootstrap-datetimepicker-widget.dropdown-menu:before{content:'';display:inline-block;position:absolute}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:before{border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #292929;border-bottom-color:rgba(0,0,0,.2);top:-7px;left:7px}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:after{border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #292929;top:-6px;left:8px}.bootstrap-datetimepicker-widget.dropdown-menu.top:before{border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #292929;border-top-color:rgba(0,0,0,.2);bottom:-7px;left:6px}.bootstrap-datetimepicker-widget.dropdown-menu.top:after{border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #292929;bottom:-6px;left:7px}.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:after{left:auto;right:7px}.bootstrap-datetimepicker-widget .list-unstyled,.bootstrap-datetimepicker-widget .modulemenu .modulemenu-group-container,.modulemenu .bootstrap-datetimepicker-widget .modulemenu-group-container{margin:0}.bootstrap-datetimepicker-widget a[data-action]{padding:6px 0}.bootstrap-datetimepicker-widget a[data-action]:active{box-shadow:none}.bootstrap-datetimepicker-widget .timepicker-hour,.bootstrap-datetimepicker-widget .timepicker-minute,.bootstrap-datetimepicker-widget .timepicker-second{width:54px;font-weight:700;font-size:12px;margin:0}.bootstrap-datetimepicker-widget button[data-action]{padding:6px}.bootstrap-datetimepicker-widget .btn[data-action=incrementHours]::after{content:"Increment Hours"}.bootstrap-datetimepicker-widget .btn[data-action=incrementMinutes]::after{content:"Increment Minutes"}.bootstrap-datetimepicker-widget .btn[data-action=decrementHours]::after{content:"Decrement Hours"}.bootstrap-datetimepicker-widget .btn[data-action=decrementMinutes]::after{content:"Decrement Minutes"}.bootstrap-datetimepicker-widget .btn[data-action=showHours]::after{content:"Show Hours"}.bootstrap-datetimepicker-widget .btn[data-action=showMinutes]::after{content:"Show Minutes"}.bootstrap-datetimepicker-widget .btn[data-action=togglePeriod]::after{content:"Toggle AM/PM"}.bootstrap-datetimepicker-widget .btn[data-action=clear]::after{content:"Clear the picker"}.bootstrap-datetimepicker-widget .btn[data-action=today]::after{content:"Set the date to today"}.bootstrap-datetimepicker-widget .picker-switch::after{content:"Toggle Date and Time Screens"}.bootstrap-datetimepicker-widget .picker-switch td{padding:0;margin:0;height:auto;width:auto;line-height:inherit}.bootstrap-datetimepicker-widget .picker-switch td span{line-height:2.5;height:2.5em;width:100%}.bootstrap-datetimepicker-widget table{width:100%;margin:0}.bootstrap-datetimepicker-widget table td,.bootstrap-datetimepicker-widget table th{text-align:center;border-radius:0}.bootstrap-datetimepicker-widget table th{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table th.picker-switch{width:145px}.bootstrap-datetimepicker-widget table th.disabled,.bootstrap-datetimepicker-widget table th.disabled:hover{background:0 0;color:#737373;cursor:not-allowed}.bootstrap-datetimepicker-widget table th.prev::after{content:"Previous Month"}.bootstrap-datetimepicker-widget table th.next::after{content:"Next Month"}.bootstrap-datetimepicker-widget table thead tr:first-child th{cursor:pointer}.bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#434242}.bootstrap-datetimepicker-widget table td{height:54px;line-height:54px;width:54px}.bootstrap-datetimepicker-widget table td.cw{font-size:.8em;height:20px;line-height:20px;color:#8c8c8c}.bootstrap-datetimepicker-widget table td.day{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table td.day:hover,.bootstrap-datetimepicker-widget table td.hour:hover,.bootstrap-datetimepicker-widget table td.minute:hover,.bootstrap-datetimepicker-widget table td.second:hover{background:#434242;cursor:pointer}.bootstrap-datetimepicker-widget table td.new,.bootstrap-datetimepicker-widget table td.old{color:#8c8c8c}.bootstrap-datetimepicker-widget table td.today{position:relative}.bootstrap-datetimepicker-widget table td.today:before{content:'';display:inline-block;border:solid transparent;border-width:0 0 7px 7px;border-bottom-color:#0078e6;border-top-color:rgba(0,0,0,.2);position:absolute;bottom:4px;right:4px}.bootstrap-datetimepicker-widget table td.active,.bootstrap-datetimepicker-widget table td.active:hover{background-color:#0078e6;color:#fff;text-shadow:none}.bootstrap-datetimepicker-widget table td.active.today:before{border-bottom-color:#fff}.bootstrap-datetimepicker-widget table td.disabled,.bootstrap-datetimepicker-widget table td.disabled:hover{background:0 0;color:#737373;cursor:not-allowed}.bootstrap-datetimepicker-widget table td span{display:inline-block;width:54px;height:54px;line-height:54px;margin:2px 1.5px;cursor:pointer;border-radius:0}.bootstrap-datetimepicker-widget table td span:hover{background:#434242}.bootstrap-datetimepicker-widget table td span.active{background-color:#0078e6;color:#fff;text-shadow:none}.bootstrap-datetimepicker-widget table td span.old{color:#8c8c8c}.bootstrap-datetimepicker-widget table td span.disabled,.bootstrap-datetimepicker-widget table td span.disabled:hover{background:0 0;color:#737373;cursor:not-allowed}.bootstrap-datetimepicker-widget.usetwentyfour td.hour{height:27px;line-height:27px}.input-group.date .input-group-addon{cursor:pointer}.cropper-container{position:relative;overflow:hidden;user-select:none;-webkit-touch-callout:none}.cropper-container img{display:block;image-orientation:0deg!important;width:100%;height:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal{position:absolute;top:0;right:0;bottom:0;left:0}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;width:100%;height:100%;overflow:hidden;outline:#69f solid 1px;outline-color:rgba(102,153,255,.75)}.cropper-dashed{position:absolute;display:block;border:0 dashed #fff;opacity:.5}.cropper-dashed.dashed-h{top:33.33333333%;left:0;width:100%;height:33.33333333%;border-top-width:1px;border-bottom-width:1px}.cropper-dashed.dashed-v{top:0;left:33.33333333%;width:33.33333333%;height:100%;border-right-width:1px;border-left-width:1px}.cropper-face,.cropper-line,.cropper-point{position:absolute;display:block;width:100%;height:100%;opacity:.1}.cropper-face{top:0;left:0;cursor:move;background-color:#fff}.cropper-line,.cropper-point{background-color:#69f}.cropper-line.line-e{top:0;right:-3px;width:5px;cursor:e-resize}.cropper-line.line-n{top:-3px;left:0;height:5px;cursor:n-resize}.cropper-line.line-w{top:0;left:-3px;width:5px;cursor:w-resize}.cropper-line.line-s{bottom:-3px;left:0;height:5px;cursor:s-resize}.cropper-point{width:5px;height:5px;opacity:.75}.cropper-point.point-e{top:50%;right:-3px;margin-top:-3px;cursor:e-resize}.cropper-point.point-n{top:-3px;left:50%;margin-left:-3px;cursor:n-resize}.cropper-point.point-w{top:50%;left:-3px;margin-top:-3px;cursor:w-resize}.cropper-point.point-s{bottom:-3px;left:50%;margin-left:-3px;cursor:s-resize}.cropper-point.point-ne{top:-3px;right:-3px;cursor:ne-resize}.cropper-point.point-nw{top:-3px;left:-3px;cursor:nw-resize}.cropper-point.point-sw{bottom:-3px;left:-3px;cursor:sw-resize}.cropper-point.point-se{right:-3px;bottom:-3px;width:20px;height:20px;cursor:se-resize;opacity:1}.cropper-point.point-se:before{position:absolute;right:-50%;bottom:-50%;display:block;width:200%;height:200%;content:" ";background-color:#69f;opacity:0}@media (min-width:768px){.cropper-point.point-se{width:15px;height:15px}.dl-horizontal dt,.form-irre-header-body dl dt{text-align:left}}@media (min-width:992px){.cropper-point.point-se{width:10px;height:10px}}@media (min-width:1200px){.cropper-point.point-se{width:5px;height:5px;opacity:.75}}.cropper-bg{background-image:url(../img/bg.png)}.cropper-invisible{opacity:0}.cropper-hide{position:fixed;top:0;left:0;z-index:-1;width:auto!important;height:auto!important;opacity:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}#nprogress .bar{background:#ff8700;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #ff8700,0 0 5px #ff8700;opacity:1;-webkit-transform:rotate(3deg) translate(0,-4px);transform:rotate(3deg) translate(0,-4px)}.t3-help-inline,.typo3-csh-inline{box-shadow:0 1px 3px rgba(0,0,0,.3);line-height:16px}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#ff8700;border-left-color:#ff8700;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@keyframes nprogress-spinner{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.t3-help-link span.t3-help-inline{display:none}.t3-help-link:hover span.t3-help-inline{display:block}@media print{div#typo3-docbody{overflow:visible}}.t3-page-ce .t3-page-ce-footer,.text-monospace{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}.text-normal{font-weight:400}.text-pre-wrap{white-space:pre-wrap}.lead{font-size:1.25em}@media (min-width:768px){.dl-horizontal-wide dt{width:115px}.dl-horizontal-wide dd{margin-left:135px}.table .col-word-break{word-wrap:break-word;word-break:break-all}}.t3-page-ce,.table-fit,.x-viewport,.x-viewport body,[id=typo3-debug-console] .messages,[id=typo3-docbody],[id=typo3-module-menu] .x-panel-body,[id=typo3-navigationContainer] .x-panel-body,[id=typo3-pagetree-filteringTree] .x-panel-body,[id=typo3-pagetree-tree] .x-panel-body,[id=typo3-side-menu],iframe{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.collapse-horizontal{height:auto;width:0;vertical-align:middle;overflow:hidden}.collapse-horizontal.in{display:inline-block;width:auto}.collapse-horizontal.collapsing{display:inline-block;width:0;-webkit-transition-property:width,visibility;transition-property:width,visibility}.cropper .cropper-line{background-color:transparent}.cropper .cropper-dashed{border:1px dashed #ff8700}.cropper .cropper-point{background-color:#ff8700}.cropper .cropper-point.point-nw{left:0;top:0}.cropper .cropper-point.point-w{left:0}.cropper .cropper-point.point-sw{left:0;bottom:0}.cropper .cropper-point.point-ne{right:0;top:0}.cropper .cropper-point.point-e{right:0}.cropper .cropper-point.point-se{right:0;bottom:0}.cropper .cropper-point.point-se:before{background-color:#fff}.cropper .cropper-point.point-n{top:0}.cropper .cropper-point.point-s{bottom:0}.cropper .cropper-view-box{outline:#ff8700 dashed 1px}.cropper .cropper-bg{background-image:url(../Images/cropper-background.png)}.cropper .cropper-image-container{height:100%!important;width:100%!important;max-width:1000px!important}.cropper .ratio-buttons{margin-bottom:10px}.cropper .ratio-buttons .btn.btn-default{margin-bottom:5px}.cropper .ratio-buttons .btn:not(.active) .fa{display:none}.cropper .panel-group{position:relative;margin:-15px}.cropper .panel-group [aria-expanded=true]{border-left:2px solid #ff8700;position:relative}.cropper .panel-group [aria-expanded=true][data-toggle=collapse]{background-color:#333}.cropper .panel-group [aria-expanded=false]{border-left:2px solid #444;position:relative}.cropper .panel-group label,.cropper .panel-group table{color:#fff}.cropper .panel-collapse.collapse{background-color:#2c2c2c!important;border-left:2px solid #ff8700}.cropper .panel-heading{padding:0}.cropper .panel-heading .panel-title>[data-crop-variant]{display:-webkit-box;display:-webkit-flex;display:flex;padding:10px 15px;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.cropper .panel-heading .panel-title>a{text-decoration:none!important;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:13px}.alert a,div.typo3-view-help a{text-decoration:underline}.cropper .panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#333}.cropper .panel,.cropper .panel-default .panel-heading,.cropper .panel-group{background:#222;border:none;color:#fff}.cropper .btn-secondary,.cropper .open .dropdown-toggle.btn-secondary{color:#fff;background-color:#777;border-color:#555}.cropper .btn-secondary.active,.cropper .btn-secondary:active,.cropper .btn-secondary:focus,.cropper .btn-secondary:hover,.cropper .open .active.dropdown-toggle.btn-secondary,.cropper .open .dropdown-toggle.btn-secondary:active,.cropper .open .dropdown-toggle.btn-secondary:focus,.cropper .open .dropdown-toggle.btn-secondary:hover{color:#fff;background-color:#888;border-color:#444}.cropper .cropper-container.cropper-bg{overflow:visible}.cropper .cropper-crop-box{overflow:hidden}.cropper .cropper-crop-box:after{background-color:#ff8700;content:"Cropped area";position:absolute;left:0;top:0;font-size:10px;color:#000;height:16px;width:100%;max-width:80px;text-overflow:ellipsis;white-space:nowrap;padding:0 4px;overflow:hidden}.cropper .cropper-line.line-w{left:0}.cropper .cropper-line.line-e{right:0}.cropper .cropper-line.line-n{top:0}.cropper .cropper-line.line-s{bottom:0}.cropper .ui-resizable-handle.ui-resizable-e,.cropper .ui-resizable-handle.ui-resizable-n,.cropper .ui-resizable-handle.ui-resizable-s,.cropper .ui-resizable-handle.ui-resizable-w{border-color:transparent;-webkit-transform:none;transform:none}.cropper .ui-resizable-handle.ui-resizable-e,.cropper .ui-resizable-handle.ui-resizable-w{width:6px}.cropper .ui-resizable-handle.ui-resizable-n,.cropper .ui-resizable-handle.ui-resizable-s{height:6px}.cropper .ui-resizable-handle.ui-resizable-e{right:0}.cropper .ui-resizable-handle.ui-resizable-w{left:0}.cropper .ui-resizable-handle.ui-resizable-n{top:0}.cropper .ui-resizable-handle.ui-resizable-s{bottom:0}.cropper .ui-resizable-handle.ui-resizable-ne,.cropper .ui-resizable-handle.ui-resizable-nw,.cropper .ui-resizable-handle.ui-resizable-se,.cropper .ui-resizable-handle.ui-resizable-sw{-webkit-transform:none;transform:none;background-color:#ccc;height:6px;width:6px}.cropper .ui-resizable-handle.ui-resizable-nw{top:0;left:0}.cropper .ui-resizable-handle.ui-resizable-ne{top:0;right:0}.cropper .ui-resizable-handle.ui-resizable-se{bottom:0;right:0}.cropper .ui-resizable-handle.ui-resizable-sw{bottom:0;left:0}.cropper .cropper-focus-area{cursor:move;height:200px;width:200px;background-color:rgba(215,187,0,.5);position:absolute;z-index:999999;opacity:1;overflow:hidden;-webkit-transition:background-color .3s;transition:background-color .3s}.cropper .cropper-cover-area:after,.cropper .cropper-focus-area:after{position:absolute;font-size:10px;height:16px;width:100%;white-space:nowrap;top:0;color:#000;overflow:hidden;left:0;pointer-events:none;text-overflow:ellipsis}.cropper .cropper-focus-area.has-nodrop,.cropper .cropper-focus-area.has-nodrop:hover{background-color:rgba(211,35,46,.6)!important;-webkit-transition:background-color .3s;transition:background-color .3s}.cropper .cropper-focus-area:focus,.cropper .cropper-focus-area:hover{background-color:rgba(215,187,0,.7)}.cropper .cropper-focus-area:after{background-color:rgba(255,255,255,.95);content:"Focus";max-width:44px;padding:0 4px 0 8px}.cropper .cropper-cover-area{background:url(../Images/cropper-background-cover-area.svg);pointer-events:none;cursor:not-allowed;position:absolute;opacity:1;z-index:99999}.cropper .cropper-cover-area:after{background-color:rgba(255,255,255,.95);content:"Cover area";max-width:80px;padding:0 4px}a.t3-help-link,a.typo3-csh-link{white-space:normal}.cropper .cropper-preview-thumbnail{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;max-width:100px;max-height:100px;overflow:hidden}.cropper .cropper-preview-thumbnail:after{background-color:rgba(0,0,0,.5);content:" ";top:0;left:0;bottom:0;right:0;position:absolute;z-index:9}a.t3-help-link .t3-help-inline.show-right,a.typo3-csh-link .typo3-csh-inline.show-right{right:10px}.cropper .cropper-preview-thumbnail.wide{width:100px;height:auto}.cropper .cropper-preview-thumbnail.tall{width:auto;height:80px}.cropper .cropper-preview-thumbnail-image{left:0;top:0}.cropper .wide .cropper-preview-thumbnail-image{width:100%;height:auto}.cropper .tall .cropper-preview-thumbnail-image{width:auto;height:100%}.cropper .cropper-preview-thumbnail-crop-area{border:1px solid #ff8700;position:absolute;z-index:10;overflow:hidden}.cropper .cropper-preview-thumbnail-focus-area{background-color:rgba(215,187,0,.7);position:absolute;z-index:11}:root .cropper-preview-thumbnail-crop-image{image-orientation:0deg;display:block;height:100%;width:100%;min-width:0;max-width:none;min-height:0;max-height:none}.cropper-preview-container{overflow:hidden;position:relative}.cropper-preview-container img{display:block;position:absolute;width:100%;min-width:0!important;min-height:0!important;max-width:none!important;max-height:none!important}.typo3-csh-inline{padding:4px}table.typo3-csh-inline{margin:5px 4px 20px 0}table.typo3-csh-inline a.typo3-csh-link{float:none;margin-right:0;height:16px}a.typo3-csh-link .typo3-csh-inline{display:none;position:absolute;width:200px;z-index:100}a.typo3-csh-link:hover .typo3-csh-inline,table.typo3-csh-inline a.typo3-csh-link{display:block}table.typo3-csh-inline tr td h4{margin-top:0;margin-bottom:0}a.typo3-csh-link span.typo3-csh-inline span.paragraph,table.typo3-csh-inline span.paragraph{display:block;padding:3px}img.typo3-csh-icon{vertical-align:middle;cursor:help}div.typo3-view-help{margin:0;width:100%}div.typo3-view-help h1{background:0 0;margin-bottom:0;padding:10px;color:#000;text-align:left}div.typo3-view-help h2{margin-top:0;padding:4px 2px 4px 10px}div.typo3-view-help h3{padding:5px 10px}div.typo3-view-help h4{padding:2px 10px}div.typo3-view-help p{margin:4px 4px 12px 10px}div.typo3-view-help p.c-nav a{background-color:transparent}div.typo3-view-help div.c-toc{padding-left:6px}div.typo3-view-help div.c-toc p{margin:0}div.typo3-view-help .introduction,div.typo3-view-help .manual-title{padding:0 12px 6px}div.typo3-view-help img.c-inlineimg{margin-left:10px}div.typo3-view-help p div.c-toc{background:0 0;border:none}a.typo3-csh-link .typo3-csh-inline,table.t3-help-inline,table.typo3-csh-inline{background-color:#ffffc7;border:1px solid #ccc}.t3-help-inline{padding:4px}table.t3-help-inline{margin:3px 4px 20px 0}table.t3-help-inline a.t3-help-link{float:none;margin-right:0;height:16px;display:block}table.t3-help-inline tr td h4{margin-top:0;margin-bottom:0}a.t3-help-link .t3-help-inline{display:none;position:absolute;width:200px;z-index:100;background:#ffffc7;color:#000;font-weight:400}a.t3-help-link:hover .t3-help-inline{display:block}a.t3-help-link span.t3-help-inline span.paragraph,table.t3-help-inline span.paragraph{display:block;padding:3px}img.t3-help-icon{vertical-align:middle}div.t3-view-help{margin:0;width:100%}div.t3-view-help h1{margin-bottom:0;padding:10px}div.t3-view-help h2{margin-top:0;padding:4px 2px 4px 10px}div.t3-view-help h3{padding:5px 10px}div.t3-view-help h4{padding:2px 10px}div.t3-view-help p{margin:4px 4px 12px 10px}div.t3-view-help .c-toc{padding-left:6px}div.t3-view-help .c-toc p{margin:0}div.t3-view-help .introduction,div.t3-view-help .manual-title{padding:0 12px 6px}div.t3-view-help img.c-inlineimg{margin-left:10px}.x-tip.typo3-csh-tooltip .x-tip-cl,.x-tip.typo3-csh-tooltip .x-tip-tl{padding-left:8px}.x-tip.typo3-csh-tooltip .x-tip-cr,.x-tip.typo3-csh-tooltip .x-tip-tr{padding-right:8px}a.typo3-csh-link .typo3-csh-inline{color:#000;font-weight:400}p.t3-help-short.tipIsLinked{cursor:pointer}.t3-help-teaser,.t3-help-teaser label,.t3-help-teaser-icon,img.t3-help-icon{cursor:help}div#contentMenu0{position:absolute;z-index:300}div#contentMenu1{position:absolute;z-index:310}.context-menu .list-group{margin-bottom:0;background-color:#fff;min-width:150px}.context-menu .list-group-item{cursor:pointer;padding:5px;border-bottom-color:transparent;border-top-color:transparent}.context-menu .list-group-item:first-child{border-top-color:#d7d7d7}.context-menu .list-group-item:last-child{border-bottom-color:#d7d7d7}.context-menu .list-group-item-divider{display:block;padding:0 0 1px;margin:0 0 1px;width:100%;border-bottom-color:#d7d7d7}.context-menu .list-group-item-icon{width:1.28571429em;text-align:center}#typo3-docheader{background:#eee}#typo3-docheader img,#typo3-docheader input{cursor:pointer}#typo3-docheader .t3-icon{margin-bottom:3px}#typo3-docheader .left{float:left}#typo3-docheader .left .t3-icon{margin-right:6px}#typo3-docheader .right{float:right}#typo3-docheader .right .t3-icon{margin-left:6px}#typo3-docheader .buttongroup{float:left;margin-right:6px}#typo3-docheader .buttongroup .c-inputButton{color:inherit;padding:0}#typo3-docheader .buttongroup input.c-inputButton{text-indent:-1000px}#typo3-docheader select{margin-right:12px}#typo3-docheader a{color:#2d2d2d}#typo3-docheader a:hover{color:#000}#typo3-docheader a.active{color:#c3c3c3}#typo3-docheader a.active span{cursor:default}#typo3-docheader .typo3-docheader-buttons,#typo3-docheader .typo3-docheader-functions{color:#2d2d2d;overflow:hidden;padding:0 24px}#typo3-docheader .typo3-docheader-functions{height:27px;line-height:27px}#typo3-docheader .typo3-docheader-functions select{color:#2d2d2d}#typo3-docheader .typo3-docheader-buttons{height:22px;padding-top:3px;padding-bottom:3px;border-bottom:1px solid #c3c3c3}.alert-notice{background-color:#333;border-color:transparent;color:#fff}.alert-notice hr{border-top-color:transparent}.alert-notice .alert-link{color:#e6e5e5}.alert{box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);border:0}.alert a{color:inherit}.alert .media{margin:0}.alert .media .fa-stack>.fa:first-child{opacity:.2}.alert .media-body{vertical-align:middle}.alert-title{font-size:1.12em;font-weight:700;margin:0 0 .25em}.alert-body,.alert-message{margin:0;font-size:.9em}.alert-body>:last-child,.alert-message>:last-child{margin-bottom:0}.alert-body>ul,.alert-message>ul{padding-left:1.5em}.alert-dismissible .close{opacity:.5;padding:1px;top:-3px;right:-22px;color:inherit}.alert-dismissible .close:hover{opacity:1;color:inherit}#alert-container{width:400px;position:absolute;right:5px;top:46px;z-index:10000}#alert-container .alert{box-shadow:inset 0 0 0 1px rgba(0,0,0,.1),0 2px 0 0 rgba(0,0,0,.15);position:relative;margin:5px auto}#alert-container .alert.fade.in{opacity:.95}#typo3-pagetree-topPanelItems{background-color:#eee}#typo3-pagetree,#typo3-pagetree .x-panel-body,#typo3-pagetree .x-panel-bwrap{height:100%}#typo3-pagetree ul{padding-left:0;list-style:none}#typo3-pagetree .x-toolbar{padding:0;border:none}#typo3-pagetree ul.x-tree-root-ct{padding-top:24px;margin-bottom:50px}#typo3-pagetree .x-panel-body{background:0 0}#typo3-pagetree .x-tree-node .x-tree-node-el{line-height:18px;height:20px;margin-right:3px;border-top:1px solid transparent;border-bottom:1px solid transparent;border-left:1px solid transparent}#typo3-pagetree .x-tree-node .x-tree-node-over,#typo3-pagetree .x-tree-node .x-tree-selected{border-bottom:1px solid #d7d7d7;border-top:1px solid #d7d7d7;border-right:1px solid #d7d7d7}#typo3-pagetree .x-tree-node .x-tree-node-over{background-color:#f2f2f2;border-top-right-radius:3px;border-bottom-right-radius:3px}#typo3-pagetree .x-tree-node .x-tree-selected{background-color:#fff}#typo3-pagetree .x-tree-node .x-tree-selected.x-tree-node-over{background-image:none;border-radius:0}#typo3-pagetree .x-tree-node-readableRootline{padding:10px 0 3px 10px}#typo3-pagetree .x-unselectable,#typo3-pagetree .x-unselectable *{cursor:pointer}#typo3-pagetree .ver-element,#typo3-pagetree .ver-page,#typo3-pagetree .ver-versions{background-color:#f7c898}#typo3-pagetree .x-tree-node-over.ver-element,#typo3-pagetree .x-tree-node-over.ver-page,#typo3-pagetree .x-tree-node-over.ver-versions,#typo3-pagetree .x-tree-selected.ver-element,#typo3-pagetree .x-tree-selected.ver-page,#typo3-pagetree .x-tree-selected.ver-versions{background-color:#fee4c9}#typo3-pagetree .typo3-pagetree-filteringTree-highlight{background-color:#f48e0c;color:#fff;padding:0}.x-tree-lines .typo3-pagetree-node-notExpandable .x-tree-ec-icon{visibility:hidden}.x-tree-lines .typo3-pagetree-node-notExpandable ul .x-tree-ec-icon{visibility:visible}.x-dd-drag-ghost a .typo3-pagetree-status,.x-tree-node a .typo3-pagetree-status{padding:0;margin:0 3px 0 0}.typo3-pagetree-tree-copy{color:#666;margin-top:5px}.x-dd-drag-ghost-pagetree-text{display:inline-block;vertical-align:middle}.x-dd-drag-ghost,.x-dd-drag-ghost-pagetree{padding-bottom:5px}.x-dd-drop-icon{padding-top:6px}.x-dd-drag-ghost-pagetree span{margin:3px 3px 0}.x-dd-drag-ghost{background-color:inherit;border:none;box-shadow:0 1px 3px rgba(0,0,0,.3)}.x-dd-drag-ghost span{margin:0 1px 0 3px}.x-dd-drop-nodrop{background-color:#f6d3cf;border:1px solid #d66c68}.typo3-pagetree-deletionDropZone-proxyOver,.x-tree-drop-ok-above,.x-tree-drop-ok-append,.x-tree-drop-ok-below,.x-tree-drop-ok-between{background-color:#dce8f4;border:1px solid #9eb2c5}.x-dd-drop-nodrop .x-dd-drop-icon{background-image:url(../../../../backend/Resources/Public/Images/pagetree-drag-place-denied.png)}.x-tree-drop-ok-append.typo3-pagetree-copy .x-dd-drop-icon{background-image:url(../../../../backend/Resources/Public/Images/pagetree-drag-new-inside.png)}.x-tree-drop-ok-below.typo3-pagetree-copy .x-dd-drop-icon{background-image:url(../../../../backend/Resources/Public/Images/pagetree-drag-copy-below.png)}.x-tree-drop-ok-above.typo3-pagetree-copy .x-dd-drop-icon{background-image:url(../../../../backend/Resources/Public/Images/pagetree-drag-copy-above.png)}.x-tree-drop-ok-between.typo3-pagetree-copy .x-dd-drop-icon{background-image:url(../../../../backend/Resources/Public/Images/pagetree-drag-new-between.png)}.x-tree-drop-ok-append .x-dd-drop-icon{background-image:url(../../../../backend/Resources/Public/Images/pagetree-drag-move-into.png)}.x-tree-drop-ok-between .x-dd-drop-icon{background-image:url(../../../../backend/Resources/Public/Images/pagetree-drag-move-between.png)}.x-tree-drop-ok-below .x-dd-drop-icon{background-image:url(../../../../backend/Resources/Public/Images/pagetree-drag-move-below.png)}.x-tree-drop-ok-above .x-dd-drop-icon{background-image:url(../../../../backend/Resources/Public/Images/pagetree-drag-move-above.png)}#typo3-pagetree .x-tree-node .x-tree-drag-insert-below,.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below a,.x-tree-node div.x-tree-drag-insert-below{border-bottom:1px solid #9eb2c5}#typo3-pagetree .x-tree-node .x-tree-drag-insert-above,.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above a,.x-tree-node .x-tree-drag-insert-above{border-top:1px solid #9eb2c5}.x-tree-node .x-tree-drag-append{background:#d7e4f1}.x-tree-node .x-tree-drag-append a span{background-color:inherit;border:none}.typo3-pagetree-toppanel{padding:0 10px;border-bottom:1px solid #c3c3c3}.typo3-pagetree-toppanel .btn{line-height:16px}.typo3-pagetree-toppanel .x-toolbar{padding:0;border:0!important}.typo3-pagetree-toppanel .x-toolbar-left-row .btn{margin-right:4px}.typo3-pagetree-toppanel .x-toolbar-right-row .btn{margin-left:4px}.typo3-pagetree-toppanel .x-panel-body,.typo3-pagetree-toppanel .x-panel-tbar{margin:4px 0;min-height:26px;height:auto!important}.typo3-pagetree-toppanel .x-panel-bwrap{height:auto!important;overflow:visible}.typo3-pagetree-toppanel .x-btn button{padding:0;font-size:inherit}.typo3-pagetree-toppanel-filter{width:100%!important;height:26px!important;padding-right:25px;padding-left:8px;box-sizing:inherit}.slider-handle,.table *{box-sizing:border-box}.typo3-pagetree-toppanel-filter-clear{position:absolute;right:5px;top:50%;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.typo3-pagetree-toppanel-item .x-form-field-wrap{width:100%!important}.typo3-pagetree-toppanel-item .x-panel-body{margin:0}.typo3-pagetree-toppanel-drag-node{cursor:move;padding:5px;border:none;background:0 0;font-size:11px;line-height:16px}#typo3-pagetree-deletionDropZone{color:#fff;background-color:#585858;box-shadow:inset 0 2px 5px #414141}#typo3-pagetree-deletionDropZone p{padding:5px}#typo3-pagetree-deletionDropZone #typo3-pagetree-deletionDropZone-text{cursor:default;font-size:.9em;padding:0 0 0 5px;display:inline}.typo3-pagetree-deletionDropZone-restore{background-color:#d5d5d5;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,#f6f6f6 10%,#d5d5d5 90%);background-image:linear-gradient(to bottom,#f6f6f6 10%,#d5d5d5 90%);border:1px solid #7c7c7c;border-radius:1px;color:#434343;cursor:pointer;display:inline-block;padding:0 6px;margin-left:24px}.typo3-pagetree-deletionDropZone-restore:hover{background-color:#c8c8c8;background-image:-webkit-linear-gradient(top,#f6f6f6 10%,#c8c8c8 90%);background-image:linear-gradient(to bottom,#f6f6f6 10%,#c8c8c8 90%);background-position:bottom;background-repeat:repeat-x;border:1px solid #737f91;color:#1e1e1e}.typo3-pagetree-deletionDropZone-restoreText{display:inline-block;padding:4px 4px 4px 18px}#typo3-pagetree .typo3-pagetree-deletionDropZone-activateProxyOver{background-color:#644d2d}[id=typo3-pagetree-indicatorBar] .alert{margin:10px 10px 0}.x-shadow{z-index:40!important}[id=typo3-pagetree-indicatorBar-temporaryMountPoint] .media-right{position:absolute;right:16px;-webkit-transform:translateY(-100%);transform:translateY(-100%);background-color:#6daae0}.slider{display:inline-block;position:relative}.slider .hide,.slider input{display:none}.slider .tooltip.top{margin-top:-36px}.slider .tooltip-inner{white-space:nowrap}.form-wizards-items>.slider.slider-horizontal{margin-left:8px;margin-right:8px}.slider-track{position:absolute;cursor:pointer;background-color:#ddd;border-radius:2px;box-shadow:inset 0 0 2px rgba(0,0,0,.25)}.slider-track-high,.slider-track-low{position:absolute;background:0 0;box-sizing:border-box;border-radius:2px}.slider-handle{position:absolute;background-color:#eee;border:1px solid #959595;border-radius:2px;box-shadow:0 1px 0 rgba(0,0,0,.15)}.slider-handle:active,.slider-handle:focus,.slider-handle:hover{background-color:#d5d4d4;border-color:#767676}.slider-handle:after,.slider-handle:before{content:"";display:block;position:absolute;background-color:#333}.slider-horizontal .slider-tick[style="left: 0%;"],.slider-horizontal .slider-tick[style="left: 100%;"],.slider-vertical .slider-tick[style="top: 0%;"],.slider-vertical .slider-tick[style="top: 100%;"]{display:none}.slider-selection{position:absolute;background-color:#999;border-radius:2px;box-shadow:inset 0 0 2px rgba(0,0,0,.25)}.slider-tick{position:absolute;background-color:#c4c3c3}.slider-tick.in-selection{background-color:#807f7f}.slider-horizontal{width:210px;height:32px}.slider-horizontal .slider-selection,.slider-horizontal .slider-track-high,.slider-horizontal .slider-track-low{height:100%;top:0;bottom:0}.slider-horizontal .slider-track{top:50%;left:0;margin-top:-8px;height:16px;width:100%}.slider-horizontal .slider-tick{height:16px;width:1px}.slider-horizontal .slider-handle{top:50%;height:20px;width:16px;margin-top:-10px;margin-left:-8px}.slider-horizontal .slider-handle:after,.slider-horizontal .slider-handle:before{height:50%;width:2px;top:25%}.slider-horizontal .slider-handle:before{left:4px}.slider-horizontal .slider-handle:after{right:4px}.slider-vertical{width:32px;height:210px}.slider-vertical .slider-selection,.slider-vertical .slider-track-high,.slider-vertical .slider-track-low{width:100%;left:0;right:0}.slider-vertical .slider-selection{bottom:0}.slider-vertical .slider-track{top:0;left:50%;margin-left:-8px;height:100%;width:16px}.slider-vertical .slider-tick{height:1px;width:16px}.slider-vertical .slider-handle{left:50%;height:16px;width:20px;margin-top:-8px;margin-left:-10px}.slider-vertical .slider-handle:after,.slider-vertical .slider-handle:before{height:2px;width:50%;left:25%}.slider-vertical .slider-handle:before{top:4px}.slider-vertical .slider-handle:after{bottom:4px}.slider-vertical .slider-selection{left:0;right:0}.slider-disabled .slider-handle{background-color:#c83c3c;border:1px solid #7b2323}.slider-disabled .slider-handle:active,.slider-disabled .slider-handle:focus,.slider-disabled .slider-handle:hover{background-color:#a32e2e;border-color:#4c1515}.slider-disabled .slider-handle:after,.slider-disabled .slider-handle:before{background-color:#fff}.slider-disabled .slider-track{cursor:not-allowed}.panel-heading[data-toggle=formengine-flex],.panel-heading[data-toggle=formengine-inline],.taskGroup{cursor:pointer}span.checkbox-spinner{position:absolute;margin-left:-20px;margin-top:4px}.nav-tabs{border-radius:2px 2px 0 0;background-color:#ededed}.nav-tabs>li+li{margin-left:2px}.nav-tabs>li>a{margin-right:0;-webkit-transition:all .25s ease-in-out;transition:all .25s ease-in-out}.nav-tabs>li>a:focus,.nav-tabs>li>a:hover{border-color:#d7d7d7 #d7d7d7 #ccc;background:#e1e0e0}.nav-tabs>li[class*=has-]>a:before{font-family:FontAwesome;margin-right:2px;margin-top:-2px;vertical-align:middle;font-size:10px;text-align:center;background-color:rgba(255,255,255,.25);border-radius:50%;width:15px;height:15px;display:inline-block;-webkit-transition:all .25s ease-in-out;transition:all .25s ease-in-out}.nav-tabs>li.has-validation-error>a{background-color:#c83c3c;border-color:#a32e2e;color:#fff}.nav-tabs>li.has-validation-error>a:focus,.nav-tabs>li.has-validation-error>a:hover{color:#fff;background-color:#ce5050;border-color:#b73434}.nav-tabs>li.has-validation-error>a:before{content:""}.nav-tabs>li.has-validation-error.active>a{color:inherit;background-color:#fafafa}.nav-tabs>li.has-validation-error.active>a:before{background-color:#c83c3c;color:#fff}.nav-tabs>li.active>a,.nav-tabs>li.active>a:active,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{border:1px solid #ccc;border-bottom-color:#fafafa;background-color:#fafafa}.tab-content>.tab-pane{display:block;height:0;width:0;overflow:hidden}.tab-content>.tab-pane.active{height:auto;width:auto;overflow:visible}.t3-overview-list dt{padding:0 0 2px 20px}.t3-overview-list dt img{vertical-align:middle;margin-right:5px}.t3-overview-list dd{margin:2px 0 15px 20px;padding-left:22px}table{background:0 0;font-size:inherit;line-height:inherit}.table{background-color:#fafafa;border:1px solid #ccc}.table .table{margin:0}.table .table+.table{margin-top:6px}.table .col-icon .t3-icon,.table .pagination{margin:0}.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>th{white-space:nowrap;vertical-align:middle}.table>tbody>tr>td,.table>tfoot>tr>td,.table>thead>tr>td{vertical-align:middle}.table>thead>tr{background-color:#ededed}.table>thead>tr th.col-checkbox+th.col-title label{margin-bottom:0}.table>thead>tr td,.table>thead>tr th{border-bottom:1px solid #ccc}.table>thead>tr td i,.table>thead>tr th i{font-weight:400}.table .btn-group>.btn,.table .btn-group>.btn-group{float:none}.table .btn-default{color:#333;background-color:#dedede;border-color:#c4c4c4}.table .btn-default.focus,.table .btn-default:focus{color:#333;background-color:#c4c4c4;border-color:#858585}.open>.table .btn-default.dropdown-toggle,.table .btn-default.active,.table .btn-default:active,.table .btn-default:hover{color:#333;background-color:#c4c4c4;border-color:#a6a6a6}.open>.table .btn-default.dropdown-toggle.focus,.open>.table .btn-default.dropdown-toggle:focus,.open>.table .btn-default.dropdown-toggle:hover,.table .btn-default.active.focus,.table .btn-default.active:focus,.table .btn-default.active:hover,.table .btn-default:active.focus,.table .btn-default:active:focus,.table .btn-default:active:hover{color:#333;background-color:#b3b3b3;border-color:#858585}.open>.table .btn-default.dropdown-toggle,.table .btn-default.active,.table .btn-default:active{background-image:none}.table .btn-default.disabled.focus,.table .btn-default.disabled:focus,.table .btn-default.disabled:hover,.table .btn-default[disabled].focus,.table .btn-default[disabled]:focus,.table .btn-default[disabled]:hover,fieldset[disabled] .table .btn-default.focus,fieldset[disabled] .table .btn-default:focus,fieldset[disabled] .table .btn-default:hover{background-color:#dedede;border-color:#c4c4c4}.table .btn-default .badge{color:#dedede;background-color:#333}.table .col-icon{text-align:center}.table .col-checkbox,.table .col-icon{padding-right:0}.table .col-title{width:99%}.table-basic,.table-fit{width:100%}.table .col-clipboard,.table .col-control,.table .col-nowrap{white-space:nowrap!important}.table .col-clipboard,.table .col-control{text-align:right}.table .col-control{padding:4px 6px}.table .col-border-left{border-left:1px solid #ccc}.table .col-min{min-width:150px}.table .col-responsive{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.table-white{background-color:#fff}.table-transparent{background-color:transparent}.table-center td,.table-center th{text-align:center}.table-basic td,.table-basic th{vertical-align:middle}.table-vertical-top>tbody>tr>td,.table-vertical-top>tbody>tr>th,.table-vertical-top>tfoot>tr>td,.table-vertical-top>tfoot>tr>th,.table-vertical-top>thead>tr>td,.table-vertical-top>thead>tr>th{vertical-align:top}.table-vertical-bottom>tbody>tr>td,.table-vertical-bottom>tbody>tr>th,.table-vertical-bottom>tfoot>tr>td,.table-vertical-bottom>tfoot>tr>th,.table-vertical-bottom>thead>tr>td,.table-vertical-bottom>thead>tr>th{vertical-align:bottom}.table-no-borders{border:none}.table-no-borders>tbody>tr>td,.table-no-borders>tbody>tr>th,.table-no-borders>tfoot>tr>td,.table-no-borders>tfoot>tr>th,.table-no-borders>thead>tr>td,.table-no-borders>thead>tr>th{border:none;padding:2px}.table-fit{margin-bottom:1.5em;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-fit-block,.table-fit-block>.table,.table-fit-inline-block>.table{width:auto}.table-fit>.dataTables_wrapper>.table,.table-fit>.table{margin-top:0;margin-bottom:0;border:0}.table-fit>.dataTables_wrapper>.table colgroup:first-child+tbody tr:first-child td,.table-fit>.dataTables_wrapper>.table colgroup:first-child+tbody tr:first-child th,.table-fit>.dataTables_wrapper>.table tbody:first-child tr:first-child td,.table-fit>.dataTables_wrapper>.table tbody:first-child tr:first-child th,.table-fit>.table colgroup:first-child+tbody tr:first-child td,.table-fit>.table colgroup:first-child+tbody tr:first-child th,.table-fit>.table tbody:first-child tr:first-child td,.table-fit>.table tbody:first-child tr:first-child th{border-top:0}.table-fit>.dataTables_wrapper>.table tr>td,.table-fit>.dataTables_wrapper>.table tr>th,.table-fit>.table tr>td,.table-fit>.table tr>th{white-space:nowrap}@media (min-width:768px){.table-fit>.dataTables_wrapper>.table tr>td.col-word-break,.table-fit>.dataTables_wrapper>.table tr>th.col-word-break,.table-fit>.table tr>td.col-word-break,.table-fit>.table tr>th.col-word-break{white-space:normal}}.table-fit>.dataTables_wrapper>.table tr>td:first-child,.table-fit>.dataTables_wrapper>.table tr>th:first-child,.table-fit>.table tr>td:first-child,.table-fit>.table tr>th:first-child{border-left:0}.table-fit>.dataTables_wrapper>.table tr>td:last-child,.table-fit>.dataTables_wrapper>.table tr>th:last-child,.table-fit>.table tr>td:last-child,.table-fit>.table tr>th:last-child{border-right:0}.table-fit>.dataTables_wrapper>.table tr:last-child td,.table-fit>.dataTables_wrapper>.table tr:last-child th,.table-fit>.table tr:last-child td,.table-fit>.table tr:last-child th{border-bottom:0}.table-fit-wrap>.table tr>td,.table-fit-wrap>.table tr>th{white-space:normal}#dragIcon,.form-irre-header-cell,.list-tree-group,.nowrap,.t3-flex-section-header-preview,.treeline-icon,.typo3-TCEforms table.typo3-TCEforms-select-checkbox tr td.c-labelCell{white-space:nowrap}.table-fit-inline-block{max-width:100%;width:auto;display:inline-block;margin:0}.table-fit-block{max-width:100%;display:block;margin:0}.table-spacer-wrap{margin-top:10px;margin-bottom:10px}.taskGroup--close .icon-actions-view-list-collapse{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.taskGroup--close td{padding:0!important;border:0!important}.taskGroup--close .t-span{height:0;overflow:hidden;padding:0;line-height:0;display:block}.tooltip-inner{padding:5px 10px}.panel{box-shadow:0 2px 0 rgba(0,0,0,.1)}.panel.ui-sortable-helper{border-style:dashed}.panel .panel-heading{font-weight:700}.panel-carousel{padding:15px}.panel-heading{position:relative}.panel-condensed .panel-heading{padding:5px}.panel-heading-collapse-indicator{position:absolute;left:2px;margin-top:-2px;top:50%}.panel-collapsed .panel-heading .caret{-webkit-transition:all .25s ease-in-out;transition:all .25s ease-in-out;-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.panel-collapsed .panel-collapse{display:none;visibility:hidden}.panel-collapse>.alert,.panel>.alert{border:none;border-top:1px solid #ccc;margin:0;padding:9px 12px}.panel-collapse>.form-section,.panel-collapse>.tab-content>.form-section,.panel-collapse>.tab-content>.tab-pane>.form-section,.panel>.form-section,.panel>.tab-content>.form-section,.panel>.tab-content>.tab-pane>.form-section{border-left:0;border-right:0;border-bottom:0}.panel-collapse>.nav-tabs,.panel>.nav-tabs{border-top:1px solid #ccc;padding-top:8px}.panel-collapse>.nav-tabs>li,.panel>.nav-tabs>li{margin-left:-1px}.panel-collapse>.table,.panel-collapse>.table-fit,.panel>.table,.panel>.table-fit{border:0;margin:0}.recordlist .table-fit{margin-bottom:0}.panel-hover .panel-default:hover>.panel-heading{background-color:#e5e5e5}.panel-space{margin:3em 0}.panel-tab{border-radius:0;border:1px solid #ccc;background-color:#fafafa}.popover-content .list-group .list-group-item:last-child,.popover-title{border-bottom:0}.panel-tab+.form-section,.panel-tab+.panel-tab{margin-top:-19px}.tab-pane>.panel-tab:first-child{border-top:none}.panel-lg .panel-body{padding:35px}.panel-lg .panel-footer,.panel-lg .panel-heading{padding:18px 35px}.panel-lg .panel-carousel{padding:35px}.popover{padding:0}.popover-title{font-size:15px;padding:12px 14px}.popover-content p{margin:0}.popover-content .list-group{margin:-9px -14px}.popover-content .list-group .list-group-item{border-radius:0;border-left:0;border-right:0}.popover .close{margin-right:10px;margin-top:10px}.popover.bottom .arrow:after{border-bottom-color:#f7f7f7}.popover.no-title .arrow:after{border-bottom-color:#fff}.typo3-TCEforms{width:100%}.t3-form-field-container{display:block}.typo3-TCEforms .typo3-csh-link{margin-left:5px}.t3-flex-section,.t3-form-field-container-flexsections,.t3-form-flex{margin:5px 0;clear:both}.t3-form-field-container-inline-placeHolder .t3-form-field-header-inline>span{display:none}.sortableHandle{cursor:move}.t3-form-field-header-flexsection{width:100%;height:16px}.t3-form-field-add-flexsection{border-top:1px solid #cdcdcd;padding:10px 5px 5px 0}.c-inputButton,.c-inputButton:hover,.typo3-TCEforms table#typo3-altdoc-header input:hover,table#typo3-altdoc-header input{border:0;background:0 0}.t3-flex-section-content,.t3-form-field-record-flexsection{background:#eee;padding:5px 0}.t3-flex-section-content>div,.t3-form-field-record-flexsection>div{margin:0 10px}.t3-flex-section-header-preview{width:100px;display:inline-block;padding-left:10px;overflow:hidden;text-overflow:ellipsis}img.t3-tceforms-sysfile-imagepreview{float:left;margin-right:10px;margin-bottom:10px}* html div#typo3-docbody .typo3-TCEforms{margin-top:20px}.typo3-TCEforms img[src*="clear.gif"]{z-index:0}.t3-tceforms-input-wrapper-datetime .t3-icon-edit-pick-date{top:-4px}.typo3-TCEforms span.typo3-TCEforms-newToken{color:#900;font-weight:700}.typo3-TCEforms span.typo3-TCEforms-helpText{background:0 0;color:#fff}table.typo3-TCEforms-select-checkbox{background-color:#fff;border:1px solid #aaa}.t3-form-original-language,.t3-form-original-language-diff{border:1px solid silver;font-size:.9em;margin-top:4px}.typo3-TCEforms table.typo3-TCEforms-select-checkbox tr.c-header td{background-color:#fff;font-weight:700}.typo3-TCEforms table.typo3-TCEforms-select-checkbox tr:nth-child(2n){background-color:#f7f7f7}.typo3-TCEforms table.typo3-TCEforms-select-checkbox tr.c-selectedItem{background-color:#d8ecd0}.typo3-TCEforms table.typo3-TCEforms-select-checkbox tr.c-invalidItem{color:#ddd}.typo3-TCEforms table.typo3-TCEforms-select-checkbox tr:hover{background-color:#dedede}.typo3-TCEforms table.typo3-TCEforms-select-checkbox tr.c-selectedItem:hover{background-color:#abd99a}.typo3-TCEforms table.typo3-TCEforms-select-checkbox tr.c-invalidItem:hover{background-color:transparent}.form-field-inputlink-explanation{background:#eee}.t3-form-original-language{background-color:#dadada;padding:2px}.t3-form-original-language-diffheader{background-color:#c83c3c;font-weight:700;padding:2px}.t3-form-original-language-diffheader[href]:focus,.t3-form-original-language-diffheader[href]:hover{background-color:#a32e2e}.t3-form-original-language-diffcontent{padding:2px}.t3-form-original-language .icon{margin-right:5px}.typo3-TCEforms .typo3-TCEforms-checkboxArray td{padding-right:5px}div.typo3-TCEforms-suggest-choises a{cursor:pointer}div.t3-form-field-container:first-child .t3-form-field-label-flex{border-top:0}.t3-form-field-container-inline-hidden,.t3-form-field-container-inline-placeHolder{opacity:.3}.t3-form-field-header-inline table{vertical-align:top}.t3-tceforms-fieldReadOnly span.t3-icon{position:absolute;right:3px;top:4px}.t3-tceforms-widget-null-wrapper+.t3-form-field-item{display:inline-block}.t3-form-field-disable{display:none}.formengine-field-item.disabled{position:relative}.formengine-field-item.disabled .t3-form-field-disable{z-index:100;background:#fafafa;display:block;position:absolute;width:100%;height:100%;opacity:.5;filter:alpha(opacity=50)}.t3-form-field-eval-null-checkbox{z-index:150}.t3-form-palette-field-label{text-indent:2px}.t3-form-field-item .x-tree input.x-tree-node-cb{height:auto;margin:0 0 0 1px;vertical-align:middle}.t3-form-field-label.t3-form-field-state-changed{color:#004fb0}.icon-list{background:#fff;margin-top:9px;border:1px solid #ccc}.icon-list .row{margin:0}.icon-list .item{float:left;padding:6px;max-width:128px}.icon-list .item img{max-width:128px;max-height:128px}.list-tree,.list-tree ul{margin-left:8px;padding:0;list-style:none;position:relative}.list-tree ul:before,.list-tree:before{content:"";display:block;width:0;position:absolute;top:0;bottom:11px;left:0;margin-bottom:-2px;border-left:1px dotted #666}.list-tree li{margin:0;padding-left:16px;line-height:21px;position:relative}.list-tree li .icon,.treeline-icon{margin-right:2px}.list-tree li.active>.list-tree-group:before,.list-tree li:before{position:absolute;display:block;content:''}.list-tree li.active>.list-tree-group:before{right:-6px;left:-6px;top:-1px;bottom:-1px;border:1px solid rgba(0,0,0,.25);background-color:rgba(255,255,255,.75);border-radius:2px}.list-tree li:before{width:9px;height:0;border-top:1px dotted #666;margin-top:-2px;top:12px;left:2px}.list-tree li:last-child:before{background:#fff;height:auto;left:0;width:11px;bottom:0}.list-tree-control,.list-tree-show{position:relative;width:20px;text-align:center}.list-tree-group{position:relative;display:block}.list-tree-group>span{position:relative}.list-tree-value{font-weight:700}.list-tree-icon{top:-2px}.list-tree-show{display:inline-block;margin-left:-2px}.list-tree-control{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:block;float:left;margin-top:1px;margin-left:-26px;line-height:20px;height:20px}.list-tree-control:before{content:'';position:absolute;top:50%;left:50%;margin-top:-6px;margin-left:-6px;width:12px;height:12px}.list-tree-control:active,.list-tree-control:focus,.list-tree-control:hover{outline:0;text-decoration:none}.list-tree-control>.fa{display:inline-block;text-align:center;cursor:pointer}.list-tree-control>.fa:before{width:12px;height:12px;background-color:#fff;display:block}.list-tree-root:before,.list-tree-root>li:before{display:none}.list-tree-control.list-tree-control-open>.fa:before{content:"\f0d7"}.list-tree-control.list-tree-control-closed>.fa:before{content:"\f0da"}.list-tree-root{margin-left:0}.list-tree-root>li{padding-left:20px}.list-tree-root>li.list-tree-path,.list-tree-root>li>.list-tree-group>.list-tree-control{margin-left:-20px}.list-tree-root>li>.list-tree-group>.list-tree-control:before{background-color:transparent}.list-tree-root-clean>li{padding-left:0}[id=imp-exp-mod] .list-tree li:last-child:before,[id=imp-exp-mod] .list-tree-control>.fa:before{background-color:#f1f1f1}[id=ext-backend-Modules-FileSystemNavigationFrame-index-php] .list-tree li:last-child:before,[id=ext-backend-Modules-FileSystemNavigationFrame-index-php] .list-tree-control>.fa:before{background-color:#f5f5f5}[id=ext-backend-Modules-FileSystemNavigationFrame-index-php] .module-body{padding-left:10px;padding-right:10px}[id=ext-lowlevel-Modules-Configuration-index-php] .active>.list-tree-group{display:inline-block;color:#c83c3c}.treeline-icon{position:relative;display:inline-block;margin-top:-6px;margin-bottom:-6px;padding:0;height:31px;width:16px;overflow:hidden;vertical-align:top}.treeline-icon:after,.treeline-icon:before{position:absolute;content:'';left:50%}.treeline-icon:before{top:0;height:100%;width:2px;margin-left:-1px;border-left:1px dotted #666}.treeline-icon:after{border-top:1px dotted #666;height:2px;width:100%;top:50%;margin-top:-1px}.treeline-icon-jointop:before{top:50%}.treeline-icon-joinbottom:before{top:-50%}.treeline-icon-blank,.treeline-icon-clear:after,.treeline-icon-clear:before,.treeline-icon-line:after{display:none}#typo3-pagetree #typo3-docheader div.buttonsright{margin-right:3px}body#typo3-alt-db-navframe-php div.c-notice{border:1px solid #000;margin-top:5px;margin-bottom:10px;padding:5px;width:95%}body#typo3-pagetree{margin:0;padding:0}#typo3-pagetree #typo3-inner-docbody{padding:10px 0}span.dragIcon{display:inline-block;height:16px}#dragIcon{position:absolute;visibility:hidden;z-index:20;filter:alpha(opacity=50);opacity:.5}#typo3-pagetree-deletionDropZone .x-panel-body{background-position:right;background-repeat:repeat-y}[id=ext-backend-Modules-FileSystemNavigationFrame-index-php],[id=ext-backend-Modules-FileSystemNavigationFrame-index-php] .module-body,[id=typo3-pagetree-treeContainer]{background-color:#f5f5f5;height:100%}[id=typo3-pagetree-tree]{height:100%}[id=typo3-pagetree-tree] .x-panel-body{height:100%!important}[id=ext-backend-Modules-FileSystemNavigationFrame-index-php] .module-docheader{padding-left:10px;padding-right:10px}.x-layout-split{width:1px;background-color:#c3c3c3}[id=InfoModuleController] a.btn-default{margin-right:5px}[id=InfoModuleController] a.t3js-contextmenutrigger{margin-right:4px}.ui-block{text-align:center;padding-top:200px;position:absolute;z-index:3000;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.3)}.pagination .t3-icon{margin:0}.pagination .paginator-input{display:inline-block;width:auto;margin:-6px 0}.label-block,.pagination-block{display:block}.fieldSelectBox .table-scrollable{overflow:auto;max-height:210px}.fieldSelectBox table .col-title{padding:0 6px}.fieldSelectBox table .label-block{line-height:32px;height:32px}.label-block,.label-inline{margin:0;font-weight:400}.label-space-left{margin-left:1em}.label-space-right{margin-right:1em}.badge-info{background-color:#6daae0}.badge-info[href]:focus,.badge-info[href]:hover{background-color:#4392d7}.badge-success{background-color:#79a548}.badge-success[href]:focus,.badge-success[href]:hover{background-color:#5f8139}.badge-warning{background-color:#e8a33d}.badge-warning[href]:focus,.badge-warning[href]:hover{background-color:#d88b1a}.badge-danger{background-color:#c83c3c}.badge-danger[href]:focus,.badge-danger[href]:hover{background-color:#a32e2e}.btn-group-sm>.btn,.btn-sm{height:26px}.btn-group{font-size:0}.btn-group .collapse+.btn.collapsed:last-child{border-radius:2px}.btn-group .btn-default.disabled{color:#999}.dropzone,.dropzone-close{cursor:pointer;color:#333}.btn-checkbox input[type=checkbox],.btn-checkbox input[type=radio],.btn-radio input[type=checkbox],.btn-radio input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-checkbox .fa:before,.btn-radio .fa:before{content:"\f096"}.btn-checkbox input[type=checkbox]:checked+.fa:before,.btn-checkbox input[type=radio]:checked+.fa:before,.btn-radio input[type=checkbox]:checked+.fa:before,.btn-radio input[type=radio]:checked+.fa:before{content:"\f00c"}.dropzone{position:relative;margin:15px 0;padding:1.25em 46px 1.25em 1.25em;border:1px dashed #ccc;-webkit-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.dropzone:hover{border-color:#999}.dropzone-mask{position:absolute;left:0;right:0;bottom:0;top:0}.dropzone-close{position:absolute;top:5px;right:5px;height:26px;width:26px;font-family:FontAwesome;font-size:14px;line-height:26px;text-align:center;-webkit-transform:translate(0,0);transform:translate(0,0);overflow:hidden;background-color:#eaeaea}.dropzone-close:hover{color:#fff;background-color:#c83c3c}.dropzone-close:before{content:"\f00d"}.dropzone-hint{display:table}.dropzone-hint-body,.dropzone-hint-media{display:table-cell;vertical-align:middle}.dropzone-hint-body :first-child{margin-top:0}.dropzone-hint-body :last-child{margin-bottom:0}.dropzone-hint-media{padding-right:1em}.dropzone-hint-icon{height:40px;width:40px;text-align:center;line-height:40px;font-size:16px;background-color:#eee;border-radius:50%;font-family:FontAwesome;-webkit-transform:translate(0,0);transform:translate(0,0)}.dropzone-hint-icon:before{content:"\f093"}.dropzone-hint-title{font-size:12px;font-weight:700;margin-bottom:.25em}.drop-status-ok .dropzone-hint-icon{color:#fff;background:#79a548}.drop-in-progress .dropzone-hint-icon:before{content:"\f063"}.upload-queue{margin:15px 0}.upload-queue-progress{position:relative;padding:5px;color:#fff;background-color:#999;border:1px solid rgba(0,0,0,.15);text-align:right}.upload-queue-progress-bar{position:absolute;z-index:1;top:0;left:0;bottom:0;background-color:#79a548}.upload-queue-progress-message,.upload-queue-progress-percentage{display:inline;position:relative;z-index:2}.t3-icon,.t3-icon .c-inputButton{display:inline-block;height:16px;width:16px}.upload-file-picker{position:fixed;bottom:0;right:0;height:1px;width:1px;visibility:hidden}.uploading .upload-queue-progress-bar{background-color:#6daae0}.error .upload-queue-progress-bar{background-color:#c83c3c}.t3-icon{position:relative;vertical-align:middle;background-image:url(../../../../backend/Resources/Public/Icons/icon_fatalerror.gif);background-repeat:no-repeat;margin-right:2px;text-align:center}.t3-icon.fa{background:0 0;font-size:14px}.btn-login.active,.btn-login:active,.open>.btn-login.dropdown-toggle,.t3-icon-empty{background-image:none}.t3-icon-overlay{display:block;position:absolute;left:0;top:0;width:16px;height:16px;text-decoration:none;padding:0}.typo3-login{background-color:#eee;background-repeat:no-repeat;background-size:cover;background-position:center center;display:table;position:absolute;top:0;left:0;padding:10px;width:100%;min-height:100%;height:100%}.typo3-login-container{display:table-cell;vertical-align:middle}.typo3-login-wrap{max-width:360px;margin:0 auto}.typo3-login-links{padding-top:inherit;margin-top:20px;margin-bottom:20px}.typo3-login-links .disabled{cursor:not-allowed!important;text-decoration:none!important;color:#737373!important}.typo3-login-links .disabled span{cursor:inherit}.t3-btn,a span{cursor:pointer}.typo3-login-logo{margin-bottom:30px}.typo3-login-logo>img{display:block;max-width:100%;height:auto;margin:0 auto}.typo3-login-news-heading{font-size:14px;line-height:1.3em;margin-top:0}.panel-login{border-color:#d5d4d4;border-radius:5px}.panel-login .panel-heading{border-top-right-radius:4px;border-top-left-radius:4px}.panel-login .panel-body{border-bottom:3px solid #f80}.panel-login .panel-footer{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-login,.input-login{padding:12px;font-size:12px;border-radius:2px}.panel-login a{font-weight:700}@media (max-width:767px){.panel-login{margin-bottom:0}}.input-login{height:41.2px;line-height:1.3333333;border-color:#ccc}select.input-login{height:41.2px;line-height:41.2px}select[multiple].input-login,textarea.input-login{height:auto}.input-login:focus{box-shadow:none}.btn-login{color:#fff;background-color:#f80;border-color:rgba(0,0,0,.1);line-height:1.3em}.btn-login.active,.btn-login.focus,.btn-login:active,.btn-login:focus,.btn-login:hover,.open>.btn-login.dropdown-toggle{color:#fff;background-color:#cc6d00;border-color:rgba(0,0,0,.1)}.btn-login.active.focus,.btn-login.active:focus,.btn-login.active:hover,.btn-login:active.focus,.btn-login:active:focus,.btn-login:active:hover,.open>.btn-login.dropdown-toggle.focus,.open>.btn-login.dropdown-toggle:focus,.open>.btn-login.dropdown-toggle:hover{color:#fff;background-color:#a85a00;border-color:rgba(0,0,0,.1)}.btn-login.disabled.focus,.btn-login.disabled:focus,.btn-login.disabled:hover,.btn-login[disabled].focus,.btn-login[disabled]:focus,.btn-login[disabled]:hover,fieldset[disabled] .btn-login.focus,fieldset[disabled] .btn-login:focus,fieldset[disabled] .btn-login:hover{background-color:#f80;border-color:rgba(0,0,0,.1)}.btn-login .badge{color:#f80;background-color:#fff}.btn-login:active,.btn-login:active:focus,.btn-login:active:hover,.btn-login:focus,.btn-login:hover,.btn-login:visited{background-color:#f80}.btn-login:active:focus,.btn-login:focus{outline:0}.btn-login:hover{box-shadow:inset 0 0 100px rgba(0,0,0,.125)}.btn-login:active:focus,.btn-login:active:hover{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-login:focus{box-shadow:none}.typo3-login-carousel-control{top:50%;margin-top:-30px;height:60px;line-height:60px;width:10px;background-color:#fff;text-align:center;position:absolute;opacity:.25;-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.typo3-login-carousel-control:hover{opacity:1}.typo3-login-carousel-control.left{left:-10px;border:1px solid #d5d4d4;border-right:0;border-radius:2px 0 0 2px}.typo3-login-carousel-control.right{right:-10px;border:1px solid #d5d4d4;border-left:0;border-radius:0 2px 2px 0}@media (min-width:768px){.typo3-login-carousel-control{width:20px}.typo3-login-carousel-control.left{left:-20px}.typo3-login-carousel-control.right{right:-20px}}.typo3-login-copyright-link>img{float:right;margin-top:-4px}.typo3-login-copyright-text{margin-top:18px;color:#444}.typo3-login-copyright-text .fa{font-size:13px}.typo3-login-copyright-text>:first-child{margin-top:0}.typo3-login-copyright-text>:last-child{margin-bottom:0}div.typo3-noDoc{margin-left:10px;margin-top:5px;width:740px}div.typo3-noDoc h2{width:740px}div.typo3-fullDoc{height:100%;width:100%}div#typo3-docbody{position:absolute;top:49px;bottom:0;overflow:auto;width:100%;z-index:2}[id=typo3-inner-docbody]{padding:24px;margin-top:0;-webkit-transition:border .2s ease;transition:border .2s ease}body#typo3-show-item-php{padding:12px 24px}h1{font-family:Share,Verdana,Arial,Helvetica,sans-serif;font-variant:normal;font-weight:400;margin-top:0;margin-bottom:22px}.t3-overview-list dt,a.typo3-goBack,div.warningbox{font-weight:700}h2,h3{margin:24px 0 12px}blockquote,ol,ul{margin-bottom:9px}ol,ul{padding-left:3em}pre{margin:0}div.hr,hr{background:0 0;border:none;height:1px}.divider{padding-bottom:12px}li.divider{padding:0}video{background-color:#000}img.absmiddle{vertical-align:middle}.smallCheckboxes{height:12px;margin:0;width:12px}.alignToInputText,.alignToInputText:hover{margin-top:5px;margin-right:2px;vertical-align:top}tr:hover .t3-page-ce a,tr:hover .x-tree a{text-decoration:none}a.t3-link,table.warningbox td a{text-decoration:underline}.typo3-app-icon{position:relative;display:inline-block;padding:0;height:32px;width:32px;overflow:hidden;border-radius:2px;background-color:#484848;vertical-align:middle;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.typo3-app-icon>span{display:table;height:100%;width:100%}.typo3-app-icon>span>span{display:table-cell;text-align:center;vertical-align:middle}.typo3-app-icon img{max-height:32px;max-width:32px;margin:0 auto}.typo3-app-icon .fa{font-size:21px;vertical-align:middle}.typo3-app-icon:after{position:absolute;content:'';display:block;top:0;left:0;right:0;bottom:0;border:1px solid rgba(255,255,255,.1);border-radius:2px}.section{margin-bottom:15px}.diff-r{color:red}div.diff-r{background-color:red;color:#000}.diff-g{color:green}div.diff-g{background-color:green;color:#000}div.warningbox,table.warningbox{border:2px solid #000;background-color:#ff0}div.diff-g,div.diff-r{padding:3px}.c-na{color:#666}.not-found a{color:#ccc}.has-change .checkbox,.has-change .checkbox-inline,.has-change .control-label,.has-change .form-control-feedback,.has-change .help-block,.has-change .radio,.has-change .radio-inline,.has-change.checkbox label,.has-change.checkbox-inline label,.has-change.radio label,.has-change.radio-inline label{color:#6daae0}table.warningbox{margin:20px 0}table.warningbox td{padding:20px;font-weight:700}div.warningbox{margin:10px 0;padding:10px}span.warningboxheader{margin-left:5px}.media-gallery__list .media-gallery__item{display:inline-block;float:none;margin-bottom:15px;margin-right:-4px;vertical-align:top}.grideditor td,.input-group-icon,a.typo3-goBack img,span.typo3-moduleHeader img{vertical-align:middle}.media-gallery__list .media-gallery__item .media-object{max-height:158px;overflow:hidden}.media-gallery__list .media-gallery__item img.thumbnail{height:auto;margin-bottom:0;max-height:150px;max-width:100%}.grideditor div#editor,.grideditor td.editor_cell{height:100%}.media-gallery__list .media-gallery__item span.thumbnail{display:inline-block;margin-bottom:0}.grideditor table.editor{border:0;border-left:1px #d7d7d7 solid;border-top:1px #d7d7d7 solid}.grideditor table.editor td{vertical-align:middle;border:0;border-bottom:1px #d7d7d7 solid;border-right:1px #d7d7d7 solid;text-align:center;background-color:#fff;min-height:100px}.grideditor div.cell_container{width:80px;height:80px;position:relative;left:50%;margin-top:30px;margin-left:-30px;opacity:.3}.grideditor div.cell_container:hover{opacity:.5}.grideditor .grideditor-preview{margin-top:5px}.grideditor .link{display:block;position:absolute;width:20px;height:40px;overflow:hidden;opacity:.5}.form-control-holder,.form-group .t3js-formengine-field-item{position:relative}.grideditor .link:hover{text-decoration:none;opacity:1}.grideditor .link_expand_down,.grideditor .link_shrink_up{width:40px;height:20px}.grideditor .link_expand_right{left:52px;top:0}.grideditor .link_expand_right:before{font-family:FontAwesome;content:"";font-size:42px;line-height:42px}.grideditor .link_shrink_left{left:-8px;top:0}.grideditor .link_shrink_left:before{font-family:FontAwesome;content:"";font-size:42px;line-height:42px}.grideditor .link_expand_down{left:12px;top:40px}.grideditor .link_expand_down:before{font-family:FontAwesome;content:"";font-size:42px;line-height:19px}.grideditor .link_shrink_up{left:12px;top:-20px}.grideditor .link_shrink_up:before{font-family:FontAwesome;content:"";font-size:42px;line-height:20px}.grideditor .link_editor{width:40px;height:40px;left:12px;top:0}.grideditor .link_editor:before{font-family:FontAwesome;content:"ï…‹";font-size:42px;line-height:42px}::-ms-clear{display:none}#typo3-docbody form{margin-bottom:1.25em}a.typo3-goBack img{margin-right:5px}span.typo3-moduleHeader img{margin-right:4px}.has-change .form-control{border-color:#6daae0;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-change .form-control:focus{border-color:#4392d7;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c1dbf2}.has-change .input-group-addon{color:#6daae0;border-color:#6daae0;background-color:#ebf3fb}.has-change .thumbnail-status{border:1px solid #6daae0}.input-group-icon{width:32px}.input-group-icon img{width:100%;max-height:18px}.input-group-addon{min-width:2.5em}label .icon img{pointer-events:none}.form-control{min-width:120px}.form-control-adapt{width:auto;max-width:100%}.form-control-wrap{margin:9px 0}.row>.form-group>.form-control-wrap{margin-bottom:0}.form-group .t3js-formengine-field-item>.t3js-charcounter{left:0;position:absolute;top:100%}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{color:#737373}.form-control-icon{position:absolute;top:50%;left:15px;-webkit-transform:translate(0,-50%);transform:translate(0,-50%);z-index:1}.form-control-icon+.form-control,.form-control-icon+.form-control-clearable .form-control{padding-left:3.25em}.form-group.has-error label:before{font-family:FontAwesome;font-size:12px;text-align:center;content:"ïª";color:#c83c3c;display:inline-block}.form-group.has-error .btn-toolbar label:before,.form-group.has-error .input-group-btn label:before{font-family:inherit;font-size:inherit;margin-right:inherit;text-align:inherit;content:'';display:block}.form-group.has-error .btn-toolbar label:before{color:inherit}.form-group.has-error .input-group-btn label{border-color:#c83c3c}.form-group.has-error .input-group-btn label .t3-icon{color:#c83c3c}.form-group.has-error .input-group-btn label:before{color:inherit}select.form-control[multiple],select.form-control[size]{min-height:156px;width:100%!important}select.form-control[size="1"]{height:32px;min-height:0}select.form-control:not([size]),select.form-control[size="1"]{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:not([size])::-ms-expand,select.form-control[size="1"]::-ms-expand{display:none}select.form-control:not([size]):not(.form-select-no-siblings),select.form-control[size="1"]:not(.form-select-no-siblings){background-image:url(../../../../../../typo3/sysext/core/Resources/Public/Icons/T3Icons/actions/actions-view-list-expand.svg);background-position:right 4px center;background-repeat:no-repeat;background-size:16px 16px;padding-right:24px}.form-group-sm select.form-control:not([size]),.form-group-sm select.form-control[size="1"],.input-group-sm>.input-group-btn>select.form-control.btn:not([size]),.input-group-sm>.input-group-btn>select.form-control[size="1"].btn,.input-group-sm>select.form-control:not([size]),.input-group-sm>select.form-control[size="1"],select.form-control:not([size]).input-sm,select.form-control[size="1"].input-sm{line-height:16px}select.form-control>optgroup{margin-top:9px}select.form-control>optgroup:first-child{margin-top:0}select.form-control option{padding-top:2px;padding-bottom:2px}select.icon-select option{padding-left:22px}.form-control-clearable{position:relative}.form-control-clearable .form-control{padding-right:2.3em}.form-control-clearable .close{position:absolute;height:16px;z-index:3;top:50%;right:.5em;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.form-control-clearable .close .icon{vertical-align:0}.input-group .form-control-clearable{display:table-cell}.input-group .form-control-clearable .form-control{display:block}.form-notice-capslock{position:absolute;right:6px;top:50%;margin-top:-10px;height:20px;width:20px;padding:3px;z-index:10;background-color:#fff}.form-notice-capslock>img{display:block;opacity:.5}.form-inline-spaced{margin:0 -.5em 18px}.form-inline-spaced .form-group{margin:.5em .5em 0}.form-inline-spaced .form-group label{margin-right:.5em}.form-group-dashed+.form-group-dashed{padding-top:15px;border-top:1px dashed #ccc}.form-section{border:1px solid #ccc;background-color:#fafafa;padding:15px 12px 3px}.form-section+.form-section{margin-top:-1px}.tab-pane>.form-section:first-child{border-top:none}.form-section-headline{margin-top:0;margin-bottom:10px}.form-wizards-wrap{display:table;width:100%}.form-wizards-wrap>.form-wizards-element{display:table-cell;width:100%}.form-wizards-wrap>.form-wizards-items-top{display:table-row}.form-wizards-wrap>.form-wizards-items-aside{display:table-cell;vertical-align:top;padding-left:5px;white-space:nowrap}.form-wizards-wrap>.form-wizards-items-bottom{display:table-row}.form-wizards-wrap>.form-wizards-items-bottom:first-child{margin-top:4px}.form-irre-header{display:table;margin:-5px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.form-irre-header-cell{display:table-cell;vertical-align:middle;padding:5px}.form-irre-header-body{width:100%;font-weight:400;white-space:normal}.form-irre-header-body dl{margin-bottom:0}.checkbox-column,.form-multigroup-wrap .form-multigroup-item-wizard,.radio-column{margin-bottom:5px}.form-irre-header-icon{padding-right:0}.form-irre-header-control{cursor:auto}.form-irre-header-control .btn-group>.btn{float:none}.form-multigroup-wrap{width:100%;display:table}.form-multigroup-wrap .form-multigroup-item{display:table-cell;width:50%;vertical-align:top}.form-multigroup-wrap .form-multigroup-item+.form-multigroup-item{padding-left:5px}.form-multigroup-wrap .form-multigroup-item-wizard+select.form-control[multiple],.form-multigroup-wrap .form-multigroup-item-wizard+select.form-control[size]{min-height:125px}.form-multigroup-wrap .form-wizards-wrap{width:100%}.checkbox-row,.radio-row{margin-top:10px;margin-bottom:5px}.checkbox-column>.checkbox,.checkbox-column>.radio,.radio-column>.checkbox,.radio-column>.radio{margin:0}.checkbox-inline.checkbox,.checkbox-inline.radio,.radio-inline.checkbox,.radio-inline.radio{display:block;margin-left:0;margin-right:10px;margin-bottom:10px;padding:0}@media (max-width:767px){.checkbox-inline.checkbox+.checkbox,.checkbox-inline.checkbox+.radio,.checkbox-inline.radio+.checkbox,.checkbox-inline.radio+.radio,.radio-inline.checkbox+.checkbox,.radio-inline.checkbox+.radio,.radio-inline.radio+.checkbox,.radio-inline.radio+.radio{margin-top:-5px}}@media (min-width:768px){.checkbox-inline.checkbox,.checkbox-inline.radio,.radio-inline.checkbox,.radio-inline.radio{display:inline-block;margin-top:10px}.checkbox-inline.checkbox label,.checkbox-inline.radio label,.radio-inline.checkbox label,.radio-inline.radio label{white-space:nowrap}}textarea.formengine-textarea{resize:none}.media-new-content-element-wizard .media-left input{margin-left:2px}.query-builder .form-inline>.form-control-clearable{display:inline}.query-builder .form-group-with-button-addon .input-group{margin-bottom:10px}.query-builder .form-group-with-button-addon .input-group .input-group-addon{padding:0 0 0 1px}.query-builder .form-group-with-button-addon .input-group .input-group-addon .btn-default{border:0}.query-builder .from-control-operator{width:70px;min-width:70px}.t3-grid-table,.t3-page-columns{min-width:100%}.query-builder .action-button-group{margin:10px 0}.query-builder .row-group{margin:10px 0;padding:10px;border-color:#999;box-shadow:0 2px 5px 0 #999}.query-builder .indent{padding-left:20px}.tx_recycler_recycler tr.collapse{display:none}.tx_recycler_recycler tr.collapse.in{display:table-row}.tx_scheduler_mod1 .table td{vertical-align:top}.tx_scheduler_mod1 .table span.name{display:block}.tx_scheduler_mod1 .table span.description{font-style:italic;white-space:normal;color:#737373}.tstemplate-constanteditor .input-group.userTS .input-group-addon.colorbox{display:inline-block;height:100%;position:absolute}.t3-grid-table{border-spacing:10px 0}.t3-grid-container{margin:0 -10px 18px}.t3-grid-cell{background-color:#fafafa;border-bottom:1px solid #cdcdcd}.t3-grid-cell-restricted{background-color:#efc7c7}.t3-grid-cell-unassigned{background:url(../../../../backend/Resources/Public/Images/Backgrounds/layout-not-assigned.png)}.t3-page-column{min-width:150px;max-width:300px}.t3-page-column>h2{margin-top:0}.t3-page-column-header-icons{-webkit-transition:opacity .15s ease-in;transition:opacity .15s ease-in;opacity:.3;position:absolute;right:10px;bottom:5px}.t3-page-column-header{padding:20px 10px 5px;position:relative;background:#fff;border-bottom:1px solid #cdcdcd;color:#999;text-align:left}[data-colpos=unused] .t3-page-column-header{color:#e8a33d;padding-top:60px}.t3-page-column-header a{position:relative}.t3-page-column-header:hover .t3-page-column-header-icons{opacity:1}.t3-page-columns-mode img.c-divider{margin:10px 0 5px}.t3-page-ce,.t3-page-lang-copyce{margin:10px}.t3-page-ce-wrapper{min-height:2em}.t3-page-ce{-webkit-transition:opacity .15s ease-in;transition:opacity .15s ease-in}.t3-page-ce.active-drag{z-index:4500}.t3-page-ce *{border-spacing:0}.t3-page-ce>.t3-page-ce{margin-left:0;margin-right:0}.t3-page-ce .t3-page-ce-body-inner{padding:10px;word-wrap:break-word}.t3-page-ce .t3-page-ce-body-inner img{max-width:100%;height:auto}.t3-page-ce .t3-page-ce-header{-webkit-transition:background .15s ease-in;transition:background .15s ease-in;padding:5px;border:1px solid #ccc;border-bottom:0;border-radius:2px 2px 0 0;background:#eaeaea}.t3-page-ce .t3-page-ce-header-icons-left{float:left}.t3-page-ce .t3-page-ce-header-icons-left>a{display:inline-block;padding:4px}.t3-page-ce .t3-page-ce-header-icons-right{-webkit-transition:opacity .15s ease-in;transition:opacity .15s ease-in;opacity:.3;float:right}.t3-page-ce .t3-page-ce-body{margin-bottom:10px;border:1px solid #ccc;border-top:0;border-radius:0 0 2px 2px;background-color:#fff}.t3-page-ce .t3-page-ce-footer{font-size:11px;padding:5px 10px;background:#fafafa}.t3-page-ce:hover .t3-page-ce-header{background:#d0d0d0}.t3-page-ce:hover .t3-page-ce-body,.t3-page-ce:hover .t3-page-ce-header{border-color:#aaa}.t3-page-ce:hover .t3-page-ce-body{box-shadow:0 1px 0 rgba(0,0,0,.15)}.t3-page-ce:hover .t3-page-ce-header-icons-right{opacity:1}.t3-page-ce-danger:hover .t3-page-ce-header{background-color:#a32e2e;border-color:#a32e2e}.t3-page-ce-danger:hover .t3-page-ce-body{border-color:#a32e2e}.t3-page-ce-danger .t3-page-ce-header{background-color:#c83c3c;border-color:#c83c3c}.t3-page-ce-danger .t3-page-ce-header:hover{background-color:#a32e2e;border-color:#a32e2e}.t3-page-ce-danger .t3-page-ce-body{border-color:#c83c3c}.t3-page-ce-warning:hover .t3-page-ce-header{background-color:#d88b1a;border-color:#d88b1a}.t3-page-ce-warning:hover .t3-page-ce-body{border-color:#d88b1a}.t3-page-ce-warning .t3-page-ce-header{background-color:#e8a33d;border-color:#e8a33d}.t3-page-ce-warning .t3-page-ce-header:hover{background-color:#d88b1a;border-color:#d88b1a}.t3-page-ce-warning .t3-page-ce-body{border-color:#e8a33d}.t3-page-ce-hidden{opacity:.4;-webkit-transition:opacity .15s ease-in;transition:opacity .15s ease-in}.t3-page-ce-hidden:hover{opacity:1}.t3-page-ce-dropzone-available.active{border:1px dashed #e8a33d;border-radius:2px;background-color:#fbefdd;height:27px}.t3-page-ce-dropzone-available.active.t3-page-ce-dropzone-possible{border:1px dashed #79a548;border-radius:2px;background-color:#d1e2bd;margin:-38px 0 -37px;padding:50px 10px;z-index:500;position:relative;opacity:.65}.t3-page-ce-dragitem.dragitem-shadow{opacity:.65;box-shadow:0 1px 24px rgba(0,0,0,.5)}.t3-page-ce.ui-draggable-handle{height:auto!important}.t3-page-ce-dragitem .t3-page-ce-header-draggable:hover{cursor:move}.t3-is-dragged .t3-page-ce-body{max-height:225px;overflow:hidden}.t3-page-ce-dropzone-available.active,.t3-page-ce-dropzone-possible{max-height:225px}#workspace-panel tr.collapsing{-webkit-transition:none;transition:none}#workspace-panel tr.collapse{display:none}#workspace-panel tr.collapse.in{display:table-row}span.item-state-modified{color:#f78f25}span.item-state-moved{color:#457fb8}span.item-state-new{color:#3c9934}span.item-state-hidden{color:#abaaaa}span.item-state-deleted{color:#000;text-decoration:line-through}.legend{margin:5px;height:18px;color:#888}.legend dd,.legend dt{display:inline;overflow:hidden}.legend dd span{display:inline-block;padding:4px}#typo3-debug-console{background-color:#f5f5f5;width:100%;position:absolute;bottom:0;z-index:1000;border:1px solid #b1b1b1}#typo3-debug-console .topbar{background-color:#d7d7d7;padding:6px;border-bottom:1px solid #b1b1b1}#typo3-debug-console .topbar .badge{margin-left:6px}#typo3-debug-console .messages{padding:6px;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;height:250px;overflow:auto}#typo3-debug-console .messages .table{width:auto}#typo3-debug-console .messages p{margin:0}#typo3-debug-console .messages p strong{padding-right:4px}.typo3-dblist-sysnotes{margin-top:15px}.typo3-dblist-sysnotes .panel-sysnote{border:0}.typo3-dblist-sysnotes .panel-sysnote .panel-heading{padding:5px}.typo3-dblist-sysnotes .panel-sysnote .panel-heading .typeicon{padding:4px 4px 12px}.typo3-dblist-sysnotes .panel-sysnote .panel-heading .typeicon .icon{margin-top:5px}.typo3-dblist-sysnotes .panel-sysnote .panel-body h4{margin-top:0}.typo3-dblist-sysnotes .panel-sysnote-category-1{background-color:#ebf3fb;color:#333}.typo3-dblist-sysnotes .panel-sysnote-category-2{background-color:#fbefdd;color:#333}.typo3-dblist-sysnotes .panel-sysnote-category-3{background-color:#f9f9f9;color:#333}.typo3-dblist-sysnotes .panel-sysnote-category-4{background-color:#d1e2bd;color:#333}.typo3-extensionmanager-headerRowLeft{float:left}.typo3-extensionmanager-headerRowRight{float:right}.ui-toolbar{margin-bottom:5px}.ui-toolbar .dataTables_filter{float:left}.dataTables_info{display:none}.dataTables_paginate{float:left;margin:10px 0 0}.uploadForm{background-color:#ededed;border-top:1px solid #cdcdcd;border-bottom:1px solid #cdcdcd;padding:12px;margin-bottom:24px}.uploadForm form .control-group{clear:both;margin-bottom:5px}.uploadForm form label{float:left;height:20px;padding:4px 0;line-height:20px;width:90px}.uploadForm form .control{min-height:20px;padding:4px 0;margin-left:110px}.distribution{border:1px solid #cfcfcf;background-color:#f5f5f5;margin-bottom:20px;margin-left:20px;width:300px;float:left}.distribution:hover{background-color:#ededed}.distribution:hover .distribution-hover{top:0;opacity:1}.distribution:hover .distribution-more{text-decoration:underline}.distribution .typo3-dependency-version{position:absolute;right:0}.distribution-holder{margin-top:1em;bottom:0;margin-left:-20px}.distribution-image{position:relative;width:300px;height:225px;overflow:hidden}.distribution-image img{display:block;height:100%;width:100%}.distribution-hover{background-color:#f5f5f5;position:absolute;top:100%;left:0;width:300px;height:225px;overflow:hidden;opacity:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.distribution-hover-inner{padding:15px}.distribution-meta{border-top:1px solid #dcdbdb;padding:15px}.distribution-meta .distribution-title{margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:14px}.distribution-meta .distribution-install{margin-top:.5em}.distribution-detail{min-width:750px}.distribution-detail-previewpane{float:left;margin-right:30px}.distribution-detail-preview{display:block;border:1px solid #cfcfcf}.distribution-detail-body{overflow:hidden;zoom:1}.distribution-detail-header{margin-bottom:2.5em}.distribution-detail-header h1{margin-bottom:.5em}.distribution-detail-header p{padding:0;max-width:500px;margin-bottom:1.25em}.distribution-detail-summary{margin-top:2.5em;margin-bottom:2.5em}.distribution-installed hr{margin:2.5em 0;border:0;border-top:1px solid #cfcfcf}.ui-widget-header{background:0 0;border:none;font-weight:400}.dataTables_info{font-size:10px;color:#444;float:left}.paging_two_button .ui-button{float:left;cursor:pointer}.paging_full_numbers{float:right}.paging_full_numbers .ui-button{padding:2px 6px;margin:0;cursor:pointer;color:#333!important}.dataTables_paginate{width:auto}.dataTables_paginate .ui-button{margin-right:-.1em!important}.typo3-extension-list .ext-icon{max-height:16px;max-width:16px}.typo3-extension-list tr.installed td{background-color:#c8ffaa}.typo3-extension-list tr.available td{background-color:#e1e1aa}.typo3-extension-list .inactive{color:#aaa}.typo3-extension-list .insecure{color:#ff2262}.typo3-extension-list .insecure a{color:inherit}.typo3-extension-list .outdated{color:#0c08ff}.typo3-extension-list .outdated a{color:inherit}.typo3-extension-list .author{display:none}#extensionUploadForm div.control-group:last-child{margin-bottom:0}.headerTooltip{box-shadow:2px 2px 11px #666;display:none;width:150px;background-color:#ffa;border:1px solid #cc9;padding:3px;font-size:13px;z-index:1000}#terTableWrapper{position:relative;margin-top:1em}#terTableWrapper .splash-receivedata{display:none;position:absolute;top:50px;left:50%;margin:0 0 0 -150px}#typo3-docbody form.download,div.typo3-module-lang table.t3-datatable div.progress{margin-bottom:0}#terTableWrapper .splash-receivedata a{display:inline-block;width:200px;vertical-align:top;padding:3px 20px}#terTableWrapper .splash-receivedata.is-shown{display:block}#terTableWrapper .spinner{display:inline-block}#terTableWrapper .ui-icon{width:16px;height:16px}.time-since-last-update{font-weight:700;padding-right:.4em;cursor:help}.is-loading{opacity:0}.is-hidden{display:none}.typo3-extensionmanager-headerRowLeft,.versions-all{display:inline-block}.versions-all{width:20px;text-indent:-200px;overflow:hidden}.currentVersionInfo{padding:0 0 20px}.currentVersionInfo td{padding:4px 0}.currentVersionInfo th{font-weight:400;color:#8c8c8c;padding:4px 20px 4px 0}span.ter-ext-state{padding:0 0 0 5px;font-weight:700;text-transform:capitalize}.typo3-extensionmanager-headerRowLeft .typo3-extensionmanager-searchTerFieldWrapper{display:inline-block;position:relative}.typo3-extensionmanager-headerRowLeft .typo3-extensionmanager-searchTerFieldWrapper input{height:15px}.typo3-extensionmanager-headerRowLeft .typo3-extensionmanager-searchTerFieldWrapper .t3-icon-input-clear{position:absolute;right:3px;top:4px}div.typo3-module-lang table.t3-datatable{width:100%!important}div.typo3-module-lang table.t3-datatable th.sorting,div.typo3-module-lang table.t3-datatable th.sorting_asc,div.typo3-module-lang table.t3-datatable th.sorting_desc{cursor:pointer}div.typo3-module-lang table.t3-datatable tr>.extensionName{padding-left:0!important}div.typo3-module-lang table.t3-datatable tr>.dt-center{text-align:center}div.typo3-module-lang table.t3-datatable tr.disabled{color:#aaa}div.typo3-module-lang table.t3-datatable tr div.progressBar,div.typo3-module-lang table.t3-datatable tr.disabled a.deactivateLanguageLink,div.typo3-module-lang table.t3-datatable tr.disabled a.removeLanguageLink,div.typo3-module-lang table.t3-datatable tr.disabled a.updateLanguageLink,div.typo3-module-lang table.t3-datatable tr.disabled a.updateTranslationLink,div.typo3-module-lang table.t3-datatable tr.enabled a.activateLanguageLink{display:none}div.typo3-module-lang table.t3-datatable tr div.progressBar .progress{position:relative}div.typo3-module-lang table.t3-datatable tr div.progressBar .progress .progress-text{position:absolute;color:#fff;text-align:center;width:100%;text-shadow:0 0 6px #000}div.typo3-module-lang table.t3-datatable tr.complete div.progressBar,div.typo3-module-lang table.t3-datatable tr.processing div.progressBar{display:inline;cursor:default}div.typo3-module-lang table.t3-datatable td span.complete,div.typo3-module-lang table.t3-datatable td span.loading,div.typo3-module-lang table.t3-datatable td.complete a.removeLanguageLink,div.typo3-module-lang table.t3-datatable td.complete a.updateLanguageLink,div.typo3-module-lang table.t3-datatable td.complete a.updateTranslationLink,div.typo3-module-lang table.t3-datatable td.processing a.removeLanguageLink,div.typo3-module-lang table.t3-datatable td.processing a.updateLanguageLink,div.typo3-module-lang table.t3-datatable td.processing a.updateTranslationLink,div.typo3-module-lang table.t3-datatable tr.complete a.removeLanguageLink,div.typo3-module-lang table.t3-datatable tr.complete a.updateLanguageLink,div.typo3-module-lang table.t3-datatable tr.complete a.updateTranslationLink,div.typo3-module-lang table.t3-datatable tr.processing a.removeLanguageLink,div.typo3-module-lang table.t3-datatable tr.processing a.updateLanguageLink,div.typo3-module-lang table.t3-datatable tr.processing a.updateTranslationLink{display:none}div.typo3-module-lang table.t3-datatable td.actions span{cursor:pointer}div.typo3-module-lang table.t3-datatable td.processing span.loading{display:inline;cursor:default}div.typo3-module-lang table.t3-datatable td.processing span.loading .t3-icon{cursor:default;width:14px;height:14px;margin:0}div.typo3-module-lang table.t3-datatable td.complete span.complete{display:inline}div.typo3-module-lang div.menuItems.processing span.updateItem{display:none}div.typo3-module-lang div.menuItems.processing span.cancelItem,div.typo3-module-lang div.menuItems.processing span.loadingItem{display:inline}div.typo3-module-lang div.menuItems span.cancelItem,div.typo3-module-lang div.menuItems span.loadingItem{display:none}div.typo3-module-lang div.menuItems span.cancelItem .t3-icon,div.typo3-module-lang div.menuItems span.loadingItem .t3-icon{height:14px;width:14px}div.typo3-module-lang div.menuItems span.cancelItem,div.typo3-module-lang div.menuItems span.updateItem{cursor:pointer}div.typo3-module-lang .div.dataTables_filter input{margin-left:3px}div.typo3-module-lang div.progress-bar{background-color:#222}.beuser-legend{margin-bottom:18px}.beuser-legend .pull-left{margin-right:.5em}.beuser-legend td{overflow:hidden}.beuser-legend .t3-icon{margin-right:0}.beuser-legend .number{border:1px solid #000;border-radius:2px;width:16px;height:16px;display:inline-block;text-align:center;margin-right:5px;margin-left:10px;line-height:14px;font-weight:700}.beuser-legend .edge span{width:1px;height:10px;background:#000;display:block;margin-top:8px;margin-left:6px}.beuser-legend .edge span span{width:10px;height:1px;margin-left:1px}.beuser-legend .hr span{width:20px;height:1px;background:#000;display:block;margin-top:-1px;margin-left:-4px}.beuser-legend .vr span{width:1px;height:20px;background:#000;margin-top:-2px;margin-left:6px;display:block}.col-icon img{max-width:28px;max-height:28px}.tx_cshmanual .t3-copyright-notice{font-size:11px;color:#1e1e1e;border-top:1px solid #d7d7d7;padding-top:24px}.tx_cshmanual .t3-copyright-notice>:last-child{margin-bottom:0}.localization-wizard .option,[data-slide=localize-summary] .input-group{margin-bottom:4px}[data-slide=localize-summary] .input-group .form-control{height:auto;font-weight:400}.workspace-info{padding:7px}.workspace-overview td{vertical-align:top}img.c-inputButton,input.c-inputButton{margin-right:2px;vertical-align:middle}table.typo3-dblist tr td.col-icon{vertical-align:middle;width:20px}table.typo3-dblist tr td.col-icon a img.collapseIcon{margin:1px 0 0 2px}table.typo3-dblist tr td.col-title{overflow:hidden;vertical-align:middle;width:350px}table.typo3-dblist tr td.col-title.localization{padding-left:18px}table.typo3-dblist tr td.col-control{width:250px}table.typo3-dblist tr td.col-control-space{width:4px}table.typo3-dblist tr td.col-clipboard{width:74px}table.typo3-dblist-overview{margin-top:10px;margin-left:1px;width:410px}table.typo3-dblist-overview td.c-tableDescription{padding-left:10px}table.typo3-dblist-overview td.c-tableDescription img{margin-right:10px}div#typo3-newRecordLink,div.typo3-localizationLink,div.typo3-newRecordLink,div.typo3-synchronizationLink{display:inline}div#typo3-newRecordLink img,div.typo3-localizationLink img,div.typo3-newRecordLink img,div.typo3-synchronizationLink img{margin-right:5px;vertical-align:middle}input.smallCheckboxes{height:12px;margin:0;padding:0;vertical-align:middle;width:12px}div.typo3-listOptions{margin:0 0 24px}.t3-list-table-header-icon-down{display:inline-block;height:6px;padding:5px 4px;width:9px}.t3-list-table-header-icon-right{display:inline-block;height:8px;padding:4px 5px;width:7px}.db_list-searchbox-toolbar .form-inline{margin-top:-.5em;margin-bottom:0}.typo3-docheader-buttons+.db_list-searchbox-toolbar{box-shadow:0 3px 0 rgba(0,0,0,.15);position:absolute;z-index:999;width:100%}.typo3-docheader-buttons+.db_list-searchbox-toolbar .panel{border-radius:0;border:0;margin:0}.typo3-docheader-buttons+.db_list-searchbox-toolbar .panel-default{background-color:#eee}pre.ts-hl{font-family:"Lucida Console","Lucida Sans Typewriter","Bitsream Vera Sans Mono",monospace}pre.ts-hl .ts-operator{color:#000;font-weight:700}pre.ts-hl .ts-value{color:#c00}pre.ts-hl .ts-objstr{color:#00c}pre.ts-hl .ts-value_copy{color:#060}pre.ts-hl .ts-default,pre.ts-hl .ts-ignored,pre.ts-hl .ts-value_unset{background-color:#6c6}pre.ts-hl .ts-comment{color:#666}pre.ts-hl .ts-condition{background-color:maroon;color:#fff;font-weight:700}pre.ts-hl .ts-error{background-color:#ff0;border:1px dashed red;font-weight:700;color:#000}pre.ts-hl .ts-linenum{background-color:#eee;color:#212424}#typo3-pagetree .workspace-info{background-color:#ffec97;font-weight:700} \ No newline at end of file diff --git a/typo3/sysext/core/Configuration/DefaultConfiguration.php b/typo3/sysext/core/Configuration/DefaultConfiguration.php index 0cb7020a8db927d2cd5bf8b0ad61c3d6f6a04a4f..c801de682e7c3d30ce16b1495f326a4d0a7eaafb 100644 --- a/typo3/sysext/core/Configuration/DefaultConfiguration.php +++ b/typo3/sysext/core/Configuration/DefaultConfiguration.php @@ -1123,6 +1123,9 @@ return [ 'url' => \TYPO3\CMS\Core\Database\SoftReferenceIndex::class, ], ], + 'ext/install' => [ + 'update' => [], + ], ], 'SVCONF' => [] ]; diff --git a/typo3/sysext/core/Documentation/Changelog/master/Feature-81863-MarkWizardsAsDoneInInstallTool.rst b/typo3/sysext/core/Documentation/Changelog/master/Feature-81863-MarkWizardsAsDoneInInstallTool.rst deleted file mode 100644 index 6f8e89765ff0d02629052b35848e6f944645f2c7..0000000000000000000000000000000000000000 --- a/typo3/sysext/core/Documentation/Changelog/master/Feature-81863-MarkWizardsAsDoneInInstallTool.rst +++ /dev/null @@ -1,20 +0,0 @@ -.. include:: ../../Includes.txt - -====================================================== -Feature: #81863 - Mark wizards as done in Install Tool -====================================================== - -See :issue:`81863` - -Description -=========== - -It is now possible to mark an upgrade wizard as "done" in the Install Tool to prevent showing it up as an available wizard. - - -Impact -====== - -A new button "Mark as done" has been added. After clicking the button, the selected upgrade wizard gets marked as "done" and will show up in the "Wizards marked as done" section. - -.. index:: Backend diff --git a/typo3/sysext/core/Documentation/Changelog/master/Important-76084-MoveInstallToolModulesIntoBackendModuleMenu.rst b/typo3/sysext/core/Documentation/Changelog/master/Important-76084-MoveInstallToolModulesIntoBackendModuleMenu.rst new file mode 100644 index 0000000000000000000000000000000000000000..48d54a5b1b7703fb461d15140702c62dc49f0afb --- /dev/null +++ b/typo3/sysext/core/Documentation/Changelog/master/Important-76084-MoveInstallToolModulesIntoBackendModuleMenu.rst @@ -0,0 +1,17 @@ +.. include:: ../../Includes.txt + +====================================================================== +Important: #76084 - Move install tool modules into backend module menu +====================================================================== + +See :issue:`76084` + +Description +=========== + +To get more space in backend context and make the modules more understandable, +the install tool modules have been rearranged and split into four different +main modules. +The new modules are called: Maintenance, Settings, Upgrade and Environment. + +.. index:: Backend \ No newline at end of file diff --git a/typo3/sysext/core/Tests/Acceptance/Backend/Install/InstallModuleCest.php b/typo3/sysext/core/Tests/Acceptance/Backend/Install/InstallModuleCest.php index f100b9b2fa076499ee3c5544b5f14f524e0ed9f6..b6fbff433cac859e383e9a369ef2b68a32380bf9 100644 --- a/typo3/sysext/core/Tests/Acceptance/Backend/Install/InstallModuleCest.php +++ b/typo3/sysext/core/Tests/Acceptance/Backend/Install/InstallModuleCest.php @@ -39,8 +39,8 @@ class InstallModuleCest $I->waitForText('Web Content Management System'); $I->switchToIFrame(); - $I->see('Install'); - $I->click('Install'); + $I->see('Maintenance'); + $I->click('Maintenance'); // switch to content iframe $I->switchToIFrame('list_frame'); @@ -103,12 +103,9 @@ class InstallModuleCest $I->fillField('#t3-install-form-password', $this->password); $I->click('//button[@type="submit"]'); $I->waitForElement('//body[@class="backend"]'); - $I->see('Important actions'); - $I->waitForElement('.t3js-list-group-wrapper'); - $I->see('Logout from Install Tool'); - // can't click the link text - $I->seeElement('//*[@id="menuWrapper"]/div/div/a'); - $I->click('//*[@id="menuWrapper"]/div/div/a[text()="Logout from Install Tool"]'); + $I->see('Lock Install Tool'); + + $I->click('Lock Install Tool'); $I->see('The Install Tool is locked'); } } diff --git a/typo3/sysext/install/Classes/Configuration/FeatureManager.php b/typo3/sysext/install/Classes/Configuration/FeatureManager.php index 7d7bbc264fb8c98029f6f86e31c1353004f7b7dc..7698305953a43c8feb3ca48c3f209af5d7b2af33 100644 --- a/typo3/sysext/install/Classes/Configuration/FeatureManager.php +++ b/typo3/sysext/install/Classes/Configuration/FeatureManager.php @@ -15,6 +15,10 @@ namespace TYPO3\CMS\Install\Configuration; */ use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Install\Configuration\Context\ContextFeature; +use TYPO3\CMS\Install\Configuration\ExtbaseObjectCache\ExtbaseObjectCacheFeature; +use TYPO3\CMS\Install\Configuration\Image\ImageFeature; +use TYPO3\CMS\Install\Configuration\Mail\MailFeature; /** * Instantiate and configure all known features and presets @@ -25,20 +29,20 @@ class FeatureManager * @var array List of feature class names */ protected $featureRegistry = [ - \TYPO3\CMS\Install\Configuration\Context\ContextFeature::class, - \TYPO3\CMS\Install\Configuration\Image\ImageFeature::class, - \TYPO3\CMS\Install\Configuration\ExtbaseObjectCache\ExtbaseObjectCacheFeature::class, - \TYPO3\CMS\Install\Configuration\Mail\MailFeature::class, + ContextFeature::class, + ImageFeature::class, + ExtbaseObjectCacheFeature::class, + MailFeature::class, ]; /** * Get initialized list of features with possible presets * * @param array $postValues List of $POST values - * @return array<FeatureInterface> + * @return FeatureInterface[] * @throws Exception */ - public function getInitializedFeatures(array $postValues) + public function getInitializedFeatures(array $postValues = []) { $features = []; foreach ($this->featureRegistry as $featureClass) { diff --git a/typo3/sysext/install/Classes/Controller/Action/AbstractAction.php b/typo3/sysext/install/Classes/Controller/Action/AbstractAction.php index a8397cf2c806fb5edc7d4cb01a86501444e0c951..dc15e9463da3bc387ed60f2648cf2791596af79e 100644 --- a/typo3/sysext/install/Classes/Controller/Action/AbstractAction.php +++ b/typo3/sysext/install/Classes/Controller/Action/AbstractAction.php @@ -210,30 +210,4 @@ abstract class AbstractAction implements ActionInterface $saltFactory = \TYPO3\CMS\Saltedpasswords\Salt\SaltFactory::getSaltingInstance(null, 'BE'); return $saltFactory->getHashedPassword($password); } - - /** - * Prepare status messages used in extension compatibility view template - * - * @return \TYPO3\CMS\Install\Status\StatusInterface[] - */ - protected function getExtensionCompatibilityTesterMessages() - { - $extensionCompatibilityTesterMessages = []; - - /** @var $message \TYPO3\CMS\Install\Status\StatusInterface */ - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\LoadingStatus::class); - $message->setTitle('Loading...'); - $extensionCompatibilityTesterMessages[] = $message; - - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\ErrorStatus::class); - $message->setTitle('Incompatible extension found!'); - $message->setMessage('Something went wrong and no protocol was written.'); - $extensionCompatibilityTesterMessages[] = $message; - - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\OkStatus::class); - $message->setTitle('All local extensions can be loaded!'); - $extensionCompatibilityTesterMessages[] = $message; - - return $extensionCompatibilityTesterMessages; - } } diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/AbstractAjaxAction.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/AbstractAjaxAction.php index 5ba574c2f78935eca4fd329875f80889cd92e3e9..4e55f369ad975efd699c3a2c8f5951405be93b25 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/AbstractAjaxAction.php +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/AbstractAjaxAction.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Controller\Action\Ajax; /* @@ -14,17 +15,43 @@ namespace TYPO3\CMS\Install\Controller\Action\Ajax; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Install\Controller\Action\AbstractAction; +use TYPO3\CMS\Install\View\JsonView; + /** * General purpose AJAX controller action helper methods and bootstrap */ -abstract class AbstractAjaxAction extends \TYPO3\CMS\Install\Controller\Action\AbstractAction +abstract class AbstractAjaxAction extends AbstractAction { /** - * Handles the action + * @var JsonView + */ + protected $view; + + /** + * @param JsonView $view + */ + public function __construct(JsonView $view = null) + { + $this->view = $view ?: GeneralUtility::makeInstance(JsonView::class); + } + + /** + * AbstractAjaxAction still overwrites $this->view with StandaloneView, which is + * shut off here. + */ + protected function initializeHandle() + { + // Deliberately empty + } + + /** + * Handles the action. * * @return string Rendered content */ - public function handle() + public function handle(): string { $this->initializeHandle(); return json_encode($this->executeAction()); diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/ChangeInstallToolPassword.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/ChangeInstallToolPassword.php new file mode 100644 index 0000000000000000000000000000000000000000..df47cb6d6af224f11ef68dec9850264395bf4789 --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/ChangeInstallToolPassword.php @@ -0,0 +1,65 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Ajax; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Core\Configuration\ConfigurationManager; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Install\Status\ErrorStatus; +use TYPO3\CMS\Install\Status\OkStatus; + +/** + * Change install tool password + */ +class ChangeInstallToolPassword extends AbstractAjaxAction +{ + /** + * Executes the action + * + * @return array Rendered content + */ + protected function executeAction(): array + { + $password = $this->postValues['password']; + $passwordCheck = $this->postValues['passwordCheck']; + $messages = []; + if ($password !== $passwordCheck) { + $message = new ErrorStatus(); + $message->setTitle('Install tool password not changed'); + $message->setMessage('Given passwords do not match.'); + $messages[] = $message; + } elseif (strlen($password) < 8) { + $message = new ErrorStatus(); + $message->setTitle('Install tool password not changed'); + $message->setMessage('Given password must be at least eight characters long.'); + $messages[] = $message; + } else { + $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class); + $configurationManager->setLocalConfigurationValueByPath( + 'BE/installToolPassword', + $this->getHashedPassword($password) + ); + $message = new OkStatus(); + $message->setTitle('Install tool password changed'); + $messages[] = $message; + } + + $this->view->assignMultiple([ + 'success' => true, + 'status' => $messages, + ]); + return $this->view->render(); + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/ClearAllCache.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/ClearAllCache.php index edaeedc400eaf5b9c15e72af2e7e6d2acc849486..39cfdb1ce3ae92222043e6667bc03cba6b49c0a6 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/ClearAllCache.php +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/ClearAllCache.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Controller\Action\Ajax; /* @@ -16,46 +17,23 @@ namespace TYPO3\CMS\Install\Controller\Action\Ajax; use TYPO3\CMS\Core\Service\OpcodeCacheService; use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Install\View\JsonView; +use TYPO3\CMS\Install\Service\ClearCacheService; +use TYPO3\CMS\Install\Status\OkStatus; +use TYPO3\CMS\Install\Status\StatusInterface; /** * Clear Cache * * This is an ajax wrapper for clearing all cache. - * - * @see \TYPO3\CMS\Install\Service\ClearCacheService */ class ClearAllCache extends AbstractAjaxAction { - - /** - * @var \TYPO3\CMS\Install\View\JsonView - */ - protected $view; - - /** - * @param JsonView $view - */ - public function __construct(JsonView $view = null) - { - $this->view = $view ?: GeneralUtility::makeInstance(JsonView::class); - } - - /** - * Initialize the handle action, sets up fluid stuff and assigns default variables. - * @ToDo Refactor View Initialization for all Ajax Controllers - */ - protected function initializeHandle() - { - // empty on purpose because AbstractAjaxAction still overwrites $this->view with StandaloneView - } - /** * Executes the action * * @return array Rendered content */ - protected function executeAction() + protected function executeAction(): array { $statusMessages[] = $this->clearAllCache(); $statusMessages[] = $this->clearOpcodeCache(); @@ -70,14 +48,13 @@ class ClearAllCache extends AbstractAjaxAction /** * Clear all caches * - * @return \TYPO3\CMS\Install\Status\StatusInterface + * @return StatusInterface */ - protected function clearAllCache() + protected function clearAllCache(): StatusInterface { - /** @var \TYPO3\CMS\Install\Service\ClearCacheService $clearCacheService */ - $clearCacheService = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Service\ClearCacheService::class); + $clearCacheService = GeneralUtility::makeInstance(ClearCacheService::class); $clearCacheService->clearAll(); - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\OkStatus::class); + $message = new OkStatus(); $message->setTitle('Successfully cleared all caches'); return $message; } @@ -85,12 +62,12 @@ class ClearAllCache extends AbstractAjaxAction /** * Clear PHP opcode cache * - * @return \TYPO3\CMS\Install\Status\StatusInterface + * @return StatusInterface */ - protected function clearOpcodeCache() + protected function clearOpcodeCache(): StatusInterface { GeneralUtility::makeInstance(OpcodeCacheService::class)->clearAllActive(); - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\OkStatus::class); + $message = new OkStatus(); $message->setTitle('Successfully cleared all available opcode caches'); return $message; } diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/ClearCache.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/ClearCache.php deleted file mode 100644 index 30b7548331728df5c508253daee6eb21f7455bb1..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/ClearCache.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php -namespace TYPO3\CMS\Install\Controller\Action\Ajax; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Core\Utility\GeneralUtility; - -/** - * Clear Cache - * - * This is an ajax wrapper for clearing the cache. Used for example - * after uninstalling an extension via ajax. - * - * @see \TYPO3\CMS\Install\Service\ClearCacheService - */ -class ClearCache extends AbstractAjaxAction -{ - /** - * Executes the action - * - * @return string Rendered content - */ - protected function executeAction() - { - /** @var \TYPO3\CMS\Install\Service\ClearCacheService $clearCacheService */ - $clearCacheService = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Service\ClearCacheService::class); - $clearCacheService->clearAll(); - return 'OK'; - } -} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/ClearTable.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/ClearTable.php new file mode 100644 index 0000000000000000000000000000000000000000..f459823513ed00ca702078c70cd3c29dc09413c9 --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/ClearTable.php @@ -0,0 +1,53 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Ajax; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Install\Service\ClearTableService; +use TYPO3\CMS\Install\Status\OkStatus; + +/** + * Truncate a given table via ClearTableService + */ +class ClearTable extends AbstractAjaxAction +{ + /** + * Executes the action + * + * @return array Rendered content + * @throws \RuntimeException + */ + protected function executeAction(): array + { + if (empty($this->postValues['table'])) { + throw new \RuntimeException( + 'No table name given', + 1501944076 + ); + } + + (new ClearTableService())->clearSelectedTable($this->postValues['table']); + $message = new OkStatus(); + $message->setTitle('Cleared table'); + $messages[] = $message; + + $this->view->assignMultiple([ + 'success' => true, + 'status' => $messages, + ]); + + return $this->view->render(); + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/ClearTypo3tempFiles.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/ClearTypo3tempFiles.php new file mode 100644 index 0000000000000000000000000000000000000000..b20028f821c4e41868b469e1fe2027e7adeb88d9 --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/ClearTypo3tempFiles.php @@ -0,0 +1,59 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Ajax; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Install\Service\Typo3tempFileService; +use TYPO3\CMS\Install\Status\ErrorStatus; +use TYPO3\CMS\Install\Status\OkStatus; + +/** + * Clear Processed Files + * + * This is an ajax wrapper for clearing processed files. + */ +class ClearTypo3tempFiles extends AbstractAjaxAction +{ + /** + * Executes the action + * + * @return array Rendered content + */ + protected function executeAction(): array + { + $typo3tempFileService = new Typo3tempFileService(); + if ($this->postValues['folder'] === '_processed_') { + $failedDeletions = $typo3tempFileService->clearProcessedFiles(); + if ($failedDeletions) { + $message = new ErrorStatus(); + $message->setTitle('Failed to delete ' . $failedDeletions . ' processed files. See TYPO3 log (by default typo3temp/var/logs/typo3_*.log)'); + } else { + $message = new OkStatus(); + $message->setTitle('Cleared processed files'); + } + } else { + $typo3tempFileService->clearAssetsFolder($this->postValues['folder']); + $message = new OkStatus(); + $message->setTitle('Cleared files in "' . $this->postValues['folder'] . '" folder'); + } + $statusMessages[] = $message; + + $this->view->assignMultiple([ + 'success' => true, + 'status' => $statusMessages, + ]); + return $this->view->render(); + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/AbstractCoreUpdate.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateAbstract.php similarity index 75% rename from typo3/sysext/install/Classes/Controller/Action/Ajax/AbstractCoreUpdate.php rename to typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateAbstract.php index 8bd0069c11b576d518e20eb0cff49a33c178ef5b..6a195adcee0695d6f0b2cd6099c0836a74e0fb34 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/AbstractCoreUpdate.php +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateAbstract.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Controller\Action\Ajax; /* @@ -15,6 +16,7 @@ namespace TYPO3\CMS\Install\Controller\Action\Ajax; */ use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Install\Controller\Exception; use TYPO3\CMS\Install\Service\CoreUpdateService; use TYPO3\CMS\Install\Service\CoreVersionService; use TYPO3\CMS\Install\Status\StatusUtility; @@ -24,33 +26,28 @@ use TYPO3\CMS\Install\View\JsonView; * Abstract core update class contains general core update * related methods */ -abstract class AbstractCoreUpdate extends AbstractAjaxAction +abstract class CoreUpdateAbstract extends AbstractAjaxAction { /** - * @var \TYPO3\CMS\Install\View\JsonView - */ - protected $view; - - /** - * @var \TYPO3\CMS\Install\Service\CoreUpdateService + * @var CoreUpdateService */ protected $coreUpdateService; /** - * @var \TYPO3\CMS\Install\Status\StatusUtility + * @var StatusUtility */ protected $statusUtility; /** - * @var \TYPO3\CMS\Install\Service\CoreVersionService + * @var CoreVersionService */ protected $coreVersionService; /** * @param JsonView $view * @param CoreUpdateService $coreUpdateService - * @param \TYPO3\CMS\Install\Status\StatusUtility $statusUtility - * @param \TYPO3\CMS\Install\Service\CoreVersionService $coreVersionService + * @param StatusUtility $statusUtility + * @param CoreVersionService $coreVersionService */ public function __construct( JsonView $view = null, @@ -58,7 +55,7 @@ abstract class AbstractCoreUpdate extends AbstractAjaxAction StatusUtility $statusUtility = null, CoreVersionService $coreVersionService = null) { - $this->view = $view ?: GeneralUtility::makeInstance(JsonView::class); + parent::__construct($view); $this->coreUpdateService = $coreUpdateService ?: GeneralUtility::makeInstance(CoreUpdateService::class); $this->statusUtility = $statusUtility ?: GeneralUtility::makeInstance(StatusUtility::class); $this->coreVersionService = $coreVersionService ?: GeneralUtility::makeInstance(CoreVersionService::class); @@ -67,12 +64,12 @@ abstract class AbstractCoreUpdate extends AbstractAjaxAction /** * Initialize the handle action, sets up fluid stuff and assigns default variables. * - * @throws \TYPO3\CMS\Install\Controller\Exception + * @throws Exception */ protected function initializeHandle() { if (!$this->coreUpdateService->isCoreUpdateEnabled()) { - throw new \TYPO3\CMS\Install\Controller\Exception( + throw new Exception( 'Core Update disabled in this environment', 1381609294 ); @@ -84,14 +81,14 @@ abstract class AbstractCoreUpdate extends AbstractAjaxAction * Find out which version upgrade should be handled. This may * be different depending on whether development or regular release. * - * @throws \TYPO3\CMS\Install\Controller\Exception + * @throws Exception * @return string Version to handle, eg. 6.2.2 */ - protected function getVersionToHandle() + protected function getVersionToHandle(): string { - $getVars = \TYPO3\CMS\Core\Utility\GeneralUtility::_GET('install'); + $getVars = GeneralUtility::_GET('install'); if (!isset($getVars['type'])) { - throw new \TYPO3\CMS\Install\Controller\Exception( + throw new Exception( 'Type must be set to either "regular" or "development"', 1380975303 ); diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateActivate.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateActivate.php index 450d610346f5fd0fbdaebc05897d7f75380fae0e..76e5eb8e023bfc0191eda350b26a82e2c5f9e255 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateActivate.php +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateActivate.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Controller\Action\Ajax; /* @@ -17,19 +18,19 @@ namespace TYPO3\CMS\Install\Controller\Action\Ajax; /** * Activate a downloaded core */ -class CoreUpdateActivate extends AbstractCoreUpdate +class CoreUpdateActivate extends CoreUpdateAbstract { /** * Executes the action * * @return array Rendered content */ - protected function executeAction() + protected function executeAction(): array { $this->view->assignMultiple([ - 'success' => $this->coreUpdateService->activateVersion($this->getVersionToHandle()), - 'status' => $this->coreUpdateService->getMessages(), - ]); + 'success' => $this->coreUpdateService->activateVersion($this->getVersionToHandle()), + 'status' => $this->coreUpdateService->getMessages(), + ]); return $this->view->render(); } } diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateCheckPreConditions.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateCheckPreConditions.php index 03606f7b987123563626f682db2489be2749a61f..7cedc7b6d1ff327b805684ae404e3bea8de74a33 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateCheckPreConditions.php +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateCheckPreConditions.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Controller\Action\Ajax; /* @@ -17,19 +18,19 @@ namespace TYPO3\CMS\Install\Controller\Action\Ajax; /** * Activate a downloaded core */ -class CoreUpdateCheckPreConditions extends AbstractCoreUpdate +class CoreUpdateCheckPreConditions extends CoreUpdateAbstract { /** * Executes the action * * @return array Rendered content */ - protected function executeAction() + protected function executeAction(): array { $this->view->assignMultiple([ - 'success' => $this->coreUpdateService->checkPreConditions($this->getVersionToHandle()), - 'status' => $this->coreUpdateService->getMessages(), - ]); + 'success' => $this->coreUpdateService->checkPreConditions($this->getVersionToHandle()), + 'status' => $this->coreUpdateService->getMessages(), + ]); return $this->view->render(); } } diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateDownload.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateDownload.php index e1aa2bf16bb54af77f209db8739448e887eec3eb..bf356d703fa8f8547a8906313dac9c33f66dd72d 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateDownload.php +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateDownload.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Controller\Action\Ajax; /* @@ -17,19 +18,19 @@ namespace TYPO3\CMS\Install\Controller\Action\Ajax; /** * Download latest core version */ -class CoreUpdateDownload extends AbstractCoreUpdate +class CoreUpdateDownload extends CoreUpdateAbstract { /** * Executes the action * * @return array Rendered content */ - protected function executeAction() + protected function executeAction(): array { $this->view->assignMultiple([ - 'success' => $this->coreUpdateService->downloadVersion($this->getVersionToHandle()), - 'status' => $this->coreUpdateService->getMessages(), - ]); + 'success' => $this->coreUpdateService->downloadVersion($this->getVersionToHandle()), + 'status' => $this->coreUpdateService->getMessages(), + ]); return $this->view->render(); } } diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateIsUpdateAvailable.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateIsUpdateAvailable.php index 7b3a5d748943e6692f6754a4a152a4304be45d24..63c10b9831a8deb8ffeb358df75a6ae0c419fb85 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateIsUpdateAvailable.php +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateIsUpdateAvailable.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Controller\Action\Ajax; /* @@ -15,18 +16,19 @@ namespace TYPO3\CMS\Install\Controller\Action\Ajax; */ use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Install\Status\StatusInterface; /** * Check if a younger version is available */ -class CoreUpdateIsUpdateAvailable extends AbstractCoreUpdate +class CoreUpdateIsUpdateAvailable extends CoreUpdateAbstract { /** * Executes the action * * @return array Rendered content */ - protected function executeAction() + protected function executeAction(): array { $status = []; if ($this->coreVersionService->isInstalledVersionAReleasedVersion()) { @@ -59,7 +61,6 @@ class CoreUpdateIsUpdateAvailable extends AbstractCoreUpdate if (isset($action)) { $this->view->assign('action', $action); } - return $this->view->render(); } @@ -67,15 +68,14 @@ class CoreUpdateIsUpdateAvailable extends AbstractCoreUpdate * @param string $severity * @param string $title * @param string $message - * @return \TYPO3\CMS\Install\Status\StatusInterface + * @return StatusInterface */ - protected function getMessage($severity, $title, $message = '') + protected function getMessage($severity, $title, $message = ''): StatusInterface { - /** @var $statusMessage \TYPO3\CMS\Install\Status\StatusInterface */ + /** @var $statusMessage StatusInterface */ $statusMessage = GeneralUtility::makeInstance('TYPO3\\CMS\\Install\\Status\\' . ucfirst($severity) . 'Status'); $statusMessage->setTitle($title); $statusMessage->setMessage($message); - return $statusMessage; } @@ -84,7 +84,7 @@ class CoreUpdateIsUpdateAvailable extends AbstractCoreUpdate * @param string $action * @return array */ - protected function getAction($title, $action) + protected function getAction($title, $action): array { return [ 'title' => $title, diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateMove.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateMove.php index 5c193e13b2a3a085340b82b7e3c75ace1b313ab5..8657ab62386423224d1d6b21a5219c3cd8190407 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateMove.php +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateMove.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Controller\Action\Ajax; /* @@ -17,19 +18,19 @@ namespace TYPO3\CMS\Install\Controller\Action\Ajax; /** * Move a downloaded core */ -class CoreUpdateMove extends AbstractCoreUpdate +class CoreUpdateMove extends CoreUpdateAbstract { /** * Executes the action * * @return array Rendered content */ - protected function executeAction() + protected function executeAction(): array { $this->view->assignMultiple([ - 'success' => $this->coreUpdateService->moveVersion($this->getVersionToHandle()), - 'status' => $this->coreUpdateService->getMessages(), - ]); + 'success' => $this->coreUpdateService->moveVersion($this->getVersionToHandle()), + 'status' => $this->coreUpdateService->getMessages(), + ]); return $this->view->render(); } } diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateUnpack.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateUnpack.php index 837660cbb4f129fd5ee786bd6fe4cfead9750c8f..b1855a5659976a1919eb65aa6174f26d6a41720e 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateUnpack.php +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateUnpack.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Controller\Action\Ajax; /* @@ -17,7 +18,7 @@ namespace TYPO3\CMS\Install\Controller\Action\Ajax; /** * Unpack a downloaded core */ -class CoreUpdateUnpack extends AbstractCoreUpdate +class CoreUpdateUnpack extends CoreUpdateAbstract { /** * Executes the action @@ -27,9 +28,9 @@ class CoreUpdateUnpack extends AbstractCoreUpdate protected function executeAction() { $this->view->assignMultiple([ - 'success' => $this->coreUpdateService->unpackVersion($this->getVersionToHandle()), - 'status' => $this->coreUpdateService->getMessages(), - ]); + 'success' => $this->coreUpdateService->unpackVersion($this->getVersionToHandle()), + 'status' => $this->coreUpdateService->getMessages(), + ]); return $this->view->render(); } } diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateUpdateVersionMatrix.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateUpdateVersionMatrix.php index bf7301ba74f43306d2b11a950865ab51a75dd6a9..3e95fedb8ab20721c1566d825a99c546eb2f1dac 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateUpdateVersionMatrix.php +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateUpdateVersionMatrix.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Controller\Action\Ajax; /* @@ -17,19 +18,19 @@ namespace TYPO3\CMS\Install\Controller\Action\Ajax; /** * Update version matrix from get.typo3.org */ -class CoreUpdateUpdateVersionMatrix extends AbstractCoreUpdate +class CoreUpdateUpdateVersionMatrix extends CoreUpdateAbstract { /** * Executes the action * * @return array Rendered content */ - protected function executeAction() + protected function executeAction(): array { $this->view->assignMultiple([ - 'success' => $this->coreUpdateService->updateVersionMatrix(), - 'status' => $this->coreUpdateService->getMessages(), - ]); + 'success' => $this->coreUpdateService->updateVersionMatrix(), + 'status' => $this->coreUpdateService->getMessages(), + ]); return $this->view->render(); } } diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateVerifyChecksum.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateVerifyChecksum.php index d659af00f72f5a1fc9a192e43d4a7c29826ee269..10e68b4a5c263d90ae053b1b589a52319138d4c1 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateVerifyChecksum.php +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/CoreUpdateVerifyChecksum.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Controller\Action\Ajax; /* @@ -17,7 +18,7 @@ namespace TYPO3\CMS\Install\Controller\Action\Ajax; /** * Verify checksum of a downloaded core */ -class CoreUpdateVerifyChecksum extends AbstractCoreUpdate +class CoreUpdateVerifyChecksum extends CoreUpdateAbstract { /** * Executes the action @@ -26,12 +27,10 @@ class CoreUpdateVerifyChecksum extends AbstractCoreUpdate */ protected function executeAction() { - $this->view->assignMultiple( - [ - 'success' => $this->coreUpdateService->verifyFileChecksum($this->getVersionToHandle()), - 'status' => $this->coreUpdateService->getMessages(), - ] - ); + $this->view->assignMultiple([ + 'success' => $this->coreUpdateService->verifyFileChecksum($this->getVersionToHandle()), + 'status' => $this->coreUpdateService->getMessages(), + ]); return $this->view->render(); } } diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/CreateAdmin.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/CreateAdmin.php new file mode 100644 index 0000000000000000000000000000000000000000..01fb35efbccd7de543dfd92c84aea00bab5caecf --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/CreateAdmin.php @@ -0,0 +1,90 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Ajax; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Core\Database\ConnectionPool; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Install\Status\ErrorStatus; +use TYPO3\CMS\Install\Status\OkStatus; + +/** + * Create an administrator from given username and password + */ +class CreateAdmin extends AbstractAjaxAction +{ + /** + * Executes the action + * + * @return array Rendered content + * @throws \RuntimeException + */ + protected function executeAction(): array + { + $username = preg_replace('/\\s/i', '', $this->postValues['userName']); + $password = $this->postValues['userPassword']; + $passwordCheck = $this->postValues['userPasswordCheck']; + $messages = []; + if (strlen($username) < 1) { + $message = new ErrorStatus(); + $message->setTitle('Administrator user not created'); + $message->setMessage('No valid username given.'); + $messages[] = $message; + } elseif ($password !== $passwordCheck) { + $message = new ErrorStatus(); + $message->setTitle('Administrator user not created'); + $message->setMessage('Passwords do not match.'); + $messages[] = $message; + } elseif (strlen($password) < 8) { + $message = new ErrorStatus(); + $message->setTitle('Administrator user not created'); + $message->setMessage('Password must be at least eight characters long.'); + $messages[] = $message; + } else { + $connectionPool = GeneralUtility::makeInstance(ConnectionPool::class); + $userExists = $connectionPool->getConnectionForTable('be_users') + ->count( + 'uid', + 'be_users', + ['username' => $username] + ); + if ($userExists) { + $message = new ErrorStatus(); + $message->setTitle('Administrator user not created'); + $message->setMessage('A user with username "' . $username . '" exists already.'); + $messages[] = $message; + } else { + $hashedPassword = $this->getHashedPassword($password); + $adminUserFields = [ + 'username' => $username, + 'password' => $hashedPassword, + 'admin' => 1, + 'tstamp' => $GLOBALS['EXEC_TIME'], + 'crdate' => $GLOBALS['EXEC_TIME'] + ]; + $connectionPool->getConnectionForTable('be_users')->insert('be_users', $adminUserFields); + $message = new OkStatus(); + $message->setTitle('Administrator created with username "' . $username . '".'); + $messages[] = $message; + } + } + + $this->view->assignMultiple([ + 'success' => true, + 'status' => $messages, + ]); + return $this->view->render(); + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/DatabaseAnalyzerAnalyze.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/DatabaseAnalyzerAnalyze.php new file mode 100644 index 0000000000000000000000000000000000000000..fedc12a65c9da04b058847238101deef1b7e7556 --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/DatabaseAnalyzerAnalyze.php @@ -0,0 +1,189 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Ajax; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Core\Database\Schema\Exception\StatementException; +use TYPO3\CMS\Core\Database\Schema\SchemaMigrator; +use TYPO3\CMS\Core\Database\Schema\SqlReader; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Install\Status\ErrorStatus; +use TYPO3\CMS\Install\Status\OkStatus; + +/** + * Execute database analyzer "analyze" / "show" status action + */ +class DatabaseAnalyzerAnalyze extends AbstractAjaxAction +{ + /** + * Executes the action + * + * @return array Rendered content + */ + protected function executeAction(): array + { + $this->loadExtLocalconfDatabaseAndExtTables(); + + $suggestions = []; + try { + $sqlReader = GeneralUtility::makeInstance(SqlReader::class); + $sqlStatements = $sqlReader->getCreateTableStatementArray($sqlReader->getTablesDefinitionString()); + $schemaMigrationService = GeneralUtility::makeInstance(SchemaMigrator::class); + $addCreateChange = $schemaMigrationService->getUpdateSuggestions($sqlStatements); + + // Aggregate the per-connection statements into one flat array + $addCreateChange = array_merge_recursive(...array_values($addCreateChange)); + if (!empty($addCreateChange['create_table'])) { + $suggestion = [ + 'key' => 'addTable', + 'label' => 'Add tables', + 'enabled' => true, + 'children' => [], + ]; + foreach ($addCreateChange['create_table'] as $hash => $statement) { + $suggestion['children'][] = [ + 'hash' => $hash, + 'statement' => $statement, + ]; + } + $suggestions[] = $suggestion; + } + if (!empty($addCreateChange['add'])) { + $suggestion = [ + 'key' => 'addField', + 'label' => 'Add fields to tables', + 'enabled' => true, + 'children' => [], + ]; + foreach ($addCreateChange['add'] as $hash => $statement) { + $suggestion['children'][] = [ + 'hash' => $hash, + 'statement' => $statement, + ]; + } + $suggestions[] = $suggestion; + } + if (!empty($addCreateChange['change'])) { + $suggestion = [ + 'key' => 'change', + 'label' => 'Change fields', + 'enabled' => false, + 'children' => [], + ]; + foreach ($addCreateChange['change'] as $hash => $statement) { + $child = [ + 'hash' => $hash, + 'statement' => $statement, + ]; + if (isset($addCreateChange['change_currentValue'][$hash])) { + $child['current'] = $addCreateChange['change_currentValue'][$hash]; + } + $suggestion['children'][] = $child; + } + $suggestions[] = $suggestion; + } + + // Difference from current to expected + $dropRename = $schemaMigrationService->getUpdateSuggestions($sqlStatements, true); + + // Aggregate the per-connection statements into one flat array + $dropRename = array_merge_recursive(...array_values($dropRename)); + if (!empty($dropRename['change_table'])) { + $suggestion = [ + 'key' => 'renameTableToUnused', + 'label' => 'Remove tables (rename with prefix)', + 'enabled' => false, + 'children' => [], + ]; + foreach ($dropRename['change_table'] as $hash => $statement) { + $child = [ + 'hash' => $hash, + 'statement' => $statement, + ]; + if (!empty($dropRename['tables_count'][$hash])) { + $child['rowCount'] = $dropRename['tables_count'][$hash]; + } + $suggestion['children'][] = $child; + } + $suggestions[] = $suggestion; + } + if (!empty($dropRename['change'])) { + $suggestion = [ + 'key' => 'renameTableFieldToUnused', + 'label' => 'Remove unused fields (rename with prefix)', + 'enabled' => false, + 'children' => [], + ]; + foreach ($dropRename['change'] as $hash => $statement) { + $suggestion['children'][] = [ + 'hash' => $hash, + 'statement' => $statement, + ]; + } + $suggestions[] = $suggestion; + } + if (!empty($dropRename['drop'])) { + $suggestion = [ + 'key' => 'deleteField', + 'label' => 'Drop fields (really!)', + 'enabled' => false, + 'children' => [], + ]; + foreach ($dropRename['drop'] as $hash => $statement) { + $suggestion['children'][] = [ + 'hash' => $hash, + 'statement' => $statement, + ]; + } + $suggestions[] = $suggestion; + } + if (!empty($dropRename['drop_table'])) { + $suggestion = [ + 'key' => 'deleteTable', + 'label' => 'Drop tables (really!)', + 'enabled' => false, + 'children' => [], + ]; + foreach ($dropRename['drop_table'] as $hash => $statement) { + $child = [ + 'hash' => $hash, + 'statement' => $statement, + ]; + if (!empty($dropRename['tables_count'][$hash])) { + $child['rowCount'] = $dropRename['tables_count'][$hash]; + } + $suggestion['children'][] = $child; + } + $suggestions[] = $suggestion; + } + + $message = new OkStatus(); + $message->setTitle('Analyzed current database'); + $messages[] = $message; + } catch (StatementException $e) { + $message = new ErrorStatus(); + $message->setTitle('Database analysis failed'); + $message->setMessage($e->getMessage()); + $messages[] = $message; + } + + $this->view->assignMultiple([ + 'success' => true, + 'status' => $messages, + 'suggestions' => $suggestions, + ]); + return $this->view->render(); + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/DatabaseAnalyzerExecute.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/DatabaseAnalyzerExecute.php new file mode 100644 index 0000000000000000000000000000000000000000..aa4f5f6c7c6c5d1cea8be9c70125acf1991dd405 --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/DatabaseAnalyzerExecute.php @@ -0,0 +1,69 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Ajax; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Core\Database\Schema\SchemaMigrator; +use TYPO3\CMS\Core\Database\Schema\SqlReader; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Install\Status\ErrorStatus; +use TYPO3\CMS\Install\Status\OkStatus; +use TYPO3\CMS\Install\Status\WarningStatus; + +/** + * Execute database analyzer "execute" action to apply + * a set of DB changes. + */ +class DatabaseAnalyzerExecute extends AbstractAjaxAction +{ + /** + * Executes the action + * + * @return array Rendered content + */ + protected function executeAction(): array + { + $this->loadExtLocalconfDatabaseAndExtTables(); + + $messages = []; + if (empty($this->postValues['hashes'])) { + $message = new WarningStatus(); + $message->setTitle('No database changes selected'); + $messages[] = $message; + } else { + $sqlReader = GeneralUtility::makeInstance(SqlReader::class); + $sqlStatements = $sqlReader->getCreateTableStatementArray($sqlReader->getTablesDefinitionString()); + $schemaMigrationService = GeneralUtility::makeInstance(SchemaMigrator::class); + $statementHashesToPerform = array_flip($this->postValues['hashes']); + $results = $schemaMigrationService->migrate($sqlStatements, $statementHashesToPerform); + // Create error flash messages if any + foreach ($results as $errorMessage) { + $message = new ErrorStatus(); + $message->setTitle('Database update failed'); + $message->setMessage('Error: ' . $errorMessage); + $messages[] = $message; + } + $message = new OkStatus(); + $message->setTitle('Executed database updates'); + $messages[] = $message; + } + + $this->view->assignMultiple([ + 'success' => true, + 'status' => $messages, + ]); + return $this->view->render(); + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/DumpAutoload.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/DumpAutoload.php index e43ee7d7595aa5899577e9ea3bc23c1ea44ee37c..66a910f8e7ce0db6ff9f5559f47fbb8f419b63d6 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/DumpAutoload.php +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/DumpAutoload.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Controller\Action\Ajax; /* @@ -16,10 +17,9 @@ namespace TYPO3\CMS\Install\Controller\Action\Ajax; use TYPO3\CMS\Core\Core\Bootstrap; use TYPO3\CMS\Core\Core\ClassLoadingInformation; -use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Install\Status\NoticeStatus; use TYPO3\CMS\Install\Status\OkStatus; -use TYPO3\CMS\Install\View\JsonView; +use TYPO3\CMS\Install\Status\StatusInterface; /** * Ajax wrapper for dumping autoload. @@ -27,47 +27,36 @@ use TYPO3\CMS\Install\View\JsonView; class DumpAutoload extends AbstractAjaxAction { /** - * @var \TYPO3\CMS\Install\View\JsonView - */ - protected $view; - - /** - * @param JsonView $view + * Executes the action + * + * @return array Rendered content */ - public function __construct(JsonView $view = null) + protected function executeAction(): array { - $this->view = $view ?: GeneralUtility::makeInstance(JsonView::class); - } + $statusMessages[] = $this->dumpAutoload(); - /** - * Initialize the handle action, sets up fluid stuff and assigns default variables. - * @ToDo Refactor View Initialization for all Ajax Controllers - */ - protected function initializeHandle() - { - // empty on purpose because AbstractAjaxAction still overwrites $this->view with StandaloneView + $this->view->assignMultiple([ + 'success' => true, + 'status' => $statusMessages, + ]); + return $this->view->render(); } /** - * Executes the action + * Dumps Extension Autoload Information * - * @return array Rendered content + * @return StatusInterface */ - protected function executeAction() + protected function dumpAutoload(): StatusInterface { if (Bootstrap::usesComposerClassLoading()) { - $message = GeneralUtility::makeInstance(NoticeStatus::class); + $message = new NoticeStatus(); $message->setTitle('Skipped generating additional class loading information in composer mode.'); } else { ClassLoadingInformation::dumpClassLoadingInformation(); - $message = GeneralUtility::makeInstance(OkStatus::class); + $message = new OkStatus(); $message->setTitle('Successfully dumped class loading information for extensions.'); } - - $this->view->assignMultiple([ - 'success' => true, - 'status' => [ $message ], - ]); - return $this->view->render(); + return $message; } } diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/EnvironmentStatus.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/EnvironmentCheckGetStatus.php similarity index 66% rename from typo3/sysext/install/Classes/Controller/Action/Ajax/EnvironmentStatus.php rename to typo3/sysext/install/Classes/Controller/Action/Ajax/EnvironmentCheckGetStatus.php index cac98efbe9f8764ca425d064cfe3e3ccbdc5b48a..3c0f7b9d66a87a9599f25da0291eb44fd257e351 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/EnvironmentStatus.php +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/EnvironmentCheckGetStatus.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Controller\Action\Ajax; /* @@ -21,27 +22,27 @@ use TYPO3\CMS\Install\SystemEnvironment\DatabaseCheck; use TYPO3\CMS\Install\SystemEnvironment\SetupCheck; /** - * Environment status check for errors + * Get environment status */ -class EnvironmentStatus extends AbstractAjaxAction +class EnvironmentCheckGetStatus extends AbstractAjaxAction { /** - * Get environment status errors + * Executes the action * - * @return string + * @return array Rendered content */ - protected function executeAction() + protected function executeAction(): array { - // Count of failed checks to be displayed in the left navigation menu $statusObjects = array_merge( GeneralUtility::makeInstance(Check::class)->getStatus(), GeneralUtility::makeInstance(SetupCheck::class)->getStatus(), GeneralUtility::makeInstance(DatabaseCheck::class)->getStatus() ); - /** @var \TYPO3\CMS\Install\Status\StatusUtility $statusUtility */ - $statusUtility = GeneralUtility::makeInstance(StatusUtility::class); - $errors = $statusUtility->filterBySeverity($statusObjects, 'error'); - return count($errors); + $this->view->assignMultiple([ + 'success' => true, + 'status' => (new StatusUtility())->sortBySeverity($statusObjects), + ]); + return $this->view->render(); } } diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/ExtensionCompatibilityTester.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/ExtensionCompatibilityTester.php index 8bb9f0e510d630f9b99fd13d6cf2fe55eee92a8c..81f6da8a2df61b9896127c39dbbf4cd82f0ef396 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/ExtensionCompatibilityTester.php +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/ExtensionCompatibilityTester.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Controller\Action\Ajax; /* @@ -16,6 +17,7 @@ namespace TYPO3\CMS\Install\Controller\Action\Ajax; use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Install\View\JsonView; /** * Load Extensions @@ -51,9 +53,12 @@ class ExtensionCompatibilityTester extends AbstractAjaxAction /** * Construct this class * set default protocol file location + * + * @param JsonView $view */ - public function __construct() + public function __construct(JsonView $view = null) { + parent::__construct($view); $this->protocolFile = PATH_site . 'typo3temp/assets/ExtensionCompatibilityTester.txt'; $this->errorProtocolFile = PATH_site . 'typo3temp/assets/ExtensionCompatibilityTesterErrors.json'; } @@ -63,9 +68,9 @@ class ExtensionCompatibilityTester extends AbstractAjaxAction * setting up the checks (deleting protocol), and returning * OK if process run through without errors * - * @return string "OK" if process ran through without errors + * @return array */ - protected function executeAction() + protected function executeAction(): array { register_shutdown_function([$this, 'logError']); $getVars = GeneralUtility::_GET('install'); @@ -73,7 +78,7 @@ class ExtensionCompatibilityTester extends AbstractAjaxAction $this->deleteProtocolFile(); } $this->tryToLoadExtLocalconfAndExtTablesOfExtensions($this->getExtensionsToLoad()); - return 'OK'; + return ['success' => true]; } /** @@ -96,7 +101,7 @@ class ExtensionCompatibilityTester extends AbstractAjaxAction * * @return array */ - protected function getExtensionsToLoad() + protected function getExtensionsToLoad(): array { $extensionsToLoad = []; $extensionsToExclude = $this->getExtensionsToExclude(); @@ -115,7 +120,7 @@ class ExtensionCompatibilityTester extends AbstractAjaxAction * * @return array */ - protected function getExtensionsToExclude() + protected function getExtensionsToExclude(): array { if (is_file($this->protocolFile)) { $exclude = (string)file_get_contents($this->protocolFile); @@ -152,7 +157,7 @@ class ExtensionCompatibilityTester extends AbstractAjaxAction * the original bootstrap method. * * @param string $extensionKey - * @param \ArrayAccess $extension + * @param array $extension */ protected function loadExtTablesForExtension($extensionKey, array $extension) { @@ -177,7 +182,7 @@ class ExtensionCompatibilityTester extends AbstractAjaxAction * the original bootstrap method. * * @param string $extensionKey - * @param \ArrayAccess $extension + * @param array $extension */ protected function loadExtLocalconfForExtension($extensionKey, array $extension) { diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/ExtensionScannerFiles.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/ExtensionScannerFiles.php index 1a573be33c68a13de4344fa36be4d7cf439cf281..f6c532134771177e3a1052fff5db08b13cfd8700 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/ExtensionScannerFiles.php +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/ExtensionScannerFiles.php @@ -18,42 +18,19 @@ namespace TYPO3\CMS\Install\Controller\Action\Ajax; use Symfony\Component\Finder\Finder; use Symfony\Component\Finder\SplFileInfo; use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Install\View\JsonView; /** * Return a list of files of an extension */ class ExtensionScannerFiles extends AbstractAjaxAction { - /** - * @var JsonView - */ - protected $view; - - /** - * @param JsonView $view - */ - public function __construct(JsonView $view = null) - { - $this->view = $view ?: GeneralUtility::makeInstance(JsonView::class); - } - - /** - * Initialize the handle action, sets up fluid stuff and assigns default variables. - * @ToDo Refactor View Initialization for all Ajax Controllers - */ - protected function initializeHandle() - { - // empty on purpose because AbstractAjaxAction still overwrites $this->view with StandaloneView - } - /** * Get list of files of an extension for extension scanner * - * @return string + * @return array * @throws \RuntimeException */ - protected function executeAction() + protected function executeAction(): array { // Get and validate path $extension = $this->postValues['extension']; diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/ExtensionScannerMarkFullyScannedRestFiles.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/ExtensionScannerMarkFullyScannedRestFiles.php index d198e02ace9e24f97f6013437bc60bdcbe7e954e..6d86966188a57f44d9859575f5f7f1010ca901fd 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/ExtensionScannerMarkFullyScannedRestFiles.php +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/ExtensionScannerMarkFullyScannedRestFiles.php @@ -19,9 +19,7 @@ use Symfony\Component\Finder\Finder; use Symfony\Component\Finder\SplFileInfo; use TYPO3\CMS\Core\Registry; use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; -use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Install\UpgradeAnalysis\DocumentationFile; -use TYPO3\CMS\Install\View\JsonView; /** * Ajax controller, part of "extension scanner". Called at the end of "scan all" @@ -31,34 +29,12 @@ use TYPO3\CMS\Install\View\JsonView; */ class ExtensionScannerMarkFullyScannedRestFiles extends AbstractAjaxAction { - /** - * @var JsonView - */ - protected $view; - - /** - * @param JsonView $view - */ - public function __construct(JsonView $view = null) - { - $this->view = $view ?: GeneralUtility::makeInstance(JsonView::class); - } - - /** - * Initialize the handle action, sets up fluid stuff and assigns default variables. - * @ToDo Refactor View Initialization for all Ajax Controllers - */ - protected function initializeHandle() - { - // empty on purpose because AbstractAjaxAction still overwrites $this->view with StandaloneView - } - /** * Get list of files of an extension for extension scanner * - * @return string + * @return array */ - protected function executeAction() + protected function executeAction(): array { $foundRestFileHashes = (array)$this->postValues['hashes']; diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/ExtensionScannerScanFile.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/ExtensionScannerScanFile.php index 45b4bfaba55255f4bf8d266deccec8cfae87ccbc..afb22fa05a394bfa04691fde3c111064e51bd621 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/ExtensionScannerScanFile.php +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/ExtensionScannerScanFile.php @@ -39,18 +39,12 @@ use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\PropertyProtectedMatcher; use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\PropertyPublicMatcher; use TYPO3\CMS\Install\ExtensionScanner\Php\MatcherFactory; use TYPO3\CMS\Install\UpgradeAnalysis\DocumentationFile; -use TYPO3\CMS\Install\View\JsonView; /** * Scan a single extension file for breaking / deprecated core code usages */ class ExtensionScannerScanFile extends AbstractAjaxAction { - /** - * @var JsonView - */ - protected $view; - /** * @var array Node visitors that implement CodeScannerInterface */ @@ -109,30 +103,13 @@ class ExtensionScannerScanFile extends AbstractAjaxAction ], ]; - /** - * @param JsonView $view - */ - public function __construct(JsonView $view = null) - { - $this->view = $view ?: GeneralUtility::makeInstance(JsonView::class); - } - - /** - * Initialize the handle action, sets up fluid stuff and assigns default variables. - * @ToDo Refactor View Initialization for all Ajax Controllers - */ - protected function initializeHandle() - { - // empty on purpose because AbstractAjaxAction still overwrites $this->view with StandaloneView - } - /** * Find code violations in a single file * - * @return string + * @return array * @throws \RuntimeException */ - protected function executeAction() + protected function executeAction(): array { // Get and validate path and file $extension = $this->postValues['extension']; diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/FilterManager.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/FilterManager.php deleted file mode 100644 index 2ad92ba73d9443e04dac9691464a4b4835a8097f..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/FilterManager.php +++ /dev/null @@ -1,45 +0,0 @@ -<?php -declare(strict_types=1); -namespace TYPO3\CMS\Install\Controller\Action\Ajax; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ -use TYPO3\CMS\Core\Registry; -use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Install\UpgradeAnalysis\DocumentationFile; - -/** - * Reveal documentation files hidden from views - */ -class FilterManager extends AbstractAjaxAction -{ - - /** - * Executes the action - * - * @return string Rendered content - */ - protected function executeAction(): string - { - $registry = new Registry(); - $ignoredFiles = $registry->get('upgradeAnalysisIgnoreFilter', 'ignoredDocumentationFiles', []); - $documentationFileService = GeneralUtility::makeInstance(DocumentationFile::class); - $files = []; - foreach ($ignoredFiles as $filePath) { - $file = current($documentationFileService->getListEntry($filePath)); - $files[$file['headline']] = $file['filepath']; - } - $this->view->assign('files', $files); - return $this->view->render(); - } -} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/FolderStatus.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/FolderStatus.php deleted file mode 100644 index 0ffb062fd0005726a7dc78603c8260d441f50770..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/FolderStatus.php +++ /dev/null @@ -1,51 +0,0 @@ -<?php -namespace TYPO3\CMS\Install\Controller\Action\Ajax; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Core\Utility\GeneralUtility; - -/** - * Folder status check for errors - */ -class FolderStatus extends AbstractAjaxAction -{ - /** - * Get folder status errors - * - * @return string - */ - protected function executeAction() - { - // Count of folder structure errors are displayed in left navigation menu - /** @var $folderStructureFacade \TYPO3\CMS\Install\FolderStructure\StructureFacade */ - $folderStructureFacade = GeneralUtility::makeInstance(\TYPO3\CMS\Install\FolderStructure\DefaultFactory::class)->getStructure(); - $folderStatus = $folderStructureFacade->getStatus(); - - /** @var $permissionCheck \TYPO3\CMS\Install\FolderStructure\DefaultPermissionsCheck */ - $permissionCheck = GeneralUtility::makeInstance(\TYPO3\CMS\Install\FolderStructure\DefaultPermissionsCheck::class); - $folderStatus[] = $permissionCheck->getMaskStatus('fileCreateMask'); - $folderStatus[] = $permissionCheck->getMaskStatus('folderCreateMask'); - - /** @var \TYPO3\CMS\Install\Status\StatusUtility $statusUtility */ - $statusUtility = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\StatusUtility::class); - - $folderStructureErrors = array_merge( - $statusUtility->filterBySeverity($folderStatus, 'error'), - $statusUtility->filterBySeverity($folderStatus, 'warning') - ); - - return count($folderStructureErrors); - } -} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/FolderStructureFix.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/FolderStructureFix.php new file mode 100644 index 0000000000000000000000000000000000000000..0523e2bf4ebaca6ac1c0705e89cc58fea53e9775 --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/FolderStructureFix.php @@ -0,0 +1,43 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Ajax; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Install\FolderStructure\DefaultFactory; + +/** + * Try to fix folder structure errors + */ +class FolderStructureFix extends AbstractAjaxAction +{ + /** + * Executes the action + * + * @return array Rendered content + */ + protected function executeAction(): array + { + $folderStructureFactory = GeneralUtility::makeInstance(DefaultFactory::class); + $structureFacade = $folderStructureFactory->getStructure(); + $fixedStatusObjects = $structureFacade->fix(); + + $this->view->assignMultiple([ + 'success' => true, + 'fixedStatus' => $fixedStatusObjects, + ]); + return $this->view->render(); + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/FolderStructureGetStatus.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/FolderStructureGetStatus.php new file mode 100644 index 0000000000000000000000000000000000000000..139d40dc72eb9e42fee827b7364f272d5cc0f19a --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/FolderStructureGetStatus.php @@ -0,0 +1,57 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Ajax; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Install\FolderStructure\DefaultFactory; +use TYPO3\CMS\Install\Status\StatusUtility; + +/** + * Get folder structure status + */ +class FolderStructureGetStatus extends AbstractAjaxAction +{ + /** + * Executes the action + * + * @return array Rendered content + */ + protected function executeAction(): array + { + $folderStructureFactory = GeneralUtility::makeInstance(DefaultFactory::class); + $structureFacade = $folderStructureFactory->getStructure(); + + $statusObjects = $structureFacade->getStatus(); + $statusUtility = GeneralUtility::makeInstance(StatusUtility::class); + + $errorStatus = array_merge( + $statusUtility->filterBySeverity($statusObjects, 'error'), + $statusUtility->filterBySeverity($statusObjects, 'warning') + ); + $okStatus = array_merge( + $statusUtility->filterBySeverity($statusObjects, 'notice'), + $statusUtility->filterBySeverity($statusObjects, 'information'), + $statusUtility->filterBySeverity($statusObjects, 'ok') + ); + + $this->view->assignMultiple([ + 'success' => true, + 'errorStatus' => $errorStatus, + 'okStatus' => $okStatus, + ]); + return $this->view->render(); + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/ImageProcessing.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/ImageProcessing.php new file mode 100644 index 0000000000000000000000000000000000000000..de65f81a3bda07a45633af65a680ce890c8e9b15 --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/ImageProcessing.php @@ -0,0 +1,724 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Ajax; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Core\Imaging\GraphicalFunctions; +use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Core\Utility\StringUtility; +use TYPO3\CMS\Install\Status\ErrorStatus; +use TYPO3\CMS\Install\Status\InfoStatus; +use TYPO3\CMS\Install\Status\StatusInterface; +use TYPO3\CMS\Install\Status\WarningStatus; + +/** + * Execute an image test. + */ +class ImageProcessing extends AbstractAjaxAction +{ + /** + * Executes the action + * + * @return array Rendered content + */ + protected function executeAction(): array + { + $testType = $this->postValues['testType']; + $testMethod = $testType . 'Test'; + if (!method_exists($this, $testType . 'Test')) { + throw new \RuntimeException( + 'Test method ' . $testMethod . ' does not exist', + 1502977949 + ); + } + $result = $this->$testMethod(); + if (!empty($result['referenceFile'])) { + $fileExt = end(explode('.', $result['referenceFile'])); + $result['referenceFile'] = 'data:image/' . $fileExt . ';base64,' . base64_encode(file_get_contents($result['referenceFile'])); + } + if (!empty($result['outputFile'])) { + $fileExt = end(explode('.', $result['outputFile'])); + $result['outputFile'] = 'data:image/' . $fileExt . ';base64,' . base64_encode(file_get_contents($result['outputFile'])); + } + $result['success'] = true; + foreach ($result as $variable => $value) { + $this->view->assign($variable, $value); + } + return $this->view->render(); + } + + /** + * Create true type font test image + * + * @return array + */ + protected function trueTypeTest(): array + { + $image = @imagecreate(200, 50); + imagecolorallocate($image, 255, 255, 55); + $textColor = imagecolorallocate($image, 233, 14, 91); + @imagettftext( + $image, + 20 / 96.0 * 72, // As in compensateFontSizeiBasedOnFreetypeDpi + 0, + 10, + 20, + $textColor, + ExtensionManagementUtility::extPath('install') . 'Resources/Private/Font/vera.ttf', + 'Testing true type' + ); + $outputFile = PATH_site . 'typo3temp/assets/images/installTool-' . StringUtility::getUniqueId('createTrueTypeFontTestImage') . '.gif'; + imagegif($image, $outputFile); + return [ + 'fileExists' => file_exists($outputFile), + 'outputFile' => $outputFile, + 'referenceFile' => PATH_site . 'typo3/sysext/install/Resources/Public/Images/TestReference/Font.gif', + ]; + } + + /** + * Convert to jpg from jpg + * + * @return array + */ + protected function readJpgTest(): array + { + return $this->convertImageFormatsToJpg('jpg'); + } + + /** + * Convert to jpg from gif + * + * @return array + */ + protected function readGifTest(): array + { + return $this->convertImageFormatsToJpg('gif'); + } + + /** + * Convert to jpg from png + * + * @return array + */ + protected function readPngTest(): array + { + return $this->convertImageFormatsToJpg('png'); + } + + /** + * Convert to jpg from tif + * + * @return array + */ + protected function readTifTest(): array + { + return $this->convertImageFormatsToJpg('tif'); + } + + /** + * Convert to jpg from pdf + * + * @return array + */ + protected function readPdfTest(): array + { + return $this->convertImageFormatsToJpg('pdf'); + } + + /** + * Convert to jpg from ai + * + * @return array + */ + protected function readAiTest(): array + { + return $this->convertImageFormatsToJpg('ai'); + } + + /** + * Convert to jpg from given input format + * + * @param string $inputFormat + * @return array + */ + protected function convertImageFormatsToJpg(string $inputFormat): array + { + if (!$this->isImageMagickEnabledAndConfigured()) { + return [ + 'status' => [ $this->imageMagickDisabledMessage() ], + ]; + } + if (!GeneralUtility::inList($GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'], $inputFormat)) { + $message = new WarningStatus(); + $message->setTitle('Skipped test'); + $message->setMessage('Handling format ' . $inputFormat . ' must be enabled in TYPO3_CONF_VARS[\'GFX\'][\'imagefile_ext\']'); + return [ + 'status' => [ $message ] + ]; + } + $imageBasePath = ExtensionManagementUtility::extPath('install') . 'Resources/Public/Images/'; + $imageProcessor = $this->initializeImageProcessor(); + $inputFile = $imageBasePath . 'TestInput/Test.' . $inputFormat; + $imageProcessor->imageMagickConvert_forceFileNameBody = StringUtility::getUniqueId('read') . '-' . $inputFormat; + $imResult = $imageProcessor->imageMagickConvert($inputFile, 'jpg', '300', '', '', '', [], true); + $result = []; + if ($imResult !== null) { + $result = [ + 'fileExists' => file_exists($imResult[3]), + 'outputFile' => $imResult[3], + 'referenceFile' => PATH_site . 'typo3/sysext/install/Resources/Public/Images/TestReference/Read-' . $inputFormat . '.jpg', + 'command' => $imageProcessor->IM_commands, + ]; + } else { + $result['status'] = [ $this->imageGenerationFailedMessage() ]; + } + return $result; + } + + /** + * Writing gif test + * + * @return array + */ + protected function writeGifTest(): array + { + if (!$this->isImageMagickEnabledAndConfigured()) { + return [ + 'status' => [ $this->imageMagickDisabledMessage() ], + ]; + } + $imageBasePath = ExtensionManagementUtility::extPath('install') . 'Resources/Public/Images/'; + $inputFile = $imageBasePath . 'TestInput/Test.gif'; + $imageProcessor = $this->initializeImageProcessor(); + $imageProcessor->imageMagickConvert_forceFileNameBody = StringUtility::getUniqueId('write-gif'); + $imResult = $imageProcessor->imageMagickConvert($inputFile, 'gif', '300', '', '', '', [], true); + $messages = []; + if ($imResult !== null && is_file($imResult[3])) { + if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['gif_compress']) { + clearstatcache(); + $previousSize = GeneralUtility::formatSize(filesize($imResult[3])); + $methodUsed = GraphicalFunctions::gifCompress($imResult[3], ''); + clearstatcache(); + $compressedSize = GeneralUtility::formatSize(filesize($imResult[3])); + $message = new InfoStatus(); + $message->setTitle('Compressed gif'); + $message->setMessage( + 'Method used by compress: ' . $methodUsed . LF + . ' Previous filesize: ' . $previousSize . '. Current filesize:' . $compressedSize + ); + $messages[] = $message; + } else { + $message = new InfoStatus(); + $message->setTitle('Gif compression not enabled by [GFX][gif_compress]'); + $messages[] = $message; + } + $result = [ + 'status' => $message, + 'fileExists' => true, + 'outputFile' => $imResult[3], + 'referenceFile' => PATH_site . 'typo3/sysext/install/Resources/Public/Images/TestReference/Write-gif.gif', + 'command' => $imageProcessor->IM_commands, + ]; + } else { + $result = [ + 'status' => [ $this->imageGenerationFailedMessage() ], + ]; + } + return $result; + } + + /** + * Writing png test + * + * @return array + */ + protected function writePngTest(): array + { + if (!$this->isImageMagickEnabledAndConfigured()) { + return [ + 'status' => [ $this->imageMagickDisabledMessage() ], + ]; + } + $imageBasePath = ExtensionManagementUtility::extPath('install') . 'Resources/Public/Images/'; + $inputFile = $imageBasePath . 'TestInput/Test.png'; + $imageProcessor = $this->initializeImageProcessor(); + $imageProcessor->imageMagickConvert_forceFileNameBody = StringUtility::getUniqueId('write-png'); + $imResult = $imageProcessor->imageMagickConvert($inputFile, 'png', '300', '', '', '', [], true); + if ($imResult !== null && is_file($imResult[3])) { + $result = [ + 'fileExists' => true, + 'outputFile' => $imResult[3], + 'referenceFile' => PATH_site . 'typo3/sysext/install/Resources/Public/Images/TestReference/Write-png.png', + 'command' => $imageProcessor->IM_commands, + ]; + } else { + $result = [ + 'status' => [ $this->imageGenerationFailedMessage() ], + ]; + } + return $result; + } + + /** + * Scaling transparent files - gif to gif + * + * @return array + */ + protected function gifToGifTest(): array + { + if (!$this->isImageMagickEnabledAndConfigured()) { + return [ + 'status' => [ $this->imageMagickDisabledMessage() ], + ]; + } + $imageBasePath = ExtensionManagementUtility::extPath('install') . 'Resources/Public/Images/'; + $imageProcessor = $this->initializeImageProcessor(); + $inputFile = $imageBasePath . 'TestInput/Transparent.gif'; + $imageProcessor->imageMagickConvert_forceFileNameBody = StringUtility::getUniqueId('scale-gif'); + $imResult = $imageProcessor->imageMagickConvert($inputFile, 'gif', '300', '', '', '', [], true); + if ($imResult !== null && file_exists($imResult[3])) { + $result = [ + 'fileExists' => true, + 'outputFile' => $imResult[3], + 'referenceFile' => PATH_site . 'typo3/sysext/install/Resources/Public/Images/TestReference/Scale-gif.gif', + 'command' => $imageProcessor->IM_commands, + ]; + } else { + $result = [ + 'status' => [ $this->imageGenerationFailedMessage() ], + ]; + } + return $result; + } + + /** + * Scaling transparent files - png to png + * + * @return array + */ + protected function pngToPngTest(): array + { + if (!$this->isImageMagickEnabledAndConfigured()) { + return [ + 'status' => [ $this->imageMagickDisabledMessage() ], + ]; + } + $imageBasePath = ExtensionManagementUtility::extPath('install') . 'Resources/Public/Images/'; + $imageProcessor = $this->initializeImageProcessor(); + $inputFile = $imageBasePath . 'TestInput/Transparent.png'; + $imageProcessor->imageMagickConvert_forceFileNameBody = StringUtility::getUniqueId('scale-png'); + $imResult = $imageProcessor->imageMagickConvert($inputFile, 'png', '300', '', '', '', [], true); + if ($imResult !== null && file_exists($imResult[3])) { + $result = [ + 'fileExists' => true, + 'outputFile' => $imResult[3], + 'referenceFile' => PATH_site . 'typo3/sysext/install/Resources/Public/Images/TestReference/Scale-png.png', + 'command' => $imageProcessor->IM_commands, + ]; + } else { + $result = [ + 'status' => [ $this->imageGenerationFailedMessage() ], + ]; + } + return $result; + } + + /** + * Scaling transparent files - gif to jpg + * + * @return array + */ + protected function gifToJpgTest(): array + { + if (!$this->isImageMagickEnabledAndConfigured()) { + return [ + 'status' => [ $this->imageMagickDisabledMessage() ], + ]; + } + $imageBasePath = ExtensionManagementUtility::extPath('install') . 'Resources/Public/Images/'; + $imageProcessor = $this->initializeImageProcessor(); + $inputFile = $imageBasePath . 'TestInput/Transparent.gif'; + $imageProcessor->imageMagickConvert_forceFileNameBody = StringUtility::getUniqueId('scale-jpg'); + $imResult = $imageProcessor->imageMagickConvert($inputFile, 'jpg', '300', '', '-opaque white -background white -flatten', '', [], true); + if ($imResult !== null && file_exists($imResult[3])) { + $result = [ + 'fileExists' => true, + 'outputFile' => $imResult[3], + 'referenceFile' => PATH_site . 'typo3/sysext/install/Resources/Public/Images/TestReference/Scale-jpg.jpg', + 'command' => $imageProcessor->IM_commands, + ]; + } else { + $result = [ + 'status' => [ $this->imageGenerationFailedMessage() ], + ]; + } + return $result; + } + + /** + * Combine images with gif mask + * + * @return array + */ + protected function combineGifMaskTest(): array + { + if (!$this->isImageMagickEnabledAndConfigured()) { + return [ + 'status' => [ $this->imageMagickDisabledMessage() ], + ]; + } + $imageBasePath = ExtensionManagementUtility::extPath('install') . 'Resources/Public/Images/'; + $imageProcessor = $this->initializeImageProcessor(); + $inputFile = $imageBasePath . 'TestInput/BackgroundOrange.gif'; + $overlayFile = $imageBasePath . 'TestInput/Test.jpg'; + $maskFile = $imageBasePath . 'TestInput/MaskBlackWhite.gif'; + $resultFile = $this->getImagesPath($imageProcessor) . $imageProcessor->filenamePrefix + . StringUtility::getUniqueId($imageProcessor->alternativeOutputKey . 'combine1') . '.jpg'; + $imageProcessor->combineExec($inputFile, $overlayFile, $maskFile, $resultFile); + $imResult = $imageProcessor->getImageDimensions($resultFile); + if ($imResult) { + $result = [ + 'fileExists' => true, + 'outputFile' => $imResult[3], + 'referenceFile' => PATH_site . 'typo3/sysext/install/Resources/Public/Images/TestReference/Combine-1.jpg', + 'command' => $imageProcessor->IM_commands, + ]; + } else { + $result = [ + 'status' => [ $this->imageGenerationFailedMessage() ], + ]; + } + return $result; + } + + /** + * Combine images with jpg mask + * + * @return array + */ + protected function combineJpgMaskTest(): array + { + if (!$this->isImageMagickEnabledAndConfigured()) { + return [ + 'status' => [ $this->imageMagickDisabledMessage() ], + ]; + } + $imageBasePath = ExtensionManagementUtility::extPath('install') . 'Resources/Public/Images/'; + $imageProcessor = $this->initializeImageProcessor(); + $inputFile = $imageBasePath . 'TestInput/BackgroundCombine.jpg'; + $overlayFile = $imageBasePath . 'TestInput/Test.jpg'; + $maskFile = $imageBasePath . 'TestInput/MaskCombine.jpg'; + $resultFile = $this->getImagesPath($imageProcessor) . $imageProcessor->filenamePrefix + . StringUtility::getUniqueId($imageProcessor->alternativeOutputKey . 'combine2') . '.jpg'; + $imageProcessor->combineExec($inputFile, $overlayFile, $maskFile, $resultFile); + $imResult = $imageProcessor->getImageDimensions($resultFile); + if ($imResult) { + $result = [ + 'fileExists' => true, + 'outputFile' => $imResult[3], + 'referenceFile' => PATH_site . 'typo3/sysext/install/Resources/Public/Images/TestReference/Combine-2.jpg', + 'command' => $imageProcessor->IM_commands, + ]; + } else { + $result = [ + 'status' => [ $this->imageGenerationFailedMessage() ], + ]; + } + return $result; + } + + /** + * GD with simple box + * + * @return array + */ + protected function gdlibSimpleTest(): array + { + $imageProcessor = $this->initializeImageProcessor(); + $gifOrPng = $imageProcessor->gifExtension; + $image = imagecreatetruecolor(300, 225); + $backgroundColor = imagecolorallocate($image, 0, 0, 0); + imagefilledrectangle($image, 0, 0, 300, 225, $backgroundColor); + $workArea = [0, 0, 300, 225]; + $conf = [ + 'dimensions' => '10,50,280,50', + 'color' => 'olive', + ]; + $imageProcessor->makeBox($image, $conf, $workArea); + $outputFile = $this->getImagesPath($imageProcessor) . $imageProcessor->filenamePrefix . StringUtility::getUniqueId('gdSimple') . '.' . $gifOrPng; + $imageProcessor->ImageWrite($image, $outputFile); + $imResult = $imageProcessor->getImageDimensions($outputFile); + $result = [ + 'fileExists' => true, + 'outputFile' => $imResult[3], + 'referenceFile' => PATH_site . 'typo3/sysext/install/Resources/Public/Images/TestReference/Gdlib-simple.' . $gifOrPng, + 'command' => $imageProcessor->IM_commands, + ]; + return $result; + } + + /** + * GD from image with box + * + * @return array + */ + protected function gdlibFromFileTest(): array + { + $imageProcessor = $this->initializeImageProcessor(); + $gifOrPng = $imageProcessor->gifExtension; + $imageBasePath = ExtensionManagementUtility::extPath('install') . 'Resources/Public/Images/'; + $inputFile = $imageBasePath . 'TestInput/Test.' . $gifOrPng; + $image = $imageProcessor->imageCreateFromFile($inputFile); + $workArea = [0, 0, 400, 300]; + $conf = [ + 'dimensions' => '10,50,380,50', + 'color' => 'olive', + ]; + $imageProcessor->makeBox($image, $conf, $workArea); + $outputFile = $this->getImagesPath($imageProcessor) . $imageProcessor->filenamePrefix . StringUtility::getUniqueId('gdBox') . '.' . $gifOrPng; + $imageProcessor->ImageWrite($image, $outputFile); + $imResult = $imageProcessor->getImageDimensions($outputFile); + $result = [ + 'fileExists' => true, + 'outputFile' => $imResult[3], + 'referenceFile' => PATH_site . 'typo3/sysext/install/Resources/Public/Images/TestReference/Gdlib-box.' . $gifOrPng, + 'command' => $imageProcessor->IM_commands, + ]; + return $result; + } + + /** + * GD with text + * + * @return array + */ + protected function gdlibRenderTextTest(): array + { + $imageProcessor = $this->initializeImageProcessor(); + $gifOrPng = $imageProcessor->gifExtension; + $image = imagecreatetruecolor(300, 225); + $backgroundColor = imagecolorallocate($image, 128, 128, 150); + imagefilledrectangle($image, 0, 0, 300, 225, $backgroundColor); + $workArea = [0, 0, 300, 225]; + $conf = [ + 'iterations' => 1, + 'angle' => 0, + 'antiAlias' => 1, + 'text' => 'HELLO WORLD', + 'fontColor' => '#003366', + 'fontSize' => 30, + 'fontFile' => ExtensionManagementUtility::extPath('install') . 'Resources/Private/Font/vera.ttf', + 'offset' => '30,80', + ]; + $conf['BBOX'] = $imageProcessor->calcBBox($conf); + $imageProcessor->makeText($image, $conf, $workArea); + $outputFile = $this->getImagesPath($imageProcessor) . $imageProcessor->filenamePrefix . StringUtility::getUniqueId('gdText') . '.' . $gifOrPng; + $imageProcessor->ImageWrite($image, $outputFile); + $imResult = $imageProcessor->getImageDimensions($outputFile); + $result = [ + 'fileExists' => true, + 'outputFile' => $imResult[3], + 'referenceFile' => PATH_site . 'typo3/sysext/install/Resources/Public/Images/TestReference/Gdlib-text.' . $gifOrPng, + 'command' => $imageProcessor->IM_commands, + ]; + return $result; + } + + /** + * GD with text, niceText + * + * @return array + */ + protected function gdlibNiceTextTest(): array + { + if (!$this->isImageMagickEnabledAndConfigured()) { + return [ + 'status' => [ $this->imageMagickDisabledMessage() ], + ]; + } + $imageProcessor = $this->initializeImageProcessor(); + $gifOrPng = $imageProcessor->gifExtension; + $image = imagecreatetruecolor(300, 225); + $backgroundColor = imagecolorallocate($image, 128, 128, 150); + imagefilledrectangle($image, 0, 0, 300, 225, $backgroundColor); + $workArea = [0, 0, 300, 225]; + $conf = [ + 'iterations' => 1, + 'angle' => 0, + 'antiAlias' => 1, + 'text' => 'HELLO WORLD', + 'fontColor' => '#003366', + 'fontSize' => 30, + 'fontFile' => ExtensionManagementUtility::extPath('install') . 'Resources/Private/Font/vera.ttf', + 'offset' => '30,80', + ]; + $conf['BBOX'] = $imageProcessor->calcBBox($conf); + $imageProcessor->makeText($image, $conf, $workArea); + $outputFile = $this->getImagesPath($imageProcessor) . $imageProcessor->filenamePrefix . StringUtility::getUniqueId('gdText') . '.' . $gifOrPng; + $imageProcessor->ImageWrite($image, $outputFile); + $conf['offset'] = '30,120'; + $conf['niceText'] = 1; + $imageProcessor->makeText($image, $conf, $workArea); + $outputFile = $this->getImagesPath($imageProcessor) . $imageProcessor->filenamePrefix . StringUtility::getUniqueId('gdNiceText') . '.' . $gifOrPng; + $imageProcessor->ImageWrite($image, $outputFile); + $imResult = $imageProcessor->getImageDimensions($outputFile); + $result = [ + 'fileExists' => true, + 'outputFile' => $imResult[3], + 'referenceFile' => PATH_site . 'typo3/sysext/install/Resources/Public/Images/TestReference/Gdlib-niceText.' . $gifOrPng, + 'command' => $imageProcessor->IM_commands, + ]; + return $result; + } + + /** + * GD with text, niceText, shadow + * + * @return array + */ + protected function gdlibNiceTextShadowTest(): array + { + if (!$this->isImageMagickEnabledAndConfigured()) { + return [ + 'status' => [ $this->imageMagickDisabledMessage() ], + ]; + } + $imageProcessor = $this->initializeImageProcessor(); + $gifOrPng = $imageProcessor->gifExtension; + $image = imagecreatetruecolor(300, 225); + $backgroundColor = imagecolorallocate($image, 128, 128, 150); + imagefilledrectangle($image, 0, 0, 300, 225, $backgroundColor); + $workArea = [0, 0, 300, 225]; + $conf = [ + 'iterations' => 1, + 'angle' => 0, + 'antiAlias' => 1, + 'text' => 'HELLO WORLD', + 'fontColor' => '#003366', + 'fontSize' => 30, + 'fontFile' => ExtensionManagementUtility::extPath('install') . 'Resources/Private/Font/vera.ttf', + 'offset' => '30,80', + ]; + $conf['BBOX'] = $imageProcessor->calcBBox($conf); + $imageProcessor->makeText($image, $conf, $workArea); + $outputFile = $this->getImagesPath($imageProcessor) . $imageProcessor->filenamePrefix . StringUtility::getUniqueId('gdText') . '.' . $gifOrPng; + $imageProcessor->ImageWrite($image, $outputFile); + $conf['offset'] = '30,120'; + $conf['niceText'] = 1; + $imageProcessor->makeText($image, $conf, $workArea); + $outputFile = $this->getImagesPath($imageProcessor) . $imageProcessor->filenamePrefix . StringUtility::getUniqueId('gdNiceText') . '.' . $gifOrPng; + $imageProcessor->ImageWrite($image, $outputFile); + $conf['offset'] = '30,160'; + $conf['niceText'] = 1; + $conf['shadow.'] = [ + 'offset' => '2,2', + 'blur' => $imageProcessor->NO_IM_EFFECTS ? '90' : '20', + 'opacity' => '50', + 'color' => 'black' + ]; + // Warning: Re-uses $image from above! + $imageProcessor->makeShadow($image, $conf['shadow.'], $workArea, $conf); + $imageProcessor->makeText($image, $conf, $workArea); + $outputFile = $this->getImagesPath($imageProcessor) . $imageProcessor->filenamePrefix . StringUtility::getUniqueId('GDwithText-niceText-shadow') . '.' . $gifOrPng; + $imageProcessor->ImageWrite($image, $outputFile); + $imResult = $imageProcessor->getImageDimensions($outputFile); + $result = [ + 'fileExists' => true, + 'outputFile' => $imResult[3], + 'referenceFile' => PATH_site . 'typo3/sysext/install/Resources/Public/Images/TestReference/Gdlib-shadow.' . $gifOrPng, + 'command' => $imageProcessor->IM_commands, + ]; + return $result; + } + + /** + * Initialize image processor + * + * @return GraphicalFunctions Initialized image processor + */ + protected function initializeImageProcessor(): GraphicalFunctions + { + $imageProcessor = GeneralUtility::makeInstance(GraphicalFunctions::class); + $imageProcessor->init(); + $imageProcessor->absPrefix = PATH_site; + $imageProcessor->dontCheckForExistingTempFile = 1; + $imageProcessor->filenamePrefix = 'installTool-'; + $imageProcessor->dontCompress = 1; + $imageProcessor->alternativeOutputKey = 'typo3InstallTest'; + $imageProcessor->noFramePrepended = $GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_allowFrameSelection']; + return $imageProcessor; + } + + /** + * Create a 'image generation failed' message + * + * @return StatusInterface + */ + protected function imageGenerationFailedMessage(): StatusInterface + { + /** @var StatusInterface $message */ + $message = GeneralUtility::makeInstance(ErrorStatus::class); + $message->setTitle('Image generation failed'); + $message->setMessage( + 'ImageMagick / GraphicsMagick handling is enabled, but the execute' + . ' command returned an error. Please check your settings, especially' + . ' [\'GFX\'][\'processor_path\'] and [\'GFX\'][\'processor_path_lzw\'] and ensure Ghostscript is installed on your server.' + ); + return $message; + } + + /** + * Find out if ImageMagick or GraphicsMagick is enabled and set up + * + * @return bool TRUE if enabled and path is set + */ + protected function isImageMagickEnabledAndConfigured(): bool + { + $enabled = $GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_enabled']; + $path = $GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_path']; + return $enabled && $path; + } + + /** + * Create a 'imageMagick disabled' message + * + * @return StatusInterface + */ + protected function imageMagickDisabledMessage(): StatusInterface + { + $message = new ErrorStatus(); + $message->setTitle('Tests not executed'); + $message->setMessage('ImageMagick / GraphicsMagick handling is disabled or not configured correctly.'); + return $message; + } + + /** + * Return the temp image dir. + * If not exist it will be created + * + * @param GraphicalFunctions $imageProcessor + * @return string + */ + protected function getImagesPath(GraphicalFunctions $imageProcessor): string + { + $imagePath = $imageProcessor->absPrefix . 'typo3temp/assets/images/'; + if (!is_dir($imagePath)) { + GeneralUtility::mkdir_deep($imagePath); + } + return $imagePath; + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/LocalConfigurationWrite.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/LocalConfigurationWrite.php new file mode 100644 index 0000000000000000000000000000000000000000..952f80247ec4e2979a1154c20bddfa460bc57fc7 --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/LocalConfigurationWrite.php @@ -0,0 +1,55 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Ajax; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Install\Service\LocalConfigurationValueService; +use TYPO3\CMS\Install\Status\WarningStatus; + +/** + * Write values to LocalConfiguration + */ +class LocalConfigurationWrite extends AbstractAjaxAction +{ + /** + * Executes the action + * + * @return array Rendered content + */ + protected function executeAction(): array + { + if (!is_array($this->postValues['configurationValues']) || empty($this->postValues['configurationValues'])) { + throw new \RuntimeException( + 'Expected value array not found', + 1502282283 + ); + } + + $localConfigurationValueService = new LocalConfigurationValueService(); + $messages = $localConfigurationValueService->updateLocalConfigurationValues($this->postValues['configurationValues']); + + if (empty($messages)) { + $message = new WarningStatus(); + $message->setTitle('No values changed'); + $messages[] = $message; + } + + $this->view->assignMultiple([ + 'success' => true, + 'status' => $messages, + ]); + return $this->view->render(); + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/MailTest.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/MailTest.php new file mode 100644 index 0000000000000000000000000000000000000000..3a4a43c4f0780d051f00c2248ad66f81a69bb0a0 --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/MailTest.php @@ -0,0 +1,106 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Ajax; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Core\Mail\MailMessage; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Install\Status\ErrorStatus; +use TYPO3\CMS\Install\Status\OkStatus; + +/** + * Send a test mail + */ +class MailTest extends AbstractAjaxAction +{ + /** + * Executes the action + * + * @return array Rendered content + */ + protected function executeAction(): array + { + $messages = []; + $recipient = $this->postValues['email']; + if (empty($recipient) || !GeneralUtility::validEmail($recipient)) { + $message = new ErrorStatus(); + $message->setTitle('Mail not sent'); + $message->setMessage('Given address is not a valid email address.'); + $messages[] = $message; + } else { + $mailMessage = GeneralUtility::makeInstance(MailMessage::class); + $mailMessage + ->addTo($recipient) + ->addFrom($this->getSenderEmailAddress(), $this->getSenderEmailName()) + ->setSubject($this->getEmailSubject()) + ->setBody('<html><body>html test content</body></html>', 'text/html') + ->addPart('TEST CONTENT') + ->send(); + $message = new OkStatus(); + $message->setTitle('Test mail sent'); + $message->setMessage('Recipient: ' . $recipient); + $messages[] = $message; + } + + $this->view->assignMultiple([ + 'success' => true, + 'status' => $messages, + ]); + return $this->view->render(); + } + + /** + * Get sender address from configuration + * ['TYPO3_CONF_VARS']['MAIL']['defaultMailFromAddress'] + * If this setting is empty fall back to 'no-reply@example.com' + * + * @return string Returns an email address + */ + protected function getSenderEmailAddress(): string + { + return !empty($GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromAddress']) + ? $GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromAddress'] + : 'no-reply@example.com'; + } + + /** + * Gets sender name from configuration + * ['TYPO3_CONF_VARS']['MAIL']['defaultMailFromName'] + * If this setting is empty, it falls back to a default string. + * + * @return string + */ + protected function getSenderEmailName(): string + { + return !empty($GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromName']) + ? $GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromName'] + : 'TYPO3 CMS install tool'; + } + + /** + * Gets email subject from configuration + * ['TYPO3_CONF_VARS']['SYS']['sitename'] + * If this setting is empty, it falls back to a default string. + * + * @return string + */ + protected function getEmailSubject(): string + { + $name = !empty($GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename']) + ? ' from site "' . $GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'] . '"' + : ''; + return 'Test TYPO3 CMS mail delivery' . $name; + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/PresetActivate.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/PresetActivate.php new file mode 100644 index 0000000000000000000000000000000000000000..590af01ab8adf474ca84de44fed073984b4bc805 --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/PresetActivate.php @@ -0,0 +1,60 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Ajax; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Core\Configuration\ConfigurationManager; +use TYPO3\CMS\Install\Configuration\FeatureManager; +use TYPO3\CMS\Install\Status\InfoStatus; +use TYPO3\CMS\Install\Status\OkStatus; + +/** + * Activate a LocalConfiguration preset + */ +class PresetActivate extends AbstractAjaxAction +{ + /** + * Executes the action + * + * @return array Rendered content + */ + protected function executeAction(): array + { + $messages = []; + $configurationManager = new ConfigurationManager(); + $featureManager = new FeatureManager(); + $configurationValues = $featureManager->getConfigurationForSelectedFeaturePresets($this->postValues['values']); + if (!empty($configurationValues)) { + $configurationManager->setLocalConfigurationValuesByPathValuePairs($configurationValues); + $message = new OkStatus(); + $message->setTitle('Configuration written'); + $messageBody = []; + foreach ($configurationValues as $configurationKey => $configurationValue) { + $messageBody[] = '\'' . $configurationKey . '\' => \'' . $configurationValue . '\''; + } + $message->setMessage(implode('<br>', $messageBody)); + } else { + $message = new InfoStatus(); + $message->setTitle('No configuration change selected'); + } + $messages[] = $message; + + $this->view->assignMultiple([ + 'success' => true, + 'status' => $messages, + ]); + return $this->view->render(); + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/ResetBackendUserUc.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/ResetBackendUserUc.php index 186389264b7709f8f95cb6af85f560d05e52cd70..1077977edf24d4185d8f4a9d069f28aead1e2329 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/ResetBackendUserUc.php +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/ResetBackendUserUc.php @@ -1,6 +1,5 @@ <?php declare(strict_types=1); - namespace TYPO3\CMS\Install\Controller\Action\Ajax; /* @@ -20,34 +19,12 @@ use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Install\Status\OkStatus; use TYPO3\CMS\Install\Status\StatusInterface; -use TYPO3\CMS\Install\View\JsonView; /** - * ResetBackendUserUc - * - * This is an ajax wrapper for Reset backend user preferences + * Ajax wrapper to reset backend user preferences */ class ResetBackendUserUc extends AbstractAjaxAction { - - /** - * @param JsonView $view - * @throws \InvalidArgumentException - */ - public function __construct(JsonView $view = null) - { - $this->view = $view ?: GeneralUtility::makeInstance(JsonView::class); - } - - /** - * Initialize the handle action, sets up fluid stuff and assigns default variables. - * @ToDo Refactor View Initialization for all Ajax Controllers - */ - protected function initializeHandle() - { - // empty on purpose because AbstractAjaxAction still overwrites $this->view with StandaloneView - } - /** * Executes the action * @@ -78,8 +55,7 @@ class ResetBackendUserUc extends AbstractAjaxAction ->update('be_users') ->set('uc', '') ->execute(); - /** @var OkStatus $message */ - $message = GeneralUtility::makeInstance(OkStatus::class); + $message = new OkStatus(); $message->setTitle('Reset all backend users preferences'); return $message; } diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/TcaExtTablesCheck.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/TcaExtTablesCheck.php index 2bb5595128f54fdff613d032addf04361e597598..bca3f4d1a4c74525686524b4b8041c3c66792c37 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/TcaExtTablesCheck.php +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/TcaExtTablesCheck.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Controller\Action\Ajax; /* @@ -17,8 +18,6 @@ namespace TYPO3\CMS\Install\Controller\Action\Ajax; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Install\Service\LoadTcaService; use TYPO3\CMS\Install\Status\NoticeStatus; -use TYPO3\CMS\Install\Status\StatusInterface; -use TYPO3\CMS\Install\View\JsonView; /** * Check ext_tables.php files of loaded extensions for TCA changes. @@ -31,42 +30,18 @@ use TYPO3\CMS\Install\View\JsonView; */ class TcaExtTablesCheck extends AbstractAjaxAction { - - /** - * @var \TYPO3\CMS\Install\View\JsonView - */ - protected $view; - - /** - * @param JsonView $view - */ - public function __construct(JsonView $view = null) - { - $this->view = $view ?: GeneralUtility::makeInstance(JsonView::class); - } - - /** - * Initialize the handle action, sets up fluid stuff and assigns default variables. - * @ToDo Refactor View Initialization for all Ajax Controllers - */ - protected function initializeHandle() - { - // empty on purpose because AbstractAjaxAction still overwrites $this->view with StandaloneView - } - /** * Fetches all installed extensions that still mess with the TCA in a way they shouldn't * * @return array status list of extensions that still mess with the TCA */ - protected function executeAction() + protected function executeAction(): array { $statusMessages = []; $tcaMessages = $this->checkTcaChangesInExtTables(); foreach ($tcaMessages as $tcaMessage) { - /** @var $message StatusInterface */ - $message = GeneralUtility::makeInstance(NoticeStatus::class); + $message = new NoticeStatus(); $message->setTitle($tcaMessage); $statusMessages[] = $message; } @@ -83,12 +58,12 @@ class TcaExtTablesCheck extends AbstractAjaxAction * * @return array list of extensions that still mess with the tca */ - protected function checkTcaChangesInExtTables() + protected function checkTcaChangesInExtTables(): array { $loadTcaService = GeneralUtility::makeInstance(LoadTcaService::class); $loadTcaService->loadExtensionTablesWithoutMigration(); $baseTca = $GLOBALS['TCA']; - $messages = []; + $extensions = []; foreach ($GLOBALS['TYPO3_LOADED_EXT'] as $extensionKey => $extensionInformation) { if ((is_array($extensionInformation) || $extensionInformation instanceof \ArrayAccess) && $extensionInformation['ext_tables.php'] @@ -96,11 +71,11 @@ class TcaExtTablesCheck extends AbstractAjaxAction $loadTcaService->loadSingleExtTablesFile($extensionKey); $newTca = $GLOBALS['TCA']; if ($newTca !== $baseTca) { - $messages[] = $extensionKey; + $extensions[] = $extensionKey; } $baseTca = $newTca; } } - return $messages; + return $extensions; } } diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/TcaMigrationsCheck.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/TcaMigrationsCheck.php index 8e65459e281d2148c05f0177c8cafc15d55ae222..fc83b5c132deed756b5c7eedc3bb90cece74d285 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/TcaMigrationsCheck.php +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/TcaMigrationsCheck.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Controller\Action\Ajax; /* @@ -18,49 +19,24 @@ use TYPO3\CMS\Core\Migrations\TcaMigration; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Install\Service\LoadTcaService; use TYPO3\CMS\Install\Status\NoticeStatus; -use TYPO3\CMS\Install\Status\StatusInterface; -use TYPO3\CMS\Install\View\JsonView; /** * Checks whether the current TCA needs migrations and displays applied migrations. */ class TcaMigrationsCheck extends AbstractAjaxAction { - /** - * @var \TYPO3\CMS\Install\View\JsonView - */ - protected $view; - - /** - * @param JsonView $view - */ - public function __construct(JsonView $view = null) - { - $this->view = $view ?: GeneralUtility::makeInstance(JsonView::class); - } - - /** - * Initialize the handle action, sets up fluid stuff and assigns default variables. - * @ToDo Refactor View Initialization for all Ajax Controllers - */ - protected function initializeHandle() - { - // empty on purpose because AbstractAjaxAction still overwrites $this->view with StandaloneView - } - /** * Load all TCA Migrations and return if there are any todos * * @return array TCA status messages */ - protected function executeAction() + protected function executeAction(): array { $statusMessages = []; $tcaMessages = $this->checkTcaMigrations(); foreach ($tcaMessages as $tcaMessage) { - /** @var $message StatusInterface */ - $message = GeneralUtility::makeInstance(NoticeStatus::class); + $message = new NoticeStatus(); $message->setMessage($tcaMessage); $statusMessages[] = $message; } @@ -77,7 +53,7 @@ class TcaMigrationsCheck extends AbstractAjaxAction * * @return array The TCA migration messages */ - protected function checkTcaMigrations() + protected function checkTcaMigrations(): array { GeneralUtility::makeInstance(LoadTcaService::class)->loadExtensionTablesWithoutMigration(); $tcaMigration = GeneralUtility::makeInstance(TcaMigration::class); diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/UninstallExtension.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/UninstallExtension.php index 214c5c4bf04cc2231936a72b9416018be69d9ccc..c30c2d8456f63b88ad2eb3503d47eaf655c4e538 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/UninstallExtension.php +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/UninstallExtension.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Controller\Action\Ajax; /* @@ -16,6 +17,7 @@ namespace TYPO3\CMS\Install\Controller\Action\Ajax; use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Install\Status\ErrorStatus; /** * Uninstall Extensions @@ -33,9 +35,9 @@ class UninstallExtension extends AbstractAjaxAction * Uninstall one or multiple extensions * Extension keys are read from get vars, more than one extension has to be comma separated * - * @return string "OK" on success, the error message otherwise + * @return array */ - protected function executeAction() + protected function executeAction(): array { $getVars = GeneralUtility::_GET('install'); if (isset($getVars['uninstallExtension']) && isset($getVars['uninstallExtension']['extensions'])) { @@ -45,11 +47,18 @@ class UninstallExtension extends AbstractAjaxAction try { ExtensionManagementUtility::unloadExtension($extension); } catch (\Exception $e) { - return $e->getMessage(); + $message = new ErrorStatus(); + $message->setMessage($e->getMessage()); + return [ + 'success' => true, + 'status' => [ $message ], + ]; } } } } - return 'OK'; + return [ + 'success' => true, + ]; } } diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/SaveIgnoredItems.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeDocsMarkRead.php similarity index 85% rename from typo3/sysext/install/Classes/Controller/Action/Ajax/SaveIgnoredItems.php rename to typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeDocsMarkRead.php index ca050d2390815d3ae451d253fb489a338c6fc66c..8d142bcacf96424af269745565307cfdf21aeace 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/SaveIgnoredItems.php +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeDocsMarkRead.php @@ -1,6 +1,5 @@ <?php declare(strict_types=1); - namespace TYPO3\CMS\Install\Controller\Action\Ajax; /* @@ -15,26 +14,28 @@ namespace TYPO3\CMS\Install\Controller\Action\Ajax; * * The TYPO3 project - inspiring people to share! */ + use TYPO3\CMS\Core\Registry; /** * Save ignored documentation file items and hide them from display */ -class SaveIgnoredItems extends AbstractAjaxAction +class UpgradeDocsMarkRead extends AbstractAjaxAction { - /** * Executes the action * * @return string content * @throws \InvalidArgumentException */ - protected function executeAction(): string + protected function executeAction(): array { $registry = new Registry(); $filePath = $this->postValues['ignoreFile']; $fileHash = md5_file($filePath); $registry->set('upgradeAnalysisIgnoredFiles', $fileHash, $filePath); - return json_encode(''); + return [ + 'success' => true, + ]; } } diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/RemoveIgnoredItems.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeDocsUnmarkRead.php similarity index 85% rename from typo3/sysext/install/Classes/Controller/Action/Ajax/RemoveIgnoredItems.php rename to typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeDocsUnmarkRead.php index 972e68b8400fc3c397d1d102d0c3f456a03d33e8..f1cc0e421fbc6dfcf007a3de07f947e23f4cce0d 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Ajax/RemoveIgnoredItems.php +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeDocsUnmarkRead.php @@ -1,6 +1,5 @@ <?php declare(strict_types=1); - namespace TYPO3\CMS\Install\Controller\Action\Ajax; /* @@ -15,26 +14,28 @@ namespace TYPO3\CMS\Install\Controller\Action\Ajax; * * The TYPO3 project - inspiring people to share! */ + use TYPO3\CMS\Core\Registry; /** * Remove ignored items from registry and therefor bring them back */ -class RemoveIgnoredItems extends AbstractAjaxAction +class UpgradeDocsUnmarkRead extends AbstractAjaxAction { - /** * Executes the action * * @return string Rendered content * @throws \InvalidArgumentException */ - protected function executeAction(): string + protected function executeAction(): array { $registry = new Registry(); $filePath = $this->postValues['ignoreFile']; $fileHash = md5_file($filePath); $registry->remove('upgradeAnalysisIgnoredFiles', $fileHash); - return json_encode(''); + return [ + 'success' => true, + ]; } } diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsBlockingDatabaseAdds.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsBlockingDatabaseAdds.php new file mode 100644 index 0000000000000000000000000000000000000000..2e139844a3094ee9a6f183030eac0a2d9d654927 --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsBlockingDatabaseAdds.php @@ -0,0 +1,51 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Ajax; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Install\Service\UpgradeWizardsService; + +/** + * "Blocking" upgrade to add missing fields + tables to DB. + * This one must be green before others can be executed + */ +class UpgradeWizardsBlockingDatabaseAdds extends AbstractAjaxAction +{ + /** + * Executes the action + * + * @return array Rendered content + */ + protected function executeAction(): array + { + // ext_localconf, db and ext_tables must be loaded for the updates :( + $this->loadExtLocalconfDatabaseAndExtTables(); + + $upgradeWizardsService = new UpgradeWizardsService(); + $adds = $upgradeWizardsService->getBlockingDatabaseAdds(); + + $needsUpdate = false; + if (!empty($adds)) { + $needsUpdate = true; + } + + $this->view->assignMultiple([ + 'success' => true, + 'needsUpdate' => $needsUpdate, + 'adds' => $adds, + ]); + return $this->view->render(); + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsBlockingDatabaseCharsetFix.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsBlockingDatabaseCharsetFix.php new file mode 100644 index 0000000000000000000000000000000000000000..6d1f18ba64c3b1f181ce243b0ad7ca81b254a975 --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsBlockingDatabaseCharsetFix.php @@ -0,0 +1,47 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Ajax; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Install\Service\UpgradeWizardsService; +use TYPO3\CMS\Install\Status\OkStatus; + +/** + * Set default connection MySQL database charset to utf8. + */ +class UpgradeWizardsBlockingDatabaseCharsetFix extends AbstractAjaxAction +{ + /** + * Executes the action + * + * @return array Rendered content + */ + protected function executeAction(): array + { + $upgradeWizardsService = new UpgradeWizardsService(); + $upgradeWizardsService->setDatabaseCharsetUtf8(); + + $messages = []; + $message = new OkStatus(); + $message->setTitle('Default connection database has been set to utf8'); + $messages[] = $message; + + $this->view->assignMultiple([ + 'success' => true, + 'status' => $messages, + ]); + return $this->view->render(); + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsBlockingDatabaseCharsetTest.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsBlockingDatabaseCharsetTest.php new file mode 100644 index 0000000000000000000000000000000000000000..6efc31e7d23a184040bcc4c9b59c69cf09791005 --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsBlockingDatabaseCharsetTest.php @@ -0,0 +1,42 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Ajax; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Install\Service\UpgradeWizardsService; + +/** + * "Blocking" upgrade to add missing fields + tables to DB. + * This one must be green before others can be executed + */ +class UpgradeWizardsBlockingDatabaseCharsetTest extends AbstractAjaxAction +{ + /** + * Executes the action + * + * @return array Rendered content + */ + protected function executeAction(): array + { + $upgradeWizardsService = new UpgradeWizardsService(); + $result = $upgradeWizardsService->isDatabaseCharsetUtf8(); + + $this->view->assignMultiple([ + 'success' => true, + 'needsUpdate' => $result, + ]); + return $this->view->render(); + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsBlockingDatabaseExecute.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsBlockingDatabaseExecute.php new file mode 100644 index 0000000000000000000000000000000000000000..3fba43e2e35edba62dd3ed323df6b724b1a38cc9 --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsBlockingDatabaseExecute.php @@ -0,0 +1,51 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Ajax; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Install\Service\UpgradeWizardsService; +use TYPO3\CMS\Install\Status\OkStatus; + +/** + * Execute "Add required db tables and fields" blocking upgrade wizard + * to add them + */ +class UpgradeWizardsBlockingDatabaseExecute extends AbstractAjaxAction +{ + /** + * Executes the action + * + * @return array Rendered content + */ + protected function executeAction(): array + { + // ext_localconf, db and ext_tables must be loaded for the updates :( + $this->loadExtLocalconfDatabaseAndExtTables(); + + $upgradeWizardsService = new UpgradeWizardsService(); + $upgradeWizardsService->addMissingTablesAndFields(); + + $messages = []; + $message = new OkStatus(); + $message->setTitle('Added missing database fields and tables'); + $messages[] = $message; + + $this->view->assignMultiple([ + 'success' => true, + 'status' => $messages, + ]); + return $this->view->render(); + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsDoneUpgrades.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsDoneUpgrades.php new file mode 100644 index 0000000000000000000000000000000000000000..50ff5b8ecbccc22f70e604149a24f4ad882fef32 --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsDoneUpgrades.php @@ -0,0 +1,54 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Ajax; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Install\Service\UpgradeWizardsService; +use TYPO3\CMS\Install\Status\OkStatus; + +/** + * Get a list of wizards and row updaters marked as "done" in registry + */ +class UpgradeWizardsDoneUpgrades extends AbstractAjaxAction +{ + /** + * Executes the action + * + * @return array Rendered content + */ + protected function executeAction(): array + { + $this->loadExtLocalconfDatabaseAndExtTables(); + + $upgradeWizardsService = new UpgradeWizardsService(); + $wizardsDone = $upgradeWizardsService->listOfWizardsDoneInRegistry(); + $rowUpdatersDone = $upgradeWizardsService->listOfRowUpdatersDoneInRegistry(); + + $messages = []; + if (empty($wizardsDone) && empty($rowUpdatersDone)) { + $message = new OkStatus(); + $message->setTitle('No wizards are marked as done'); + $messages[] = $message; + } + + $this->view->assignMultiple([ + 'success' => true, + 'status' => $messages, + 'wizardsDone' => $wizardsDone, + 'rowUpdatersDone' => $rowUpdatersDone, + ]); + return $this->view->render(); + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsExecute.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsExecute.php new file mode 100644 index 0000000000000000000000000000000000000000..2cd0c0c383553bb1c624654605cc94d354b4cd67 --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsExecute.php @@ -0,0 +1,46 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Ajax; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Install\Service\UpgradeWizardsService; + +/** + * Execute a specific upgrade wizard + */ +class UpgradeWizardsExecute extends AbstractAjaxAction +{ + /** + * Executes the action + * + * @return array Rendered content + */ + protected function executeAction(): array + { + // ext_localconf, db and ext_tables must be loaded for the updates :( + $this->loadExtLocalconfDatabaseAndExtTables(); + + $upgradeWizardsService = new UpgradeWizardsService(); + + $identifier = $this->postValues['identifier']; + $messages = $upgradeWizardsService->executeWizard($identifier); + + $this->view->assignMultiple([ + 'success' => true, + 'status' => $messages, + ]); + return $this->view->render(); + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsInput.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsInput.php new file mode 100644 index 0000000000000000000000000000000000000000..3057049979e15220e9ad71c7ceebc2f8ae5607f4 --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsInput.php @@ -0,0 +1,48 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Ajax; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Install\Service\UpgradeWizardsService; + +/** + * Get user input of a specific upgrade wizard + */ +class UpgradeWizardsInput extends AbstractAjaxAction +{ + /** + * Executes the action + * + * @return array Rendered content + */ + protected function executeAction(): array + { + // ext_localconf, db and ext_tables must be loaded for the updates :( + $this->loadExtLocalconfDatabaseAndExtTables(); + + $upgradeWizardsService = new UpgradeWizardsService(); + + $identifier = $this->postValues['identifier']; + $result = $upgradeWizardsService->getWizardUserInput($identifier); + + $messages = []; + $this->view->assignMultiple([ + 'success' => true, + 'status' => $messages, + 'userInput' => $result, + ]); + return $this->view->render(); + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsList.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsList.php new file mode 100644 index 0000000000000000000000000000000000000000..16d678d058997cecea90b3f8906ad53d12790da1 --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsList.php @@ -0,0 +1,46 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Ajax; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Install\Service\UpgradeWizardsService; + +/** + * List available wizards to execute + */ +class UpgradeWizardsList extends AbstractAjaxAction +{ + /** + * Executes the action + * + * @return array Rendered content + */ + protected function executeAction(): array + { + // ext_localconf, db and ext_tables must be loaded for the updates :( + $this->loadExtLocalconfDatabaseAndExtTables(); + + $upgradeWizardsService = new UpgradeWizardsService(); + $wizards = $upgradeWizardsService->getUpgradeWizardsList(); + + $messages = []; + $this->view->assignMultiple([ + 'success' => true, + 'status' => $messages, + 'wizards' => $wizards, + ]); + return $this->view->render(); + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsMarkUndone.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsMarkUndone.php new file mode 100644 index 0000000000000000000000000000000000000000..455fb9dd47eec7364db637dd919f0220845c6adf --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsMarkUndone.php @@ -0,0 +1,58 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Ajax; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Install\Service\UpgradeWizardsService; +use TYPO3\CMS\Install\Status\ErrorStatus; +use TYPO3\CMS\Install\Status\OkStatus; + +/** + * Mark a wizard as undone in registry. Can be either a + * casual wizard, or a "row updater" wizard. + */ +class UpgradeWizardsMarkUndone extends AbstractAjaxAction +{ + /** + * Executes the action + * + * @return array Rendered content + */ + protected function executeAction(): array + { + $this->loadExtLocalconfDatabaseAndExtTables(); + + $wizardToBeMarkedAsUndoneIdentifier = $this->postValues['identifier']; + $upgradeWizardsService = new UpgradeWizardsService(); + $result = $upgradeWizardsService->markWizardUndoneInRegistry($wizardToBeMarkedAsUndoneIdentifier); + + $messages = []; + if ($result) { + $message = new OkStatus(); + $message->setTitle('Wizard has been marked undone'); + $messages[] = $message; + } else { + $message = new ErrorStatus(); + $message->setTitle('Wizard has not been marked undone'); + $messages[] = $message; + } + + $this->view->assignMultiple([ + 'success' => true, + 'status' => $messages, + ]); + return $this->view->render(); + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsSilentUpgrades.php b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsSilentUpgrades.php new file mode 100644 index 0000000000000000000000000000000000000000..cc77d562dab1cd667a8e87bb832362689bfffa38 --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Ajax/UpgradeWizardsSilentUpgrades.php @@ -0,0 +1,53 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Ajax; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Install\Service\UpgradeWizardsService; +use TYPO3\CMS\Install\Status\OkStatus; + +/** + * Perform "silent" wizard upgrades on first opening of the card + */ +class UpgradeWizardsSilentUpgrades extends AbstractAjaxAction +{ + /** + * Executes the action + * + * @return array Rendered content + */ + protected function executeAction(): array + { + // ext_localconf, db and ext_tables must be loaded for the updates :( + $this->loadExtLocalconfDatabaseAndExtTables(); + + // Perform silent cache framework table upgrade + $upgradeWizardsService = new UpgradeWizardsService(); + $statements = $upgradeWizardsService->silentCacheFrameworkTableSchemaMigration(); + + $messages = []; + if (!empty($statements)) { + $message = new OkStatus(); + $message->setTitle('Created some database cache tables.'); + $messages[] = $message; + } + + $this->view->assignMultiple([ + 'success' => true, + 'status' => $messages, + ]); + return $this->view->render(); + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Tool/AllConfiguration.php b/typo3/sysext/install/Classes/Controller/Action/Tool/AllConfiguration.php deleted file mode 100644 index bd2c53743ec7f1a9d426a97e7c917bb119068dd8..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Classes/Controller/Action/Tool/AllConfiguration.php +++ /dev/null @@ -1,200 +0,0 @@ -<?php -namespace TYPO3\CMS\Install\Controller\Action\Tool; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Install\Controller\Action; - -/** - * Show system environment check results - */ -class AllConfiguration extends Action\AbstractAction -{ - /** - * Error handlers are a bit mask in PHP. This register hints the View to - * add a fluid view helper resolving the bit mask to its representation - * as constants again for the specified items in ['SYS']. - * - * @var array - */ - protected $phpErrorCodesSettings = [ - 'errorHandlerErrors', - 'exceptionalErrors', - 'syslogErrorReporting', - 'belogErrorReporting', - ]; - - /** - * Executes the tool - * - * @return string Rendered content - */ - protected function executeAction() - { - if (isset($this->postValues['set']['write'])) { - $this->view->assign('configurationValuesSaved', true); - $this->view->assign('savedConfigurationValueMessages', $this->updateLocalConfigurationValues()); - } else { - $this->view->assign('sectionNames', $this->getSpeakingSectionNames()); - $this->view->assign('data', $this->setUpConfigurationData()); - } - - return $this->view->render(); - } - - /** - * Returns an array of available sections and their description - * - * @return string[] - */ - protected function getSpeakingSectionNames() - { - return [ - 'BE' => 'Backend', - 'DB' => 'Database', - 'EXT' => 'Extension Installation', - 'FE' => 'Frontend', - 'GFX' => 'Image Processing', - 'HTTP' => 'Connection', - 'MAIL' => 'Mail', - 'SYS' => 'System' - ]; - } - - /** - * Set up configuration data - * - * @return array Configuration data - */ - protected function setUpConfigurationData() - { - $data = []; - $typo3ConfVars = array_keys($GLOBALS['TYPO3_CONF_VARS']); - sort($typo3ConfVars); - $commentArray = $this->getDefaultConfigArrayComments(); - foreach ($typo3ConfVars as $sectionName) { - $data[$sectionName] = []; - - foreach ($GLOBALS['TYPO3_CONF_VARS'][$sectionName] as $key => $value) { - $description = trim($commentArray[$sectionName][$key]); - $isTextarea = (bool)preg_match('/^(<.*?>)?string \\(textarea\\)/i', $description); - $doNotRender = (bool)preg_match('/^(<.*?>)?string \\(exclude\\)/i', $description); - - if (!is_array($value) && !$doNotRender && (!preg_match('/[' . LF . CR . ']/', $value) || $isTextarea)) { - $itemData = []; - $itemData['key'] = $key; - $itemData['description'] = $description; - if ($isTextarea) { - $itemData['type'] = 'textarea'; - $itemData['value'] = str_replace(['\' . LF . \'', '\' . LF . \''], [LF, LF], $value); - } elseif (preg_match('/^(<.*?>)?boolean/i', $description)) { - $itemData['type'] = 'checkbox'; - $itemData['value'] = $value ? '1' : '0'; - $itemData['checked'] = (bool)$value; - } elseif (preg_match('/^(<.*?>)?integer/i', $description)) { - $itemData['type'] = 'number'; - $itemData['value'] = (int)$value; - } else { - $itemData['type'] = 'input'; - $itemData['value'] = $value; - } - - // Check if the setting is a PHP error code, will trigger a view helper in fluid - if ($sectionName === 'SYS' && in_array($key, $this->phpErrorCodesSettings)) { - $itemData['phpErrorCode'] = true; - } - - $data[$sectionName][] = $itemData; - } - } - } - return $data; - } - - /** - * Store changed values in LocalConfiguration - * - * @return string Status messages of changed values - */ - protected function updateLocalConfigurationValues() - { - $statusObjects = []; - if (isset($this->postValues['values']) && is_array($this->postValues['values'])) { - $configurationPathValuePairs = []; - $commentArray = $this->getDefaultConfigArrayComments(); - $formValues = $this->postValues['values']; - foreach ($formValues as $section => $valueArray) { - if (is_array($GLOBALS['TYPO3_CONF_VARS'][$section])) { - foreach ($valueArray as $valueKey => $value) { - if (isset($GLOBALS['TYPO3_CONF_VARS'][$section][$valueKey])) { - $oldValue = $GLOBALS['TYPO3_CONF_VARS'][$section][$valueKey]; - $description = trim($commentArray[$section][$valueKey]); - - if (preg_match('/^string \\(textarea\\)/i', $description)) { - // Force Unix linebreaks in textareas - $value = str_replace(CR, '', $value); - // Preserve linebreaks - $value = str_replace(LF, '\' . LF . \'', $value); - } - - if (preg_match('/^(<.*?>)?boolean/i', $description)) { - // When submitting settings in the Install Tool, values that default to "FALSE" or "TRUE" - // in EXT:core/Configuration/DefaultConfiguration.php will be sent as "0" resp. "1". - $value = $value === '1'; - $valueHasChanged = (bool)$oldValue !== $value; - } elseif (preg_match('/^(<.*?>)?integer/i', $description)) { - // Cast integer values to integers (but only for values that can not contain a string as well) - $value = (int)$value; - $valueHasChanged = (int)$oldValue !== $value; - } else { - $valueHasChanged = (string)$oldValue !== (string)$value; - } - - // Save if value changed - if ($valueHasChanged) { - $configurationPathValuePairs[$section . '/' . $valueKey] = $value; - /** @var $message \TYPO3\CMS\Install\Status\StatusInterface */ - $status = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\OkStatus::class); - $status->setTitle('$GLOBALS[\'TYPO3_CONF_VARS\'][\'' . $section . '\'][\'' . $valueKey . '\']'); - if (is_bool($value)) { - $status->setMessage('New value = ' . ($value ? 'true' : 'false')); - } else { - $status->setMessage('New value = ' . $value); - } - $statusObjects[] = $status; - } - } - } - } - } - if (!empty($statusObjects)) { - /** @var \TYPO3\CMS\Core\Configuration\ConfigurationManager $configurationManager */ - $configurationManager = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Configuration\ConfigurationManager::class); - $configurationManager->setLocalConfigurationValuesByPathValuePairs($configurationPathValuePairs); - } - } - return $statusObjects; - } - - /** - * @return array - */ - protected function getDefaultConfigArrayComments() : array - { - /** @var \TYPO3\CMS\Core\Configuration\ConfigurationManager $configurationManager */ - $configurationManager = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Configuration\ConfigurationManager::class); - return require $configurationManager->getDefaultConfigurationDescriptionFileLocation(); - } -} diff --git a/typo3/sysext/install/Classes/Controller/Action/Tool/CleanUp.php b/typo3/sysext/install/Classes/Controller/Action/Tool/CleanUp.php deleted file mode 100644 index 1779b665fa439bf021c125799cde02fdbf332ea5..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Classes/Controller/Action/Tool/CleanUp.php +++ /dev/null @@ -1,293 +0,0 @@ -<?php -namespace TYPO3\CMS\Install\Controller\Action\Tool; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Core\Database\ConnectionPool; -use TYPO3\CMS\Core\Resource\ProcessedFileRepository; -use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Core\Utility\MathUtility; -use TYPO3\CMS\Install\Controller\Action; -use TYPO3\CMS\Install\Status\ErrorStatus; -use TYPO3\CMS\Install\Status\InfoStatus; -use TYPO3\CMS\Install\Status\OkStatus; - -/** - * Clean up page - */ -class CleanUp extends Action\AbstractAction -{ - /** - * Status messages of submitted actions - * - * @var array - */ - protected $actionMessages = []; - - /** - * Executes the tool - * - * @return string Rendered content - */ - protected function executeAction() - { - if (isset($this->postValues['set']['clearTables'])) { - $this->actionMessages[] = $this->clearSelectedTables(); - $this->view->assign('postAction', 'clearTables'); - } - if (isset($this->postValues['set']['clearProcessedFiles'])) { - $this->actionMessages[] = $this->clearProcessedFiles(); - $this->view->assign('postAction', 'clearProcessedFiles'); - } - if (isset($this->postValues['set']['deleteTypo3TempFiles'])) { - $this->view->assign('postAction', 'deleteTypo3TempFiles'); - } - - $this->view->assign('cleanableTables', $this->getCleanableTableList()); - - $typo3TempData = $this->getTypo3TempStatistics(); - $this->view->assign('typo3TempData', $typo3TempData); - - $this->view->assign('actionMessages', $this->actionMessages); - return $this->view->render(); - } - - /** - * Get list of existing tables that could be truncated. - * - * @return array List of cleanable tables with name, description and number of rows - */ - protected function getCleanableTableList() - { - $tableCandidates = [ - [ - 'name' => 'be_sessions', - 'description' => 'Backend user sessions' - ], - [ - 'name' => 'cache_md5params', - 'description' => 'Frontend redirects', - ], - [ - 'name' => 'fe_sessions', - 'description' => 'Frontend user sessions', - ], - [ - 'name' => 'sys_history', - 'description' => 'Tracking of database record changes through TYPO3 backend forms', - ], - [ - 'name' => 'sys_lockedrecords', - 'description' => 'Record locking of backend user editing', - ], - [ - 'name' => 'sys_log', - 'description' => 'General log table', - ], - [ - 'name' => 'sys_preview', - 'description' => 'Workspace preview links', - ], - [ - 'name' => 'tx_extensionmanager_domain_model_extension', - 'description' => 'List of TER extensions', - ], - [ - 'name' => 'tx_rsaauth_keys', - 'description' => 'Login process key storage' - ], - ]; - - $tables = []; - foreach ($tableCandidates as $candidate) { - $connection = GeneralUtility::makeInstance(ConnectionPool::class) - ->getConnectionForTable($candidate['name']); - if ($connection->getSchemaManager()->tablesExist([$candidate['name']])) { - $candidate['rows'] = $connection->count( - '*', - $candidate['name'], - [] - ); - $tables[] = $candidate; - } - } - return $tables; - } - - /** - * Truncate selected tables - * - * @return \TYPO3\CMS\Install\Status\StatusInterface - */ - protected function clearSelectedTables() - { - $clearedTables = []; - if (isset($this->postValues['values']) && is_array($this->postValues['values'])) { - foreach ($this->postValues['values'] as $tableName => $selected) { - if ($selected == 1) { - GeneralUtility::makeInstance(ConnectionPool::class) - ->getConnectionForTable($tableName) - ->truncate($tableName); - $clearedTables[] = $tableName; - } - } - } - if (!empty($clearedTables)) { - /** @var OkStatus $message */ - $message = GeneralUtility::makeInstance(OkStatus::class); - $message->setTitle('Cleared tables'); - $message->setMessage('List of cleared tables: ' . implode(', ', $clearedTables)); - } else { - /** @var InfoStatus $message */ - $message = GeneralUtility::makeInstance(InfoStatus::class); - $message->setTitle('No tables selected to clear'); - } - return $message; - } - - /** - * Data for the typo3temp/ deletion view - * - * @return array Data array - */ - protected function getTypo3TempStatistics() - { - $data = []; - $pathTypo3Temp = PATH_site . 'typo3temp/'; - $postValues = $this->postValues['values']; - - $condition = '0'; - if (isset($postValues['condition'])) { - $condition = $postValues['condition']; - } - $numberOfFilesToDelete = 0; - if (isset($postValues['numberOfFiles'])) { - $numberOfFilesToDelete = $postValues['numberOfFiles']; - } - $subDirectory = ''; - if (isset($postValues['subDirectory'])) { - $subDirectory = $postValues['subDirectory']; - } - - // Run through files - $fileCounter = 0; - $deleteCounter = 0; - $criteriaMatch = 0; - $timeMap = ['day' => 1, 'week' => 7, 'month' => 30]; - $directory = @dir($pathTypo3Temp . $subDirectory); - if (is_object($directory)) { - while ($entry = $directory->read()) { - $absoluteFile = $pathTypo3Temp . $subDirectory . '/' . $entry; - if (@is_file($absoluteFile)) { - $ok = false; - $fileCounter++; - if ($condition) { - if (MathUtility::canBeInterpretedAsInteger($condition)) { - if (filesize($absoluteFile) > $condition * 1024) { - $ok = true; - } - } else { - if (fileatime($absoluteFile) < $GLOBALS['EXEC_TIME'] - (int)$timeMap[$condition] * 60 * 60 * 24) { - $ok = true; - } - } - } else { - $ok = true; - } - if ($ok) { - $hashPart = substr(basename($absoluteFile), -14, 10); - // This is a kind of check that the file being deleted has a 10 char hash in it - if ( - !preg_match('/[^a-f0-9]/', $hashPart) - || substr($absoluteFile, -6) === '.cache' - || substr($absoluteFile, -4) === '.tbl' - || substr($absoluteFile, -4) === '.css' - || substr($absoluteFile, -3) === '.js' - || substr($absoluteFile, -5) === '.gzip' - || substr(basename($absoluteFile), 0, 8) === 'installTool' - ) { - if ($numberOfFilesToDelete && $deleteCounter < $numberOfFilesToDelete) { - $deleteCounter++; - unlink($absoluteFile); - } else { - $criteriaMatch++; - } - } - } - } - } - $directory->close(); - } - $data['numberOfFilesMatchingCriteria'] = $criteriaMatch; - $data['numberOfDeletedFiles'] = $deleteCounter; - - if ($deleteCounter > 0) { - $message = GeneralUtility::makeInstance(OkStatus::class); - $message->setTitle('Deleted ' . $deleteCounter . ' files from typo3temp/' . $subDirectory . '/'); - $this->actionMessages[] = $message; - } - - $data['selectedCondition'] = $condition; - $data['numberOfFiles'] = $numberOfFilesToDelete; - $data['selectedSubDirectory'] = $subDirectory; - - // Set up sub directory data - $data['subDirectories'] = [ - '' => [ - 'name' => '', - 'filesNumber' => count(GeneralUtility::getFilesInDir($pathTypo3Temp)), - ], - ]; - $directories = dir($pathTypo3Temp); - if (is_object($directories)) { - while ($entry = $directories->read()) { - if (is_dir($pathTypo3Temp . $entry) && $entry !== '..' && $entry !== '.') { - $data['subDirectories'][$entry]['name'] = $entry; - $data['subDirectories'][$entry]['filesNumber'] = count(GeneralUtility::getFilesInDir($pathTypo3Temp . $entry)); - $data['subDirectories'][$entry]['selected'] = false; - if ($entry === $data['selectedSubDirectory']) { - $data['subDirectories'][$entry]['selected'] = true; - } - } - } - } - $data['numberOfFilesInSelectedDirectory'] = $data['subDirectories'][$data['selectedSubDirectory']]['filesNumber']; - - return $data; - } - - /** - * Clear processed files - * - * The sys_file_processedfile table is truncated and the physical files of local storages are deleted. - * - * @return \TYPO3\CMS\Install\Status\StatusInterface - */ - protected function clearProcessedFiles() - { - $repository = GeneralUtility::makeInstance(ProcessedFileRepository::class); - $failedDeletions = $repository->removeAll(); - if ($failedDeletions) { - /** @var ErrorStatus $message */ - $message = GeneralUtility::makeInstance(ErrorStatus::class); - $message->setTitle('Failed to delete ' . $failedDeletions . ' processed files. See TYPO3 log (by default typo3temp/var/logs/typo3_*.log)'); - } else { - /** @var OkStatus $message */ - $message = GeneralUtility::makeInstance(OkStatus::class); - $message->setTitle('Cleared processed files'); - } - - return $message; - } -} diff --git a/typo3/sysext/install/Classes/Controller/Action/Tool/Configuration.php b/typo3/sysext/install/Classes/Controller/Action/Tool/Configuration.php deleted file mode 100644 index e832cd3c42a07254ed7afa939a1a1d3046ac352a..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Classes/Controller/Action/Tool/Configuration.php +++ /dev/null @@ -1,93 +0,0 @@ -<?php -namespace TYPO3\CMS\Install\Controller\Action\Tool; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Core\Configuration\ConfigurationManager; -use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Install\Configuration\FeatureManager; -use TYPO3\CMS\Install\Controller\Action; - -/** - * Show configuration features and handle presets - */ -class Configuration extends Action\AbstractAction -{ - /** - * @var \TYPO3\CMS\Install\Configuration\FeatureManager - */ - protected $featureManager; - - /** - * @var \TYPO3\CMS\Core\Configuration\ConfigurationManager - */ - protected $configurationManager; - - /** - * @param FeatureManager $featureManager - * @param ConfigurationManager $configurationManager - */ - public function __construct(FeatureManager $featureManager = null, ConfigurationManager $configurationManager = null) - { - $this->featureManager = $featureManager ?: GeneralUtility::makeInstance(FeatureManager::class); - $this->configurationManager = $configurationManager ?: GeneralUtility::makeInstance(ConfigurationManager::class); - } - - /** - * Executes the tool - * - * @return string Rendered content - */ - protected function executeAction() - { - $actionMessages = []; - if (isset($this->postValues['set']['activate'])) { - $actionMessages[] = $this->activate(); - $this->activate(); - } - $this->view->assign('actionMessages', $actionMessages); - - $postValues = is_array($this->postValues['values']) ? $this->postValues['values'] : []; - $this->view->assign('features', $this->featureManager->getInitializedFeatures($postValues)); - - return $this->view->render(); - } - - /** - * Configure selected feature presets to be active - * - * @return \TYPO3\CMS\Install\Status\StatusInterface - */ - protected function activate() - { - $configurationValues = $this->featureManager->getConfigurationForSelectedFeaturePresets($this->postValues['values']); - - if (!empty($configurationValues)) { - $this->configurationManager->setLocalConfigurationValuesByPathValuePairs($configurationValues); - /** @var $message \TYPO3\CMS\Install\Status\StatusInterface */ - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\OkStatus::class); - $message->setTitle('Configuration written'); - $messageBody = []; - foreach ($configurationValues as $configurationKey => $configurationValue) { - $messageBody[] = '\'' . $configurationKey . '\' => \'' . $configurationValue . '\''; - } - $message->setMessage(implode(LF, $messageBody)); - } else { - /** @var $message \TYPO3\CMS\Install\Status\StatusInterface */ - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\InfoStatus::class); - $message->setTitle('No configuration change selected'); - } - return $message; - } -} diff --git a/typo3/sysext/install/Classes/Controller/Action/Tool/Environment.php b/typo3/sysext/install/Classes/Controller/Action/Tool/Environment.php new file mode 100644 index 0000000000000000000000000000000000000000..285701694df59872c061cca770800a4d6cbc3bbe --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Tool/Environment.php @@ -0,0 +1,141 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Tool; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Core\Database\ConnectionPool; +use TYPO3\CMS\Core\FormProtection\FormProtectionFactory; +use TYPO3\CMS\Core\FormProtection\InstallToolFormProtection; +use TYPO3\CMS\Core\Utility\CommandUtility; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Install\Controller\Action; +use TYPO3\CMS\Install\FolderStructure\DefaultPermissionsCheck; + +/** + * "Environment" main controller + */ +class Environment extends Action\AbstractAction +{ + /** + * Executes the tool + * + * @return string Rendered content + */ + protected function executeAction(): string + { + $formProtection = FormProtectionFactory::get(InstallToolFormProtection::class); + $permissionCheck = GeneralUtility::makeInstance(DefaultPermissionsCheck::class); + $this->view->assignMultiple([ + 'folderStructureFilePermissionStatus' => $permissionCheck->getMaskStatus('fileCreateMask'), + 'folderStructureDirectoryPermissionStatus' => $permissionCheck->getMaskStatus('folderCreateMask'), + + 'imageProcessingConfiguration' => $this->getImageConfiguration(), + 'imageProcessingToken' => $formProtection->generateToken('installTool', 'imageProcessing'), + + 'mailTestToken' => $formProtection->generateToken('installTool', 'mailTest'), + 'mailTestSenderAddress' => $this->getSenderEmailAddress(), + + 'systemInformationCgiDetected', GeneralUtility::isRunningOnCgiServerApi(), + 'systemInformationDatabaseConnections' => $this->getDatabaseConnectionInformation(), + 'systemInformationOperatingSystem' => TYPO3_OS === 'WIN' ? 'Windows' : 'Unix', + ]); + return $this->view->render(); + } + + /** + * Gather image configuration overview + * + * @return array Result array + */ + protected function getImageConfiguration(): array + { + return [ + 'processor' => $GLOBALS['TYPO3_CONF_VARS']['GFX']['processor'] === 'GraphicsMagick' ? 'GraphicsMagick' : 'ImageMagick', + 'processorEnabled' => $GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_enabled'], + 'processorPath' => $GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_path'], + 'processorVersion' => $this->determineImageMagickVersion(), + 'processorEffects' => $GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_effects'], + 'gdlibEnabled' => $GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib'], + 'gdlibPng' => $GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib_png'], + 'fileFormats' => $GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'], + ]; + } + + /** + * Determine ImageMagick / GraphicsMagick version + * + * @return string Version + */ + protected function determineImageMagickVersion(): string + { + $command = CommandUtility::imageMagickCommand('identify', '-version'); + CommandUtility::exec($command, $result); + $string = $result[0]; + list(, $version) = explode('Magick', $string); + list($version) = explode(' ', trim($version)); + return trim($version); + } + + /** + * Get sender address from configuration + * ['TYPO3_CONF_VARS']['MAIL']['defaultMailFromAddress'] + * If this setting is empty fall back to 'no-reply@example.com' + * + * @return string Returns an email address + */ + protected function getSenderEmailAddress(): string + { + return !empty($GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromAddress']) + ? $GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromAddress'] + : 'no-reply@example.com'; + } + + /** + * Get details about all configured database connections + * + * @return array + */ + protected function getDatabaseConnectionInformation(): array + { + $connectionInfos = []; + $connectionPool = GeneralUtility::makeInstance(ConnectionPool::class); + foreach ($connectionPool->getConnectionNames() as $connectionName) { + $connection = $connectionPool->getConnectionByName($connectionName); + $connectionParameters = $connection->getParams(); + $connectionInfo = [ + 'connectionName' => $connectionName, + 'version' => $connection->getServerVersion(), + 'databaseName' => $connection->getDatabase(), + 'username' => $connection->getUsername(), + 'host' => $connection->getHost(), + 'port' => $connection->getPort(), + 'socket' => $connectionParameters['unix_socket'] ?? '', + 'numberOfTables' => count($connection->getSchemaManager()->listTableNames()), + 'numberOfMappedTables' => 0, + ]; + if (isset($GLOBALS['TYPO3_CONF_VARS']['DB']['TableMapping']) + && is_array($GLOBALS['TYPO3_CONF_VARS']['DB']['TableMapping']) + ) { + // Count number of array keys having $connectionName as value + $connectionInfo['numberOfMappedTables'] = count(array_intersect( + $GLOBALS['TYPO3_CONF_VARS']['DB']['TableMapping'], + [$connectionName] + )); + } + $connectionInfos[] = $connectionInfo; + } + return $connectionInfos; + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Tool/ExtensionScanner.php b/typo3/sysext/install/Classes/Controller/Action/Tool/ExtensionScanner.php deleted file mode 100644 index 8de4269ef21dea254fa066695713e1db31fdba74..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Classes/Controller/Action/Tool/ExtensionScanner.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php -namespace TYPO3\CMS\Install\Controller\Action\Tool; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use Symfony\Component\Finder\Finder; -use TYPO3\CMS\Core\FormProtection\FormProtectionFactory; -use TYPO3\CMS\Core\FormProtection\InstallToolFormProtection; -use TYPO3\CMS\Install\Controller\Action\AbstractAction; - -/** - * Run code analysis based on changelog documentation - */ -class ExtensionScanner extends AbstractAction -{ - - /** - * Executes the action upon click in the Install Tool Menu - * - * @return string Rendered content - * @throws \InvalidArgumentException - */ - protected function executeAction() - { - $finder = new Finder(); - $extensionsInTypo3conf = $finder->directories()->in(PATH_site . 'typo3conf/ext')->depth('== 0')->sortByName(); - $this->view->assign('extensionsInTypo3conf', $extensionsInTypo3conf); - - $formProtection = FormProtectionFactory::get(InstallToolFormProtection::class); - $this->view->assign('extensionScannerFilesToken', $formProtection->generateToken('installTool', 'extensionScannerFiles')); - $this->view->assign('extensionScannerScanFileToken', $formProtection->generateToken('installTool', 'extensionScannerScanFile')); - $this->view->assign('extensionScannerMarkFullyScannedRestFilesToken', $formProtection->generateToken('installTool', 'extensionScannerMarkFullyScannedRestFiles')); - - return $this->view->render(); - } -} diff --git a/typo3/sysext/install/Classes/Controller/Action/Tool/FolderStructure.php b/typo3/sysext/install/Classes/Controller/Action/Tool/FolderStructure.php deleted file mode 100644 index d1af25d81f1d77fc8d691dcc98b62b0b966ce9fc..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Classes/Controller/Action/Tool/FolderStructure.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -namespace TYPO3\CMS\Install\Controller\Action\Tool; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Install\Controller\Action; - -/** - * Handle folder structure - */ -class FolderStructure extends Action\AbstractAction -{ - /** - * Executes the tool - * - * @return string Rendered content - */ - protected function executeAction() - { - /** @var $folderStructureFactory \TYPO3\CMS\Install\FolderStructure\DefaultFactory */ - $folderStructureFactory = GeneralUtility::makeInstance(\TYPO3\CMS\Install\FolderStructure\DefaultFactory::class); - $structureFacade = $folderStructureFactory->getStructure(); - - $fixedStatusObjects = []; - if (isset($this->postValues['set']['fix'])) { - $fixedStatusObjects = $structureFacade->fix(); - } - - $statusObjects = $structureFacade->getStatus(); - /** @var $statusUtility \TYPO3\CMS\Install\Status\StatusUtility */ - $statusUtility = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\StatusUtility::class); - - $errorStatus = array_merge( - $statusUtility->filterBySeverity($statusObjects, 'error'), - $statusUtility->filterBySeverity($statusObjects, 'warning') - ); - $okStatus = array_merge( - $statusUtility->filterBySeverity($statusObjects, 'notice'), - $statusUtility->filterBySeverity($statusObjects, 'information'), - $statusUtility->filterBySeverity($statusObjects, 'ok') - ); - - /** @var \TYPO3\CMS\Install\FolderStructure\DefaultPermissionsCheck $permissionCheck */ - $permissionCheck = GeneralUtility::makeInstance(\TYPO3\CMS\Install\FolderStructure\DefaultPermissionsCheck::class); - $filePermissionStatus = $permissionCheck->getMaskStatus('fileCreateMask'); - $directoryPermissionStatus = $permissionCheck->getMaskStatus('folderCreateMask'); - - $this->view - ->assign('filePermissionStatus', $filePermissionStatus) - ->assign('directoryPermissionStatus', $directoryPermissionStatus) - ->assign('fixedStatus', $fixedStatusObjects) - ->assign('errorStatus', $errorStatus) - ->assign('okStatus', $okStatus); - - return $this->view->render(); - } -} diff --git a/typo3/sysext/install/Classes/Controller/Action/Tool/ImportantActions.php b/typo3/sysext/install/Classes/Controller/Action/Tool/ImportantActions.php deleted file mode 100644 index 8f5c49d21a24f5c80e74c3faf46dc850c4e80bbb..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Classes/Controller/Action/Tool/ImportantActions.php +++ /dev/null @@ -1,365 +0,0 @@ -<?php -namespace TYPO3\CMS\Install\Controller\Action\Tool; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Core\Core\Bootstrap; -use TYPO3\CMS\Core\Database\ConnectionPool; -use TYPO3\CMS\Core\Database\Schema\SchemaMigrator; -use TYPO3\CMS\Core\Database\Schema\SqlReader; -use TYPO3\CMS\Core\Service\OpcodeCacheService; -use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Install\Controller\Action; - -/** - * Handle important actions - */ -class ImportantActions extends Action\AbstractAction -{ - /** - * Executes the tool - * - * @return string Rendered content - */ - protected function executeAction() - { - $actionMessages = []; - if (isset($this->postValues['set']['changeInstallToolPassword'])) { - $actionMessages[] = $this->changeInstallToolPassword(); - } - if (isset($this->postValues['set']['createAdministrator'])) { - $actionMessages[] = $this->createAdministrator(); - } - - // Database analyzer handling - if (isset($this->postValues['set']['databaseAnalyzerExecute']) - || isset($this->postValues['set']['databaseAnalyzerAnalyze']) - ) { - $this->loadExtLocalconfDatabaseAndExtTables(); - } - if (isset($this->postValues['set']['databaseAnalyzerExecute'])) { - $actionMessages = array_merge($actionMessages, $this->databaseAnalyzerExecute()); - } - if (isset($this->postValues['set']['databaseAnalyzerAnalyze'])) { - try { - $actionMessages[] = $this->databaseAnalyzerAnalyze(); - } catch (\TYPO3\CMS\Core\Database\Schema\Exception\StatementException $e) { - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\ErrorStatus::class); - $message->setTitle('Database analysis failed'); - $message->setMessage($e->getMessage()); - $actionMessages[] = $message; - } - } - - $this->view->assign('actionMessages', $actionMessages); - - $operatingSystem = TYPO3_OS === 'WIN' ? 'Windows' : 'Unix'; - - $opcodeCacheService = GeneralUtility::makeInstance(OpcodeCacheService::class); - - /** @var \TYPO3\CMS\Install\Service\CoreUpdateService $coreUpdateService */ - $coreUpdateService = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Service\CoreUpdateService::class); - /** @var $coreVersionService \TYPO3\CMS\Install\Service\CoreVersionService */ - $coreVersionService = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Service\CoreVersionService::class); - $this->view - ->assign('enableCoreUpdate', $coreUpdateService->isCoreUpdateEnabled()) - ->assign('composerMode', Bootstrap::usesComposerClassLoading()) - ->assign('isInstalledVersionAReleasedVersion', $coreVersionService->isInstalledVersionAReleasedVersion()) - ->assign('isSymLinkedCore', is_link(PATH_site . 'typo3_src')) - ->assign('operatingSystem', $operatingSystem) - ->assign('cgiDetected', GeneralUtility::isRunningOnCgiServerApi()) - ->assign('extensionCompatibilityTesterProtocolFile', GeneralUtility::getIndpEnv('TYPO3_SITE_URL') . 'typo3temp/assets/ExtensionCompatibilityTester.txt') - ->assign('extensionCompatibilityTesterErrorProtocolFile', GeneralUtility::getIndpEnv('TYPO3_SITE_URL') . 'typo3temp/assets/ExtensionCompatibilityTesterErrors.json') - ->assign('extensionCompatibilityTesterMessages', $this->getExtensionCompatibilityTesterMessages()) - ->assign('listOfOpcodeCaches', $opcodeCacheService->getAllActive()); - - $connectionInfos = []; - $connectionPool = GeneralUtility::makeInstance(ConnectionPool::class); - foreach ($connectionPool->getConnectionNames() as $connectionName) { - $connection = $connectionPool->getConnectionByName($connectionName); - $connectionParameters = $connection->getParams(); - $connectionInfo = [ - 'connectionName' => $connectionName, - 'version' => $connection->getServerVersion(), - 'databaseName' => $connection->getDatabase(), - 'username' => $connection->getUsername(), - 'host' => $connection->getHost(), - 'port' => $connection->getPort(), - 'socket' => $connectionParameters['unix_socket'] ?? '', - 'numberOfTables' => count($connection->getSchemaManager()->listTableNames()), - 'numberOfMappedTables' => 0, - ]; - if (isset($GLOBALS['TYPO3_CONF_VARS']['DB']['TableMapping']) - && is_array($GLOBALS['TYPO3_CONF_VARS']['DB']['TableMapping']) - ) { - // Count number of array keys having $connectionName as value - $connectionInfo['numberOfMappedTables'] = count(array_intersect( - $GLOBALS['TYPO3_CONF_VARS']['DB']['TableMapping'], - [$connectionName] - )); - } - $connectionInfos[] = $connectionInfo; - } - - $this->view->assign('connections', $connectionInfos); - - return $this->view->render(); - } - - /** - * Set new password if requested - * - * @return \TYPO3\CMS\Install\Status\StatusInterface - */ - protected function changeInstallToolPassword() - { - $values = $this->postValues['values']; - if ($values['newInstallToolPassword'] !== $values['newInstallToolPasswordCheck']) { - /** @var $message \TYPO3\CMS\Install\Status\StatusInterface */ - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\ErrorStatus::class); - $message->setTitle('Install tool password not changed'); - $message->setMessage('Given passwords do not match.'); - } elseif (strlen($values['newInstallToolPassword']) < 8) { - /** @var $message \TYPO3\CMS\Install\Status\StatusInterface */ - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\ErrorStatus::class); - $message->setTitle('Install tool password not changed'); - $message->setMessage('Given password must be at least eight characters long.'); - } else { - /** @var \TYPO3\CMS\Core\Configuration\ConfigurationManager $configurationManager */ - $configurationManager = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Configuration\ConfigurationManager::class); - $configurationManager->setLocalConfigurationValueByPath( - 'BE/installToolPassword', - $this->getHashedPassword($values['newInstallToolPassword']) - ); - /** @var $message \TYPO3\CMS\Install\Status\StatusInterface */ - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\OkStatus::class); - $message->setTitle('Install tool password changed'); - } - return $message; - } - - /** - * Create administrator user - * - * @return \TYPO3\CMS\Install\Status\StatusInterface - */ - protected function createAdministrator() - { - $values = $this->postValues['values']; - $username = preg_replace('/\\s/i', '', $values['newUserUsername']); - $password = $values['newUserPassword']; - $passwordCheck = $values['newUserPasswordCheck']; - - if (strlen($username) < 1) { - /** @var $message \TYPO3\CMS\Install\Status\StatusInterface */ - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\ErrorStatus::class); - $message->setTitle('Administrator user not created'); - $message->setMessage('No valid username given.'); - } elseif ($password !== $passwordCheck) { - /** @var $message \TYPO3\CMS\Install\Status\StatusInterface */ - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\ErrorStatus::class); - $message->setTitle('Administrator user not created'); - $message->setMessage('Passwords do not match.'); - } elseif (strlen($password) < 8) { - /** @var $message \TYPO3\CMS\Install\Status\StatusInterface */ - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\ErrorStatus::class); - $message->setTitle('Administrator user not created'); - $message->setMessage('Password must be at least eight characters long.'); - } else { - $connectionPool = GeneralUtility::makeInstance(ConnectionPool::class); - $userExists = $connectionPool->getConnectionForTable('be_users') - ->count( - 'uid', - 'be_users', - ['username' => $username] - ); - - if ($userExists) { - /** @var $message \TYPO3\CMS\Install\Status\StatusInterface */ - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\ErrorStatus::class); - $message->setTitle('Administrator user not created'); - $message->setMessage('A user with username "' . $username . '" exists already.'); - } else { - $hashedPassword = $this->getHashedPassword($password); - $adminUserFields = [ - 'username' => $username, - 'password' => $hashedPassword, - 'admin' => 1, - 'tstamp' => $GLOBALS['EXEC_TIME'], - 'crdate' => $GLOBALS['EXEC_TIME'] - ]; - $connectionPool->getConnectionForTable('be_users') - ->insert('be_users', $adminUserFields); - /** @var $message \TYPO3\CMS\Install\Status\StatusInterface */ - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\OkStatus::class); - $message->setTitle('Administrator created with username "' . $username . '".'); - } - } - - return $message; - } - - /** - * Execute database migration - * - * @return array<\TYPO3\CMS\Install\Status\StatusInterface> - */ - protected function databaseAnalyzerExecute() - { - $messages = []; - - // Early return in case no update was selected - if (empty($this->postValues['values'])) { - /** @var $message \TYPO3\CMS\Install\Status\StatusInterface */ - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\WarningStatus::class); - $message->setTitle('No database changes selected'); - $messages[] = $message; - return $messages; - } - - $sqlReader = GeneralUtility::makeInstance(SqlReader::class); - $sqlStatements = $sqlReader->getCreateTableStatementArray($sqlReader->getTablesDefinitionString()); - $schemaMigrationService = GeneralUtility::makeInstance(SchemaMigrator::class); - - $statementHashesToPerform = $this->postValues['values']; - - $results = $schemaMigrationService->migrate($sqlStatements, $statementHashesToPerform); - - // Create error flash messages if any - foreach ($results as $errorMessage) { - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\ErrorStatus::class); - $message->setTitle('Database update failed'); - $message->setMessage('Error: ' . $errorMessage); - $messages[] = $message; - } - - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\OkStatus::class); - $message->setTitle('Executed database updates'); - $messages[] = $message; - - return $messages; - } - - /** - * "Compare" action of analyzer - * - * @return \TYPO3\CMS\Install\Status\StatusInterface - * @throws \Doctrine\DBAL\DBALException - * @throws \Doctrine\DBAL\Schema\SchemaException - * @throws \InvalidArgumentException - * @throws \TYPO3\CMS\Core\Database\Schema\Exception\StatementException - * @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotReturnException - * @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotException - * @throws \TYPO3\CMS\Core\Database\Schema\Exception\UnexpectedSignalReturnValueTypeException - * @throws \RuntimeException - */ - protected function databaseAnalyzerAnalyze() - { - $databaseAnalyzerSuggestion = []; - - $sqlReader = GeneralUtility::makeInstance(SqlReader::class); - $sqlStatements = $sqlReader->getCreateTableStatementArray($sqlReader->getTablesDefinitionString()); - $schemaMigrationService = GeneralUtility::makeInstance(SchemaMigrator::class); - - $addCreateChange = $schemaMigrationService->getUpdateSuggestions($sqlStatements); - // Aggregate the per-connection statements into one flat array - $addCreateChange = array_merge_recursive(...array_values($addCreateChange)); - - if (!empty($addCreateChange['create_table'])) { - $databaseAnalyzerSuggestion['addTable'] = []; - foreach ($addCreateChange['create_table'] as $hash => $statement) { - $databaseAnalyzerSuggestion['addTable'][$hash] = [ - 'hash' => $hash, - 'statement' => $statement, - ]; - } - } - if (!empty($addCreateChange['add'])) { - $databaseAnalyzerSuggestion['addField'] = []; - foreach ($addCreateChange['add'] as $hash => $statement) { - $databaseAnalyzerSuggestion['addField'][$hash] = [ - 'hash' => $hash, - 'statement' => $statement, - ]; - } - } - if (!empty($addCreateChange['change'])) { - $databaseAnalyzerSuggestion['change'] = []; - foreach ($addCreateChange['change'] as $hash => $statement) { - $databaseAnalyzerSuggestion['change'][$hash] = [ - 'hash' => $hash, - 'statement' => $statement, - ]; - if (isset($addCreateChange['change_currentValue'][$hash])) { - $databaseAnalyzerSuggestion['change'][$hash]['current'] = $addCreateChange['change_currentValue'][$hash]; - } - } - } - - // Difference from current to expected - $dropRename = $schemaMigrationService->getUpdateSuggestions($sqlStatements, true); - // Aggregate the per-connection statements into one flat array - $dropRename = array_merge_recursive(...array_values($dropRename)); - if (!empty($dropRename['change_table'])) { - $databaseAnalyzerSuggestion['renameTableToUnused'] = []; - foreach ($dropRename['change_table'] as $hash => $statement) { - $databaseAnalyzerSuggestion['renameTableToUnused'][$hash] = [ - 'hash' => $hash, - 'statement' => $statement, - ]; - if (!empty($dropRename['tables_count'][$hash])) { - $databaseAnalyzerSuggestion['renameTableToUnused'][$hash]['count'] = $dropRename['tables_count'][$hash]; - } - } - } - if (!empty($dropRename['change'])) { - $databaseAnalyzerSuggestion['renameTableFieldToUnused'] = []; - foreach ($dropRename['change'] as $hash => $statement) { - $databaseAnalyzerSuggestion['renameTableFieldToUnused'][$hash] = [ - 'hash' => $hash, - 'statement' => $statement, - ]; - } - } - if (!empty($dropRename['drop'])) { - $databaseAnalyzerSuggestion['deleteField'] = []; - foreach ($dropRename['drop'] as $hash => $statement) { - $databaseAnalyzerSuggestion['deleteField'][$hash] = [ - 'hash' => $hash, - 'statement' => $statement, - ]; - } - } - if (!empty($dropRename['drop_table'])) { - $databaseAnalyzerSuggestion['deleteTable'] = []; - foreach ($dropRename['drop_table'] as $hash => $statement) { - $databaseAnalyzerSuggestion['deleteTable'][$hash] = [ - 'hash' => $hash, - 'statement' => $statement, - ]; - if (!empty($dropRename['tables_count'][$hash])) { - $databaseAnalyzerSuggestion['deleteTable'][$hash]['count'] = $dropRename['tables_count'][$hash]; - } - } - } - - $this->view->assign('databaseAnalyzerSuggestion', $databaseAnalyzerSuggestion); - - /** @var $message \TYPO3\CMS\Install\Status\StatusInterface */ - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\OkStatus::class); - $message->setTitle('Analyzed current database'); - - return $message; - } -} diff --git a/typo3/sysext/install/Classes/Controller/Action/Tool/LoadExtensions.php b/typo3/sysext/install/Classes/Controller/Action/Tool/LoadExtensions.php deleted file mode 100644 index 31345d1c4ddde7c190b4e44b091422925c19a4ef..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Classes/Controller/Action/Tool/LoadExtensions.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php -namespace TYPO3\CMS\Install\Controller\Action\Tool; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Install\Controller\Action; - -/** - * Welcome page - */ -class LoadExtensions extends Action\AbstractAction -{ - /** - * Executes the tool - * - * @return string Rendered content - */ - protected function executeAction() - { - $extensionCompatibilityTesterFile = \TYPO3\CMS\Core\Utility\GeneralUtility::getIndpEnv('TYPO3_SITE_URL') . 'typo3temp/assets/ExtensionCompatibilityTester.txt'; - $this->view - ->assign('extensionCompatibilityTesterProtocolFile', $extensionCompatibilityTesterFile) - ->assign('extensionCompatibilityTesterMessages', $this->getExtensionCompatibilityTesterMessages()); - - return $this->view->render(); - } -} diff --git a/typo3/sysext/install/Classes/Controller/Action/Tool/Maintenance.php b/typo3/sysext/install/Classes/Controller/Action/Tool/Maintenance.php new file mode 100644 index 0000000000000000000000000000000000000000..19767e387f2b38ebf220d2f546def0083835d279 --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Tool/Maintenance.php @@ -0,0 +1,49 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Tool; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Core\FormProtection\FormProtectionFactory; +use TYPO3\CMS\Core\FormProtection\InstallToolFormProtection; +use TYPO3\CMS\Core\Service\OpcodeCacheService; +use TYPO3\CMS\Install\Controller\Action\AbstractAction; +use TYPO3\CMS\Install\Service\ClearTableService; +use TYPO3\CMS\Install\Service\Typo3tempFileService; + +/** + * Handle important actions + */ +class Maintenance extends AbstractAction +{ + /** + * "Maintenance" main page + * + * @return string Rendered content + */ + protected function executeAction(): string + { + $formProtection = FormProtectionFactory::get(InstallToolFormProtection::class); + $this->view->assignMultiple([ + 'clearAllCacheOpcodeCaches' => (new OpcodeCacheService())->getAllActive(), + 'clearTableStats' => (new ClearTableService())->getTableStatistics(), + 'clearTableToken' => $formProtection->generateToken('installTool', 'clearTable'), + 'clearTypo3tempFilesStats' => (new Typo3tempFileService())->getDirectoryStatistics(), + 'clearTypo3tempFilesToken' => $formProtection->generateToken('installTool', 'clearTypo3tempFiles'), + 'createAdminToken' => $formProtection->generateToken('installTool', 'createAdmin'), + 'databaseAnalyzerExecuteToken' => $formProtection->generateToken('installTool', 'databaseAnalyzerExecute'), + ]); + return $this->view->render(); + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Tool/Settings.php b/typo3/sysext/install/Classes/Controller/Action/Tool/Settings.php new file mode 100644 index 0000000000000000000000000000000000000000..117adc9b29be5f69685f6e7aec243d8bfad92463 --- /dev/null +++ b/typo3/sysext/install/Classes/Controller/Action/Tool/Settings.php @@ -0,0 +1,65 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Controller\Action\Tool; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Core\FormProtection\FormProtectionFactory; +use TYPO3\CMS\Core\FormProtection\InstallToolFormProtection; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Install\Configuration\FeatureManager; +use TYPO3\CMS\Install\Controller\Action; +use TYPO3\CMS\Install\Service\LocalConfigurationValueService; + +/** + * About page + */ +class Settings extends Action\AbstractAction +{ + /** + * @var FeatureManager + */ + protected $featureManager; + + /** + * @param FeatureManager $featureManager + */ + public function __construct(FeatureManager $featureManager = null) + { + $this->featureManager = $featureManager ?: GeneralUtility::makeInstance(FeatureManager::class); + } + + /** + * Executes the tool + * + * @return string Rendered content + */ + protected function executeAction(): string + { + $presetFeatures = $this->featureManager->getInitializedFeatures(); + $localConfigurationValueService = new LocalConfigurationValueService(); + $formProtection = FormProtectionFactory::get(InstallToolFormProtection::class); + $this->view->assignMultiple([ + 'changeInstallToolPasswordToken' => $formProtection->generateToken('installTool', 'changeInstallToolPassword'), + + 'localConfigurationWriteToken' => $formProtection->generateToken('installTool', 'localConfigurationWrite'), + 'localConfigurationSectionNames' => $localConfigurationValueService->getSpeakingSectionNames(), + 'localConfigurationData' => $localConfigurationValueService->getCurrentConfigurationData(), + + 'presetActivateToken' => $formProtection->generateToken('installTool', 'presetActivate'), + 'presetFeatures' => $presetFeatures, + ]); + return $this->view->render(); + } +} diff --git a/typo3/sysext/install/Classes/Controller/Action/Tool/SystemEnvironment.php b/typo3/sysext/install/Classes/Controller/Action/Tool/SystemEnvironment.php deleted file mode 100644 index 8d55ac3d0f5379a75cd2393234b60aca61eec545..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Classes/Controller/Action/Tool/SystemEnvironment.php +++ /dev/null @@ -1,49 +0,0 @@ -<?php -namespace TYPO3\CMS\Install\Controller\Action\Tool; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Install\Controller\Action; -use TYPO3\CMS\Install\Status\StatusUtility; -use TYPO3\CMS\Install\SystemEnvironment\Check; -use TYPO3\CMS\Install\SystemEnvironment\DatabaseCheck; -use TYPO3\CMS\Install\SystemEnvironment\SetupCheck; - -/** - * Show system environment check results - */ -class SystemEnvironment extends Action\AbstractAction -{ - /** - * Executes the tool - * - * @return string Rendered content - */ - protected function executeAction() - { - $statusObjects = array_merge( - GeneralUtility::makeInstance(Check::class)->getStatus(), - GeneralUtility::makeInstance(SetupCheck::class)->getStatus(), - GeneralUtility::makeInstance(DatabaseCheck::class)->getStatus() - ); - - /** @var $statusUtility StatusUtility */ - $statusUtility = GeneralUtility::makeInstance(StatusUtility::class); - $sortedStatusObjects = $statusUtility->sortBySeverity($statusObjects); - $this->view->assign('statusObjectsBySeverity', $sortedStatusObjects); - - return $this->view->render(); - } -} diff --git a/typo3/sysext/install/Classes/Controller/Action/Tool/TestSetup.php b/typo3/sysext/install/Classes/Controller/Action/Tool/TestSetup.php deleted file mode 100644 index 29ab8c6601979d471733262768c866fc98fd8d2e..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Classes/Controller/Action/Tool/TestSetup.php +++ /dev/null @@ -1,710 +0,0 @@ -<?php -namespace TYPO3\CMS\Install\Controller\Action\Tool; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Core\Imaging\GraphicalFunctions; -use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Core\Utility\StringUtility; -use TYPO3\CMS\Install\Controller\Action; - -/** - * Test various system setup settings - */ -class TestSetup extends Action\AbstractAction -{ - /** - * @var string Absolute path to image folder - */ - protected $imageBasePath = ''; - - /** - * Executes the tool - * - * @return string Rendered content - */ - protected function executeAction() - { - $this->imageBasePath = \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('install') . 'Resources/Public/Images/'; - - $actionMessages = []; - if (isset($this->postValues['set']['testMail'])) { - $actionMessages[] = $this->sendTestMail(); - $this->view->assign('postAction', 'testMail'); - } - - if (isset($this->postValues['set']['testTrueTypeFont'])) { - $this->view->assign('trueTypeFontTested', true); - $actionMessages[] = $this->createTrueTypeFontTestImage(); - } - - if (isset($this->postValues['set']['testConvertImageFormatsToJpg'])) { - $this->view->assign('convertImageFormatsToJpgTested', true); - if ($this->isImageMagickEnabledAndConfigured()) { - $actionMessages[] = $this->convertImageFormatsToJpg(); - } else { - $actionMessages[] = $this->imageMagickDisabledMessage(); - } - } - - if (isset($this->postValues['set']['testWriteGifAndPng'])) { - $this->view->assign('writeGifAndPngTested', true); - if ($this->isImageMagickEnabledAndConfigured()) { - $actionMessages[] = $this->writeGifAndPng(); - } else { - $actionMessages[] = $this->imageMagickDisabledMessage(); - } - } - - if (isset($this->postValues['set']['testScalingImages'])) { - $this->view->assign('scalingImagesTested', true); - if ($this->isImageMagickEnabledAndConfigured()) { - $actionMessages[] = $this->scaleImages(); - } else { - $actionMessages[] = $this->imageMagickDisabledMessage(); - } - } - - if (isset($this->postValues['set']['testCombiningImages'])) { - $this->view->assign('combiningImagesTested', true); - if ($this->isImageMagickEnabledAndConfigured()) { - $actionMessages[] = $this->combineImages(); - } else { - $actionMessages[] = $this->imageMagickDisabledMessage(); - } - } - - if (isset($this->postValues['set']['testGdlib'])) { - $this->view->assign('gdlibTested', true); - $actionMessages[] = $this->gdlib(); - } - - $this->view->assign('actionMessages', $actionMessages); - $this->view->assign('senderEmailAddress', $this->getSenderEmailAddress()); - $this->view->assign('imageConfiguration', $this->getImageConfiguration()); - - return $this->view->render(); - } - - /** - * Send a test mail to specified email address - * - * @return \TYPO3\CMS\Install\Status\StatusInterface - */ - protected function sendTestMail() - { - if ( - !isset($this->postValues['values']['testEmailRecipient']) - || !GeneralUtility::validEmail($this->postValues['values']['testEmailRecipient']) - ) { - /** @var $message \TYPO3\CMS\Install\Status\StatusInterface */ - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\ErrorStatus::class); - $message->setTitle('Mail not sent'); - $message->setMessage('Given address is not a valid email address.'); - } else { - $recipient = $this->postValues['values']['testEmailRecipient']; - /** @var $mailMessage \TYPO3\CMS\Core\Mail\MailMessage */ - $mailMessage = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Mail\MailMessage::class); - $mailMessage - ->addTo($recipient) - ->addFrom($this->getSenderEmailAddress(), $this->getSenderEmailName()) - ->setSubject($this->getEmailSubject()) - ->setBody('<html><body>html test content</body></html>', 'text/html') - ->addPart('TEST CONTENT') - ->send(); - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\OkStatus::class); - $message->setTitle('Test mail sent'); - $message->setMessage('Recipient: ' . $recipient); - } - return $message; - } - - /** - * Get sender address from configuration - * ['TYPO3_CONF_VARS']['MAIL']['defaultMailFromAddress'] - * If this setting is empty fall back to 'no-reply@example.com' - * - * @return string Returns an email address - */ - protected function getSenderEmailAddress() - { - return !empty($GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromAddress']) - ? $GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromAddress'] - : 'no-reply@example.com'; - } - - /** - * Gets sender name from configuration - * ['TYPO3_CONF_VARS']['MAIL']['defaultMailFromName'] - * If this setting is empty, it falls back to a default string. - * - * @return string - */ - protected function getSenderEmailName() - { - return !empty($GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromName']) - ? $GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromName'] - : 'TYPO3 CMS install tool'; - } - - /** - * Gets email subject from configuration - * ['TYPO3_CONF_VARS']['SYS']['sitename'] - * If this setting is empty, it falls back to a default string. - * - * @return string - */ - protected function getEmailSubject() - { - $name = !empty($GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename']) - ? ' from site "' . $GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'] . '"' - : ''; - return 'Test TYPO3 CMS mail delivery' . $name; - } - - /** - * Create true type font test image - * - * @return \TYPO3\CMS\Install\Status\StatusInterface - */ - protected function createTrueTypeFontTestImage() - { - $parseTimeStart = GeneralUtility::milliseconds(); - - $image = @imagecreate(200, 50); - imagecolorallocate($image, 255, 255, 55); - $textColor = imagecolorallocate($image, 233, 14, 91); - @imagettftext( - $image, - 20 / 96.0 * 72, // As in compensateFontSizeiBasedOnFreetypeDpi - 0, - 10, - 20, - $textColor, - \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('install') . 'Resources/Private/Font/vera.ttf', - 'Testing true type' - ); - $outputFile = PATH_site . 'typo3temp/assets/images/installTool-' . StringUtility::getUniqueId('createTrueTypeFontTestImage') . '.gif'; - imagegif($image, $outputFile); - - /** @var \TYPO3\CMS\Install\Status\StatusInterface $message */ - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\InfoStatus::class); - $message->setTitle('True type font'); - $message->setMessage( - 'If the two images below do not look the same, please check your FreeType 2 module.' - ); - - $testResults = []; - $testResults['ttf'] = []; - $testResults['ttf']['message'] = $message; - $testResults['ttf']['title'] = ''; - $testResults['ttf']['outputFile'] = $outputFile; - $testResults['ttf']['referenceFile'] = $this->imageBasePath . 'TestReference/Font.gif'; - - $this->view->assign('testResults', $testResults); - return $this->imageTestDoneMessage(GeneralUtility::milliseconds() - $parseTimeStart); - } - - /** - * Create jpg from various image formats using IM / GM - * - * @return \TYPO3\CMS\Install\Status\StatusInterface - */ - protected function convertImageFormatsToJpg() - { - $imageProcessor = $this->initializeImageProcessor(); - $parseTimeStart = GeneralUtility::milliseconds(); - - $inputFormatsToTest = ['jpg', 'gif', 'png', 'tif', 'pdf', 'ai']; - - $testResults = []; - foreach ($inputFormatsToTest as $formatToTest) { - $result = []; - if (!GeneralUtility::inList($GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'], $formatToTest)) { - /** @var \TYPO3\CMS\Install\Status\StatusInterface $message */ - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\WarningStatus::class); - $message->setTitle('Skipped test'); - $message->setMessage('Handling format ' . $formatToTest . ' must be enabled in TYPO3_CONF_VARS[\'GFX\'][\'imagefile_ext\']'); - $result['error'] = $message; - } else { - $imageProcessor->IM_commands = []; - $inputFile = $this->imageBasePath . 'TestInput/Test.' . $formatToTest; - $imageProcessor->imageMagickConvert_forceFileNameBody = StringUtility::getUniqueId('read') . '-' . $formatToTest; - $imResult = $imageProcessor->imageMagickConvert($inputFile, 'jpg', '300', '', '', '', [], true); - $result['title'] = 'Read ' . $formatToTest; - if ($imResult !== null) { - $result['outputFile'] = $imResult[3]; - $result['referenceFile'] = $this->imageBasePath . 'TestReference/Read-' . $formatToTest . '.jpg'; - $result['command'] = $imageProcessor->IM_commands; - } else { - $result['error'] = $this->imageGenerationFailedMessage(); - } - } - $testResults[] = $result; - } - - $this->view->assign('testResults', $testResults); - return $this->imageTestDoneMessage(GeneralUtility::milliseconds() - $parseTimeStart); - } - - /** - * Write gif and png test - * - * @return \TYPO3\CMS\Install\Status\StatusInterface - */ - protected function writeGifAndPng() - { - $imageProcessor = $this->initializeImageProcessor(); - $parseTimeStart = GeneralUtility::milliseconds(); - - $testResults = [ - 'gif' => [], - 'png' => [], - ]; - - // Gif - $inputFile = $this->imageBasePath . 'TestInput/Test.gif'; - $imageProcessor->imageMagickConvert_forceFileNameBody = StringUtility::getUniqueId('write-gif'); - $imResult = $imageProcessor->imageMagickConvert($inputFile, 'gif', '300', '', '', '', [], true); - if ($imResult !== null && is_file($imResult[3])) { - if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['gif_compress']) { - clearstatcache(); - $previousSize = GeneralUtility::formatSize(filesize($imResult[3])); - $methodUsed = GraphicalFunctions::gifCompress($imResult[3], ''); - clearstatcache(); - $compressedSize = GeneralUtility::formatSize(filesize($imResult[3])); - /** @var \TYPO3\CMS\Install\Status\StatusInterface $message */ - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\InfoStatus::class); - $message->setTitle('Compressed gif'); - $message->setMessage( - 'Method used by compress: ' . $methodUsed . LF - . ' Previous filesize: ' . $previousSize . '. Current filesize:' . $compressedSize - ); - } else { - /** @var \TYPO3\CMS\Install\Status\StatusInterface $message */ - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\InfoStatus::class); - $message->setTitle('Gif compression not enabled by [GFX][gif_compress]'); - } - $testResults['gif']['message'] = $message; - $testResults['gif']['title'] = 'Write gif'; - $testResults['gif']['outputFile'] = $imResult[3]; - $testResults['gif']['referenceFile'] = $this->imageBasePath . 'TestReference/Write-gif.gif'; - $testResults['gif']['command'] = $imageProcessor->IM_commands; - } else { - $testResults['gif']['error'] = $this->imageGenerationFailedMessage(); - } - - // Png - $inputFile = $this->imageBasePath . 'TestInput/Test.png'; - $imageProcessor->IM_commands = []; - $imageProcessor->imageMagickConvert_forceFileNameBody = StringUtility::getUniqueId('write-png'); - $imResult = $imageProcessor->imageMagickConvert($inputFile, 'png', '300', '', '', '', [], true); - if ($imResult !== null) { - $testResults['png']['title'] = 'Write png'; - $testResults['png']['outputFile'] = $imResult[3]; - $testResults['png']['referenceFile'] = $this->imageBasePath . 'TestReference/Write-png.png'; - $testResults['png']['command'] = $imageProcessor->IM_commands; - } else { - $testResults['png']['error'] = $this->imageGenerationFailedMessage(); - } - - $this->view->assign('testResults', $testResults); - return $this->imageTestDoneMessage(GeneralUtility::milliseconds() - $parseTimeStart); - } - - /** - * Write gif and png test - * - * @return \TYPO3\CMS\Install\Status\StatusInterface - */ - protected function scaleImages() - { - $imageProcessor = $this->initializeImageProcessor(); - $parseTimeStart = GeneralUtility::milliseconds(); - - $testResults = [ - 'gif-to-gif' => [], - 'png-to-png' => [], - 'gif-to-jpg' => [], - ]; - - $imageProcessor->IM_commands = []; - $inputFile = $this->imageBasePath . 'TestInput/Transparent.gif'; - $imageProcessor->imageMagickConvert_forceFileNameBody = StringUtility::getUniqueId('scale-gif'); - $imResult = $imageProcessor->imageMagickConvert($inputFile, 'gif', '300', '', '', '', [], true); - if ($imResult !== null) { - $testResults['gif-to-gif']['title'] = 'gif to gif'; - $testResults['gif-to-gif']['outputFile'] = $imResult[3]; - $testResults['gif-to-gif']['referenceFile'] = $this->imageBasePath . 'TestReference/Scale-gif.gif'; - $testResults['gif-to-gif']['command'] = $imageProcessor->IM_commands; - } else { - $testResults['gif-to-gif']['error'] = $this->imageGenerationFailedMessage(); - } - - $imageProcessor->IM_commands = []; - $inputFile = $this->imageBasePath . 'TestInput/Transparent.png'; - $imageProcessor->imageMagickConvert_forceFileNameBody = StringUtility::getUniqueId('scale-png'); - $imResult = $imageProcessor->imageMagickConvert($inputFile, 'png', '300', '', '', '', [], true); - if ($imResult !== null) { - $testResults['png-to-png']['title'] = 'png to png'; - $testResults['png-to-png']['outputFile'] = $imResult[3]; - $testResults['png-to-png']['referenceFile'] = $this->imageBasePath . 'TestReference/Scale-png.png'; - $testResults['png-to-png']['command'] = $imageProcessor->IM_commands; - } else { - $testResults['png-to-png']['error'] = $this->imageGenerationFailedMessage(); - } - - $imageProcessor->IM_commands = []; - $inputFile = $this->imageBasePath . 'TestInput/Transparent.gif'; - $imageProcessor->imageMagickConvert_forceFileNameBody = StringUtility::getUniqueId('scale-jpg'); - $imResult = $imageProcessor->imageMagickConvert($inputFile, 'jpg', '300', '', '-opaque white -background white -flatten', '', [], true); - if ($imResult !== null) { - $testResults['gif-to-jpg']['title'] = 'gif to jpg'; - $testResults['gif-to-jpg']['outputFile'] = $imResult[3]; - $testResults['gif-to-jpg']['referenceFile'] = $this->imageBasePath . 'TestReference/Scale-jpg.jpg'; - $testResults['gif-to-jpg']['command'] = $imageProcessor->IM_commands; - } else { - $testResults['gif-to-jpg']['error'] = $this->imageGenerationFailedMessage(); - } - - $this->view->assign('testResults', $testResults); - return $this->imageTestDoneMessage(GeneralUtility::milliseconds() - $parseTimeStart); - } - - /** - * Combine multiple images into one test - * - * @return \TYPO3\CMS\Install\Status\StatusInterface - */ - protected function combineImages() - { - $imageProcessor = $this->initializeImageProcessor(); - $parseTimeStart = GeneralUtility::milliseconds(); - - $testResults = [ - 'combine1' => [], - 'combine2' => [], - ]; - - $inputFile = $this->imageBasePath . 'TestInput/BackgroundOrange.gif'; - $overlayFile = $this->imageBasePath . 'TestInput/Test.jpg'; - $maskFile = $this->imageBasePath . 'TestInput/MaskBlackWhite.gif'; - $resultFile = $this->getImagesPath($imageProcessor) . $imageProcessor->filenamePrefix - . StringUtility::getUniqueId($imageProcessor->alternativeOutputKey . 'combine1') . '.jpg'; - $imageProcessor->combineExec($inputFile, $overlayFile, $maskFile, $resultFile); - $result = $imageProcessor->getImageDimensions($resultFile); - if ($result) { - $testResults['combine1']['title'] = 'Combine using a GIF mask with only black and white'; - $testResults['combine1']['outputFile'] = $result[3]; - $testResults['combine1']['referenceFile'] = $this->imageBasePath . 'TestReference/Combine-1.jpg'; - $testResults['combine1']['command'] = $imageProcessor->IM_commands; - } else { - $testResults['combine1']['error'] = $this->imageGenerationFailedMessage(); - } - - $imageProcessor->IM_commands = []; - $inputFile = $this->imageBasePath . 'TestInput/BackgroundCombine.jpg'; - $overlayFile = $this->imageBasePath . 'TestInput/Test.jpg'; - $maskFile = $this->imageBasePath . 'TestInput/MaskCombine.jpg'; - $resultFile = $this->getImagesPath($imageProcessor) . $imageProcessor->filenamePrefix - . StringUtility::getUniqueId($imageProcessor->alternativeOutputKey . 'combine2') . '.jpg'; - $imageProcessor->combineExec($inputFile, $overlayFile, $maskFile, $resultFile); - $result = $imageProcessor->getImageDimensions($resultFile); - if ($result) { - $testResults['combine2']['title'] = 'Combine using a JPG mask with graylevels'; - $testResults['combine2']['outputFile'] = $result[3]; - $testResults['combine2']['referenceFile'] = $this->imageBasePath . 'TestReference/Combine-2.jpg'; - $testResults['combine2']['command'] = $imageProcessor->IM_commands; - } else { - $testResults['combine2']['error'] = $this->imageGenerationFailedMessage(); - } - - $this->view->assign('testResults', $testResults); - return $this->imageTestDoneMessage(GeneralUtility::milliseconds() - $parseTimeStart); - } - - /** - * Test gdlib functions - * - * @return \TYPO3\CMS\Install\Status\StatusInterface - */ - protected function gdlib() - { - $imageProcessor = $this->initializeImageProcessor(); - $parseTimeStart = GeneralUtility::milliseconds(); - $gifOrPng = $imageProcessor->gifExtension; - $testResults = []; - - // GD with simple box - $imageProcessor->IM_commands = []; - $image = imagecreatetruecolor(300, 225); - $backgroundColor = imagecolorallocate($image, 0, 0, 0); - imagefilledrectangle($image, 0, 0, 300, 225, $backgroundColor); - $workArea = [0, 0, 300, 225]; - $conf = [ - 'dimensions' => '10,50,280,50', - 'color' => 'olive', - ]; - $imageProcessor->makeBox($image, $conf, $workArea); - $outputFile = $this->getImagesPath($imageProcessor) . $imageProcessor->filenamePrefix . StringUtility::getUniqueId('gdSimple') . '.' . $gifOrPng; - $imageProcessor->ImageWrite($image, $outputFile); - $result = $imageProcessor->getImageDimensions($outputFile); - $testResults['simple'] = []; - $testResults['simple']['title'] = 'Create simple image'; - $testResults['simple']['outputFile'] = $result[3]; - $testResults['simple']['referenceFile'] = $this->imageBasePath . 'TestReference/Gdlib-simple.' . $gifOrPng; - $testResults['simple']['command'] = $imageProcessor->IM_commands; - - // GD from image with box - $imageProcessor->IM_commands = []; - $inputFile = $this->imageBasePath . 'TestInput/Test.' . $gifOrPng; - $image = $imageProcessor->imageCreateFromFile($inputFile); - - $workArea = [0, 0, 400, 300]; - $conf = [ - 'dimensions' => '10,50,380,50', - 'color' => 'olive', - ]; - $imageProcessor->makeBox($image, $conf, $workArea); - $outputFile = $this->getImagesPath($imageProcessor) . $imageProcessor->filenamePrefix . StringUtility::getUniqueId('gdBox') . '.' . $gifOrPng; - $imageProcessor->ImageWrite($image, $outputFile); - $result = $imageProcessor->getImageDimensions($outputFile); - $testResults['box'] = []; - $testResults['box']['title'] = 'Create image from file'; - $testResults['box']['outputFile'] = $result[3]; - $testResults['box']['referenceFile'] = $this->imageBasePath . 'TestReference/Gdlib-box.' . $gifOrPng; - $testResults['box']['command'] = $imageProcessor->IM_commands; - - // GD with text - $imageProcessor->IM_commands = []; - $image = imagecreatetruecolor(300, 225); - $backgroundColor = imagecolorallocate($image, 128, 128, 150); - imagefilledrectangle($image, 0, 0, 300, 225, $backgroundColor); - $workArea = [0, 0, 300, 225]; - $conf = [ - 'iterations' => 1, - 'angle' => 0, - 'antiAlias' => 1, - 'text' => 'HELLO WORLD', - 'fontColor' => '#003366', - 'fontSize' => 30, - 'fontFile' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('install') . 'Resources/Private/Font/vera.ttf', - 'offset' => '30,80', - ]; - $conf['BBOX'] = $imageProcessor->calcBBox($conf); - $imageProcessor->makeText($image, $conf, $workArea); - $outputFile = $this->getImagesPath($imageProcessor) . $imageProcessor->filenamePrefix . StringUtility::getUniqueId('gdText') . '.' . $gifOrPng; - $imageProcessor->ImageWrite($image, $outputFile); - $result = $imageProcessor->getImageDimensions($outputFile); - $testResults['text'] = []; - $testResults['text']['title'] = 'Render text with TrueType font'; - $testResults['text']['outputFile'] = $result[3]; - $testResults['text']['referenceFile'] = $this->imageBasePath . 'TestReference/Gdlib-text.' . $gifOrPng; - $testResults['text']['command'] = $imageProcessor->IM_commands; - - // GD with text, niceText - $testResults['niceText'] = []; - if ($this->isImageMagickEnabledAndConfigured()) { - // Warning: Re-uses $conf from above! - $conf['offset'] = '30,120'; - $conf['niceText'] = 1; - $imageProcessor->makeText($image, $conf, $workArea); - $outputFile = $this->getImagesPath($imageProcessor) . $imageProcessor->filenamePrefix . StringUtility::getUniqueId('gdNiceText') . '.' . $gifOrPng; - $imageProcessor->ImageWrite($image, $outputFile); - $result = $imageProcessor->getImageDimensions($outputFile); - $testResults['niceText']['title'] = 'Render text with TrueType font using \'niceText\' option'; - $testResults['niceText']['outputFile'] = $result[3]; - $testResults['niceText']['referenceFile'] = $this->imageBasePath . 'TestReference/Gdlib-niceText.' . $gifOrPng; - $testResults['niceText']['command'] = $imageProcessor->IM_commands; - /** @var \TYPO3\CMS\Install\Status\StatusInterface $message */ - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\InfoStatus::class); - $message->setTitle('Note on \'niceText\''); - $message->setMessage( - '\'niceText\' is a concept that tries to improve the antialiasing of the rendered type by' - . ' actually rendering the textstring in double size on a black/white mask, downscaling the mask' - . ' and masking the text onto the image through this mask. This involves' - . ' ImageMagick \'combine\'/\'composite\' and \'convert\'.' - ); - $testResults['niceText']['message'] = $message; - } else { - $result['niceText']['error'] = $this->imageGenerationFailedMessage(); - } - - // GD with text, niceText, shadow - $testResults['shadow'] = []; - if ($this->isImageMagickEnabledAndConfigured()) { - // Warning: Re-uses $conf from above! - $conf['offset'] = '30,160'; - $conf['niceText'] = 1; - $conf['shadow.'] = [ - 'offset' => '2,2', - 'blur' => $imageProcessor->NO_IM_EFFECTS ? '90' : '20', - 'opacity' => '50', - 'color' => 'black' - ]; - // Warning: Re-uses $image from above! - $imageProcessor->makeShadow($image, $conf['shadow.'], $workArea, $conf); - $imageProcessor->makeText($image, $conf, $workArea); - $outputFile = $this->getImagesPath($imageProcessor) . $imageProcessor->filenamePrefix . StringUtility::getUniqueId('GDwithText-niceText-shadow') . '.' . $gifOrPng; - $imageProcessor->ImageWrite($image, $outputFile); - $result = $imageProcessor->getImageDimensions($outputFile); - $testResults['shadow']['title'] = 'Render \'niceText\' with a shadow under'; - $testResults['shadow']['outputFile'] = $result[3]; - $testResults['shadow']['referenceFile'] = $this->imageBasePath . 'TestReference/Gdlib-shadow.' . $gifOrPng; - $testResults['shadow']['command'] = $imageProcessor->IM_commands; - /** @var \TYPO3\CMS\Install\Status\StatusInterface $message */ - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\InfoStatus::class); - $message->setTitle('Note on \'shadow\''); - $message->setMessage( - 'This test makes sense only if the above test had a correct output. But if so, you may not see' - . ' a soft dropshadow from the third text string as you should. In that case you are most likely' - . ' using ImageMagick 5 and should set the flag TYPO3_CONF_VARS[GFX][processor_effects].' - ); - $testResults['shadow']['message'] = $message; - } else { - $result['shadow']['error'] = $this->imageGenerationFailedMessage(); - } - - $this->view->assign('testResults', $testResults); - return $this->imageTestDoneMessage(GeneralUtility::milliseconds() - $parseTimeStart); - } - - /** - * Create a 'image test was done' message - * - * @param int $parseTime Parse time - * @return \TYPO3\CMS\Install\Status\StatusInterface - */ - protected function imageTestDoneMessage($parseTime = 0) - { - /** @var \TYPO3\CMS\Install\Status\StatusInterface $message */ - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\OkStatus::class); - $message->setTitle('Executed image tests'); - $message->setMessage('Parse time: ' . $parseTime . ' ms'); - return $message; - } - - /** - * Create a 'imageMagick disabled' message - * - * @return \TYPO3\CMS\Install\Status\StatusInterface - */ - protected function imageMagickDisabledMessage() - { - /** @var \TYPO3\CMS\Install\Status\StatusInterface $message */ - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\ErrorStatus::class); - $message->setTitle('Tests not executed'); - $message->setMessage('ImageMagick / GraphicsMagick handling is disabled or not configured correctly.'); - return $message; - } - - /** - * Create a 'image generation failed' message - * - * @return \TYPO3\CMS\Install\Status\StatusInterface - */ - protected function imageGenerationFailedMessage() - { - /** @var \TYPO3\CMS\Install\Status\StatusInterface $message */ - $message = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Status\ErrorStatus::class); - $message->setTitle('Image generation failed'); - $message->setMessage( - 'ImageMagick / GraphicsMagick handling is enabled, but the execute' - . ' command returned an error. Please check your settings, especially' - . ' [\'GFX\'][\'processor_path\'] and [\'GFX\'][\'processor_path_lzw\'] and ensure Ghostscript is installed on your server.' - ); - return $message; - } - - /** - * Gather image configuration overview - * - * @return array Result array - */ - protected function getImageConfiguration() - { - $result = []; - $result['processor'] = $GLOBALS['TYPO3_CONF_VARS']['GFX']['processor'] === 'GraphicsMagick' ? 'GraphicsMagick' : 'ImageMagick'; - $result['processorEnabled'] = $GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_enabled']; - $result['processorPath'] = $GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_path']; - $result['processorVersion'] = $this->determineImageMagickVersion(); - $result['processorEffects'] = $GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_effects']; - $result['gdlibEnabled'] = $GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib']; - $result['gdlibPng'] = $GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib_png']; - $result['fileFormats'] = $GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext']; - return $result; - } - - /** - * Initialize image processor - * - * @return GraphicalFunctions Initialized image processor - */ - protected function initializeImageProcessor() - { - /** @var GraphicalFunctions $imageProcessor */ - $imageProcessor = GeneralUtility::makeInstance(GraphicalFunctions::class); - $imageProcessor->init(); - $imageProcessor->absPrefix = PATH_site; - $imageProcessor->dontCheckForExistingTempFile = 1; - $imageProcessor->filenamePrefix = 'installTool-'; - $imageProcessor->dontCompress = 1; - $imageProcessor->alternativeOutputKey = 'typo3InstallTest'; - $imageProcessor->noFramePrepended = $GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_allowFrameSelection']; - return $imageProcessor; - } - - /** - * Find out if ImageMagick or GraphicsMagick is enabled and set up - * - * @return bool TRUE if enabled and path is set - */ - protected function isImageMagickEnabledAndConfigured() - { - $enabled = $GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_enabled']; - $path = $GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_path']; - return $enabled && $path; - } - - /** - * Determine ImageMagick / GraphicsMagick version - * - * @return string Version - */ - protected function determineImageMagickVersion() - { - $command = \TYPO3\CMS\Core\Utility\CommandUtility::imageMagickCommand('identify', '-version'); - \TYPO3\CMS\Core\Utility\CommandUtility::exec($command, $result); - $string = $result[0]; - list(, $version) = explode('Magick', $string); - list($version) = explode(' ', trim($version)); - return trim($version); - } - - /** - * Return the temp image dir. - * If not exist it will be created - * - * @param GraphicalFunctions $imageProcessor - * @return string - */ - protected function getImagesPath(GraphicalFunctions $imageProcessor) - { - $imagePath = $imageProcessor->absPrefix . 'typo3temp/assets/images/'; - if (!is_dir($imagePath)) { - GeneralUtility::mkdir_deep($imagePath); - } - return $imagePath; - } -} diff --git a/typo3/sysext/install/Classes/Controller/Action/Tool/UpgradeAnalysis.php b/typo3/sysext/install/Classes/Controller/Action/Tool/Upgrade.php similarity index 53% rename from typo3/sysext/install/Classes/Controller/Action/Tool/UpgradeAnalysis.php rename to typo3/sysext/install/Classes/Controller/Action/Tool/Upgrade.php index 3c43fbfc8ede50dfbb3c1282c1c3ec61feb1a637..70a4c9433c8db94f9b805fd82f52ebbd1bc2a153 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Tool/UpgradeAnalysis.php +++ b/typo3/sysext/install/Classes/Controller/Action/Tool/Upgrade.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Controller\Action\Tool; /* @@ -14,45 +15,73 @@ namespace TYPO3\CMS\Install\Controller\Action\Tool; * The TYPO3 project - inspiring people to share! */ +use Symfony\Component\Finder\Finder; +use TYPO3\CMS\Core\Core\Bootstrap; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\FormProtection\FormProtectionFactory; use TYPO3\CMS\Core\FormProtection\InstallToolFormProtection; use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Install\Controller\Action\AbstractAction; +use TYPO3\CMS\Install\Service\CoreUpdateService; +use TYPO3\CMS\Install\Service\CoreVersionService; use TYPO3\CMS\Install\UpgradeAnalysis\DocumentationFile; /** - * Run code analysis based on changelog documentation + * Render "Upgrade" section main card content */ -class UpgradeAnalysis extends AbstractAction +class Upgrade extends AbstractAction { - /** - * Executes the action upon click in the Install Tool Menu - * - * All available documentation files are aggregated and - * passed to the frontend to be displayed as a list of entries. - * - * All following actions are handled via Ajax. + * Executes the tool * * @return string Rendered content - * @throws \InvalidArgumentException */ - protected function executeAction() + protected function executeAction(): string + { + $extensionsInTypo3conf = (new Finder())->directories()->in(PATH_site . 'typo3conf/ext')->depth('== 0')->sortByName(); + $coreUpdateService = GeneralUtility::makeInstance(CoreUpdateService::class); + $coreVersionService = GeneralUtility::makeInstance(CoreVersionService::class); + $formProtection = FormProtectionFactory::get(InstallToolFormProtection::class); + $documentationFiles = $this->getDocumentationFiles(); + $this->view->assignMultiple([ + 'extensionCompatibilityTesterProtocolFile' => GeneralUtility::getIndpEnv('TYPO3_SITE_URL') . 'typo3temp/assets/ExtensionCompatibilityTester.txt', + 'extensionCompatibilityTesterErrorProtocolFile' => GeneralUtility::getIndpEnv('TYPO3_SITE_URL') . 'typo3temp/assets/ExtensionCompatibilityTesterErrors.json', + + 'coreUpdateEnabled' => $coreUpdateService->isCoreUpdateEnabled(), + 'coreUpdateComposerMode' => Bootstrap::usesComposerClassLoading(), + 'coreUpdateIsReleasedVersion' => $coreVersionService->isInstalledVersionAReleasedVersion(), + 'coreUpdateIsSymLinkedCore' => is_link(PATH_site . 'typo3_src'), + + 'extensionScannerExtensionList' => $extensionsInTypo3conf, + 'extensionScannerFilesToken' => $formProtection->generateToken('installTool', 'extensionScannerFiles'), + 'extensionScannerScanFileToken' => $formProtection->generateToken('installTool', 'extensionScannerScanFile'), + 'extensionScannerMarkFullyScannedRestFilesToken' => $formProtection->generateToken('installTool', 'extensionScannerMarkFullyScannedRestFiles'), + + 'upgradeDocsMarkReadToken' => $formProtection->generateToken('installTool', 'upgradeDocsMarkRead'), + 'upgradeDocsUnmarkReadToken' => $formProtection->generateToken('installTool', 'upgradeDocsUnmarkRead'), + 'upgradeDocsFiles' => $documentationFiles['normalFiles'], + 'upgradeDocsReadFiles' => $documentationFiles['readFiles'], + 'upgradeDocsNotAffectedFiles' => $documentationFiles['notAffectedFiles'], + + 'upgradeWizardsMarkUndoneToken' => $formProtection->generateToken('installTool', 'upgradeWizardsMarkUndone'), + 'upgradeWizardsInputToken' => $formProtection->generateToken('installTool', 'upgradeWizardsInput'), + 'upgradeWizardsExecuteToken' => $formProtection->generateToken('installTool', 'upgradeWizardsExecute'), + ]); + return $this->view->render(); + } + + /** + * Get a list of '.rst' files and their details for "Upgrade documentation" view. + * + * @return array + */ + protected function getDocumentationFiles(): array { $documentationFileService = new DocumentationFile(); $documentationFiles = $documentationFileService->findDocumentationFiles( strtr(realpath(PATH_site . ExtensionManagementUtility::siteRelPath('core') . 'Documentation/Changelog'), '\\', '/') ); - - $formProtection = FormProtectionFactory::get(InstallToolFormProtection::class); - $saveIgnoredItemsToken = $formProtection->generateToken('installTool', 'saveIgnoredItems'); - $removeIgnoredItemsToken = $formProtection->generateToken('installTool', 'removeIgnoredItems'); - $this->view->assignMultiple([ - 'saveIgnoredItemsToken' => $saveIgnoredItemsToken, - 'removeIgnoredItemsToken' => $removeIgnoredItemsToken, - ]); $documentationFiles = array_reverse($documentationFiles); $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_registry'); @@ -66,7 +95,6 @@ class UpgradeAnalysis extends AbstractAction ) ->execute() ->fetchAll(); - $hashesMarkedAsRead = []; foreach ($filesMarkedAsRead as $file) { $hashesMarkedAsRead[] = $file['entry_key']; @@ -82,7 +110,6 @@ class UpgradeAnalysis extends AbstractAction ) ->execute() ->fetchAll(); - $hashesMarkedAsNotAffected = []; foreach ($fileMarkedAsNotAffected as $file) { $hashesMarkedAsNotAffected[] = $file['entry_key']; @@ -110,9 +137,10 @@ class UpgradeAnalysis extends AbstractAction } } - $this->view->assign('files', $documentationFiles); - $this->view->assign('shownFiles', $readFiles); - $this->view->assign('notAffectedFiles', $notAffectedFiles); - return $this->view->render(); + return [ + 'normalFiles' => $documentationFiles, + 'readFiles' => $readFiles, + 'notAffectedFiles' => $notAffectedFiles, + ]; } } diff --git a/typo3/sysext/install/Classes/Controller/Action/Tool/UpgradeWizard.php b/typo3/sysext/install/Classes/Controller/Action/Tool/UpgradeWizard.php deleted file mode 100644 index f617fef0200411c345efbd9ccdd0b756e7fcfc9c..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Classes/Controller/Action/Tool/UpgradeWizard.php +++ /dev/null @@ -1,442 +0,0 @@ -<?php -namespace TYPO3\CMS\Install\Controller\Action\Tool; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Core\Cache\DatabaseSchemaService; -use TYPO3\CMS\Core\Database\Schema\Exception\StatementException; -use TYPO3\CMS\Core\Database\Schema\SchemaMigrator; -use TYPO3\CMS\Core\Database\Schema\SqlReader; -use TYPO3\CMS\Core\Registry; -use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Core\Utility\VersionNumberUtility; -use TYPO3\CMS\Install\Controller\Action; -use TYPO3\CMS\Install\Status\ErrorStatus; -use TYPO3\CMS\Install\Status\NoticeStatus; -use TYPO3\CMS\Install\Status\OkStatus; -use TYPO3\CMS\Install\Status\StatusInterface; -use TYPO3\CMS\Install\Status\WarningStatus; -use TYPO3\CMS\Install\Updates\AbstractUpdate; -use TYPO3\CMS\Install\Updates\RowUpdater\RowUpdaterInterface; - -/** - * Handle update wizards - */ -class UpgradeWizard extends Action\AbstractAction -{ - /** - * There are tables and fields missing in the database - * - * @var bool - */ - protected $needsInitialUpdateDatabaseSchema = false; - - /** - * Executes the tool - * - * @return string Rendered content - */ - protected function executeAction() - { - // ext_localconf, db and ext_tables must be loaded for the updates - $this->loadExtLocalconfDatabaseAndExtTables(); - - if (empty($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'])) { - $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'] = []; - } - - $actionMessages = []; - - try { - // To make sure DatabaseCharsetUpdate and initialUpdateDatabaseSchema are first wizards, they are added here instead of ext_localconf.php - $databaseCharsetUpdateObject = $this->getUpdateObjectInstance(\TYPO3\CMS\Install\Updates\DatabaseCharsetUpdate::class, 'databaseCharsetUpdate'); - if ($databaseCharsetUpdateObject->shouldRenderWizard()) { - $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'] = array_merge( - ['databaseCharsetUpdate' => \TYPO3\CMS\Install\Updates\DatabaseCharsetUpdate::class], - $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'] - ); - } - $initialUpdateDatabaseSchemaUpdateObject = $this->getUpdateObjectInstance(\TYPO3\CMS\Install\Updates\InitialDatabaseSchemaUpdate::class, 'initialUpdateDatabaseSchema'); - if ($initialUpdateDatabaseSchemaUpdateObject->shouldRenderWizard()) { - $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'] = array_merge( - ['initialUpdateDatabaseSchema' => \TYPO3\CMS\Install\Updates\InitialDatabaseSchemaUpdate::class], - $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'] - ); - $this->needsInitialUpdateDatabaseSchema = true; - } - - // To make sure finalUpdateDatabaseSchema is last wizard, it is added here instead of ext_localconf.php - $finalUpdateDatabaseSchemaUpdateObject = $this->getUpdateObjectInstance(\TYPO3\CMS\Install\Updates\FinalDatabaseSchemaUpdate::class, 'finalUpdateDatabaseSchema'); - if ($finalUpdateDatabaseSchemaUpdateObject->shouldRenderWizard()) { - $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update']['finalUpdateDatabaseSchema'] = \TYPO3\CMS\Install\Updates\FinalDatabaseSchemaUpdate::class; - } - } catch (StatementException $exception) { - /** @var $message StatusInterface */ - $message = GeneralUtility::makeInstance(ErrorStatus::class); - $message->setTitle('SQL error'); - $message->setMessage($exception->getMessage()); - $actionMessages[] = $message; - } - - // Perform silent cache framework table upgrade - $this->silentCacheFrameworkTableSchemaMigration(); - if (isset($this->postValues['set']['markAsDone'])) { - $actionMessages[] = $this->markWizardAsDone(); - - $this->listUpdates(); - $this->view->assign('updateAction', 'listUpdates'); - } elseif (isset($this->postValues['set']['getUserInput'])) { - $actionMessages[] = $this->getUserInputForUpdate(); - $this->view->assign('updateAction', 'getUserInput'); - } elseif (isset($this->postValues['set']['performUpdate'])) { - $actionMessages[] = $this->performUpdate(); - $this->view->assign('updateAction', 'performUpdate'); - } elseif (isset($this->postValues['set']['recheckWizards'])) { - $actionMessages[] = $this->recheckWizardsAndRowUpdaters(); - if (empty($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'])) { - /** @var $message StatusInterface */ - $message = GeneralUtility::makeInstance(WarningStatus::class); - $message->setTitle('No update wizards registered'); - $actionMessages[] = $message; - } - $this->listUpdates(); - $this->view->assign('updateAction', 'listUpdates'); - } else { - if (empty($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'])) { - /** @var $message StatusInterface */ - $message = GeneralUtility::makeInstance(WarningStatus::class); - $message->setTitle('No update wizards registered'); - $actionMessages[] = $message; - } - $this->listUpdates(); - $this->view->assign('updateAction', 'listUpdates'); - } - - $this->view->assign('actionMessages', $actionMessages); - - return $this->view->render(); - } - - /** - * List of available updates - */ - protected function listUpdates() - { - $availableUpdates = []; - $markedWizardsDoneInRegistry = []; - $markedWizardsDoneByCallingShouldRenderWizard = []; - $registry = GeneralUtility::makeInstance(Registry::class); - foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'] as $identifier => $className) { - $updateObject = $this->getUpdateObjectInstance($className, $identifier); - $markedDoneInRegistry = $registry->get('installUpdate', $className, false); - if ($markedDoneInRegistry) { - $markedWizardsDoneInRegistry[] = [ - 'identifier' => $identifier, - 'title' => $updateObject->getTitle(), - ]; - } else { - if ($updateObject->shouldRenderWizard()) { - // $explanation is changed by reference in Update objects! - $explanation = ''; - $updateObject->checkForUpdate($explanation); - $availableUpdates[$identifier] = [ - 'identifier' => $identifier, - 'title' => $updateObject->getTitle(), - 'explanation' => $explanation, - 'renderNext' => false, - ]; - if ($identifier === 'initialUpdateDatabaseSchema') { - $availableUpdates['initialUpdateDatabaseSchema']['renderNext'] = $this->needsInitialUpdateDatabaseSchema; - // initialUpdateDatabaseSchema is always the first update - // we stop immediately here as the remaining updates may - // require the new fields to be present in order to avoid SQL errors - break; - } elseif ($identifier === 'finalUpdateDatabaseSchema') { - // Okay to check here because finalUpdateDatabaseSchema is last element in array - $availableUpdates['finalUpdateDatabaseSchema']['renderNext'] = count($availableUpdates) === 1; - } elseif (!$this->needsInitialUpdateDatabaseSchema && $updateObject->shouldRenderNextButton()) { - // There are Updates that only show text and don't want to be executed - $availableUpdates[$identifier]['renderNext'] = true; - } - } else { - $markedWizardsDoneByCallingShouldRenderWizard[] = [ - 'identifier' => $identifier, - 'title' => $updateObject->getTitle(), - ]; - } - } - } - - // List of row updaters marked as done from "DatabaseRowsUpdateWizard" - $rowUpdatersDoneClassNames = GeneralUtility::makeInstance(Registry::class)->get('installUpdateRows', 'rowUpdatersDone', []); - $rowUpdatersDone = []; - foreach ($rowUpdatersDoneClassNames as $rowUpdaterClassName) { - // Silently skip non existing DatabaseRowsUpdateWizard's - if (!class_exists($rowUpdaterClassName)) { - continue; - } - /** @var RowUpdaterInterface $rowUpdater */ - $rowUpdater = GeneralUtility::makeInstance($rowUpdaterClassName); - if (!$rowUpdater instanceof RowUpdaterInterface) { - throw new \RuntimeException( - 'Row updater must implement RowUpdaterInterface', - 1484152906 - ); - } - $rowUpdatersDone[] = [ - 'identifier' => $rowUpdaterClassName, - 'title' => $rowUpdater->getTitle(), - ]; - } - - $wizardsTotal = (count($markedWizardsDoneInRegistry) + count($markedWizardsDoneByCallingShouldRenderWizard) + count($availableUpdates)); - $percentageDone = floor(($wizardsTotal - count($availableUpdates)) * 100 / $wizardsTotal); - - $this->view->assign('wizardsDone', $markedWizardsDoneInRegistry); - $this->view->assign('rowUpdatersDone', $rowUpdatersDone); - $this->view->assign('availableUpdates', $availableUpdates); - $this->view->assign('wizardsTotal', $wizardsTotal); - $this->view->assign('wizardsPercentageDone', $percentageDone); - } - - /** - * Get user input of update wizard - * - * @return StatusInterface - */ - protected function getUserInputForUpdate() - { - $wizardIdentifier = $this->postValues['values']['identifier']; - - $className = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'][$wizardIdentifier]; - $updateObject = $this->getUpdateObjectInstance($className, $wizardIdentifier); - $wizardHtml = ''; - if (method_exists($updateObject, 'getUserInput')) { - $wizardHtml = $updateObject->getUserInput('install[values][' . $wizardIdentifier . ']'); - } - - $updateData = [ - 'identifier' => $wizardIdentifier, - 'title' => $updateObject->getTitle(), - 'wizardHtml' => $wizardHtml, - ]; - - $this->view->assign('updateData', $updateData); - - /** @var $message StatusInterface */ - $message = GeneralUtility::makeInstance(OkStatus::class); - $message->setTitle('Show wizard options'); - return $message; - } - - /** - * Marks a wizard as being "seen" so that it is not shown again. - * - * @return StatusInterface - * @throws \InvalidArgumentException - */ - protected function markWizardAsDone() - { - $wizardIdentifier = $this->postValues['values']['identifier']; - $className = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'][$wizardIdentifier] ?? null; - if ($className === null) { - throw new \InvalidArgumentException('No class name found for upgrade wizard "' . $wizardIdentifier . '"', 1499980374); - } - - GeneralUtility::makeInstance(Registry::class)->set('installUpdate', $className, '1'); - - $wizardTitle = GeneralUtility::makeInstance($className)->getTitle(); - $message = GeneralUtility::makeInstance(OkStatus::class); - $message->setTitle('Successfully marked "' . $wizardTitle . '" as done'); - return $message; - } - - /** - * Rechecks the chosen wizards and row updaters to mark them as "was not executed" again. - * - * @return StatusInterface - */ - protected function recheckWizardsAndRowUpdaters() - { - if (empty($this->postValues['values']['recheck']) && empty($this->postValues['values']['recheckRowUpdater'])) { - $message = GeneralUtility::makeInstance(NoticeStatus::class); - $message->setTitle('No wizards selected to recheck'); - return $message; - } - $registry = GeneralUtility::makeInstance(Registry::class); - if (!empty($this->postValues['values']['recheck'])) { - foreach ($this->postValues['values']['recheck'] as $wizardIdentifier => $value) { - $className = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'][$wizardIdentifier]; - $updateObject = $this->getUpdateObjectInstance($className, $wizardIdentifier); - $registry->set('installUpdate', get_class($updateObject), 0); - } - } - if (!empty($this->postValues['values']['recheckRowUpdater'])) { - $rowUpdatersToRecheck = $this->postValues['values']['recheckRowUpdater']; - $rowUpdatersMarkedAsDone = $registry->get('installUpdateRows', 'rowUpdatersDone', []); - foreach ($rowUpdatersToRecheck as $rowUpdaterToReCheckClassName => $value) { - foreach ($rowUpdatersMarkedAsDone as $rowUpdaterMarkedAsDonePosition => $rowUpdaterMarkedAsDone) { - if ($rowUpdaterMarkedAsDone === $rowUpdaterToReCheckClassName) { - unset($rowUpdatersMarkedAsDone[$rowUpdaterMarkedAsDonePosition]); - break; - } - } - } - $registry->set('installUpdateRows', 'rowUpdatersDone', $rowUpdatersMarkedAsDone); - } - - $message = GeneralUtility::makeInstance(OkStatus::class); - $message->setTitle('Successfully rechecked'); - return $message; - } - - /** - * Perform update of a specific wizard - * - * @throws \TYPO3\CMS\Install\Exception - * @return StatusInterface - */ - protected function performUpdate() - { - $wizardIdentifier = $this->postValues['values']['identifier']; - $className = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'][$wizardIdentifier]; - $updateObject = $this->getUpdateObjectInstance($className, $wizardIdentifier); - - $wizardData = [ - 'identifier' => $wizardIdentifier, - 'title' => $updateObject->getTitle(), - ]; - - // $wizardInputErrorMessage is given as reference to wizard object! - $wizardInputErrorMessage = ''; - if (method_exists($updateObject, 'checkUserInput') && !$updateObject->checkUserInput($wizardInputErrorMessage)) { - /** @var $message StatusInterface */ - $message = GeneralUtility::makeInstance(ErrorStatus::class); - $message->setTitle('Input parameter broken'); - $message->setMessage($wizardInputErrorMessage ?: 'Something went wrong!'); - $wizardData['wizardInputBroken'] = true; - } else { - if (!method_exists($updateObject, 'performUpdate')) { - throw new \TYPO3\CMS\Install\Exception( - 'No performUpdate method in update wizard with identifier ' . $wizardIdentifier, - 1371035200 - ); - } - - // Both variables are used by reference in performUpdate() - $customOutput = ''; - $databaseQueries = []; - $performResult = $updateObject->performUpdate($databaseQueries, $customOutput); - - if ($performResult) { - /** @var $message StatusInterface */ - $message = GeneralUtility::makeInstance(OkStatus::class); - $message->setTitle('Update successful'); - } else { - /** @var $message StatusInterface */ - $message = GeneralUtility::makeInstance(ErrorStatus::class); - $message->setTitle('Update failed!'); - if ($customOutput) { - $message->setMessage($customOutput); - } - } - - if ($this->postValues['values']['showDatabaseQueries'] == 1) { - $wizardData['queries'] = $databaseQueries; - } - } - - $this->view->assign('wizardData', $wizardData); - - // Next update wizard, if available - $nextUpdate = $this->getNextUpdateInstance($updateObject); - $nextUpdateIdentifier = ''; - if ($nextUpdate) { - $nextUpdateIdentifier = $nextUpdate->getIdentifier(); - } - $this->view->assign('nextUpdateIdentifier', $nextUpdateIdentifier); - - return $message; - } - - /** - * Creates instance of an Update object - * - * @param string $className The class name - * @param string $identifier The identifier of Update object - needed to fetch user input - * @return AbstractUpdate Newly instantiated Update object - */ - protected function getUpdateObjectInstance($className, $identifier) - { - $userInput = $this->postValues['values'][$identifier]; - $versionAsInt = VersionNumberUtility::convertVersionNumberToInteger(TYPO3_version); - return GeneralUtility::makeInstance($className, $identifier, $versionAsInt, $userInput, $this); - } - - /** - * Returns the next Update object - * Used to show the link/button to the next Update - * - * @param AbstractUpdate $currentUpdate Current Update object - * @return AbstractUpdate|NULL - */ - protected function getNextUpdateInstance(AbstractUpdate $currentUpdate) - { - $isPreviousRecord = true; - foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'] as $identifier => $className) { - // Find the current update wizard, and then start validating the next ones - if ($currentUpdate->getIdentifier() === $identifier) { - $isPreviousRecord = false; - // For the updateDatabaseSchema-wizards verify they do not have to be executed again - if ($identifier !== 'initialUpdateDatabaseSchema' && $identifier !== 'finalUpdateDatabaseSchema') { - continue; - } - } - if (!$isPreviousRecord) { - $nextUpdate = $this->getUpdateObjectInstance($className, $identifier); - if ($nextUpdate->shouldRenderWizard()) { - return $nextUpdate; - } - } - } - return null; - } - - /** - * Force creation / update of caching framework tables that are needed by some update wizards - * - * @TODO: See also the other remarks on this topic in the abstract class, this whole area needs improvements - * @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotReturnException - * @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotException - * @throws \TYPO3\CMS\Core\Database\Schema\Exception\UnexpectedSignalReturnValueTypeException - * @throws \TYPO3\CMS\Core\Database\Schema\Exception\StatementException - * @throws \RuntimeException - * @throws \Doctrine\DBAL\Schema\SchemaException - * @throws \InvalidArgumentException - * @throws \Doctrine\DBAL\DBALException - */ - protected function silentCacheFrameworkTableSchemaMigration() - { - $sqlReader = GeneralUtility::makeInstance(SqlReader::class); - $cachingFrameworkDatabaseSchemaService = GeneralUtility::makeInstance(DatabaseSchemaService::class); - $createTableStatements = $sqlReader->getStatementArray( - $cachingFrameworkDatabaseSchemaService->getCachingFrameworkRequiredDatabaseSchema() - ); - - if (!empty($createTableStatements)) { - $schemaMigrationService = GeneralUtility::makeInstance(SchemaMigrator::class); - $schemaMigrationService->install($createTableStatements); - } - } -} diff --git a/typo3/sysext/install/Classes/Controller/AjaxController.php b/typo3/sysext/install/Classes/Controller/AjaxController.php index e83c08dadcfc864c6c17962ed94895f8960b1a84..16f828eda5ad08d186a14559f65a37a9a3a85038 100644 --- a/typo3/sysext/install/Classes/Controller/AjaxController.php +++ b/typo3/sysext/install/Classes/Controller/AjaxController.php @@ -30,30 +30,55 @@ class AjaxController extends AbstractController * @var array List of valid action names that need authentication */ protected $authenticationActions = [ - 'extensionCompatibilityTester', - 'uninstallExtension', - 'clearCache', + 'changeInstallToolPassword', 'clearAllCache', - 'dumpAutoload', - 'resetBackendUserUc', - 'coreUpdateUpdateVersionMatrix', - 'coreUpdateIsUpdateAvailable', + 'clearTable', + 'clearTypo3tempFiles', + + 'coreUpdateActivate', 'coreUpdateCheckPreConditions', 'coreUpdateDownload', - 'coreUpdateVerifyChecksum', - 'coreUpdateUnpack', + 'coreUpdateIsUpdateAvailable', 'coreUpdateMove', - 'coreUpdateActivate', - 'folderStatus', - 'environmentStatus', - 'tcaExtTablesCheck', - 'tcaMigrationsCheck', - 'filterManager', - 'saveIgnoredItems', - 'removeIgnoredItems', + 'coreUpdateUnpack', + 'coreUpdateUpdateVersionMatrix', + 'coreUpdateVerifyChecksum', + + 'createAdmin', + 'databaseAnalyzerAnalyze', + 'databaseAnalyzerExecute', + 'dumpAutoload', + 'environmentCheckGetStatus', + 'extensionCompatibilityTester', 'extensionScannerFiles', 'extensionScannerScanFile', 'extensionScannerMarkFullyScannedRestFiles', + + 'folderStructureGetStatus', + 'folderStructureFix', + 'imageProcessing', + 'localConfigurationWrite', + 'mailTest', + 'presetActivate', + 'resetBackendUserUc', + 'tcaExtTablesCheck', + 'tcaMigrationsCheck', + + 'uninstallExtension', + + 'upgradeDocsMarkRead', + 'upgradeDocsUnmarkRead', + + 'upgradeWizardsBlockingDatabaseAdds', + 'upgradeWizardsBlockingDatabaseExecute', + 'upgradeWizardsBlockingDatabaseCharsetTest', + 'upgradeWizardsBlockingDatabaseCharsetFix', + 'upgradeWizardsDoneUpgrades', + 'upgradeWizardsExecute', + 'upgradeWizardsInput', + 'upgradeWizardsList', + 'upgradeWizardsMarkUndone', + 'upgradeWizardsSilentUpgrades', ]; /** diff --git a/typo3/sysext/install/Classes/Controller/BackendModuleController.php b/typo3/sysext/install/Classes/Controller/BackendModuleController.php index 45a48318dd3f9fa18aba44299a3845ede97c9037..c5f0aba7be990eb1c16b41fc1d923a5ea765d789 100644 --- a/typo3/sysext/install/Classes/Controller/BackendModuleController.php +++ b/typo3/sysext/install/Classes/Controller/BackendModuleController.php @@ -17,7 +17,6 @@ namespace TYPO3\CMS\Install\Controller; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use TYPO3\CMS\Backend\Template\ModuleTemplate; -use TYPO3\CMS\Core\FormProtection\AbstractFormProtection; use TYPO3\CMS\Core\FormProtection\FormProtectionFactory; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Fluid\View\StandaloneView; @@ -41,17 +40,27 @@ class BackendModuleController * @param ServerRequestInterface $request * @param ResponseInterface $response * @return ResponseInterface + * @throws \RuntimeException */ public function index(ServerRequestInterface $request, ResponseInterface $response) { - /** @var EnableFileService $enableFileService */ $enableFileService = GeneralUtility::makeInstance(EnableFileService::class); - /** @var AbstractFormProtection $formProtection */ + $formProtection = FormProtectionFactory::get(); + $targetUrl = 'install.php?install[context]=backend'; + if (!empty($request->getQueryParams()['install']['action'])) { + $subAction = !empty($request->getQueryParams()['install']['action']) + ? $request->getQueryParams()['install']['action'] + : ''; + $targetUrl .= '&install[controller]=tool&install[action]=' . $subAction; + } + if ($enableFileService->checkInstallToolEnableFile()) { // Install tool is open and valid, redirect to it - $response = $response->withStatus(303)->withHeader('Location', 'install.php?install[context]=backend'); + $response = $response + ->withStatus(303) + ->withHeader('Location', $targetUrl); } elseif ($request->getMethod() === 'POST' && $request->getParsedBody()['action'] === 'enableInstallTool') { // Request to open the install tool $installToolEnableToken = $request->getParsedBody()['installToolEnableToken']; @@ -59,22 +68,29 @@ class BackendModuleController throw new \RuntimeException('Given form token was not valid', 1369161225); } $enableFileService->createInstallToolEnableFile(); + // Install tool is open and valid, redirect to it - $response = $response->withStatus(303)->withHeader('Location', 'install.php?install[context]=backend'); + $response = $response + ->withStatus(303) + ->withHeader('Location', $targetUrl); } else { // Show the "create enable install tool" button - /** @var StandaloneView $view */ + $token = $formProtection->generateToken('installTool'); + $view = GeneralUtility::makeInstance(StandaloneView::class); - $view->setTemplatePathAndFilename(GeneralUtility::getFileAbsFileName( - 'EXT:install/Resources/Private/Templates/BackendModule/ShowEnableInstallToolButton.html') + $view->setTemplatePathAndFilename( + GeneralUtility::getFileAbsFileName( + 'EXT:install/Resources/Private/Templates/BackendModule/ShowEnableInstallToolButton.html' + ) ); - $token = $formProtection->generateToken('installTool'); $view->assign('installToolEnableToken', $token); - /** @var ModuleTemplate $moduleTemplate */ + $moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class); $moduleTemplate->setContent($view->render()); + $response->getBody()->write($moduleTemplate->renderContent()); } + return $response; } } diff --git a/typo3/sysext/install/Classes/Controller/ToolController.php b/typo3/sysext/install/Classes/Controller/ToolController.php index e5466f7214db242fd796507d5e9108f5b0c89be7..1fc97a592f1e7f530f1b26d873d158608d6150e1 100644 --- a/typo3/sysext/install/Classes/Controller/ToolController.php +++ b/typo3/sysext/install/Classes/Controller/ToolController.php @@ -29,18 +29,10 @@ class ToolController extends AbstractController * @var array List of valid action names that need authentication */ protected $authenticationActions = [ - 'importantActions', - 'systemEnvironment', - 'configuration', - 'folderStructure', - 'testSetup', - 'upgradeWizard', - 'upgradeAnalysis', - 'extensionScanner', - 'allConfiguration', - 'cleanUp', - 'loadExtensions', - 'about', + 'environment', + 'maintenance', + 'settings', + 'upgrade', ]; /** @@ -118,6 +110,7 @@ class ToolController extends AbstractController // Add error to display a message what triggered the check $errorEncoded = json_encode($error); $parameters[] = 'install[lastError]=' . rawurlencode($errorEncoded); + // We do not use GeneralUtility here to be sure that hash generation works even if that class might not exist any more. $parameters[] = 'install[lastErrorHash]=' . hash_hmac('sha1', $errorEncoded, $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] . 'InstallToolError'); @@ -168,7 +161,7 @@ class ToolController extends AbstractController { $action = $this->getAction(); if ($action === '') { - $action = 'importantActions'; + $action = 'maintenance'; } $this->validateAuthenticationAction($action); $actionClass = ucfirst($action); diff --git a/typo3/sysext/install/Classes/Service/ClearTableService.php b/typo3/sysext/install/Classes/Service/ClearTableService.php new file mode 100644 index 0000000000000000000000000000000000000000..6857efd12a314bd6cf250f8d4814655e55c1179e --- /dev/null +++ b/typo3/sysext/install/Classes/Service/ClearTableService.php @@ -0,0 +1,114 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Service; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Core\Database\ConnectionPool; +use TYPO3\CMS\Core\Utility\GeneralUtility; + +/** + * Service handling clearing and statistics of semi-persistent + * core tables. + */ +class ClearTableService +{ + /** + * @var array List of table and their description + */ + protected $tableList = [ + [ + 'name' => 'be_sessions', + 'description' => 'Backend user sessions' + ], + [ + 'name' => 'cache_md5params', + 'description' => 'Frontend redirects', + ], + [ + 'name' => 'fe_sessions', + 'description' => 'Frontend user sessions', + ], + [ + 'name' => 'sys_history', + 'description' => 'Tracking of database record changes through TYPO3 backend forms', + ], + [ + 'name' => 'sys_lockedrecords', + 'description' => 'Record locking of backend user editing', + ], + [ + 'name' => 'sys_log', + 'description' => 'General log table', + ], + [ + 'name' => 'sys_preview', + 'description' => 'Workspace preview links', + ], + [ + 'name' => 'tx_extensionmanager_domain_model_extension', + 'description' => 'List of TER extensions', + ], + [ + 'name' => 'tx_rsaauth_keys', + 'description' => 'Login process key storage' + ], + ]; + + /** + * Get an array of all affected tables, a short description and their row counts + * + * @return array Details per table + */ + public function getTableStatistics(): array + { + $tableStatistics = []; + foreach ($this->tableList as $table) { + $connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable($table['name']); + if ($connection->getSchemaManager()->tablesExist([$table['name']])) { + $table['rowCount'] = $connection->count( + '*', + $table['name'], + [] + ); + $tableStatistics[] = $table; + } + } + return $tableStatistics; + } + + /** + * Truncate a table from $this->tableList + * + * @param string $tableName + * @throws \RuntimeException + */ + public function clearSelectedTable(string $tableName) + { + $tableFound = false; + foreach ($this->tableList as $table) { + if ($table['name'] === $tableName) { + $tableFound = true; + break; + } + } + if (!$tableFound) { + throw new \RuntimeException( + 'Selected table ' . $tableName . ' can not be cleared', + 1501942151 + ); + } + GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable($tableName)->truncate($tableName); + } +} diff --git a/typo3/sysext/install/Classes/Service/LocalConfigurationValueService.php b/typo3/sysext/install/Classes/Service/LocalConfigurationValueService.php new file mode 100644 index 0000000000000000000000000000000000000000..753607e92dd864576d73ca896d69df88be72e0f7 --- /dev/null +++ b/typo3/sysext/install/Classes/Service/LocalConfigurationValueService.php @@ -0,0 +1,179 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Service; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Core\Configuration\ConfigurationManager; +use TYPO3\CMS\Core\Utility\ArrayUtility; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Install\Status\OkStatus; + +/** + * Service handling bulk read and write of LocalConfiguration values. + * + * Used by "Configure global settings" / "All configuration" view. + */ +class LocalConfigurationValueService +{ + /** + * Error handlers are a bit mask in PHP. This register hints the View to + * add a fluid view helper resolving the bit mask to its representation + * as constants again for the specified items in ['SYS']. + * + * @var array + */ + protected $phpErrorCodesSettings = [ + 'errorHandlerErrors', + 'exceptionalErrors', + 'syslogErrorReporting', + 'belogErrorReporting', + ]; + + /** + * Get up configuration data. Prepares main TYPO3_CONF_VARS + * array to be displayed and merges is with the description file + * + * @return array Configuration data + */ + public function getCurrentConfigurationData(): array + { + $data = []; + $typo3ConfVars = array_keys($GLOBALS['TYPO3_CONF_VARS']); + sort($typo3ConfVars); + $commentArray = $this->getDefaultConfigArrayComments(); + foreach ($typo3ConfVars as $sectionName) { + $data[$sectionName] = []; + + foreach ($GLOBALS['TYPO3_CONF_VARS'][$sectionName] as $key => $value) { + $description = trim((string)$commentArray[$sectionName][$key]); + $isTextarea = (bool)preg_match('/^(<.*?>)?string \\(textarea\\)/i', $description); + $doNotRender = (bool)preg_match('/^(<.*?>)?string \\(exclude\\)/i', $description); + + if (!is_array($value) && !$doNotRender && (!preg_match('/[' . LF . CR . ']/', (string)$value) || $isTextarea)) { + $itemData = []; + $itemData['key'] = $key; + $itemData['description'] = $description; + if ($isTextarea) { + $itemData['type'] = 'textarea'; + $itemData['value'] = str_replace(['\' . LF . \'', '\' . LF . \''], [LF, LF], $value); + } elseif (preg_match('/^(<.*?>)?boolean/i', $description)) { + $itemData['type'] = 'checkbox'; + $itemData['value'] = $value ? '1' : '0'; + $itemData['checked'] = (bool)$value; + } elseif (preg_match('/^(<.*?>)?integer/i', $description)) { + $itemData['type'] = 'number'; + $itemData['value'] = (int)$value; + } else { + $itemData['type'] = 'input'; + $itemData['value'] = $value; + } + + // Check if the setting is a PHP error code, will trigger a view helper in fluid + if ($sectionName === 'SYS' && in_array($key, $this->phpErrorCodesSettings)) { + $itemData['phpErrorCode'] = true; + } + + $data[$sectionName][] = $itemData; + } + } + } + return $data; + } + + /** + * Store changed values in LocalConfiguration + * + * @param array $valueList Nested array with key['key'] value + * @return array StatusInterface[] + */ + public function updateLocalConfigurationValues(array $valueList): array + { + $statusObjects = []; + $configurationPathValuePairs = []; + $commentArray = $this->getDefaultConfigArrayComments(); + $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class); + foreach ($valueList as $path => $value) { + $oldValue = $configurationManager->getConfigurationValueByPath($path); + $description = ArrayUtility::getValueByPath($commentArray, $path); + + if (preg_match('/^string \\(textarea\\)/i', $description)) { + // Force Unix line breaks in text areas + $value = str_replace(CR, '', $value); + // Preserve line breaks + $value = str_replace(LF, '\' . LF . \'', $value); + } + + if (preg_match('/^(<.*?>)?boolean/i', $description)) { + // When submitting settings in the Install Tool, values that default to "FALSE" or "TRUE" + // in EXT:core/Configuration/DefaultConfiguration.php will be sent as "0" resp. "1". + $value = $value === '1'; + $valueHasChanged = (bool)$oldValue !== $value; + } elseif (preg_match('/^(<.*?>)?integer/i', $description)) { + // Cast integer values to integers (but only for values that can not contain a string as well) + $value = (int)$value; + $valueHasChanged = (int)$oldValue !== $value; + } else { + $valueHasChanged = (string)$oldValue !== (string)$value; + } + + // Save if value changed + if ($valueHasChanged) { + $configurationPathValuePairs[$path] = $value; + $status = GeneralUtility::makeInstance(OkStatus::class); + $status->setTitle($path); + if (is_bool($value)) { + $status->setMessage('New value = ' . ($value ? 'true' : 'false')); + } else { + $status->setMessage('New value = ' . $value); + } + $statusObjects[] = $status; + } + } + if (!empty($statusObjects)) { + $configurationManager->setLocalConfigurationValuesByPathValuePairs($configurationPathValuePairs); + } + return $statusObjects; + } + + /** + * Returns an array of available sections and their description + * + * @return string[] + */ + public function getSpeakingSectionNames(): array + { + return [ + 'BE' => 'Backend', + 'DB' => 'Database', + 'EXT' => 'Extension Installation', + 'FE' => 'Frontend', + 'GFX' => 'Image Processing', + 'HTTP' => 'Connection', + 'MAIL' => 'Mail', + 'SYS' => 'System' + ]; + } + + /** + * Read descriptions from description file + * + * @return array + */ + protected function getDefaultConfigArrayComments(): array + { + $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class); + return require $configurationManager->getDefaultConfigurationDescriptionFileLocation(); + } +} diff --git a/typo3/sysext/install/Classes/Service/SqlExpectedSchemaService.php b/typo3/sysext/install/Classes/Service/SqlExpectedSchemaService.php deleted file mode 100644 index e0d0addb4da9a54e72a8fe814a3b83afd4727851..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Classes/Service/SqlExpectedSchemaService.php +++ /dev/null @@ -1,112 +0,0 @@ -<?php -namespace TYPO3\CMS\Install\Service; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Extbase\SignalSlot\Dispatcher; - -/** - * Expected schema service - * - * @internal use in install tool only! - */ -class SqlExpectedSchemaService -{ - /** - * @var \TYPO3\CMS\Extbase\SignalSlot\Dispatcher - */ - protected $signalSlotDispatcher; - - /** - * @param Dispatcher $signalSlotDispatcher - */ - public function __construct(Dispatcher $signalSlotDispatcher = null) - { - $this->signalSlotDispatcher = $signalSlotDispatcher ?: GeneralUtility::makeInstance(Dispatcher::class); - } - - /** - * Get expected schema array - * - * @return array Expected schema - */ - public function getExpectedDatabaseSchema() - { - /** @var \TYPO3\CMS\Install\Service\SqlSchemaMigrationService $schemaMigrationService */ - $schemaMigrationService = GeneralUtility::makeInstance(\TYPO3\CMS\Install\Service\SqlSchemaMigrationService::class); - // Raw concatenated ext_tables.sql and friends string - $expectedSchemaString = $this->getTablesDefinitionString(); - // Remove comments - $cleanedExpectedSchemaString = implode(LF, $schemaMigrationService->getStatementArray($expectedSchemaString, true, '^CREATE TABLE ')); - $expectedSchema = $schemaMigrationService->getFieldDefinitions_fileContent($cleanedExpectedSchemaString); - - return $expectedSchema; - } - - /** - * Cycle through all loaded extensions and get full table definitions as concatenated string - * - * @param bool $withStatic TRUE if sql from ext_tables_static+adt.sql should be loaded, too. - * @return string Concatenated SQL of loaded extensions ext_tables.sql - */ - public function getTablesDefinitionString($withStatic = false) - { - $sqlString = []; - - // Find all ext_tables.sql of loaded extensions - $loadedExtensionInformation = $GLOBALS['TYPO3_LOADED_EXT']; - foreach ($loadedExtensionInformation as $extensionConfiguration) { - if ((is_array($extensionConfiguration) || $extensionConfiguration instanceof \ArrayAccess) && $extensionConfiguration['ext_tables.sql']) { - $sqlString[] = file_get_contents($extensionConfiguration['ext_tables.sql']); - } - if ($withStatic - && (is_array($extensionConfiguration) || $extensionConfiguration instanceof \ArrayAccess) - && $extensionConfiguration['ext_tables_static+adt.sql'] - ) { - $sqlString[] = file_get_contents($extensionConfiguration['ext_tables_static+adt.sql']); - } - } - - $sqlString = $this->emitTablesDefinitionIsBeingBuiltSignal($sqlString); - - return implode(LF . LF . LF . LF, $sqlString); - } - - /** - * Emits a signal to manipulate the tables definitions - * - * @param array $sqlString - * @return mixed - */ - protected function emitTablesDefinitionIsBeingBuiltSignal(array $sqlString) - { - $signalReturn = $this->signalSlotDispatcher->dispatch(__CLASS__, 'tablesDefinitionIsBeingBuilt', [$sqlString]); - // This is important to support old associated returns - $signalReturn = array_values($signalReturn); - $sqlString = $signalReturn[0]; - if (!is_array($sqlString)) { - throw new Exception\UnexpectedSignalReturnValueTypeException( - sprintf( - 'The signal %s of class %s returned a value of type %s, but array was expected.', - 'tablesDefinitionIsBeingBuilt', - __CLASS__, - gettype($sqlString) - ), - 1476109357 - ); - } - return $sqlString; - } -} diff --git a/typo3/sysext/install/Classes/Service/Typo3tempFileService.php b/typo3/sysext/install/Classes/Service/Typo3tempFileService.php new file mode 100644 index 0000000000000000000000000000000000000000..23e3838f062246a9230f3fd130c04c67915650c7 --- /dev/null +++ b/typo3/sysext/install/Classes/Service/Typo3tempFileService.php @@ -0,0 +1,100 @@ +<?php +namespace TYPO3\CMS\Install\Service; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use Symfony\Component\Finder\Finder; +use Symfony\Component\Finder\SplFileInfo; +use TYPO3\CMS\Core\Resource\ProcessedFileRepository; +use TYPO3\CMS\Core\Utility\GeneralUtility; + +/** + * Service class to manage typo3temp/assets folder cleanup + */ +class Typo3tempFileService +{ + /** + * Returns a list of directory names in typo3temp/assets and their number of files + * + * @return array + */ + public function getDirectoryStatistics() + { + $basePath = PATH_site . 'typo3temp/assets'; + if (!is_dir($basePath)) { + return []; + } + + $dirFinder = new Finder(); + $dirsInAssets = $dirFinder->directories()->in($basePath)->depth(0)->sortByName(); + $stats = []; + foreach ($dirsInAssets as $dirInAssets) { + /** @var $dirInAssets SplFileInfo */ + $fileFinder = new Finder(); + $fileCount = $fileFinder->files()->in($dirInAssets->getPathname())->count(); + $stats[] = [ + 'directory' => $dirInAssets->getFilename(), + 'numberOfFiles' => $fileCount, + ]; + } + + return $stats; + } + + /** + * Clear processed files + * + * The sys_file_processedfile table is truncated and the physical files of local storages are deleted. + * + * @return int 0 if all went well, if >0 this number of files couldn't be deleted + */ + public function clearProcessedFiles() + { + $repository = GeneralUtility::makeInstance(ProcessedFileRepository::class); + return $repository->removeAll(); + } + + /** + * Clear files in a typo3temp/assets/ folder (not _processed_!) + * + * @param string $folderName + * @return bool TRUE if all went well + * @throws \RuntimeException If folder path is not valid + */ + public function clearAssetsFolder(string $folderName) + { + $basePath = PATH_site . 'typo3temp/assets/' . $folderName; + if (empty($folderName) || !GeneralUtility::isAllowedAbsPath($basePath)) { + throw new \RuntimeException( + 'Path to folder ' . $folderName . ' not allowed.', + 1501781453 + ); + } + if (!is_dir($basePath)) { + throw new \RuntimeException( + 'Folder path ' . $basePath . ' does not exist or is no directory.', + 1501781454 + ); + } + + $finder = new Finder(); + $files = $finder->files()->in($basePath)->depth(0)->sortByName(); + foreach ($files as $file) { + /** @var $file SplFileInfo */ + $path = $file->getPathname(); + @unlink($path); + } + return true; + } +} diff --git a/typo3/sysext/install/Classes/Service/UpgradeWizardsService.php b/typo3/sysext/install/Classes/Service/UpgradeWizardsService.php new file mode 100644 index 0000000000000000000000000000000000000000..ac28e85cfb1fa55c91e6c0113539f5815692eead --- /dev/null +++ b/typo3/sysext/install/Classes/Service/UpgradeWizardsService.php @@ -0,0 +1,380 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Service; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use Doctrine\DBAL\Schema\Column; +use Doctrine\DBAL\Schema\Table; +use TYPO3\CMS\Core\Cache\DatabaseSchemaService; +use TYPO3\CMS\Core\Database\ConnectionPool; +use TYPO3\CMS\Core\Database\Schema\SchemaMigrator; +use TYPO3\CMS\Core\Database\Schema\SqlReader; +use TYPO3\CMS\Core\Registry; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Install\Status\ErrorStatus; +use TYPO3\CMS\Install\Status\OkStatus; +use TYPO3\CMS\Install\Updates\AbstractUpdate; +use TYPO3\CMS\Install\Updates\RowUpdater\RowUpdaterInterface; + +/** + * Service class helping managing upgrade wizards + */ +class UpgradeWizardsService +{ + /** + * Force creation / update of caching framework tables that are needed by some update wizards + * + * @return array List of executed statements + */ + public function silentCacheFrameworkTableSchemaMigration(): array + { + $sqlReader = GeneralUtility::makeInstance(SqlReader::class); + $cachingFrameworkDatabaseSchemaService = GeneralUtility::makeInstance(DatabaseSchemaService::class); + $createTableStatements = $sqlReader->getStatementArray( + $cachingFrameworkDatabaseSchemaService->getCachingFrameworkRequiredDatabaseSchema() + ); + $statements = []; + if (!empty($createTableStatements)) { + $schemaMigrationService = GeneralUtility::makeInstance(SchemaMigrator::class); + $statements = $schemaMigrationService->install($createTableStatements); + } + return $statements; + } + + /** + * @return array List of wizards marked as done in registry + */ + public function listOfWizardsDoneInRegistry(): array + { + $wizardsDoneInRegistry = []; + $registry = GeneralUtility::makeInstance(Registry::class); + foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'] as $identifier => $className) { + if ($registry->get('installUpdate', $className, false)) { + $wizardInstance = GeneralUtility::makeInstance($className); + $wizardsDoneInRegistry[] = [ + 'class' => $className, + 'identifier' => $identifier, + 'title' => $wizardInstance->getTitle(), + ]; + } + } + return $wizardsDoneInRegistry; + } + + /** + * @return array List of row updaters marked as done in registry + * @throws \RuntimeException + */ + public function listOfRowUpdatersDoneInRegistry(): array + { + $registry = GeneralUtility::makeInstance(Registry::class); + $rowUpdatersDoneClassNames = $registry->get('installUpdateRows', 'rowUpdatersDone', []); + $rowUpdatersDone = []; + foreach ($rowUpdatersDoneClassNames as $rowUpdaterClassName) { + // Silently skip non existing DatabaseRowsUpdateWizards + if (!class_exists($rowUpdaterClassName)) { + continue; + } + /** @var RowUpdaterInterface $rowUpdater */ + $rowUpdater = GeneralUtility::makeInstance($rowUpdaterClassName); + if (!$rowUpdater instanceof RowUpdaterInterface) { + throw new \RuntimeException( + 'Row updater must implement RowUpdaterInterface', + 1484152906 + ); + } + $rowUpdatersDone[] = [ + 'class' => $rowUpdaterClassName, + 'identifier' => $rowUpdaterClassName, + 'title' => $rowUpdater->getTitle(), + ]; + } + return $rowUpdatersDone; + } + + /** + * Mark one wizard as undone. This can be a "casual" wizard + * or a single "row updater". + * + * @param string $identifier Wizard or RowUpdater identifier + * @return bool True if wizard has been marked as undone + */ + public function markWizardUndoneInRegistry(string $identifier): bool + { + $registry = GeneralUtility::makeInstance(Registry::class); + $aWizardHasBeenMarkedUndone = false; + $wizardsDoneList = $this->listOfWizardsDoneInRegistry(); + foreach ($wizardsDoneList as $wizard) { + if ($wizard['identifier'] === $identifier) { + $aWizardHasBeenMarkedUndone = true; + $registry->set('installUpdate', $wizard['class'], 0); + } + } + if (!$aWizardHasBeenMarkedUndone) { + $rowUpdatersDoneList = $this->listOfRowUpdatersDoneInRegistry(); + $registryArray = $registry->get('installUpdateRows', 'rowUpdatersDone', []); + foreach ($rowUpdatersDoneList as $rowUpdater) { + if ($rowUpdater['identifier'] === $identifier) { + $aWizardHasBeenMarkedUndone = true; + foreach ($registryArray as $rowUpdaterMarkedAsDonePosition => $rowUpdaterMarkedAsDone) { + if ($rowUpdaterMarkedAsDone === $rowUpdater['class']) { + unset($registryArray[$rowUpdaterMarkedAsDonePosition]); + break; + } + } + $registry->set('installUpdateRows', 'rowUpdatersDone', $registryArray); + } + } + } + return $aWizardHasBeenMarkedUndone; + } + + /** + * Get a list of tables, single columns and indexes to add. + * + * @return array Array with possible keys "tables", "columns", "indexes" + */ + public function getBlockingDatabaseAdds(): array + { + $sqlReader = GeneralUtility::makeInstance(SqlReader::class); + $databaseDefinitions = $sqlReader->getCreateTableStatementArray($sqlReader->getTablesDefinitionString()); + + $schemaMigrator = GeneralUtility::makeInstance(SchemaMigrator::class); + $databaseDifferences = $schemaMigrator->getSchemaDiffs($databaseDefinitions); + + $adds = []; + foreach ($databaseDifferences as $schemaDiff) { + foreach ($schemaDiff->newTables as $newTable) { + /** @var Table $newTable*/ + if (!is_array($adds['tables'])) { + $adds['tables'] = []; + } + $adds['tables'][] = [ + 'table' => $newTable->getName(), + ]; + } + foreach ($schemaDiff->changedTables as $changedTable) { + foreach ($changedTable->addedColumns as $addedColumn) { + /** @var Column $addedColumn */ + if (!is_array($adds['columns'])) { + $adds['columns'] = []; + } + $adds['columns'][] = [ + 'table' => $changedTable->name, + 'field' => $addedColumn->getName(), + ]; + } + foreach ($changedTable->addedIndexes as $addedIndex) { + /** $var Index $addedIndex */ + if (!is_array($adds['indexes'])) { + $adds['indexes'] = []; + } + $adds['indexes'][] = [ + 'table' => $changedTable->name, + 'index' => $addedIndex->getName(), + ]; + } + } + } + + return $adds; + } + + /** + * Add missing tables, indexes and fields to DB. + */ + public function addMissingTablesAndFields() + { + $sqlReader = GeneralUtility::makeInstance(SqlReader::class); + $databaseDefinitions = $sqlReader->getCreateTableStatementArray($sqlReader->getTablesDefinitionString()); + $schemaMigrator = GeneralUtility::makeInstance(SchemaMigrator::class); + $schemaMigrator->install($databaseDefinitions, true); + } + + /** + * True if DB main charset on mysql is utf8 + * + * @return bool True if charset is ok + */ + public function isDatabaseCharsetUtf8(): bool + { + $connection = GeneralUtility::makeInstance(ConnectionPool::class) + ->getConnectionByName(ConnectionPool::DEFAULT_CONNECTION_NAME); + $isDefaultConnectionMysql = strpos($connection->getServerVersion(), 'MySQL') === 0; + + if (!$isDefaultConnectionMysql) { + // Not tested on non mysql + $charsetOk = true; + } else { + $queryBuilder = $connection->createQueryBuilder(); + $charset = (string)$queryBuilder->select('DEFAULT_CHARACTER_SET_NAME') + ->from('information_schema.SCHEMATA') + ->where( + $queryBuilder->expr()->eq( + 'SCHEMA_NAME', + $queryBuilder->createNamedParameter($connection->getDatabase(), \PDO::PARAM_STR) + ) + ) + ->setMaxResults(1) + ->execute() + ->fetchColumn(); + // check if database charset is utf-8, also allows utf8mb4 + $charsetOk = strpos($charset, 'utf8') !== 0; + } + return $charsetOk; + } + + /** + * Set default connection MySQL database charset to utf8. + * Should be called only *if* default database connection is actually MySQL + */ + public function setDatabaseCharsetUtf8() + { + $connection = GeneralUtility::makeInstance(ConnectionPool::class) + ->getConnectionByName(ConnectionPool::DEFAULT_CONNECTION_NAME); + $sql = 'ALTER DATABASE ' . $connection->quoteIdentifier($connection->getDatabase()) . ' CHARACTER SET utf8'; + $connection->exec($sql); + } + + /** + * Get list of registered upgrade wizards. + * + * @return array List of upgrade wizards in correct order with detail information + */ + public function getUpgradeWizardsList(): array + { + $wizards = []; + foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'] as $identifier => $class) { + /** @var AbstractUpdate $wizardInstance */ + $wizardInstance = GeneralUtility::makeInstance($class); + + // $explanation is changed by reference in Update objects! + $explanation = ''; + $wizardInstance->checkForUpdate($explanation); + + $wizards[] = [ + 'class' => $class, + 'identifier' => $identifier, + 'title' => $wizardInstance->getTitle(), + 'shouldRenderWizard' => $wizardInstance->shouldRenderWizard(), + 'markedDoneInRegistry' => GeneralUtility::makeInstance(Registry::class)->get('installUpdate', $class, false), + 'explanation' => $explanation, + ]; + } + return $wizards; + } + + /** + * Execute the "get user input" step of a wizard + * + * @param string $identifier + * @return array + * @throws \RuntimeException + */ + public function getWizardUserInput(string $identifier): array + { + // Validate identifier exists in upgrade wizard list + if (empty($identifier) + || !array_key_exists($identifier, $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update']) + ) { + throw new \RuntimeException( + 'No valid wizard identifier given', + 1502721731 + ); + } + $class = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'][$identifier]; + $updateObject = GeneralUtility::makeInstance($class); + $wizardHtml = ''; + if (method_exists($updateObject, 'getUserInput')) { + $wizardHtml = $updateObject->getUserInput('install[values][' . $identifier . ']'); + } + + $result = [ + 'identifier' => $identifier, + 'title' => $updateObject->getTitle(), + 'wizardHtml' => $wizardHtml, + ]; + + return $result; + } + + /** + * Execute a single update wizard + * + * @param string $identifier + * @param array $postValues + * @return array StatusInterface[] + * @throws \RuntimeException + */ + public function executeWizard(string $identifier, array $postValues = []): array + { + if (empty($identifier) + || !array_key_exists($identifier, $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update']) + ) { + throw new \RuntimeException( + 'No valid wizard identifier given', + 1502721732 + ); + } + $class = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'][$identifier]; + $updateObject = GeneralUtility::makeInstance($class); + + $wizardData = [ + 'identifier' => $identifier, + 'title' => $updateObject->getTitle(), + ]; + + $messages = []; + // $wizardInputErrorMessage is given as reference to wizard object! + $wizardInputErrorMessage = ''; + if (method_exists($updateObject, 'checkUserInput') && !$updateObject->checkUserInput($wizardInputErrorMessage)) { + $message = new ErrorStatus(); + $message->setTitle('Input parameter broken'); + $message->setMessage($wizardInputErrorMessage ?: 'Something went wrong!'); + $messages[] = $message; + } else { + if (!method_exists($updateObject, 'performUpdate')) { + throw new \RuntimeException( + 'No performUpdate method in update wizard with identifier ' . $identifier, + 1371035200 + ); + } + + // Both variables are used by reference in performUpdate() + $customOutput = ''; + $databaseQueries = []; + $performResult = $updateObject->performUpdate($databaseQueries, $customOutput); + + if ($performResult) { + $message = new OkStatus(); + $message->setTitle('Update successful'); + $messages[] = $message; + } else { + $message = new ErrorStatus(); + $message->setTitle('Update failed!'); + if ($customOutput) { + $message->setMessage($customOutput); + } + $messages[] = $message; + } + + if ($postValues['values']['showDatabaseQueries'] == 1) { + $wizardData['queries'] = $databaseQueries; + } + } + + return $messages; + } +} diff --git a/typo3/sysext/install/Classes/Status/AbstractStatus.php b/typo3/sysext/install/Classes/Status/AbstractStatus.php index ed25ca8026a6f6fb12d3d93358c79f8b4f2bec83..15586bec19c01bfa7e38447b1e0e903109284a47 100644 --- a/typo3/sysext/install/Classes/Status/AbstractStatus.php +++ b/typo3/sysext/install/Classes/Status/AbstractStatus.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Status; /* @@ -24,6 +25,11 @@ abstract class AbstractStatus implements StatusInterface */ protected $severity = ''; + /** + * @var int Severity as number + */ + protected $severityNumber = -2; + /** * @var string Title */ @@ -34,18 +40,34 @@ abstract class AbstractStatus implements StatusInterface */ protected $message = ''; + /** + * Default constructor creates severity number from severity string + */ + public function __construct() + { + $this->severityNumber = $this->getSeverityAsNumber($this->severity); + } + /** * @return string The severity */ - public function getSeverity() + public function getSeverity(): string { return $this->severity; } + /** + * @return int Severity as number + */ + public function getSeverityNumber(): int + { + return $this->severityNumber; + } + /** * @return string The title */ - public function getTitle() + public function getTitle(): string { return $this->title; } @@ -55,7 +77,7 @@ abstract class AbstractStatus implements StatusInterface * * @param string $title The title */ - public function setTitle($title) + public function setTitle(string $title) { $this->title = $title; } @@ -65,7 +87,7 @@ abstract class AbstractStatus implements StatusInterface * * @return string Status message */ - public function getMessage() + public function getMessage(): string { return $this->message; } @@ -75,8 +97,56 @@ abstract class AbstractStatus implements StatusInterface * * @param string $message Status message */ - public function setMessage($message) + public function setMessage(string $message) { $this->message = $message; } + + /** + * @return array Json representation of this status + */ + public function jsonSerialize(): array + { + return [ + 'severity' => $this->getSeverityNumber(), + 'title' => $this->getTitle(), + 'status' => $this->getMessage() + ]; + } + + /** + * Return the corresponding integer value for given severity string + * + * @param string $severity + * @return int + */ + protected function getSeverityAsNumber($severity): int + { + $number = -2; + switch (strtolower($severity)) { + case 'loading': + $number = -3; + break; + case 'notice': + $number = -2; + break; + case 'info': + $number = -1; + break; + case 'ok': + case 'success': + $number = 0; + break; + case 'warning': + $number = 1; + break; + case 'error': + case 'danger': + case 'alert': + case 'fatal': + $number = 2; + break; + } + return $number; + } } diff --git a/typo3/sysext/install/Classes/Status/AlertStatus.php b/typo3/sysext/install/Classes/Status/AlertStatus.php index 19056969f06239e62ff66992c63fd65197fcfdf2..37817adc5d27ddf86f95f4266a488f25932b4fb6 100644 --- a/typo3/sysext/install/Classes/Status/AlertStatus.php +++ b/typo3/sysext/install/Classes/Status/AlertStatus.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Status; /* diff --git a/typo3/sysext/install/Classes/Status/ErrorStatus.php b/typo3/sysext/install/Classes/Status/ErrorStatus.php index 149c4bab99e59379bcd0bc9ed1d1c85171ebc28e..3a7978ae31676eec273e48a3551c9dd68db13de0 100644 --- a/typo3/sysext/install/Classes/Status/ErrorStatus.php +++ b/typo3/sysext/install/Classes/Status/ErrorStatus.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Status; /* diff --git a/typo3/sysext/install/Classes/Status/Exception.php b/typo3/sysext/install/Classes/Status/Exception.php index f1a0004e4368d6771977ceaf9e64170140f68aad..a5192047781ca609e59498beeb17fca614076b3d 100644 --- a/typo3/sysext/install/Classes/Status/Exception.php +++ b/typo3/sysext/install/Classes/Status/Exception.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Status; /* diff --git a/typo3/sysext/install/Classes/Status/InfoStatus.php b/typo3/sysext/install/Classes/Status/InfoStatus.php index b39e325f32d91df94ad4cad3ce8b2098e4de8991..e717136dc168d06265755f1bcab8f3a2b5e5453c 100644 --- a/typo3/sysext/install/Classes/Status/InfoStatus.php +++ b/typo3/sysext/install/Classes/Status/InfoStatus.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Status; /* diff --git a/typo3/sysext/install/Classes/Status/LoadingStatus.php b/typo3/sysext/install/Classes/Status/LoadingStatus.php index 3f9b65ac2e93c3f3adee828db5d596c37c3600f9..86013af6396ed53948d1319e7d486739b8c31619 100644 --- a/typo3/sysext/install/Classes/Status/LoadingStatus.php +++ b/typo3/sysext/install/Classes/Status/LoadingStatus.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Status; /* diff --git a/typo3/sysext/install/Classes/Status/NoticeStatus.php b/typo3/sysext/install/Classes/Status/NoticeStatus.php index 18dab5eb5e362c6ede134d520a57b9d2e415d1ee..8f7a3d9c41bc960898df93b902773a3312df5aae 100644 --- a/typo3/sysext/install/Classes/Status/NoticeStatus.php +++ b/typo3/sysext/install/Classes/Status/NoticeStatus.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Status; /* diff --git a/typo3/sysext/install/Classes/Status/OkStatus.php b/typo3/sysext/install/Classes/Status/OkStatus.php index 6159edfff41f932bfc5d5bac8937c58f53c06a1b..04db84ce6db4aaf4eafbf85e63d3c9a8080843e6 100644 --- a/typo3/sysext/install/Classes/Status/OkStatus.php +++ b/typo3/sysext/install/Classes/Status/OkStatus.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Status; /* diff --git a/typo3/sysext/install/Classes/Status/StatusInterface.php b/typo3/sysext/install/Classes/Status/StatusInterface.php index b5f6910c449858e4278ae087bd5e79505b57e008..9635a73f5738f4cb3ba39af731979a3f29eb3729 100644 --- a/typo3/sysext/install/Classes/Status/StatusInterface.php +++ b/typo3/sysext/install/Classes/Status/StatusInterface.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Status; /* @@ -17,40 +18,47 @@ namespace TYPO3\CMS\Install\Status; /** * Status interface */ -interface StatusInterface +interface StatusInterface extends \JsonSerializable { /** * Get severity * * @return string The severity */ - public function getSeverity(); + public function getSeverity(): string; + + /** + * Get severity as integer + * + * @return int The severity as int + */ + public function getSeverityNumber(): int; /** * Get title * * @return string The title */ - public function getTitle(); + public function getTitle(): string; /** * Set title * * @param string $title The title */ - public function setTitle($title); + public function setTitle(string $title); /** * Get status message * * @return string Status message */ - public function getMessage(); + public function getMessage(): string; /** * Set status message * * @param string $message Status message */ - public function setMessage($message); + public function setMessage(string $message); } diff --git a/typo3/sysext/install/Classes/Status/StatusUtility.php b/typo3/sysext/install/Classes/Status/StatusUtility.php index 0100876127f7fa534925d9520a2009e97f9089fe..ffd2b08b97d36773882159813fd2121c9a4021b6 100644 --- a/typo3/sysext/install/Classes/Status/StatusUtility.php +++ b/typo3/sysext/install/Classes/Status/StatusUtility.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Status; /* @@ -23,11 +24,11 @@ class StatusUtility /** * Order status objects by severity * - * @param array<\TYPO3\CMS\Install\Status\StatusInterface> $statusObjects Status objects in random order + * @param StatusInterface[] $statusObjects Status objects in random order * @return array With sub arrays by severity * @throws Exception */ - public function sortBySeverity(array $statusObjects = []) + public function sortBySeverity(array $statusObjects = []): array { $orderedStatus = [ 'alert' => $this->filterBySeverity($statusObjects, 'alert'), @@ -43,15 +44,14 @@ class StatusUtility /** * Filter a list of status objects by severity * - * @param array $statusObjects Given list of status objects + * @param StatusInterface[] $statusObjects Given list of status objects * @param string $severity Severity identifier * @throws Exception * @return array List of status objects with given severity */ - public function filterBySeverity(array $statusObjects = [], $severity = 'ok') + public function filterBySeverity(array $statusObjects = [], $severity = 'ok'): array { $filteredObjects = []; - /** @var $status StatusInterface */ foreach ($statusObjects as $status) { if (!$status instanceof StatusInterface) { throw new Exception( diff --git a/typo3/sysext/install/Classes/Status/WarningStatus.php b/typo3/sysext/install/Classes/Status/WarningStatus.php index af582b74121782439989260bd91cb23b900fa790..d2115e670ee8dc6d32a8c97df82452d83e613d45 100644 --- a/typo3/sysext/install/Classes/Status/WarningStatus.php +++ b/typo3/sysext/install/Classes/Status/WarningStatus.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Status; /* diff --git a/typo3/sysext/install/Classes/Updates/AbstractDatabaseSchemaUpdate.php b/typo3/sysext/install/Classes/Updates/AbstractDatabaseSchemaUpdate.php deleted file mode 100644 index f71f0f40798a006516fac99185b793a6a5a31601..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Classes/Updates/AbstractDatabaseSchemaUpdate.php +++ /dev/null @@ -1,142 +0,0 @@ -<?php -namespace TYPO3\CMS\Install\Updates; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use Doctrine\DBAL\Schema\SchemaDiff; -use TYPO3\CMS\Core\Database\Schema\SchemaMigrator; -use TYPO3\CMS\Core\Database\Schema\SqlReader; -use TYPO3\CMS\Core\Utility\GeneralUtility; - -/** - * Contains the update class to create and alter tables, fields and keys to comply to the database schema - */ -abstract class AbstractDatabaseSchemaUpdate extends AbstractUpdate -{ - /** - * @var \TYPO3\CMS\Core\Database\Schema\SchemaMigrator - */ - protected $schemaMigrationService; - - protected $listTemplate = ' - <p>%1$s</p> - <fieldset> - <ol class="t3-install-form-label-after">%2$s</ol> - </fieldset> - '; - - /** - * Template for list items consisting of table and field names - * - * @var string - */ - protected $fieldListItem = ' - <li class="labelAfter"> - <label><strong>%1$s</strong>: %2$s</label> - </li> - '; - - /** - * Template for list items consisting of table names - * - * @var string - */ - protected $tableListItem = ' - <li class="labelAfter"> - <label><strong>%1$s</strong></label> - </li> - '; - - /** - * Constructor function. - * - * @param \TYPO3\CMS\Core\Database\Schema\SchemaMigrator $schemaMigrationService - * @throws \InvalidArgumentException - */ - public function __construct(SchemaMigrator $schemaMigrationService = null) - { - $this->schemaMigrationService = $schemaMigrationService ?: GeneralUtility::makeInstance( - SchemaMigrator::class - ); - } - - /** - * Compare current and expected database schemas and return the database differences - * - * @return SchemaDiff[] database differences as Doctrine SchemaDiff objects (per connection) - * @throws \Doctrine\DBAL\DBALException - * @throws \Doctrine\DBAL\Schema\SchemaException - * @throws \InvalidArgumentException - * @throws \RuntimeException - * @throws \TYPO3\CMS\Core\Database\Schema\Exception\UnexpectedSignalReturnValueTypeException - * @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotException - * @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotReturnException - * @throws \TYPO3\CMS\Core\Database\Schema\Exception\StatementException - */ - protected function getDatabaseDifferences(): array - { - $statements = $this->getDatabaseDefinition(); - - return $this->schemaMigrationService->getSchemaDiffs($statements); - } - - /** - * Get list of CREATE TABLE statements from all ext_tables.sql files - * - * @return string[] - * @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotReturnException - * @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotException - * @throws \TYPO3\CMS\Core\Database\Schema\Exception\UnexpectedSignalReturnValueTypeException - * @throws \InvalidArgumentException - */ - protected function getDatabaseDefinition(): array - { - $sqlReader = GeneralUtility::makeInstance(SqlReader::class); - - return $sqlReader->getCreateTableStatementArray($sqlReader->getTablesDefinitionString()); - } - - /** - * @param string $tableName - * @param string $fieldName - * @return string - */ - protected function renderFieldListItem(string $tableName, string $fieldName): string - { - return sprintf($this->fieldListItem, $tableName, $fieldName); - } - - /** - * @param string $tableName - * @return string - */ - protected function renderTableListItem(string $tableName): string - { - return sprintf($this->tableListItem, $tableName); - } - - /** - * @param string $label - * @param string $items - * @return string - */ - protected function renderList(string $label, string $items): string - { - if (trim($items) === '') { - return ''; - } - - return sprintf($this->listTemplate, $label, $items); - } -} diff --git a/typo3/sysext/install/Classes/Updates/AbstractUpdate.php b/typo3/sysext/install/Classes/Updates/AbstractUpdate.php index dcc0b434c99767836dc67075d5fa0a7eaeb66e64..f926b5468a797a16ffee02281dc7867173b9ff32 100644 --- a/typo3/sysext/install/Classes/Updates/AbstractUpdate.php +++ b/typo3/sysext/install/Classes/Updates/AbstractUpdate.php @@ -14,11 +14,9 @@ namespace TYPO3\CMS\Install\Updates; * The TYPO3 project - inspiring people to share! */ -use TYPO3\CMS\Core\Configuration\ConfigurationManager; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Registry; use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Install\Controller\Action\Tool\UpgradeWizard; /** * Generic class that every update wizard class inherits from. @@ -40,13 +38,6 @@ abstract class AbstractUpdate */ protected $identifier; - /** - * Parent object - * - * @var UpgradeWizard - */ - public $pObj; - /** * User input, set from outside * @@ -54,14 +45,6 @@ abstract class AbstractUpdate */ public $userInput; - /** - * Current TYPO3 version number, set from outside - * Version number coming from \TYPO3\CMS\Core\Utility\VersionNumberUtility::convertVersionNumberToInteger() - * - * @var int - */ - public $versionNumber; - /** * Returns the title attribute * @@ -122,29 +105,13 @@ abstract class AbstractUpdate return $showUpdate > 0 || $result == true; } - /** - * Simple wrapper function that helps to check whether (if) - * this feature is cool if you want to tell the user that the update wizard - * is working fine, just as output (useful for the character set / utf8 wizard) - * - * @return bool If the wizard should render the Next() button on the overview page - * @see checkForUpdate() - */ - public function shouldRenderNextButton() - { - $showUpdate = 0; - $explanation = ''; - $result = $this->checkForUpdate($explanation, $showUpdate); - return $showUpdate != 2 || $result; - } - /** * Check if given table exists * * @param string $table * @return bool */ - public function checkIfTableExists($table) + protected function checkIfTableExists($table) { $tableExists = GeneralUtility::makeInstance(ConnectionPool::class) ->getConnectionForTable($table) @@ -208,18 +175,6 @@ abstract class AbstractUpdate protected function isWizardDone() { $wizardClassName = get_class($this); - $done = GeneralUtility::makeInstance(Registry::class)->get('installUpdate', $wizardClassName, false); - - // Fall back in case the wizard for migration of "wizard done" flags to system registry was not run yet - if (!$done) { - try { - GeneralUtility::makeInstance(ConfigurationManager::class) - ->getLocalConfigurationValueByPath('INSTALL/wizardDone/' . $wizardClassName); - $done = true; - } catch (\RuntimeException $e) { - } - } - - return $done; + return GeneralUtility::makeInstance(Registry::class)->get('installUpdate', $wizardClassName, false); } } diff --git a/typo3/sysext/install/Classes/Updates/DatabaseCharsetUpdate.php b/typo3/sysext/install/Classes/Updates/DatabaseCharsetUpdate.php deleted file mode 100644 index 1d48a2f3d1556c4df32fdf7682d0ee065f11f149..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Classes/Updates/DatabaseCharsetUpdate.php +++ /dev/null @@ -1,126 +0,0 @@ -<?php -namespace TYPO3\CMS\Install\Updates; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use Doctrine\DBAL\DBALException; -use TYPO3\CMS\Core\Database\ConnectionPool; -use TYPO3\CMS\Core\Utility\GeneralUtility; - -/** - * Move "wizard done" flags to system registry - */ -class DatabaseCharsetUpdate extends AbstractUpdate -{ - /** - * @var string - */ - protected $title = 'Set default database charset to utf-8'; - - /** - * Checks if an update is needed - * - * @param string &$description The description for the update - * @return bool Whether an update is needed (TRUE) or not (FALSE) - * @throws \InvalidArgumentException - * @throws \Doctrine\DBAL\DBALException - */ - public function checkForUpdate(&$description) - { - if ($this->isWizardDone() || !$this->isDefaultConnectionMySQL()) { - return false; - } - - $result = false; - $description = 'Sets the default database charset to utf-8 to' - . ' ensure new tables are created with correct charset. - WARNING: This will NOT convert any existing data.'; - - // check if database charset is utf-8, also allows utf8mb4 - if (strpos($this->getDefaultDatabaseCharset(), 'utf8') !== 0) { - $result = true; - } else { - $this->markWizardAsDone(); - } - - return $result; - } - - /** - * Performs the accordant updates. - * - * @param array &$dbQueries Queries done in this update - * @param string &$customMessage Custom message - * @return bool Whether everything went smoothly or not - * @throws \InvalidArgumentException - * @throws \Doctrine\DBAL\DBALException - */ - public function performUpdate(array &$dbQueries, &$customMessage) - { - $connection = GeneralUtility::makeInstance(ConnectionPool::class) - ->getConnectionByName(ConnectionPool::DEFAULT_CONNECTION_NAME); - $sql = 'ALTER DATABASE ' . $connection->quoteIdentifier($connection->getDatabase()) . ' CHARACTER SET utf8'; - - try { - $connection->exec($sql); - } catch (DBALException $e) { - $customMessage = 'SQL-ERROR: ' . htmlspecialchars($e->getPrevious()->getMessage()); - return false; - } - $dbQueries[] = $sql; - $this->markWizardAsDone(); - - return true; - } - - /** - * Return TRUE if this TYPO3 instance runs on a MySQL compatible databasa instance - * - * @return bool - * @throws \InvalidArgumentException - * @throws \Doctrine\DBAL\DBALException - */ - protected function isDefaultConnectionMySQL(): bool - { - $connection = GeneralUtility::makeInstance(ConnectionPool::class) - ->getConnectionByName(ConnectionPool::DEFAULT_CONNECTION_NAME); - - return strpos($connection->getServerVersion(), 'MySQL') === 0; - } - - /** - * Retrieves the default character set of the database. - * - * @return string - * @throws \InvalidArgumentException - * @throws \Doctrine\DBAL\DBALException - */ - protected function getDefaultDatabaseCharset(): string - { - $connection = GeneralUtility::makeInstance(ConnectionPool::class) - ->getConnectionByName(ConnectionPool::DEFAULT_CONNECTION_NAME); - $queryBuilder = $connection->createQueryBuilder(); - return (string)$queryBuilder->select('DEFAULT_CHARACTER_SET_NAME') - ->from('information_schema.SCHEMATA') - ->where( - $queryBuilder->expr()->eq( - 'SCHEMA_NAME', - $queryBuilder->createNamedParameter($connection->getDatabase(), \PDO::PARAM_STR) - ) - ) - ->setMaxResults(1) - ->execute() - ->fetchColumn(); - } -} diff --git a/typo3/sysext/install/Classes/Updates/FinalDatabaseSchemaUpdate.php b/typo3/sysext/install/Classes/Updates/FinalDatabaseSchemaUpdate.php deleted file mode 100644 index 3f2597aaf6efa9e5e7bec435e5f3e51cf803ca01..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Classes/Updates/FinalDatabaseSchemaUpdate.php +++ /dev/null @@ -1,186 +0,0 @@ -<?php -namespace TYPO3\CMS\Install\Updates; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use Doctrine\DBAL\Schema\ColumnDiff; -use Doctrine\DBAL\Schema\Index; -use Doctrine\DBAL\Schema\SchemaDiff; -use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Install\Service\ContextService; - -/** - * Contains the update class to create and alter tables, fields and keys to comply to the database schema - */ -class FinalDatabaseSchemaUpdate extends AbstractDatabaseSchemaUpdate -{ - /** - * Constructor function. - */ - public function __construct() - { - parent::__construct(); - $this->title = 'Update database schema: Modify tables and fields'; - } - - /** - * Checks if an update is needed - * - * @param string &$description The description for the update - * @return bool TRUE if an update is needed, FALSE otherwise - * @throws \Doctrine\DBAL\DBALException - * @throws \Doctrine\DBAL\Schema\SchemaException - * @throws \InvalidArgumentException - * @throws \RuntimeException - * @throws \TYPO3\CMS\Core\Database\Schema\Exception\UnexpectedSignalReturnValueTypeException - * @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotException - * @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotReturnException - * @throws \TYPO3\CMS\Core\Database\Schema\Exception\StatementException - */ - public function checkForUpdate(&$description): bool - { - $contextService = GeneralUtility::makeInstance(ContextService::class); - $description = 'There are tables or fields in the database which need to be changed.<br /><br />' . - 'This update wizard can be run only when there are no other update wizards left to make sure they have ' . - 'all needed fields unchanged.<br /><br />If you want to apply changes selectively, ' . - '<a href="' . GeneralUtility::getIndpEnv('TYPO3_REQUEST_SCRIPT') . '?install[action]=importantActions&install[context]=' . - $contextService->getContextString() . - '&install[controller]=tool">go to Database Analyzer</a>.'; - - $databaseDifferences = $this->getDatabaseDifferences(); - foreach ($databaseDifferences as $schemaDiff) { - // A change for a table is required - if (count($schemaDiff->changedTables) !== 0) { - foreach ($schemaDiff->changedTables as $changedTable) { - if (!empty($changedTable->addedColumns) || !empty($changedTable->changedColumns)) { - return true; - } - } - } - } - - return false; - } - - /** - * Second step: Show tables, fields and keys to create or update - * - * @param string $inputPrefix input prefix, all names of form fields are prefixed with this - * @return string HTML output - * @throws \Doctrine\DBAL\DBALException - * @throws \Doctrine\DBAL\Schema\SchemaException - * @throws \InvalidArgumentException - * @throws \RuntimeException - * @throws \TYPO3\CMS\Core\Database\Schema\Exception\UnexpectedSignalReturnValueTypeException - * @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotException - * @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotReturnException - * @throws \TYPO3\CMS\Core\Database\Schema\Exception\StatementException - */ - public function getUserInput($inputPrefix) - { - $result = ''; - $changedFieldItems = ''; - $changedIndexItems = ''; - - $databaseDifferences = $this->getDatabaseDifferences(); - foreach ($databaseDifferences as $schemaDiff) { - $changedFieldItems .= $this->getChangedFieldInformation($schemaDiff); - $changedIndexItems .= $this->getChangedIndexInformation($schemaDiff); - } - - $result .= $this->renderList('Change the following fields in tables:', $changedFieldItems); - $result .= $this->renderList('Change the following keys in tables:', $changedIndexItems); - - return $result; - } - - /** - * Performs the database update. - * - * @param array &$dbQueries Queries done in this update - * @param string &$customMessage Custom message - * @return bool TRUE on success, FALSE on error - */ - public function performUpdate(array &$dbQueries, &$customMessage) - { - $statements = $this->getDatabaseDefinition(); - $result = $this->schemaMigrationService->install($statements, false); - - // Extract all statements stored in the keys, independent of error status - $dbQueries = array_merge($dbQueries, array_keys($result)); - - // Only keep error messages - $result = array_filter($result); - - $customMessage = implode( - LF, - array_map( - function (string $message) { - return 'SQL-ERROR: ' . htmlspecialchars($message); - }, - $result - ) - ); - - return count($result) === 0; - } - - /** - * Return HTML list items for fields added to tables - * - * @param \Doctrine\DBAL\Schema\SchemaDiff $schemaDiff - * @return string - */ - protected function getChangedFieldInformation(SchemaDiff $schemaDiff): string - { - $items = []; - - foreach ($schemaDiff->changedTables as $changedTable) { - $columns = array_map( - function (ColumnDiff $columnDiff) use ($changedTable) { - return $this->renderFieldListItem($changedTable->name, $columnDiff->column->getName()); - }, - $changedTable->changedColumns - ); - - $items[] = implode(LF, $columns); - } - - return trim(implode(LF, $items)); - } - - /** - * Return HTML list items for changed indexes on tables - * - * @param \Doctrine\DBAL\Schema\SchemaDiff $schemaDiff - * @return string - */ - protected function getChangedIndexInformation(SchemaDiff $schemaDiff): string - { - $items = []; - - foreach ($schemaDiff->changedTables as $changedTable) { - $indexes = array_map( - function (Index $index) use ($changedTable) { - return $this->renderFieldListItem($changedTable->name, $index->getName()); - }, - $changedTable->changedIndexes - ); - - $items[] = implode(LF, $indexes); - } - - return trim(implode(LF, $items)); - } -} diff --git a/typo3/sysext/install/Classes/Updates/InitialDatabaseSchemaUpdate.php b/typo3/sysext/install/Classes/Updates/InitialDatabaseSchemaUpdate.php deleted file mode 100644 index 2c6cd2c498575d6dffaa7315b7457b047bb232d7..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Classes/Updates/InitialDatabaseSchemaUpdate.php +++ /dev/null @@ -1,224 +0,0 @@ -<?php -namespace TYPO3\CMS\Install\Updates; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use Doctrine\DBAL\Schema\Column; -use Doctrine\DBAL\Schema\Index; -use Doctrine\DBAL\Schema\SchemaDiff; -use Doctrine\DBAL\Schema\Table; - -/** - * Contains the update class to create tables, fields and keys to comply to the database schema - */ -class InitialDatabaseSchemaUpdate extends AbstractDatabaseSchemaUpdate -{ - /** - * Constructor function. - */ - public function __construct() - { - parent::__construct(); - $this->title = 'Update database schema: Create tables and fields'; - } - - /** - * Checks if an update is needed - * - * @param string &$description The description for the update - * @return bool TRUE if an update is needed, FALSE otherwise - * @throws \Doctrine\DBAL\DBALException - * @throws \Doctrine\DBAL\Schema\SchemaException - * @throws \InvalidArgumentException - * @throws \RuntimeException - * @throws \TYPO3\CMS\Core\Database\Schema\Exception\UnexpectedSignalReturnValueTypeException - * @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotException - * @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotReturnException - * @throws \TYPO3\CMS\Core\Database\Schema\Exception\StatementException - */ - public function checkForUpdate(&$description) - { - $description = 'There are tables or fields in the database which need to be created.<br /><br />' . - 'You have to run this update wizard before you can run any other update wizard to make sure all ' . - 'needed tables and fields are present.'; - - $databaseDifferences = $this->getDatabaseDifferences(); - foreach ($databaseDifferences as $schemaDiff) { - // A new table is required, early return - if (!empty($schemaDiff->newTables)) { - return true; - } - - // A new field or index is required - foreach ($schemaDiff->changedTables as $changedTable) { - if (!empty($changedTable->addedColumns)) { - return true; - } - - // Ignore new indexes that work on columns that need changes - foreach ($changedTable->addedIndexes as $indexName => $addedIndex) { - // Strip MySQL prefix length information to get real column names - $indexColumns = array_map( - function ($columnName) { - return preg_replace('/\(\d+\)$/', '', $columnName); - }, - $addedIndex->getColumns() - ); - $columnChanges = array_intersect($indexColumns, array_keys($changedTable->changedColumns)); - if (!empty($columnChanges)) { - unset($changedTable->addedIndexes[$indexName]); - } - } - - if (!empty($changedTable->addedIndexes)) { - return true; - } - } - } - - return false; - } - - /** - * Second step: Show tables, fields and keys to be created - * - * @param string $inputPrefix input prefix, all names of form fields are prefixed with this - * @return string HTML output - * @throws \Doctrine\DBAL\DBALException - * @throws \Doctrine\DBAL\Schema\SchemaException - * @throws \InvalidArgumentException - * @throws \RuntimeException - * @throws \TYPO3\CMS\Core\Database\Schema\Exception\UnexpectedSignalReturnValueTypeException - * @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotException - * @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotReturnException - * @throws \TYPO3\CMS\Core\Database\Schema\Exception\StatementException - */ - public function getUserInput($inputPrefix): string - { - $result = ''; - $addedTables = ''; - $addedFields = ''; - $addedIndexes = ''; - - $databaseDifferences = $this->getDatabaseDifferences(); - foreach ($databaseDifferences as $schemaDiff) { - $addedTables .= $this->getAddedTableInformation($schemaDiff); - $addedFields .= $this->getAddedFieldInformation($schemaDiff); - $addedIndexes .= $this->getAddedIndexInformation($schemaDiff); - } - - $result .= $this->renderList('Add the following tables:', $addedTables); - $result .= $this->renderList('Add the following fields to tables:', $addedFields); - $result .= $this->renderList('Add the following keys to tables:', $addedIndexes); - - return $result; - } - - /** - * Performs the database update. - * - * @param array &$dbQueries Queries done in this update - * @param string &$customMessage Custom message - * @return bool TRUE on success, FALSE on error - */ - public function performUpdate(array &$dbQueries, &$customMessage): bool - { - $statements = $this->getDatabaseDefinition(); - $result = $this->schemaMigrationService->install($statements, true); - - // Extract all statements stored in the keys, independent of error status - $dbQueries = array_merge($dbQueries, array_keys($result)); - - // Only keep error messages - $result = array_filter($result); - - $customMessage = implode( - LF, - array_map( - function (string $message) { - return 'SQL-ERROR: ' . htmlspecialchars($message); - }, - $result - ) - ); - - return empty($result); - } - - /** - * Return HTML list items for added tables - * - * @param \Doctrine\DBAL\Schema\SchemaDiff $schemaDiff - * @return string - */ - protected function getAddedTableInformation(SchemaDiff $schemaDiff): string - { - $items = array_map( - function (Table $table) { - return $this->renderTableListItem($table->getName()); - }, - $schemaDiff->newTables - ); - - return trim(implode(LF, $items)); - } - - /** - * Return HTML list items for fields added to tables - * - * @param \Doctrine\DBAL\Schema\SchemaDiff $schemaDiff - * @return string - */ - protected function getAddedFieldInformation(SchemaDiff $schemaDiff): string - { - $items = []; - - foreach ($schemaDiff->changedTables as $changedTable) { - $columns = array_map( - function (Column $column) use ($changedTable) { - return $this->renderFieldListItem($changedTable->name, $column->getName()); - }, - $changedTable->addedColumns - ); - - $items[] = implode(LF, $columns); - } - - return trim(implode(LF, $items)); - } - - /** - * Return HTML list items for indexes added to tables - * - * @param \Doctrine\DBAL\Schema\SchemaDiff $schemaDiff - * @return string - */ - protected function getAddedIndexInformation(SchemaDiff $schemaDiff): string - { - $items = []; - - foreach ($schemaDiff->changedTables as $changedTable) { - $indexes = array_map( - function (Index $index) use ($changedTable) { - return $this->renderFieldListItem($changedTable->name, $index->getName()); - }, - $changedTable->addedIndexes - ); - - $items[] = implode(LF, $indexes); - } - - return trim(implode(LF, $items)); - } -} diff --git a/typo3/sysext/install/Classes/View/JsonView.php b/typo3/sysext/install/Classes/View/JsonView.php index 8be2af179ef77c6c2da8feb9e4098fc6824c1629..a21d40c2056ad294d2f547110f35520859dd1ed9 100644 --- a/typo3/sysext/install/Classes/View/JsonView.php +++ b/typo3/sysext/install/Classes/View/JsonView.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\View; /* @@ -15,8 +16,6 @@ namespace TYPO3\CMS\Install\View; */ use TYPO3\CMS\Extbase\Mvc\View\AbstractView; -use TYPO3\CMS\Install\Status\Exception as StatusException; -use TYPO3\CMS\Install\Status\StatusInterface; /** * Simple JsonView (currently returns an associative array) @@ -24,96 +23,13 @@ use TYPO3\CMS\Install\Status\StatusInterface; class JsonView extends AbstractView { /** - * @return string - */ - public function render() - { - $renderedData = $this->variables; - if (isset($renderedData['status']) && is_array($renderedData['status'])) { - try { - $renderedData['status'] = $this->transformStatusMessagesToArray($renderedData['status']); - } catch (StatusException $e) { - $renderedData['status'] = [[ - 'severity' => 'error', - 'title' => htmlspecialchars($e->getMessage()) - ]]; - } - } - - return $renderedData; - } - - /** - * Transform an array of messages to an associative array. - * - * @param array<StatusInterface> - * @return array - * @throws StatusException - */ - protected function transformStatusMessagesToArray(array $statusArray = []) - { - $result = []; - foreach ($statusArray as $status) { - if (!$status instanceof StatusInterface) { - throw new StatusException( - 'Object must implement StatusInterface', - 1381059600 - ); - } - $result[] = $this->transformStatusToArray($status); - } - return $result; - } - - /** - * Creates an array from a status object. - * Used for example to transfer the message as json. + * Main render() method just returns all variables. * - * @param StatusInterface $status + * @todo: This should be done differently and will be refactored with psr-7 switch * @return array */ - public function transformStatusToArray(StatusInterface $status) - { - $arrayStatus = []; - $arrayStatus['severity'] = $this->getSeverityAsNumber($status->getSeverity()); - $arrayStatus['title'] = htmlspecialchars($status->getTitle()); - $arrayStatus['message'] = htmlspecialchars($status->getMessage()); - return $arrayStatus; - } - - /** - * Return the corresponding integer value for given severity string - * - * @param string $severity - * - * @return int - */ - protected function getSeverityAsNumber($severity) + public function render(): array { - $number = -2; - switch (strtolower($severity)) { - case 'loading': - $number = -3; - break; - case 'notice': - $number = -2; - break; - case 'info': - $number = -1; - break; - case 'ok': - case 'success': - $number = 0; - break; - case 'warning': - $number = 1; - break; - case 'error': - case 'danger': - case 'fatal': - $number = 2; - break; - } - return $number; + return $this->variables; } } diff --git a/typo3/sysext/install/Classes/ViewHelpers/File/ExistsViewHelper.php b/typo3/sysext/install/Classes/ViewHelpers/File/ExistsViewHelper.php deleted file mode 100644 index de46427cac6582b405f11c62fb4350f1464c51e7..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Classes/ViewHelpers/File/ExistsViewHelper.php +++ /dev/null @@ -1,67 +0,0 @@ -<?php -namespace TYPO3\CMS\Install\ViewHelpers\File; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper; -use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface; -use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic; - -/** - * Simple view helper to check if given file is a regular file - * - * = Examples = - * - * <code title="Default"> - * <f:file.exists file="Absolute-path" /> - * </code> - * - * <output> - * TRUE or FALSE - * </output> - * - * @internal - */ -class ExistsViewHelper extends AbstractViewHelper -{ - use CompileWithRenderStatic; - - /** - */ - public function initializeArguments() - { - parent::initializeArguments(); - $this->registerArgument('file', 'string', 'Absolute path', true); - } - - /** - * Check if given file is a regular file - * - * @param array $arguments - * @param \Closure $renderChildrenClosure - * @param RenderingContextInterface $renderingContext - * - * @return bool - */ - public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext) - { - $file = $arguments['file']; - - $result = false; - if (file_exists($file) && is_file($file)) { - $result = true; - } - return $result; - } -} diff --git a/typo3/sysext/install/Classes/ViewHelpers/File/RelativePathViewHelper.php b/typo3/sysext/install/Classes/ViewHelpers/File/RelativePathViewHelper.php deleted file mode 100644 index 5554fa6407ab3c19237a38c69da99a11db2846f8..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Classes/ViewHelpers/File/RelativePathViewHelper.php +++ /dev/null @@ -1,58 +0,0 @@ -<?php -namespace TYPO3\CMS\Install\ViewHelpers\File; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper; -use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface; -use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic; - -/** - * Get file path relative to PATH_site from absolute path - * - * = Examples = - * - * <code title="Defaults"> - * <f:file.relativePath>/var/www/typo3/instance/typo3temp/foo.jpg</f:file.relativePath> - * </code> - * <output> - * typo3temp/foo.jpg - * </output> - * - * @internal - */ -class RelativePathViewHelper extends AbstractViewHelper -{ - use CompileWithRenderStatic; - - /** - * Output is escaped already. We must not escape children, to avoid double encoding. - * - * @var bool - */ - protected $escapeChildren = false; - - /** - * @param array $arguments - * @param \Closure $renderChildrenClosure - * @param RenderingContextInterface $renderingContext - * - * @return string - */ - public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext) - { - $absolutePath = $renderChildrenClosure(); - return \TYPO3\CMS\Core\Utility\PathUtility::stripPathSitePrefix($absolutePath); - } -} diff --git a/typo3/sysext/install/Classes/ViewHelpers/Format/ImageMagickCommandsViewHelper.php b/typo3/sysext/install/Classes/ViewHelpers/Format/ImageMagickCommandsViewHelper.php deleted file mode 100644 index 66350510c6bc181be9067cb6eccd79ac55892d6f..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Classes/ViewHelpers/Format/ImageMagickCommandsViewHelper.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -namespace TYPO3\CMS\Install\ViewHelpers\Format; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper; -use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface; -use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic; - -/** - * Display image magick commands - * - * @internal - */ -class ImageMagickCommandsViewHelper extends AbstractViewHelper -{ - use CompileWithRenderStatic; - - /** - * As this ViewHelper renders HTML, the output must not be escaped. - * - * @var bool - */ - protected $escapeOutput = false; - - /** - * Initialize arguments - */ - public function initializeArguments() - { - parent::initializeArguments(); - $this->registerArgument('commands', 'array', 'Given commands', false, []); - } - - /** - * Display image magick commands - * - * @param array $arguments - * @param \Closure $renderChildrenClosure - * @param RenderingContextInterface $renderingContext - * - * @return string Formatted commands - */ - public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext) - { - $commands = $arguments['commands']; - - $result = []; - foreach ($commands as $commandGroup) { - $result[] = '<strong>Command:</strong>' . LF . htmlspecialchars($commandGroup[1]); - // If 3 elements: last one is result - if (count($commandGroup) === 3) { - $result[] = '<strong>Result:</strong>' . LF . htmlspecialchars($commandGroup[2]); - } - } - return '<pre><code class="language-bash">' . implode(LF, $result) . '</code></pre>'; - } -} diff --git a/typo3/sysext/install/Resources/Private/Language/ModuleInstallEnvironment.xlf b/typo3/sysext/install/Resources/Private/Language/ModuleInstallEnvironment.xlf new file mode 100644 index 0000000000000000000000000000000000000000..90ab0d2a4b9675006723d6203c4c0c119d5af476 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Language/ModuleInstallEnvironment.xlf @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xliff version="1.0" xmlns:t3="http://typo3.org/schemas/xliff"> + <file t3:id="1499810435" source-language="en" datatype="plaintext" original="messages" date="2017-07-11T22:00:35Z" product-name="environment"> + <header/> + <body> + <trans-unit id="mlang_labels_tablabel"> + <source>Environment</source> + </trans-unit> + <trans-unit id="mlang_labels_tabdescr"> + <source>Provides a simple link to the Install Tool. Notice the Install Tool (in typo3/install/) must be enabled.<br /><em>Access for 'admin' users only!</em></source> + </trans-unit> + <trans-unit id="mlang_tabs_tab"> + <source>Environment</source> + </trans-unit> + </body> + </file> +</xliff> diff --git a/typo3/sysext/install/Resources/Private/Language/ModuleInstallMaintenance.xlf b/typo3/sysext/install/Resources/Private/Language/ModuleInstallMaintenance.xlf new file mode 100644 index 0000000000000000000000000000000000000000..5451b782a958863531cb6c05fd067127cde5d953 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Language/ModuleInstallMaintenance.xlf @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xliff version="1.0" xmlns:t3="http://typo3.org/schemas/xliff"> + <file t3:id="1499810638" source-language="en" datatype="plaintext" original="messages" date="2017-07-11T22:03:58Z" product-name="maintenance"> + <header/> + <body> + <trans-unit id="mlang_labels_tablabel"> + <source>Maintenance</source> + </trans-unit> + <trans-unit id="mlang_labels_tabdescr"> + <source>Provides a simple link to the Install Tool. Notice the Install Tool (in typo3/install/) must be enabled.<br /><em>Access for 'admin' users only!</em></source> + </trans-unit> + <trans-unit id="mlang_tabs_tab"> + <source>Maintenance</source> + </trans-unit> + </body> + </file> +</xliff> diff --git a/typo3/sysext/install/Resources/Private/Language/ModuleInstallSettings.xlf b/typo3/sysext/install/Resources/Private/Language/ModuleInstallSettings.xlf new file mode 100644 index 0000000000000000000000000000000000000000..c54558a00c4009390e7182c307cb977d168280c6 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Language/ModuleInstallSettings.xlf @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xliff version="1.0" xmlns:t3="http://typo3.org/schemas/xliff"> + <file t3:id="1499810656" source-language="en" datatype="plaintext" original="messages" date="2017-07-11T22:04:16Z" product-name="settings"> + <header/> + <body> + <trans-unit id="mlang_labels_tablabel"> + <source>Settings</source> + </trans-unit> + <trans-unit id="mlang_labels_tabdescr"> + <source>Provides a simple link to the Install Tool. Notice the Install Tool (in typo3/install/) must be enabled.<br /><em>Access for 'admin' users only!</em></source> + </trans-unit> + <trans-unit id="mlang_tabs_tab"> + <source>Settings</source> + </trans-unit> + </body> + </file> +</xliff> diff --git a/typo3/sysext/install/Resources/Private/Language/ModuleInstallUpgrade.xlf b/typo3/sysext/install/Resources/Private/Language/ModuleInstallUpgrade.xlf new file mode 100644 index 0000000000000000000000000000000000000000..c8777a64dab6e68ed5f158b6bf9db8e4905a1461 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Language/ModuleInstallUpgrade.xlf @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xliff version="1.0" xmlns:t3="http://typo3.org/schemas/xliff"> + <file t3:id="1499810671" source-language="en" datatype="plaintext" original="messages" date="2017-07-13T22:04:31Z" product-name="upgrade"> + <header/> + <body> + <trans-unit id="mlang_labels_tablabel"> + <source>Upgrade</source> + </trans-unit> + <trans-unit id="mlang_labels_tabdescr"> + <source>Provides a simple link to the Install Tool. Notice the Install Tool (in typo3/install/) must be enabled.<br /><em>Access for 'admin' users only!</em></source> + </trans-unit> + <trans-unit id="mlang_tabs_tab"> + <source>Upgrade</source> + </trans-unit> + </body> + </file> +</xliff> diff --git a/typo3/sysext/install/Resources/Private/Layouts/ToolAuthenticated.html b/typo3/sysext/install/Resources/Private/Layouts/ToolAuthenticated.html index 2cd25b3fc8a07eb0bf320a0c64bb5024c4447e0b..aceeb2e604d1a5af51d0bf40a9078e961fa5a209 100644 --- a/typo3/sysext/install/Resources/Private/Layouts/ToolAuthenticated.html +++ b/typo3/sysext/install/Resources/Private/Layouts/ToolAuthenticated.html @@ -1,55 +1,71 @@ <!DOCTYPE html> <html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"> - <head> - <title>Install tool on site {siteName}</title> - <f:render partial="Action/Common/Headers" arguments="{_all}" /> - </head> - <body class="{context}"> - <div class="container"> - <f:if condition="{contextService.backendContext}"> - <f:then> - <div id="typo3-docheader"> - <div class="typo3-docheader-functions"></div> - <div class="typo3-docheader-buttons"></div> - </div> - </f:then> - <f:else> - <div class="row"> - <div class="col-sm-12"> - <f:render partial="Action/Common/Head" arguments="{_all}" /> +<head> + <title>Install tool on site {siteName}</title> + <f:render partial="Action/Common/Headers" arguments="{_all}" /> +</head> +<body class="{context}"> +<f:if condition="{contextService.backendContext}"> + <f:then> + <div class="module" data-module-id="" data-module-name=""> + <div class="module-docheader t3js-module-docheader" style="height: auto;"> + <div class="module-docheader-bar module-docheader-bar-navigation t3js-module-docheader-bar t3js-module-docheader-bar-navigation row" style="height: auto;"> + <div class="module-docheader-bar-column-left col-xs-12 col-sm-4 col-md-3"> + <div class="form-inline row"></div> + </div> + <div class="module-docheader-bar-column-right col-xs-12 col-sm-8 col-md-9 text-right"> + <div class="btn-toolbar" role="toolbar" aria-label=""> + <div class="gridder-navigation btn-group pull-right"> + <a href="#" class="gridder-nav-prev btn btn-default btn-sm"> + <core:icon identifier="actions-move-left" alternativeMarkupIdentifier="inline" /> + </a> + <a href="#" class="gridder-nav-next btn btn-default btn-sm"> + <core:icon identifier="actions-move-right" alternativeMarkupIdentifier="inline" /> + </a> + <a href="#" class="gridder-close btn btn-default btn-sm"> + <core:icon identifier="actions-close" alternativeMarkupIdentifier="inline" /> + </a> + </div> + <a href="{i:uri.action(action: 'logout')}" class="btn btn-default btn-sm pull-right"> + <span class="t3js-icon icon icon-size-small icon-state-default icon-actions-logout" data-identifier="actions-logout"> + <span class="icon-markup"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g class="icon-color"><path d="M9 10v4H2V2h7v4h1V1.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v13a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5V10H9z"></path><path d="M10.983 5.041a.5.5 0 0 1 .812-.39l3.7 2.96a.5.5 0 0 1 0 .78l-3.7 2.96a.5.5 0 0 1-.812-.39V9H6V7h4.983V5.041z"></path></g></svg> + </span> + </span> + Lock Install Tool + </a> + </div> + </div> + <div class="module-docheader-bar module-docheader-bar-buttons t3js-module-docheader-bar t3js-module-docheader-bar-buttons" style="height: auto;"> + <div class="module-docheader-bar-column-left"> + <div class="btn-toolbar" role="toolbar" aria-label=""></div> + </div> + <div class="module-docheader-bar-column-right"></div> </div> - </div> - </f:else> - </f:if> - <div class="row"> - <div class="col-sm-12"> - <div id="install-menu-button" class="hidden-md hidden-lg"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#mobileMenuWrapper"> - <span class="sr-only">Toggle navigation</span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> </div> </div> - </div> - <div class="row hidden-md hidden-lg"> - <div class="col-sm-12"> - <div id="mobileMenuWrapper" class="collapse"> - <f:render partial="Action/Common/Left" arguments="{_all}" /> - </div> + <div class="module-body t3js-module-body" style="padding-top: 89px;"> + <f:render section="Content" /> </div> </div> - <div class="row"> - <div class="col-md-3 leftNavigation hidden-xs hidden-sm"> - <div id="menuWrapper" data-spy="affix" data-offset-top="60" data-offset-bottom="190"> - <f:render partial="Action/Common/Left" arguments="{_all}" /> - </div> + </f:then> + <f:else> + <div class="scaffold t3js-scaffold scaffold-modulemenu-expanded"> + <f:render partial="Action/Common/Topbar" arguments="{_all}" /> + <div class="scaffold-modulemenu t3js-scaffold-modulemenu"> + <f:render partial="Action/Common/ModuleMenu" arguments="{_all}" /> </div> - <div class="col-sm-12 col-md-9 content-area"> - <f:render section="Content" /> + <div class="scaffold-content t3js-scaffold-content" style="padding-top:25px; overflow: auto;"> + <div class="container-fluid"> + <div class="row"> + <div class="col-sm-12 content-area"> + <f:render section="Content" /> + </div> + </div> + </div> </div> </div> - </div> - </body> -</html> + </f:else> +</f:if> +</body> +</html> \ No newline at end of file diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Common/Headers.html b/typo3/sysext/install/Resources/Private/Partials/Action/Common/Headers.html index dd79f8d9b1f130a13ec2cdd0fefc3c583c04998a..27a3392892860934faee8aa6b1b3dc2656c04b64 100644 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Common/Headers.html +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Common/Headers.html @@ -2,8 +2,6 @@ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link rel="stylesheet" type="text/css" href="{f:uri.resource(path: 'Css/install.css')}?{time}" /> <link rel="icon" type="image/vnd.microsoft.icon" href="{f:uri.resource(path: 'Icons/favicon.ico')}?{time}" /> -<script type="text/javascript" src="{f:uri.resource(extensionName: 'Core', path: 'JavaScript/Contrib/jquery/jquery-3.2.1.min.js')}?{time}"></script> -<script type="text/javascript" src="{f:uri.resource(extensionName: 'Backend', path: 'JavaScript/jquery.clearable.js')}?{time}"></script> -<script type="text/javascript" src="{f:uri.resource(path: 'JavaScript/bootstrap.min.js')}?{time}"></script> -<script type="text/javascript" src="{f:uri.resource(path: 'JavaScript/chosen.jquery.min.js')}?{time}"></script> +<script type="text/javascript" src="{f:uri.resource(path: 'JavaScript/RequireJSConfig.js')}?{time}"></script> +<script type="text/javascript" src="{f:uri.resource(path: 'JavaScript/Contrib/require.js', extensionName: 'Core')}?{time}"></script> <script type="text/javascript" src="{f:uri.resource(path: 'JavaScript/Install.js')}?{time}"></script> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Common/Left.html b/typo3/sysext/install/Resources/Private/Partials/Action/Common/Left.html deleted file mode 100644 index 66c8a8100a11d441468e622aaeb8f4e3d65ff572..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Common/Left.html +++ /dev/null @@ -1,25 +0,0 @@ -<div class="t3js-list-group-wrapper" xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:i="http://typo3.org/ns/TYPO3/CMS/Install/ViewHelpers" > - <ul class="list-group"> - <f:render partial="Action/Common/MenuLink" arguments="{action: action, context: context, action_name: 'importantActions', label: 'Important actions'}" /> - <f:render partial="Action/Common/MenuLink" arguments="{action: action, context: context, action_name: 'configuration', label: 'Configuration Presets'}" /> - <f:render partial="Action/Common/MenuLink" arguments="{action: action, context: context, action_name: 'allConfiguration', label: 'All configuration'}" /> - <f:render partial="Action/Common/MenuLink" arguments="{action: action, context: context, action_name: 'upgradeWizard', label: 'Upgrade Wizard'}" /> - <f:render partial="Action/Common/MenuLink" arguments="{action: action, context: context, action_name: 'upgradeAnalysis', label: 'Upgrade Analysis'}"/> - <f:render partial="Action/Common/MenuLink" arguments="{action: action, context: context, action_name: 'extensionScanner', label: 'Extension Scanner'}"/> - <f:render partial="Action/Common/MenuLink" arguments="{action: action, context: context, action_name: 'systemEnvironment', label: 'System environment'}" /> - <f:render partial="Action/Common/MenuLink" arguments="{action: action, context: context, action_name: 'folderStructure', label: 'Folder structure'}" /> - <f:render partial="Action/Common/MenuLink" arguments="{action: action, context: context, action_name: 'testSetup', label: 'Test setup'}" /> - <f:render partial="Action/Common/MenuLink" arguments="{action: action, context: context, action_name: 'cleanUp', label: 'Clean up'}" /> - <f:render partial="Action/Common/MenuLink" arguments="{action: action, context: context, action_name: 'about', label: 'About'}" /> - </ul> - - <div> - <a href="{i:uri.action(action: 'logout')}" class="btn btn-warning btn-block">Logout from Install Tool</a> - <f:if condition="{contextService.backendContext}"> - <f:else> - <a href="{i:uri.action(action: 'backend')}" class="btn btn-default btn-block">Backend admin</a> - <a href="{i:uri.action(action: 'frontend')}" class="btn btn-default btn-block">Frontend website</a> - </f:else> - </f:if> - </div> -</div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Common/MarkExtensionAsDone.html b/typo3/sysext/install/Resources/Private/Partials/Action/Common/MarkExtensionAsDone.html deleted file mode 100644 index bdb21a98d22731de28f9eb3a0bcfe71197f8a3e9..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Common/MarkExtensionAsDone.html +++ /dev/null @@ -1,2 +0,0 @@ -<button class="btn btn-default" type="submit">{text}</button> -<input type="hidden" name="install[set][{name}]" value="submit" /> \ No newline at end of file diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Common/MenuLink.html b/typo3/sysext/install/Resources/Private/Partials/Action/Common/MenuLink.html deleted file mode 100644 index d927376a5149ecbfd54b671df0f2a4735c63c52e..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Common/MenuLink.html +++ /dev/null @@ -1,6 +0,0 @@ -{namespace i=TYPO3\CMS\Install\ViewHelpers} -<li class="list-group-item{f:if(condition:'{action} == {action_name}', then:' active')}"> - <a class="t3js-install-menu-{action_name}" href="{i:uri.action(action: action_name)}"> - {label} - </a> -</li> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Common/MenuModuleLink.html b/typo3/sysext/install/Resources/Private/Partials/Action/Common/MenuModuleLink.html new file mode 100644 index 0000000000000000000000000000000000000000..1008c314c9d8b934aaa1b5c80a33fb3a11edab73 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Common/MenuModuleLink.html @@ -0,0 +1,14 @@ +{namespace i=TYPO3\CMS\Install\ViewHelpers} + +<li class="modulemenu-item t3js-mainmodule {f:if(condition:'{action} == {action_name}', then:' active')}"> + <a class="modulemenu-item-link" href="{i:uri.action(action: action_name)}"> + <span class="modulemenu-icon modulemenu-item-icon"> + <span class="t3js-icon icon icon-size-default icon-state-default icon-module-system_extinstall" data-identifier="module-system_extinstall"> + <span class="icon-markup"> + <img src="{f:uri.resource(path: 'Icons/module-install-{action_name}.svg')}" width="32" height="32"> + </span> + </span> + </span> + <span class="modulemenu-item-title">{label}</span> + </a> +</li> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Common/ModuleMenu.html b/typo3/sysext/install/Resources/Private/Partials/Action/Common/ModuleMenu.html new file mode 100644 index 0000000000000000000000000000000000000000..0eb074f92d9a55fc48d80c5706c0cb70804feed3 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Common/ModuleMenu.html @@ -0,0 +1,61 @@ +<div class="modulemenu t3js-modulemenu" xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"> + <ul class="nav nav-modules" data-role="modulemenu" id="menu"> + <li class="modulemenu-group expanded" id="web" data-modulename="web" data-navigationcomponentid="" data-navigationframescript="" data-navigationframescriptparameters=""> + <div class="modulemenu-group-header"> + <span class="modulemenu-icon modulemenu-group-icon"> + <span class="t3js-icon icon icon-size-default icon-state-default icon-module-tools" data-identifier="module-tools"> + <span class="icon-markup"> + <core:icon identifier="module-tools" size="small"/> + </span> + </span> + </span> + <span class="modulemenu-group-title"> + Admin Tools <f:comment><span class="caret"></span></f:comment> + </span> + </div> + <ul class="modulemenu-group-container"> + <f:render partial="Action/Common/MenuModuleLink" arguments="{action: action, context: context, action_name: 'maintenance', label: 'Maintenance'}" /> + <f:render partial="Action/Common/MenuModuleLink" arguments="{action: action, context: context, action_name: 'settings', label: 'Settings'}" /> + <f:render partial="Action/Common/MenuModuleLink" arguments="{action: action, context: context, action_name: 'upgrade', label: 'Upgrade'}" /> + <f:render partial="Action/Common/MenuModuleLink" arguments="{action: action, context: context, action_name: 'environment', label: 'Environment'}" /> + + <f:comment> + <f:render partial="Action/Common/MenuModuleLink" arguments="{action: action, context: context, action_name: 'about', label: 'About'}" /> + </f:comment> + </ul> + </li> + <f:if condition="{contextService.backendContext}"> + <f:then></f:then> + <f:else> + <li class="modulemenu-group expanded" id="web" data-modulename="web" data-navigationcomponentid="" data-navigationframescript="" data-navigationframescriptparameters=""> + <ul class="modulemenu-group-container"> + <li class="modulemenu-item t3js-mainmodule "> + <a class="modulemenu-item-link" href="../../../index.php" class="btn btn-default btn-block"> + <span class="modulemenu-icon modulemenu-item-icon"> + <span class="t3js-icon icon icon-size-default icon-state-default icon-module-system_extinstall" data-identifier="module-system_extinstall"> + <span class="icon-markup"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g class="icon-color"><path d="M9 10v4H2V2h7v4h1V1.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v13a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5V10H9z"></path><path d="M10.983 5.041a.5.5 0 0 1 .812-.39l3.7 2.96a.5.5 0 0 1 0 .78l-3.7 2.96a.5.5 0 0 1-.812-.39V9H6V7h4.983V5.041z"></path></g></svg> + </span> + </span> + </span> + <span class="modulemenu-item-title">Backend admin</span> + </a> + </li> + <li class="modulemenu-item t3js-mainmodule "> + <a class="modulemenu-item-link" href="../../../../index.php" class="btn btn-default btn-block"> + <span class="modulemenu-icon modulemenu-item-icon"> + <span class="t3js-icon icon icon-size-default icon-state-default icon-module-system_extinstall" data-identifier="module-system_extinstall"> + <span class="icon-markup"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g class="icon-color"><path d="M9 10v4H2V2h7v4h1V1.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v13a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5V10H9z"></path><path d="M10.983 5.041a.5.5 0 0 1 .812-.39l3.7 2.96a.5.5 0 0 1 0 .78l-3.7 2.96a.5.5 0 0 1-.812-.39V9H6V7h4.983V5.041z"></path></g></svg> + </span> + </span> + </span> + <span class="modulemenu-item-title">Frontend website</span> + </a> + </li> + </ul> + </li> + </f:else> + </f:if> + </ul> +</div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Common/Topbar.html b/typo3/sysext/install/Resources/Private/Partials/Action/Common/Topbar.html new file mode 100644 index 0000000000000000000000000000000000000000..d1c61dd4628f8198f4c345477959a2d3ee6a2409 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Common/Topbar.html @@ -0,0 +1,30 @@ +<div class="t3js-scaffold-header" xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:i="http://typo3.org/ns/TYPO3/CMS/Install/ViewHelpers"> + <div class="scaffold-topbar t3js-scaffold-topbar"> + <div class="topbar"> + <div class="topbar-header t3js-topbar-header"> + <button class="topbar-button topbar-button-modulemenu t3js-topbar-button-modulemenu" style="outline: none;"> + <core:icon identifier="actions-move-move" alternativeMarkupIdentifier="inline" /> + </button> + <div class="topbar-header-site" style="margin-left: 80px;"> + <a href="./" target="_top" title="TYPO3.CMS - 8.7.0-dev"> + <span class="topbar-header-site-logo"> + <img src="/typo3/sysext/backend/Resources/Public/Images/typo3_logo_orange.svg" width="22" height="22" title="TYPO3 Content Management System" alt=""> + </span> + <span class="topbar-header-site-title"> + <span class="topbar-header-site-name">Admin tools on site: {siteName}</span> + <span class="topbar-header-site-version">TYPO3 CMS {typo3Version}</span> + </span> + </a> + <a href="{i:uri.action(action: 'logout')}" target="_top" class="btn btn-danger pull-right" style="margin-top: 7px; margin-right: 15px;"> + <span class="t3js-icon icon icon-size-small icon-state-default icon-actions-logout" data-identifier="actions-logout"> + <span class="icon-markup"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g class="icon-color"><path d="M9 10v4H2V2h7v4h1V1.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v13a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5V10H9z"></path><path d="M10.983 5.041a.5.5 0 0 1 .812-.39l3.7 2.96a.5.5 0 0 1 0 .78l-3.7 2.96a.5.5 0 0 1-.812-.39V9H6V7h4.983V5.041z"></path></g></svg> + </span> + </span> + Logout + </a> + </div> + </div> + </div> + </div> +</div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/CleanUp/ClearTables.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/CleanUp/ClearTables.html deleted file mode 100644 index 8016efcd0428639aebbca1a18b54cb98ec40a085..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/CleanUp/ClearTables.html +++ /dev/null @@ -1,37 +0,0 @@ - -<p> - Use with care! Clearing tables here can have a negative impact on your site functionality. - You could log out all users, delete all their basket data, and lose logging - information! -</p> -<p> - Some database tables in TYPO3 CMS hold semi-temporary data that is not deleted when - clicking "Clear all cache" in the backend. Those can be cleared here, effectively - removing <strong>all</strong> rows from it. This can be useful in rare cases. -</p> - -<form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <div class="form-group"> - <f:for each="{cleanableTables}" as="cleanableTable"> - <div class="checkbox"> - <label> - <input - id="t3-install-database_clearcache-{cleanableTable.name}" - name="install[values][{cleanableTable.name}]" - value="1" - type="checkbox" - /> - <strong>{cleanableTable.name}</strong> Rows: {cleanableTable.rows} - </label> - </div> - <p>Description: {cleanableTable.description}</p> - <hr> - </f:for> - </div> - - <f:render - partial="Action/Common/SubmitButton" - arguments="{name:'clearTables', text:'Clear selected tables'}" - /> -</form> \ No newline at end of file diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/CleanUp/ProcessedFiles.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/CleanUp/ProcessedFiles.html deleted file mode 100644 index 9929fad5ba2b3127335c189d4e081835229ef284..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/CleanUp/ProcessedFiles.html +++ /dev/null @@ -1,17 +0,0 @@ - - -<p> - The File Abstraction Layer stores a database record for every file it needs to process. (e.g. image thumbnails) - In case you modified some graphics settings (All Configuration [GFX]) and you need all processed files to get - regenerated, you can use this tool to remove the existing ones. The new processed files are created once they are - needed. -</p> - -<form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - - <f:render - partial="Action/Common/SubmitButton" - arguments="{name:'clearProcessedFiles', text:'Clear processed files'}" - /> -</form> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/CleanUp/ResetBackendUserUc.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/CleanUp/ResetBackendUserUc.html deleted file mode 100644 index a86e25b6d55b819dc5eacb67458ac512ab6e09e6..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/CleanUp/ResetBackendUserUc.html +++ /dev/null @@ -1,19 +0,0 @@ - -<p> - If you press this button all backend users from the tables be_users will - have their user preferences cleared (field 'uc' set to an empty string). -</p> -<p> - This may come in handy in rare cases where that configuration may be corrupt. - Clearing this will clear all user settings from the 'Setup' module. -</p> - -<form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <div class="t3js-resetBackendUserUc"> - <f:render - partial="Action/Common/SubmitButton" - arguments="{name:'resetBackendUserUc', text:'Reset backend user preferences'}" - /> - </div> -</form> \ No newline at end of file diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/CleanUp/Typo3TempFiles.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/CleanUp/Typo3TempFiles.html deleted file mode 100644 index 4265f79fa7b8b3c954a00ba0e33c6e523a8fea38..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/CleanUp/Typo3TempFiles.html +++ /dev/null @@ -1,100 +0,0 @@ - -<div class="alert alert-notice"> - <h4>About</h4> - <p> - TYPO3 uses this directory for temporary files, mainly processed and cached images. - The filenames are cryptic. They are unique representations of the file properties - made by md5-hashing a serialized array with information. - </p> - <p> - This directory may contain many thousands of files and a lot of them may be of no use anymore. - </p> - <p> - With this action you can delete the files in this folder. Afterwards, you - should also clear the cache database tables. - </p> - <p> - This tool will delete files only if the last 10 characters before the file extension - ('.' + 3 chars) are hexadecimal valid ciphers, which are lowercase a-f and 0-9. - </p> -</div> - -<form method="post" class="form-horizontal"> -<div class="row"> - <div class="col-sm-4"><strong class="pull-right">Number of temporary files</strong></div> - <div class="col-sm-8">{typo3TempData.numberOfFilesInSelectedDirectory}</div> -</div> -<div class="row"> - <div class="col-sm-4"><strong class="pull-right">Number matching</strong></div> - <div class="col-sm-8">{typo3TempData.numberOfFilesMatchingCriteria} </div> -</div> -<div class="row"> - <div class="col-sm-4"><strong class="pull-right">Number deleted</strong></div> - <div class="col-sm-8">{typo3TempData.numberOfDeletedFiles}</div> -</div> -<br> -<div class="row"> - <div class="form-group"> - <label for="t3-install-delete" class="col-sm-4 control-label">Delete files by condition</label> - <div class="col-sm-7"> - <select - id="t3-install-delete" - name="install[values][condition]" - class="form-control" - > - <option value="0">All</option> - <option value="day" {f:if(condition:'{typo3TempData.selectedCondition} == \'day\'', then:'selected="selected"')}>Last access more than a day ago</option> - <option value="week" {f:if(condition:'{typo3TempData.selectedCondition} == \'week\'', then:'selected="selected"')}>Last access more than a week ago</option> - <option value="month" {f:if(condition:'{typo3TempData.selectedCondition} == \'month\'', then:'selected="selected"')}>Last access more than a month ago</option> - <option value="10" {f:if(condition:'{typo3TempData.selectedCondition} == \'10\'', then:'selected="selected"')}>File size greater than 10K</option> - <option value="50" {f:if(condition:'{typo3TempData.selectedCondition} == \'50\'', then:'selected="selected"')}>File size greater than 50K</option> - <option value="100" {f:if(condition:'{typo3TempData.selectedCondition} == \'100\'', then:'selected="selected"')}>File size greater than 100K</option> - </select> - </div> - </div> - <div class="form-group"> - <label for="t3-install-action" class="col-sm-4 control-label">Number of files at a time</label> - <div class="col-sm-7"> - <select - id="t3-install-action" - name="install[values][numberOfFiles]" - class="form-control" - > - <option value="0">Don't delete, just display statistics</option> - <option value="500" {f:if(condition:'{typo3TempData.numberOfFiles} == \'500\'', then:'selected="selected"')}>Delete 500</option> - <option value="1000" {f:if(condition:'{typo3TempData.numberOfFiles} == \'1000\'', then:'selected="selected"')}>Delete 1000</option> - <option value="5000" {f:if(condition:'{typo3TempData.numberOfFiles} == \'5000\'', then:'selected="selected"')}>Delete 5000</option> - </select> - </div> - </div> - - <div class="form-group"> - <label for="t3-install-subdirectory" class="col-sm-4 control-label">From sub-directory</label> - <div class="col-sm-7"> - <select - id="t3-install-subdirectory" - name="install[values][subDirectory]" - class="form-control" - > - <f:for each="{typo3TempData.subDirectories}" as="subDirectory"> - <option - value="{subDirectory.name}" - {f:if(condition:subDirectory.selected, then:'selected="selected"')} - > - <f:if condition="{subDirectory.name}"> - {subDirectory.name}/ (Files: {subDirectory.filesNumber}) - </f:if> - </option> - </f:for> - </select> - </div> - </div> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <div class="col-sm-12"> - <f:render - partial="Action/Common/SubmitButton" - arguments="{name:'deleteTypo3TempFiles', text:'Empty selected folders'}" - /> - </div> -</div> -</form> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Environment/EnvironmentCheck.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Environment/EnvironmentCheck.html new file mode 100644 index 0000000000000000000000000000000000000000..60717fcbc46b27012a14ccf31da6fc4a71388917 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Environment/EnvironmentCheck.html @@ -0,0 +1,17 @@ +<p> +A series of PHP settings and database checks. +</p> +<button + class="btn btn-default t3js-environmentCheck-execute" + type="button" +> + Run tests again +</button> +<hr> + +<div class="t3js-environmentCheck-output"></div> +<f:for each="{systemStatusBySeverity}" as="statusMessages"> + <f:for each="{statusMessages}" as="statusMessage"> + <f:render partial="Action/Common/StatusMessage" arguments="{message: statusMessage}"/> + </f:for> +</f:for> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Environment/FolderStructure.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Environment/FolderStructure.html new file mode 100644 index 0000000000000000000000000000000000000000..3de72e720687fb200cc24e8ef7757fc65e13f820 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Environment/FolderStructure.html @@ -0,0 +1,28 @@ +<p> + Root Directory: <strong><i:constant name="PATH_site"/></strong> +</p> + +<div class="t3js-folderStructure-output"></div> + +<div class="t3js-folderStructure-errors" style="display:none"> + <hr/> + <h3>These files or folders have errors and may be fixed automatically:</h3> + <div class="t3js-folderStructure-errors-list"></div> + <button + class="btn btn-default t3js-folderStructure-errors-fix" + type="button" + > + Try to fix file and folder permissions + </button> +</div> + +<hr/> +<h3>Default File and Directory permissions</h3> +<f:render partial="Action/Common/StatusMessage" arguments="{message: folderStructureFilePermissionStatus}"/> +<f:render partial="Action/Common/StatusMessage" arguments="{message: folderStructureDirectoryPermissionStatus}"/> + +<div class="t3js-folderStructure-ok" style="display:none"> + <hr/> + <h3>These structures don't need to be fixed:</h3> + <div class="t3js-folderStructure-ok-list"></div> +</div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Environment/ImageProcessing.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Environment/ImageProcessing.html new file mode 100644 index 0000000000000000000000000000000000000000..67fff9d66cd3016cdb0e1c3b6a06d9db26951e97 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Environment/ImageProcessing.html @@ -0,0 +1,346 @@ +<p> + A set of various image manipulation testing main processing aspects. +</p> + +<div style="display:none;"> + <div id="t3js-imageProcessing-token">{imageProcessingToken}</div> + + <div style="display:none"> + <div class="t3js-imageProcessing-twinImage-template"> + <div class="t3-install-displaytwinimageimages t3js-imageProcessing-images" style="display:none;"> + <div class="row"> + <div class="col-xs-12 col-md-6"> + <h4>Reference</h4> + <div class="bg-transparent-emulation"> + <img class="reference" /> + </div> + </div> + <div class="col-xs-12 col-md-6"> + <h4>Your system</h4> + <div class="bg-transparent-emulation"> + <img class="result" /> + </div> + </div> + </div> + </div> + <div class="t3-install-displaytwinimagetextarea t3js-imageProcessing-command" style="display:none;"> + <pre><code class="language-bash t3js-imageProcessing-command-text"></code></pre> + </div> + </div> + </div> +</div> + +<button + class="btn btn-default t3js-imageProcessing-execute" + type="button" +> + Run image tests again +</button> +<hr> + + +<h3>True type font tests</h3> +<div class="t3js-message typo3-message alert alert-info" role="alert"> + <h4>FreeType2 hint</h4> + <p class="messageTest">If the two images below do not look the same, please check your FreeType 2 module.</p> +</div> +<div class="t3js-imageProcessing-twinContainer" data-test="trueType"></div> +<hr> + +<h3>Convert image formats to jpg</h3> +<p> + This verifies that your ImageMagick installation is able to read the default + formats <code>jpg</code>, <code>gif</code>, <code>png</code>, <code>tif</code>, <code>pdf</code> and + <code>ai</code>. + The tool <code>identify</code> is used to read the pixeldimensions of non-web formats and 'convert' is used to + read the image and convert it to <code>jpg</code>. +</p> +<div class="t3js-message typo3-message alert alert-info" role="alert"> + <h4>Dark images</h4> + <p class="messageText"> + In case the images appear remarkably darker than the reference images, + try to set [TYPO3_CONF_VARS][GFX][colorspace] = sRGB. + </p> +</div> +<h4>Read jpg</h4> +<div class="t3js-imageProcessing-twinContainer" data-test="readJpg"></div> +<h4>Read gif</h4> +<div class="t3js-imageProcessing-twinContainer" data-test="readGif"></div> +<h4>Read png</h4> +<div class="t3js-imageProcessing-twinContainer" data-test="readPng"></div> +<h4>Read tif</h4> +<div class="t3js-imageProcessing-twinContainer" data-test="readTif"></div> +<h4>Read pdf</h4> +<div class="t3js-imageProcessing-twinContainer" data-test="readPdf"></div> +<h4>Read ai</h4> +<div class="t3js-imageProcessing-twinContainer" data-test="readAi"></div> +<hr> + +<h3>Writing gif and png</h3> +<p> + This verifies that ImageMagick is able to write GIF and PNG files. + The GIF-file is attempted compressed with LZW by the + <code>\TYPO3\CMS\Core\Imaging\GraphicalFunctions::gifCompress()</code> function. +</p> +<h4>Write gif</h4> +<div class="t3js-imageProcessing-twinContainer" data-test="writeGif"></div> +<h4>Write png</h4> +<div class="t3js-imageProcessing-twinContainer" data-test="writePng"></div> +<hr> + +<h3>Scaling images</h3> +<p> + This shows how ImageMagick reacts when scaling transparent GIF and PNG files. +</p> +<h4>gif to gif</h4> +<div class="t3js-imageProcessing-twinContainer" data-test="gifToGif"></div> +<h4>png to png</h4> +<div class="t3js-imageProcessing-twinContainer" data-test="pngToPng"></div> +<h4>gif to jpg</h4> +<div class="t3js-imageProcessing-twinContainer" data-test="gifToJpg"></div> +<hr> + +<h3>Combining images</h3> +<p> + This verifies that the ImageMagick tools, <code>combine</code>, <code>composite</code>, are able to + combine two images through a grayscale mask. +</p> +<h4>Combine using a GIF mask with only black and white</h4> +<div class="t3js-imageProcessing-twinContainer" data-test="combineGifMask"></div> +<h4>Combine using a JPG mask with graylevels</h4> +<div class="t3js-imageProcessing-twinContainer" data-test="combineJpgMask"></div> +<hr> + +<h3>GDlib</h3> +<p> + This verifies that the GDLib installation works properly. +</p> +<h4>Create simple image</h4> +<div class="t3js-imageProcessing-twinContainer" data-test="gdlibSimple"></div> +<h4>Create image from file</h4> +<div class="t3js-imageProcessing-twinContainer" data-test="gdlibFromFile"></div> +<h4>Render text with TrueType font</h4> +<div class="t3js-imageProcessing-twinContainer" data-test="gdlibRenderText"></div> +<h4>Render text with TrueType font using 'niceText' option</h4> +<div class="t3js-message typo3-message alert alert-info" role="alert"> + <h4>Note on 'niceText'</h4> + <p class="messageText"> + 'niceText' is a concept that tries to improve the antialiasing of the rendered type by actually + rendering the textstring in double size on a black/white mask, downscaling the mask and masking + the text onto the image through this mask. This involves ImageMagick 'combine'/'composite' and 'convert'. + </p> +</div> +<div class="t3js-imageProcessing-twinContainer" data-test="gdlibNiceText"></div> +<h4>Render 'niceText' with a shadow under</h4> +<div class="t3js-message typo3-message alert alert-info" role="alert"> + <h4>Note on 'shadow'</h4> + <p class="messageText"> + This test makes sense only if the above test had a correct output. But if so, you may not see + a soft dropshadow from the third text string as you should. In that case you are most likely using + ImageMagick 5 and should set the flag TYPO3_CONF_VARS[GFX][processor_effects]. + </p> +</div> +<div class="t3js-imageProcessing-twinContainer" data-test="gdlibNiceTextShadow"></div> +<hr> + +<div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true"> + <div class="panel panel-default"> + <div class="panel-heading" role="tab" id="headingConfiguration"> + <h4 class="panel-title"> + <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseConfiguration" aria-expanded="true" aria-controls="collapseFive" class="collapsed"> + <span class="caret"></span> + Current configuration + </a> + </h4> + </div> + <div id="collapseConfiguration" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingConfiguration"> + <div class="panel-body"> + + <table class="table table-striped"> + <tr> + <td> + {imageConfiguration.processor} enabled: + </td> + <td> + {f:if(condition:imageConfiguration.processorEnabled, then:'Yes', else:'No')} + </td> + </tr> + <tr> + <td> + ImageMagick or GraphicsMagick: + </td> + <td> + {imageConfiguration.processor} + </td> + </tr> + <tr> + <td> + {imageConfiguration.processor} path: + </td> + <td> + {imageConfiguration.processorPath} + </td> + </tr> + <tr> + <td> + {imageConfiguration.processor} version: + </td> + <td> + {imageConfiguration.processorVersion} + </td> + </tr> + <tr> + <td> + {imageConfiguration.processor} effects enabled: + </td> + <td> + {imageConfiguration.processorEffects} <span>(Blurring/Sharpening with {imageConfiguration.processor})</span> + </td> + </tr> + <tr> + <td> + GDLib enabled: + </td> + <td> + {f:if(condition:imageConfiguration.gdlibEnabled, then:'Yes', else:'No')} + </td> + </tr> + <tr> + <td> + GDLib using PNG: + </td> + <td> + {imageConfiguration.gdlibPng} + </td> + </tr> + <tr> + <td> + Freetype DPI: + </td> + <td> + {imageConfiguration.freeTypeDpi} <span>(Should be 96 for Freetype 2)</span> + </td> + </tr> + <tr> + <td> + File Formats: + </td> + <td> + {imageConfiguration.fileFormats} + </td> + </tr> + </table> + </div> + </div> + </div> + + <div class="panel panel-default"> + <div class="panel-heading" role="tab" id="headingVerify"> + <h4 class="panel-title"> + <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseVerify" aria-expanded="true" aria-controls="collapseFive" class="collapsed"> + <span class="caret"></span> + Verify test results + </a> + </h4> + </div> + <div id="collapseVerify" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingVerify"> + <div class="panel-body"> + <h4>Verify test results</h4> + <p> + This page performs image processing and displays the result. It's a thorough check + that everything you've configured is working correctly. + </p> + <p> + It's quite simple to verify your installation; Just look down the page, the images + in pairs should look like each other. If some images are not alike, something is + wrong. You may also notice warnings and errors if this tool found signs of any problems. + </p> + <p> + The image to the left is the reference image (how it should be) and to the right + the image made by your server. + </p> + </div> + </div> + </div> + + <div class="panel panel-default"> + <div class="panel-heading" role="tab" id="headingAbout"> + <h4 class="panel-title"> + <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseAbout" aria-expanded="true" aria-controls="collapseFive" class="collapsed"> + <span class="caret"></span> + About image handling + </a> + </h4> + </div> + <div id="collapseAbout" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingAbout"> + <div class="panel-body"> + <p> + TYPO3 is known for its ability to process images on the server. + </p> + <p> + In the backend interface (TBE) thumbnails are automatically generated + as well as icons, menu items and pane tabs (by GDLib). + In the frontend all kinds of graphical elements are processed. Typically images are + scaled down to fit the pages (by ImageMagick) and menu items, graphical headers and + such are generated automatically (by GDLib + ImageMagick). In addition TYPO3 is able + to handle many file formats (thanks to ImageMagick), for example TIF, BMP, PCX, TGA, + AI and PDF in addition to the standard web formats; JPG, GIF, PNG. + </p> + <p> + In order to do this, TYPO3 uses two sets of tools: + </p> + <strong> + ImageMagick / GraphicsMagick: + </strong> + <p> + For conversion of non-web formats to webformats, combining images with alpha-masks, + performing image-effects like blurring and sharpening. + </p> + <p> + ImageMagick is a collection of external programs on the server called by the exec() + function in PHP. TYPO3 uses three of these, namely 'convert' (converting fileformats, + scaling, effects), 'combine'/'composite' (combining images with masks) and 'identify' + (returns image information). GraphicsMagick is an alternative to ImageMagick and can + be enabled by setting [GFX][processor] to 'GraphicsMagick'. This is recommended and enabled + by default. Because ImageMagick and Graphicsmagick are external programs, a requirement + must be met: The programs must be installed on the server and working. ImageMagick is + available for both Windows and Unix. The current version is 6+. ImageMagick homepage is + at <a href="http://www.imagemagick.org/">http://www.imagemagick.org/</a> + </p> + <strong> + GDLib: + </strong> + <p> + For drawing boxes and rendering text on images with truetype fonts. Also used for + icons, menuitems and generally the TypoScript GIFBUILDER object is based on GDlib, + but extensively utilizing ImageMagick to process intermediate results. + </p> + <p> + GDLib is accessed through internal functions in PHP, you'll need a version of PHP + with GDLib compiled in. Also in order to use TrueType fonts with GDLib you'll + need FreeType compiled in as well. + </p> + </div> + </div> + </div> + + <div class="panel panel-default"> + <div class="panel-heading" role="tab" id="headingTestImages"> + <h4 class="panel-title"> + <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseTestImages" aria-expanded="true" aria-controls="collapseFive" class="collapsed"> + <span class="caret"></span> + About test images + </a> + </h4> + </div> + <div id="collapseTestImages" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingTestImages"> + <div class="panel-body"> + <p> + Test-Image by Rotkaeppchen68 (in de.wikipedia) [<a href="http://www.gnu.org/copyleft/fdl.html">GFDL</a> or <a + href="http://creativecommons.org/licenses/by-sa/3.0/">CC-BY-SA-3.0</a>], <a + href="https://commons.wikimedia.org/wiki/File%3AFuBK-Testbild.png">via Wikimedia Commons</a> + </p> + </div> + </div> + </div> +</div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Environment/MailTest.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Environment/MailTest.html new file mode 100644 index 0000000000000000000000000000000000000000..b270ad39f936a9edb4a396c602b0d8e652ba268e --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Environment/MailTest.html @@ -0,0 +1,42 @@ +<p> + Check the basic mail functionality by entering your email address here and clicking the button. + You should then receive a test email from "{senderEmailAddress}". +</p> + +<p> + If no email is received, your setup might be broken. Check the following: +</p> +<ul> + <li> + If <code>$GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport']</code> is set to mail or sendmail, TYPO3 tries to use + PHPs internal mail() function. There might be no such program installed. + </li> + <li> + If <code>$GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport']</code> is set to smtp, check if the data given in + <code>$GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport_smtp_*']</code> is valid. Wrong data here results in faulty + requests to the mail server. You can find the resulting messages in the mail server log. + </li> +</ul> + +<div style="display:none"> + <div id="t3js-mailTest-token">{mailTestToken}</div> +</div> + +<div class="t3js-mailTest-output"></div> + +<form> + <div class="form-group"> + <label for="t3-install-checkmail">Email address:</label> + <input + id="t3-install-checkmail" + type="email" + class="t3-install-form-input-text form-control t3js-mailTest-email" + /> + </div> + <button + class="btn btn-default t3js-mailTest-send" + type="button" + > + Send test mail + </button> +</form> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Environment/PhpInfo.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Environment/PhpInfo.html new file mode 100644 index 0000000000000000000000000000000000000000..40081d35798da282116719f8a92ac6c2c544180d --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Environment/PhpInfo.html @@ -0,0 +1,3 @@ +<div class="table-responsive" id="phpinfo"> + <i:phpInfo /> +</div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/SystemInformation.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Environment/SystemInformation.html similarity index 70% rename from typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/SystemInformation.html rename to typo3/sysext/install/Resources/Private/Partials/Action/Tool/Environment/SystemInformation.html index 1743821974f2dea5ed83b989bd7eceb946851b86..3c39187b49e873c9fbdb92e816b01f92b050f005 100644 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/SystemInformation.html +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Environment/SystemInformation.html @@ -1,26 +1,26 @@ {namespace i=TYPO3\CMS\Install\ViewHelpers} - -<h3>Main system information</h3> <table class="table table-striped table-bordered"> <tr> <td>Operating system:</td> - <td><strong>{operatingSystem}</strong></td> + <td><strong>{systemInformationOperatingSystem}</strong></td> </tr> <tr> <td>PHP version:</td> - <td><strong><i:constant name="PHP_VERSION" /></strong></td> + <td><strong> + <i:constant name="PHP_VERSION"/> + </strong></td> </tr> <tr> <td>PHP CGI detected:</td> - <td><strong>{f:if(condition:cgiDetected, then:'Yes', else:'No')}</strong></td> + <td><strong>{f:if(condition:systemInformationCgiDetected, then:'Yes', else:'No')}</strong></td> </tr> - <f:if condition="{connections -> f:count()} > 1"> - <tr> - <td>Number of database connections:</td> - <td><strong>{connections -> f:count()}</strong></td> - </tr> - </f:if> - <f:for each="{connections}" as="connection"> + <f:if condition="{systemInformationDatabaseConnections -> f:count()} > 1"> + <tr> + <td>Number of database connections:</td> + <td><strong>{systemInformationDatabaseConnections -> f:count()}</strong></td> + </tr> + </f:if> + <f:for each="{systemInformationDatabaseConnections}" as="connection"> <tr> <td>Database connection <strong>'{connection.connectionName}'</strong></td> <td> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/ClearAllCache.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/ClearAllCache.html deleted file mode 100644 index 5203ec130e5d1b2f751458fd65ec31b1913ebc33..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/ClearAllCache.html +++ /dev/null @@ -1,30 +0,0 @@ -<h3>Clear all cache</h3> -<p> - This clear all cache function works in a similar manner as the cache clearing in the backend, but takes a - more straightforward approach and the according backend hooks are not executed. -</p> -<p> - This method can throw a fatal error if a broken extension is loaded. If you get a white page - or a PHP error message, check your system with the broken extension test below. -</p> -<p> - This clears the complete opcode caches of the active opcode cache systems, if the system supports reset. -</p> -<p>Available PHP opcode cache systems</p> -<ul> - <f:for each="{listOfOpcodeCaches}" as="opcodeCache" key="opcodeCacheName"> - <li>{opcodeCacheName} ({opcodeCache.version}) - - <f:if condition="{opcodeCache.canReset}"> - <f:then>reset is supported</f:then> - <f:else>reset is not supported</f:else> - </f:if> - </li> - </f:for> -</ul> - -<form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <div class="t3js-clearAllCache"> - <f:render partial="Action/Common/SubmitButton" arguments="{name:'clearAllCache', text:'Clear all caches including PHP opcode cache'}"/> - </div> -</form> \ No newline at end of file diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/CoreUpdateButton.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/CoreUpdateButton.html deleted file mode 100644 index 2ba4e286b58e2caa955dea705ee84741be4ab3f1..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/CoreUpdateButton.html +++ /dev/null @@ -1,44 +0,0 @@ -<h3>Core update</h3> - -<p> - The install tool can automatically update the TYPO3 CMS core to its latest - minor release if certain criteria are met. -</p> - -<div class="t3js-coreUpdate"> - <f:if condition="!{composerMode} && {enableCoreUpdate} && {isInstalledVersionAReleasedVersion} && {isSymLinkedCore}"> - <f:then> - <div id="buttonTemplate"> - <fieldset class="t3-install-form-submit"> - <button class="btn btn-default" type="submit" name="coreUpdateCheckForUpdate" data-action="checkForUpdate"> - Check for core updates - </button> - </fieldset> - </div> - </f:then> - <f:else> - <div class="typo3-message alert alert-notice"> - <div class="header-container"> - <div class="message-header"> - <strong>Disabled</strong> - </div> - </div> - <div class="message-body"> - This feature is disabled in this installation.<br /> - <f:if condition="{composerMode}"> - Composer Mode is active. Please update using composer commands. - </f:if> - <f:if condition="!{enableCoreUpdate}"> - The environment variable was set <code>TYPO3_DISABLE_CORE_UPDATER=1</code>. - </f:if> - <f:if condition="!{isInstalledVersionAReleasedVersion}"> - This system isn't a released TYPO3 version. - </f:if> - <f:if condition="!{isSymLinkedCore}"> - This action can only be used with a linked typo3_src. - </f:if> - </div> - </div> - </f:else> - </f:if> -</div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/CreateAdministrator.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/CreateAdministrator.html deleted file mode 100644 index ac8a549cd70882b22c4515c94e610e14645f2ff9..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/CreateAdministrator.html +++ /dev/null @@ -1,45 +0,0 @@ -<h3>Create backend administrator user</h3> -<p> - You should use this function only if there are no admin users in the database, for instance if this is a blank database. - After you've created the user, log in and add the rest of the user information, like email and real name. -</p> -<form method="post" class="form-horizontal"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <div class="form-group"> - <label for="t3-install-admin-username" class="col-sm-3 control-label">Username:</label> - <div class="col-sm-9"> - <input - id="t3-install-admin-username" - class="t3-install-form-input-text form-control" - type="text" - name="install[values][newUserUsername]" - autocomplete="off" - /> - </div> - </div> - <div class="form-group"> - <label for="t3-install-admin-password" class="col-sm-3 control-label">Password:</label> - <div class="col-sm-9"> - <input - id="t3-install-admin-password" - class="t3-install-form-input-text t3-install-form-password-strength form-control" - type="password" - name="install[values][newUserPassword]" - autocomplete="off" - /> - </div> - </div> - <div class="form-group"> - <label for="t3-install-admin-password-repeat" class="col-sm-3 control-label">Repeat password:</label> - <div class="col-sm-9"> - <input - id="t3-install-admin-password-repeat" - class="t3-install-form-input-text form-control" - type="password" - name="install[values][newUserPasswordCheck]" - autocomplete="off" - /> - </div> - </div> - <f:render partial="Action/Common/SubmitButton" arguments="{name:'createAdministrator', text:'Create administrator user'}"/> -</form> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/DatabaseAnalyzerButton.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/DatabaseAnalyzerButton.html deleted file mode 100644 index e281ed2a88f4ac98aebd6236178ce9bc72ffa1ce..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/DatabaseAnalyzerButton.html +++ /dev/null @@ -1,12 +0,0 @@ -<h3>Database analyzer</h3> - -<p> - The database analyzer compares the database table and field definitions of the - current database with the specifications from all loaded extensions' ext_tables.sql files. - Depending on the specification, the analyzer can update, delete, and change tables - and fields. -</p> -<form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <f:render partial="Action/Common/SubmitButton" arguments="{name:'databaseAnalyzerAnalyze', text:'Compare current database with specification'}"/> -</form> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/DatabaseAnalyzerData.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/DatabaseAnalyzerData.html deleted file mode 100644 index 09fb493bde2fa3abfc34c598d0d64d1938382ae1..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/DatabaseAnalyzerData.html +++ /dev/null @@ -1,87 +0,0 @@ -<h3>Database analyzer</h3> - -<form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <input type="hidden" name="install[set][databaseAnalyzerAnalyze]" /> - - <f:if condition="{databaseAnalyzerSuggestion.addTable}"> - <f:render - partial="Action/Tool/ImportantActions/DatabaseAnalyzerSuggestion" - arguments="{ - key: 'addTable', - label: 'Add tables', - data: '{databaseAnalyzerSuggestion.addTable}', - enabled: 1 - }" - /> - </f:if> - - <f:if condition="{databaseAnalyzerSuggestion.addField}"> - <f:render - partial="Action/Tool/ImportantActions/DatabaseAnalyzerSuggestion" - arguments="{ - key: 'addField', - label: 'Add fields to tables', - data: '{databaseAnalyzerSuggestion.addField}', - enabled: 1 - }" - /> - </f:if> - - <f:if condition="{databaseAnalyzerSuggestion.change}"> - <f:render - partial="Action/Tool/ImportantActions/DatabaseAnalyzerSuggestion" - arguments="{ - key: 'change', - label: 'Change fields', - data: '{databaseAnalyzerSuggestion.change}' - }" - /> - </f:if> - - <f:if condition="{databaseAnalyzerSuggestion.renameTableToUnused}"> - <f:render - partial="Action/Tool/ImportantActions/DatabaseAnalyzerSuggestion" - arguments="{ - key: 'renameTableToUnused', - label: 'Remove tables (rename with prefix)', - data: '{databaseAnalyzerSuggestion.renameTableToUnused}' - }" - /> - </f:if> - - <f:if condition="{databaseAnalyzerSuggestion.renameTableFieldToUnused}"> - <f:render - partial="Action/Tool/ImportantActions/DatabaseAnalyzerSuggestion" - arguments="{ - key: 'renameTableFieldToUnused', - label: 'Remove unused fields (rename with prefix)', - data: '{databaseAnalyzerSuggestion.renameTableFieldToUnused}' - }" - /> - </f:if> - - <f:if condition="{databaseAnalyzerSuggestion.deleteField}"> - <f:render - partial="Action/Tool/ImportantActions/DatabaseAnalyzerSuggestion" - arguments="{ - key: 'deleteField', - label: 'Drop fields (really!)', - data: '{databaseAnalyzerSuggestion.deleteField}' - }" - /> - </f:if> - - <f:if condition="{databaseAnalyzerSuggestion.deleteTable}"> - <f:render - partial="Action/Tool/ImportantActions/DatabaseAnalyzerSuggestion" - arguments="{ - key: 'deleteTable', - label: 'Drop tables (really!)', - data: '{databaseAnalyzerSuggestion.deleteTable}' - }" - /> - </f:if> - - <f:render partial="Action/Common/SubmitButton" arguments="{name:'databaseAnalyzerExecute', text:'Execute'}"/> -</form> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/DatabaseAnalyzerSuggestion.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/DatabaseAnalyzerSuggestion.html deleted file mode 100644 index 51cdb5eca220d5a18df0f0124e13d14778db835c..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/DatabaseAnalyzerSuggestion.html +++ /dev/null @@ -1,36 +0,0 @@ -<fieldset> - <legend>{label}</legend> - <ol class="list-unstyled"> - <li class="t3-install-form-label-after"> - <input - type="checkbox" - class="checkall" - id="t3-install-{key}-checkbox" - {f:if(condition:'{enabled} == 1', then:' checked="checked"')} - /> - <label for="t3-install-{key}-checkbox">select/deselect all</label> - </li> - <f:for each="{data}" as="field"> - <li class="t3-install-form-label-after"> - <input - type="checkbox" - id="t3-install-db-{field.hash}" - name="install[values][{field.hash}]" - value="1" - {f:if(condition:'{enabled} == 1', then:' checked="checked"')} - /> - <label for="t3-install-db-{field.hash}"> - {field.statement} - <f:if condition="{field.current}"> - <br /> - Current value: {field.current} - </f:if> - <f:if condition="{field.count}"> - <br /> - {field.count} - </f:if> - </label> - </li> - </f:for> - </ol> -</fieldset> \ No newline at end of file diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/DumpAutoload.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/DumpAutoload.html deleted file mode 100644 index c715afb4d3be0df5d19fa9a61190b63d60954252..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/DumpAutoload.html +++ /dev/null @@ -1,11 +0,0 @@ -<h3>Dump Autoload Information</h3> -<p> - This (re-)dumps autoload information for all active third party extensions. -</p> - -<form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <div class="t3js-dumpAutoload"> - <f:render partial="Action/Common/SubmitButton" arguments="{name:'dumpAutoload', text:'Create autoload information for extensions'}"/> - </div> -</form> \ No newline at end of file diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/ExtensionCompatibilityTester.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/ExtensionCompatibilityTester.html deleted file mode 100644 index 7594cdc8c08c943dd5ef7346f3ffe412498cf2fc..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/ExtensionCompatibilityTester.html +++ /dev/null @@ -1,14 +0,0 @@ -<h3>Check for broken extensions</h3> -<p> - Checks whether the local extensions' ext_tables and ext_localconf files can be included without errors, - meaning they can be loaded without breaking the system. -</p> -<form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <div class="t3js-checkExtensions" data-protocolurl="{extensionCompatibilityTesterProtocolFile}" data-errorprotocolurl="{extensionCompatibilityTesterErrorProtocolFile}"> - <f:for each="{extensionCompatibilityTesterMessages}" as="statusMessage"> - <f:render partial="Action/Common/StatusMessage" arguments="{message: statusMessage}" /> - </f:for> - <f:render partial="Action/Common/SubmitButton" arguments="{name:'checkExtensions', text:'Check extensions'}"/> - </div> -</form> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/NewInstallToolPassword.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/NewInstallToolPassword.html deleted file mode 100644 index 282e1f8fe00724e70678e5d31094511f71b0f8d3..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/NewInstallToolPassword.html +++ /dev/null @@ -1,29 +0,0 @@ -<h3>Change install tool password</h3> -<form method="post" class="form-horizontal"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <div class="form-group"> - <label for="t3-install-password" class="col-sm-3 control-label">Enter new password:</label> - <div class="col-sm-9"> - <input - id="t3-install-password" - class="t3-install-form-input-text t3-install-form-password-strength form-control" - type="password" - name="install[values][newInstallToolPassword]" - autocomplete="off" - /> - </div> - </div> - <div class="form-group"> - <label for="t3-install-password-repeat" class="col-sm-3 control-label">Repeat password:</label> - <div class="col-sm-9"> - <input - id="t3-install-password-repeat" - class="t3-install-form-input-text form-control" - type="password" - name="install[values][newInstallToolPasswordCheck]" - autocomplete="off" - /> - </div> - </div> - <f:render partial="Action/Common/SubmitButton" arguments="{name:'changeInstallToolPassword', text:'Set new password'}"/> -</form> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/TcaExtTablesCheck.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/TcaExtTablesCheck.html deleted file mode 100644 index bffbccd934447a0fabc95254f9225338a37475c7..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/TcaExtTablesCheck.html +++ /dev/null @@ -1,10 +0,0 @@ -<h3>TCA in ext_tables.php check</h3> -<p> - Check if an extension changes $GLOBALS['TCA'] in ext_tables.php. -</p> -<form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <div class="t3js-tcaExtTablesCheck"> - <f:render partial="Action/Common/SubmitButton" arguments="{name:'tceExtTablesCheck', text:'Check loaded extensions'}"/> - </div> -</form> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/TcaMigrationsCheck.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/TcaMigrationsCheck.html deleted file mode 100644 index e3ecaac16a3aae8d65e36a405bee6de99bb1e53e..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/TcaMigrationsCheck.html +++ /dev/null @@ -1,10 +0,0 @@ -<h3>TCA Migrations</h3> -<p> - Checks whether the current TCA needs migrations and displays applied migrations. -</p> -<form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <div class="t3js-tcaMigrationsCheck"> - <f:render partial="Action/Common/SubmitButton" arguments="{name:'tcaMigrationsCheck', text:'Check TCA Migrations'}"/> - </div> -</form> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Maintenance/ClearAllCache.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Maintenance/ClearAllCache.html new file mode 100644 index 0000000000000000000000000000000000000000..cb6eabbf3aa01ea9d2e5df08b8c5c3ecab4dff64 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Maintenance/ClearAllCache.html @@ -0,0 +1,26 @@ +<p> + Similar to the clear cache function found in TYPO3’s backend. + This utility directly clears all system caches including opcode cache. +</p> +<p> + A fatal error will be thrown if a broken extension is detected. + If this occurs, use the extension tester utility. +</p> + +<ul> + <f:for each="{clearAllCacheOpcodeCaches}" as="opcodeCache" key="opcodeCacheName"> + <li>{opcodeCacheName} ({opcodeCache.version}) - + <f:if condition="{opcodeCache.canReset}"> + <f:then>reset is supported</f:then> + <f:else>reset is not supported</f:else> + </f:if> + </li> + </f:for> +</ul> +<div class="t3js-clearAllCache-output"></div> +<button + class="btn btn-default t3js-clearAllCache-clear" + type="button" +> + Clear all caches including PHP opcode cache +</button> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Maintenance/ClearTables.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Maintenance/ClearTables.html new file mode 100644 index 0000000000000000000000000000000000000000..6db6faf56a3eb19114fc27524b229faa740f0e11 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Maintenance/ClearTables.html @@ -0,0 +1,33 @@ +<p> + Some database tables in TYPO3 CMS hold semi-temporary data that is not deleted when clicking "Clear All Cache" in + the backend. + Those can be cleared here, + effectively removing all rows from it. This can be useful in rare cases. +</p> +<p> + Use with care! Clearing tables here can have a negative impact on your site functionality. + You could log out all users, delete all their basket data, and lose logging information! +</p> +<hr> + +<div style="display:none;"> + <div id="t3js-clearTable-token">{clearTableToken}</div> +</div> + +<div class="form-group"> + <f:for each="{clearTableStats}" as="clearTableStatistic" iteration="iterator"> + <div class="t3js-clearTable-container t3js-clearTable-container-{clearTableStatistic.name}"> + <p>{clearTableStatistic.description}</p> + <div class="t3js-clearTable-output"></div> + <button + class="btn btn-default t3js-clearTable-clear" data-table="{clearTableStatistic.name}" + type="button" + > + Delete {clearTableStatistic.rowCount} rows from "{clearTableStatistic.name}" table + </button> + <f:if condition="!{iterator.isLast}"> + <hr> + </f:if> + </div> + </f:for> +</div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Maintenance/ClearTypo3tempFiles.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Maintenance/ClearTypo3tempFiles.html new file mode 100644 index 0000000000000000000000000000000000000000..e1c0d18d3916bf9f5b967f1f0d2a235f093a4536 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Maintenance/ClearTypo3tempFiles.html @@ -0,0 +1,33 @@ + <h4>About</h4> + <p> + TYPO3 stores processed files and cached images in a dedicated directory. + This directory is likely to grow quickly. + </p> + <p> + With this action you can delete the files in this folder. Afterwards, you + should also clear the cache database tables. + </p> + <p> + The File Abstraction Layer additionally stores a database record for every file + it needs to process. (e.g. image thumbnails). In case you modified some graphics + settings (All Configuration [GFX]) and you need all processed files to get regenerated, + you can use this tool to remove the "_processed_" ones. + </p> + + +<div id="t3js-clearTypo3temp-delete-token" style="display:none;">{clearTypo3tempFilesToken}</div> + +<f:for each="{clearTypo3tempFilesStats}" as="folderStats" iteration="iterator"> + <div class="t3js-clearTypo3temp-container t3js-clearTypo3temp-container-{folderStats.directory}"> + <div class="t3js-clearTypo3temp-output"></div> + <button + class="btn btn-default t3js-clearTypo3temp-delete" data-folder="{folderStats.directory}" + type="button" + > + Delete {folderStats.numberOfFiles} in typo3temp/assets/{folderStats.directory} + </button> + <f:if condition="!{iterator.isLast}"> + <hr /> + </f:if> + </div> +</f:for> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Maintenance/CreateAdmin.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Maintenance/CreateAdmin.html new file mode 100644 index 0000000000000000000000000000000000000000..0d385f5716c50f9eec66638bfa802b6d91fecafa --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Maintenance/CreateAdmin.html @@ -0,0 +1,55 @@ +<p> + You should use this function only if there are no admin users in the database, for instance if this is a blank database. + After you've created the user, log in and add the rest of the user information, like email and real name. +</p> + +<div style="display:none;"> + <div id="t3js-createAdmin-token">{createAdminToken}</div> +</div> + + + +<div class="form-horizontal"> + <div class="form-group"> + <label for="t3-install-admin-username" class="col-sm-3 control-label">Username:</label> + <div class="col-sm-9"> + <input + id="t3-install-admin-username" + class="t3-install-form-input-text t3js-createAdmin-user form-control" + type="text" + autocomplete="off" + /> + </div> + </div> + <div class="form-group"> + <label for="t3-install-admin-password" class="col-sm-3 control-label">Password:</label> + <div class="col-sm-9"> + <input + id="t3-install-admin-password" + class="t3-install-form-input-text t3-install-form-password-strength t3js-createAdmin-password form-control" + type="password" + autocomplete="off" + /> + </div> + </div> + <div class="form-group"> + <label for="t3-install-admin-password-repeat" class="col-sm-3 control-label">Repeat password:</label> + <div class="col-sm-9"> + <input + id="t3-install-admin-password-repeat" + class="t3-install-form-input-text t3js-createAdmin-password-check form-control" + type="password" + autocomplete="off" + /> + </div> + </div> +</div> + +<div class="t3js-createAdmin-output"></div> + +<button + class="btn btn-default t3js-createAdmin-create" + type="button" +> + Create administrator user +</button> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Maintenance/DatabaseAnalyzer.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Maintenance/DatabaseAnalyzer.html new file mode 100644 index 0000000000000000000000000000000000000000..afe987b4a4a4de53323c624dfab6c894c16c17ab --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Maintenance/DatabaseAnalyzer.html @@ -0,0 +1,57 @@ +<p> + Compares the database table and field definitions of the current database with the specifications from all loaded extensions' ext_tables.sql files. + Depending on the specification, the analyzer can update, delete, and change tables and fields. +</p> + +<div style="display:none;"> + <div id="t3js-databaseAnalyzer-execute-token">{databaseAnalyzerExecuteToken}</div> + <div class="t3js-databaseAnalyzer-suggestion-block"> + <fieldset> + <h4 class="t3js-databaseAnalyzer-suggestion-block-legend"></h4> + <ol class="list-unstyled"> + <li class="t3-install-form-label-after"> + <input + type="checkbox" + class="t3js-databaseAnalyzer-suggestion-block-checkbox" + /> + <label class="t3js-databaseAnalyzer-suggestion-block-label">select/deselect all</label> + </li> + <div class="t3js-databaseAnalyzer-suggestion-block-line"></div> + </ol> + </fieldset> + </div> + <div class="t3js-databaseAnalyzer-suggestion-line"> + <li class="t3-install-form-label-after"> + <input + type="checkbox" + class="t3js-databaseAnalyzer-suggestion-line-checkbox" + value="1" + /> + <label class="t3js-databaseAnalyzer-suggestion-line-label"> + <span class="t3js-databaseAnalyzer-suggestion-line-statement"></span> + <span class="t3js-databaseAnalyzer-suggestion-line-current" style="display:none;"> + <br/> + Current value: <span class="t3js-databaseAnalyzer-suggestion-line-current-value"></span> + </span> + <span class="t3js-databaseAnalyzer-suggestion-line-count" style="display:none;"> + <br/> + Rows in table: <span class="t3js-databaseAnalyzer-suggestion-line-count-value"></span> + </span> + </label> + </li> + </div> +</div> +<div class="t3js-databaseAnalyzer-output"></div> +<button + class="btn btn-default t3js-databaseAnalyzer-analyze" + type="button" +> + Run database compare again +</button> +<button + class="btn btn-default t3js-databaseAnalyzer-execute" + type="button" + style="display:none;" +> + Apply selected changes +</button> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Maintenance/DumpAutoload.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Maintenance/DumpAutoload.html new file mode 100644 index 0000000000000000000000000000000000000000..af9e4f631f893c3b9deb063ae71538ebfaf52e35 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Maintenance/DumpAutoload.html @@ -0,0 +1,10 @@ +<p> + This (re-)dumps autoload information for all active third party extensions. +</p> +<div class="t3js-dumpAutoload-output"></div> +<button + class="btn btn-default t3js-dumpAutoload-dump" + type="button" +> + Create autoload information for extensions +</button> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/LastError.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Maintenance/LastError.html similarity index 100% rename from typo3/sysext/install/Resources/Private/Partials/Action/Tool/ImportantActions/LastError.html rename to typo3/sysext/install/Resources/Private/Partials/Action/Tool/Maintenance/LastError.html diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Maintenance/ResetBackendUserUc.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Maintenance/ResetBackendUserUc.html new file mode 100644 index 0000000000000000000000000000000000000000..25a112a261cbcbbd9ad13eff1ba0b8f47df26e56 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Maintenance/ResetBackendUserUc.html @@ -0,0 +1,15 @@ +<p> + Clears user preferences of all backend users from be_users table. + The field 'uc' will be set to an empty string. +</p> +<p> + This may come in handy in rare cases where that configuration may be corrupt. + Clearing this will clear all user settings from the 'Setup' module. +</p> +<div class="t3js-resetBackendUserUc-output"></div> +<button + class="btn btn-default t3js-resetBackendUserUc-reset" + type="button" +> + Reset backend user preferences +</button> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/ChangeInstallToolPassword.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/ChangeInstallToolPassword.html new file mode 100644 index 0000000000000000000000000000000000000000..21a779d0d3afcd21c937c9514a0e9a026b4e0730 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/ChangeInstallToolPassword.html @@ -0,0 +1,40 @@ +<p> + Allows you to set a new install tool password. + The hash of this password will be written into LocalConfiguration.php and overwrite the old password. +</p> + +<div style="display:none;"> + <div id="t3js-changeInstallToolPassword-token">{changeInstallToolPasswordToken}</div> +</div> + +<div class="form-horizontal"> + <div class="form-group"> + <label for="t3-install-tool-password" class="col-sm-3 control-label">Enter new password:</label> + <div class="col-sm-9"> + <input + id="t3-install-tool-password" + class="t3-install-form-input-text t3-install-form-password-strength t3js-changeInstallToolPassword-password form-control" + type="password" + autocomplete="off" + /> + </div> + </div> + <div class="form-group"> + <label for="t3-install-tool-password-repeat" class="col-sm-3 control-label">Repeat password:</label> + <div class="col-sm-9"> + <input + id="t3-install-tool-password-repeat" + class="t3-install-form-input-text t3js-changeInstallToolPassword-password-check form-control" + type="password" + autocomplete="off" + /> + </div> + </div> +</div> +<div class="t3js-changeInstallToolPassword-output"></div> +<button + class="btn btn-default t3js-changeInstallToolPassword-change" + type="button" +> + Set new password +</button> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/LocalConfiguration.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/LocalConfiguration.html new file mode 100644 index 0000000000000000000000000000000000000000..d276f65c162b57deabb63c14f6600ab6a415fa89 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/LocalConfiguration.html @@ -0,0 +1,34 @@ +<p> + Changed values are written to LocalConfiguration.php. The optional file AdditionalConfiguration.php + is not controlled by the TYPO3 CMS core and may override single settings again. Administrators + must maintain AdditionalConfiguration.php on their own and should use it with care. +</p> + +<div style="display:none;"> + <div id="t3js-localConfiguration-write-token">{localConfigurationWriteToken}</div> +</div> + +<div class="form-group"> + <div class="input-group"> + <span class="input-group-addon">Filter by:</span> + <input type="text" class="form-control t3js-localConfiguration-search" placeholder="search setting"> + </div> +</div> + +<div class="panel-group" role="tablist" aria-multiselectable="true"> + <f:for each="{localConfigurationData}" as="sectionData" key="sectionName"> + <f:if condition="{sectionData}"> + <f:render partial="Action/Tool/Settings/LocalConfiguration/SubSection" arguments="{_all}"/> + </f:if> + </f:for> +</div> + +<div id="fixed-footer-handler"> + <div id="fixed-footer"> + <div class="t3js-localConfiguration-output"></div> + <div class="footer-innerWrap"> + <span class="btn btn-default t3js-localConfiguration-write">Write configuration</span> + <span class="btn btn-default t3js-localConfiguration-toggleAll">Toggle All</span> + </div> + </div> +</div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/AllConfiguration/SubSection.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/LocalConfiguration/SubSection.html similarity index 55% rename from typo3/sysext/install/Resources/Private/Partials/Action/Tool/AllConfiguration/SubSection.html rename to typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/LocalConfiguration/SubSection.html index 6b02cb7ea85e69c30dcad544a298911f94e4d93b..605a5e82da80dcf419b9c56ef1734732593b63c7 100644 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/AllConfiguration/SubSection.html +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/LocalConfiguration/SubSection.html @@ -1,11 +1,14 @@ {namespace i=TYPO3\CMS\Install\ViewHelpers} - -<div class="panel panel-default"> +<div class="panel panel-default panel-flat"> <div class="panel-heading" role="tab" id="heading{sectionName}"> <h3 class="panel-title"> - <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapse{sectionName}" aria-expanded="true" aria-controls="collapse{sectionName}" class="collapsed"> + <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapse{sectionName}" + aria-expanded="true" aria-controls="collapse{sectionName}" class="collapsed" + > <span class="caret"></span> - <strong><i:object.arrayValueByKey array="{sectionNames}" key="{sectionName}" /></strong> [{sectionName}] + <strong> + <i:object.arrayValueByKey array="{localConfigurationSectionNames}" key="{sectionName}"/> + </strong> [{sectionName}] </a> </h3> </div> @@ -17,7 +20,11 @@ <strong>[{sectionName}][{item.key}] </strong> <f:if condition="{item.type} == 'checkbox'"> <f:then> - = <f:if condition="{item.value}"><f:then>true</f:then><f:else>false</f:else></f:if> + = + <f:if condition="{item.value}"> + <f:then>true</f:then> + <f:else>false</f:else> + </f:if> </f:then> <f:else> <f:if condition="{item.value}"> @@ -28,32 +35,28 @@ </div> <div class="item-body"> <f:if condition="{item.type} == 'checkbox'"> - <div class="checkbox"> - <label> - <input - type="hidden" - value="0" - name="install[values][{sectionName}][{item.key}]" - /> - <input - type="checkbox" - value="1" - name="install[values][{sectionName}][{item.key}]" - {f:if(condition: item.checked, then:'checked="checked"')} - /> - {item.description -> f:format.raw()} - </label> - </div> - </f:if> + <div class="checkbox"> + <label> + <input + type="checkbox" + value="1" + class="t3js-localConfiguration-pathValue" + data-path="{sectionName}/{item.key}" + {f:if(condition: item.checked, then:'checked="checked"')} + /> + {item.description -> f:format.raw()} + </label> + </div> + </f:if> <f:if condition="{item.type} == 'input'"> <div class="form-group"> - <span class="help-block">{item.description -> f:format.raw()}</span> + <span class="help-block">{item.description -> f:format.raw()}</span> <input - type="text" - value="{item.value}" - name="install[values][{sectionName}][{item.key}]" - class="t3-install-form-input-text form-control" + type="text" + value="{item.value}" + data-path="{sectionName}/{item.key}" + class="t3-install-form-input-text form-control t3js-localConfiguration-pathValue" /> </div> </f:if> @@ -64,8 +67,8 @@ <input type="number" value="{item.value}" - name="install[values][{sectionName}][{item.key}]" - class="t3-install-form-input-text form-control" + data-path="{sectionName}/{item.key}" + class="t3-install-form-input-text form-control t3js-localConfiguration-pathValue" /> </div> </f:if> @@ -74,10 +77,10 @@ <span class="help-block">{item.description -> f:format.raw()}</span> <div class="form-group"> <textarea - rows="5" - cols="60" - name="install[values][{sectionName}][{item.key}]" - class="form-control" + rows="5" + cols="60" + data-path="{sectionName}/{item.key}" + class="form-control t3js-localConfiguration-pathValue" >{item.value}</textarea> </div> </f:if> @@ -85,7 +88,9 @@ <f:if condition="{item.phpErrorCode}"> <div class="fieldNote"> Current PHP error code <strong>{item.value}</strong> represents:<br/> - <code><i:format.phpErrorCode phpErrorCode="{item.value}" /></code> + <code> + <i:format.phpErrorCode phpErrorCode="{item.value}"/> + </code> </div> </f:if> </div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets.html new file mode 100644 index 0000000000000000000000000000000000000000..47f5781fcda21c68330c77e3faaff0291639cfef --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets.html @@ -0,0 +1,37 @@ +<p> + The configuration module suggests best matching configuration settings + based on your system setup. +</p> +<p> + Alternatively TYPO3 can be run in a specific <a + href="https://docs.typo3.org/typo3cms/CoreApiReference/ApiOverview/Bootstrapping/Index.html#bootstrapping-context" + target="_blank">application context</a>, + by setting an environment variable in the web server configuration. + The application context can then be accessed e.g. in the AdditionalConfiguration.php file or + TypoScript configuration to customize settings accordingly. +</p> +<p> + Changed values are written to LocalConfiguration.php. The optional file AdditionalConfiguration.php + is not controlled by the TYPO3 CMS core and may override single settings again. Administrators + must maintain AdditionalConfiguration.php on their own and should use it with care. +</p> + +<div style="display:none;"> + <div id="t3js-presets-activate-token">{presetActivateToken}</div> +</div> + +<div class="form-horizontal"> + <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true"> + <f:for each="{presetFeatures}" as="feature"> + <f:render partial="Action/Tool/Settings/Presets/{feature.name}" arguments="{_all}"/> + </f:for> + </div> +</div> +<div class="t3js-presets-output"></div> + +<button + class="btn btn-default t3js-presets-activate" + type="button" +> + Activate +</button> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Context.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Context.html similarity index 91% rename from typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Context.html rename to typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Context.html index aa0d9a5455f51179ab5b2bd4be0ae333d1d7efce..0927df693f2767175c4ed844ecd69335704a2fd5 100644 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Context.html +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Context.html @@ -18,7 +18,7 @@ As a third option it is possible to manually customize each setting for specific needs. </p> <f:for each="{feature.presetsOrderedByPriority}" as="preset"> - <f:render partial="Action/Tool/Configuration/{feature.name}/{preset.name}" arguments="{_all}" /> + <f:render partial="Action/Tool/Settings/Presets/{feature.name}/{preset.name}" arguments="{_all}" /> </f:for> </div> </div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Context/Custom.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Context/Custom.html similarity index 90% rename from typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Context/Custom.html rename to typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Context/Custom.html index 864d266063ff93e23f4f5b2fa5b9a3eeb3aef79e..479e63b7f5e8100011e9b28e4e882d4c3f3cb8b9 100644 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Context/Custom.html +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Context/Custom.html @@ -3,7 +3,7 @@ <div class="message-header"> <input type="radio" - class="t3-install-tool-configuration-radio" + class="t3-install-tool-configuration-radio t3js-presets-formField" id="t3-install-tool-configuration-context-custom" name="install[values][{feature.name}][enable]" value="{preset.name}" @@ -34,7 +34,7 @@ type="text" name="install[values][{feature.name}][{preset.name}][{configurationKey}]" value="{configurationValue}" - class="form-control t3js-custom-preset" + class="form-control t3js-custom-preset t3js-presets-formField" data-radio="t3-install-tool-configuration-context-custom" /> </div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Context/Debug.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Context/Debug.html similarity index 90% rename from typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Context/Debug.html rename to typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Context/Debug.html index 596fb9eff0a7ba5fd93679b8f43809f11391a282..8bd6053e76a5cf5d9b5710b72c5d7f4561c73b11 100644 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Context/Debug.html +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Context/Debug.html @@ -3,7 +3,7 @@ <div class="message-header"> <input type="radio" - class="t3-install-tool-configuration-radio" + class="t3-install-tool-configuration-radio t3js-presets-formField" id="t3-install-tool-configuration-context-debug" name="install[values][{feature.name}][enable]" value="{preset.name}" diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Context/Live.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Context/Live.html similarity index 90% rename from typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Context/Live.html rename to typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Context/Live.html index 53a0e046e9b5241728ce58d3c737891e80fb943b..34e6b4909d562c0eb9c3b6d41299861c6ea62281 100644 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Context/Live.html +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Context/Live.html @@ -3,7 +3,7 @@ <div class="message-header"> <input type="radio" - class="t3-install-tool-configuration-radio" + class="t3-install-tool-configuration-radio t3js-presets-formField" id="t3-install-tool-configuration-context-live" name="install[values][{feature.name}][enable]" value="{preset.name}" diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/ExtbaseObjectCache.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/ExtbaseObjectCache.html similarity index 90% rename from typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/ExtbaseObjectCache.html rename to typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/ExtbaseObjectCache.html index 23154c2b97547af9ddb0c6271a2ea9ea214b58f6..65a0a136dc61677ef9d5a611db7d5fa99ef4c863 100644 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/ExtbaseObjectCache.html +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/ExtbaseObjectCache.html @@ -20,7 +20,7 @@ combination with a APC cache backend. </p> <f:for each="{feature.presetsOrderedByPriority}" as="preset"> - <f:render partial="Action/Tool/Configuration/{feature.name}/{preset.name}" arguments="{_all}" /> + <f:render partial="Action/Tool/Settings/Presets/{feature.name}/{preset.name}" arguments="{_all}" /> </f:for> </div> </div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/ExtbaseObjectCache/Apc.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/ExtbaseObjectCache/Apc.html similarity index 94% rename from typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/ExtbaseObjectCache/Apc.html rename to typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/ExtbaseObjectCache/Apc.html index c2ce156928807b4149e00c8614ad8d3646b0d9f6..733435f69aa3071251e1b5c65b01a97f0f545e26 100644 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/ExtbaseObjectCache/Apc.html +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/ExtbaseObjectCache/Apc.html @@ -3,7 +3,7 @@ <div class="message-header"> <input type="radio" - class="t3-install-tool-configuration-radio" + class="t3-install-tool-configuration-radio t3js-presets-formField" id="t3-install-tool-configuration-extbaseobjectcache-apc" name="install[values][{feature.name}][enable]" value="{preset.name}" diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/ExtbaseObjectCache/Apcu.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/ExtbaseObjectCache/Apcu.html similarity index 94% rename from typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/ExtbaseObjectCache/Apcu.html rename to typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/ExtbaseObjectCache/Apcu.html index c59e654a4a98f7200cdb474fcf274e2631ffa37d..3aff2a4dcca13e0e7c67fbcbbd31851d5f98dbeb 100644 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/ExtbaseObjectCache/Apcu.html +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/ExtbaseObjectCache/Apcu.html @@ -3,7 +3,7 @@ <div class="message-header"> <input type="radio" - class="t3-install-tool-configuration-radio" + class="t3-install-tool-configuration-radio t3js-presets-formField" id="t3-install-tool-configuration-extbaseobjectcache-apc" name="install[values][{feature.name}][enable]" value="{preset.name}" diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/ExtbaseObjectCache/Database.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/ExtbaseObjectCache/Database.html similarity index 91% rename from typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/ExtbaseObjectCache/Database.html rename to typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/ExtbaseObjectCache/Database.html index ed764522ee2313dff87c8ea519fceb9435b6f3d1..dc3b7a846f55acd561cb264e97041f7241dfd3d0 100644 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/ExtbaseObjectCache/Database.html +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/ExtbaseObjectCache/Database.html @@ -3,7 +3,7 @@ <div class="message-header"> <input type="radio" - class="t3-install-tool-configuration-radio" + class="t3-install-tool-configuration-radio t3js-presets-formField" id="t3-install-tool-configuration-extbaseobjectcache-database" name="install[values][{feature.name}][enable]" value="{preset.name}" diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Image.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Image.html similarity index 94% rename from typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Image.html rename to typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Image.html index 8e40e0e5aa7150a0c4ad898e84106447f949d4c3..f2541179511aca3234b40a067526ccd599e39424 100644 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Image.html +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Image.html @@ -39,7 +39,7 @@ </div> <f:for each="{feature.presetsOrderedByPriority}" as="preset"> - <f:render partial="Action/Tool/Configuration/{feature.name}/{preset.name}" arguments="{_all}" /> + <f:render partial="Action/Tool/Settings/Presets/{feature.name}/{preset.name}" arguments="{_all}" /> </f:for> </div> </div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Image/Custom.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Image/Custom.html similarity index 90% rename from typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Image/Custom.html rename to typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Image/Custom.html index 0568b0357055df56c92fc52ceea57d0b519458ec..0587d1c8b1d393518ba1eb12cc6c3e5b1b0a0f6c 100644 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Image/Custom.html +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Image/Custom.html @@ -3,7 +3,7 @@ <div class="message-header"> <input type="radio" - class="t3-install-tool-configuration-radio" + class="t3-install-tool-configuration-radio t3js-presets-formField" id="t3-install-tool-configuration-image-custom" name="install[values][{feature.name}][enable]" value="{preset.name}" @@ -34,7 +34,7 @@ type="text" name="install[values][{feature.name}][{preset.name}][{configurationKey}]" value="{configurationValue}" - class="form-control t3js-custom-preset" + class="form-control t3js-custom-preset t3js-presets-formField" data-radio="t3-install-tool-configuration-image-custom" /> </div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Image/GraphicsMagick.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Image/GraphicsMagick.html similarity index 94% rename from typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Image/GraphicsMagick.html rename to typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Image/GraphicsMagick.html index 243f0e9519055200fea1a06679bdef850fe41a7d..4413cc274922a9d7bfb089ebef621daf93a4d25a 100644 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Image/GraphicsMagick.html +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Image/GraphicsMagick.html @@ -3,7 +3,7 @@ <div class="message-header"> <input type="radio" - class="t3-install-tool-configuration-radio" + class="t3-install-tool-configuration-radio t3js-presets-formField" id="t3-install-tool-configuration-image-graphicsmagick" name="install[values][{feature.name}][enable]" value="{preset.name}" diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Image/ImageMagick6.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Image/ImageMagick6.html similarity index 94% rename from typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Image/ImageMagick6.html rename to typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Image/ImageMagick6.html index 5062e83439ca459b9b051883891b6cc9b01210d6..8845a91e687a94dfb60a10be0e039b9050795836 100644 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Image/ImageMagick6.html +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Image/ImageMagick6.html @@ -3,7 +3,7 @@ <div class="message-header"> <input type="radio" - class="t3-install-tool-configuration-radio" + class="t3-install-tool-configuration-radio t3js-presets-formField" id="t3-install-tool-configuration-image-imagemagick6" name="install[values][{feature.name}][enable]" value="{preset.name}" diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Mail.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Mail.html similarity index 90% rename from typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Mail.html rename to typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Mail.html index 3b5a3205f194f609edc17f04a6a960a62181593a..c4ada7d7cfc93272b0ac51bd0ba71355e9bd290f 100644 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Mail.html +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Mail.html @@ -20,7 +20,7 @@ and allows to set the correct value in TYPO3 settings. </p> <f:for each="{feature.presetsOrderedByPriority}" as="preset"> - <f:render partial="Action/Tool/Configuration/{feature.name}/{preset.name}" arguments="{_all}" /> + <f:render partial="Action/Tool/Settings/Presets/{feature.name}/{preset.name}" arguments="{_all}" /> </f:for> </div> </div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Mail/Custom.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Mail/Custom.html similarity index 89% rename from typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Mail/Custom.html rename to typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Mail/Custom.html index b0119298306885c525093b9ecf08f8384c1b0388..3e64fb34c37963d017eb1075bba05de69b575f14 100644 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Mail/Custom.html +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Mail/Custom.html @@ -3,7 +3,7 @@ <div class="message-header"> <input type="radio" - class="t3-install-tool-configuration-radio" + class="t3-install-tool-configuration-radio t3js-presets-formField" id="t3-install-tool-configuration-mail-custom" name="install[values][{feature.name}][enable]" value="{preset.name}" @@ -31,7 +31,7 @@ type="text" name="install[values][{feature.name}][{preset.name}][{configurationKey}]" value="{configurationValue}" - class="form-control t3js-custom-preset" + class="form-control t3js-custom-preset t3js-presets-formField" data-radio="t3-install-tool-configuration-mail-custom" /> </div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Mail/Sendmail.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Mail/Sendmail.html similarity index 93% rename from typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Mail/Sendmail.html rename to typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Mail/Sendmail.html index b33776c24078d2340fff1289ba7ca655d12dcf09..0999f398a9f5a1ba87ca3a258ac304d528d20175 100644 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Mail/Sendmail.html +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Mail/Sendmail.html @@ -3,7 +3,7 @@ <div class="message-header"> <input type="radio" - class="t3-install-tool-configuration-radio" + class="t3-install-tool-configuration-radio t3js-presets-formField" id="t3-install-tool-configuration-mail-sendmail" name="install[values][{feature.name}][enable]" value="{preset.name}" diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Mail/Smtp.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Mail/Smtp.html similarity index 93% rename from typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Mail/Smtp.html rename to typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Mail/Smtp.html index 133bf161c5df052f8edd4ed5cf5a4489bf3481c0..cfe63ba64400c34b99a17df2d0ba000b5b2d1398 100644 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Configuration/Mail/Smtp.html +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/Presets/Mail/Smtp.html @@ -3,7 +3,7 @@ <div class="message-header"> <input type="radio" - class="t3-install-tool-configuration-radio" + class="t3-install-tool-configuration-radio t3js-presets-formField" id="t3-install-tool-configuration-mail-smtp" name="install[values][{feature.name}][enable]" value="{preset.name}" diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/AboutImageHandling.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/AboutImageHandling.html deleted file mode 100644 index d896a2d74ca49e0fac50dd934448667b3faecee2..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/AboutImageHandling.html +++ /dev/null @@ -1,51 +0,0 @@ -{namespace i=TYPO3\CMS\Install\ViewHelpers} - -<div class="alert alert-notice"> - <h4>About image handling</h4> - <p> - TYPO3 is known for its ability to process images on the server. - </p> - <p> - In the backend interface (TBE) thumbnails are automatically generated - as well as icons, menu items and pane tabs (by GDLib). - In the frontend all kinds of graphical elements are processed. Typically images are - scaled down to fit the pages (by ImageMagick) and menu items, graphical headers and - such are generated automatically (by GDLib + ImageMagick). In addition TYPO3 is able - to handle many file formats (thanks to ImageMagick), for example TIF, BMP, PCX, TGA, - AI and PDF in addition to the standard web formats; JPG, GIF, PNG. - </p> - <p> - In order to do this, TYPO3 uses two sets of tools: - </p> - <strong> - ImageMagick / GraphicsMagick: - </strong> - <p> - For conversion of non-web formats to webformats, combining images with alpha-masks, - performing image-effects like blurring and sharpening. - </p> - <p> - ImageMagick is a collection of external programs on the server called by the exec() - function in PHP. TYPO3 uses three of these, namely 'convert' (converting fileformats, - scaling, effects), 'combine'/'composite' (combining images with masks) and 'identify' - (returns image information). GraphicsMagick is an alternative to ImageMagick and can - be enabled by setting [GFX][processor] to 'GraphicsMagick'. This is recommended and enabled - by default. Because ImageMagick and Graphicsmagick are external programs, a requirement - must be met: The programs must be installed on the server and working. ImageMagick is - available for both Windows and Unix. The current version is 6+. ImageMagick homepage is - at <a href="http://www.imagemagick.org/">http://www.imagemagick.org/</a> - </p> - <strong> - GDLib: - </strong> - <p> - For drawing boxes and rendering text on images with truetype fonts. Also used for - icons, menuitems and generally the TypoScript GIFBUILDER object is based on GDlib, - but extensively utilizing ImageMagick to process intermediate results. - </p> - <p> - GDLib is accessed through internal functions in PHP, you'll need a version of PHP - with GDLib compiled in. Also in order to use TrueType fonts with GDLib you'll - need FreeType compiled in as well. - </p> -</div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/CombiningImages.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/CombiningImages.html deleted file mode 100644 index e7ebd0a9310a4b6cecfcccc8cb1377dba7373a40..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/CombiningImages.html +++ /dev/null @@ -1,22 +0,0 @@ -{namespace i=TYPO3\CMS\Install\ViewHelpers} - -<form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <h4>Combining images</h4> - <p> - This verifies that the ImageMagick tools, <code>combine</code>, <code>composite</code>, are able to - combine two images through a grayscale mask. - </p> - <f:if condition="{combiningImagesTested}"> - <p>Test-Image by Rotkaeppchen68 (in de.wikipedia) [<a href="http://www.gnu.org/copyleft/fdl.html">GFDL</a> or <a href="http://creativecommons.org/licenses/by-sa/3.0/">CC-BY-SA-3.0</a>], <a href="https://commons.wikimedia.org/wiki/File%3AFuBK-Testbild.png">via Wikimedia Commons</a></p> - - <f:for each="{testResults}" as="test"> - <f:render partial="Action/Tool/TestSetup/DisplayTwinImage" arguments="{_all}"/> - </f:for> - - <f:render partial="Action/Tool/TestSetup/AboutImageHandling" arguments="{_all}" /> - <f:render partial="Action/Tool/TestSetup/VerifyTestResults" arguments="{_all}" /> - <f:render partial="Action/Tool/TestSetup/CurrentConfiguration" arguments="{_all}" /> - </f:if> - <f:render partial="Action/Common/SubmitButton" arguments="{name:'testCombiningImages', text:'Test combining images'}"/> -</form> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/ConvertImageFormatsToJpg.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/ConvertImageFormatsToJpg.html deleted file mode 100644 index d3f7bff2f7edd9f48ad34946bf95143aa0b0fe3d..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/ConvertImageFormatsToJpg.html +++ /dev/null @@ -1,37 +0,0 @@ -{namespace i=TYPO3\CMS\Install\ViewHelpers} - -<form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <h4>Convert image formats to jpg</h4> - <p> - This verifies that your ImageMagick installation is able to read the default - formats <code>jpg</code>, <code>gif</code>, <code>png</code>, <code>tif</code>, <code>pdf</code> and <code>ai</code>. - The tool <code>identify</code> is used to read the pixeldimensions of non-web formats and 'convert' is used to - read the image and convert it to <code>jpg</code>. - </p> - <f:if condition="{convertImageFormatsToJpgTested}"> - <p>Test-Image by Rotkaeppchen68 (in de.wikipedia) [<a href="http://www.gnu.org/copyleft/fdl.html">GFDL</a> or <a href="http://creativecommons.org/licenses/by-sa/3.0/">CC-BY-SA-3.0</a>], <a href="https://commons.wikimedia.org/wiki/File%3AFuBK-Testbild.png">via Wikimedia Commons</a></p> - - <div class="typo3-message message-notice"> - <div class="header-container"> - <div class="message-header"> - <strong>Dark images</strong> - </div> - </div> - <div class="message-body"> - In case the images appear remarkably darker than the reference images, - try to set [TYPO3_CONF_VARS][GFX][colorspace] = sRGB. - </div> - </div> - <p></p> - - <f:for each="{testResults}" as="test"> - <f:render partial="Action/Tool/TestSetup/DisplayTwinImage" arguments="{_all}"/> - </f:for> - - <f:render partial="Action/Tool/TestSetup/AboutImageHandling" arguments="{_all}" /> - <f:render partial="Action/Tool/TestSetup/VerifyTestResults" arguments="{_all}" /> - <f:render partial="Action/Tool/TestSetup/CurrentConfiguration" arguments="{_all}" /> - </f:if> - <f:render partial="Action/Common/SubmitButton" arguments="{name:'testConvertImageFormatsToJpg', text:'Test image formats'}"/> -</form> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/CurrentConfiguration.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/CurrentConfiguration.html deleted file mode 100644 index 26f9c2c552026ce558769b975d90a2dffcea2c7c..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/CurrentConfiguration.html +++ /dev/null @@ -1,79 +0,0 @@ -{namespace i=TYPO3\CMS\Install\ViewHelpers} - -<div class="alert alert-notice"> - <h4>Current configuration</h4> - <table class="table table-striped"> - <tr> - <td> - {imageConfiguration.processor} enabled: - </td> - <td> - {f:if(condition:imageConfiguration.processorEnabled, then:'Yes', else:'No')} - </td> - </tr> - <tr> - <td> - ImageMagick or GraphicsMagick: - </td> - <td> - {imageConfiguration.processor} - </td> - </tr> - <tr> - <td> - {imageConfiguration.processor} path: - </td> - <td> - {imageConfiguration.processorPath} - </td> - </tr> - <tr> - <td> - {imageConfiguration.processor} version: - </td> - <td> - {imageConfiguration.processorVersion} - </td> - </tr> - <tr> - <td> - {imageConfiguration.processor} effects enabled: - </td> - <td> - {imageConfiguration.processorEffects} <span>(Blurring/Sharpening with {imageConfiguration.processor})</span> - </td> - </tr> - <tr> - <td> - GDLib enabled: - </td> - <td> - {f:if(condition:imageConfiguration.gdlibEnabled, then:'Yes', else:'No')} - </td> - </tr> - <tr> - <td> - GDLib using PNG: - </td> - <td> - {imageConfiguration.gdlibPng} - </td> - </tr> - <tr> - <td> - Freetype DPI: - </td> - <td> - {imageConfiguration.freeTypeDpi} <span>(Should be 96 for Freetype 2)</span> - </td> - </tr> - <tr> - <td> - File Formats: - </td> - <td> - {imageConfiguration.fileFormats} - </td> - </tr> - </table> -</div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/DisplayTwinImage.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/DisplayTwinImage.html deleted file mode 100644 index 3e6b758e260f4b8f654cb9489f8acab6ab6ec9e7..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/DisplayTwinImage.html +++ /dev/null @@ -1,67 +0,0 @@ -{namespace i=TYPO3\CMS\Install\ViewHelpers} - -<h4>{test.title}</h4> - -<f:if condition="{test.message}"> - <f:render partial="Action/Common/StatusMessage" arguments="{message: test.message}" /> -</f:if> - -<f:if condition="{test.error}"> - <f:then> - <f:render partial="Action/Common/StatusMessage" arguments="{message: test.error}"/> - </f:then> - <f:else> - <div class="t3-install-displaytwinimageimages"> - <div class="row"> - <div class="col-xs-12 col-md-6"> - <h4>Reference</h4> - <div class="bg-transparent-emulation"> - <img src="../../../../{test.referenceFile -> i:file.relativePath()}?{time}" /> - </div> - </div> - <div class="col-xs-12 col-md-6"> - <h4>Your system</h4> - <f:if condition="{test.outputFile}"> - <f:then> - <f:if condition="{i:file.exists(file:test.outputFile)}"> - <f:then> - <div class="bg-transparent-emulation"> - <img src="../../../../{test.outputFile -> i:file.relativePath()}?{time}" /> - </div> - </f:then> - <f:else> - <div class="typo3-message message-error" > - <div class="header-container"> - <div class="message-header"><strong>No image</strong></div> - </div> - <div class="message-body"> - Your system generated no image, it was probably unable to write the file. Do you have a permission problem? - </div> - </div> - </f:else> - </f:if> - </f:then> - <f:else> - <div class="typo3-message message-error" > - <div class="header-container"> - <div class="message-header"><strong>No image</strong></div> - </div> - <div class="message-body"> - Your system generated no image at all. This is probably a misconfiguration. - </div> - </div> - </f:else> - </f:if> - </div> - </div> - </div> - - <f:if condition="{test.command}"> - <div class="t3-install-displaytwinimagetextarea"> - {i:format.imageMagickCommands(commands:test.command) -> f:format.raw()} - </div> - </f:if> - </f:else> -</f:if> - -<p></p> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/Gdlib.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/Gdlib.html deleted file mode 100644 index 90e0a852b680d981fb4d5ec0dd1e1f557dcc549e..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/Gdlib.html +++ /dev/null @@ -1,19 +0,0 @@ -{namespace i=TYPO3\CMS\Install\ViewHelpers} - -<form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <p> - This verifies that the GDLib installation works properly. - </p> - <f:if condition="{gdlibTested}"> - <f:render partial="Action/Tool/TestSetup/AboutImageHandling" arguments="{_all}" /> - <f:render partial="Action/Tool/TestSetup/VerifyTestResults" arguments="{_all}" /> - <f:render partial="Action/Tool/TestSetup/CurrentConfiguration" arguments="{_all}" /> - <p>Test-Image by Rotkaeppchen68 (in de.wikipedia) [<a href="http://www.gnu.org/copyleft/fdl.html">GFDL</a> or <a href="http://creativecommons.org/licenses/by-sa/3.0/">CC-BY-SA-3.0</a>], <a href="https://commons.wikimedia.org/wiki/File%3AFuBK-Testbild.png">via Wikimedia Commons</a></p> - - <f:for each="{testResults}" as="test"> - <f:render partial="Action/Tool/TestSetup/DisplayTwinImage" arguments="{_all}"/> - </f:for> - </f:if> - <f:render partial="Action/Common/SubmitButton" arguments="{name:'testGdlib', text:'Test GDLib'}"/> -</form> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/Mail.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/Mail.html deleted file mode 100644 index 8189f39ed66690937952103f39299cd92744407b..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/Mail.html +++ /dev/null @@ -1,33 +0,0 @@ -<p> - You can check the basic mail functionality by entering your email address here and clicking the button. - You should then receive a test email from "{senderEmailAddress}". -</p> - -<p> - If no email is received, your setup might be broken. Check the following: - <ul> - <li> - If <code>$GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport']</code> is set to mail or sendmail, TYPO3 tries to use PHPs internal - mail() function. There might be no such program installed. - </li> - <li> - If <code>$GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport']</code> is set to smtp, check if the data given in - <code>$GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport_smtp_*']</code> is valid. Wrong data here results in faulty requests to the - mail server. You can find the resulting messages in the mail server log. - </li> - </ul> -</p> - -<form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <div class="form-group"> - <label for="t3-install-checkmail">Email address:</label> - <input - id="t3-install-checkmail" - type="email" - name="install[values][testEmailRecipient]" - class="t3-install-form-input-text form-control" - /> - </div> - <f:render partial="Action/Common/SubmitButton" arguments="{name:'testMail', text:'Send test mail'}"/> -</form> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/ScalingImages.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/ScalingImages.html deleted file mode 100644 index e03a537249be76aa9fc0d17f1db79a59f374aa41..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/ScalingImages.html +++ /dev/null @@ -1,21 +0,0 @@ -{namespace i=TYPO3\CMS\Install\ViewHelpers} - -<form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <h4>Scaling images</h4> - <p> - This shows how ImageMagick reacts when scaling transparent GIF and PNG files. - </p> - <f:if condition="{scalingImagesTested}"> - <p>Test-Image by Rotkaeppchen68 (in de.wikipedia) [<a href="http://www.gnu.org/copyleft/fdl.html">GFDL</a> or <a href="http://creativecommons.org/licenses/by-sa/3.0/">CC-BY-SA-3.0</a>], <a href="https://commons.wikimedia.org/wiki/File%3AFuBK-Testbild.png">via Wikimedia Commons</a></p> - - <f:for each="{testResults}" as="test"> - <f:render partial="Action/Tool/TestSetup/DisplayTwinImage" arguments="{_all}"/> - </f:for> - - <f:render partial="Action/Tool/TestSetup/AboutImageHandling" arguments="{_all}" /> - <f:render partial="Action/Tool/TestSetup/VerifyTestResults" arguments="{_all}" /> - <f:render partial="Action/Tool/TestSetup/CurrentConfiguration" arguments="{_all}" /> - </f:if> - <f:render partial="Action/Common/SubmitButton" arguments="{name:'testScalingImages', text:'Test scaling images'}"/> -</form> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/TrueTypeFont.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/TrueTypeFont.html deleted file mode 100644 index 3afe919e76158f1141afc2db02ecf562416f6b42..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/TrueTypeFont.html +++ /dev/null @@ -1,9 +0,0 @@ -<form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <f:if condition="{trueTypeFontTested}"> - <f:for each="{testResults}" as="test"> - <f:render partial="Action/Tool/TestSetup/DisplayTwinImage" arguments="{_all}"/> - </f:for> - </f:if> - <f:render partial="Action/Common/SubmitButton" arguments="{name:'testTrueTypeFont', text:'Test true type font'}"/> -</form> \ No newline at end of file diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/VerifyTestResults.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/VerifyTestResults.html deleted file mode 100644 index e70a08b9b644d0cdbba10d46866e21a0028bf388..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/VerifyTestResults.html +++ /dev/null @@ -1,18 +0,0 @@ -{namespace i=TYPO3\CMS\Install\ViewHelpers} - -<div class="alert alert-notice"> - <h4>Verify test results</h4> - <p> - This page performs image processing and displays the result. It's a thorough check - that everything you've configured is working correctly. - </p> - <p> - It's quite simple to verify your installation; Just look down the page, the images - in pairs should look like each other. If some images are not alike, something is - wrong. You may also notice warnings and errors if this tool found signs of any problems. - </p> - <p> - The image to the left is the reference image (how it should be) and to the right - the image made by your server. - </p> -</div> \ No newline at end of file diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/WriteGifAndPng.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/WriteGifAndPng.html deleted file mode 100644 index ff3325b60d12d1801246dbe94b72d3f297f390fa..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/TestSetup/WriteGifAndPng.html +++ /dev/null @@ -1,23 +0,0 @@ -{namespace i=TYPO3\CMS\Install\ViewHelpers} - -<form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <h4>Writing gif and png</h4> - <p> - This verifies that ImageMagick is able to write GIF and PNG files. - The GIF-file is attempted compressed with LZW by the - <code>\TYPO3\CMS\Core\Imaging\GraphicalFunctions::gifCompress()</code> function. - </p> - <f:if condition="{writeGifAndPngTested}"> - <p>Test-Image by Rotkaeppchen68 (in de.wikipedia) [<a href="http://www.gnu.org/copyleft/fdl.html">GFDL</a> or <a href="http://creativecommons.org/licenses/by-sa/3.0/">CC-BY-SA-3.0</a>], <a href="https://commons.wikimedia.org/wiki/File%3AFuBK-Testbild.png">via Wikimedia Commons</a></p> - - <f:for each="{testResults}" as="test"> - <f:render partial="Action/Tool/TestSetup/DisplayTwinImage" arguments="{_all}"/> - </f:for> - - <f:render partial="Action/Tool/TestSetup/AboutImageHandling" arguments="{_all}" /> - <f:render partial="Action/Tool/TestSetup/VerifyTestResults" arguments="{_all}" /> - <f:render partial="Action/Tool/TestSetup/CurrentConfiguration" arguments="{_all}" /> - </f:if> - <f:render partial="Action/Common/SubmitButton" arguments="{name:'testWriteGifAndPng', text:'Test image formats'}"/> -</form> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/CheckForBrokenExtensions.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/CheckForBrokenExtensions.html new file mode 100644 index 0000000000000000000000000000000000000000..ff910a6337963dc80ba5e5f7eb41e13d5e6b6e28 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/CheckForBrokenExtensions.html @@ -0,0 +1,16 @@ +<p> + Checks whether the local extensions' ext_tables and ext_localconf files can be included without errors, + meaning they can be loaded without breaking the system. +</p> + +<div + class="t3js-checkForBrokenExtensions-data" + data-protocolurl="{extensionCompatibilityTesterProtocolFile}" + data-errorprotocolurl="{extensionCompatibilityTesterErrorProtocolFile}" +></div> +<div class="t3js-checkForBrokenExtensions-output"></div> +<div class="btn-group"> + <button class="btn btn-default t3js-checkForBrokenExtensions-check"> + Check extensions + </button> +</div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/CoreUpdate.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/CoreUpdate.html new file mode 100644 index 0000000000000000000000000000000000000000..54c306c72f5820734d76f7f63908a3d3faf062e7 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/CoreUpdate.html @@ -0,0 +1,62 @@ +<p> + Automatically updates the TYPO3 CMS core to its latest minor release if these criterias are met: +</p> +<ul> + <li> + It only works under Unix and MacOS (needs symlink support). + </li> + <li> + typo3_src must be a symlink. + </li> + <li> + Symlink needs to be writable (and deletable) by the web + server user. + </li> + <li> + Document root needs to be writable. + </li> + <li> + One path above document root (../) needs to be writable (new directories need to be allowed to be created). + </li> + <li> + The tar command must be available for extracting the Source package. + </li> +</ul> + +<div class="t3js-coreUpdate-output"> + <f:if condition="!{coreUpdateComposerMode} && {coreUpdateEnabled} && {coreUpdateIsReleasedVersion} && {coreUpdateIsSymLinkedCore}"> + <f:then> + <div class="t3js-coreUpdate-buttonTemplate"> + <button class="btn btn-default t3js-coreUpdate-init" type="submit" name="coreUpdateCheckForUpdate" + data-action="checkForUpdate" + > + Check for core updates + </button> + </div> + </f:then> + <f:else> + <div class="typo3-message alert alert-notice"> + <div class="header-container"> + <div class="message-header"> + <strong>Disabled</strong> + </div> + </div> + <div class="message-body"> + This feature is disabled in this installation.<br/> + <f:if condition="{coreUpdateComposerMode}"> + Composer Mode is active. Please update using composer commands. + </f:if> + <f:if condition="!{coreUpdateEnabled}"> + The environment variable was set <code>TYPO3_DISABLE_CORE_UPDATER=1</code>. + </f:if> + <f:if condition="!{coreUpdateIsReleasedVersion}"> + This system isn't a released TYPO3 version. + </f:if> + <f:if condition="!{coreUpdateIsSymLinkedCore}"> + This action can only be used with a linked typo3_src. + </f:if> + </div> + </div> + </f:else> + </f:if> +</div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/ExtensionScanner.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/ExtensionScanner.html new file mode 100644 index 0000000000000000000000000000000000000000..325df013ffb5003665f2914508b02a5876e67816 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/ExtensionScanner.html @@ -0,0 +1,99 @@ +<p> + This module scans extensions for usage of deprecated and removed TYPO3 API calls. + The module can be a great help for extension developers and site maintainers when + upgrading to new core versions. However, the detection approach - based on static + code analysis - is limited by concept: false positives/negatives are impossible to avoid. + Further details can be found at + <a style="text-decoration: underline;" target="_blank" rel="noopener" href="https://docs.typo3.org/typo3cms/CoreApiReference/ExtensionScanner/Index.html"> + the official docs. + </a> +</p> + +<div style="display:none;"> + <div id="t3js-extensionScanner-files-token">{extensionScannerFilesToken}</div> + <div id="t3js-extensionScanner-scan-file-token">{extensionScannerScanFileToken}</div> + <div id="t3js-extensionScanner-mark-fully-scanned-rest-files-token">{extensionScannerMarkFullyScannedRestFilesToken}</div> + <div id="t3js-extensionScanner-file-hit-template"> + <div class="panel panel-flat t3js-extensionScanner-hit-panel risk-medium"> + <div class="panel-heading"> + <h3 class="panel-title"> + <a href="#collapse" class="collapsed t3js-extensionScanner-hit-file-panel-head" data-toggle="collapse"> + <span class="caret"></span> + <span class="pull-right badges"></span> + <span class="t3js-extensionScanner-hit-filename file">aFile</span> + <span class="t3js-extensionScanner-hit-message message">aMessage</span> + </a> + </h3> + </div> + <div id="collapse" class="panel-collapse collapse t3js-extensionScanner-hit-file-panel-body"> + <div class="panel-body"> + <pre><strong class="t3js-extensionScanner-hit-file-line"></strong><span class="t3js-extensionScanner-hit-file-lineContent"></span></pre> + <div class="panel-group-flat t3js-extensionScanner-hit-file-rest-container"></div> + </div> + </div> + </div> + </div> + <div id="t3js-extensionScanner-file-hit-rest-template"> + <div class="panel panel-flat t3js-extensionScanner-hit-rest-panel risk-medium"> + <div class="panel-heading"> + <h3 class="panel-title"> + <a href="#collapse-rest" + class="collapsed t3js-extensionScanner-hit-rest-panel-head" + data-toggle="collapse" + > + <span class="badge pull-right">aBadge</span> + <span class="caret"></span> + <strong class="t3js-extensionScanner-hit-rest-headline">restFileHeadline</strong> + </a> + </h3> + </div> + <div id="collapse-rest" class="panel-collapse collapse t3js-extensionScanner-hit-rest-panel-body"> + <pre class="t3js-extensionScanner-hit-rest-body">restFileContent</pre> + </div> + </div> + </div> +</div> + +<div class="progress t3js-extensionScanner-progress-all-extension"> + <div class="progress-bar progress-bar-info" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0;"> + <span class="text-nowrap"></span> + </div> +</div> + +<button class="btn btn-default t3js-extensionScanner-scan-all" type="submit"> + Scan all +</button> + +<h2>Extensions</h2> + +<div class="panel-group panel-group-flat panel-group-scanner-extensions"> + <f:for each="{extensionScannerExtensionList}" as="extensionInTypo3conf" iteration="iterator"> + <div + class="panel panel-flat t3js-extensionScanner-extension t3js-extensionScanner-extension-{extensionInTypo3conf.filename}" + data-extension="{extensionInTypo3conf.filename}"> + <div class="panel-progress"> + <div class="panel-progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0;"><span class="sr-only"></span></div> + </div> + <div class="panel-heading alert-notice"> + <h2 class="panel-title"> + <a href="#extension-{iterator.index}" class="collapsed" data-toggle="collapse"> + <span class="caret"></span> + Extension: <strong>{extensionInTypo3conf.filename}</strong> + <span class="pull-right t3js-extensionScanner-number-of-files"></span> + </a> + </h2> + </div> + <div class="panel-collapse collapse" id="extension-{iterator.index}"> + <div class="panel-body hide t3js-extensionScanner-extension-body"></div> + <div class="panel-footer"> + <div>Effective lines of code: <span class="t3js-extensionScanner-extension-body-loc">0</span></div> + <div>Files ignored by scanner: <span class="t3js-extensionScanner-extension-body-ignored-files">0</span></div> + <div>Code lines ignored by scanner: <span class="t3js-extensionScanner-extension-body-ignored-lines">0</span></div> + <button class="btn btn-default t3js-extensionScanner-scan-single" data-extension="{extensionInTypo3conf.filename}" type="submit"> + Scanning... + </button> + </div> + </div> + </div> + </f:for> +</div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/TcaExtTablesCheck.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/TcaExtTablesCheck.html new file mode 100644 index 0000000000000000000000000000000000000000..4a82472e4f57c11b4a3270773e2aca6fe6a8f759 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/TcaExtTablesCheck.html @@ -0,0 +1,7 @@ +<p> + Check if an extension still changes $GLOBALS['TCA'] in ext_tables.php. +</p> +<div class="t3js-tcaExtTablesCheck-output"></div> +<button class="btn btn-default t3js-tcaExtTablesCheck-check" type="button"> + Check loaded extensions +</button> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/TcaMigrationsCheck.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/TcaMigrationsCheck.html new file mode 100644 index 0000000000000000000000000000000000000000..1d56436cdeb6e8917338f674b410c886dbb6d99c --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/TcaMigrationsCheck.html @@ -0,0 +1,11 @@ +<p> + Checks whether the current TCA needs migrations and displays the new migration paths which need to be adjusted + manually. +</p> +<div class="t3js-tcaMigrationsCheck-output"></div> +<button + class="btn btn-default t3js-tcaMigrationsCheck-check" + type="button" +> + Check TCA Migrations +</button> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/UpgradeDocs.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/UpgradeDocs.html new file mode 100644 index 0000000000000000000000000000000000000000..3549d44b49862fca5d7e722b2a242d9391c1c7d0 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/UpgradeDocs.html @@ -0,0 +1,106 @@ +<div style="display:none"> + <div id="t3js-upgradeDocs-markRead-token">{upgradeDocsMarkReadToken}</div> + <div id="t3js-upgradeDocs-unmarkRead-token">{upgradeDocsUnmarkReadToken}</div> +</div> + +<div class="row"> + <div class="col-md-12"> + <div class="form-group"> + <div class="input-group"> + <span class="input-group-addon">Search:</span> + <input + type="text" + class="form-control t3js-upgradeDocs-fulltext-search" + placeholder="search setting" + > + </div> + </div> + </div> +</div> +<div class="row"> + <div class="col-md-12"> + <div class="form-group"> + <div class="input-group"> + <span class="input-group-addon">Filter by:</span> + <select + class="chosen-select t3js-upgradeDocs-chosen-select" + data-placeholder="" + style="width:100%;" + multiple + tabindex="" + > + </select> + </div> + </div> + </div> +</div> + +<div class="panel-group panel-group-rst" role="tablist" aria-multiselectable="true"> + <f:for each="{upgradeDocsFiles}" as="versionArray" key="version" iteration="iterator"> + <f:if condition="{versionArray -> f:count()} > 0"> + <div class="panel panel-default panel-version"> + <div class="panel-heading" role="tab" id="heading-{iterator.index}"> + <h2 class="panel-title"> + <a href="#version-{iterator.index}" + class="collapsed" data-toggle="collapse" + aria-expanded="false" + aria-controls="#version-{iterator.index}" + > + <span class="caret"></span> + Version: <strong>{version}</strong> + </a> + </h2> + </div> + <div class="panel-collapse collapse" + id="version-{iterator.index}" role="tabpanel" data-group-version="{version}"> + <div class="panel-body" role="tablist" aria-multiselectable="false"> + <f:for each="{versionArray}" as="fileArray" key="issueNumber"> + <f:render partial="Action/Tool/Upgrade/UpgradeDocs/PanelItem" + arguments="{issueNumber:issueNumber, fileArray:fileArray, version:version}"/> + </f:for> + </div> + </div> + </div> + </f:if> + </f:for> + + <div class="panel panel-default panel-version"> + <div class="panel-heading" role="tab" id="heading-read"> + <h2 class="panel-title"> + <a href="#collapseRead" class="collapsed" data-toggle="collapse" aria-expanded="false" + aria-controls="collapseRead"> + <span class="caret"></span> + Files marked as read + </a> + </h2> + </div> + <div class="collapse" id="collapseRead" role="tabpanel"> + <div class="panel-body panel-body-read" role="tablist" aria-multiselectable="false"> + <f:for each="{upgradeDocsReadFiles}" as="fileArray" key="issueNumber"> + <f:render partial="Action/Tool/Upgrade/UpgradeDocs/PanelItem" + arguments="{issueNumber:issueNumber, fileArray:fileArray, version:fileArray.section, read:'true'}"/> + </f:for> + </div> + </div> + </div> + + <div class="panel panel-default panel-version"> + <div class="panel-heading" role="tab" id="heading-not-affected"> + <h2 class="panel-title"> + <a href="#collapseNotAffected" class="collapsed" data-toggle="collapse"> + <span class="caret"></span> + Files marked as not affected by extension scanner + </a> + </h2> + </div> + <div class="collapse" id="collapseNotAffected" role="tabpanel"> + <div class="panel-body panel-body-not-affected" role="tablist" aria-multiselectable="false"> + <f:for each="{upgradeDocsNotAffectedFiles}" as="fileArray" key="issueNumber"> + <f:render partial="Action/Tool/Upgrade/UpgradeDocs/PanelItem" + arguments="{issueNumber:issueNumber, fileArray:fileArray, version:fileArray.section, read:'true'}" + /> + </f:for> + </div> + </div> + </div> +</div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/UpgradeDocs/PanelItem.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/UpgradeDocs/PanelItem.html new file mode 100644 index 0000000000000000000000000000000000000000..9a78fe6779398a4e449c295e365d13f3b5a1aa2e --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/UpgradeDocs/PanelItem.html @@ -0,0 +1,30 @@ +<div class="panel panel-rst panel-{fileArray.class} risk-medium upgrade_analysis_item_to_filter item" + data-item-tags="{fileArray.tagList}" data-item-version="{version}" id="heading{issueNumber}"> + <div class="panel-heading" role="tab"> + <h3 class="panel-title"> + <f:if condition="{read}"> + <f:then> + <a class="link-action t3js-upgradeDocs-unmarkRead pull-right" data-filepath="{fileArray.filepath}" + data-toggle="tooltip" data-placement="top" title="Mark as not read"> + <i class="fa fa-lg fa-ban"></i> + <span class="sr-only">restore this document</span> + </a> + </f:then> + <f:else> + <a class="link-action t3js-upgradeDocs-markRead pull-right" data-filepath="{fileArray.filepath}" + data-toggle="tooltip" data-placement="top" title="Mark as read"> + <i class="fa fa-lg fa-check"></i> + <span class="sr-only">ignore this document</span> + </a> + </f:else> + </f:if> + <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapse{issueNumber}" aria-expanded="true" aria-controls="collapse{issueNumber}" class="collapsed"> + <span class="caret"></span> + <strong>{fileArray.headline}</strong> + </a> + </h3> + </div> + <div id="collapse{issueNumber}" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading{issueNumber}"> + <pre><f:format.raw>{fileArray.parsedContent}</f:format.raw></pre> + </div> +</div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/UpgradeWizards.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/UpgradeWizards.html new file mode 100644 index 0000000000000000000000000000000000000000..d4def5b19190827d974c92667c1a30cf17b075bb --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Upgrade/UpgradeWizards.html @@ -0,0 +1,116 @@ +<p> + If you upgrade your TYPO3 installation from one major version to another (e.g. 6.2 to 7 LTS), + then the Upgrade Wizards guide you through the necessary steps to upgrade your database + records or explicitly install extensions that ship with the latest TYPO3 version. +</p> + +<div style="display:none"> + <div id="t3js-upgradeWizards-markUndone-token">{upgradeWizardsMarkUndoneToken}</div> + <div id="t3js-upgradeWizards-input-token">{upgradeWizardsInputToken}</div> + <div id="t3js-upgradeWizards-execute-token">{upgradeWizardsExecuteToken}</div> + + <div class="t3js-upgradeWizards-blocking-charset-template"> + <p> + The default database charset of the main MySQL database is not utf-8. + <br /> + You have to run this update wizard before you can run any other update + wizard to make sure new tables and fields are created with the correct + charset. + <br /> + WARNING: This will NOT convert any existing data. + </p> + <button class="btn btn-default t3js-upgradeWizards-blocking-charset-fix" type="button"> + Set default charset to utf8 + </button> + </div> + + <div class="t3js-upgradeWizards-blocking-adds-template"> + <p> + There are tables or fields in the database which need to be created. + <br /> + You have to run this update wizard before you can run any other update + wizard to make sure all needed tables and fields are present. + </p> + <div> + <div class="t3js-upgradeWizards-blocking-adds-rows"></div> + </div> + <button class="btn btn-default t3js-upgradeWizards-blocking-adds-execute" type="button"> + Create missing tables and fields + </button> + </div> + + <div class="t3js-upgradeWizards-list-template"> + <div class="progress"> + <div class="progress-bar progress-bar-info progress-bar-striped" role="progressbar" + aria-valuenow="20" aria-valuemin="0" aria-valuemax="100" + style="width: {wizardsPercentageDone}%;"> + <span>100%</span> + </div> + </div> + <div class="t3js-upgradeWizards-list-rows"></div> + </div> + <div class="t3js-upgradeWizards-list-row-template"> + <h4 class="t3js-upgradeWizards-list-row-title"></h4> + <div class="t3js-upgradeWizards-list-row-explanation"></div> + <button class="btn btn-default t3js-upgradeWizards-list-row-execute" type="button"> + Execute + </button> + <hr /> + </div> + + <div class="t3js-upgradeWizards-input"> + <form> + <h4 class="t3js-upgradeWizards-input-title">{updateData.title}</h4> + <div class="t3js-upgradeWizards-input-html"></div> + <div class="form-group"> + <div class="checkbox"> + <label> + <input id="t3-install-showdatabasequeries" type="checkbox" name="install[values][showDatabaseQueries]" value="1" /> + Show database queries performed + </label> + </div> + </div> + <button class="btn btn-default t3js-upgradeWizards-input-perform" type="button"> + Perform updates! + </button> + </form> + </div> + + <div class="t3js-upgradeWizards-done-body-template"> + <table class="table table-striped"> + <tbody class="t3js-upgradeWizards-done-rows"></tbody> + </table> + </div> + <div class="t3js-upgradeWizards-done-row-template"> + <table> + <tr> + <td> + <button + type="button" + class="btn btn-default t3js-upgradeWizards-done-markUndone" + > + Mark undone + </button> + </td> + <td class="t3js-upgradeWizards-done-title"> + </td> + </tr> + </table> + </div> +</div> + +<hr> + +<h4>Available wizards</h4> +<div class="t3js-upgradeWizards-wizards-output"></div> + +<hr> + +<h4>Wizards marked as done</h4> +<p> + Some wizards fully automatically check whether they should be executed, while others just + set a flag in the system registry if they have been executed once. This "I have been executed" + flag can be reset by selecting specific wizards from the list below, so the according wizards + show up as possible upgrade wizards again. +</p> +<div class="t3js-upgradeWizards-done-output"></div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/UpgradeAnalysis/ListDocumentation.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/UpgradeAnalysis/ListDocumentation.html deleted file mode 100644 index 020ff52f9d6e727a71d975325323055844b4c536..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/UpgradeAnalysis/ListDocumentation.html +++ /dev/null @@ -1,74 +0,0 @@ -<f:section name="Main"> - <div class="panel-group panel-group-rst" role="tablist" aria-multiselectable="true"> - <f:for each="{files}" as="versionArray" key="version" iteration="iterator"> - <f:if condition="{versionArray -> f:count()} > 0"> - <div class="panel panel-default panel-version"> - <div class="panel-heading" role="tab" id="heading-{iterator.index}"> - <h2 class="panel-title"> - <a href="#version-{iterator.index}" - class="{f:if(condition: '{iterator.isFirst}', then: '', else: 'collapsed')}" data-toggle="collapse" - aria-expanded="{f:if(condition: '{iterator.isFirst}', then: 'true', else: 'false')}" - aria-controls="#version-{iterator.index}"> - <span class="caret"></span> - Version: <strong>{version}</strong> - </a> - </h2> - </div> - <div class="panel-collapse collapse {f:if(condition: '{iterator.isFirst}', then: 'in')}" - id="version-{iterator.index}" role="tabpanel" data-group-version="{version}"> - <div class="panel-body" role="tablist" aria-multiselectable="false"> - <f:for each="{versionArray}" as="fileArray" key="issueNumber"> - - <f:render partial="Action/Tool/UpgradeAnalysis/PanelItem" section="Main" - arguments="{issueNumber:issueNumber, fileArray:fileArray, version:version}"/> - - </f:for> - </div> - </div> - </div> - </f:if> - </f:for> - - <div class="panel panel-default panel-version"> - <div class="panel-heading" role="tab" id="heading-read"> - <h2 class="panel-title"> - <a href="#collapseRead" class="collapsed" data-toggle="collapse" aria-expanded="false" - aria-controls="collapseRead"> - <span class="caret"></span> - Files marked as read - </a> - </h2> - </div> - <div class="collapse" id="collapseRead" role="tabpanel"> - <div class="panel-body panel-body-read" role="tablist" aria-multiselectable="false"> - <f:for each="{shownFiles}" as="fileArray" key="issueNumber"> - <f:render partial="Action/Tool/UpgradeAnalysis/PanelItem" section="Main" - arguments="{issueNumber:issueNumber, fileArray:fileArray, version:fileArray.section, read:'true'}"/> - </f:for> - </div> - </div> - </div> - - <div class="panel panel-default panel-version"> - <div class="panel-heading" role="tab" id="heading-not-affected"> - <h2 class="panel-title"> - <a href="#collapseNotAffected" class="collapsed" data-toggle="collapse"> - <span class="caret"></span> - Files marked as not affected by extension scanner - </a> - </h2> - </div> - <div class="collapse" id="collapseNotAffected" role="tabpanel"> - <div class="panel-body panel-body-not-affected" role="tablist" aria-multiselectable="false"> - <f:for each="{notAffectedFiles}" as="fileArray" key="issueNumber"> - <f:render - partial="Action/Tool/UpgradeAnalysis/PanelItem" section="Main" - arguments="{issueNumber:issueNumber, fileArray:fileArray, version:fileArray.section, read:'true'}" - /> - </f:for> - </div> - </div> - </div> - </div> - -</f:section> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/UpgradeAnalysis/PanelItem.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/UpgradeAnalysis/PanelItem.html deleted file mode 100644 index 433db4350d408308dcfce0a98950657ec442a5a8..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/UpgradeAnalysis/PanelItem.html +++ /dev/null @@ -1,32 +0,0 @@ -<f:section name="Main"> - <div class="panel panel-rst panel-{fileArray.class} risk-medium upgrade_analysis_item_to_filter item" - data-item-tags="{fileArray.tagList}" data-item-version="{version}" id="heading{issueNumber}"> - <div class="panel-heading" role="tab"> - <h3 class="panel-title"> - <f:if condition="{read}"> - <f:then> - <a class="link-action t3js-upgradeanalysis-restore pull-right" data-filepath="{fileArray.filepath}" - data-toggle="tooltip" data-placement="top" title="restore this document"> - <i class="fa fa-lg fa-ban"></i> - <span class="sr-only">restore this document</span> - </a> - </f:then> - <f:else> - <a class="link-action t3js-upgradeanalysis-ignore pull-right" data-filepath="{fileArray.filepath}" - data-toggle="tooltip" data-placement="top" title="ignore this document"> - <i class="fa fa-lg fa-check"></i> - <span class="sr-only">ignore this document</span> - </a> - </f:else> - </f:if> - <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapse{issueNumber}" aria-expanded="true" aria-controls="collapse{issueNumber}" class="collapsed"> - <span class="caret"></span> - <strong>{fileArray.headline}</strong> - </a> - </h3> - </div> - <div id="collapse{issueNumber}" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading{issueNumber}"> - <pre><f:format.raw>{fileArray.parsedContent}</f:format.raw></pre> - </div> - </div> -</f:section> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/UpgradeWizard/GetUserInput.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/UpgradeWizard/GetUserInput.html deleted file mode 100644 index 7f0c76d18eef30329064bb510a5fe96eb9a4fe57..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/UpgradeWizard/GetUserInput.html +++ /dev/null @@ -1,21 +0,0 @@ -<form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <input type="hidden" name="install[values][identifier]" value="{updateData.identifier}"/> - - <h4>{updateData.title}</h4> - - <f:format.raw>{updateData.wizardHtml}</f:format.raw> - <div class="form-group"> - <div class="checkbox"> - <label> - <input id="t3-install-showdatabasequeries" type="checkbox" name="install[values][showDatabaseQueries]" value="1" /> - Show database queries performed - </label> - </div> - </div> - - <f:render - partial="Action/Common/SubmitButton" - arguments="{name:'performUpdate', text:'Perform updates!'}" - /> -</form> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/UpgradeWizard/ListUpdates.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/UpgradeWizard/ListUpdates.html deleted file mode 100644 index 6b620a84539b7143ae4fed9d5c611c720840da9e..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/UpgradeWizard/ListUpdates.html +++ /dev/null @@ -1,98 +0,0 @@ -{namespace i=TYPO3\CMS\Install\ViewHelpers} -<p> - If you upgrade your TYPO3 installation from one major version to another (e.g. 6.2 to 7 LTS), - then the Upgrade Wizards guide you through the necessary steps to upgrade your database - records or explicitly install extensions that ship with the latest TYPO3 version. -</p> -<hr /> - -<h2>Wizards available</h2> -<div class="progress"> - <div class="progress-bar progress-bar-info progress-bar-striped" role="progressbar" - aria-valuenow="{wizardsPercentageDone}" aria-valuemin="0" aria-valuemax="100" - style="width: {wizardsPercentageDone}%;"> - {wizardsPercentageDone}% Complete - </div> -</div> -<f:if condition="{availableUpdates}"> - <f:then> - <f:for each="{availableUpdates}" as="availableUpdate"> - <form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <input type="hidden" name="install[values][identifier]" value="{availableUpdate.identifier}"/> - <h4>{availableUpdate.title}</h4> - <f:format.raw>{availableUpdate.explanation}</f:format.raw> - <f:if condition="{availableUpdate.renderNext}"> - <div> - <f:render - partial="Action/Common/SubmitButton" - arguments="{name:'getUserInput', text:'Execute', className: 'btn-primary'}" - /> - <f:render - partial="Action/Common/MarkExtensionAsDone" - arguments="{name:'markAsDone', text:'Mark as done'}" - /> - </div> - </f:if> - <hr /> - </form> - </f:for> - </f:then> - <f:else> - <p> - <strong>No updates to perform!</strong> - </p> - <hr /> - </f:else> -</f:if> - -<f:if condition="{wizardsDone}"> - <form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <h2>Wizards marked as done</h2> - <p> - Some wizards fully automatically check whether they should be executed, while others just set a flag in - the system registry if they have been executed once. This "I have been executed" flag can be reset by - selecting specific wizards from the list below, so the according wizards show up as possible upgrade - wizards again. - </p> - <table class="table table-striped"> - <tbody> - <f:for each="{wizardsDone}" as="wizardDone"> - <tr> - <td> - <input id="t3-recheck-{wizardDone.identifier}" type="checkbox" name="install[values][recheck][{wizardDone.identifier}]" value="1" /> - </td> - <td> - {wizardDone.title} - </td> - </tr> - </f:for> - <f:for each="{rowUpdatersDone}" as="rowUpdaterDone"> - <tr> - <td> - <input id="t3-recheck-{rowUpdaterDone.identifier}" type="checkbox" name="install[values][recheckRowUpdater][{rowUpdaterDone.identifier}]" value="1" /> - </td> - <td> - Row updater: {rowUpdaterDone.title} - </td> - </tr> - </f:for> - </tbody> - </table> - <f:render - partial="Action/Common/SubmitButton" - arguments="{name:'recheckWizards', text:'Recheck chosen wizards'}" - /> - </form> -</f:if> -<hr /> - -<h4>Hint</h4> -<p> - When all updates are done you can check the database for tables and fields no longer required. - Perform the Database Analyzer steps until no more changes are required. -</p> -<a href="{i:uri.action(action: 'importantActions')}" class="btn btn-default"> - Go to Database Analyzer -</a> diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/UpgradeWizard/PerformUpdate.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/UpgradeWizard/PerformUpdate.html deleted file mode 100644 index 7ad20fd6ff6ca30f07d3d4a8faa3dc4577e6f13f..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/UpgradeWizard/PerformUpdate.html +++ /dev/null @@ -1,40 +0,0 @@ -<p class="innerWidth"> - <strong>{wizardData.title}</strong> -</p> - -<f:if condition="{wizardData.wizardInputBroken}"> - <f:then> - <a href="javascript:history.back()"> - Go back to update configuration - </a> - </f:then> - - <f:else> - <f:if condition="{wizardData.queries}"> - <f:for each="{wizardData.queries}" as="query"> - {query} - <br /> - </f:for> - </f:if> - </f:else> -</f:if> - -<form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <f:if condition="{nextUpdateIdentifier}"> - <f:then> - <input type="hidden" name="install[values][identifier]" value="{nextUpdateIdentifier}"/> - <f:render - partial="Action/Common/SubmitButton" - arguments="{name:'getUserInput', text:'Go to the next upgrade wizard'}" - /> - </f:then> - <f:else> - <f:render - partial="Action/Common/SubmitButton" - arguments="{name:'backToWizard', text:'Go back to the upgrade wizard'}" - /> - </f:else> - </f:if> - <hr /> -</form> diff --git a/typo3/sysext/install/Resources/Private/Templates/Action/Ajax/FilterManager.html b/typo3/sysext/install/Resources/Private/Templates/Action/Ajax/FilterManager.html deleted file mode 100644 index e2a7bb5badbd7b89ccb0e8e75329790f72e211b6..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Templates/Action/Ajax/FilterManager.html +++ /dev/null @@ -1,22 +0,0 @@ -<div class="t3js-response"> - <f:for each="{files}" as="filepath" key="headline"> - <div class="panel-group" role="tablist" aria-multiselectable="false"> - - <div class="panel panel-default"> - <div class="panel-heading" role="tab"> - <input type="checkbox" class="t3js-upgradeanalysis-restore pull-left" data-filepath="{filepath}" - title="restore this document"/> - <h3 class="panel-title"> - <strong> - {headline}</strong> - </h3> - </div> - </div> - - </div> - - </f:for> - <h2>Files Restored (will be in their original section upon next call of this page)</h2> - <div class="panel-group" id="upgrade_analysis_restored_files" role="tablist" aria-multiselectable="false"> - </div> -</div> diff --git a/typo3/sysext/install/Resources/Private/Templates/Action/Ajax/RemoveIgnoredItems.html b/typo3/sysext/install/Resources/Private/Templates/Action/Ajax/RemoveIgnoredItems.html deleted file mode 100644 index ecd7f73e12308d440a916260cef7ee34a16e12b1..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Templates/Action/Ajax/RemoveIgnoredItems.html +++ /dev/null @@ -1 +0,0 @@ -<f:render partial="Action/Tool/UpgradeAnalysis/PanelItem" section="Main" arguments="{issueNumber:issueNumber, fileArray:fileArray}" /> diff --git a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/About.html b/typo3/sysext/install/Resources/Private/Templates/Action/Tool/About.html deleted file mode 100644 index fbedaaeefc955423029ddc419355e82debd54a28..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/About.html +++ /dev/null @@ -1,187 +0,0 @@ -{namespace i=TYPO3\CMS\Install\ViewHelpers} - -<f:layout name="ToolAuthenticated" /> - -<f:section name="Content"> - <f:if condition="{contextService.standaloneContext}"> - <f:then> - <h1>About</h1> - </f:then> - <f:else> - <h1>TYPO3 CMS {typo3Version} Install tool on site: {siteName}</h1> - </f:else> - </f:if> - - <h3>How to configure TYPO3 CMS</h3> - <p> - Local configuration is done by overriding default values in the - file typo3conf/LocalConfiguration.php. The options that you - choose in the Install Tool will be saved in this file, such as database information - and values in the global array - TYPO3_CONF_VARS. - <br /><br /> - If you wish to manually edit the file, the options in the TYPO3_CONF_VARS array - and how to use them for your own purposes are discussed in the base configuration file, - EXT:core/Configuration/DefaultConfiguration.php. This file sets up the default values, - then includes the LocalConfiguration.php file to override the default values. - <br /> - See this page for more information about system requirements: - <a target="_blank" href="{i:constant(name:'TYPO3_URL_SYSTEMREQUIREMENTS')}"><i:constant name="TYPO3_URL_SYSTEMREQUIREMENTS" /></a> - </p> - <hr /> - - - <h3>Using this script</h3> - <p> - These are the primary steps for you to take: - </p> - - <hr /> - <h4>1: Important actions</h4> - <p> - This step provides an overview of the main system information - (operating system, PHP information and database). - <br /> - The following actions are available here: - <ul> - <li><strong>Database Analyzer</strong> - compares the database table and field definitions of the - current database with the specification from all loaded extensions' ext_tables.sql files.</li> - <li><strong>Clear all cache</strong> - works similar to the cache clearing in the backend, but - takes a more straightforward approach and the according backend hooks are not executed.</li> - <li><strong>Check for broken extensions</strong> - checks whether the local extensions' ext_tables - and ext_localconf files can be included without errors, meaning they can be loaded without - breaking the system.</li> - <li><strong>Core update</strong> - automatically update the TYPO3 CMS core to its latest bugfix - release if certain criteria are met. <strong>Note:</strong> This is not supported on Windows hosts.</li> - <li><strong>Change install tool password</strong></li> - <li><strong>Change site name</strong></li> - <li><strong>Change encryption key</strong></li> - <li><strong>Create backend administrator user</strong> - you should use this function only if there - are no admin users in the database, for instance if this is a blank database</li> - </ul> - </p> - - <hr /> - <h4>2: Configuration presets</h4> - <p> - The following configuration preset groups are available here: - <ul> - <li><strong>Character set conversion settings</strong> - charset conversion.</li> - <li><strong>Development / Production settings</strong> - context can be defined with the environment - variable "TYPO3_CONTEXT" which is usually set through your webserver configuration - (e.g. in htaccess).</li> - <li><strong>Image handling settings</strong> - this module detects the available image handling - tools and configures the system.</li> - <li><strong>Extbase object cache</strong> - choose between APC / Database cache backend</li> - </ul> - </p> - - <hr /> - <h4>3: All configuration</h4> - <p> - In this step you can change the configuration values of your TYPO3 CMS installation. - </p> - - <hr /> - <h4>4: Upgrade Wizard</h4> - <p> - If you upgrade your TYPO3 CMS installation from one version to another (e.g. 6.1 to 6.2), - then the Upgrade Wizards guide you through the necessary steps to upgrade your database records - or explicitly install extensions that ship with the latest TYPO3 CMS version. - </p> - - <hr /> - <h4>5: System environment</h4> - <p> - In this step your system environment is checked. If there are any settings that will prevent TYPO3 CMS from - running correctly, you'll get warnings and errors with a description of the problem. - </p> - - <hr /> - <h4>6: Folder structure</h4> - <p> - This step checks the folder structure of your TYPO3 CMS installation and fixes errors that you might have - with files or folders. - </p> - - <hr /> - <h4>7: Test setup</h4> - <p> - This gives you a set of tests for your TYPO3 CMS installation in order to test system settings: - <ul> - <li>Mail setup</li> - <li>True type font settings</li> - <li>Convert image formats to jpg</li> - <li>Writing gif and png</li> - <li>Scaling images</li> - <li>Combining images</li> - <li>GDlib</li> - </ul> - </p> - - <hr /> - <h4>8: Clean up</h4> - <p> - Here you can clean up temporary files in the typo3temp/ folder and the database tables used for - caching. Furthermore you can reset the preferences of all backend users. - </p> - <hr /> - - - <h3>Header legend</h3> - <div class="alert alert-notice"> - <h4 class="typo3-message message-notice"> - Notice! - </h4> - <p class="messageText"> - Indicates that something is important to be aware of. - <br /> - This does <em>not</em> indicate an error. - </p> - </div> - - <div class="alert alert-info"> - <h4 class="typo3-message message-information"> - Just information - </h4> - <p> - This is a simple message with some information about something. - </p> - </div> - - <div class="alert alert-success"> - <h4 class="typo3-message message-ok"> - Check was successful - </h4> - <p class="messageText"> - Indicates that something was checked and returned an expected result. - </p></div> - - <div class="alert alert-warning"><h4 class="typo3-message message-warning"> - Warning! - </h4> - <p class="messageText"> - Indicates that something may very well cause trouble - and you should definitely look into it before proceeding. - <br /> - This indicates a <em>potential</em> error. - </p></div> - - <div class="alert alert-danger"><h4 class="typo3-message message-error"> - Error! - </h4> - <p class="messageText"> - Indicates that something is definitely wrong and that TYPO3 will most - likely not perform as expected if this problem is not solved. - <br /> - This indicates an actual error. - </p></div> - <div class="row copyright"> - <hr> - <div class="panel panel-default"> - <div class="panel-body"> - <f:render partial="Action/Common/Copyright" arguments="{_all}" /> - </div> - </div> - </div> -</f:section> diff --git a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/AllConfiguration.html b/typo3/sysext/install/Resources/Private/Templates/Action/Tool/AllConfiguration.html deleted file mode 100644 index a42615d0f172d14db7b6acd8cf908c26dc617ddc..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/AllConfiguration.html +++ /dev/null @@ -1,76 +0,0 @@ -{namespace i=TYPO3\CMS\Install\ViewHelpers} - -<f:layout name="ToolAuthenticated" /> - -<f:section name="Content"> - - <f:if condition="{configurationValuesSaved}"> - <f:then> - <h1>Saved configuration values</h1> - - <f:if condition="{savedConfigurationValueMessages}"> - <f:then> - <f:for each="{savedConfigurationValueMessages}" as="statusMessage"> - <f:render partial="Action/Common/StatusMessage" arguments="{message: statusMessage}" /> - </f:for> - </f:then> - - <f:else> - <div class="typo3-message message-warning"> - <div class="header-container"> - <div class="message-header"> - No values changed - </div> - </div> - </div> - </f:else> - </f:if> - - <hr /> - - <form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <f:render partial="Action/Common/SubmitButton" arguments="{name:'continue', text:'Continue'}"/> - </form> - </f:then> - - <f:else> - <div class="fixedHead"> - <h1>Change configuration values</h1> - - <p> - Changed values are written to <code>LocalConfiguration.php</code>. The optional file <code>AdditionalConfiguration.php</code> - is not controlled by the TYPO3 CMS core and may override single settings again. Administrators - must maintain <code>AdditionalConfiguration.php</code> on their own and should use it with care. - </p> - <div class="form-group"> - <div class="input-group"> - <span class="input-group-addon">Filter by:</span> - <input type="text" class="form-control" placeholder="search setting" id="configSearch"> - </div> - </div> - </div> - - <form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <div class="panel-group" id="allConfiguration" role="tablist" aria-multiselectable="true"> - <f:for each="{data}" as="sectionData" key="sectionName"> - <f:if condition="{sectionData}"> - <f:render partial="Action/Tool/AllConfiguration/SubSection" arguments="{_all}" /> - </f:if> - </f:for> - </div> - - <div id="fixed-footer-handler"> - <div id="fixed-footer"> - <div class="footer-innerWrap"> - <f:render partial="Action/Common/SubmitButton" arguments="{name:'write', text:'Write configuration', className:'btn-save'}"/> - <span class="btn btn-default t3js-all-configuration-toggle">Toggle All</span> - </div> - </div> - </div> - </form> - </f:else> - </f:if> - -</f:section> diff --git a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/CleanUp.html b/typo3/sysext/install/Resources/Private/Templates/Action/Tool/CleanUp.html deleted file mode 100644 index 63f1aeac913e092a4d3b6132c70c0f3357fb8b20..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/CleanUp.html +++ /dev/null @@ -1,73 +0,0 @@ -{namespace i=TYPO3\CMS\Install\ViewHelpers} - -<f:layout name="ToolAuthenticated" /> - -<f:section name="Content"> - <h1>Clean up your installation</h1> - <f:for each="{actionMessages}" as="statusMessage"> - <f:render partial="Action/Common/StatusMessage" arguments="{message: statusMessage}" /> - </f:for> - - <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true"> - <div class="panel panel-default"> - <div class="panel-heading" role="tab" id="headingOne"> - <h4 class="panel-title"> - <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseOne" aria-expanded="true" aria-controls="collapseOne" class="{f:if(condition:'{postAction} == \'deleteTypo3TempFiles\'', then:'expanded', else:'collapsed')}"> - <span class="caret"></span> - Clean typo3temp/ folder - </a> - </h4> - </div> - <div id="collapseOne" class="panel-collapse collapse {f:if(condition:'{postAction} == \'deleteTypo3TempFiles\'', then:'in')}" role="tabpanel" aria-labelledby="headingOne"> - <div class="panel-body"> - <f:render partial="Action/Tool/CleanUp/Typo3TempFiles" arguments="{_all}" /> - </div> - </div> - </div> - <div class="panel panel-default"> - <div class="panel-heading" role="tab" id="headingTwo"> - <h4 class="panel-title"> - <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo" class="{f:if(condition:'{postAction} == \'clearProcessedFiles\'', then:'expanded', else:'collapsed')}"> - <span class="caret"></span> - Clear processed files - </a> - </h4> - </div> - <div id="collapseTwo" class="panel-collapse collapse {f:if(condition:'{postAction} == \'clearProcessedFiles\'', then:'in')}"" role="tabpanel" aria-labelledby="headingTwo"> - <div class="panel-body"> - <f:render partial="Action/Tool/CleanUp/ProcessedFiles" arguments="{_all}" /> - </div> - </div> - </div> - <div class="panel panel-default"> - <div class="panel-heading" role="tab" id="headingThree"> - <h4 class="panel-title"> - <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseThree" aria-expanded="false" aria-controls="collapseThree" class="{f:if(condition:'{postAction} == \'clearTables\'', then:'expanded', else:'collapsed')}"> - <span class="caret"></span> - Clear tables - </a> - </h4> - </div> - <div id="collapseThree" class="panel-collapse collapse {f:if(condition:'{postAction} == \'clearTables\'', then:'in')}"" role="tabpanel" aria-labelledby="headingThree"> - <div class="panel-body"> - <f:render partial="Action/Tool/CleanUp/ClearTables" arguments="{_all}" /> - </div> - </div> - </div> - <div class="panel panel-default"> - <div class="panel-heading" role="tab" id="headingFour"> - <h4 class="panel-title"> - <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseFour" aria-expanded="false" aria-controls="collapseFour" class="{f:if(condition:'{postAction} == \'resetBackendUserUc\'', then:'expanded', else:'collapsed')}"> - <span class="caret"></span> - Reset backend user preferences - </a> - </h4> - </div> - <div id="collapseFour" class="panel-collapse collapse {f:if(condition:'{postAction} == \'resetBackendUserUc\'', then:'in')}"" role="tabpanel" aria-labelledby="headingFour"> - <div class="panel-body"> - <f:render partial="Action/Tool/CleanUp/ResetBackendUserUc" arguments="{_all}" /> - </div> - </div> - </div> - </div> -</f:section> diff --git a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/Configuration.html b/typo3/sysext/install/Resources/Private/Templates/Action/Tool/Configuration.html deleted file mode 100644 index 645bff3c8d98eff7480f10811a5dd871f52c9e14..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/Configuration.html +++ /dev/null @@ -1,45 +0,0 @@ -{namespace i=TYPO3\CMS\Install\ViewHelpers} - -<f:layout name="ToolAuthenticated" /> - -<f:section name="Content"> - <h1>Configuration presets</h1> - - <f:for each="{actionMessages}" as="statusMessage"> - <f:render partial="Action/Common/StatusMessage" arguments="{message: statusMessage}" /> - </f:for> - - <p> - The configuration module suggests best matching configuration settings - based on your system setup. - </p> - <p> - Alternatively TYPO3 can be run in a specific <a href="https://docs.typo3.org/typo3cms/CoreApiReference/ApiOverview/Bootstrapping/Index.html#bootstrapping-context" target="_blank">application context</a>, - by setting an environment variable in the web server configuration. - The application context can then be accessed e.g. in the AdditionalConfiguration.php file or - TypoScript configuration to customize settings accordingly. - </p> - <p> - Changed values are written to <code>LocalConfiguration.php</code>. The optional file <code>AdditionalConfiguration.php</code> - is not controlled by the TYPO3 CMS core and may override single settings again. Administrators - must maintain <code>AdditionalConfiguration.php</code> on their own and should use it with care. - </p> - <form method="post" class="form-horizontal"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - - <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true"> - <f:for each="{features}" as="feature"> - <f:render partial="Action/Tool/Configuration/{feature.name}" arguments="{_all}" /> - </f:for> - </div> - - <div id="fixed-footer-handler"> - <div id="fixed-footer"> - <div class="footer-innerWrap"> - <f:render partial="Action/Common/SubmitButton" arguments="{name:'activate', text:'Activate', className:'btn-save'}"/> - </div> - </div> - </div> - - </form> -</f:section> diff --git a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/Environment.html b/typo3/sysext/install/Resources/Private/Templates/Action/Tool/Environment.html new file mode 100644 index 0000000000000000000000000000000000000000..37264f08c853842a16d6b2b2356f2e74892f9740 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Templates/Action/Tool/Environment.html @@ -0,0 +1,81 @@ +{namespace i=TYPO3\CMS\Install\ViewHelpers} + +<f:layout name="ToolAuthenticated" /> + +<f:section name="Content"> + <div> + <h1>Environment</h1> + </div> + + <f:alias map="{actions: { + 0: {partial: 'Action/Tool/Environment/SystemInformation', + require: '', + baseClass: 't3js-system', + title: 'Main System Information', + category: 'environment', + description: 'Gives a short overview of your system environment.' + }, + 1: {partial: 'Action/Tool/Environment/EnvironmentCheck', + require: 'TYPO3/CMS/Install/EnvironmentCheck', + baseClass: 't3js-environmentCheck', + title: 'Environment check', + category: 'php environment', + description: 'Perform a huge number of environment checks.' + }, + 2: {partial: 'Action/Tool/Environment/FolderStructure', + require: 'TYPO3/CMS/Install/FolderStructure', + baseClass: 't3js-folderStructure', + title: 'Check Folder Structure', + category: 'document structure', + description: 'Analyzes your folder structure by checking the permissions and whether files or folders are missing.' + }, + 3: {partial: 'Action/Tool/Environment/PhpInfo', + require: '', + baseClass: 't3js-phpinfo', + title: 'PHP Info', + category: 'environment', + description: 'Outputs a large amount of information about the current state of PHP.' + }, + 4: {partial: 'Action/Tool/Environment/MailTest', + require: 'TYPO3/CMS/Install/MailTest', + baseClass: 't3js-mailTest', + title: 'Test Mail Setup', + category: 'environment', + description: 'Checks the basic mail functionality by sending a test email.' + }, + 5: {partial: 'Action/Tool/Environment/ImageProcessing', + require: 'TYPO3/CMS/Install/ImageProcessing', + baseClass: 't3js-imageProcessing', + title: 'Image Processing', + category: 'environment', + description: 'Creates test images and compare with a reference.' + } + }}"> + <div class="gridder"> + <f:for each="{actions}" as="card" iteration="iterator"> + <div + class="gridder-list {card.baseClass}-open {f:if(condition: '{card.require}', then: 't3js-require')}" + {f:if(condition: '{card.require}', then: 'data-require="{card.require}"')} + > + <div class="gridder-item"> + <h3> + {card.title} <span class="label label-warning {card.baseClass}-badge" style="display:none"></span> + <br> + <small class="text-muted">{card.category}</small> + <br> + </h3> + <p>{card.description}</p> + </div> + </div> + <div class="gridder-content {f:if(condition: '{card.baseClass}', then: '{card.baseClass}')}"> + <div class="gridder-padding"> + <div class="gridder-title clearfix"> + <h3 class="pull-left">{card.title}</h3> + </div> + <f:render partial="{card.partial}" arguments="{_all}" /> + </div> + </div> + </f:for> + </div> + </f:alias> +</f:section> diff --git a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/ExtensionScanner.html b/typo3/sysext/install/Resources/Private/Templates/Action/Tool/ExtensionScanner.html deleted file mode 100644 index 57ba10be106b22380a3ecd38bc8b7df3a51596c0..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/ExtensionScanner.html +++ /dev/null @@ -1,105 +0,0 @@ -<f:layout name="ToolAuthenticated"/> - -<f:section name="Content"> - <div style="display:none;"> - <div id="t3js-extensionscanner-files-token">{extensionScannerFilesToken}</div> - <div id="t3js-extensionscanner-scan-file-token">{extensionScannerScanFileToken}</div> - <div id="t3js-extensionscanner-mark-fully-scanned-rest-files-token">{extensionScannerMarkFullyScannedRestFilesToken}</div> - <div id="t3js-extensionscanner-file-hit-template"> - <div class="panel panel-flat t3js-extensionscanner-hit-panel risk-medium"> - <div class="panel-heading"> - <h3 class="panel-title"> - <a href="#collapse" class="collapsed t3js-extensionscanner-hit-file-panel-head" data-toggle="collapse"> - <span class="caret"></span> - <span class="pull-right badges"></span> - <span class="t3js-extensionscanner-hit-filename file">aFile</span> - <span class="t3js-extensionscanner-hit-message message">aMessage</span> - </a> - </h3> - </div> - <div id="collapse" class="panel-collapse collapse t3js-extensionscanner-hit-file-panel-body"> - <div class="panel-body"> - <pre><strong class="t3js-extensionscanner-hit-file-line"></strong><span class="t3js-extensionscanner-hit-file-lineContent"></span></pre> - <div class="panel-group-flat t3js-extensionscanner-hit-file-rest-container"></div> - </div> - </div> - </div> - </div> - <div id="t3js-extensionscanner-file-hit-rest-template"> - <div class="panel panel-flat t3js-extensionscanner-hit-rest-panel risk-medium"> - <div class="panel-heading"> - <h3 class="panel-title"> - <a href="#collapse-rest" - class="collapsed t3js-extensionscanner-hit-rest-panel-head" - data-toggle="collapse" - > - <span class="badge pull-right">aBadge</span> - <span class="caret"></span> - <strong class="t3js-extensionscanner-hit-rest-headline">restFileHeadline</strong> - </a> - </h3> - </div> - <div id="collapse-rest" class="panel-collapse collapse t3js-extensionscanner-hit-rest-panel-body"> - <pre class="t3js-extensionscanner-hit-rest-body">restFileContent</pre> - </div> - </div> - </div> - </div> - - <h1>Extension scanner</h1> - - <p> - This module scans extensions for usage of deprecated and removed TYPO3 API calls. - The module can be a great help for extension developers and site maintainers when - upgrading to new core versions. However, the detection approach - based on static - code analysis - is limited by concept: false positives/negatives are impossible to avoid. - Further details can be found at - <a style="text-decoration: underline;" target="_blank" rel="noopener" href="https://docs.typo3.org/typo3cms/CoreApiReference/ExtensionScanner/Index.html"> - the official docs. - </a> - </p> - - <div class="progress t3js-progress-all-extension"> - <div class="progress-bar progress-bar-info" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0;"> - <span class="text-nowrap"></span> - </div> - </div> - - <button class="btn btn-default t3js-extensionscanner-scan-all" type="submit"> - Scan all - </button> - - <h2>Extensions</h2> - - <div class="panel-group panel-group-flat panel-group-scanner-extensions"> - <f:for each="{extensionsInTypo3conf}" as="extensionInTypo3conf" iteration="iterator"> - <div - class="panel panel-flat t3js-extensionscanner-extension t3js-extensionscanner-extension-{extensionInTypo3conf.filename}" - data-extension="{extensionInTypo3conf.filename}"> - <div class="panel-progress"> - <div class="panel-progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0;"><span class="sr-only"></span></div> - </div> - <div class="panel-heading alert-notice"> - <h2 class="panel-title"> - <a href="#extension-{iterator.index}" class="collapsed" data-toggle="collapse"> - <span class="caret"></span> - Extension: <strong>{extensionInTypo3conf.filename}</strong> - <span class="pull-right t3js-extensionscanner-number-of-files"></span> - </a> - </h2> - </div> - <div class="panel-collapse collapse" id="extension-{iterator.index}"> - <div class="panel-body hide t3js-extensionscanner-extension-body"></div> - <div class="panel-footer"> - <div>Effective lines of code: <span class="t3js-extensionscanner-extension-body-loc">0</span></div> - <div>Files ignored by scanner: <span class="t3js-extensionscanner-extension-body-ignored-files">0</span></div> - <div>Code lines ignored by scanner: <span class="t3js-extensionscanner-extension-body-ignored-lines">0</span></div> - <button class="btn btn-default t3js-extensionscanner-scan-single" data-extension="{extensionInTypo3conf.filename}" type="submit"> - Scanning... - </button> - </div> - </div> - </div> - </f:for> - </div> -</f:section> diff --git a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/FolderStructure.html b/typo3/sysext/install/Resources/Private/Templates/Action/Tool/FolderStructure.html deleted file mode 100644 index d971c67b3690ba0664255399bad0c22bab0034cf..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/FolderStructure.html +++ /dev/null @@ -1,41 +0,0 @@ -{namespace i=TYPO3\CMS\Install\ViewHelpers} - -<f:layout name="ToolAuthenticated" /> - -<f:section name="Content"> - <h1>Folder Structure</h1> - <p>Root Directory: <strong><i:constant name="PATH_site" /></strong></p> - - <f:if condition="{fixedStatus}"> - <hr /> - <h3>Fix action results:</h3> - <f:for each="{fixedStatus}" as="statusMessage"> - <f:render partial="Action/Common/StatusMessage" arguments="{message: statusMessage}" /> - </f:for> - </f:if> - - <f:if condition="{errorStatus}"> - <hr /> - <h3>These files or folders have errors and may be fixed automatically:</h3> - <f:for each="{errorStatus}" as="statusMessage"> - <f:render partial="Action/Common/StatusMessage" arguments="{message: statusMessage}" /> - </f:for> - <form method="post"> - <f:render partial="Action/Common/HiddenFormFields" arguments="{_all}" /> - <f:render partial="Action/Common/SubmitButton" arguments="{name:'fix', text:'Try to fix file and folder permissions'}"/> - </form> - </f:if> - - <hr /> - <h3>Default File and Directory permissions</h3> - <f:render partial="Action/Common/StatusMessage" arguments="{message: filePermissionStatus}" /> - <f:render partial="Action/Common/StatusMessage" arguments="{message: directoryPermissionStatus}" /> - - <f:if condition="{okStatus}"> - <hr /> - <h3>These structures don't need to be fixed:</h3> - <f:for each="{okStatus}" as="statusMessage"> - <f:render partial="Action/Common/StatusMessage" arguments="{message: statusMessage}" /> - </f:for> - </f:if> -</f:section> diff --git a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/ImportantActions.html b/typo3/sysext/install/Resources/Private/Templates/Action/Tool/ImportantActions.html deleted file mode 100644 index a97e8f9c19729d2679e94ac0021701794920aa50..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/ImportantActions.html +++ /dev/null @@ -1,52 +0,0 @@ -{namespace i=TYPO3\CMS\Install\ViewHelpers} - -<f:layout name="ToolAuthenticated" /> - -<f:section name="Content"> - <h1>Important actions</h1> - - <f:for each="{actionMessages}" as="statusMessage"> - <f:render partial="Action/Common/StatusMessage" arguments="{message: statusMessage}" /> - </f:for> - - <f:render partial="Action/Tool/ImportantActions/SystemInformation" arguments="{_all}" /> - <hr /> - - <f:if condition="{databaseAnalyzerSuggestion}"> - <f:then> - <f:render partial="Action/Tool/ImportantActions/DatabaseAnalyzerData" arguments="{_all}"/> - </f:then> - <f:else> - <f:render partial="Action/Tool/ImportantActions/DatabaseAnalyzerButton" arguments="{_all}"/> - </f:else> - </f:if> - <hr /> - - <f:render partial="Action/Tool/ImportantActions/ClearAllCache" arguments="{_all}"/> - <hr /> - - <f:if condition="{composerMode}"> - <f:else> - <f:render partial="Action/Tool/ImportantActions/DumpAutoload" arguments="{_all}"/> - <hr /> - </f:else> - </f:if> - - <f:render partial="Action/Tool/ImportantActions/ExtensionCompatibilityTester" arguments="{_all}"/> - <hr /> - - <f:render partial="Action/Tool/ImportantActions/TcaMigrationsCheck" arguments="{_all}"/> - <hr /> - - <f:render partial="Action/Tool/ImportantActions/TcaExtTablesCheck" arguments="{_all}"/> - <hr /> - - <f:render partial="Action/Tool/ImportantActions/CoreUpdateButton" arguments="{_all}"/> - <hr /> - - <f:render partial="Action/Tool/ImportantActions/NewInstallToolPassword" arguments="{_all}"/> - <hr /> - - <f:render partial="Action/Tool/ImportantActions/CreateAdministrator" arguments="{_all}"/> - -</f:section> diff --git a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/LoadExtensions.html b/typo3/sysext/install/Resources/Private/Templates/Action/Tool/LoadExtensions.html deleted file mode 100644 index 2aba342ce63489d0ea734e76c8e2b8e202633944..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/LoadExtensions.html +++ /dev/null @@ -1,29 +0,0 @@ -<f:layout name="ToolAuthenticated" /> - -<f:section name="Content"> - <h1>Load extension configuration</h1> - - <f:for each="{actionMessages}" as="statusMessage"> - <f:render partial="Action/Common/StatusMessage" arguments="{message: statusMessage}" /> - </f:for> - - <p> - The system detected a fatal error during script execution and redirected to this module. - Your loaded extensions are now checked for possible problems. After incompatible extensions - are unloaded, you can restart the initial action to proceed your request. - </p> - - <f:render partial="Action/Tool/ImportantActions/LastError" arguments="{lastError: lastError}"/> - - <hr /> - <f:render partial="Action/Tool/ImportantActions/ExtensionCompatibilityTester" arguments="{_all}"/> - <script type="text/javascript"> - $(function() { - var $container = $('.t3js-checkExtensions'); - $('button', $container).hide(); - $('.t3js-message', $container).hide(); - $('.alert-loading', $container).show(); - TYPO3.Install.ExtensionChecker.checkExtensionsCompatibility(true); - }); - </script> -</f:section> diff --git a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/Maintenance.html b/typo3/sysext/install/Resources/Private/Templates/Action/Tool/Maintenance.html new file mode 100644 index 0000000000000000000000000000000000000000..5d9cc8681688a720d6446b123ef5f15824a73a6e --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Templates/Action/Tool/Maintenance.html @@ -0,0 +1,88 @@ +{namespace i=TYPO3\CMS\Install\ViewHelpers} + +<f:layout name="ToolAuthenticated" /> + +<f:section name="Content"> + <div> + <h1>Maintenance</h1> + </div> + + <f:alias map="{actions: { + 0: {partial: 'Action/Tool/Maintenance/ClearAllCache', + require: 'TYPO3/CMS/Install/Cache', + baseClass: 't3js-clearAllCache', + title: 'Clear all cache', + category: 'Caching', + description: 'Clears all cache. Including Frontend, backend and language caches.' + }, + 1: {partial: 'Action/Tool/Maintenance/ClearTypo3tempFiles', + require: 'TYPO3/CMS/Install/ClearTypo3tempFiles', + baseClass: 't3js-clearTypo3temp', + title: 'Clean typo3temp/assets/', + category: 'Caching', + description: 'Clears temporary files in typo3temp/assets/ folder, including processed and cached images.' + }, + 2: {partial: 'Action/Tool/Maintenance/DumpAutoload', + require: 'TYPO3/CMS/Install/DumpAutoload', + baseClass: 't3js-dumpAutoload', + title: 'Dump Autoload Information', + category: 'Caching', + description: 'This (re-)dumps autoload information for all active third party extensions.' + }, + 3: {partial: 'Action/Tool/Maintenance/DatabaseAnalyzer', + require: 'TYPO3/CMS/Install/DatabaseAnalyzer', + baseClass: 't3js-databaseAnalyzer', + title: 'Database analyzer', + category: 'Database', + description: 'Verify and update database status.' + }, + 4: {partial: 'Action/Tool/Maintenance/ClearTables', + require: 'TYPO3/CMS/Install/ClearTable', + baseClass: 't3js-clearTable', + title: 'Clear Tables', + category: 'Database', + description: 'Clears semi-temporary data from database tables.' + }, + 5: {partial: 'Action/Tool/Maintenance/CreateAdmin', + require: 'TYPO3/CMS/Install/CreateAdmin', + baseClass: 't3js-createAdmin', + title: 'Create Admin', + category: 'Backend Users', + description: 'Creates a backend administrator user.' + }, + 6: {partial: 'Action/Tool/Maintenance/ResetBackendUserUc', + require: 'TYPO3/CMS/Install/ResetBackendUserUc', + baseClass: 't3js-resetBackendUserUc', + title: 'Reset User Preferences', + category: 'Backend Users', + description: 'Reset backend user preferences to defaults.' + } + }}"> + <div class="gridder"> + <f:for each="{actions}" as="card" iteration="iterator"> + <div + class="gridder-list {card.baseClass}-open {f:if(condition: '{card.require}', then: 't3js-require')}" + {f:if(condition: '{card.require}', then: 'data-require="{card.require}"')} + > + <div class="gridder-item"> + <h3> + {card.title} <span class="label label-warning {card.baseClass}-badge" style="display:none"></span> + <br> + <small class="text-muted">{card.category}</small> + <br> + </h3> + <p>{card.description}</p> + </div> + </div> + <div class="gridder-content {f:if(condition: '{card.baseClass}', then: '{card.baseClass}')}"> + <div class="gridder-padding"> + <div class="gridder-title clearfix"> + <h3 class="pull-left">{card.title}</h3> + </div> + <f:render partial="{card.partial}" arguments="{_all}" /> + </div> + </div> + </f:for> + </div> + </f:alias> +</f:section> diff --git a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/Settings.html b/typo3/sysext/install/Resources/Private/Templates/Action/Tool/Settings.html new file mode 100644 index 0000000000000000000000000000000000000000..55750a39e2fda9bbfaa1ea74b8a5ab505b178d47 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Templates/Action/Tool/Settings.html @@ -0,0 +1,63 @@ +{namespace i=TYPO3\CMS\Install\ViewHelpers} + +<f:layout name="ToolAuthenticated" /> + +<f:section name="Content"> + <div> + <h1>Settings</h1> + </div> + + <f:alias map="{actions: { + 0: {partial: 'Action/Tool/Settings/ChangeInstallToolPassword', + require: 'TYPO3/CMS/Install/ChangeInstallToolPassword', + baseClass: 't3js-changeInstallToolPassword', + title: 'Change install tool password', + category: 'Access', + description: 'Set a new install tool password.' + }, + 1: {partial: 'Action/Tool/Settings/LocalConfiguration', + require: 'TYPO3/CMS/Install/LocalConfiguration', + baseClass: 't3js-localConfiguration', + title: 'Configure Global Settings', + category: 'LocalConfiguration', + description: 'Modify LocalConfiguration.php settings.' + }, + 2: {partial: 'Action/Tool/Settings/Presets', + require: 'TYPO3/CMS/Install/Presets', + baseClass: 't3js-presets', + title: 'Configure Presets', + category: 'LocalConfiguration', + description: 'Detect and select default LocalConfiguration.php settings.' + } + }}"> + <div class="gridder"> + <f:for each="{actions}" as="card" iteration="iterator"> + <div + class="gridder-list {card.baseClass}-open {f:if(condition: '{card.require}', then: 't3js-require')}" + {f:if(condition: '{card.require}', then: 'data-require="{card.require}"')} + > + <div class="gridder-item"> + <h3> + {card.title} <span class="label label-warning {card.baseClass}-badge" style="display:none"></span> + <br> + <small class="text-muted">{card.category}</small> + <br> + </h3> + <p>{card.description}</p> + </div> + </div> + <div class="gridder-content {f:if(condition: '{card.baseClass}', then: '{card.baseClass}')}"> + <div class="gridder-padding"> + <div class="gridder-title clearfix"> + <h3 class="pull-left">{card.title}</h3> + </div> + <f:render partial="{card.partial}" arguments="{_all}" /> + </div> + </div> + </f:for> + </div> + </f:alias> +</f:section> + + + diff --git a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/SystemEnvironment.html b/typo3/sysext/install/Resources/Private/Templates/Action/Tool/SystemEnvironment.html deleted file mode 100644 index 666f88e9e88ad0ef7a340ef7db57ca7cfb989b25..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/SystemEnvironment.html +++ /dev/null @@ -1,25 +0,0 @@ -{namespace i=TYPO3\CMS\Install\ViewHelpers} - -<f:layout name="ToolAuthenticated" /> - -<f:section name="Content"> - <h1>System environment check</h1> - - <f:for each="{statusObjectsBySeverity}" as="statusMessages"> - <f:for each="{statusMessages}" as="statusMessage"> - <f:render partial="Action/Common/StatusMessage" arguments="{message: statusMessage}" /> - </f:for> - </f:for> - - <a class="btn btn-default collapsed" role="button" data-toggle="collapse" href="#phpinfo" aria-expanded="false"> - <span class="caret"></span> - Show PHP Info - </a> - <div class="collapse" id="phpinfo"> - <div class="panel panel-default"> - <div class="panel-body"> - <i:phpInfo /> - </div> - </div> - </div> -</f:section> diff --git a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/TestSetup.html b/typo3/sysext/install/Resources/Private/Templates/Action/Tool/TestSetup.html deleted file mode 100644 index b30be40a7854c861e92d7f2acf8f0589b4989bbd..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/TestSetup.html +++ /dev/null @@ -1,117 +0,0 @@ -{namespace i=TYPO3\CMS\Install\ViewHelpers} - -<f:layout name="ToolAuthenticated" /> - -<f:section name="Content"> - <h1>Test system settings</h1> - <f:for each="{actionMessages}" as="statusMessage"> - <f:render partial="Action/Common/StatusMessage" arguments="{message: statusMessage}" /> - </f:for> - <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true"> - <div class="panel panel-default"> - <div class="panel-heading" role="tab" id="headingOne"> - <h4 class="panel-title"> - <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseOne" aria-expanded="true" aria-controls="collapseOne" class="{f:if(condition:'{postAction} == \'testMail\'', then:'expanded', else:'collapsed')}"> - <span class="caret"></span> - Mail setup - </a> - </h4> - </div> - <div id="collapseOne" class="panel-collapse collapse {f:if(condition:'{postAction} == \'testMail\'', then:'in')}" role="tabpanel" aria-labelledby="headingOne"> - <div class="panel-body"> - <f:render partial="Action/Tool/TestSetup/Mail" arguments="{_all}" /> - </div> - </div> - </div> - <div class="panel panel-default"> - <div class="panel-heading" role="tab" id="headingTwo"> - <h4 class="panel-title"> - <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseTwo" aria-expanded="true" aria-controls="collapseTwo" class="{f:if(condition:'{trueTypeFontTested}', then:'expanded', else:'collapsed')}"> - <span class="caret"></span> - True type font settings - </a> - </h4> - </div> - <div id="collapseTwo" class="panel-collapse collapse {f:if(condition:'{trueTypeFontTested}', then:'in')}" role="tabpanel" aria-labelledby="headingTwo"> - <div class="panel-body"> - <f:render partial="Action/Tool/TestSetup/TrueTypeFont" arguments="{_all}" /> - </div> - </div> - </div> - <div class="panel panel-default"> - <div class="panel-heading" role="tab" id="headingThree"> - <h4 class="panel-title"> - <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseThree" aria-expanded="true" aria-controls="collapseThree" class="{f:if(condition:'{convertImageFormatsToJpgTested}', then:'expanded', else:'collapsed')}"> - <span class="caret"></span> - Convert image formats to jpg - </a> - </h4> - </div> - <div id="collapseThree" class="panel-collapse collapse {f:if(condition:'{convertImageFormatsToJpgTested}', then:'in')}" role="tabpanel" aria-labelledby="headingThree"> - <div class="panel-body"> - <f:render partial="Action/Tool/TestSetup/ConvertImageFormatsToJpg" arguments="{_all}" /> - </div> - </div> - </div> - <div class="panel panel-default"> - <div class="panel-heading" role="tab" id="headingFour"> - <h4 class="panel-title"> - <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseFour" aria-expanded="true" aria-controls="collapseFour" class="{f:if(condition:'{writeGifAndPngTested}', then:'expanded', else:'collapsed')}"> - <span class="caret"></span> - Writing gif and png - </a> - </h4> - </div> - <div id="collapseFour" class="panel-collapse collapse {f:if(condition:'{writeGifAndPngTested}', then:'in')}" role="tabpanel" aria-labelledby="headingFour"> - <div class="panel-body"> - <f:render partial="Action/Tool/TestSetup/WriteGifAndPng" arguments="{_all}" /> - </div> - </div> - </div> - <div class="panel panel-default"> - <div class="panel-heading" role="tab" id="headingFive"> - <h4 class="panel-title"> - <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseFive" aria-expanded="true" aria-controls="collapseFive" class="{f:if(condition:'{scalingImagesTested}', then:'expanded', else:'collapsed')}"> - <span class="caret"></span> - Scaling images - </a> - </h4> - </div> - <div id="collapseFive" class="panel-collapse collapse {f:if(condition:'{scalingImagesTested}', then:'in')}" role="tabpanel" aria-labelledby="headingFive"> - <div class="panel-body"> - <f:render partial="Action/Tool/TestSetup/ScalingImages" arguments="{_all}" /> - </div> - </div> - </div> - <div class="panel panel-default"> - <div class="panel-heading" role="tab" id="headingSix"> - <h4 class="panel-title"> - <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseSix" aria-expanded="true" aria-controls="collapseSix" class="{f:if(condition:'{combiningImagesTested}', then:'expanded', else:'collapsed')}"> - <span class="caret"></span> - Combining images - </a> - </h4> - </div> - <div id="collapseSix" class="panel-collapse collapse {f:if(condition:'{combiningImagesTested}', then:'in')}" role="tabpanel" aria-labelledby="headingSix"> - <div class="panel-body"> - <f:render partial="Action/Tool/TestSetup/CombiningImages" arguments="{_all}" /> - </div> - </div> - </div> - <div class="panel panel-default"> - <div class="panel-heading" role="tab" id="headingSeven"> - <h4 class="panel-title"> - <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseSeven" aria-expanded="true" aria-controls="collapseSeven" class="{f:if(condition:'{gdlibTested}', then:'expanded', else:'collapsed')}"> - <span class="caret"></span> - GDlib - </a> - </h4> - </div> - <div id="collapseSeven" class="panel-collapse collapse {f:if(condition:'{gdlibTested}', then:'in')}" role="tabpanel" aria-labelledby="headingSeven"> - <div class="panel-body"> - <f:render partial="Action/Tool/TestSetup/Gdlib" arguments="{_all}" /> - </div> - </div> - </div> - </div> -</f:section> diff --git a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/Upgrade.html b/typo3/sysext/install/Resources/Private/Templates/Action/Tool/Upgrade.html new file mode 100644 index 0000000000000000000000000000000000000000..4b4279c99d78538075506ecb65b08a3c495f4601 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Templates/Action/Tool/Upgrade.html @@ -0,0 +1,88 @@ +{namespace i=TYPO3\CMS\Install\ViewHelpers} + +<f:layout name="ToolAuthenticated" /> + +<f:section name="Content"> + <div> + <h1>Upgrade</h1> + </div> + + <f:alias map="{actions: { + 0: {partial: 'Action/Tool/Upgrade/CoreUpdate', + require: 'TYPO3/CMS/Install/CoreUpdate', + baseClass: 't3js-coreUpdate', + title: 'Update Core', + category: 'upgrade', + description: 'One click core updater.' + }, + 1: {partial: 'Action/Tool/Upgrade/UpgradeWizards', + require: 'TYPO3/CMS/Install/UpgradeWizards', + baseClass: 't3js-upgradeWizards', + title: 'Upgrade Wizard', + category: 'upgrade', + description: 'Execute upgrade wizards after core upgrades.' + }, + 2: {partial: 'Action/Tool/Upgrade/UpgradeDocs', + require: 'TYPO3/CMS/Install/UpgradeDocs', + baseClass: 't3js-upgradeDocs', + title: 'Upgrade Documentation', + category: 'upgrade', + description: 'Show documentation files describing important changes.' + }, + 3: {partial: 'Action/Tool/Upgrade/TcaExtTablesCheck', + require: 'TYPO3/CMS/Install/TcaExtTablesCheck', + baseClass: 't3js-tcaExtTablesCheck', + title: 'Check TCA in ext_tables.php', + category: 'tca', + description: 'Test if extensions still change TCA in ext_tables.php files' + }, + 4: {partial: 'Action/Tool/Upgrade/CheckForBrokenExtensions', + require: 'TYPO3/CMS/Install/CheckForBrokenExtensions', + baseClass: 't3js-checkForBrokenExtensions', + title: 'Check for broken extensions', + category: 'extension', + description: 'Check if loaded extensions main files can be included without errors.' + }, + 5: {partial: 'Action/Tool/Upgrade/TcaMigrationsCheck', + require: 'TYPO3/CMS/Install/TcaMigrationsCheck', + baseClass: 't3js-tcaMigrationsCheck', + title: 'Check TCA migrations', + category: 'tca', + description: 'Check for needed TCA migrations.' + }, + 6: {partial: 'Action/Tool/Upgrade/ExtensionScanner', + require: 'TYPO3/CMS/Install/ExtensionScanner', + baseClass: 't3js-extensionScanner', + title: 'Extension scanner', + category: 'extension', + description: 'Scan extensions for usage of deprecated and breaking core API.' + } + }}"> + <div class="gridder"> + <f:for each="{actions}" as="card" iteration="iterator"> + <div + class="gridder-list {card.baseClass}-open {f:if(condition: '{card.require}', then: 't3js-require')}" + {f:if(condition: '{card.require}', then: 'data-require="{card.require}"')} + > + <div class="gridder-item"> + <h3> + {card.title} <span class="label label-warning {card.baseClass}-badge" style="display:none"></span> + <br> + <small class="text-muted">{card.category}</small> + <br> + </h3> + <p>{card.description}</p> + </div> + </div> + <div class="gridder-content {f:if(condition: '{card.baseClass}', then: '{card.baseClass}')}"> + <div class="gridder-padding"> + <div class="gridder-title clearfix"> + <h3 class="pull-left">{card.title}</h3> + </div> + <f:render partial="{card.partial}" arguments="{_all}" /> + </div> + </div> + </f:for> + </div> + </f:alias> +</f:section> diff --git a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/UpgradeAnalysis.html b/typo3/sysext/install/Resources/Private/Templates/Action/Tool/UpgradeAnalysis.html deleted file mode 100644 index d549fece643888195d3f1593aaa188bf081b8c3d..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/UpgradeAnalysis.html +++ /dev/null @@ -1,34 +0,0 @@ -<f:layout name="ToolAuthenticated"/> - -<f:section name="Content"> - <h1>Upgrade Analysis</h1> - <div class="row"> - <div class="col-md-12"> - <div class="form-group"> - <div class="input-group"> - <span class="input-group-addon">Search:</span> - <input type="text" class="form-control t3js-fulltext-search" placeholder="search setting"> - </div> - </div> - </div> - </div> - <div class="row"> - <div class="col-md-12"> - <div class="form-group"> - <div class="input-group"> - <span class="input-group-addon">Filter by:</span> - <select class="chosen-select t3js-chosen-select" data-placeholder="" style="width:100%;" multiple tabindex="" id="tagsort_tags_container"> - - </select> - </div> - </div> - </div> - </div> - - <div class="t3js-filterManager"></div> - <div id="upgradeAnalysis_output"> - <f:render partial="Action/Tool/UpgradeAnalysis/ListDocumentation" section="Main" arguments="{_all}"/> - </div> - <span id="saveIgnoredItemsToken" style="display:none;">{saveIgnoredItemsToken}</span> - <span id="removeIgnoredItemsToken" style="display:none;">{removeIgnoredItemsToken}</span> -</f:section> diff --git a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/UpgradeWizard.html b/typo3/sysext/install/Resources/Private/Templates/Action/Tool/UpgradeWizard.html deleted file mode 100644 index 0c9f02e08d1cb32ed5e2354d0427ef06030594c9..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Private/Templates/Action/Tool/UpgradeWizard.html +++ /dev/null @@ -1,24 +0,0 @@ -{namespace i=TYPO3\CMS\Install\ViewHelpers} - -<f:layout name="ToolAuthenticated" /> - -<f:section name="Content"> - <h1>Upgrade Wizard</h1> - - <f:for each="{actionMessages}" as="statusMessage"> - <f:render partial="Action/Common/StatusMessage" arguments="{message: statusMessage}" /> - </f:for> - - <f:if condition="{updateAction} == 'listUpdates'"> - <f:render partial="Action/Tool/UpgradeWizard/ListUpdates" arguments="{_all}" /> - </f:if> - - <f:if condition="{updateAction} == 'getUserInput'"> - <f:render partial="Action/Tool/UpgradeWizard/GetUserInput" arguments="{_all}" /> - </f:if> - - <f:if condition="{updateAction} == 'performUpdate'"> - <f:render partial="Action/Tool/UpgradeWizard/PerformUpdate" arguments="{_all}" /> - </f:if> - -</f:section> diff --git a/typo3/sysext/install/Resources/Public/Css/install.css b/typo3/sysext/install/Resources/Public/Css/install.css index 3239831e0d102825880ed78742a4efbb25288da2..78db97d03c01341cb5a58648c71e1aec28279cb4 100644 --- a/typo3/sysext/install/Resources/Public/Css/install.css +++ b/typo3/sysext/install/Resources/Public/Css/install.css @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -@charset "UTF-8";hr,img{border:0}.fa-ul>li,sub,sup{position:relative}.fa-fw,.fa-li{text-align:center}.img-responsive,.img-thumbnail,.table,label{max-width:100%}.btn,.modulemenu .modulemenu-group-header{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}.fa,.fa-stack{display:inline-block}a:active,a:hover{outline:0}b,optgroup,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{background:#ff0;color:#000}.btn,.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active,.btn.active,.btn:active,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover,.form-control,.open>.btn-danger.dropdown-toggle,.open>.btn-default.dropdown-toggle,.open>.btn-info.dropdown-toggle,.open>.btn-success.dropdown-toggle,.open>.btn-warning.dropdown-toggle{background-image:none}sub,sup{font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}hr{box-sizing:content-box;height:0}pre,textarea{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}.fa.fa-pull-left,.fa.pull-left{margin-right:.3em}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}td,th{padding:0}@font-face{font-family:FontAwesome;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.eot?v=4.7.0);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.eot?#iefix&v=4.7.0) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.woff2?v=4.7.0) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.woff?v=4.7.0) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.ttf?v=4.7.0) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa{font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-stack,img{vertical-align:middle}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa.fa-pull-right,.fa.pull-right{margin-left:.3em}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{position:relative;width:2em;height:2em;line-height:2em}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:"ï€"}.fa-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:"ï€"}.fa-search-plus:before{content:""}.fa-search-minus:before{content:"ï€"}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:"ï€"}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before{content:"ï€"}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:"ï€"}.fa-map-marker:before{content:"ï"}.fa-adjust:before{content:"ï‚"}.fa-tint:before{content:"ïƒ"}.fa-edit:before,.fa-pencil-square-o:before{content:"ï„"}.fa-share-square-o:before{content:"ï…"}.fa-check-square-o:before{content:"ï†"}.fa-arrows:before{content:"ï‡"}.fa-step-backward:before{content:"ïˆ"}.fa-fast-backward:before{content:"ï‰"}.fa-backward:before{content:"ïŠ"}.fa-play:before{content:"ï‹"}.fa-pause:before{content:"ïŒ"}.fa-stop:before{content:"ï"}.fa-forward:before{content:"ïŽ"}.fa-fast-forward:before{content:"ï"}.fa-step-forward:before{content:"ï‘"}.fa-eject:before{content:"ï’"}.fa-chevron-left:before{content:"ï“"}.fa-chevron-right:before{content:"ï”"}.fa-plus-circle:before{content:"ï•"}.fa-minus-circle:before{content:"ï–"}.fa-times-circle:before{content:"ï—"}.fa-check-circle:before{content:"ï˜"}.fa-question-circle:before{content:"ï™"}.fa-info-circle:before{content:"ïš"}.fa-crosshairs:before{content:"ï›"}.fa-times-circle-o:before{content:"ïœ"}.fa-check-circle-o:before{content:"ï"}.fa-ban:before{content:"ïž"}.fa-arrow-left:before{content:"ï "}.fa-arrow-right:before{content:"ï¡"}.fa-arrow-up:before{content:"ï¢"}.fa-arrow-down:before{content:"ï£"}.fa-mail-forward:before,.fa-share:before{content:"ï¤"}.fa-expand:before{content:"ï¥"}.fa-compress:before{content:"ï¦"}.fa-plus:before{content:"ï§"}.fa-minus:before{content:"ï¨"}.fa-asterisk:before{content:"ï©"}.fa-exclamation-circle:before{content:"ïª"}.fa-gift:before{content:"ï«"}.fa-leaf:before{content:"ï¬"}.fa-fire:before{content:"ï"}.fa-eye:before{content:"ï®"}.fa-eye-slash:before{content:"ï°"}.fa-exclamation-triangle:before,.fa-warning:before{content:"ï±"}.fa-plane:before{content:"ï²"}.fa-calendar:before{content:"ï³"}.fa-random:before{content:"ï´"}.fa-comment:before{content:"ïµ"}.fa-magnet:before{content:"ï¶"}.fa-chevron-up:before{content:"ï·"}.fa-chevron-down:before{content:"ï¸"}.fa-retweet:before{content:"ï¹"}.fa-shopping-cart:before{content:"ïº"}.fa-folder:before{content:"ï»"}.fa-folder-open:before{content:"ï¼"}.fa-arrows-v:before{content:"ï½"}.fa-arrows-h:before{content:"ï¾"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"ï‚€"}.fa-twitter-square:before{content:"ï‚"}.fa-facebook-square:before{content:"ï‚‚"}.fa-camera-retro:before{content:""}.fa-key:before{content:"ï‚„"}.fa-cogs:before,.fa-gears:before{content:"ï‚…"}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:"ï‚Š"}.fa-sign-out:before{content:"ï‚‹"}.fa-linkedin-square:before{content:"ï‚Œ"}.fa-thumb-tack:before{content:"ï‚"}.fa-external-link:before{content:"ï‚Ž"}.fa-sign-in:before{content:"ï‚"}.fa-trophy:before{content:"ï‚‘"}.fa-github-square:before{content:"ï‚’"}.fa-upload:before{content:"ï‚“"}.fa-lemon-o:before{content:"ï‚”"}.fa-phone:before{content:"ï‚•"}.fa-square-o:before{content:"ï‚–"}.fa-bookmark-o:before{content:"ï‚—"}.fa-phone-square:before{content:""}.fa-twitter:before{content:"ï‚™"}.fa-facebook-f:before,.fa-facebook:before{content:"ï‚š"}.fa-github:before{content:"ï‚›"}.fa-unlock:before{content:"ï‚œ"}.fa-credit-card:before{content:"ï‚"}.fa-feed:before,.fa-rss:before{content:"ï‚ž"}.fa-hdd-o:before{content:"ï‚ "}.fa-bullhorn:before{content:"ï‚¡"}.fa-bell:before{content:""}.fa-certificate:before{content:"ï‚£"}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:"ï‚¥"}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before{content:""}.fa-arrow-circle-right:before{content:"ï‚©"}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:"ï‚«"}.fa-globe:before{content:""}.fa-wrench:before{content:"ï‚"}.fa-tasks:before{content:"ï‚®"}.fa-filter:before{content:"ï‚°"}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before{content:"ïƒ"}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:"ïƒ"}.fa-table:before{content:""}.fa-magic:before{content:"ïƒ"}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:"ïƒ"}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:"ïƒ "}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:"ïƒ"}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:"ï‚¢"}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:"ï„€"}.fa-angle-double-right:before{content:"ï„"}.fa-angle-double-up:before{content:"ï„‚"}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:"ï„„"}.fa-angle-right:before{content:"ï„…"}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:"ï„Š"}.fa-mobile-phone:before,.fa-mobile:before{content:"ï„‹"}.fa-circle-o:before{content:"ï„Œ"}.fa-quote-left:before{content:"ï„"}.fa-quote-right:before{content:"ï„Ž"}.fa-spinner:before{content:"ï„"}.fa-circle:before{content:"ï„‘"}.fa-mail-reply:before,.fa-reply:before{content:"ï„’"}.fa-github-alt:before{content:"ï„“"}.fa-folder-o:before{content:"ï„”"}.fa-folder-open-o:before{content:"ï„•"}.fa-smile-o:before{content:""}.fa-frown-o:before{content:"ï„™"}.fa-meh-o:before{content:"ï„š"}.fa-gamepad:before{content:"ï„›"}.fa-keyboard-o:before{content:"ï„œ"}.fa-flag-o:before{content:"ï„"}.fa-flag-checkered:before{content:"ï„ž"}.fa-terminal:before{content:"ï„ "}.fa-code:before{content:"ï„¡"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"ï„¢"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"ï„£"}.fa-location-arrow:before{content:""}.fa-crop:before{content:"ï„¥"}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:"ï„©"}.fa-exclamation:before{content:""}.fa-superscript:before{content:"ï„«"}.fa-subscript:before{content:""}.fa-eraser:before{content:"ï„"}.fa-puzzle-piece:before{content:"ï„®"}.fa-microphone:before{content:"ï„°"}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:"ï„´"}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:"ï„·"}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:"ï„»"}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:"ï…€"}.fa-ellipsis-h:before{content:"ï…"}.fa-ellipsis-v:before{content:"ï…‚"}.fa-rss-square:before{content:"ï…ƒ"}.fa-play-circle:before{content:"ï…„"}.fa-ticket:before{content:"ï……"}.fa-minus-square:before{content:"ï…†"}.fa-minus-square-o:before{content:"ï…‡"}.fa-level-up:before{content:"ï…ˆ"}.fa-level-down:before{content:"ï…‰"}.fa-check-square:before{content:"ï…Š"}.fa-pencil-square:before{content:"ï…‹"}.fa-external-link-square:before{content:"ï…Œ"}.fa-share-square:before{content:"ï…"}.fa-compass:before{content:"ï…Ž"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"ï…"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"ï…‘"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"ï…’"}.fa-eur:before,.fa-euro:before{content:"ï…“"}.fa-gbp:before{content:"ï…”"}.fa-dollar:before,.fa-usd:before{content:"ï…•"}.fa-inr:before,.fa-rupee:before{content:"ï…–"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"ï…—"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"ï…˜"}.fa-krw:before,.fa-won:before{content:"ï…™"}.fa-bitcoin:before,.fa-btc:before{content:"ï…š"}.fa-file:before{content:"ï…›"}.fa-file-text:before{content:"ï…œ"}.fa-sort-alpha-asc:before{content:"ï…"}.fa-sort-alpha-desc:before{content:"ï…ž"}.fa-sort-amount-asc:before{content:"ï… "}.fa-sort-amount-desc:before{content:"ï…¡"}.fa-sort-numeric-asc:before{content:"ï…¢"}.fa-sort-numeric-desc:before{content:"ï…£"}.fa-thumbs-up:before{content:"ï…¤"}.fa-thumbs-down:before{content:"ï…¥"}.fa-youtube-square:before{content:"ï…¦"}.fa-youtube:before{content:"ï…§"}.fa-xing:before{content:"ï…¨"}.fa-xing-square:before{content:"ï…©"}.fa-youtube-play:before{content:"ï…ª"}.fa-dropbox:before{content:"ï…«"}.fa-stack-overflow:before{content:"ï…¬"}.fa-instagram:before{content:"ï…"}.fa-flickr:before{content:"ï…®"}.fa-adn:before{content:"ï…°"}.fa-bitbucket:before{content:"ï…±"}.fa-bitbucket-square:before{content:"ï…²"}.fa-tumblr:before{content:"ï…³"}.fa-tumblr-square:before{content:"ï…´"}.fa-long-arrow-down:before{content:"ï…µ"}.fa-long-arrow-up:before{content:"ï…¶"}.fa-long-arrow-left:before{content:"ï…·"}.fa-long-arrow-right:before{content:"ï…¸"}.fa-apple:before{content:"ï…¹"}.fa-windows:before{content:"ï…º"}.fa-android:before{content:"ï…»"}.fa-linux:before{content:"ï…¼"}.fa-dribbble:before{content:"ï…½"}.fa-skype:before{content:"ï…¾"}.fa-foursquare:before{content:""}.fa-trello:before{content:"ï†"}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:"ï†"}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:"ï†"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:"ï†"}.fa-yahoo:before{content:""}.fa-google:before{content:"ï† "}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:"ï†"}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:"ï‡"}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"ï‡"}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"ï‡"}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:"ï‡"}.fa-sliders:before{content:""}.fa-share-alt:before{content:"ï‡ "}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:"ï‡"}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:"ïˆ"}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:"ïˆ"}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:"ïˆ"}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:"ïˆ"}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:"ïˆ"}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"ï‰"}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:"ï‰"}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:"ï‰"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:"ï‰"}.fa-creative-commons:before{content:""}.fa-gg:before{content:"ï‰ "}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:"ï‰"}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:"ïŠ"}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:"ïŠ"}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:"ïŠ"}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:"ïŠ"}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:"ïŠ "}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:"ïŠ"}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:"ï‹€"}.fa-id-badge:before{content:"ï‹"}.fa-drivers-license:before,.fa-id-card:before{content:"ï‹‚"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:"ï‹„"}.fa-free-code-camp:before{content:"ï‹…"}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"ï‹Š"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"ï‹‹"}.fa-shower:before{content:"ï‹Œ"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"ï‹"}.fa-podcast:before{content:"ï‹Ž"}.fa-window-maximize:before{content:"ï‹"}.fa-window-minimize:before{content:"ï‹‘"}.fa-window-restore:before{content:"ï‹’"}.fa-times-rectangle:before,.fa-window-close:before{content:"ï‹“"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"ï‹”"}.fa-bandcamp:before{content:"ï‹•"}.fa-grav:before{content:"ï‹–"}.fa-etsy:before{content:"ï‹—"}.fa-imdb:before{content:""}.fa-ravelry:before{content:"ï‹™"}.fa-eercast:before{content:"ï‹š"}.fa-microchip:before{content:"ï‹›"}.fa-snowflake-o:before{content:"ï‹œ"}.fa-superpowers:before{content:"ï‹"}.fa-wpexplorer:before{content:"ï‹ž"}.fa-meetup:before{content:"ï‹ "}@font-face{font-family:Share;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bold-webfont.eot);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bold-webfont.eot?#iefix) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bold-webfont.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bold-webfont.ttf) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bold-webfont.svg#Share-BoldRegular) format("svg");font-weight:700;font-style:normal}@font-face{font-family:Share;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-italic-webfont.eot);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-italic-webfont.eot?#iefix) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-italic-webfont.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-italic-webfont.ttf) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-italic-webfont.svg#Share-ItalicRegular) format("svg");font-weight:400;font-style:italic}@font-face{font-family:Share;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-regular-webfont.eot);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-regular-webfont.eot?#iefix) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-regular-webfont.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-regular-webfont.ttf) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-regular-webfont.svg#Share-Regular) format("svg");font-weight:400;font-style:normal}@font-face{font-family:Share;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bolditalic-webfont.eot);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bolditalic-webfont.eot?#iefix) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bolditalic-webfont.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bolditalic-webfont.ttf) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bolditalic-webfont.svg#Share-BoldItalicRegular) format("svg");font-weight:700;font-style:italic}*,:after,:before{box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;line-height:1.5;color:#000;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{background-color:transparent;color:#212424;text-decoration:none}a:focus,a:hover{color:#000;text-decoration:underline}a:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}figure{margin:0}.img-responsive{display:block;height:auto}.img-rounded{border-radius:2px}.img-thumbnail{padding:4px;line-height:1.5;background-color:#fff;border:1px solid #ddd;border-radius:2px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;height:auto}.img-circle{border-radius:50%}hr{margin-top:18px;margin-bottom:18px;border-top:1px solid #7a7a7a}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#737373}.h1,.h2,.h3,h1,h2,h3{margin-top:18px;margin-bottom:9px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:9px;margin-bottom:9px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:27px}.h2,h2{font-size:19px}.h3,h3{font-size:17px}.h4,h4{font-size:15px}.h5,h5{font-size:12px}.h6,h6{font-size:11px}p{margin:0 0 9px}.lead{margin-bottom:18px;font-size:13px;font-weight:300;line-height:1.4}dt,kbd kbd,label{font-weight:700}@media (min-width:768px){.lead{font-size:18px}}.small,small{font-size:91%}.mark,mark{background-color:#fbefdd;padding:.2em}.list-inline,.list-unstyled,.modulemenu .modulemenu-group-container{padding-left:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.initialism,.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#737373}.text-primary{color:#0078e6}a.text-primary:focus,a.text-primary:hover{color:#005db3}.text-success{color:#79a548}a.text-success:focus,a.text-success:hover{color:#5f8139}.text-info{color:#6daae0}a.text-info:focus,a.text-info:hover{color:#4392d7}.text-warning{color:#e8a33d}a.text-warning:focus,a.text-warning:hover{color:#d88b1a}.text-danger{color:#c83c3c}a.text-danger:focus,a.text-danger:hover{color:#a32e2e}.bg-primary{color:#fff;background-color:#0078e6}a.bg-primary:focus,a.bg-primary:hover{background-color:#005db3}.bg-success{background-color:#d1e2bd}a.bg-success:focus,a.bg-success:hover{background-color:#b8d39a}.bg-info{background-color:#ebf3fb}a.bg-info:focus,a.bg-info:hover{background-color:#c1dbf2}.bg-warning{background-color:#fbefdd}a.bg-warning:focus,a.bg-warning:hover{background-color:#f6d9af}.bg-danger{background-color:#efc7c7}a.bg-danger:focus,a.bg-danger:hover{background-color:#e49f9f}.page-header{padding-bottom:8px;margin:36px 0 18px;border-bottom:1px solid #f5f5f5}dl,ol,ul{margin-top:0}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child,ol ol,ol ul,ul ol,ul ul{margin-bottom:0}address,dl{margin-bottom:18px}ol,ul{margin-bottom:9px}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dd,dt{line-height:1.5}dd{margin-left:0}.dl-horizontal dd:after{content:"";display:table;clear:both}@media (min-width:992px){.dl-horizontal dt{float:left;width:70px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:90px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #d7d7d7}.initialism{font-size:90%}blockquote{padding:9px 18px;margin:0 0 18px;font-size:15px;border-left:5px solid #f5f5f5}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.5;color:#d7d7d7}legend,pre{color:#5a5a5a}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #f5f5f5;border-left:0;text-align:right}code,kbd{padding:2px 4px;font-size:90%;border-radius:2px}caption,th{text-align:left}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{font-style:normal;line-height:1.5}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{color:#c7254e;background-color:#f9f2f4}kbd{color:#fff;background-color:#333;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{display:block;padding:8.5px;margin:0 0 9px;font-size:11px;line-height:1.5;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:2px}.container-fluid:after,.container:after,.row:after{display:table;content:"";clear:both}.container,.container-fluid{margin-right:auto;margin-left:auto}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.container,.container-fluid{padding-left:15px;padding-right:15px}.pre-scrollable{max-height:340px;overflow-y:scroll}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-left:-15px;margin-right:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-1{width:8.33333333%}.col-xs-2{width:16.66666667%}.col-xs-3{width:25%}.col-xs-4{width:33.33333333%}.col-xs-5{width:41.66666667%}.col-xs-6{width:50%}.col-xs-7{width:58.33333333%}.col-xs-8{width:66.66666667%}.col-xs-9{width:75%}.col-xs-10{width:83.33333333%}.col-xs-11{width:91.66666667%}.col-xs-12{width:100%}.col-xs-pull-0{right:auto}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-3{right:25%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-6{right:50%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-9{right:75%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-12{right:100%}.col-xs-push-0{left:auto}.col-xs-push-1{left:8.33333333%}.col-xs-push-2{left:16.66666667%}.col-xs-push-3{left:25%}.col-xs-push-4{left:33.33333333%}.col-xs-push-5{left:41.66666667%}.col-xs-push-6{left:50%}.col-xs-push-7{left:58.33333333%}.col-xs-push-8{left:66.66666667%}.col-xs-push-9{left:75%}.col-xs-push-10{left:83.33333333%}.col-xs-push-11{left:91.66666667%}.col-xs-push-12{left:100%}.col-xs-offset-0{margin-left:0}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-12{margin-left:100%}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-1{width:8.33333333%}.col-sm-2{width:16.66666667%}.col-sm-3{width:25%}.col-sm-4{width:33.33333333%}.col-sm-5{width:41.66666667%}.col-sm-6{width:50%}.col-sm-7{width:58.33333333%}.col-sm-8{width:66.66666667%}.col-sm-9{width:75%}.col-sm-10{width:83.33333333%}.col-sm-11{width:91.66666667%}.col-sm-12{width:100%}.col-sm-pull-0{right:auto}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-12{right:100%}.col-sm-push-0{left:auto}.col-sm-push-1{left:8.33333333%}.col-sm-push-2{left:16.66666667%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333333%}.col-sm-push-5{left:41.66666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.33333333%}.col-sm-push-8{left:66.66666667%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333333%}.col-sm-push-11{left:91.66666667%}.col-sm-push-12{left:100%}.col-sm-offset-0{margin-left:0}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-12{margin-left:100%}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-1{width:8.33333333%}.col-md-2{width:16.66666667%}.col-md-3{width:25%}.col-md-4{width:33.33333333%}.col-md-5{width:41.66666667%}.col-md-6{width:50%}.col-md-7{width:58.33333333%}.col-md-8{width:66.66666667%}.col-md-9{width:75%}.col-md-10{width:83.33333333%}.col-md-11{width:91.66666667%}.col-md-12{width:100%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.33333333%}.col-md-pull-2{right:16.66666667%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333333%}.col-md-pull-5{right:41.66666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.33333333%}.col-md-pull-8{right:66.66666667%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333333%}.col-md-pull-11{right:91.66666667%}.col-md-pull-12{right:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.33333333%}.col-md-push-2{left:16.66666667%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333333%}.col-md-push-5{left:41.66666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.33333333%}.col-md-push-8{left:66.66666667%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333333%}.col-md-push-11{left:91.66666667%}.col-md-push-12{left:100%}.col-md-offset-0{margin-left:0}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-12{margin-left:100%}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-1{width:8.33333333%}.col-lg-2{width:16.66666667%}.col-lg-3{width:25%}.col-lg-4{width:33.33333333%}.col-lg-5{width:41.66666667%}.col-lg-6{width:50%}.col-lg-7{width:58.33333333%}.col-lg-8{width:66.66666667%}.col-lg-9{width:75%}.col-lg-10{width:83.33333333%}.col-lg-11{width:91.66666667%}.col-lg-12{width:100%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-12{right:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.33333333%}.col-lg-push-2{left:16.66666667%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333333%}.col-lg-push-5{left:41.66666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.33333333%}.col-lg-push-8{left:66.66666667%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333333%}.col-lg-push-11{left:91.66666667%}.col-lg-push-12{left:100%}.col-lg-offset-0{margin-left:0}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-12{margin-left:100%}}table{border-collapse:collapse;border-spacing:0;background-color:#fafafa}caption{padding-top:6px;padding-bottom:6px;color:#737373}.table{width:100%;margin-bottom:18px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:6px;line-height:1.5;vertical-align:top;border-top:1px solid #ccc}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ccc}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ccc}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:6px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ccc}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f7f7f7}.table-hover>tbody>tr:hover,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#ededed}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.btn-group>.btn-group,.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group,.dropdown-menu{float:left}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e1e0e0}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#d1e2bd}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#c4dbab}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#ebf3fb}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#d6e7f6}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fbefdd}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#f8e4c6}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#efc7c7}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#eab3b3}.table-responsive{overflow-x:auto;min-height:.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:13.5px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ccc}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}.carousel-inner,.collapsing,.dropdown-menu .divider,.embed-responsive,.modal,.modal-open,.nav .nav-divider,.progress,html{overflow:hidden}fieldset,legend{padding:0;border:0}fieldset{margin:0;min-width:0}legend{display:block;width:100%;margin-bottom:18px;font-size:18px;line-height:inherit;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px}input[type=search]{box-sizing:border-box;-webkit-appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}.form-control,output{font-size:12px;line-height:1.5;color:#333;display:block}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=radio]:focus,input[type=file]:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}output{padding-top:7px}.form-control{width:100%;height:32px;padding:6px;background-color:#fefefe;border:1px solid #bbb;border-radius:2px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#aaa;outline:0;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(170,170,170,.6)}.form-control::-moz-placeholder{color:#d7d7d7;opacity:1}.form-control:-ms-input-placeholder{color:#d7d7d7}.form-control::-webkit-input-placeholder{color:#d7d7d7}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#79a548}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#f5f5f5;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:32px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm>.input-group-btn>input[type=date].btn,.input-group-sm>.input-group-btn>input[type=time].btn,.input-group-sm>.input-group-btn>input[type=datetime-local].btn,.input-group-sm>.input-group-btn>input[type=month].btn,.input-group-sm>input[type=date].form-control,.input-group-sm>input[type=date].input-group-addon,.input-group-sm>input[type=time].form-control,.input-group-sm>input[type=time].input-group-addon,.input-group-sm>input[type=datetime-local].form-control,.input-group-sm>input[type=datetime-local].input-group-addon,.input-group-sm>input[type=month].form-control,.input-group-sm>input[type=month].input-group-addon,input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:26px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg>.input-group-btn>input[type=date].btn,.input-group-lg>.input-group-btn>input[type=time].btn,.input-group-lg>.input-group-btn>input[type=datetime-local].btn,.input-group-lg>.input-group-btn>input[type=month].btn,.input-group-lg>input[type=date].form-control,.input-group-lg>input[type=date].input-group-addon,.input-group-lg>input[type=time].form-control,.input-group-lg>input[type=time].input-group-addon,.input-group-lg>input[type=datetime-local].form-control,.input-group-lg>input[type=datetime-local].input-group-addon,.input-group-lg>input[type=month].form-control,.input-group-lg>input[type=month].input-group-addon,input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:41.2px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:18px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px;margin-top:4px\9}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:30px}.form-control-static.input-lg,.form-control-static.input-sm,.input-group-lg>.form-control-static.form-control,.input-group-lg>.form-control-static.input-group-addon,.input-group-lg>.input-group-btn>.form-control-static.btn,.input-group-sm>.form-control-static.form-control,.input-group-sm>.form-control-static.input-group-addon,.input-group-sm>.input-group-btn>.form-control-static.btn{padding-left:0;padding-right:0}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn,.input-sm{height:26px;padding:4px;font-size:11px;line-height:1.5;border-radius:2px}.input-group-sm>.input-group-btn>select.btn,.input-group-sm>select.form-control,.input-group-sm>select.input-group-addon,select.input-sm{height:26px;line-height:26px}.input-group-sm>.input-group-btn>select[multiple].btn,.input-group-sm>.input-group-btn>textarea.btn,.input-group-sm>select[multiple].form-control,.input-group-sm>select[multiple].input-group-addon,.input-group-sm>textarea.form-control,.input-group-sm>textarea.input-group-addon,select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:26px;padding:4px;font-size:11px;line-height:1.5;border-radius:2px}.form-group-sm select.form-control{height:26px;line-height:26px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:26px;min-height:29px;padding:5px 4px;font-size:11px;line-height:1.5}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn,.input-lg{height:41.2px;padding:12px;font-size:15px;line-height:1.3333333;border-radius:2px}.input-group-lg>.input-group-btn>select.btn,.input-group-lg>select.form-control,.input-group-lg>select.input-group-addon,select.input-lg{height:41.2px;line-height:41.2px}.input-group-lg>.input-group-btn>select[multiple].btn,.input-group-lg>.input-group-btn>textarea.btn,.input-group-lg>select[multiple].form-control,.input-group-lg>select[multiple].input-group-addon,.input-group-lg>textarea.form-control,.input-group-lg>textarea.input-group-addon,select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:41.2px;padding:12px;font-size:15px;line-height:1.3333333;border-radius:2px}.form-group-lg select.form-control{height:41.2px;line-height:41.2px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:41.2px;min-height:33px;padding:13px 12px;font-size:15px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:40px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:32px;height:32px;line-height:32px;text-align:center;pointer-events:none}.collapsing,.dropdown,.dropup{position:relative}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-group-lg>.form-control+.form-control-feedback,.input-group-lg>.input-group-addon+.form-control-feedback,.input-group-lg>.input-group-btn>.btn+.form-control-feedback,.input-lg+.form-control-feedback{width:41.2px;height:41.2px;line-height:41.2px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-group-sm>.form-control+.form-control-feedback,.input-group-sm>.input-group-addon+.form-control-feedback,.input-group-sm>.input-group-btn>.btn+.form-control-feedback,.input-sm+.form-control-feedback{width:26px;height:26px;line-height:26px}.has-success .form-control{border-color:#79a548;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#5f8139;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #abcb88}.has-success .input-group-addon{color:#79a548;border-color:#79a548;background-color:#d1e2bd}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#e8a33d}.has-warning .form-control{border-color:#e8a33d;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#d88b1a;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #f3ce98}.has-warning .input-group-addon{color:#e8a33d;border-color:#e8a33d;background-color:#fbefdd}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#c83c3c}.has-error .form-control{border-color:#c83c3c;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#a32e2e;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #de8c8c}.has-error .input-group-addon{color:#c83c3c;border-color:#c83c3c;background-color:#efc7c7}.has-feedback label~.form-control-feedback{top:23px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#404040}@media (min-width:768px){.form-inline .form-control-static,.form-inline .form-group{display:inline-block}.form-inline .control-label,.form-inline .form-group{margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.btn-block,input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:25px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-group:after{content:"";display:table;clear:both}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:13px;font-size:15px}.form-horizontal .form-group-sm .control-label{padding-top:5px;font-size:11px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;border:1px solid transparent;white-space:nowrap;padding:6px;font-size:12px;line-height:1.5;border-radius:2px;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#eee;border-color:#bbb}.btn-default.focus,.btn-default:focus{color:#333;background-color:#d5d4d4;border-color:#7b7b7b}.btn-default.active,.btn-default:active,.btn-default:hover,.open>.btn-default.dropdown-toggle{color:#333;background-color:#d5d4d4;border-color:#9c9c9c}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.btn-default.dropdown-toggle.focus,.open>.btn-default.dropdown-toggle:focus,.open>.btn-default.dropdown-toggle:hover{color:#333;background-color:#c3c3c3;border-color:#7b7b7b}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#eee;border-color:#bbb}.btn-default .badge{color:#eee;background-color:#333}.btn-primary{color:#fff;background-color:#0078e6;border-color:#006bcd}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#005db3;border-color:#00284d}.btn-primary.active,.btn-primary:active,.btn-primary:hover,.open>.btn-primary.dropdown-toggle{color:#fff;background-color:#005db3;border-color:#004b8f}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.btn-primary.dropdown-toggle.focus,.open>.btn-primary.dropdown-toggle:focus,.open>.btn-primary.dropdown-toggle:hover{color:#fff;background-color:#004b8f;border-color:#00284d}.btn-primary.active,.btn-primary:active,.open>.btn-primary.dropdown-toggle{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#0078e6;border-color:#006bcd}.btn-primary .badge{color:#0078e6;background-color:#fff}.btn-success{color:#fff;background-color:#79a548;border-color:#6c9340}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#5f8139;border-color:#2b3a1a}.btn-success.active,.btn-success:active,.btn-success:hover,.open>.btn-success.dropdown-toggle{color:#fff;background-color:#5f8139;border-color:#4d692e}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.btn-success.dropdown-toggle.focus,.open>.btn-success.dropdown-toggle:focus,.open>.btn-success.dropdown-toggle:hover{color:#fff;background-color:#4d692e;border-color:#2b3a1a}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#79a548;border-color:#6c9340}.btn-success .badge{color:#79a548;background-color:#fff}.btn-info{color:#fff;background-color:#6daae0;border-color:#589edc}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#4392d7;border-color:#205e94}.btn-info.active,.btn-info:active,.btn-info:hover,.open>.btn-info.dropdown-toggle{color:#fff;background-color:#4392d7;border-color:#2b80cb}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.btn-info.dropdown-toggle.focus,.open>.btn-info.dropdown-toggle:focus,.open>.btn-info.dropdown-toggle:hover{color:#fff;background-color:#2b80cb;border-color:#205e94}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#6daae0;border-color:#589edc}.btn-info .badge{color:#6daae0;background-color:#fff}.btn-warning{color:#fff;background-color:#e8a33d;border-color:#e59826}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#d88b1a;border-color:#7d510f}.btn-warning.active,.btn-warning:active,.btn-warning:hover,.open>.btn-warning.dropdown-toggle{color:#fff;background-color:#d88b1a;border-color:#b87716}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.btn-warning.dropdown-toggle.focus,.open>.btn-warning.dropdown-toggle:focus,.open>.btn-warning.dropdown-toggle:hover{color:#fff;background-color:#b87716;border-color:#7d510f}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#e8a33d;border-color:#e59826}.btn-warning .badge{color:#e8a33d;background-color:#fff}.btn-danger{color:#fff;background-color:#c83c3c;border-color:#b73434}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#a32e2e;border-color:#531818}.btn-danger.active,.btn-danger:active,.btn-danger:hover,.open>.btn-danger.dropdown-toggle{color:#fff;background-color:#a32e2e;border-color:#872626}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.btn-danger.dropdown-toggle.focus,.open>.btn-danger.dropdown-toggle:focus,.open>.btn-danger.dropdown-toggle:hover{color:#fff;background-color:#872626;border-color:#531818}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c83c3c;border-color:#b73434}.btn-danger .badge{color:#c83c3c;background-color:#fff}.btn-link{color:#212424;font-weight:400;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#000;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#d7d7d7;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:12px;font-size:15px;line-height:1.3333333;border-radius:2px}.btn-group-sm>.btn,.btn-sm{padding:4px;font-size:11px;line-height:1.5;border-radius:2px}.btn-group-xs>.btn,.btn-xs{padding:2px 4px;font-size:11px;line-height:1.5;border-radius:2px}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle,.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child,.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-block{display:block}.btn-block+.btn-block{margin-top:5px}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{height:0;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid\9}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;min-width:160px;padding:5px 0;list-style:none;font-size:12px;text-align:left;background-color:#292929;box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu-right,.dropdown-menu.pull-right{left:auto;right:0}.dropdown-header,.dropdown-menu>li>a{display:block;padding:3px 20px;line-height:1.5;white-space:nowrap}.dropdown-menu .divider{height:1px;margin:8px 0;background-color:#424242}.dropdown-menu>li>a{clear:both;font-weight:400;color:#fff}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{text-decoration:none;color:#fff;background-color:#424242}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#424242}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#d7d7d7}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.progress-bar-striped,.progress-striped .progress-bar,.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{font-size:11px;color:#d7d7d7}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:992px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar:after{content:"";display:table;clear:both}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn .caret,.btn-group>.btn:first-child{margin-left:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group-lg.btn-group>.btn+.dropdown-toggle,.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{box-shadow:none}.btn-group-lg>.btn .caret,.btn-lg .caret{border-width:5px 5px 0}.dropup .btn-group-lg>.btn .caret,.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:after{content:"";display:table;clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-radius:2px 2px 0 0}.btn-group-vertical>.btn:last-child:not(:first-child){border-radius:0 0 2px 2px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn,.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group,.input-group-btn,.input-group-btn>.btn{position:relative}.input-group{display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px;font-size:12px;font-weight:400;line-height:1;color:#333;text-align:center;background-color:#f5f5f5;border:1px solid #bbb;border-radius:2px}.input-group-addon.input-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:4px;font-size:11px;border-radius:2px}.input-group-addon.input-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:12px;font-size:15px;border-radius:2px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{font-size:0;white-space:nowrap}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav:after{content:"";display:table;clear:both}.nav>li,.nav>li>a{position:relative;display:block}.nav>li>a{padding:6px 12px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#f5f5f5}.nav>li.disabled>a{color:#d7d7d7}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#5a5a5a;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#f5f5f5;border-color:#212424}.nav .nav-divider{height:1px;margin:8px 0;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ccc}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.5;border:1px solid transparent;border-radius:2px 2px 0 0}.nav-tabs>li>a:hover{border-color:#d7d7d7 #d7d7d7 #ccc}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#000;background-color:#ededed;border:1px solid #ccc;border-bottom-color:transparent;cursor:default}.nav-pills>li{float:left}.nav-justified>li,.nav-stacked>li,.nav-tabs.nav-justified>li{float:none}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#0078e6}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified,.nav-tabs.nav-justified{width:100%}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}.btn .badge,.btn .label{top:-1px;position:relative}.nav-tabs-justified,.nav-tabs.nav-justified{border-bottom:0}.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:2px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ccc}@media (min-width:768px){.nav-justified>li,.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{margin-bottom:0}.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ccc;border-radius:2px 2px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#ccc}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.pagination{display:inline-block;padding-left:0;margin:18px 0;border-radius:2px}.label,.pagination>li{display:inline}.alert,.thumbnail{margin-bottom:18px}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px;line-height:1.5;text-decoration:none;color:#212424;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span,.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span,.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span,.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:2px;border-top-right-radius:2px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#000;background-color:#f5f5f5;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;background-color:#0078e6;border-color:#0078e6;cursor:default}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#d7d7d7;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:12px;font-size:15px;line-height:1.3333333}.pagination-sm>li>a,.pagination-sm>li>span{padding:4px;font-size:11px;line-height:1.5}.badge,.label{color:#fff;line-height:1;white-space:nowrap;font-weight:700}.label{padding:.2em .6em .3em;font-size:75%;text-align:center;vertical-align:baseline;border-radius:.25em}.badge,.progress-bar{font-size:11px;text-align:center}.label:empty{display:none}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label-default{background-color:#d7d7d7}.label-default[href]:focus,.label-default[href]:hover{background-color:#bebdbd}.label-primary{background-color:#0078e6}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#005db3}.label-success{background-color:#79a548}.label-success[href]:focus,.label-success[href]:hover{background-color:#5f8139}.label-info{background-color:#6daae0}.label-info[href]:focus,.label-info[href]:hover{background-color:#4392d7}.label-warning{background-color:#e8a33d}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#d88b1a}.label-danger{background-color:#c83c3c}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#a32e2e}.badge{display:inline-block;min-width:10px;padding:3px 7px;vertical-align:middle;background-color:#737373;border-radius:10px}.badge:empty{display:none}.media-object,.thumbnail{display:block}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#212424;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.thumbnail{padding:4px;line-height:1.5;background-color:#fff;border:1px solid #ddd;border-radius:2px;-webkit-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}.thumbnail .caption{padding:9px;color:#000}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#212424}.alert{padding:11px;border:1px solid transparent;border-radius:2px}.alert-danger,.alert-info,.alert-success,.alert-warning{border-color:transparent}.alert-danger hr,.alert-info hr,.alert-success hr,.alert-warning hr{border-top-color:transparent}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:31px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.modal,.modal-backdrop{top:0;right:0;bottom:0;left:0}.alert-success{background-color:#79a548;color:#fff}.alert-success .alert-link{color:#e6e5e5}.alert-info{background-color:#6daae0;color:#fff}.alert-info .alert-link{color:#e6e5e5}.alert-warning{background-color:#e8a33d;color:#fff}.alert-warning .alert-link{color:#e6e5e5}.alert-danger{background-color:#c83c3c;color:#fff}.alert-danger .alert-link{color:#e6e5e5}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:18px;margin-bottom:18px;background-color:#dedede;border-radius:2px;box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;line-height:18px;color:#fff;background-color:#0078e6;box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#79a548}.progress-striped .progress-bar-success{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-striped .progress-bar-info,.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#6daae0}.progress-striped .progress-bar-info{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#e8a33d}.progress-striped .progress-bar-warning{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#c83c3c}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media-heading,.media:first-child,.panel-title{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:2px;border-top-left-radius:2px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{text-decoration:none;color:#555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{background-color:#f5f5f5;color:#d7d7d7;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#d7d7d7}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#0078e6;border-color:#0078e6}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#b3dbff}.list-group-item-success{color:#79a548;background-color:#d1e2bd}a.list-group-item-success,button.list-group-item-success{color:#79a548}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#79a548;background-color:#c4dbab}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#79a548;border-color:#79a548}.list-group-item-info{color:#6daae0;background-color:#ebf3fb}a.list-group-item-info,button.list-group-item-info{color:#6daae0}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#6daae0;background-color:#d6e7f6}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#6daae0;border-color:#6daae0}.list-group-item-warning{color:#e8a33d;background-color:#fbefdd}a.list-group-item-warning,button.list-group-item-warning{color:#e8a33d}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#e8a33d;background-color:#f8e4c6}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#e8a33d;border-color:#e8a33d}.list-group-item-danger{color:#c83c3c;background-color:#efc7c7}a.list-group-item-danger,button.list-group-item-danger{color:#c83c3c}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#c83c3c;background-color:#eab3b3}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#c83c3c;border-color:#c83c3c}.panel-heading>.dropdown .dropdown-toggle,.panel-title,.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:18px;background-color:#fff;border:1px solid transparent;border-radius:2px;box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-title,.panel>.list-group,.panel>.panel-collapse>.list-group,.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel-body{padding:15px}.panel-body:after{content:"";display:table;clear:both}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:1px;border-top-left-radius:1px}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel-group .panel-heading,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-responsive:last-child>.table:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:1px;border-bottom-right-radius:1px}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:1px;border-top-left-radius:1px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.table-responsive:first-child>.table:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-right-radius:1px;border-top-left-radius:1px}.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-left:15px;padding-right:15px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:1px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:1px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ccc}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:18px}.panel-group .panel{margin-bottom:0;border-radius:2px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ccc}.panel-default>.panel-heading{color:#5a5a5a;background-color:#ddd;border-color:#ccc}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ccc}.panel-default>.panel-heading .badge{color:#ddd;background-color:#5a5a5a}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ccc}.panel-primary{border-color:#0078e6}.panel-primary>.panel-heading{color:#fff;background-color:#0078e6;border-color:#0078e6}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#0078e6}.panel-primary>.panel-heading .badge{color:#0078e6;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#0078e6}.panel-success{border-color:#79a548}.panel-success>.panel-heading{color:#79a548;background-color:#d1e2bd;border-color:#79a548}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#79a548}.panel-success>.panel-heading .badge{color:#d1e2bd;background-color:#79a548}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#79a548}.panel-info{border-color:#6daae0}.panel-info>.panel-heading{color:#6daae0;background-color:#ebf3fb;border-color:#6daae0}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#6daae0}.panel-info>.panel-heading .badge{color:#ebf3fb;background-color:#6daae0}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#6daae0}.panel-warning{border-color:#e8a33d}.panel-warning>.panel-heading{color:#e8a33d;background-color:#fbefdd;border-color:#e8a33d}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e8a33d}.panel-warning>.panel-heading .badge{color:#fbefdd;background-color:#e8a33d}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e8a33d}.panel-danger{border-color:#c83c3c}.panel-danger>.panel-heading{color:#c83c3c;background-color:#efc7c7;border-color:#c83c3c}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#c83c3c}.panel-danger>.panel-heading .badge{color:#efc7c7;background-color:#c83c3c}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#c83c3c}.embed-responsive{position:relative;display:block;height:0;padding:0}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#fafafa;border:1px solid #ccc;border-radius:2px;box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well-lg,.well-sm{border-radius:2px}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px}.well-sm{padding:9px}.close{float:right;font-size:18px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.popover,.tooltip{font-family:Verdana,Arial,Helvetica,sans-serif;letter-spacing:normal;line-break:auto;line-height:1.5;text-shadow:none;text-transform:none;word-break:normal;word-spacing:normal;word-wrap:normal;font-weight:400;text-decoration:none}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-content,.popover{background-clip:padding-box}.modal{display:none;position:fixed;z-index:5000;-webkit-overflow-scrolling:touch;outline:0}.modal-footer:after,.modal-header:after{display:table;clear:both;content:""}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:2px;box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}.modal-backdrop{position:fixed;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.5}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-style:normal;text-align:left;text-align:start;white-space:normal;font-size:12px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:2px;box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:12px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:1px 1px 0 0}.popover>.arrow,.popover>.arrow:after,.tooltip-arrow{position:absolute;width:0;height:0;border-style:solid}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{display:block;border-color:transparent}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.left>.arrow:after,.popover.right>.arrow:after{content:" ";bottom:-10px}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{left:1px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;border-right-width:0;border-left-color:#fff}.tooltip{position:absolute;z-index:1070;display:block;font-style:normal;text-align:left;text-align:start;white-space:normal;font-size:11px;opacity:0;filter:alpha(opacity=0)}.carousel-caption,.carousel-control{color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.chosen-container-multi .chosen-choices li.search-choice span,.diff-item-result{word-wrap:break-word}.tooltip.in{opacity:1;filter:alpha(opacity=100)}.tooltip.top{margin-top:-3px;padding:3px 0}.tooltip.right{margin-left:3px;padding:0 3px}.tooltip.bottom{margin-top:3px;padding:3px 0}.tooltip.left{margin-left:-3px;padding:0 3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#333;border-radius:2px}.tooltip-arrow{border-color:transparent}.carousel,.carousel-inner{position:relative}.tooltip.top .tooltip-arrow,.tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow{border-width:3px 3px 0;border-top-color:#333;bottom:0}.tooltip.top .tooltip-arrow{left:50%;margin-left:-3px}.tooltip.top-left .tooltip-arrow{right:3px;margin-bottom:-3px}.tooltip.top-right .tooltip-arrow{left:3px;margin-bottom:-3px}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-3px;border-width:3px 3px 3px 0;border-right-color:#333}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-3px;border-width:3px 0 3px 3px;border-left-color:#333}.tooltip.bottom .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow{border-width:0 3px 3px;border-bottom-color:#333;top:0}.tooltip.bottom .tooltip-arrow{left:50%;margin-left:-3px}.tooltip.bottom-left .tooltip-arrow{right:3px;margin-top:-3px}.tooltip.bottom-right .tooltip-arrow{left:3px;margin-top:-3px}.carousel-inner{width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{display:block;max-width:100%;height:auto;line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;background-color:transparent}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:focus,.carousel-control:hover{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000\9;background-color:transparent}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px}.carousel-caption .btn,.text-hide{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}body,html{height:100%}body{overflow:auto}.scaffold{background-color:#f5f5f5;color:#333;position:relative;padding-top:45px;height:100vh}.scaffold-topbar{background-color:#151515;color:#f5f5f5;height:45px;position:fixed;top:0;right:0;left:0}.scaffold-modulemenu,.scaffold-toolbar{background-color:#292929;z-index:1000;position:fixed;top:45px;left:0;bottom:0}.scaffold-modulemenu{color:#f5f5f5;width:40px;max-width:100%;overflow:hidden}.scaffold-modulemenu a{color:rgba(245,245,245,.7)}.scaffold-modulemenu .active>a,.scaffold-modulemenu a:hover{color:#f5f5f5}.scaffold-toolbar{overflow:auto;color:#f5f5f5;right:0;display:none}.scaffold-toolbar .dropdown-menu a,.scaffold-toolbar a{color:rgba(245,245,245,.7)}.scaffold-toolbar .active>a,.scaffold-toolbar .dropdown-menu a:focus,.scaffold-toolbar .dropdown-menu a:hover,.scaffold-toolbar a:focus,.scaffold-toolbar a:hover{color:#f5f5f5}@media (min-width:992px){.scaffold-toolbar{overflow:visible;background-color:transparent;height:45px;top:0;left:auto;bottom:auto;display:block}}.scaffold-content{position:fixed!important;top:45px;left:0;right:0;bottom:0}@media (max-width:991px){.scaffold-search-expanded .scaffold-toolbar,.scaffold-toolbar-expanded .scaffold-toolbar{display:block}.scaffold-content{left:0!important}}.scaffold-content-module-iframe,.scaffold-content-navigation-iframe{display:block;border:none;height:100%;width:100%}.scaffold-content-navigation{display:none;position:absolute!important;left:0;top:0;bottom:0;width:300px}.scaffold-content-navigation-component{position:absolute;top:0;bottom:0;left:0;right:0}.scaffold-content-navigation-component #typo3-pagetree-treeContainer>div>.x-panel-body{overflow:auto}.scaffold-content-module{position:absolute!important;top:0;left:0;bottom:0;right:0}@media (max-width:767px){.scaffold-content-module{width:100%}}.scaffold-content-overlay{display:none;position:absolute;z-index:1040;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.65)}.scaffold-modulemenu-expanded .scaffold-content-overlay{display:block}@media (min-width:992px){.scaffold-modulemenu-expanded .scaffold-content-overlay{display:none}.scaffold{padding-left:40px}}.scaffold .scaffold-modulemenu{width:40px}@media (max-width:991px){.scaffold .scaffold-modulemenu{display:none}.scaffold-modulemenu-expanded .scaffold-modulemenu{display:block}}.scaffold-modulemenu-expanded{display:block;padding-left:230px}.scaffold-modulemenu-expanded .scaffold-modulemenu{width:230px}.scaffold-modulemenu-expanded .scaffold-content{-webkit-transform:translate(230px,0);transform:translate(230px,0)}.scaffold-content-navigation-expanded .scaffold-content-navigation{display:block}.scaffold-content-navigation-expanded .scaffold-content-module{left:300px}@media (min-width:992px){.scaffold .scaffold-content{left:40px}.scaffold-modulemenu-expanded .scaffold-content{left:230px;-webkit-transform:none;transform:none}}.topbar{background-color:inherit;position:relative;height:45px}.topbar a{color:inherit;text-decoration:none}.topbar-button{position:absolute;top:0;display:inline-block;border:0;background-color:#151515;height:45px;width:40px}.topbar-button:focus,.topbar-button:hover{background-color:#1d1d1d}.scaffold-content-navigation-expanded .topbar-button-navigationcomponent,.scaffold-modulemenu-expanded .topbar-button.topbar-button-modulemenu,.scaffold-search-expanded .topbar-button-search,.scaffold-toolbar-expanded .topbar-button-toolbar{background-color:#292929}.topbar-button[disabled],.topbar-button[disabled]:focus,.topbar-button[disabled]:hover{background-color:#292929;cursor:not-allowed;opacity:.5}.topbar-button.topbar-button-modulemenu{left:0}.topbar-button.topbar-button-navigationcomponent{left:40px}.topbar-button.topbar-button-toolbar{right:40px}.topbar-button.topbar-button-search{right:0}@media (max-width:991px){.scaffold-search-expanded .toolbar-item,.scaffold-toolbar-expanded .toolbar-item-search{display:none}.scaffold-search-expanded .toolbar-item-search{display:block;width:100%}.topbar-header{padding-right:80px!important}}.topbar-button-search,.topbar-button-toolbar{display:block}@media (min-width:992px){.topbar-button.topbar-button-modulemenu{background-color:#292929}.topbar-button-search,.topbar-button-toolbar{display:none}}.topbar-header{padding-left:80px}.topbar-header-site{overflow:hidden;position:relative;max-width:100%;height:45px;line-height:45px;padding-left:1em;padding-right:1em;white-space:nowrap}.topbar-header-site:after,.topbar-header-site:before{display:block;content:'';position:absolute;top:0;bottom:0;width:1em}.topbar-header-site:before{right:0;background:#151515}.topbar-header-site:after{right:1em;background:-webkit-linear-gradient(left,rgba(21,21,21,0) 0,#151515 100%);background:linear-gradient(to right,rgba(21,21,21,0) 0,#151515 100%)}.typo3-in-workspace .topbar-header-site{background-color:#6d860d}.typo3-in-workspace .topbar-header-site:before{background:#6d860d}.typo3-in-workspace .topbar-header-site:after{background:-webkit-linear-gradient(left,rgba(109,134,13,0) 0,#6d860d 100%);background:linear-gradient(to right,rgba(109,134,13,0) 0,#6d860d 100%)}.topbar-header-site-logo{height:45px;display:none;padding-right:.5em}@media (min-width:320px){.topbar-header-site-logo{display:inline-block}}.topbar-header-site-title{line-height:1.2em;display:inline-block;vertical-align:middle}.topbar-header-site-name{display:block}.toolbar-list:after,.toolbar:after{display:table;content:'';clear:both}.topbar-header-site-version{opacity:.5}.toolbar{padding:8px}.toolbar-list{list-style:none;padding:0;margin:0}@media (min-width:992px){.toolbar{padding:0;background-color:#151515}.toolbar-list li:last-child{width:300px}}.toolbar-item{padding:4px;position:relative;display:block;float:left;width:100%}@media (min-width:600px){.toolbar-item{width:50%}}@media (min-width:750px){.toolbar-item{width:33.33%}}@media (min-width:992px){.toolbar-item{padding:0;width:auto;margin-left:1px}}.toolbar-item .dropdown-menu{width:350px}.toolbar-item .dropdown-menu .text-muted{color:#8c8c8c}.toolbar-item .dropdown-menu a:focus .text-muted,.toolbar-item .dropdown-menu a:hover .text-muted{color:#a6a6a6}@media (max-width:991px){.toolbar-item .dropdown-menu{overflow:auto;padding:15px;position:fixed;max-height:90%;max-width:90%;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.toolbar-item .dropdown-backdrop{background:rgba(0,0,0,.65)}}.toolbar-item-avatar{width:28px;margin-right:2px;display:inline-block}.toolbar-item-avatar .avatar{position:absolute;top:50%;left:10px;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.toolbar-item-avatar .avatar,.toolbar-item-avatar .avatar-image{height:28px;width:28px}.toolbar-item-badge{position:absolute;bottom:4px;right:4px;padding:3px 4px;border-radius:0;font-size:10px;font-weight:400;min-width:16px}.toolbar-item-link{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid rgba(0,0,0,.5);position:relative;display:block;text-decoration:none;padding:9px 10px;height:45px;line-height:27px}.toolbar-item-link:focus,.toolbar-item-link:hover{text-decoration:none}.open .toolbar-item-link{background-color:#292929}.toolbar-item-search form{padding:0;margin:0}.toolbar-item-search .toolbar-item-link{padding:0;margin:0;height:0}.toolbar-item-search .form-group{margin:0}.toolbar-item-search .close{color:#fff;text-shadow:none;opacity:1}@media (max-width:991px){.toolbar-item-search .dropdown-menu{top:114px;left:14px;right:14px;width:auto;max-width:none;max-height:none;-webkit-transform:none;transform:none;bottom:14px}}@media (min-width:992px){.toolbar-item-link{border:none}.toolbar-item-title{display:none}.toolbar-item-search .dropdown-menu{left:auto;right:0}}.toolbar-item-search .autocomplete-suggestions{position:static!important}.toolbar-item-search .autocomplete-suggestion{border:none}.toolbar-item-search.open .toolbar-item-search-form{position:relative;z-index:991}.toolbar-item-search-field{color:inherit;background-color:#2f2f2f;margin:0;border-radius:0;border:1px solid rgba(0,0,0,.5);height:45px;box-shadow:none}@media (min-width:992px){.toolbar-item-search-field{border:none}}.toolbar-item-search-field:hover{background-color:#333}.toolbar-item-search-field:focus{box-shadow:none;background-color:#555}.module-wrapper{position:relative}.module-wrapper iframe{border:none}.modulemenu .modulemenu-group-container{clear:both}.modulemenu .modulemenu-group{position:relative;padding:5px 0;border-bottom:1px solid rgba(0,0,0,.2)}.modulemenu .modulemenu-group-header,.modulemenu .modulemenu-item-link{position:relative;display:block;cursor:pointer;padding:2px 4px;text-decoration:none}.modulemenu .modulemenu-group-header{user-select:none;text-transform:uppercase}.modulemenu .modulemenu-item-link:focus,.modulemenu .modulemenu-item-link:hover{outline:0;background-color:rgba(0,0,0,.1)}.modulemenu .modulemenu-item.active .modulemenu-item-link{background-color:rgba(0,0,0,.15)}.modulemenu .modulemenu-icon{float:left;margin-right:4px}.modulemenu .modulemenu-icon .fa{font-size:.5em}.modulemenu .modulemenu-group-title,.modulemenu .modulemenu-item-title{white-space:nowrap;text-overflow:ellipsis;padding-top:7px;padding-left:4px;display:none;overflow:hidden}.modulemenu .modulemenu-group-title{padding-right:20px}.modulemenu .modulemenu-group-title .caret{-webkit-transform:rotate(90deg);transform:rotate(90deg);position:absolute;top:17px;right:18px}.modulemenu .expanded .modulemenu-group-title .caret{-webkit-transform:rotate(0);transform:rotate(0)}.scaffold-modulemenu-expanded .modulemenu-group-title,.scaffold-modulemenu-expanded .modulemenu-item-title{display:block}.autocomplete{position:relative}.autocomplete-results{z-index:1000;position:absolute;margin:5px 0;top:100%;left:0;border:1px solid #ddd;border-radius:2px;background-color:#fff;overflow:hidden;box-shadow:0 1px 0 0 rgba(0,0,0,.25)}.avatar,.dropdown-list>li{position:relative}.autocomplete-suggestion{border-top:1px solid #ddd}.autocomplete-suggestion:first-child{border-top:none}.autocomplete-suggestion-link{padding:5px 13px 5px 28px;display:block;text-decoration:none}.autocomplete-selected .autocomplete-suggestion-link,.autocomplete-suggestion-link:hover{background-color:#fafafa;text-decoration:none}.autocomplete-info{padding:5px 15px}.dropdown-menu{line-height:1.45em;border:0;margin:0;border-radius:0;color:#fff}.dropdown-menu a{color:inherit;display:block}.dropdown-menu a:focus,.dropdown-menu a:hover{color:inherit;text-decoration:none}.dropdown-menu hr{border-top:1px solid rgba(0,0,0,.35);margin:1.25em -15px}.dropdown-menu>:last-child{margin-bottom:0}.dropdown-menu .form-group{margin-bottom:.75em}.dropdown-menu .form-control{border-color:#aaa;color:inherit;border-radius:0;background-color:#333}.dropdown-menu .form-control:focus{box-shadow:none;border-color:#bbb}.dropdown-menu .btn{border:none;border-radius:0;padding:6px 10px}.dropdown-headline{font-size:1.15em;margin-top:0;margin-bottom:.5em}.dropdown-text a{display:inline-block}div.dropdown-menu{padding:1.5em}.dropdown-list{padding-left:0;list-style:none}.dropdown-list>li+li{margin-top:.5em}.dropdown-list-link{display:block;text-decoration:none}.dropdown-list-link:focus,.dropdown-list-link:hover{text-decoration:none}.dropdown-table{display:table;width:100%}.dropdown-table-row{display:table-row}.dropdown-table-column{display:table-cell;padding-top:.25em;padding-bottom:.25em;vertical-align:middle}.dropdown-table-column-top{vertical-align:top}.avatar,.callout .media-body{vertical-align:middle}.dropdown-table-icon{width:16px;padding-right:.5em}.avatar,.avatar-image{height:32px;width:32px}.dropdown-table-title{white-space:nowrap;padding-right:1.5em}.dropdown-table-title-ellipsis{max-width:230px;overflow:hidden;display:block;white-space:nowrap;text-overflow:ellipsis}.dropdown-table-actions{white-space:nowrap;text-align:right}.dropdown-table-actions-btn{text-align:center;display:inline-block!important;margin-top:-4px;margin-bottom:-4px;padding:4px;vertical-align:middle}.dropdown-table-actions-btn-close:hover,.dropdown-table-actions-btn-edit:hover{background-color:#333}.dropdown-table-actions-btn-delete:hover{background-color:#c83c3c}.avatar{display:inline-block}.avatar-image{display:block;overflow:hidden;border-radius:50%}.avatar-image:after{display:block;content:'';position:absolute;top:0;left:0;height:100%;width:100%;border-radius:50%;border:1px solid rgba(255,255,255,.1)}.avatar-image>img{display:block;width:100%!important;height:auto!important}.avatar-icon{position:absolute;bottom:0;right:0;height:16px;width:16px}.callout{background-color:#f0f0f0;border-left:3px solid #ccc;margin:20px 0;padding:20px;color:#333}.callout .media{margin:0}.callout .media .fa-stack{color:#fff}.callout .media .fa-stack>.fa:first-child{color:#ccc}.callout-icon{margin-top:-2px}.callout-title{font-size:1.3em;margin:0 0 .5em}.callout-danger .media,.callout-info .media,.callout-notice .media,.callout-success .media,.callout-warning .media{margin:0}.callout-body>:last-child{margin-bottom:0}.callout-success{background-color:#d1e2bd;border-color:#79a548;color:#333}.callout-success .media .fa-stack{color:#fff}.callout-success .media .fa-stack>.fa:first-child{color:#79a548}.callout-info{background-color:#ebf3fb;border-color:#6daae0;color:#333}.callout-info .media .fa-stack{color:#fff}.callout-info .media .fa-stack>.fa:first-child{color:#6daae0}.callout-warning{background-color:#fbefdd;border-color:#e8a33d;color:#333}.callout-warning .media .fa-stack{color:#fff}.callout-warning .media .fa-stack>.fa:first-child{color:#e8a33d}.callout-danger{background-color:#efc7c7;border-color:#c83c3c;color:#333}.callout-danger .media .fa-stack{color:#fff}.callout-danger .media .fa-stack>.fa:first-child{color:#c83c3c}.callout-notice{background-color:#f9f9f9;border-color:#a0a0a0;color:#333}.callout-notice .media .fa-stack{color:#fff}.callout-notice .media .fa-stack>.fa:first-child{color:#a0a0a0}.icon{position:relative;display:inline-block;overflow:hidden;white-space:nowrap;vertical-align:-22%}.icon-markup,.icon-overlay{position:absolute;right:0;text-align:center;bottom:0}.icon img,.icon svg{display:block;height:100%;width:100%;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.icon *{display:block;line-height:inherit}.icon-markup{display:block;top:0;left:0}.icon-overlay{height:68.75%;width:68.75%}.module-docheader,.module-loading-indicator.nprogress-custom-parent{position:fixed;top:0}.icon-color{fill:currentColor}.icon-spin .icon-markup{-webkit-animation:icon-spin 2s infinite linear;animation:icon-spin 2s infinite linear}@-webkit-keyframes icon-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes icon-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.icon-state-disabled .icon-markup{opacity:.5}.icon-size-small{height:16px;width:16px;line-height:16px}.icon-size-small .icon-unify{line-height:16px;font-size:14px}.icon-size-small .icon-overlay .icon-unify{line-height:10px;font-size:9px}.icon-size-default{height:32px;width:32px;line-height:32px}.icon-size-default .icon-unify{line-height:32px;font-size:28px}.icon-size-default .icon-overlay .icon-unify{line-height:20px;font-size:18px}.icon-size-large{height:48px;width:48px;line-height:48px}.icon-size-large .icon-unify{line-height:48px;font-size:42px}.icon-size-large .icon-overlay .icon-unify{line-height:30px;font-size:26px}.icon-actions-edit-copy-release,.icon-actions-edit-cut-release,.icon-status-dialog-error,.icon-status-status-current,.icon-status-status-permission-denied{color:#c83c3c}.icon-status-status-sorting-light-asc,.icon-status-status-sorting-light-desc{color:#fff}.icon-status-status-sorting-asc,.icon-status-status-sorting-desc{color:#737373}.icon-status-dialog-information{color:#6daae0}.icon-status-dialog-ok,.icon-status-status-permission-granted{color:#79a548}.icon-status-dialog-notification{color:#333}.icon-status-dialog-warning{color:#e8a33d}.diff{background-color:#fff;border:1px solid #ccc;display:table}.diff-item{display:table-row}.diff-item+.diff-item{border-top:1px solid #ccc}.diff-item-result,.diff-item-title{padding:10px;display:table-cell}.diff-item-title{background-color:#fafafa;padding-right:10px;font-style:italic;white-space:nowrap}.diff-item-result{font-family:Menlo,Monaco,Consolas,"Courier New",monospace;width:100%;white-space:pre;word-break:break-all}.diff-item-result del{color:#c80c05;background-color:#fff6f6;text-decoration:none}.diff-item-result ins{color:#44a512;background-color:#ebfce3;text-decoration:none}.diff-item-result.diff-item-result-inline{white-space:normal}.module{min-height:100%;width:100%;background-color:#fff;color:inherit}.module-dark{background-color:#333;color:#ccc}.module-loading-indicator{min-height:5px;width:100%;z-index:999999}.module-docheader{width:100%;left:0;min-height:65px;z-index:300;background-color:#eee;border-bottom:1px solid #c3c3c3;padding:0 24px;-webkit-transition:margin-top .3s ease-in-out;transition:margin-top .3s ease-in-out}.module-docheader .module-docheader-bar{min-height:26px;margin:4px 0;line-height:26px}.module-docheader .module-docheader-bar.row{margin-left:-15px;margin-right:-15px}.module-docheader .module-docheader-bar label{margin-top:0;margin-bottom:0}.module-docheader .module-docheader-bar .form-inline .form-group{display:table}.module-docheader .module-docheader-bar .form-inline .form-group label{display:table-cell;font-size:11px;font-weight:400;line-height:16px;padding:4px;border-radius:2px 0 0 2px;border:1px solid #bbb;border-right:0;background-color:rgba(0,0,0,.05)}.module-docheader .module-docheader-bar .form-inline .form-group label+select{display:table-cell;border-top-left-radius:0;border-bottom-left-radius:0}.module-docheader .module-docheader-bar .form-group{vertical-align:top;margin:0;display:inline-block}.module-docheader .module-docheader-bar .form-group .form-control{vertical-align:top}.module-docheader .module-docheader-bar .form-inline-spaced{margin:0}.module-docheader .module-docheader-bar .panel{margin:0 -24px;border-left:none;border-right:none;border-bottom:none;border-radius:0;background-color:#fafafa;box-shadow:none}.module-docheader .module-docheader-bar .panel .panel-body{padding:8px 24px}.module-docheader .module-docheader-bar-search{margin-bottom:0}.module-docheader .module-docheader-bar-column-left{float:left}.module-docheader .module-docheader-bar-column-right{float:right}.module-docheader-bar-navigation .module-docheader-bar-column-left{white-space:nowrap}@media (max-width:768px){.module-docheader .module-docheader-bar .text-right{text-align:left}.module-docheader-bar-navigation .module-docheader-bar-column-left{white-space:normal}}.module-docheader-bar-navigation .form-group select{width:100%}.module-body{padding:24px}.module-body>.callout:first-child{margin-top:0}.module-body>.container{padding-left:0;padding-right:0}.module-body .container-small{max-width:768px;margin:0 auto}.module-docheader+.module-body{padding-top:89px}.panel{display:block}.panel:focus,.panel:hover{text-decoration:none}.panel-heading a,.panel-heading a:active,.panel-heading a:focus,.panel-heading a:hover{text-decoration:none;color:inherit}.panel-heading-left{float:left}.panel-heading-right{float:right}.panel-title{font-size:12px}.panel-title-icon,.panel-title-name{display:inline-block;vertical-align:middle}.panel-body>:first-child{margin-top:0}.panel-body>:last-child{margin-bottom:0}.panel-body-highlightlinks>p>a{text-decoration:underline}.panel-table td:first-child,.panel-table th:first-child{padding-left:15px}.panel-table td:last-child,.panel-table th:last-child{padding-right:15px}.panel-progress{background-color:#eee;height:3px;position:relative;width:100%}.panel-progress .panel-progress-bar{display:block;height:100%;background-color:#444}.panel-active{border-color:#444}.panel-active>.panel-heading{color:#fff;background-color:#666;border-color:#444}.panel-active>.panel-heading+.panel-collapse>.panel-body{border-top-color:#444}.panel-active>.panel-heading .badge{color:#666;background-color:#fff}.panel-active>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#444}.clearfix:after,.dropdown-list>li:after,.module-docheader .module-docheader-bar:after,.module-docheader:after,.modulemenu .modulemenu-group-header:after,.modulemenu .modulemenu-item-link:after,.panel-heading:after{content:"";display:table;clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;background-color:transparent;border:0}.affix{position:fixed}@-ms-viewport{width:device-width}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}.hidden-lg{display:none!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}.hidden-print{display:none!important}}.chosen-container{position:relative;display:inline-block;vertical-align:middle;font-size:13px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chosen-container *{box-sizing:border-box}.chosen-container .chosen-drop{position:absolute;top:100%;z-index:1010;width:100%;border:1px solid #aaa;border-top:0;background:#fff;box-shadow:0 4px 5px rgba(0,0,0,.15);clip:rect(0,0,0,0)}.chosen-container.chosen-with-drop .chosen-drop{clip:auto}.chosen-container a{cursor:pointer}.chosen-container .chosen-single .group-name,.chosen-container .search-choice .group-name{margin-right:4px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:400;color:#999}.chosen-container-single .chosen-single{position:relative;display:block;overflow:hidden;padding:0 0 0 8px;height:25px;border:1px solid #aaa;border-radius:2px;background-color:#fff;background-clip:padding-box;box-shadow:0 0 3px #fff inset,0 1px 1px rgba(0,0,0,.1);color:#444;text-decoration:none;white-space:nowrap;line-height:24px}.chosen-container-single .chosen-default{color:#999}.chosen-container-single .chosen-single span{display:block;overflow:hidden;margin-right:26px;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{position:absolute;top:6px;right:26px;display:block;width:12px;height:12px;font-size:1px}.chosen-container-single .chosen-single abbr:hover,.chosen-container-single.chosen-disabled .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single .chosen-single div{position:absolute;top:0;right:0;display:block;width:18px;height:100%}.chosen-container-single .chosen-single div b{display:block;width:100%;height:100%}.chosen-container-single .chosen-search{position:relative;z-index:1010;margin:0;padding:3px 4px;white-space:nowrap}.chosen-container-single .chosen-search input[type=text]{margin:1px 0;padding:4px 20px 4px 5px;width:100%;height:auto;outline:0;border:1px solid #aaa;font-size:1em;font-family:sans-serif;line-height:normal}.chosen-container-single .chosen-drop{margin-top:-1px;background-clip:padding-box}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;clip:rect(0,0,0,0)}.chosen-container .chosen-results{color:#444;position:relative;overflow-x:hidden;overflow-y:auto;margin:0 4px 4px 0;padding:0 0 0 4px;max-height:240px;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;margin:0;padding:5px 6px;list-style:none;line-height:15px;word-wrap:break-word;-webkit-touch-callout:none}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#ccc;cursor:default}.chosen-container .chosen-results li.highlighted{background-color:#e8a33d;color:#fff}.chosen-container .chosen-results li.no-results{color:#777;display:list-item;background:#f4f4f4}.chosen-container .chosen-results li.group-result{display:list-item;font-weight:700;cursor:default}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{position:relative;overflow:hidden;margin:0;padding:0 5px;width:100%;height:auto;border:1px solid #aaa;background-color:#fff;cursor:text}.chosen-container-multi .chosen-choices li{float:left;list-style:none}.chosen-container-multi .chosen-choices li.search-field{margin:0;padding:0;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input[type=text]{margin:1px 0;padding:0;height:25px;outline:0;border:0!important;background:0 0!important;box-shadow:none;color:#999;font-size:100%;font-family:sans-serif;line-height:normal;width:25px}.chosen-container-multi .chosen-choices li.search-choice{position:relative;margin:3px 5px 3px 0;padding:4px 20px 4px 5px;max-width:100%;background-color:#e8a33d;background-clip:padding-box;color:#fff;line-height:13px;cursor:default}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:4px;right:5px;display:block;width:12px;height:12px}.caret:after,.panel-heading{position:relative}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{text-decoration:none}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:after{content:"ï€";font-family:FontAwesome;padding-left:2px;vertical-align:top;color:#fff}.chosen-container-multi .chosen-choices li.search-choice-disabled{padding-right:5px;border:1px solid #ccc;background-color:#e4e4e4;color:#666}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close{background-position:-42px -10px}.chosen-container-multi .chosen-results{margin:0;padding:0}.chosen-container-multi .chosen-drop .result-selected{display:list-item;color:#ccc;cursor:default}.chosen-container-active .chosen-single{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active.chosen-with-drop .chosen-single div{border-left:none;background:0 0}.chosen-container-active.chosen-with-drop .chosen-single div b{background-position:-18px 2px}.chosen-container-active .chosen-choices{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#222!important}.chosen-disabled{opacity:.5!important;cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close,.chosen-disabled .chosen-single{cursor:default}.chosen-rtl{text-align:right}.chosen-rtl .chosen-single{overflow:visible;padding:0 8px 0 0}.chosen-rtl .chosen-single span{margin-right:0;margin-left:26px;direction:rtl}.chosen-rtl .chosen-single-with-deselect span{margin-left:38px}.chosen-rtl .chosen-single div{right:auto;left:3px}.chosen-rtl .chosen-single abbr{right:auto;left:26px}.chosen-rtl .chosen-choices li{float:right}.chosen-rtl .chosen-choices li.search-field input[type=text]{direction:rtl}.chosen-rtl .chosen-choices li.search-choice{margin:3px 5px 3px 0;padding:3px 5px 3px 19px}.chosen-rtl .chosen-choices li.search-choice .search-choice-close{right:auto;left:4px}.chosen-rtl.chosen-container-single .chosen-results{margin:0 0 4px 4px;padding:0 4px 0 0}.content-area>:last-child,.typo3-message>h4{margin-bottom:0}.chosen-rtl .chosen-results li.group-option{padding-right:15px;padding-left:0}.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div{border-right:none}.chosen-rtl .chosen-search input[type=text]{padding:4px 5px 4px 20px;direction:rtl}.chosen-rtl.chosen-container-single .chosen-single div b{background-position:6px 2px}.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b{background-position:-12px 2px}.content-area{padding-bottom:35px}.content-area>h3{margin-top:0}.logo-pageheader img{padding-bottom:3px}img.logo{vertical-align:bottom}.typo3-message p{margin-top:9px}.t3-install-displaytwinimageimages{border:1px solid #ccc;padding:10px}.t3-install-displaytwinimagetextarea pre{border-top:0}.bg-transparent-emulation{padding:10px;text-align:center;background:url(../../../../../../typo3/sysext/install/Resources/Public/Images/bg_transparent_emulation.png)}.bg-transparent-emulation img{max-width:300px}.alert-notice{background-color:#eee;border-color:#bbb;color:#333}.alert-notice hr{border-top-color:#aeaeae}.alert-notice .alert-link{color:#1a1919}.nav-pills>li>a{border-radius:0}h1:first-child{margin-top:0}.typo3-docheader-buttons,.typo3-docheader-functions{min-height:20px}.item{margin:1em;border:1px solid #ddd}.item .item-heading{padding:1em;background-color:#ddd}.item .item-body{padding:1em}.list-group-item a{display:block}.list-group-item.active a{color:#fff}.caret{border:0;padding-left:10px}.caret:after{top:-8px;left:-10px;content:"";font-family:FontAwesome}.collapsed .caret:after{content:"";font-family:FontAwesome}.panel-heading .panel-checkbox{margin:0;position:absolute;left:1em;top:50%;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.panel-heading .panel-checkbox+.panel-title{padding-left:18px}.panel-heading .message{display:block;padding-left:16px;margin-top:5px}a[data-toggle=collapse]{display:block;text-decoration:none}@media (min-width:992px){.affix-bottom{position:absolute}body.standalone .affix-top{position:relative}.affix,body.backend .affix-top{position:fixed;top:35px}body.backend .leftNavigation{min-height:425px}}hr{border-top-color:#ddd}.copyright .panel-default:last-child{margin-bottom:0}#fixed-footer-handler{height:32px}.fixed{position:fixed;bottom:0;background-color:grey}.fixed .footer-innerWrap{padding:1.5em}@media (max-width:991px){#menuWrapper{position:relative!important;margin-bottom:30px}}#mobileMenuWrapper{margin-bottom:10px}#install-menu-button{float:right;margin-bottom:20px}#install-menu-button .navbar-toggle{border:0;background:#fff}#install-menu-button .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px;background-color:#000}#install-menu-button .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}.form-control-clearable{position:relative}.form-control-clearable .form-control{padding-right:2.3em}.form-control-clearable .close{position:absolute;height:16px;z-index:3;top:50%;right:.5em;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.form-control-clearable .close .icon{vertical-align:0}.input-group .form-control-clearable{display:table-cell}.input-group .form-control-clearable .form-control{display:block}.panel-group-flat .panel-body,.panel-group-rst .panel-body{padding-right:0}.panel-flat,.panel-rst,.panel-version{border:0;border-left:2px solid #d7d7d7;border-radius:0;margin:0}.panel-flat.panel-default .panel-heading,.panel-rst.panel-default .panel-heading,.panel-version.panel-default .panel-heading{background:#f5f5f5}.panel-flat.panel-breaking,.panel-flat.panel-danger,.panel-rst.panel-breaking,.panel-rst.panel-danger,.panel-version.panel-breaking,.panel-version.panel-danger{border-color:#c83c3c}.panel-flat.panel-breaking>.panel-heading,.panel-flat.panel-danger>.panel-heading,.panel-rst.panel-breaking>.panel-heading,.panel-rst.panel-danger>.panel-heading,.panel-version.panel-breaking>.panel-heading,.panel-version.panel-danger>.panel-heading{color:#fff;background-color:#c83c3c;border-color:#c83c3c}.panel-flat.panel-breaking>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-danger>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-breaking>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-danger>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-breaking>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#c83c3c}.panel-flat.panel-breaking>.panel-heading .badge,.panel-flat.panel-danger>.panel-heading .badge,.panel-rst.panel-breaking>.panel-heading .badge,.panel-rst.panel-danger>.panel-heading .badge,.panel-version.panel-breaking>.panel-heading .badge,.panel-version.panel-danger>.panel-heading .badge{color:#c83c3c;background-color:#fff}.panel-flat.panel-breaking>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-danger>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-breaking>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-danger>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-breaking>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#c83c3c}.panel-flat.panel-breaking.risk-high>.panel-heading,.panel-flat.panel-danger.risk-high>.panel-heading,.panel-rst.panel-breaking.risk-high>.panel-heading,.panel-rst.panel-danger.risk-high>.panel-heading,.panel-version.panel-breaking.risk-high>.panel-heading,.panel-version.panel-danger.risk-high>.panel-heading{background:#c83c3c;color:#f5f5f5}.panel-flat.panel-breaking.risk-medium>.panel-heading,.panel-flat.panel-danger.risk-medium>.panel-heading,.panel-rst.panel-breaking.risk-medium>.panel-heading,.panel-rst.panel-danger.risk-medium>.panel-heading,.panel-version.panel-breaking.risk-medium>.panel-heading,.panel-version.panel-danger.risk-medium>.panel-heading{background:#f5dbdb;color:#1e1e1e}.panel-flat.panel-breaking.risk-low>.panel-heading,.panel-flat.panel-danger.risk-low>.panel-heading,.panel-rst.panel-breaking.risk-low>.panel-heading,.panel-rst.panel-danger.risk-low>.panel-heading,.panel-version.panel-breaking.risk-low>.panel-heading,.panel-version.panel-danger.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-breaking .panel-progress .panel-progress-bar,.panel-flat.panel-danger .panel-progress .panel-progress-bar,.panel-rst.panel-breaking .panel-progress .panel-progress-bar,.panel-rst.panel-danger .panel-progress .panel-progress-bar,.panel-version.panel-breaking .panel-progress .panel-progress-bar,.panel-version.panel-danger .panel-progress .panel-progress-bar{background-color:#c83c3c}.panel-flat.panel-deprecation,.panel-flat.panel-warning,.panel-rst.panel-deprecation,.panel-rst.panel-warning,.panel-version.panel-deprecation,.panel-version.panel-warning{border-color:#e8a33d}.panel-flat.panel-deprecation>.panel-heading,.panel-flat.panel-warning>.panel-heading,.panel-rst.panel-deprecation>.panel-heading,.panel-rst.panel-warning>.panel-heading,.panel-version.panel-deprecation>.panel-heading,.panel-version.panel-warning>.panel-heading{color:#fff;background-color:#e8a33d;border-color:#e8a33d}.panel-flat.panel-deprecation>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-warning>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-deprecation>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-warning>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-deprecation>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e8a33d}.panel-flat.panel-deprecation>.panel-heading .badge,.panel-flat.panel-warning>.panel-heading .badge,.panel-rst.panel-deprecation>.panel-heading .badge,.panel-rst.panel-warning>.panel-heading .badge,.panel-version.panel-deprecation>.panel-heading .badge,.panel-version.panel-warning>.panel-heading .badge{color:#e8a33d;background-color:#fff}.panel-flat.panel-deprecation>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-warning>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-deprecation>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-warning>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-deprecation>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e8a33d}.panel-flat.panel-deprecation.risk-high>.panel-heading,.panel-flat.panel-warning.risk-high>.panel-heading,.panel-rst.panel-deprecation.risk-high>.panel-heading,.panel-rst.panel-warning.risk-high>.panel-heading,.panel-version.panel-deprecation.risk-high>.panel-heading,.panel-version.panel-warning.risk-high>.panel-heading{background:#e8a33d;color:#f5f5f5}.panel-flat.panel-deprecation.risk-medium>.panel-heading,.panel-flat.panel-warning.risk-medium>.panel-heading,.panel-rst.panel-deprecation.risk-medium>.panel-heading,.panel-rst.panel-warning.risk-medium>.panel-heading,.panel-version.panel-deprecation.risk-medium>.panel-heading,.panel-version.panel-warning.risk-medium>.panel-heading{background:#f8e4c6;color:#1e1e1e}.panel-flat.panel-deprecation.risk-low>.panel-heading,.panel-flat.panel-warning.risk-low>.panel-heading,.panel-rst.panel-deprecation.risk-low>.panel-heading,.panel-rst.panel-warning.risk-low>.panel-heading,.panel-version.panel-deprecation.risk-low>.panel-heading,.panel-version.panel-warning.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-deprecation .panel-progress .panel-progress-bar,.panel-flat.panel-warning .panel-progress .panel-progress-bar,.panel-rst.panel-deprecation .panel-progress .panel-progress-bar,.panel-rst.panel-warning .panel-progress .panel-progress-bar,.panel-version.panel-deprecation .panel-progress .panel-progress-bar,.panel-version.panel-warning .panel-progress .panel-progress-bar{background-color:#e8a33d}.panel-flat.panel-feature,.panel-flat.panel-success,.panel-rst.panel-feature,.panel-rst.panel-success,.panel-version.panel-feature,.panel-version.panel-success{border-color:#79a548}.panel-flat.panel-feature>.panel-heading,.panel-flat.panel-success>.panel-heading,.panel-rst.panel-feature>.panel-heading,.panel-rst.panel-success>.panel-heading,.panel-version.panel-feature>.panel-heading,.panel-version.panel-success>.panel-heading{color:#fff;background-color:#79a548;border-color:#79a548}.panel-flat.panel-feature>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-success>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-feature>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-success>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-feature>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#79a548}.panel-flat.panel-feature>.panel-heading .badge,.panel-flat.panel-success>.panel-heading .badge,.panel-rst.panel-feature>.panel-heading .badge,.panel-rst.panel-success>.panel-heading .badge,.panel-version.panel-feature>.panel-heading .badge,.panel-version.panel-success>.panel-heading .badge{color:#79a548;background-color:#fff}.panel-flat.panel-feature>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-success>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-feature>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-success>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-feature>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#79a548}.panel-flat.panel-feature.risk-high>.panel-heading,.panel-flat.panel-success.risk-high>.panel-heading,.panel-rst.panel-feature.risk-high>.panel-heading,.panel-rst.panel-success.risk-high>.panel-heading,.panel-version.panel-feature.risk-high>.panel-heading,.panel-version.panel-success.risk-high>.panel-heading{background:#79a548;color:#f5f5f5}.panel-flat.panel-feature.risk-medium>.panel-heading,.panel-flat.panel-success.risk-medium>.panel-heading,.panel-rst.panel-feature.risk-medium>.panel-heading,.panel-rst.panel-success.risk-medium>.panel-heading,.panel-version.panel-feature.risk-medium>.panel-heading,.panel-version.panel-success.risk-medium>.panel-heading{background:#ddeacf;color:#1e1e1e}.panel-flat.panel-feature.risk-low>.panel-heading,.panel-flat.panel-success.risk-low>.panel-heading,.panel-rst.panel-feature.risk-low>.panel-heading,.panel-rst.panel-success.risk-low>.panel-heading,.panel-version.panel-feature.risk-low>.panel-heading,.panel-version.panel-success.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-feature .panel-progress .panel-progress-bar,.panel-flat.panel-success .panel-progress .panel-progress-bar,.panel-rst.panel-feature .panel-progress .panel-progress-bar,.panel-rst.panel-success .panel-progress .panel-progress-bar,.panel-version.panel-feature .panel-progress .panel-progress-bar,.panel-version.panel-success .panel-progress .panel-progress-bar{background-color:#79a548}.panel-flat.panel-important,.panel-flat.panel-info,.panel-rst.panel-important,.panel-rst.panel-info,.panel-version.panel-important,.panel-version.panel-info{border-color:#6daae0}.panel-flat.panel-important>.panel-heading,.panel-flat.panel-info>.panel-heading,.panel-rst.panel-important>.panel-heading,.panel-rst.panel-info>.panel-heading,.panel-version.panel-important>.panel-heading,.panel-version.panel-info>.panel-heading{color:#fff;background-color:#6daae0;border-color:#6daae0}.panel-flat.panel-important>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-info>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-important>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-info>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-important>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#6daae0}.panel-flat.panel-important>.panel-heading .badge,.panel-flat.panel-info>.panel-heading .badge,.panel-rst.panel-important>.panel-heading .badge,.panel-rst.panel-info>.panel-heading .badge,.panel-version.panel-important>.panel-heading .badge,.panel-version.panel-info>.panel-heading .badge{color:#6daae0;background-color:#fff}.panel-flat.panel-important>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-info>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-important>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-info>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-important>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#6daae0}.panel-flat.panel-important.risk-high>.panel-heading,.panel-flat.panel-info.risk-high>.panel-heading,.panel-rst.panel-important.risk-high>.panel-heading,.panel-rst.panel-info.risk-high>.panel-heading,.panel-version.panel-important.risk-high>.panel-heading,.panel-version.panel-info.risk-high>.panel-heading{background:#6daae0;color:#f5f5f5}.panel-flat.panel-important.risk-medium>.panel-heading,.panel-flat.panel-info.risk-medium>.panel-heading,.panel-rst.panel-important.risk-medium>.panel-heading,.panel-rst.panel-info.risk-medium>.panel-heading,.panel-version.panel-important.risk-medium>.panel-heading,.panel-version.panel-info.risk-medium>.panel-heading{background:#ebf3fb;color:#1e1e1e}.panel-flat.panel-important.risk-low>.panel-heading,.panel-flat.panel-info.risk-low>.panel-heading,.panel-rst.panel-important.risk-low>.panel-heading,.panel-rst.panel-info.risk-low>.panel-heading,.panel-version.panel-important.risk-low>.panel-heading,.panel-version.panel-info.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-important .panel-progress .panel-progress-bar,.panel-flat.panel-info .panel-progress .panel-progress-bar,.panel-rst.panel-important .panel-progress .panel-progress-bar,.panel-rst.panel-info .panel-progress .panel-progress-bar,.panel-version.panel-important .panel-progress .panel-progress-bar,.panel-version.panel-info .panel-progress .panel-progress-bar{background-color:#6daae0}.panel-flat .panel-heading,.panel-rst .panel-heading,.panel-version .panel-heading{position:relative}.panel-flat .panel-heading a.link-action,.panel-rst .panel-heading a.link-action,.panel-version .panel-heading a.link-action{cursor:pointer}.panel-flat .panel-heading strong,.panel-rst .panel-heading strong,.panel-version .panel-heading strong{line-height:1.5em}.panel-flat pre,.panel-rst pre,.panel-version pre{margin:0;border-radius:0;border:0;border-top:1px solid #d7d7d7;white-space:pre-wrap;word-break:normal;word-wrap:normal}.upgrade_analysis_item_to_filter pre a{text-decoration:underline}#phpinfo table{width:100%;table-layout:fixed;word-wrap:break-word} \ No newline at end of file +@charset "UTF-8";hr,img{border:0}.fa-ul,.gridder{list-style-type:none}.fa-ul>li,sub,sup{position:relative}.fa-fw,.fa-li{text-align:center}.img-responsive,.img-thumbnail,.table,label{max-width:100%}.btn,.modulemenu .modulemenu-group-header{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}.fa,.fa-stack{display:inline-block}a:active,a:hover{outline:0}b,optgroup,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{background:#ff0;color:#000}.btn,.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active,.btn.active,.btn:active,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover,.form-control,.open>.btn-danger.dropdown-toggle,.open>.btn-default.dropdown-toggle,.open>.btn-info.dropdown-toggle,.open>.btn-success.dropdown-toggle,.open>.btn-warning.dropdown-toggle{background-image:none}sub,sup{font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}hr{box-sizing:content-box;height:0}pre,textarea{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}.fa.fa-pull-left,.fa.pull-left{margin-right:.3em}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}td,th{padding:0}@font-face{font-family:FontAwesome;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.eot?v=4.7.0);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.eot?#iefix&v=4.7.0) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.woff2?v=4.7.0) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.woff?v=4.7.0) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.ttf?v=4.7.0) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa{font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-stack,img{vertical-align:middle}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em}.fa-ul{padding-left:0;margin-left:2.14285714em}.fa.fa-pull-right,.fa.pull-right{margin-left:.3em}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{position:relative;width:2em;height:2em;line-height:2em}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:"ï€"}.fa-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:"ï€"}.fa-search-plus:before{content:""}.fa-search-minus:before{content:"ï€"}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:"ï€"}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before{content:"ï€"}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:"ï€"}.fa-map-marker:before{content:"ï"}.fa-adjust:before{content:"ï‚"}.fa-tint:before{content:"ïƒ"}.fa-edit:before,.fa-pencil-square-o:before{content:"ï„"}.fa-share-square-o:before{content:"ï…"}.fa-check-square-o:before{content:"ï†"}.fa-arrows:before{content:"ï‡"}.fa-step-backward:before{content:"ïˆ"}.fa-fast-backward:before{content:"ï‰"}.fa-backward:before{content:"ïŠ"}.fa-play:before{content:"ï‹"}.fa-pause:before{content:"ïŒ"}.fa-stop:before{content:"ï"}.fa-forward:before{content:"ïŽ"}.fa-fast-forward:before{content:"ï"}.fa-step-forward:before{content:"ï‘"}.fa-eject:before{content:"ï’"}.fa-chevron-left:before{content:"ï“"}.fa-chevron-right:before{content:"ï”"}.fa-plus-circle:before{content:"ï•"}.fa-minus-circle:before{content:"ï–"}.fa-times-circle:before{content:"ï—"}.fa-check-circle:before{content:"ï˜"}.fa-question-circle:before{content:"ï™"}.fa-info-circle:before{content:"ïš"}.fa-crosshairs:before{content:"ï›"}.fa-times-circle-o:before{content:"ïœ"}.fa-check-circle-o:before{content:"ï"}.fa-ban:before{content:"ïž"}.fa-arrow-left:before{content:"ï "}.fa-arrow-right:before{content:"ï¡"}.fa-arrow-up:before{content:"ï¢"}.fa-arrow-down:before{content:"ï£"}.fa-mail-forward:before,.fa-share:before{content:"ï¤"}.fa-expand:before{content:"ï¥"}.fa-compress:before{content:"ï¦"}.fa-plus:before{content:"ï§"}.fa-minus:before{content:"ï¨"}.fa-asterisk:before{content:"ï©"}.fa-exclamation-circle:before{content:"ïª"}.fa-gift:before{content:"ï«"}.fa-leaf:before{content:"ï¬"}.fa-fire:before{content:"ï"}.fa-eye:before{content:"ï®"}.fa-eye-slash:before{content:"ï°"}.fa-exclamation-triangle:before,.fa-warning:before{content:"ï±"}.fa-plane:before{content:"ï²"}.fa-calendar:before{content:"ï³"}.fa-random:before{content:"ï´"}.fa-comment:before{content:"ïµ"}.fa-magnet:before{content:"ï¶"}.fa-chevron-up:before{content:"ï·"}.fa-chevron-down:before{content:"ï¸"}.fa-retweet:before{content:"ï¹"}.fa-shopping-cart:before{content:"ïº"}.fa-folder:before{content:"ï»"}.fa-folder-open:before{content:"ï¼"}.fa-arrows-v:before{content:"ï½"}.fa-arrows-h:before{content:"ï¾"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"ï‚€"}.fa-twitter-square:before{content:"ï‚"}.fa-facebook-square:before{content:"ï‚‚"}.fa-camera-retro:before{content:""}.fa-key:before{content:"ï‚„"}.fa-cogs:before,.fa-gears:before{content:"ï‚…"}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:"ï‚Š"}.fa-sign-out:before{content:"ï‚‹"}.fa-linkedin-square:before{content:"ï‚Œ"}.fa-thumb-tack:before{content:"ï‚"}.fa-external-link:before{content:"ï‚Ž"}.fa-sign-in:before{content:"ï‚"}.fa-trophy:before{content:"ï‚‘"}.fa-github-square:before{content:"ï‚’"}.fa-upload:before{content:"ï‚“"}.fa-lemon-o:before{content:"ï‚”"}.fa-phone:before{content:"ï‚•"}.fa-square-o:before{content:"ï‚–"}.fa-bookmark-o:before{content:"ï‚—"}.fa-phone-square:before{content:""}.fa-twitter:before{content:"ï‚™"}.fa-facebook-f:before,.fa-facebook:before{content:"ï‚š"}.fa-github:before{content:"ï‚›"}.fa-unlock:before{content:"ï‚œ"}.fa-credit-card:before{content:"ï‚"}.fa-feed:before,.fa-rss:before{content:"ï‚ž"}.fa-hdd-o:before{content:"ï‚ "}.fa-bullhorn:before{content:"ï‚¡"}.fa-bell:before{content:""}.fa-certificate:before{content:"ï‚£"}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:"ï‚¥"}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before{content:""}.fa-arrow-circle-right:before{content:"ï‚©"}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:"ï‚«"}.fa-globe:before{content:""}.fa-wrench:before{content:"ï‚"}.fa-tasks:before{content:"ï‚®"}.fa-filter:before{content:"ï‚°"}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before{content:"ïƒ"}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:"ïƒ"}.fa-table:before{content:""}.fa-magic:before{content:"ïƒ"}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:"ïƒ"}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:"ïƒ "}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:"ïƒ"}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:"ï‚¢"}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:"ï„€"}.fa-angle-double-right:before{content:"ï„"}.fa-angle-double-up:before{content:"ï„‚"}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:"ï„„"}.fa-angle-right:before{content:"ï„…"}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:"ï„Š"}.fa-mobile-phone:before,.fa-mobile:before{content:"ï„‹"}.fa-circle-o:before{content:"ï„Œ"}.fa-quote-left:before{content:"ï„"}.fa-quote-right:before{content:"ï„Ž"}.fa-spinner:before{content:"ï„"}.fa-circle:before{content:"ï„‘"}.fa-mail-reply:before,.fa-reply:before{content:"ï„’"}.fa-github-alt:before{content:"ï„“"}.fa-folder-o:before{content:"ï„”"}.fa-folder-open-o:before{content:"ï„•"}.fa-smile-o:before{content:""}.fa-frown-o:before{content:"ï„™"}.fa-meh-o:before{content:"ï„š"}.fa-gamepad:before{content:"ï„›"}.fa-keyboard-o:before{content:"ï„œ"}.fa-flag-o:before{content:"ï„"}.fa-flag-checkered:before{content:"ï„ž"}.fa-terminal:before{content:"ï„ "}.fa-code:before{content:"ï„¡"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"ï„¢"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"ï„£"}.fa-location-arrow:before{content:""}.fa-crop:before{content:"ï„¥"}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:"ï„©"}.fa-exclamation:before{content:""}.fa-superscript:before{content:"ï„«"}.fa-subscript:before{content:""}.fa-eraser:before{content:"ï„"}.fa-puzzle-piece:before{content:"ï„®"}.fa-microphone:before{content:"ï„°"}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:"ï„´"}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:"ï„·"}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:"ï„»"}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:"ï…€"}.fa-ellipsis-h:before{content:"ï…"}.fa-ellipsis-v:before{content:"ï…‚"}.fa-rss-square:before{content:"ï…ƒ"}.fa-play-circle:before{content:"ï…„"}.fa-ticket:before{content:"ï……"}.fa-minus-square:before{content:"ï…†"}.fa-minus-square-o:before{content:"ï…‡"}.fa-level-up:before{content:"ï…ˆ"}.fa-level-down:before{content:"ï…‰"}.fa-check-square:before{content:"ï…Š"}.fa-pencil-square:before{content:"ï…‹"}.fa-external-link-square:before{content:"ï…Œ"}.fa-share-square:before{content:"ï…"}.fa-compass:before{content:"ï…Ž"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"ï…"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"ï…‘"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"ï…’"}.fa-eur:before,.fa-euro:before{content:"ï…“"}.fa-gbp:before{content:"ï…”"}.fa-dollar:before,.fa-usd:before{content:"ï…•"}.fa-inr:before,.fa-rupee:before{content:"ï…–"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"ï…—"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"ï…˜"}.fa-krw:before,.fa-won:before{content:"ï…™"}.fa-bitcoin:before,.fa-btc:before{content:"ï…š"}.fa-file:before{content:"ï…›"}.fa-file-text:before{content:"ï…œ"}.fa-sort-alpha-asc:before{content:"ï…"}.fa-sort-alpha-desc:before{content:"ï…ž"}.fa-sort-amount-asc:before{content:"ï… "}.fa-sort-amount-desc:before{content:"ï…¡"}.fa-sort-numeric-asc:before{content:"ï…¢"}.fa-sort-numeric-desc:before{content:"ï…£"}.fa-thumbs-up:before{content:"ï…¤"}.fa-thumbs-down:before{content:"ï…¥"}.fa-youtube-square:before{content:"ï…¦"}.fa-youtube:before{content:"ï…§"}.fa-xing:before{content:"ï…¨"}.fa-xing-square:before{content:"ï…©"}.fa-youtube-play:before{content:"ï…ª"}.fa-dropbox:before{content:"ï…«"}.fa-stack-overflow:before{content:"ï…¬"}.fa-instagram:before{content:"ï…"}.fa-flickr:before{content:"ï…®"}.fa-adn:before{content:"ï…°"}.fa-bitbucket:before{content:"ï…±"}.fa-bitbucket-square:before{content:"ï…²"}.fa-tumblr:before{content:"ï…³"}.fa-tumblr-square:before{content:"ï…´"}.fa-long-arrow-down:before{content:"ï…µ"}.fa-long-arrow-up:before{content:"ï…¶"}.fa-long-arrow-left:before{content:"ï…·"}.fa-long-arrow-right:before{content:"ï…¸"}.fa-apple:before{content:"ï…¹"}.fa-windows:before{content:"ï…º"}.fa-android:before{content:"ï…»"}.fa-linux:before{content:"ï…¼"}.fa-dribbble:before{content:"ï…½"}.fa-skype:before{content:"ï…¾"}.fa-foursquare:before{content:""}.fa-trello:before{content:"ï†"}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:"ï†"}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:"ï†"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:"ï†"}.fa-yahoo:before{content:""}.fa-google:before{content:"ï† "}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:"ï†"}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:"ï‡"}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"ï‡"}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"ï‡"}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:"ï‡"}.fa-sliders:before{content:""}.fa-share-alt:before{content:"ï‡ "}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:"ï‡"}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:"ïˆ"}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:"ïˆ"}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:"ïˆ"}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:"ïˆ"}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:"ïˆ"}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"ï‰"}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:"ï‰"}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:"ï‰"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:"ï‰"}.fa-creative-commons:before{content:""}.fa-gg:before{content:"ï‰ "}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:"ï‰"}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:"ïŠ"}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:"ïŠ"}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:"ïŠ"}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:"ïŠ"}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:"ïŠ "}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:"ïŠ"}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:"ï‹€"}.fa-id-badge:before{content:"ï‹"}.fa-drivers-license:before,.fa-id-card:before{content:"ï‹‚"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:"ï‹„"}.fa-free-code-camp:before{content:"ï‹…"}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"ï‹Š"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"ï‹‹"}.fa-shower:before{content:"ï‹Œ"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"ï‹"}.fa-podcast:before{content:"ï‹Ž"}.fa-window-maximize:before{content:"ï‹"}.fa-window-minimize:before{content:"ï‹‘"}.fa-window-restore:before{content:"ï‹’"}.fa-times-rectangle:before,.fa-window-close:before{content:"ï‹“"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"ï‹”"}.fa-bandcamp:before{content:"ï‹•"}.fa-grav:before{content:"ï‹–"}.fa-etsy:before{content:"ï‹—"}.fa-imdb:before{content:""}.fa-ravelry:before{content:"ï‹™"}.fa-eercast:before{content:"ï‹š"}.fa-microchip:before{content:"ï‹›"}.fa-snowflake-o:before{content:"ï‹œ"}.fa-superpowers:before{content:"ï‹"}.fa-wpexplorer:before{content:"ï‹ž"}.fa-meetup:before{content:"ï‹ "}@font-face{font-family:Share;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bold-webfont.eot);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bold-webfont.eot?#iefix) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bold-webfont.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bold-webfont.ttf) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bold-webfont.svg#Share-BoldRegular) format("svg");font-weight:700;font-style:normal}@font-face{font-family:Share;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-italic-webfont.eot);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-italic-webfont.eot?#iefix) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-italic-webfont.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-italic-webfont.ttf) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-italic-webfont.svg#Share-ItalicRegular) format("svg");font-weight:400;font-style:italic}@font-face{font-family:Share;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-regular-webfont.eot);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-regular-webfont.eot?#iefix) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-regular-webfont.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-regular-webfont.ttf) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-regular-webfont.svg#Share-Regular) format("svg");font-weight:400;font-style:normal}@font-face{font-family:Share;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bolditalic-webfont.eot);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bolditalic-webfont.eot?#iefix) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bolditalic-webfont.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bolditalic-webfont.ttf) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/Share/share-bolditalic-webfont.svg#Share-BoldItalicRegular) format("svg");font-weight:700;font-style:italic}*,:after,:before{box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;line-height:1.5;color:#000;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{background-color:transparent;color:#212424;text-decoration:none}a:focus,a:hover{color:#000;text-decoration:underline}a:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}figure{margin:0}.img-responsive{display:block;height:auto}.img-rounded{border-radius:2px}.img-thumbnail{padding:4px;line-height:1.5;background-color:#fff;border:1px solid #ddd;border-radius:2px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;height:auto}.img-circle{border-radius:50%}hr{margin-top:18px;margin-bottom:18px;border-top:1px solid #7a7a7a}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#737373}.h1,.h2,.h3,h1,h2,h3{margin-top:18px;margin-bottom:9px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:9px;margin-bottom:9px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:27px}.h2,h2{font-size:19px}.h3,h3{font-size:17px}.h4,h4{font-size:15px}.h5,h5{font-size:12px}.h6,h6{font-size:11px}p{margin:0 0 9px}.lead{margin-bottom:18px;font-size:13px;font-weight:300;line-height:1.4}dt,kbd kbd,label{font-weight:700}@media (min-width:768px){.lead{font-size:18px}}.small,small{font-size:91%}.mark,mark{background-color:#fbefdd;padding:.2em}.list-inline,.list-unstyled,.modulemenu .modulemenu-group-container{padding-left:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.initialism,.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#737373}.text-primary{color:#0078e6}a.text-primary:focus,a.text-primary:hover{color:#005db3}.text-success{color:#79a548}a.text-success:focus,a.text-success:hover{color:#5f8139}.text-info{color:#6daae0}a.text-info:focus,a.text-info:hover{color:#4392d7}.text-warning{color:#e8a33d}a.text-warning:focus,a.text-warning:hover{color:#d88b1a}.text-danger{color:#c83c3c}a.text-danger:focus,a.text-danger:hover{color:#a32e2e}.bg-primary{color:#fff;background-color:#0078e6}a.bg-primary:focus,a.bg-primary:hover{background-color:#005db3}.bg-success{background-color:#d1e2bd}a.bg-success:focus,a.bg-success:hover{background-color:#b8d39a}.bg-info{background-color:#ebf3fb}a.bg-info:focus,a.bg-info:hover{background-color:#c1dbf2}.bg-warning{background-color:#fbefdd}a.bg-warning:focus,a.bg-warning:hover{background-color:#f6d9af}.bg-danger{background-color:#efc7c7}a.bg-danger:focus,a.bg-danger:hover{background-color:#e49f9f}.page-header{padding-bottom:8px;margin:36px 0 18px;border-bottom:1px solid #f5f5f5}dl,ol,ul{margin-top:0}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child,ol ol,ol ul,ul ol,ul ul{margin-bottom:0}address,dl{margin-bottom:18px}ol,ul{margin-bottom:9px}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dd,dt{line-height:1.5}dd{margin-left:0}.dl-horizontal dd:after{content:"";display:table;clear:both}@media (min-width:992px){.dl-horizontal dt{float:left;width:70px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:90px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #d7d7d7}.initialism{font-size:90%}blockquote{padding:9px 18px;margin:0 0 18px;font-size:15px;border-left:5px solid #f5f5f5}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.5;color:#d7d7d7}legend,pre{color:#5a5a5a}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #f5f5f5;border-left:0;text-align:right}code,kbd{padding:2px 4px;font-size:90%;border-radius:2px}caption,th{text-align:left}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{font-style:normal;line-height:1.5}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{color:#c7254e;background-color:#f9f2f4}kbd{color:#fff;background-color:#333;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{display:block;padding:8.5px;margin:0 0 9px;font-size:11px;line-height:1.5;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:2px}.container-fluid:after,.container:after,.row:after{display:table;content:"";clear:both}.container,.container-fluid{margin-right:auto;margin-left:auto}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.container,.container-fluid{padding-left:15px;padding-right:15px}.pre-scrollable{max-height:340px;overflow-y:scroll}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-left:-15px;margin-right:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-1{width:8.33333333%}.col-xs-2{width:16.66666667%}.col-xs-3{width:25%}.col-xs-4{width:33.33333333%}.col-xs-5{width:41.66666667%}.col-xs-6{width:50%}.col-xs-7{width:58.33333333%}.col-xs-8{width:66.66666667%}.col-xs-9{width:75%}.col-xs-10{width:83.33333333%}.col-xs-11{width:91.66666667%}.col-xs-12{width:100%}.col-xs-pull-0{right:auto}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-3{right:25%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-6{right:50%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-9{right:75%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-12{right:100%}.col-xs-push-0{left:auto}.col-xs-push-1{left:8.33333333%}.col-xs-push-2{left:16.66666667%}.col-xs-push-3{left:25%}.col-xs-push-4{left:33.33333333%}.col-xs-push-5{left:41.66666667%}.col-xs-push-6{left:50%}.col-xs-push-7{left:58.33333333%}.col-xs-push-8{left:66.66666667%}.col-xs-push-9{left:75%}.col-xs-push-10{left:83.33333333%}.col-xs-push-11{left:91.66666667%}.col-xs-push-12{left:100%}.col-xs-offset-0{margin-left:0}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-12{margin-left:100%}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-1{width:8.33333333%}.col-sm-2{width:16.66666667%}.col-sm-3{width:25%}.col-sm-4{width:33.33333333%}.col-sm-5{width:41.66666667%}.col-sm-6{width:50%}.col-sm-7{width:58.33333333%}.col-sm-8{width:66.66666667%}.col-sm-9{width:75%}.col-sm-10{width:83.33333333%}.col-sm-11{width:91.66666667%}.col-sm-12{width:100%}.col-sm-pull-0{right:auto}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-12{right:100%}.col-sm-push-0{left:auto}.col-sm-push-1{left:8.33333333%}.col-sm-push-2{left:16.66666667%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333333%}.col-sm-push-5{left:41.66666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.33333333%}.col-sm-push-8{left:66.66666667%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333333%}.col-sm-push-11{left:91.66666667%}.col-sm-push-12{left:100%}.col-sm-offset-0{margin-left:0}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-12{margin-left:100%}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-1{width:8.33333333%}.col-md-2{width:16.66666667%}.col-md-3{width:25%}.col-md-4{width:33.33333333%}.col-md-5{width:41.66666667%}.col-md-6{width:50%}.col-md-7{width:58.33333333%}.col-md-8{width:66.66666667%}.col-md-9{width:75%}.col-md-10{width:83.33333333%}.col-md-11{width:91.66666667%}.col-md-12{width:100%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.33333333%}.col-md-pull-2{right:16.66666667%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333333%}.col-md-pull-5{right:41.66666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.33333333%}.col-md-pull-8{right:66.66666667%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333333%}.col-md-pull-11{right:91.66666667%}.col-md-pull-12{right:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.33333333%}.col-md-push-2{left:16.66666667%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333333%}.col-md-push-5{left:41.66666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.33333333%}.col-md-push-8{left:66.66666667%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333333%}.col-md-push-11{left:91.66666667%}.col-md-push-12{left:100%}.col-md-offset-0{margin-left:0}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-12{margin-left:100%}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-1{width:8.33333333%}.col-lg-2{width:16.66666667%}.col-lg-3{width:25%}.col-lg-4{width:33.33333333%}.col-lg-5{width:41.66666667%}.col-lg-6{width:50%}.col-lg-7{width:58.33333333%}.col-lg-8{width:66.66666667%}.col-lg-9{width:75%}.col-lg-10{width:83.33333333%}.col-lg-11{width:91.66666667%}.col-lg-12{width:100%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-12{right:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.33333333%}.col-lg-push-2{left:16.66666667%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333333%}.col-lg-push-5{left:41.66666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.33333333%}.col-lg-push-8{left:66.66666667%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333333%}.col-lg-push-11{left:91.66666667%}.col-lg-push-12{left:100%}.col-lg-offset-0{margin-left:0}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-12{margin-left:100%}}table{border-collapse:collapse;border-spacing:0;background-color:#fafafa}caption{padding-top:6px;padding-bottom:6px;color:#737373}.table{width:100%;margin-bottom:18px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:6px;line-height:1.5;vertical-align:top;border-top:1px solid #ccc}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ccc}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ccc}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:6px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ccc}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f7f7f7}.table-hover>tbody>tr:hover,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#ededed}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.btn-group>.btn-group,.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group,.dropdown-menu{float:left}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e1e0e0}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#d1e2bd}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#c4dbab}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#ebf3fb}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#d6e7f6}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fbefdd}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#f8e4c6}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#efc7c7}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#eab3b3}.table-responsive{overflow-x:auto;min-height:.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:13.5px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ccc}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}.carousel-inner,.collapsing,.dropdown-menu .divider,.embed-responsive,.modal,.modal-open,.nav .nav-divider,.progress,html{overflow:hidden}fieldset,legend{padding:0;border:0}fieldset{margin:0;min-width:0}legend{display:block;width:100%;margin-bottom:18px;font-size:18px;line-height:inherit;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px}input[type=search]{box-sizing:border-box;-webkit-appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}.form-control,output{font-size:12px;line-height:1.5;color:#333;display:block}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=radio]:focus,input[type=file]:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}output{padding-top:7px}.form-control{width:100%;height:32px;padding:6px;background-color:#fefefe;border:1px solid #bbb;border-radius:2px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#aaa;outline:0;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(170,170,170,.6)}.form-control::-moz-placeholder{color:#d7d7d7;opacity:1}.form-control:-ms-input-placeholder{color:#d7d7d7}.form-control::-webkit-input-placeholder{color:#d7d7d7}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#79a548}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#f5f5f5;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:32px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm>.input-group-btn>input[type=date].btn,.input-group-sm>.input-group-btn>input[type=time].btn,.input-group-sm>.input-group-btn>input[type=datetime-local].btn,.input-group-sm>.input-group-btn>input[type=month].btn,.input-group-sm>input[type=date].form-control,.input-group-sm>input[type=date].input-group-addon,.input-group-sm>input[type=time].form-control,.input-group-sm>input[type=time].input-group-addon,.input-group-sm>input[type=datetime-local].form-control,.input-group-sm>input[type=datetime-local].input-group-addon,.input-group-sm>input[type=month].form-control,.input-group-sm>input[type=month].input-group-addon,input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:26px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg>.input-group-btn>input[type=date].btn,.input-group-lg>.input-group-btn>input[type=time].btn,.input-group-lg>.input-group-btn>input[type=datetime-local].btn,.input-group-lg>.input-group-btn>input[type=month].btn,.input-group-lg>input[type=date].form-control,.input-group-lg>input[type=date].input-group-addon,.input-group-lg>input[type=time].form-control,.input-group-lg>input[type=time].input-group-addon,.input-group-lg>input[type=datetime-local].form-control,.input-group-lg>input[type=datetime-local].input-group-addon,.input-group-lg>input[type=month].form-control,.input-group-lg>input[type=month].input-group-addon,input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:41.2px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:18px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px;margin-top:4px\9}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:30px}.form-control-static.input-lg,.form-control-static.input-sm,.input-group-lg>.form-control-static.form-control,.input-group-lg>.form-control-static.input-group-addon,.input-group-lg>.input-group-btn>.form-control-static.btn,.input-group-sm>.form-control-static.form-control,.input-group-sm>.form-control-static.input-group-addon,.input-group-sm>.input-group-btn>.form-control-static.btn{padding-left:0;padding-right:0}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn,.input-sm{height:26px;padding:4px;font-size:11px;line-height:1.5;border-radius:2px}.input-group-sm>.input-group-btn>select.btn,.input-group-sm>select.form-control,.input-group-sm>select.input-group-addon,select.input-sm{height:26px;line-height:26px}.input-group-sm>.input-group-btn>select[multiple].btn,.input-group-sm>.input-group-btn>textarea.btn,.input-group-sm>select[multiple].form-control,.input-group-sm>select[multiple].input-group-addon,.input-group-sm>textarea.form-control,.input-group-sm>textarea.input-group-addon,select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:26px;padding:4px;font-size:11px;line-height:1.5;border-radius:2px}.form-group-sm select.form-control{height:26px;line-height:26px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:26px;min-height:29px;padding:5px 4px;font-size:11px;line-height:1.5}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn,.input-lg{height:41.2px;padding:12px;font-size:15px;line-height:1.3333333;border-radius:2px}.input-group-lg>.input-group-btn>select.btn,.input-group-lg>select.form-control,.input-group-lg>select.input-group-addon,select.input-lg{height:41.2px;line-height:41.2px}.input-group-lg>.input-group-btn>select[multiple].btn,.input-group-lg>.input-group-btn>textarea.btn,.input-group-lg>select[multiple].form-control,.input-group-lg>select[multiple].input-group-addon,.input-group-lg>textarea.form-control,.input-group-lg>textarea.input-group-addon,select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:41.2px;padding:12px;font-size:15px;line-height:1.3333333;border-radius:2px}.form-group-lg select.form-control{height:41.2px;line-height:41.2px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:41.2px;min-height:33px;padding:13px 12px;font-size:15px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:40px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:32px;height:32px;line-height:32px;text-align:center;pointer-events:none}.collapsing,.dropdown,.dropup{position:relative}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-group-lg>.form-control+.form-control-feedback,.input-group-lg>.input-group-addon+.form-control-feedback,.input-group-lg>.input-group-btn>.btn+.form-control-feedback,.input-lg+.form-control-feedback{width:41.2px;height:41.2px;line-height:41.2px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-group-sm>.form-control+.form-control-feedback,.input-group-sm>.input-group-addon+.form-control-feedback,.input-group-sm>.input-group-btn>.btn+.form-control-feedback,.input-sm+.form-control-feedback{width:26px;height:26px;line-height:26px}.has-success .form-control{border-color:#79a548;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#5f8139;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #abcb88}.has-success .input-group-addon{color:#79a548;border-color:#79a548;background-color:#d1e2bd}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#e8a33d}.has-warning .form-control{border-color:#e8a33d;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#d88b1a;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #f3ce98}.has-warning .input-group-addon{color:#e8a33d;border-color:#e8a33d;background-color:#fbefdd}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#c83c3c}.has-error .form-control{border-color:#c83c3c;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#a32e2e;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #de8c8c}.has-error .input-group-addon{color:#c83c3c;border-color:#c83c3c;background-color:#efc7c7}.has-feedback label~.form-control-feedback{top:23px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#404040}@media (min-width:768px){.form-inline .form-control-static,.form-inline .form-group{display:inline-block}.form-inline .control-label,.form-inline .form-group{margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.btn-block,input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:25px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-group:after{content:"";display:table;clear:both}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:13px;font-size:15px}.form-horizontal .form-group-sm .control-label{padding-top:5px;font-size:11px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;border:1px solid transparent;white-space:nowrap;padding:6px;font-size:12px;line-height:1.5;border-radius:2px;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#eee;border-color:#bbb}.btn-default.focus,.btn-default:focus{color:#333;background-color:#d5d4d4;border-color:#7b7b7b}.btn-default.active,.btn-default:active,.btn-default:hover,.open>.btn-default.dropdown-toggle{color:#333;background-color:#d5d4d4;border-color:#9c9c9c}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.btn-default.dropdown-toggle.focus,.open>.btn-default.dropdown-toggle:focus,.open>.btn-default.dropdown-toggle:hover{color:#333;background-color:#c3c3c3;border-color:#7b7b7b}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#eee;border-color:#bbb}.btn-default .badge{color:#eee;background-color:#333}.btn-primary{color:#fff;background-color:#0078e6;border-color:#006bcd}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#005db3;border-color:#00284d}.btn-primary.active,.btn-primary:active,.btn-primary:hover,.open>.btn-primary.dropdown-toggle{color:#fff;background-color:#005db3;border-color:#004b8f}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.btn-primary.dropdown-toggle.focus,.open>.btn-primary.dropdown-toggle:focus,.open>.btn-primary.dropdown-toggle:hover{color:#fff;background-color:#004b8f;border-color:#00284d}.btn-primary.active,.btn-primary:active,.open>.btn-primary.dropdown-toggle{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#0078e6;border-color:#006bcd}.btn-primary .badge{color:#0078e6;background-color:#fff}.btn-success{color:#fff;background-color:#79a548;border-color:#6c9340}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#5f8139;border-color:#2b3a1a}.btn-success.active,.btn-success:active,.btn-success:hover,.open>.btn-success.dropdown-toggle{color:#fff;background-color:#5f8139;border-color:#4d692e}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.btn-success.dropdown-toggle.focus,.open>.btn-success.dropdown-toggle:focus,.open>.btn-success.dropdown-toggle:hover{color:#fff;background-color:#4d692e;border-color:#2b3a1a}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#79a548;border-color:#6c9340}.btn-success .badge{color:#79a548;background-color:#fff}.btn-info{color:#fff;background-color:#6daae0;border-color:#589edc}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#4392d7;border-color:#205e94}.btn-info.active,.btn-info:active,.btn-info:hover,.open>.btn-info.dropdown-toggle{color:#fff;background-color:#4392d7;border-color:#2b80cb}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.btn-info.dropdown-toggle.focus,.open>.btn-info.dropdown-toggle:focus,.open>.btn-info.dropdown-toggle:hover{color:#fff;background-color:#2b80cb;border-color:#205e94}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#6daae0;border-color:#589edc}.btn-info .badge{color:#6daae0;background-color:#fff}.btn-warning{color:#fff;background-color:#e8a33d;border-color:#e59826}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#d88b1a;border-color:#7d510f}.btn-warning.active,.btn-warning:active,.btn-warning:hover,.open>.btn-warning.dropdown-toggle{color:#fff;background-color:#d88b1a;border-color:#b87716}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.btn-warning.dropdown-toggle.focus,.open>.btn-warning.dropdown-toggle:focus,.open>.btn-warning.dropdown-toggle:hover{color:#fff;background-color:#b87716;border-color:#7d510f}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#e8a33d;border-color:#e59826}.btn-warning .badge{color:#e8a33d;background-color:#fff}.btn-danger{color:#fff;background-color:#c83c3c;border-color:#b73434}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#a32e2e;border-color:#531818}.btn-danger.active,.btn-danger:active,.btn-danger:hover,.open>.btn-danger.dropdown-toggle{color:#fff;background-color:#a32e2e;border-color:#872626}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.btn-danger.dropdown-toggle.focus,.open>.btn-danger.dropdown-toggle:focus,.open>.btn-danger.dropdown-toggle:hover{color:#fff;background-color:#872626;border-color:#531818}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c83c3c;border-color:#b73434}.btn-danger .badge{color:#c83c3c;background-color:#fff}.btn-link{color:#212424;font-weight:400;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#000;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#d7d7d7;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:12px;font-size:15px;line-height:1.3333333;border-radius:2px}.btn-group-sm>.btn,.btn-sm{padding:4px;font-size:11px;line-height:1.5;border-radius:2px}.btn-group-xs>.btn,.btn-xs{padding:2px 4px;font-size:11px;line-height:1.5;border-radius:2px}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle,.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child,.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-block{display:block}.btn-block+.btn-block{margin-top:5px}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{height:0;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid\9}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;min-width:160px;padding:5px 0;list-style:none;font-size:12px;text-align:left;background-color:#292929;box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu-right,.dropdown-menu.pull-right{left:auto;right:0}.dropdown-header,.dropdown-menu>li>a{display:block;padding:3px 20px;line-height:1.5;white-space:nowrap}.dropdown-menu .divider{height:1px;margin:8px 0;background-color:#424242}.dropdown-menu>li>a{clear:both;font-weight:400;color:#fff}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{text-decoration:none;color:#fff;background-color:#424242}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#424242}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#d7d7d7}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.progress-bar-striped,.progress-striped .progress-bar,.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{font-size:11px;color:#d7d7d7}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:992px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar:after{content:"";display:table;clear:both}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn .caret,.btn-group>.btn:first-child{margin-left:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group-lg.btn-group>.btn+.dropdown-toggle,.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{box-shadow:none}.btn-group-lg>.btn .caret,.btn-lg .caret{border-width:5px 5px 0}.dropup .btn-group-lg>.btn .caret,.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:after{content:"";display:table;clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-radius:2px 2px 0 0}.btn-group-vertical>.btn:last-child:not(:first-child){border-radius:0 0 2px 2px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn,.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group,.input-group-btn,.input-group-btn>.btn{position:relative}.input-group{display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px;font-size:12px;font-weight:400;line-height:1;color:#333;text-align:center;background-color:#f5f5f5;border:1px solid #bbb;border-radius:2px}.input-group-addon.input-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:4px;font-size:11px;border-radius:2px}.input-group-addon.input-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:12px;font-size:15px;border-radius:2px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{font-size:0;white-space:nowrap}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav:after{content:"";display:table;clear:both}.nav>li,.nav>li>a{position:relative;display:block}.nav>li>a{padding:6px 12px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#f5f5f5}.nav>li.disabled>a{color:#d7d7d7}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#5a5a5a;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#f5f5f5;border-color:#212424}.nav .nav-divider{height:1px;margin:8px 0;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ccc}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.5;border:1px solid transparent;border-radius:2px 2px 0 0}.nav-tabs>li>a:hover{border-color:#d7d7d7 #d7d7d7 #ccc}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#000;background-color:#ededed;border:1px solid #ccc;border-bottom-color:transparent;cursor:default}.nav-pills>li{float:left}.nav-justified>li,.nav-stacked>li,.nav-tabs.nav-justified>li{float:none}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#0078e6}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified,.nav-tabs.nav-justified{width:100%}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}.btn .badge,.btn .label{top:-1px;position:relative}.nav-tabs-justified,.nav-tabs.nav-justified{border-bottom:0}.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:2px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ccc}@media (min-width:768px){.nav-justified>li,.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{margin-bottom:0}.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ccc;border-radius:2px 2px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#ccc}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.pagination{display:inline-block;padding-left:0;margin:18px 0;border-radius:2px}.label,.pagination>li{display:inline}.alert,.thumbnail{margin-bottom:18px}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px;line-height:1.5;text-decoration:none;color:#212424;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span,.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span,.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span,.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:2px;border-top-right-radius:2px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#000;background-color:#f5f5f5;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;background-color:#0078e6;border-color:#0078e6;cursor:default}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#d7d7d7;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:12px;font-size:15px;line-height:1.3333333}.pagination-sm>li>a,.pagination-sm>li>span{padding:4px;font-size:11px;line-height:1.5}.badge,.label{color:#fff;line-height:1;white-space:nowrap;font-weight:700}.label{padding:.2em .6em .3em;font-size:75%;text-align:center;vertical-align:baseline;border-radius:.25em}.badge,.progress-bar{font-size:11px;text-align:center}.label:empty{display:none}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label-default{background-color:#d7d7d7}.label-default[href]:focus,.label-default[href]:hover{background-color:#bebdbd}.label-primary{background-color:#0078e6}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#005db3}.label-success{background-color:#79a548}.label-success[href]:focus,.label-success[href]:hover{background-color:#5f8139}.label-info{background-color:#6daae0}.label-info[href]:focus,.label-info[href]:hover{background-color:#4392d7}.label-warning{background-color:#e8a33d}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#d88b1a}.label-danger{background-color:#c83c3c}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#a32e2e}.badge{display:inline-block;min-width:10px;padding:3px 7px;vertical-align:middle;background-color:#737373;border-radius:10px}.badge:empty{display:none}.media-object,.thumbnail{display:block}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#212424;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.thumbnail{padding:4px;line-height:1.5;background-color:#fff;border:1px solid #ddd;border-radius:2px;-webkit-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}.thumbnail .caption{padding:9px;color:#000}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#212424}.alert{padding:11px;border:1px solid transparent;border-radius:2px}.alert-danger,.alert-info,.alert-success,.alert-warning{border-color:transparent}.alert-danger hr,.alert-info hr,.alert-success hr,.alert-warning hr{border-top-color:transparent}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:31px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.modal,.modal-backdrop{top:0;right:0;bottom:0;left:0}.alert-success{background-color:#79a548;color:#fff}.alert-success .alert-link{color:#e6e5e5}.alert-info{background-color:#6daae0;color:#fff}.alert-info .alert-link{color:#e6e5e5}.alert-warning{background-color:#e8a33d;color:#fff}.alert-warning .alert-link{color:#e6e5e5}.alert-danger{background-color:#c83c3c;color:#fff}.alert-danger .alert-link{color:#e6e5e5}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:18px;margin-bottom:18px;background-color:#dedede;border-radius:2px;box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;line-height:18px;color:#fff;background-color:#0078e6;box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#79a548}.progress-striped .progress-bar-success{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-striped .progress-bar-info,.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#6daae0}.progress-striped .progress-bar-info{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#e8a33d}.progress-striped .progress-bar-warning{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#c83c3c}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media-heading,.media:first-child,.panel-title{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:2px;border-top-left-radius:2px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{text-decoration:none;color:#555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{background-color:#f5f5f5;color:#d7d7d7;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#d7d7d7}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#0078e6;border-color:#0078e6}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#b3dbff}.list-group-item-success{color:#79a548;background-color:#d1e2bd}a.list-group-item-success,button.list-group-item-success{color:#79a548}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#79a548;background-color:#c4dbab}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#79a548;border-color:#79a548}.list-group-item-info{color:#6daae0;background-color:#ebf3fb}a.list-group-item-info,button.list-group-item-info{color:#6daae0}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#6daae0;background-color:#d6e7f6}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#6daae0;border-color:#6daae0}.list-group-item-warning{color:#e8a33d;background-color:#fbefdd}a.list-group-item-warning,button.list-group-item-warning{color:#e8a33d}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#e8a33d;background-color:#f8e4c6}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#e8a33d;border-color:#e8a33d}.list-group-item-danger{color:#c83c3c;background-color:#efc7c7}a.list-group-item-danger,button.list-group-item-danger{color:#c83c3c}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#c83c3c;background-color:#eab3b3}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#c83c3c;border-color:#c83c3c}.panel-heading>.dropdown .dropdown-toggle,.panel-title,.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:18px;background-color:#fff;border:1px solid transparent;border-radius:2px;box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-title,.panel>.list-group,.panel>.panel-collapse>.list-group,.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel-body{padding:15px}.panel-body:after{content:"";display:table;clear:both}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:1px;border-top-left-radius:1px}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel-group .panel-heading,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-responsive:last-child>.table:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:1px;border-bottom-right-radius:1px}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:1px;border-top-left-radius:1px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.table-responsive:first-child>.table:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-right-radius:1px;border-top-left-radius:1px}.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-left:15px;padding-right:15px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:1px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:1px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ccc}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:18px}.panel-group .panel{margin-bottom:0;border-radius:2px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ccc}.panel-default>.panel-heading{color:#5a5a5a;background-color:#ddd;border-color:#ccc}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ccc}.panel-default>.panel-heading .badge{color:#ddd;background-color:#5a5a5a}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ccc}.panel-primary{border-color:#0078e6}.panel-primary>.panel-heading{color:#fff;background-color:#0078e6;border-color:#0078e6}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#0078e6}.panel-primary>.panel-heading .badge{color:#0078e6;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#0078e6}.panel-success{border-color:#79a548}.panel-success>.panel-heading{color:#79a548;background-color:#d1e2bd;border-color:#79a548}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#79a548}.panel-success>.panel-heading .badge{color:#d1e2bd;background-color:#79a548}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#79a548}.panel-info{border-color:#6daae0}.panel-info>.panel-heading{color:#6daae0;background-color:#ebf3fb;border-color:#6daae0}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#6daae0}.panel-info>.panel-heading .badge{color:#ebf3fb;background-color:#6daae0}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#6daae0}.panel-warning{border-color:#e8a33d}.panel-warning>.panel-heading{color:#e8a33d;background-color:#fbefdd;border-color:#e8a33d}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e8a33d}.panel-warning>.panel-heading .badge{color:#fbefdd;background-color:#e8a33d}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e8a33d}.panel-danger{border-color:#c83c3c}.panel-danger>.panel-heading{color:#c83c3c;background-color:#efc7c7;border-color:#c83c3c}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#c83c3c}.panel-danger>.panel-heading .badge{color:#efc7c7;background-color:#c83c3c}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#c83c3c}.embed-responsive{position:relative;display:block;height:0;padding:0}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#fafafa;border:1px solid #ccc;border-radius:2px;box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well-lg,.well-sm{border-radius:2px}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px}.well-sm{padding:9px}.close{float:right;font-size:18px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.popover,.tooltip{font-family:Verdana,Arial,Helvetica,sans-serif;letter-spacing:normal;line-break:auto;line-height:1.5;text-shadow:none;text-transform:none;word-break:normal;word-spacing:normal;word-wrap:normal;font-weight:400;text-decoration:none}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-content,.popover{background-clip:padding-box}.modal{display:none;position:fixed;z-index:5000;-webkit-overflow-scrolling:touch;outline:0}.modal-footer:after,.modal-header:after{display:table;clear:both;content:""}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:2px;box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}.modal-backdrop{position:fixed;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.5}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-style:normal;text-align:left;text-align:start;white-space:normal;font-size:12px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:2px;box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:12px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:1px 1px 0 0}.popover>.arrow,.popover>.arrow:after,.tooltip-arrow{position:absolute;width:0;height:0;border-style:solid}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{display:block;border-color:transparent}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.left>.arrow:after,.popover.right>.arrow:after{content:" ";bottom:-10px}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{left:1px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;border-right-width:0;border-left-color:#fff}.tooltip{position:absolute;z-index:1070;display:block;font-style:normal;text-align:left;text-align:start;white-space:normal;font-size:11px;opacity:0;filter:alpha(opacity=0)}.carousel-caption,.carousel-control{color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.chosen-container-multi .chosen-choices li.search-choice span,.diff-item-result{word-wrap:break-word}.tooltip.in{opacity:1;filter:alpha(opacity=100)}.tooltip.top{margin-top:-3px;padding:3px 0}.tooltip.right{margin-left:3px;padding:0 3px}.tooltip.bottom{margin-top:3px;padding:3px 0}.tooltip.left{margin-left:-3px;padding:0 3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#333;border-radius:2px}.tooltip-arrow{border-color:transparent}.carousel,.carousel-inner{position:relative}.tooltip.top .tooltip-arrow,.tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow{border-width:3px 3px 0;border-top-color:#333;bottom:0}.tooltip.top .tooltip-arrow{left:50%;margin-left:-3px}.tooltip.top-left .tooltip-arrow{right:3px;margin-bottom:-3px}.tooltip.top-right .tooltip-arrow{left:3px;margin-bottom:-3px}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-3px;border-width:3px 3px 3px 0;border-right-color:#333}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-3px;border-width:3px 0 3px 3px;border-left-color:#333}.tooltip.bottom .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow{border-width:0 3px 3px;border-bottom-color:#333;top:0}.tooltip.bottom .tooltip-arrow{left:50%;margin-left:-3px}.tooltip.bottom-left .tooltip-arrow{right:3px;margin-top:-3px}.tooltip.bottom-right .tooltip-arrow{left:3px;margin-top:-3px}.carousel-inner{width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{display:block;max-width:100%;height:auto;line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;background-color:transparent}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:focus,.carousel-control:hover{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000\9;background-color:transparent}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px}.carousel-caption .btn,.text-hide{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}body,html{height:100%}body{overflow:auto}.scaffold{background-color:#f5f5f5;color:#333;position:relative;padding-top:45px;height:100vh}.scaffold-topbar{background-color:#151515;color:#f5f5f5;height:45px;position:fixed;top:0;right:0;left:0}.scaffold-modulemenu,.scaffold-toolbar{background-color:#292929;z-index:1000;position:fixed;top:45px;left:0;bottom:0}.scaffold-modulemenu{color:#f5f5f5;width:40px;max-width:100%;overflow:hidden}.scaffold-modulemenu a{color:rgba(245,245,245,.7)}.scaffold-modulemenu .active>a,.scaffold-modulemenu a:hover{color:#f5f5f5}.scaffold-toolbar{overflow:auto;color:#f5f5f5;right:0;display:none}.scaffold-toolbar .dropdown-menu a,.scaffold-toolbar a{color:rgba(245,245,245,.7)}.scaffold-toolbar .active>a,.scaffold-toolbar .dropdown-menu a:focus,.scaffold-toolbar .dropdown-menu a:hover,.scaffold-toolbar a:focus,.scaffold-toolbar a:hover{color:#f5f5f5}@media (min-width:992px){.scaffold-toolbar{overflow:visible;background-color:transparent;height:45px;top:0;left:auto;bottom:auto;display:block}}.scaffold-content{position:fixed!important;top:45px;left:0;right:0;bottom:0}@media (max-width:991px){.scaffold-search-expanded .scaffold-toolbar,.scaffold-toolbar-expanded .scaffold-toolbar{display:block}.scaffold-content{left:0!important}}.scaffold-content-module-iframe,.scaffold-content-navigation-iframe{display:block;border:none;height:100%;width:100%}.scaffold-content-navigation{display:none;position:absolute!important;left:0;top:0;bottom:0;width:300px}.scaffold-content-navigation-component{position:absolute;top:0;bottom:0;left:0;right:0}.scaffold-content-navigation-component #typo3-pagetree-treeContainer>div>.x-panel-body{overflow:auto}.scaffold-content-module{position:absolute!important;top:0;left:0;bottom:0;right:0}@media (max-width:767px){.scaffold-content-module{width:100%}}.scaffold-content-overlay{display:none;position:absolute;z-index:1040;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.65)}.scaffold-modulemenu-expanded .scaffold-content-overlay{display:block}@media (min-width:992px){.scaffold-modulemenu-expanded .scaffold-content-overlay{display:none}.scaffold{padding-left:40px}}.scaffold .scaffold-modulemenu{width:40px}@media (max-width:991px){.scaffold .scaffold-modulemenu{display:none}.scaffold-modulemenu-expanded .scaffold-modulemenu{display:block}}.scaffold-modulemenu-expanded{display:block;padding-left:230px}.scaffold-modulemenu-expanded .scaffold-modulemenu{width:230px}.scaffold-modulemenu-expanded .scaffold-content{-webkit-transform:translate(230px,0);transform:translate(230px,0)}.scaffold-content-navigation-expanded .scaffold-content-navigation{display:block}.scaffold-content-navigation-expanded .scaffold-content-module{left:300px}@media (min-width:992px){.scaffold .scaffold-content{left:40px}.scaffold-modulemenu-expanded .scaffold-content{left:230px;-webkit-transform:none;transform:none}}.topbar{background-color:inherit;position:relative;height:45px}.topbar a{color:inherit;text-decoration:none}.topbar-button{position:absolute;top:0;display:inline-block;border:0;background-color:#151515;height:45px;width:40px}.topbar-button:focus,.topbar-button:hover{background-color:#1d1d1d}.scaffold-content-navigation-expanded .topbar-button-navigationcomponent,.scaffold-modulemenu-expanded .topbar-button.topbar-button-modulemenu,.scaffold-search-expanded .topbar-button-search,.scaffold-toolbar-expanded .topbar-button-toolbar{background-color:#292929}.topbar-button[disabled],.topbar-button[disabled]:focus,.topbar-button[disabled]:hover{background-color:#292929;cursor:not-allowed;opacity:.5}.topbar-button.topbar-button-modulemenu{left:0}.topbar-button.topbar-button-navigationcomponent{left:40px}.topbar-button.topbar-button-toolbar{right:40px}.topbar-button.topbar-button-search{right:0}@media (max-width:991px){.scaffold-search-expanded .toolbar-item,.scaffold-toolbar-expanded .toolbar-item-search{display:none}.scaffold-search-expanded .toolbar-item-search{display:block;width:100%}.topbar-header{padding-right:80px!important}}.topbar-button-search,.topbar-button-toolbar{display:block}@media (min-width:992px){.topbar-button.topbar-button-modulemenu{background-color:#292929}.topbar-button-search,.topbar-button-toolbar{display:none}}.topbar-header{padding-left:80px}.topbar-header-site{overflow:hidden;position:relative;max-width:100%;height:45px;line-height:45px;padding-left:1em;padding-right:1em;white-space:nowrap}.topbar-header-site:after,.topbar-header-site:before{display:block;content:'';position:absolute;top:0;bottom:0;width:1em}.topbar-header-site:before{right:0;background:#151515}.topbar-header-site:after{right:1em;background:-webkit-linear-gradient(left,rgba(21,21,21,0) 0,#151515 100%);background:linear-gradient(to right,rgba(21,21,21,0) 0,#151515 100%)}.typo3-in-workspace .topbar-header-site{background-color:#6d860d}.typo3-in-workspace .topbar-header-site:before{background:#6d860d}.typo3-in-workspace .topbar-header-site:after{background:-webkit-linear-gradient(left,rgba(109,134,13,0) 0,#6d860d 100%);background:linear-gradient(to right,rgba(109,134,13,0) 0,#6d860d 100%)}.topbar-header-site-logo{height:45px;display:none;padding-right:.5em}@media (min-width:320px){.topbar-header-site-logo{display:inline-block}}.topbar-header-site-title{line-height:1.2em;display:inline-block;vertical-align:middle}.topbar-header-site-name{display:block}.toolbar-list:after,.toolbar:after{display:table;content:'';clear:both}.topbar-header-site-version{opacity:.5}.toolbar{padding:8px}.toolbar-list{list-style:none;padding:0;margin:0}@media (min-width:992px){.toolbar{padding:0;background-color:#151515}.toolbar-list li:last-child{width:300px}}.toolbar-item{padding:4px;position:relative;display:block;float:left;width:100%}@media (min-width:600px){.toolbar-item{width:50%}}@media (min-width:750px){.toolbar-item{width:33.33%}}@media (min-width:992px){.toolbar-item{padding:0;width:auto;margin-left:1px}}.toolbar-item .dropdown-menu{width:350px}.toolbar-item .dropdown-menu .text-muted{color:#8c8c8c}.toolbar-item .dropdown-menu a:focus .text-muted,.toolbar-item .dropdown-menu a:hover .text-muted{color:#a6a6a6}@media (max-width:991px){.toolbar-item .dropdown-menu{overflow:auto;padding:15px;position:fixed;max-height:90%;max-width:90%;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.toolbar-item .dropdown-backdrop{background:rgba(0,0,0,.65)}}.toolbar-item-avatar{width:28px;margin-right:2px;display:inline-block}.toolbar-item-avatar .avatar{position:absolute;top:50%;left:10px;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.toolbar-item-avatar .avatar,.toolbar-item-avatar .avatar-image{height:28px;width:28px}.toolbar-item-badge{position:absolute;bottom:4px;right:4px;padding:3px 4px;border-radius:0;font-size:10px;font-weight:400;min-width:16px}.toolbar-item-link{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid rgba(0,0,0,.5);position:relative;display:block;text-decoration:none;padding:9px 10px;height:45px;line-height:27px}.toolbar-item-link:focus,.toolbar-item-link:hover{text-decoration:none}.open .toolbar-item-link{background-color:#292929}.toolbar-item-search form{padding:0;margin:0}.toolbar-item-search .toolbar-item-link{padding:0;margin:0;height:0}.toolbar-item-search .form-group{margin:0}.toolbar-item-search .close{color:#fff;text-shadow:none;opacity:1}@media (max-width:991px){.toolbar-item-search .dropdown-menu{top:114px;left:14px;right:14px;width:auto;max-width:none;max-height:none;-webkit-transform:none;transform:none;bottom:14px}}@media (min-width:992px){.toolbar-item-link{border:none}.toolbar-item-title{display:none}.toolbar-item-search .dropdown-menu{left:auto;right:0}}.toolbar-item-search .autocomplete-suggestions{position:static!important}.toolbar-item-search .autocomplete-suggestion{border:none}.toolbar-item-search.open .toolbar-item-search-form{position:relative;z-index:991}.toolbar-item-search-field{color:inherit;background-color:#2f2f2f;margin:0;border-radius:0;border:1px solid rgba(0,0,0,.5);height:45px;box-shadow:none}@media (min-width:992px){.toolbar-item-search-field{border:none}}.toolbar-item-search-field:hover{background-color:#333}.toolbar-item-search-field:focus{box-shadow:none;background-color:#555}.module-wrapper{position:relative}.module-wrapper iframe{border:none}.modulemenu .modulemenu-group-container{clear:both}.modulemenu .modulemenu-group{position:relative;padding:5px 0;border-bottom:1px solid rgba(0,0,0,.2)}.modulemenu .modulemenu-group-header,.modulemenu .modulemenu-item-link{position:relative;display:block;cursor:pointer;padding:2px 4px;text-decoration:none}.modulemenu .modulemenu-group-header{user-select:none;text-transform:uppercase}.modulemenu .modulemenu-item-link:focus,.modulemenu .modulemenu-item-link:hover{outline:0;background-color:rgba(0,0,0,.1)}.modulemenu .modulemenu-item.active .modulemenu-item-link{background-color:rgba(0,0,0,.15)}.modulemenu .modulemenu-icon{float:left;margin-right:4px}.modulemenu .modulemenu-icon .fa{font-size:.5em}.modulemenu .modulemenu-group-title,.modulemenu .modulemenu-item-title{white-space:nowrap;text-overflow:ellipsis;padding-top:7px;padding-left:4px;display:none;overflow:hidden}.modulemenu .modulemenu-group-title{padding-right:20px}.modulemenu .modulemenu-group-title .caret{-webkit-transform:rotate(90deg);transform:rotate(90deg);position:absolute;top:17px;right:18px}.modulemenu .expanded .modulemenu-group-title .caret{-webkit-transform:rotate(0);transform:rotate(0)}.scaffold-modulemenu-expanded .modulemenu-group-title,.scaffold-modulemenu-expanded .modulemenu-item-title{display:block}.autocomplete{position:relative}.autocomplete-results{z-index:1000;position:absolute;margin:5px 0;top:100%;left:0;border:1px solid #ddd;border-radius:2px;background-color:#fff;overflow:hidden;box-shadow:0 1px 0 0 rgba(0,0,0,.25)}.avatar,.dropdown-list>li{position:relative}.autocomplete-suggestion{border-top:1px solid #ddd}.autocomplete-suggestion:first-child{border-top:none}.autocomplete-suggestion-link{padding:5px 13px 5px 28px;display:block;text-decoration:none}.autocomplete-selected .autocomplete-suggestion-link,.autocomplete-suggestion-link:hover{background-color:#fafafa;text-decoration:none}.autocomplete-info{padding:5px 15px}.dropdown-menu{line-height:1.45em;border:0;margin:0;border-radius:0;color:#fff}.dropdown-menu a{color:inherit;display:block}.dropdown-menu a:focus,.dropdown-menu a:hover{color:inherit;text-decoration:none}.dropdown-menu hr{border-top:1px solid rgba(0,0,0,.35);margin:1.25em -15px}.dropdown-menu>:last-child{margin-bottom:0}.dropdown-menu .form-group{margin-bottom:.75em}.dropdown-menu .form-control{border-color:#aaa;color:inherit;border-radius:0;background-color:#333}.dropdown-menu .form-control:focus{box-shadow:none;border-color:#bbb}.dropdown-menu .btn{border:none;border-radius:0;padding:6px 10px}.dropdown-headline{font-size:1.15em;margin-top:0;margin-bottom:.5em}.dropdown-text a{display:inline-block}div.dropdown-menu{padding:1.5em}.dropdown-list{padding-left:0;list-style:none}.dropdown-list>li+li{margin-top:.5em}.dropdown-list-link{display:block;text-decoration:none}.dropdown-list-link:focus,.dropdown-list-link:hover{text-decoration:none}.dropdown-table{display:table;width:100%}.dropdown-table-row{display:table-row}.dropdown-table-column{display:table-cell;padding-top:.25em;padding-bottom:.25em;vertical-align:middle}.dropdown-table-column-top{vertical-align:top}.avatar,.callout .media-body{vertical-align:middle}.dropdown-table-icon{width:16px;padding-right:.5em}.avatar,.avatar-image{height:32px;width:32px}.dropdown-table-title{white-space:nowrap;padding-right:1.5em}.dropdown-table-title-ellipsis{max-width:230px;overflow:hidden;display:block;white-space:nowrap;text-overflow:ellipsis}.dropdown-table-actions{white-space:nowrap;text-align:right}.dropdown-table-actions-btn{text-align:center;display:inline-block!important;margin-top:-4px;margin-bottom:-4px;padding:4px;vertical-align:middle}.dropdown-table-actions-btn-close:hover,.dropdown-table-actions-btn-edit:hover{background-color:#333}.dropdown-table-actions-btn-delete:hover{background-color:#c83c3c}.avatar{display:inline-block}.avatar-image{display:block;overflow:hidden;border-radius:50%}.avatar-image:after{display:block;content:'';position:absolute;top:0;left:0;height:100%;width:100%;border-radius:50%;border:1px solid rgba(255,255,255,.1)}.avatar-image>img{display:block;width:100%!important;height:auto!important}.avatar-icon{position:absolute;bottom:0;right:0;height:16px;width:16px}.callout{background-color:#f0f0f0;border-left:3px solid #ccc;margin:20px 0;padding:20px;color:#333}.callout .media{margin:0}.callout .media .fa-stack{color:#fff}.callout .media .fa-stack>.fa:first-child{color:#ccc}.callout-icon{margin-top:-2px}.callout-title{font-size:1.3em;margin:0 0 .5em}.callout-body>:last-child{margin-bottom:0}.callout-sm{margin:10px 0;padding:10px}.callout-danger .media,.callout-info .media,.callout-notice .media,.callout-success .media,.callout-warning .media{margin:0}.callout-sm .callout-title{font-size:1em;margin:0}.callout-success{background-color:#d1e2bd;border-color:#79a548;color:#333}.callout-success .media .fa-stack{color:#fff}.callout-success .media .fa-stack>.fa:first-child{color:#79a548}.callout-info{background-color:#ebf3fb;border-color:#6daae0;color:#333}.callout-info .media .fa-stack{color:#fff}.callout-info .media .fa-stack>.fa:first-child{color:#6daae0}.callout-warning{background-color:#fbefdd;border-color:#e8a33d;color:#333}.callout-warning .media .fa-stack{color:#fff}.callout-warning .media .fa-stack>.fa:first-child{color:#e8a33d}.callout-danger{background-color:#efc7c7;border-color:#c83c3c;color:#333}.callout-danger .media .fa-stack{color:#fff}.callout-danger .media .fa-stack>.fa:first-child{color:#c83c3c}.callout-notice{background-color:#f9f9f9;border-color:#a0a0a0;color:#333}.callout-notice .media .fa-stack{color:#fff}.callout-notice .media .fa-stack>.fa:first-child{color:#a0a0a0}.icon{position:relative;display:inline-block;overflow:hidden;white-space:nowrap;vertical-align:-22%}.icon-markup,.icon-overlay{position:absolute;right:0;text-align:center;bottom:0}.icon img,.icon svg{display:block;height:100%;width:100%;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.icon *{display:block;line-height:inherit}.icon-markup{display:block;top:0;left:0}.icon-overlay{height:68.75%;width:68.75%}.module-docheader,.module-loading-indicator.nprogress-custom-parent{position:fixed;top:0}.icon-color{fill:currentColor}.icon-spin .icon-markup{-webkit-animation:icon-spin 2s infinite linear;animation:icon-spin 2s infinite linear}@-webkit-keyframes icon-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes icon-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.icon-state-disabled .icon-markup{opacity:.5}.icon-size-small{height:16px;width:16px;line-height:16px}.icon-size-small .icon-unify{line-height:16px;font-size:14px}.icon-size-small .icon-overlay .icon-unify{line-height:10px;font-size:9px}.icon-size-default{height:32px;width:32px;line-height:32px}.icon-size-default .icon-unify{line-height:32px;font-size:28px}.icon-size-default .icon-overlay .icon-unify{line-height:20px;font-size:18px}.icon-size-large{height:48px;width:48px;line-height:48px}.icon-size-large .icon-unify{line-height:48px;font-size:42px}.icon-size-large .icon-overlay .icon-unify{line-height:30px;font-size:26px}.icon-actions-edit-copy-release,.icon-actions-edit-cut-release,.icon-status-dialog-error,.icon-status-status-current,.icon-status-status-permission-denied{color:#c83c3c}.icon-status-status-sorting-light-asc,.icon-status-status-sorting-light-desc{color:#fff}.icon-status-status-sorting-asc,.icon-status-status-sorting-desc{color:#737373}.icon-status-dialog-information{color:#6daae0}.icon-status-dialog-ok,.icon-status-status-permission-granted{color:#79a548}.icon-status-dialog-notification{color:#333}.icon-status-dialog-warning{color:#e8a33d}.diff{background-color:#fff;border:1px solid #ccc;display:table}.diff-item{display:table-row}.diff-item+.diff-item{border-top:1px solid #ccc}.diff-item-result,.diff-item-title{padding:10px;display:table-cell}.diff-item-title{background-color:#fafafa;padding-right:10px;font-style:italic;white-space:nowrap}.diff-item-result{font-family:Menlo,Monaco,Consolas,"Courier New",monospace;width:100%;white-space:pre;word-break:break-all}.diff-item-result del{color:#c80c05;background-color:#fff6f6;text-decoration:none}.diff-item-result ins{color:#44a512;background-color:#ebfce3;text-decoration:none}.diff-item-result.diff-item-result-inline{white-space:normal}.module{min-height:100%;width:100%;background-color:#fff;color:inherit}.module-dark{background-color:#333;color:#ccc}.module-loading-indicator{min-height:5px;width:100%;z-index:999999}.module-docheader{width:100%;left:0;min-height:65px;z-index:300;background-color:#eee;border-bottom:1px solid #c3c3c3;padding:0 24px;-webkit-transition:margin-top .3s ease-in-out;transition:margin-top .3s ease-in-out}.module-docheader .module-docheader-bar{min-height:26px;margin:4px 0;line-height:26px}.module-docheader .module-docheader-bar.row{margin-left:-15px;margin-right:-15px}.module-docheader .module-docheader-bar label{margin-top:0;margin-bottom:0}.module-docheader .module-docheader-bar .form-inline .form-group{display:table}.module-docheader .module-docheader-bar .form-inline .form-group label{display:table-cell;font-size:11px;font-weight:400;line-height:16px;padding:4px;border-radius:2px 0 0 2px;border:1px solid #bbb;border-right:0;background-color:rgba(0,0,0,.05)}.module-docheader .module-docheader-bar .form-inline .form-group label+select{display:table-cell;border-top-left-radius:0;border-bottom-left-radius:0}.module-docheader .module-docheader-bar .form-group{vertical-align:top;margin:0;display:inline-block}.module-docheader .module-docheader-bar .form-group .form-control{vertical-align:top}.module-docheader .module-docheader-bar .form-inline-spaced{margin:0}.module-docheader .module-docheader-bar .panel{margin:0 -24px;border-left:none;border-right:none;border-bottom:none;border-radius:0;background-color:#fafafa;box-shadow:none}.module-docheader .module-docheader-bar .panel .panel-body{padding:8px 24px}.module-docheader .module-docheader-bar-search{margin-bottom:0}.module-docheader .module-docheader-bar-column-left{float:left}.module-docheader .module-docheader-bar-column-right{float:right}.module-docheader-bar-navigation .module-docheader-bar-column-left{white-space:nowrap}@media (max-width:768px){.module-docheader .module-docheader-bar .text-right{text-align:left}.module-docheader-bar-navigation .module-docheader-bar-column-left{white-space:normal}}.module-docheader-bar-navigation .form-group select{width:100%}.module-body{padding:24px}.module-body>.callout:first-child{margin-top:0}.module-body>.container{padding-left:0;padding-right:0}.module-body .container-small{max-width:768px;margin:0 auto}.module-docheader+.module-body{padding-top:89px}.panel{display:block}.panel:focus,.panel:hover{text-decoration:none}.panel-heading a,.panel-heading a:active,.panel-heading a:focus,.panel-heading a:hover{text-decoration:none;color:inherit}.panel-heading-left{float:left}.panel-heading-right{float:right}.panel-title{font-size:12px}.panel-title-icon,.panel-title-name{display:inline-block;vertical-align:middle}.panel-body>:first-child{margin-top:0}.panel-body>:last-child{margin-bottom:0}.panel-body-highlightlinks>p>a{text-decoration:underline}.panel-table td:first-child,.panel-table th:first-child{padding-left:15px}.panel-table td:last-child,.panel-table th:last-child{padding-right:15px}.panel-progress{background-color:#eee;height:3px;position:relative;width:100%}.panel-progress .panel-progress-bar{display:block;height:100%;background-color:#444}.panel-active{border-color:#444}.panel-active>.panel-heading{color:#fff;background-color:#666;border-color:#444}.panel-active>.panel-heading+.panel-collapse>.panel-body{border-top-color:#444}.panel-active>.panel-heading .badge{color:#666;background-color:#fff}.panel-active>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#444}.clearfix:after,.dropdown-list>li:after,.module-docheader .module-docheader-bar:after,.module-docheader:after,.modulemenu .modulemenu-group-header:after,.modulemenu .modulemenu-item-link:after,.panel-heading:after{content:"";display:table;clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;background-color:transparent;border:0}.affix{position:fixed}@-ms-viewport{width:device-width}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}.hidden-lg{display:none!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}.hidden-print{display:none!important}}.chosen-container{position:relative;display:inline-block;vertical-align:middle;font-size:13px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chosen-container *{box-sizing:border-box}.chosen-container .chosen-drop{position:absolute;top:100%;z-index:1010;width:100%;border:1px solid #aaa;border-top:0;background:#fff;box-shadow:0 4px 5px rgba(0,0,0,.15);clip:rect(0,0,0,0)}.chosen-container.chosen-with-drop .chosen-drop{clip:auto}.chosen-container a{cursor:pointer}.chosen-container .chosen-single .group-name,.chosen-container .search-choice .group-name{margin-right:4px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:400;color:#999}.chosen-container-single .chosen-single{position:relative;display:block;overflow:hidden;padding:0 0 0 8px;height:25px;border:1px solid #aaa;border-radius:2px;background-color:#fff;background-clip:padding-box;box-shadow:0 0 3px #fff inset,0 1px 1px rgba(0,0,0,.1);color:#444;text-decoration:none;white-space:nowrap;line-height:24px}.chosen-container-single .chosen-default{color:#999}.chosen-container-single .chosen-single span{display:block;overflow:hidden;margin-right:26px;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{position:absolute;top:6px;right:26px;display:block;width:12px;height:12px;font-size:1px}.chosen-container-single .chosen-single abbr:hover,.chosen-container-single.chosen-disabled .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single .chosen-single div{position:absolute;top:0;right:0;display:block;width:18px;height:100%}.chosen-container-single .chosen-single div b{display:block;width:100%;height:100%}.chosen-container-single .chosen-search{position:relative;z-index:1010;margin:0;padding:3px 4px;white-space:nowrap}.chosen-container-single .chosen-search input[type=text]{margin:1px 0;padding:4px 20px 4px 5px;width:100%;height:auto;outline:0;border:1px solid #aaa;font-size:1em;font-family:sans-serif;line-height:normal}.chosen-container-single .chosen-drop{margin-top:-1px;background-clip:padding-box}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;clip:rect(0,0,0,0)}.chosen-container .chosen-results{color:#444;position:relative;overflow-x:hidden;overflow-y:auto;margin:0 4px 4px 0;padding:0 0 0 4px;max-height:240px;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;margin:0;padding:5px 6px;list-style:none;line-height:15px;word-wrap:break-word;-webkit-touch-callout:none}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#ccc;cursor:default}.chosen-container .chosen-results li.highlighted{background-color:#e8a33d;color:#fff}.chosen-container .chosen-results li.no-results{color:#777;display:list-item;background:#f4f4f4}.chosen-container .chosen-results li.group-result{display:list-item;font-weight:700;cursor:default}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{position:relative;overflow:hidden;margin:0;padding:0 5px;width:100%;height:auto;border:1px solid #aaa;background-color:#fff;cursor:text}.chosen-container-multi .chosen-choices li{float:left;list-style:none}.chosen-container-multi .chosen-choices li.search-field{margin:0;padding:0;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input[type=text]{margin:1px 0;padding:0;height:25px;outline:0;border:0!important;background:0 0!important;box-shadow:none;color:#999;font-size:100%;font-family:sans-serif;line-height:normal;width:25px}.chosen-container-multi .chosen-choices li.search-choice{position:relative;margin:3px 5px 3px 0;padding:4px 20px 4px 5px;max-width:100%;background-color:#e8a33d;background-clip:padding-box;color:#fff;line-height:13px;cursor:default}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:4px;right:5px;display:block;width:12px;height:12px}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{text-decoration:none}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:after{content:"ï€";font-family:FontAwesome;padding-left:2px;vertical-align:top;color:#fff}.chosen-container-multi .chosen-choices li.search-choice-disabled{padding-right:5px;border:1px solid #ccc;background-color:#e4e4e4;color:#666}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close{background-position:-42px -10px}.chosen-container-multi .chosen-results{margin:0;padding:0}.chosen-container-multi .chosen-drop .result-selected{display:list-item;color:#ccc;cursor:default}.chosen-container-active .chosen-single{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active.chosen-with-drop .chosen-single div{border-left:none;background:0 0}.chosen-container-active.chosen-with-drop .chosen-single div b{background-position:-18px 2px}.chosen-container-active .chosen-choices{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#222!important}.chosen-disabled{opacity:.5!important;cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close,.chosen-disabled .chosen-single{cursor:default}.chosen-rtl{text-align:right}.chosen-rtl .chosen-single{overflow:visible;padding:0 8px 0 0}.chosen-rtl .chosen-single span{margin-right:0;margin-left:26px;direction:rtl}.chosen-rtl .chosen-single-with-deselect span{margin-left:38px}.chosen-rtl .chosen-single div{right:auto;left:3px}.chosen-rtl .chosen-single abbr{right:auto;left:26px}.chosen-rtl .chosen-choices li{float:right}.chosen-rtl .chosen-choices li.search-field input[type=text]{direction:rtl}.chosen-rtl .chosen-choices li.search-choice{margin:3px 5px 3px 0;padding:3px 5px 3px 19px}.chosen-rtl .chosen-choices li.search-choice .search-choice-close{right:auto;left:4px}.chosen-rtl.chosen-container-single .chosen-results{margin:0 0 4px 4px;padding:0 4px 0 0}.chosen-rtl .chosen-results li.group-option{padding-right:15px;padding-left:0}.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div{border-right:none}.chosen-rtl .chosen-search input[type=text]{padding:4px 5px 4px 20px;direction:rtl}.chosen-rtl.chosen-container-single .chosen-single div b{background-position:6px 2px}.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b{background-position:-12px 2px}.gridder{margin:15px -15px;padding:0;font-size:0}.gridder-list,.gridder-show{font-size:12px}.gridder-list{display:inline-block;vertical-align:top;padding-left:15px;padding-right:15px;position:relative;width:100%}.gridder-list.selectedItem:after{position:absolute;border:15px solid transparent;border-bottom-color:#fff;border-top:0;bottom:0;left:50%;margin-left:-7.5px;content:''}.caret:after,.gridder-show,.panel-heading{position:relative}.gridder-list .gridder-item{background-color:#fff;box-shadow:0 2px 0 rgba(0,0,0,.2);border:1px solid #ccc;margin-bottom:30px;padding:10px;min-height:200px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,transform;transition-property:box-shadow,border,transform,-webkit-transform;cursor:pointer;position:relative}.gridder-list .gridder-item:focus,.gridder-list .gridder-item:hover{text-decoration:none;border:1px solid #b3b2b2;-webkit-transform:translate(0,-1px);transform:translate(0,-1px);box-shadow:0 3px 0 rgba(0,0,0,.3)}.gridder-list .gridder-item .label{padding:3px 6px;font-size:12px;vertical-align:top;border-radius:10px;min-width:28px;display:inline-block}.gridder-show{background-color:#fff;display:block;float:left;width:100%;margin-bottom:15px}.gridder-show .gridder-padding{padding:30px}.gridder-show .gridder-title{border-bottom:1px solid #ccc;margin-bottom:15px}.gridder-content{display:none}@media (min-width:768px){.gridder-list{width:50%}}@media (min-width:992px){.gridder-list{width:25%}}.card{display:-webkit-box;display:-webkit-flex;display:flex;padding:15px;box-shadow:0 2px 0 rgba(0,0,0,.2);border:1px solid #ccc;margin-bottom:20px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,transform;transition-property:box-shadow,border,transform,-webkit-transform}.card:hover{text-decoration:none;border:1px solid #b3b2b2;-webkit-transform:translate(0,-1px);transform:translate(0,-1px);box-shadow:0 3px 0 rgba(0,0,0,.3)}.card-container{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;margin:10px -10px}.card-container .card{margin-left:10px;margin-right:10px}.card-size-large,.card-size-medium,.card-size-small{width:calc(100% - 20px)}@media (min-width:768px){.card-size-small{width:calc(50% - 20px)}}@media (min-width:992px){.card-size-small{width:calc(25% - 20px)}}@media (min-width:768px){.card-size-medium{width:calc(50% - 20px)}.card-size-large{width:calc(100% - 20px)}}#typo3-docheader{background:#eee}#typo3-docheader img,#typo3-docheader input{cursor:pointer}#typo3-docheader .t3-icon{margin-bottom:3px}.content-area>:last-child,.typo3-message>h4{margin-bottom:0}#typo3-docheader .left{float:left}#typo3-docheader .left .t3-icon{margin-right:6px}#typo3-docheader .right{float:right}#typo3-docheader .right .t3-icon{margin-left:6px}#typo3-docheader .buttongroup{float:left;margin-right:6px}#typo3-docheader .buttongroup .c-inputButton{color:inherit;padding:0}#typo3-docheader .buttongroup input.c-inputButton{text-indent:-1000px}#typo3-docheader select{margin-right:12px}#typo3-docheader a{color:#2d2d2d}#typo3-docheader a:hover{color:#000}#typo3-docheader a.active{color:#c3c3c3}#typo3-docheader a.active span{cursor:default}#typo3-docheader .typo3-docheader-buttons,#typo3-docheader .typo3-docheader-functions{color:#2d2d2d;overflow:hidden;padding:0 24px}#typo3-docheader .typo3-docheader-functions{height:27px;line-height:27px}#typo3-docheader .typo3-docheader-functions select{color:#2d2d2d}#typo3-docheader .typo3-docheader-buttons{height:22px;padding-top:3px;padding-bottom:3px;border-bottom:1px solid #c3c3c3}body.backend .module{background:#f5f5f5}.content-area{padding-bottom:35px}.content-area>h3{margin-top:0}.logo-pageheader img{padding-bottom:3px}img.logo{vertical-align:bottom}.typo3-message p{margin-top:9px}.t3-install-displaytwinimageimages{border:1px solid #ccc;padding:10px}.t3-install-displaytwinimagetextarea pre{border-top:0}.bg-transparent-emulation{padding:10px;text-align:center;background:url(../../../../../../typo3/sysext/install/Resources/Public/Images/bg_transparent_emulation.png)}.bg-transparent-emulation img{max-width:300px}.alert-notice{background-color:#eee;border-color:#bbb;color:#333}.alert-notice hr{border-top-color:#aeaeae}.alert-notice .alert-link{color:#1a1919}.nav-pills>li>a{border-radius:0}h1:first-child{margin-top:0}.typo3-docheader-buttons,.typo3-docheader-functions{min-height:20px}.item{margin:1em;border:1px solid #ddd}.item .item-heading{padding:1em;background-color:#ddd}.item .item-body{padding:1em}.list-group-item a{display:block}.list-group-item.active a{color:#fff}.caret{border:0;padding-left:10px}.caret:after{top:-8px;left:-10px;content:"";font-family:FontAwesome}.collapsed .caret:after{content:"";font-family:FontAwesome}.panel-heading .panel-checkbox{margin:0;position:absolute;left:1em;top:50%;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.panel-heading .panel-checkbox+.panel-title{padding-left:18px}.panel-heading .message{display:block;padding-left:16px;margin-top:5px}a[data-toggle=collapse]{display:block;text-decoration:none}@media (min-width:992px){.affix-bottom{position:absolute}body.standalone .affix-top{position:relative}.affix,body.backend .affix-top{position:fixed;top:35px}body.backend .leftNavigation{min-height:425px}}hr{border-top-color:#ddd}.copyright .panel-default:last-child{margin-bottom:0}#fixed-footer-handler{height:32px}.fixed{position:fixed;bottom:0;background-color:grey}.fixed .footer-innerWrap{padding:1.5em}@media (max-width:991px){#menuWrapper{position:relative!important;margin-bottom:30px}}#mobileMenuWrapper{margin-bottom:10px}#install-menu-button{float:right;margin-bottom:20px}#install-menu-button .navbar-toggle{border:0;background:#fff}#install-menu-button .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px;background-color:#000}#install-menu-button .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}.form-control-clearable{position:relative}.form-control-clearable .form-control{padding-right:2.3em}.form-control-clearable .close{position:absolute;height:16px;z-index:3;top:50%;right:.5em;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.form-control-clearable .close .icon{vertical-align:0}.input-group .form-control-clearable{display:table-cell}.input-group .form-control-clearable .form-control{display:block}.panel-group-flat .panel-body,.panel-group-rst .panel-body{padding-right:0}.panel-flat,.panel-rst,.panel-version{border:0;border-left:2px solid #d7d7d7;border-radius:0;margin:0}.panel-flat.panel-default .panel-heading,.panel-rst.panel-default .panel-heading,.panel-version.panel-default .panel-heading{background:#f5f5f5}.panel-flat.panel-breaking,.panel-flat.panel-danger,.panel-rst.panel-breaking,.panel-rst.panel-danger,.panel-version.panel-breaking,.panel-version.panel-danger{border-color:#c83c3c}.panel-flat.panel-breaking>.panel-heading,.panel-flat.panel-danger>.panel-heading,.panel-rst.panel-breaking>.panel-heading,.panel-rst.panel-danger>.panel-heading,.panel-version.panel-breaking>.panel-heading,.panel-version.panel-danger>.panel-heading{color:#fff;background-color:#c83c3c;border-color:#c83c3c}.panel-flat.panel-breaking>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-danger>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-breaking>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-danger>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-breaking>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#c83c3c}.panel-flat.panel-breaking>.panel-heading .badge,.panel-flat.panel-danger>.panel-heading .badge,.panel-rst.panel-breaking>.panel-heading .badge,.panel-rst.panel-danger>.panel-heading .badge,.panel-version.panel-breaking>.panel-heading .badge,.panel-version.panel-danger>.panel-heading .badge{color:#c83c3c;background-color:#fff}.panel-flat.panel-breaking>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-danger>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-breaking>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-danger>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-breaking>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#c83c3c}.panel-flat.panel-breaking.risk-high>.panel-heading,.panel-flat.panel-danger.risk-high>.panel-heading,.panel-rst.panel-breaking.risk-high>.panel-heading,.panel-rst.panel-danger.risk-high>.panel-heading,.panel-version.panel-breaking.risk-high>.panel-heading,.panel-version.panel-danger.risk-high>.panel-heading{background:#c83c3c;color:#f5f5f5}.panel-flat.panel-breaking.risk-medium>.panel-heading,.panel-flat.panel-danger.risk-medium>.panel-heading,.panel-rst.panel-breaking.risk-medium>.panel-heading,.panel-rst.panel-danger.risk-medium>.panel-heading,.panel-version.panel-breaking.risk-medium>.panel-heading,.panel-version.panel-danger.risk-medium>.panel-heading{background:#f5dbdb;color:#1e1e1e}.panel-flat.panel-breaking.risk-low>.panel-heading,.panel-flat.panel-danger.risk-low>.panel-heading,.panel-rst.panel-breaking.risk-low>.panel-heading,.panel-rst.panel-danger.risk-low>.panel-heading,.panel-version.panel-breaking.risk-low>.panel-heading,.panel-version.panel-danger.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-breaking .panel-progress .panel-progress-bar,.panel-flat.panel-danger .panel-progress .panel-progress-bar,.panel-rst.panel-breaking .panel-progress .panel-progress-bar,.panel-rst.panel-danger .panel-progress .panel-progress-bar,.panel-version.panel-breaking .panel-progress .panel-progress-bar,.panel-version.panel-danger .panel-progress .panel-progress-bar{background-color:#c83c3c}.panel-flat.panel-deprecation,.panel-flat.panel-warning,.panel-rst.panel-deprecation,.panel-rst.panel-warning,.panel-version.panel-deprecation,.panel-version.panel-warning{border-color:#e8a33d}.panel-flat.panel-deprecation>.panel-heading,.panel-flat.panel-warning>.panel-heading,.panel-rst.panel-deprecation>.panel-heading,.panel-rst.panel-warning>.panel-heading,.panel-version.panel-deprecation>.panel-heading,.panel-version.panel-warning>.panel-heading{color:#fff;background-color:#e8a33d;border-color:#e8a33d}.panel-flat.panel-deprecation>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-warning>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-deprecation>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-warning>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-deprecation>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e8a33d}.panel-flat.panel-deprecation>.panel-heading .badge,.panel-flat.panel-warning>.panel-heading .badge,.panel-rst.panel-deprecation>.panel-heading .badge,.panel-rst.panel-warning>.panel-heading .badge,.panel-version.panel-deprecation>.panel-heading .badge,.panel-version.panel-warning>.panel-heading .badge{color:#e8a33d;background-color:#fff}.panel-flat.panel-deprecation>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-warning>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-deprecation>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-warning>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-deprecation>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e8a33d}.panel-flat.panel-deprecation.risk-high>.panel-heading,.panel-flat.panel-warning.risk-high>.panel-heading,.panel-rst.panel-deprecation.risk-high>.panel-heading,.panel-rst.panel-warning.risk-high>.panel-heading,.panel-version.panel-deprecation.risk-high>.panel-heading,.panel-version.panel-warning.risk-high>.panel-heading{background:#e8a33d;color:#f5f5f5}.panel-flat.panel-deprecation.risk-medium>.panel-heading,.panel-flat.panel-warning.risk-medium>.panel-heading,.panel-rst.panel-deprecation.risk-medium>.panel-heading,.panel-rst.panel-warning.risk-medium>.panel-heading,.panel-version.panel-deprecation.risk-medium>.panel-heading,.panel-version.panel-warning.risk-medium>.panel-heading{background:#f8e4c6;color:#1e1e1e}.panel-flat.panel-deprecation.risk-low>.panel-heading,.panel-flat.panel-warning.risk-low>.panel-heading,.panel-rst.panel-deprecation.risk-low>.panel-heading,.panel-rst.panel-warning.risk-low>.panel-heading,.panel-version.panel-deprecation.risk-low>.panel-heading,.panel-version.panel-warning.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-deprecation .panel-progress .panel-progress-bar,.panel-flat.panel-warning .panel-progress .panel-progress-bar,.panel-rst.panel-deprecation .panel-progress .panel-progress-bar,.panel-rst.panel-warning .panel-progress .panel-progress-bar,.panel-version.panel-deprecation .panel-progress .panel-progress-bar,.panel-version.panel-warning .panel-progress .panel-progress-bar{background-color:#e8a33d}.panel-flat.panel-feature,.panel-flat.panel-success,.panel-rst.panel-feature,.panel-rst.panel-success,.panel-version.panel-feature,.panel-version.panel-success{border-color:#79a548}.panel-flat.panel-feature>.panel-heading,.panel-flat.panel-success>.panel-heading,.panel-rst.panel-feature>.panel-heading,.panel-rst.panel-success>.panel-heading,.panel-version.panel-feature>.panel-heading,.panel-version.panel-success>.panel-heading{color:#fff;background-color:#79a548;border-color:#79a548}.panel-flat.panel-feature>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-success>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-feature>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-success>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-feature>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#79a548}.panel-flat.panel-feature>.panel-heading .badge,.panel-flat.panel-success>.panel-heading .badge,.panel-rst.panel-feature>.panel-heading .badge,.panel-rst.panel-success>.panel-heading .badge,.panel-version.panel-feature>.panel-heading .badge,.panel-version.panel-success>.panel-heading .badge{color:#79a548;background-color:#fff}.panel-flat.panel-feature>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-success>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-feature>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-success>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-feature>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#79a548}.panel-flat.panel-feature.risk-high>.panel-heading,.panel-flat.panel-success.risk-high>.panel-heading,.panel-rst.panel-feature.risk-high>.panel-heading,.panel-rst.panel-success.risk-high>.panel-heading,.panel-version.panel-feature.risk-high>.panel-heading,.panel-version.panel-success.risk-high>.panel-heading{background:#79a548;color:#f5f5f5}.panel-flat.panel-feature.risk-medium>.panel-heading,.panel-flat.panel-success.risk-medium>.panel-heading,.panel-rst.panel-feature.risk-medium>.panel-heading,.panel-rst.panel-success.risk-medium>.panel-heading,.panel-version.panel-feature.risk-medium>.panel-heading,.panel-version.panel-success.risk-medium>.panel-heading{background:#ddeacf;color:#1e1e1e}.panel-flat.panel-feature.risk-low>.panel-heading,.panel-flat.panel-success.risk-low>.panel-heading,.panel-rst.panel-feature.risk-low>.panel-heading,.panel-rst.panel-success.risk-low>.panel-heading,.panel-version.panel-feature.risk-low>.panel-heading,.panel-version.panel-success.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-feature .panel-progress .panel-progress-bar,.panel-flat.panel-success .panel-progress .panel-progress-bar,.panel-rst.panel-feature .panel-progress .panel-progress-bar,.panel-rst.panel-success .panel-progress .panel-progress-bar,.panel-version.panel-feature .panel-progress .panel-progress-bar,.panel-version.panel-success .panel-progress .panel-progress-bar{background-color:#79a548}.panel-flat.panel-important,.panel-flat.panel-info,.panel-rst.panel-important,.panel-rst.panel-info,.panel-version.panel-important,.panel-version.panel-info{border-color:#6daae0}.panel-flat.panel-important>.panel-heading,.panel-flat.panel-info>.panel-heading,.panel-rst.panel-important>.panel-heading,.panel-rst.panel-info>.panel-heading,.panel-version.panel-important>.panel-heading,.panel-version.panel-info>.panel-heading{color:#fff;background-color:#6daae0;border-color:#6daae0}.panel-flat.panel-important>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-info>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-important>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-info>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-important>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#6daae0}.panel-flat.panel-important>.panel-heading .badge,.panel-flat.panel-info>.panel-heading .badge,.panel-rst.panel-important>.panel-heading .badge,.panel-rst.panel-info>.panel-heading .badge,.panel-version.panel-important>.panel-heading .badge,.panel-version.panel-info>.panel-heading .badge{color:#6daae0;background-color:#fff}.panel-flat.panel-important>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-info>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-important>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-info>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-important>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#6daae0}.panel-flat.panel-important.risk-high>.panel-heading,.panel-flat.panel-info.risk-high>.panel-heading,.panel-rst.panel-important.risk-high>.panel-heading,.panel-rst.panel-info.risk-high>.panel-heading,.panel-version.panel-important.risk-high>.panel-heading,.panel-version.panel-info.risk-high>.panel-heading{background:#6daae0;color:#f5f5f5}.panel-flat.panel-important.risk-medium>.panel-heading,.panel-flat.panel-info.risk-medium>.panel-heading,.panel-rst.panel-important.risk-medium>.panel-heading,.panel-rst.panel-info.risk-medium>.panel-heading,.panel-version.panel-important.risk-medium>.panel-heading,.panel-version.panel-info.risk-medium>.panel-heading{background:#ebf3fb;color:#1e1e1e}.panel-flat.panel-important.risk-low>.panel-heading,.panel-flat.panel-info.risk-low>.panel-heading,.panel-rst.panel-important.risk-low>.panel-heading,.panel-rst.panel-info.risk-low>.panel-heading,.panel-version.panel-important.risk-low>.panel-heading,.panel-version.panel-info.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-important .panel-progress .panel-progress-bar,.panel-flat.panel-info .panel-progress .panel-progress-bar,.panel-rst.panel-important .panel-progress .panel-progress-bar,.panel-rst.panel-info .panel-progress .panel-progress-bar,.panel-version.panel-important .panel-progress .panel-progress-bar,.panel-version.panel-info .panel-progress .panel-progress-bar{background-color:#6daae0}.panel-flat .panel-heading,.panel-rst .panel-heading,.panel-version .panel-heading{position:relative}.panel-flat .panel-heading a.link-action,.panel-rst .panel-heading a.link-action,.panel-version .panel-heading a.link-action{cursor:pointer}.panel-flat .panel-heading strong,.panel-rst .panel-heading strong,.panel-version .panel-heading strong{line-height:1.5em}.panel-flat pre,.panel-rst pre,.panel-version pre{margin:0;border-radius:0;border:0;border-top:1px solid #d7d7d7;white-space:pre-wrap;word-break:normal;word-wrap:normal}.upgrade_analysis_item_to_filter pre a{text-decoration:underline}#phpinfo table{width:100%;table-layout:fixed;word-wrap:break-word} \ No newline at end of file diff --git a/typo3/sysext/install/Resources/Public/Icons/module-install-environment.svg b/typo3/sysext/install/Resources/Public/Icons/module-install-environment.svg new file mode 100644 index 0000000000000000000000000000000000000000..c7e201507c7ca44d867c4b458504bc05506b2671 --- /dev/null +++ b/typo3/sysext/install/Resources/Public/Icons/module-install-environment.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 595.28 594.708"><path fill="#428954" d="M.945.934H595.28v593.774H.945z"/><path fill="#FFF" d="M469.939 243.072H135.908v-71.578h334.031v71.578zm0 95.437H135.908v-71.578h334.031v71.578zm0 95.438H135.908v-71.578h334.031v71.578zM350.643 219.212v-23.859H159.768v23.859h190.875zm0 95.438v-23.859H159.768v23.859h190.875zm0 95.437v-23.859H159.768v23.859h190.875zm83.507-220.699c-9.879 0-17.895 8.015-17.895 17.895s8.016 17.895 17.895 17.895 17.895-8.015 17.895-17.895-8.016-17.895-17.895-17.895zm0 95.438c-9.879 0-17.895 8.015-17.895 17.895 0 9.879 8.016 17.895 17.895 17.895s17.895-8.016 17.895-17.895c0-9.88-8.016-17.895-17.895-17.895zm0 95.437c-9.879 0-17.895 8.016-17.895 17.895s8.016 17.895 17.895 17.895 17.895-8.016 17.895-17.895-8.016-17.895-17.895-17.895z"/></svg> diff --git a/typo3/sysext/install/Resources/Public/Icons/module-install-maintenance.svg b/typo3/sysext/install/Resources/Public/Icons/module-install-maintenance.svg new file mode 100644 index 0000000000000000000000000000000000000000..59cbf09f53d4cf7b11b3408c1bcf57fd6a8ba73a --- /dev/null +++ b/typo3/sysext/install/Resources/Public/Icons/module-install-maintenance.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 595.28 594.708"><path fill="#D03F38" d="M.011 0h595.27v594.708H.011z"/><path fill="#FFF" d="M209.066 464.474c-4.294 4.294-10.455 6.907-16.802 6.907s-12.508-2.613-16.989-6.907l-19.79-20.163c-4.48-4.293-7.094-10.454-7.094-16.802s2.614-12.509 7.094-16.989l127.137-127.136c9.708 24.457 29.311 44.059 53.768 53.767L209.066 464.474zm-4.854-60.861c-6.534 0-11.948 5.414-11.948 11.948s5.414 11.948 11.948 11.948 11.948-5.414 11.948-11.948-5.414-11.948-11.948-11.948zm246.246-127.884c-11.762 33.231-43.687 56.194-78.971 56.194-46.112 0-83.638-37.525-83.638-83.638s37.525-83.638 83.638-83.638c13.629 0 31.364 4.107 42.752 11.762 1.867 1.307 2.987 2.987 2.987 5.227 0 2.054-1.307 4.107-2.987 5.228l-54.7 31.551v41.819l36.031 19.976c6.161-3.547 49.474-30.804 53.207-30.804 3.734 0 5.975 2.8 5.975 6.534 0 6.161-2.24 13.815-4.294 19.789z"/></svg> diff --git a/typo3/sysext/install/Resources/Public/Icons/module-install-settings.svg b/typo3/sysext/install/Resources/Public/Icons/module-install-settings.svg new file mode 100644 index 0000000000000000000000000000000000000000..89b884af391390d301242625aad04ae72d36030d --- /dev/null +++ b/typo3/sysext/install/Resources/Public/Icons/module-install-settings.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 595.28 594.708"><path fill="#1D588E" d="M0 0h595.279v594.708H0z"/><path fill="#FFF" d="M364.864 318.26c0 2.427-1.867 5.228-4.294 5.601l-28.939 4.481c-1.494 4.854-3.548 9.521-5.975 14.189 5.228 7.468 10.829 14.376 16.804 21.472.746 1.12 1.307 2.24 1.307 3.733 0 1.308-.374 2.614-1.307 3.548-3.734 5.041-24.646 27.819-30.061 27.819-1.493 0-2.801-.561-3.921-1.308l-21.471-16.803c-4.668 2.427-9.335 4.294-14.376 5.787-.934 9.522-1.867 19.791-4.294 28.939-.747 2.614-2.987 4.481-5.601 4.481h-34.728c-2.614 0-5.228-2.054-5.601-4.668l-4.294-28.565c-4.854-1.494-9.522-3.548-14.003-5.788l-22.031 16.616c-.934.934-2.427 1.308-3.734 1.308-1.494 0-2.8-.561-3.92-1.494-4.854-4.48-26.886-24.458-26.886-29.873 0-1.307.56-2.427 1.307-3.547 5.415-7.095 11.016-14.003 16.43-21.285-2.614-5.041-4.854-10.082-6.535-15.31l-28.379-4.48c-2.614-.374-4.481-2.801-4.481-5.415v-34.541c0-2.427 1.867-5.228 4.294-5.601l28.939-4.481c1.494-4.854 3.547-9.522 5.975-14.189-5.228-7.468-10.829-14.376-16.804-21.471-.747-1.12-1.307-2.427-1.307-3.734s.374-2.614 1.307-3.734c3.734-5.041 24.645-27.633 30.06-27.633 1.494 0 2.801.561 3.921 1.307l21.471 16.804c4.668-2.427 9.335-4.294 14.376-5.975.934-9.335 1.867-19.604 4.294-28.753.747-2.614 2.987-4.481 5.601-4.481h34.728c2.614 0 5.228 2.054 5.601 4.667l4.294 28.566c4.854 1.494 9.522 3.547 14.003 5.788l22.032-16.617c1.12-.934 2.427-1.307 3.733-1.307 1.494 0 2.801.561 3.921 1.494 4.854 4.481 26.886 24.646 26.886 29.873 0 1.307-.56 2.427-1.307 3.547-5.414 7.282-11.016 14.003-16.243 21.285 2.427 5.041 4.667 10.083 6.348 15.31l28.38 4.294c2.613.56 4.48 2.987 4.48 5.601v34.543zm-119.492-65.347c-26.326 0-47.797 21.471-47.797 47.797 0 26.325 21.471 47.797 47.797 47.797s47.797-21.472 47.797-47.797c0-26.326-21.471-47.797-47.797-47.797zm238.984-34.728c0 2.801-24.085 5.415-27.819 5.788-1.493 3.547-3.36 6.721-5.602 9.708 1.681 3.734 9.522 22.405 9.522 25.766 0 .56-.187.934-.747 1.307-2.24 1.307-22.218 13.256-23.151 13.256-2.427 0-16.43-18.67-18.297-21.471-1.867.187-3.734.374-5.602.374s-3.734-.187-5.602-.374c-1.867 2.801-15.87 21.471-18.297 21.471-.934 0-20.911-11.949-23.151-13.256-.561-.374-.747-.934-.747-1.307 0-3.174 7.842-22.031 9.522-25.766-2.241-2.987-4.108-6.161-5.602-9.708-3.734-.374-27.819-2.987-27.819-5.788v-26.139c0-2.801 24.085-5.415 27.819-5.788 1.493-3.361 3.36-6.721 5.602-9.708-1.681-3.734-9.522-22.592-9.522-25.766 0-.374.187-.934.747-1.307 2.24-1.12 22.218-13.069 23.151-13.069 2.427 0 16.43 18.484 18.298 21.284 1.866-.187 3.733-.373 5.601-.373s3.734.187 5.602.374c5.228-7.282 10.828-14.563 17.177-20.911l1.12-.374c.934 0 20.911 11.763 23.151 13.069.561.374.747.934.747 1.307 0 3.361-7.842 22.031-9.522 25.766 2.241 2.987 4.108 6.348 5.602 9.708 3.734.374 27.819 2.987 27.819 5.788v26.139zm0 191.188c0 2.801-24.085 5.415-27.819 5.788-1.493 3.548-3.36 6.722-5.602 9.709 1.681 3.733 9.522 22.404 9.522 25.766 0 .56-.187.933-.747 1.307-2.24 1.307-22.218 13.256-23.151 13.256-2.427 0-16.43-18.671-18.297-21.471-1.867.187-3.734.373-5.602.373s-3.734-.187-5.602-.373c-1.867 2.8-15.87 21.471-18.297 21.471-.934 0-20.911-11.949-23.151-13.256-.561-.374-.747-.934-.747-1.307 0-3.175 7.842-22.032 9.522-25.766-2.241-2.987-4.108-6.161-5.602-9.709-3.734-.373-27.819-2.987-27.819-5.788v-26.139c0-2.801 24.085-5.415 27.819-5.788 1.493-3.36 3.36-6.722 5.602-9.709-1.681-3.733-9.522-22.591-9.522-25.766 0-.373.187-.933.747-1.307 2.24-1.12 22.218-13.069 23.151-13.069 2.427 0 16.43 18.484 18.298 21.284 1.866-.187 3.733-.373 5.601-.373s3.734.187 5.602.373c5.228-7.281 10.828-14.562 17.177-20.911l1.12-.373c.934 0 20.911 11.763 23.151 13.069.561.374.747.934.747 1.307 0 3.361-7.842 22.032-9.522 25.766 2.241 2.987 4.108 6.349 5.602 9.709 3.734.373 27.819 2.987 27.819 5.788v26.139zm-71.695-228.156c-13.069 0-23.898 10.829-23.898 23.898 0 13.256 10.829 23.898 23.898 23.898 13.256 0 23.898-10.829 23.898-23.898s-10.829-23.898-23.898-23.898zm0 191.188c-13.069 0-23.898 10.829-23.898 23.898 0 13.256 10.829 23.898 23.898 23.898 13.256 0 23.898-10.829 23.898-23.898s-10.829-23.898-23.898-23.898z"/></svg> diff --git a/typo3/sysext/install/Resources/Public/Icons/module-install-upgrade.svg b/typo3/sysext/install/Resources/Public/Icons/module-install-upgrade.svg new file mode 100644 index 0000000000000000000000000000000000000000..9c6210a8ffe11d76c0408b95ab6c6a0bcc120bd2 --- /dev/null +++ b/typo3/sysext/install/Resources/Public/Icons/module-install-upgrade.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 595.28 594.708"><path fill="#6C9DCC" d="M.954.934H595.28v593.774H.954z"/><path fill="#FFF" d="M361.234 253.461h-35.789v161.051c0 3.355-2.61 5.965-5.965 5.965H188.253c-2.237 0-4.474-1.305-5.406-3.355-.932-2.236-.746-4.66.746-6.523l29.824-35.789c1.119-1.306 2.982-2.051 4.66-2.051h59.648V253.461h-35.789c-4.66 0-8.761-2.609-10.811-6.897-1.864-4.101-1.305-9.133 1.677-12.675l59.648-71.578c4.474-5.405 13.793-5.405 18.267 0l59.648 71.578c2.982 3.542 3.729 8.575 1.678 12.675-2.048 4.288-6.149 6.897-10.809 6.897z"/></svg> diff --git a/typo3/sysext/install/Resources/Public/Icons/module-install.svg b/typo3/sysext/install/Resources/Public/Icons/module-install.svg deleted file mode 100644 index 54ff4d4472e3d48659ae382296e9906c8bacea06..0000000000000000000000000000000000000000 --- a/typo3/sysext/install/Resources/Public/Icons/module-install.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path fill="#FF8700" d="M0 0h64v64H0z"/><path fill="#FFF" d="M49.535 29.295l-5.457-1.558a12.594 12.594 0 0 0-.517-1.27l2.751-4.953a.642.642 0 0 0-.108-.766l-2.952-2.952a.643.643 0 0 0-.766-.108l-4.953 2.751a12.69 12.69 0 0 0-1.27-.517l-1.558-5.457a.645.645 0 0 0-.62-.465h-4.171c-.288 0-.54.19-.617.465l-1.561 5.459c-.435.154-.859.319-1.27.517l-4.953-2.751a.64.64 0 0 0-.766.108l-2.949 2.949a.64.64 0 0 0-.108.766l2.751 4.953a12.69 12.69 0 0 0-.517 1.27l-5.459 1.558a.647.647 0 0 0-.465.621v4.173c0 .288.19.54.465.617l5.457 1.558c.154.435.319.859.517 1.27l-2.751 4.953a.642.642 0 0 0 .108.766l2.952 2.952a.643.643 0 0 0 .766.108l4.953-2.751c.411.198.836.363 1.27.517l1.558 5.457c.08.275.332.465.62.465h4.173c.288 0 .54-.19.617-.465l1.558-5.457c.435-.154.859-.319 1.27-.517l4.953 2.751a.642.642 0 0 0 .766-.108l2.952-2.952a.643.643 0 0 0 .108-.766l-2.751-4.953c.198-.411.363-.836.517-1.27l5.457-1.558a.645.645 0 0 0 .465-.62v-4.171a.645.645 0 0 0-.465-.619zM32 39.714c-4.261 0-7.714-3.453-7.714-7.714s3.453-7.714 7.714-7.714 7.714 3.453 7.714 7.714-3.453 7.714-7.714 7.714z"/><path fill="#FFF" d="M32 32h24v24H32z"/><path fill="#FF8700" d="M54 34v20H34V34h20m4-4H30v28h28V30z"/><path fill="#FF8700" d="M36 36h16v2H36zM36 40h16v12H36z"/><path fill="#FFF" d="M42.391 49.625a.574.574 0 0 0 .804-.002l5.636-5.636a.563.563 0 0 0-.003-.809l-.798-.798a.574.574 0 0 0-.802-.011l-4.04 4.04a.557.557 0 0 1-.794-.004l-1.618-1.618a.561.561 0 0 0-.805.007l-.798.798a.566.566 0 0 0-.006.807l3.224 3.226z"/></svg> \ No newline at end of file diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Install.js b/typo3/sysext/install/Resources/Public/JavaScript/Install.js index c4fb737a73de597bc1c9aeb045e45e66e87cb2de..224e6952db6f05c3f31f7d522fa373b276b47e9a 100644 --- a/typo3/sysext/install/Resources/Public/JavaScript/Install.js +++ b/typo3/sysext/install/Resources/Public/JavaScript/Install.js @@ -11,1372 +11,10 @@ * The TYPO3 project - inspiring people to share! */ -/** - * Various JavaScript functions for the Install Tool - */ - -/** - * Handle core update - */ -var TYPO3 = {}; -TYPO3.Install = {}; - -TYPO3.Install.Severity = { - loading: -3, - notice: -2, - info: -1, - ok: 0, - warning: 1, - error: 2 -}; - -TYPO3.Install.Severity.getCssClass = function (severity) { - var severityClass; - switch (severity) { - case TYPO3.Install.Severity.loading: - severityClass = 'notice alert-loading'; - break; - case TYPO3.Install.Severity.notice: - severityClass = 'notice'; - break; - case TYPO3.Install.Severity.ok: - severityClass = 'success'; - break; - case TYPO3.Install.Severity.warning: - severityClass = 'warning'; - break; - case TYPO3.Install.Severity.error: - severityClass = 'danger'; - break; - case TYPO3.Install.Severity.info: - default: - severityClass = 'info'; - } - return severityClass; -}; - -TYPO3.Install.FlashMessage = { - template: $('<div class="t3js-message typo3-message alert"><h4></h4><p class="messageText"></p></div>'), - render: function (severity, title, message) { - var flashMessage = this.template.clone(); - flashMessage.addClass('alert-' + TYPO3.Install.Severity.getCssClass(severity)); - if (title) { - flashMessage.find('h4').html(title); - } - if (message) { - flashMessage.find('.messageText').html(message); - } else { - flashMessage.find('.messageText').remove(); - } - return flashMessage; - } -}; - -TYPO3.Install.DumpAutoload = { - /** - * output DOM Container - */ - outputContainer: {}, - - /** - * Clone of the DOM object that contains the submit button - */ - submitButton: {}, - - /** - * Default output messages - */ - outputMessages: { - dumpAutoload: { - fatalTitle: 'Something went wrong', - fatalMessage: '', - loadingTitle: 'Loading...', - loadingMessage: '' - } - }, - - /** - * Fetching the templates out of the DOM - * - * @param dumpAutoloadContainer DOM element id with all needed HTML in it - * @return boolean DOM container could be found and initialization finished - */ - initialize: function(dumpAutoloadContainer) { - this.outputContainer[dumpAutoloadContainer] = $('.t3js-' + dumpAutoloadContainer); - - if (this.outputContainer[dumpAutoloadContainer]) { - // submit button: save and delete - if(!this.submitButton[dumpAutoloadContainer]) { - var submitButton = this.outputContainer[dumpAutoloadContainer].find('button[type="submit"]'); - this.submitButton[dumpAutoloadContainer] = submitButton.clone(); - } - - // clear all messages from the run before - this.outputContainer[dumpAutoloadContainer].find('.typo3-message:visible ').remove(); - - return true; - } - return false; - }, - - /** - * Ajax call to dump Autoload Information - * @param actionName - */ - dumpAutoload: function(actionName) { - var self = this; - var url = location.href + '&install[controller]=ajax&install[action]=' + actionName; - var isInitialized = self.initialize(actionName); - if (isInitialized) { - self.addMessage( - TYPO3.Install.Severity.loading, - self.outputMessages[actionName].loadingTitle, - self.outputMessages[actionName].loadingMessage, - actionName - ); - $.ajax({ - url: url, - cache: false, - success: function(data) { - if (data.success === true && Array.isArray(data.status)) { - if (data.status.length > 0) { - self.outputContainer[actionName].find('.alert-loading').hide(); - data.status.forEach((function (element) { - //noinspection JSUnresolvedVariable - self.addMessage( - element.severity, - element.title, - element.message, - actionName - ); - })); - } else { - self.outputContainer[actionName].find('.alert-loading').hide(); - self.addMessage( - TYPO3.Install.Severity.ok, - self.outputMessages[actionName].successTitle, - self.outputMessages[actionName].successMessage, - actionName - ); - } - } else if (data === 'unauthorized') { - location.reload(); - } - }, - error: function() { - self.outputContainer[actionName].find('.alert-loading').hide(); - self.addMessage( - TYPO3.Install.Severity.error, - self.outputMessages[actionName].fatalTitle, - self.outputMessages[actionName].fatalMessage, - actionName - ); - } - }); - } - }, - - /** - * Move the submit button to the end of the box - * - * @param dumpAutoloadContainer DOM container name - */ - moveSubmitButtonFurtherDown: function(dumpAutoloadContainer) { - // first remove the currently visible button - this.outputContainer[dumpAutoloadContainer].find('button[type="submit"]').remove(); - // then append the cloned template to the end - this.outputContainer[dumpAutoloadContainer].append(this.submitButton[dumpAutoloadContainer]); - }, - - /** - * Show a status message - * - * @param severity - * @param title - * @param message - * @param dumpAutoloadContainer DOM container name - */ - addMessage: function(severity, title, message, dumpAutoloadContainer) { - var domMessage = TYPO3.Install.FlashMessage.render(severity, title, message); - this.outputContainer[dumpAutoloadContainer].append(domMessage); - this.moveSubmitButtonFurtherDown(dumpAutoloadContainer); - } -}; - -TYPO3.Install.Cache = { - /** - * output DOM Container - */ - outputContainer: {}, - - /** - * Clone of the DOM object that contains the submit button - */ - submitButton: {}, - - /** - * Default output messages - */ - outputMessages: { - clearAllCache: { - fatalTitle: 'Something went wrong', - fatalMessage: '', - loadingTitle: 'Loading...', - loadingMessage: '' - } - }, - - /** - * Fetching the templates out of the DOM - * - * @param cacheCheckContainer DOM element id with all needed HTML in it - * @return boolean DOM container could be found and initialization finished - */ - initialize: function(cacheCheckContainer) { - this.outputContainer[cacheCheckContainer] = $('.t3js-' + cacheCheckContainer) - - if (this.outputContainer[cacheCheckContainer]) { - // submit button: save and delete - if(!this.submitButton[cacheCheckContainer]) { - var submitButton = this.outputContainer[cacheCheckContainer].find('button[type="submit"]'); - this.submitButton[cacheCheckContainer] = submitButton.clone(); - } - - // clear all messages from the run before - this.outputContainer[cacheCheckContainer].find('.typo3-message:visible ').remove(); - - return true; - } - return false; - }, - - /** - * Ajax call to clear all caches. - */ - clearCache: function () { - $.ajax({ - url: location.href + '&install[controller]=ajax&install[action]=clearCache', - cache: false - }); - }, - clearAllCache: function(actionName) { - var self = this; - var url = location.href + '&install[controller]=ajax&install[action]=' + actionName; - var isInitialized = self.initialize(actionName); - if (isInitialized) { - self.addMessage( - TYPO3.Install.Severity.loading, - self.outputMessages[actionName].loadingTitle, - self.outputMessages[actionName].loadingMessage, - actionName - ); - $.ajax({ - url: url, - cache: false, - success: function(data) { - if (data.success === true && Array.isArray(data.status)) { - if (data.status.length > 0) { - self.outputContainer[actionName].find('.alert-loading').hide(); - data.status.forEach((function (element) { - //noinspection JSUnresolvedVariable - self.addMessage( - element.severity, - element.title, - element.message, - actionName - ); - })); - } else { - self.outputContainer[actionName].find('.alert-loading').hide(); - self.addMessage( - TYPO3.Install.Severity.ok, - self.outputMessages[actionName].successTitle, - self.outputMessages[actionName].successMessage, - actionName - ); - } - } else if (data === 'unauthorized') { - location.reload(); - } - } - }); - } - }, - /** - * Move the submit button to the end of the box - * - * @param cacheCheckContainer DOM container name - */ - moveSubmitButtonFurtherDown: function(cacheCheckContainer) { - // first remove the currently visible button - this.outputContainer[cacheCheckContainer].find('button[type="submit"]').remove(); - // then append the cloned template to the end - this.outputContainer[cacheCheckContainer].append(this.submitButton[cacheCheckContainer]); - }, - - /** - * Show a status message - * - * @param severity - * @param title - * @param message - * @param cacheCheckContainer DOM container name - */ - addMessage: function(severity, title, message, cacheCheckContainer) { - var domMessage = TYPO3.Install.FlashMessage.render(severity, title, message); - this.outputContainer[cacheCheckContainer].append(domMessage); - this.moveSubmitButtonFurtherDown(cacheCheckContainer); - } -}; - -TYPO3.Install.Scrolling = { - isScrolledIntoView: function (elem) { - var $window = $(window); - var docViewTop = $window.scrollTop(); - var docViewBottom = docViewTop + $window.height(); - var $elem = $(elem); - var elemTop = $elem.offset().top; - var elemBottom = elemTop + $elem.height(); - - return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop)); - }, - handleButtonScrolling: function () { - var $fixedFooterHandler = $('#fixed-footer-handler'); - if ($fixedFooterHandler.length > 0) { - var $fixedFooter = $('#fixed-footer'); - if (!this.isScrolledIntoView($fixedFooterHandler)) { - $fixedFooter.addClass('fixed'); - $fixedFooter.width($('.content-area').width()); - } else { - $fixedFooter.removeClass('fixed'); - } - } - } -}; - -TYPO3.Install.ExtensionChecker = { - /** - * Call checkExtensionsCompatibility recursively on error - * so we can find all incompatible extensions - */ - handleCheckExtensionsError: function () { - this.checkExtensionsCompatibility(false); - }, - /** - * Send an ajax request to uninstall an extension (or multiple extensions) - * - * @param extension string of extension(s) - may be comma separated - */ - uninstallExtension: function (extension) { - var self = this; - var url = location.href + '&install[controller]=ajax&install[action]=uninstallExtension' + - '&install[uninstallExtension][extensions]=' + extension; - var $container = $('.t3js-checkExtensions'); - $.ajax({ - url: url, - cache: false, - success: function (data) { - if (data === 'OK') { - self.checkExtensionsCompatibility(true); - } else { - if (data === 'unauthorized') { - location.reload(); - } - // workaround for xdebug returning 200 OK on fatal errors - if (data.substring(data.length - 2) === 'OK') { - self.checkExtensionsCompatibility(true); - } else { - $('.alert-loading', $container).hide(); - var domMessage = TYPO3.Install.FlashMessage.render( - TYPO3.Install.Severity.error, - 'Something went wrong. Check failed.', - 'Message: ' + data - ); - $container.append(domMessage); - } - } - }, - error: function (data) { - self.handleCheckExtensionsError(data); - } - }); - }, - /** - * Handles result of extension compatibility check. - * Displays uninstall buttons for non-compatible extensions. - */ - handleCheckExtensionsSuccess: function () { - var self = this; - var $checkExtensions = $('.t3js-checkExtensions'); - - $.ajax({ - url: $checkExtensions.data('protocolurl'), - cache: false, - success: function (data) { - if (data) { - $('.alert-danger .messageText', $checkExtensions).html( - 'The following extensions are not compatible. Please uninstall them and try again. ' - ); - var extensions = data.split(','); - var unloadButtonWrapper = $('<fieldset class="t3-install-form-submit"></fieldset>'); - for (var i = 0; i < extensions.length; i++) { - var extension = extensions[i]; - var unloadButton = $('<button />', { - text: 'Uninstall ' + $.trim(extension), - 'class': 't3-js-uninstallSingle', - 'data-extension': $.trim(extension) - }); - var fullButton = unloadButtonWrapper.append(unloadButton); - $('.alert-danger .messageText', $checkExtensions).append(fullButton); - } - if (extensions.length) { - $(document).on('click', 't3-js-uninstallSingle', function (e) { - self.uninstallExtension($(this).data('extension')); - e.preventDefault(); - return false; - }); - } - var unloadAllButton = $('<button />', { - text: 'Uninstall all incompatible extensions: ' + data, - click: function (e) { - $('.alert-loading', $checkExtensions).show(); - self.uninstallExtension(data); - e.preventDefault(); - return false; - } - }); - unloadButtonWrapper.append('<hr />'); - var fullUnloadAllButton = unloadButtonWrapper.append(unloadAllButton); - $('.alert-danger .messageText', $checkExtensions).append(fullUnloadAllButton); - - $('.alert-loading', $checkExtensions).hide(); - $('button', $checkExtensions).show(); - $('.alert-danger', $checkExtensions).show(); - } else { - $('.t3js-message', $checkExtensions).hide(); - $('.alert-success', $checkExtensions).show(); - } - }, - error: function () { - $('.t3js-message', $checkExtensions).hide(); - $('.alert-success', $checkExtensions).show(); - } - }); - $.getJSON( - $checkExtensions.data('errorprotocolurl'), - function (data) { - $.each(data, function (i, error) { - var messageToDisplay = error.message + ' in ' + error.file + ' on line ' + error.line; - var domMessage = TYPO3.Install.FlashMessage.render(TYPO3.Install.Severity.warning, error.type, messageToDisplay); - $checkExtensions.find('.t3js-message.alert-danger').before(domMessage); - }); - } - ); - }, - /** - * Checks extension compatibility by trying to load ext_tables and ext_localconf via ajax. - * - * @param force - */ - checkExtensionsCompatibility: function (force) { - var self = this; - var url = location.href + '&install[controller]=ajax&install[action]=extensionCompatibilityTester'; - if (force) { - TYPO3.Install.Cache.clearCache(); - url += '&install[extensionCompatibilityTester][forceCheck]=1'; - } else { - url += '&install[extensionCompatibilityTester][forceCheck]=0'; - } - $.ajax({ - url: url, - cache: false, - success: function (data) { - if (data === 'OK') { - self.handleCheckExtensionsSuccess(); - } else { - if (data === 'unauthorized') { - location.reload(); - } - // workaround for xdebug returning 200 OK on fatal errors - if (data.substring(data.length - 2) === 'OK') { - self.handleCheckExtensionsSuccess(); - } else { - self.handleCheckExtensionsError(); - } - } - }, - error: function () { - self.handleCheckExtensionsError(); - } - }); - } -}; - -TYPO3.Install.TcaIntegrityChecker = { - - /** - * Default output messages - */ - outputMessages: { - tcaMigrationsCheck: { - fatalTitle: 'Something went wrong', - fatalMessage: 'Use "Check for broken extensions!"', - loadingTitle: 'Loading...', - loadingMessage: '', - successTitle: 'No TCA migrations need to be applied', - successMessage: 'Your TCA looks good.', - warningTitle: 'TCA migrations need to be applied', - warningMessage: 'Check the following list and apply needed changes.' - }, - tcaExtTablesCheck: { - fatalTitle: 'Something went wrong', - fatalMessage: 'Use "Check for broken extensions!"', - loadingTitle: 'Loading...', - loadingMessage: '', - successTitle: 'No TCA changes in ext_tables.php files. Good job!', - successMessage: '', - warningTitle: 'Extensions change TCA in ext_tables.php', - warningMessage: 'Check for ExtensionManagementUtility and $GLOBALS["TCA"].' - } - }, - - /** - * output DOM Container - */ - outputContainer: {}, - - /** - * Clone of the DOM object that contains the submit button - */ - submitButton: {}, - - /** - * Fetching the templates out of the DOM - * - * @param tcaIntegrityCheckContainer DOM element id with all needed HTML in it - * @return boolean DOM container could be found and initialization finished - */ - initialize: function (tcaIntegrityCheckContainer) { - var success = false; - this.outputContainer[tcaIntegrityCheckContainer] = $('.t3js-' + tcaIntegrityCheckContainer); - - if (this.outputContainer[tcaIntegrityCheckContainer]) { - // submit button: save and delete - if (!this.submitButton[tcaIntegrityCheckContainer]) { - var submitButton = this.outputContainer[tcaIntegrityCheckContainer].find('button[type="submit"]'); - this.submitButton[tcaIntegrityCheckContainer] = submitButton.clone(); - // submitButton.remove(); - } - - // clear all messages from the run before - this.outputContainer[tcaIntegrityCheckContainer].find('.typo3-message:visible ').remove(); - - success = true; - } - return success; - }, - - checkTcaIntegrity: function (actionName) { - var self = this; - var url = location.href + '&install[controller]=ajax&install[action]=' + actionName; - - var isInitialized = self.initialize(actionName); - if (isInitialized) { - self.addMessage( - TYPO3.Install.Severity.loading, - self.outputMessages[actionName].loadingTitle, - self.outputMessages[actionName].loadingMessage, - actionName - ); - - $.ajax({ - url: url, - cache: false, - success: function (data) { - - if (data.success === true && Array.isArray(data.status)) { - if (data.status.length > 0) { - self.outputContainer[actionName].find('.alert-loading').hide(); - self.addMessage( - TYPO3.Install.Severity.warning, - self.outputMessages[actionName].warningTitle, - self.outputMessages[actionName].warningMessage, - actionName - ); - data.status.forEach((function (element) { - //noinspection JSUnresolvedVariable - self.addMessage( - element.severity, - element.title, - element.message, - actionName - ); - })); - } else { - // nothing to complain, everything fine - self.outputContainer[actionName].find('.alert-loading').hide(); - self.addMessage( - TYPO3.Install.Severity.ok, - self.outputMessages[actionName].successTitle, - self.outputMessages[actionName].successMessage, - actionName - ); - } - } else if (data === 'unauthorized') { - location.reload(); - } - }, - error: function () { - self.outputContainer[actionName].find('.alert-loading').hide(); - self.addMessage( - TYPO3.Install.Severity.error, - self.outputMessages[actionName].fatalTitle, - self.outputMessages[actionName].fatalMessage, - actionName - ); - } - }); - } - }, - - /** - * Move the submit button to the end of the box - * - * @param tcaIntegrityCheckContainer DOM container name - */ - moveSubmitButtonFurtherDown: function (tcaIntegrityCheckContainer) { - // first remove the currently visible button - this.outputContainer[tcaIntegrityCheckContainer].find('button[type="submit"]').remove(); - // then append the cloned template to the end - this.outputContainer[tcaIntegrityCheckContainer].append(this.submitButton[tcaIntegrityCheckContainer]); - }, - - /** - * Show a status message - * - * @param severity - * @param title - * @param message - * @param tcaIntegrityCheckContainer DOM container name - */ - addMessage: function (severity, title, message, tcaIntegrityCheckContainer) { - var domMessage = TYPO3.Install.FlashMessage.render(severity, title, message); - this.outputContainer[tcaIntegrityCheckContainer].append(domMessage); - this.moveSubmitButtonFurtherDown(tcaIntegrityCheckContainer); - } - -}; - -TYPO3.Install.Status = { - getFolderStatus: function () { - var url = location.href + '&install[controller]=ajax&install[action]=folderStatus'; - $.ajax({ - url: url, - cache: false, - success: function (data) { - if (data > 0) { - $('.t3js-install-menu-folderStructure').append('<span class="badge badge-danger">' + data + '</span>'); - } - } - }); - }, - getEnvironmentStatus: function () { - var url = location.href + '&install[controller]=ajax&install[action]=environmentStatus'; - $.ajax({ - url: url, - cache: false, - success: function (data) { - if (data > 0) { - $('.t3js-install-menu-systemEnvironment').append('<span class="badge badge-danger">' + data + '</span>'); - } - } - }); - } -}; - -TYPO3.Install.coreUpdate = { - /** - * The action queue defines what actions are called in which order - */ - actionQueue: { - coreUpdateUpdateVersionMatrix: { - loadingMessage: 'Fetching list of released versions from typo3.org', - finishMessage: 'Fetched list of released versions', - nextActionName: 'coreUpdateIsUpdateAvailable' - }, - coreUpdateIsUpdateAvailable: { - loadingMessage: 'Checking for possible regular or security update', - finishMessage: undefined, - nextActionName: undefined - }, - coreUpdateCheckPreConditions: { - loadingMessage: 'Checking if update is possible', - finishMessage: 'System can be updated', - nextActionName: 'coreUpdateDownload' - }, - coreUpdateDownload: { - loadingMessage: 'Downloading new core', - finishMessage: undefined, - nextActionName: 'coreUpdateVerifyChecksum' - }, - coreUpdateVerifyChecksum: { - loadingMessage: 'Verifying checksum of downloaded core', - finishMessage: undefined, - nextActionName: 'coreUpdateUnpack' - }, - coreUpdateUnpack: { - loadingMessage: 'Unpacking core', - finishMessage: undefined, - nextActionName: 'coreUpdateMove' - }, - coreUpdateMove: { - loadingMessage: 'Moving core', - finishMessage: undefined, - nextActionName: 'clearCache' - }, - clearCache: { - loadingMessage: 'Clearing caches', - finishMessage: 'Caches cleared', - nextActionName: 'coreUpdateActivate' - }, - coreUpdateActivate: { - loadingMessage: 'Activating core', - finishMessage: 'Core updated - please reload your browser', - nextActionName: undefined - } - }, - - /** - * Clone of a DOM object acts as button template - */ - buttonTemplate: null, - - /** - * Fetching the templates out of the DOM - */ - initialize: function () { - var buttonTemplateSection = $('#buttonTemplate'); - this.buttonTemplate = buttonTemplateSection.children().clone(); - }, - - /** - * Public method checkForUpdate - */ - checkForUpdate: function () { - this.callAction('coreUpdateUpdateVersionMatrix'); - }, - - /** - * Public method updateDevelopment - */ - updateDevelopment: function () { - this.update('development'); - }, - - /** - * Public method updateRegular - */ - updateRegular: function () { - this.update('regular'); - }, - - /** - * Execute core update. - * - * @param type Either 'development' or 'regular' - */ - update: function (type) { - if (type !== "development") { - type = 'regular'; - } - this.callAction('coreUpdateCheckPreConditions', type); - }, - - /** - * Generic method to call actions from the queue - * - * @param actionName Name of the action to be called - * @param type Update type (optional) - */ - callAction: function (actionName, type) { - var self = this; - var data = { - install: { - controller: 'ajax', - action: actionName - } - }; - if (type !== undefined) { - data.install["type"] = type; - } - this.addLoadingMessage(this.actionQueue[actionName].loadingMessage); - $.ajax({ - url: location.href, - data: data, - cache: false, - success: function (result) { - var canContinue = self.handleResult(result, self.actionQueue[actionName].finishMessage); - if (canContinue === true && (self.actionQueue[actionName].nextActionName !== undefined)) { - self.callAction(self.actionQueue[actionName].nextActionName, type); - } - }, - error: function (result) { - self.handleResult(result); - } - }); - }, - - /** - * Handle ajax result of core update step. - * - * @param data - * @param successMessage Optional success message - */ - handleResult: function (data, successMessage) { - var canContinue = false; - this.removeLoadingMessage(); - if (data.success === true) { - canContinue = true; - if (data.status && typeof(data.status) === 'object') { - this.showStatusMessages(data.status); - } - if (data.action && typeof(data.action) === 'object') { - this.showActionButton(data.action); - } - if (successMessage) { - this.addMessage(TYPO3.Install.Severity.ok, successMessage); - } - } else { - // Handle clearcache until it uses the new view object - if (data === "OK") { - canContinue = true; - if (successMessage) { - this.addMessage(TYPO3.Install.Severity.ok, successMessage); - } - } else { - canContinue = false; - if (data.status && typeof(data.status) === 'object') { - this.showStatusMessages(data.status); - } else { - this.addMessage(TYPO3.Install.Severity.error, 'General error'); - } - } - } - return canContinue; - }, - - /** - * Add a loading message with some text. - * - * @param messageTitle - */ - addLoadingMessage: function (messageTitle) { - var domMessage = TYPO3.Install.FlashMessage.render(TYPO3.Install.Severity.loading, messageTitle); - $('.t3js-coreUpdate').append(domMessage); - }, - - /** - * Remove an enabled loading message - */ - removeLoadingMessage: function () { - $('.t3js-coreUpdate').find('.alert-loading').remove(); - }, - - /** - * Show a list of status messages - * - * @param messages - */ - showStatusMessages: function (messages) { - var self = this; - $.each(messages, function (index, element) { - var title = false; - var message = false; - var severity = element.severity; - if (element.title) { - title = element.title; - } - if (element.message) { - message = element.message; - } - self.addMessage(severity, title, message); - }); - }, - - /** - * Show an action button - * - * @param button - */ - showActionButton: function (button) { - var title = false; - var action = false; - if (button.title) { - title = button.title; - } - if (button.action) { - action = button.action; - } - var domButton = this.buttonTemplate; - if (action) { - domButton.find('button').data('action', action); - } - if (title) { - domButton.find('button').html(title); - } - $('.t3js-coreUpdate').append(domButton); - }, - - /** - * Show a status message - * - * @param severity - * @param title - * @param message - */ - addMessage: function (severity, title, message) { - var domMessage = TYPO3.Install.FlashMessage.render(severity, title, message); - $('.t3js-coreUpdate').append(domMessage); - } -}; - -TYPO3.Install.ResetBackendUserUc = { - /** - * output DOM Container - */ - outputContainer: {}, - - /** - * Clone of the DOM object that contains the submit button - */ - submitButton: {}, - - /** - * Default output messages - */ - outputMessages: { - resetBackendUserUc: { - fatalTitle: 'Something went wrong', - fatalMessage: '', - loadingTitle: 'Loading…', - loadingMessage: '' - } - }, - - /** - * Fetching the templates out of the DOM - * - * @param resetBackendUserUcContainer DOM element id with all needed HTML in it - * @return boolean DOM container could be found and initialization finished - */ - initialize: function (resetBackendUserUcContainer) { - var success = false; - this.outputContainer[resetBackendUserUcContainer] = $('.t3js-' + resetBackendUserUcContainer); - - if (this.outputContainer[resetBackendUserUcContainer]) { - // submit button: save and delete - if (!this.submitButton[resetBackendUserUcContainer]) { - var submitButton = this.outputContainer[resetBackendUserUcContainer].find('button[type="submit"]'); - this.submitButton[resetBackendUserUcContainer] = submitButton.clone(); - } - - // clear all messages from the run before - this.outputContainer[resetBackendUserUcContainer].find('.typo3-message:visible ').remove(); - - success = true; - } - return success; - }, - - resetBackendUserUc: function (actionName) { - var self = this; - var url = location.href + '&install[controller]=ajax&install[action]=' + actionName; - var isInitialized = self.initialize(actionName); - if (isInitialized) { - self.addMessage( - TYPO3.Install.Severity.loading, - self.outputMessages[actionName].loadingTitle, - self.outputMessages[actionName].loadingMessage, - actionName - ); - $.ajax({ - url: url, - cache: false, - success: function(data) { - if (data.success === true && Array.isArray(data.status)) { - if (data.status.length > 0) { - self.outputContainer[actionName].find('.alert-loading').hide(); - data.status.forEach((function (element) { - //noinspection JSUnresolvedVariable - self.addMessage( - element.severity, - element.title, - element.message, - actionName - ); - })); - } else { - self.outputContainer[actionName].find('.alert-loading').hide(); - self.addMessage( - TYPO3.Install.Severity.ok, - self.outputMessages[actionName].successTitle, - self.outputMessages[actionName].successMessage, - actionName - ); - } - } else if (data === 'unauthorized') { - location.reload(); - } - }, - error: function() { - self.outputContainer[actionName].find('.alert-loading').hide(); - self.addMessage( - TYPO3.Install.Severity.error, - self.outputMessages[actionName].fatalTitle, - self.outputMessages[actionName].fatalMessage, - actionName - ); - } - }); - } - }, - - /** - * Move the submit button to the end of the box - * - * @param resetBackendUserUcContainer DOM container name - */ - moveSubmitButtonFurtherDown: function (resetBackendUserUcContainer) { - // first remove the currently visible button - this.outputContainer[resetBackendUserUcContainer].find('button[type="submit"]').remove(); - // then append the cloned template to the end - this.outputContainer[resetBackendUserUcContainer].append(this.submitButton[resetBackendUserUcContainer]); - }, - - /** - * Show a status message - * - * @param severity - * @param title - * @param message - * @param resetBackendUserUcContainer DOM container name - */ - addMessage: function (severity, title, message, resetBackendUserUcContainer) { - var domMessage = TYPO3.Install.FlashMessage.render(severity, title, message); - this.outputContainer[resetBackendUserUcContainer].append(domMessage); - this.moveSubmitButtonFurtherDown(resetBackendUserUcContainer); - } -}; - -TYPO3.Install.ExtensionScanner = { - listOfAffectedRestFileHashes: [], - selectorExtensionContainer: '.t3js-extensionscanner-extension', - selectorNumberOfFiles: '.t3js-extensionscanner-number-of-files', - - /** - * - * @param {string} extension - * @returns {string} - */ - getExtensionSelector: function(extension) { - return this.selectorExtensionContainer + '-' + extension; - }, - - /** - * - * @param {JQuery} $extensions - */ - scanAll: function($extensions) { - var self = this; - $(this.selectorExtensionContainer) - .removeClass('panel-danger panel-warning panel-success') - .find('.panel-progress-bar') - .css('width', 0) - .attr('aria-valuenow', 0) - .find('span') - .text('0%'); - self.setProgressForAll(); - $extensions.each(function () { - var extension = $(this).data('extension'); - self.scanSingleExtension(extension); - }); - }, - - /** - * - * @param {string} extension - * @param {number} doneFiles - * @param {number} numberOfFiles - */ - setStatusMessageForScan: function(extension, doneFiles, numberOfFiles) { - $(this.getExtensionSelector(extension)) - .find(this.selectorNumberOfFiles) - .text('Checked ' + doneFiles + ' of ' + numberOfFiles + ' files'); - }, - - /** - * - * @param {string} extension - * @param {number} doneFiles - * @param {number} numberOfFiles - */ - setProgressForScan: function(extension, doneFiles, numberOfFiles) { - var percent = (doneFiles / numberOfFiles) * 100; - $(this.getExtensionSelector(extension)) - .find('.panel-progress-bar') - .css('width', percent + '%') - .attr('aria-valuenow', percent) - .find('span') - .text(percent + '%'); - }, - - /** - * - */ - setProgressForAll: function() { - var self = this; - var numberOfExtensions = $(this.selectorExtensionContainer).length; - var numberOfSuccess = $(this.selectorExtensionContainer + '.t3js-extensionscan-finished.panel-success').length; - var numberOfWarning = $(this.selectorExtensionContainer + '.t3js-extensionscan-finished.panel-warning').length; - var numberOfError = $(this.selectorExtensionContainer + '.t3js-extensionscan-finished.panel-danger').length; - var numberOfScannedExtensions = numberOfSuccess + numberOfWarning + numberOfError; - var percent = (numberOfScannedExtensions / numberOfExtensions) * 100; - var markFullyScannedFilesToken = $('#t3js-extensionscanner-mark-fully-scanned-rest-files-token').text(); - var url = location.href + '&install[controller]=ajax'; - $('.t3js-progress-all-extension .progress-bar') - .css('width', percent+'%') - .attr('aria-valuenow', percent) - .find('span') - .text(numberOfScannedExtensions + ' of ' + numberOfExtensions + ' scanned'); - if (numberOfScannedExtensions === numberOfExtensions) { - top.TYPO3.Notification.success('Scan finished', 'All extensions has been scanned'); - var postData = { - 'install': { - 'action': 'extensionScannerMarkFullyScannedRestFiles', - 'token': markFullyScannedFilesToken, - 'hashes': self.uniqueArray(TYPO3.Install.ExtensionScanner.listOfAffectedRestFileHashes) - } - }; - $.ajax({ - method: 'POST', - data: postData, - url: url, - cache: false, - success: function (data) { - if (data.success === true) { - top.TYPO3.Notification.success('Marked not affected files', 'Marked ' + data.markedAsNotAffected + ' ReST files as not affected.'); - } - } - }); - } - }, - - /** - * - * @param {Array} anArray - * @returns {Array} - */ - uniqueArray: function(anArray) { - return anArray.filter(function(value, index, self) { - return self.indexOf(value) === index; - }); - }, - - /** - * - * @param {string} extension - */ - scanSingleExtension: function(extension) { - var $extensionContainer = $(this.getExtensionSelector(extension)); - var filesToken = $('#t3js-extensionscanner-files-token').text(); - var hitTemplate = $('#t3js-extensionscanner-file-hit-template').html(); - var restTemplate = $('#t3js-extensionscanner-file-hit-rest-template').html(); - var scanFileToken = $('#t3js-extensionscanner-scan-file-token').text(); - var hitFound = false; - var self = this; - var url = location.href + '&install[controller]=ajax'; - var postData = { - 'install': { - 'action': 'extensionScannerFiles', - 'token': filesToken, - 'extension': extension - } - }; - $extensionContainer.removeClass('panel-danger panel-warning panel-success t3js-extensionscan-finished'); - $extensionContainer.data('hasRun', 'true'); - $extensionContainer.find('.t3js-extensionscanner-scan-single').text('Scanning...').attr('disabled','disabled'); - $extensionContainer.find('.t3js-extensionscanner-extension-body-loc').empty().text('0'); - $extensionContainer.find('.t3js-extensionscanner-extension-body-ignored-files').empty().text('0'); - $extensionContainer.find('.t3js-extensionscanner-extension-body-ignored-lines').empty().text('0'); - this.setProgressForAll(); - $.ajax({ - method: 'POST', - data: postData, - url: url, - cache: false, - success: function(data) { - if (data.success === true && Array.isArray(data.files)) { - var numberOfFiles = data.files.length; - if (numberOfFiles > 0) { - self.setStatusMessageForScan(extension, 0, numberOfFiles); - $extensionContainer.find('.t3js-extensionscanner-extension-body').text(''); - var doneFiles = 0; - data.files.forEach(function (file) { - var postData = { - 'install': { - 'action': 'extensionScannerScanFile', - 'token': scanFileToken, - 'extension': extension, - 'file': file - } - }; - $.ajax({ - method: 'POST', - data: postData, - url: url, - cache: false, - success: function (fileData) { - doneFiles = doneFiles + 1; - self.setStatusMessageForScan(extension, doneFiles, numberOfFiles); - self.setProgressForScan(extension, doneFiles, numberOfFiles); - if (fileData.success && $.isArray(fileData.matches)) { - $(fileData.matches).each(function () { - hitFound = true; - var match = this; - var aMatch = $(hitTemplate).clone(); - aMatch.find('.t3js-extensionscanner-hit-file-panel-head').attr('href', '#collapse' + match.uniqueId); - aMatch.find('.t3js-extensionscanner-hit-file-panel-body').attr('id', 'collapse' + match.uniqueId); - aMatch.find('.t3js-extensionscanner-hit-filename').html(file); - aMatch.find('.t3js-extensionscanner-hit-message').html(match.message); - if (match.indicator === 'strong') { - aMatch.find('.t3js-extensionscanner-hit-file-panel-head .badges') - .append('<span class="badge" title="Reliable match, false positive unlikely">strong</span>'); - } else { - aMatch.find('.t3js-extensionscanner-hit-file-panel-head .badges') - .append('<span class="badge" title="Probable match, but can be a false positive">weak</span>'); - } - if (match.silenced === true) { - aMatch.find('.t3js-extensionscanner-hit-file-panel-head .badges') - .append('<span class="badge" title="Match has been annotated by extension author as false positive match">silenced</span>'); - } - aMatch.find('.t3js-extensionscanner-hit-file-lineContent').empty().text(match.lineContent); - aMatch.find('.t3js-extensionscanner-hit-file-line').empty().text(match.line + ': '); - if ($.isArray(match.restFiles)) { - $(match.restFiles).each(function () { - var restFile = this; - var aRest = $(restTemplate).clone(); - aRest.find('.t3js-extensionscanner-hit-rest-panel-head').attr('href', '#collapse' + restFile.uniqueId); - aRest.find('.t3js-extensionscanner-hit-rest-panel-head .badge').empty().text(restFile.version); - aRest.find('.t3js-extensionscanner-hit-rest-panel-body').attr('id', 'collapse' + restFile.uniqueId); - aRest.find('.t3js-extensionscanner-hit-rest-headline').html(restFile.headline); - aRest.find('.t3js-extensionscanner-hit-rest-body').html(restFile.content); - aRest.addClass('panel-' + restFile.class); - aMatch.find('.t3js-extensionscanner-hit-file-rest-container').append(aRest); - TYPO3.Install.ExtensionScanner.listOfAffectedRestFileHashes.push(restFile.file_hash); - }); - } - var panelClass = - aMatch.find('.panel-breaking', '.t3js-extensionscanner-hit-file-rest-container').length > 0 - ? 'panel-danger' - : 'panel-warning'; - aMatch.addClass(panelClass); - $extensionContainer.find('.t3js-extensionscanner-extension-body').removeClass('hide').append(aMatch); - if (panelClass === 'panel-danger') { - $extensionContainer.removeClass('panel-warning').addClass(panelClass); - } - if (panelClass === 'panel-warning' && !$extensionContainer.hasClass('panel-danger')) { - $extensionContainer.addClass(panelClass); - } - }); - } - if (fileData.success) { - var currentLinesOfCode = parseInt($extensionContainer.find('.t3js-extensionscanner-extension-body-loc').text()); - $extensionContainer.find('.t3js-extensionscanner-extension-body-loc').empty().text(currentLinesOfCode + parseInt(fileData.effectiveCodeLines)); - if (fileData.isFileIgnored) { - var currentIgnoredFiles = parseInt($extensionContainer.find('.t3js-extensionscanner-extension-body-ignored-files').text()); - $extensionContainer.find('.t3js-extensionscanner-extension-body-ignored-files').empty().text(currentIgnoredFiles + 1); - } - var currentIgnoredLines = parseInt($extensionContainer.find('.t3js-extensionscanner-extension-body-ignored-lines').text()); - $extensionContainer.find('.t3js-extensionscanner-extension-body-ignored-lines').empty().text(currentIgnoredLines + parseInt(fileData.ignoredLines)); - } - if (doneFiles === numberOfFiles) { - if (!hitFound) { - $extensionContainer.addClass('panel-success'); - } - $extensionContainer.addClass('t3js-extensionscan-finished'); - self.setProgressForAll(); - $extensionContainer.find('.t3js-extensionscanner-scan-single').text('Rescan').attr('disabled', null); - } - }, - error: function(data) { - doneFiles = doneFiles + 1; - self.setStatusMessageForScan(extension, doneFiles, numberOfFiles); - self.setProgressForScan(extension, doneFiles, numberOfFiles); - self.setProgressForAll(); - top.TYPO3.Notification.error('Oops, an error occurred', 'please look the console output for details'); - console.error(data); - } - }); - }); - } else { - top.TYPO3.Notification.warning('No files found', 'the extension EXT:' + extension + ' contains no files we can scan'); - } - } - }, - error: function(data) { - top.TYPO3.Notification.error('Oops, an error occurred', 'please look the console output for details'); - console.error(data); - } - }); - } -}; - -$(function () { - // Used in database compare section to select/deselect checkboxes - $('.checkall').on('click', function () { - $(this).closest('fieldset').find(':checkbox').prop('checked', this.checked); - }); - - $('.item-description').find('a').on('click', function () { - var targetToggleGroupId = $(this.hash); - if (targetToggleGroupId) { - var $currentToggleGroup = $(this).closest('.toggleGroup'); - var $targetToggleGroup = $(targetToggleGroupId).closest('.toggleGroup'); - if ($targetToggleGroup !== $currentToggleGroup) { - $currentToggleGroup.removeClass('expanded'); - $currentToggleGroup.find('.toggleData').hide(); - $targetToggleGroup.addClass('expanded'); - $targetToggleGroup.find('.toggleData').show(); - TYPO3.Install.Scrolling.handleButtonScrolling(); - } - } - }); - - $(document).on('click', '.t3js-all-configuration-toggle', function () { - var $panels = $('.panel-collapse', '#allConfiguration'); - var action = ($panels.eq(0).hasClass('in')) ? 'hide' : 'show'; - $panels.collapse(action); - }); - - var $configSearch = $('#configSearch'); - if ($configSearch.length > 0) { - $(window).on('keydown', function (event) { - if (event.ctrlKey || event.metaKey) { - switch (String.fromCharCode(event.which).toLowerCase()) { - case 'f': - event.preventDefault(); - $configSearch.focus(); - break; - } - } else if (event.keyCode === 27) { - event.preventDefault(); - $configSearch.val('').focus(); - } - }); - } +require(['jquery', 'TYPO3/CMS/Install/CardLayout'], function($, CardLayout) { // Simple password strength indicator - $('.t3-install-form-password-strength').on('keyup', function () { + $(document).on('keyup', '.t3-install-form-password-strength', function() { var value = $(this).val(); var strongRegex = new RegExp('^(?=.{8,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*\\W).*$', 'g'); var mediumRegex = new RegExp('^(?=.{8,})(((?=.*[A-Z])(?=.*[a-z]))|((?=.*[A-Z])(?=.*[0-9]))|((?=.*[a-z])(?=.*[0-9]))).*$', 'g'); @@ -1397,360 +35,24 @@ $(function () { // Install step database settings $('#t3js-connect-database-driver').on('change', function() { - var driverSelector = '#' + $(this).val(); + var driver = $(this).val(); $('.t3-install-driver-data').hide(); $('.t3-install-driver-data input').attr('disabled', 'disabled'); - $(driverSelector + ' input').attr('disabled', false); - $(driverSelector).show(); + $('#' + driver + ' input').attr('disabled', false); + $('#' + driver).show(); }).trigger('change'); - // Extension compatibility check - var $container = $('.t3js-checkExtensions'); - $('.t3js-message', $container).hide(); - $('button', $container).click(function (e) { - $('button', $container).hide(); - $('.t3js-message', $container).hide(); - $('.alert-loading', $container).show(); - TYPO3.Install.ExtensionChecker.checkExtensionsCompatibility(true); - e.preventDefault(); - return false; - }); - - // Handle core update - var $coreUpdateSection = $('.t3js-coreUpdate'); - if ($coreUpdateSection) { - TYPO3.Install.coreUpdate.initialize(); - $coreUpdateSection.on('click', 'button', (function (e) { - e.preventDefault(); - var action = $(e.target).data('action'); - TYPO3.Install.coreUpdate[action](); - $(e.target).closest('.t3-install-form-submit').remove(); - })); - } - - // Handle clearAllCache - var $clearAllCacheSection = $('.t3js-clearAllCache'); - if ($clearAllCacheSection) { - $clearAllCacheSection.on('click', 'button', (function(e) { - TYPO3.Install.Cache.clearAllCache('clearAllCache'); - e.preventDefault(); - return false; - })); - } - - // Handle dumpAutoload - var $clearAllCacheSection = $('.t3js-dumpAutoload'); - if ($clearAllCacheSection) { - $clearAllCacheSection.on('click', 'button', (function(e) { - TYPO3.Install.DumpAutoload.dumpAutoload('dumpAutoload'); - e.preventDefault(); - return false; - })); - } - - // Handle TCA ext_tables check - var $tcaExtTablesCheckSection = $('.t3js-tcaExtTablesCheck'); - if ($tcaExtTablesCheckSection) { - $tcaExtTablesCheckSection.on('click', 'button', (function (e) { - TYPO3.Install.TcaIntegrityChecker.checkTcaIntegrity('tcaExtTablesCheck'); - e.preventDefault(); - return false; - })); - } - - // Handle TCA Migrations check - var $tcaMigrationsCheckSection = $('.t3js-tcaMigrationsCheck'); - if ($tcaMigrationsCheckSection) { - $tcaMigrationsCheckSection.on('click', 'button', (function (e) { - TYPO3.Install.TcaIntegrityChecker.checkTcaIntegrity('tcaMigrationsCheck'); - e.preventDefault(); - return false; - })); - } - - // Handle Reset backend user preferences - var $resetBackendUserUcSection = $('.t3js-resetBackendUserUc'); - if ($resetBackendUserUcSection) { - $resetBackendUserUcSection.on('click', 'button', (function(e) { - TYPO3.Install.ResetBackendUserUc.resetBackendUserUc('resetBackendUserUc'); - e.preventDefault(); - return false; - })); - } - - // Extension scanner - single extension - $('.t3js-extensionscanner-scan-single').on('click', function (e) { - var extension = $(e.target).data('extension'); - e.preventDefault(); - TYPO3.Install.ExtensionScanner.scanSingleExtension(extension); - return false; - }); - $('.t3js-extensionscanner-extension').on('show.bs.collapse', function(e) { - if ($(e.target).closest('.t3js-extensionscanner-extension').data('hasRun') !== 'true') { - $(this).find('.t3js-extensionscanner-scan-single').click(); - } - }); - - // Extension scanner - all extensions - var $extensionScannerScanAll = $('.t3js-extensionscanner-scan-all'); - if ($extensionScannerScanAll) { - $extensionScannerScanAll.on('click', '', (function (e) { - e.preventDefault(); - var $extensions = $('.t3js-extensionscanner-extension'); - TYPO3.Install.ExtensionScanner.scanAll($extensions); - return false; - })); - } + CardLayout.initialize(); - var $installLeft = $('.t3js-list-group-wrapper'); - if ($installLeft.length > 0) { - TYPO3.Install.Status.getFolderStatus(); - TYPO3.Install.Status.getEnvironmentStatus(); - } - // This makes jquerys "contains" work case-insensitive - jQuery.expr[':'].contains = jQuery.expr.createPseudo(function (arg) { - return function (elem) { - return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0; - }; - }); - $configSearch.keyup(function () { - var typedQuery = $(this).val(); - $('div.item').each(function () { - var $item = $(this); - if ($(':contains(' + typedQuery + ')', $item).length > 0 || $('input[value*="' + typedQuery + '"]', $item).length > 0) { - $item.removeClass('hidden').addClass('searchhit'); - } else { - $item.removeClass('searchhit').addClass('hidden'); + // Each card head can have a t3js-require class and a data-require attribute + // with the name of a requireJS module. Those are loaded here and initialize() + // is executed if exists. + $('.t3js-require').each(function() { + var module = $(this).data('require'); + require([module], function(aModule) { + if (typeof aModule.initialize !== 'undefined') { + aModule.initialize(); } }); - $('.searchhit').parent().collapse('show'); - }); - var $searchFields = $configSearch; - var searchResultShown = ('' !== $searchFields.first().val()); - - // make search field clearable - $searchFields.clearable({ - onClear: function () { - if (searchResultShown) { - $(this).closest('form').submit(); - } - } - }); - - // Define width of fixed menu - var $menuWrapper = $('#menuWrapper'); - var $menuListGroup = $menuWrapper.children('.t3js-list-group-wrapper'); - $menuWrapper.on('affixed.bs.affix', function () { - $menuListGroup.width($(this).parent().width()); - }); - $menuListGroup.width($menuWrapper.parent().width()); - $(window).resize(function () { - $menuListGroup.width($('#menuWrapper').parent().width()); - }); - var $collapse = $('.collapse'); - $collapse.on('shown.bs.collapse', function () { - TYPO3.Install.Scrolling.handleButtonScrolling(); }); - $collapse.on('hidden.bs.collapse', function () { - TYPO3.Install.Scrolling.handleButtonScrolling(); - }); - - // trigger 'handleButtonScrolling' on page scroll - // if the user scroll until page bottom, we need to remove 'position: fixed' - // so that the copyright info (footer) is not overlaid by the 'fixed button' - var scrollTimeout; - $(window).on('scroll', function () { - clearTimeout(scrollTimeout); - scrollTimeout = setTimeout(function () { - TYPO3.Install.Scrolling.handleButtonScrolling(); - }, 50); - }); - - // automatically select the custom preset if a value in one of its input fields is changed - $('.t3js-custom-preset').on('input', function () { - $('#' + $(this).data('radio')).prop('checked', true); - }); - - TYPO3.Install.upgradeAnalysis.initialize(); - TYPO3.Install.upgradeAnalysis.hideDoumentationFile(); - TYPO3.Install.upgradeAnalysis.restoreDocumentationFile(); }); - -TYPO3.Install.upgradeAnalysis = { - chosenField: null, - fulltextSearchField: null, - - provideTags: function () { - - var tagString = ''; - $('.upgrade_analysis_item_to_filter').each(function () { - tagString += $(this).data('item-tags') + ','; - }); - - var tagArray = TYPO3.Install.upgradeAnalysis.trimExplodeAndUnique(',', tagString); - $.each(tagArray, function (i, tag) { - $('#tagsort_tags_container').append('<option>' + tag + '</option>'); - }); - this.chosenField.trigger('chosen:updated'); - - var config = { - '.chosen-select': {}, - '.chosen-select-deselect': {allow_single_deselect: true}, - '.chosen-select-no-single': {disable_search_threshold: 10}, - '.chosen-select-no-results': {no_results_text: 'Oops, nothing found!'}, - '.chosen-select-width': {width: "100%"} - }; - for (var selector in config) { - $(selector).chosen(config[selector]); - } - this.chosenField.on('change', function () { - TYPO3.Install.upgradeAnalysis.combinedFilterSearch(); - }); - this.fulltextSearchField.keyup(function () { - TYPO3.Install.upgradeAnalysis.combinedFilterSearch(); - }); - }, - - combinedFilterSearch: function () { - var $items = $('div.item'); - if (this.chosenField.val().length < 1 && this.fulltextSearchField.val().length < 1) { - $('.panel-version:not(:first) > .panel-collapse').collapse('hide'); - $items.removeClass('hidden searchhit filterhit'); - return false; - } - $items.addClass('hidden').removeClass('searchhit filterhit'); - - // apply tags - if (this.chosenField.val().length > 0) { - $items - .addClass('hidden') - .removeClass('filterhit'); - var orTags = []; - var andTags = []; - $.each(this.chosenField.val(), function (index, item) { - var tagFilter = '[data-item-tags*="' + item + '"]'; - if (item.indexOf(':') > 0) { - orTags.push(tagFilter); - } else { - andTags.push(tagFilter); - } - }); - var andString = andTags.join(''); - var tags = []; - if (orTags.length) { - for (var i=0; i<orTags.length; i++) { - tags.push(andString + orTags[i]); - } - } else { - tags.push(andString); - } - var tagSelection = tags.join(','); - $(tagSelection) - .removeClass('hidden') - .addClass('searchhit filterhit'); - } else { - $items - .addClass('filterhit') - .removeClass('hidden'); - } - // apply fulltext search - var typedQuery = this.fulltextSearchField.val(); - $('div.item.filterhit').each(function () { - var $item = $(this); - if ($(':contains(' + typedQuery + ')', $item).length > 0 || $('input[value*="' + typedQuery + '"]', $item).length > 0) { - $item.removeClass('hidden').addClass('searchhit'); - } else { - $item.removeClass('searchhit').addClass('hidden'); - } - }); - - $('.searchhit').closest('.panel-collapse').collapse('show'); - - //check for empty panels - $('.panel-version').each(function () { - if ($(this).find('.searchhit', '.filterhit').length < 1) { - $(this).find(' > .panel-collapse').collapse('hide'); - } - }); - - - }, - - initialize: function () { - $('[data-toggle="tooltip"]').tooltip(); - this.chosenField = $('.t3js-chosen-select'); - this.fulltextSearchField = $('.t3js-fulltext-search'); - TYPO3.Install.upgradeAnalysis.provideTags(); - }, - - hideDoumentationFile: function () { - $(document).on('click', '.t3js-upgradeanalysis-ignore', function () { - var $button = $(this); - var filepath = $button.data('filepath'); - var token = $('#saveIgnoredItemsToken').html(); - $button - .toggleClass('t3js-upgradeanalysis-restore t3js-upgradeanalysis-ignore') - .find('i') - .toggleClass('fa-check fa-ban'); - $button - .closest('.panel') - .appendTo('.panel-body-read'); - var postData = { - 'install': { - 'ignoreFile': filepath, - 'token': token, - 'action': 'saveIgnoredItems' - } - }; - $.ajax({ - method: 'POST', - data: postData, - url: location.href + '&install[controller]=ajax' - }); - - return false; - }); - }, - - restoreDocumentationFile: function () { - $(document).on('click', '.t3js-upgradeanalysis-restore', function () { - var $button = $(this); - var filepath = $button.data('filepath'); - var version = $button.closest('.panel').data('item-version'); - var token = $('#removeIgnoredItemsToken').html(); - $button - .toggleClass('t3js-upgradeanalysis-restore t3js-upgradeanalysis-ignore') - .find('i') - .toggleClass('fa-check fa-ban'); - $button - .closest('.panel') - .appendTo('*[data-group-version="' + version + '"] .panel-body'); - var postData = { - 'install': { - 'ignoreFile': filepath, - 'token': token, - 'action': 'removeIgnoredItems' - } - }; - $.ajax({ - method: 'POST', - data: postData, - url: location.href + '&install[controller]=ajax' - }); - }); - }, - - trimExplodeAndUnique: function (delimiter, string) { - var result = []; - var items = string.split(delimiter); - for (var i = 0; i < items.length; i++) { - var item = items[i].trim(); - if (item.length > 0) { - if ($.inArray(item, result) === -1) { - result.push(item); - } - } - } - return result; - } -}; diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/Cache.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/Cache.js new file mode 100644 index 0000000000000000000000000000000000000000..eb071d9a8d22e7704adfcd8ebe612f47f45ede14 --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/Cache.js @@ -0,0 +1,61 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/Cache + */ +define(['jquery', 'TYPO3/CMS/Install/FlashMessage', 'TYPO3/CMS/Install/ProgressBar', 'TYPO3/CMS/Install/InfoBox', 'TYPO3/CMS/Install/Severity'], function($, FlashMessage, ProgressBar, InfoBox, Severity) { + 'use strict'; + + return { + selectorClearTrigger: '.t3js-clearAllCache-clear', + selectorOutputContainer: '.t3js-clearAllCache-output', + + initialize: function() { + var self = this; + $(document).on('click', this.selectorClearTrigger, function(e) { + e.preventDefault(); + self.clear(); + }); + }, + + clear: function() { + var url = location.href + '&install[controller]=ajax&install[action]=clearAllCache'; + if (location.hash) { + url = url.replace(location.hash, ""); + } + var $outputContainer = $(this.selectorOutputContainer); + var message = ProgressBar.render(Severity.loading, '', ''); + $outputContainer.empty().html(message); + $.ajax({ + url: url, + cache: false, + success: function(data) { + if (data.success === true && Array.isArray(data.status)) { + if (data.status.length > 0) { + $outputContainer.empty(); + data.status.forEach((function (element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $outputContainer.append(message); + })); + } + } + }, + error: function() { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + $outputContainer.empty().html(message); + } + }); + } + }; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/CardLayout.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/CardLayout.js new file mode 100644 index 0000000000000000000000000000000000000000..f1e703e424117599e0bcfed5157f02064ba8c9c7 --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/CardLayout.js @@ -0,0 +1,94 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/CardLayout + */ +define(['jquery', 'bootstrap'], function ($) { + 'use strict'; + + return { + initialize: function() { + // Card expand / collapse handling + $(document).on('click', '.gridder-list', function(e) { + e.preventDefault(); + var $element = $(this); + var $contentContainer = $element.next(); + if (!$element.hasClass('selectedItem')) { + // Find possible current open one and close it + $('.gridder-list').removeClass('selectedItem'); + $('.gridder-content.gridder-show').slideUp(function() { + $(this).removeClass('gridder-show'); + }); + // Open clicked one in parallel + $element.addClass('selectedItem'); + $contentContainer.addClass('gridder-show').slideDown(); + } else { + // Collapse this currently open grid + $contentContainer.slideUp(function() { + $contentContainer.removeClass('gridder-show'); + }); + $element.removeClass('selectedItem'); + } + }); + + // Close current and open previous card + $(document).on('click', '.gridder-nav-prev', function() { + var $currentOpenContent = $('.gridder-content.gridder-show'); + if ($currentOpenContent.length > 0) { + var $currentOpenCard = $currentOpenContent.prev(); + var $previousCardContent = $currentOpenCard.prev(); + var $previousCard = $previousCardContent.prev(); + if ($previousCard.length > 0) { + $currentOpenCard.removeClass('selectedItem'); + $currentOpenContent.slideUp(function() { + $(this).removeClass('gridder-show'); + }); + $previousCard.addClass('selectedItem'); + $previousCardContent.addClass('gridder-show').slideDown(); + } + } + }); + + // Close current and open next card + $(document).on('click', '.gridder-nav-next', function() { + var $currentOpenContent = $('.gridder-content.gridder-show'); + if ($currentOpenContent.length > 0) { + var $currentOpenCard = $currentOpenContent.prev(); + var $nextCard = $currentOpenContent.next(); + var $nextCardContent = $nextCard.next(); + if ($nextCardContent.length > 0) { + $currentOpenCard.removeClass('selectedItem'); + $currentOpenContent.slideUp(function() { + $(this).removeClass('gridder-show'); + }); + $nextCard.addClass('selectedItem'); + $nextCardContent.addClass('gridder-show').slideDown(); + } + } + }); + + // Close current open card + $(document).on('click', '.gridder-close', function() { + var $currentOpenContent = $('.gridder-content.gridder-show'); + if ($currentOpenContent.length > 0) { + var $currentOpenCard = $currentOpenContent.prev(); + $currentOpenCard.removeClass('selectedItem'); + $currentOpenContent.slideUp(function() { + $(this).removeClass('gridder-show'); + }); + } + }); + } + }; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/ChangeInstallToolPassword.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/ChangeInstallToolPassword.js new file mode 100644 index 0000000000000000000000000000000000000000..0f518e0deaa6f6f3b17de68d563410be339388a8 --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/ChangeInstallToolPassword.js @@ -0,0 +1,67 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/CreateAdmin + */ +define(['jquery', 'TYPO3/CMS/Install/FlashMessage', 'TYPO3/CMS/Install/ProgressBar', 'TYPO3/CMS/Install/InfoBox', 'TYPO3/CMS/Install/Severity'], function($, FlashMessage, ProgressBar, InfoBox, Severity) { + 'use strict'; + + return { + selectorChangeToken: '#t3js-changeInstallToolPassword-token', + selectorChangeTrigger: '.t3js-changeInstallToolPassword-change', + selectorOutputContainer: '.t3js-changeInstallToolPassword-output', + + initialize: function() { + var self = this; + $(document).on('click', this.selectorChangeTrigger, function(e) { + e.preventDefault(); + self.change(); + }); + }, + + change: function() { + var url = location.href + '&install[controller]=ajax'; + var postData = { + 'install': { + 'action': 'changeInstallToolPassword', + 'token': $(this.selectorChangeToken).text(), + 'password': $('.t3js-changeInstallToolPassword-password').val(), + 'passwordCheck': $('.t3js-changeInstallToolPassword-password-check').val() + } + }; + var $outputContainer = $(this.selectorOutputContainer); + var message = ProgressBar.render(Severity.loading, 'Loading...', ''); + $outputContainer.empty().html(message); + $.ajax({ + method: 'POST', + data: postData, + url: url, + cache: false, + success: function(data) { + $outputContainer.empty(); + if (data.success === true && Array.isArray(data.status)) { + data.status.forEach(function(element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $outputContainer.append(message); + }); + } + }, + error: function() { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + $outputContainer.empty().html(message); + } + }); + } + }; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/CheckForBrokenExtensions.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/CheckForBrokenExtensions.js new file mode 100644 index 0000000000000000000000000000000000000000..1f3427cd1de3483eca1fd3229e0bfb69fbe95daa --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/CheckForBrokenExtensions.js @@ -0,0 +1,219 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/ExtensionChecker + */ +define([ + 'jquery', + 'TYPO3/CMS/Install/FlashMessage', + 'TYPO3/CMS/Install/ProgressBar', + 'TYPO3/CMS/Install/InfoBox', + 'TYPO3/CMS/Install/Severity', + 'TYPO3/CMS/Install/Cache' +], function($, FlashMessage, ProgressBar, InfoBox, Severity, Cache) { + 'use strict'; + + return { + selectorMainContainer: '.gridder-show.t3js-checkForBrokenExtensions', + selectorCheckTrigger: '.t3js-checkForBrokenExtensions-check', + selectorUninstallTrigger: 't3js-checkForBrokenExtensions-uninstall', + selectorOutputContainer: '.t3js-checkForBrokenExtensions-output', + outputContainer: null, + + initialize: function() { + this.outputContainer = $(this.selectorOutputContainer); + + var self = this; + $(document).on('click', this.selectorCheckTrigger, function(e) { + e.preventDefault(); + var message = ProgressBar.render(Severity.loading, 'Loading...', ''); + self.outputContainer.empty().append(message); + self.checkExtensionsCompatibility(true); + }); + + $(document).on('click', '.' + self.selectorUninstallTrigger, function(e) { + self.uninstallExtension($(this).data('extension')); + e.preventDefault(); + return false; + }); + }, + + /** + * Call checkExtensionsCompatibility recursive on error + * so we can find all incompatible extensions + */ + handleCheckExtensionsError: function() { + this.checkExtensionsCompatibility(false); + }, + + /** + * Send an ajax request to uninstall an extension (or multiple extensions) + * + * @param extension string of extension(s) - may be comma separated + */ + uninstallExtension: function(extension) { + var self = this; + // @todo: Refactor to a POST request and adapt action + var url = location.href + '&install[controller]=ajax&install[action]=uninstallExtension' + + '&install[uninstallExtension][extensions]=' + extension; + $.ajax({ + url: url, + cache: false, + success: function(data) { + if (data.success) { + self.checkExtensionsCompatibility(true); + } else { + if (data === 'unauthorized') { + location.reload(); + } + // workaround for xdebug returning 200 OK on fatal errors + if (data.substring(data.length - 2) === 'OK') { + self.checkExtensionsCompatibility(true); + } else { + this.outputContainer.empty(); + self.showMessage( + Severity.error, + 'Something went wrong. Check failed.', + 'Message: ' + data + ); + } + } + }, + error: function(data) { + self.handleCheckExtensionsError(data); + } + }); + }, + + /** + * Handles result of extension compatibility check. + * Displays uninstall buttons for non-compatible extensions. + */ + handleCheckExtensionsSuccess: function() { + var self = this; + var $mainContainer = $(this.selectorMainContainer); + $.ajax({ + url: $mainContainer.find('.t3js-checkForBrokenExtensions-data').data('protocolurl'), + cache: false, + success: function(data) { + if (data) { + self.outputContainer.empty(); + self.showMessage( + Severity.error, + 'Incompatible extension found', + 'The following extensions are not compatible. Please uninstall them and try again. ' + ); + var extensions = data.split(','); + var $unloadButtonGroup = $('<div />', { + 'class': 'btn-group' + }); + for (var i = 0; i < extensions.length; i++) { + var extension = extensions[i]; + var unloadButton = $('<button />', { + text: 'Uninstall ' + $.trim(extension), + 'class': 'btn btn-default ' + self.selectorUninstallTrigger, + 'data-extension': $.trim(extension) + }); + $unloadButtonGroup.append(unloadButton); + } + var unloadAllButton = $('<button />', { + 'class': 'btn btn-default', + text: 'Uninstall all incompatible extensions: ' + data, + click: function(e) { + e.preventDefault(); + self.showMessage(Severity.info, 'Loading...', ''); + self.uninstallExtension(data); + return false; + } + }); + $unloadButtonGroup.append(unloadAllButton); + self.outputContainer.append($unloadButtonGroup); + self.outputContainer.append('<hr />'); + + $.getJSON( + $mainContainer.find('.t3js-checkForBrokenExtensions-data').data('errorprotocolurl'), + function(data) { + $.each(data, function(i, error) { + var messageToDisplay = error.message + ' in ' + error.file + ' on line ' + error.line; + self.showMessage(Severity.warning, error.type, messageToDisplay); + }); + } + ); + } else { + self.outputContainer.empty(); + self.showMessage(Severity.ok, 'All local extensions can be loaded!', ''); + } + }, + error: function() { + self.outputContainer.empty(); + self.showMessage(Severity.ok, 'All local extensions can be loaded!', ''); + } + }); + }, + + /** + * Checks extension compatibility by trying to load ext_tables and ext_localconf via ajax. + * + * @param force + */ + checkExtensionsCompatibility: function(force) { + var self = this; + var url = location.href + '&install[controller]=ajax&install[action]=extensionCompatibilityTester'; + if (force) { + Cache.clear(); + url += '&install[extensionCompatibilityTester][forceCheck]=1'; + } else { + url += '&install[extensionCompatibilityTester][forceCheck]=0'; + } + $.ajax({ + url: url, + cache: false, + success: function(data) { + if (data.success) { + self.handleCheckExtensionsSuccess(); + } else { + if (data === 'unauthorized') { + location.reload(); + } + // workaround for xdebug returning 200 OK on fatal errors + if (data.substring(data.length - 2) === 'OK') { + self.handleCheckExtensionsSuccess(); + } else { + self.handleCheckExtensionsError(); + } + } + }, + error: function() { + self.handleCheckExtensionsError(); + } + }); + }, + + /** + * Show message + * + * @param {Number} severity + * @param {String} title + * @param {String} description + */ + showMessage: function(severity, title, description) { + var markup = InfoBox.render( + severity, + title, + description + ); + this.outputContainer.append(markup); + } + }; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/ClearTable.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/ClearTable.js new file mode 100644 index 0000000000000000000000000000000000000000..eb99ecb8a437507167440972f312d7a73564fee8 --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/ClearTable.js @@ -0,0 +1,69 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/ClearTable + */ +define(['jquery', 'TYPO3/CMS/Install/FlashMessage', 'TYPO3/CMS/Install/ProgressBar', 'TYPO3/CMS/Install/InfoBox', 'TYPO3/CMS/Install/Severity'], function($, FlashMessage, ProgressBar, InfoBox, Severity) { + 'use strict'; + + return { + selectorClearToken: '#t3js-clearTable-token', + selectorClearTrigger: '.t3js-clearTable-clear', + selectorOutputContainer: '.t3js-clearTable-output', + + initialize: function() { + var self = this; + $(document).on('click', this.selectorClearTrigger, function(e) { + var table = $(e.target).data('table'); + e.preventDefault(); + self.clear(table); + }); + }, + + clear: function(table) { + var token = $(this.selectorClearToken).text(); + var url = location.href + '&install[controller]=ajax'; + var postData = { + 'install': { + 'action': 'clearTable', + 'token': token, + 'table': table + } + }; + var $container = $('.t3js-clearTable-container-' + table); + var $outputContainer = $container.find(this.selectorOutputContainer); + var message = ProgressBar.render(Severity.loading, 'Loading...', ''); + $outputContainer.empty().html(message); + $.ajax({ + method: 'POST', + data: postData, + url: url, + cache: false, + success: function(data) { + $outputContainer.empty(); + if (data.success === true && Array.isArray(data.status)) { + data.status.forEach(function(element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $outputContainer.html(message); + }); + } + }, + error: function () { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + $outputContainer.empty().html(message); + } + }); + } + }; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/ClearTypo3tempFiles.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/ClearTypo3tempFiles.js new file mode 100644 index 0000000000000000000000000000000000000000..a6ee77878088259ec8a49458de2df389412b30a0 --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/ClearTypo3tempFiles.js @@ -0,0 +1,68 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/ClearTypo3tempFiles + */ +define(['jquery', 'TYPO3/CMS/Install/FlashMessage', 'TYPO3/CMS/Install/ProgressBar', 'TYPO3/CMS/Install/InfoBox', 'TYPO3/CMS/Install/Severity'], function($, FlashMessage, ProgressBar, InfoBox, Severity) { + 'use strict'; + + return { + selectorDeleteToken: '#t3js-clearTypo3temp-delete-token', + selectorDeleteTrigger: '.t3js-clearTypo3temp-delete', + selectorOutputContainer: '.t3js-clearTypo3temp-output', + + initialize: function() { + var self = this; + $(document).on('click', this.selectorDeleteTrigger, function(e) { + var folder = $(e.target).data('folder'); + e.preventDefault(); + self.delete(folder); + }); + }, + + delete: function(folder) { + var url = location.href + '&install[controller]=ajax'; + var postData = { + 'install': { + 'action': 'clearTypo3tempFiles', + 'token': $(this.selectorDeleteToken).text(), + 'folder': folder + } + }; + var $container = $('.t3js-clearTypo3temp-container-' + folder); + var message = ProgressBar.render(Severity.loading, '', ''); + var $outputContainer = $container.find(this.selectorOutputContainer); + $outputContainer.empty().html(message); + $.ajax({ + method: 'POST', + data: postData, + url: url, + cache: false, + success: function (data) { + $outputContainer.empty(); + if (data.success === true && Array.isArray(data.status)) { + data.status.forEach(function (element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $outputContainer.html(message); + }); + } + }, + error: function () { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + $outputContainer.empty().html(message); + } + }); + } + }; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/CoreUpdate.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/CoreUpdate.js new file mode 100644 index 0000000000000000000000000000000000000000..bb852b99e78b9b7845509dd081e4268a3b0e9630 --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/CoreUpdate.js @@ -0,0 +1,258 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/CoreUpdate + */ +define(['jquery', 'TYPO3/CMS/Install/FlashMessage', 'TYPO3/CMS/Install/Severity'], function ($, FlashMessage, Severity) { + 'use strict'; + + return { + /** + * The action queue defines what actions are called in which order + */ + actionQueue: { + coreUpdateUpdateVersionMatrix: { + loadingMessage: 'Fetching list of released versions from typo3.org', + finishMessage: 'Fetched list of released versions', + nextActionName: 'coreUpdateIsUpdateAvailable' + }, + coreUpdateIsUpdateAvailable: { + loadingMessage: 'Checking for possible regular or security update', + finishMessage: undefined, + nextActionName: undefined + }, + coreUpdateCheckPreConditions: { + loadingMessage: 'Checking if update is possible', + finishMessage: 'System can be updated', + nextActionName: 'coreUpdateDownload' + }, + coreUpdateDownload: { + loadingMessage: 'Downloading new core', + finishMessage: undefined, + nextActionName: 'coreUpdateVerifyChecksum' + }, + coreUpdateVerifyChecksum: { + loadingMessage: 'Verifying checksum of downloaded core', + finishMessage: undefined, + nextActionName: 'coreUpdateUnpack' + }, + coreUpdateUnpack: { + loadingMessage: 'Unpacking core', + finishMessage: undefined, + nextActionName: 'coreUpdateMove' + }, + coreUpdateMove: { + loadingMessage: 'Moving core', + finishMessage: undefined, + nextActionName: 'clearAllCache' + }, + clearAllCache: { + loadingMessage: 'Clearing caches', + finishMessage: 'Caches cleared', + nextActionName: 'coreUpdateActivate' + }, + coreUpdateActivate: { + loadingMessage: 'Activating core', + finishMessage: 'Core updated - please reload your browser', + nextActionName: undefined + } + }, + + selectorOutput: '.t3js-coreUpdate-output', + selectorTemplate: '.t3js-coreUpdate-buttonTemplate', + + /** + * Clone of a DOM object acts as button template + */ + buttonTemplate: null, + + /** + * Fetching the templates out of the DOM + */ + initialize: function () { + var self = this; + var buttonTemplateSection = $(self.selectorTemplate); + this.buttonTemplate = buttonTemplateSection.children().clone(); + + $(document).on('click', '.t3js-coreUpdate-init', function (e) { + e.preventDefault(); + var action = $(e.target).data('action'); + $(document).find(self.selectorOutput).empty(); + self[action](); + }); + }, + + /** + * Public method checkForUpdate + */ + checkForUpdate: function () { + this.callAction('coreUpdateUpdateVersionMatrix'); + }, + + /** + * Public method updateDevelopment + */ + updateDevelopment: function () { + this.update('development'); + }, + + updateRegular: function () { + this.update('regular'); + }, + + /** + * Execute core update. + * + * @param type Either 'development' or 'regular' + */ + update: function (type) { + if (type !== "development") { + type = 'regular'; + } + this.callAction('coreUpdateCheckPreConditions', type); + }, + + /** + * Generic method to call actions from the queue + * + * @param actionName Name of the action to be called + * @param type Update type (optional) + */ + callAction: function (actionName, type) { + var self = this; + var data = { + install: { + controller: 'ajax', + action: actionName + } + }; + if (type !== undefined) { + data.install["type"] = type; + } + this.addLoadingMessage(this.actionQueue[actionName].loadingMessage); + $.ajax({ + url: location.href, + data: data, + cache: false, + success: function (result) { + var canContinue = self.handleResult(result, self.actionQueue[actionName].finishMessage); + if (canContinue === true && (self.actionQueue[actionName].nextActionName !== undefined)) { + self.callAction(self.actionQueue[actionName].nextActionName, type); + } + }, + error: function (result) { + self.handleResult(result); + } + }); + }, + + /** + * Handle ajax result of core update step. + * + * @param data + * @param successMessage Optional success message + */ + handleResult: function (data, successMessage) { + var canContinue = false; + this.removeLoadingMessage(); + if (data.success === true) { + canContinue = true; + if (data.status && typeof(data.status) === 'object') { + this.showStatusMessages(data.status); + } + if (data.action && typeof(data.action) === 'object') { + this.showActionButton(data.action); + } + if (successMessage) { + this.addMessage(Severity.ok, successMessage); + } + } + return canContinue; + }, + + /** + * Add a loading message with some text. + * + * @param messageTitle + */ + addLoadingMessage: function (messageTitle) { + var domMessage = FlashMessage.render(Severity.loading, messageTitle); + $(this.selectorOutput).append(domMessage); + }, + + /** + * Remove an enabled loading message + */ + removeLoadingMessage: function () { + $(this.selectorOutput).find('.alert-loading').remove(); + }, + + /** + * Show a list of status messages + * + * @param messages + */ + showStatusMessages: function (messages) { + var self = this; + $.each(messages, function (index, element) { + var title = false; + var message = false; + var severity = element.severity; + if (element.title) { + title = element.title; + } + if (element.message) { + message = element.message; + } + self.addMessage(severity, title, message); + }); + }, + + /** + * Show an action button + * + * @param button + */ + showActionButton: function (button) { + var title = false; + var action = false; + if (button.title) { + title = button.title; + } + if (button.action) { + action = button.action; + } + var domButton = this.buttonTemplate; + if (action) { + domButton.find('button').data('action', action); + } + if (title) { + domButton.find('button').html(title); + } + $(this.selectorOutput).append(domButton); + }, + + /** + * Show a status message + * + * @param severity + * @param title + * @param message + */ + addMessage: function (severity, title, message) { + var domMessage = FlashMessage.render(severity, title, message); + $(this.selectorOutput).append(domMessage); + } + }; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/CreateAdmin.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/CreateAdmin.js new file mode 100644 index 0000000000000000000000000000000000000000..849c49fbdfbe40fd7710667eab5cba5c4a731b9f --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/CreateAdmin.js @@ -0,0 +1,69 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/CreateAdmin + */ +define(['jquery', 'TYPO3/CMS/Install/FlashMessage', 'TYPO3/CMS/Install/ProgressBar', 'TYPO3/CMS/Install/InfoBox', 'TYPO3/CMS/Install/Severity'], function($, FlashMessage, ProgressBar, InfoBox, Severity) { + 'use strict'; + + return { + selectorCreateToken: '#t3js-createAdmin-token', + selectorCreateTrigger: '.t3js-createAdmin-create', + selectorOutputContainer: '.t3js-createAdmin-output', + + initialize: function() { + var self = this; + $(document).on('click', this.selectorCreateTrigger, function(e) { + e.preventDefault(); + self.create(); + }); + }, + + create: function() { + var token = $(this.selectorCreateToken).text(); + var url = location.href + '&install[controller]=ajax'; + var postData = { + 'install': { + 'action': 'createAdmin', + 'token': token, + 'userName': $('.t3js-createAdmin-user').val(), + 'userPassword': $('.t3js-createAdmin-password').val(), + 'userPasswordCheck': $('.t3js-createAdmin-password-check').val() + } + }; + var $outputContainer = $(this.selectorOutputContainer); + var message = ProgressBar.render(Severity.loading, 'Loading...', ''); + $outputContainer.empty().html(message); + $.ajax({ + method: 'POST', + data: postData, + url: url, + cache: false, + success: function(data) { + $outputContainer.empty(); + if (data.success === true && Array.isArray(data.status)) { + data.status.forEach(function(element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $outputContainer.html(message); + }); + } + }, + error: function () { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + $outputContainer.empty().html(message); + } + }); + } + }; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/DatabaseAnalyzer.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/DatabaseAnalyzer.js new file mode 100644 index 0000000000000000000000000000000000000000..9600c60ec195b50286b4115094440e2acc6f7c48 --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/DatabaseAnalyzer.js @@ -0,0 +1,162 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/DatabaseAnalyzer + */ +define(['jquery', 'TYPO3/CMS/Install/FlashMessage', 'TYPO3/CMS/Install/ProgressBar', 'TYPO3/CMS/Install/InfoBox', 'TYPO3/CMS/Install/Severity'], function($, FlashMessage, ProgressBar, InfoBox, Severity) { + 'use strict'; + + return { + selectorGridderOpener: '.t3js-databaseAnalyzer-open', + selectorAnalyzeTrigger: '.t3js-databaseAnalyzer-analyze', + selectorExecuteTrigger: '.t3js-databaseAnalyzer-execute', + selectorOutputContainer: '.t3js-databaseAnalyzer-output', + selectorSuggestionBlock: '.t3js-databaseAnalyzer-suggestion-block', + selectorSuggestionLine: '.t3js-databaseAnalyzer-suggestion-line', + + initialize: function() { + var self = this; + + // Load main content on first open + $(document).on('click', this.selectorGridderOpener, function(event) { + var $element = $(event.target).closest(self.selectorGridderOpener); + if (!$element.data('databaseAnalyzerInitialized')) { + $element.data('databaseAnalyzerInitialized', true); + self.analyze(); + } + }); + + // Select / deselect all checkboxes + $(document).on('click', '.t3js-databaseAnalyzer-suggestion-block-checkbox', function () { + $(this).closest('fieldset').find(':checkbox').prop('checked', this.checked); + }); + $(document).on('click', this.selectorAnalyzeTrigger, function(e) { + e.preventDefault(); + self.analyze(); + }); + $(document).on('click', this.selectorExecuteTrigger, function(e) { + e.preventDefault(); + self.execute(); + }); + }, + + analyze: function() { + $(this.selectorOutputContainer).empty(); + this.analyzeAjax(); + }, + + analyzeAjax: function() { + var self = this; + var url = location.href + '&install[controller]=ajax&install[action]=databaseAnalyzerAnalyze'; + var $outputContainer = $(this.selectorOutputContainer); + var blockTemplate = $(this.selectorSuggestionBlock).html(); + var lineTemplate = $(this.selectorSuggestionLine).html(); + var message = ProgressBar.render(Severity.loading, 'Loading...', ''); + $outputContainer.append(message); + $(this.selectorExecuteTrigger).hide(); + $.ajax({ + url: url, + cache: false, + success: function (data) { + if (data.success === true) { + if (Array.isArray(data.status)) { + data.status.forEach(function(element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $outputContainer.find('.alert-loading').remove(); + $outputContainer.append(message); + }); + } + if (Array.isArray(data.suggestions)) { + data.suggestions.forEach(function(element) { + var aBlock = $(blockTemplate).clone(); + var key = element.key; + aBlock.find('.t3js-databaseAnalyzer-suggestion-block-legend').text(element.label); + aBlock.find('.t3js-databaseAnalyzer-suggestion-block-checkbox').attr('id', 't3-install-' + key + '-checkbox'); + if (element.enabled) { + aBlock.find('.t3js-databaseAnalyzer-suggestion-block-checkbox').attr('checked', 'checked'); + } + aBlock.find('.t3js-databaseAnalyzer-suggestion-block-label').attr('for', 't3-install-' + key + '-checkbox'); + element.children.forEach(function(line) { + var aLine = $(lineTemplate).clone(); + var hash = line.hash; + aLine.find('.t3js-databaseAnalyzer-suggestion-line-checkbox').attr('id', 't3-install-db-' + hash); + aLine.find('.t3js-databaseAnalyzer-suggestion-line-checkbox').data('hash', hash); + if (element.enabled) { + aLine.find('.t3js-databaseAnalyzer-suggestion-line-checkbox').attr('checked', 'checked'); + } + aLine.find('.t3js-databaseAnalyzer-suggestion-line-label').attr('for', 't3-install-db-' + hash); + aLine.find('.t3js-databaseAnalyzer-suggestion-line-statement').html(line.statement); + if (line.current !== undefined) { + aLine.find('.t3js-databaseAnalyzer-suggestion-line-current-value').html(line.current); + aLine.find('.t3js-databaseAnalyzer-suggestion-line-current').show(); + } + if (line.rowCount !== undefined) { + aLine.find('.t3js-databaseAnalyzer-suggestion-line-count-value').html(line.rowCount); + aLine.find('.t3js-databaseAnalyzer-suggestion-line-count').show(); + } + aBlock.find('.t3js-databaseAnalyzer-suggestion-block-line').append(aLine); + }); + $outputContainer.append(aBlock); + }); + $(self.selectorExecuteTrigger).show(); + } + } + }, + error: function() { + var message = InfoBox.render(Severity.error, 'Something went wrong', ''); + $outputContainer.empty().html(message); + } + }); + }, + + execute: function() { + var self = this; + var url = location.href + '&install[controller]=ajax'; + var executeToken = $('#t3js-databaseAnalyzer-execute-token').text(); + var message = ProgressBar.render(Severity.loading, 'Loading...', ''); + var $outputContainer = $('.t3js-databaseAnalyzer-output'); + var selectedHashes = []; + $('.gridder-show .t3js-databaseAnalyzer-output .t3js-databaseAnalyzer-suggestion-block-line input:checked').each(function () { + selectedHashes.push($(this).data('hash')); + }); + $outputContainer.empty().html(message); + var postData = { + 'install': { + 'action': 'databaseAnalyzerExecute', + 'token': executeToken, + 'hashes': selectedHashes + } + }; + $outputContainer.empty().html(message); + $.ajax({ + method: 'POST', + data: postData, + url: url, + cache: false, + success: function(data) { + if (data.success === true) { + if (Array.isArray(data.status)) { + data.status.forEach(function(element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $outputContainer.find('.alert-loading').remove(); + $outputContainer.append(message); + }); + } + } + self.analyzeAjax(); + } + }); + } + }; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/DumpAutoload.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/DumpAutoload.js new file mode 100644 index 0000000000000000000000000000000000000000..e219c30eb9e16c15076e2856674bce9168e5043a --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/DumpAutoload.js @@ -0,0 +1,61 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/DumpAutoload + */ +define(['jquery', 'TYPO3/CMS/Install/FlashMessage', 'TYPO3/CMS/Install/ProgressBar', 'TYPO3/CMS/Install/InfoBox', 'TYPO3/CMS/Install/Severity'], function($, FlashMessage, ProgressBar, InfoBox, Severity) { + 'use strict'; + + return { + selectorDumpTrigger: '.t3js-dumpAutoload-dump', + selectorOutputContainer: '.t3js-dumpAutoload-output', + + initialize: function() { + var self = this; + $(document).on('click', this.selectorDumpTrigger, function(e) { + e.preventDefault(); + self.dump(); + }); + }, + + dump: function() { + var url = location.href + '&install[controller]=ajax&install[action]=dumpAutoload'; + if (location.hash) { + url = url.replace(location.hash, ""); + } + var $outputContainer = $(this.selectorOutputContainer); + var message = ProgressBar.render(Severity.loading, 'Loading...', ''); + $outputContainer.empty().html(message); + $.ajax({ + url: url, + cache: false, + success: function(data) { + if (data.success === true && Array.isArray(data.status)) { + if (data.status.length > 0) { + $outputContainer.empty(); + data.status.forEach((function(element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $outputContainer.append(message); + })); + } + } + }, + error: function() { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + $outputContainer.empty().html(message); + } + }); + } + }; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/EnvironmentCheck.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/EnvironmentCheck.js new file mode 100644 index 0000000000000000000000000000000000000000..4f0a8aeb83241caa37bda392070944fe5c20bdb8 --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/EnvironmentCheck.js @@ -0,0 +1,91 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/EnvironmentCheck + */ +define([ + 'jquery', + 'TYPO3/CMS/Install/FlashMessage', + 'TYPO3/CMS/Install/ProgressBar', + 'TYPO3/CMS/Install/InfoBox', + 'TYPO3/CMS/Install/Severity', + 'bootstrap' +], function($, FlashMessage, ProgressBar, InfoBox, Severity) { + 'use strict'; + + return { + selectorGridderBadge: '.t3js-environmentCheck-badge', + selectorExecuteTrigger: '.t3js-environmentCheck-execute', + selectorOutputContainer: '.t3js-environmentCheck-output', + + initialize: function() { + var self = this; + + // Get status on initialize to have the badge and content ready + self.runTests(); + + $(document).on('click', this.selectorExecuteTrigger, function(e) { + e.preventDefault(); + self.runTests(); + }); + }, + + runTests: function() { + var self = this; + var url = location.href + '&install[controller]=ajax&install[action]=environmentCheckGetStatus'; + if (location.hash) { + url = url.replace(location.hash, ""); + } + var $outputContainer = $(this.selectorOutputContainer); + var $errorBadge = $(this.selectorGridderBadge); + $errorBadge.text('').hide(); + var message = ProgressBar.render(Severity.loading, 'Loading...', ''); + $outputContainer.empty().append(message); + $.ajax({ + url: url, + cache: false, + success: function(data) { + $outputContainer.empty(); + var warningCount = 0; + var errorCount = 0; + if (data.success === true && typeof(data.status) === 'object') { + $.each(data.status, function(i, element) { + if (Array.isArray(element) && element.length > 0) { + element.forEach(function(aStatus) { + if (aStatus.severity === 1) { + warningCount += 1; + } + if (aStatus.severity === 2) { + errorCount += 1; + } + var message = InfoBox.render(aStatus.severity, aStatus.title, aStatus.message); + $outputContainer.append(message); + }); + } + }); + if (errorCount > 0) { + $errorBadge.removeClass('label-warning').addClass('label-danger').text(errorCount).show(); + } else if (warningCount > 0) { + $errorBadge.removeClass('label-error').addClass('label-warning').text(warningCount).show(); + } + } + }, + error: function() { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + $outputContainer.empty().append(message); + } + }); + } + }; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/ExtensionScanner.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/ExtensionScanner.js new file mode 100644 index 0000000000000000000000000000000000000000..4f6c59167ebd18e94ef81c768dd7065528ab0c96 --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/ExtensionScanner.js @@ -0,0 +1,305 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/ExtensionScanner + */ +define(['jquery', 'TYPO3/CMS/Install/FlashMessage', 'TYPO3/CMS/Install/Severity'], function($, FlashMessage, Severity) { + 'use strict'; + + return { + listOfAffectedRestFileHashes: [], + selectorExtensionContainer: '.gridder-show .t3js-extensionScanner-extension', + selectorNumberOfFiles: '.gridder-show .t3js-extensionScanner-number-of-files', + selectorScanSingleTrigger: '.gridder-show .t3js-extensionScanner-scan-single', + + initialize: function() { + var self = this; + $(document).on('click', this.selectorScanSingleTrigger, function(e) { + // Scan a single extension + var extension = $(e.target).data('extension'); + e.preventDefault(); + self.scanSingleExtension(extension); + return false; + }); + $(document).on('show.bs.collapse', this.selectorExtensionContainer, function(e) { + // Trigger extension scan on opening a extension collapsible + if ($(e.target).closest('').data('hasRun') !== 'true') { + $(this).find(self.selectorScanSingleTrigger).click(); + } + }); + $(document).on('click', '.t3js-extensionScanner-scan-all', function(e) { + // Scann all button + e.preventDefault(); + var $extensions = $(self.selectorExtensionContainer); + self.scanAll($extensions); + return false; + }); + }, + + /** + * @param {string} extension + * @returns {string} + */ + getExtensionSelector: function(extension) { + return this.selectorExtensionContainer + '-' + extension; + }, + + /** + * @param {JQuery} $extensions + */ + scanAll: function($extensions) { + var self = this; + $(this.selectorExtensionContainer) + .removeClass('panel-danger panel-warning panel-success') + .find('.panel-progress-bar') + .css('width', 0) + .attr('aria-valuenow', 0) + .find('span') + .text('0%'); + self.setProgressForAll(); + $extensions.each(function() { + var extension = $(this).data('extension'); + self.scanSingleExtension(extension); + }); + }, + + /** + * @param {string} extension + * @param {number} doneFiles + * @param {number} numberOfFiles + */ + setStatusMessageForScan: function(extension, doneFiles, numberOfFiles) { + $(this.getExtensionSelector(extension)) + .find(this.selectorNumberOfFiles) + .text('Checked ' + doneFiles + ' of ' + numberOfFiles + ' files'); + }, + + /** + * @param {string} extension + * @param {number} doneFiles + * @param {number} numberOfFiles + */ + setProgressForScan: function(extension, doneFiles, numberOfFiles) { + var percent = (doneFiles / numberOfFiles) * 100; + $(this.getExtensionSelector(extension)) + .find('.panel-progress-bar') + .css('width', percent + '%') + .attr('aria-valuenow', percent) + .find('span') + .text(percent + '%'); + }, + + /** + * Update main progress bar + */ + setProgressForAll: function() { + var self = this; + var numberOfExtensions = $(this.selectorExtensionContainer).length; + var numberOfSuccess = $(this.selectorExtensionContainer + '.t3js-extensionscan-finished.panel-success').length; + var numberOfWarning = $(this.selectorExtensionContainer + '.t3js-extensionscan-finished.panel-warning').length; + var numberOfError = $(this.selectorExtensionContainer + '.t3js-extensionscan-finished.panel-danger').length; + var numberOfScannedExtensions = numberOfSuccess + numberOfWarning + numberOfError; + var percent = (numberOfScannedExtensions / numberOfExtensions) * 100; + var markFullyScannedFilesToken = $('#t3js-extensionScanner-mark-fully-scanned-rest-files-token').text(); + var url = location.href + '&install[controller]=ajax'; + $('.t3js-extensionScanner-progress-all-extension .progress-bar') + .css('width', percent + '%') + .attr('aria-valuenow', percent) + .find('span') + .text(numberOfScannedExtensions + ' of ' + numberOfExtensions + ' scanned'); + if (numberOfScannedExtensions === numberOfExtensions) { + top.TYPO3.Notification.success('Scan finished', 'All extensions has been scanned'); + var postData = { + 'install': { + 'action': 'extensionScannerMarkFullyScannedRestFiles', + 'token': markFullyScannedFilesToken, + 'hashes': self.uniqueArray(this.listOfAffectedRestFileHashes) + } + }; + $.ajax({ + method: 'POST', + data: postData, + url: url, + cache: false, + success: function(data) { + if (data.success === true) { + top.TYPO3.Notification.success('Marked not affected files', 'Marked ' + data.markedAsNotAffected + ' ReST files as not affected.'); + } + } + }); + } + }, + + /** + * Helper method removing duplicate entries from an array + * + * @param {Array} anArray + * @returns {Array} + */ + uniqueArray: function(anArray) { + return anArray.filter(function(value, index, self) { + return self.indexOf(value) === index; + }); + }, + + /** + * Handle a single extension scan + * + * @param {string} extension + */ + scanSingleExtension: function(extension) { + var self = this; + var $extensionContainer = $(this.getExtensionSelector(extension)); + var filesToken = $('#t3js-extensionScanner-files-token').text(); + var hitTemplate = $('#t3js-extensionScanner-file-hit-template').html(); + var restTemplate = $('#t3js-extensionScanner-file-hit-rest-template').html(); + var scanFileToken = $('#t3js-extensionScanner-scan-file-token').text(); + var hitFound = false; + var url = location.href + '&install[controller]=ajax'; + var postData = { + 'install': { + 'action': 'extensionScannerFiles', + 'token': filesToken, + 'extension': extension + } + }; + $extensionContainer.removeClass('panel-danger panel-warning panel-success t3js-extensionscan-finished'); + $extensionContainer.data('hasRun', 'true'); + $extensionContainer.find('.t3js-extensionScanner-scan-single').text('Scanning...').attr('disabled', 'disabled'); + $extensionContainer.find('.t3js-extensionScanner-extension-body-loc').empty().text('0'); + $extensionContainer.find('.t3js-extensionScanner-extension-body-ignored-files').empty().text('0'); + $extensionContainer.find('.t3js-extensionScanner-extension-body-ignored-lines').empty().text('0'); + this.setProgressForAll(); + $.ajax({ + method: 'POST', + data: postData, + url: url, + cache: false, + success: function(data) { + if (data.success === true && Array.isArray(data.files)) { + var numberOfFiles = data.files.length; + if (numberOfFiles > 0) { + self.setStatusMessageForScan(extension, 0, numberOfFiles); + $extensionContainer.find('.t3js-extensionScanner-extension-body').text(''); + var doneFiles = 0; + data.files.forEach(function(file) { + var postData = { + 'install': { + 'action': 'extensionScannerScanFile', + 'token': scanFileToken, + 'extension': extension, + 'file': file + } + }; + $.ajax({ + method: 'POST', + data: postData, + url: url, + cache: false, + success: function(fileData) { + doneFiles = doneFiles + 1; + self.setStatusMessageForScan(extension, doneFiles, numberOfFiles); + self.setProgressForScan(extension, doneFiles, numberOfFiles); + if (fileData.success && $.isArray(fileData.matches)) { + $(fileData.matches).each(function() { + hitFound = true; + var match = this; + var aMatch = $(hitTemplate).clone(); + aMatch.find('.t3js-extensionScanner-hit-file-panel-head').attr('href', '#collapse' + match.uniqueId); + aMatch.find('.t3js-extensionScanner-hit-file-panel-body').attr('id', 'collapse' + match.uniqueId); + aMatch.find('.t3js-extensionScanner-hit-filename').html(file); + aMatch.find('.t3js-extensionScanner-hit-message').html(match.message); + if (match.indicator === 'strong') { + aMatch.find('.t3js-extensionScanner-hit-file-panel-head .badges') + .append('<span class="badge" title="Reliable match, false positive unlikely">strong</span>'); + } else { + aMatch.find('.t3js-extensionScanner-hit-file-panel-head .badges') + .append('<span class="badge" title="Probable match, but can be a false positive">weak</span>'); + } + if (match.silenced === true) { + aMatch.find('.t3js-extensionScanner-hit-file-panel-head .badges') + .append('<span class="badge" title="Match has been annotated by extension author as false positive match">silenced</span>'); + } + aMatch.find('.t3js-extensionScanner-hit-file-lineContent').empty().text(match.lineContent); + aMatch.find('.t3js-extensionScanner-hit-file-line').empty().text(match.line + ': '); + if ($.isArray(match.restFiles)) { + $(match.restFiles).each(function() { + var restFile = this; + var aRest = $(restTemplate).clone(); + aRest.find('.t3js-extensionScanner-hit-rest-panel-head').attr('href', '#collapse' + restFile.uniqueId); + aRest.find('.t3js-extensionScanner-hit-rest-panel-head .badge').empty().text(restFile.version); + aRest.find('.t3js-extensionScanner-hit-rest-panel-body').attr('id', 'collapse' + restFile.uniqueId); + aRest.find('.t3js-extensionScanner-hit-rest-headline').html(restFile.headline); + aRest.find('.t3js-extensionScanner-hit-rest-body').html(restFile.content); + aRest.addClass('panel-' + restFile.class); + aMatch.find('.t3js-extensionScanner-hit-file-rest-container').append(aRest); + self.listOfAffectedRestFileHashes.push(restFile.file_hash); + }); + } + var panelClass = + aMatch.find('.panel-breaking', '.t3js-extensionScanner-hit-file-rest-container').length > 0 + ? 'panel-danger' + : 'panel-warning'; + aMatch.addClass(panelClass); + $extensionContainer.find('.t3js-extensionScanner-extension-body').removeClass('hide').append(aMatch); + if (panelClass === 'panel-danger') { + $extensionContainer.removeClass('panel-warning').addClass(panelClass); + } + if (panelClass === 'panel-warning' && !$extensionContainer.hasClass('panel-danger')) { + $extensionContainer.addClass(panelClass); + } + }); + } + if (fileData.success) { + var currentLinesOfCode = parseInt($extensionContainer.find('.t3js-extensionScanner-extension-body-loc').text()); + $extensionContainer.find('.t3js-extensionScanner-extension-body-loc').empty().text(currentLinesOfCode + parseInt(fileData.effectiveCodeLines)); + if (fileData.isFileIgnored) { + var currentIgnoredFiles = parseInt($extensionContainer.find('.t3js-extensionScanner-extension-body-ignored-files').text()); + $extensionContainer.find('.t3js-extensionScanner-extension-body-ignored-files').empty().text(currentIgnoredFiles + 1); + } + var currentIgnoredLines = parseInt($extensionContainer.find('.t3js-extensionScanner-extension-body-ignored-lines').text()); + $extensionContainer.find('.t3js-extensionScanner-extension-body-ignored-lines').empty().text(currentIgnoredLines + parseInt(fileData.ignoredLines)); + } + if (doneFiles === numberOfFiles) { + if (!hitFound) { + $extensionContainer.addClass('panel-success'); + } + $extensionContainer.addClass('t3js-extensionscan-finished'); + self.setProgressForAll(); + $extensionContainer.find('.t3js-extensionScanner-scan-single').text('Rescan').attr('disabled', null); + } + }, + error: function(data) { + doneFiles = doneFiles + 1; + self.setStatusMessageForScan(extension, doneFiles, numberOfFiles); + self.setProgressForScan(extension, doneFiles, numberOfFiles); + self.setProgressForAll(); + top.TYPO3.Notification.error('Oops, an error occurred', 'please look the console output for details'); + console.error(data); + } + }); + }); + } else { + top.TYPO3.Notification.warning('No files found', 'the extension EXT:' + extension + ' contains no files we can scan'); + } + } + }, + error: function(data) { + top.TYPO3.Notification.error('Oops, an error occurred', 'please look the console output for details'); + console.error(data); + } + }); + } + }; +}); \ No newline at end of file diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/FlashMessage.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/FlashMessage.js new file mode 100644 index 0000000000000000000000000000000000000000..333ec335ce4af4f9f0419747a6fa92a265c80c7d --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/FlashMessage.js @@ -0,0 +1,49 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/FlashMessage + */ +define(['jquery', 'TYPO3/CMS/Install/Severity'], function ($, Severity) { + 'use strict'; + + /** + * @type {{template: (*)}} + */ + var FlashMessage = { + template: $('<div class="t3js-message typo3-message alert"><h4></h4><p class="messageText"></p></div>') + }; + + /** + * render a FlashMessage + * @param {Number} severity + * @param {String} title + * @param {String} message + * @returns {jQuery} + */ + FlashMessage.render = function (severity, title, message) { + var flashMessage = this.template.clone(); + flashMessage.addClass('alert-' + Severity.getCssClass(severity)); + if (title) { + flashMessage.find('h4').html(title); + } + if (message) { + flashMessage.find('.messageText').html(message); + } else { + flashMessage.find('.messageText').remove(); + } + return flashMessage; + }; + + return FlashMessage; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/FolderStructure.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/FolderStructure.js new file mode 100644 index 0000000000000000000000000000000000000000..771d7742a2d9ce8c74bf492e574f8f8ff3e2aa17 --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/FolderStructure.js @@ -0,0 +1,141 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/FolderStructure + */ +define(['jquery', + 'TYPO3/CMS/Install/FlashMessage', + 'TYPO3/CMS/Install/ProgressBar', + 'TYPO3/CMS/Install/InfoBox', + 'TYPO3/CMS/Install/Severity', + 'bootstrap' +], function($, FlashMessage, ProgressBar, InfoBox, Severity) { + 'use strict'; + + return { + selectorGridderBadge: '.t3js-folderStructure-badge', + selectorFixTrigger: '.t3js-folderStructure-errors-fix', + selectorOutputContainer: '.t3js-folderStructure-output', + selectorErrorContainer: '.t3js-folderStructure-errors', + selectorErrorList: '.t3js-folderStructure-errors-list', + selectorErrorFixTrigger: '.t3js-folderStructure-errors-fix', + selectorOkContainer: '.t3js-folderStructure-ok', + selectorOkList: '.t3js-folderStructure-ok-list', + + initialize: function() { + var self = this; + + // Get status on initialize to have the badge and content ready + self.getStatus(); + + $(document).on('click', this.selectorErrorFixTrigger, function(e) { + e.preventDefault(); + self.fix(); + }); + }, + + getStatus: function() { + var self = this; + var url = location.href + '&install[controller]=ajax&install[action]=folderStructureGetStatus'; + if (location.hash) { + url = url.replace(location.hash, ""); + } + var $outputContainer = $(this.selectorOutputContainer); + var $errorContainer = $(this.selectorErrorContainer); + var $errorBadge = $(this.selectorGridderBadge); + $errorBadge.text('').hide(); + var $errorList = $(this.selectorErrorList); + var $okContainer = $(this.selectorOkContainer); + var $okList = $(this.selectorOkList); + var message = ProgressBar.render(Severity.loading, 'Loading...', ''); + $outputContainer.append(message); + $.ajax({ + url: url, + cache: false, + success: function(data) { + self.removeLoadingMessage($outputContainer); + if (data.success === true && Array.isArray(data.errorStatus)) { + var errorCount = 0; + if (data.errorStatus.length > 0) { + $errorContainer.show(); + $errorList.empty(); + data.errorStatus.forEach((function(element) { + errorCount += 1; + $errorBadge.text(errorCount).show(); + var message = InfoBox.render(element.severity, element.title, element.message); + $errorList.append(message); + })); + } else { + $errorContainer.hide(); + } + } + if (data.success === true && Array.isArray(data.okStatus)) { + if (data.okStatus.length > 0) { + $okContainer.show(); + $okList.empty(); + data.okStatus.forEach((function(element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $okList.append(message); + })); + } else { + $okList.hide(); + } + } + }, + error: function() { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + $outputContainer.append(message); + } + }); + }, + + fix: function() { + var self = this; + var url = location.href + '&install[controller]=ajax&install[action]=folderStructureFix'; + if (location.hash) { + url = url.replace(location.hash, ""); + } + var $outputContainer = $(this.selectorOutputContainer); + var message = ProgressBar.render(Severity.loading, 'Loading...', ''); + $outputContainer.empty().html(message); + $.ajax({ + url: url, + cache: false, + success: function(data) { + self.removeLoadingMessage($outputContainer); + if (data.success === true && Array.isArray(data.fixedStatus)) { + if (data.fixedStatus.length > 0) { + data.fixedStatus.forEach(function(element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $outputContainer.append(message); + }); + } else { + var message = InfoBox.render(Severity.warning, 'Nothing fixed', ''); + $outputContainer.append(message); + } + self.getStatus(); + } + }, + error: function() { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + $outputContainer.empty().html(message); + } + }); + }, + + removeLoadingMessage: function($container) { + $container.find('.alert-loading').remove(); + } + }; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/ImageProcessing.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/ImageProcessing.js new file mode 100644 index 0000000000000000000000000000000000000000..ce212324e18b6616fe7df29f34c581cb781a9bdd --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/ImageProcessing.js @@ -0,0 +1,112 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/ImageProcessing + */ +define(['jquery', + 'TYPO3/CMS/Install/FlashMessage', + 'TYPO3/CMS/Install/ProgressBar', + 'TYPO3/CMS/Install/InfoBox', + 'TYPO3/CMS/Install/Severity', + 'bootstrap' +], function($, FlashMessage, ProgressBar, InfoBox, Severity) { + 'use strict'; + + return { + selectorGridderOpener: '.t3js-imageProcessing-open', + selectorImageProcessingToken: '#t3js-imageProcessing-token', + selectorExecuteTrigger: '.t3js-imageProcessing-execute', + selectorTestContainer: '.t3js-imageProcessing-twinContainer', + selectorTwinImageTemplate: '.t3js-imageProcessing-twinImage-template', + selectorCommandContainer: '.t3js-imageProcessing-command', + selectorCommandText: '.t3js-imageProcessing-command-text', + selectorTwinImages: '.t3js-imageProcessing-images', + + initialize: function() { + var self = this; + + // Run tests on first open + $(document).on('click', this.selectorGridderOpener, function(event) { + var $element = $(event.target).closest(self.selectorGridderOpener); + if (!$element.data('isInitialized')) { + $element.data('isInitialized', true); + self.runTests(); + } + }); + + $(document).on('click', this.selectorExecuteTrigger, function(e) { + e.preventDefault(); + self.runTests(); + }); + }, + + runTests: function() { + var self = this; + var $twinImageTemplate = $(this.selectorTwinImageTemplate); + $(this.selectorTestContainer).each(function() { + var $container = $(this); + var testType = $container.data('test'); + var message = InfoBox.render(Severity.loading, 'Loading...', ''); + $container.empty().html(message); + var postData = { + 'install': { + 'action': 'imageProcessing', + 'token': $(self.selectorImageProcessingToken).text(), + 'testType': testType + } + }; + $.ajax({ + method: 'POST', + data: postData, + url: location.href + '&install[controller]=ajax', + cache: false, + success: function(data) { + if (data.success === true) { + $container.empty(); + if (Array.isArray(data.status)) { + data.status.forEach(function(element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $container.append(message); + }); + } + var $aTwin = $twinImageTemplate.clone(); + $aTwin.removeClass('t3js-imageProcessing-twinImage-template'); + if (data.fileExists === true) { + $aTwin.find('img.reference').attr('src', data.referenceFile); + $aTwin.find('img.result').attr('src', data.outputFile); + $aTwin.find(self.selectorTwinImages).show(); + } + if (Array.isArray(data.command) && data.command.length > 0) { + $aTwin.find(self.selectorCommandContainer).show(); + var commandText = []; + data.command.forEach(function(element) { + commandText.push('<strong>Command:</strong>\n' + element[1]); + if (element.length === 3) { + commandText.push('<strong>Result:</strong>\n' + element[2]); + } + }); + $aTwin.find(self.selectorCommandText).html(commandText.join('\n')); + } + $container.append($aTwin); + } + }, + error: function() { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + $container.empty().html(message); + } + }); + }); + } + }; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/InfoBox.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/InfoBox.js new file mode 100644 index 0000000000000000000000000000000000000000..30d4562e5fed19fe29a5147e030e32ebac9794cb --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/InfoBox.js @@ -0,0 +1,49 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/InfoBox + */ +define(['jquery', 'TYPO3/CMS/Install/Severity'], function ($, Severity) { + 'use strict'; + + /** + * @type {{template: (*)}} + */ + var InfoBox = { + template: $('<div class="t3js-infobox callout callout-sm"><h4 class="callout-title"></h4><div class="callout-body"></div></div>') + }; + + /** + * render a InfoBox + * @param {Number} severity + * @param {String} title + * @param {String} message + * @returns {jQuery} + */ + InfoBox.render = function (severity, title, message) { + var infoBox = this.template.clone(); + infoBox.addClass('callout-' + Severity.getCssClass(severity)); + if (title) { + infoBox.find('h4').html(title); + } + if (message) { + infoBox.find('.callout-body').html(message); + } else { + infoBox.find('.callout-body').remove(); + } + return infoBox; + }; + + return InfoBox; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/LocalConfiguration.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/LocalConfiguration.js new file mode 100644 index 0000000000000000000000000000000000000000..8426368ac083a32c8ac474d97b97ac75c9665b2e --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/LocalConfiguration.js @@ -0,0 +1,174 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/LocalConfiguration + */ +define(['jquery', 'TYPO3/CMS/Install/FlashMessage', 'TYPO3/CMS/Install/ProgressBar', 'TYPO3/CMS/Install/InfoBox', 'TYPO3/CMS/Install/Severity', 'bootstrap'], function($, FlashMessage, ProgressBar, InfoBox, Severity) { + 'use strict'; + + return { + selectorToggleAllTrigger: '.gridder-show .t3js-localConfiguration-toggleAll', + selectorWriteTrigger: '.t3js-localConfiguration-write', + selectorSearchTrigger: '.t3js-localConfiguration-search', + selectorWriteToken: '#t3js-localConfiguration-write-token', + selectorOutputContainer: '.t3js-localConfiguration-output', + + initialize: function() { + var self = this; + + $(document).on('click', this.selectorWriteTrigger, function() { + self.write(); + }); + + // Expand / collapse "Toggle all" button + $(document).on('click', this.selectorToggleAllTrigger, function() { + var $panels = $('.panel-collapse', '.gridder-show .t3js-localConfiguration'); + var action = ($panels.eq(0).hasClass('in')) ? 'hide' : 'show'; + $panels.collapse(action); + }); + + // Make jquerys "contains" work case-insensitive + jQuery.expr[':'].contains = jQuery.expr.createPseudo(function(arg) { + return function (elem) { + return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0; + }; + }); + + // Focus search field on certain user interactions + $(document).on('keydown', function(e) { + var $searchInput = $(self.selectorSearchTrigger); + if (e.ctrlKey || e.metaKey) { + // Focus search field on ctrl-f + switch (String.fromCharCode(e.which).toLowerCase()) { + case 'f': + e.preventDefault(); + $searchInput.focus(); + break; + } + } else if (e.keyCode === 27) { + // Clear search on ESC key + e.preventDefault(); + $searchInput.val('').focus(); + } + }); + + // Perform expand collapse on search matches + $(document).on('keyup', this.selectorSearchTrigger, function() { + var typedQuery = $(this).val(); + var $searchInput = $(self.selectorSearchTrigger); + $('div.item').each(function() { + var $item = $(this); + if ($(':contains(' + typedQuery + ')', $item).length > 0 || $('input[value*="' + typedQuery + '"]', $item).length > 0) { + $item.removeClass('hidden').addClass('searchhit'); + } else { + $item.removeClass('searchhit').addClass('hidden'); + } + }); + $('.searchhit').parent().collapse('show'); + self.handleButtonScrolling(); + // Make search field clearable + require(['jquery.clearable'], function() { + var searchResultShown = ('' !== $searchInput.first().val()); + $searchInput.clearable().focus(); + }); + }); + + // Trigger fixed button calculation on collapse / expand + $(document).on('shown.bs.collapse', '.gridder-show .collapse', function() { + self.handleButtonScrolling(); + }); + $(document).on('hidden.bs.collapse', '.gridder-show .collapse', function() { + self.handleButtonScrolling(); + }); + }, + + write: function() { + var url = location.href + '&install[controller]=ajax'; + var configurationValues = {}; + $('.gridder-show .t3js-localConfiguration-pathValue').each(function(i, element) { + var $element = $(element); + if ($element.attr('type') === 'checkbox') { + if (element.checked) { + configurationValues[$element.data('path')] = '1'; + } else { + configurationValues[$element.data('path')] = '0'; + } + } else { + configurationValues[$element.data('path')] = $element.val(); + } + }); + var postData = { + 'install': { + 'action': 'localConfigurationWrite', + 'token': $(this.selectorWriteToken).text(), + 'configurationValues': configurationValues + } + }; + var $outputContainer = $(this.selectorOutputContainer); + var message = ProgressBar.render(Severity.loading, 'Loading...', ''); + $outputContainer.empty().html(message); + $.ajax({ + method: 'POST', + data: postData, + url: url, + cache: false, + success: function(data) { + $outputContainer.empty(); + if (data.success === true && Array.isArray(data.status)) { + data.status.forEach(function(element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $outputContainer.append(message); + }); + } + }, + error: function() { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + $outputContainer.empty().html(message); + } + }); + }, + + /** + * Fix or unfix the "Write configuration" / "Toggle all" buttons at browser window + * bottom if a scrollbar is shown + */ + handleButtonScrolling: function() { + var $fixedFooterHandler = $('#fixed-footer-handler'); + var $fixedFooter = $('#fixed-footer'); + if (!this.isScrolledIntoView($fixedFooterHandler)) { + $fixedFooter.addClass('fixed'); + $fixedFooter.width($('.t3js-localConfiguration .panel-group').width()); + } else { + $fixedFooter.removeClass('fixed'); + } + }, + + /** + * Helper of handleButtonScrolling() + * See if an element is within current viewport. + * + * @param element + * @returns {boolean} + */ + isScrolledIntoView: function(element) { + var $window = $(window); + var docViewTop = $window.scrollTop(); + var docViewBottom = docViewTop + $window.height(); + var $elem = $(element); + var elemTop = $elem.offset().top; + var elemBottom = elemTop + $elem.height(); + return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop)); + } + }; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/MailTest.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/MailTest.js new file mode 100644 index 0000000000000000000000000000000000000000..3dba7c912f9910d66a7ee097fe1aa3405e48bd80 --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/MailTest.js @@ -0,0 +1,73 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/CreateAdmin + */ +define(['jquery', + 'TYPO3/CMS/Install/FlashMessage', + 'TYPO3/CMS/Install/ProgressBar', + 'TYPO3/CMS/Install/InfoBox', + 'TYPO3/CMS/Install/Severity', + 'bootstrap' +], function($, FlashMessage, ProgressBar, InfoBox, Severity) { + 'use strict'; + + return { + selectorSendToken: '#t3js-mailTest-token', + selectorSendTrigger: '.t3js-mailTest-send', + selectorEmail: '.t3js-mailTest-email', + selectorOutputContainer: '.t3js-mailTest-output', + + initialize: function() { + var self = this; + $(document).on('click', this.selectorSendTrigger, function(e) { + e.preventDefault(); + self.send(); + }); + }, + + send: function() { + var url = location.href + '&install[controller]=ajax'; + var postData = { + 'install': { + 'action': 'mailTest', + 'token': $(this.selectorSendToken).text(), + 'email': $('.t3js-mailTest-email').val() + } + }; + var $outputContainer = $(this.selectorOutputContainer); + var message = ProgressBar.render(Severity.loading, 'Loading...', ''); + $outputContainer.empty().html(message); + $.ajax({ + method: 'POST', + data: postData, + url: url, + cache: false, + success: function(data) { + $outputContainer.empty(); + if (data.success === true && Array.isArray(data.status)) { + data.status.forEach(function(element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $outputContainer.html(message); + }); + } + }, + error: function () { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + $outputContainer.empty().html(message); + } + }); + } + }; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/ModuleMenu.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/ModuleMenu.js new file mode 100644 index 0000000000000000000000000000000000000000..859bdc2e90b0f0ed293141674e4c150406102809 --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/ModuleMenu.js @@ -0,0 +1,305 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Class to render the module menu and handle the BE navigation + * Module: TYPO3/CMS/Install/ModuleMenu + */ +define(['jquery', 'TYPO3/CMS/Backend/Storage', 'TYPO3/CMS/Backend/Icons', 'TYPO3/CMS/Backend/Viewport'], function ($, Storage, Icons) { + + if (typeof TYPO3.ModuleMenu !== 'undefined') { + return TYPO3.ModuleMenu.App; + } + TYPO3.ModuleMenu = {}; + TYPO3.ModuleMenu.App = { + loadedModule: null, + loadedNavigationComponentId: '', + availableNavigationComponents: {}, + + initialize: function () { + var me = this; + + // load the start module + if (top.startInModule && top.startInModule[0] && $('#' + top.startInModule[0]).length > 0) { + me.showModule(top.startInModule[0], top.startInModule[1]); + } else { + // fetch first module + if ($('.t3js-mainmodule:first').attr('id')) { + me.showModule($('.t3js-mainmodule:first').attr('id')); + } + // else case: the main module has no entries, this is probably a backend + // user with very little access rights, maybe only the logout button and + // a user settings module in topbar. + } + + // check if module menu should be collapsed or not + var state = Storage.Persistent.get('BackendComponents.States.typo3-module-menu'); + if (state && state.collapsed) { + TYPO3.ModuleMenu.App.toggleMenu(state.collapsed); + } + + // check if there are collapsed items in the users' configuration + var collapsedMainMenuItems = me.getCollapsedMainMenuItems(); + $.each(collapsedMainMenuItems, function (key, itm) { + if (itm !== true) { + return; + } + var $group = $('#' + key); + if ($group.length > 0) { + var $groupContainer = $group.find('.modulemenu-group-container'); + $group.addClass('collapsed').removeClass('expanded'); + TYPO3.Backend.NavigationContainer.cleanup(); + $groupContainer.hide().promise().done(function () { + TYPO3.Backend.doLayout(); + }); + } + }); + me.initializeEvents(); + }, + + initializeEvents: function () { + var me = this; + $(document).on('click', '.modulemenu-group .modulemenu-group-header', function () { + var $group = $(this).parent('.modulemenu-group'); + var $groupContainer = $group.find('.modulemenu-group-container'); + + TYPO3.Backend.NavigationContainer.cleanup(); + if ($group.hasClass('expanded')) { + me.addCollapsedMainMenuItem($group.attr('id')); + $group.addClass('collapsed').removeClass('expanded'); + $groupContainer.stop().slideUp().promise().done(function () { + TYPO3.Backend.doLayout(); + }); + } else { + me.removeCollapseMainMenuItem($group.attr('id')); + $group.addClass('expanded').removeClass('collapsed'); + $groupContainer.stop().slideDown().promise().done(function () { + TYPO3.Backend.doLayout(); + }); + } + + }); + // register clicking on sub modules + $(document).on('click', '.modulemenu-item,.t3-menuitem-submodule', function (evt) { + evt.preventDefault(); + me.showModule($(this).attr('id')); + TYPO3.Backend.doLayout(); + }); + $(document).on('click', '.t3js-topbar-button-modulemenu', + function (evt) { + evt.preventDefault(); + TYPO3.ModuleMenu.App.toggleMenu(); + } + ); + $(document).on('click', '.t3js-scaffold-content-overlay', + function (evt) { + evt.preventDefault(); + TYPO3.ModuleMenu.App.toggleMenu(true); + } + ); + $(document).on('click', '.t3js-topbar-button-navigationcomponent', + function (evt) { + evt.preventDefault(); + TYPO3.Backend.NavigationContainer.toggle(); + } + ); + + }, + /** + * @param {bool} collapse + */ + toggleMenu: function (collapse) { + TYPO3.Backend.NavigationContainer.cleanup(); + + var $mainContainer = $('.t3js-scaffold'); + var expandedClass = 'scaffold-modulemenu-expanded'; + + if (typeof collapse === 'undefined') { + collapse = $mainContainer.hasClass(expandedClass); + } + $mainContainer.toggleClass(expandedClass, !collapse); + if (!collapse) { + $('.scaffold') + .removeClass('scaffold-search-expanded') + .removeClass('scaffold-toolbar-expanded'); + } + + // Persist collapsed state in the UC of the current user + Storage.Persistent.set( + 'BackendComponents.States.typo3-module-menu', + { + collapsed: collapse + } + ); + + TYPO3.Backend.doLayout(); + }, + + /* fetch the data for a submodule */ + getRecordFromName: function (name) { + var $subModuleElement = $('#' + name); + return { + name: name, + navigationComponentId: $subModuleElement.data('navigationcomponentid'), + navigationFrameScript: $subModuleElement.data('navigationframescript'), + navigationFrameScriptParam: $subModuleElement.data('navigationframescriptparameters'), + link: $subModuleElement.find('a').attr('href') + }; + }, + + showModule: function (mod, params) { + params = params || ''; + params = this.includeId(mod, params); + var record = this.getRecordFromName(mod); + this.loadModuleComponents(record, params); + }, + + loadModuleComponents: function (record, params) { + var mod = record.name; + if (record.navigationComponentId) { + this.loadNavigationComponent(record.navigationComponentId); + } else if (record.navigationFrameScript) { + TYPO3.Backend.NavigationContainer.show('typo3-navigationIframe'); + this.openInNavFrame(record.navigationFrameScript, record.navigationFrameScriptParam); + } else { + TYPO3.Backend.NavigationContainer.hide(); + } + + this.highlightModuleMenuItem(mod); + this.loadedModule = mod; + this.openInContentFrame(record.link, params); + + // compatibility + top.currentSubScript = record.link; + top.currentModuleLoaded = mod; + + TYPO3.Backend.doLayout(); + }, + + includeId: function (mod, params) { + if (typeof mod === 'undefined') { + return params; + } + //get id + var section = mod.split('_')[0]; + if (top.fsMod.recentIds[section]) { + params = 'id=' + top.fsMod.recentIds[section] + '&' + params; + } + + return params; + }, + + loadNavigationComponent: function (navigationComponentId) { + TYPO3.Backend.NavigationContainer.show(navigationComponentId); + if (navigationComponentId === this.loadedNavigationComponentId) { + return; + } + if (this.loadedNavigationComponentId !== '') { + Ext.getCmp(this.loadedNavigationComponentId).hide(); + } + if ($('.t3js-scaffold-content-navigation [data-component="' + navigationComponentId + '"]').length < 1) { + $('.t3js-scaffold-content-navigation') + .append('<div class="scaffold-content-navigation-component" data-component="' + navigationComponentId + '" id="navigationComponent-' + navigationComponentId + '"></div>'); + } + var component = Ext.getCmp(navigationComponentId); + if (typeof component === 'undefined') { + /** @todo fix hard coded pagetree **/ + component = new TYPO3.Components.PageTree.App(); + component.render('navigationComponent-' + navigationComponentId); + } + TYPO3.Backend.NavigationContainer.show(navigationComponentId); + this.loadedNavigationComponentId = navigationComponentId; + }, + + registerNavigationComponent: function (componentId, initCallback) { + this.availableNavigationComponents[componentId] = initCallback; + }, + + openInNavFrame: function (url, params) { + var navUrl = url + (params ? (url.indexOf('?') !== -1 ? '&' : '?') + params : ''); + var currentUrl = TYPO3.Backend.NavigationContainer.getUrl(); + if (currentUrl !== navUrl) { + TYPO3.Backend.NavigationContainer.refresh(); + } + TYPO3.Backend.NavigationContainer.setUrl(url); + }, + + openInContentFrame: function (url, params) { + if (top.nextLoadModuleUrl) { + TYPO3.Backend.ContentContainer.setUrl(top.nextLoadModuleUrl); + top.nextLoadModuleUrl = ''; + } else { + var urlToLoad = url + (params ? (url.indexOf('?') !== -1 ? '&' : '?') + params : ''); + TYPO3.Backend.ContentContainer.setUrl(urlToLoad); + } + }, + + highlightModuleMenuItem: function (module, mainModule) { + $('.modulemenu-item.active').removeClass('active'); + $('#' + module).addClass('active'); + }, + + // refresh the HTML by fetching the menu again + refreshMenu: function () { + $.ajax(TYPO3.settings.ajaxUrls['modulemenu']).done(function (result) { + $('#menu').replaceWith(result.menu); + if (top.currentModuleLoaded) { + TYPO3.ModuleMenu.App.highlightModuleMenuItem(top.currentModuleLoaded); + } + TYPO3.Backend.doLayout(); + }); + }, + + reloadFrames: function () { + TYPO3.Backend.NavigationContainer.refresh(); + TYPO3.Backend.ContentContainer.refresh(); + }, + + /** + * fetches all module menu elements in the local storage that should be collapsed + * @returns {*} + */ + getCollapsedMainMenuItems: function () { + if (TYPO3.Storage.Persistent.isset('modulemenu')) { + return JSON.parse(TYPO3.Storage.Persistent.get('modulemenu')); + } else { + return {}; + } + }, + + /** + * adds a module menu item to the local storage + * @param item + */ + addCollapsedMainMenuItem: function (item) { + var existingItems = this.getCollapsedMainMenuItems(); + existingItems[item] = true; + TYPO3.Storage.Persistent.set('modulemenu', JSON.stringify(existingItems)); + }, + + /** + * removes a module menu item from the local storage + * @param item + */ + removeCollapseMainMenuItem: function (item) { + var existingItems = this.getCollapsedMainMenuItems(); + delete existingItems[item]; + TYPO3.Storage.Persistent.set('modulemenu', JSON.stringify(existingItems)); + } + + }; + // start the module menu app + TYPO3.ModuleMenu.App.initialize(); + return TYPO3.ModuleMenu; + } +); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/Presets.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/Presets.js new file mode 100644 index 0000000000000000000000000000000000000000..f1ec0a66a6899e8d7f709cac04db2ac7719fecdb --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/Presets.js @@ -0,0 +1,79 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/Presets + */ +define(['jquery', 'TYPO3/CMS/Install/FlashMessage', 'TYPO3/CMS/Install/ProgressBar', 'TYPO3/CMS/Install/InfoBox', 'TYPO3/CMS/Install/Severity'], function($, FlashMessage, ProgressBar, InfoBox, Severity) { + 'use strict'; + + return { + selectorActivateToken: '#t3js-presets-activate-token', + selectorActivateTrigger: '.t3js-presets-activate', + selectorOutputContainer: '.t3js-presets-output', + + initialize: function() { + var self = this; + + $(document).on('click', this.selectorActivateTrigger, function(e) { + e.preventDefault(); + self.activate(); + }); + + // Automatically select the custom preset if a value in one of its input fields is changed + $('.t3js-custom-preset').on('input', function() { + $('#' + $(this).data('radio')).prop('checked', true); + }); + }, + + activate: function() { + var url = location.href + '&install[controller]=ajax'; + var postData = { + 'install[action]': 'presetActivate', + 'install[token]': $(this.selectorActivateToken).text() + }; + $('.gridder-show .t3js-presets-formField').each(function(i, element) { + var $element = $(element); + if ($element.attr('type') === 'radio') { + if (element.checked) { + postData[$element.attr('name')] = $element.val(); + } + } else { + postData[$element.attr('name')] = $element.val(); + } + }); + var $outputContainer = $(this.selectorOutputContainer); + var message = ProgressBar.render(Severity.loading, 'Loading...', ''); + $outputContainer.empty().html(message); + $.ajax({ + method: 'POST', + data: postData, + url: url, + cache: false, + success: function(data) { + $outputContainer.empty(); + if (data.success === true && Array.isArray(data.status)) { + data.status.forEach(function(element) { + var message = InfoBox.render(element.severity, element.title, element.status); + $outputContainer.append(message); + }); + } + }, + error: function() { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + $outputContainer.empty().html(message); + } + }); + } + }; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/ProgressBar.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/ProgressBar.js new file mode 100644 index 0000000000000000000000000000000000000000..77425f3cdc629ced01f2d2c6e6ae7c9a4f7722eb --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/ProgressBar.js @@ -0,0 +1,48 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/ProgressBar + */ +define(['jquery', 'TYPO3/CMS/Install/Severity'], function ($, Severity) { + 'use strict'; + + /** + * @type {{template: (*)}} + */ + var ProgressBar = { + template: $('<div class="progress"><div class="t3js-progressbar progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="width: 100%"> <span class="sr-only"></span></div></div>') + }; + + /** + * render a ProgressBar + * @param {Number} severity + * @param {String} title + * @param {Number} progress + * @returns {jQuery} + */ + ProgressBar.render = function (severity, title, progress) { + var progressBar = this.template.clone(); + progressBar.addClass('progress-bar-' + Severity.getCssClass(severity)); + if (progress) { + progressBar.css('width', progress + '%'); + progressBar.attr('aria-valuenow',progresss); + } + if (title) { + progressBar.find('.sr-only').html(title); + } + return progressBar; + }; + + return ProgressBar; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/ResetBackendUserUc.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/ResetBackendUserUc.js new file mode 100644 index 0000000000000000000000000000000000000000..34e423cebeed68391e5f9fda69033aab485c68b0 --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/ResetBackendUserUc.js @@ -0,0 +1,62 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/DumpAutoload + */ +define(['jquery', 'TYPO3/CMS/Install/FlashMessage', 'TYPO3/CMS/Install/ProgressBar', 'TYPO3/CMS/Install/InfoBox', 'TYPO3/CMS/Install/Severity'], function($, FlashMessage, ProgressBar, InfoBox, Severity) { + 'use strict'; + + return { + selectorResetTrigger: '.t3js-resetBackendUserUc-reset', + selectorOutputContainer: '.t3js-resetBackendUserUc-output', + + initialize: function() { + var self = this; + $(document).on('click', this.selectorResetTrigger, function(e) { + e.preventDefault(); + self.reset(); + }); + }, + + reset: function() { + var self = this; + var url = location.href + '&install[controller]=ajax&install[action]=resetBackendUserUc'; + if (location.hash) { + url = url.replace(location.hash, ""); + } + var $outputContainer = $(this.selectorOutputContainer); + var message = ProgressBar.render(Severity.loading, 'Loading...', ''); + $outputContainer.empty().html(message); + $.ajax({ + url: url, + cache: false, + success: function (data) { + if (data.success === true && Array.isArray(data.status)) { + if (data.status.length > 0) { + $outputContainer.empty(); + data.status.forEach(function (element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $outputContainer.append(message); + }); + } + } + }, + error: function () { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + $outputContainer.empty().html(message); + } + }); + } + }; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/Severity.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/Severity.js new file mode 100644 index 0000000000000000000000000000000000000000..63d0faeca1b273f73dec289f16251d324c19ad8a --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/Severity.js @@ -0,0 +1,55 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/Severity + */ +define([], function () { + 'use strict'; + + var Severity = { + loading: -3, + notice: -2, + info: -1, + ok: 0, + warning: 1, + error: 2 + }; + + Severity.getCssClass = function (severity) { + var severityClass; + switch (severity) { + case Severity.loading: + severityClass = 'notice alert-loading'; + break; + case Severity.notice: + severityClass = 'notice'; + break; + case Severity.ok: + severityClass = 'success'; + break; + case Severity.warning: + severityClass = 'warning'; + break; + case Severity.error: + severityClass = 'danger'; + break; + case Severity.info: + default: + severityClass = 'info'; + } + return severityClass; + }; + + return Severity; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/TcaExtTablesCheck.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/TcaExtTablesCheck.js new file mode 100644 index 0000000000000000000000000000000000000000..0f5bff16f1bb3097566f663fb684ff6220b31f74 --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/TcaExtTablesCheck.js @@ -0,0 +1,77 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/TcaExtTablesCheck + */ +define([ + 'jquery', + 'TYPO3/CMS/Install/FlashMessage', + 'TYPO3/CMS/Install/ProgressBar', + 'TYPO3/CMS/Install/InfoBox', + 'TYPO3/CMS/Install/Severity' +], function($, FlashMessage, ProgressBar, InfoBox, Severity) { + 'use strict'; + + return { + selectorCheckTrigger: '.t3js-tcaExtTablesCheck-check', + selectorOutputContainer: '.t3js-tcaExtTablesCheck-output', + + initialize: function() { + var self = this; + $(document).on('click', this.selectorCheckTrigger, function(e) { + e.preventDefault(); + self.check(); + }); + }, + + check: function() { + var self = this; + var url = location.href + '&install[controller]=ajax&install[action]=tcaExtTablesCheck'; + if (location.hash) { + url = url.replace(location.hash, ""); + } + var $outputContainer = $(this.selectorOutputContainer); + var message = ProgressBar.render(Severity.loading, 'Loading...', ''); + $outputContainer.empty().html(message); + $.ajax({ + url: url, + cache: false, + success: function (data) { + if (data.success === true && Array.isArray(data.status)) { + if (data.status.length > 0) { + var message = InfoBox.render( + Severity.warning, + 'Extensions change TCA in ext_tables.php', + 'Check for ExtensionManagementUtility and $GLOBALS["TCA"]' + ); + $outputContainer.empty(); + $outputContainer.append(message); + data.status.forEach(function (element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $outputContainer.append(message); + }); + } else { + var message = InfoBox.render(Severity.ok, 'No TCA changes in ext_tables.php files. Good job!', ''); + $outputContainer.empty().html(message); + } + } + }, + error: function() { + var message = FlashMessage.render(Severity.error, 'Something went wrong', 'Use "Check for broken extensions"'); + $outputContainer.empty().html(message); + } + }); + } + }; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/TcaMigrationsCheck.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/TcaMigrationsCheck.js new file mode 100644 index 0000000000000000000000000000000000000000..6e28941882cb46c0ce2b8c4af9410127a94f8329 --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/TcaMigrationsCheck.js @@ -0,0 +1,77 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/TcaIntegrityChecker + */ +define([ + 'jquery', + 'TYPO3/CMS/Install/FlashMessage', + 'TYPO3/CMS/Install/ProgressBar', + 'TYPO3/CMS/Install/InfoBox', + 'TYPO3/CMS/Install/Severity' +], function($, FlashMessage, ProgressBar, InfoBox, Severity) { + 'use strict'; + + return { + selectorCheckTrigger: '.t3js-tcaMigrationsCheck-check', + selectorOutputContainer: '.t3js-tcaMigrationsCheck-output', + + initialize: function() { + var self = this; + $(document).on('click', this.selectorCheckTrigger, function(e) { + e.preventDefault(); + self.check(); + }); + }, + + check: function() { + var self = this; + var url = location.href + '&install[controller]=ajax&install[action]=tcaMigrationsCheck'; + if (location.hash) { + url = url.replace(location.hash, ""); + } + var $outputContainer = $(this.selectorOutputContainer); + var message = ProgressBar.render(Severity.loading, 'Loading...', ''); + $outputContainer.empty().html(message); + $.ajax({ + url: url, + cache: false, + success: function(data) { + if (data.success === true && Array.isArray(data.status)) { + if (data.status.length > 0) { + var message = InfoBox.render( + Severity.warning, + 'TCA migrations need to be applied', + 'Check the following list and apply needed changes.' + ); + $outputContainer.empty(); + $outputContainer.append(message); + data.status.forEach(function(element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $outputContainer.append(message); + }); + } else { + var message = InfoBox.render(Severity.ok, 'No TCA migrations need to be applied', 'Your TCA looks good.'); + $outputContainer.empty().html(message); + } + } + }, + error: function() { + var message = FlashMessage.render(Severity.error, 'Something went wrong', 'Use "Check for broken extensions"'); + $outputContainer.empty().html(message); + } + }); + } + }; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/UpgradeDocs.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/UpgradeDocs.js new file mode 100644 index 0000000000000000000000000000000000000000..d451a6ec45561a4bffb45457c45e8bbad7fb2610 --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/UpgradeDocs.js @@ -0,0 +1,201 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/UpgradeDocs + */ +define(['jquery', 'bootstrap', 'chosen'], function ($) { + 'use strict'; + + return { + selectorGridderOpener: '.t3js-upgradeDocs-open', + selectorMarkReadToken: '#t3js-upgradeDocs-markRead-token', + selectorUnmarkReadToken: '#t3js-upgradeDocs-unmarkRead-token', + selectorRestFileItem: '.upgrade_analysis_item_to_filter', + selectorFulltextSearch: '.gridder-show .t3js-upgradeDocs-fulltext-search', + selectorChosenField: '.gridder-show .t3js-upgradeDocs-chosen-select', + + chosenField: null, + fulltextSearchField: null, + + initialize: function() { + var self = this; + + // Mark a file as read + $(document).on('click', '.t3js-upgradeDocs-markRead', function(event) { + self.markRead(event.target); + }); + $(document).on('click', '.t3js-upgradeDocs-unmarkRead', function(event) { + self.unmarkRead(event.target); + }); + + // Make jquerys "contains" work case-insensitive + jQuery.expr[':'].contains = jQuery.expr.createPseudo(function(arg) { + return function (elem) { + return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0; + }; + }); + + // Delayed initialize of some stuff on first open + $(document).on('click', this.selectorGridderOpener, function(event) { + $('[data-toggle="tooltip"]').tooltip({container: 'body'}); + self.chosenField = $(self.selectorChosenField); + self.fulltextSearchField = $(self.selectorFulltextSearch); + self.initializeChosenSelector(); + self.chosenField.on('change', function() { + self.combinedFilterSearch(); + }); + self.fulltextSearchField.on('keyup', function() { + self.combinedFilterSearch(); + }); + }); + }, + + initializeChosenSelector: function() { + var self = this; + var tagString = ''; + $(this.selectorRestFileItem).each(function() { + tagString += $(this).data('item-tags') + ','; + }); + var tagArray = this.trimExplodeAndUnique(',', tagString); + $.each(tagArray, function(i, tag) { + self.chosenField.append('<option>' + tag + '</option>'); + }); + var config = { + '.chosen-select': {width: "100%", placeholder_text_multiple: "tags"}, + '.chosen-select-deselect': {allow_single_deselect: true}, + '.chosen-select-no-single': {disable_search_threshold: 10}, + '.chosen-select-no-results': {no_results_text: 'Oops, nothing found!'}, + '.chosen-select-width': {width: "100%"} + }; + for (var selector in config) { + $(selector).chosen(config[selector]); + } + this.chosenField.trigger('chosen:updated'); + }, + + combinedFilterSearch: function() { + var $items = $('div.item'); + if (this.chosenField.val().length < 1 && this.fulltextSearchField.val().length < 1) { + $('.panel-version:not(:first) > .panel-collapse').collapse('hide'); + $items.removeClass('hidden searchhit filterhit'); + return false; + } + $items.addClass('hidden').removeClass('searchhit filterhit'); + + // apply tags + if (this.chosenField.val().length > 0) { + $items + .addClass('hidden') + .removeClass('filterhit'); + var orTags = []; + var andTags = []; + $.each(this.chosenField.val(), function(index, item) { + var tagFilter = '[data-item-tags*="' + item + '"]'; + if (item.indexOf(':') > 0) { + orTags.push(tagFilter); + } else { + andTags.push(tagFilter); + } + }); + var andString = andTags.join(''); + var tags = []; + if (orTags.length) { + for (var i = 0; i < orTags.length; i++) { + tags.push(andString + orTags[i]); + } + } else { + tags.push(andString); + } + var tagSelection = tags.join(','); + $(tagSelection) + .removeClass('hidden') + .addClass('searchhit filterhit'); + } else { + $items + .addClass('filterhit') + .removeClass('hidden'); + } + // apply fulltext search + var typedQuery = this.fulltextSearchField.val(); + $('div.item.filterhit').each(function() { + var $item = $(this); + if ($(':contains(' + typedQuery + ')', $item).length > 0 || $('input[value*="' + typedQuery + '"]', $item).length > 0) { + $item.removeClass('hidden').addClass('searchhit'); + } else { + $item.removeClass('searchhit').addClass('hidden'); + } + }); + + $('.searchhit').closest('.panel-collapse').collapse('show'); + + //check for empty panels + $('.panel-version').each(function() { + if ($(this).find('.searchhit', '.filterhit').length < 1) { + $(this).find(' > .panel-collapse').collapse('hide'); + } + }); + }, + + markRead: function(element) { + var $button = $(element).closest('a'); + $button.toggleClass('t3js-upgradeDocs-unmarkRead t3js-upgradeDocs-markRead'); + $button.find('i').toggleClass('fa-check fa-ban'); + $button.closest('.panel').appendTo('.panel-body-read'); + $.ajax({ + method: 'POST', + url: location.href + '&install[controller]=ajax', + data: { + 'install': { + 'ignoreFile': $button.data('filepath'), + 'token': $(this.selectorMarkReadToken).text(), + 'action': 'upgradeDocsMarkRead' + } + } + }); + }, + + unmarkRead: function(element) { + var $button = $(element).closest('a'); + var version = $button.closest('.panel').data('item-version'); + $button.toggleClass('t3js-upgradeDocs-markRead t3js-upgradeDocs-unmarkRead'); + $button.find('i').toggleClass('fa-check fa-ban'); + $button.closest('.panel').appendTo('*[data-group-version="' + version + '"] .panel-body'); + $.ajax({ + method: 'POST', + url: location.href + '&install[controller]=ajax', + data: { + 'install': { + 'ignoreFile': $button.data('filepath'), + 'token': $(this.selectorUnmarkReadToken).text(), + action: 'upgradeDocsUnmarkRead' + } + } + }); + }, + + trimExplodeAndUnique: function(delimiter, string) { + var result = []; + var items = string.split(delimiter); + for (var i = 0; i < items.length; i++) { + var item = items[i].trim(); + if (item.length > 0) { + if ($.inArray(item, result) === -1) { + result.push(item); + } + } + } + return result; + } + }; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/UpgradeWizards.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/UpgradeWizards.js new file mode 100644 index 0000000000000000000000000000000000000000..dd7e19d967919da04dafa0d177eb14b4afaa26f9 --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/UpgradeWizards.js @@ -0,0 +1,498 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/UpgradeWizards + */ +define([ + 'jquery', + 'TYPO3/CMS/Install/FlashMessage', + 'TYPO3/CMS/Install/ProgressBar', + 'TYPO3/CMS/Install/InfoBox', + 'TYPO3/CMS/Install/Severity' +], +function($, FlashMessage, ProgressBar, InfoBox, Severity) { + 'use strict'; + + return { + selectorGridderOpener: '.t3js-upgradeWizards-open', + selectorMarkUndoneToken: '#t3js-upgradeWizards-markUndone-token', + selectorOutputWizardsContainer: '.t3js-upgradeWizards-wizards-output', + selectorOutputDoneContainer: '.t3js-upgradeWizards-done-output', + selectorWizardsBlockingAddsTemplate: '.t3js-upgradeWizards-blocking-adds-template', + selectorWizardsBlockingAddsRows: '.t3js-upgradeWizards-blocking-adds-rows', + selectorWizardsBlockingAddsExecute: '.t3js-upgradeWizards-blocking-adds-execute', + selectorWizardsBlockingCharsetTemplate: '.t3js-upgradeWizards-blocking-charset-template', + selectorWizardsBlockingCharsetFix: '.t3js-upgradeWizards-blocking-charset-fix', + selectorWizardsDoneBodyTemplate: '.t3js-upgradeWizards-done-body-template', + selectorWizardsDoneRows: '.t3js-upgradeWizards-done-rows', + selectorWizardsDoneRowTemplate: '.t3js-upgradeWizards-done-row-template table', + selectorWizardsDoneRowMarkUndone: '.t3js-upgradeWizards-done-markUndone', + selectorWizardsDoneRowTitle: '.t3js-upgradeWizards-done-title', + selectorWizardsListTemplate: '.gridder-show .t3js-upgradeWizards-list-template', + selectorWizardsListRows: '.t3js-upgradeWizards-list-rows', + selectorWizardsListRowTemplate: '.gridder-show .t3js-upgradeWizards-list-row-template', + selectorWizardsListRowTitle: '.t3js-upgradeWizards-list-row-title', + selectorWizardsListRowExplanation: '.t3js-upgradeWizards-list-row-explanation', + selectorWizardsListRowExecute: '.t3js-upgradeWizards-list-row-execute', + selectorWizardsInputToken: '#t3js-upgradeWizards-input-token', + selectorWizardsInputTemplate: '.gridder-show .t3js-upgradeWizards-input', + selectorWizardsInputTitle: '.t3js-upgradeWizards-input-title', + selectorWizardsInputHtml: '.t3js-upgradeWizards-input-html', + selectorWizardsInputPerform: '.t3js-upgradeWizards-input-perform', + selectorWizardsExecuteToken: '#t3js-upgradeWizards-execute-token', + + loadingMessage: ProgressBar.render(Severity.loading, 'Loading...', ''), + + initialize: function() { + var self = this; + + // Load main content on first open + $(document).on('click', this.selectorGridderOpener, function(event) { + var $element = $(event.target).closest(self.selectorGridderOpener); + if (!$element.data('upgradeWizardInitialized')) { + $element.data('upgradeWizardInitialized', true); + self.silentUpgrades(); + self.doneUpgrades(); + } + }); + + // Mark a done wizard undone + $(document).on('click', this.selectorWizardsDoneRowMarkUndone, function(event) { + var identifier = $(event.target).data('identifier'); + self.markUndone(identifier); + }); + + // Execute "fix default mysql connection db charset" blocking wizard + $(document).on('click', this.selectorWizardsBlockingCharsetFix, function(event) { + self.blockingUpgradesDatabaseCharsetFix(); + }); + + // Execute "add required fields + tables" blocking wizard + $(document).on('click', this.selectorWizardsBlockingAddsExecute, function(event) { + self.blockingUpgradesDatabaseAddsExecute(); + }); + + // Get user input of a single upgrade wizard + $(document).on('click', this.selectorWizardsListRowExecute, function(event) { + var identifier = $(event.target).data('identifier'); + self.wizardInput(identifier); + }); + + // Execute one upgrade wizard + $(document).on('click', this.selectorWizardsInputPerform, function(event) { + var identifier = $(event.target).data('identifier'); + self.wizardExecute(identifier); + }); + }, + + silentUpgrades: function() { + var self = this; + var url = location.href + '&install[controller]=ajax&install[action]=upgradeWizardsSilentUpgrades'; + if (location.hash) { + url = url.replace(location.hash, ""); + } + var $outputContainer = $(this.selectorOutputWizardsContainer); + $outputContainer.empty().html(self.loadingMessage); + $.ajax({ + url: url, + cache: false, + success: function(data) { + $outputContainer.empty(); + if (data.success === true && Array.isArray(data.status)) { + if (data.status.length > 0) { + data.status.forEach((function (element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $outputContainer.append(message); + })); + } + self.blockingUpgradesDatabaseCharsetTest(); + } + }, + error: function() { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + $outputContainer.empty().html(message); + } + }); + }, + + blockingUpgradesDatabaseCharsetTest: function() { + var self = this; + var url = location.href + '&install[controller]=ajax&install[action]=upgradeWizardsBlockingDatabaseCharsetTest'; + if (location.hash) { + url = url.replace(location.hash, ""); + } + var $outputContainer = $(this.selectorOutputWizardsContainer); + var charsetTemplate = $(this.selectorWizardsBlockingCharsetTemplate).html(); + $outputContainer.append().html(self.loadingMessage); + $.ajax({ + url: url, + cache: false, + success: function(data) { + self.removeLoadingMessage($outputContainer); + if (data.success === true) { + if (data.needsUpdate === true) { + $outputContainer.append($(charsetTemplate).clone()); + } else { + self.blockingUpgradesDatabaseAdds(); + } + } + }, + error: function() { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + self.removeLoadingMessage($outputContainer); + $outputContainer.append(message); + } + }); + }, + + blockingUpgradesDatabaseCharsetFix: function() { + var self = this; + var url = location.href + '&install[controller]=ajax&install[action]=upgradeWizardsBlockingDatabaseCharsetFix'; + if (location.hash) { + url = url.replace(location.hash, ""); + } + var $outputContainer = $(this.selectorOutputWizardsContainer); + $outputContainer.append().html(self.loadingMessage); + $.ajax({ + url: url, + cache: false, + success: function(data) { + self.removeLoadingMessage($outputContainer); + if (data.success === true) { + if (Array.isArray(data.status) && data.status.length > 0) { + data.status.forEach(function(element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $outputContainer.append(message); + }); + } + } + }, + error: function() { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + self.removeLoadingMessage($outputContainer); + $outputContainer.append(message); + } + }); + }, + + blockingUpgradesDatabaseAdds: function() { + var self = this; + var url = location.href + '&install[controller]=ajax&install[action]=upgradeWizardsBlockingDatabaseAdds'; + if (location.hash) { + url = url.replace(location.hash, ""); + } + var $outputContainer = $(this.selectorOutputWizardsContainer); + var breakingAddsTemplate = $(this.selectorWizardsBlockingAddsTemplate).html(); + $outputContainer.append().html(self.loadingMessage); + $.ajax({ + url: url, + cache: false, + success: function(data) { + self.removeLoadingMessage($outputContainer); + if (data.success === true) { + if (data.needsUpdate === true) { + var adds = $(breakingAddsTemplate).clone(); + if (typeof(data.adds.tables) === 'object') { + data.adds.tables.forEach(function(element) { + adds.find(self.selectorWizardsBlockingAddsRows).append('Table: ' + element.table + '<br>'); + }); + } + if (typeof(data.adds.columns) === 'object') { + data.adds.columns.forEach(function(element) { + adds.find(self.selectorWizardsBlockingAddsRows).append('Table: ' + element.table + ', Field: ' + element.field + '<br>'); + }); + } + if (typeof(data.adds.indexes) === 'object') { + data.adds.indexes.forEach(function(element) { + adds.find(self.selectorWizardsBlockingAddsRows).append('Table: ' + element.table + ', Index: ' + element.index + '<br>'); + }); + } + $outputContainer.append(adds); + } else { + self.wizardsList(); + } + } + }, + error: function() { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + self.removeLoadingMessage($outputContainer); + $outputContainer.append(message); + } + }); + }, + + blockingUpgradesDatabaseAddsExecute: function() { + var self = this; + var url = location.href + '&install[controller]=ajax&install[action]=upgradeWizardsBlockingDatabaseExecute'; + if (location.hash) { + url = url.replace(location.hash, ""); + } + var $outputContainer = $(this.selectorOutputWizardsContainer); + $outputContainer.empty().html(self.loadingMessage); + $.ajax({ + url: url, + cache: false, + success: function(data) { + self.removeLoadingMessage($outputContainer); + if (data.success === true) { + if (Array.isArray(data.status) && data.status.length > 0) { + data.status.forEach(function(element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $outputContainer.append(message); + }); + self.wizardsList(); + } + } + }, + error: function() { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + self.removeLoadingMessage($outputContainer); + $outputContainer.append(message); + } + }); + }, + + wizardsList: function() { + var self = this; + var url = location.href + '&install[controller]=ajax&install[action]=upgradeWizardsList'; + if (location.hash) { + url = url.replace(location.hash, ""); + } + var listTemplate = $(this.selectorWizardsListTemplate); + var wizardTemplate = $(this.selectorWizardsListRowTemplate); + var $outputContainer = $(this.selectorOutputWizardsContainer); + $outputContainer.append(self.loadingMessage); + $.ajax({ + url: url, + cache: false, + success: function(data) { + self.removeLoadingMessage($outputContainer); + var list = $(listTemplate).clone(); + list.removeClass('t3js-upgradeWizards-list-template'); + if (data.success === true) { + var numberOfWizardsTodo = 0; + var numberOfWizards = 0; + if (Array.isArray(data.wizards) && data.wizards.length > 0) { + numberOfWizards = data.wizards.length; + data.wizards.forEach(function(element) { + if (element.shouldRenderWizard === true) { + var aRow = $(wizardTemplate).clone(); + numberOfWizardsTodo = numberOfWizardsTodo +1; + aRow.removeClass('t3js-upgradeWizards-list-row-template'); + aRow.find(self.selectorWizardsListRowTitle).empty().text(element.title); + aRow.find(self.selectorWizardsListRowExplanation).empty().html(element.explanation); + aRow.find(self.selectorWizardsListRowExecute).data('identifier', element.identifier); + list.find(self.selectorWizardsListRows).append(aRow); + } + }); + } + var percent = 100; + if (numberOfWizardsTodo > 0) { + percent = ((numberOfWizards - numberOfWizardsTodo) / data.wizards.length) * 100; + } + list.find('.progress-bar') + .css('width', percent + '%') + .attr('aria-valuenow', percent) + .find('span') + .text(parseInt(percent) + '%'); + $outputContainer.append(list); + } + }, + error: function() { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + self.removeLoadingMessage($outputContainer); + $outputContainer.append(message); + } + }); + }, + + wizardInput: function(identifier) { + var self = this; + var url = location.href + '&install[controller]=ajax'; + var postData = { + 'install': { + 'action': 'upgradeWizardsInput', + 'token': $(this.selectorWizardsInputToken).text(), + 'identifier': identifier + } + }; + var $outputContainer = $(this.selectorOutputWizardsContainer); + var inputTemplate = $(this.selectorWizardsInputTemplate); + $outputContainer.empty().html(this.loadingMessage); + $.ajax({ + method: 'POST', + data: postData, + url: url, + cache: false, + success: function(data) { + $outputContainer.empty(); + var input = $(inputTemplate).clone(); + input.removeClass('t3js-upgradeWizards-input'); + if (data.success === true) { + if (Array.isArray(data.status)) { + data.status.forEach(function(element) { + var message = FlashMessage.render(element.severity, element.title, element.message); + $outputContainer.append(message); + }); + } + if (data.userInput.wizardHtml.length > 0) { + input.find(self.selectorWizardsInputHtml).html(data.userInput.wizardHtml); + } + input.find(self.selectorWizardsInputTitle).text(data.userInput.title); + input.find(self.selectorWizardsInputPerform).data('identifier', data.userInput.identifier); + } + $outputContainer.append(input); + }, + error: function() { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + $outputContainer.empty().html(message); + } + }); + }, + + wizardExecute: function(identifier) { + var self = this; + var url = location.href + '&install[controller]=ajax'; + var postData = { + 'install[action]': 'upgradeWizardsExecute', + 'install[token]': $(this.selectorWizardsExecuteToken).text(), + 'install[identifier]': identifier + }; + $($('.gridder-show ' + this.selectorOutputWizardsContainer + ' form').serializeArray()).each(function() { + postData[this.name] = this.value; + }); + var $outputContainer = $(this.selectorOutputWizardsContainer); + var $outputDoneContainer = $(this.selectorOutputDoneContainer); + $outputContainer.empty().html(this.loadingMessage); + $.ajax({ + method: 'POST', + data: postData, + url: url, + cache: false, + success: function(data) { + $outputContainer.empty(); + if (data.success === true) { + if (Array.isArray(data.status)) { + data.status.forEach(function(element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $outputContainer.append(message); + }); + } + self.wizardsList(); + $outputDoneContainer.empty(); + self.doneUpgrades(); + } + }, + error: function() { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + $outputContainer.empty().html(message); + } + }); + }, + + doneUpgrades: function() { + var self = this; + var url = location.href + '&install[controller]=ajax&install[action]=upgradeWizardsDoneUpgrades'; + if (location.hash) { + url = url.replace(location.hash, ""); + } + var $outputContainer = $(this.selectorOutputDoneContainer); + var rowTemplate = $(this.selectorWizardsDoneRowTemplate).html(); + var bodyTemplate = $(this.selectorWizardsDoneBodyTemplate).html(); + $outputContainer.append(this.loadingMessage); + $.ajax({ + url: url, + cache: false, + success: function(data) { + self.removeLoadingMessage($outputContainer); + if (data.success === true) { + if (Array.isArray(data.status) && data.status.length > 0) { + data.status.forEach(function(element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $outputContainer.append(message); + }); + } + var body = $(bodyTemplate).clone(); + var hasBodyContent = false; + if (Array.isArray(data.wizardsDone) && data.wizardsDone.length > 0) { + data.wizardsDone.forEach(function(element) { + hasBodyContent = true; + var aRow = $(rowTemplate).clone(); + aRow.find(self.selectorWizardsDoneRowMarkUndone).data('identifier', element.identifier); + aRow.find(self.selectorWizardsDoneRowTitle).html(element.title); + body.find(self.selectorWizardsDoneRows).append(aRow); + }); + } + if (Array.isArray(data.rowUpdatersDone) && data.rowUpdatersDone.length > 0) { + data.rowUpdatersDone.forEach(function(element) { + hasBodyContent = true; + var aRow = $(rowTemplate).clone(); + aRow.find(self.selectorWizardsDoneRowMarkUndone).data('identifier', element.identifier); + aRow.find(self.selectorWizardsDoneRowTitle).html(element.title); + body.find(self.selectorWizardsDoneRows).append(aRow); + }); + } + if (hasBodyContent === true) { + $outputContainer.append(body); + } + } + }, + error: function() { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + self.removeLoadingMessage($outputContainer); + $outputContainer.append(message); + } + }); + }, + + markUndone: function(identifier) { + var self = this; + var url = location.href + '&install[controller]=ajax'; + var postData = { + 'install': { + 'action': 'upgradeWizardsMarkUndone', + 'token': $(this.selectorMarkUndoneToken).text(), + 'identifier': identifier + } + }; + var $outputContainer = $(this.selectorOutputDoneContainer); + $outputContainer.empty().html(this.loadingMessage); + $.ajax({ + method: 'POST', + data: postData, + url: url, + cache: false, + success: function(data) { + $outputContainer.empty(); + if (data.success === true && Array.isArray(data.status)) { + data.status.forEach(function(element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $outputContainer.append(message); + self.doneUpgrades(); + self.blockingUpgradesDatabaseCharsetTest(); + }); + } + }, + error: function() { + var message = FlashMessage.render(Severity.error, 'Something went wrong', ''); + $outputContainer.empty().html(message); + } + }); + }, + + removeLoadingMessage: function($container) { + $container.find('.alert-loading').remove(); + } + }; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/RequireJSConfig.js b/typo3/sysext/install/Resources/Public/JavaScript/RequireJSConfig.js new file mode 100644 index 0000000000000000000000000000000000000000..3935d2155ace904bb7d2b66bdf624f4cafada01b --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/RequireJSConfig.js @@ -0,0 +1,20 @@ +var require = { + baseUrl: '', + urlArgs: 'bust=' + (new Date()).getTime(), + paths: { + 'TYPO3/CMS/Backend': 'sysext/backend/Resources/Public/JavaScript/', + 'TYPO3/CMS/Install': 'sysext/install/Resources/Public/JavaScript/Modules/', + 'jquery': 'sysext/core/Resources/Public/JavaScript/Contrib/jquery/jquery-3.2.1.min', + 'jquery.clearable': 'sysext/backend/Resources/Public/JavaScript/jquery.clearable', + 'bootstrap': 'sysext/install/Resources/Public/JavaScript/bootstrap.min', + 'chosen': 'sysext/install/Resources/Public/JavaScript/chosen.jquery.min' + }, + shim: { + jQuery: { + exports: '$' + }, + 'bootstrap': { + 'deps': ['jquery'] + } + } +}; diff --git a/typo3/sysext/install/Tests/Unit/Controller/Action/Ajax/ExtensionCompatibilityTesterTest.php b/typo3/sysext/install/Tests/Unit/Controller/Action/Ajax/ExtensionCompatibilityTesterTest.php index 347eead732ecd39cce17a569aa0234d29963047d..4202edd7ddc5e7f6886c9af32c78497ed37a4bbc 100644 --- a/typo3/sysext/install/Tests/Unit/Controller/Action/Ajax/ExtensionCompatibilityTesterTest.php +++ b/typo3/sysext/install/Tests/Unit/Controller/Action/Ajax/ExtensionCompatibilityTesterTest.php @@ -17,11 +17,13 @@ namespace TYPO3\CMS\Install\Tests\Unit\Controller\Action\Ajax; use TYPO3\CMS\Core\Tests\Unit\Utility\AccessibleProxies\ExtensionManagementUtilityAccessibleProxy; use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Install\Controller\Action\Ajax\ExtensionCompatibilityTester; +use TYPO3\TestingFramework\Core\Unit\UnitTestCase; /** * Test case */ -class ExtensionCompatibilityTesterTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase +class ExtensionCompatibilityTesterTest extends UnitTestCase { /** * @var \TYPO3\CMS\Core\Package\UnitTestPackageManager A backup of unit test package manager @@ -57,7 +59,7 @@ class ExtensionCompatibilityTesterTest extends \TYPO3\TestingFramework\Core\Unit 'news' => '', 'info' => '' ]; - $extensionCompatibilityTesterMock = $this->getAccessibleMock(\TYPO3\CMS\Install\Controller\Action\Ajax\ExtensionCompatibilityTester::class, ['getExtensionsToExclude'], []); + $extensionCompatibilityTesterMock = $this->getAccessibleMock(ExtensionCompatibilityTester::class, ['getExtensionsToExclude'], []); $extensionCompatibilityTesterMock->expects($this->once())->method('getExtensionsToExclude')->will($this->returnValue(['info'])); $result = $extensionCompatibilityTesterMock->_call('getExtensionsToLoad'); $this->assertEquals(['news' => ''], $result); @@ -68,10 +70,10 @@ class ExtensionCompatibilityTesterTest extends \TYPO3\TestingFramework\Core\Unit */ public function executeActionReturnsStringOkIfAllIsWell() { - $extensionCompatibilityTesterMock = $this->getAccessibleMock(\TYPO3\CMS\Install\Controller\Action\Ajax\ExtensionCompatibilityTester::class, ['getExtensionsToLoad', 'tryToLoadExtLocalconfAndExtTablesOfExtensions', 'deleteProtocolFile'], []); + $extensionCompatibilityTesterMock = $this->getAccessibleMock(ExtensionCompatibilityTester::class, ['getExtensionsToLoad', 'tryToLoadExtLocalconfAndExtTablesOfExtensions', 'deleteProtocolFile'], []); $extensionCompatibilityTesterMock->expects($this->once())->method('getExtensionsToLoad')->will($this->returnValue([])); $result = $extensionCompatibilityTesterMock->_call('executeAction'); - $this->assertEquals('OK', $result); + $this->assertEquals(['success' => true], $result); } /** @@ -79,7 +81,7 @@ class ExtensionCompatibilityTesterTest extends \TYPO3\TestingFramework\Core\Unit */ public function executeActionCallsGetExtensionsToLoad() { - $extensionCompatibilityTesterMock = $this->getAccessibleMock(\TYPO3\CMS\Install\Controller\Action\Ajax\ExtensionCompatibilityTester::class, ['getExtensionsToLoad', 'deleteProtocolFile', 'tryToLoadExtLocalconfAndExtTablesOfExtensions'], []); + $extensionCompatibilityTesterMock = $this->getAccessibleMock(ExtensionCompatibilityTester::class, ['getExtensionsToLoad', 'deleteProtocolFile', 'tryToLoadExtLocalconfAndExtTablesOfExtensions'], []); $extensionCompatibilityTesterMock->expects($this->once())->method('getExtensionsToLoad')->will($this->returnValue([])); $extensionCompatibilityTesterMock->expects($this->once())->method('getExtensionsToLoad'); $extensionCompatibilityTesterMock->_call('executeAction'); @@ -90,7 +92,7 @@ class ExtensionCompatibilityTesterTest extends \TYPO3\TestingFramework\Core\Unit */ public function executeActionCallsLoadExtensions() { - $extensionCompatibilityTesterMock = $this->getAccessibleMock(\TYPO3\CMS\Install\Controller\Action\Ajax\ExtensionCompatibilityTester::class, ['tryToLoadExtLocalconfAndExtTablesOfExtensions', 'getExtensionsToLoad', 'deleteProtocolFile'], []); + $extensionCompatibilityTesterMock = $this->getAccessibleMock(ExtensionCompatibilityTester::class, ['tryToLoadExtLocalconfAndExtTablesOfExtensions', 'getExtensionsToLoad', 'deleteProtocolFile'], []); $extensionCompatibilityTesterMock->expects($this->once())->method('getExtensionsToLoad')->will($this->returnValue([])); $extensionCompatibilityTesterMock->expects($this->once())->method('tryToLoadExtLocalconfAndExtTablesOfExtensions'); $extensionCompatibilityTesterMock->_call('executeAction'); @@ -101,7 +103,7 @@ class ExtensionCompatibilityTesterTest extends \TYPO3\TestingFramework\Core\Unit */ public function executeActionCallsDeleteProtocolFileIfForceCheckIsSet() { - $extensionCompatibilityTesterMock = $this->getAccessibleMock(\TYPO3\CMS\Install\Controller\Action\Ajax\ExtensionCompatibilityTester::class, ['tryToLoadExtLocalconfAndExtTablesOfExtensions', 'getExtensionsToLoad', 'deleteProtocolFile'], []); + $extensionCompatibilityTesterMock = $this->getAccessibleMock(ExtensionCompatibilityTester::class, ['tryToLoadExtLocalconfAndExtTablesOfExtensions', 'getExtensionsToLoad', 'deleteProtocolFile'], []); $extensionCompatibilityTesterMock->expects($this->once())->method('getExtensionsToLoad')->will($this->returnValue([])); $_GET['install']['extensionCompatibilityTester']['forceCheck'] = 1; $extensionCompatibilityTesterMock->expects($this->once())->method('deleteProtocolFile'); @@ -114,7 +116,7 @@ class ExtensionCompatibilityTesterTest extends \TYPO3\TestingFramework\Core\Unit */ public function deleteProtocolFileDeletesFile() { - $extensionCompatibilityTesterMock = $this->getAccessibleMock(\TYPO3\CMS\Install\Controller\Action\Ajax\ExtensionCompatibilityTester::class, ['dummy'], []); + $extensionCompatibilityTesterMock = $this->getAccessibleMock(ExtensionCompatibilityTester::class, ['dummy'], []); GeneralUtility::writeFile(PATH_site . 'typo3temp/assets/ExtensionCompatibilityTester.txt', 'foobar'); $extensionCompatibilityTesterMock->_call('deleteProtocolFile'); $this->assertFalse(file_exists(PATH_site . 'typo3temp/assets/ExtensionCompatibilityTester.txt')); @@ -138,7 +140,7 @@ class ExtensionCompatibilityTesterTest extends \TYPO3\TestingFramework\Core\Unit 'ext_tables.php' => PATH_typo3 . 'sysext/install/Tests/Unit/Controller/Action/Ajax/Fixtures/demo1/ext_tables.php' ] ]; - $extensionCompatibilityTesterMock = $this->getAccessibleMock(\TYPO3\CMS\Install\Controller\Action\Ajax\ExtensionCompatibilityTester::class, ['loadExtLocalconfForExtension', 'writeCurrentExtensionToFile', 'loadExtTablesForExtension', 'removeCurrentExtensionFromFile'], []); + $extensionCompatibilityTesterMock = $this->getAccessibleMock(ExtensionCompatibilityTester::class, ['loadExtLocalconfForExtension', 'writeCurrentExtensionToFile', 'loadExtTablesForExtension', 'removeCurrentExtensionFromFile'], []); $extensionCompatibilityTesterMock->expects($this->atLeastOnce())->method('loadExtTablesForExtension'); $extensionCompatibilityTesterMock->_call('tryToLoadExtLocalconfAndExtTablesOfExtensions', $extension); } @@ -161,7 +163,7 @@ class ExtensionCompatibilityTesterTest extends \TYPO3\TestingFramework\Core\Unit 'ext_localconf.php' => PATH_typo3 . 'sysext/install/Tests/Unit/Controller/Action/Ajax/Fixtures/demo1/ext_localconf.php' ] ]; - $extensionCompatibilityTesterMock = $this->getAccessibleMock(\TYPO3\CMS\Install\Controller\Action\Ajax\ExtensionCompatibilityTester::class, ['loadExtLocalconfForExtension', 'writeCurrentExtensionToFile', 'loadExtTablesForExtension', 'removeCurrentExtensionFromFile'], []); + $extensionCompatibilityTesterMock = $this->getAccessibleMock(ExtensionCompatibilityTester::class, ['loadExtLocalconfForExtension', 'writeCurrentExtensionToFile', 'loadExtTablesForExtension', 'removeCurrentExtensionFromFile'], []); $extensionCompatibilityTesterMock->expects($this->atLeastOnce())->method('loadExtLocalconfForExtension'); $extensionCompatibilityTesterMock->_call('tryToLoadExtLocalconfAndExtTablesOfExtensions', $extension); } @@ -177,7 +179,7 @@ class ExtensionCompatibilityTesterTest extends \TYPO3\TestingFramework\Core\Unit 'ext_localconf.php' => PATH_typo3 . 'sysext/install/Tests/Unit/Controller/Action/Ajax/Fixtures/demo1/ext_localconf.php' ] ]; - $extensionCompatibilityTesterMock = $this->getAccessibleMock(\TYPO3\CMS\Install\Controller\Action\Ajax\ExtensionCompatibilityTester::class, ['dummy'], []); + $extensionCompatibilityTesterMock = $this->getAccessibleMock(ExtensionCompatibilityTester::class, ['dummy'], []); $extensionCompatibilityTesterMock->_call('loadExtLocalconfForExtension', 'demo1', $extension['demo1']); $this->assertArrayHasKey('demo1_executed', $GLOBALS); $this->assertEquals('foobaz', $GLOBALS['demo1_executed']); @@ -202,7 +204,7 @@ class ExtensionCompatibilityTesterTest extends \TYPO3\TestingFramework\Core\Unit 'ext_tables.php' => PATH_typo3 . 'sysext/install/Tests/Unit/Controller/Action/Ajax/Fixtures/demo1/ext_tables.php' ] ]; - $extensionCompatibilityTesterMock = $this->getAccessibleMock(\TYPO3\CMS\Install\Controller\Action\Ajax\ExtensionCompatibilityTester::class, ['loadExtLocalconfForExtension', 'writeCurrentExtensionToFile', 'loadExtTablesForExtension', 'removeCurrentExtensionFromFile'], []); + $extensionCompatibilityTesterMock = $this->getAccessibleMock(ExtensionCompatibilityTester::class, ['loadExtLocalconfForExtension', 'writeCurrentExtensionToFile', 'loadExtTablesForExtension', 'removeCurrentExtensionFromFile'], []); $extensionCompatibilityTesterMock->expects($this->atLeastOnce())->method('writeCurrentExtensionToFile')->with('demo1'); $extensionCompatibilityTesterMock->_call('tryToLoadExtLocalconfAndExtTablesOfExtensions', $extension); } @@ -212,7 +214,7 @@ class ExtensionCompatibilityTesterTest extends \TYPO3\TestingFramework\Core\Unit */ public function writeCurrentExtensionToFileWritesExtensionKeyToFile() { - $extensionCompatibilityTesterMock = $this->getAccessibleMock(\TYPO3\CMS\Install\Controller\Action\Ajax\ExtensionCompatibilityTester::class, ['dummy'], []); + $extensionCompatibilityTesterMock = $this->getAccessibleMock(ExtensionCompatibilityTester::class, ['dummy'], []); $extensionCompatibilityTesterMock->_call('writeCurrentExtensionToFile', 'demo1'); $fileContent = file_get_contents($extensionCompatibilityTesterMock->_get('protocolFile')); $this->assertEquals('demo1', $fileContent); @@ -223,7 +225,7 @@ class ExtensionCompatibilityTesterTest extends \TYPO3\TestingFramework\Core\Unit */ public function getExtensionsToExcludeReturnsArray() { - $extensionCompatibilityTesterMock = $this->getAccessibleMock(\TYPO3\CMS\Install\Controller\Action\Ajax\ExtensionCompatibilityTester::class, ['dummy'], []); + $extensionCompatibilityTesterMock = $this->getAccessibleMock(ExtensionCompatibilityTester::class, ['dummy'], []); $returnValue = $extensionCompatibilityTesterMock->_call('getExtensionsToExclude'); $this->assertInternalType('array', $returnValue); } @@ -260,7 +262,7 @@ class ExtensionCompatibilityTesterTest extends \TYPO3\TestingFramework\Core\Unit */ public function removeCurrentExtensionFromFileRemovesGivenExtension($extensionToRemove, $extensions, $expectedExtensions) { - $extensionCompatibilityTesterMock = $this->getAccessibleMock(\TYPO3\CMS\Install\Controller\Action\Ajax\ExtensionCompatibilityTester::class, ['dummy'], []); + $extensionCompatibilityTesterMock = $this->getAccessibleMock(ExtensionCompatibilityTester::class, ['dummy'], []); GeneralUtility::writeFile($extensionCompatibilityTesterMock->_get('protocolFile'), $extensions); $extensionCompatibilityTesterMock->_call('removeCurrentExtensionFromFile', $extensionToRemove); diff --git a/typo3/sysext/install/Tests/Unit/FolderStructure/LinkNodeTest.php b/typo3/sysext/install/Tests/Unit/FolderStructure/LinkNodeTest.php index 8950c0a6db885f9368ba61cd1ff451e0e5701a64..6271b109039263b414869bc61241578b82ade6df 100644 --- a/typo3/sysext/install/Tests/Unit/FolderStructure/LinkNodeTest.php +++ b/typo3/sysext/install/Tests/Unit/FolderStructure/LinkNodeTest.php @@ -215,6 +215,7 @@ class LinkNodeTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase $node->expects($this->any())->method('exists')->will($this->returnValue(true)); $node->expects($this->once())->method('isLink')->will($this->returnValue(true)); $node->expects($this->once())->method('isTargetCorrect')->will($this->returnValue(true)); + $node->expects($this->once())->method('getRelativePathBelowSiteRoot')->will($this->returnValue('')); $statusArray = $node->getStatus(); /** @var $status \TYPO3\CMS\Install\Status\StatusInterface */ $status = $statusArray[0]; diff --git a/typo3/sysext/install/Classes/Controller/Action/Tool/About.php b/typo3/sysext/install/Tests/Unit/Service/ClearTableServiceTest.php similarity index 50% rename from typo3/sysext/install/Classes/Controller/Action/Tool/About.php rename to typo3/sysext/install/Tests/Unit/Service/ClearTableServiceTest.php index 49951efd096125afba1b53c5ac29c9218f90668f..3cc6e328d590802da80bd3196e014fcf9f3e8588 100644 --- a/typo3/sysext/install/Classes/Controller/Action/Tool/About.php +++ b/typo3/sysext/install/Tests/Unit/Service/ClearTableServiceTest.php @@ -1,5 +1,5 @@ <?php -namespace TYPO3\CMS\Install\Controller\Action\Tool; +namespace TYPO3\CMS\Install\Tests\Unit\Service; /* * This file is part of the TYPO3 CMS project. @@ -14,20 +14,21 @@ namespace TYPO3\CMS\Install\Controller\Action\Tool; * The TYPO3 project - inspiring people to share! */ -use TYPO3\CMS\Install\Controller\Action; +use TYPO3\CMS\Install\Service\ClearTableService; +use TYPO3\TestingFramework\Core\Unit\UnitTestCase; /** - * About page + * Test case */ -class About extends Action\AbstractAction +class ClearTableServiceTest extends UnitTestCase { /** - * Executes the tool - * - * @return string Rendered content + * @test */ - protected function executeAction() + public function clearSelectedTableThrowsWithInvalidTableName() { - return $this->view->render(); + $this->expectException(\RuntimeException::class); + $this->expectExceptionCode(1501942151); + (new ClearTableService())->clearSelectedTable('foo'); } } diff --git a/typo3/sysext/install/Tests/Unit/Service/CoreUpdateServiceTest.php b/typo3/sysext/install/Tests/Unit/Service/CoreUpdateServiceTest.php index 69188430dca70de5dc06c2ca35d4347c8b1770e9..3daa0c7d984d87c445f070832228bcde573f200f 100644 --- a/typo3/sysext/install/Tests/Unit/Service/CoreUpdateServiceTest.php +++ b/typo3/sysext/install/Tests/Unit/Service/CoreUpdateServiceTest.php @@ -1,5 +1,5 @@ <?php -namespace TYPO3\CMS\Install\Service; +namespace TYPO3\CMS\Install\Tests\Unit\Service; /* * This file is part of the TYPO3 CMS project. @@ -14,10 +14,12 @@ namespace TYPO3\CMS\Install\Service; * The TYPO3 project - inspiring people to share! */ +use TYPO3\TestingFramework\Core\Unit\UnitTestCase; + /** * Test case */ -class CoreUpdateServiceTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase +class CoreUpdateServiceTest extends UnitTestCase { /** * @test diff --git a/typo3/sysext/install/Tests/Unit/Service/CoreVersionServiceTest.php b/typo3/sysext/install/Tests/Unit/Service/CoreVersionServiceTest.php index 9996e92b9494846b8971871e5554f2da08485e21..e790f562089e5ff4713cfb4029023c03c24e56ba 100644 --- a/typo3/sysext/install/Tests/Unit/Service/CoreVersionServiceTest.php +++ b/typo3/sysext/install/Tests/Unit/Service/CoreVersionServiceTest.php @@ -1,5 +1,5 @@ <?php -namespace TYPO3\CMS\Install\Service; +namespace TYPO3\CMS\Install\Tests\Unit\Service; /* * This file is part of the TYPO3 CMS project. @@ -15,6 +15,7 @@ namespace TYPO3\CMS\Install\Service; */ use TYPO3\CMS\Core\Registry; +use TYPO3\CMS\Install\Service\CoreVersionService; use TYPO3\CMS\Install\Service\Exception\CoreVersionServiceException; /** diff --git a/typo3/sysext/install/Tests/Unit/Service/SilentConfigurationUpgradeServiceTest.php b/typo3/sysext/install/Tests/Unit/Service/SilentConfigurationUpgradeServiceTest.php index 2ff9168802bad6bd6d0877c2d71c6af1ce9f8207..19cfc2537895a7c45120422281c7a16a4cef2a5a 100644 --- a/typo3/sysext/install/Tests/Unit/Service/SilentConfigurationUpgradeServiceTest.php +++ b/typo3/sysext/install/Tests/Unit/Service/SilentConfigurationUpgradeServiceTest.php @@ -1,5 +1,5 @@ <?php -namespace TYPO3\CMS\Install\Service; +namespace TYPO3\CMS\Install\Tests\Unit\Service; /* * This file is part of the TYPO3 CMS project. @@ -19,6 +19,7 @@ use TYPO3\CMS\Core\Package\PackageManager; use TYPO3\CMS\Core\Tests\Unit\Utility\AccessibleProxies\ExtensionManagementUtilityAccessibleProxy; use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; use TYPO3\CMS\Install\Controller\Exception\RedirectException; +use TYPO3\CMS\Install\Service\SilentConfigurationUpgradeService; /** * Test case diff --git a/typo3/sysext/install/Tests/Unit/Service/Typo3tempFileServiceTest.php b/typo3/sysext/install/Tests/Unit/Service/Typo3tempFileServiceTest.php new file mode 100644 index 0000000000000000000000000000000000000000..4f14b75d0cc9f631dd460214dd351359b467eb17 --- /dev/null +++ b/typo3/sysext/install/Tests/Unit/Service/Typo3tempFileServiceTest.php @@ -0,0 +1,46 @@ +<?php +namespace TYPO3\CMS\Install\Tests\Unit\Service; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Install\Service\Typo3tempFileService; +use TYPO3\TestingFramework\Core\Unit\UnitTestCase; + +/** + * Test case + */ +class Typo3tempFileServiceTest extends UnitTestCase +{ + /** + * @test + */ + public function clearAssetsFolderThrowsWithInvalidPath() + { + $this->expectException(\RuntimeException::class); + $this->expectExceptionCode(1501781453); + $subject = new Typo3tempFileService(); + $subject->clearAssetsFolder('../foo'); + } + + /** + * @test + */ + public function clearAssetsFolderThrowsWithNotExistingPath() + { + $this->expectException(\RuntimeException::class); + $this->expectExceptionCode(1501781454); + $subject = new Typo3tempFileService(); + $subject->clearAssetsFolder('bar'); + } +} diff --git a/typo3/sysext/install/Tests/Unit/Status/AbstractStatusTest.php b/typo3/sysext/install/Tests/Unit/Status/AbstractStatusTest.php new file mode 100644 index 0000000000000000000000000000000000000000..41cca3951e1a61a4181e2d64c3b45554809fe7dd --- /dev/null +++ b/typo3/sysext/install/Tests/Unit/Status/AbstractStatusTest.php @@ -0,0 +1,50 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Install\Tests\Unit\Status; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Install\Status\AlertStatus; +use TYPO3\CMS\Install\Status\WarningStatus; +use TYPO3\TestingFramework\Core\Unit\UnitTestCase; + +/** + * Test case + */ +class AbstractStatusTest extends UnitTestCase +{ + /** + * @test + */ + public function getSeverityNumberReturnNumberForAlertStatus() + { + $this->assertEquals(2, (new AlertStatus())->getSeverityNumber()); + } + + /** + * @test + */ + public function jsonSerializeReturnsArrayForWarningStatus() + { + $status = new WarningStatus(); + $status->setTitle('aTitle'); + $status->setMessage('aMessage'); + $expected = [ + 'severity' => 1, + 'title' => 'aTitle', + 'status' => 'aMessage', + ]; + $this->assertEquals($expected, $status->jsonSerialize()); + } +} diff --git a/typo3/sysext/install/Tests/Unit/Status/StatusUtilityTest.php b/typo3/sysext/install/Tests/Unit/Status/StatusUtilityTest.php index 99561a9456c7ff27a038042df9b9f2c28fdff4f8..5a082412fcbf58debf6b45b15be949c9df318500 100644 --- a/typo3/sysext/install/Tests/Unit/Status/StatusUtilityTest.php +++ b/typo3/sysext/install/Tests/Unit/Status/StatusUtilityTest.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Tests\Unit\Status; /* @@ -14,41 +15,37 @@ namespace TYPO3\CMS\Install\Tests\Unit\Status; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Install\Status\ErrorStatus; use TYPO3\CMS\Install\Status\Exception; +use TYPO3\CMS\Install\Status\InfoStatus; +use TYPO3\CMS\Install\Status\NoticeStatus; +use TYPO3\CMS\Install\Status\OkStatus; use TYPO3\CMS\Install\Status\StatusUtility; +use TYPO3\CMS\Install\Status\WarningStatus; +use TYPO3\TestingFramework\Core\Unit\UnitTestCase; /** * Test case */ -class StatusUtilityTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase +class StatusUtilityTest extends UnitTestCase { /** * @test */ public function sortBySeveritySortsGivenStatusObjects() { - $errorMock = $this->getMockBuilder(\TYPO3\CMS\Install\Status\ErrorStatus::class) - ->setMethods(['dummy']) - ->getMock(); - $warningMock = $this->getMockBuilder(\TYPO3\CMS\Install\Status\WarningStatus::class) - ->setMethods(['dummy']) - ->getMock(); - $okMock = $this->getMockBuilder(\TYPO3\CMS\Install\Status\OkStatus::class) - ->setMethods(['dummy']) - ->getMock(); - $infoMock = $this->getMockBuilder(\TYPO3\CMS\Install\Status\InfoStatus::class) - ->setMethods(['dummy']) - ->getMock(); - $noticeMock = $this->getMockBuilder(\TYPO3\CMS\Install\Status\NoticeStatus::class) - ->setMethods(['dummy']) - ->getMock(); + $errorStatus = new ErrorStatus(); + $warningStatus = new WarningStatus(); + $okStatus = new OkStatus(); + $infoStatus = new InfoStatus(); + $noticeStatus = new NoticeStatus(); $statusUtility = new StatusUtility(); - $return = $statusUtility->sortBySeverity([$noticeMock, $infoMock, $okMock, $warningMock, $errorMock]); - $this->assertSame([$errorMock], $return['error']); - $this->assertSame([$warningMock], $return['warning']); - $this->assertSame([$okMock], $return['ok']); - $this->assertSame([$infoMock], $return['information']); - $this->assertSame([$noticeMock], $return['notice']); + $return = $statusUtility->sortBySeverity([$noticeStatus, $infoStatus, $okStatus, $warningStatus, $errorStatus]); + $this->assertSame([$errorStatus], $return['error']); + $this->assertSame([$warningStatus], $return['warning']); + $this->assertSame([$okStatus], $return['ok']); + $this->assertSame([$infoStatus], $return['information']); + $this->assertSame([$noticeStatus], $return['notice']); } /** @@ -67,14 +64,10 @@ class StatusUtilityTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase */ public function filterBySeverityReturnsSpecificSeverityOnly() { - $errorMock = $this->getMockBuilder(\TYPO3\CMS\Install\Status\ErrorStatus::class) - ->setMethods(['dummy']) - ->getMock(); - $warningMock = $this->getMockBuilder(\TYPO3\CMS\Install\Status\WarningStatus::class) - ->setMethods(['dummy']) - ->getMock(); + $errorStatus = new ErrorStatus(); + $warningStatus = new WarningStatus(); $statusUtility = new StatusUtility(); - $return = $statusUtility->filterBySeverity([$errorMock, $warningMock], 'error'); - $this->assertSame([$errorMock], $return); + $return = $statusUtility->filterBySeverity([$errorStatus, $warningStatus], 'error'); + $this->assertSame([$errorStatus], $return); } } diff --git a/typo3/sysext/install/Tests/Unit/View/JsonViewTest.php b/typo3/sysext/install/Tests/Unit/View/JsonViewTest.php index 13b83ea4a662f488112aaa9957dafdde5d6fc7ae..dfe56683a3561ddd68de375151c28805820bad02 100644 --- a/typo3/sysext/install/Tests/Unit/View/JsonViewTest.php +++ b/typo3/sysext/install/Tests/Unit/View/JsonViewTest.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace TYPO3\CMS\Install\Tests\Unit\View; /* @@ -14,46 +15,21 @@ namespace TYPO3\CMS\Install\Tests\Unit\View; * The TYPO3 project - inspiring people to share! */ -use TYPO3\CMS\Install\Status\Exception; +use TYPO3\CMS\Install\View\JsonView; +use TYPO3\TestingFramework\Core\Unit\UnitTestCase; /** * Tests for the custom json view class */ -class JsonViewTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase +class JsonViewTest extends UnitTestCase { /** * @test */ - public function transformStatusArrayToArrayReturnsArray() + public function renderReturnsAssignedVariablesAsArray() { - $jsonView = $this->getAccessibleMock(\TYPO3\CMS\Install\View\JsonView::class, ['dummy']); - $this->assertInternalType('array', $jsonView->_call('transformStatusMessagesToArray')); - } - - /** - * @test - */ - public function transformStatusArrayToArrayThrowsExceptionIfArrayContainsNotAMessageInterfaceMessage() - { - $this->expectException(Exception::class); - $this->expectExceptionCode(1381059600); - $jsonView = $this->getAccessibleMock(\TYPO3\CMS\Install\View\JsonView::class, ['dummy']); - $jsonView->_call('transformStatusMessagesToArray', ['foo']); - } - - /** - * @test - */ - public function transformStatusToArrayCreatesArrayFromStatusMessage() - { - $status = $this->createMock(\TYPO3\CMS\Install\Status\StatusInterface::class); - $status->expects($this->once())->method('getSeverity')->will($this->returnValue(-2)); - $status->expects($this->once())->method('getTitle')->will($this->returnValue('aTitle')); - $status->expects($this->once())->method('getMessage')->will($this->returnValue('aMessage')); - $jsonView = $this->getAccessibleMock(\TYPO3\CMS\Install\View\JsonView::class, ['dummy']); - $return = $jsonView->_call('transformStatusToArray', $status); - $this->assertSame(-2, $return['severity']); - $this->assertSame('aTitle', $return['title']); - $this->assertSame('aMessage', $return['message']); + $jsonView = new JsonView(); + $jsonView->assign('foo', 'bar'); + $this->assertEquals(['foo' => 'bar'], $jsonView->render()); } } diff --git a/typo3/sysext/install/composer.json b/typo3/sysext/install/composer.json index 6f7b9e38bb1352a27c5f39ae83fad469a4d4337d..8f7e243ad4b0dfdc8c229154636b5c6949fa6ded 100644 --- a/typo3/sysext/install/composer.json +++ b/typo3/sysext/install/composer.json @@ -14,7 +14,8 @@ "typo3/cms-core": ">=9.0.0 <=9.0.99", "typo3/cms-extbase": ">=9.0.0 <=9.0.99", "typo3/cms-fluid": ">=9.0.0 <=9.0.99", - "nikic/php-parser": "~3.0.6" + "nikic/php-parser": "~3.0.6", + "symfony/finder": "^2.7 || ^3.0" }, "conflict": { "typo3/cms": "*" diff --git a/typo3/sysext/install/ext_localconf.php b/typo3/sysext/install/ext_localconf.php index 4b259f706c602f69a99c222c8d68daeedc866727..018a5855bd2e51d9433a76e8a520cf93e5c3200a 100644 --- a/typo3/sysext/install/ext_localconf.php +++ b/typo3/sysext/install/ext_localconf.php @@ -57,3 +57,19 @@ $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update']['typo3DbLegac = \TYPO3\CMS\Install\Updates\Typo3DbExtractionUpdate::class; $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update']['funcExtension'] = \TYPO3\CMS\Install\Updates\FuncExtractionUpdate::class; + +$iconRegistry = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Imaging\IconRegistry::class); +$icons = [ + 'module-install-environment' => 'EXT:install/Resources/Public/Icons/module-install-environment.svg', + 'module-install-maintenance' => 'EXT:install/Resources/Public/Icons/module-install-maintenance.svg', + 'module-install-settings' => 'EXT:install/Resources/Public/Icons/module-install-settings.svg', + 'module-install-upgrade' => 'EXT:install/Resources/Public/Icons/module-install-upgrade.svg', +]; + +foreach ($icons as $iconIdentifier => $source) { + $iconRegistry->registerIcon( + $iconIdentifier, + \TYPO3\CMS\Core\Imaging\IconProvider\SvgIconProvider::class, + ['source' => $source] + ); +} diff --git a/typo3/sysext/install/ext_tables.php b/typo3/sysext/install/ext_tables.php index 5fef66943327ca50ee764a7309bcd59ee29d812b..74826beacf67ee38106a232cf770842c7a47b6dc 100644 --- a/typo3/sysext/install/ext_tables.php +++ b/typo3/sysext/install/ext_tables.php @@ -12,16 +12,75 @@ if (TYPO3_MODE === 'BE') { } \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addModule( - 'system', - 'extinstall', + 'tools', + 'toolsmaintenance', '', '', [ 'routeTarget' => \TYPO3\CMS\Install\Controller\BackendModuleController::class . '::index', + 'routeParameters' => [ + 'install' => [ + 'action' => 'maintenance' + ] + ], 'access' => 'admin', - 'name' => 'system_extinstall', - 'icon' => 'EXT:install/Resources/Public/Icons/module-install.svg', - 'labels' => 'LLL:EXT:install/Resources/Private/Language/BackendModule.xlf' + 'name' => 'tools_toolsmaintenance', + 'iconIdentifier' => 'module-install-maintenance', + 'labels' => 'LLL:EXT:install/Resources/Private/Language/ModuleInstallMaintenance.xlf' + ] + ); + \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addModule( + 'tools', + 'toolssettings', + '', + '', + [ + 'routeTarget' => \TYPO3\CMS\Install\Controller\BackendModuleController::class . '::index', + 'routeParameters' => [ + 'install' => [ + 'action' => 'settings' + ] + ], + 'access' => 'admin', + 'name' => 'tools_toolssettings', + 'iconIdentifier' => 'module-install-settings', + 'labels' => 'LLL:EXT:install/Resources/Private/Language/ModuleInstallSettings.xlf' + ] + ); + \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addModule( + 'tools', + 'toolsupgrade', + '', + '', + [ + 'routeTarget' => \TYPO3\CMS\Install\Controller\BackendModuleController::class . '::index', + 'routeParameters' => [ + 'install' => [ + 'action' => 'upgrade' + ] + ], + 'access' => 'admin', + 'name' => 'tools_toolsupgrade', + 'iconIdentifier' => 'module-install-upgrade', + 'labels' => 'LLL:EXT:install/Resources/Private/Language/ModuleInstallUpgrade.xlf' + ] + ); + \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addModule( + 'tools', + 'toolsenvironment', + '', + '', + [ + 'routeTarget' => \TYPO3\CMS\Install\Controller\BackendModuleController::class . '::index', + 'routeParameters' => [ + 'install' => [ + 'action' => 'environment' + ] + ], + 'access' => 'admin', + 'name' => 'tools_toolsenvironment', + 'iconIdentifier' => 'module-install-environment', + 'labels' => 'LLL:EXT:install/Resources/Private/Language/ModuleInstallEnvironment.xlf' ] ); }