#!/usr/bin/env php doctum-5.4.1.pharTa:8:{s:7:"vcs.git";s:38:"https://github.com/code-lts/doctum.git";s:11:"vcs.browser";s:34:"https://github.com/code-lts/doctum";s:7:"vcs.ref";s:40:"aba1c342d817fb06725dfe8909ca601d5cb3b47e";s:7:"version";s:5:"5.4.1";s:10:"build-date";s:25:"2021-04-22T01:52:41+02:00";s:7:"license";s:3:"MIT";s:6:"vendor";s:6:"Doctum";s:4:"name";s:6:"Doctum";} locale/en.moɺ`U0 locale/fr.mo ɺ` lM{src/Store/StoreInterface.phpɺ`֊src/Store/JsonStore.php[ɺ`[hsrc/Store/ArrayStore.php ɺ` !$src/Version/GitVersionCollection.phplɺ`lfBq'src/Version/SingleVersionCollection.phpɺ` src/Version/Version.phpɺ`#JN!src/Version/VersionCollection.php ɺ` ?`src/Message.phplɺ`lt´src/Project.phppXɺ`pX(=src/Indexer.phpɺ`y1r%src/Reflection/FunctionReflection.phpLɺ`L~ʻ+#src/Reflection/MethodReflection.phpaɺ`a^ G&src/Reflection/LazyClassReflection.phpuɺ`u&src/Reflection/ParameterReflection.php}ɺ`},Yڴsrc/Reflection/Reflection.php)ɺ`)0`M%src/Reflection/ConstantReflection.phpɺ`} "src/Reflection/ClassReflection.php&9ɺ`&9n[d%src/Reflection/PropertyReflection.phpo ɺ`o Aʴ!src/Reflection/HintReflection.phpɺ`lW%src/Console/Command/RenderCommand.phpɺ`!g3$src/Console/Command/ParseCommand.phpɺ`ԝsrc/Console/Command/Command.phpN;ɺ`N;ϰ$&src/Console/Command/VersionCommand.php?ɺ`?9E %src/Console/Command/UpdateCommand.phpqɺ`qbsrc/Console/Application.php@ɺ`@w src/Tree.php ɺ` Lsrc/Renderer/ThemeSet.php ɺ` Nsrc/Renderer/TwigExtension.php"ɺ`"=Xsrc/Renderer/Index.phpkɺ`kV_Ĵsrc/Renderer/Theme.phpɺ`src/Renderer/Diff.phpX ɺ`X #貇src/Renderer/Renderer.php)ɺ`)ydsrc/ErrorHandler.phpɺ`H6src/Parser/ParseError.php+ɺ`+]src/Parser/ParserContext.phpLɺ`L*$src/Parser/ClassVisitorInterface.phpɺ`s src/Parser/Node/DocBlockNode.php ɺ` zZsrc/Parser/CodeParser.phpAɺ`AJ`ȴsrc/Parser/DocBlockParser.phpɺ`Nw)src/Parser/NodeVisitor.phpbɺ`b=src/Parser/Parser.phpɺ`9Jsrc/Parser/ClassTraverser.phpɺ`mj.src/Parser/ClassVisitor/MethodClassVisitor.php(ɺ`(ڕ#0src/Parser/ClassVisitor/PropertyClassVisitor.php/ ɺ`/ j2src/Parser/ClassVisitor/ViewSourceClassVisitor.phpɺ`7q2src/Parser/ClassVisitor/InheritdocClassVisitor.phpN ɺ`N xcVsrc/Parser/Transaction.php_ɺ`_5g|`#src/Parser/Filter/DefaultFilter.php~ɺ`~LF%src/Parser/Filter/FilterInterface.phpnɺ`n src/Parser/Filter/TrueFilter.phpɺ`m´"src/Parser/Filter/PublicFilter.phpyɺ`yd/src/RemoteRepository/GitLabRemoteRepository.phpvɺ`ve/src/RemoteRepository/GitHubRemoteRepository.phpɺ`k2src/RemoteRepository/BitBucketRemoteRepository.phpɺ`=z1src/RemoteRepository/AbstractRemoteRepository.php-ɺ`-)xsrc/Doctum.php9ɺ`9 A^-src/Resources/themes/default/fonts/doctum.ttfLɺ`Lٴ.src/Resources/themes/default/fonts/doctum.woff4 ɺ`4 J-src/Resources/themes/default/fonts/doctum.svgfɺ`fgi/src/Resources/themes/default/fonts/doctum.woff2ɺ`.-src/Resources/themes/default/fonts/doctum.eotɺ`=CW22src/Resources/themes/default/fonts/doctum-font.cssɺ`t,src/Resources/themes/default/interfaces.twigaɺ`a+(src/Resources/themes/default/traits.twig ɺ` }5)src/Resources/themes/default/manifest.ymlɺ` t'src/Resources/themes/default/index.twigɺ`}+src/Resources/themes/default/doctum.js.twigM*ɺ`M*,e6,src/Resources/themes/default/namespaces.twigɺ`8+src/Resources/themes/default/doc-index.twigɺ`e'src/Resources/themes/default/class.twig-ɺ`-a(src/Resources/themes/default/search.twigP ɺ`P t+src/Resources/themes/default/namespace.twig ɺ` T(src/Resources/themes/default/macros.twigIɺ`IX)src/Resources/themes/default/classes.twigYɺ`Y`/src/Resources/themes/default/layout/layout.twig ɺ` ;-src/Resources/themes/default/layout/base.twigɺ`z,src/Resources/themes/default/opensearch.twigɺ` Ҵ8src/Resources/themes/default/css/bootstrap-theme.min.css<^ɺ`<^+82src/Resources/themes/default/css/bootstrap.min.cssVɺ`VsJ+src/Resources/themes/default/css/doctum.css`ɺ``ES.src/Resources/themes/default/css/bootstrap.cssɺ`8y4src/Resources/themes/default/css/bootstrap-theme.cssdɺ`dY40src/Resources/themes/default/js/bootstrap.min.jspɺ`p&δ8src/Resources/themes/default/js/jquery-3.5.1.slim.min.jsɺ`6;0src/Resources/themes/default/js/typeahead.min.jssɺ`s.,src/Resources/themes/default/js/bootstrap.js'ɺ`'A>ϴbin/doctum-binary.phpɺ`rbin/doctum.php\ɺ`\y2vendor/nikic/php-parser/grammar/rebuildParsers.php ɺ` &vendor/nikic/php-parser/grammar/php7.yɺ`(vendor/nikic/php-parser/grammar/tokens.y ɺ` v/vendor/nikic/php-parser/grammar/tokens.template*ɺ`*_ִ/vendor/nikic/php-parser/grammar/parser.template ɺ` -ɚQ&vendor/nikic/php-parser/grammar/php5.yɺ`_(A.vendor/nikic/php-parser/lib/PhpParser/Node.phpɺ`NmFvendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.phpVɺ`Vo 55vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php/ ɺ`/ ?%C<vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php#ɺ`#>~(@vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php9ɺ`91vendor/nikic/php-parser/lib/PhpParser/Builder.phpɺ`m6vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.phpɺ`<<Avendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.phppɺ`pz|?vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.phpjɺ`jgH[4vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php\ɺ`\N3vendor/nikic/php-parser/lib/PhpParser/Node/Expr.phpɺ`9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.phpɺ`C:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.phpɺ`Xv<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php ɺ` 7:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.phpc ɺ`c #1E7vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php-ɺ`-+9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.phpWɺ`WU<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.phpɺ`Yk>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.phpɺ`Yv>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.phpɺ`I˴8vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.phpXɺ`XFvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php ɺ` !LZ:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.phpEɺ`EdDvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.phpɺ`_w<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.phpqɺ`qY!?vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.phpHɺ`Hs v8vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php)ɺ`)je>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.phpɺ`ٝ+=vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php ɺ` #;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php4ɺ`4q^kBvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.phpɺ`*#9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.phpɺ`ׂ;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.phpɺ`e=vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.phpɺ`/bTS7vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php%ɺ`%i4&9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.phpɺ`Ia;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.phpɺ`exд<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.phpɺ`G,%:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.phpɺ`h<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.phpɺ`h|;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.phpɺ`W;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php ɺ` ش=vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.phpm ɺ`m [1:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.phpiɺ`i_g><vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php ɺ` od9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.phpɺ`RR>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php ɺ` v⠴=vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.phpɺ`HW :vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php0ɺ`0]u:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.phpɺ`wתƴ:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.phpɺ`ɤ<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.phpYɺ`Y&@vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.phpɺ`F>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.phpɺ`9Qvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.phpEɺ`EzLvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php,ɺ`,9=67vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php-ɺ`-u:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.phpɺ``sBvendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.phpɺ`aXϴ<vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.phpɺ`)FCs4vendor/nikic/php-parser/lib/PhpParser/Node/Param.phpɺ`գ5vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.phpbɺ`bf3vendor/nikic/php-parser/lib/PhpParser/Node/Name.php$ɺ`$vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.phpɺ`OsL=vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php6ɺ`6>P=vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.phpɺ` `Gvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.phpAɺ`AdGvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.phpAɺ`ATzGvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.phpCɺ`C~OJvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.phpJɺ`J(deEvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php=ɺ`= gDvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php:ɺ`:!qpKvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.phpMɺ`MuEvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php=ɺ`=i ?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.phpDɺ`DEm>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.phpɺ` 8vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php+ɺ`+xw>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.phpgɺ`g4}>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.phpɺ`ZF'<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.phpɺ`9̓=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php]ɺ`])^Cvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.phpɺ`@-t@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.phpɺ`FHbFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.phpɺ`8@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.phpɺ`KִFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.phpɺ`W!Bvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.phpɺ`a@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.phpɺ`MGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.phpɺ`F%Avendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.phpɺ`k@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.phpɺ`eдGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.phpɺ`4)̴Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.phpɺ`ZEvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.phpɺ`wy;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.phpyɺ`yukd<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.phpZɺ`ZTZ<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.phpɺ`>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.phpɺ`F<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.phpUɺ`Uh$ :vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.phpzɺ`zu\д:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.phpyɺ`yرִAvendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.phpɺ`-Ĵ:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.phpɺ`$2;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.phpz ɺ`z [2:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.phpGɺ`G9vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.phpvɺ`v }Cvendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.phpɺ`3:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.phpɺ`JيIvendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.phpɺ`>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.phpɺ`SC=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.phpɺ`*^uDvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php7ɺ`7 ޯGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php?ɺ`?cCvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php5ɺ`5ҔڧFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php<ɺ`<!G@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php/ɺ`/Fvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php<ɺ`<@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php/ɺ`/}bzFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php;ɺ`;Bvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php4ɺ`4}uzGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php>ɺ`>.JoBvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php3ɺ`3[J@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php/ɺ`/ Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php=ɺ`= ´Fvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php=ɺ`={Avendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php1ɺ`1Ӏ/Evendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php:ɺ`:ӴFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php<ɺ`<0t޴@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php0ɺ`0jHKvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.phpFɺ`Fa)Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php?ɺ`?{δIvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.phpCɺ`CGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php=ɺ`=&Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php>ɺ`> Evendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php:ɺ`:oRմDvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php7ɺ`7xKvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.phpFɺ`F0Fvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php=ɺ`=Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.phpɺ`v:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.phpɺ` 5:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.phpvɺ`vLFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.phpɺ`h-9vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.phpɺ`GӴAvendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php8ɺ`8_ȴ:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.phpyɺ`yz5ܴ=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.phpɺ`?:Avendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.phpj ɺ`j E:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.phpɺ`Fas:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.phprɺ`r>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.phpqɺ`q9vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.phpɺ`+,1<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.phpɺ` =vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.phpɺ`, ;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.phpyɺ`yHuJ/Avendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.phpɺ` 6ô9vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.phpɺ`F*:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.phpvɺ`v[;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.phpɺ`6>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.phpɺ` ໴=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.phpɺ`uh ?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php}ɺ`}pn@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.phpɺ`?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.phpɺ`g,Gd@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.phpɺ`?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.phpɺ`2=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php3ɺ`3si8vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.phpɺ`SR>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.phplɺ`lxF7vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.phpɺ`/m9vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.phpɺ`!$;vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.phpɺ`ش8vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php(ɺ`(Oi;vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.phpɺ`S5$D2vendor/nikic/php-parser/lib/PhpParser/Node/Arg.phpɺ`;vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php,ɺ`,jF9vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php:ɺ`:_>vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.phpK#ɺ`K#Y߳Lvendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php7ɺ`7 C/vendor/nikic/php-parser/lib/PhpParser/Lexer.phpiXɺ`iXͦe7vendor/nikic/php-parser/lib/PhpParser/ParserFactory.phpNɺ`Nup5vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.phpɺ`ZMʹ8vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.phpɺ`T@B:vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php ɺ` I8vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.phpN ɺ`N FÛ8vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php ɺ` Db6vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.phpɺ`ˣ7vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php ɺ` }?ȴDvendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.phpXɺ`Xz=vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.phpɺ`F<vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.phpɺ`!;vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.phpɺ`3`m:vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php%ɺ`%jB<vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.phpɺ`b!>vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.phpHɺ`H;5vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.phpgɺ`gѴ4vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php ɺ` 8MH?vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.phpɺ`sKvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.phppɺ`p1Dvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.phpɺ`zaDvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.phpbɺ`bhłIvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.phpɺ`zJBBvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php#ɺ`#<Mvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.phpaɺ`a7vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php`)ɺ``)<-Av@vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.phpuɺ`u}Ŵ8vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php#ɺ`#K0vendor/nikic/php-parser/lib/PhpParser/Parser.phptɺ`tTﺴ1vendor/nikic/php-parser/lib/PhpParser/Comment.phpzɺ`z]5+/vendor/nikic/php-parser/lib/PhpParser/Error.phpɺ`#6vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php&ɺ`&E7vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.phpxɺ`x5vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.phpe|ɺ`e|#Z &5vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php\ɺ`\ ?J9vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.phptɺ`tO8vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php%ɺ`%s,Pvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.phpɺ`]vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.phpFɺ`F5ZKvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.phpgɺ`gOcMvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.phpɺ`yOvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.phpɺ`ܴWvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php#ɺ`#EJsMvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.phpɺ` Wvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.phpW ɺ`W .nMvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.phpɺ`2WSvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.phpɺ`;.6$9vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php!ɺ`!t5vendor/nikic/php-parser/lib/PhpParser/NameContext.php&ɺ`&l8vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.phpVɺ`VZf=vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.phpɺ`Xvendor/nikic/php-parser/LICENSEɺ`*vendor/composer/installed.phpwɺ`w%.%vendor/composer/InstalledVersions.phpg)ɺ`g)"c#vendor/composer/autoload_static.php5ɺ`5R'vendor/composer/autoload_namespaces.phpɺ`u!vendor/composer/installed.jsonOɺ`ORi"vendor/composer/platform_check.phpɺ`*aC!vendor/composer/autoload_psr4.php)ɺ`)4"g!vendor/composer/autoload_real.php ɺ` %vendor/composer/autoload_classmap.php*ɺ`*ivendor/composer/LICENSE.ɺ`. "vendor/composer/autoload_files.phpɺ`K>/vendor/composer/ClassLoader.php8ɺ`8l=-'vendor/symfony/polyfill-php73/Php73.phpbɺ`bJ<+vendor/symfony/polyfill-php73/bootstrap.phpɺ`|%vendor/symfony/polyfill-php73/LICENSE)ɺ`)`e0?vendor/symfony/polyfill-php73/Resources/stubs/JsonException.phpɺ`ɺ`>Y4vendor/symfony/console/Formatter/OutputFormatter.phpɺ` 9vendor/symfony/console/Formatter/OutputFormatterStyle.phpP ɺ`P pbdBvendor/symfony/console/Formatter/OutputFormatterStyleInterface.phpZɺ`Zs>vendor/symfony/console/Formatter/OutputFormatterStyleStack.php ɺ` ;2=vendor/symfony/console/CommandLoader/FactoryCommandLoader.phpEɺ`E=H?vendor/symfony/console/CommandLoader/CommandLoaderInterface.phpjɺ`jw?vendor/symfony/console/CommandLoader/ContainerCommandLoader.phpɺ`0w3vendor/symfony/console/Tester/ApplicationTester.phpɺ`C-vendor/symfony/console/Tester/TesterTrait.phpoɺ`o/vendor/symfony/console/Tester/CommandTester.phpg ɺ`g x3 Dvendor/symfony/console/DependencyInjection/AddConsoleCommandPass.phpɺ`D0vendor/symfony/console/Command/LockableTrait.phpɺ`ܫǒ*vendor/symfony/console/Command/Command.phpJɺ`J$V=vendor/symfony/console/Command/SignalableCommandInterface.phpɺ`GeM.vendor/symfony/console/Command/ListCommand.phpɺ`Fs.vendor/symfony/console/Command/HelpCommand.phpI ɺ`I 0vendor/symfony/console/Output/BufferedOutput.phpUɺ`UBE$޴1vendor/symfony/console/Output/OutputInterface.php ɺ` L5vendor/symfony/console/Output/TrimmedBufferOutput.phpQɺ`Q٬./vendor/symfony/console/Output/ConsoleOutput.phpɺ`CX6vendor/symfony/console/Output/ConsoleSectionOutput.phpFɺ`FH :8vendor/symfony/console/Output/ConsoleOutputInterface.php ɺ` _,vendor/symfony/console/Output/NullOutput.php ɺ` д.vendor/symfony/console/Output/StreamOutput.php ɺ` BM(vendor/symfony/console/Output/Output.phpLɺ`LJ&vendor/symfony/console/Application.phpxɺ`x7޴-vendor/symfony/console/Style/SymfonyStyle.php8ɺ`8$ȴ/vendor/symfony/console/Style/StyleInterface.phpN ɺ`N Ǽ1,vendor/symfony/console/Style/OutputStyle.php ɺ` 8vendor/symfony/console/SignalRegistry/SignalRegistry.php0ɺ`06p[0vendor/symfony/console/Helper/TableCellStyle.phpɺ`X'vendor/symfony/console/Helper/Table.php1nɺ`1n}+vendor/symfony/console/Helper/HelperSet.phpɺ` O!0vendor/symfony/console/Helper/TableSeparator.phpɺ`& 2vendor/symfony/console/Helper/InputAwareHelper.phpɺ`(vendor/symfony/console/Helper/Dumper.phpɺ`+'f/vendor/symfony/console/Helper/ProcessHelper.phpɺ`J^2vendor/symfony/console/Helper/DescriptorHelper.phpX ɺ`X W-vendor/symfony/console/Helper/ProgressBar.phpFɺ`FW38,vendor/symfony/console/Helper/TableStyle.php0ɺ`0@/+vendor/symfony/console/Helper/TableRows.phpUɺ`U$1vendor/symfony/console/Helper/FormatterHelper.php ɺ` r1vendor/symfony/console/Helper/HelperInterface.phppɺ`pn0vendor/symfony/console/Helper/QuestionHelper.php0Hɺ`0H(A(vendor/symfony/console/Helper/Helper.phpɺ`Qд6vendor/symfony/console/Helper/DebugFormatterHelper.phpG ɺ`G a7vendor/symfony/console/Helper/SymfonyQuestionHelper.php ɺ` *-3vendor/symfony/console/Helper/ProgressIndicator.phpɺ`+vendor/symfony/console/Helper/TableCell.phpɺ`.6vendor/symfony/console/EventListener/ErrorListener.php ɺ` \q%;0vendor/symfony/console/Descriptor/Descriptor.php/ ɺ`/ Mg޴4vendor/symfony/console/Descriptor/JsonDescriptor.php3ɺ`3~V<vendor/symfony/console/Descriptor/ApplicationDescription.phpɺ`Wf(9vendor/symfony/console/Descriptor/DescriptorInterface.phpɺ`PZ4vendor/symfony/console/Descriptor/TextDescriptor.php0ɺ`0.8vendor/symfony/console/Descriptor/MarkdownDescriptor.phpɺ`93vendor/symfony/console/Descriptor/XmlDescriptor.php"ɺ`"!`?vendor/symfony/console/Exception/NamespaceNotFoundException.phpɺ`BLH7vendor/symfony/console/Exception/ExceptionInterface.phpɺ`l:vendor/symfony/console/Exception/MissingInputException.phpɺ`Qg;3vendor/symfony/console/Exception/LogicException.phpɺ`SML=vendor/symfony/console/Exception/CommandNotFoundException.phpɺ`R;vendor/symfony/console/Exception/InvalidOptionException.phpɺ`;5vendor/symfony/console/Exception/RuntimeException.phpɺ`*b=vendor/symfony/console/Exception/InvalidArgumentException.phpɺ`u i!vendor/symfony/console/Cursor.php)ɺ`)i.vendor/symfony/console/LICENSE)ɺ`) #vendor/symfony/console/Terminal.phpɺ`Zш4vendor/symfony/console/Resources/bin/hiddeninput.exe$ɺ`$vvendor/symfony/finder/Glob.php$ɺ`$tڴ:vendor/symfony/finder/Iterator/SizeRangeFilterIterator.phpɺ`=̴Avendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php ɺ` za5vendor/symfony/finder/Iterator/PathFilterIterator.phpɺ`2=vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php ɺ` g=vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.phpQɺ`Q|@u9vendor/symfony/finder/Iterator/FileTypeFilterIterator.phpQɺ`Q+f:vendor/symfony/finder/Iterator/DateRangeFilterIterator.phpɺ`)<vendor/symfony/finder/Iterator/FilecontentFilterIterator.phpɺ`,/vendor/symfony/finder/Iterator/LazyIterator.phpɺ`ّ3vendor/symfony/finder/Iterator/SortableIterator.phpɺ`]H7vendor/symfony/finder/Iterator/CustomFilterIterator.phpɺ`d)9vendor/symfony/finder/Iterator/FilenameFilterIterator.phpɺ`4 ;vendor/symfony/finder/Iterator/DepthRangeFilterIterator.phpɺ`մ vendor/symfony/finder/Finder.phpYɺ`Y[A5vendor/symfony/finder/Comparator/NumberComparator.php ɺ` /vendor/symfony/finder/Comparator/Comparator.php}ɺ`}u3vendor/symfony/finder/Comparator/DateComparator.phpɺ` |%vendor/symfony/finder/SplFileInfo.phpɺ`b#vendor/symfony/finder/Gitignore.phpɺ`\ɴ>vendor/symfony/finder/Exception/DirectoryNotFoundException.phpɺ`RI9vendor/symfony/finder/Exception/AccessDeniedException.phpɺ`cW޴vendor/symfony/finder/LICENSE)ɺ`) -vendor/symfony/polyfill-mbstring/Mbstring.phpYqɺ`Yq=Ws.vendor/symfony/polyfill-mbstring/bootstrap.php.ɺ`.6մ0vendor/symfony/polyfill-mbstring/bootstrap80.phpB"ɺ`B"cP!(vendor/symfony/polyfill-mbstring/LICENSE)ɺ`)\@vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php_ɺ`_ZFvendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php9ɺ`9>|zK@vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php`ɺ``S+vendor/symfony/polyfill-php80/bootstrap.phpɺ`(`'vendor/symfony/polyfill-php80/Php80.php2 ɺ`2 M D%vendor/symfony/polyfill-php80/LICENSE$ɺ`$LO! Evendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php3ɺ`3y4%<vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php*ɺ`**<vendor/symfony/polyfill-php80/Resources/stubs/Stringable.phpɺ`9;vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php ɺ` &ڃ'vendor/symfony/polyfill-ctype/Ctype.php}ɺ`}\谴+vendor/symfony/polyfill-ctype/bootstrap.php@ɺ`@jQ9-vendor/symfony/polyfill-ctype/bootstrap80.phprɺ`rF)%vendor/symfony/polyfill-ctype/LICENSE)ɺ`)`e0?vendor/symfony/service-contracts/ServiceSubscriberInterface.phpɺ`B6=vendor/symfony/service-contracts/ServiceProviderInterface.phpɺ`mX´7vendor/symfony/service-contracts/Attribute/Required.phpɺ`e;Z3vendor/symfony/service-contracts/ResetInterface.phpɺ`v<vendor/symfony/service-contracts/Test/ServiceLocatorTest.php[ ɺ`[ q)6;vendor/symfony/service-contracts/ServiceSubscriberTrait.phpGɺ`Gش8vendor/symfony/service-contracts/ServiceLocatorTrait.phpɺ`za (vendor/symfony/service-contracts/LICENSE)ɺ`)Ǩ7/vendor/symfony/process/Pipes/PipesInterface.phpɺ`*vendor/symfony/process/Pipes/UnixPipes.php?ɺ`?L-vendor/symfony/process/Pipes/WindowsPipes.phpɺ`ܖ.vendor/symfony/process/Pipes/AbstractPipes.phpɺ`YcA%vendor/symfony/process/PhpProcess.php ɺ` R&vendor/symfony/process/InputStream.php ɺ` $fô.vendor/symfony/process/PhpExecutableFinder.php ɺ` X7vendor/symfony/process/Exception/ExceptionInterface.phpɺ`+=vendor/symfony/process/Exception/ProcessSignaledException.phpɺ`3vendor/symfony/process/Exception/LogicException.phpɺ`W;vendor/symfony/process/Exception/ProcessFailedException.phpɺ`P5=vendor/symfony/process/Exception/ProcessTimedOutException.phpɺ`{05vendor/symfony/process/Exception/RuntimeException.phpɺ`>H=vendor/symfony/process/Exception/InvalidArgumentException.phpɺ`˅vendor/symfony/process/LICENSE)ɺ`) 'vendor/symfony/process/ProcessUtils.phpMɺ`M|%"vendor/symfony/process/Process.phpɺ`oӴ+vendor/symfony/process/ExecutableFinder.php ɺ` km:1vendor/symfony/deprecation-contracts/function.phpɺ`rg,vendor/symfony/deprecation-contracts/LICENSE)ɺ`)8½2vendor/symfony/polyfill-intl-grapheme/Grapheme.php#ɺ`#wo3vendor/symfony/polyfill-intl-grapheme/bootstrap.phpɺ`5vendor/symfony/polyfill-intl-grapheme/bootstrap80.phpm ɺ`m Z-vendor/symfony/polyfill-intl-grapheme/LICENSE)ɺ`)\/vendor/symfony/string/AbstractUnicodeString.phpfɺ`f0]"4vendor/symfony/string/Inflector/EnglishInflector.php:ɺ`:? 6vendor/symfony/string/Inflector/InflectorInterface.phpɺ`763vendor/symfony/string/Inflector/FrenchInflector.phpɺ` i)vendor/symfony/string/CodePointString.php{ɺ`{n^t(vendor/symfony/string/AbstractString.phpGɺ`G"g'vendor/symfony/string/UnicodeString.phpC2ɺ`C2j8$vendor/symfony/string/ByteString.php;ɺ`;M-ִ$vendor/symfony/string/LazyString.php)ɺ`)I!6vendor/symfony/string/Exception/ExceptionInterface.phpQɺ`Q$մ4vendor/symfony/string/Exception/RuntimeException.phppɺ`p0ʴ<vendor/symfony/string/Exception/InvalidArgumentException.phpɺ`evendor/symfony/string/LICENSE)ɺ`)m,c.vendor/symfony/string/Slugger/AsciiSlugger.phpɺ`0=2vendor/symfony/string/Slugger/SluggerInterface.phpɺ`"O-vendor/symfony/string/Resources/functions.php]ɺ`]ې<vendor/symfony/string/Resources/data/wcswidth_table_wide.php/ɺ`/c<vendor/symfony/string/Resources/data/wcswidth_table_zero.phpK7ɺ`K7ϔ'vendor/symfony/yaml/Tag/TaggedValue.phpɺ`n%vendor/symfony/yaml/Yaml.php ɺ` ijὴ+vendor/symfony/yaml/Command/LintCommand.php ɺ` \yvendor/symfony/yaml/Dumper.phpɺ` ct!vendor/symfony/yaml/Unescaper.php)ɺ`)WY&Xvendor/symfony/yaml/Parser.php?ɺ`?nvendor/symfony/yaml/Inline.phpɺ`%T4vendor/symfony/yaml/Exception/ExceptionInterface.phpɺ`B9/vendor/symfony/yaml/Exception/DumpException.phpɺ`0vendor/symfony/yaml/Exception/ParseException.php ɺ` :2vendor/symfony/yaml/Exception/RuntimeException.phpɺ`_qvendor/symfony/yaml/LICENSE)ɺ`) vendor/symfony/yaml/Escaper.phpɺ`N(vendor/symfony/filesystem/Filesystem.phpoɺ`o➂δ3vendor/symfony/filesystem/Exception/IOException.phpɺ`HD:vendor/symfony/filesystem/Exception/ExceptionInterface.phpɺ` nj=vendor/symfony/filesystem/Exception/FileNotFoundException.phpɺ` Fʹ<vendor/symfony/filesystem/Exception/IOExceptionInterface.phpɺ`i@vendor/symfony/filesystem/Exception/InvalidArgumentException.phpɺ`*!vendor/symfony/filesystem/LICENSE)ɺ`) 5vendor/symfony/polyfill-intl-normalizer/bootstrap.phpɺ`#p 7vendor/symfony/polyfill-intl-normalizer/bootstrap80.phpɺ`,/vendor/symfony/polyfill-intl-normalizer/LICENSE)ɺ`)\6vendor/symfony/polyfill-intl-normalizer/Normalizer.phpc%ɺ`c%r7xFvendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.phpɺ`%Tvendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php{ɺ`{jeXvendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.phpoɺ`oc,Rvendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.phpDɺ`D'CԴLvendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.phpD5ɺ`D5 vendor/autoload.phpɺ`״4vendor/wdes/php-i18n-l10n/src/plugins/BasePlugin.php: ɺ`: >2vendor/wdes/php-i18n-l10n/src/plugins/MoReader.php?/ɺ`?/ݮ,*vendor/wdes/php-i18n-l10n/src/Launcher.phpɺ`;5vendor/wdes/php-i18n-l10n/src/Twig/Extension/I18n.phpJɺ`J̴2vendor/wdes/php-i18n-l10n/src/Twig/MemoryCache.php ɺ` a6vendor/wdes/php-i18n-l10n/src/Twig/TranslationNode.phpɺ`{_2vendor/wdes/php-i18n-l10n/src/Twig/TokenParser.phpɺ`´!vendor/wdes/php-i18n-l10n/LICENSEUAɺ`UAi0<vendor/phpdocumentor/type-resolver/src/PseudoTypes/True_.phpoɺ`o)x=vendor/phpdocumentor/type-resolver/src/PseudoTypes/False_.phpsɺ`s"WA/vendor/phpdocumentor/type-resolver/src/Type.phpɺ`28)5vendor/phpdocumentor/type-resolver/src/PseudoType.phpnɺ`nҟ8vendor/phpdocumentor/type-resolver/src/FqsenResolver.phpɺ`G6x8vendor/phpdocumentor/type-resolver/src/Types/Integer.phpbɺ`bʹ5vendor/phpdocumentor/type-resolver/src/Types/This.phpKɺ`K=;vendor/phpdocumentor/type-resolver/src/Types/Collection.phpɺ`9:;vendor/phpdocumentor/type-resolver/src/Types/Expression.php-ɺ`-tV@:vendor/phpdocumentor/type-resolver/src/Types/Resource_.phpqɺ`q9=vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php|ɺ`|7vendor/phpdocumentor/type-resolver/src/Types/Scalar.phpɺ`6:vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php:ɺ`:"PB8vendor/phpdocumentor/type-resolver/src/Types/Context.php ɺ` >@8vendor/phpdocumentor/type-resolver/src/Types/Boolean.php`ɺ``~Te|=vendor/phpdocumentor/type-resolver/src/Types/Intersection.phpɺ`z?vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php ɺ` `!޴8vendor/phpdocumentor/type-resolver/src/Types/Static_.phpɺ`7vendor/phpdocumentor/type-resolver/src/Types/Float_.php_ɺ`_g<vendor/phpdocumentor/type-resolver/src/Types/ClassString.phpɺ`Ux8vendor/phpdocumentor/type-resolver/src/Types/Object_.phpɺ`^7vendor/phpdocumentor/type-resolver/src/Types/Array_.phpɺ`]ִ?vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.phpj:ɺ`j:-bM8vendor/phpdocumentor/type-resolver/src/Types/String_.phpkɺ`k/vendor/code-lts/cli-tools/src/File/FuzzyRelativePathHelper.phpɺ`:ܴ@vendor/code-lts/cli-tools/src/File/CouldNotReadFileException.phpɺ`ĥO=vendor/code-lts/cli-tools/src/File/NullRelativePathHelper.phpɺ`)R<vendor/code-lts/cli-tools/src/File/PathNotFoundException.phpPɺ`P\ų1vendor/code-lts/cli-tools/src/File/FileWriter.phpɺ`-ᓴ'vendor/code-lts/cli-tools/src/Error.phpɺ`fO6vendor/code-lts/cli-tools/src/Symfony/SymfonyStyle.phpq ɺ`q 1\7vendor/code-lts/cli-tools/src/Symfony/SymfonyOutput.phpQ ɺ`Q ~z^Bvendor/code-lts/cli-tools/src/ErrorFormatter/RawErrorFormatter.phpX ɺ`X *.Fvendor/code-lts/cli-tools/src/ErrorFormatter/RawTextErrorFormatter.phpBɺ`B'_Evendor/code-lts/cli-tools/src/ErrorFormatter/GithubErrorFormatter.phplɺ`lm2Ivendor/code-lts/cli-tools/src/ErrorFormatter/CheckstyleErrorFormatter.php ɺ` >Dvendor/code-lts/cli-tools/src/ErrorFormatter/TableErrorFormatter.php>ɺ`>^ʴCvendor/code-lts/cli-tools/src/ErrorFormatter/JsonErrorFormatter.phpD ɺ`D D`ĴGvendor/code-lts/cli-tools/src/ErrorFormatter/TeamcityErrorFormatter.phpɺ`=e?vendor/code-lts/cli-tools/src/ErrorFormatter/ErrorFormatter.phpɺ`10´Dvendor/code-lts/cli-tools/src/ErrorFormatter/JunitErrorFormatter.phpɺ`TEvendor/code-lts/cli-tools/src/ErrorFormatter/GitlabErrorFormatter.phpNɺ`N;'vendor/code-lts/cli-tools/src/Utils.phpɺ`Dvendor/code-lts/cli-tools/src/Exceptions/FormatNotFoundException.php7ɺ`7(vendor/code-lts/cli-tools/src/Output.php`ɺ``+5r!vendor/code-lts/cli-tools/LICENSEUAɺ`UAi07vendor/psr/container/src/NotFoundExceptionInterface.phpɺ`>悴8vendor/psr/container/src/ContainerExceptionInterface.phpɺ`Bx/vendor/psr/container/src/ContainerInterface.phpɺ`j.vendor/psr/container/LICENSEyɺ`yOp5vendor/ondram/ci-detector/src/CiDetectorInterface.php<ɺ`<b۴.vendor/ondram/ci-detector/src/TrinaryLogic.php^ɺ`^wii%vendor/ondram/ci-detector/src/Env.phpɺ`^5 Bvendor/ondram/ci-detector/src/Exception/CiNotDetectedException.phpɺ`^t(,vendor/ondram/ci-detector/src/Ci/Jenkins.phpɺ`IbԴ+vendor/ondram/ci-detector/src/Ci/Bamboo.phpkɺ`klZ0-vendor/ondram/ci-detector/src/Ci/AppVeyor.phpPɺ`P -vendor/ondram/ci-detector/src/Ci/Codeship.phpɺ`%1vendor/ondram/ci-detector/src/Ci/AwsCodeBuild.phpɺ`AL7vendor/ondram/ci-detector/src/Ci/BitbucketPipelines.php]ɺ`]&3vendor/ondram/ci-detector/src/Ci/AzurePipelines.phpɺ`!a..vendor/ondram/ci-detector/src/Ci/SourceHut.phpɺ`%쫶,vendor/ondram/ci-detector/src/Ci/Wercker.php0ɺ`0ʘR /vendor/ondram/ci-detector/src/Ci/AbstractCi.phpɺ`<_ï-vendor/ondram/ci-detector/src/Ci/TeamCity.phpɺ`z!a*vendor/ondram/ci-detector/src/Ci/Drone.phpWɺ`WZ+vendor/ondram/ci-detector/src/Ci/GitLab.phpfɺ`flPW+vendor/ondram/ci-detector/src/Ci/Circle.phpɺ`**vendor/ondram/ci-detector/src/Ci/Buddy.phpLɺ`Lfg_+vendor/ondram/ci-detector/src/Ci/Travis.phpɺ`K5L0vendor/ondram/ci-detector/src/Ci/CiInterface.php$ ɺ`$ Ty2vendor/ondram/ci-detector/src/Ci/Continuousphp.phpkɺ`k. 52vendor/ondram/ci-detector/src/Ci/GitHubActions.phpɺ`엹,vendor/ondram/ci-detector/src/CiDetector.php} ɺ`} `"%vendor/erusev/parsedown/Parsedown.phpɺ`7~#vendor/erusev/parsedown/LICENSE.txtIɺ`I@B6vendor/twig/twig/src/FileExtensionEscapingStrategy.phpɺ`D!vendor/twig/twig/src/TwigTest.phpɺ`P+vendor/twig/twig/src/Loader/ArrayLoader.php4ɺ`4 ش0vendor/twig/twig/src/Loader/FilesystemLoader.phpɺ`pŴ/vendor/twig/twig/src/Loader/LoaderInterface.phpWɺ`WKXq´+vendor/twig/twig/src/Loader/ChainLoader.php ɺ` h)vendor/twig/twig/src/ExpressionParser.phpɺ`1vendor/twig/twig/src/Markup.phpLɺ`L> vendor/twig/twig/src/Source.phpɺ`m!vendor/twig/twig/src/Compiler.php2ɺ`27^!vendor/twig/twig/src/Template.php2ɺ`2T(vendor/twig/twig/src/TemplateWrapper.php ɺ` F\%vendor/twig/twig/src/TwigFunction.php- ɺ`- 㗴1vendor/twig/twig/src/Util/TemplateDirIterator.phpɺ`sr+y2vendor/twig/twig/src/Util/DeprecationCollector.phpɺ`9vendor/twig/twig/src/Token.phpQɺ`Ql7i$vendor/twig/twig/src/TokenStream.php ɺ` ^ !Y<vendor/twig/twig/src/Extension/RuntimeExtensionInterface.phpFɺ`FĂݴ4vendor/twig/twig/src/Extension/ProfilerExtension.phpɺ`O,\5vendor/twig/twig/src/Extension/ExtensionInterface.phpɺ`dGo1vendor/twig/twig/src/Extension/DebugExtension.phpɺ`o4vendor/twig/twig/src/Extension/AbstractExtension.phpɺ`ɠ8vendor/twig/twig/src/Extension/StringLoaderExtension.phpɺ`+Ŵ3vendor/twig/twig/src/Extension/StagingExtension.php ɺ` ](3vendor/twig/twig/src/Extension/EscaperExtension.php8ɺ`8C3vendor/twig/twig/src/Extension/SandboxExtension.phpr ɺ`r ]D5vendor/twig/twig/src/Extension/OptimizerExtension.phpKɺ`K[3vendor/twig/twig/src/Extension/GlobalsInterface.phpGɺ`GXAd0vendor/twig/twig/src/Extension/CoreExtension.phpɺ` )vendor/twig/twig/src/Profiler/Profile.php*ɺ`*'7vendor/twig/twig/src/Profiler/Node/EnterProfileNode.phpɺ` o7vendor/twig/twig/src/Profiler/Node/LeaveProfileNode.php ɺ` fjдAvendor/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php# ɺ`# 3vendor/twig/twig/src/Profiler/Dumper/BaseDumper.phpɺ`ǩ3vendor/twig/twig/src/Profiler/Dumper/HtmlDumper.phpɺ`Г8vendor/twig/twig/src/Profiler/Dumper/BlackfireDumper.phpɺ`@T3vendor/twig/twig/src/Profiler/Dumper/TextDumper.phpɺ`T5(vendor/twig/twig/src/Node/ImportNode.phpɺ`BWk$vendor/twig/twig/src/Node/IfNode.phpvɺ`vQܾf"vendor/twig/twig/src/Node/Node.phpɺ` ~0vendor/twig/twig/src/Node/BlockReferenceNode.php?ɺ`?mȴ'vendor/twig/twig/src/Node/BlockNode.php ɺ` T2vendor/twig/twig/src/Node/NodeCaptureInterface.phpɺ`'vendor/twig/twig/src/Node/MacroNode.php ɺ` %vendor/twig/twig/src/Node/ForNode.php!ɺ`!X(vendor/twig/twig/src/Node/ModuleNode.php9ɺ`9Qj'vendor/twig/twig/src/Node/FlushNode.phpɺ`V⦴,vendor/twig/twig/src/Node/AutoEscapeNode.phpWɺ`W#=ix/vendor/twig/twig/src/Node/CheckToStringNode.phpɺ`ߞ'vendor/twig/twig/src/Node/EmbedNode.phpɺ`;$vendor/twig/twig/src/Node/DoNode.php!ɺ`!}:'vendor/twig/twig/src/Node/PrintNode.phpvɺ`vp)vendor/twig/twig/src/Node/SandboxNode.phpɺ`,ׯ3&vendor/twig/twig/src/Node/TextNode.php ɺ` x3vendor/twig/twig/src/Node/CheckSecurityCallNode.phpNɺ`N59x@vendor/twig/twig/src/Node/Expression/ArrowFunctionExpression.php+ɺ`+՚n19vendor/twig/twig/src/Node/Expression/FilterExpression.phpɺ`K4:vendor/twig/twig/src/Node/Expression/GetAttrExpression.php ɺ` pUg7vendor/twig/twig/src/Node/Expression/Unary/NotUnary.phpɺ`iw7vendor/twig/twig/src/Node/Expression/Unary/NegUnary.phpɺ`!<vendor/twig/twig/src/Node/Expression/Unary/AbstractUnary.phpɺ`b7vendor/twig/twig/src/Node/Expression/Unary/PosUnary.phpɺ`;vendor/twig/twig/src/Node/Expression/VariadicExpression.phpɺ` |?jAvendor/twig/twig/src/Node/Expression/BlockReferenceExpression.phpɺ`$_B;vendor/twig/twig/src/Node/Expression/TempNameExpression.phpxɺ`x!z존>vendor/twig/twig/src/Node/Expression/ConditionalExpression.phpɺ`A=vendor/twig/twig/src/Node/Expression/MethodCallExpression.phpɺ`7vendor/twig/twig/src/Node/Expression/NameExpression.php ɺ` 0ȴ;vendor/twig/twig/src/Node/Expression/ConstantExpression.phpGɺ`G@GB9vendor/twig/twig/src/Node/Expression/ParentExpression.phpɺ`8vendor/twig/twig/src/Node/Expression/ArrayExpression.phpɺ`?ߵ6vendor/twig/twig/src/Node/Expression/Test/EvenTest.phpɺ`meWδ9vendor/twig/twig/src/Node/Expression/Test/DefinedTest.php ɺ` vc=vendor/twig/twig/src/Node/Expression/Test/DivisiblebyTest.phpɺ`!5T:vendor/twig/twig/src/Node/Expression/Test/ConstantTest.phpɺ`16vendor/twig/twig/src/Node/Expression/Test/NullTest.phpɺ``V5vendor/twig/twig/src/Node/Expression/Test/OddTest.phpɺ`=kwI8vendor/twig/twig/src/Node/Expression/Test/SameasTest.phpɺ`{Loô?vendor/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php.ɺ`.f );vendor/twig/twig/src/Node/Expression/Binary/NotInBinary.phpɺ`l!8vendor/twig/twig/src/Node/Expression/Binary/InBinary.phpɺ`+@vendor/twig/twig/src/Node/Expression/Binary/StartsWithBinary.phpɺ`Bu@vendor/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.phpɺ`ឦ<vendor/twig/twig/src/Node/Expression/Binary/ConcatBinary.phpɺ`?d;vendor/twig/twig/src/Node/Expression/Binary/EqualBinary.php+ɺ`+>>vendor/twig/twig/src/Node/Expression/Binary/FloorDivBinary.phpMɺ`M*I8vendor/twig/twig/src/Node/Expression/Binary/OrBinary.phpɺ`l9vendor/twig/twig/src/Node/Expression/Binary/DivBinary.phpɺ`\a۴>vendor/twig/twig/src/Node/Expression/Binary/EndsWithBinary.phpɺ`G9vendor/twig/twig/src/Node/Expression/Binary/ModBinary.phpɺ`b@?vendor/twig/twig/src/Node/Expression/Binary/SpaceshipBinary.phpɺ`;vendor/twig/twig/src/Node/Expression/Binary/PowerBinary.phpɺ`r9vendor/twig/twig/src/Node/Expression/Binary/SubBinary.phpɺ`k&A?vendor/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.phpɺ`=vendor/twig/twig/src/Node/Expression/Binary/GreaterBinary.php,ɺ`,m>9vendor/twig/twig/src/Node/Expression/Binary/MulBinary.phpɺ`9vendor/twig/twig/src/Node/Expression/Binary/AndBinary.phpɺ`i 1Bvendor/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php1ɺ`1>vendor/twig/twig/src/Node/Expression/Binary/AbstractBinary.phpɺ`l&@vendor/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.phpɺ`;۔=vendor/twig/twig/src/Node/Expression/Binary/MatchesBinary.phpɺ`c1:vendor/twig/twig/src/Node/Expression/Binary/LessBinary.php*ɺ`*W鎴;vendor/twig/twig/src/Node/Expression/Binary/RangeBinary.phpɺ`Lfز>vendor/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php.ɺ`.Dw9vendor/twig/twig/src/Node/Expression/Binary/AddBinary.phpɺ`);vendor/twig/twig/src/Node/Expression/AbstractExpression.phpɺ`ZT;vendor/twig/twig/src/Node/Expression/FunctionExpression.php\ɺ`\߾S=vendor/twig/twig/src/Node/Expression/AssignNameExpression.phpɺ`!?vendor/twig/twig/src/Node/Expression/NullCoalesceExpression.php6ɺ`6гye7vendor/twig/twig/src/Node/Expression/TestExpression.php]ɺ`]c 7vendor/twig/twig/src/Node/Expression/CallExpression.php0ɺ`0Ȯ=vendor/twig/twig/src/Node/Expression/Filter/DefaultFilter.phpɺ`gl4vendor/twig/twig/src/Node/Expression/InlinePrint.phpɺ`&,vendor/twig/twig/src/Node/DeprecatedNode.phpiɺ`i%vendor/twig/twig/src/Node/SetNode.php+ ɺ`+ u&vendor/twig/twig/src/Node/BodyNode.phpWɺ`Wm&vendor/twig/twig/src/Node/WithNode.php5ɺ`5a0/vendor/twig/twig/src/Node/CheckSecurityNode.php$ ɺ`$ s c)vendor/twig/twig/src/Node/IncludeNode.phpE ɺ`E q%)vendor/twig/twig/src/Node/ForLoopNode.php}ɺ`}J541vendor/twig/twig/src/Node/NodeOutputInterface.phpkɺ`k3vendor/twig/twig/src/Lexer.phpKɺ`KEԴ%vendor/twig/twig/src/ExtensionSet.php31ɺ`316ߴ$vendor/twig/twig/src/Error/Error.phpɺ`G+vendor/twig/twig/src/Error/RuntimeError.phpɺ`B*vendor/twig/twig/src/Error/SyntaxError.phpɺ`Ѵ*vendor/twig/twig/src/Error/LoaderError.phpɺ` ]6/vendor/twig/twig/src/Sandbox/SecurityPolicy.phpɺ`~8>vendor/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.phpɺ`ay8vendor/twig/twig/src/Sandbox/SecurityPolicyInterface.phpɺ`!ϴ>vendor/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.phpdɺ`dB4Ҵ@vendor/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.phptɺ`t4.vendor/twig/twig/src/Sandbox/SecurityError.phpɺ` ;vendor/twig/twig/src/Sandbox/SecurityNotAllowedTagError.phpɺ`enf@vendor/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.phpɺ`%$vendor/twig/twig/src/Environment.php]ɺ`]y<vendor/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.phpCɺ`C~7vendor/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php ɺ` *B;9vendor/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.phpɺ`+9vendor/twig/twig/src/NodeVisitor/NodeVisitorInterface.phpɺ`c۴7vendor/twig/twig/src/NodeVisitor/EscaperNodeVisitor.phpTɺ`TuH8vendor/twig/twig/src/NodeVisitor/AbstractNodeVisitor.phpɺ`M?L޴?vendor/twig/twig/src/NodeVisitor/MacroAutoImportNodeVisitor.phpɺ`&vendor/twig/twig/src/NodeTraverser.phpɺ`ɌAvendor/twig/twig/src/Parser.php,ɺ`,E1vendor/twig/twig/src/Test/IntegrationTestCase.php"ɺ`"``*vendor/twig/twig/src/Test/NodeTestCase.phpɺ`ox4vendor/twig/twig/src/TokenParser/WithTokenParser.phpɺ`G3vendor/twig/twig/src/TokenParser/UseTokenParser.phpɺ`Hܴ8vendor/twig/twig/src/TokenParser/AbstractTokenParser.php=ɺ`=G3;5vendor/twig/twig/src/TokenParser/EmbedTokenParser.phpɺ`a2vendor/twig/twig/src/TokenParser/DoTokenParser.php ɺ` 7vendor/twig/twig/src/TokenParser/SandboxTokenParser.phpɺ`ZE:vendor/twig/twig/src/TokenParser/AutoEscapeTokenParser.php.ɺ`.I{3vendor/twig/twig/src/TokenParser/ForTokenParser.phpm ɺ`m E [:vendor/twig/twig/src/TokenParser/DeprecatedTokenParser.phpɺ`d4vendor/twig/twig/src/TokenParser/FromTokenParser.phpɺ`쀴5vendor/twig/twig/src/TokenParser/BlockTokenParser.php ɺ` 3ƴ7vendor/twig/twig/src/TokenParser/ExtendsTokenParser.phpRɺ`RV~22vendor/twig/twig/src/TokenParser/IfTokenParser.php ɺ` 45vendor/twig/twig/src/TokenParser/MacroTokenParser.phpeɺ`e5vendor/twig/twig/src/TokenParser/FlushTokenParser.phpɺ`0ɴ3vendor/twig/twig/src/TokenParser/SetTokenParser.php'ɺ`'rx9vendor/twig/twig/src/TokenParser/TokenParserInterface.phpkɺ`k4kL5vendor/twig/twig/src/TokenParser/ApplyTokenParser.phpɺ`Rt97vendor/twig/twig/src/TokenParser/IncludeTokenParser.php\ɺ`\'6vendor/twig/twig/src/TokenParser/ImportTokenParser.phpɺ` *=vendor/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.phpkɺ`kP;vendor/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.phpMɺ`Mұ4=vendor/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.phpɺ`C0-vendor/twig/twig/src/Cache/CacheInterface.phpɺ`*(vendor/twig/twig/src/Cache/NullCache.phpɺ`.vendor/twig/twig/src/Cache/FilesystemCache.php ɺ` 8#vendor/twig/twig/src/TwigFilter.php7 ɺ`7 Gvendor/twig/twig/LICENSEɺ`QִLICENSENɺ`NR$,89Project-Id-Version: 1.0.0 Report-Msgid-Bugs-To: williamdes@wdes.fr PO-Revision-Date: 2020-07-13 09:34+0200 Last-Translator: Blob Blob Language-Team: English Language: en MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Poedit 2.2.4 X-Poedit-SourceCharset: UTF-8 (\5p q}  H  ")< D NYh ~      & ,6=B`H  U\ e oz      , 7 O 0Z             "  #'! ( % &$All ClassesClassClass in namespace %sClassesConstantsDetailsExceptionsGenerated by %sDoctum, a API Documentation generator and fork of Sami%s.IndexInterfaceInterfacesMethodMethod in class %sMethodsNamespaceNamespacesNo descriptionNo results were foundParametersPropertiesProperty in class %sReturn ValueSearchSearch ResultsSee alsoThis page allows you to search through the API documentation for specific terms. Enter your search words into the box below and click "submit". The search will be performed on namespaces, classes, interfaces, traits, functions, and methods.Toggle navigationTraitTraitsView sourceat line %sclassdeprecatedfrom %sin %sinterfacesubmittodotraitProject-Id-Version: 1.0.0 Report-Msgid-Bugs-To: williamdes@wdes.fr PO-Revision-Date: 2020-07-18 13:40+0200 Last-Translator: William Desportes Language-Team: French Language: fr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.2.4 Toutes les classesClasseClasse dans le namespace %sClassesConstantesDétailsExceptionsGénéré par %sDoctum, un générateur de documentation d'API, successeur de Sami%s.SommaireInterfaceInterfacesMéthodeMéthode de la classe %sMéthodesNamespaceNamespacesPas de descriptionAucun résultat trouvéParamètresPropriétésPropriété de la classe %sValeur de retourRechercherRésultats de rechercheVoir aussiCette page vous permet de rechercher dans la documentation de l'API des termes spécifiques. Entrez vos mots clefs de recherche dans la case ci-dessous et cliquez sur "Valider". La recherche sera effectuée sur les espaces de noms, les classes, les interfaces, les traits, les fonctions et les méthodes.Afficher le menuTraitTraitsVoir la sourceà la ligne %sclassedépréciédepuis %sdans %sinterfaceValidertodotrait * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Store; use Doctum\Project; use Doctum\Reflection\ClassReflection; use Doctum\Reflection\FunctionReflection; interface StoreInterface { public function readClass(Project $project, $name); public function writeClass(Project $project, ClassReflection $class); public function removeClass(Project $project, $name); public function readFunction(Project $project, string $name): FunctionReflection; public function writeFunction(Project $project, FunctionReflection $Function): void; public function removeFunction(Project $project, string $name): void; /** * Read the storage and return it * * @return array */ public function readProject(Project $project); /** * Empty the storage * * @return void */ public function flushProject(Project $project); } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Store; use Doctum\Project; use Doctum\Reflection\ClassReflection; use Doctum\Reflection\FunctionReflection; use Exception; use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Finder\Finder; class JsonStore implements StoreInterface { private const JSON_PRETTY_PRINT = 128; /** * @return ClassReflection A ClassReflection instance * * @throws \InvalidArgumentException if the class does not exist in the store */ public function readClass(Project $project, $name): ClassReflection { $fileName = $this->getFilename('class', $project, $name); if (!file_exists($fileName)) { throw new \InvalidArgumentException(sprintf('File "%s" for class "%s" does not exist.', $fileName, $name)); } return ClassReflection::fromArray($project, $this->readJsonFile($fileName)); } protected function readJsonFile(string $filePath): array { $contents = file_get_contents($filePath); if ($contents === false) { throw new Exception( sprintf('Unable to read the class: %s', $filePath) ); } $contents = json_decode($contents, true); if ($contents === false) { throw new Exception( sprintf('Unable to JSON decode the class from: %s', $filePath) ); } return $contents; } public function removeClass(Project $project, $name) { if (!file_exists($this->getFilename('class', $project, $name))) { throw new \RuntimeException(sprintf('Unable to remove the "%s" class.', $name)); } unlink($this->getFilename('class', $project, $name)); } public function writeClass(Project $project, ClassReflection $class) { file_put_contents($this->getFilename('class', $project, $class->getName()), json_encode($class->toArray(), self::JSON_PRETTY_PRINT)); } /** * @return FunctionReflection A FunctionReflection instance * * @throws \InvalidArgumentException if the function does not exist in the store */ public function readFunction(Project $project, string $name): FunctionReflection { $fileName = $this->getFilename('function', $project, $name); if (!file_exists($fileName)) { throw new \InvalidArgumentException(sprintf('File "%s" for function "%s" does not exist.', $fileName, $name)); } return FunctionReflection::fromArray($project, $this->readJsonFile($fileName)); } public function removeFunction(Project $project, string $name): void { if (!file_exists($this->getFilename('function', $project, $name))) { throw new \RuntimeException(sprintf('Unable to remove the "%s" function.', $name)); } unlink($this->getFilename('function', $project, $name)); } public function writeFunction(Project $project, FunctionReflection $function): void { file_put_contents($this->getFilename('function', $project, $function->getName()), json_encode($function->toArray(), self::JSON_PRETTY_PRINT)); } public function readProject(Project $project) { $classesOrFunctions = []; $files = Finder::create()->name('c_*.json')->files()->in($this->getStoreDir($project)); foreach ($files as $file) { $contents = file_get_contents($file->getPathname()); if ($contents === false) { continue; } $data = json_decode($contents, true); if ($data === false || $data === null) { continue; } $classesOrFunctions[] = ClassReflection::fromArray($project, $data); } $files = Finder::create()->name('f_*.json')->files()->in($this->getStoreDir($project)); foreach ($files as $file) { $contents = file_get_contents($file->getPathname()); if ($contents === false) { continue; } $data = json_decode($contents, true); if ($data === false || $data === null) { continue; } $classesOrFunctions[] = FunctionReflection::fromArray($project, $data); } return $classesOrFunctions; } public function flushProject(Project $project) { $filesystem = new Filesystem(); $filesystem->remove($this->getStoreDir($project)); } protected function getFilename(string $type, Project $project, string $name): string { $dir = $this->getStoreDir($project); return $dir . '/' . $type[0] . '_' . md5($name) . '.json'; } protected function getStoreDir(Project $project): string { $dir = $project->getCacheDir() . '/store'; if (!is_dir($dir)) { $filesystem = new Filesystem(); $filesystem->mkdir($dir); } return $dir; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Store; use Doctum\Project; use Doctum\Reflection\ClassReflection; use Doctum\Reflection\FunctionReflection; /** * Stores classes in-memory. * * Mainly useful for unit tests. */ class ArrayStore implements StoreInterface { /** * @var array */ private $classes = []; /** * @var array */ private $functions = []; public function setClasses($classes) { foreach ($classes as $class) { $this->classes[$class->getName()] = $class; } } public function readClass(Project $project, $name) { if (!isset($this->classes[$name])) { throw new \InvalidArgumentException(sprintf('Class "%s" does not exist.', $name)); } return $this->classes[$name]; } public function removeClass(Project $project, $name) { if (!isset($this->classes[$name])) { throw new \InvalidArgumentException(sprintf('Class "%s" does not exist.', $name)); } unset($this->classes[$name]); } public function writeClass(Project $project, ClassReflection $class) { $this->classes[$class->getName()] = $class; } public function readFunction(Project $project, string $name): FunctionReflection { if (!isset($this->functions[$name])) { throw new \InvalidArgumentException(sprintf('Function "%s" does not exist.', $name)); } return $this->functions[$name]; } public function removeFunction(Project $project, string $name): void { if (!isset($this->functions[$name])) { throw new \InvalidArgumentException(sprintf('Function "%s" does not exist.', $name)); } unset($this->functions[$name]); } public function writeFunction(Project $project, FunctionReflection $function): void { $this->functions[$function->getName()] = $function; } public function readProject(Project $project) { return array_merge($this->classes, $this->functions); } public function flushProject(Project $project) { $this->classes = []; $this->functions = []; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Version; use Symfony\Component\Finder\Glob; use Symfony\Component\Process\Process; class GitVersionCollection extends VersionCollection { /** * @var \Closure */ protected $sorter; /** * @var \Closure */ protected $filter; /** * @var string */ protected $repo; /** * @var string */ protected $gitPath; public function __construct(string $repo) { $this->repo = $repo; $this->filter = static function (string $version): bool { foreach (['PR', 'RC', 'BETA', 'ALPHA'] as $str) { if (strpos($version, $str) !== false) { return false; } } return true; }; $this->sorter = static function (string $a, string $b): int { return version_compare($a, $b, '>') === true ? 1 : 0; }; $this->gitPath = 'git'; } /** * @phpstan-return void */ protected function switchVersion(Version $version) { $process = new Process(['git', 'status', '--porcelain', '--untracked-files=no'], $this->repo); $process->run(); if (!$process->isSuccessful() || trim($process->getOutput())) { throw new \RuntimeException(sprintf('Unable to switch to version "%s" as the repository is not clean.', $version)); } $this->execute(['checkout', '-qf', (string) $version]); } public function setGitPath(string $path): void { $this->gitPath = $path; } public function setFilter(\Closure $filter): void { $this->filter = $filter; } public function setSorter(\Closure $sorter): void { $this->sorter = $sorter; } /** * @param \Closure|null|string[] $filter An array_filter callback that will be used for filtering versions or an array of globs */ public function addFromTags($filter = null): self { $tags = array_filter(explode("\n", $this->execute(['tag']))); $versions = array_filter($tags, $this->filter); if (null !== $filter) { if (!$filter instanceof \Closure) { $regexes = []; foreach ((array) $filter as $f) { $regexes[] = Glob::toRegex($f); } $filter = static function ($version) use ($regexes) { foreach ($regexes as $regex) { if (preg_match($regex, $version)) { return true; } } return false; }; } $versions = array_filter($versions, $filter); } usort($versions, $this->sorter); foreach ($versions as $version) { $version = new Version($version); $version->setFrozen(true); $this->add($version); } return $this; } /** * @param string[] $arguments */ protected function execute(array $arguments): string { array_unshift($arguments, $this->gitPath); $process = new Process($arguments, $this->repo); $process->run(); if (!$process->isSuccessful()) { throw new \RuntimeException(sprintf('Unable to run the command (%s).', $process->getErrorOutput())); } return $process->getOutput(); } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Version; class SingleVersionCollection extends VersionCollection { public function add($version, $longname = null) { $countable = is_array($this->versions) || $this->versions instanceof \Countable; if ($countable && count($this->versions)) { throw new \LogicException('A SingleVersionCollection can only contain one Version'); } parent::add($version, $longname); return $this; } protected function switchVersion(Version $version) { } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Version; class Version { /** * @var bool */ protected $isFrozen; /** * @var string */ protected $name; /** * @var string */ protected $longname; public function __construct(string $name, ?string $longname = null) { $this->name = $name; $this->longname = null === $longname ? $name : $longname; $this->isFrozen = false; } public function __toString() { return $this->name; } public function setName(string $name): void { $this->name = $name; } public function getName(): string { return $this->name; } public function getLongName(): ?string { return $this->longname; } public function setFrozen(bool $isFrozen): void { $this->isFrozen = $isFrozen; } public function isFrozen(): bool { return $this->isFrozen; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Version; use Doctum\Project; /** * @implements \Iterator */ abstract class VersionCollection implements \Iterator, \Countable { /** * @var Version[]|mixed */ protected $versions = []; /** * @var int */ protected $indice; /** * @var Project */ protected $project; /** * @phpstan-param array|Version $versions */ public function __construct($versions) { $this->add($versions); } /** * @phpstan-return void */ abstract protected function switchVersion(Version $version); /** * @phpstan-return mixed */ public static function create() { $r = new \ReflectionClass(get_called_class()); return $r->newInstanceArgs(func_get_args()); } public function setProject(Project $project): void { $this->project = $project; } /** * @param string[]|string|Version $version * @param string $longname * @phpstan-return self */ public function add($version, $longname = null) { if (is_array($version)) { foreach ($version as $v) { $this->add($v); } } else { if (!$version instanceof Version) { $version = new Version($version, $longname); } $this->versions[] = $version; } return $this; } /** * @return Version[] */ public function getVersions(): array { return $this->versions; } public function key(): int { return $this->indice; } public function current(): Version { return $this->versions[$this->indice]; } public function next(): void { ++$this->indice; } public function rewind(): void { $this->indice = 0; } public function valid(): bool { if ($this->indice < count($this->versions)) { $this->switchVersion($this->current()); return true; } return false; } public function count(): int { return count($this->versions); } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum; /** * @author Fabien Potencier */ class Message { public const PARSE_ERROR = 1; public const PARSE_CLASS = 2; public const PARSE_VERSION_FINISHED = 3; public const RENDER_PROGRESS = 4; public const RENDER_VERSION_FINISHED = 5; public const SWITCH_VERSION = 6; } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum; use Doctum\Parser\Parser; use Doctum\Reflection\ClassReflection; use Doctum\Reflection\FunctionReflection; use Doctum\Reflection\LazyClassReflection; use Doctum\Renderer\Renderer; use Doctum\RemoteRepository\AbstractRemoteRepository; use Doctum\Store\StoreInterface; use Doctum\Version\SingleVersionCollection; use Doctum\Version\Version; use Doctum\Version\VersionCollection; use Symfony\Component\Filesystem\Filesystem; /** * Project represents an API project. * * @author Fabien Potencier */ class Project { protected $versions; protected $store; /** @var Parser */ protected $parser; /** @var Renderer */ protected $renderer; /** @var ClassReflection[] */ protected $classes; /** @var array> */ protected $functions; protected $namespaceClasses; protected $namespaceInterfaces; protected $namespaceExceptions; protected $namespaces; protected $config; /** @var string|null */ protected $version; protected $filesystem; protected $interfaces; /** @var string */ protected $sourceDir; public function __construct(StoreInterface $store, ?VersionCollection $versions = null, array $config = []) { if (null === $versions) { $versions = new SingleVersionCollection(new Version(Doctum::$defaultVersionName)); } $this->versions = $versions; $this->store = $store; $this->config = array_merge( [ 'build_dir' => sys_get_temp_dir() . 'doctum/build', 'cache_dir' => sys_get_temp_dir() . 'doctum/cache', 'include_parent_data' => true, 'theme' => 'default', ], $config ); $this->filesystem = new Filesystem(); if (count($this->versions) > 1) { foreach (['build_dir', 'cache_dir'] as $dir) { if (false === strpos($this->config[$dir], '%version%')) { throw new \LogicException( sprintf( 'The "%s" setting must have the "%%version%%" placeholder' . ' as the project has more than one version.', $dir ) ); } } } $this->initialize(); } public function setRenderer(Renderer $renderer): void { $this->renderer = $renderer; } public function setParser(Parser $parser): void { $this->parser = $parser; } public function setSourceDir(string $sourceDir): void { $this->sourceDir = $sourceDir; } public function getSourceDir(): string { return $this->replaceVars($this->sourceDir); } public function getConfig($name, $default = null) { return $this->config[$name] ?? $default; } public function getVersion(): ?string { return $this->version; } public function getVersions(): array { return $this->versions->getVersions(); } public function update($callback = null, $force = false): void { foreach ($this->versions as $version) { $this->switchVersion($version, $callback, $force); $this->parseVersion($version, null, $callback, $force); $this->renderVersion($version, null, $callback, $force); } } public function parse($callback = null, $force = false): void { $previous = null; foreach ($this->versions as $version) { $this->switchVersion($version, $callback, $force); $this->parseVersion($version, $previous, $callback, $force); $previous = $this->getCacheDir(); } } public function render($callback = null, $force = false): void { $previous = null; foreach ($this->versions as $version) { // here, we don't want to flush the parse cache, as we are rendering $this->switchVersion($version, $callback, false); $this->renderVersion($version, $previous, $callback, $force); $previous = $this->getBuildDir(); } } public function switchVersion(Version $version, $callback = null, $force = false): void { if (null !== $callback) { call_user_func($callback, Message::SWITCH_VERSION, $version); } $this->version = $version->getName(); $this->initialize(); if (!$force) { $this->read(); } } public function hasNamespaces(): bool { // if there is only one namespace and this is the global one, it means that there is no namespace in the project return [''] != array_keys($this->namespaces); } public function hasNamespace(string $namespace): bool { return array_key_exists($namespace, $this->namespaces); } public function getNamespaces(): array { ksort($this->namespaces); return array_keys($this->namespaces); } /** * @return array */ public function getNamespaceFunctions($namespace): array { if (! isset($this->functions[$namespace])) { return []; } ksort($this->functions[$namespace]); return $this->functions[$namespace]; } public function getNamespaceAllClasses($namespace) { $classes = array_merge( $this->getNamespaceExceptions($namespace), $this->getNamespaceInterfaces($namespace), $this->getNamespaceClasses($namespace) ); ksort($classes); return $classes; } public function getNamespaceExceptions($namespace) { if (!isset($this->namespaceExceptions[$namespace])) { return []; } ksort($this->namespaceExceptions[$namespace]); return $this->namespaceExceptions[$namespace]; } public function getNamespaceClasses($namespace) { if (!isset($this->namespaceClasses[$namespace])) { return []; } ksort($this->namespaceClasses[$namespace]); return $this->namespaceClasses[$namespace]; } public function getNamespaceInterfaces($namespace) { if (!isset($this->namespaceInterfaces[$namespace])) { return []; } ksort($this->namespaceInterfaces[$namespace]); return $this->namespaceInterfaces[$namespace]; } public function getNamespaceSubNamespaces($parent): array { $prefix = strlen($parent) ? ($parent . '\\') : ''; $len = strlen($prefix); $namespaces = []; foreach ($this->namespaces as $sub) { $prefixMatch = substr($sub, 0, $len) === $prefix; if ($prefixMatch && strpos(substr($sub, $len), '\\') === false) { $namespaces[] = $sub; } } return $namespaces; } public function addFunction(FunctionReflection $fun): void { $this->functions[$fun->getNamespace()][$fun->getName()] = $fun; $fun->setProject($this); } public function addClass(ClassReflection $class): void { $this->classes[$class->getName()] = $class; $class->setProject($this); if ($class->isProjectClass()) { $this->updateCache($class); } } public function removeClass(ClassReflection $class): void { unset($this->classes[$class->getName()]); unset($this->interfaces[$class->getName()]); unset($this->namespaceClasses[$class->getNamespace()][$class->getName()]); unset($this->namespaceInterfaces[$class->getNamespace()][$class->getName()]); unset($this->namespaceExceptions[$class->getNamespace()][$class->getName()]); } public function getProjectInterfaces(): array { $interfaces = []; foreach ($this->interfaces as $interface) { if ($interface->isProjectClass()) { $interfaces[$interface->getName()] = $interface; } } ksort($interfaces); return $interfaces; } public function getProjectClasses(): array { $classes = []; foreach ($this->classes as $name => $class) { if ($class->isProjectClass()) { $classes[$name] = $class; } } ksort($classes); return $classes; } public function getClass(string $name): ClassReflection { $name = ltrim($name, '\\'); if (isset($this->classes[$name])) { return $this->classes[$name]; } $class = new LazyClassReflection($name); $this->addClass($class); return $class; } /** * this must only be used in LazyClassReflection to get the right values */ public function loadClass(string $name): ?ClassReflection { $name = ltrim($name, '\\'); if ($this->getClass($name) instanceof LazyClassReflection) { try { $this->addClass($this->store->readClass($this, $name)); } catch (\InvalidArgumentException $e) { // probably a PHP built-in class return null; } } return $this->classes[$name]; } public function initialize() { $this->namespaces = []; $this->interfaces = []; $this->classes = []; $this->namespaceClasses = []; $this->namespaceInterfaces = []; $this->namespaceExceptions = []; } public function read(): void { $this->initialize(); foreach ($this->store->readProject($this) as $classOrFun) { if ($classOrFun instanceof FunctionReflection) { $this->addFunction($classOrFun); } elseif ($classOrFun instanceof ClassReflection) { $this->addClass($classOrFun); } } } public function getBuildDir() { return $this->prepareDir($this->config['build_dir']); } public function getCacheDir() { return $this->prepareDir($this->config['cache_dir']); } public function flushDir(string $dir): void { $this->filesystem->remove($dir); $this->filesystem->mkdir($dir); file_put_contents($dir . '/DOCTUM_VERSION', Doctum::VERSION); file_put_contents($dir . '/PROJECT_VERSION', $this->version); } public function seedCache(string $previous, string $current): void { $this->filesystem->remove($current); $this->filesystem->mirror($previous, $current); $this->read(); } /** * @internal Will be removed without notice someday */ public static function isPhpTypeHint(string $hint): bool { // TODO: improve return in_array( strtolower($hint), [ '', 'scalar', 'object', 'boolean', 'bool', 'true', 'false', 'int', 'integer', 'array', 'string', 'mixed', 'void', 'null', 'resource', 'double', 'float', 'callable', '$this' ] ); } /** * @var array * @internal Will be removed without notice someday */ public static $phpInternalClasses = [ 'stdclass' => true, 'exception' => true, 'errorexception' => true, 'error' => true, 'parseerror' => true, 'typeerror' => true, 'arithmeticerror' => true, 'divisionbyzeroerror' => true, 'closure' => true, 'generator' => true, 'closedgeneratorexception' => true, 'datetime' => true, 'datetimeimmutable' => true, 'datetimezone' => true, 'dateinterval' => true, 'dateperiod' => true, 'libxmlerror' => true, 'sqlite3' => true, 'sqlite3stmt' => true, 'sqlite3result' => true, 'domexception' => true, 'domstringlist' => true, 'domnamelist' => true, 'domimplementationlist' => true, 'domimplementationsource' => true, 'domimplementation' => true, 'domnode' => true, 'domnamespacenode' => true, 'domdocumentfragment' => true, 'domdocument' => true, 'domnodelist' => true, 'domnamednodemap' => true, 'domcharacterdata' => true, 'domattr' => true, 'domelement' => true, 'domtext' => true, 'domcomment' => true, 'domtypeinfo' => true, 'domuserdatahandler' => true, 'domdomerror' => true, 'domerrorhandler' => true, 'domlocator' => true, 'domconfiguration' => true, 'domcdatasection' => true, 'domdocumenttype' => true, 'domnotation' => true, 'domentity' => true, 'domentityreference' => true, 'domprocessinginstruction' => true, 'domstringextend' => true, 'domxpath' => true, 'finfo' => true, 'logicexception' => true, 'badfunctioncallexception' => true, 'badmethodcallexception' => true, 'domainexception' => true, 'invalidargumentexception' => true, 'lengthexception' => true, 'outofrangeexception' => true, 'runtimeexception' => true, 'outofboundsexception' => true, 'overflowexception' => true, 'rangeexception' => true, 'underflowexception' => true, 'unexpectedvalueexception' => true, 'recursiveiteratoriterator' => true, 'iteratoriterator' => true, 'filteriterator' => true, 'recursivefilteriterator' => true, 'callbackfilteriterator' => true, 'recursivecallbackfilteriterator' => true, 'parentiterator' => true, 'limititerator' => true, 'cachingiterator' => true, 'recursivecachingiterator' => true, 'norewinditerator' => true, 'appenditerator' => true, 'infiniteiterator' => true, 'regexiterator' => true, 'recursiveregexiterator' => true, 'emptyiterator' => true, 'recursivetreeiterator' => true, 'arrayobject' => true, 'arrayiterator' => true, 'recursivearrayiterator' => true, 'splfileinfo' => true, 'directoryiterator' => true, 'filesystemiterator' => true, 'recursivedirectoryiterator' => true, 'globiterator' => true, 'splfileobject' => true, 'spltempfileobject' => true, 'spldoublylinkedlist' => true, 'splqueue' => true, 'splstack' => true, 'splheap' => true, 'splminheap' => true, 'splmaxheap' => true, 'splpriorityqueue' => true, 'splfixedarray' => true, 'splobjectstorage' => true, 'multipleiterator' => true, 'pdoexception' => true, 'pdo' => true, 'pdostatement' => true, 'pdorow' => true, 'sessionhandler' => true, 'reflectionexception' => true, 'reflection' => true, 'reflectionfunctionabstract' => true, 'reflectionfunction' => true, 'reflectiongenerator' => true, 'reflectionparameter' => true, 'reflectiontype' => true, 'reflectionmethod' => true, 'reflectionclass' => true, 'reflectionobject' => true, 'reflectionproperty' => true, 'reflectionextension' => true, 'reflectionzendextension' => true, '__php_incomplete_class' => true, 'php_user_filter' => true, 'directory' => true, 'assertionerror' => true, 'simplexmlelement' => true, 'simplexmliterator' => true, 'pharexception' => true, 'phar' => true, 'phardata' => true, 'pharfileinfo' => true, 'xmlreader' => true, 'xmlwriter' => true, 'collator' => true, 'numberformatter' => true, 'normalizer' => true, 'locale' => true, 'messageformatter' => true, 'intldateformatter' => true, 'resourcebundle' => true, 'transliterator' => true, 'intltimezone' => true, 'intlcalendar' => true, 'intlgregoriancalendar' => true, 'spoofchecker' => true, 'intlexception' => true, 'intliterator' => true, 'intlbreakiterator' => true, 'intlrulebasedbreakiterator' => true, 'intlcodepointbreakiterator' => true, 'intlpartsiterator' => true, 'uconverter' => true, 'intlchar' => true, 'traversable' => true, 'iteratoraggregate' => true, 'iterator' => true, 'arrayaccess' => true, 'serializable' => true, 'throwable' => true, 'datetimeinterface' => true, 'jsonserializable' => true, 'recursiveiterator' => true, 'outeriterator' => true, 'countable' => true, 'seekableiterator' => true, 'splobserver' => true, 'splsubject' => true, 'sessionhandlerinterface' => true, 'sessionidinterface' => true, 'sessionupdatetimestamphandlerinterface' => true, 'reflector' => true, 'stringable' => true,// PHP >= 8.0 'weakreference' => true,// PHP >= 7.4.0 ]; protected function updateCache(ClassReflection $class) { $name = $class->getName(); $this->namespaces[$class->getNamespace()] = $class->getNamespace(); // add sub-namespaces $namespace = $class->getNamespace() ?? ''; while ($namespace = substr($namespace, 0, (int) strrpos($namespace, '\\'))) { $this->namespaces[$namespace] = $namespace; } if ($class->isException()) { $this->namespaceExceptions[$class->getNamespace()][$name] = $class; } elseif ($class->isInterface()) { $this->namespaceInterfaces[$class->getNamespace()][$name] = $class; $this->interfaces[$name] = $class; } else { $this->namespaceClasses[$class->getNamespace()][$name] = $class; } } protected function prepareDir($dir) { static $prepared = []; $dir = $this->replaceVars($dir); if (isset($prepared[$dir])) { return $dir; } $prepared[$dir] = true; if (!is_dir($dir)) { $this->flushDir($dir); return $dir; } $doctumVersion = null; if (file_exists($dir . '/DOCTUM_VERSION')) { $doctumVersion = file_get_contents($dir . '/DOCTUM_VERSION'); } if (Doctum::VERSION !== $doctumVersion) { $this->flushDir($dir); } return $dir; } protected function replaceVars(string $pattern): string { return str_replace('%version%', (string) $this->version, $pattern); } protected function parseVersion(Version $version, $previous, $callback = null, $force = false): void { if (null === $this->parser) { throw new \LogicException('You must set a parser.'); } if ($version->isFrozen() && count($this->classes) > 0) { return; } if ($force) { $this->store->flushProject($this); } if ($previous && 0 === count($this->classes)) { $this->seedCache($previous, $this->getCacheDir()); } $transaction = $this->parser->parse($this, $callback); if (null !== $callback) { call_user_func($callback, Message::PARSE_VERSION_FINISHED, $transaction); } } protected function renderVersion(Version $version, $previous, $callback = null, $force = false): void { if (null === $this->renderer) { throw new \LogicException('You must set a renderer.'); } $frozen = $version->isFrozen() && $this->renderer->isRendered($this) && $this->version === file_get_contents($this->getBuildDir() . '/PROJECT_VERSION'); if ($force && !$frozen) { $this->flushDir($this->getBuildDir()); } if ($previous && !$this->renderer->isRendered($this)) { $this->seedCache($previous, $this->getBuildDir()); } $diff = $this->renderer->render($this, $callback, $force); if (null !== $callback) { call_user_func($callback, Message::RENDER_VERSION_FINISHED, $diff); } } public function getSourceRoot() { $root = $this->getConfig('source_url'); if (! $root) { return; } if (strpos($root, 'github') !== false) { return $root . '/tree/' . $this->version; } } public function getViewSourceUrl($relativePath, $line) { $remoteRepository = $this->getConfig('remote_repository'); if ($remoteRepository instanceof AbstractRemoteRepository) { return $remoteRepository->getFileUrl($this->version, $relativePath, $line); } return ''; } public function getBaseUrl(): ?string { $url = $this->getConfig('base_url'); return $url === null ? null : rtrim($url, '/'); } public function hasFooterLink(): bool { return $this->getConfig('footer_link') !== null && is_array($this->getConfig('footer_link')); } /** * @return array * @phpstan-return array{href: string, rel: string, target: string, before_text: string, link_text: string, after_text: string} */ public function getFooterLink(): array { $link = $this->getConfig('footer_link'); return [ 'href' => $link['href'] ?? '', 'target' => $link['target'] ?? '', 'rel' => $link['rel'] ?? '', 'before_text' => $link['before_text'] ?? '', 'link_text' => $link['link_text'] ?? '', 'after_text' => $link['after_text'] ?? '', ]; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum; class Indexer { private const TYPE_CLASS = 1; private const TYPE_METHOD = 2; private const TYPE_NAMESPACE = 3; public function getIndex(Project $project) { $index = [ 'searchIndex' => [], 'info' => [], ]; foreach ($project->getNamespaces() as $namespace) { $index['searchIndex'][] = $this->getSearchString($namespace); $index['info'][] = [self::TYPE_NAMESPACE, $namespace]; } foreach ($project->getProjectClasses() as $class) { $index['searchIndex'][] = $this->getSearchString((string) $class); $index['info'][] = [self::TYPE_CLASS, $class]; } foreach ($project->getProjectClasses() as $class) { foreach ($class->getMethods() as $method) { $index['searchIndex'][] = $this->getSearchString((string) $method); $index['info'][] = [self::TYPE_METHOD, $method]; } } return $index; } protected function getSearchString($string) { return strtolower(preg_replace('/\s+/', '', $string)); } } */ protected $parameters = []; protected $byRef; protected $project; protected $relativeFilePath; protected $exceptions = []; public function __toString() { return $this->namespace . '\\' . $this->name; } public function setByRef($boolean) { $this->byRef = $boolean; } public function isByRef() { return $this->byRef; } /** * @return Project */ public function getProject() { return $this->project; } public function setProject(Project $project) { $this->project = $project; } public function setNamespace($namespace) { $this->namespace = ltrim($namespace, '\\'); } public function getNamespace() { return $this->namespace; } public function getClass() { return null; } public function setClass(ClassReflection $class) { return; // No op } /** * @overrides */ public function getHint() { if (! is_array($this->hint)) { return []; } $hints = []; $project = $this->getProject(); foreach ($this->hint as $hint) { $hints[] = new HintReflection(Project::isPhpTypeHint($hint[0]) ? $hint[0] : $project->getClass($hint[0]), $hint[1]); } return $hints; } /** * @return void */ public function addParameter(ParameterReflection $parameter) { $this->parameters[$parameter->getName()] = $parameter; $parameter->setFunction($this); } /** * @return array */ public function getParameters() { return $this->parameters; } public function getParameter($name) { if (ctype_digit((string) $name)) { $tmp = array_values($this->parameters); return $tmp[$name] ?? null; } return $this->parameters[$name] ?? null; } /** * Can be any iterator (so that we can lazy-load the parameters) * @param array $parameters * @return void */ public function setParameters($parameters) { $this->parameters = $parameters; } public function setExceptions($exceptions) { $this->exceptions = $exceptions; } public function getExceptions() { $exceptions = []; foreach ($this->exceptions as $exception) { $exception[0] = $this->getProject()->getClass($exception[0]); $exceptions[] = $exception; } return $exceptions; } public function getRawExceptions() { return $this->exceptions; } public function setRelativeFilePath($relativeFilePath) { $this->relativeFilePath = $relativeFilePath; } public function getRelativeFilePath() { return $this->relativeFilePath; } public function getSourcePath() { if (null === $this->relativeFilePath) { return ''; } return $this->project->getViewSourceUrl($this->relativeFilePath, $this->line); } public function toArray() { return [ 'namespace' => $this->namespace, 'name' => $this->name, 'line' => $this->line, 'short_desc' => $this->shortDesc, 'long_desc' => $this->longDesc, 'hint' => $this->hint, 'hint_desc' => $this->hintDesc, 'tags' => $this->tags, 'modifiers' => $this->modifiers, 'is_by_ref' => $this->byRef, 'exceptions' => $this->exceptions, 'errors' => $this->errors, 'parameters' => array_map( static function ($parameter) { return $parameter->toArray(); }, $this->parameters ), ]; } /** * @return self */ public static function fromArray(Project $project, array $array) { $method = new self($array['name'], $array['line']); $method->shortDesc = $array['short_desc']; $method->longDesc = $array['long_desc']; $method->hint = $array['hint']; $method->hintDesc = $array['hint_desc']; $method->tags = $array['tags']; $method->modifiers = $array['modifiers']; $method->byRef = $array['is_by_ref']; $method->exceptions = $array['exceptions']; $method->errors = $array['errors']; $method->namespace = $array['namespace'] ?? '';// New in 5.4.0 foreach ($array['parameters'] as $parameter) { $method->addParameter(ParameterReflection::fromArray($project, $parameter)); } return $method; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Reflection; use Doctum\Project; class MethodReflection extends Reflection { /** @var ClassReflection */ protected $class; protected $parameters = []; protected $byRef; protected $exceptions = []; public function __toString() { return $this->class . '::' . $this->name; } public function setByRef($boolean) { $this->byRef = $boolean; } public function isByRef() { return $this->byRef; } /** * {@inheritDoc} */ public function setModifiers(int $modifiers): void { // if no modifiers, method is public if (0 === ($modifiers & self::VISIBILITY_MODIFER_MASK)) { $modifiers |= self::MODIFIER_PUBLIC; } $this->modifiers = $modifiers; } /** * @return ClassReflection|null */ public function getClass() { return $this->class; } public function setClass(ClassReflection $class) { $this->class = $class; } public function addParameter(ParameterReflection $parameter) { $this->parameters[$parameter->getName()] = $parameter; $parameter->setMethod($this); } public function getParameters() { return $this->parameters; } public function getParameter($name) { if (ctype_digit((string) $name)) { $tmp = array_values($this->parameters); return $tmp[$name] ?? null; } return $this->parameters[$name] ?? null; } /* * Can be any iterator (so that we can lazy-load the parameters) */ public function setParameters($parameters) { $this->parameters = $parameters; } public function setExceptions($exceptions) { $this->exceptions = $exceptions; } public function getExceptions() { $exceptions = []; foreach ($this->exceptions as $exception) { $exception[0] = $this->class->getProject()->getClass($exception[0]); $exceptions[] = $exception; } return $exceptions; } public function getRawExceptions() { return $this->exceptions; } public function getSourcePath() { return $this->class->getSourcePath($this->line); } public function toArray() { return [ 'name' => $this->name, 'line' => $this->line, 'short_desc' => $this->shortDesc, 'long_desc' => $this->longDesc, 'hint' => $this->hint, 'hint_desc' => $this->hintDesc, 'tags' => $this->tags, 'see' => $this->see, 'modifiers' => $this->modifiers, 'is_by_ref' => $this->byRef, 'exceptions' => $this->exceptions, 'errors' => $this->errors, 'parameters' => array_map( static function ($parameter) { return $parameter->toArray(); }, $this->parameters ), ]; } /** * @return self */ public static function fromArray(Project $project, array $array) { $method = new self($array['name'], $array['line']); $method->shortDesc = $array['short_desc']; $method->longDesc = $array['long_desc']; $method->hint = $array['hint']; $method->hintDesc = $array['hint_desc']; $method->tags = $array['tags']; $method->modifiers = $array['modifiers']; $method->byRef = $array['is_by_ref']; $method->exceptions = $array['exceptions']; $method->errors = $array['errors']; $method->see = $array['see'] ?? [];// New in 5.4.0 foreach ($array['parameters'] as $parameter) { $method->addParameter(ParameterReflection::fromArray($project, $parameter)); } return $method; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Reflection; class LazyClassReflection extends ClassReflection { protected $loaded = false; public function __construct($name) { parent::__construct($name, -1); } public function isProjectClass(): bool { if (false === $this->loaded) { $this->load(); } return parent::isProjectClass(); } public function getShortDesc() { if (false === $this->loaded) { $this->load(); } return parent::getShortDesc(); } public function setShortDesc($shortDesc) { throw new \LogicException('A LazyClassReflection instance is read-only.'); } public function getLongDesc() { if (false === $this->loaded) { $this->load(); } return parent::getLongDesc(); } public function setLongDesc($longDesc) { throw new \LogicException('A LazyClassReflection instance is read-only.'); } public function getHint() { if (false === $this->loaded) { $this->load(); } return parent::getHint(); } public function setHint($hint) { throw new \LogicException('A LazyClassReflection instance is read-only.'); } public function isAbstract(): bool { if (false === $this->loaded) { $this->load(); } return parent::isAbstract(); } public function isFinal(): bool { if (false === $this->loaded) { $this->load(); } return parent::isFinal(); } public function getFile() { if (false === $this->loaded) { $this->load(); } return parent::getFile(); } public function setFile($file) { throw new \LogicException('A LazyClassReflection instance is read-only.'); } /** * {@inheritDoc} */ public function setModifiers(int $modifiers): void { throw new \LogicException('A LazyClassReflection instance is read-only.'); } public function addProperty(PropertyReflection $property) { throw new \LogicException('A LazyClassReflection instance is read-only.'); } public function getProperties($deep = false) { if (false === $this->loaded) { $this->load(); } return parent::getProperties($deep); } public function setProperties($properties) { throw new \LogicException('A LazyClassReflection instance is read-only.'); } public function addMethod(MethodReflection $method) { throw new \LogicException('A LazyClassReflection instance is read-only.'); } public function getParentMethod($name) { if (false === $this->loaded) { $this->load(); } return parent::getParentMethod($name); } public function getMethods($deep = false) { if (false === $this->loaded) { $this->load(); } return parent::getMethods($deep); } public function setMethods($methods) { throw new \LogicException('A LazyClassReflection instance is read-only.'); } public function addInterface($interface) { throw new \LogicException('A LazyClassReflection instance is read-only.'); } public function getInterfaces($deep = false) { if (false === $this->loaded) { $this->load(); } return parent::getInterfaces($deep); } public function setParent($parent) { throw new \LogicException('A LazyClassReflection instance is read-only.'); } public function getParent($deep = false) { if (false === $this->loaded) { $this->load(); } return parent::getParent($deep); } public function setInterface($boolean) { throw new \LogicException('A LazyClassReflection instance is read-only.'); } public function isInterface() { if (false === $this->loaded) { $this->load(); } return parent::isInterface(); } public function isException() { if (false === $this->loaded) { $this->load(); } return parent::isException(); } public function getAliases() { if (false === $this->loaded) { $this->load(); } return parent::getAliases(); } public function setAliases($aliases) { throw new \LogicException('A LazyClassReflection instance is read-only.'); } protected function load() { $class = $this->project->loadClass($this->name); if (null === $class) { $this->projectClass = false; } else { foreach (array_keys(get_class_vars(ClassReflection::class)) as $property) { $this->$property = $class->$property; } } $this->loaded = true; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Reflection; use Doctum\Project; class ParameterReflection extends Reflection { /** @var FunctionReflection */ protected $function; /** @var MethodReflection */ protected $method; protected $byRef; protected $default; protected $variadic; public function __toString() { return $this->method . '#' . $this->name; } /** * @return ClassReflection|null */ public function getClass() { return $this->method->getClass(); } public function setByRef($boolean) { $this->byRef = $boolean; } public function isByRef() { return $this->byRef; } public function setDefault($default) { $this->default = $default; } public function getDefault() { return $this->default; } public function setVariadic($variadic) { $this->variadic = $variadic; } public function getVariadic() { return $this->variadic; } /** * @return MethodReflection|null */ public function getMethod() { return $this->method; } public function setMethod(MethodReflection $method) { $this->method = $method; } /** * @return FunctionReflection|null */ public function getFunction() { return $this->function; } public function setFunction(FunctionReflection $function) { $this->function = $function; } /** * @overrides */ public function getHint() { if (! is_array($this->hint)) { return []; } $hints = []; if (isset($this->function)) { /** @var FunctionReflection $function */ $function = $this->getFunction(); $project = $function->getProject(); } else { /** @var ClassReflection $class */ $class = $this->getClass(); $project = $class->getProject(); } foreach ($this->hint as $hint) { $hints[] = new HintReflection(Project::isPhpTypeHint($hint[0]) ? $hint[0] : $project->getClass($hint[0]), $hint[1]); } return $hints; } public function toArray() { return [ 'name' => $this->name, 'line' => $this->line, 'short_desc' => $this->shortDesc, 'long_desc' => $this->longDesc, 'hint' => $this->hint, 'tags' => $this->tags, 'modifiers' => $this->modifiers, 'default' => $this->default, 'variadic' => $this->variadic, 'is_by_ref' => $this->byRef, 'is_read_only' => $this->isReadOnly(), ]; } /** * @return self */ public static function fromArray(Project $project, array $array) { $parameter = new self($array['name'], $array['line']); $parameter->shortDesc = $array['short_desc']; $parameter->longDesc = $array['long_desc']; $parameter->hint = $array['hint']; $parameter->tags = $array['tags']; $parameter->modifiers = $array['modifiers']; $parameter->default = $array['default']; $parameter->variadic = $array['variadic']; $parameter->byRef = $array['is_by_ref']; $parameter->isReadOnly = $array['is_read_only'] ?? false;// New in 5.4.0 return $parameter; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Reflection; use Doctum\Project; abstract class Reflection { // Constants from: vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php public const MODIFIER_PUBLIC = 1; public const MODIFIER_PROTECTED = 2; public const MODIFIER_PRIVATE = 4; public const MODIFIER_STATIC = 8; public const MODIFIER_ABSTRACT = 16; public const MODIFIER_FINAL = 32; protected const VISIBILITY_MODIFER_MASK = 7; // 1 | 2 | 4 /** @var string */ protected $name; /** @var int */ protected $line; /** @var string */ protected $shortDesc; /** @var string */ protected $longDesc; /** @var string|null|array */ protected $hint; /** @var string */ protected $hintDesc; /** @var array */ protected $tags; /** @var string|null */ protected $docComment; /** @var array> */ protected $see = []; /** @var string[] */ protected $errors = []; /** @var bool */ protected $isReadOnly = false; /** @var int */ protected $modifiers; public function __construct(string $name, $line) { $this->name = $name; $this->line = $line; $this->tags = []; } /** * @return self|null */ abstract public function getClass(); /** * Set the modifier flags * * @phpstan-param self::MODIFIER_*|int $modifiers */ public function setModifiers(int $modifiers): void { $this->modifiers = $modifiers; } /** * Set the modifier from phpdoc tags * */ public function setModifiersFromTags(): void { $hasFinalTag = count($this->getTags('final')) > 0; $hasProtectedTag = count($this->getTags('protected')) > 0; $hasPrivateTag = count($this->getTags('private')) > 0; $hasPublicTag = count($this->getTags('public')) > 0; $hasStaticTag = count($this->getTags('static')) > 0; $accessTags = $this->getTags('access'); $hasAccessTag = count($accessTags) > 0; $flags = $this->modifiers ?? 0; if ($hasAccessTag) { $accessTag = strtolower(trim(implode('', $accessTags[0]))); if ($accessTag === 'protected') { $hasProtectedTag = true; } elseif ($accessTag === 'private') { $hasPrivateTag = true; } elseif ($accessTag === 'public') { $hasPublicTag = true; } } if ($hasFinalTag) { $flags |= self::MODIFIER_FINAL; } if ($hasProtectedTag) { $flags |= self::MODIFIER_PROTECTED; } if ($hasPrivateTag) { $flags |= self::MODIFIER_PRIVATE; } if ($hasPublicTag) { $flags |= self::MODIFIER_PUBLIC; } if ($hasStaticTag) { $flags |= self::MODIFIER_STATIC; } $this->setModifiers($flags); } public function isPublic(): bool { return self::MODIFIER_PUBLIC === (self::MODIFIER_PUBLIC & $this->modifiers); } public function isProtected(): bool { return self::MODIFIER_PROTECTED === (self::MODIFIER_PROTECTED & $this->modifiers); } public function isPrivate(): bool { return self::MODIFIER_PRIVATE === (self::MODIFIER_PRIVATE & $this->modifiers); } public function isStatic(): bool { return self::MODIFIER_STATIC === (self::MODIFIER_STATIC & $this->modifiers); } public function isAbstract(): bool { return self::MODIFIER_ABSTRACT === (self::MODIFIER_ABSTRACT & $this->modifiers); } public function isFinal(): bool { return self::MODIFIER_FINAL === (self::MODIFIER_FINAL & $this->modifiers); } public function getName(): string { return $this->name; } public function setName(string $name): void { $this->name = $name; } /** * @return int */ public function getLine() { return $this->line; } /** * @param int $line */ public function setLine($line): void { $this->line = $line; } /** * @return string */ public function getShortDesc() { return $this->shortDesc; } /** * @param string $shortDesc * @return void */ public function setShortDesc($shortDesc) { $this->shortDesc = $shortDesc; } /** * @return string */ public function getLongDesc() { return $this->longDesc; } /** * @param string $longDesc * @return void */ public function setLongDesc($longDesc) { $this->longDesc = $longDesc; } /** * @return HintReflection[] */ public function getHint() { if (! is_array($this->hint)) { return []; } $hints = []; /** @var FunctionReflection $class Not sure this is the right type */ $class = $this->getClass(); $project = $class->getProject(); foreach ($this->hint as $hint) { $hints[] = new HintReflection(Project::isPhpTypeHint($hint[0]) ? $hint[0] : $project->getClass($hint[0]), $hint[1]); } return $hints; } /** * @return string * @example string|int */ public function getHintAsString() { $str = []; foreach ($this->getHint() as $hint) { $str[] = ($hint->isClass() ? $hint->getName()->getShortName() : $hint->getName()) . ($hint->isArray() ? '[]' : ''); } return implode('|', $str); } public function hasHint(): bool { return $this->hint ? true : false; } /** * @param string|array|null $hint * @return void */ public function setHint($hint) { $this->hint = $hint; } /** * @return string|array|null */ public function getRawHint() { return $this->hint; } /** * @return void */ public function setHintDesc($desc) { $this->hintDesc = $desc; } /** * @return string */ public function getHintDesc() { return $this->hintDesc; } /** * @param array $tags * @return void */ public function setTags(array $tags): void { $this->tags = $tags; } /** * @return array */ public function getTags($name) { return $this->tags[$name] ?? []; } /** * @return array */ public function getDeprecated() { return $this->getTags('deprecated'); } /** * @return array */ public function getTodo() { return $this->getTags('todo'); } public function isDeprecated(): bool { return ! empty($this->getDeprecated()); } public function isInternal(): bool { return ! empty($this->getTags('internal')); } public function hasExamples(): bool { return ! empty($this->getExamples()); } /** * @return array[] */ public function getExamples(): array { return $this->getTags('example'); } public function hasSince(): bool { return $this->getSince() !== null; } public function getSince(): ?string { /** @var array[] $sinceTags */ $sinceTags = $this->getTags('since'); return count($sinceTags) > 0 ? implode(' ', $sinceTags[0]) : null; } /** * Get the internal tags * * @return array */ public function getInternal(): array { return $this->getTags('internal'); } public function setReadOnly(bool $isReadOnly): void { $this->isReadOnly = $isReadOnly; } public function isReadOnly(): bool { return $this->isReadOnly; } /** * not serialized as it is only useful when parsing * @param string|null $comment * @return void */ public function setDocComment($comment) { $this->docComment = $comment; } /** * @return string|null */ public function getDocComment() { return $this->docComment; } /** * @return array[] */ public function getSee() { $see = []; /** @var FunctionReflection $class Not sure this is the right type */ $class = $this->getClass(); $project = $class->getProject(); foreach ($this->see as $seeElem) { if ($seeElem[3]) { $seeElem = $this->prepareMethodSee($seeElem); } elseif ($seeElem[2]) { $seeElem[2] = Project::isPhpTypeHint($seeElem[2]) ? $seeElem[2] : $project->getClass($seeElem[2]); } $see[] = $seeElem; } return $see; } /** * @param array> $see * @return void */ public function setSee(array $see) { $this->see = $see; } /** * @param array $seeElem * @return array */ private function prepareMethodSee(array $seeElem): array { /** @var FunctionReflection $class Not sure this is the right type */ $class = $this->getClass(); $project = $class->getProject(); $method = null; if ($seeElem[2] !== false) { $class = $project->getClass($seeElem[2]); $method = $class->getMethod($seeElem[3]); } if ($method) { $seeElem[2] = false; $seeElem[3] = $method; } else { $seeElem[2] = false; $seeElem[3] = false; } return $seeElem; } /** * @return string[] */ public function getErrors(): array { return $this->errors; } /** * @param string[] $errors */ public function setErrors(array $errors): void { $this->errors = $errors; } /** * @param array $array * @return self */ abstract public static function fromArray(Project $project, array $array); } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Reflection; use Doctum\Project; class ConstantReflection extends Reflection { protected $class; public function __toString() { return $this->class . '::' . $this->name; } public function getClass() { return $this->class; } public function setClass(ClassReflection $class) { $this->class = $class; } public function toArray() { return [ 'name' => $this->name, 'line' => $this->line, 'short_desc' => $this->shortDesc, 'long_desc' => $this->longDesc, 'modifiers' => $this->modifiers, 'tags' => $this->tags, ]; } /** * @return self */ public static function fromArray(Project $project, array $array) { $constant = new self($array['name'], $array['line']); $constant->shortDesc = $array['short_desc']; $constant->longDesc = $array['long_desc']; $constant->modifiers = $array['modifiers'] ?? 0;// New in 5.4.0 $constant->tags = $array['tags'] ?? [];// New in 5.4.0 return $constant; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Reflection; use Doctum\Project; class ClassReflection extends Reflection { private const CATEGORY_CLASS = 1; private const CATEGORY_INTERFACE = 2; private const CATEGORY_TRAIT = 3; /** @var Project */ protected $project; protected $hash; protected $namespace; /** @var PropertyReflection[] */ protected $properties = []; /** @var MethodReflection[] */ protected $methods = []; protected $interfaces = []; protected $constants = []; protected $traits = []; protected $parent; protected $file; protected $relativeFilePath; protected $category = self::CATEGORY_CLASS; protected $projectClass = true; protected $aliases = []; protected $fromCache = false; public function __toString() { return $this->name; } public function getClass() { return $this; } public function getCategoryId(): int { return $this->category; } public function isProjectClass(): bool { return $this->projectClass; } public function isPhpClass(): bool { return isset(Project::$phpInternalClasses[strtolower($this->name)]); } public function setName(string $name): void { parent::setName(ltrim($name, '\\')); } public function getShortName() { $pos = strrpos($this->name, '\\'); if ($pos !== false) { return substr($this->name, $pos + 1); } return $this->name; } public function getHash() { return $this->hash; } public function setHash($hash) { $this->hash = $hash; } public function getFile() { return $this->file; } public function setFile($file) { $this->file = $file; } public function setRelativeFilePath($relativeFilePath) { $this->relativeFilePath = $relativeFilePath; } public function getRelativeFilePath() { return $this->relativeFilePath; } public function getSourcePath($line = null) { if (null === $this->relativeFilePath) { return ''; } return $this->project->getViewSourceUrl($this->relativeFilePath, $line); } /** * @return Project */ public function getProject() { return $this->project; } /** * @return void */ public function setProject(Project $project) { $this->project = $project; } /** * @return void */ public function setNamespace(string $namespace): void { $this->namespace = ltrim($namespace, '\\'); } public function getNamespace() { return $this->namespace; } public function addProperty(PropertyReflection $property) { $this->properties[$property->getName()] = $property; $property->setClass($this); } public function getProperties($deep = false) { if (false === $deep) { return $this->properties; } $properties = []; if ($this->getParent()) { foreach ($this->getParent()->getProperties(true) as $name => $property) { $properties[$name] = $property; } } foreach ($this->getTraits(true) as $trait) { foreach ($trait->getProperties(true) as $name => $property) { $properties[$name] = $property; } } foreach ($this->properties as $name => $property) { $properties[$name] = $property; } return $properties; } /** * Can be any iterator (so that we can lazy-load the properties) * * @param PropertyReflection[] $properties * @return void */ public function setProperties($properties) { $this->properties = $properties; } /** * @return void */ public function addConstant(ConstantReflection $constant) { $this->constants[$constant->getName()] = $constant; $constant->setClass($this); } public function getConstants($deep = false) { if (false === $deep) { return $this->constants; } $constants = []; if ($this->getParent()) { foreach ($this->getParent()->getConstants(true) as $name => $constant) { $constants[$name] = $constant; } } foreach ($this->constants as $name => $constant) { $constants[$name] = $constant; } return $constants; } public function setConstants($constants) { $this->constants = $constants; } /** * @return void */ public function addMethod(MethodReflection $method) { $this->methods[$method->getName()] = $method; $method->setClass($this); } /** * @return MethodReflection|false False if not found */ public function getMethod($name) { return $this->methods[$name] ?? false; } public function getParentMethod($name) { if ($this->getParent()) { foreach ($this->getParent()->getMethods(true) as $n => $method) { if ($name == $n) { return $method; } } } foreach ($this->getInterfaces(true) as $interface) { foreach ($interface->getMethods(true) as $n => $method) { if ($name == $n) { return $method; } } } } public function getMethods($deep = false) { if (false === $deep) { return $this->methods; } $methods = []; if ($this->isInterface()) { foreach ($this->getInterfaces(true) as $interface) { foreach ($interface->getMethods(true) as $name => $method) { $methods[$name] = $method; } } } if ($this->getParent()) { foreach ($this->getParent()->getMethods(true) as $name => $method) { $methods[$name] = $method; } } foreach ($this->getTraits(true) as $trait) { foreach ($trait->getMethods(true) as $name => $method) { $methods[$name] = $method; } } foreach ($this->methods as $name => $method) { $methods[$name] = $method; } return $methods; } /** * @return void */ public function setMethods($methods) { $this->methods = $methods; } /** * @param \PhpParser\Node\Stmt\Interface_ $interface * @return void */ public function addInterface($interface) { $this->interfaces[$interface] = $interface; } /** * @return ClassReflection[] */ public function getInterfaces($deep = false) { $interfaces = []; foreach ($this->interfaces as $interface) { $interfaces[] = $this->project->getClass($interface); } if (false === $deep) { return $interfaces; } $allInterfaces = $interfaces; foreach ($interfaces as $interface) { $allInterfaces = array_merge($allInterfaces, $interface->getInterfaces(true)); } if ($parent = $this->getParent()) { $allInterfaces = array_merge($allInterfaces, $parent->getInterfaces(true)); } return $allInterfaces; } /** * @param \PhpParser\Node\Stmt\Trait_ $trait * @return void */ public function addTrait($trait) { $this->traits[$trait] = $trait; } /** * @return ClassReflection[] */ public function getTraits($deep = false) { $traits = []; foreach ($this->traits as $trait) { $traits[] = $this->project->getClass($trait); } if (false === $deep) { return $traits; } $allTraits = $traits; foreach ($traits as $trait) { $allTraits = array_merge($allTraits, $trait->getTraits(true)); } if ($parent = $this->getParent()) { $allTraits = array_merge($allTraits, $parent->getTraits(true)); } return $allTraits; } /** * @return void */ public function setTraits($traits) { $this->traits = $traits; } /** * @return void */ public function setParent($parent) { $this->parent = $parent; } public function getParent($deep = false) { if (!$this->parent) { return $deep ? [] : null; } $parent = $this->project->getClass($this->parent); if (false === $deep) { return $parent; } return array_merge([$parent], $parent->getParent(true)); } /** * @return void */ public function setInterface($boolean) { $this->category = $boolean ? self::CATEGORY_INTERFACE : self::CATEGORY_CLASS; } /** * @return bool */ public function isInterface() { return self::CATEGORY_INTERFACE === $this->category; } /** * @return void */ public function setTrait($boolean) { $this->category = $boolean ? self::CATEGORY_TRAIT : self::CATEGORY_CLASS; } /** * @return bool */ public function isTrait() { return self::CATEGORY_TRAIT === $this->category; } /** * @return void */ public function setCategory($category) { $this->category = $category; } public function hasMixins(): bool { return ! empty($this->getTags('mixin')); } /** * @return array> */ public function getMixins(): array { $mixins = []; foreach ($this->getTags('mixin') as $mixin) { $mixins[] = [ 'class' => new ClassReflection($mixin[0], -1), ]; } return $mixins; } /** * @return bool */ public function isException() { $parent = $this; while ($parent = $parent->getParent()) { if ('Exception' == $parent->getName()) { return true; } } return false; } public function getAliases() { return $this->aliases; } /** * @return void */ public function setAliases($aliases) { $this->aliases = $aliases; } public function isFromCache() { return $this->fromCache; } /** * @return void */ public function notFromCache() { $this->fromCache = false; } /** * @return array */ public function toArray() { return [ 'name' => $this->name, 'line' => $this->line, 'short_desc' => $this->shortDesc, 'long_desc' => $this->longDesc, 'hint' => $this->hint, 'tags' => $this->tags, 'namespace' => $this->namespace, 'file' => $this->file, 'relative_file' => $this->relativeFilePath, 'hash' => $this->hash, 'parent' => $this->parent, 'modifiers' => $this->modifiers, 'is_trait' => $this->isTrait(), 'is_interface' => $this->isInterface(), 'is_read_only' => $this->isReadOnly(), 'aliases' => $this->aliases, 'errors' => $this->errors, 'interfaces' => $this->interfaces, 'traits' => $this->traits, 'properties' => array_map( static function ($property) { return $property->toArray(); }, $this->properties ), 'methods' => array_map( static function ($method) { return $method->toArray(); }, $this->methods ), 'constants' => array_map( static function ($constant) { return $constant->toArray(); }, $this->constants ), ]; } /** * @return self */ public static function fromArray(Project $project, array $array) { $class = new self($array['name'], $array['line']); $class->shortDesc = $array['short_desc']; $class->longDesc = $array['long_desc']; $class->hint = $array['hint']; $class->tags = $array['tags']; $class->namespace = $array['namespace']; $class->hash = $array['hash']; $class->file = $array['file']; $class->relativeFilePath = $array['relative_file']; $class->modifiers = $array['modifiers']; $class->fromCache = true; if (isset($array['is_read_only'])) {// New in 5.4.0 $class->setReadOnly($array['is_read_only']); } if ($array['is_interface']) { $class->setInterface(true); } if ($array['is_trait']) { $class->setTrait(true); } $class->aliases = $array['aliases']; $class->errors = $array['errors']; $class->parent = $array['parent']; $class->interfaces = $array['interfaces']; $class->constants = $array['constants']; $class->traits = $array['traits']; $class->setProject($project); foreach ($array['methods'] as $method) { $class->addMethod(MethodReflection::fromArray($project, $method)); } foreach ($array['properties'] as $property) { $class->addProperty(PropertyReflection::fromArray($project, $property)); } foreach ($array['constants'] as $constant) { $class->addConstant(ConstantReflection::fromArray($project, $constant)); } return $class; } /** * @return void */ public function sortInterfaces($sort) { if (is_callable($sort)) { uksort($this->interfaces, $sort); } else { ksort($this->interfaces); } } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Reflection; use Doctum\Project; class PropertyReflection extends Reflection { protected $class; protected $default; /** @var bool */ protected $isWriteOnly = false; public function __toString() { return $this->class . '::$' . $this->name; } /** * {@inheritDoc} */ public function setModifiers(int $modifiers): void { // if no modifiers, property is public if (0 === ($modifiers & self::VISIBILITY_MODIFER_MASK)) { $modifiers |= self::MODIFIER_PUBLIC; } $this->modifiers = $modifiers; } public function setWriteOnly(bool $isWriteOnly): void { $this->isWriteOnly = $isWriteOnly; } public function isWriteOnly(): bool { return $this->isWriteOnly; } public function setDefault($default): void { $this->default = $default; } public function getDefault() { return $this->default; } public function getClass() { return $this->class; } public function setClass(ClassReflection $class): void { $this->class = $class; } /** * @return array */ public function toArray() { return [ 'name' => $this->name, 'line' => $this->line, 'short_desc' => $this->shortDesc, 'long_desc' => $this->longDesc, 'hint' => $this->hint, 'hint_desc' => $this->hintDesc, 'tags' => $this->tags, 'modifiers' => $this->modifiers, 'default' => $this->default, 'errors' => $this->errors, 'is_read_only' => $this->isReadOnly(), 'is_write_only' => $this->isWriteOnly(), ]; } /** * @return self */ public static function fromArray(Project $project, array $array) { $property = new self($array['name'], $array['line']); $property->shortDesc = $array['short_desc']; $property->longDesc = $array['long_desc']; $property->hint = $array['hint']; $property->hintDesc = $array['hint_desc']; $property->tags = $array['tags']; $property->modifiers = $array['modifiers']; $property->default = $array['default']; $property->errors = $array['errors']; if (isset($array['is_read_only'])) {// New in 5.4.0 $property->setReadOnly($array['is_read_only']); } if (isset($array['is_write_only'])) {// New in 5.4.0 $property->setWriteOnly($array['is_write_only']); } return $property; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Reflection; class HintReflection { protected $name; protected $array; public function __construct($name, $array) { $this->name = $name; $this->array = $array; } public function __toString() { // We're casting name to string, as it can be eg. `ClassReflection` object. return (string) $this->name; } public function getName() { return $this->name; } public function setName($name) { $this->name = $name; } public function isClass() { return $this->name instanceof ClassReflection; } public function isArray() { return $this->array; } public function setArray($boolean) { $this->array = (bool) $boolean; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Console\Command; use Doctum\Doctum; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class RenderCommand extends Command { /** * @see Command * @phpstan-return void */ protected function configure() { parent::configure(); $this->addForceOption(); $this->addOutputFormatOption(); $this->addNoProgressOption(); $this->addIgnoreParseErrors(); $defaultVersionName = Doctum::$defaultVersionName; $this ->setName('render') ->setDescription('Renders a project') ->setHelp( <<%command.name% command renders a project as a static set of HTML files: php %command.full_name% render config/doctum.php The --force option forces a rebuild (it disables the incremental rendering algorithm): php %command.full_name% render config/doctum.php --force The --version option overrides the version specified in the configuration: php %command.full_name% render config/doctum.php --version=$defaultVersionName EOF ); } /** * @see Command * * @throws \InvalidArgumentException When the target directory does not exist */ protected function execute(InputInterface $input, OutputInterface $output) { return $this->render($this->doctum->getProject()); } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Console\Command; use Doctum\Doctum; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class ParseCommand extends Command { /** * @see Command * @phpstan-return void */ protected function configure() { parent::configure(); $this->addForceOption(); $this->addOutputFormatOption(); $this->addNoProgressOption(); $this->addIgnoreParseErrors(); $defaultVersionName = Doctum::$defaultVersionName; $this ->setName('parse') ->setDescription('Parses a project') ->setHelp( <<%command.name% command parses a project and generates a database with API information: php %command.full_name% config/symfony.php The --force option forces a rebuild (it disables the incremental parsing algorithm): php %command.full_name% config/symfony.php --force The --version option overrides the version specified in the configuration: php %command.full_name% config/symfony.php --version=$defaultVersionName EOF ); } /** * @see Command * * @throws \InvalidArgumentException When the target directory does not exist */ protected function execute(InputInterface $input, OutputInterface $output) { return $this->parse($this->doctum->getProject()); } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Console\Command; use CodeLts\CliTools\AnalysisResult; use CodeLts\CliTools\AnsiEscapeSequences; use CodeLts\CliTools\ErrorsConsoleStyle; use CodeLts\CliTools\Exceptions\FormatNotFoundException; use CodeLts\CliTools\OutputFormat; use CodeLts\CliTools\Symfony\SymfonyOutput; use CodeLts\CliTools\Symfony\SymfonyStyle; use Doctum\Message; use Doctum\Parser\Transaction; use Doctum\Project; use Doctum\Renderer\Diff; use Doctum\Doctum; use Symfony\Component\Console\Command\Command as BaseCommand; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\ConsoleOutputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Filesystem\Filesystem; abstract class Command extends BaseCommand { private const PARSE_ERROR = 64; /** * @var Doctum */ protected $doctum; /** * @var string */ protected $version; /** * @var bool */ protected $started; /** * @var bool */ protected $progressStarted = false; /** * @var array */ protected $diffs = []; /** * @var array */ protected $transactions = []; /** * @var \Doctum\Parser\ParseError[] */ protected $errors = []; /** * @var InputInterface */ protected $input; /** * @var SymfonyOutput */ protected $output; /** * @var SymfonyOutput */ protected $errorOutput; /** * @var string|null */ protected $sourceRootDirectory = null; /** * @see Command * @phpstan-return void */ protected function configure() { $this->getDefinition()->addArgument(new InputArgument('config', InputArgument::REQUIRED, 'The configuration file')); $this->getDefinition()->addOption(new InputOption('only-version', '', InputOption::VALUE_REQUIRED, 'The version to build')); } protected function addForceOption(): void { $this->getDefinition()->addOption(new InputOption('force', '', InputOption::VALUE_NONE, 'Forces to rebuild from scratch', null)); } protected function addOutputFormatOption(): void { $this->getDefinition()->addOption( new InputOption( 'output-format', '', InputOption::VALUE_REQUIRED, 'The format to display errors', OutputFormat::OUTPUT_FORMAT_RAW_TEXT ) ); } protected function addNoProgressOption(): void { $this->getDefinition()->addOption(new InputOption('no-progress', '', InputOption::VALUE_NONE, 'Do not display the progress bar', null)); } protected function addIgnoreParseErrors(): void { $this->getDefinition()->addOption( new InputOption('ignore-parse-errors', '', InputOption::VALUE_NONE, 'Ignores parse errors and exits 0', null) ); } /** * @phpstan-return void */ protected function initialize(InputInterface $input, OutputInterface $output) { $this->input = $input; $stdErr = $output; if ($output instanceof ConsoleOutputInterface) { $stdErr = $output->getErrorOutput(); } $errorConsoleStyle = new ErrorsConsoleStyle($this->input, $output); $this->output = new SymfonyOutput($output, new SymfonyStyle($errorConsoleStyle)); $this->errorOutput = new SymfonyOutput($stdErr, new SymfonyStyle($errorConsoleStyle)); /** @var string $config */ $config = $input->getArgument('config'); $filesystem = new Filesystem(); if ($config && !$filesystem->isAbsolutePath($config)) { $config = getcwd() . '/' . $config; } if (!is_file($config)) { throw new \InvalidArgumentException(sprintf('Configuration file "%s" does not exist.', $config)); } $this->doctum = $this->loadDoctum($config); if (!$this->doctum instanceof Doctum) { throw new \RuntimeException(sprintf('Configuration file "%s" must return a Doctum instance.', $config)); } if ($input->getOption('only-version')) { /** @var string $onlyVersionOption */ $onlyVersionOption = $input->getOption('only-version'); $this->doctum->setVersion((string) $onlyVersionOption); } } public function update(Project $project): int { if (! $this->checkOptionsValues()) { return 1; } $this->sourceRootDirectory = $project->getSourceDir(); $this->output->writeFormatted( $this->output->isDecorated() ? ' Updating project ' : 'Updating project' ); $project->update([$this, 'messageCallback'], $this->input->getOption('force')); $this->displayParseSummary(); $this->displayRenderSummary(); return $this->getExitCode(); } public function parse(Project $project): int { if (! $this->checkOptionsValues()) { return 1; } $project->parse([$this, 'messageCallback'], $this->input->getOption('force')); $this->sourceRootDirectory = $project->getSourceDir(); $this->output->writeFormatted( $this->output->isDecorated() ? ' Parsing project ' : 'Parsing project' ); $this->displayParseSummary(); return $this->getExitCode(); } public function render(Project $project): int { if (! $this->checkOptionsValues()) { return 1; } $project->render([$this, 'messageCallback'], $this->input->getOption('force')); $this->sourceRootDirectory = $project->getSourceDir(); $this->output->writeFormatted( $this->output->isDecorated() ? ' Rendering project ' : 'Rendering project' ); $this->displayRenderSummary(); return $this->getExitCode(); } private function checkOptionsValues(): bool { try { OutputFormat::checkOutputFormatIsValid($this->getOutputFormat()); return true; } catch (FormatNotFoundException $e) { $this->output->getStyle()->error($e->getMessage()); return false; } } private function getOutputFormat(): string { /** @var string $outputFormat */ $outputFormat = $this->input->getOption('output-format'); return (string) $outputFormat; } private function getExitCode(): int { if ($this->input->getOption('ignore-parse-errors')) { return 0; } if (count($this->errors) > 0) { return self::PARSE_ERROR; } return 0; } /** * @param mixed $data */ public function messageCallback(int $message, $data): void { switch ($message) { case Message::PARSE_CLASS: [$step, $steps, $class] = $data; $this->displayParseProgress($class); $this->makeProgress($step, $steps); break; case Message::PARSE_ERROR: $this->errors = array_merge($this->errors, $data); break; case Message::SWITCH_VERSION: $this->version = $data; $this->errors = []; $this->started = false; $this->displayNewVersion(); break; case Message::PARSE_VERSION_FINISHED: $this->transactions[(string) $this->version] = $data; $this->displayParseEnd($data); $this->endProgress(); $this->started = false; break; case Message::RENDER_VERSION_FINISHED: $this->diffs[(string) $this->version] = $data; $this->displayRenderEnd($data); $this->endProgress(); $this->started = false; break; case Message::RENDER_PROGRESS: [$section, $message, $step, $steps] = $data; $this->displayRenderProgress($section, $message); $this->makeProgress($step, $steps); break; } } protected function makeProgress(int $step, int $steps): void { if ($this->progressStarted === false) { $this->output->getStyle()->progressStart($steps); $this->progressStarted = true; } $this->output->getStyle()->progressAdvance(1); } protected function endProgress(): void { if ($this->progressStarted === false) { return; } $this->progressStarted = false; $this->output->getStyle()->progressFinish(); } /** * @param \Doctum\Reflection\ClassReflection $class */ public function displayParseProgress($class): void { if (! $this->started) { $this->started = true; } if ($this->progressStarted === false) { // This avoids to have a "Parsing" stuck before the "Parsing" in progress $this->output->writeRaw("\n"); return; } if ($this->output->isDecorated()) { $this->output->writeRaw(AnsiEscapeSequences::MOVE_CURSOR_UP_2); } $errorsPluralText = (1 === count($this->errors) ? '' : 's'); $this->output->writeFormatted( $this->output->isDecorated() ? sprintf( ' Parsing %s' . AnsiEscapeSequences::ERASE_TO_LINE_END . "\n %s" . AnsiEscapeSequences::ERASE_TO_LINE_END . "\n", count($this->errors) ? ' ' . count($this->errors) . ' error' . $errorsPluralText . '' : '', $class->getName() ) : sprintf( 'Parsing %s %s' . "\n", $class->getName(), count($this->errors) ? 'total: ' . count($this->errors) . ' error' . $errorsPluralText : '' ) ); } public function displayRenderProgress(string $section, string $message): void { if (! $this->started) { $this->started = true; } if ($this->progressStarted === false) { // This avoids to have a "Rendering" stuck before the "Rendering" in progress $this->output->writeRaw("\n"); return; } if ($this->output->isDecorated()) { $this->output->writeRaw(AnsiEscapeSequences::MOVE_CURSOR_UP_2); } $this->output->writeFormatted( $this->output->isDecorated() ? sprintf( ' Rendering ' . AnsiEscapeSequences::ERASE_TO_LINE_END . "\n %s %s" . AnsiEscapeSequences::ERASE_TO_LINE_END . "\n", $section, $message ) : sprintf( 'Rendering %s %s' . "\n", $section, $message ) ); } public function displayParseEnd(Transaction $transaction): void { if (!$this->started) { return; } $this->output->writeFormatted( $this->output->isDecorated() ? AnsiEscapeSequences::MOVE_CURSOR_UP_2 . ' Parsing done' . AnsiEscapeSequences::ERASE_TO_LINE_END . "\n" . AnsiEscapeSequences::ERASE_TO_LINE_END . "\n" . AnsiEscapeSequences::MOVE_CURSOR_UP_1 : 'Parsing done' . "\n" ); if ($this->output->isVerbose() && count($this->errors) > 0) { $this->output->writeLineFormatted(''); $analysisResult = new AnalysisResult( $this->errors, [], [], [] ); OutputFormat::displayUserChoiceFormat( $this->getOutputFormat(), $analysisResult, $this->sourceRootDirectory, $this->errorOutput ); $this->output->writeLineFormatted(''); } } public function displayRenderEnd(Diff $diff): void { if (!$this->started) { return; } $this->output->writeFormatted( $this->output->isDecorated() ? AnsiEscapeSequences::MOVE_CURSOR_UP_2 . ' Rendering done' . AnsiEscapeSequences::ERASE_TO_LINE_END . "\n" . AnsiEscapeSequences::ERASE_TO_LINE_END . "\n" . AnsiEscapeSequences::MOVE_CURSOR_UP_1 : 'Rendering done' . "\n" ); $this->output->writeLineFormatted(''); } public function displayParseSummary(): void { if (count($this->transactions) <= 0) { return; } $this->output->writeLineFormatted('');// Display a line break after the title $this->output->writeLineFormatted( ' Version Updated C Removed C ' ); foreach ($this->transactions as $version => $transaction) { $this->output->writeLineFormatted( sprintf( '%9s %11d %11d', $version, count($transaction->getModifiedClasses()), count($transaction->getRemovedClasses()) ) ); } $this->output->writeLineFormatted(''); } public function displayRenderSummary(): void { if (count($this->diffs) <= 0) { return; } $this->output->writeLineFormatted('');// Display a line break after the title $this->output->writeLineFormatted( ' Version Updated C ' . ' Updated N Removed C ' . ' Removed N ' ); foreach ($this->diffs as $version => $diff) { $this->output->writeLineFormatted( sprintf( '%9s %11d %11d %11d %11d', $version, count($diff->getModifiedClasses()), count($diff->getModifiedNamespaces()), count($diff->getRemovedClasses()), count($diff->getRemovedNamespaces()) ) ); } $this->output->writeLineFormatted(''); } public function displayNewVersion(): void { $this->output->getStyle()->section(sprintf("\nVersion %s", $this->version)); } /** * @return Doctum */ private function loadDoctum(string $config) { return require $config; } } setName('version') ->setDescription('Know everything about this version') ->setHelp( <<%command.name% command gives you access to version data: php %command.full_name% To print everything in the JSON format: php %command.full_name% --json To print everything in a text format: php %command.full_name% --text EOF ); $this->getDefinition()->addOption( new InputOption('json', null, InputOption::VALUE_NONE, 'Show the data in a JSON format') ); $this->getDefinition()->addOption( new InputOption('text', null, InputOption::VALUE_NONE, 'Show the data in a text format for humans') ); } protected function execute(InputInterface $input, OutputInterface $output) { $data = [ 'version' => Doctum::VERSION, 'major' => Doctum::VERSION_MAJOR, 'minor' => Doctum::VERSION_MINOR, 'patch' => Doctum::VERSION_PATCH, 'is_dev_version' => Doctum::IS_DEV, 'license' => 'MIT', 'phar_metadata' => null, ]; if (class_exists(Phar::class)) { $pharPath = Phar::running(false); if ($pharPath !== '') { $phar_self = new Phar($pharPath); $metadata = $phar_self->getMetadata(); $data['phar_metadata'] = [ 'vcs.git' => $metadata['vcs.git'], 'vcs.browser' => $metadata['vcs.browser'], 'vcs.ref' => $metadata['vcs.ref'], 'build-date' => $metadata['build-date'], ]; } } if ($input->getOption('json')) { $jsonData = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); if ($jsonData === false) { return 1; } $output->writeln($jsonData); return 0; } if ($input->getOption('text')) { /** @var bool $isDev */ $isDev = $data['is_dev_version']; $output->writeln('Version: ' . $data['version']); $output->writeln('Version-major: ' . $data['major']); $output->writeln('Version-minor: ' . $data['minor']); $output->writeln('Version-patch: ' . $data['patch']); $output->writeln('Version-is-dev: ' . ($isDev ? 'yes' : 'no')); $output->writeln('License: ' . $data['license']); $isPhar = $data['phar_metadata'] !== null; $output->writeln('Phar-detected: ' . ($isPhar ? 'yes' : 'no')); if ($isPhar) { /** @var array $meta */ $meta = $data['phar_metadata']; $output->writeln('Phar-Vcs-Git: ' . $meta['vcs.git']); $output->writeln('Phar-Vcs-Browser: ' . $meta['vcs.browser']); $output->writeln('Phar-Vcs-Ref: ' . $meta['vcs.ref']); $output->writeln('Phar-Build-Date: ' . $meta['build-date']); } return 0; } $output->writeln($data['version']); return 0; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Console\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class UpdateCommand extends Command { /** * @see Command * @phpstan-return void */ protected function configure() { parent::configure(); $this->addForceOption(); $this->addOutputFormatOption(); $this->addNoProgressOption(); $this->addIgnoreParseErrors(); $this ->setName('update') ->setDescription('Parses then renders a project') ->setHelp( <<%command.name% command parses and renders a project: php %command.full_name% config/symfony.php This command is the same as running the parse command followed by the render command. EOF ); } /** * @see Command * * @throws \InvalidArgumentException When the target directory does not exist */ protected function execute(InputInterface $input, OutputInterface $output) { return $this->update($this->doctum->getProject()); } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Console; use Doctum\Console\Command\ParseCommand; use Doctum\Console\Command\RenderCommand; use Doctum\Console\Command\UpdateCommand; use Doctum\Console\Command\VersionCommand; use Doctum\ErrorHandler; use Doctum\Doctum; use Symfony\Component\Console\Application as BaseApplication; class Application extends BaseApplication { public function __construct() { error_reporting(-1); ErrorHandler::register(); parent::__construct('Doctum', Doctum::VERSION); $this->add(new VersionCommand()); $this->add(new UpdateCommand()); $this->add(new ParseCommand()); $this->add(new RenderCommand()); } public function getLongVersion() { return parent::getLongVersion() . ' by Fabien Potencier and William Desportes'; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum; use Wdes\phpI18nL10n\Launcher; class Tree { public static function getGlobalNamespacePageName(): string { return Launcher::gettext('[Global_Namespace]'); } public static function getGlobalNamespaceName(): string { return Launcher::gettext('[Global Namespace]'); } /** * @return array[] */ public function getTree(Project $project) { $namespaces = []; $ns = $project->getNamespaces(); foreach ($ns as $namespace) { if (false !== $pos = strpos($namespace, '\\')) { $namespaces[substr($namespace, 0, $pos)][] = $namespace; } else { $namespaces[$namespace][] = $namespace; } } return $this->generateClassTreeLevel($project, 1, $namespaces, []); } /** * @param int $level * @param array $namespaces * @param \Doctum\Reflection\ClassReflection[] $classes * @return array[] */ protected function generateClassTreeLevel(Project $project, $level, array $namespaces, array $classes) { ++$level; $tree = []; foreach ($namespaces as $namespace => $subnamespaces) { // classes $cl = $project->getNamespaceAllClasses($namespace); // subnamespaces $ns = []; foreach ($subnamespaces as $subnamespace) { $parts = explode('\\', $subnamespace); if (!isset($parts[$level - 1])) { continue; } $ns[implode('\\', array_slice($parts, 0, $level))][] = $subnamespace; } $parts = explode('\\', $namespace); $url = ''; $url = $parts[count($parts) - 1] && $project->hasNamespace($namespace) && (count($subnamespaces) || count($cl)) ? $namespace : ''; $short = $parts[count($parts) - 1] ? $parts[count($parts) - 1] : self::getGlobalNamespaceName(); $tree[] = [$short, $url, $this->generateClassTreeLevel($project, $level, $ns, $cl)]; } foreach ($classes as $class) { $short = $class->getShortName(); $tree[] = [$short, $class, []]; } return $tree; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ declare(strict_types = 1); namespace Doctum\Renderer; use Symfony\Component\Finder\Finder; use Symfony\Component\Yaml\Yaml; class ThemeSet { protected $themes; public function __construct(array $dirs) { $this->discover($dirs); } public function getTheme($name) { if (!isset($this->themes[$name])) { throw new \InvalidArgumentException(sprintf('Theme "%s" does not exist.', $name)); } return $this->themes[$name]; } protected function discover(array $dirs) { $this->themes = []; $parents = []; $themes = Finder::create()->name('manifest.yml')->files()->in($dirs)->getIterator(); foreach ($themes as $manifest) { $manifest = $manifest->getPathname(); if (! file_exists($manifest)) { // This should not exist throw new \InvalidArgumentException(sprintf('Theme manifest "%s" is not a file.', $manifest)); } $text = file_get_contents($manifest); if ($text === false) { throw new \Exception(sprintf('Could not read "%s" file.', $manifest)); } $config = Yaml::parse($text); if (!isset($config['name'])) { throw new \InvalidArgumentException(sprintf('Theme manifest in "%s" must have a "name" entry.', $manifest)); } $theme = new Theme($config['name'], dirname($manifest)); $this->themes[$config['name']] = $theme; if (isset($config['parent'])) { $parents[$config['name']] = $config['parent']; } foreach (['static', 'global', 'namespace', 'class'] as $type) { if (isset($config[$type])) { $theme->setTemplates($type, $config[$type]); } } } // populate parent foreach ($parents as $name => $parent) { if (!isset($this->themes[$parent])) { throw new \LogicException(sprintf('Theme "%s" inherits from an unknown "%s" theme.', $name, $parent)); } $this->themes[$name]->setParent($this->themes[$parent]); } } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Renderer; use Doctum\Reflection\Reflection; use Doctum\Reflection\ClassReflection; use Doctum\Reflection\FunctionReflection; use Doctum\Reflection\MethodReflection; use Doctum\Reflection\PropertyReflection; use Doctum\Tree; use Twig\Extension\AbstractExtension; use Twig\TwigFunction; use Twig\TwigFilter; use Parsedown; class TwigExtension extends AbstractExtension { /** @var Parsedown */ protected $markdown; protected $project; /** @var int|null */ protected $currentDepth = null; /** * Returns a list of filters to add to the existing list. * * @return TwigFilter[] An array of filters */ public function getFilters() { return [ new TwigFilter('desc', [$this, 'parseDesc'], ['needs_context' => true, 'is_safe' => ['html']]), new TwigFilter('snippet', [$this, 'getSnippet']), ]; } /** * Returns a list of functions to add to the existing list. * * @return TwigFunction[] An array of functions */ public function getFunctions() { return [ new TwigFunction('global_namespace_name', [Tree::class, 'getGlobalNamespaceName']), new TwigFunction('function_path', [$this, 'pathForFunction'], ['needs_context' => true, 'is_safe' => ['html']]), new TwigFunction('namespace_path', [$this, 'pathForNamespace'], ['needs_context' => true, 'is_safe' => ['html']]), new TwigFunction('class_path', [$this, 'pathForClass'], ['needs_context' => true, 'is_safe' => ['html']]), new TwigFunction('method_path', [$this, 'pathForMethod'], ['needs_context' => true, 'is_safe' => ['html']]), new TwigFunction('property_path', [$this, 'pathForProperty'], ['needs_context' => true, 'is_safe' => ['html']]), new TwigFunction('path', [$this, 'pathForStaticFile'], ['needs_context' => true]), new TwigFunction( 'abbr_class', static function ($class, bool $absolute = false) { return self::abbrClass($class, $absolute); }, ['is_safe' => ['html']] ), ]; } public function setCurrentDepth(int $depth): void { $this->currentDepth = $depth; } public function pathForFunction(array $context, string $function): string { return $this->relativeUri($this->currentDepth) . '#function_' . str_replace('\\', '', $function); } public function pathForClass(array $context, string $class): string { return $this->relativeUri($this->currentDepth) . str_replace('\\', '/', $class) . '.html'; } public function pathForNamespace(array $context, string $namespace): string { if ($namespace === '') { $namespace = Tree::getGlobalNamespacePageName(); } return $this->relativeUri($this->currentDepth) . str_replace('\\', '/', $namespace) . '.html'; } public function pathForMethod(array $context, MethodReflection $method) { /** @var Reflection $class */ $class = $method->getClass(); return $this->relativeUri($this->currentDepth) . str_replace('\\', '/', $class->getName()) . '.html#method_' . $method->getName(); } public function pathForProperty(array $context, PropertyReflection $property) { /** @var Reflection $class */ $class = $property->getClass(); return $this->relativeUri($this->currentDepth) . str_replace('\\', '/', $class->getName()) . '.html#property_' . $property->getName(); } public function pathForStaticFile(array $context, string $file): string { return $this->relativeUri($this->currentDepth) . $file; } /** * Generate the abbreviation of a class * * @param ClassReflection|string $class The class */ public static function abbrClass($class, bool $absolute = false): string { if ($class instanceof ClassReflection) { $short = $class->getShortName(); $class = $class->getName(); if ($short === $class && !$absolute) { return htmlspecialchars($class, ENT_QUOTES); } } else { $parts = explode('\\', $class, ENT_QUOTES); if (count($parts) === 1 && !$absolute) { return htmlspecialchars($class); } $short = array_pop($parts); } return sprintf('%s', htmlentities($class, ENT_QUOTES), htmlspecialchars($short)); } public function parseDesc(array $context, ?string $desc, Reflection $classOrFunctionRefl) { if ($desc === null || $desc === '') { return $desc; } if (null === $this->markdown) { $this->markdown = new Parsedown(); } $desc = str_replace(['', ''], ['```', '```'], $desc); $desc = (string) preg_replace_callback( '/@see ([^ ]+)/', // Match until a whitespace is found function ($match) use (&$classOrFunctionRefl): string { return $this->transformContentsIntoLinks($match[1], $classOrFunctionRefl); }, $desc ); $desc = (string) preg_replace_callback( '/\{@link (?!\})(?[^\r\n\t\f]+)\}/', function (array $match) use (&$classOrFunctionRefl): string { $data = rtrim($match['contents'], '}'); return $this->transformContentsIntoLinks($data, $classOrFunctionRefl); }, $desc ); return $this->markdown->text($desc); } public function transformContentsIntoLinks(string $data, Reflection $classOrFunctionRefl): string { $isClassReflection = $classOrFunctionRefl instanceof ClassReflection; $isFunctionReflection = $classOrFunctionRefl instanceof FunctionReflection; if (! $isClassReflection && ! $isFunctionReflection) { return $data; } /** @var ClassReflection|FunctionReflection $class */ $class = $classOrFunctionRefl; // Example: Foo::bar_function_on_foo_class $classMethod = explode('::', trim($data, " \t\n\r"), 2); // Found "bar_function_on_foo_class", from example: bar_function_on_foo_class if (count($classMethod) === 1 && $class instanceof ClassReflection) { // In this case we resolve a link to a method name in the current class $method = $class->getMethod($classMethod[0]); if ($method !== false) { $short = $this->pathForMethod([], $method); return '[' . $data . '](' . $short . ')'; } } /** @var \Doctum\Project|null $project Original one is not realistic */ $project = $class->getProject(); if ($project === null) { // This should never happen return $data; } $cr = $project->getClass($classMethod[0]); if ($cr->isPhpClass()) { $className = $cr->getName(); return '[' . $className . '](https://www.php.net/' . $className . ')'; } if (! $cr->isProjectClass()) { return $data; } // Found "bar_function_on_foo_class", from example: Foo::bar_function_on_foo_class if (count($classMethod) === 2) { // In this case we have a function name to resolve on the previously found class $method = $cr->getMethod($classMethod[1]); if ($method !== false) { $short = $this->pathForMethod([], $method); return '[' . $data . '](' . $short . ')'; } } // Final case, we link the found class $short = $this->pathForClass([], $cr->getName()); return '[' . $data . '](' . $short . ')'; } /** * Seems not to be used * * @return string */ public function getSnippet(string $string) { if (preg_match('/^(.{50,}?)\s.*/m', $string, $matches)) { $string = $matches[1]; } return str_replace(["\n", "\r"], '', strip_tags($string)); } protected function relativeUri(?int $value): string { if (!$value) { return ''; } return rtrim(str_repeat('../', $value), '/') . '/'; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Renderer; use Doctum\Project; class Index implements \Serializable { protected $classes; protected $versions; protected $namespaces; public function __construct(?Project $project = null) { $this->classes = []; if (null !== $project) { foreach ($project->getProjectClasses() as $class) { $this->classes[$class->getName()] = $class->getHash(); } } $this->versions = []; if (null !== $project) { foreach ($project->getVersions() as $version) { $this->versions[] = (string) $version; } } $this->namespaces = []; if (null !== $project) { $this->namespaces = $project->getNamespaces(); } } public function getVersions() { return $this->versions; } public function getClasses() { return $this->classes; } public function getNamespaces() { return $this->namespaces; } public function getHash($class) { return $this->classes[$class] ?? false; } public function serialize() { return serialize([$this->classes, $this->versions, $this->namespaces]); } public function unserialize($data) { [$this->classes, $this->versions, $this->namespaces] = unserialize($data); } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Renderer; class Theme { protected $name; protected $dir; protected $parent; protected $templates; public function __construct($name, $dir) { $this->name = $name; $this->dir = $dir; } public function getTemplateDirs() { $dirs = []; if ($this->parent) { $dirs = $this->parent->getTemplateDirs(); } array_unshift($dirs, $this->dir); return $dirs; } public function setParent(Theme $parent) { $this->parent = $parent; } public function getParent() { return $this->parent; } public function getName() { return $this->name; } public function getTemplates($type) { $templates = []; if ($this->parent) { $templates = $this->parent->getTemplates($type); } if (!isset($this->templates[$type])) { return $templates; } return array_replace($templates, $this->templates[$type]); } public function setTemplates($type, $templates) { $this->templates[$type] = $templates; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Renderer; use Doctum\Project; class Diff { /** @var Project */ protected $project; /** @var Index */ protected $current; /** @var string[] */ protected $versions; /** @var string */ protected $filename; /** @var bool */ protected $alreadyRendered; protected $previousNamespaces; protected $currentNamespaces; /** @var Index */ private $previous; public function __construct(Project $project, string $filename) { $this->project = $project; $this->current = new Index($project); $this->filename = $filename; if (file_exists($filename)) { $this->alreadyRendered = true; $previous = $this->readSerializedFile($filename); if (null === $previous) { $this->alreadyRendered = false; $this->previous = new Index(); } else { $this->previous = $previous; } } else { $this->alreadyRendered = false; $this->previous = new Index(); } $this->previousNamespaces = $this->previous->getNamespaces(); $this->currentNamespaces = $this->current->getNamespaces(); } protected function readSerializedFile(string $filename): ?Index { $contents = file_get_contents($filename); if ($contents === false) { return null; } $contents = @unserialize($contents); return $contents === false ? null : $contents; } /** * @return bool */ public function isEmpty() { return !$this->areVersionsModified() && (0 == count($this->getModifiedClasses()) + count($this->getRemovedClasses())); } /** * @return void */ public function save() { file_put_contents($this->filename, serialize($this->current)); } /** * @return bool */ public function isAlreadyRendered() { return $this->alreadyRendered; } /** * @return bool */ public function areVersionsModified() { $versions = []; foreach ($this->project->getVersions() as $version) { $versions[] = (string) $version; } return $versions != $this->previous->getVersions(); } public function getModifiedNamespaces() { return array_diff($this->currentNamespaces, $this->previousNamespaces); } public function getRemovedNamespaces() { return array_diff($this->previousNamespaces, $this->currentNamespaces); } /** * @return \Doctum\Reflection\ClassReflection[] */ public function getModifiedClasses() { $classes = []; foreach ($this->current->getClasses() as $class => $hash) { if ($hash !== $this->previous->getHash($class)) { $classes[] = $this->project->getClass($class); } } return $classes; } public function getRemovedClasses() { return array_diff(array_keys($this->previous->getClasses()), array_keys($this->current->getClasses())); } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Renderer; use Doctum\Indexer; use Doctum\Message; use Doctum\Project; use Doctum\Reflection\ClassReflection; use Doctum\Tree; use Symfony\Component\Filesystem\Filesystem; class Renderer { protected $twig; protected $templates; protected $filesystem; protected $themes; protected $theme; /** @var int */ protected $steps; /** @var int */ protected $step; protected $tree; protected $indexer; protected $cachedTree; public function __construct(\Twig\Environment $twig, ThemeSet $themes, Tree $tree, Indexer $indexer) { $this->twig = $twig; $this->themes = $themes; $this->tree = $tree; $this->cachedTree = []; $this->indexer = $indexer; $this->filesystem = new Filesystem(); } public function isRendered(Project $project) { return $this->getDiff($project)->isAlreadyRendered(); } public function render(Project $project, $callback = null, $force = false) { $cacheDir = $project->getCacheDir() . '/twig'; $this->twig->setCache($cacheDir); if ($force) { $project->flushDir($cacheDir); } $diff = $this->getDiff($project); if ($diff->isEmpty()) { return $diff; } $this->steps = count($diff->getModifiedClasses()) + count($diff->getModifiedNamespaces()) + count($this->getTheme($project)->getTemplates('global')) + 1; $this->step = 0; $this->theme = $this->getTheme($project); $dirs = $this->theme->getTemplateDirs(); // add parent directory to be able to extends the same template as the current one but in the parent theme foreach ($dirs as $dir) { $dirs[] = dirname($dir); } $this->twig->getLoader()->setPaths(array_unique($dirs)); $this->twig->addGlobal('has_namespaces', $project->hasNamespaces()); $this->twig->addGlobal('project', $project); $this->renderStaticTemplates($project, $callback); $this->renderGlobalTemplates($project, $callback); $this->renderNamespaceTemplates($diff->getModifiedNamespaces(), $project, $callback); $this->renderClassTemplates($diff->getModifiedClasses(), $project, $callback); // cleanup foreach ($diff->getRemovedClasses() as $class) { foreach ($this->theme->getTemplates('class') as $target) { $this->filesystem->remove(sprintf($target, str_replace('\\', '/', $class))); } } $diff->save(); return $diff; } protected function renderStaticTemplates(Project $project, $callback = null) { if (null !== $callback) { call_user_func($callback, Message::RENDER_PROGRESS, ['Static', 'Rendering files', $this->step, $this->steps]); } $dirs = $this->theme->getTemplateDirs(); foreach ($this->theme->getTemplates('static') as $template => $target) { foreach (array_reverse($dirs) as $dir) { if (file_exists($dir . '/' . $template)) { $this->filesystem->copy($dir . '/' . $template, $project->getBuildDir() . '/' . $target); continue 2; } } } } protected function renderGlobalTemplates(Project $project, $callback = null) { $variables = [ 'namespaces' => $project->getNamespaces(), 'interfaces' => $project->getProjectInterfaces(), 'classes' => $project->getProjectClasses(), 'items' => $this->getIndex($project), 'index' => $this->indexer->getIndex($project), 'tree' => $this->getTree($project), ]; foreach ($this->theme->getTemplates('global') as $template => $target) { if (null !== $callback) { call_user_func($callback, Message::RENDER_PROGRESS, ['Global', $target, $this->step, $this->steps]); } $this->save($project, $target, $template, $variables); } } protected function renderNamespaceTemplates(array $namespaces, Project $project, $callback = null) { foreach ($namespaces as $namespace) { $namespaceDisplayName = $namespace; $namespaceName = $namespace; if ($namespace === '') { $namespaceDisplayName = Tree::getGlobalNamespaceName(); $namespaceName = Tree::getGlobalNamespacePageName(); } if (null !== $callback) { call_user_func($callback, Message::RENDER_PROGRESS, ['Namespace', $namespaceDisplayName, $this->step, $this->steps]); } $variables = [ 'namespace' => $namespace, 'subnamespaces' => $project->getNamespaceSubNamespaces($namespace), 'functions' => $project->getNamespaceFunctions($namespace), 'classes' => $project->getNamespaceClasses($namespace), 'interfaces' => $project->getNamespaceInterfaces($namespace), 'exceptions' => $project->getNamespaceExceptions($namespace), 'tree' => $this->getTree($project), ]; foreach ($this->theme->getTemplates('namespace') as $template => $target) { $this->save($project, sprintf($target, str_replace('\\', '/', $namespaceName)), $template, $variables); } } } /** * @param Callable|null $callback * @return array */ protected function getVariablesFromClassReflection(ClassReflection $class, Project $project, $callback = null): array { if (null !== $callback) { call_user_func($callback, Message::RENDER_PROGRESS, ['Class', $class->getName(), $this->step, $this->steps]); } $properties = $class->getProperties($project->getConfig('include_parent_data')); $sortProperties = $project->getConfig('sort_class_properties'); if ($sortProperties) { if (is_callable($sortProperties)) { uksort($properties, $sortProperties); } else { ksort($properties); } } $methods = $class->getMethods($project->getConfig('include_parent_data')); $sortMethods = $project->getConfig('sort_class_methods'); if ($sortMethods) { if (is_callable($sortMethods)) { uksort($methods, $sortMethods); } else { ksort($methods); } } $constants = $class->getConstants($project->getConfig('include_parent_data')); $sortConstants = $project->getConfig('sort_class_constants'); if ($sortConstants) { if (is_callable($sortConstants)) { uksort($constants, $sortConstants); } else { ksort($constants); } } $traits = $class->getTraits($project->getConfig('include_parent_data')); $sortTraits = $project->getConfig('sort_class_traits'); if ($sortTraits) { if (is_callable($sortTraits)) { uksort($traits, $sortTraits); } else { ksort($traits); } } $sortInterfaces = $project->getConfig('sort_class_interfaces'); if ($sortInterfaces) { $class->sortInterfaces($sortInterfaces); } return [ 'class' => $class, 'properties' => $properties, 'methods' => $methods, 'constants' => $constants, 'traits' => $traits, 'tree' => $this->getTree($project), ]; } /** * @param ClassReflection[] $classes * @param Project $project * @param Callable|null $callback * @return void */ protected function renderClassTemplates(array $classes, Project $project, $callback = null) { foreach ($classes as $class) { $variables = $this->getVariablesFromClassReflection($class, $project, $callback); foreach ($this->theme->getTemplates('class') as $template => $target) { $this->save($project, sprintf($target, str_replace('\\', '/', $class->getName())), $template, $variables); } } } protected function save(Project $project, $uri, $template, $variables) { $depth = substr_count($uri, '/'); /** @var TwigExtension $twigExtension */ $twigExtension = $this->twig->getExtension(TwigExtension::class); $twigExtension->setCurrentDepth($depth); $this->twig->addGlobal('root_path', str_repeat('../', $depth)); $file = $project->getBuildDir() . '/' . $uri; if (!is_dir($dir = dirname($file))) { $this->filesystem->mkdir($dir); } file_put_contents($file, $this->twig->render($template, $variables)); } protected function getIndex(Project $project) { $items = []; foreach ($project->getProjectClasses() as $class) { $letter = strtoupper(substr($class->getShortName(), 0, 1)); $items[$letter][] = ['class', $class]; foreach ($class->getProperties() as $property) { $letter = strtoupper(substr($property->getName(), 0, 1)); $items[$letter][] = ['property', $property]; } foreach ($class->getMethods() as $method) { $letter = strtoupper(substr($method->getName(), 0, 1)); $items[$letter][] = ['method', $method]; } } ksort($items); return $items; } protected function getDiff(Project $project) { return new Diff($project, $project->getBuildDir() . '/renderer.index'); } protected function getTheme(Project $project) { return $this->themes->getTheme($project->getConfig('theme')); } /** * Get tree for the given project. * * @param Project $project * * @return array */ private function getTree(Project $project) { $key = $project->getBuildDir(); if (!isset($this->cachedTree[$key])) { $this->cachedTree[$key] = $this->tree->getTree($project); } return $this->cachedTree[$key]; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum; final class ErrorHandler { private $levels = [ E_WARNING => 'Warning', E_NOTICE => 'Notice', E_USER_ERROR => 'User Error', E_USER_WARNING => 'User Warning', E_USER_NOTICE => 'User Notice', E_STRICT => 'Runtime Notice', E_RECOVERABLE_ERROR => 'Catchable Fatal Error', ]; /** * Registers the error handler. */ public static function register(): void { set_error_handler([new static(), 'handle']); } /** * @throws \ErrorException When error_reporting returns error */ public function handle($level, $message, $file = 'unknown', $line = 0, $context = []): bool { if (error_reporting() & $level) { throw new \ErrorException(sprintf('%s: %s in %s line %d', $this->levels[$level] ?? $level, $message, $file, $line)); } return false; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Parser; use Doctum\Parser\Filter\FilterInterface; use Doctum\Reflection\ClassReflection; use Doctum\Reflection\FunctionReflection; class ParserContext { protected $filter; protected $docBlockParser; /** @var \PhpParser\PrettyPrinter\Standard */ protected $prettyPrinter; /** @var ParseError[] */ protected $errors = []; /** @var string|null */ protected $namespace; protected $aliases; protected $class; /** @var string|null */ protected $file; /** @var string|null */ protected $hash; protected $classes; /** @var array */ protected $functions; public function __construct(FilterInterface $filter, DocBlockParser $docBlockParser, $prettyPrinter) { $this->filter = $filter; $this->docBlockParser = $docBlockParser; $this->prettyPrinter = $prettyPrinter; $this->functions = []; } public function getFilter() { return $this->filter; } /** * @return DocBlockParser */ public function getDocBlockParser() { return $this->docBlockParser; } /** * @return \PhpParser\PrettyPrinter\Standard */ public function getPrettyPrinter() { return $this->prettyPrinter; } public function addAlias(?string $alias, string $name): void { $this->aliases[$alias] = $name; } public function getAliases() { return $this->aliases; } public function enterFile($file, $hash): void { $this->file = $file; $this->hash = $hash; $this->errors = []; $this->classes = []; } public function leaveFile() { $this->hash = null; $this->file = null; $this->errors = []; return $this->classes; } /** * @return string|null */ public function getHash() { return $this->hash; } /** * @return string|null */ public function getFile() { return $this->file; } public function addErrors(string $name, int $line, array $errors): void { foreach ($errors as $error) { $this->addError($name, $line, $error); } } public function addError(?string $name, int $line, string $error): void { $this->errors[] = new ParseError( sprintf('%s on "%s"', $error, $name), $this->file, $line ); } /** * @return ParseError[] */ public function getErrors(): array { return $this->errors; } public function addFunction(FunctionReflection $fun): void { $this->functions[$this->namespace . '\\' . $fun->getName()] = $fun; } /** * @return array */ public function getFunctions() { return $this->functions; } public function enterClass(ClassReflection $class): void { $this->class = $class; } public function leaveClass(): void { if (null === $this->class) { return; } $this->classes[] = $this->class; $this->class = null; } public function getClass() { return $this->class; } public function enterNamespace(string $namespace): void { $this->namespace = $namespace; $this->aliases = []; } public function leaveNamespace(): void { $this->namespace = null; $this->aliases = []; } public function getNamespace(): ?string { return $this->namespace; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Parser; use Doctum\Reflection\ClassReflection; interface ClassVisitorInterface { public function visit(ClassReflection $class); } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Parser\Node; class DocBlockNode { /** @var string */ protected $shortDesc; /** @var string */ protected $longDesc; /** @var array */ protected $tags = []; /** @var string[] */ protected $errors = []; /** * Add a tag * * @param string $key * @param array[] $value */ public function addTag($key, $value): void { $this->tags[$key][] = $value; } /** * @return array */ public function getTags(): array { return $this->tags; } /** * @return array */ public function getOtherTags(): array { $tags = $this->tags; unset($tags['param'], $tags['return'], $tags['var'], $tags['throws']); foreach ($tags as $name => $values) { foreach ($values as $i => $value) { // For 'see' tag we try to maintain backwards compatibility // by returning only a part of the value. if ($name === 'see') { $value = $value[0]; } $tags[$name][$i] = is_string($value) ? explode(' ', $value) : $value; } } return $tags; } /** * @param string $key * @return mixed[] */ public function getTag($key): array { return $this->tags[$key] ?? []; } /** * @return string */ public function getShortDesc() { return $this->shortDesc; } /** * @return string */ public function getLongDesc() { return $this->longDesc; } /** * @param string $shortDesc */ public function setShortDesc($shortDesc): void { $this->shortDesc = $shortDesc; } /** * @param string $longDesc */ public function setLongDesc($longDesc): void { $this->longDesc = $longDesc; } public function getDesc(): string { return $this->shortDesc . "\n\n" . $this->longDesc; } public function addError(string $error): void { $this->errors[] = $error; } /** * @return string[] */ public function getErrors(): array { return $this->errors; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Parser; use PhpParser\Error; use PhpParser\NodeTraverser; use PhpParser\Parser as PhpParser; class CodeParser { /** @var PhpParser */ protected $parser; /** @var NodeTraverser */ protected $traverser; /** @var ParserContext */ protected $context; public function __construct(ParserContext $context, PhpParser $parser, NodeTraverser $traverser) { $this->context = $context; $this->parser = $parser; $this->traverser = $traverser; // with big fluent interfaces it can happen that PHP-Parser's Traverser // exceeds the 100 recursions limit; we set it to 10000 to be sure. ini_set('xdebug.max_nesting_level', '10000'); } public function getContext(): ParserContext { return $this->context; } public function parse(string $code): void { try { $this->traverser->traverse($this->parser->parse($code) ?? []); } catch (Error $e) { $this->context->addError($this->context->getFile(), 0, $e->getMessage()); } } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Parser; use Doctum\Parser\Node\DocBlockNode; use phpDocumentor\Reflection\DocBlock; use phpDocumentor\Reflection\DocBlock\Tags\Param; use phpDocumentor\Reflection\DocBlock\Tags\PropertyRead; use phpDocumentor\Reflection\DocBlock\Tags\Property; use phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite; use phpDocumentor\Reflection\DocBlock\Tags\Return_; use phpDocumentor\Reflection\DocBlock\Tags\See; use phpDocumentor\Reflection\DocBlock\Tags\Throws; use phpDocumentor\Reflection\DocBlock\Tags\Var_; use phpDocumentor\Reflection\DocBlock\Tags\InvalidTag; use phpDocumentor\Reflection\DocBlockFactory; use phpDocumentor\Reflection\Types\Context; class DocBlockParser { public function parse(?string $comment, ParserContext $context): DocBlockNode { $docBlock = null; $errorMessage = ''; $result = new DocBlockNode(); if ($comment === null) { return $result; } try { $factory = DocBlockFactory::createInstance(); $docBlockContext = new Context( $context->getNamespace() ?? '', $context->getAliases() ?: [] ); $docBlock = $factory->create($comment, $docBlockContext); } catch (\Exception $e) { $errorMessage = $e->getMessage(); } if ($errorMessage !== '') { $result->addError($errorMessage); return $result; } if ($docBlock === null) { $errorMessage = 'Unable to build the doc block factory, this should not happen. Please report it !'; $result->addError($errorMessage); return $result; } $result->setShortDesc($docBlock->getSummary()); $result->setLongDesc($docBlock->getDescription()->__toString()); foreach ($docBlock->getTags() as $tag) { $result->addTag($tag->getName(), $this->parseTag($tag)); } return $result; } protected function parseTag(DocBlock\Tag $tag) { $class = get_class($tag); switch ($class) { case Var_::class: case Return_::class: /** @var \phpDocumentor\Reflection\DocBlock\Tags\Return_ $tag */ $type = $tag->getType(); return [ $this->parseHint($type !== null ? explode('|', $type->__toString()) : []), $tag->getDescription() !== null ? $tag->getDescription()->__toString() : '', ]; case Property::class: case PropertyRead::class: case PropertyWrite::class: case Param::class: /** @var \phpDocumentor\Reflection\DocBlock\Tags\Param $tag */ $type = $tag->getType(); return [ $this->parseHint($type !== null ? explode('|', $type->__toString()) : []), ltrim($tag->getVariableName() ?? '', '$'), $tag->getDescription() !== null ? $tag->getDescription()->__toString() : '', ]; case Throws::class: /** @var \phpDocumentor\Reflection\DocBlock\Tags\Throws $tag */ $type = $tag->getType(); return [ $type !== null ? $type->__toString() : '', $tag->getDescription() !== null ? $tag->getDescription()->__toString() : '', ]; case See::class: // For backwards compatibility, in first cell we store content. // In second - only a referer for further parsing. // In docblock node we handle this in getOtherTags() method. /** @var \phpDocumentor\Reflection\DocBlock\Tags\See $tag */ return [ $tag->__toString(), $tag->getReference()->__toString(), $tag->getDescription() !== null ? $tag->getDescription()->__toString() : '', ]; case InvalidTag::class: /** @var \phpDocumentor\Reflection\DocBlock\Tags\InvalidTag $tag */ return $tag->__toString(); default: return $tag->__toString(); } } protected function parseHint(array $rawHints): array { $hints = []; foreach ($rawHints as $hint) { if ('[]' == substr($hint, -2)) { $hints[] = [substr($hint, 0, -2), true]; } else { $hints[] = [$hint, false]; } } return $hints; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Parser; use PhpParser\Node as AbstractNode; use PhpParser\Node\Name\FullyQualified; use PhpParser\NodeVisitorAbstract; use PhpParser\Node\Stmt\ClassConst as ClassConstNode; use PhpParser\Node\Stmt\ClassMethod as ClassMethodNode; use PhpParser\Node\Stmt\Class_ as ClassNode; use PhpParser\Node\Stmt\ClassLike as ClassLikeNode; use PhpParser\Node\Stmt\Interface_ as InterfaceNode; use PhpParser\Node\Stmt\Namespace_ as NamespaceNode; use PhpParser\Node\Stmt\Function_ as FunctionNode; use PhpParser\Node\Stmt\Property as PropertyNode; use PhpParser\Node\Stmt\TraitUse as TraitUseNode; use PhpParser\Node\Stmt\Trait_ as TraitNode; use PhpParser\Node\Stmt\Use_ as UseNode; use PhpParser\Node\NullableType; use PhpParser\Node\Expr\Error as ExprError; use PhpParser\Node\Expr as NodeExpr; use Doctum\Project; use Doctum\Reflection\Reflection; use Doctum\Reflection\FunctionReflection; use Doctum\Reflection\ClassReflection; use Doctum\Reflection\ConstantReflection; use Doctum\Reflection\MethodReflection; use Doctum\Reflection\ParameterReflection; use Doctum\Reflection\PropertyReflection; use Doctum\Parser\Node\DocBlockNode; use PhpParser\Node\Stmt\PropertyProperty; use PhpParser\Node\UnionType; class NodeVisitor extends NodeVisitorAbstract { protected $context; public function __construct(ParserContext $context) { $this->context = $context; } public function enterNode(AbstractNode $node) { if ($node instanceof NamespaceNode) { $this->context->enterNamespace($node->name === null ? '' : $node->name->__toString()); } elseif ($node instanceof UseNode) { $this->addAliases($node); } elseif ($node instanceof InterfaceNode) { $this->addInterface($node); } elseif ($node instanceof ClassNode) { $this->addClass($node); } elseif ($node instanceof TraitNode) { $this->addTrait($node); } elseif ($node instanceof FunctionNode) { $this->addFunction($node, $this->context->getNamespace()); } elseif ($this->context->getClass() && $node instanceof TraitUseNode) { $this->addTraitUse($node); } elseif ($this->context->getClass() && $node instanceof PropertyNode) { $this->addProperty($node); } elseif ($this->context->getClass() && $node instanceof ClassMethodNode) { $this->addMethod($node); } elseif ($this->context->getClass() && $node instanceof ClassConstNode) { $this->addConstant($node); } return null; } public function leaveNode(AbstractNode $node) { if ($node instanceof NamespaceNode) { $this->context->leaveNamespace(); } elseif ($node instanceof ClassNode || $node instanceof InterfaceNode || $node instanceof TraitNode) { $this->context->leaveClass(); } return null; } protected function addAliases(UseNode $node) { foreach ($node->uses as $use) { $alias = $use->getAlias()->toString(); $fullName = $use->name->__toString(); $this->context->addAlias($alias, $fullName); } } protected function addFunction(FunctionNode $node, ?string $namespace = null) { $function = new FunctionReflection($node->name->__toString(), $node->getLine()); $function->setNamespace($namespace !== null ? $namespace : ''); $function->setByRef((string) $node->byRef); foreach ($node->params as $param) { if ($param->var instanceof ExprError) { $errors = [ 'The expression had an error, please report this to Doctum for a better handling of this error', ]; $this->context->addErrors($function->__toString(), $node->getLine(), $errors); continue; } if ($param->var->name instanceof NodeExpr) { $errors = [ 'This was unexpected, please report this to Doctum for a better handling of this error', ]; $this->context->addErrors($function->__toString(), $node->getLine(), $errors); continue; } $parameter = new ParameterReflection( $param->var->name, $param->getLine() ); $parameter->setModifiers($param->flags); $parameter->setByRef($param->byRef); if ($param->default) { $parameter->setDefault($this->context->getPrettyPrinter()->prettyPrintExpr($param->default)); } $parameter->setVariadic($param->variadic); $type = $param->type; $typeStr = $this->typeToString($type); if (null !== $typeStr) { $typeArr = [[$typeStr, false]]; if ($param->type instanceof NullableType) { $typeArr[] = ['null', false]; } $parameter->setHint($this->resolveHint($typeArr)); } $function->addParameter($parameter); } $docComment = $node->getDocComment(); $docComment = $docComment === null ? null : $docComment->__toString(); $comment = $this->context->getDocBlockParser()->parse($docComment, $this->context, $function); $function->setDocComment($docComment); $function->setShortDesc($comment->getShortDesc()); $function->setLongDesc($comment->getLongDesc()); $function->setSee($this->resolveSee($comment->getTag('see'))); if (!$errors = $comment->getErrors()) { $errors = $this->updateMethodParametersFromTags($function, $comment->getTag('param')); $this->addTagFromCommentToMethod('return', $comment, $function, $errors); $function->setExceptions($comment->getTag('throws')); $function->setTags($comment->getOtherTags()); } $function->setModifiersFromTags(); $function->setErrors($errors); $returnType = $node->getReturnType(); $returnTypeStr = $this->typeToString($returnType); if (null !== $returnTypeStr) { $returnTypeArr = [[$returnTypeStr, false]]; if ($returnType instanceof NullableType) { $returnTypeArr[] = ['null', false]; } $function->setHint($this->resolveHint($returnTypeArr)); } $this->context->addFunction($function); if ($errors) { $this->context->addErrors((string) $function, $node->getLine(), $errors); } } /** * @param \PhpParser\Node\Identifier|\PhpParser\Node\Name|NullableType|UnionType|null $type Type declaration */ protected function typeToString($type): ?string { $typeString = null; if ($type !== null && ! ($type instanceof NullableType || $type instanceof UnionType)) { $typeString = $type->__toString(); } elseif ($type instanceof NullableType) { $typeString = $type->type->__toString(); } elseif ($type instanceof UnionType) { $typeString = []; foreach ($type->types as $type) { $typeString[] = $type->__toString(); } $typeString = implode('|', $typeString); } if ($typeString === null) { return null; } if ($type instanceof FullyQualified && 0 !== strpos($typeString, '\\')) { $typeString = '\\' . $typeString; } return $typeString; } protected function addInterface(InterfaceNode $node) { $class = $this->addClassOrInterface($node); $class->setInterface(true); foreach ($node->extends as $interface) { $class->addInterface((string) $interface); } } protected function addClass(ClassNode $node) { // Skip anonymous classes if ($node->isAnonymous()) { return; } $class = $this->addClassOrInterface($node); foreach ($node->implements as $interface) { $class->addInterface((string) $interface); } if ($node->extends) { $class->setParent((string) $node->extends); } } protected function addTrait(TraitNode $node) { $class = $this->addClassOrInterface($node); $class->setTrait(true); } protected function addClassOrInterface(ClassLikeNode $node) { $class = new ClassReflection((string) $node->namespacedName, $node->getLine()); return $this->addClassOrInterfaceForReflection($class, $node); } protected function addClassOrInterfaceForReflection(ClassReflection $class, ClassLikeNode $node): ClassReflection { if ($node instanceof ClassNode) { $class->setModifiers($node->flags); } $class->setNamespace($this->context->getNamespace() ?? ''); $class->setAliases($this->context->getAliases()); $class->setHash($this->context->getHash()); $class->setFile($this->context->getFile()); $docComment = $node->getDocComment(); $docComment = $docComment === null ? null : $docComment->__toString(); $comment = $this->context->getDocBlockParser()->parse($docComment, $this->context, $class); $class->setDocComment($docComment); $class->setShortDesc($comment->getShortDesc()); $class->setLongDesc($comment->getLongDesc()); $class->setSee($this->resolveSee($comment->getTag('see'))); if ($errors = $comment->getErrors()) { $class->setErrors($errors); } else { $otherTags = $comment->getOtherTags(); if (isset($otherTags['readonly'])) { $class->setReadOnly(true); } $class->setTags($otherTags); } if ($this->context->getFilter()->acceptClass($class)) { if ($errors) { $this->context->addErrors((string) $class, $node->getLine(), $errors); } $this->context->enterClass($class); } $class->setModifiersFromTags(); return $class; } protected function addMethod(ClassMethodNode $node) { $method = new MethodReflection($node->name->__toString(), $node->getLine()); $method->setModifiers($node->flags); $method->setByRef((string) $node->byRef); foreach ($node->params as $param) { if ($param->var instanceof ExprError) { $errors = [ 'The expression had an error, please report this to Doctum for a better handling of this error', ]; $this->context->addErrors($method->__toString(), $node->getLine(), $errors); continue; } if ($param->var->name instanceof NodeExpr) { $errors = [ 'This was unexpected, please report this to Doctum for a better handling of this error', ]; $this->context->addErrors($method->__toString(), $node->getLine(), $errors); continue; } $parameter = new ParameterReflection($param->var->name, $param->getLine()); $parameter->setModifiers($param->flags); $parameter->setByRef($param->byRef); if ($param->default) { $parameter->setDefault($this->context->getPrettyPrinter()->prettyPrintExpr($param->default)); } $parameter->setVariadic($param->variadic); $type = $param->type; $typeStr = $this->typeToString($type); if (null !== $typeStr) { $typeArr = [[$typeStr, false]]; if ($param->type instanceof NullableType) { $typeArr[] = ['null', false]; } $parameter->setHint($this->resolveHint($typeArr)); } $method->addParameter($parameter); } $docComment = $node->getDocComment(); $docComment = $docComment === null ? null : $docComment->__toString(); $comment = $this->context->getDocBlockParser()->parse( $docComment, $this->context, $method ); $method->setDocComment($docComment); $method->setShortDesc($comment->getShortDesc()); $method->setLongDesc($comment->getLongDesc()); $method->setSee($this->resolveSee($comment->getTag('see'))); if (!$errors = $comment->getErrors()) { $errors = $this->updateMethodParametersFromTags($method, $comment->getTag('param')); $this->addTagFromCommentToMethod('return', $comment, $method, $errors); $method->setExceptions($comment->getTag('throws')); $method->setTags($comment->getOtherTags()); } $method->setModifiersFromTags(); $method->setErrors($errors); $returnType = $node->getReturnType(); $returnTypeStr = $this->typeToString($returnType); if (null !== $returnTypeStr) { $returnTypeArr = [[$returnTypeStr, false]]; if ($returnType instanceof NullableType) { $returnTypeArr[] = ['null', false]; } $method->setHint($this->resolveHint($returnTypeArr)); } if ($this->context->getFilter()->acceptMethod($method)) { $this->context->getClass()->addMethod($method); if ($errors) { $this->context->addErrors((string) $method, $node->getLine(), $errors); } } } protected function addTagFromCommentToMethod( string $tagName, DocBlockNode $comment, Reflection $methodOrFunctionOrProperty, array &$errors ): void { $tagsThatShouldHaveOnlyOne = ['return', 'var']; $tag = $comment->getTag($tagName); if (is_array($tag)) { if (in_array($tagName, $tagsThatShouldHaveOnlyOne, true) && count($tag) > 1) { $errors[] = sprintf( 'Too much @%s tags on "%s" at @%s found: %d @%s tags', $tagName, $methodOrFunctionOrProperty->getName(), $tagName, count($tag), $tagName ); } $firstTagFound = $tag[0] ?? null; if ($firstTagFound !== null) { if (is_array($firstTagFound)) { $hint = $firstTagFound[0]; $hintDescription = $firstTagFound[1] ?? null; $methodOrFunctionOrProperty->setHint(is_array($hint) ? $this->resolveHint($hint) : $hint); if ($hintDescription !== null) { if (is_string($hintDescription)) { $methodOrFunctionOrProperty->setHintDesc($hintDescription); } else { $errors[] = sprintf( 'The hint description on "%s" at @%s is invalid: "%s"', $methodOrFunctionOrProperty->getName(), $tagName, $hintDescription ); } } } else { $errors[] = sprintf( 'The hint on "%s" at @%s is invalid: "%s"', $methodOrFunctionOrProperty->getName(), $tagName, $firstTagFound ); } } } } protected function addProperty(PropertyNode $node) { foreach ($node->props as $prop) { [$property, $errors] = $this->getPropertyReflectionFromParserProperty($node, $prop); if ($this->context->getFilter()->acceptProperty($property)) { $this->context->getClass()->addProperty($property); if ($errors) { $this->context->addErrors((string) $property, $prop->getLine(), $errors); } } } } /** * @return array * @phpstan-return array{PropertyReflection,string[]} */ protected function getPropertyReflectionFromParserProperty(PropertyNode $node, PropertyProperty $prop): array { $property = new PropertyReflection($prop->name->toString(), $prop->getLine()); $property->setModifiers($node->flags); $property->setDefault($prop->default); $docComment = $node->getDocComment(); $docComment = $docComment === null ? null : $docComment->__toString(); $comment = $this->context->getDocBlockParser()->parse($docComment, $this->context, $property); $property->setDocComment($docComment); $property->setShortDesc($comment->getShortDesc()); $property->setLongDesc($comment->getLongDesc()); $property->setSee($this->resolveSee($comment->getTag('see'))); if ($errors = $comment->getErrors()) { $property->setErrors($errors); } else { $this->addTagFromCommentToMethod('var', $comment, $property, $errors); $otherTags = $comment->getOtherTags(); if (isset($otherTags['readonly'])) { $property->setReadOnly(true); } $property->setTags($otherTags); } $property->setModifiersFromTags(); return [$property, $errors]; } protected function addTraitUse(TraitUseNode $node) { foreach ($node->traits as $trait) { $this->context->getClass()->addTrait((string) $trait); } } protected function addConstant(ClassConstNode $node) { foreach ($node->consts as $const) { $constant = new ConstantReflection($const->name->toString(), $const->getLine()); $docComment = $node->getDocComment(); $docComment = $docComment === null ? null : $docComment->__toString(); $comment = $this->context->getDocBlockParser()->parse($docComment, $this->context, $constant); $constant->setDocComment($docComment); $constant->setShortDesc($comment->getShortDesc()); $constant->setLongDesc($comment->getLongDesc()); $constant->setTags($comment->getOtherTags()); $constant->setModifiers($node->flags); $constant->setModifiersFromTags(); $this->context->getClass()->addConstant($constant); } } /** * @param array[] $tags * @phpstan-param array{array{string,bool}|empty-array|string,string,string} $tags * * @return array|null * @phpstan-return non-empty-array{non-empty-array{string,bool},string,string}|null */ private function findParameterInTags(array $tags, string $tagName): ?array { foreach ($tags as $tag) { if (! is_array($tag)) { continue; } if (count($tag) < 2) { continue; } if ($tag[1] === $tagName) { return $tag; } } return null; } /** * @param array[] $tags All the tags * * @return string[] The invalid tags */ private function getInvalidTags(array $tags): array { $invalidTags = []; foreach ($tags as $tag) { if (! is_array($tag)) { $invalidTags[] = $tag; } } return $invalidTags; } /** * @param FunctionReflection|MethodReflection $method * @param array[] $tags * @return string[] */ protected function updateMethodParametersFromTags(Reflection $method, array $tags): array { $errors = []; // bypass if there is no @param tags defined (@param tags are optional) if (!count($tags)) { return $errors; } /** @var Reflection[] $parameters */ $parameters = $method->getParameters(); foreach ($parameters as $parameter) { $tag = $this->findParameterInTags($tags, $parameter->getName()); if (! $parameter->hasHint() && $tag === null) { $errors[] = sprintf( 'The "%s" parameter of the method "%s" is missing a @param tag', $parameter->getName(), $method->getName() ); continue; } if ($tag !== null) { $parameter->setShortDesc($tag[2]); if (! $parameter->hasHint()) { $parameter->setHint($this->resolveHint($tag[0])); } } } if (count($tags) > count($parameters)) { $errors[] = sprintf( 'The method "%s" has "%d" @param tags but only "%d" where expected.', $method->getName(), count($tags), count($method->getParameters()) ); } $invalidTags = $this->getInvalidTags($tags); if (count($invalidTags) > 0) { $errors[] = sprintf( 'The method "%s" has "%d" invalid @param tags.', $method->getName(), count($invalidTags) ); foreach ($invalidTags as $invalidTag) { $errors[] = sprintf( 'Invalid @param tag on "%s": "%s"', $method->getName(), $invalidTag ); } } return $errors; } protected function resolveHint(array $hints): array { foreach ($hints as $i => $hint) { $hints[$i] = [$this->resolveAlias($hint[0]), $hint[1]]; } return $hints; } protected function resolveAlias($alias) { // not a class if (Project::isPhpTypeHint($alias)) { return $alias; } // FQCN if ('\\' == substr($alias, 0, 1)) { return $alias; } $class = $this->context->getClass(); // A class MIGHT or MIGHT NOT be present in context. // It is not present in cases, where eg. `@see` tag refers to non existing class/method. // We may want to run class related checks only, if class is actually present. if ($class) { // special aliases if ('self' === $alias || 'static' === $alias || '\$this' === $alias) { return $class->getName(); } // an alias defined by a use statement $aliases = $class->getAliases(); if (isset($aliases[$alias])) { return $aliases[$alias]; } // a class in the current class namespace return $class->getNamespace() . '\\' . $alias; } return $alias; } /** * @return array> */ protected function resolveSee(array $see): array { $return = []; foreach ($see as $seeEntry) { // Example: @see Net_Sample::$foo, Net_Other::someMethod() if (is_string($seeEntry)) {// Support bad formatted @see tags $seeEntries = explode(',', $seeEntry); foreach ($seeEntries as $entry) { $return[] = $this->getParsedSeeEntry(trim($entry, " \n\t"), ''); } continue; } $reference = $seeEntry[1]; $description = $seeEntry[2] ?? ''; $return[] = $this->getParsedSeeEntry($reference, $description); } return $return; } /** * @return array */ protected function getParsedSeeEntry(string $reference, string $description): array { $matches = []; if ((bool) preg_match('/^[\w]+:\/\/.+$/', $reference)) { //URL return [ $reference, $description, false, false, $reference, ]; } elseif ((bool) preg_match('/(.+)\:\:(.+)\(.*\)/', $reference, $matches)) { //Method return [ $reference, $description, $this->resolveAlias($matches[1]), $matches[2], false, ]; } else { // We assume, that this is a class reference. return [ $reference, $description, $this->resolveAlias($reference), false, false, ]; } } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Parser; use Doctum\Message; use Doctum\Project; use Doctum\Reflection\ClassReflection; use Doctum\Reflection\FunctionReflection; use Doctum\Reflection\LazyClassReflection; use Doctum\Store\StoreInterface; use Symfony\Component\Finder\Finder; class Parser { /** @var StoreInterface */ protected $store; /** @var Finder */ protected $iterator; /** @var CodeParser */ protected $parser; /** @var ClassTraverser */ protected $traverser; public function __construct($iterator, StoreInterface $store, CodeParser $parser, ClassTraverser $traverser) { $this->iterator = $this->createIterator($iterator); $this->store = $store; $this->parser = $parser; $this->traverser = $traverser; } public function parse(Project $project, $callback = null) { $step = 0; $steps = iterator_count($this->iterator); $context = $this->parser->getContext(); $transaction = new Transaction($project); $toStore = new \SplObjectStorage(); foreach ($this->iterator as $file) { $file = $file->getPathname(); ++$step; $code = file_get_contents($file); if ($code === false) { continue; } $hash = sha1($code); if ($transaction->hasHash($hash)) { continue; } $context->enterFile((string) $file, $hash); $this->parser->parse($code); if (null !== $callback) { call_user_func($callback, Message::PARSE_ERROR, $context->getErrors()); } foreach ($context->getFunctions() as $addr => $fun) { $project->addFunction($fun); $toStore->attach($fun); } foreach ($context->leaveFile() as $class) { if (null !== $callback) { call_user_func($callback, Message::PARSE_CLASS, [$step, $steps, $class]); } $project->addClass($class); $transaction->addClass($class); $toStore->attach($class); $class->notFromCache(); } } // cleanup foreach ($transaction->getRemovedClasses() as $class) { $project->removeClass(new LazyClassReflection($class)); $this->store->removeClass($project, $class); } // visit each class for stuff that can only be done when all classes are parsed $toStore->addAll($this->traverser->traverse($project)); foreach ($toStore as $classOrFun) { if ($classOrFun instanceof FunctionReflection) { $this->store->writeFunction($project, $classOrFun); } elseif ($classOrFun instanceof ClassReflection) { $this->store->writeClass($project, $classOrFun); } } return $transaction; } /** * @param string|Finder $iterator * @return Finder */ private function createIterator($iterator) { if (is_string($iterator)) { $it = new Finder(); $it->files()->name('*.php')->in($iterator); return $it; } elseif (!$iterator instanceof \Traversable) { throw new \InvalidArgumentException('The iterator must be a directory name or a Finder instance.'); } return $iterator; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Parser; use Doctum\Project; class ClassTraverser { protected $visitors; public function __construct(array $visitors = []) { $this->visitors = []; foreach ($visitors as $visitor) { $this->addVisitor($visitor); } } public function addVisitor(ClassVisitorInterface $visitor) { $this->visitors[] = $visitor; } public function traverse(Project $project) { // parent classes/interfaces are visited before their "children" $classes = $project->getProjectClasses(); $modified = new \SplObjectStorage(); while ($class = array_shift($classes)) { // re-push the class at the end if parent class/interfaces have not been visited yet if (($parent = $class->getParent()) && isset($classes[$parent->getName()])) { $classes[$class->getName()] = $class; continue; } $interfaces = $class->getInterfaces(); foreach ($interfaces as $interface) { if (isset($classes[$interface->getName()])) { $classes[$class->getName()] = $class; continue 2; } } // only visits classes not coming from the cache // and for which parent/interfaces also come from the cache $visit = !$class->isFromCache() || ($parent && !$parent->isFromCache()); foreach ($interfaces as $interface) { if (!$interface->isFromCache()) { $visit = true; break; } } if (!$visit) { continue; } $isModified = false; foreach ($this->visitors as $visitor) { $isModified = $visitor->visit($class) || $isModified; } if ($isModified) { $modified->attach($class); } } return $modified; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Parser\ClassVisitor; use Doctum\Parser\ClassVisitorInterface; use Doctum\Reflection\ClassReflection; use Doctum\Reflection\MethodReflection; use Doctum\Reflection\ParameterReflection; use Doctum\Reflection\Reflection; /** * Looks for @method tags on classes in the format of: * * @phpstan-ignore-next-line * @method [[static] return type] [name]([[type] [parameter]<, ...>]) [] */ class MethodClassVisitor implements ClassVisitorInterface { public function visit(ClassReflection $class) { $modified = false; $methods = $class->getTags('method'); if (!empty($methods)) { foreach ($methods as $methodTag) { if ($this->injectMethod($class, implode(' ', $methodTag))) { $modified = true; } } } return $modified; } /** * @license MIT * @copyright 2010 Mike van Riel * * Parse the parts of an @method tag into an associative array. * * Original @method parsing by https://github.com/phpDocumentor/ReflectionDocBlock/blob/5.2.0/src/DocBlock/Tags/Method.php#L84 * * @param string $body Method tag contents * * @return array|null */ protected function parseMethod($body): ?array { // 1. none or more whitespace // 2. optionally the keyword "static" followed by whitespace // 3. optionally a word with underscores followed by whitespace : as // type for the return value // 4. then optionally a word with underscores followed by () and // whitespace : as method name as used by phpDocumentor // 5. then a word with underscores, followed by ( and any character // until a ) and whitespace : as method name with signature // 6. any remaining text : as description $regex = '/^ # Static keyword # Declares a static method ONLY if type is also present (?: (static) \s+ )? # Return type (?: ( (?:[\w\|_\\\\]*\$this[\w\|_\\\\]*) | (?: (?:[\w\|_\\\\]+) # array notation (?:\[\])* )*+ ) \s+ )? # Method name ([\w_]+) # Arguments (?: \((.*(?=\)))\) )? \s* # Description (.*) $/sux'; if (!preg_match($regex, $body, $matches)) { return null; } [, $static, $returnType, $methodName, $argumentLines, $description] = $matches; $isStatic = $static === 'static'; if ($returnType === '') { $returnType = 'void'; } $arguments = []; if ($argumentLines !== '') { $argumentsExploded = explode(',', $argumentLines); foreach ($argumentsExploded as $argument) { $argument = explode(' ', trim($argument), 2); $defaultValue = ''; $argumentType = ''; $argumentName = ''; $hasVariadicAtStart = strpos($argument[0], '...$') === 0; if (strpos($argument[0], '$') === 0 || $hasVariadicAtStart) {// Only param name, example: $param1 $argumentName = substr($argument[0], $hasVariadicAtStart ? 4 : 1);// Remove $ } else {// Type and param name, example: string $param1 or just a type, example: string $argumentType = $argument[0]; if (isset($argument[1])) {// Type and param name $hasVariadicAtStart = strpos($argument[1], '...$') === 0; $argumentName = substr($argument[1], $hasVariadicAtStart ? 4 : 1);// Remove $ $defaultPart = explode('=', $argumentName, 2); if (count($defaultPart) === 2) {// detected varName = defaultValue $argumentName = $defaultPart[0]; $defaultValue = $defaultPart[1]; } } } $argumentName = trim($argumentName); $argumentType = trim($argumentType); $defaultValue = trim($defaultValue); $arguments[$argumentName] = [ 'isVariadic' => $hasVariadicAtStart, 'name' => $argumentName, 'hint' => $argumentType, 'default' => $defaultValue, ]; } } return [ 'isStatic' => $isStatic, 'hint' => trim($returnType), 'name' => $methodName, 'args' => $arguments, 'description' => $description, ]; } /** * Adds a new method to the class using an array of tokens. * * @param ClassReflection $class Class reflection * @param string $methodTag Method tag contents * * @return bool */ protected function injectMethod(ClassReflection $class, $methodTag) { $data = $this->parseMethod($methodTag); // Bail if the method format is invalid if ($data === null) { return false; } $method = new MethodReflection($data['name'], $class->getLine()); $method->setDocComment($data['description']); $method->setShortDesc($data['description']); if ($data['hint']) { $method->setHint([[$data['hint'], null]]); } if ($data['isStatic']) { $method->setModifiers(Reflection::MODIFIER_STATIC); } // Add arguments to the method foreach ($data['args'] as $name => $arg) { $param = new ParameterReflection($name, $class->getLine()); if (!empty($arg['hint'])) { $param->setHint([[$arg['hint'], null]]); } if (!empty($arg['default'])) { $param->setDefault($arg['default']); } $param->setVariadic($arg['isVariadic']); $method->addParameter($param); } $class->addMethod($method); return true; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Parser\ClassVisitor; use Doctum\Parser\ClassVisitorInterface; use Doctum\Parser\ParserContext; use Doctum\Reflection\ClassReflection; use Doctum\Reflection\PropertyReflection; /** * Looks for @property tags on classes in the format of:. * * @phpstan-ignore-next-line * @property [] [name] [] * * Or -read -write properties * * @phpstan-ignore-next-line * @property-read [Type] [name] [] * @property-write [Type] [name] [] */ class PropertyClassVisitor implements ClassVisitorInterface { protected $context; public function __construct(ParserContext $context) { $this->context = $context; } public function visit(ClassReflection $class) { $modified = false; $properties = $class->getTags('property'); $propertiesRead = $class->getTags('property-read'); $propertiesWrite = $class->getTags('property-write'); if (!empty($properties)) { foreach ($properties as $propertyTag) { if ($this->injectProperty($class, $propertyTag, 'property')) { $modified = true; } } } if (!empty($propertiesRead)) { foreach ($propertiesRead as $propertyTag) { if ($this->injectProperty($class, $propertyTag, 'property-read')) { $modified = true; } } } if (!empty($propertiesWrite)) { foreach ($propertiesWrite as $propertyTag) { if ($this->injectProperty($class, $propertyTag, 'property-write')) { $modified = true; } } } return $modified; } /** * Adds a new property to the class using an array of tokens. * * @param ClassReflection $class Class reflection * @param array $propertyTag Property tag contents * @param string $tagName The tag name, for example: property-read */ protected function injectProperty(ClassReflection $class, array $propertyTag, string $tagName): bool { if (count($propertyTag) === 3 && !empty($propertyTag[1])) { $property = new PropertyReflection($propertyTag[1], $class->getLine()); $property->setDocComment($propertyTag[2]); $property->setShortDesc($propertyTag[2]); if (!empty($propertyTag[0])) { $property->setHint($propertyTag[0]); } if ($tagName === 'property-read') { $property->setReadOnly(true); } elseif ($tagName === 'property-write') { $property->setWriteOnly(true); } $class->addProperty($property); return true; } return false; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Parser\ClassVisitor; use Doctum\Reflection\ClassReflection; use Doctum\Parser\ClassVisitorInterface; use Doctum\RemoteRepository\AbstractRemoteRepository; class ViewSourceClassVisitor implements ClassVisitorInterface { /** @var AbstractRemoteRepository */ protected $remoteRepository; public function __construct(AbstractRemoteRepository $remoteRepository) { $this->remoteRepository = $remoteRepository; } public function visit(ClassReflection $class) { $filePath = $this->remoteRepository->getRelativePath($class->getFile()); if ($class->getRelativeFilePath() != $filePath) { $class->setRelativeFilePath($filePath); return true; } return false; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Parser\ClassVisitor; use Doctum\Parser\ClassVisitorInterface; use Doctum\Reflection\ClassReflection; class InheritdocClassVisitor implements ClassVisitorInterface { public function visit(ClassReflection $class) { $modified = false; foreach ($class->getMethods() as $name => $method) { if (!$parentMethod = $class->getParentMethod($name)) { continue; } foreach ($method->getParameters() as $name => $parameter) { if (!$parentParameter = $parentMethod->getParameter($name)) { continue; } if ($parameter->getShortDesc() != $parentParameter->getShortDesc()) { $parameter->setShortDesc($parentParameter->getShortDesc()); $modified = true; } if ($parameter->getHint() != $parentParameter->getRawHint()) { // FIXME: should test for a raw hint from tags, not the one from PHP itself $parameter->setHint($parentParameter->getRawHint()); $modified = true; } } if ($method->getHint() != $parentMethod->getRawHint()) { $method->setHint($parentMethod->getRawHint()); $modified = true; } if ($method->getHintDesc() != $parentMethod->getHintDesc()) { $method->setHintDesc($parentMethod->getHintDesc()); $modified = true; } $shortDesc = $method->getShortDesc() ?? ''; if ('{@inheritdoc}' === strtolower(trim($shortDesc)) || !$method->getDocComment()) { if ($shortDesc != $parentMethod->getShortDesc()) { $method->setShortDesc($parentMethod->getShortDesc()); $modified = true; } if ($method->getLongDesc() != $parentMethod->getLongDesc()) { $method->setLongDesc($parentMethod->getLongDesc()); $modified = true; } if ($method->getExceptions() != $parentMethod->getRawExceptions()) { $method->setExceptions($parentMethod->getRawExceptions()); $modified = true; } } } return $modified; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Parser; use Doctum\Project; use Doctum\Reflection\ClassReflection; class Transaction { protected $hashes; protected $classes; protected $visited; protected $modified; public function __construct(Project $project) { $this->hashes = []; $this->classes = []; foreach ($project->getProjectClasses() as $class) { $this->addClass($class); } $this->visited = []; $this->modified = []; } public function hasHash($hash) { if (!array_key_exists($hash, $this->hashes)) { return false; } $this->visited[$hash] = true; return true; } public function getModifiedClasses() { return $this->modified; } public function getRemovedClasses() { $classes = []; foreach ($this->hashes as $hash => $c) { if (!isset($this->visited[$hash])) { $classes = array_merge($classes, $c); } } return array_keys($classes); } public function addClass(ClassReflection $class) { $name = $class->getName(); $hash = $class->getHash(); if (isset($this->classes[$name])) { unset($this->hashes[$this->classes[$name]][$name]); if (!$this->hashes[$this->classes[$name]]) { unset($this->hashes[$this->classes[$name]]); } } $this->hashes[$hash][$name] = true; $this->classes[$name] = $hash; $this->modified[] = $name; $this->visited[$hash] = true; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Parser\Filter; use Doctum\Reflection\MethodReflection; use Doctum\Reflection\PropertyReflection; class DefaultFilter extends TrueFilter { public function acceptMethod(MethodReflection $method) { return !$method->isPrivate(); } public function acceptProperty(PropertyReflection $property) { return !$property->isPrivate(); } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Parser\Filter; use Doctum\Reflection\ClassReflection; use Doctum\Reflection\MethodReflection; use Doctum\Reflection\PropertyReflection; interface FilterInterface { public function acceptClass(ClassReflection $class); public function acceptMethod(MethodReflection $method); public function acceptProperty(PropertyReflection $property); } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Parser\Filter; use Doctum\Reflection\ClassReflection; use Doctum\Reflection\MethodReflection; use Doctum\Reflection\PropertyReflection; class TrueFilter implements FilterInterface { public function acceptClass(ClassReflection $class) { return true; } public function acceptMethod(MethodReflection $method) { return true; } public function acceptProperty(PropertyReflection $property) { return true; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\Parser\Filter; use Doctum\Reflection\MethodReflection; use Doctum\Reflection\PropertyReflection; class PublicFilter extends TrueFilter { public function acceptMethod(MethodReflection $method) { return $method->isPublic(); } public function acceptProperty(PropertyReflection $property) { return $property->isPublic(); } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\RemoteRepository; class GitLabRemoteRepository extends AbstractRemoteRepository { protected $url = 'https://gitlab.com/'; public function __construct($name, $localPath, $url = '') { if (!empty($url)) { $this->url = $url; } parent::__construct($name, $localPath); } public function getFileUrl($projectVersion, $relativePath, $line) { $url = $this->url . $this->name . '/blob/' . $this->buildProjectPath($projectVersion, $relativePath); if (null !== $line) { $url .= '#L' . (int) $line; } return $url; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\RemoteRepository; class GitHubRemoteRepository extends AbstractRemoteRepository { public function getFileUrl($projectVersion, $relativePath, $line) { $url = 'https://github.com/' . $this->name . '/blob/' . $this->buildProjectPath($projectVersion, $relativePath); if (null !== $line) { $url .= '#L' . (int) $line; } return $url; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\RemoteRepository; class BitBucketRemoteRepository extends AbstractRemoteRepository { public function getFileUrl($projectVersion, $relativePath, $line) { $url = 'https://bitbucket.org/' . $this->name . '/src/' . $this->buildProjectPath($projectVersion, $relativePath); if (null !== $line) { $filename = basename($relativePath); $url .= '#' . $filename . '-' . $line; } return $url; } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum\RemoteRepository; abstract class AbstractRemoteRepository { protected $name; protected $localPath; public function __construct($name, $localPath) { $this->name = $name; $this->localPath = $localPath; } abstract public function getFileUrl($projectVersion, $relativePath, $line); public function getRelativePath($file) { $replacementCount = 0; $filePath = str_replace($this->localPath, '', $file, $replacementCount); if (1 === $replacementCount) { return $filePath; } return ''; } protected function buildProjectPath(string $projectVersion, string $relativePath): string { return str_replace('\\', '/', $projectVersion . '/' . ltrim($relativePath, '/')); } } * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Doctum; use ArrayAccess; use PhpParser\NodeTraverser; use PhpParser\NodeVisitor\NameResolver; use PhpParser\ParserFactory; use PhpParser\PrettyPrinter\Standard as PrettyPrinter; use PhpParser\Parser as PhpParser; use Doctum\Parser\ClassTraverser; use Doctum\Parser\ClassVisitor; use Doctum\Parser\CodeParser; use Doctum\Parser\DocBlockParser; use Doctum\Parser\Filter\DefaultFilter; use Doctum\Parser\Filter\FilterInterface; use Doctum\Parser\NodeVisitor; use Doctum\Parser\Parser; use Doctum\Parser\ParserContext; use Doctum\RemoteRepository\AbstractRemoteRepository; use Doctum\Renderer\Renderer; use Doctum\Renderer\ThemeSet; use Doctum\Renderer\TwigExtension; use Doctum\Store\JsonStore; use Doctum\Store\StoreInterface; use Doctum\Version\SingleVersionCollection; use Doctum\Version\Version; use Doctum\Version\VersionCollection; use Twig\Environment; use Twig\Loader\FilesystemLoader; use Wdes\phpI18nL10n\Twig\Extension\I18n as I18nExtension; use Wdes\phpI18nL10n\plugins\MoReader; use Wdes\phpI18nL10n\Launcher; /** * @implements \ArrayAccess */ class Doctum implements ArrayAccess { public const VERSION_MAJOR = 5; public const VERSION_MINOR = 4; public const VERSION_PATCH = 1; public const IS_DEV = false; //@phpstan-ignore-next-line public const VERSION = self::VERSION_MAJOR . '.' . self::VERSION_MINOR . '.' . self::VERSION_PATCH . (self::IS_DEV ? '-dev' : ''); public static $defaultVersionName = 'main'; /** * @var \Symfony\Component\Finder\Finder */ private $files; /** * @var Environment */ private $twig; /** * @var ThemeSet */ private $themes; /** * @var Project */ private $project; /** * @var Parser */ private $parser; /** * @var Indexer */ private $indexer; /** * @var Tree */ private $tree; /** * @var ClassTraverser */ private $traverser; /** * @var Renderer */ private $renderer; /** * @var StoreInterface */ private $store; /** * @var \Doctum\Parser\Filter\FilterInterface */ private $filter; /** * @var PrettyPrinter */ private $pretty_printer; /** * @var CodeParser */ private $code_parser; /** * @var NodeTraverser */ private $php_traverser; /** * @var PhpParser */ private $php_parser; /** * @var DocBlockParser */ private $docblock_parser; /** * @var ParserContext */ private $parser_context; /** * @var VersionCollection */ private $_versions = null;// phpcs:ignore PSR2.Classes.PropertyDeclaration.Underscore /** @var array */ private $config = null; /** @var string */ private $theme = 'default'; /** @var string */ private $title = 'API'; /** @var string */ private $version; /** @var VersionCollection|string|null */ private $versions = null; /** @var string[] */ private $template_dirs = []; /** @var string */ private $build_dir; /** @var string */ private $cache_dir; /** @var string */ private $project_dir; /** @var AbstractRemoteRepository|null */ private $remoteRepository = null; /** @var string */ private $source_url = ''; /** @var string */ private $source_dir = ''; /** @var int */ private $default_opened_level = 2; /** @var bool */ private $insert_todos = false; /** @var bool */ private $sort_class_properties = false; /** @var bool */ private $sort_class_methods = false; /** @var bool */ private $sort_class_constants = false; /** @var bool */ private $sort_class_traits = false; /** @var bool */ private $sort_class_interfaces = false; /** @var AbstractRemoteRepository|null */ private $remote_repository = null; /** @var string|null */ private $base_url = null; /** @var string|null */ private $favicon = null; /** * @var array|null */ private $footer_link = null; /** * include parent properties and methods on class pages * * @var bool */ private $include_parent_data = true; public function __construct($iterator = null, array $config = []) { $this->config = $config; if (null !== $iterator) { $this->files = $iterator; } $this->version = self::$defaultVersionName; $this->build_dir = getcwd() . DIRECTORY_SEPARATOR . 'build'; $this->cache_dir = getcwd() . DIRECTORY_SEPARATOR . 'cache'; $this->source_dir = getcwd() . DIRECTORY_SEPARATOR; foreach ($config as $key => $value) { $this->{$key} = $value; } // I explain what I understood about the code: // This file is used in each Doctum config // The console commands boots the app and requires this config file // If it returns a Doctum instance, then okay it can go to the next step // -- Next step // The console does things and calls getProject() on this class and does the render // The console can call setVersion and make only one version render, using the --only-version name provided // End // -- Code explained // The ArrayAccess extends is because before the project was using pimple // I decided it was overkill and replaced it by pure PHP code, we all love pure PHP code. // But I still have to be backwards compatible with "hackers" that used this system "badly" // By replacing the things they did want, bug or feature nobody cares. // So allow the non standard configs to do this for example // $doctum['store'] = function () { return new ApiJsonStore(); }; // Yes, it feels strange but that can not be removed silently now. // So allow array access get/set on this class // Without array access it still could be possible using the config because we do not whitelist configs params } public function setVersion(string $version): void { $this->versions = $version; } public function getProject(): Project { $project = $this->offsetGet('project'); $project->setSourceDir($this->source_dir); return $project; } /** * @param string $offset * @param mixed $value * @return void */ public function offsetSet($offset, $value) { $this->{$offset} = $value; } /** * @param string $offset * @return bool */ public function offsetExists($offset) { return isset($this->{$offset}); } /** * @param string $offset * @return void */ public function offsetUnset($offset) { unset($this->{$offset}); } /** * @param string $offset * @return mixed */ public function offsetGet($offset) { // TODO: maybe drop this in the next major release if (! isset($this->{$offset}) && ! is_callable($this->{$offset})) { switch ($offset) { case 'project': $this->project = $this->getBuiltProject(); break; case 'twig': $this->twig = $this->getTwig(); break; case '_versions': $this->_versions = $this->getVersions(); break; case 'traverser': $this->traverser = $this->getTraverser(); break; case 'themes': $this->themes = $this->getThemes(); break; case 'renderer': $this->renderer = $this->getRenderer(); break; case 'parser': $this->parser = $this->getParser(); break; case 'tree': $this->tree = $this->getTree(); break; case 'indexer': $this->indexer = $this->getIndexer(); break; case 'store': $this->store = $this->getStore(); break; case 'filter': $this->filter = $this->getFilter(); break; case 'parser_context': $this->parser_context = $this->getParserContext(); break; case 'pretty_printer': $this->pretty_printer = $this->getPrettyPrinter(); break; case 'code_parser': $this->code_parser = $this->getCodeParser(); break; case 'docblock_parser': $this->docblock_parser = $this->getDocblockParser(); break; case 'php_parser': $this->php_parser = $this->getPhpParser(); break; case 'php_traverser': $this->php_traverser = $this->getPhpTraverser(); break; } } // This is for users to be able to override our properties like they want.. // TODO: maybe drop this in the next major release if (isset($this->{$offset}) && is_callable($this->{$offset})) { $this->{$offset} = ($this->{$offset})($this); } return isset($this->{$offset}) ? $this->{$offset} : null; } private function getTwig(): Environment { $dataDir = __DIR__ . '/../locale/'; $moReader = new MoReader( ['localeDir' => $dataDir] ); /** @var string $configLanguage */ $configLanguage = $this->config['language'] ?? 'en'; $moReader->readFile($dataDir . $configLanguage . '.mo'); Launcher::setPlugin($moReader); $twig = new Environment( new FilesystemLoader(['/']), [ 'strict_variables' => true, 'debug' => true, 'auto_reload' => true, 'cache' => false, ] ); Doctum::addTwigExtensions($twig); return $twig; } /** * @internal Do not use outside of the project */ public static function addTwigExtensions(Environment $twig): void { $twig->addExtension(new TwigExtension()); $twig->addExtension(new I18nExtension()); } private function getBuiltProject(): Project { $project = new Project( $this['store'], $this['_versions'], [ 'build_dir' => $this->build_dir, 'cache_dir' => $this->cache_dir, 'remote_repository' => $this->remote_repository, 'include_parent_data' => $this->include_parent_data, 'default_opened_level' => $this->default_opened_level, 'theme' => $this->theme, 'title' => $this->title, 'source_url' => $this->source_url, 'base_url' => $this->base_url, 'favicon' => $this->favicon, 'insert_todos' => $this->insert_todos, 'footer_link' => $this->footer_link, 'sort_class_properties' => $this->sort_class_properties, 'sort_class_methods' => $this->sort_class_methods, 'sort_class_constants' => $this->sort_class_constants, 'sort_class_traits' => $this->sort_class_traits, 'sort_class_interfaces' => $this->sort_class_interfaces, ] ); $project->setRenderer($this['renderer']); $project->setParser($this['parser']); return $project; } private function getVersions(): VersionCollection { $versions = $this->versions ?? $this->version; if (is_string($versions)) { $versions = new Version($versions); } if ($versions instanceof Version) { $versions = new SingleVersionCollection($versions); } return $versions; } private function getTraverser(): ClassTraverser { $visitors = [ new ClassVisitor\InheritdocClassVisitor(), new ClassVisitor\MethodClassVisitor(), new ClassVisitor\PropertyClassVisitor($this['parser_context']), ]; if ($this['remote_repository'] instanceof AbstractRemoteRepository) { $visitors[] = new ClassVisitor\ViewSourceClassVisitor($this['remote_repository']); } return new ClassTraverser($visitors); } private function getThemes(): ThemeSet { /** @var string[] $templates */ $templates = $this->config['template_dirs'] ?? []; $templates[] = __DIR__ . '/Resources/themes'; return new ThemeSet($templates); } private function getRenderer(): Renderer { return new Renderer($this['twig'], $this['themes'], $this['tree'], $this['indexer']); } private function getParser(): Parser { return new Parser($this->files, $this['store'], $this['code_parser'], $this['traverser']); } private function getTree(): Tree { return new Tree(); } private function getIndexer(): Indexer { return new Indexer(); } private function getStore(): StoreInterface { return new JsonStore(); } private function getFilter(): FilterInterface { return new DefaultFilter(); } private function getParserContext(): ParserContext { return new ParserContext($this['filter'], $this['docblock_parser'], $this['pretty_printer']); } private function getPrettyPrinter(): PrettyPrinter { return new PrettyPrinter(); } private function getCodeParser(): CodeParser { return new CodeParser($this['parser_context'], $this['php_parser'], $this['php_traverser']); } private function getDocblockParser(): DocBlockParser { return new DocBlockParser(); } private function getPhpParser(): PhpParser { return (new ParserFactory())->create(ParserFactory::PREFER_PHP7); } private function getPhpTraverser(): NodeTraverser { $traverser = new NodeTraverser(); $traverser->addVisitor(new NameResolver()); $traverser->addVisitor(new NodeVisitor($this['parser_context'])); return $traverser; } } pGSUB %zTOS/2> IPVcmapC~cvt 4 fpgmYT pgasp,glyf(headrs 6hhea<VD$hmtx h loca`qtmaxp | name,UpostE47prepA+ 0>DFLTlatnligazz1PfEdRjZR,VP, V$ (V&E@B G D`TXL! && +23'5'#"'.4>"2>4.I}$%" !> $[1J?=II|J3V32WfV22VI=?J1[$ >! "%$}|IS3VfV22VfW2|-+M|#r@_< 55Rj`q'sV p"( .9 +? j *}           V &QMaterial Design IconsdoctumRegulardoctumdoctumVersion 1.0doctumGenerated by svg2ttf from Fontello project.http://fontello.comMaterial Design IconsdoctumRegulardoctumdoctumVersion 1.0doctumGenerated by svg2ttf from Fontello project.http://fontello.com searchplayRjRj, UXEY KQKSZX4(Y`f UX%acc#b!!YC#DC`B-, `f-, d P&Z( CEcER[X!#!X PPX!@Y 8PX!8YY  CEcEad(PX! CEcE 0PX!0Y PX f a PX` PX! ` 6PX!6``YYY+YY#PXeYY-, E %ad CPX#B#B!!Y`-,#!#! dbB #B CEc C`Ec*! C +0%&QX`PaRYX#Y! @SX+!@Y#PXeY-,C+C`B-,#B# #Babfc`*-, E Ccb PX@`Yfc`D`-, CEB*!C`B- ,C#DC`B- , E +#C%` E#a d PX!0PX @YY#PXeY%#aDD`- , E +#C%` E#a d$PX@Y#PXeY%#aDD`- , #B EX!#!Y*!- ,EdaD-,` CJPX #BY CJRX #BY-, bfc c#aC` ` #B#-,KTXdDY$ e#x-,KQXKSXdDY!Y$e#x-,CUXCaB+YC%B %B %B# %PXC`%B #a*!#a #a*!C`%B%a*!Y CG CG`b PX@`Yfc Ccb PX@`Yfc`#DC>C`B-,ETX#B E #B #`B `aBB`+r+"Y-,+-,+-,+-,+-,+-,+-,+-,+-,+-, +-, +ETX#B E #B #`B `aBB`+r+"Y-,+- ,+-!,+-",+-#,+-$,+-%,+-&,+-',+-(, +-), <`-*, `` C#`C%a`)*!-+,*+**-,, G Ccb PX@`Yfc`#a8# UX G Ccb PX@`Yfc`#a8!Y--,ETX,*0"Y-., +ETX,*0"Y-/, 5`-0,Ecb PX@`Yfc+ Ccb PX@`Yfc+D>#8/*-1, < G Ccb PX@`Yfc`Ca8-2,.<-3, < G Ccb PX@`Yfc`CaCc8-4,% . G#B%IG#G#a Xb!Y#B3*-5,%%G#G#a C+e.# <8-6,%% .G#G#a #B C+ `PX @QX  &YBB# C #G#G#a#F`Cb PX@`Yfc` + a C`d#CadPXCaC`Y%b PX@`Yfca# &#Fa8#CF%CG#G#a` Cb PX@`Yfc`# +#C`+%a%b PX@`Yfc&a %`d#%`dPX!#!Y# &#Fa8Y-7, & .G#G#a#<8-8, #B F#G+#a8-9,%%G#G#aTX. <#!%%G#G#a %%G#G#a%%I%acc# Xb!Ycb PX@`Yfc`#.# <8#!Y-:, C .G#G#a ` `fb PX@`Yfc# <8-;,# .F%FRX ,5+# .F%FRX +-S,>+-T,>+-U,>+-V,@+-W,@+-X,@+-Y,@+-Z,C+-[,C+-\,C+-],C+-^,?+-_,?+-`,?+-a,?+-b,7+.++-c,7+;+-d,7+<+-e,7+=+-f,8+.++-g,8+;+-h,8+<+-i,8+=+-j,9+.++-k,9+;+-l,9+<+-m,9+=+-n,:+.++-o,:+;+-p,:+<+-q,:+=+-r, EX!#!YB+e$Px0-KRXYcpB*B *B*B *B@ *D$QX@XdD&QX@cTXDYYYY  *DwOFF 4LGSUBX;T %zOS/2CV> IcmapP~Ccvt ( fpgm< pYgaspglyfhead16rshhea$<Vhmtx  loca `qmaxp  name 8XU,post &7E4prep zA+xc`d``b0`c`rq aI,cb`a<21'3=ʱi f&;Hxc`d~8iCf|`e`ef \S`x?!9aP$ x퐱 0 ω@AA0T_E2]\ȭrl;Gx쯍!VtVk-T ̸ ]xc`@? lxViwFyI,% -jaiF&l Ac ];_ds7~Z/$pweZ 둔/&< MQ|(;{!eQڷDD"PDYd|QF˶WM-=.[AU~:ʱ;f3th=%UUH=RҦe+I+WPˆN"iHgh5(l(R$Ay ͐ʧأVK/yw9?_oQ@Ȏt%_[[aܴ(TvwBlTfF+2Ќ`|+?!Y-OGZAeNK>)qY 3 >) xzG%)as4I0r`%e*8uZ[~їhPwb<[[9QhRLIͣ) t&x̯(?I^mc5G8fƄD"-KSA,;)ͣv-ZܣVSFVb: i/i"E~LA2-6Ôoז+}DO) LUV@bkYլwCVrǾq_33߉ӳ#.=sK|u=שrqfyNY4YK[,?iG:cyA t00CX^!, aCXa%creSIڙXlB`bEj*TBhTjCnTϪe^<9HȚ_1ΕF-o;Wo9R֋?T%bÓl'6xtMU=_TTX HX(ʲlpg":jClad-0fs2s|u/ d9 0'x_1a s|1s$a0-^]AUSOXPSeA / gALUӝ!7^1Le| ]l>@xNPFҪWjZHnq1Is1aqS7`Qxi4x3CLtSLwtO @`[%;Us z7g÷k嵮\RNn0c 7Pc`W `eeT- o=e$.p>K\,*5d}0`}%Kxc`d``9b<6__En^a~t ``W +xc`d``$_00IFT \`q'sV px]=N0_h!ҟ.,U=M4UG[=,\xĊ.uŻb-k8:[ &:p-8,g\bqJWfs-[n?,7qO-ߖXrw3R^"FLL}&hxռU&n2&2XDƄ"*c$JZoܕ1 *  $4bRUA!‡" Ŝp>ZˋХʮ>w0+q.t BN8\[9Xr _jVxc`b.쀙85(9 '%Rxcp"(b##c_Ɲ  X6102h9 ,>0i4'ffp٨#b#sF5oG#CGrHHI$labuKF& v# Material Design Icons wOF2LqTV~ p dv 6$  U7 MNmR8|` vQMnu~d ge3OR!TM]H"݀wE 8,0}Os[|V7u4VtV.Pj|5B85׋kl`3IZ37p?8pAkA@X *|-QC QBUԵz - 4ӓH}ru(/~eӏ=2@bӣ| /" wBXD&Cg5+Y" .(< xfűf3@S$RuU(ОYz7O3r=׻S;qރnPj ŋCgE Xo,?'ou]i7y 9˪ &gz#׈8Txq>]Z0,NhH1 YA9;r6Дsh,gBnB*y0o^gU)bU_ǧ VSQȰʮks AdRT@!zpo[#$TBDSadS TE!z0)jf%/TpV_5)7E1 ވnjjcq>F#1w:VCtOޗ>HEj1pKQd5hRb{CI8O~k' =E[2qY =mvWʪ̴"V`χ|zF9Ґ dh|Ʀ&]D1i1ZfA1&Ay$P"y$!P(!y$<0|(ɰ6F'YK84A>O~j_|~O>?|VN^z*a|݇=Pf[UU-iiD:Uv+WG$Vs艄jL\i61)5AwILm сўF)^ }mg̏j?[!upHi2PA V| 5YYXy B_ !*ot 5 dRE774C >`=ì1K"3Oc&5(ѻVf!Tק,16qIBc'+5az,Poؚq+ )d՟Z`՘E֬bܤus2̠g]X ):F3b{U&YgLL`.`5eۜ9xf)|Ԍ2G%1cIqgiG%-e4|#.b$ ~fKCDW݀χlRGLzȊ"b+eH:|1F4z6 e7ڏOgWbGLLP@r doctumRegularVersion 1.0 doctumpGSUB %zTOS/2> IPVcmapC~cvt 4 fpgmYT pgasp,glyf(headrs 6hhea<VD$hmtx h loca`qtmaxp | name,UpostE47prepA+ 0>DFLTlatnligazz1PfEdRjZR,VP, V$ (V&E@B G D`TXL! && +23'5'#"'.4>"2>4.I}$%" !> $[1J?=II|J3V32WfV22VI=?J1[$ >! "%$}|IS3VfV22VfW2|-+M|#r@_< 55Rj`q'sV p"( .9 +? j *}           V &QMaterial Design IconsdoctumRegulardoctumdoctumVersion 1.0doctumGenerated by svg2ttf from Fontello project.http://fontello.comMaterial Design IconsdoctumRegulardoctumdoctumVersion 1.0doctumGenerated by svg2ttf from Fontello project.http://fontello.com searchplayRjRj, UXEY KQKSZX4(Y`f UX%acc#b!!YC#DC`B-, `f-, d P&Z( CEcER[X!#!X PPX!@Y 8PX!8YY  CEcEad(PX! CEcE 0PX!0Y PX f a PX` PX! ` 6PX!6``YYY+YY#PXeYY-, E %ad CPX#B#B!!Y`-,#!#! dbB #B CEc C`Ec*! C +0%&QX`PaRYX#Y! @SX+!@Y#PXeY-,C+C`B-,#B# #Babfc`*-, E Ccb PX@`Yfc`D`-, CEB*!C`B- ,C#DC`B- , E +#C%` E#a d PX!0PX @YY#PXeY%#aDD`- , E +#C%` E#a d$PX@Y#PXeY%#aDD`- , #B EX!#!Y*!- ,EdaD-,` CJPX #BY CJRX #BY-, bfc c#aC` ` #B#-,KTXdDY$ e#x-,KQXKSXdDY!Y$e#x-,CUXCaB+YC%B %B %B# %PXC`%B #a*!#a #a*!C`%B%a*!Y CG CG`b PX@`Yfc Ccb PX@`Yfc`#DC>C`B-,ETX#B E #B #`B `aBB`+r+"Y-,+-,+-,+-,+-,+-,+-,+-,+-,+-, +-, +ETX#B E #B #`B `aBB`+r+"Y-,+- ,+-!,+-",+-#,+-$,+-%,+-&,+-',+-(, +-), <`-*, `` C#`C%a`)*!-+,*+**-,, G Ccb PX@`Yfc`#a8# UX G Ccb PX@`Yfc`#a8!Y--,ETX,*0"Y-., +ETX,*0"Y-/, 5`-0,Ecb PX@`Yfc+ Ccb PX@`Yfc+D>#8/*-1, < G Ccb PX@`Yfc`Ca8-2,.<-3, < G Ccb PX@`Yfc`CaCc8-4,% . G#B%IG#G#a Xb!Y#B3*-5,%%G#G#a C+e.# <8-6,%% .G#G#a #B C+ `PX @QX  &YBB# C #G#G#a#F`Cb PX@`Yfc` + a C`d#CadPXCaC`Y%b PX@`Yfca# &#Fa8#CF%CG#G#a` Cb PX@`Yfc`# +#C`+%a%b PX@`Yfc&a %`d#%`dPX!#!Y# &#Fa8Y-7, & .G#G#a#<8-8, #B F#G+#a8-9,%%G#G#aTX. <#!%%G#G#a %%G#G#a%%I%acc# Xb!Ycb PX@`Yfc`#.# <8#!Y-:, C .G#G#a ` `fb PX@`Yfc# <8-;,# .F%FRX ,5+# .F%FRX +-S,>+-T,>+-U,>+-V,@+-W,@+-X,@+-Y,@+-Z,C+-[,C+-\,C+-],C+-^,?+-_,?+-`,?+-a,?+-b,7+.++-c,7+;+-d,7+<+-e,7+=+-f,8+.++-g,8+;+-h,8+<+-i,8+=+-j,9+.++-k,9+;+-l,9+<+-m,9+=+-n,:+.++-o,:+;+-p,:+<+-q,:+=+-r, EX!#!YB+e$Px0-KRXYcpB*B *B*B *B@ *D$QX@XdD&QX@cTXDYYYY  *D@font-face { font-family: "doctum"; src: url("./doctum.eot?39101248"); src: url("./doctum.eot?39101248#iefix") format("embedded-opentype"), url("./doctum.woff2?39101248") format("woff2"), url("./doctum.woff?39101248") format("woff"), url("./doctum.ttf?39101248") format("truetype"), url("./doctum.svg?39101248#doctum") format("svg"); font-weight: normal; font-style: normal; } /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ /* @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'doctum'; src: url('./doctum.svg?39101248#doctum') format('svg'); } } */ .icon { font-family: "doctum"; font-style: normal; font-weight: normal; speak: never; display: inline-block; text-decoration: inherit; width: 1em; margin-right: 0.2em; text-align: center; /* opacity: .8; */ /* For safety - reset parent styles, that can break glyph codes*/ font-variant: normal; text-transform: none; /* fix buttons height, for twitter bootstrap */ line-height: 1em; /* Animation center compensation - margins should be symmetric */ /* remove if not needed */ margin-left: 0.2em; /* you can be more comfortable with increased icons size */ /* font-size: 120%; */ /* Font smoothing. That was taken from TWBS */ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; /* Uncomment for 3D effect */ /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ } .icon-search:before { content: "\e800"; } /* '' */ .icon-play:before { content: "\e801"; } /* '' */ {% extends "layout/layout.twig" %} {% from "macros.twig" import render_classes %} {% block title %}{% trans 'Interfaces' %} | {{ parent() }}{% endblock %} {% block body_class 'interfaces' %} {% block page_content %} {{ render_classes(interfaces) }} {% endblock %} {% extends "layout/layout.twig" %} {% from "macros.twig" import class_link %} {% block title %}{% trans 'Traits' %} | {{ parent() }}{% endblock %} {% block body_class 'traits' %} {% block page_content %}
{% for class in classes %} {% if class.trait %}
{{ class_link(class, true) }}
{{ class.shortdesc|desc(class) }}
{% endif %} {% endfor %}
{% endblock %} name: default static: 'css/doctum.css': 'css/doctum.css' 'css/bootstrap.min.css': 'css/bootstrap.min.css' 'css/bootstrap-theme.min.css': 'css/bootstrap-theme.min.css' 'fonts/doctum-font.css': 'fonts/doctum-font.css' 'fonts/doctum.woff': 'fonts/doctum.woff' 'fonts/doctum.woff2': 'fonts/doctum.woff2' 'fonts/doctum.ttf': 'fonts/doctum.ttf' 'fonts/doctum.svg': 'fonts/doctum.svg' 'fonts/doctum.eot': 'fonts/doctum.eot' 'js/jquery-3.5.1.slim.min.js': 'js/jquery-3.5.1.slim.min.js' 'js/bootstrap.min.js': 'js/bootstrap.min.js' 'js/typeahead.min.js': 'js/typeahead.min.js' global: 'index.twig': 'index.html' 'doc-index.twig': 'doc-index.html' 'namespaces.twig': 'namespaces.html' 'classes.twig': 'classes.html' 'interfaces.twig': 'interfaces.html' 'traits.twig': 'traits.html' 'opensearch.twig': 'opensearch.xml' 'search.twig': 'search.html' 'doctum.js.twig': 'doctum.js' namespace: 'namespace.twig': '%s.html' class: 'class.twig': '%s.html' {% if has_namespaces %} {% set extension = 'namespaces.twig' %} {% else %} {% set extension = 'classes.twig' %} {% endif %} {% extends extension %} {% block body_class 'index' %} {% from _self import element %} {% macro add_class_methods_index(class, prettyJsonOptions) %} {% if class.methods %} {% set from_link = class_path(class) %} {% for meth in class.methods %} {{- { type: 'Method'|trans, fromName: class.name, fromLink: from_link, link: method_path(meth), name: meth.__toString(), doc: meth.shortdesc|desc(class), }|json_encode(prettyJsonOptions)|raw -}}, {% endfor %} {% endif %} {% endmacro %} (function(root) { var bhIndex = null; var rootPath = ''; var treeHtml = '{{ element(tree, project.config('default_opened_level'), 0)|replace({"'": "\\'", "\n": ''})|spaceless|raw }}'; var searchTypeClasses = { '{{ 'Namespace'|trans|escape('js') }}': 'label-default', '{{ 'Class'|trans|escape('js') }}': 'label-info', '{{ 'Interface'|trans|escape('js') }}': 'label-primary', '{{ 'Trait'|trans|escape('js') }}': 'label-success', '{{ 'Method'|trans|escape('js') }}': 'label-danger', '_': 'label-warning' }; var searchIndex = [ {% from _self import add_class_methods_index %} {% set prettyJsonOptions = constant('JSON_UNESCAPED_SLASHES') b-or constant('JSON_UNESCAPED_UNICODE') %} {% for ns in namespaces -%} {{- { type: 'Namespace'|trans, link: namespace_path(ns), name: ns, doc: 'Namespace %s'|format(ns), }|json_encode(prettyJsonOptions)|raw -}}, {%- endfor %} {% for class in interfaces -%} {% set interface = { type: 'Interface'|trans, link: class_path(class), name: class.name, doc: class.shortdesc|desc(class), } %} {% if class.namespace %} {% set interface = { type: interface.type, fromName: class.namespace, fromLink: namespace_path(class.namespace), link: interface.link, name: interface.name, doc: interface.doc, } %} {% endif %} {{- interface|json_encode(prettyJsonOptions)|raw -}}, {{ add_class_methods_index(class, prettyJsonOptions) }} {% endfor %} {% for class in classes -%} {% set classOrTrait = { type: class.isTrait ? 'Trait'|trans : 'Class'|trans, link: class_path(class), name: class.name, doc: class.shortdesc|desc(class), } %} {% if class.namespace %} {% set classOrTrait = { type: classOrTrait.type, fromName: class.namespace, fromLink: namespace_path(class.namespace), link: classOrTrait.link, name: classOrTrait.name, doc: classOrTrait.doc, } %} {% endif %} {{- classOrTrait|json_encode(prettyJsonOptions)|raw -}}, {{ add_class_methods_index(class, prettyJsonOptions) }} {% endfor %} {# Override this block, search_index_extra, to add custom search entries! #} {% block search_index_extra '' %} // Fix trailing commas in the index {} ]; /** Tokenizes strings by namespaces and functions */ function tokenizer(term) { if (!term) { return []; } var tokens = [term]; var meth = term.indexOf('::'); // Split tokens into methods if "::" is found. if (meth > -1) { tokens.push(term.substr(meth + 2)); term = term.substr(0, meth - 2); } // Split by namespace or fake namespace. if (term.indexOf('\\') > -1) { tokens = tokens.concat(term.split('\\')); } else if (term.indexOf('_') > 0) { tokens = tokens.concat(term.split('_')); } // Merge in splitting the string by case and return tokens = tokens.concat(term.match(/(([A-Z]?[^A-Z]*)|([a-z]?[^a-z]*))/g).slice(0,-1)); return tokens; }; root.Doctum = { /** * Cleans the provided term. If no term is provided, then one is * grabbed from the query string "search" parameter. */ cleanSearchTerm: function(term) { // Grab from the query string if (typeof term === 'undefined') { var name = 'search'; var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"); var results = regex.exec(location.search); if (results === null) { return null; } term = decodeURIComponent(results[1].replace(/\+/g, " ")); } return term.replace(/<(?:.|\n)*?>/gm, ''); }, /** Searches through the index for a given term */ search: function(term) { // Create a new search index if needed if (!bhIndex) { bhIndex = new Bloodhound({ limit: 500, local: searchIndex, datumTokenizer: function (d) { return tokenizer(d.name); }, queryTokenizer: Bloodhound.tokenizers.whitespace }); bhIndex.initialize(); } results = []; bhIndex.get(term, function(matches) { results = matches; }); if (!rootPath) { return results; } // Fix the element links based on the current page depth. return $.map(results, function(ele) { if (ele.link.indexOf('..') > -1) { return ele; } ele.link = rootPath + ele.link; if (ele.fromLink) { ele.fromLink = rootPath + ele.fromLink; } return ele; }); }, /** Get a search class for a specific type */ getSearchClass: function(type) { return searchTypeClasses[type] || searchTypeClasses['_']; }, /** Add the left-nav tree to the site */ injectApiTree: function(ele) { ele.html(treeHtml); } }; $(function() { // Modify the HTML to work correctly based on the current depth rootPath = $('body').attr('data-root-path'); treeHtml = treeHtml.replace(/href="/g, 'href="' + rootPath); Doctum.injectApiTree($('#api-tree')); }); return root.Doctum; })(window); $(function() { {% if project.versions|length > 1 %} // Enable the version switcher $('#version-switcher').on('change', function() { window.location = $(this).val() }); var versionSwitcher = document.getElementById('version-switcher'); if (versionSwitcher) { var versionToSelect = document.evaluate( '//option[@data-version="{{ project.version|escape('js') }}"]', versionSwitcher, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue; if (versionToSelect && typeof versionToSelect.selected === 'boolean') { versionToSelect.selected = true; } } {% endif %} {% block treejs %} // Toggle left-nav divs on click $('#api-tree .hd span').on('click', function() { $(this).parent().parent().toggleClass('opened'); }); // Expand the parent namespaces of the current page. var expected = $('body').attr('data-name'); if (expected) { // Open the currently selected node and its parents. var container = $('#api-tree'); var node = $('#api-tree li[data-name="' + expected + '"]'); // Node might not be found when simulating namespaces if (node.length > 0) { node.addClass('active').addClass('opened'); node.parents('li').addClass('opened'); var scrollPos = node.offset().top - container.offset().top + container.scrollTop(); // Position the item nearer to the top of the screen. scrollPos -= 200; container.scrollTop(scrollPos); } } {% endblock %} {% verbatim %} var form = $('#search-form .typeahead'); form.typeahead({ hint: true, highlight: true, minLength: 1 }, { name: 'search', displayKey: 'name', source: function (q, cb) { cb(Doctum.search(q)); } }); // The selection is direct-linked when the user selects a suggestion. form.on('typeahead:selected', function(e, suggestion) { window.location = suggestion.link; }); // The form is submitted when the user hits enter. form.keypress(function (e) { if (e.which == 13) { $('#search-form').submit(); return true; } }); {% endverbatim %} }); {% macro element(tree, opened, depth) %} {% from _self import element %} {% endmacro %} {% extends "layout/layout.twig" %} {% from "macros.twig" import namespace_link %} {% block title %}{% trans 'Namespaces' %} | {{ parent() }}{% endblock %} {% block body_class 'namespaces' %} {% block page_content %} {% if namespaces %}
{% set last_name = '' %} {% for namespace in namespaces %} {% set top_level = namespace|split('\\')|first %} {% if top_level != last_name %} {% if last_name %}
{% endif %}

{{ top_level|raw }}

    {% set last_name = top_level %} {% endif %}
  • {{ namespace_link(namespace) }}
  • {% endfor %}
{% endif %} {% endblock %} {% extends "layout/layout.twig" %} {% from "macros.twig" import class_link, namespace_link, method_link, property_link %} {% block title %}{% trans 'Index' %} | {{ parent() }}{% endblock %} {% block body_class 'doc-index' %} {% block page_content %}
    {% for letter in 'A'..'Z' %} {% if items[letter] is defined and items[letter]|length > 1 %}
  • {{ letter|raw }}
  • {% else %}
  • {{ letter|raw }}
  • {% endif %} {% endfor %}
{% for letter, elements in items -%}

{{ letter|raw }}

{%- for element in elements %} {%- set type = element[0] %} {%- set value = element[1] %} {%- if 'class' == type -%}
{{ class_link(value) }}{% if has_namespaces %} — {{'Class in namespace %s'|trans|format( namespace_link(value.namespace) )|raw}}{% endif %}
{{ value.shortdesc|desc(value) }}
{%- elseif 'method' == type -%}
{{ method_link(value) }}() — {{ 'Method in class %s'|trans|format( class_link(value.class) )|raw }}
{{ value.shortdesc|desc(value.class) }}
{%- elseif 'property' == type -%}
${{ property_link(value) }} — {{ 'Property in class %s'|trans|format( class_link(value.class) )|raw}}
{{ value.shortdesc|desc(value.class) }}
{%- endif %} {%- endfor %}
{%- endfor %} {% endblock %} {% extends "layout/layout.twig" %} {% from "macros.twig" import render_classes, breadcrumbs, namespace_link, class_link, property_link, method_link, hint_link, source_link, method_source_link, deprecated, deprecations, internals, todo, todos, class_category_name %} {% block title %}{{ class|raw }} | {{ parent() }}{% endblock %} {% block body_class 'class' %} {% block page_id 'class:' ~ (class.name|replace({'\\': '_'})) %} {% block below_menu %} {% if class.namespace %}
{% endif %} {% endblock %} {% block page_content %} {% if class.hasSince() %} {{ 'Since:'|trans }} {{ class.getSince() }}
{% endif %}

{{ block('class_signature') }}

{{ deprecations(class) }} {{ internals(class) }} {% if class.shortdesc or class.longdesc %}
{% if class.shortdesc -%}

{{ class.shortdesc|desc(class) }}

{%- endif %} {% if class.longdesc -%}

{{ class.longdesc|desc(class) }}

{%- endif %}
{% endif %} {{- todos(class) -}} {% if traits %}

{% trans 'Traits' %}

{{ render_classes(traits) }} {% endif %} {% if constants %}

{% trans 'Constants' %}

{{- block('constants') }} {% endif %} {% if properties %}

{% trans 'Properties' %}

{{ block('properties') }} {% endif %} {% if methods %}

{% trans 'Methods' %}

{{ block('methods') }}

{% trans 'Details' %}

{{ block('methods_details') }} {% endif %} {% endblock %} {% block class_signature -%} {% if class.final %}final {% endif %} {% if not class.interface and class.abstract %}abstract {% endif %} {{ class_category_name(class.getCategoryId()) }} {{ class.shortname|raw }} {%- if class.parent %} extends {{ class_link(class.parent) }} {%- endif %} {%- if class.interfaces|length > 0 %} implements {% for interface in class.interfaces %} {{- class_link(interface) }} {%- if not loop.last %}, {% endif %} {%- endfor %} {%- endif %} {%- if class.hasMixins %} {% for mixin in class.getMixins() %} mixin {{ class_link(mixin.class) }} {% endfor %} {%- endif %} {{- source_link(project, class) }} {% endblock %} {% block method_signature -%} {% if method.final %}final{% endif %} {% if method.abstract %}abstract{% endif %} {% if method.static %}static{% endif %} {% if method.protected %}protected{% endif %} {% if method.private %}private{% endif %} {{ hint_link(method.hint) }} {{ method.name|raw }}{{ block('method_parameters_signature') }} {%- endblock %} {% block method_parameters_signature -%} {%- from "macros.twig" import method_parameters_signature -%} {{ method_parameters_signature(method) }} {{ deprecated(method) }} {%- endblock %} {% block parameters %} {% for parameter in method.parameters %} {% endfor %}
{% if parameter.hint %}{{ hint_link(parameter.hint) }}{% endif %} {%- if parameter.variadic %}...{% endif %}${{ parameter.name|raw }} {{ parameter.shortdesc|desc(class) }}
{% endblock %} {% block return %}
{{ hint_link(method.hint) }} {{ method.hintDesc|desc(class) }}
{% endblock %} {% block exceptions %} {% for exception in method.exceptions %} {% endfor %}
{{ class_link(exception[0]) }} {{ exception[1]|desc(class) }}
{% endblock %} {% block examples %} {% for example in method.getExamples() %} {% endfor %}
                    {{- example|join(' ')|nl2br -}}
                
{% endblock %} {% block see %} {% for see in method.getSee() %} {% endfor %}
{% if see[4] %} {{see[4]}} {% elseif see[3] %} {{ method_link(see[3], false, false) }} {% elseif see[2] %} {{ class_link(see[2]) }} {% else %} {{ see[0]|raw }} {% endif %} {{ see[1]|raw }}
{% endblock %} {% block constants %} {% for constant in constants %} {% endfor %}
{# Keep in order with an else if, it can be set by typehints and by annotations #} {# More restricted wins #} {% if constant.isPrivate() %}private {% elseif constant.isProtected() %}protected{% endif %} {% if constant.isInternal() %}{% trans 'internal' %}{% endif %} {% if constant.isDeprecated() %}{% trans 'deprecated' %}{% endif %} {{ constant.name|raw }} {% if constant.hasSince() %} {{ 'Since:'|trans }} {{ constant.getSince() }}
{% endif %}

{{ constant.shortdesc|desc(class) }}

{{ constant.longdesc|desc(class) }}

{% endblock %} {% block properties %} {% for property in properties %} {% endfor %}
{% if property.isStatic() %}static{% endif %} {% if property.isProtected() %}protected{% endif %} {% if property.isPrivate() %}private{% endif %} {{ hint_link(property.hint) }} {% if property.isInternal() %}{% trans 'internal' %}{% endif %} {% if property.isDeprecated() %}{% trans 'deprecated' %}{% endif %} {% if property.isReadOnly() %}{% trans 'read-only' %}{% endif %} {% if property.isWriteOnly() %}{% trans 'write-only' %}{% endif %} {% if property.hasSince() %} {{ 'Since:'|trans }} {{ property.getSince() }}
{% endif %}
${{ property.name|raw }} {{ property.shortdesc|desc(class) }} {%- if property.class is not same as(class) -%} {{ 'from %s'|trans|format(property_link(property, false, true))|raw }} {%- endif -%}
{% endblock %} {% block methods %}
{% for method in methods %}
{% if method.static %}static {% endif %}{{ hint_link(method.hint) }}
{{ method.name|raw }}{{ block('method_parameters_signature') }} {% if not method.shortdesc %}

{% trans 'No description' %}

{% else %}

{{ method.shortdesc|desc(class) }}

{%- endif %}
{%- if method.class is not same as(class) -%} {{ 'from %s'|trans|format(method_link(method, false, true))|raw }} {%- endif -%}
{% endfor %}
{% endblock %} {% block methods_details %}
{% for method in methods %}
{{ block('method') }}
{% endfor %}
{% endblock %} {% block method %}

{% if method.class is not same as(class) %}{{ 'in %s'|trans|format(method_link(method, false, true))|raw }} {% endif %}{{ method_source_link(method) }}
{{ block('method_signature') }}

{%- if method.hasSince() -%} {{ 'Since:'|trans }} {{ method.getSince() }}
{%- endif -%} {{ deprecations(method) }} {{ internals(method) }}
{% if not method.shortdesc and not method.longdesc %}

{% trans 'No description' %}

{% else %} {% if method.shortdesc -%}

{{ method.shortdesc|desc(class) }}

{%- endif %} {% if method.longdesc -%}

{{ method.longdesc|desc(class) }}

{%- endif %} {%- endif %} {{- todos(method) -}}
{% if method.parameters %}

{% trans 'Parameters' %}

{{ block('parameters') }} {% endif %} {% if method.hintDesc or method.hint %}

{% trans 'Return Value' %}

{{ block('return') }} {% endif %} {% if method.exceptions %}

{% trans 'Exceptions' %}

{{ block('exceptions') }} {% endif %} {% if method.tags('see') %}

{% trans 'See also' %}

{{ block('see') }} {% endif %} {% if method.hasExamples() %}

{% trans 'Examples' %}

{{ block('examples') }} {% endif %}
{% endblock %} {% extends "layout/layout.twig" %} {% from "macros.twig" import class_link, namespace_link, method_link, property_link %} {% block title %}{% trans 'Search' %} | {{ parent() }}{% endblock %} {% block body_class 'search-page' %} {% block page_content %}

{% trans 'This page allows you to search through the API documentation for specific terms. Enter your search words into the box below and click "submit". The search will be performed on namespaces, classes, interfaces, traits, functions, and methods.' %}

{% trans 'Search Results' %}

    {{ block('js_search') }} {% endblock %} {% block js_search %} {% endblock %} {% extends "layout/layout.twig" %} {% from "macros.twig" import breadcrumbs, render_classes, class_link, namespace_link, hint_link, deprecated, function_parameters_signature %} {% block title %}{{ namespace == '' ? global_namespace_name() : namespace|raw }} | {{ parent() }}{% endblock %} {% block body_class 'namespace' %} {% block page_id 'namespace:' ~ (namespace|replace({'\\': '_'})) %} {% block below_menu %}
    {% endblock %} {% block page_content %} {% if subnamespaces %}

    {% trans 'Namespaces' %}

    {% for ns in subnamespaces %}{{ namespace_link(ns) }}{% endfor %}
    {% endif %} {% if classes %}

    {% trans 'Classes' %}

    {{- render_classes(classes) -}} {% endif %} {% if interfaces %}

    {% trans 'Interfaces' %}

    {{- render_classes(interfaces) -}} {% endif %} {% if functions %}

    {% trans 'Functions' %}

    {% for function in functions %}
    {% if function.isStatic() %}static{% endif %} {% if function.isProtected() %}protected{% endif %} {% if function.isPrivate() %}private{% endif %} {{ hint_link(function.hint) }}
    {{ function.name|raw }} {{- function_parameters_signature(function) -}}
    {% if function.isInternal() %}{% trans 'internal' %}{% endif %} {% if function.isDeprecated() %}{% trans 'deprecated' %}{% endif %} {% if function.hasSince() %} {{ 'Since:'|trans }} {{ function.getSince() }}
    {% endif %} {% if not function.shortdesc %}

    {% trans 'No description' %}

    {% else %}

    {{ function.shortdesc|desc(function) }}

    {%- endif %}
    {%- if function.namespace is not same as(namespace) -%} {{ function|raw }} {%- endif -%}
    {% endfor %}
    {% endif %} {% if exceptions %}

    {% trans 'Exceptions' %}

    {{- render_classes(exceptions) -}} {% endif %} {% endblock %} {% macro class_category_name(categoryId) -%} {% if categoryId == 1 %}{% trans 'class' %}{% endif %} {% if categoryId == 2 %}{% trans 'interface' %}{% endif %} {% if categoryId == 3 %}{% trans 'trait' %}{% endif %} {%- endmacro %} {% macro namespace_link(namespace) -%}
    {{ namespace == '' ? global_namespace_name() : namespace|raw }} {%- endmacro %} {% macro class_link(class, absolute) -%} {%- if class.isProjectClass() -%} {%- elseif class.isPhpClass() -%} {%- endif %} {{- abbr_class(class, absolute|default(false)) }} {%- if class.isProjectClass() or class.isPhpClass() %}{% endif %} {%- endmacro %} {% macro method_link(method, absolute, classonly) -%} {# #} {# #}{{- abbr_class(method.class) }}{% if not classonly|default(false) %}::{{ method.name|raw }}{% endif -%} {# #} {%- endmacro %} {% macro property_link(property, absolute, classonly) -%} {# #} {# #}{{- abbr_class(property.class) }}{% if not classonly|default(false) %}#{{ property.name|raw }}{% endif -%} {# #} {%- endmacro %} {% macro hint_link(hints) -%} {%- from _self import class_link %} {%- if hints %} {%- for hint in hints %} {%- if hint.class %} {{- class_link(hint.name) }} {%- elseif hint.name %} {{- abbr_class(hint.name) }} {%- endif %} {%- if hint.array %}[]{% endif %} {%- if not loop.last %}|{% endif %} {%- endfor %} {%- endif %} {%- endmacro %} {% macro source_link(project, class) -%} {% if class.sourcepath %} ({% trans 'View source'%}) {%- endif %} {%- endmacro %} {% macro method_source_link(method) -%} {% if method.sourcepath %} {#- l10n: Method at line %s -#} {{'at line %s'|trans|format( method.line )|raw }} {%- else %} {#- l10n: Method at line %s -#} {{- 'at line %s'|trans|format( method.line )|raw -}} {%- endif %} {%- endmacro %} {% macro method_parameters_signature(method) -%} {%- from "macros.twig" import hint_link -%} ( {%- for parameter in method.parameters %} {%- if parameter.hashint %}{{ hint_link(parameter.hint) }} {% endif -%} {%- if parameter.variadic %}...{% endif %}${{ parameter.name|raw }} {%- if parameter.default is not null %} = {{ parameter.default }}{% endif %} {%- if not loop.last %}, {% endif %} {%- endfor -%} ) {%- endmacro %} {% macro function_parameters_signature(method) -%} {%- from "macros.twig" import hint_link -%} ( {%- for parameter in method.parameters %} {%- if parameter.hashint %}{{ hint_link(parameter.hint) }} {% endif -%} {%- if parameter.variadic %}...{% endif %}${{ parameter.name|raw }} {%- if parameter.default is not null %} = {{ parameter.default }}{% endif %} {%- if not loop.last %}, {% endif %} {%- endfor -%} ) {%- endmacro %} {% macro render_classes(classes) -%} {% from _self import class_link, deprecated %}
    {% for class in classes %}
    {% if class.isInterface %} {{- class_link(class, true) -}} {% else %} {{- class_link(class, true) -}} {% endif %} {{- deprecated(class) -}}
    {{- class.shortdesc|desc(class) -}}
    {% endfor %}
    {%- endmacro %} {% macro breadcrumbs(namespace) %} {% set current_ns = '' %} {% for ns in namespace|split('\\') %} {%- if current_ns -%} {% set current_ns = current_ns ~ '\\' ~ ns %} {%- else -%} {% set current_ns = ns %} {%- endif -%}
  • {{ ns|raw }}
  • \
  • {%- endfor %} {% endmacro %} {% macro deprecated(reflection) %} {% if reflection.deprecated %}{% trans 'deprecated' %}{% endif %} {% endmacro %} {% macro deprecations(reflection) %} {% from _self import deprecated %} {% if reflection.deprecated %}

    {{ deprecated(reflection )}} {% for tag in reflection.deprecated %} {{ tag[0]|raw }} {{ tag[1:]|join(' ')|raw }} {% endfor %}

    {% endif %} {% endmacro %} {% macro internals(reflection) %} {% if reflection.isInternal() %} {% for internalTag in reflection.getInternal() %}
    {% trans 'internal' %}  {{ internalTag[0]|raw }} {{ internalTag[1:]|join(' ')|raw }}
    {% endfor %}   {% endif %} {% endmacro %} {% macro todo(reflection) %} {% if project.config('insert_todos') == true %} {% if reflection.todo %}{% trans 'todo' %}{% endif %} {% endif %} {% endmacro %} {% macro todos(reflection) %} {% from _self import todo %} {% if reflection.todo %}

    {{ todo(reflection )}} {% for tag in reflection.todo %} {{ tag[0]|raw }} {{ tag[1:]|join(' ')|raw }} {% endfor %}

    {% endif %} {% endmacro %} {% extends "layout/layout.twig" %} {% from "macros.twig" import render_classes %} {% block title %}{% trans 'All Classes' %} | {{ parent() }}{% endblock %} {% block body_class 'classes' %} {% block page_content %} {{ render_classes(classes) }} {% endblock %} {% extends "layout/base.twig" %} {% block content %}
    {{ block('control_panel') }} {{ block('leftnav') }}
    {{ block('menu') }} {% block below_menu '' %}
    {%- block page_content '' -%}
    {{- block('footer') -}}
    {% endblock %} {% block menu %} {% endblock %} {% block leftnav %}
    {% endblock %} {% block control_panel %}
    {% if project.versions|length > 1 %}
    {% endif %}
    {% endblock %} {%- block footer -%} {%- endblock -%} {% block title project.config('title') %} {% block head %} {%- endblock %} {##}{% if project.config('favicon') %} {%- endif %} {% if project.getBaseUrl() %} {# #}{%- for version in project.versions -%} {# #} {# #}{% endfor -%} {% endif %} {% block html %} {% block content '' %} {% endblock %} {% if project.getBaseUrl() -%} {{ project.config('title') }} ({{ project.version }}) {{ 'Searches'|trans }} {{ project.config('title') }} ({{ project.version }}) {{ project.config('title') }} {% if project.config('favicon') -%} {{ project.config('favicon') }} {% endif -%} UTF-8 false {% endif %} /*! * Generated using the Bootstrap Customizer (https://getbootstrap.com/docs/3.4/customize/) *//*! * Bootstrap v3.4.1 (https://getbootstrap.com/) * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-default.disabled,.btn-primary.disabled,.btn-success.disabled,.btn-info.disabled,.btn-warning.disabled,.btn-danger.disabled,.btn-default[disabled],.btn-primary[disabled],.btn-success[disabled],.btn-info[disabled],.btn-warning[disabled],.btn-danger[disabled],fieldset[disabled] .btn-default,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-info,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-danger{-webkit-box-shadow:none;box-shadow:none}.btn-default .badge,.btn-primary .badge,.btn-success .badge,.btn-info .badge,.btn-warning .badge,.btn-danger .badge{text-shadow:none}.btn:active,.btn.active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:-o-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), to(#e0e0e0));background-image:linear-gradient(to bottom, #fff 0, #e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top, #428bca 0, #2d6ca2 100%);background-image:-o-linear-gradient(top, #428bca 0, #2d6ca2 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #428bca), to(#2d6ca2));background-image:linear-gradient(to bottom, #428bca 0, #2d6ca2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#2b669a}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#2d6ca2;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #419641 100%);background-image:-o-linear-gradient(top, #5cb85c 0, #419641 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5cb85c), to(#419641));background-image:linear-gradient(to bottom, #5cb85c 0, #419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #2aabd2 100%);background-image:-o-linear-gradient(top, #5bc0de 0, #2aabd2 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5bc0de), to(#2aabd2));background-image:linear-gradient(to bottom, #5bc0de 0, #2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #eb9316 100%);background-image:-o-linear-gradient(top, #f0ad4e 0, #eb9316 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f0ad4e), to(#eb9316));background-image:linear-gradient(to bottom, #f0ad4e 0, #eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c12e2a 100%);background-image:-o-linear-gradient(top, #d9534f 0, #c12e2a 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9534f), to(#c12e2a));background-image:linear-gradient(to bottom, #d9534f 0, #c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-o-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f5f5f5), to(#e8e8e8));background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x;background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-image:-webkit-linear-gradient(top, #428bca 0, #357ebd 100%);background-image:-o-linear-gradient(top, #428bca 0, #357ebd 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #428bca), to(#357ebd));background-image:linear-gradient(to bottom, #428bca 0, #357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x;background-color:#357ebd}.navbar-default{background-image:-webkit-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:-o-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), to(#f8f8f8));background-image:linear-gradient(to bottom, #fff 0, #f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #dbdbdb 0, #e2e2e2 100%);background-image:-o-linear-gradient(top, #dbdbdb 0, #e2e2e2 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #dbdbdb), to(#e2e2e2));background-image:linear-gradient(to bottom, #dbdbdb 0, #e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.075);box-shadow:inset 0 3px 9px rgba(0,0,0,0.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:-o-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #3c3c3c), to(#222));background-image:linear-gradient(to bottom, #3c3c3c 0, #222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border-radius:4px}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #080808 0, #0f0f0f 100%);background-image:-o-linear-gradient(top, #080808 0, #0f0f0f 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #080808), to(#0f0f0f));background-image:linear-gradient(to bottom, #080808 0, #0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.25);box-shadow:inset 0 3px 9px rgba(0,0,0,0.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-image:-webkit-linear-gradient(top, #428bca 0, #357ebd 100%);background-image:-o-linear-gradient(top, #428bca 0, #357ebd 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #428bca), to(#357ebd));background-image:linear-gradient(to bottom, #428bca 0, #357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:-o-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #dff0d8), to(#c8e5bc));background-image:linear-gradient(to bottom, #dff0d8 0, #c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top, #d9edf7 0, #b9def0 100%);background-image:-o-linear-gradient(top, #d9edf7 0, #b9def0 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9edf7), to(#b9def0));background-image:linear-gradient(to bottom, #d9edf7 0, #b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #f8efc0 100%);background-image:-o-linear-gradient(top, #fcf8e3 0, #f8efc0 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fcf8e3), to(#f8efc0));background-image:linear-gradient(to bottom, #fcf8e3 0, #f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top, #f2dede 0, #e7c3c3 100%);background-image:-o-linear-gradient(top, #f2dede 0, #e7c3c3 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f2dede), to(#e7c3c3));background-image:linear-gradient(to bottom, #f2dede 0, #e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top, #ebebeb 0, #f5f5f5 100%);background-image:-o-linear-gradient(top, #ebebeb 0, #f5f5f5 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #ebebeb), to(#f5f5f5));background-image:linear-gradient(to bottom, #ebebeb 0, #f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top, #428bca 0, #3071a9 100%);background-image:-o-linear-gradient(top, #428bca 0, #3071a9 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #428bca), to(#3071a9));background-image:linear-gradient(to bottom, #428bca 0, #3071a9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #449d44 100%);background-image:-o-linear-gradient(top, #5cb85c 0, #449d44 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5cb85c), to(#449d44));background-image:linear-gradient(to bottom, #5cb85c 0, #449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #31b0d5 100%);background-image:-o-linear-gradient(top, #5bc0de 0, #31b0d5 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5bc0de), to(#31b0d5));background-image:linear-gradient(to bottom, #5bc0de 0, #31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #ec971f 100%);background-image:-o-linear-gradient(top, #f0ad4e 0, #ec971f 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f0ad4e), to(#ec971f));background-image:linear-gradient(to bottom, #f0ad4e 0, #ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c9302c 100%);background-image:-o-linear-gradient(top, #d9534f 0, #c9302c 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9534f), to(#c9302c));background-image:linear-gradient(to bottom, #d9534f 0, #c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top, #428bca 0, #3278b3 100%);background-image:-o-linear-gradient(top, #428bca 0, #3278b3 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #428bca), to(#3278b3));background-image:linear-gradient(to bottom, #428bca 0, #3278b3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);background-repeat:repeat-x;border-color:#3278b3}.list-group-item.active .badge,.list-group-item.active:hover .badge,.list-group-item.active:focus .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-o-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f5f5f5), to(#e8e8e8));background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top, #428bca 0, #357ebd 100%);background-image:-o-linear-gradient(top, #428bca 0, #357ebd 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #428bca), to(#357ebd));background-image:linear-gradient(to bottom, #428bca 0, #357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top, #dff0d8 0, #d0e9c6 100%);background-image:-o-linear-gradient(top, #dff0d8 0, #d0e9c6 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #dff0d8), to(#d0e9c6));background-image:linear-gradient(to bottom, #dff0d8 0, #d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:-o-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9edf7), to(#c4e3f3));background-image:linear-gradient(to bottom, #d9edf7 0, #c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:-o-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fcf8e3), to(#faf2cc));background-image:linear-gradient(to bottom, #fcf8e3 0, #faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:-o-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f2dede), to(#ebcccc));background-image:linear-gradient(to bottom, #f2dede 0, #ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:-o-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #e8e8e8), to(#f5f5f5));background-image:linear-gradient(to bottom, #e8e8e8 0, #f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)}/*! * Generated using the Bootstrap Customizer (https://getbootstrap.com/docs/3.4/customize/) *//*! * Bootstrap v3.4.1 (https://getbootstrap.com/) * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */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}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}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{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{color:#000 !important;text-shadow:none !important;background:transparent !important;-webkit-box-shadow:none !important;box-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[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,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover,a.text-primary:focus{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover,a.text-success:focus{color:#2b542c}.text-info{color:#31708f}a.text-info:hover,a.text-info:focus{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover,a.text-warning:focus{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover,a.text-danger:focus{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover,a.bg-primary:focus{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:"\2014 \00A0"}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:""}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:"\00A0 \2014"}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.row-no-gutters{margin-right:0;margin-left:0}.row-no-gutters [class*="col-"]{padding-right:0;padding-left:0}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}table col[class*="col-"]{position:static;display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{position:static;display:table-cell;float:none}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;appearance:none}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;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:34px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.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"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.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"]{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-top:4px \9;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.33}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);opacity:.65;-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:focus,.btn-default.focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;background-image:none;border-color:#adadad}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#3071a9;border-color:#193c5a}.btn-primary:hover{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;background-image:none;border-color:#285e8e}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#fff;background-color:#285e8e;border-color:#193c5a}.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;background-image:none;border-color:#398439}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#fff;background-color:#398439;border-color:#255625}.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;background-image:none;border-color:#269abc}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;background-image:none;border-color:#d58512}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;background-image:none;border-color:#ac2925}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#428bca;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-right:15px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-right:-15px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#777}.navbar-inverse .navbar-nav>li>a{color:#777}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#428bca;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:2;color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:3;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.33}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;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}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e1edf7}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:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}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:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}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:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}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:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}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:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.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-left-radius:3px;border-top-right-radius:3px}.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:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-right:15px;padding-left:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#428bca}.panel-primary>.panel-heading .badge{color:#428bca;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.panel-body:before,.panel-body:after{display:table;content:" "}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.panel-body:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}html, body, #content { height: 100%; } /* Site menu */ #site-nav.navbar-default { margin: 0; border-radius: 0; border-bottom: 1px solid #ccc; background-color: #edf3fe; background-image: none; } #site-nav.navbar-default .navbar-brand, #site-nav.navbar-default .navbar-nav > li > a { color: #000; } #site-nav.navbar-default .navbar-nav > li > a:hover { text-decoration: underline; } #navbar-elements { float: right; } @media (max-width: 768px) { #navbar-elements { float: none !important; } } /* Namespace breadcrumbs */ .namespace-breadcrumbs .breadcrumb { margin: 0 0 12px; border-radius: 0 0 4px 4px; padding-left: 35px; } .namespace-breadcrumbs .breadcrumb > li + li:before { content: ""; } .namespace-breadcrumbs .breadcrumb > .backslash { color: #ccc; } /* Site columns */ #right-column { margin-left: 20%; } #page-content { padding: 0 30px; } #left-column { width: 20%; position: fixed; height: 100%; border-right: 1px solid #ccc; line-height: 18px; font-size: 13px; display: flex; flex-flow: column; } @media (max-width: 991px) { #left-column { display: none; } #right-column { width: 100%; margin-left: 0; } } /* API Tree */ #api-tree { background: linear-gradient(to bottom, #fff, #fff 50%, #edf3fe 50%, #edf3fe); background-size: 100% 56px; overflow: auto; height: 100%; background-attachment: local; } #api-tree ul { list-style-type: none; margin: 0; padding: 0; } #api-tree ul li { padding: 0; margin: 0; } /* Prevents the menu from jittering on lad */ #api-tree .icon-play { width: 26px; } #api-tree ul li .hd { padding: 5px; } #api-tree li .hd:nth-child(even) { background-color: #edf3fe; } #api-tree ul li.opened > .hd span { -webkit-transform: rotate(90deg); -moz-transform: rotate(90deg); -o-transform: rotate(90deg); -ms-transform: rotate(90deg); transform: rotate(90deg); } #api-tree .bd { display: none; } #api-tree li.opened > .bd { display: block; } #api-tree li .hd:hover { background-color: #eee; } #api-tree li.active > .hd { background-color: #3875d7; } #api-tree li.active > .hd a { color: #eee; font-weight: bold; } #api-tree a { color: #222; } #api-tree div.leaf a { margin-left: 20px; } #api-tree .hd span { padding: 2px 8px; font-size: 15px; line-height: 85%; } /* Control panel, search form, version drop-down */ #control-panel { background: #e8e8e8; border-bottom: 1px solid #666; padding: 4px; } #control-panel form { margin: 4px 4px 5px 4px; } #search-form { position: relative; } #search-form input { width: 100%; padding-left: 28px; } #search-form span.icon-search { position: absolute; left: 5px; top: 8px; font-size: 20px; z-index: 2; } /* Typeahead */ .twitter-typeahead { width: 100%; z-index: 1; } .tt-dropdown-menu { overflow: auto; max-height: 260px; margin-top: 9px; background-color: #fff; border: 1px solid #ccc; border-radius: 8px; box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); padding: 8px; } .tt-dropdown-menu p { margin: 0; padding: 0; } .tt-suggestion { padding: 8px; border-bottom: 1px solid #ccc; font-size: 1.1em; } .tt-cursor { background-color: #3875d7; color: #fff; } /** General typography **/ .navbar { border-bottom: 0; } .page-header { margin: 0 0 20px; } abbr[title], abbr[data-original-title], abbr { border-bottom: none; cursor: pointer; } a abbr { cursor: pointer; } .method-description table, .description table { border: solid 1px #ccc; padding: 1em; margin: 1em; } .method-description td, .method-description th, .description td, .description th { padding: 0.75em 1.25em; } .method-description tbody tr:nth-child(even), .description tbody tr:nth-child(even) { background: #edf3fe; } .method-description tbody tr:nth-child(odd), .description tbody tr:nth-child(odd) { background: #fff; } .method-description thead tr, .description thead tr { background: #edf3fe; } /** General Doctum styling **/ .underlined > .row { padding: 8px 0; border-bottom: 1px solid #ddd; } #footer { text-align: right; margin: 30px; font-size: 11px; } .description { margin: 10px 0; padding: 10px; background-color: #efefef; } .description p { padding: 0; margin: 8px 0; } .method-description { margin: 0 0 24px 0; } .details { padding-left: 30px; } #method-details .method-item { margin-bottom: 30px; } .method-item h3, .method-item h3 code { background-color: #eee; } .method-item h3 { padding: 4px; margin-bottom: 20px; font-size: 20px; } .location { font-size: 11px; float: right; font-style: italic; } .namespace-list a { padding: 3px 8px; margin: 0 5px 5px 0; border: 1px solid #ddd; background-color: #f9f9f9; display: inline-block; border-radius: 4px; } .no-description { color: #ccc; font-size: 90%; } .type { overflow-wrap: break-word; } /* Namespaces page */ .namespaces { clear: both; } .namespaces .namespace-container { float: left; margin: 0 14px 14px 0; min-width: 30%; } .namespaces h2 { margin: 0 0 20px 0; } .namespace-container > h2 { background-color: #edf3fe; padding: 4px 4px 4px 8px; font-size: 25px; margin: 20px 0; } @media (max-width: 991px) { .namespaces .namespace-container { margin-right: 0; width: 100%; } } /** Code and pre tags **/ tt, code, pre { font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } code { padding: 0; padding-top: 0.2em; padding-bottom: 0.2em; margin: 0; font-size: 85%; background-color: rgba(0, 0, 0, 0.04); border-radius: 3px; color: #333; } pre { padding: 16px; overflow: auto; font-size: 85%; line-height: 1.45; background-color: #f7f7f7; border-radius: 3px; } pre.examples { padding: 1rem; } #page-content > h2 { background-color: #edf3fe; padding: 4px 4px 4px 8px; font-size: 25px; margin: 20px 0; } /** Doc index **/ dt { font-weight: normal; } dd { margin-left: 30px; line-height: 1.5em; } #doc-index h2 { font-weight: bold; margin: 30px 0; } #doc-index .pagination { margin: 0; } /* Search page */ .search-results { list-style-type: none; padding: 0; margin: 0; } .search-results li { list-style-type: none; margin: 0; padding: 14px 0; border-bottom: 1px solid #ccc; } .search-results > li > h2 { background: none; margin: 0; padding: 0; font-size: 18px; } .search-results > li > h2 > a { float: left; display: block; margin: 0 0 4px 0; } .search-results .search-type { float: right; margin: 0 0 4px 0; } .search-results .search-from { margin: 0 0 12px 0; font-size: 12px; color: #999; } .search-results .search-from a { font-style: italic; } .search-results .search-description { margin: 8px 0 0 30px; } .search-description { white-space: pre; } /*! * Generated using the Bootstrap Customizer (https://getbootstrap.com/docs/3.4/customize/) */ /*! * Bootstrap v3.4.1 (https://getbootstrap.com/) * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ 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; } a { background-color: transparent; } a:active, a:hover { outline: 0; } abbr[title] { border-bottom: none; text-decoration: underline; text-decoration: underline dotted; } b, strong { font-weight: bold; } dfn { font-style: italic; } h1 { font-size: 2em; margin: 0.67em 0; } mark { background: #ff0; color: #000; } small { font-size: 80%; } sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } img { border: 0; } svg:not(:root) { overflow: hidden; } figure { margin: 1em 40px; } hr { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; height: 0; } pre { overflow: auto; } code, kbd, pre, samp { font-family: monospace, monospace; font-size: 1em; } button, input, optgroup, select, textarea { color: inherit; font: inherit; margin: 0; } 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 { line-height: normal; } input[type="checkbox"], input[type="radio"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; padding: 0; } input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { height: auto; } input[type="search"] { -webkit-appearance: textfield; -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; } input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } legend { border: 0; padding: 0; } textarea { overflow: auto; } optgroup { font-weight: bold; } table { border-collapse: collapse; border-spacing: 0; } td, th { padding: 0; } /*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ @media print { *, *:before, *:after { color: #000 !important; text-shadow: none !important; background: transparent !important; -webkit-box-shadow: none !important; box-shadow: none !important; } a, a:visited { text-decoration: underline; } a[href]:after { content: " (" attr(href) ")"; } abbr[title]:after { content: " (" attr(title) ")"; } a[href^="#"]:after, a[href^="javascript:"]:after { content: ""; } pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } thead { display: table-header-group; } tr, img { page-break-inside: avoid; } img { max-width: 100% !important; } p, h2, h3 { orphans: 3; widows: 3; } h2, h3 { page-break-after: avoid; } .navbar { display: none; } .btn > .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px solid #000; } .table { border-collapse: collapse !important; } .table td, .table th { background-color: #fff !important; } .table-bordered th, .table-bordered td { border: 1px solid #ddd !important; } } * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } html { font-size: 10px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.42857143; color: #333333; background-color: #ffffff; } input, button, select, textarea { font-family: inherit; font-size: inherit; line-height: inherit; } a { color: #428bca; text-decoration: none; } a:hover, a:focus { color: #2a6496; text-decoration: underline; } a:focus { outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } figure { margin: 0; } img { vertical-align: middle; } .img-responsive { display: block; max-width: 100%; height: auto; } .img-rounded { border-radius: 6px; } .img-thumbnail { padding: 4px; line-height: 1.42857143; background-color: #ffffff; border: 1px solid #dddddd; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; -o-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; display: inline-block; max-width: 100%; height: auto; } .img-circle { border-radius: 50%; } hr { margin-top: 20px; margin-bottom: 20px; border: 0; border-top: 1px solid #eeeeee; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } .sr-only-focusable:active, .sr-only-focusable:focus { position: static; width: auto; height: auto; margin: 0; overflow: visible; clip: auto; } [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, h2 small, h3 small, h4 small, h5 small, h6 small, .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small, h1 .small, h2 .small, h3 .small, h4 .small, h5 .small, h6 .small, .h1 .small, .h2 .small, .h3 .small, .h4 .small, .h5 .small, .h6 .small { font-weight: 400; line-height: 1; color: #777777; } h1, .h1, h2, .h2, h3, .h3 { margin-top: 20px; margin-bottom: 10px; } h1 small, .h1 small, h2 small, .h2 small, h3 small, .h3 small, h1 .small, .h1 .small, h2 .small, .h2 .small, h3 .small, .h3 .small { font-size: 65%; } h4, .h4, h5, .h5, h6, .h6 { margin-top: 10px; margin-bottom: 10px; } h4 small, .h4 small, h5 small, .h5 small, h6 small, .h6 small, h4 .small, .h4 .small, h5 .small, .h5 .small, h6 .small, .h6 .small { font-size: 75%; } h1, .h1 { font-size: 36px; } h2, .h2 { font-size: 30px; } h3, .h3 { font-size: 24px; } h4, .h4 { font-size: 18px; } h5, .h5 { font-size: 14px; } h6, .h6 { font-size: 12px; } p { margin: 0 0 10px; } .lead { margin-bottom: 20px; font-size: 16px; font-weight: 300; line-height: 1.4; } @media (min-width: 768px) { .lead { font-size: 21px; } } small, .small { font-size: 85%; } mark, .mark { padding: .2em; background-color: #fcf8e3; } .text-left { text-align: left; } .text-right { text-align: right; } .text-center { text-align: center; } .text-justify { text-align: justify; } .text-nowrap { white-space: nowrap; } .text-lowercase { text-transform: lowercase; } .text-uppercase { text-transform: uppercase; } .text-capitalize { text-transform: capitalize; } .text-muted { color: #777777; } .text-primary { color: #428bca; } a.text-primary:hover, a.text-primary:focus { color: #3071a9; } .text-success { color: #3c763d; } a.text-success:hover, a.text-success:focus { color: #2b542c; } .text-info { color: #31708f; } a.text-info:hover, a.text-info:focus { color: #245269; } .text-warning { color: #8a6d3b; } a.text-warning:hover, a.text-warning:focus { color: #66512c; } .text-danger { color: #a94442; } a.text-danger:hover, a.text-danger:focus { color: #843534; } .bg-primary { color: #fff; background-color: #428bca; } a.bg-primary:hover, a.bg-primary:focus { background-color: #3071a9; } .bg-success { background-color: #dff0d8; } a.bg-success:hover, a.bg-success:focus { background-color: #c1e2b3; } .bg-info { background-color: #d9edf7; } a.bg-info:hover, a.bg-info:focus { background-color: #afd9ee; } .bg-warning { background-color: #fcf8e3; } a.bg-warning:hover, a.bg-warning:focus { background-color: #f7ecb5; } .bg-danger { background-color: #f2dede; } a.bg-danger:hover, a.bg-danger:focus { background-color: #e4b9b9; } .page-header { padding-bottom: 9px; margin: 40px 0 20px; border-bottom: 1px solid #eeeeee; } ul, ol { margin-top: 0; margin-bottom: 10px; } ul ul, ol ul, ul ol, ol ol { margin-bottom: 0; } .list-unstyled { padding-left: 0; list-style: none; } .list-inline { padding-left: 0; list-style: none; margin-left: -5px; } .list-inline > li { display: inline-block; padding-right: 5px; padding-left: 5px; } dl { margin-top: 0; margin-bottom: 20px; } dt, dd { line-height: 1.42857143; } dt { font-weight: 700; } dd { margin-left: 0; } @media (min-width: 768px) { .dl-horizontal dt { float: left; width: 160px; clear: left; text-align: right; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .dl-horizontal dd { margin-left: 180px; } } abbr[title], abbr[data-original-title] { cursor: help; } .initialism { font-size: 90%; text-transform: uppercase; } blockquote { padding: 10px 20px; margin: 0 0 20px; font-size: 17.5px; border-left: 5px solid #eeeeee; } blockquote p:last-child, blockquote ul:last-child, blockquote ol:last-child { margin-bottom: 0; } blockquote footer, blockquote small, blockquote .small { display: block; font-size: 80%; line-height: 1.42857143; color: #777777; } blockquote footer:before, blockquote small:before, blockquote .small:before { content: "\2014 \00A0"; } .blockquote-reverse, blockquote.pull-right { padding-right: 15px; padding-left: 0; text-align: right; border-right: 5px solid #eeeeee; border-left: 0; } .blockquote-reverse footer:before, blockquote.pull-right footer:before, .blockquote-reverse small:before, blockquote.pull-right small:before, .blockquote-reverse .small:before, blockquote.pull-right .small:before { content: ""; } .blockquote-reverse footer:after, blockquote.pull-right footer:after, .blockquote-reverse small:after, blockquote.pull-right small:after, .blockquote-reverse .small:after, blockquote.pull-right .small:after { content: "\00A0 \2014"; } address { margin-bottom: 20px; font-style: normal; line-height: 1.42857143; } code, kbd, pre, samp { font-family: Menlo, Monaco, Consolas, "Courier New", monospace; } code { padding: 2px 4px; font-size: 90%; color: #c7254e; background-color: #f9f2f4; border-radius: 4px; } kbd { padding: 2px 4px; font-size: 90%; color: #ffffff; background-color: #333333; border-radius: 3px; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); } kbd kbd { padding: 0; font-size: 100%; font-weight: 700; -webkit-box-shadow: none; box-shadow: none; } pre { display: block; padding: 9.5px; margin: 0 0 10px; font-size: 13px; line-height: 1.42857143; color: #333333; word-break: break-all; word-wrap: break-word; background-color: #f5f5f5; border: 1px solid #cccccc; border-radius: 4px; } pre code { padding: 0; font-size: inherit; color: inherit; white-space: pre-wrap; background-color: transparent; border-radius: 0; } .pre-scrollable { max-height: 340px; overflow-y: scroll; } .container { padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto; } @media (min-width: 768px) { .container { width: 750px; } } @media (min-width: 992px) { .container { width: 970px; } } @media (min-width: 1200px) { .container { width: 1170px; } } .container-fluid { padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto; } .row { margin-right: -15px; margin-left: -15px; } .row-no-gutters { margin-right: 0; margin-left: 0; } .row-no-gutters [class*="col-"] { padding-right: 0; padding-left: 0; } .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { position: relative; min-height: 1px; padding-right: 15px; padding-left: 15px; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { float: left; } .col-xs-12 { width: 100%; } .col-xs-11 { width: 91.66666667%; } .col-xs-10 { width: 83.33333333%; } .col-xs-9 { width: 75%; } .col-xs-8 { width: 66.66666667%; } .col-xs-7 { width: 58.33333333%; } .col-xs-6 { width: 50%; } .col-xs-5 { width: 41.66666667%; } .col-xs-4 { width: 33.33333333%; } .col-xs-3 { width: 25%; } .col-xs-2 { width: 16.66666667%; } .col-xs-1 { width: 8.33333333%; } .col-xs-pull-12 { right: 100%; } .col-xs-pull-11 { right: 91.66666667%; } .col-xs-pull-10 { right: 83.33333333%; } .col-xs-pull-9 { right: 75%; } .col-xs-pull-8 { right: 66.66666667%; } .col-xs-pull-7 { right: 58.33333333%; } .col-xs-pull-6 { right: 50%; } .col-xs-pull-5 { right: 41.66666667%; } .col-xs-pull-4 { right: 33.33333333%; } .col-xs-pull-3 { right: 25%; } .col-xs-pull-2 { right: 16.66666667%; } .col-xs-pull-1 { right: 8.33333333%; } .col-xs-pull-0 { right: auto; } .col-xs-push-12 { left: 100%; } .col-xs-push-11 { left: 91.66666667%; } .col-xs-push-10 { left: 83.33333333%; } .col-xs-push-9 { left: 75%; } .col-xs-push-8 { left: 66.66666667%; } .col-xs-push-7 { left: 58.33333333%; } .col-xs-push-6 { left: 50%; } .col-xs-push-5 { left: 41.66666667%; } .col-xs-push-4 { left: 33.33333333%; } .col-xs-push-3 { left: 25%; } .col-xs-push-2 { left: 16.66666667%; } .col-xs-push-1 { left: 8.33333333%; } .col-xs-push-0 { left: auto; } .col-xs-offset-12 { margin-left: 100%; } .col-xs-offset-11 { margin-left: 91.66666667%; } .col-xs-offset-10 { margin-left: 83.33333333%; } .col-xs-offset-9 { margin-left: 75%; } .col-xs-offset-8 { margin-left: 66.66666667%; } .col-xs-offset-7 { margin-left: 58.33333333%; } .col-xs-offset-6 { margin-left: 50%; } .col-xs-offset-5 { margin-left: 41.66666667%; } .col-xs-offset-4 { margin-left: 33.33333333%; } .col-xs-offset-3 { margin-left: 25%; } .col-xs-offset-2 { margin-left: 16.66666667%; } .col-xs-offset-1 { margin-left: 8.33333333%; } .col-xs-offset-0 { margin-left: 0%; } @media (min-width: 768px) { .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { float: left; } .col-sm-12 { width: 100%; } .col-sm-11 { width: 91.66666667%; } .col-sm-10 { width: 83.33333333%; } .col-sm-9 { width: 75%; } .col-sm-8 { width: 66.66666667%; } .col-sm-7 { width: 58.33333333%; } .col-sm-6 { width: 50%; } .col-sm-5 { width: 41.66666667%; } .col-sm-4 { width: 33.33333333%; } .col-sm-3 { width: 25%; } .col-sm-2 { width: 16.66666667%; } .col-sm-1 { width: 8.33333333%; } .col-sm-pull-12 { right: 100%; } .col-sm-pull-11 { right: 91.66666667%; } .col-sm-pull-10 { right: 83.33333333%; } .col-sm-pull-9 { right: 75%; } .col-sm-pull-8 { right: 66.66666667%; } .col-sm-pull-7 { right: 58.33333333%; } .col-sm-pull-6 { right: 50%; } .col-sm-pull-5 { right: 41.66666667%; } .col-sm-pull-4 { right: 33.33333333%; } .col-sm-pull-3 { right: 25%; } .col-sm-pull-2 { right: 16.66666667%; } .col-sm-pull-1 { right: 8.33333333%; } .col-sm-pull-0 { right: auto; } .col-sm-push-12 { left: 100%; } .col-sm-push-11 { left: 91.66666667%; } .col-sm-push-10 { left: 83.33333333%; } .col-sm-push-9 { left: 75%; } .col-sm-push-8 { left: 66.66666667%; } .col-sm-push-7 { left: 58.33333333%; } .col-sm-push-6 { left: 50%; } .col-sm-push-5 { left: 41.66666667%; } .col-sm-push-4 { left: 33.33333333%; } .col-sm-push-3 { left: 25%; } .col-sm-push-2 { left: 16.66666667%; } .col-sm-push-1 { left: 8.33333333%; } .col-sm-push-0 { left: auto; } .col-sm-offset-12 { margin-left: 100%; } .col-sm-offset-11 { margin-left: 91.66666667%; } .col-sm-offset-10 { margin-left: 83.33333333%; } .col-sm-offset-9 { margin-left: 75%; } .col-sm-offset-8 { margin-left: 66.66666667%; } .col-sm-offset-7 { margin-left: 58.33333333%; } .col-sm-offset-6 { margin-left: 50%; } .col-sm-offset-5 { margin-left: 41.66666667%; } .col-sm-offset-4 { margin-left: 33.33333333%; } .col-sm-offset-3 { margin-left: 25%; } .col-sm-offset-2 { margin-left: 16.66666667%; } .col-sm-offset-1 { margin-left: 8.33333333%; } .col-sm-offset-0 { margin-left: 0%; } } @media (min-width: 992px) { .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { float: left; } .col-md-12 { width: 100%; } .col-md-11 { width: 91.66666667%; } .col-md-10 { width: 83.33333333%; } .col-md-9 { width: 75%; } .col-md-8 { width: 66.66666667%; } .col-md-7 { width: 58.33333333%; } .col-md-6 { width: 50%; } .col-md-5 { width: 41.66666667%; } .col-md-4 { width: 33.33333333%; } .col-md-3 { width: 25%; } .col-md-2 { width: 16.66666667%; } .col-md-1 { width: 8.33333333%; } .col-md-pull-12 { right: 100%; } .col-md-pull-11 { right: 91.66666667%; } .col-md-pull-10 { right: 83.33333333%; } .col-md-pull-9 { right: 75%; } .col-md-pull-8 { right: 66.66666667%; } .col-md-pull-7 { right: 58.33333333%; } .col-md-pull-6 { right: 50%; } .col-md-pull-5 { right: 41.66666667%; } .col-md-pull-4 { right: 33.33333333%; } .col-md-pull-3 { right: 25%; } .col-md-pull-2 { right: 16.66666667%; } .col-md-pull-1 { right: 8.33333333%; } .col-md-pull-0 { right: auto; } .col-md-push-12 { left: 100%; } .col-md-push-11 { left: 91.66666667%; } .col-md-push-10 { left: 83.33333333%; } .col-md-push-9 { left: 75%; } .col-md-push-8 { left: 66.66666667%; } .col-md-push-7 { left: 58.33333333%; } .col-md-push-6 { left: 50%; } .col-md-push-5 { left: 41.66666667%; } .col-md-push-4 { left: 33.33333333%; } .col-md-push-3 { left: 25%; } .col-md-push-2 { left: 16.66666667%; } .col-md-push-1 { left: 8.33333333%; } .col-md-push-0 { left: auto; } .col-md-offset-12 { margin-left: 100%; } .col-md-offset-11 { margin-left: 91.66666667%; } .col-md-offset-10 { margin-left: 83.33333333%; } .col-md-offset-9 { margin-left: 75%; } .col-md-offset-8 { margin-left: 66.66666667%; } .col-md-offset-7 { margin-left: 58.33333333%; } .col-md-offset-6 { margin-left: 50%; } .col-md-offset-5 { margin-left: 41.66666667%; } .col-md-offset-4 { margin-left: 33.33333333%; } .col-md-offset-3 { margin-left: 25%; } .col-md-offset-2 { margin-left: 16.66666667%; } .col-md-offset-1 { margin-left: 8.33333333%; } .col-md-offset-0 { margin-left: 0%; } } @media (min-width: 1200px) { .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { float: left; } .col-lg-12 { width: 100%; } .col-lg-11 { width: 91.66666667%; } .col-lg-10 { width: 83.33333333%; } .col-lg-9 { width: 75%; } .col-lg-8 { width: 66.66666667%; } .col-lg-7 { width: 58.33333333%; } .col-lg-6 { width: 50%; } .col-lg-5 { width: 41.66666667%; } .col-lg-4 { width: 33.33333333%; } .col-lg-3 { width: 25%; } .col-lg-2 { width: 16.66666667%; } .col-lg-1 { width: 8.33333333%; } .col-lg-pull-12 { right: 100%; } .col-lg-pull-11 { right: 91.66666667%; } .col-lg-pull-10 { right: 83.33333333%; } .col-lg-pull-9 { right: 75%; } .col-lg-pull-8 { right: 66.66666667%; } .col-lg-pull-7 { right: 58.33333333%; } .col-lg-pull-6 { right: 50%; } .col-lg-pull-5 { right: 41.66666667%; } .col-lg-pull-4 { right: 33.33333333%; } .col-lg-pull-3 { right: 25%; } .col-lg-pull-2 { right: 16.66666667%; } .col-lg-pull-1 { right: 8.33333333%; } .col-lg-pull-0 { right: auto; } .col-lg-push-12 { left: 100%; } .col-lg-push-11 { left: 91.66666667%; } .col-lg-push-10 { left: 83.33333333%; } .col-lg-push-9 { left: 75%; } .col-lg-push-8 { left: 66.66666667%; } .col-lg-push-7 { left: 58.33333333%; } .col-lg-push-6 { left: 50%; } .col-lg-push-5 { left: 41.66666667%; } .col-lg-push-4 { left: 33.33333333%; } .col-lg-push-3 { left: 25%; } .col-lg-push-2 { left: 16.66666667%; } .col-lg-push-1 { left: 8.33333333%; } .col-lg-push-0 { left: auto; } .col-lg-offset-12 { margin-left: 100%; } .col-lg-offset-11 { margin-left: 91.66666667%; } .col-lg-offset-10 { margin-left: 83.33333333%; } .col-lg-offset-9 { margin-left: 75%; } .col-lg-offset-8 { margin-left: 66.66666667%; } .col-lg-offset-7 { margin-left: 58.33333333%; } .col-lg-offset-6 { margin-left: 50%; } .col-lg-offset-5 { margin-left: 41.66666667%; } .col-lg-offset-4 { margin-left: 33.33333333%; } .col-lg-offset-3 { margin-left: 25%; } .col-lg-offset-2 { margin-left: 16.66666667%; } .col-lg-offset-1 { margin-left: 8.33333333%; } .col-lg-offset-0 { margin-left: 0%; } } table { background-color: transparent; } table col[class*="col-"] { position: static; display: table-column; float: none; } table td[class*="col-"], table th[class*="col-"] { position: static; display: table-cell; float: none; } caption { padding-top: 8px; padding-bottom: 8px; color: #777777; text-align: left; } th { text-align: left; } .table { width: 100%; max-width: 100%; margin-bottom: 20px; } .table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td { padding: 8px; line-height: 1.42857143; vertical-align: top; border-top: 1px solid #dddddd; } .table > thead > tr > th { vertical-align: bottom; border-bottom: 2px solid #dddddd; } .table > caption + thead > tr:first-child > th, .table > colgroup + thead > tr:first-child > th, .table > thead:first-child > tr:first-child > th, .table > caption + thead > tr:first-child > td, .table > colgroup + thead > tr:first-child > td, .table > thead:first-child > tr:first-child > td { border-top: 0; } .table > tbody + tbody { border-top: 2px solid #dddddd; } .table .table { background-color: #ffffff; } .table-condensed > thead > tr > th, .table-condensed > tbody > tr > th, .table-condensed > tfoot > tr > th, .table-condensed > thead > tr > td, .table-condensed > tbody > tr > td, .table-condensed > tfoot > tr > td { padding: 5px; } .table-bordered { border: 1px solid #dddddd; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { border: 1px solid #dddddd; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { border-bottom-width: 2px; } .table-striped > tbody > tr:nth-of-type(odd) { background-color: #f9f9f9; } .table-hover > tbody > tr:hover { background-color: #f5f5f5; } .table > thead > tr > td.active, .table > tbody > tr > td.active, .table > tfoot > tr > td.active, .table > thead > tr > th.active, .table > tbody > tr > th.active, .table > tfoot > tr > th.active, .table > thead > tr.active > td, .table > tbody > tr.active > td, .table > tfoot > tr.active > td, .table > thead > tr.active > th, .table > tbody > tr.active > th, .table > tfoot > tr.active > th { background-color: #f5f5f5; } .table-hover > tbody > tr > td.active:hover, .table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr:hover > .active, .table-hover > tbody > tr.active:hover > th { background-color: #e8e8e8; } .table > thead > tr > td.success, .table > tbody > tr > td.success, .table > tfoot > tr > td.success, .table > thead > tr > th.success, .table > tbody > tr > th.success, .table > tfoot > tr > th.success, .table > thead > tr.success > td, .table > tbody > tr.success > td, .table > tfoot > tr.success > td, .table > thead > tr.success > th, .table > tbody > tr.success > th, .table > tfoot > tr.success > th { background-color: #dff0d8; } .table-hover > tbody > tr > td.success:hover, .table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th { background-color: #d0e9c6; } .table > thead > tr > td.info, .table > tbody > tr > td.info, .table > tfoot > tr > td.info, .table > thead > tr > th.info, .table > tbody > tr > th.info, .table > tfoot > tr > th.info, .table > thead > tr.info > td, .table > tbody > tr.info > td, .table > tfoot > tr.info > td, .table > thead > tr.info > th, .table > tbody > tr.info > th, .table > tfoot > tr.info > th { background-color: #d9edf7; } .table-hover > tbody > tr > td.info:hover, .table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th { background-color: #c4e3f3; } .table > thead > tr > td.warning, .table > tbody > tr > td.warning, .table > tfoot > tr > td.warning, .table > thead > tr > th.warning, .table > tbody > tr > th.warning, .table > tfoot > tr > th.warning, .table > thead > tr.warning > td, .table > tbody > tr.warning > td, .table > tfoot > tr.warning > td, .table > thead > tr.warning > th, .table > tbody > tr.warning > th, .table > tfoot > tr.warning > th { background-color: #fcf8e3; } .table-hover > tbody > tr > td.warning:hover, .table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th { background-color: #faf2cc; } .table > thead > tr > td.danger, .table > tbody > tr > td.danger, .table > tfoot > tr > td.danger, .table > thead > tr > th.danger, .table > tbody > tr > th.danger, .table > tfoot > tr > th.danger, .table > thead > tr.danger > td, .table > tbody > tr.danger > td, .table > tfoot > tr.danger > td, .table > thead > tr.danger > th, .table > tbody > tr.danger > th, .table > tfoot > tr.danger > th { background-color: #f2dede; } .table-hover > tbody > tr > td.danger:hover, .table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th { background-color: #ebcccc; } .table-responsive { min-height: .01%; overflow-x: auto; } @media screen and (max-width: 767px) { .table-responsive { width: 100%; margin-bottom: 15px; overflow-y: hidden; -ms-overflow-style: -ms-autohiding-scrollbar; border: 1px solid #dddddd; } .table-responsive > .table { margin-bottom: 0; } .table-responsive > .table > thead > tr > th, .table-responsive > .table > tbody > tr > th, .table-responsive > .table > tfoot > tr > th, .table-responsive > .table > thead > tr > td, .table-responsive > .table > tbody > tr > td, .table-responsive > .table > tfoot > tr > td { white-space: nowrap; } .table-responsive > .table-bordered { border: 0; } .table-responsive > .table-bordered > thead > tr > th:first-child, .table-responsive > .table-bordered > tbody > tr > th:first-child, .table-responsive > .table-bordered > tfoot > tr > th:first-child, .table-responsive > .table-bordered > thead > tr > td:first-child, .table-responsive > .table-bordered > tbody > tr > td:first-child, .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .table-responsive > .table-bordered > thead > tr > th:last-child, .table-responsive > .table-bordered > tbody > tr > th:last-child, .table-responsive > .table-bordered > tfoot > tr > th:last-child, .table-responsive > .table-bordered > thead > tr > td:last-child, .table-responsive > .table-bordered > tbody > tr > td:last-child, .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .table-responsive > .table-bordered > tbody > tr:last-child > th, .table-responsive > .table-bordered > tfoot > tr:last-child > th, .table-responsive > .table-bordered > tbody > tr:last-child > td, .table-responsive > .table-bordered > tfoot > tr:last-child > td { border-bottom: 0; } } fieldset { min-width: 0; padding: 0; margin: 0; border: 0; } legend { display: block; width: 100%; padding: 0; margin-bottom: 20px; font-size: 21px; line-height: inherit; color: #333333; border: 0; border-bottom: 1px solid #e5e5e5; } label { display: inline-block; max-width: 100%; margin-bottom: 5px; font-weight: 700; } input[type="search"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; -webkit-appearance: none; appearance: none; } input[type="radio"], input[type="checkbox"] { margin: 4px 0 0; margin-top: 1px \9; line-height: normal; } input[type="radio"][disabled], input[type="checkbox"][disabled], input[type="radio"].disabled, input[type="checkbox"].disabled, fieldset[disabled] input[type="radio"], fieldset[disabled] input[type="checkbox"] { cursor: not-allowed; } input[type="file"] { display: block; } input[type="range"] { display: block; width: 100%; } select[multiple], select[size] { height: auto; } input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } output { display: block; padding-top: 7px; font-size: 14px; line-height: 1.42857143; color: #555555; } .form-control { display: block; width: 100%; height: 34px; padding: 6px 12px; font-size: 14px; line-height: 1.42857143; color: #555555; background-color: #ffffff; background-image: none; border: 1px solid #cccccc; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; } .form-control:focus { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6); } .form-control::-moz-placeholder { color: #777777; opacity: 1; } .form-control:-ms-input-placeholder { color: #777777; } .form-control::-webkit-input-placeholder { color: #777777; } .form-control::-ms-expand { background-color: transparent; border: 0; } .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { background-color: #eeeeee; 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: 34px; } input[type="date"].input-sm, input[type="time"].input-sm, input[type="datetime-local"].input-sm, input[type="month"].input-sm, .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"] { line-height: 30px; } input[type="date"].input-lg, input[type="time"].input-lg, input[type="datetime-local"].input-lg, input[type="month"].input-lg, .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"] { line-height: 46px; } } .form-group { margin-bottom: 15px; } .radio, .checkbox { position: relative; display: block; margin-top: 10px; margin-bottom: 10px; } .radio.disabled label, .checkbox.disabled label, fieldset[disabled] .radio label, fieldset[disabled] .checkbox label { cursor: not-allowed; } .radio label, .checkbox label { min-height: 20px; padding-left: 20px; margin-bottom: 0; font-weight: 400; cursor: pointer; } .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { position: absolute; margin-top: 4px \9; margin-left: -20px; } .radio + .radio, .checkbox + .checkbox { margin-top: -5px; } .radio-inline, .checkbox-inline { position: relative; display: inline-block; padding-left: 20px; margin-bottom: 0; font-weight: 400; vertical-align: middle; cursor: pointer; } .radio-inline.disabled, .checkbox-inline.disabled, fieldset[disabled] .radio-inline, fieldset[disabled] .checkbox-inline { cursor: not-allowed; } .radio-inline + .radio-inline, .checkbox-inline + .checkbox-inline { margin-top: 0; margin-left: 10px; } .form-control-static { min-height: 34px; padding-top: 7px; padding-bottom: 7px; margin-bottom: 0; } .form-control-static.input-lg, .form-control-static.input-sm { padding-right: 0; padding-left: 0; } .input-sm { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-sm { height: 30px; line-height: 30px; } textarea.input-sm, select[multiple].input-sm { height: auto; } .form-group-sm .form-control { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .form-group-sm select.form-control { height: 30px; line-height: 30px; } .form-group-sm textarea.form-control, .form-group-sm select[multiple].form-control { height: auto; } .form-group-sm .form-control-static { height: 30px; min-height: 32px; padding: 6px 10px; font-size: 12px; line-height: 1.5; } .input-lg { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } select.input-lg { height: 46px; line-height: 46px; } textarea.input-lg, select[multiple].input-lg { height: auto; } .form-group-lg .form-control { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } .form-group-lg select.form-control { height: 46px; line-height: 46px; } .form-group-lg textarea.form-control, .form-group-lg select[multiple].form-control { height: auto; } .form-group-lg .form-control-static { height: 46px; min-height: 38px; padding: 11px 16px; font-size: 18px; line-height: 1.33; } .has-feedback { position: relative; } .has-feedback .form-control { padding-right: 42.5px; } .form-control-feedback { position: absolute; top: 0; right: 0; z-index: 2; display: block; width: 34px; height: 34px; line-height: 34px; text-align: center; pointer-events: none; } .input-lg + .form-control-feedback, .input-group-lg + .form-control-feedback, .form-group-lg .form-control + .form-control-feedback { width: 46px; height: 46px; line-height: 46px; } .input-sm + .form-control-feedback, .input-group-sm + .form-control-feedback, .form-group-sm .form-control + .form-control-feedback { width: 30px; height: 30px; line-height: 30px; } .has-success .help-block, .has-success .control-label, .has-success .radio, .has-success .checkbox, .has-success .radio-inline, .has-success .checkbox-inline, .has-success.radio label, .has-success.checkbox label, .has-success.radio-inline label, .has-success.checkbox-inline label { color: #3c763d; } .has-success .form-control { border-color: #3c763d; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-success .form-control:focus { border-color: #2b542c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; } .has-success .input-group-addon { color: #3c763d; background-color: #dff0d8; border-color: #3c763d; } .has-success .form-control-feedback { color: #3c763d; } .has-warning .help-block, .has-warning .control-label, .has-warning .radio, .has-warning .checkbox, .has-warning .radio-inline, .has-warning .checkbox-inline, .has-warning.radio label, .has-warning.checkbox label, .has-warning.radio-inline label, .has-warning.checkbox-inline label { color: #8a6d3b; } .has-warning .form-control { border-color: #8a6d3b; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-warning .form-control:focus { border-color: #66512c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; } .has-warning .input-group-addon { color: #8a6d3b; background-color: #fcf8e3; border-color: #8a6d3b; } .has-warning .form-control-feedback { color: #8a6d3b; } .has-error .help-block, .has-error .control-label, .has-error .radio, .has-error .checkbox, .has-error .radio-inline, .has-error .checkbox-inline, .has-error.radio label, .has-error.checkbox label, .has-error.radio-inline label, .has-error.checkbox-inline label { color: #a94442; } .has-error .form-control { border-color: #a94442; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-error .form-control:focus { border-color: #843534; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; } .has-error .input-group-addon { color: #a94442; background-color: #f2dede; border-color: #a94442; } .has-error .form-control-feedback { color: #a94442; } .has-feedback label ~ .form-control-feedback { top: 25px; } .has-feedback label.sr-only ~ .form-control-feedback { top: 0; } .help-block { display: block; margin-top: 5px; margin-bottom: 10px; color: #737373; } @media (min-width: 768px) { .form-inline .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .form-inline .form-control { display: inline-block; width: auto; vertical-align: middle; } .form-inline .form-control-static { display: inline-block; } .form-inline .input-group { display: inline-table; vertical-align: middle; } .form-inline .input-group .input-group-addon, .form-inline .input-group .input-group-btn, .form-inline .input-group .form-control { width: auto; } .form-inline .input-group > .form-control { width: 100%; } .form-inline .control-label { margin-bottom: 0; vertical-align: middle; } .form-inline .radio, .form-inline .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; } .form-inline .radio label, .form-inline .checkbox label { padding-left: 0; } .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { position: relative; margin-left: 0; } .form-inline .has-feedback .form-control-feedback { top: 0; } } .form-horizontal .radio, .form-horizontal .checkbox, .form-horizontal .radio-inline, .form-horizontal .checkbox-inline { padding-top: 7px; margin-top: 0; margin-bottom: 0; } .form-horizontal .radio, .form-horizontal .checkbox { min-height: 27px; } .form-horizontal .form-group { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .form-horizontal .control-label { padding-top: 7px; margin-bottom: 0; text-align: right; } } .form-horizontal .has-feedback .form-control-feedback { right: 15px; } @media (min-width: 768px) { .form-horizontal .form-group-lg .control-label { padding-top: 11px; font-size: 18px; } } @media (min-width: 768px) { .form-horizontal .form-group-sm .control-label { padding-top: 6px; font-size: 12px; } } .btn { display: inline-block; margin-bottom: 0; font-weight: normal; text-align: center; white-space: nowrap; vertical-align: middle; -ms-touch-action: manipulation; touch-action: manipulation; cursor: pointer; background-image: none; border: 1px solid transparent; padding: 6px 12px; font-size: 14px; line-height: 1.42857143; border-radius: 4px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .btn:focus, .btn:active:focus, .btn.active:focus, .btn.focus, .btn:active.focus, .btn.active.focus { outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .btn:hover, .btn:focus, .btn.focus { color: #333333; text-decoration: none; } .btn:active, .btn.active { background-image: none; outline: 0; -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn.disabled, .btn[disabled], fieldset[disabled] .btn { cursor: not-allowed; filter: alpha(opacity=65); opacity: 0.65; -webkit-box-shadow: none; box-shadow: none; } a.btn.disabled, fieldset[disabled] a.btn { pointer-events: none; } .btn-default { color: #333333; background-color: #ffffff; border-color: #cccccc; } .btn-default:focus, .btn-default.focus { color: #333333; background-color: #e6e6e6; border-color: #8c8c8c; } .btn-default:hover { color: #333333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { color: #333333; background-color: #e6e6e6; background-image: none; border-color: #adadad; } .btn-default:active:hover, .btn-default.active:hover, .open > .dropdown-toggle.btn-default:hover, .btn-default:active:focus, .btn-default.active:focus, .open > .dropdown-toggle.btn-default:focus, .btn-default:active.focus, .btn-default.active.focus, .open > .dropdown-toggle.btn-default.focus { color: #333333; background-color: #d4d4d4; border-color: #8c8c8c; } .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled.focus, .btn-default[disabled].focus, fieldset[disabled] .btn-default.focus { background-color: #ffffff; border-color: #cccccc; } .btn-default .badge { color: #ffffff; background-color: #333333; } .btn-primary { color: #ffffff; background-color: #428bca; border-color: #357ebd; } .btn-primary:focus, .btn-primary.focus { color: #ffffff; background-color: #3071a9; border-color: #193c5a; } .btn-primary:hover { color: #ffffff; background-color: #3071a9; border-color: #285e8e; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { color: #ffffff; background-color: #3071a9; background-image: none; border-color: #285e8e; } .btn-primary:active:hover, .btn-primary.active:hover, .open > .dropdown-toggle.btn-primary:hover, .btn-primary:active:focus, .btn-primary.active:focus, .open > .dropdown-toggle.btn-primary:focus, .btn-primary:active.focus, .btn-primary.active.focus, .open > .dropdown-toggle.btn-primary.focus { color: #ffffff; background-color: #285e8e; border-color: #193c5a; } .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled.focus, .btn-primary[disabled].focus, fieldset[disabled] .btn-primary.focus { background-color: #428bca; border-color: #357ebd; } .btn-primary .badge { color: #428bca; background-color: #ffffff; } .btn-success { color: #ffffff; background-color: #5cb85c; border-color: #4cae4c; } .btn-success:focus, .btn-success.focus { color: #ffffff; background-color: #449d44; border-color: #255625; } .btn-success:hover { color: #ffffff; background-color: #449d44; border-color: #398439; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { color: #ffffff; background-color: #449d44; background-image: none; border-color: #398439; } .btn-success:active:hover, .btn-success.active:hover, .open > .dropdown-toggle.btn-success:hover, .btn-success:active:focus, .btn-success.active:focus, .open > .dropdown-toggle.btn-success:focus, .btn-success:active.focus, .btn-success.active.focus, .open > .dropdown-toggle.btn-success.focus { color: #ffffff; background-color: #398439; border-color: #255625; } .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled.focus, .btn-success[disabled].focus, fieldset[disabled] .btn-success.focus { background-color: #5cb85c; border-color: #4cae4c; } .btn-success .badge { color: #5cb85c; background-color: #ffffff; } .btn-info { color: #ffffff; background-color: #5bc0de; border-color: #46b8da; } .btn-info:focus, .btn-info.focus { color: #ffffff; background-color: #31b0d5; border-color: #1b6d85; } .btn-info:hover { color: #ffffff; background-color: #31b0d5; border-color: #269abc; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { color: #ffffff; background-color: #31b0d5; background-image: none; border-color: #269abc; } .btn-info:active:hover, .btn-info.active:hover, .open > .dropdown-toggle.btn-info:hover, .btn-info:active:focus, .btn-info.active:focus, .open > .dropdown-toggle.btn-info:focus, .btn-info:active.focus, .btn-info.active.focus, .open > .dropdown-toggle.btn-info.focus { color: #ffffff; background-color: #269abc; border-color: #1b6d85; } .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled.focus, .btn-info[disabled].focus, fieldset[disabled] .btn-info.focus { background-color: #5bc0de; border-color: #46b8da; } .btn-info .badge { color: #5bc0de; background-color: #ffffff; } .btn-warning { color: #ffffff; background-color: #f0ad4e; border-color: #eea236; } .btn-warning:focus, .btn-warning.focus { color: #ffffff; background-color: #ec971f; border-color: #985f0d; } .btn-warning:hover { color: #ffffff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { color: #ffffff; background-color: #ec971f; background-image: none; border-color: #d58512; } .btn-warning:active:hover, .btn-warning.active:hover, .open > .dropdown-toggle.btn-warning:hover, .btn-warning:active:focus, .btn-warning.active:focus, .open > .dropdown-toggle.btn-warning:focus, .btn-warning:active.focus, .btn-warning.active.focus, .open > .dropdown-toggle.btn-warning.focus { color: #ffffff; background-color: #d58512; border-color: #985f0d; } .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled.focus, .btn-warning[disabled].focus, fieldset[disabled] .btn-warning.focus { background-color: #f0ad4e; border-color: #eea236; } .btn-warning .badge { color: #f0ad4e; background-color: #ffffff; } .btn-danger { color: #ffffff; background-color: #d9534f; border-color: #d43f3a; } .btn-danger:focus, .btn-danger.focus { color: #ffffff; background-color: #c9302c; border-color: #761c19; } .btn-danger:hover { color: #ffffff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { color: #ffffff; background-color: #c9302c; background-image: none; border-color: #ac2925; } .btn-danger:active:hover, .btn-danger.active:hover, .open > .dropdown-toggle.btn-danger:hover, .btn-danger:active:focus, .btn-danger.active:focus, .open > .dropdown-toggle.btn-danger:focus, .btn-danger:active.focus, .btn-danger.active.focus, .open > .dropdown-toggle.btn-danger.focus { color: #ffffff; background-color: #ac2925; border-color: #761c19; } .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled.focus, .btn-danger[disabled].focus, fieldset[disabled] .btn-danger.focus { background-color: #d9534f; border-color: #d43f3a; } .btn-danger .badge { color: #d9534f; background-color: #ffffff; } .btn-link { font-weight: 400; color: #428bca; border-radius: 0; } .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled], fieldset[disabled] .btn-link { background-color: transparent; -webkit-box-shadow: none; box-shadow: none; } .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { border-color: transparent; } .btn-link:hover, .btn-link:focus { color: #2a6496; text-decoration: underline; background-color: transparent; } .btn-link[disabled]:hover, fieldset[disabled] .btn-link:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:focus { color: #777777; text-decoration: none; } .btn-lg, .btn-group-lg > .btn { padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } .btn-sm, .btn-group-sm > .btn { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-xs, .btn-group-xs > .btn { padding: 1px 5px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-block { display: block; width: 100%; } .btn-block + .btn-block { margin-top: 5px; } input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { width: 100%; } .fade { opacity: 0; -webkit-transition: opacity 0.15s linear; -o-transition: opacity 0.15s linear; transition: opacity 0.15s linear; } .fade.in { opacity: 1; } .collapse { display: none; } .collapse.in { display: block; } tr.collapse.in { display: table-row; } tbody.collapse.in { display: table-row-group; } .collapsing { position: relative; height: 0; overflow: hidden; -webkit-transition-property: height, visibility; -o-transition-property: height, visibility; transition-property: height, visibility; -webkit-transition-duration: 0.35s; -o-transition-duration: 0.35s; transition-duration: 0.35s; -webkit-transition-timing-function: ease; -o-transition-timing-function: ease; transition-timing-function: ease; } .btn-group, .btn-group-vertical { position: relative; display: inline-block; vertical-align: middle; } .btn-group > .btn, .btn-group-vertical > .btn { position: relative; float: left; } .btn-group > .btn:hover, .btn-group-vertical > .btn:hover, .btn-group > .btn:focus, .btn-group-vertical > .btn:focus, .btn-group > .btn:active, .btn-group-vertical > .btn:active, .btn-group > .btn.active, .btn-group-vertical > .btn.active { z-index: 2; } .btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group { margin-left: -1px; } .btn-toolbar { margin-left: -5px; } .btn-toolbar .btn, .btn-toolbar .btn-group, .btn-toolbar .input-group { float: left; } .btn-toolbar > .btn, .btn-toolbar > .btn-group, .btn-toolbar > .input-group { margin-left: 5px; } .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { border-radius: 0; } .btn-group > .btn:first-child { margin-left: 0; } .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { border-top-left-radius: 0; border-bottom-left-radius: 0; } .btn-group > .btn-group { float: left; } .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { border-top-left-radius: 0; border-bottom-left-radius: 0; } .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } .btn-group > .btn + .dropdown-toggle { padding-right: 8px; padding-left: 8px; } .btn-group > .btn-lg + .dropdown-toggle { padding-right: 12px; padding-left: 12px; } .btn-group.open .dropdown-toggle { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn-group.open .dropdown-toggle.btn-link { -webkit-box-shadow: none; box-shadow: none; } .btn .caret { margin-left: 0; } .btn-lg .caret { border-width: 5px 5px 0; border-bottom-width: 0; } .dropup .btn-lg .caret { border-width: 0 5px 5px; } .btn-group-vertical > .btn, .btn-group-vertical > .btn-group, .btn-group-vertical > .btn-group > .btn { display: block; float: none; width: 100%; max-width: 100%; } .btn-group-vertical > .btn-group > .btn { float: none; } .btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group { margin-top: -1px; margin-left: 0; } .btn-group-vertical > .btn:not(:first-child):not(:last-child) { border-radius: 0; } .btn-group-vertical > .btn:first-child:not(:last-child) { border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn:last-child:not(:first-child) { border-top-left-radius: 0; border-top-right-radius: 0; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { border-top-left-radius: 0; border-top-right-radius: 0; } .btn-group-justified { display: table; width: 100%; table-layout: fixed; border-collapse: separate; } .btn-group-justified > .btn, .btn-group-justified > .btn-group { display: table-cell; float: none; width: 1%; } .btn-group-justified > .btn-group .btn { width: 100%; } .btn-group-justified > .btn-group .dropdown-menu { left: auto; } [data-toggle="buttons"] > .btn input[type="radio"], [data-toggle="buttons"] > .btn-group > .btn input[type="radio"], [data-toggle="buttons"] > .btn input[type="checkbox"], [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { position: absolute; clip: rect(0, 0, 0, 0); pointer-events: none; } .input-group { position: relative; display: table; border-collapse: separate; } .input-group[class*="col-"] { float: none; padding-right: 0; padding-left: 0; } .input-group .form-control { position: relative; z-index: 2; float: left; width: 100%; margin-bottom: 0; } .input-group .form-control:focus { z-index: 3; } .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { height: 46px; line-height: 46px; } textarea.input-group-lg > .form-control, textarea.input-group-lg > .input-group-addon, textarea.input-group-lg > .input-group-btn > .btn, select[multiple].input-group-lg > .form-control, select[multiple].input-group-lg > .input-group-addon, select[multiple].input-group-lg > .input-group-btn > .btn { height: auto; } .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { height: 30px; line-height: 30px; } textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-addon, textarea.input-group-sm > .input-group-btn > .btn, select[multiple].input-group-sm > .form-control, select[multiple].input-group-sm > .input-group-addon, select[multiple].input-group-sm > .input-group-btn > .btn { height: auto; } .input-group-addon, .input-group-btn, .input-group .form-control { display: table-cell; } .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) { border-radius: 0; } .input-group-addon, .input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle; } .input-group-addon { padding: 6px 12px; font-size: 14px; font-weight: 400; line-height: 1; color: #555555; text-align: center; background-color: #eeeeee; border: 1px solid #cccccc; border-radius: 4px; } .input-group-addon.input-sm { padding: 5px 10px; font-size: 12px; border-radius: 3px; } .input-group-addon.input-lg { padding: 10px 16px; font-size: 18px; border-radius: 6px; } .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { margin-top: 0; } .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group > .btn, .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), .input-group-btn:last-child > .btn-group:not(:last-child) > .btn { border-top-right-radius: 0; border-bottom-right-radius: 0; } .input-group-addon:first-child { border-right: 0; } .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group > .btn, .input-group-btn:last-child > .dropdown-toggle, .input-group-btn:first-child > .btn:not(:first-child), .input-group-btn:first-child > .btn-group:not(:first-child) > .btn { border-top-left-radius: 0; border-bottom-left-radius: 0; } .input-group-addon:last-child { border-left: 0; } .input-group-btn { position: relative; font-size: 0; white-space: nowrap; } .input-group-btn > .btn { position: relative; } .input-group-btn > .btn + .btn { margin-left: -1px; } .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active { z-index: 2; } .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group { margin-right: -1px; } .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { z-index: 2; margin-left: -1px; } .nav { padding-left: 0; margin-bottom: 0; list-style: none; } .nav > li { position: relative; display: block; } .nav > li > a { position: relative; display: block; padding: 10px 15px; } .nav > li > a:hover, .nav > li > a:focus { text-decoration: none; background-color: #eeeeee; } .nav > li.disabled > a { color: #777777; } .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { color: #777777; text-decoration: none; cursor: not-allowed; background-color: transparent; } .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { background-color: #eeeeee; border-color: #428bca; } .nav .nav-divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .nav > li > a > img { max-width: none; } .nav-tabs { border-bottom: 1px solid #dddddd; } .nav-tabs > li { float: left; margin-bottom: -1px; } .nav-tabs > li > a { margin-right: 2px; line-height: 1.42857143; border: 1px solid transparent; border-radius: 4px 4px 0 0; } .nav-tabs > li > a:hover { border-color: #eeeeee #eeeeee #dddddd; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #555555; cursor: default; background-color: #ffffff; border: 1px solid #dddddd; border-bottom-color: transparent; } .nav-tabs.nav-justified { width: 100%; border-bottom: 0; } .nav-tabs.nav-justified > li { float: none; } .nav-tabs.nav-justified > li > a { margin-bottom: 5px; text-align: center; } .nav-tabs.nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-tabs.nav-justified > li { display: table-cell; width: 1%; } .nav-tabs.nav-justified > li > a { margin-bottom: 0; } } .nav-tabs.nav-justified > li > a { margin-right: 0; border-radius: 4px; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border: 1px solid #dddddd; } @media (min-width: 768px) { .nav-tabs.nav-justified > li > a { border-bottom: 1px solid #dddddd; border-radius: 4px 4px 0 0; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border-bottom-color: #ffffff; } } .nav-pills > li { float: left; } .nav-pills > li > a { border-radius: 4px; } .nav-pills > li + li { margin-left: 2px; } .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { color: #ffffff; background-color: #428bca; } .nav-stacked > li { float: none; } .nav-stacked > li + li { margin-top: 2px; margin-left: 0; } .nav-justified { width: 100%; } .nav-justified > li { float: none; } .nav-justified > li > a { margin-bottom: 5px; text-align: center; } .nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-justified > li { display: table-cell; width: 1%; } .nav-justified > li > a { margin-bottom: 0; } } .nav-tabs-justified { border-bottom: 0; } .nav-tabs-justified > li > a { margin-right: 0; border-radius: 4px; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border: 1px solid #dddddd; } @media (min-width: 768px) { .nav-tabs-justified > li > a { border-bottom: 1px solid #dddddd; border-radius: 4px 4px 0 0; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border-bottom-color: #ffffff; } } .tab-content > .tab-pane { display: none; } .tab-content > .active { display: block; } .nav-tabs .dropdown-menu { margin-top: -1px; border-top-left-radius: 0; border-top-right-radius: 0; } .navbar { position: relative; min-height: 50px; margin-bottom: 20px; border: 1px solid transparent; } @media (min-width: 768px) { .navbar { border-radius: 4px; } } @media (min-width: 768px) { .navbar-header { float: left; } } .navbar-collapse { padding-right: 15px; padding-left: 15px; overflow-x: visible; border-top: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); -webkit-overflow-scrolling: touch; } .navbar-collapse.in { overflow-y: auto; } @media (min-width: 768px) { .navbar-collapse { width: auto; border-top: 0; -webkit-box-shadow: none; box-shadow: none; } .navbar-collapse.collapse { display: block !important; height: auto !important; padding-bottom: 0; overflow: visible !important; } .navbar-collapse.in { overflow-y: visible; } .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { padding-right: 0; padding-left: 0; } } .navbar-fixed-top, .navbar-fixed-bottom { position: fixed; right: 0; left: 0; z-index: 1030; } .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 340px; } @media (max-device-width: 480px) and (orientation: landscape) { .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 200px; } } @media (min-width: 768px) { .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } } .navbar-fixed-top { top: 0; border-width: 0 0 1px; } .navbar-fixed-bottom { bottom: 0; margin-bottom: 0; border-width: 1px 0 0; } .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: 0; margin-left: 0; } } .navbar-static-top { z-index: 1000; border-width: 0 0 1px; } @media (min-width: 768px) { .navbar-static-top { border-radius: 0; } } .navbar-brand { float: left; height: 50px; padding: 15px 15px; font-size: 18px; line-height: 20px; } .navbar-brand:hover, .navbar-brand:focus { text-decoration: none; } .navbar-brand > img { display: block; } @media (min-width: 768px) { .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { margin-left: -15px; } } .navbar-toggle { position: relative; float: right; padding: 9px 10px; margin-right: 15px; margin-top: 8px; margin-bottom: 8px; background-color: transparent; background-image: none; border: 1px solid transparent; border-radius: 4px; } .navbar-toggle:focus { outline: 0; } .navbar-toggle .icon-bar { display: block; width: 22px; height: 2px; border-radius: 1px; } .navbar-toggle .icon-bar + .icon-bar { margin-top: 4px; } @media (min-width: 768px) { .navbar-toggle { display: none; } } .navbar-nav { margin: 7.5px -15px; } .navbar-nav > li > a { padding-top: 10px; padding-bottom: 10px; line-height: 20px; } @media (max-width: 767px) { .navbar-nav .open .dropdown-menu { position: static; float: none; width: auto; margin-top: 0; background-color: transparent; border: 0; -webkit-box-shadow: none; box-shadow: none; } .navbar-nav .open .dropdown-menu > li > a, .navbar-nav .open .dropdown-menu .dropdown-header { padding: 5px 15px 5px 25px; } .navbar-nav .open .dropdown-menu > li > a { line-height: 20px; } .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { background-image: none; } } @media (min-width: 768px) { .navbar-nav { float: left; margin: 0; } .navbar-nav > li { float: left; } .navbar-nav > li > a { padding-top: 15px; padding-bottom: 15px; } } .navbar-form { padding: 10px 15px; margin-right: -15px; margin-left: -15px; border-top: 1px solid transparent; border-bottom: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); margin-top: 8px; margin-bottom: 8px; } @media (min-width: 768px) { .navbar-form .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .navbar-form .form-control { display: inline-block; width: auto; vertical-align: middle; } .navbar-form .form-control-static { display: inline-block; } .navbar-form .input-group { display: inline-table; vertical-align: middle; } .navbar-form .input-group .input-group-addon, .navbar-form .input-group .input-group-btn, .navbar-form .input-group .form-control { width: auto; } .navbar-form .input-group > .form-control { width: 100%; } .navbar-form .control-label { margin-bottom: 0; vertical-align: middle; } .navbar-form .radio, .navbar-form .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; } .navbar-form .radio label, .navbar-form .checkbox label { padding-left: 0; } .navbar-form .radio input[type="radio"], .navbar-form .checkbox input[type="checkbox"] { position: relative; margin-left: 0; } .navbar-form .has-feedback .form-control-feedback { top: 0; } } @media (max-width: 767px) { .navbar-form .form-group { margin-bottom: 5px; } .navbar-form .form-group:last-child { margin-bottom: 0; } } @media (min-width: 768px) { .navbar-form { width: auto; padding-top: 0; padding-bottom: 0; margin-right: 0; margin-left: 0; border: 0; -webkit-box-shadow: none; box-shadow: none; } } .navbar-nav > li > .dropdown-menu { margin-top: 0; border-top-left-radius: 0; border-top-right-radius: 0; } .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { margin-bottom: 0; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .navbar-btn { margin-top: 8px; margin-bottom: 8px; } .navbar-btn.btn-sm { margin-top: 10px; margin-bottom: 10px; } .navbar-btn.btn-xs { margin-top: 14px; margin-bottom: 14px; } .navbar-text { margin-top: 15px; margin-bottom: 15px; } @media (min-width: 768px) { .navbar-text { float: left; margin-right: 15px; margin-left: 15px; } } @media (min-width: 768px) { .navbar-left { float: left !important; } .navbar-right { float: right !important; margin-right: -15px; } .navbar-right ~ .navbar-right { margin-right: 0; } } .navbar-default { background-color: #f8f8f8; border-color: #e7e7e7; } .navbar-default .navbar-brand { color: #777777; } .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { color: #5e5e5e; background-color: transparent; } .navbar-default .navbar-text { color: #777777; } .navbar-default .navbar-nav > li > a { color: #777777; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { color: #333333; background-color: transparent; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { color: #555555; background-color: #e7e7e7; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { color: #cccccc; background-color: transparent; } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { color: #555555; background-color: #e7e7e7; } @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { color: #777777; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { color: #333333; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { color: #555555; background-color: #e7e7e7; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #cccccc; background-color: transparent; } } .navbar-default .navbar-toggle { border-color: #dddddd; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { background-color: #dddddd; } .navbar-default .navbar-toggle .icon-bar { background-color: #888888; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { border-color: #e7e7e7; } .navbar-default .navbar-link { color: #777777; } .navbar-default .navbar-link:hover { color: #333333; } .navbar-default .btn-link { color: #777777; } .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { color: #333333; } .navbar-default .btn-link[disabled]:hover, fieldset[disabled] .navbar-default .btn-link:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:focus { color: #cccccc; } .navbar-inverse { background-color: #222222; border-color: #080808; } .navbar-inverse .navbar-brand { color: #777777; } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-text { color: #777777; } .navbar-inverse .navbar-nav > li > a { color: #777777; } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { color: #ffffff; background-color: #080808; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { color: #444444; background-color: transparent; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { color: #ffffff; background-color: #080808; } @media (max-width: 767px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { border-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu .divider { background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { color: #777777; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { color: #ffffff; background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #444444; background-color: transparent; } } .navbar-inverse .navbar-toggle { border-color: #333333; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { background-color: #333333; } .navbar-inverse .navbar-toggle .icon-bar { background-color: #ffffff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { border-color: #101010; } .navbar-inverse .navbar-link { color: #777777; } .navbar-inverse .navbar-link:hover { color: #ffffff; } .navbar-inverse .btn-link { color: #777777; } .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { color: #ffffff; } .navbar-inverse .btn-link[disabled]:hover, fieldset[disabled] .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:focus { color: #444444; } .breadcrumb { padding: 8px 15px; margin-bottom: 20px; list-style: none; background-color: #f5f5f5; border-radius: 4px; } .breadcrumb > li { display: inline-block; } .breadcrumb > li + li:before { padding: 0 5px; color: #cccccc; content: "/\00a0"; } .breadcrumb > .active { color: #777777; } .pagination { display: inline-block; padding-left: 0; margin: 20px 0; border-radius: 4px; } .pagination > li { display: inline; } .pagination > li > a, .pagination > li > span { position: relative; float: left; padding: 6px 12px; margin-left: -1px; line-height: 1.42857143; color: #428bca; text-decoration: none; background-color: #ffffff; border: 1px solid #dddddd; } .pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { z-index: 2; color: #2a6496; background-color: #eeeeee; border-color: #dddddd; } .pagination > li:first-child > a, .pagination > li:first-child > span { margin-left: 0; border-top-left-radius: 4px; border-bottom-left-radius: 4px; } .pagination > li:last-child > a, .pagination > li:last-child > span { border-top-right-radius: 4px; border-bottom-right-radius: 4px; } .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 3; color: #ffffff; cursor: default; background-color: #428bca; border-color: #428bca; } .pagination > .disabled > span, .pagination > .disabled > span:hover, .pagination > .disabled > span:focus, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { color: #777777; cursor: not-allowed; background-color: #ffffff; border-color: #dddddd; } .pagination-lg > li > a, .pagination-lg > li > span { padding: 10px 16px; font-size: 18px; line-height: 1.33; } .pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { border-top-left-radius: 6px; border-bottom-left-radius: 6px; } .pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { border-top-right-radius: 6px; border-bottom-right-radius: 6px; } .pagination-sm > li > a, .pagination-sm > li > span { padding: 5px 10px; font-size: 12px; line-height: 1.5; } .pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { border-top-left-radius: 3px; border-bottom-left-radius: 3px; } .pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { border-top-right-radius: 3px; border-bottom-right-radius: 3px; } .label { display: inline; padding: .2em .6em .3em; font-size: 75%; font-weight: 700; line-height: 1; color: #ffffff; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: .25em; } a.label:hover, a.label:focus { color: #ffffff; text-decoration: none; cursor: pointer; } .label:empty { display: none; } .btn .label { position: relative; top: -1px; } .label-default { background-color: #777777; } .label-default[href]:hover, .label-default[href]:focus { background-color: #5e5e5e; } .label-primary { background-color: #428bca; } .label-primary[href]:hover, .label-primary[href]:focus { background-color: #3071a9; } .label-success { background-color: #5cb85c; } .label-success[href]:hover, .label-success[href]:focus { background-color: #449d44; } .label-info { background-color: #5bc0de; } .label-info[href]:hover, .label-info[href]:focus { background-color: #31b0d5; } .label-warning { background-color: #f0ad4e; } .label-warning[href]:hover, .label-warning[href]:focus { background-color: #ec971f; } .label-danger { background-color: #d9534f; } .label-danger[href]:hover, .label-danger[href]:focus { background-color: #c9302c; } .badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: 12px; font-weight: bold; line-height: 1; color: #ffffff; text-align: center; white-space: nowrap; vertical-align: middle; background-color: #777777; border-radius: 10px; } .badge:empty { display: none; } .btn .badge { position: relative; top: -1px; } .btn-xs .badge, .btn-group-xs > .btn .badge { top: 0; padding: 1px 5px; } a.badge:hover, a.badge:focus { color: #ffffff; text-decoration: none; cursor: pointer; } .list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #428bca; background-color: #ffffff; } .list-group-item > .badge { float: right; } .list-group-item > .badge + .badge { margin-right: 5px; } .nav-pills > li > a > .badge { margin-left: 3px; } .list-group { padding-left: 0; margin-bottom: 20px; } .list-group-item { position: relative; display: block; padding: 10px 15px; margin-bottom: -1px; background-color: #ffffff; border: 1px solid #dddddd; } .list-group-item:first-child { border-top-left-radius: 4px; border-top-right-radius: 4px; } .list-group-item:last-child { margin-bottom: 0; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } .list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus { color: #777777; cursor: not-allowed; background-color: #eeeeee; } .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading { color: inherit; } .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text { color: #777777; } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { z-index: 2; color: #ffffff; background-color: #428bca; border-color: #428bca; } .list-group-item.active .list-group-item-heading, .list-group-item.active:hover .list-group-item-heading, .list-group-item.active:focus .list-group-item-heading, .list-group-item.active .list-group-item-heading > small, .list-group-item.active:hover .list-group-item-heading > small, .list-group-item.active:focus .list-group-item-heading > small, .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading > .small { color: inherit; } .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { color: #e1edf7; } a.list-group-item, button.list-group-item { color: #555555; } a.list-group-item .list-group-item-heading, button.list-group-item .list-group-item-heading { color: #333333; } a.list-group-item:hover, button.list-group-item:hover, a.list-group-item:focus, button.list-group-item:focus { color: #555555; text-decoration: none; background-color: #f5f5f5; } button.list-group-item { width: 100%; text-align: left; } .list-group-item-success { color: #3c763d; background-color: #dff0d8; } a.list-group-item-success, button.list-group-item-success { color: #3c763d; } 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:hover, button.list-group-item-success:hover, a.list-group-item-success:focus, button.list-group-item-success:focus { color: #3c763d; background-color: #d0e9c6; } a.list-group-item-success.active, button.list-group-item-success.active, a.list-group-item-success.active:hover, button.list-group-item-success.active:hover, a.list-group-item-success.active:focus, button.list-group-item-success.active:focus { color: #fff; background-color: #3c763d; border-color: #3c763d; } .list-group-item-info { color: #31708f; background-color: #d9edf7; } a.list-group-item-info, button.list-group-item-info { color: #31708f; } 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:hover, button.list-group-item-info:hover, a.list-group-item-info:focus, button.list-group-item-info:focus { color: #31708f; background-color: #c4e3f3; } a.list-group-item-info.active, button.list-group-item-info.active, a.list-group-item-info.active:hover, button.list-group-item-info.active:hover, a.list-group-item-info.active:focus, button.list-group-item-info.active:focus { color: #fff; background-color: #31708f; border-color: #31708f; } .list-group-item-warning { color: #8a6d3b; background-color: #fcf8e3; } a.list-group-item-warning, button.list-group-item-warning { color: #8a6d3b; } 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:hover, button.list-group-item-warning:hover, a.list-group-item-warning:focus, button.list-group-item-warning:focus { color: #8a6d3b; background-color: #faf2cc; } a.list-group-item-warning.active, button.list-group-item-warning.active, a.list-group-item-warning.active:hover, button.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus, button.list-group-item-warning.active:focus { color: #fff; background-color: #8a6d3b; border-color: #8a6d3b; } .list-group-item-danger { color: #a94442; background-color: #f2dede; } a.list-group-item-danger, button.list-group-item-danger { color: #a94442; } 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:hover, button.list-group-item-danger:hover, a.list-group-item-danger:focus, button.list-group-item-danger:focus { color: #a94442; background-color: #ebcccc; } a.list-group-item-danger.active, button.list-group-item-danger.active, a.list-group-item-danger.active:hover, button.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus, button.list-group-item-danger.active:focus { color: #fff; background-color: #a94442; border-color: #a94442; } .list-group-item-heading { margin-top: 0; margin-bottom: 5px; } .list-group-item-text { margin-bottom: 0; line-height: 1.3; } .panel { margin-bottom: 20px; background-color: #ffffff; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } .panel-body { padding: 15px; } .panel-heading { padding: 10px 15px; border-bottom: 1px solid transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel-heading > .dropdown .dropdown-toggle { color: inherit; } .panel-title { margin-top: 0; margin-bottom: 0; font-size: 16px; color: inherit; } .panel-title > a, .panel-title > small, .panel-title > .small, .panel-title > small > a, .panel-title > .small > a { color: inherit; } .panel-footer { padding: 10px 15px; background-color: #f5f5f5; border-top: 1px solid #dddddd; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .list-group, .panel > .panel-collapse > .list-group { margin-bottom: 0; } .panel > .list-group .list-group-item, .panel > .panel-collapse > .list-group .list-group-item { border-width: 1px 0; border-radius: 0; } .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-left-radius: 3px; border-top-right-radius: 3px; } .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: 3px; border-bottom-left-radius: 3px; } .panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { border-top-left-radius: 0; border-top-right-radius: 0; } .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0; } .list-group + .panel-footer { border-top-width: 0; } .panel > .table, .panel > .table-responsive > .table, .panel > .panel-collapse > .table { margin-bottom: 0; } .panel > .table caption, .panel > .table-responsive > .table caption, .panel > .panel-collapse > .table caption { padding-right: 15px; padding-left: 15px; } .panel > .table:first-child, .panel > .table-responsive:first-child > .table:first-child { border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { border-top-left-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { border-top-right-radius: 3px; } .panel > .table:last-child, .panel > .table-responsive:last-child > .table:last-child { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { border-bottom-right-radius: 3px; } .panel > .panel-body + .table, .panel > .panel-body + .table-responsive, .panel > .table + .panel-body, .panel > .table-responsive + .panel-body { border-top: 1px solid #dddddd; } .panel > .table > tbody:first-child > tr:first-child th, .panel > .table > tbody:first-child > tr:first-child td { border-top: 0; } .panel > .table-bordered, .panel > .table-responsive > .table-bordered { border: 0; } .panel > .table-bordered > thead > tr > th:first-child, .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .panel > .table-bordered > tbody > tr > th:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .panel > .table-bordered > tfoot > tr > th:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .panel > .table-bordered > thead > tr > td:first-child, .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .panel > .table-bordered > tbody > tr > td:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .panel > .table-bordered > tfoot > tr > td:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .panel > .table-bordered > thead > tr > th:last-child, .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .panel > .table-bordered > tbody > tr > th:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .panel > .table-bordered > tfoot > tr > th:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .panel > .table-bordered > thead > tr > td:last-child, .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .panel > .table-bordered > tbody > tr > td:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .panel > .table-bordered > tfoot > tr > td:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .panel > .table-bordered > thead > tr:first-child > td, .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, .panel > .table-bordered > tbody > tr:first-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, .panel > .table-bordered > thead > tr:first-child > th, .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, .panel > .table-bordered > tbody > tr:first-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { border-bottom: 0; } .panel > .table-bordered > tbody > tr:last-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .panel > .table-bordered > tfoot > tr:last-child > td, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, .panel > .table-bordered > tbody > tr:last-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .panel > .table-bordered > tfoot > tr:last-child > th, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { border-bottom: 0; } .panel > .table-responsive { margin-bottom: 0; border: 0; } .panel-group { margin-bottom: 20px; } .panel-group .panel { margin-bottom: 0; border-radius: 4px; } .panel-group .panel + .panel { margin-top: 5px; } .panel-group .panel-heading { border-bottom: 0; } .panel-group .panel-heading + .panel-collapse > .panel-body, .panel-group .panel-heading + .panel-collapse > .list-group { border-top: 1px solid #dddddd; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { border-bottom: 1px solid #dddddd; } .panel-default { border-color: #dddddd; } .panel-default > .panel-heading { color: #333333; background-color: #f5f5f5; border-color: #dddddd; } .panel-default > .panel-heading + .panel-collapse > .panel-body { border-top-color: #dddddd; } .panel-default > .panel-heading .badge { color: #f5f5f5; background-color: #333333; } .panel-default > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #dddddd; } .panel-primary { border-color: #428bca; } .panel-primary > .panel-heading { color: #ffffff; background-color: #428bca; border-color: #428bca; } .panel-primary > .panel-heading + .panel-collapse > .panel-body { border-top-color: #428bca; } .panel-primary > .panel-heading .badge { color: #428bca; background-color: #ffffff; } .panel-primary > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #428bca; } .panel-success { border-color: #d6e9c6; } .panel-success > .panel-heading { color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; } .panel-success > .panel-heading + .panel-collapse > .panel-body { border-top-color: #d6e9c6; } .panel-success > .panel-heading .badge { color: #dff0d8; background-color: #3c763d; } .panel-success > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #d6e9c6; } .panel-info { border-color: #bce8f1; } .panel-info > .panel-heading { color: #31708f; background-color: #d9edf7; border-color: #bce8f1; } .panel-info > .panel-heading + .panel-collapse > .panel-body { border-top-color: #bce8f1; } .panel-info > .panel-heading .badge { color: #d9edf7; background-color: #31708f; } .panel-info > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #bce8f1; } .panel-warning { border-color: #faebcc; } .panel-warning > .panel-heading { color: #8a6d3b; background-color: #fcf8e3; border-color: #faebcc; } .panel-warning > .panel-heading + .panel-collapse > .panel-body { border-top-color: #faebcc; } .panel-warning > .panel-heading .badge { color: #fcf8e3; background-color: #8a6d3b; } .panel-warning > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #faebcc; } .panel-danger { border-color: #ebccd1; } .panel-danger > .panel-heading { color: #a94442; background-color: #f2dede; border-color: #ebccd1; } .panel-danger > .panel-heading + .panel-collapse > .panel-body { border-top-color: #ebccd1; } .panel-danger > .panel-heading .badge { color: #f2dede; background-color: #a94442; } .panel-danger > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #ebccd1; } .clearfix:before, .clearfix:after, .dl-horizontal dd:before, .dl-horizontal dd:after, .container:before, .container:after, .container-fluid:before, .container-fluid:after, .row:before, .row:after, .form-horizontal .form-group:before, .form-horizontal .form-group:after, .btn-toolbar:before, .btn-toolbar:after, .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after, .nav:before, .nav:after, .navbar:before, .navbar:after, .navbar-header:before, .navbar-header:after, .navbar-collapse:before, .navbar-collapse:after, .panel-body:before, .panel-body:after { display: table; content: " "; } .clearfix:after, .dl-horizontal dd:after, .container:after, .container-fluid:after, .row:after, .form-horizontal .form-group:after, .btn-toolbar:after, .btn-group-vertical > .btn-group:after, .nav:after, .navbar:after, .navbar-header:after, .navbar-collapse:after, .panel-body:after { clear: both; } .center-block { display: block; margin-right: auto; margin-left: auto; } .pull-right { float: right !important; } .pull-left { float: left !important; } .hide { display: none !important; } .show { display: block !important; } .invisible { visibility: hidden; } .text-hide { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } .hidden { display: none !important; } .affix { position: fixed; } @-ms-viewport { width: device-width; } .visible-xs, .visible-sm, .visible-md, .visible-lg { display: none !important; } .visible-xs-block, .visible-xs-inline, .visible-xs-inline-block, .visible-sm-block, .visible-sm-inline, .visible-sm-inline-block, .visible-md-block, .visible-md-inline, .visible-md-inline-block, .visible-lg-block, .visible-lg-inline, .visible-lg-inline-block { display: none !important; } @media (max-width: 767px) { .visible-xs { display: block !important; } table.visible-xs { display: table !important; } tr.visible-xs { display: table-row !important; } th.visible-xs, td.visible-xs { display: table-cell !important; } } @media (max-width: 767px) { .visible-xs-block { display: block !important; } } @media (max-width: 767px) { .visible-xs-inline { display: inline !important; } } @media (max-width: 767px) { .visible-xs-inline-block { display: inline-block !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm { display: block !important; } table.visible-sm { display: table !important; } tr.visible-sm { display: table-row !important; } th.visible-sm, td.visible-sm { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-block { display: block !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-inline { display: inline !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-inline-block { display: inline-block !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md { display: block !important; } table.visible-md { display: table !important; } tr.visible-md { display: table-row !important; } th.visible-md, td.visible-md { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-block { display: block !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-inline { display: inline !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-inline-block { display: inline-block !important; } } @media (min-width: 1200px) { .visible-lg { display: block !important; } table.visible-lg { display: table !important; } tr.visible-lg { display: table-row !important; } th.visible-lg, td.visible-lg { display: table-cell !important; } } @media (min-width: 1200px) { .visible-lg-block { display: block !important; } } @media (min-width: 1200px) { .visible-lg-inline { display: inline !important; } } @media (min-width: 1200px) { .visible-lg-inline-block { display: inline-block !important; } } @media (max-width: 767px) { .hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-lg { display: none !important; } } .visible-print { display: none !important; } @media print { .visible-print { display: block !important; } table.visible-print { display: table !important; } tr.visible-print { display: table-row !important; } th.visible-print, td.visible-print { display: table-cell !important; } } .visible-print-block { display: none !important; } @media print { .visible-print-block { display: block !important; } } .visible-print-inline { display: none !important; } @media print { .visible-print-inline { display: inline !important; } } .visible-print-inline-block { display: none !important; } @media print { .visible-print-inline-block { display: inline-block !important; } } @media print { .hidden-print { display: none !important; } } /*! * Generated using the Bootstrap Customizer (https://getbootstrap.com/docs/3.4/customize/) */ /*! * Bootstrap v3.4.1 (https://getbootstrap.com/) * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ .btn-default, .btn-primary, .btn-success, .btn-info, .btn-warning, .btn-danger { text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); } .btn-default:active, .btn-primary:active, .btn-success:active, .btn-info:active, .btn-warning:active, .btn-danger:active, .btn-default.active, .btn-primary.active, .btn-success.active, .btn-info.active, .btn-warning.active, .btn-danger.active { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn-default.disabled, .btn-primary.disabled, .btn-success.disabled, .btn-info.disabled, .btn-warning.disabled, .btn-danger.disabled, .btn-default[disabled], .btn-primary[disabled], .btn-success[disabled], .btn-info[disabled], .btn-warning[disabled], .btn-danger[disabled], fieldset[disabled] .btn-default, fieldset[disabled] .btn-primary, fieldset[disabled] .btn-success, fieldset[disabled] .btn-info, fieldset[disabled] .btn-warning, fieldset[disabled] .btn-danger { -webkit-box-shadow: none; box-shadow: none; } .btn-default .badge, .btn-primary .badge, .btn-success .badge, .btn-info .badge, .btn-warning .badge, .btn-danger .badge { text-shadow: none; } .btn:active, .btn.active { background-image: none; } .btn-default { background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%); background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#e0e0e0)); background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #dbdbdb; text-shadow: 0 1px 0 #fff; border-color: #ccc; } .btn-default:hover, .btn-default:focus { background-color: #e0e0e0; background-position: 0 -15px; } .btn-default:active, .btn-default.active { background-color: #e0e0e0; border-color: #dbdbdb; } .btn-default.disabled, .btn-default[disabled], fieldset[disabled] .btn-default, .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled.focus, .btn-default[disabled].focus, fieldset[disabled] .btn-default.focus, .btn-default.disabled:active, .btn-default[disabled]:active, fieldset[disabled] .btn-default:active, .btn-default.disabled.active, .btn-default[disabled].active, fieldset[disabled] .btn-default.active { background-color: #e0e0e0; background-image: none; } .btn-primary { background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#2d6ca2)); background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #2b669a; } .btn-primary:hover, .btn-primary:focus { background-color: #2d6ca2; background-position: 0 -15px; } .btn-primary:active, .btn-primary.active { background-color: #2d6ca2; border-color: #2b669a; } .btn-primary.disabled, .btn-primary[disabled], fieldset[disabled] .btn-primary, .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled.focus, .btn-primary[disabled].focus, fieldset[disabled] .btn-primary.focus, .btn-primary.disabled:active, .btn-primary[disabled]:active, fieldset[disabled] .btn-primary:active, .btn-primary.disabled.active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary.active { background-color: #2d6ca2; background-image: none; } .btn-success { background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #3e8f3e; } .btn-success:hover, .btn-success:focus { background-color: #419641; background-position: 0 -15px; } .btn-success:active, .btn-success.active { background-color: #419641; border-color: #3e8f3e; } .btn-success.disabled, .btn-success[disabled], fieldset[disabled] .btn-success, .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled.focus, .btn-success[disabled].focus, fieldset[disabled] .btn-success.focus, .btn-success.disabled:active, .btn-success[disabled]:active, fieldset[disabled] .btn-success:active, .btn-success.disabled.active, .btn-success[disabled].active, fieldset[disabled] .btn-success.active { background-color: #419641; background-image: none; } .btn-info { background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #28a4c9; } .btn-info:hover, .btn-info:focus { background-color: #2aabd2; background-position: 0 -15px; } .btn-info:active, .btn-info.active { background-color: #2aabd2; border-color: #28a4c9; } .btn-info.disabled, .btn-info[disabled], fieldset[disabled] .btn-info, .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled.focus, .btn-info[disabled].focus, fieldset[disabled] .btn-info.focus, .btn-info.disabled:active, .btn-info[disabled]:active, fieldset[disabled] .btn-info:active, .btn-info.disabled.active, .btn-info[disabled].active, fieldset[disabled] .btn-info.active { background-color: #2aabd2; background-image: none; } .btn-warning { background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #e38d13; } .btn-warning:hover, .btn-warning:focus { background-color: #eb9316; background-position: 0 -15px; } .btn-warning:active, .btn-warning.active { background-color: #eb9316; border-color: #e38d13; } .btn-warning.disabled, .btn-warning[disabled], fieldset[disabled] .btn-warning, .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled.focus, .btn-warning[disabled].focus, fieldset[disabled] .btn-warning.focus, .btn-warning.disabled:active, .btn-warning[disabled]:active, fieldset[disabled] .btn-warning:active, .btn-warning.disabled.active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning.active { background-color: #eb9316; background-image: none; } .btn-danger { background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #b92c28; } .btn-danger:hover, .btn-danger:focus { background-color: #c12e2a; background-position: 0 -15px; } .btn-danger:active, .btn-danger.active { background-color: #c12e2a; border-color: #b92c28; } .btn-danger.disabled, .btn-danger[disabled], fieldset[disabled] .btn-danger, .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled.focus, .btn-danger[disabled].focus, fieldset[disabled] .btn-danger.focus, .btn-danger.disabled:active, .btn-danger[disabled]:active, fieldset[disabled] .btn-danger:active, .btn-danger.disabled.active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger.active { background-color: #c12e2a; background-image: none; } .thumbnail, .img-thumbnail { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); background-repeat: repeat-x; background-color: #e8e8e8; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd)); background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); background-repeat: repeat-x; background-color: #357ebd; } .navbar-default { background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#f8f8f8)); background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); border-radius: 4px; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .active > a { background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); background-repeat: repeat-x; -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); } .navbar-brand, .navbar-nav > li > a { text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); } .navbar-inverse { background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%); background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222222)); background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); border-radius: 4px; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .active > a { background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); background-repeat: repeat-x; -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); } .navbar-inverse .navbar-brand, .navbar-inverse .navbar-nav > li > a { text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } .navbar-static-top, .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } @media (max-width: 767px) { .navbar .navbar-nav .open .dropdown-menu > .active > a, .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { color: #fff; background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd)); background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); background-repeat: repeat-x; } } .alert { text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); } .alert-success { background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); background-repeat: repeat-x; border-color: #b2dba1; } .alert-info { background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); background-repeat: repeat-x; border-color: #9acfea; } .alert-warning { background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); background-repeat: repeat-x; border-color: #f5e79e; } .alert-danger { background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); background-repeat: repeat-x; border-color: #dca7a7; } .progress { background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); background-repeat: repeat-x; } .progress-bar { background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3071a9)); background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); background-repeat: repeat-x; } .progress-bar-success { background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); background-repeat: repeat-x; } .progress-bar-info { background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); background-repeat: repeat-x; } .progress-bar-warning { background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); background-repeat: repeat-x; } .progress-bar-danger { background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); background-repeat: repeat-x; } .progress-bar-striped { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .list-group { border-radius: 4px; -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { text-shadow: 0 -1px 0 #3071a9; background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3278b3)); background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); background-repeat: repeat-x; border-color: #3278b3; } .list-group-item.active .badge, .list-group-item.active:hover .badge, .list-group-item.active:focus .badge { text-shadow: none; } .panel { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); } .panel-default > .panel-heading { background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); background-repeat: repeat-x; } .panel-primary > .panel-heading { background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd)); background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); background-repeat: repeat-x; } .panel-success > .panel-heading { background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); background-repeat: repeat-x; } .panel-info > .panel-heading { background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); background-repeat: repeat-x; } .panel-warning > .panel-heading { background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); background-repeat: repeat-x; } .panel-danger > .panel-heading { background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); background-repeat: repeat-x; } .well { background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); background-repeat: repeat-x; border-color: #dcdcdc; -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); } /*! * Generated using the Bootstrap Customizer (https://getbootstrap.com/docs/3.4/customize/) */ /*! * Bootstrap v3.4.1 (https://getbootstrap.com/) * Copyright 2011-2020 Twitter, Inc. * Licensed under the MIT license */ if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(t){"use strict";var e=t.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||e[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(t){"use strict";function e(e){var i,s=e.attr("data-target")||(i=e.attr("href"))&&i.replace(/.*(?=#[^\s]+$)/,"");return t(document).find(s)}function i(e){return this.each(function(){var i=t(this),n=i.data("bs.collapse"),a=t.extend({},s.DEFAULTS,i.data(),"object"==typeof e&&e);!n&&a.toggle&&/show|hide/.test(e)&&(a.toggle=!1),n||i.data("bs.collapse",n=new s(this,a)),"string"==typeof e&&n[e]()})}var s=function(e,i){this.$element=t(e),this.options=t.extend({},s.DEFAULTS,i),this.$trigger=t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};s.VERSION="3.4.1",s.TRANSITION_DURATION=350,s.DEFAULTS={toggle:!0},s.prototype.dimension=function(){var t=this.$element.hasClass("width");return t?"width":"height"},s.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var e,n=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(n&&n.length&&(e=n.data("bs.collapse"),e&&e.transitioning))){var a=t.Event("show.bs.collapse");if(this.$element.trigger(a),!a.isDefaultPrevented()){n&&n.length&&(i.call(n,"hide"),e||n.data("bs.collapse",null));var o=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[o](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var r=function(){this.$element.removeClass("collapsing").addClass("collapse in")[o](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!t.support.transition)return r.call(this);var l=t.camelCase(["scroll",o].join("-"));this.$element.one("bsTransitionEnd",t.proxy(r,this)).emulateTransitionEnd(s.TRANSITION_DURATION)[o](this.$element[0][l])}}}},s.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var e=t.Event("hide.bs.collapse");if(this.$element.trigger(e),!e.isDefaultPrevented()){var i=this.dimension();this.$element[i](this.$element[i]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var n=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return t.support.transition?void this.$element[i](0).one("bsTransitionEnd",t.proxy(n,this)).emulateTransitionEnd(s.TRANSITION_DURATION):n.call(this)}}},s.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},s.prototype.getParent=function(){return t(document).find(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(t.proxy(function(i,s){var n=t(s);this.addAriaAndCollapsedClass(e(n),n)},this)).end()},s.prototype.addAriaAndCollapsedClass=function(t,e){var i=t.hasClass("in");t.attr("aria-expanded",i),e.toggleClass("collapsed",!i).attr("aria-expanded",i)};var n=t.fn.collapse;t.fn.collapse=i,t.fn.collapse.Constructor=s,t.fn.collapse.noConflict=function(){return t.fn.collapse=n,this},t(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(s){var n=t(this);n.attr("data-target")||s.preventDefault();var a=e(n),o=a.data("bs.collapse"),r=o?"toggle":n.data();i.call(a,r)})}(jQuery);/*! jQuery v3.5.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/Tween,-effects/animatedSelector | (c) JS Foundation and other contributors | jquery.org/license */ !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(g,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,v=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,y=n.hasOwnProperty,a=y.toString,l=a.call(Object),m={},b=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},w=g.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function C(e,t,n){var r,i,o=(n=n||w).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function T(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/Tween,-effects/animatedSelector",E=function(e,t){return new E.fn.init(e,t)};function d(e){var t=!!e&&"length"in e&&e.length,n=T(e);return!b(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+R+")"+R+"*"),U=new RegExp(R+"|>"),V=new RegExp(W),X=new RegExp("^"+B+"$"),Q={ID:new RegExp("^#("+B+")"),CLASS:new RegExp("^\\.("+B+")"),TAG:new RegExp("^("+B+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+R+"*(even|odd|(([+-]|)(\\d*)n|)"+R+"*(?:([+-]|)"+R+"*(\\d+)|))"+R+"*\\)|)","i"),bool:new RegExp("^(?:"+I+")$","i"),needsContext:new RegExp("^"+R+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+R+"*((?:-\\d)?\\d*)"+R+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,G=/^(?:input|select|textarea|button)$/i,K=/^h\d$/i,J=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+R+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){C()},ae=xe(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{O.apply(t=P.call(d.childNodes),d.childNodes),t[d.childNodes.length].nodeType}catch(e){O={apply:t.length?function(e,t){q.apply(e,P.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,d=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==d&&9!==d&&11!==d)return n;if(!r&&(C(e),e=e||T,E)){if(11!==d&&(u=Z.exec(t)))if(i=u[1]){if(9===d){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return O.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&p.getElementsByClassName&&e.getElementsByClassName)return O.apply(n,e.getElementsByClassName(i)),n}if(p.qsa&&!k[t+" "]&&(!v||!v.test(t))&&(1!==d||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===d&&(U.test(t)||_.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&p.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=A)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+be(l[o]);c=l.join(",")}try{return O.apply(n,f.querySelectorAll(c)),n}catch(e){k(t,!0)}finally{s===A&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>x.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[A]=!0,e}function ce(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)x.attrHandle[n[r]]=t}function de(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function pe(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in p=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},C=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:d;return r!=T&&9===r.nodeType&&r.documentElement&&(a=(T=r).documentElement,E=!i(T),d!=T&&(n=T.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),p.scope=ce(function(e){return a.appendChild(e).appendChild(T.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),p.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),p.getElementsByTagName=ce(function(e){return e.appendChild(T.createComment("")),!e.getElementsByTagName("*").length}),p.getElementsByClassName=J.test(T.getElementsByClassName),p.getById=ce(function(e){return a.appendChild(e).id=A,!T.getElementsByName||!T.getElementsByName(A).length}),p.getById?(x.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},x.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(x.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},x.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),x.find.TAG=p.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):p.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},x.find.CLASS=p.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(p.qsa=J.test(T.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+R+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+R+"*(?:value|"+I+")"),e.querySelectorAll("[id~="+A+"-]").length||v.push("~="),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+R+"*name"+R+"*="+R+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+A+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=T.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+R+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(p.matchesSelector=J.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){p.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",W)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=J.test(a.compareDocumentPosition),y=t||J.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!p.sortDetached&&t.compareDocumentPosition(e)===n?e==T||e.ownerDocument==d&&y(d,e)?-1:t==T||t.ownerDocument==d&&y(d,t)?1:u?H(u,e)-H(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==T?-1:t==T?1:i?-1:o?1:u?H(u,e)-H(u,t):0;if(i===o)return de(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?de(a[r],s[r]):a[r]==d?-1:s[r]==d?1:0}),T},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(C(e),p.matchesSelector&&E&&!k[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||p.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){k(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&V.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+R+")"+e+"("+R+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return b(n)?E.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?E.grep(e,function(e){return e===n!==r}):"string"!=typeof n?E.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(E.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||L,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:j.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof E?t[0]:t,E.merge(this,E.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:w,!0)),k.test(r[1])&&E.isPlainObject(t))for(r in t)b(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=w.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):b(e)?void 0!==n.ready?n.ready(e):e(E):E.makeArray(e,this)}).prototype=E.fn,L=E(w);var q=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}E.fn.extend({has:function(e){var t=E(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,pe=/^$|^module$|\/(?:java|ecma)script/i;le=w.createDocumentFragment().appendChild(w.createElement("div")),(ce=w.createElement("input")).setAttribute("type","radio"),ce.setAttribute("checked","checked"),ce.setAttribute("name","t"),le.appendChild(ce),m.checkClone=le.cloneNode(!0).cloneNode(!0).lastChild.checked,le.innerHTML="",m.noCloneChecked=!!le.cloneNode(!0).lastChild.defaultValue,le.innerHTML="",m.option=!!le.lastChild;var he={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ge(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&S(e,t)?E.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n",""]);var ye=/<|&#?\w+;/;function me(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),d=[],p=0,h=e.length;p\s*$/g;function Le(e,t){return S(e,"table")&&S(11!==t.nodeType?t:t.firstChild,"tr")&&E(e).children("tbody")[0]||e}function je(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n
    ",2===ft.childNodes.length),E.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(m.createHTMLDocument?((r=(t=w.implementation.createHTMLDocument("")).createElement("base")).href=w.location.href,t.head.appendChild(r)):t=w),o=!n&&[],(i=k.exec(e))?[t.createElement(i[1])]:(i=me([e],t,o),o&&o.length&&E(o).remove(),E.merge([],i.childNodes)));var r,i,o},E.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=E.css(e,"position"),c=E(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=E.css(e,"top"),u=E.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),b(t)&&(t=t.call(e,n,E.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},E.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){E.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===E.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===E.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=E(e).offset()).top+=E.css(e,"borderTopWidth",!0),i.left+=E.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-E.css(r,"marginTop",!0),left:t.left-i.left-E.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===E.css(e,"position"))e=e.offsetParent;return e||re})}}),E.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;E.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),E.each(["top","left"],function(e,n){E.cssHooks[n]=Fe(m.pixelPosition,function(e,t){if(t)return t=We(e,n),Ie.test(t)?E(e).position()[n]+"px":t})}),E.each({Height:"height",Width:"width"},function(a,s){E.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){E.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?E.css(e,t,i):E.style(e,t,n,i)},s,n?e:void 0,n)}})}),E.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),E.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){E.fn[n]=function(e,t){return 0=c?(clearTimeout(r),r=null,o=a,s=t.apply(n,i)):r||(r=setTimeout(u,c)),s}},noop:function(){}}}(),n="0.10.5",i=function(){"use strict";function t(t){return t=e.toStr(t),t?t.split(/\s+/):[]}function n(t){return t=e.toStr(t),t?t.split(/\W+/):[]}function i(t){return function(){var n=[].slice.call(arguments,0);return function(i){var r=[];return e.each(n,function(n){r=r.concat(t(e.toStr(i[n])))}),r}}}return{nonword:n,whitespace:t,obj:{nonword:i(n),whitespace:i(t)}}}(),r=function(){"use strict";function n(n){this.maxSize=e.isNumber(n)?n:100,this.reset(),this.maxSize<=0&&(this.set=this.get=t.noop)}function i(){this.head=this.tail=null}function r(t,e){this.key=t,this.val=e,this.prev=this.next=null}return e.mixin(n.prototype,{set:function(t,e){var n,i=this.list.tail;this.size>=this.maxSize&&(this.list.remove(i),delete this.hash[i.key]),(n=this.hash[t])?(n.val=e,this.list.moveToFront(n)):(n=new r(t,e),this.list.add(n),this.hash[t]=n,this.size++)},get:function(t){var e=this.hash[t];return e?(this.list.moveToFront(e),e.val):void 0},reset:function(){this.size=0,this.hash={},this.list=new i}}),e.mixin(i.prototype,{add:function(t){this.head&&(t.next=this.head,this.head.prev=t),this.head=t,this.tail=this.tail||t},remove:function(t){t.prev?t.prev.next=t.next:this.head=t.next,t.next?t.next.prev=t.prev:this.tail=t.prev},moveToFront:function(t){this.remove(t),this.add(t)}}),n}(),s=function(){"use strict";function t(t){this.prefix=["__",t,"__"].join(""),this.ttlKey="__ttl__",this.keyMatcher=new RegExp("^"+e.escapeRegExChars(this.prefix))}function n(){return(new Date).getTime()}function i(t){return JSON.stringify(e.isUndefined(t)?null:t)}function r(t){return JSON.parse(t)}var s,o;try{s=window.localStorage,s.setItem("~~~","!"),s.removeItem("~~~")}catch(u){s=null}return o=s&&window.JSON?{_prefix:function(t){return this.prefix+t},_ttlKey:function(t){return this._prefix(t)+this.ttlKey},get:function(t){return this.isExpired(t)&&this.remove(t),r(s.getItem(this._prefix(t)))},set:function(t,r,o){return e.isNumber(o)?s.setItem(this._ttlKey(t),i(n()+o)):s.removeItem(this._ttlKey(t)),s.setItem(this._prefix(t),i(r))},remove:function(t){return s.removeItem(this._ttlKey(t)),s.removeItem(this._prefix(t)),this},clear:function(){var t,e,n=[],i=s.length;for(t=0;i>t;t++)(e=s.key(t)).match(this.keyMatcher)&&n.push(e.replace(this.keyMatcher,""));for(t=n.length;t--;)this.remove(n[t]);return this},isExpired:function(t){var i=r(s.getItem(this._ttlKey(t)));return e.isNumber(i)&&n()>i?!0:!1}}:{get:e.noop,set:e.noop,remove:e.noop,clear:e.noop,isExpired:e.noop},e.mixin(t.prototype,o),t}(),o=function(){"use strict";function n(e){e=e||{},this.cancelled=!1,this.lastUrl=null,this._send=e.transport?i(e.transport):t.ajax,this._get=e.rateLimiter?e.rateLimiter(this._get):this._get,this._cache=e.cache===!1?new r(0):a}function i(n){return function(i,r){function s(t){e.defer(function(){u.resolve(t)})}function o(t){e.defer(function(){u.reject(t)})}var u=t.Deferred();return n(i,r,s,o),u}}var s=0,o={},u=6,a=new r(10);return n.setMaxPendingRequests=function(t){u=t},n.resetCache=function(){a.reset()},e.mixin(n.prototype,{_get:function(t,e,n){function i(e){n&&n(null,e),h._cache.set(t,e)}function r(){n&&n(!0)}function a(){s--,delete o[t],h.onDeckRequestArgs&&(h._get.apply(h,h.onDeckRequestArgs),h.onDeckRequestArgs=null)}var c,h=this;this.cancelled||t!==this.lastUrl||((c=o[t])?c.done(i).fail(r):u>s?(s++,o[t]=this._send(t,e).done(i).fail(r).always(a)):this.onDeckRequestArgs=[].slice.call(arguments,0))},get:function(t,n,i){var r;return e.isFunction(n)&&(i=n,n={}),this.cancelled=!1,this.lastUrl=t,(r=this._cache.get(t))?e.defer(function(){i&&i(null,r)}):this._get(t,n,i),!!r},cancel:function(){this.cancelled=!0}}),n}(),u=function(){"use strict";function n(e){e=e||{},e.datumTokenizer&&e.queryTokenizer||t.error("datumTokenizer and queryTokenizer are both required"),this.datumTokenizer=e.datumTokenizer,this.queryTokenizer=e.queryTokenizer,this.reset()}function i(t){return t=e.filter(t,function(t){return!!t}),t=e.map(t,function(t){return t.toLowerCase()})}function r(){return{ids:[],children:{}}}function s(t){for(var e={},n=[],i=0,r=t.length;r>i;i++)e[t[i]]||(e[t[i]]=!0,n.push(t[i]));return n}function o(t,e){function n(t,e){return t-e}var i=0,r=0,s=[];t=t.sort(n),e=e.sort(n);for(var o=t.length,u=e.length;o>i&&u>r;)t[i]e[r]?r++:(s.push(t[i]),i++,r++);return s}return e.mixin(n.prototype,{bootstrap:function(t){this.datums=t.datums,this.trie=t.trie},add:function(t){var n=this;t=e.isArray(t)?t:[t],e.each(t,function(t){var s,o;s=n.datums.push(t)-1,o=i(n.datumTokenizer(t)),e.each(o,function(t){var e,i,o;for(e=n.trie,i=t.split("");o=i.shift();)e=e.children[o]||(e.children[o]=r()),e.ids.push(s)})})},get:function(t){var n,r,u=this;return n=i(this.queryTokenizer(t)),e.each(n,function(t){var e,n,i,s;if(r&&0===r.length)return!1;for(e=u.trie,n=t.split("");e&&(i=n.shift());)e=e.children[i];return e&&0===n.length?(s=e.ids.slice(0),void(r=r?o(r,s):s)):(r=[],!1)}),r?e.map(s(r),function(t){return u.datums[t]}):[]},reset:function(){this.datums=[],this.trie=r()},serialize:function(){return{datums:this.datums,trie:this.trie}}}),n}(),a=function(){"use strict";function i(t){return t.local||null}function r(i){var r,s;return s={url:null,thumbprint:"",ttl:864e5,filter:null,ajax:{}},(r=i.prefetch||null)&&(r=e.isString(r)?{url:r}:r,r=e.mixin(s,r),r.thumbprint=n+r.thumbprint,r.ajax.type=r.ajax.type||"GET",r.ajax.dataType=r.ajax.dataType||"json",!r.url&&t.error("prefetch requires url to be set")),r}function s(n){function i(t){return function(n){return e.debounce(n,t)}}function r(t){return function(n){return e.throttle(n,t)}}var s,o;return o={url:null,cache:!0,wildcard:"%QUERY",replace:null,rateLimitBy:"debounce",rateLimitWait:300,send:null,filter:null,ajax:{}},(s=n.remote||null)&&(s=e.isString(s)?{url:s}:s,s=e.mixin(o,s),s.rateLimiter=/^throttle$/i.test(s.rateLimitBy)?r(s.rateLimitWait):i(s.rateLimitWait),s.ajax.type=s.ajax.type||"GET",s.ajax.dataType=s.ajax.dataType||"json",delete s.rateLimitBy,delete s.rateLimitWait,!s.url&&t.error("remote requires url to be set")),s}return{local:i,prefetch:r,remote:s}}();!function(n){"use strict";function r(e){e&&(e.local||e.prefetch||e.remote)||t.error("one of local, prefetch, or remote is required"),this.limit=e.limit||5,this.sorter=c(e.sorter),this.dupDetector=e.dupDetector||h,this.local=a.local(e),this.prefetch=a.prefetch(e),this.remote=a.remote(e),this.cacheKey=this.prefetch?this.prefetch.cacheKey||this.prefetch.url:null,this.index=new u({datumTokenizer:e.datumTokenizer,queryTokenizer:e.queryTokenizer}),this.storage=this.cacheKey?new s(this.cacheKey):null}function c(t){function n(e){return e.sort(t)}function i(t){return t}return e.isFunction(t)?n:i}function h(){return!1}var l,d;return l=n.Bloodhound,d={data:"data",protocol:"protocol",thumbprint:"thumbprint"},n.Bloodhound=r,r.noConflict=function(){return n.Bloodhound=l,r},r.tokenizers=i,e.mixin(r.prototype,{_loadPrefetch:function(e){function n(t){s.clear(),s.add(e.filter?e.filter(t):t),s._saveToStorage(s.index.serialize(),e.thumbprint,e.ttl)}var i,r,s=this;return(i=this._readFromStorage(e.thumbprint))?(this.index.bootstrap(i),r=t.Deferred().resolve()):r=t.ajax(e.url,e.ajax).done(n),r},_getFromRemote:function(t,e){function n(t,n){e(t?[]:s.remote.filter?s.remote.filter(n):n)}var i,r,s=this;if(this.transport)return t=t||"",r=encodeURIComponent(t),i=this.remote.replace?this.remote.replace(this.remote.url,t):this.remote.url.replace(this.remote.wildcard,r),this.transport.get(i,this.remote.ajax,n)},_cancelLastRemoteRequest:function(){this.transport&&this.transport.cancel()},_saveToStorage:function(t,e,n){this.storage&&(this.storage.set(d.data,t,n),this.storage.set(d.protocol,location.protocol,n),this.storage.set(d.thumbprint,e,n))},_readFromStorage:function(t){var e,n={};return this.storage&&(n.data=this.storage.get(d.data),n.protocol=this.storage.get(d.protocol),n.thumbprint=this.storage.get(d.thumbprint)),e=n.thumbprint!==t||n.protocol!==location.protocol,n.data&&!e?n.data:null},_initialize:function(){function n(){r.add(e.isFunction(s)?s():s)}var i,r=this,s=this.local;return i=this.prefetch?this._loadPrefetch(this.prefetch):t.Deferred().resolve(),s&&i.done(n),this.transport=this.remote?new o(this.remote):null,this.initPromise=i.promise()},initialize:function(t){return!this.initPromise||t?this._initialize():this.initPromise},add:function(t){this.index.add(t)},get:function(t,n){function i(t){var i=s.slice(0);e.each(t,function(t){var n;return n=e.some(i,function(e){return r.dupDetector(t,e)}),!n&&i.push(t),i.length0||!this.transport)&&n&&n(s)},clear:function(){this.index.reset()},clearPrefetchCache:function(){this.storage&&this.storage.clear()},clearRemoteCache:function(){this.transport&&o.resetCache()},ttAdapter:function(){return e.bind(this.get,this)}}),r}(this);var c=function(){return{wrapper:'',dropdown:'',dataset:'
    ',suggestions:'',suggestion:'
    '}}(),h=function(){"use strict";var t={wrapper:{position:"relative",display:"inline-block"},hint:{position:"absolute",top:"0",left:"0",borderColor:"transparent",boxShadow:"none",opacity:"1"},input:{position:"relative",verticalAlign:"top",backgroundColor:"transparent"},inputWithNoHint:{position:"relative",verticalAlign:"top"},dropdown:{position:"absolute",top:"100%",left:"0",zIndex:"100",display:"none"},suggestions:{display:"block"},suggestion:{whiteSpace:"nowrap",cursor:"pointer"},suggestionChild:{whiteSpace:"normal"},ltr:{left:"0",right:"auto"},rtl:{left:"auto",right:" 0"}};return e.isMsie()&&e.mixin(t.input,{backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"}),e.isMsie()&&e.isMsie()<=7&&e.mixin(t.input,{marginTop:"-1px"}),t}(),l=function(){"use strict";function n(e){e&&e.el||t.error("EventBus initialized without el"),this.$el=t(e.el)}var i="typeahead:";return e.mixin(n.prototype,{trigger:function(t){var e=[].slice.call(arguments,1);this.$el.trigger(i+t,e)}}),n}(),d=function(){"use strict";function t(t,e,n,i){var r;if(!n)return this;for(e=e.split(a),n=i?u(n,i):n,this._callbacks=this._callbacks||{};r=e.shift();)this._callbacks[r]=this._callbacks[r]||{sync:[],async:[]},this._callbacks[r][t].push(n);return this}function e(e,n,i){return t.call(this,"async",e,n,i)}function n(e,n,i){return t.call(this,"sync",e,n,i)}function i(t){var e;if(!this._callbacks)return this;for(t=t.split(a);e=t.shift();)delete this._callbacks[e];return this}function r(t){var e,n,i,r,o;if(!this._callbacks)return this;for(t=t.split(a),i=[].slice.call(arguments,1);(e=t.shift())&&(n=this._callbacks[e]);)r=s(n.sync,this,[e].concat(i)),o=s(n.async,this,[e].concat(i)),r()&&c(o);return this}function s(t,e,n){function i(){for(var i,r=0,s=t.length;!i&&s>r;r+=1)i=t[r].apply(e,n)===!1;return!i}return i}function o(){var t;return t=window.setImmediate?function(t){setImmediate(function(){t()})}:function(t){setTimeout(function(){t()},0)}}function u(t,e){return t.bind?t.bind(e):function(){t.apply(e,[].slice.call(arguments,0))}}var a=/\s+/,c=o();return{onSync:n,onAsync:e,off:i,trigger:r}}(),p=function(t){"use strict";function n(t,n,i){for(var r,s=[],o=0,u=t.length;u>o;o++)s.push(e.escapeRegExChars(t[o]));return r=i?"\\b("+s.join("|")+")\\b":"("+s.join("|")+")",n?new RegExp(r):new RegExp(r,"i")}var i={node:null,pattern:null,tagName:"strong",className:null,wordsOnly:!1,caseSensitive:!1};return function(r){function s(e){var n,i,s;return(n=u.exec(e.data))&&(s=t.createElement(r.tagName),r.className&&(s.className=r.className),i=e.splitText(n.index),i.splitText(n[0].length),s.appendChild(i.cloneNode(!0)),e.parentNode.replaceChild(s,i)),!!n}function o(t,e){for(var n,i=3,r=0;r