From 6b18a65ab4d6dd8c4aa35dae3e8e1f300f5dac98 Mon Sep 17 00:00:00 2001 From: Alexander Yuzhin Date: Thu, 15 Sep 2016 17:14:43 +0300 Subject: [PATCH] Update sencha touch --- .../resources/sass/_common-settingslist.scss | 4 + .../resources/sass/_common-settingspanel.scss | 6 +- .../resources/css/application-normal.css | 2 +- .../resources/css/application-retina.css | 2 +- vendor/touch/license.txt | 40 +- vendor/touch/resources/css/base.css | 11 +- vendor/touch/resources/css/bb10.css | 11 +- vendor/touch/resources/css/bb103.css | 11 +- .../touch/resources/css/cupertino-classic.css | 11 +- vendor/touch/resources/css/cupertino.css | 11 +- vendor/touch/resources/css/mountainview.css | 11 +- vendor/touch/resources/css/sencha-touch.css | 11 +- vendor/touch/resources/css/tizen.css | 11 +- vendor/touch/resources/css/wp.css | 11 +- vendor/touch/sencha-touch-all-debug.js | 23410 +++++++++++++++- vendor/touch/sencha-touch-all.js | 13 +- vendor/touch/sencha-touch-debug.js | 343 +- vendor/touch/sencha-touch.js | 13 +- vendor/touch/src/chart/AbstractChart.js | 1313 + vendor/touch/src/chart/CartesianChart.js | 304 + vendor/touch/src/chart/Legend.js | 147 + vendor/touch/src/chart/MarkerHolder.js | 109 + vendor/touch/src/chart/Markers.js | 103 + vendor/touch/src/chart/PolarChart.js | 164 + vendor/touch/src/chart/SpaceFillingChart.js | 58 + vendor/touch/src/chart/axis/Axis.js | 890 + vendor/touch/src/chart/axis/Category.js | 69 + vendor/touch/src/chart/axis/Numeric.js | 72 + vendor/touch/src/chart/axis/Time.js | 140 + .../src/chart/axis/layout/CombineDuplicate.js | 20 + .../touch/src/chart/axis/layout/Continuous.js | 76 + .../touch/src/chart/axis/layout/Discrete.js | 127 + vendor/touch/src/chart/axis/layout/Layout.js | 139 + .../touch/src/chart/axis/segmenter/Names.js | 36 + .../touch/src/chart/axis/segmenter/Numeric.js | 72 + .../src/chart/axis/segmenter/Segmenter.js | 84 + vendor/touch/src/chart/axis/segmenter/Time.js | 107 + vendor/touch/src/chart/axis/sprite/Axis.js | 715 + vendor/touch/src/chart/grid/CircularGrid.js | 19 + vendor/touch/src/chart/grid/HorizontalGrid.js | 43 + vendor/touch/src/chart/grid/RadialGrid.js | 44 + vendor/touch/src/chart/grid/VerticalGrid.js | 43 + .../touch/src/chart/interactions/Abstract.js | 246 + .../touch/src/chart/interactions/CrossZoom.js | 409 + .../touch/src/chart/interactions/Crosshair.js | 410 + .../src/chart/interactions/ItemHighlight.js | 38 + .../touch/src/chart/interactions/ItemInfo.js | 107 + .../touch/src/chart/interactions/PanZoom.js | 502 + vendor/touch/src/chart/interactions/Rotate.js | 197 + .../src/chart/interactions/RotatePie3D.js | 22 + vendor/touch/src/chart/label/Callout.js | 107 + vendor/touch/src/chart/label/Label.js | 105 + vendor/touch/src/chart/series/Area.js | 61 + vendor/touch/src/chart/series/Bar.js | 134 + vendor/touch/src/chart/series/CandleStick.js | 100 + vendor/touch/src/chart/series/Cartesian.js | 145 + vendor/touch/src/chart/series/Gauge.js | 467 + .../touch/src/chart/series/ItemPublisher.js | 337 + vendor/touch/src/chart/series/Line.js | 202 + vendor/touch/src/chart/series/Pie.js | 393 + vendor/touch/src/chart/series/Pie3D.js | 247 + vendor/touch/src/chart/series/Polar.js | 90 + vendor/touch/src/chart/series/Radar.js | 171 + vendor/touch/src/chart/series/Scatter.js | 108 + vendor/touch/src/chart/series/Series.js | 1028 + .../src/chart/series/StackedCartesian.js | 160 + .../src/chart/series/sprite/Aggregative.js | 86 + vendor/touch/src/chart/series/sprite/Area.js | 116 + vendor/touch/src/chart/series/sprite/Bar.js | 223 + .../src/chart/series/sprite/CandleStick.js | 165 + .../src/chart/series/sprite/Cartesian.js | 284 + vendor/touch/src/chart/series/sprite/Line.js | 387 + .../src/chart/series/sprite/Pie3DPart.js | 377 + .../touch/src/chart/series/sprite/PieSlice.js | 180 + vendor/touch/src/chart/series/sprite/Polar.js | 150 + vendor/touch/src/chart/series/sprite/Radar.js | 44 + .../touch/src/chart/series/sprite/Scatter.js | 43 + .../chart/series/sprite/StackedCartesian.js | 73 + vendor/touch/src/core/Ext-more.js | 5 + vendor/touch/src/draw/Animator.js | 201 + vendor/touch/src/draw/Color.js | 427 + vendor/touch/src/draw/Component.js | 354 + vendor/touch/src/draw/Draw.js | 261 + vendor/touch/src/draw/LimitedCache.js | 80 + vendor/touch/src/draw/Matrix.js | 809 + vendor/touch/src/draw/Path.js | 1181 + vendor/touch/src/draw/SegmentTree.js | 402 + vendor/touch/src/draw/Solver.js | 175 + vendor/touch/src/draw/Surface.js | 622 + vendor/touch/src/draw/TextMeasurer.js | 143 + vendor/touch/src/draw/TimingFunctions.js | 139 + vendor/touch/src/draw/engine/Canvas.js | 822 + vendor/touch/src/draw/engine/Svg.js | 195 + vendor/touch/src/draw/engine/SvgContext.js | 718 + vendor/touch/src/draw/engine/SvgExporter.js | 150 + vendor/touch/src/draw/gradient/Gradient.js | 55 + .../src/draw/gradient/GradientDefinition.js | 27 + vendor/touch/src/draw/gradient/Linear.js | 75 + vendor/touch/src/draw/gradient/Radial.js | 144 + vendor/touch/src/draw/modifier/Animation.js | 437 + vendor/touch/src/draw/modifier/Highlight.js | 182 + vendor/touch/src/draw/modifier/Modifier.js | 89 + vendor/touch/src/draw/modifier/Target.js | 113 + .../touch/src/draw/sprite/AnimationParser.js | 180 + vendor/touch/src/draw/sprite/Arc.js | 67 + .../src/draw/sprite/AttributeDefinition.js | 407 + .../touch/src/draw/sprite/AttributeParser.js | 98 + vendor/touch/src/draw/sprite/Circle.js | 93 + vendor/touch/src/draw/sprite/Composite.js | 107 + vendor/touch/src/draw/sprite/Ellipse.js | 118 + vendor/touch/src/draw/sprite/EllipticalArc.js | 68 + vendor/touch/src/draw/sprite/Image.js | 74 + vendor/touch/src/draw/sprite/Instancing.js | 149 + vendor/touch/src/draw/sprite/Line.js | 35 + vendor/touch/src/draw/sprite/Path.js | 88 + vendor/touch/src/draw/sprite/Rect.js | 101 + vendor/touch/src/draw/sprite/Sector.js | 94 + vendor/touch/src/draw/sprite/Sprite.js | 722 + vendor/touch/src/draw/sprite/Text.js | 334 + 119 files changed, 47212 insertions(+), 69 deletions(-) create mode 100644 vendor/touch/src/chart/AbstractChart.js create mode 100644 vendor/touch/src/chart/CartesianChart.js create mode 100644 vendor/touch/src/chart/Legend.js create mode 100644 vendor/touch/src/chart/MarkerHolder.js create mode 100644 vendor/touch/src/chart/Markers.js create mode 100644 vendor/touch/src/chart/PolarChart.js create mode 100644 vendor/touch/src/chart/SpaceFillingChart.js create mode 100644 vendor/touch/src/chart/axis/Axis.js create mode 100644 vendor/touch/src/chart/axis/Category.js create mode 100644 vendor/touch/src/chart/axis/Numeric.js create mode 100644 vendor/touch/src/chart/axis/Time.js create mode 100644 vendor/touch/src/chart/axis/layout/CombineDuplicate.js create mode 100644 vendor/touch/src/chart/axis/layout/Continuous.js create mode 100644 vendor/touch/src/chart/axis/layout/Discrete.js create mode 100644 vendor/touch/src/chart/axis/layout/Layout.js create mode 100644 vendor/touch/src/chart/axis/segmenter/Names.js create mode 100644 vendor/touch/src/chart/axis/segmenter/Numeric.js create mode 100644 vendor/touch/src/chart/axis/segmenter/Segmenter.js create mode 100644 vendor/touch/src/chart/axis/segmenter/Time.js create mode 100644 vendor/touch/src/chart/axis/sprite/Axis.js create mode 100644 vendor/touch/src/chart/grid/CircularGrid.js create mode 100644 vendor/touch/src/chart/grid/HorizontalGrid.js create mode 100644 vendor/touch/src/chart/grid/RadialGrid.js create mode 100644 vendor/touch/src/chart/grid/VerticalGrid.js create mode 100644 vendor/touch/src/chart/interactions/Abstract.js create mode 100644 vendor/touch/src/chart/interactions/CrossZoom.js create mode 100644 vendor/touch/src/chart/interactions/Crosshair.js create mode 100644 vendor/touch/src/chart/interactions/ItemHighlight.js create mode 100644 vendor/touch/src/chart/interactions/ItemInfo.js create mode 100644 vendor/touch/src/chart/interactions/PanZoom.js create mode 100644 vendor/touch/src/chart/interactions/Rotate.js create mode 100644 vendor/touch/src/chart/interactions/RotatePie3D.js create mode 100644 vendor/touch/src/chart/label/Callout.js create mode 100644 vendor/touch/src/chart/label/Label.js create mode 100644 vendor/touch/src/chart/series/Area.js create mode 100644 vendor/touch/src/chart/series/Bar.js create mode 100644 vendor/touch/src/chart/series/CandleStick.js create mode 100644 vendor/touch/src/chart/series/Cartesian.js create mode 100644 vendor/touch/src/chart/series/Gauge.js create mode 100644 vendor/touch/src/chart/series/ItemPublisher.js create mode 100644 vendor/touch/src/chart/series/Line.js create mode 100644 vendor/touch/src/chart/series/Pie.js create mode 100644 vendor/touch/src/chart/series/Pie3D.js create mode 100644 vendor/touch/src/chart/series/Polar.js create mode 100644 vendor/touch/src/chart/series/Radar.js create mode 100644 vendor/touch/src/chart/series/Scatter.js create mode 100644 vendor/touch/src/chart/series/Series.js create mode 100644 vendor/touch/src/chart/series/StackedCartesian.js create mode 100644 vendor/touch/src/chart/series/sprite/Aggregative.js create mode 100644 vendor/touch/src/chart/series/sprite/Area.js create mode 100644 vendor/touch/src/chart/series/sprite/Bar.js create mode 100644 vendor/touch/src/chart/series/sprite/CandleStick.js create mode 100644 vendor/touch/src/chart/series/sprite/Cartesian.js create mode 100644 vendor/touch/src/chart/series/sprite/Line.js create mode 100644 vendor/touch/src/chart/series/sprite/Pie3DPart.js create mode 100644 vendor/touch/src/chart/series/sprite/PieSlice.js create mode 100644 vendor/touch/src/chart/series/sprite/Polar.js create mode 100644 vendor/touch/src/chart/series/sprite/Radar.js create mode 100644 vendor/touch/src/chart/series/sprite/Scatter.js create mode 100644 vendor/touch/src/chart/series/sprite/StackedCartesian.js create mode 100644 vendor/touch/src/draw/Animator.js create mode 100644 vendor/touch/src/draw/Color.js create mode 100644 vendor/touch/src/draw/Component.js create mode 100644 vendor/touch/src/draw/Draw.js create mode 100644 vendor/touch/src/draw/LimitedCache.js create mode 100644 vendor/touch/src/draw/Matrix.js create mode 100644 vendor/touch/src/draw/Path.js create mode 100644 vendor/touch/src/draw/SegmentTree.js create mode 100644 vendor/touch/src/draw/Solver.js create mode 100644 vendor/touch/src/draw/Surface.js create mode 100644 vendor/touch/src/draw/TextMeasurer.js create mode 100644 vendor/touch/src/draw/TimingFunctions.js create mode 100644 vendor/touch/src/draw/engine/Canvas.js create mode 100644 vendor/touch/src/draw/engine/Svg.js create mode 100644 vendor/touch/src/draw/engine/SvgContext.js create mode 100644 vendor/touch/src/draw/engine/SvgExporter.js create mode 100644 vendor/touch/src/draw/gradient/Gradient.js create mode 100644 vendor/touch/src/draw/gradient/GradientDefinition.js create mode 100644 vendor/touch/src/draw/gradient/Linear.js create mode 100644 vendor/touch/src/draw/gradient/Radial.js create mode 100644 vendor/touch/src/draw/modifier/Animation.js create mode 100644 vendor/touch/src/draw/modifier/Highlight.js create mode 100644 vendor/touch/src/draw/modifier/Modifier.js create mode 100644 vendor/touch/src/draw/modifier/Target.js create mode 100644 vendor/touch/src/draw/sprite/AnimationParser.js create mode 100644 vendor/touch/src/draw/sprite/Arc.js create mode 100644 vendor/touch/src/draw/sprite/AttributeDefinition.js create mode 100644 vendor/touch/src/draw/sprite/AttributeParser.js create mode 100644 vendor/touch/src/draw/sprite/Circle.js create mode 100644 vendor/touch/src/draw/sprite/Composite.js create mode 100644 vendor/touch/src/draw/sprite/Ellipse.js create mode 100644 vendor/touch/src/draw/sprite/EllipticalArc.js create mode 100644 vendor/touch/src/draw/sprite/Image.js create mode 100644 vendor/touch/src/draw/sprite/Instancing.js create mode 100644 vendor/touch/src/draw/sprite/Line.js create mode 100644 vendor/touch/src/draw/sprite/Path.js create mode 100644 vendor/touch/src/draw/sprite/Rect.js create mode 100644 vendor/touch/src/draw/sprite/Sector.js create mode 100644 vendor/touch/src/draw/sprite/Sprite.js create mode 100644 vendor/touch/src/draw/sprite/Text.js diff --git a/apps/common/mobile/resources/sass/_common-settingslist.scss b/apps/common/mobile/resources/sass/_common-settingslist.scss index 47849202f..9046fba59 100644 --- a/apps/common/mobile/resources/sass/_common-settingslist.scss +++ b/apps/common/mobile/resources/sass/_common-settingslist.scss @@ -7,6 +7,10 @@ } &.x-list-round.x-list-grouped { + .x-list-footer-wrap.x-list-item-tpl { + padding-bottom: 0; + } + .x-list-header-wrap { .x-dock-horizontal { padding-top: 0; diff --git a/apps/common/mobile/resources/sass/_common-settingspanel.scss b/apps/common/mobile/resources/sass/_common-settingspanel.scss index dc993155c..026966e4d 100644 --- a/apps/common/mobile/resources/sass/_common-settingspanel.scss +++ b/apps/common/mobile/resources/sass/_common-settingspanel.scss @@ -104,15 +104,15 @@ } .round { - @include border-radius($panel-border-radius); + @include border-radius($form-fieldset-radius); } // Hide group header .x-list-header-wrap { - @include border-top-radius($panel-border-radius !important); + @include border-top-radius($form-fieldset-radius !important); .x-innerhtml { - @include border-top-radius($panel-border-radius !important); + @include border-top-radius($form-fieldset-radius !important); } } diff --git a/apps/documenteditor/mobile/resources/css/application-normal.css b/apps/documenteditor/mobile/resources/css/application-normal.css index 3b0be657c..9fa220e29 100644 --- a/apps/documenteditor/mobile/resources/css/application-normal.css +++ b/apps/documenteditor/mobile/resources/css/application-normal.css @@ -1 +1 @@ -html,body{position:relative;width:100%;height:100%}.x-fullscreen{position:absolute !important}.x-body{position:relative;z-index:0}.x-inner,.x-body{width:100%;height:100%}.x-sized{position:relative}.x-innerhtml{width:100%}.x-layout-box{display:flex;display:-webkit-box;display:-ms-flexbox}.x-layout-box.x-horizontal{-webkit-box-orient:horizontal !important;-ms-flex-direction:row !important;flex-direction:row !important}.x-layout-box.x-horizontal>.x-layout-box-item.x-flexed{min-width:0 !important}.x-layout-box.x-vertical{-webkit-box-orient:vertical !important;-ms-flex-direction:column !important;flex-direction:column !important}.x-layout-box.x-vertical>.x-layout-box-item.x-flexed{min-height:0 !important}.x-layout-box>.x-layout-box-item{display:flex !important;display:-webkit-box !important;display:-ms-flexbox !important}.x-layout-box.x-align-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.x-layout-box.x-align-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.x-layout-box.x-align-end{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.x-layout-box.x-align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.x-layout-box.x-pack-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.x-layout-box.x-pack-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-layout-box.x-pack-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.x-layout-box.x-pack-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.x-layout-box-item.x-sized>.x-inner,.x-layout-box-item.x-sized>.x-body,.x-layout-box-item.x-sized>.x-dock-outer{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-webkit .x-layout-box.x-horizontal>.x-layout-box-item.x-flexed{width:0 !important}.x-webkit .x-layout-box.x-vertical>.x-layout-box-item.x-flexed{height:0 !important}.x-firefox .x-stretched.x-dock-horizontal>.x-dock-body{width:0}.x-firefox .x-stretched.x-dock-vertical>.x-dock-body{height:0}.x-firefox .x-container .x-dock-horizontal.x-unsized .x-dock-body{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px;min-height:0;min-width:0}.x-firefox .x-has-height>.x-dock.x-unsized.x-dock-vertical>.x-dock-body{height:0}.x-layout-card{position:relative;overflow:hidden}.x-layout-card-perspective{-webkit-perspective:1000px;-ms-perspective:1000px;perspective:1000px}.x-layout-card-item-container{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-layout-card-item{position:absolute;top:0;right:0;bottom:0;left:0;position:absolute !important}.x-dock{display:flex;display:-webkit-box;display:-ms-flexbox}.x-dock>.x-dock-body{overflow:hidden}.x-dock.x-sized,.x-dock.x-sized>.x-dock-body>*,.x-dock.x-sized>.x-dock-body>.x-body>.x-inner{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-dock.x-sized>.x-dock-body{position:relative;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-dock.x-unsized,.x-dock.x-stretched{height:100%}.x-dock.x-unsized>.x-dock-body,.x-dock.x-stretched>.x-dock-body{position:relative;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;min-height:0;min-width:0}.x-dock.x-unsized>.x-dock-body>*,.x-dock.x-stretched>.x-dock-body>*{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-dock.x-dock-vertical{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-dock.x-dock-horizontal{-webkit-box-orient:horizontal !important;-ms-flex-direction:row !important;flex-direction:row !important}.x-dock.x-dock-horizontal>.x-dock-item{display:flex;display:-webkit-box;display:-ms-flexbox}.x-dock.x-dock-horizontal>.x-dock-item.x-sized>.x-inner,.x-dock.x-dock-horizontal>.x-dock-item.x-sized>.x-body{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-dock.x-dock-horizontal>.x-dock-item.x-unsized{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-dock.x-dock-horizontal>.x-dock-item.x-unsized>*{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-ie .x-stretched.x-dock-horizontal>.x-dock-body{width:0}.x-ie .x-stretched.x-dock-vertical>.x-dock-body{height:0}.x-ie .x-has-width>.x-dock.x-unsized.x-dock-horizontal>.x-dock-body{width:0}.x-ie .x-has-height>.x-dock.x-unsized.x-dock-vertical>.x-dock-body{height:0}.x-stretched.x-container{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-stretched.x-container>.x-inner,.x-stretched.x-container>.x-body,.x-stretched.x-container>.x-body>.x-inner{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;min-height:0px}.x-layout-fit.x-stretched>.x-layout-fit-item{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-layout-fit{position:relative}.x-layout-fit-item.x-sized{position:absolute;top:0;right:0;bottom:0;left:0}.x-layout-fit-item.x-unsized{width:100%;height:100%}.x-ie .x-stretched>.x-inner,.x-ie .x-stretched>.x-body{min-height:inherit}.x-center,.x-centered{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-center>*,.x-centered>*{position:relative}.x-center>.x-floating,.x-centered>.x-floating{position:relative !important}.x-floating{position:absolute !important}.x-layout-float{overflow:hidden}.x-layout-float>.x-layout-float-item{float:left}.x-layout-float.x-direction-right>.x-layout-float-item{float:right}@-webkit-keyframes x-paint-monitor-helper{from{zoom:1}to{zoom:1}}@keyframes x-paint-monitor-helper{from{zoom:1}to{zoom:1}}.x-paint-monitored{position:relative}.x-paint-monitor{width:0 !important;height:0 !important;visibility:hidden}.x-paint-monitor.cssanimation{-webkit-animation-duration:0.0001ms;-webkit-animation-name:x-paint-monitor-helper;animation-duration:0.0001ms;animation-name:x-paint-monitor-helper}.x-paint-monitor.overflowchange{overflow:hidden}.x-paint-monitor.overflowchange::after{content:'';display:block;width:1px !important;height:1px !important}.x-size-monitored{position:relative}.x-size-monitors{position:absolute;left:0;top:0;width:100%;height:100%;visibility:hidden;overflow:hidden}.x-size-monitors>*{width:100%;height:100%;overflow:hidden}.x-size-monitors.scroll>*.shrink::after{content:'';display:block;width:200%;height:200%;min-width:1px;min-height:1px}.x-size-monitors.scroll>*.expand::after{content:'';display:block;width:100000px;height:100000px}.x-size-monitors.overflowchanged>*.shrink>*{width:100%;height:100%}.x-size-monitors.overflowchanged>*.expand>*{width:200%;height:200%}.x-size-change-detector{visibility:hidden;position:absolute;left:0;top:0;z-index:-1;width:100%;height:100%;overflow:hidden}.x-size-change-detector>*{visibility:hidden}.x-size-change-detector-shrink>*{width:200%;height:200%}.x-size-change-detector-expand>*{width:100000px;height:100000px}.x-translatable{position:absolute !important;top:500000px !important;left:500000px !important;overflow:visible !important;z-index:1}.x-translatable-hboxfix{position:absolute;min-width:100%;top:0;left:0}.x-translatable-hboxfix>.x-translatable{position:relative !important}.x-translatable-container{overflow:hidden;width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-translatable-container::before{content:'';display:block;width:1000000px;height:1000000px;visibility:hidden}.x-button{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#eee;border:1px solid #ccc;position:relative;overflow:hidden;z-index:1}.x-button .x-button-icon{position:relative;background-repeat:no-repeat;background-position:center}.x-button .x-button-icon.x-shown{display:block}.x-button .x-button-icon.x-hidden{display:none}.x-iconalign-left,.x-icon-align-right{-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.x-iconalign-top,.x-iconalign-bottom{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-iconalign-bottom,.x-iconalign-right{-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.x-iconalign-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-button-label,.x-badge,.x-hasbadge .x-badge{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center;white-space:nowrap;text-overflow:ellipsis;text-align:center;display:block;overflow:hidden}.x-badge{background-color:#ccc;border:1px solid #aaa;z-index:2;position:absolute !important;width:auto;font-size:.6em;right:0;top:0;max-width:95%;display:inline-block}html,body{font-family:"Helvetica Neue", HelveticaNeue, "Helvetica-Neue", Helvetica, "BBAlpha Sans", sans-serif;font-weight:normal;-webkit-text-size-adjust:none;margin:0;cursor:default}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}li{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}q:before,q:after{content:''}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{vertical-align:text-bottom}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit}*:focus{outline:none}body.x-desktop{overflow:hidden}@-ms-viewport{width:device-width}*,*:after,*:before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-user-drag:none;-webkit-user-select:none;-ms-user-select:none;-ms-touch-action:none;-moz-user-select:-moz-none}input,textarea{-webkit-user-select:text;-ms-user-select:auto;-moz-user-select:text}.x-hidden-visibility{visibility:hidden !important}.x-hidden-display,.x-field-hidden{display:none !important}.x-hidden-offsets{position:absolute !important;left:-10000em;top:-10000em;visibility:hidden}.x-html{-webkit-user-select:auto;-webkit-touch-callout:inherit;-ms-user-select:auto;line-height:1.5;color:#333;font-size:.8em;padding:1.2em}.x-html body{line-height:1.5;font-family:"Helvetica Neue",Arial,Helvetica,sans-serif;color:#333;font-size:75%}.x-html h1,.x-html h2,.x-html h3,.x-html h4,.x-html h5,.x-html h6{font-weight:normal;color:#222}.x-html h1 img,.x-html h2 img,.x-html h3 img,.x-html h4 img,.x-html h5 img,.x-html h6 img{margin:0}.x-html h1{font-size:3em;line-height:1;margin-bottom:0.50em}.x-html h2{font-size:2em;margin-bottom:0.75em}.x-html h3{font-size:1.5em;line-height:1;margin-bottom:1.00em}.x-html h4{font-size:1.2em;line-height:1.25;margin-bottom:1.25em}.x-html h5{font-size:1em;font-weight:bold;margin-bottom:1.50em}.x-html h6{font-size:1em;font-weight:bold}.x-html p{margin:0 0 1.5em}.x-html p .left{float:left;margin:1.5em 1.5em 1.5em 0;padding:0}.x-html p .right{float:right;margin:1.5em 0 1.5em 1.5em;padding:0}.x-html a{text-decoration:underline;color:#06c}.x-html a:visited{color:#004d99}.x-html a:focus{color:#09f}.x-html a:hover{color:#09f}.x-html a:active{color:#bf00ff}.x-html blockquote{margin:1.5em;color:#666;font-style:italic}.x-html strong,.x-html dfn{font-weight:bold}.x-html em,.x-html dfn{font-style:italic}.x-html sup,.x-html sub{line-height:0}.x-html abbr,.x-html acronym{border-bottom:1px dotted #666666}.x-html address{margin:0 0 1.5em;font-style:italic}.x-html del{color:#666}.x-html pre{margin:1.5em 0;white-space:pre}.x-html pre,.x-html code,.x-html tt{font:1em "andale mono","lucida console",monospace;line-height:1.5}.x-html li ul,.x-html li ol{margin:0}.x-html ul,.x-html ol{margin:0 1.5em 1.5em 0;padding-left:1.5em}.x-html ul{list-style-type:disc}.x-html ol{list-style-type:decimal}.x-html dl{margin:0 0 1.5em 0}.x-html dl dt{font-weight:bold}.x-html dd{margin-left:1.5em}.x-html table{margin-bottom:1.4em;width:100%}.x-html th{font-weight:bold}.x-html thead th{background:#c3d9ff}.x-html th,.x-html td,.x-html caption{padding:4px 10px 4px 5px}.x-html table.striped tr:nth-child(even) td,.x-html table tr.even td{background:#e5ecf9}.x-html tfoot{font-style:italic}.x-html caption{background:#eee}.x-html .quiet{color:#666}.x-html .loud{color:#111}.x-html ul li{list-style-type:circle}.x-html ol li{list-style-type:decimal}@-webkit-keyframes x-loading-spinner-rotate{0%{-webkit-transform:rotate(0deg)}8.32%{-webkit-transform:rotate(0deg)}8.33%{-webkit-transform:rotate(30deg)}16.65%{-webkit-transform:rotate(30deg)}16.66%{-webkit-transform:rotate(60deg)}24.99%{-webkit-transform:rotate(60deg)}25%{-webkit-transform:rotate(90deg)}33.32%{-webkit-transform:rotate(90deg)}33.33%{-webkit-transform:rotate(120deg)}41.65%{-webkit-transform:rotate(120deg)}41.66%{-webkit-transform:rotate(150deg)}49.99%{-webkit-transform:rotate(150deg)}50%{-webkit-transform:rotate(180deg)}58.32%{-webkit-transform:rotate(180deg)}58.33%{-webkit-transform:rotate(210deg)}66.65%{-webkit-transform:rotate(210deg)}66.66%{-webkit-transform:rotate(240deg)}74.99%{-webkit-transform:rotate(240deg)}75%{-webkit-transform:rotate(270deg)}83.32%{-webkit-transform:rotate(270deg)}83.33%{-webkit-transform:rotate(300deg)}91.65%{-webkit-transform:rotate(300deg)}91.66%{-webkit-transform:rotate(330deg)}100%{-webkit-transform:rotate(330deg)}}@keyframes x-loading-spinner-rotate{0%{-ms-transform:rotate(0deg);transform:rotate(0deg)}8.32%{-ms-transform:rotate(0deg);transform:rotate(0deg)}8.33%{-ms-transform:rotate(30deg);transform:rotate(30deg)}16.65%{-ms-transform:rotate(30deg);transform:rotate(30deg)}16.66%{-ms-transform:rotate(60deg);transform:rotate(60deg)}24.99%{-ms-transform:rotate(60deg);transform:rotate(60deg)}25%{-ms-transform:rotate(90deg);transform:rotate(90deg)}33.32%{-ms-transform:rotate(90deg);transform:rotate(90deg)}33.33%{-ms-transform:rotate(120deg);transform:rotate(120deg)}41.65%{-ms-transform:rotate(120deg);transform:rotate(120deg)}41.66%{-ms-transform:rotate(150deg);transform:rotate(150deg)}49.99%{-ms-transform:rotate(150deg);transform:rotate(150deg)}50%{-ms-transform:rotate(180deg);transform:rotate(180deg)}58.32%{-ms-transform:rotate(180deg);transform:rotate(180deg)}58.33%{-ms-transform:rotate(210deg);transform:rotate(210deg)}66.65%{-ms-transform:rotate(210deg);transform:rotate(210deg)}66.66%{-ms-transform:rotate(240deg);transform:rotate(240deg)}74.99%{-ms-transform:rotate(240deg);transform:rotate(240deg)}75%{-ms-transform:rotate(270deg);transform:rotate(270deg)}83.32%{-ms-transform:rotate(270deg);transform:rotate(270deg)}83.33%{-ms-transform:rotate(300deg);transform:rotate(300deg)}91.65%{-ms-transform:rotate(300deg);transform:rotate(300deg)}91.66%{-ms-transform:rotate(330deg);transform:rotate(330deg)}100%{-ms-transform:rotate(330deg);transform:rotate(330deg)}}@font-face{font-family:"Pictos";src:url('data:application/font-woff;base64,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') format('woff'),url('data:font/truetype;base64,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AQIFAw4BAQQCCAEBBAIBAQMDAgYGAgECAgEBAQICAQ0DAQICBQEMBwIFAgICBgMCBQQCBAQMAQMBAQEBBAUBAwkBAwEBAgEDAgIBBAICBgECBgMCBQIGCAUFAQUIAQMFAQELAQEGAQIDAQEBBAEBAQMCBgIEAwQGAgQHAgMDAQIGAQIBAQICAQQBBQECGwQCAQUDAQIDAgcFCAMBBgMEAwQEBAMDAQIDAwUCAgEIBgIKAQ0EBAIGAwQMAwELAQcJCAIDAgYDAQcBBwYDBAYCAgUBAwEBCwcIAgEKIceMUo4vBwIDBQUBBAIKAgEBAQMBAQMCBQIDAgJFAhkBAgEBBwQHAgoBAQUCAwMDAQIJAQUClAEFBQsCCAEDBAcBBAUBAwMBAScCBgEDAwIEAQIBBQEHAgMCAgMMBAMBAQIHARYCAgMEBQQCAgEBBAEBAwYBAwOgAQPKAgMBAQMCAQUCAQEWAgcCBQFxBgoGBQEDAgICCQEJAQ4EAgEBAQQCAgECBAECAQEBAQ8HARMPAgECAQUEAQMFAQIBAQQBBAQGBgMDCwENCgoBBwoDCQQIBAQDAwQEAgECAQIDAgEDAwQCBAEEAQIEAQMDAwUJAQgNAQMICAoQBgIICQYBAgICAQUCBQYGAQUBAgoDAQH+YwMEAgEBEQQHAgMBAggEBQUGIwICAQENAQcBBwIBCAIfBAUGAgEBJgMEAgIBARABAQF9AgICuvb+pPb2AVwzAwMFAggECwIBBAIECQIBAgECBgECAgIEBwECAQMEAgX+wFprEwkCCQIBAwgEBAMHAgQBBAEHAQMDBQoEAQMEAQIBAQIIAgEEAgYCAgMFAQcEDAUMDgIKAQsECQQBAgkBCQICAQEBAQIDAgwDAQQDBAcBAQEKAQQKAQIBBwQCBgkBBQEFAQECAwYDDAMEAgcBAgIBAQESAgMEAwEBAQQJAQgKAQICAQQDBgIEBgYBBAYFAQIBAgECAQIGBAgBAwMCAgEDAQsDAgYCAwoCAgcEAQIGBQ0IBAMCAgIBAQIIBAICCQIEAgECBQQCAQM4QFsBAwEGAgcCBgIBAQICBAEBAQIBAQECAQICAQIDBAMCBAMKBwEKAQoDAQICCwICAQQCBQEBAQEBCwIHBAECAQEBAQIPCAQBAgMEBgoCAQUDAQICAgYGAgQFAgEJAwECAQ0DAQMCBgQBCQMC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') format('truetype'),url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiID4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8bWV0YWRhdGE+ClRoaXMgaXMgYSBjdXN0b20gU1ZHIHdlYmZvbnQgZ2VuZXJhdGVkIGJ5IEZvbnQgU3F1aXJyZWwuCkRlc2lnbmVyICAgIDogRHJldyBXaWxzb24KRm91bmRyeSAgICAgOiBEcmV3IFdpbHNvbgpGb3VuZHJ5IFVSTCA6IGh0dHBwaWN0b3NkcmV3d2lsc29uY29tCjwvbWV0YWRhdGE+CjxkZWZzPgo8Zm9udCBpZD0id2ViZm9udEl5Zlpic2VGIiBob3Jpei1hZHYteD0iOTIwIiA+Cjxmb250LWZhY2UgdW5pdHMtcGVyLWVtPSIxMDAwIiBhc2NlbnQ9Ijc1MCIgZGVzY2VudD0iLTI1MCIgLz4KPG1pc3NpbmctZ2x5cGggaG9yaXotYWR2LXg9IjUwMCIgLz4KPGdseXBoIHVuaWNvZGU9IiAiICBob3Jpei1hZHYteD0iNTAwIiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4MDk7IiBob3Jpei1hZHYteD0iNTAwIiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4YTA7IiBob3Jpei1hZHYteD0iNTAwIiAvPgo8Z2x5cGggdW5pY29kZT0iISIgaG9yaXotYWR2LXg9IjkzNiIgZD0iTTg2NSAxMDNxMzcgLTYyIDExIC0xMDYuNXQtOTggLTQ0LjVoLTYyMXEtNzIgMCAtOTcuNSA0NC41dDExLjUgMTA2LjVsMzEwIDUzNHEzNiA2MiA4Ny41IDYydDg3LjUgLTYyek00NzEgNDZxMjMgMCAzOC41IDE2dDE1LjUgMzh0LTE1LjUgMzcuNXQtMzguNSAxNS41cS0yMiAwIC0zNy41IC0xNS41dC0xNS41IC0zNy41dDE1LjUgLTM4dDM3LjUgLTE2ek01MDkgMTg3bDI2IDMwOGgtMTI3bDI2IC0zMDhoNzV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4MjI7IiBob3Jpei1hZHYteD0iODY1IiBkPSJNNTIgMjg5cTEgNjUgNy41IDExNXQyNi41IDEwMS41dDUzLjUgODYuNXQ5MC41IDU4LjV0MTM1IDI4LjV2LTE1N3EtNjYgMCAtOTUgLTQ2LjV0LTI5IC0xNDcuNWwtNCAtMWg4NHExOCAwIDMxIC0xM3QxMyAtMzJ2LTI1OHEwIC0xOCAtMTMgLTMxdC0zMSAtMTNoLTIyNXEtMTggMCAtMzEgMTN0LTEzIDMxdjI1OHY3ek00OTMgMjg5cTAgNjUgNyAxMTV0MjcgMTAxLjV0NTMuNSA4Ni41dDkwLjUgNTguNXQxMzUgMjguNXYtMTU3IHEtNjcgMCAtOTYgLTQ2LjV0LTI5IC0xNDcuNWwtNCAtMWg4NHExOCAwIDMxIC0xM3QxMyAtMzJ2LTI1OHEwIC0xOCAtMTMgLTMxdC0zMSAtMTNoLTIyNHEtMTkgMCAtMzIgMTN0LTEzIDMxdjI1OHEwIDUgMSA3eiIgLz4KPGdseXBoIHVuaWNvZGU9IiMiIGhvcml6LWFkdi14PSI3NDgiIGQ9Ik03MDUgNDgycTkgLTE0IC04IC0xNGgtNDh2LTU2N3EwIC03IC01IC0xMnQtMTIgLTVoLTUxM3EtNyAwIC0xMiA1dC01IDEydjU2N2gtNTJxLTcgMCAtOS41IDR0MS41IDEwbDMxIDQ2cTkgMTQgMjcgMTRoNzV2NjZxMCAyMCAxMiAzMGw0OCA0OXExMiAxMiAzMCAxMmgyMTZxMTggMCAzMCAtMTJsNTIgLTUycTEzIC0xMyAxMyAtMzB2LTYzaDcxcTE4IDAgMjcgLTE0ek0yNDggNTQ2di00aDI1NHY0djI4cTAgMjAgLTEyIDMwbC05IDEwIHEtMTIgMTIgLTMwIDEyaC0xNTVxLTE4IDAgLTMwIC0xMmwtNiAtNnEtMTIgLTEyIC0xMiAtMzB2LTMyek01NzYgNDUwcTAgMTYgLTE2IDE4aC0yNzloLTg5cS03IDAgLTEyIC01LjV0LTUgLTEyLjV2LTQ3NnEwIC03IDUgLTEydDEyIC01aDM2N3E3IDAgMTIgNXQ1IDEydjQ3NnpNMjYzIDQxOHE3IDAgMTIuNSAtNXQ1LjUgLTEydi0zNzlxMCAtNyAtNS41IC0xMnQtMTIuNSAtNWgtMjFxLTcgMCAtMTIuNSA1dC01LjUgMTJ2Mzc5cTAgNyA1LjUgMTIgdDEyLjUgNWgyMXpNMzY0IDVxLTcgMCAtMTIuNSA1dC01LjUgMTJ2Mzc5cTAgNyA1LjUgMTJ0MTIuNSA1aDIxcTcgMCAxMiAtNXQ1IC0xMnYtMzc5cTAgLTcgLTUgLTEydC0xMiAtNWgtMjF6TTQ4NSA1cS03IDAgLTEyIDV0LTUgMTJ2Mzc5cTAgNyA1IDEydDEyIDVoMjJxNyAwIDEyIC01dDUgLTEydi0zNzlxMCAtNyAtNSAtMTJ0LTEyIC01aC0yMnoiIC8+CjxnbHlwaCB1bmljb2RlPSIkIiBob3Jpei1hZHYteD0iODkzIiBkPSJNNTAzIDI4M2gtMTA4bC0xNiA2OGgxMjR2LTY4ek02ODQgMzUxbC0xOCAtNjhoLTEwNGwxIDY4aDEyMXpNNDAwIDExOHEyOCAwIDQ4LjUgLTIwdDIwLjUgLTQ5dC0yMC41IC00OXQtNDguNSAtMjB0LTQ4LjUgMjB0LTIwLjUgNDl0MjAuNSA0OXQ0OC41IDIwek02NTkgMTE4cTI5IDAgNDkgLTIwdDIwIC00OXQtMjAgLTQ5dC00OSAtMjB0LTQ5IDIwdC0yMCA0OXQyMCA0OXQ0OSAyMHpNODMzIDUxNnEyNSAtNyAyNSAtMzNxMCAtMyAtMiAtOSBsLTg4IC0yOTNxLTcgLTI1IC0zMiAtMjVoLTQxN3EtMTIgMCAtMjEuNSA3LjV0LTExLjUgMTguNWwtODEgMzI3aC0xNDlxLTE0IDAgLTI0IDEwdC0xMCAyNHQxMCAyNHQyNCAxMGgxNzZxMjYgMCAzMyAtMjZsMTggLTczaDUwM2w1IDE1cTYgMjQgMzIgMjRxNyAwIDEwIC0xek03MTIgMjMxbDU0IDE3OWgtNDY2bDQ1IC0xODZoMzY1eiIgLz4KPGdseXBoIHVuaWNvZGU9IiUiIGhvcml6LWFkdi14PSI5MDMiIGQ9Ik04NjcgMjc3cTAgLTc5IC0zNy41IC0xNDl0LTEwMi41IC0xMTdsMTEgLTk2di00cTAgLTE3IC0xMSAtMzBxLTEzIC0xNSAtMzQgLTE1aC0xNDhxLTIxIDAgLTM0IDE1cS0xMSAxMyAtMTEgMzB2NWwyIDE4cS02IC0xIC0xOCAtMWgtMTBsMiAtMTd2LTVxMCAtMTcgLTExIC0zMHEtMTIgLTE1IC0zNCAtMTVoLTE0OHEtMjEgMCAtMzQgMTVxLTExIDEzIC0xMSAzMHY1bDExIDkwcS04NiA2MCAtMTI0IDE1M2wtNDQgLTRoLTRxLTE4IDAgLTMwIDEyIHEtMTUgMTIgLTE1IDMzdjE1MnEwIDIxIDE1IDMzcTEyIDEyIDMwIDEyaDRsNDMgLTRxMzQgODUgMTA3IDE0MWwtMiAxMTB2MXYxcTAgMjggMjUgNDNxMTEgNyAyNiA3cTE0IDAgMjUgLTdsMTI4IC03MnEyNSAzIDUxIDNxMTYwIDAgMjcwIC05OXExMTMgLTEwMCAxMTMgLTI0NHpNNjgxIDQ3cTYxIDQxIDk1LjUgMTAxdDM0LjUgMTI5cTAgMTE4IC05NCAyMDJxLTk2IDg1IC0yMzMgODVxLTI5IDAgLTUzIC00bC05IC0xbC0xMzYgNzdsMiAtMTMwIGwtMTIgLThxLTc5IC01NyAtMTA2IC0xNDRsLTcgLTIybC03NSA3di0xMjdsNzUgOGw3IC0yMnEzMyAtOTYgMTI0IC0xNTVsMTUgLTlsLTEzIC0xMTJoMTIzbC05IDc0bDM1IC00cTEzIC0yIDM5IC0ycTI0IDAgNDcgM2wzNiA0bC05IC03NWgxMjNsLTE1IDExNnpNNTAxIDUyMWw3IC0xcTcgMCAxOCAtMnQyNiAtNXQzMiAtOXQzNSAtMTR0MzcgLTIwLjV0MzYgLTI4LjVxOCAtNyA4IC0xOXQtOCAtMjBxLTggLTkgLTIwIC05cS0xMSAwIC0xOSA4IHEtMjQgMjMgLTU5IDM4LjV0LTU1LjUgMTkuNXQtMzUuNSA1aC00cS0xMSAxIC0xOSA5LjV0LTggMTkuNXExIDEyIDkuNSAyMHQxOS41IDh6TTIzMSAzODRxMTkgMjAgNDEgMjZ0MzQgLTVxMTEgLTExIDYuNSAtMzN0LTIzLjUgLTQydC00MC41IC0yNnQtMzMuNSA1dC03IDMzdDIzIDQyeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeDI2OyIgaG9yaXotYWR2LXg9IjczMiIgZD0iTTQ2NSA0MDVoMjUwdi0xOThoLTI1MHYtMjUwaC0xOTh2MjUwaC0yNTB2MTk4aDI1MHYyNTBoMTk4di0yNTB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJyIgaG9yaXotYWR2LXg9IjkwOCIgZD0iTTI2NSAxMzlxNzggNzggMTg4LjUgNzh0MTg4LjUgLTc4cTEgMCAxIC0xbC01NSAtNTVxLTEgMCAtMSAxcS01NSA1NSAtMTMzIDU1dC0xMzMgLTU1ek0xNDAgMjY0cTg1IDg1IDE5OS41IDExNS41dDIyOC41IDB0MTk5IC0xMTUuNWwxIC0xbC01NiAtNTZxMCAxIC0xIDFxLTEwNiAxMDYgLTI1Ny41IDEwNi41dC0yNTcuNSAtMTA1LjV6TTg5MyAzOTJxMCAtMiAyIC0ybC01NiAtNTZsLTIgMnEtMTA0IDEwNCAtMjQ0IDE0MXQtMjc5LjUgMCB0LTI0My41IC0xNDFxLTEgMCAtMSAtMWwtNTYgNTZsMSAxcTEyMCAxMTkgMjgwIDE2MS41dDMxOS41IDB0Mjc5LjUgLTE2MS41ek0zOTIgMTNxMjYgMjUgNjMgMjV0NjMgLTI1bC02MyAtNjN6IiAvPgo8Z2x5cGggdW5pY29kZT0iKCIgaG9yaXotYWR2LXg9IjY3MSIgZD0iTTU1MCAzNTloNzd2LTQzN2gtNTgydjQzN2g3NXYxMjhxMCA4NyA2MiAxNDl0MTQ5IDYyaDRoNHE4OCAwIDE0OS41IC02MnQ2MS41IC0xNDl2LTEyOHpNNDAyIDJsLTMyIDE0MXEzMiAyMCAzMiA1N3EwIDI4IC0xOSA0N3QtNDcgMTlxLTI3IDAgLTQ2LjUgLTE5dC0xOS41IC00N3EwIC0zOCAzMyAtNTZsLTMzIC0xNDJoMTMyek00NDUgMzU5djEyOHEwIDQzIC0zMSA3NHQtNzUgMzFoLTNoLTVxLTQzIDAgLTc0IC0zMXQtMzEgLTc0di0xMjggaDIxOXoiIC8+CjxnbHlwaCB1bmljb2RlPSIpIiBob3Jpei1hZHYteD0iODg5IiBkPSJNNjQ1IDY5OHE4OCAwIDE1MCAtNjEuNXQ2MiAtMTQ5LjV2LTEyOGgtMTA2djI5bDM2IDM0djEzaC0zNnY1MnEwIDQ0IC0zMSA3NC41dC03NSAzMC41aC0yaC01cS00NCAwIC03NSAtMzAuNXQtMzEgLTc0LjV2LTEyOGg3N3YtNDM4aC01ODR2NDM4aDQwMXYxMjhxMCA4OCA2MiAxNDkuNXQxNTAgNjEuNWgzaDR6TTM4MiAwbC0zMyAxNDJxMzMgMjAgMzMgNTdxMCAyOCAtMTkuNSA0Ny41dC00Ni41IDE5LjVxLTI4IDAgLTQ3LjUgLTE5LjUgdC0xOS41IC00Ny41cTAgLTM3IDMzIC01N2wtMzMgLTE0MmgxMzN6IiAvPgo8Z2x5cGggdW5pY29kZT0iKiIgaG9yaXotYWR2LXg9Ijc3NyIgZD0iTTczNyA0OTBsLTE5NSAtMTk1bDE5NSAtMTk2bC0xNTQgLTE1M2wtMTk1IDE5NWwtMTk1IC0xOTVsLTE1NCAxNTNsMTk1IDE5NmwtMTk1IDE5NWwxNTQgMTU0bDE5NSAtMTk1bDE5NSAxOTV6IiAvPgo8Z2x5cGggdW5pY29kZT0iKyIgZD0iTTQ2MCA3MDJxMTc0IDAgMjk3IC0xMjN0MTIzIC0yOTd0LTEyMyAtMjk3dC0yOTcgLTEyM3QtMjk3IDEyM3QtMTIzIDI5N3QxMjMgMjk3dDI5NyAxMjN6TTcwOSAyNjJ2NDFxMCAxNSAtMTAuNSAyNS41dC0yNS41IDEwLjVoLTEyMXEtMTUgMCAtMjUuNSAxMXQtMTAuNSAyNnYxMjFxMCAxNSAtMTEgMjUuNXQtMjYgMTAuNWgtNDFxLTE1IDAgLTI1LjUgLTEwLjV0LTEwLjUgLTI1LjV2LTEyMXEwIC0xNSAtMTEgLTI2dC0yNiAtMTFoLTEyMCBxLTE2IDAgLTI2LjUgLTEwLjV0LTEwLjUgLTI1LjV2LTQxcTAgLTE1IDEwLjUgLTI2dDI2LjUgLTExaDEyMHExNSAwIDI2IC0xMC41dDExIC0yNS41di0xMjFxMCAtMTUgMTAuNSAtMjUuNXQyNS41IC0xMC41aDQxcTE1IDAgMjYgMTAuNXQxMSAyNS41djEyMXEwIDE1IDEwLjUgMjUuNXQyNS41IDEwLjVoMTIxcTE1IDAgMjUuNSAxMXQxMC41IDI2eiIgLz4KPGdseXBoIHVuaWNvZGU9IiwiIGhvcml6LWFkdi14PSI5MTUiIGQ9Ik00NTggNzAxcTE3MyAwIDI5NSAtMTIyLjV0MTIyIC0yOTUuNXEwIC0xMDQgLTQ2IC0xOTFxLTU5IC0xMTUgLTE3MiAtMTc2cS05NCAtNTEgLTE5OSAtNTFxLTEwMSAwIC0xOTQgNDhxLTExNCA2MCAtMTc1IDE3M3EtNDkgOTMgLTQ5IDE5N3EwIDE3MyAxMjIuNSAyOTUuNXQyOTUuNSAxMjIuNXpNNzYwIDIwM3ExMSA0MSAxMSA4MHEwIDEzMCAtOTIgMjIydC0yMjEgOTJxLTEzMCAwIC0yMjIgLTkydC05MiAtMjIycTAgLTM5IDEyIC04NSBxMyAtOSA5IC0yNXEyMSA2IDQ1IDZxNjUgMCAxMTEuNSAtNDZ0NDYuNSAtMTExcTAgLTE3IC01IC0zN3E0IC0yIDEyIC00cTQyIC0xMSA4MyAtMTFxNDUgMCA4NyAxMnEyIDAgNS41IDJ0NS41IDJxLTUgMjIgLTUgNDBxMCA2NCA0Ni41IDExMC41dDExMC41IDQ2LjVxMjMgMCA0NCAtNnE1IDE1IDggMjZ6TTQ5OCAzMzNxMjUgLTE5IDI1IC01MHEwIC0xNCAtNSAtMjRxLTE2IC0zOSAtNTggLTM5cS0xMSAwIC0yNCA1cS0zOSAxNiAtMzkgNTggcTAgMSAwLjUgNHQwLjUgNWwtNTYgMjQ1bDIxIDl6TTQ3OCA1NjV2LTk1aC0zOXY5NWgzOXpNNjMyIDQ5MGwyNyAtMjdsLTY4IC02OGwtMjcgMjh6TTYyOSAzMDB2MzhoOTZ2LTM4aC05NnpNMTkyIDMwMHYzOGg5NXYtMzhoLTk1ek0yNDQgNDYzbDI4IDI3bDY3IC02N2wtMjcgLTI4eiIgLz4KPGdseXBoIHVuaWNvZGU9Ii0iIGhvcml6LWFkdi14PSI5MjEiIGQ9Ik00NjEgNjk4cTE3NCAwIDI5NyAtMTIzLjV0MTIzIC0yOTcuNXQtMTIzIC0yOTcuNXQtMjk3IC0xMjMuNXEtMTc1IDAgLTI5OCAxMjMuNXQtMTIzIDI5Ny41dDEyMyAyOTcuNXQyOTggMTIzLjV6TTY5NCAyNTh2MzlxMCAxOSAtMTQgMzN0LTMzIDE0aC0zNzZxLTE5IDAgLTMzIC0xNHQtMTQgLTMzdi0zOXEwIC0yMCAxNCAtMzMuNXQzMyAtMTMuNWgzNzZxMTkgMCAzMyAxMy41dDE0IDMzLjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iLiIgaG9yaXotYWR2LXg9Ijk0NSIgZD0iTTE0NyAzOTJxMzcgMCA2NCAtMjd0MjcgLTY0cTAgLTM4IC0yNi41IC02NXQtNjQuNSAtMjd0LTY1IDI3dC0yNyA2NXQyNyA2NC41dDY1IDI2LjV6TTQ3MiAzOTJxMzggMCA2NSAtMjYuNXQyNyAtNjQuNXQtMjcgLTY1dC02NSAtMjd0LTY0LjUgMjd0LTI2LjUgNjVxMCAzNyAyNi41IDY0dDY0LjUgMjd6TTc5OCAzOTJxMzggMCA2NSAtMjYuNXQyNyAtNjQuNXQtMjcgLTY1dC02NSAtMjd0LTY1IDI3dC0yNyA2NXEwIDM3IDI3IDY0dDY1IDI3eiAiIC8+CjxnbHlwaCB1bmljb2RlPSIvIiBob3Jpei1hZHYteD0iOTEyIiBkPSJNNjkzIDUzN2gxODF2LTEyN3YtMzAxaC0xODF2LTUzbC0xMzYgLTEzNmgtMzM2djE4OWgtMTgxdjMwMXYxMjdoMTgxdjE2M2g0NzJ2LTE2M3pNODE2IDQ4MGgtMTA1di01M2gxMDV2NTN6TTI3NSA2NDZ2LTEwOWgzNjR2MTA5aC0zNjR6TTUwMiAtMjZ2MTM2aDEzN3YxMzF2NTVoNTR2LTEyOWg2N3YxOTdoLTYwNHYtMTk3aDY1djExMXYxOGg1NHYtNTV2LTI2N2gyMjd6IiAvPgo8Z2x5cGggdW5pY29kZT0iMCIgaG9yaXotYWR2LXg9Ijg4OSIgZD0iTTY0MyAxNjFsMzkgLTQwbDI4IC0yN3EtNDcgLTYwIC0xMTYuNSAtOTQuNXQtMTQ4LjUgLTM0LjVxLTE0MCAwIC0yMzguNSA5OHQtOTkuNSAyMzhoLTExaC0yaC02N2wxMjYgMTI2bDEyNyAtMTI2aC01MWgtMjhxMCAtMTAwIDcxLjUgLTE3MXQxNzIuNSAtNzFxNjAgMCAxMTIuNSAyNy41dDg1LjUgNzQuNXpNODEwIDMwMWg1MmwtMTI3IC0xMjZsLTEyNiAxMjZoNTBoMzB2MnEwIDEwMSAtNzEuNSAxNzIuNXQtMTcyLjUgNzEuNSBxLTYxIDAgLTExMy41IC0yOC41dC04Ni41IC03Ni41bC0zOSAzOWwtMjggMjhxNDcgNjEgMTE2LjUgOTZ0MTUwLjUgMzVxMTM5IDAgMjM4IC05OXQ5OSAtMjM4di0yaDI4eiIgLz4KPGdseXBoIHVuaWNvZGU9IjEiIGhvcml6LWFkdi14PSI3NDMiIGQ9Ik02ODggMjM1aDI5di0zMHEwIC0xNDMgLTEwMC41IC0yNDMuNXQtMjQzLjUgLTEwMC41dC0yNDQgMTAxdC0xMDEgMjQzcTAgMTQzIDEwMSAyNDR0MjQ0IDEwMXExNiAwIDI1IC0xdjc5djcxbDQ5IC01MGwxNTcgLTE1N2wyMSAtMjFsLTIxIC0yMGwtMTU3IC0xNTdsLTQ5IC01MHY3MHY4OHEtMTggMiAtMjUgMnEtODMgMCAtMTQxIC01OHQtNTggLTE0MXEwIC04MiA1OC41IC0xNDB0MTQwLjUgLTU4dDE0MCA1OHQ1OCAxNDB2MzBoMzBoODd6ICIgLz4KPGdseXBoIHVuaWNvZGU9IjIiIGhvcml6LWFkdi14PSI5MTkiIGQ9Ik00NTkgNzAxcTE3NCAwIDI5NyAtMTIzdDEyMyAtMjk3dC0xMjMgLTI5N3QtMjk3IC0xMjNxLTE3MyAwIC0yOTYgMTIzdC0xMjMgMjk3dDEyMyAyOTd0Mjk2IDEyM3pNNzI4IDM5MnE2IDYgNiAxNXQtNiAxNmwtNTUgNTRxLTYgNiAtMTUgNnQtMTYgLTZsLTI0MyAtMjQ0cS0xNSAtMTYgLTMxIDBsLTg4IDg4cS0xNiAxNiAtMzEgMGwtNTUgLTU0cS02IC03IC02IC0xNnQ2IC0xNWwxMzkgLTE0MHExNSAtMTUgMzcgLTE1aDI2cTIwIDAgMzcgMTV6ICIgLz4KPGdseXBoIHVuaWNvZGU9IjMiIGhvcml6LWFkdi14PSI4NjgiIGQ9Ik0yMiAyMzlxLTEwIDEwIC0xMCAyNHQxMCAyNGw4MyA4M3ExMCAxMCAyMy41IDEwdDIzLjUgLTEwbDEzNiAtMTM1cTEwIC0xMCAyMy41IC0xMHQyMy41IDEwbDM3MSAzNzJxMTAgMTAgMjMuNSAxMHQyMy41IC0xMGw4MyAtODJxMTAgLTEwIDEwIC0yMy41dC0xMCAtMjMuNWwtNDUwIC00NTFxLTI0IC0yNCAtNTcgLTI0aC0zOXEtMzIgMCAtNTYgMjR6IiAvPgo8Z2x5cGggdW5pY29kZT0iNCIgaG9yaXotYWR2LXg9Ijc2MiIgZD0iTTU5IDcwMGw3MDIgLTM1MWwtNzAyIC0zNTB2NzAxeiIgLz4KPGdseXBoIHVuaWNvZGU9IjUiIGhvcml6LWFkdi14PSI4MTYiIGQ9Ik01OSAxdjY5OGgyNjJ2LTY5OGgtMjYyek00OTUgNjk5aDI2MnYtNjk4aC0yNjJ2Njk4eiIgLz4KPGdseXBoIHVuaWNvZGU9IjYiIGhvcml6LWFkdi14PSI4MTciIGQ9Ik03NTggMmgtNjk5djY5OGg2OTl2LTY5OHoiIC8+CjxnbHlwaCB1bmljb2RlPSI3IiBob3Jpei1hZHYteD0iOTIyIiBkPSJNNDIzIDQxN3YxODJsNDg1IC0yNDNsLTQ4NSAtMjQydjE4MWwtMzY0IC0xODF2NDg1eiIgLz4KPGdseXBoIHVuaWNvZGU9IjgiIGhvcml6LWFkdi14PSI5MjIiIGQ9Ik01MDAgMjk1di0xODJsLTQ4NiAyNDNsNDg2IDI0MnYtMTgybDM2MyAxODJ2LTQ4NXoiIC8+CjxnbHlwaCB1bmljb2RlPSI5IiBkPSJNNDYwIDcwMHExNzQgMCAyOTcgLTEyM3QxMjMgLTI5N3QtMTIzIC0yOTd0LTI5NyAtMTIzdC0yOTcgMTIzdC0xMjMgMjk3dDEyMyAyOTd0Mjk3IDEyM3pNMjk4IDY0bDQzMSAyMTZsLTQzMSAyMTZ2LTQzMnoiIC8+CjxnbHlwaCB1bmljb2RlPSI6IiBob3Jpei1hZHYteD0iODAxIiBkPSJNNjcxIDEwMGwxMDUgLTEwMnEwIC0xNiAtMTIgLTI4LjV0LTI5IC0xMi41aC0yNDJxMSAtNCAxIC0xMnEwIC0zOSAtMjcuNSAtNjYuNXQtNjYuNSAtMjcuNXQtNjYuNSAyNy41dC0yNy41IDY2LjVxMCAyIDAuNSA2dDAuNSA2aC0yNDFxLTE2IDAgLTI4LjUgMTIuNXQtMTIuNSAyOC41bDEwNSAxMDJxLTEgOCAtMSAyNXYyMDhxMCA4OCA1MC41IDE1OHQxMzAuNSA5OHEtNCAxMSAtNCAyNnEwIDM5IDI3LjUgNjYuNXQ2Ni41IDI3LjUgdDY2LjUgLTI3LjV0MjcuNSAtNjYuNXEwIC0xNCAtMyAtMjZxODAgLTI4IDEzMC41IC05OC41dDUwLjUgLTE1Ny41di0yMDhxMCAtMTcgLTEgLTI1ek0zNDggNjE1cTAgLTUgMiAtMTVxMjggNSA1MCA1cTIzIDAgNTAgLTVxMyA4IDMgMTVxMCAyMiAtMTUuNSAzN3QtMzcuNSAxNXQtMzcgLTE1dC0xNSAtMzd6IiAvPgo8Z2x5cGggdW5pY29kZT0iOyIgaG9yaXotYWR2LXg9Ijg4NyIgZD0iTTI5OSA0MThsLTQyIC00NHEtNCAtNSAtMTEgLTEyLjVsLTEyLjUgLTEzLjVsLTEwLjUgLTExcS0xOCAxNiAtMjcgMjNxLTQ5IDQwIC04MSA0MGgtMTAxdjExMmgxMDFxNTkgLTEgMTE4IC00MXEzMyAtMjEgNjYgLTUzek0zOTkgMTU2bDQ0IDQ3bDMyIDM0cTE2IC0xNCAyNiAtMjJxNTIgLTQyIDg0IC00MGg4NnY5NGwxNzUgLTE0OGwtMTc1IC0xNDZ2ODhoLTg2cS01NiAwIC0xMjAgNDBxLTI3IDE3IC02NiA1M3pNNTgyIDQwMCBxLTIzIDAgLTU2IC0yMnEtMzUgLTIzIC03OCAtNjhxLTE5IC0xOSAtNTQuNSAtNTcuNWwtNjYuNSAtNjkuNXQtNjAgLTU1cS04MCAtNjQgLTE1NCAtNjVoLTk5djExMmg5OXEyNiAwIDU5IDIycTI5IDE4IDc5IDY4cTUgNSA3MyA3Ny41dDEwNyAxMDQuNXE4MSA2NCAxNTIgNjVoODh2OTJsMTc1IC0xNDdsLTE3NSAtMTQ3djkwaC04OGgtMXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3gzYzsiIGhvcml6LWFkdi14PSIzOTUiIGQ9Ik0xMTUgNDEwbDIyMiAyMjN2LTY2OGwtMjIyIDIyMmgtMTEydjIyM2gxMTJ6IiAvPgo8Z2x5cGggdW5pY29kZT0iPSIgaG9yaXotYWR2LXg9Ijk0NyIgZD0iTTg5NiAzNzl2LTE3NmwtNjMgLTI1di0xMDhoLTc3M3Y0NDJoNzczdi0xMDl6TTc2MCAxNDR2Mjk0aC02MjZ2LTI5NGg2MjZ6TTM3MyAzOTBsMjIyIC0xOThoLTQxM3YxOThoMTkxeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeDNlOyIgaG9yaXotYWR2LXg9Ijg4OSIgZD0iTTEyNiA0MDhsMjIyIDIyM3YtNjY4bC0yMjIgMjIyaC0xMTJ2MjIzaDExMnpNNDM0IDQzOHE3NSAtNTAgNzUgLTE0MHQtNzUgLTEzOWwtMzQgNjdxMzUgMjggMzUgNzJ0LTM1IDcydjJ6TTY4MCAyOThxMCAtOTIgLTQ2IC0xNjguNXQtMTIzIC0xMjAuNWwtMzQgNjZxNTkgMzQgOTQgOTMuNXQzNSAxMjkuNXQtMzUgMTI5LjV0LTk0IDkzLjV2MmwzMyA2NXE3NyAtNDQgMTIzLjUgLTEyMS41dDQ2LjUgLTE2OC41ek01ODcgNzM4IHExMTggLTY2IDE4OC41IC0xODN0NzAuNSAtMjU3dC03MC41IC0yNTd0LTE4OC41IC0xODJsLTMzIDY2cTk5IDU2IDE1OC41IDE1NS41dDU5LjUgMjE3LjV0LTU5LjUgMjE3LjV0LTE1OS41IDE1NS41eiIgLz4KPGdseXBoIHVuaWNvZGU9Ij8iIGhvcml6LWFkdi14PSI5MjIiIGQ9Ik00NjEgNzAycTE3NSAwIDI5OCAtMTIzLjV0MTIzIC0yOTcuNXQtMTIzIC0yOTcuNXQtMjk4IC0xMjMuNXEtMTc0IDAgLTI5Ny41IDEyMy41dC0xMjMuNSAyOTcuNXQxMjMuNSAyOTcuNXQyOTcuNSAxMjMuNXpNNDg5IDI5cTE5IDE4IDE5IDQ3dC0xOSA0N3EtMjAgMTcgLTQ5IDE3cS0yOCAwIC00OCAtMTdxLTIwIC0yMCAtMTggLTQ3cS0yIC0yNyAxOCAtNDdxMTkgLTE3IDQ4IC0xN3EzMiAwIDQ5IDE3ek02MDIgMzUxcTEwIDI0IDEwIDYyIHEwIDU4IC00MSA5M3EtMzggMzQgLTEwOCAzNHEtNDkgMCAtODUgLTEycS0zMyAtMTEgLTYzIC0zMWwtOSAtNmw0NiAtODdsMTAgOHEyIDEgMTkgMTFxNyA0IDIzIDEwcTEwIDQgMjMgNnE3IDIgMjEgMnEzMCAwIDM4IC0xMHExMSAtMTEgMTEgLTMxcTAgLTEzIC03IC0yNXEtMTIgLTE2IC0yMSAtMjRxLTQgLTQgLTguNSAtOGwtMTAgLTl0LTkuNSAtOHEtMTcgLTE2IC0zMCAtMzRxLTEyIC0yMCAtMjAgLTQ2cS01IC0yMiAtNSAtNDEgcTAgLTQgMC41IC0xMnQwLjUgLTEybDEgLTExaDExaDg4djEycTAgMjYgOCA0MnE5IDE2IDIxIDMwcTE0IDE0IDI5IDI1dDMyIDMwcTE0IDE3IDI1IDQyeiIgLz4KPGdseXBoIHVuaWNvZGU9IkAiIGhvcml6LWFkdi14PSI1MDgiIGQ9Ik0yNTggNzAzcTkyIDAgMTU3LjUgLTY2dDY1LjUgLTE1N3EwIC0xMDcgLTIwMyAtNTQ2bC0yNCAtNTBsLTYzIDEzNXQtMTAxIDI0NC41dC02MyAyMTYuNXEwIDkyIDY1LjUgMTU3LjV0MTU3LjUgNjUuNWg0aDR6TTI1NCAzOTdxNDIgMCA3MiAzMHQzMCA3M3EwIDQyIC0zMCA3MnQtNzIgMzBxLTQzIDAgLTczIC0zMHQtMzAgLTcycTAgLTQzIDMwIC03M3Q3MyAtMzB6IiAvPgo8Z2x5cGggdW5pY29kZT0iQSIgaG9yaXotYWR2LXg9Ijg5MyIgZD0iTTMxNSAyOTlsNzAgLTcwcS0zOCAtMzIgLTg4LjUgLTMwdC04Ni41IDM4bC0xNDQgMTQ0cS0zOCAzNyAtMzggOTF0MzggOTFsOTkgOTlxMzggMzggOTEuNSAzOHQ5MS41IC0zOGwxNDQgLTE0NHEzNiAtMzYgMzcuNSAtODYuNXQtMzAuNSAtODguNWwtNzAgNjlxMTAgMjAgLTYgMzhsLTE0NCAxNDRxLTkgOSAtMjIuNSA5dC0yMi41IC05bC05OSAtOTlxLTEwIC0xMCAtMTAgLTIzdDEwIC0yM2wxNDQgLTE0NHExNiAtMTYgMzYgLTZ6TTcyOCAtOTkgcS0zOCAtMzcgLTkxIC0zN3QtOTEgMzdsLTE0NSAxNDVxLTM1IDM1IC0zNyA4NS41dDMwIDg4LjVsNjkgLTcwcS05IC0yMCA3IC0zNmwxNDQgLTE0NHE5IC0xMCAyMi41IC0xMHQyMi41IDEwbDk5IDk5cTEwIDkgMTAgMjIuNXQtMTAgMjIuNWwtMTQ0IDE0NXEtMTYgMTYgLTM3IDVsLTY5IDcwcTM4IDMyIDg4LjUgMzAuNXQ4Ni41IC0zNy41bDE0NCAtMTQ0cTM3IC0zOCAzNyAtOTEuNXQtMzcgLTkxLjV6TTI2MyA0NjVxMTQgMTQgMzQgMTQgdDM0IC0xNGwyOTUgLTI5NXExNCAtMTQgMTQgLTM0dC0xNCAtMzR0LTM0IC0xNHQtMzQgMTRsLTI5NSAyOTRxLTE0IDE0IC0xNCAzNC41dDE0IDM0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iQiIgaG9yaXotYWR2LXg9Ijg4MSIgZD0iTTczNCAzMTFxLTE0IC0yNyAtNDIgLTUwcS0xMiAtMzAgLTMxLjUgLTU4dC01NC41IC02MHQtOTIuNSAtNTEuNXQtMTI5LjUgLTE5LjVxLTc3IDAgLTE0My41IDIxdC0xMDUuNSA1MXQtNjcgNjB0LTM5IDUxbC0xMSAyMXE1IC0zIDE0LjUgLTYuNXQzOC41IC0xMS41dDU4IC0xMnQ3MCAtMC41dDc4IDE3LjVxLTY0IDI3IC05NiA5MXEtMjEgNDMgLTggNTRxNyA3IDI1IC0xMHE1MyAtNTAgMjEyIC00MXE3IDggMjEgMjZ2NXEwIDY3IDQ3IDExNCB0MTE0IDQ3cTY0IDAgMTEwIC00My41dDUxIC0xMDYuNWwxMDIgLTQ5ek02MjYgNDY5cS0xOSAwIC0zMiAtMTMuNXQtMTMgLTMyLjV0MTMgLTMydDMyIC0xM3QzMi41IDEzdDEzLjUgMzJ0LTEzIDMyLjV0LTMzIDEzLjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iQyIgaG9yaXotYWR2LXg9IjkxMyIgZD0iTTc3MSAzMTdxNDYgLTE4IDc0IC01OS41dDI4IC05Mi41cTAgLTY4IC00OC41IC0xMTYuNXQtMTE2LjUgLTQ4LjVxLTIgMCAtNSAwLjV0LTQgMC41aC00OTRoLTFoLTJxLTY5IDEgLTExNy41IDUwdC00OC41IDExOXEwIDQ1IDIyLjUgODMuNXQ2MC41IDYwLjVxLTYgMTYgLTYgMzVxMCA0NyAzNCA4MXQ4MSAzNHEzOCAwIDcxIC0yNXEzMSA2NCA5MSAxMDN0MTMzIDM5cTEwMyAwIDE3NiAtNzIuNXQ3MyAtMTc2LjVxMCAtMTAgLTEgLTE1eiIgLz4KPGdseXBoIHVuaWNvZGU9IkQiIGhvcml6LWFkdi14PSI5MTciIGQ9Ik00NTkgNjk4cTE3MyAwIDI5NS41IC0xMjN0MTIyLjUgLTI5NnQtMTIyLjUgLTI5NS41dC0yOTUuNSAtMTIyLjV0LTI5NiAxMjIuNXQtMTIzIDI5NS41dDEyMyAyOTZ0Mjk2IDEyM3pNNTc0IDI1MnEtMTEgMTIgLTExIDI4dDExIDI4bDEwOSAxMDhxMTEgMTIgMTEgMjguNXQtMTEgMjcuNWwtMzEgMzFxLTEyIDExIC0yOC41IDExdC0yNy41IC0xMWwtMTA4IC0xMDlxLTEyIC0xMSAtMjguNSAtMTF0LTI3LjUgMTFsLTEwOSAxMDkgcS0xMSAxMSAtMjcuNSAxMXQtMjcuNSAtMTFsLTMxIC0zMXEtMTEgLTExIC0xMSAtMjcuNXQxMSAtMjguNWwxMDkgLTEwOHExMSAtMTIgMTEgLTI4dC0xMSAtMjhsLTEwOSAtMTA4cS0xMSAtMTIgLTExIC0yOC41dDExIC0yNy41bDMxIC0zMXExMSAtMTEgMjcuNSAtMTF0MjcuNSAxMWwxMDkgMTA5cTExIDExIDI3LjUgMTF0MjguNSAtMTFsMTA4IC0xMDlxMTEgLTExIDI3LjUgLTExdDI4LjUgMTFsMzEgMzFxMTEgMTEgMTEgMjcuNXQtMTEgMjguNXogIiAvPgo8Z2x5cGggdW5pY29kZT0iRSIgaG9yaXotYWR2LXg9Ijg5NSIgZD0iTTQ0OCA1MzFxNjMgMCAxMjkuNSAtMjMuNXQxMTUuNSAtNTd0ODkuNSAtNjd0NjEuNSAtNTcuNWwyMSAtMjN2LThsLTIyIC0yNC41dC01OS41IC01NC41dC05MiAtNjl0LTExNCAtNTQuNXQtMTMwLjUgLTI0LjV0LTEyOS41IDIzLjV0LTExNS41IDU3dC04OS41IDY3dC02MS41IDU2LjVsLTIxIDI0djlsMjIgMjQuNXQ1OS41IDU0LjV0OTIgNjguNXQxMTQgNTR0MTMwLjUgMjQuNXpNNDQ2IDE1OHE1OCAwIDk4LjUgNDAuNXQ0MC41IDk4LjUgcTAgNTcgLTQwLjUgOTcuNXQtOTguNSA0MC41cS01NyAwIC05Ny41IC00MC41dC00MC41IC05Ny41cTAgLTU4IDQwLjUgLTk4LjV0OTcuNSAtNDAuNXpNNDQ2IDM2MXEyNiAwIDQ1IC0xOXQxOSAtNDV0LTE5IC00NC41dC00NSAtMTguNXQtNDQuNSAxOC41dC0xOC41IDQ0LjV0MTguNSA0NXQ0NC41IDE5eiIgLz4KPGdseXBoIHVuaWNvZGU9IkYiIGhvcml6LWFkdi14PSI3MDQiIGQ9Ik0yMjQgNzAwaDQyMnYtODE4aC01OTN2NjQ2bDE3MSAxNzF2MXpNNTc4IC01MHY2ODJoLTI4NXYtMTcyaC0xNzJ2LTUxMGg0NTd6IiAvPgo8Z2x5cGggdW5pY29kZT0iRyIgZD0iTTQ2MCA2OThxMTc0IDAgMjk3IC0xMjN0MTIzIC0yOTd0LTEyMyAtMjk3dC0yOTcgLTEyM3QtMjk3IDEyM3QtMTIzIDI5N3QxMjMgMjk3dDI5NyAxMjN6TTczOCA0MDFsLTEgLTNxLTEgLTMgLTEgLTUuNXQyIC0yLjVxMCAtMiAzIC02dDMgLTh2LTExcTEgLTIgNSAtM3ExIC00IDYgLTV0NiAzcS0zIDAgLTIuNSA0LjV0LTAuNSA0LjVxMCAyIC0xIDNxLTIgMiAtMiAzaDdxMCAyIC0yIDV0LTIgNHEtMSAwIC0yLjUgLTF0LTIgLTF0LTAuNSAyIHQtNCA2bC0yIDdxMyAwIDYgMXEtMSAwIDQgMnEtMSAxIC0yIDRxLTIgNCAtNyAycS0yIDAgLTUgLTIuNXQtNSAtMi41ek03MzUgODFxNjMgOTAgNjMgMTk3cTAgMTkgLTEgMjhxLTkgMCAtMTMgMnEtNCAwIC0xNC41IDQuNXQtMTYuNSAyLjVxMCAxIC0xIDFxMiAzIC01IDExcS01IDQgLTcgMHEtMiAtMyA1IC0xMHEwIC0yIDIgLTZxMiAtMSAxIC0zdC0xIC0zcTQgMCA1IDdxMCAtMSAxIC0xcS0yIC0zIDEgLTZ2LTVxMTAgMCAxNCAxMCBxMSAwIDEgLTJ0MSAtM3EzIC0zIDIgLTV0MiAtMnEyIC0xIDIgMXYycTQgLTIgNCAtNnQtNCAtNnEwIC0xIC0xIC0zdC0xIC00cTAgLTYgLTQgLThsLTQgLTJxLTQgLTMgLTggLTUuNXQtNCAtMy41cS0xMiAwIC0xNSAtN3EtNyAwIC0xMSAtNHEtNiAwIC04LjUgNnQtNC41IDZsLTIgNXExIDAgLTEuNSA2bC01LjUgMTN0LTMgOWwtNSAxMHEtMiAxIC03IDEycS04IDQgLTEwIDEzcTEwIDAgMTAgNHEtMSAwIC0yIDFxLTIgMiAxIDJsMyA5IHEwIDEgMSA1LjV0MSA2LjVxLTIgMCAtOCAtMnEwIC0xIC0xLjUgLTAuNXQtMy41IDAuNWwtMyAxcTAgMSAtNi41IDB0LTguNSAycS0yIDIgLTQgMTRxLTEgMyAtOCAzcS0zIDEgLTMuNSAtMXQwLjUgLTVsMSAtNHEyIDAgLTIgLTdxLTEgLTEgLTEgLTJxLTQgMSAtNiA2dC00IDZxLTEgNCAtMyA0cTAgMTAgLTEgMTBsLTMgMXEtNCAyIC01IDNxLTIgMCAtNS41IDMuNXQtNi41IDUuNXQtNCAwbDMgLTZxMiAwIDUgLTQuNXQ3IC0zLjV2LTUgcTMgMSA0LjUgLTEuNXQyLjUgLTIuNXEwIC0xIC0zIDBxLTQgMiAtMyAtMXEyIC02IC00IC05cTAgMTIgLTMgMTJxLTIgMyAtNyA1dC02IDRxLTEgMCAtMy41IDMuNXQtNC41IDQuNXEtMiAtMiAtNSAtMnEtMSAtMiAtNC41IC0yLjV0LTcuNSAwLjVsLTMgMXEtNyAtMTggLTggLTIwcS0xIC0zIC0zIC01dC0zIC01cTAgLTEgLTcuNSAtMS41dC03LjUgLTEuNXEtMTEgNCAtMTEgMTN2NXQxIDl0MSA2bDIgLTJoMy41aDQuNXQzLjUgMXQxLjUgMiBxNCAwIDMgLTRxOSAtMyA5IDNxLTIgMCAtMiAycTMgNCAyIDd0LTQgNnQtMyA0bC00IDRxOSAtNiAxMSAtMXEwIDEgLTEgM3YxcTIgLTIgMy41IC0yLjV0Mi41IDEuNXEyIDEgMyAzdjZxMyAtNCA0LjUgMHQyLjUgNXEwIC0zIDMgMHEyIDIgMyAycTEgMiA1IDIuNXQ1IDMuNXEtMyAxIC0zIDEycTIgMCA0LjUgMS41dDMuNSAxLjV0MiAtMnEwIC02IDEgLTZxNCAyIDQgNXEtMiAwIC01IDEwcS0zIDAgLTUgLTJxLTMgMCAtNy41IDF0LTYuNSAxIHEtNyA3IC02IDdxLTIgNCAyIDVoMnEwIDIgMTEuNSA1dDEyLjUgOHEtNiAwIDggMTNxMTAgOCAxNCA4cTEgMCA5LjUgMmwxNC41IDMuNXQ4IC0wLjVxMjIgMCAyMiAtMnExIDAgMy41IC0xdDQgLTEuNXQzLjUgMC41cTMgMiAxMSAtMnQ4IC04cS0zIDAgLTEyIC0xdC0xNCAtMXYtMnEyIDAgNS41IC00LjV0Mi41IC02LjVxMyAwIDYgMnQ0IDJxMCAtMiAxIC0zcTMgLTIgNCAzbC0xIDRxMSAyIDQuNSAyLjV0NC41IDMuNXEtNDcgNTYgLTExNC41IDg4IHQtMTQzLjUgMzJxLTEzNCAwIC0yMzEgLTkxcTEgLTEgNSAybDIgMXEwIC02IDEgLThsMyAtN3E4IDAgOSAtMmgtNXExIC02IC0zIC00cS0zIDEgLTQgMXEwIDEgLTMgMnQtNSAwdDAgLTVxMSAwIDIgLTF0MyAtMnEyIDAgNi41IC0xdDYuNSAtMnEyIDAgNSAwLjV0NCAwLjVxMiAxIDMgMnQtMSAycTEgMiAtNCA0cTAgMSAxMSAxcTIgMiAxLjUgMy41dDAuNSAzLjV0NCAydDQgM3E0IC0yIDUgLTZxMSAwIDMgLTNxOSAtMTAgOSAtM3E2IC0xIDYgLTExIHE3IDEgNyAxMXEtMSAwIC0xIDNoNHEyIC0xIDIgMXExIDAgMSAtMmg4di0xMXEwIC0yIC0yIC0zdC0zIC0xbC0yIC0xcS0zIC00IC0xLjUgLTV0Ni41IC0zLjV0NiAtMy41bC04IDFxLTEgMCAtNC41IC0wLjV0LTYgLTF0LTQuNSAwLjVxNSAwIDcgMTFxLTggMiAtMTEgLTVxLTEgLTQgLTQgLTMuNXQtNCAtMS41bC0yIC0xcS0zIC0xIC01IC0xLjV0LTIgMC41cS03IC0yIC03IC0xN3ExMSAtOCAxMSAtMTJxNCAtMSA5LjUgLTJ0OC41IC0xIHExIC0zIDQgLTNxMCAtNCA5IC00cTAgNiA2IC00cTEgLTIgMSAtM3EtMSAwIDAgLTIuNXQzIC01LjVxLTIgMCAtMSAtMXEyIC0yIDUuNSAtMXQzLjUgM3EtMiAwIC0yIDZxLTYgNiAxIDhxMCAtNCA2IDFxMiAyIC0xIDNxMiA5IDAgMTJxLTEgMSAtMi41IDF0LTIuNSAycTQgMSAxIDE0aDVxMiAwIDUuNSAtMS41dDUuNSAtMXQzIDMuNXEzIC0yIDQuNSAtNXQ0LjUgMXEwIC0xIDQgLTUuNXQ1IC00LjVxMCAtMyAyIC0zbC0xIC0ycTcgMCA3IDEgcTYgMCA2IDhxMSAwIDIuNSAtM2wzIC02dDIuNSAtM2wyLjUgLTIuNWwzIC0zdDIuNSAtM3QxIC0yLjVxMiAtMiAyIC01cTEgMCAyIDJxMyAzIDMgLTFxMiAwIDQuNSAtMi41dDIuNSAtMy41cS0yIDAgLTEuNSAtMnQtMC41IC0ycTAgLTEgLTExIC0xcS0xIC01IC02IC02dC0xMSAwLjV0LTExIC0wLjVxLTQgLTIgLTkuNSAtOC41dC01LjUgLTEwLjVxMyAwIDcuNSAzLjV0Ni41IDQuNXEyIDAgMTAgNHEwIC0xIDEgLTF2LTFxLTYgMCAtMiAtNyBxMSAtMSAxIC0ycTMgLTUgOCAtNXEwIC0xIC0yLjUgLTF0LTIuNSAtMmwtNSAtM2gtNmwxIDFsMSAxaDN2NHEtMyAwIC02IC0xLjV0LTUgLTEuNXEtNCAtNCAtNiAtNHEtMiAtMTAgLTYgLTEybC0yIC0xbC00IC0ybC0yIC0ybC0yIC0ycS0xIC0yIC0yIC01cS0zIC03IC0zIC05cS0xIDAgLTMuNSAtNS41dC02LjUgLTUuNXEtMSAtMiAtNS41IC02dC00LjUgLTEwcTEgLTEgMS41IC00dDEuNSAtNi41dDEgLTQuNXEwIC04IC00IC04bC0yIDN0LTEgMyBxMCA0IC00IDEycTAgMiAtNC41IDEuNXQtNS41IC0wLjVxLTEgMyAtMTMgM3EwIC0xIDEgLTJ0MSAtM3EtNiAtMiAtNyAtMnEtMiAwIC00LjUgMi41dC01LjUgMS41cS0xNCAtMiAtMTQgLTE2cS0xIDAgLTEgLTguNXQxIC04LjVxMCAtMiAyIC02dDIgLTVxMiAwIDYgLTR0NSAtNHExIC00IDUgLTRsMiAxbDIgNHEtMyAxIC0xLjUgMy41dDMuNSAzLjVxMCAtMiA2IDJsNiAybDIgMnExIC0zIC0xIC00cS0yIDAgLTMgLTNsLTEgLTIgcS0xIC0yIC0yIC01dC0xIC01dDEgLTQuNXQwIC00LjVoMTN2M3EzIDAgMi41IC02LjV0MS41IC02LjVxMCAtMiAxIC02dDEgLTVxNSAtMyA0IC04cTEyIDAgMTIgM3E3IDAgNSAtN3E1IDAgNiAzdDEgNS41dDIgMi41cTAgMyAyIDFsNiAzbDMgMnEyIC0xIDIgLTJxNSAwIDkgNHEyIDAgNCAtNXQ2IC01cTEyIDAgMTMgMXEzIC0yIDMgLTNxMSAwIDIgLTFsMSAtMWgxbDQgLTRxMCAtMiAyLjUgLTN0Mi41IC0ybDEgLTFsMyAtMmw5IC0zcTEgMyA0IDAgcTEgLTEgMiAtMWwyIC0ycTEgLTEgNCAtN3EyIC0yIDQgLTExcS0xIDAgLTEgLThsNCAtMXEyIDAgMiAycTIgMCA1IC0ydDQgLTJxLTIgLTIgMSAtMy41dDMgMi41cTMgMCAzIC0xMXEyIDAgNC41IDEuNXQ0LjUgMS41cTYgMCA2IDFxOCAtMiAxMyAtOHE1IC01IDUuNSAtMTR0LTQuNSAtMTRsLTggLTEwcTAgLTEyIC0xIC0xMnEwIC0xNCAtMyAtMTRxMCAtMyAtMi41IC03dC0zLjUgLTZxLTEgLTEgLTYuNSAtNC41dC02LjUgLTUuNSBxLTEgMCAtNCAtMXQtNCAtMWwtMiAtM3EtMyAtMyAtMiAtM3EwIC0xIC0wLjUgLTcuNXQtMS41IC04LjVxLTQgLTIgLTMgLTRxLTEgMCAtMS41IC0xdC0zLjUgLTFxLTIgMCAtNSAtMi41dC0zIC01LjVxLTIgLTggLTYgLTExbC0zIC0ycS00IC0yIC00IC00di04cS02IDAgLTggLTRxLTQgMCAtMTEgLTRxMCAtNCAtMiAtNHEwIC00IC0zIC0zdC00IDBxMiAwIDIgLTZxMCAtMSAtNiAtOWwtMSAtMnEtMiAtMyAtMyAtM3EwIC0xIC0wLjUgLTQgdC0wLjUgLTV2LTNsMiAycTAgMSAyIC0xcS0xIC0yIC0zIC00dC0zIC01cS01IDAgLTUgLThxMCAtMiAxIC0ycTAgLTEgMiAtNWwtMjcgOXEwIDM3IDQgMzdxMCA5IDIgOXYxNHEtMSAyIDEuNSA2LjV0Mi41IDYuNXEzIDEgMy41IDEwdDAuNSAxN3QyIDhxMCA0IDEuNSAyMC41dC0wLjUgMjAuNWwtNyA4cS01IDAgLTkgNi41dC00IDEyLjVxLTMgOSAtMyAxMHExIDAgLTIgNC41dC02IDkuNWwtNCA1cS0zIDMgLTMgNC41dDIgNXQyIDYuNSBxLTQgMiAtMiAxMC41dDUgOC41cTAgMyAzIDRxMSAtMyAzIC0ycTMgMyAwIDV2MTNxMCAxMCAtNSAxMHEtMiAwIC00IC01cS0xIDEgLTUgMS41dC03IDJ0LTMgNC41cTIgNiAtOCAxMXExIDQgLTUuNSA4LjV0LTEwLjUgNC41cTAgMSAtMiAxLjV0LTIgMS41cS0yIDAgLTUgM3QtNiAzcS00IDAgLTEwIDIuNXQtOSAyLjVxLTEgMiAtNi41IDN0LTYuNSAzcS03IDAgLTcgMTNxMCAxOCAtOSAxOHEwIDMgLTQgNi41dC02IDMuNXEtMyA3IC01IDcgcTAgNCAtNiA5cS0zIDIgLTMgMHEtMSAtMiAyLjUgLTUuNXQzLjUgLTUuNXExIDAgOCAtMTNxNiAtMTAgMyAtMTFxLTQgLTEgLTEwIDhxLTIgNCAtMiA2cS0yIDEgLTQuNSA2LjV0LTIuNSA3LjVxLTEgMSAtMi41IDR0LTIuNSA2bC0xIDJxMCAxMCAtMTEgMTBsLTcgOXEwIDEwIC04IDEzcTAgMiAtMSA5dDAgMTBxMCAyMyAtMTAgMzFxLTMzIC02OCAtMzMgLTE0NHEwIC0xNDAgOTkuNSAtMjM5dDIzOS41IC05OXE4MiAwIDE1MyAzN3QxMTggMTAwIHEtNyAtMiAtOSA5cS0zIDE3IDIgMzJxNSAtMiA2IDBxLTQgMSAtMiA2cTEwIC03IDEwIDJsLTIgMnEwIDIgMSAzdDEuNSAwLjV0MC41IC0yLjVxMyAwIDMuNSA0LjV0MS41IDUuNXEwIC0xMSAzIC0xMnEyIC0yIC0wLjUgLTQuNXQtMi41IC0zLjVxLTIgLTEgLTIgLTZoLTNxMCAtMyAtMSAtOC41dC0xIC03LjVxLTIgMCAtMiAtMTZ6TTY2NiAzODNxMiAtMSAyIC00cTI1IDAgMjUgM3ExIC0yIDIgLTN0MiAycTEgMCA0LjUgLTN0Ny41IC0ybDcgNCBsLTIgMXEwIDYgLTUgOS41dC02IDQuNXEtMSAwIC0zLjUgMXQtNC41IDFxLTMgMiAtNiAtMXEtMyAtMiAtMyAwcS0xIDIgLTMgMnEwIDggLTkgN3EtMSAtMyAtMy41IC03dC0zLjUgLTcuNXQtMSAtNy41ek01MTggNDkxcTAgLTUgLTEgLTVxLTUgLTMgLTEwIC0zaC0xMXEtMiAwIC0xMCAycTAgMSAxIDJxMyA0IC0xIDRxNyAzIDggM3YtMXYtNHEwIC0xIDIgLTAuNXQ0LjUgMXQzLjUgMS41cTMgMCA2IDFxMSAxIDEuNSAwLjV0MC41IC0zLjV6IE01NTEgNDQ0cTAgMiAtMSA0dC0xIDRxMCAzIDMgMi41dDQgMy41cTMgLTEgMCAtM3YtNHEyIDAgNCAydDMgMnEtMiAtNyAtMSAtOHE1IC01IDQgLTZxNyAwIDUgLTExcTMgMCAzIDNxMiAtMSAyIC0yLjV0LTIgLTEuNXEtMyAtNSAtMTUgLTVxMCA2IC00IDNxLTMgLTEgLTIgNHExIDIgMSAzcS0yIDEgNSAycS0xIDggLTggOHpNNTM2IDQyOHEtMiAyIDAgOHEtMyAxIDEgMmw1IDJxLTQgMCAtMiA0aDJxMSAtMiAyIC0xaDRxMSAtMSAwIC0zIHEtMyAtMTIgLTEyIC0xMnpNNTUxIDQyMnExIDAgMSAxaDNxMCAtMiAtMS41IC0ydC0yLjUgMXpNMzkyIDQwMXExIDEgNCAzcTAgLTMgLTQgLTN6TTU5OCAzODhxMiAwIC0xIC02cS0xIDIgLTIgNXEzIDAgMyAxek01OTggMzgwcTIgMCAxLjUgLTQuNXQtNS41IC0zLjVxMCA3IDIgN2wxIC0ycTEgMSAxIDN6TTYyMCAzNjVxMCAtNCAtMSAtNC41dC00LjUgMS41dC01LjUgMmg1cTEgLTEgNiAxek03MjggMjQwcTYgMCA2IDFxMTAgMCAxNiAzIHEwIC00IC0yLjUgLTkuNXQtMS41IC05LjVxLTMgMCAtMyAtNWwtMiAtMnEtMiAtMyAtNCAtNHEwIC0yIC05IC0xMXEtMSAtMiAtNS41IC02LjV0LTUuNSAtNi41cS0xNCAtMTQgLTEwIC0xNHEwIC0yNCAyIC0yNGwxIC02cTEgLTYgMSAtMTB0LTEgLTVxMCAtMyAtMiAtNy41dC0yIC02LjVsLTIgLTFsLTMgLTNxLTIgMCAtNCAtMy41dC0zIC0zLjVxMCAtNCAtMSAtMTF0LTEgLTExbC0xIC00bC0yIC02bC0xIC00cS0xNSAtOCAtMTUgLTE3IHEtNyAtMTAgLTggLTEycS0xOSAwIC0xOSAtNGgtMTVxMCAyIC0xIDZ0LTEgN3EtMSAwIC0yIDMuNXQtMiAzLjVxMCAxIC0yLjUgNi41dC00LjUgMTF0LTEgNS41cTAgOSAtMyA5cTAgNCAtMi41IDExdC0yLjUgMTBxLTEgMCAtMiA0dC0xLjUgNy41dDAuNSA0LjVxMCA0IDQgMjJxMSA5IC0zIDIzcS00IDAgLTQgNnEtNiA0IC02IDE1cTYgNiAzIDIwcS0zIDEgLTE0IDFxLTEgMyAtNy41IDR0LTE2LjUgMGwtMTAgLTFxLTEgLTIgLTQuNSAtMS41IHQtOC41IDIuNXQtNSAzcS0zIDAgLTcuNSA0LjV0LTQuNSA4LjVxLTQgMSAtOCA5LjV0LTQgMTIuNXEtNCA0IDAgOXEwIDMgLTMgMTJxMCAyIDEuNSA0dDEuNSA0cTAgMTEgNCAxOXEwIDEgMiA0dDIgNHEyIDMgMyAzcTIgMSAzIDNxMiAxIDUgNXEyIDMgMyA0cTMgMSAwIDRxNCAwIDQgMTBxMiAzIDYgM2wxIDFxNCA1IDUgNXEyIDMgNiAzcTEgLTEgMi41IC0xdDQuNSAxbDMgMXE1IDcgMTQgN3ExIDIgNSAxLjV0MTAuNSAtMS41dDcuNSAtMXYyIHEzIC0xIDcgLTEwdDQgLTEyaDhxMCAtNCAxMCAtNHExNiAwIDE2IDZxNiAwIDYgLTZoNnQ4LjUgLTAuNXQ3LjUgLTJ0MiAtMi41cTIgMCA0IC0zdDMgLTNxMCAtMyAyLjUgLTguNXQ0LjUgLTUuNXEwIC04IDUgLTExcTYgLTE0IDEyIC0xOHEtMSAtMiAxLjUgLTZ0Mi41IC01cTEgLTYgMyAtN3EwIC00IDUgLTExLjV0OCAtNy41cTAgLTEgLTEgLTJ0MiAtMnpNMzEyIDI5NnEwIC0zIDMgMHEwIC00IC00IC0ycS0yIDAgLTEgM3ExIDAgMiAtMXogTTMyOCAyOTdxNCAtMSA3LjUgLTMuNXQ1LjUgLTIuNXEzIC0zIDMuNSAtNHQtMS41IC0ycS04IC0yIC0xMiA1cS01IDAgLTEwIDVxNiAwIDcgMnpNMzYyIDI4M2wyIC0xcTIgLTIgMyAtNGwxIC0xaC0xM3EtMSAtMSAtNC41IC0xdC00LjUgMmg3bC0yIDRxMSAwIDUgLTF0NiAtMXYzek0zMzEgMjc4cTQgMCA0IC0zcS01IDAgLTQgM3pNMzM2IDI3NWwyIDNxMSAwIDEgLTJxLTEgLTEgLTMgLTF6TTM3NiAyNzhxMyAwIDMgLTFxLTQgMiAtMyAxeiBNMzczIDI3OGwyIC0xcS0xIDAgLTEgLTAuNXQtMSAtMC41djJ6TTM1NyAyNTBxMSAxIDEgMmwxIC0xcTAgLTEgLTIgLTF6TTc0MCAxMzRxMCAyIDIgM3oiIC8+CjxnbHlwaCB1bmljb2RlPSJIIiBob3Jpei1hZHYteD0iODY1IiBkPSJNNjg2IDI3OXYtMzc4aC0xNzd2MjM1aC0xNTJ2LTIzNWgtMTgzdjM3OGgtMTUzbDQxMiA0MTFsNDExIC00MTFoLTE1OHoiIC8+CjxnbHlwaCB1bmljb2RlPSJJIiBob3Jpei1hZHYteD0iOTMyIiBkPSJNODg0IDIzNHYtMzE0aC04MzZ2MzE0bDE1NyA0MThoNTIyek01ODIgMjM0aDE5OGwtMTA1IDMyMmwtNDE4IDFsLTEwNCAtMzIzaDE5N2w0OSAtOTZoMTMweiIgLz4KPGdseXBoIHVuaWNvZGU9IkoiIGhvcml6LWFkdi14PSI4NjIiIGQ9Ik04NDggNTM0bC0xMjIgLTEyMmw4MiAtODJsLTM3MCAtNDJsNDMgMzY5bDgxIC04MWwxMjIgMTIyek0xMzYgMTQ4bC04MiA4MmwzNjkgNDNsLTQzIC0zNzBsLTgxIDgybC0xMjIgLTEyMmwtMTYzIDE2M3pNMTgyIDM4OGwxOTcgLTY4bC0yMjEgMTh6TTM5MyA0MTd2LTg1bC0yOCA4MHpNNjgyIDE3NGwtMTk3IDY5bDIyMSAtMTl6TTQ3MSAxNDZ2ODVsMjggLTgxeiIgLz4KPGdseXBoIHVuaWNvZGU9IksiIGhvcml6LWFkdi14PSI4NjkiIGQ9Ik01MzAgMzUxbDMxOCAtMzE4di0xNjh2MGgtMTY4aC0xdjEyOWgtMTI4djEyOGgtMTI4bC02MSA2MXEtNDAgLTE0IC04MyAtMTRxLTEwOSAwIC0xODcgNzcuNXQtNzggMTg3LjV0NzggMTg3LjV0MTg3IDc3LjV0MTg3IC03Ny41dDc4IC0xODcuNXEwIC00MyAtMTQgLTgzek0yMjQgNDAycTM3IDAgNjMgMjZ0MjYgNjN0LTI2IDYzdC02MyAyNnQtNjMuNSAtMjZ0LTI2LjUgLTYzdDI2LjUgLTYzdDYzLjUgLTI2eiIgLz4KPGdseXBoIHVuaWNvZGU9IkwiIGQ9Ik00NjAgNzAxcTE3NCAwIDI5NyAtMTIzdDEyMyAtMjk3dC0xMjMgLTI5N3QtMjk3IC0xMjN0LTI5NyAxMjN0LTEyMyAyOTd0MTIzIDI5N3QyOTcgMTIzek00NjAgLTM0cTEzMCAwIDIyMi41IDkydDkyLjUgMjIzdC05Mi41IDIyM3QtMjIyLjUgOTJ0LTIyMi41IC05MnQtOTIuNSAtMjIzdDkyLjUgLTIyM3QyMjIuNSAtOTJ6TTQ2NCA1MjlxMTAzIDAgMTc2LjUgLTczLjV0NzMuNSAtMTc3LjV0LTczIC0xNzcuNXQtMTc3IC03My41IHQtMTc3LjUgNzMuNXQtNzMuNSAxNzcuNXQ3My41IDE3Ny41dDE3Ny41IDczLjV6TTM5NiAzNTlxMzMgMzMgMTAyIDcwbC0zMCA0MHEtNCAxIC0xMiAxcS02MSAwIC0xMTYuNSAtNTV0LTU1LjUgLTExNnEwIC02IDEgLTlsNDIgLTMycTM4IDcwIDY5IDEwMXpNNTQwIDE1NXExNiAwIDI4IDEydDEyIDI5dC0xMS41IDI5dC0yOC41IDEydC0yOSAtMTJ0LTEyIC0yOXQxMiAtMjl0MjkgLTEyeiIgLz4KPGdseXBoIHVuaWNvZGU9Ik0iIGhvcml6LWFkdi14PSI5NTIiIGQ9Ik04OTIgMzJsLTI3MyAyNjJsMjczIDIzNHEzIC04IDMgLTE1di00NjVxMCAtOCAtMyAtMTZ6TTQ3NiAyMzhsLTcyIDU4bC0zNiAzMGwtMjc1IDIzNXExMCAyIDE0IDJoNzM4cTQgMCAxNCAtMmwtMjc1IC0yMzVsLTM2IC0zMHpNODQ1IC0yaC03MzhxLTUgMCAtMTMgMmwyNzYgMjY1bDEwNiAtODdsMTA3IDg3bDI3NSAtMjY1cS04IC0yIC0xMyAtMnpNNjAgNTI4bDI3MyAtMjM0bC0yNzMgLTI2MnEtMyA4IC0zIDE2djQ2NXEwIDcgMyAxNXoiIC8+CjxnbHlwaCB1bmljb2RlPSJOIiBob3Jpei1hZHYteD0iOTQzIiBkPSJNODU3IDY3MHExNyAwIDIzIC02dDYgLTIzdi02NTVxMCAtMTcgLTYgLTIzdC0yMyAtNmgtMTA4aC01NDZoLTcxcS0yOCAwIC01My41IDI2LjV0LTI1LjUgNTIuNXY0ODFxMCAxNyA2IDIzdDIzIDZoOTJ2OTVxMCAxNyA2IDIzdDIzIDZoNjU0ek04MzcgN3Y2MTNoLTYxNHYtNzR2LTUwdi00NDVoLTQ5djQ0NWgtNzF2LTQ2MHEwIC03IDExIC0xOHQxOCAtMTFoNzFoNTQ2aDg4ek01MTEgNTU2di0yMjNoLTIyM3YyMjNoMjIzek03NjUgNTI1di0zNyBoLTE4NXYzN2gxODV6TTc2NSA0MTF2LTM3aC0xODV2MzdoMTg1ek03NjUgMjU5di0zN2gtNDc3djM3aDQ3N3pNNzY1IDE0NHYtMzdoLTQ3N3YzN2g0Nzd6IiAvPgo8Z2x5cGggdW5pY29kZT0iTyIgaG9yaXotYWR2LXg9IjkzMCIgZD0iTTg4MiA1MTB2LTUxMWgtNzB2NTExaDcwek02OTUgNTEwaDQ3di01MTFoLTU1NnY1MTFoNTJxNjggMTMzIDEyMiAxMzNoMjA3cTMyIDAgNjYuNSAtNDAuNXQ2MS41IC05Mi41ek01MTQgNTIycTEzIDAgMjIgOXQ5IDIydC05IDIxLjV0LTIyIDguNWgtMTA0cS0xMyAwIC0yMS41IC04LjV0LTguNSAtMjEuNXQ4LjUgLTIydDIxLjUgLTloMTA0ek00OCA1MTBoNjl2LTUxMWgtNjl2NTExeiIgLz4KPGdseXBoIHVuaWNvZGU9IlAiIGhvcml6LWFkdi14PSI5MDkiIGQ9Ik03MTkgNDk2aDE0M3YtNDk1aC02NTl2MWwtMTc3IDQ2MWw2MTUgMjM3ek02NjAgNDk2bC01MSAxMzNsLTM0NSAtMTMzaDM5NnpNOTcgNDMybDEwNiAtMjc3djMxOHpNMjU4IDU2aDU0OXYzODVoLTU0OXYtMzg1ek02OTkgMjkybDU4IC0xOTBoLTQzMmwxMDMgMTEybDY2IC00MmwxMjMgMTc3bDM4IC03MXpNMzc5IDI3NXEtMjIgMCAtMzcgMTV0LTE1IDM3dDE1IDM3dDM3IDE1dDM3IC0xNXQxNSAtMzd0LTE1IC0zN3QtMzcgLTE1eiIgLz4KPGdseXBoIHVuaWNvZGU9IlEiIGhvcml6LWFkdi14PSI4NDQiIGQ9Ik02ODEgNTIxcTYxIC01NCA5NS41IC0xMjkuNXQzNC41IC0xNjAuNXEwIC0xNjEgLTExNCAtMjc1LjV0LTI3NSAtMTE0LjV0LTI3NSAxMTQuNXQtMTE0IDI3NS41cTAgODUgMzUgMTYxdDk2IDEzMHEyMCAxNyA0Ni41IDE1LjV0NDMuNSAtMjEuNXExNyAtMTkgMTUuNSAtNDUuNXQtMjEuNSAtNDMuNXEtODggLTc4IC04OCAtMTk2cTAgLTEwOSA3Ni41IC0xODZ0MTg1LjUgLTc3dDE4NS41IDc3dDc3LjUgMTg2cTAgMTE3IC04OCAxOTUgcS0yMCAxOCAtMjEuNSA0NHQxNi41IDQ2cTE3IDE5IDQzLjUgMjAuNXQ0NS41IC0xNS41ek00MjMgMTY2cS0yNiAwIC00NC41IDE5dC0xOC41IDQ1djQwN3EwIDI2IDE4LjUgNDV0NDQuNSAxOXQ0NSAtMTl0MTkgLTQ1di00MDdxMCAtMjYgLTE5IC00NXQtNDUgLTE5eiIgLz4KPGdseXBoIHVuaWNvZGU9IlIiIGhvcml6LWFkdi14PSI5MDkiIGQ9Ik02NjggMTA1djg3bDEwNCA3MHYtMjYyaC03MzF2NTIzaDMyN3EtMiAtMSAtNi41IC0zdC02LjUgLTNxLTg3IC0zOSAtMTQxIC05OWgtNjl2LTMxM2g1MjN6TTg3NyA0MTdsLTMxMyAtMjExdjEzN3EtOTAgMCAtMTQxIC03cS00OSAtNiAtODkuNSAtMjF0LTYzLjUgLTMzLjV0LTM5IC0zNS41dC0yMiAtMjhsLTYgLTEycTAgNTQgMjAgMTAwdDUxLjUgNzUuNXQ3MC41IDUyLjV0NzcuNSAzNXQ3MCAyMHQ1MS41IDEwbDIwIDJ2MTI2eiIgLz4KPGdseXBoIHVuaWNvZGU9IlMiIGhvcml6LWFkdi14PSI4NTMiIGQ9Ik04MjYgMzg5cTEwIC0xMSA4IC0yNHEwIC0xMyAtMTAgLTI4cS0zIC00IC0xNiAtMTRsLTE4NCAtMTIxcS0yIC0xIC01LjUgLTd0LTIuNSAtMTB2LTRsODEgLTIzN3E0IC0xMSA0IC0yM3EwIC0xNSAtNyAtMjVxLTExIC0xNiAtMzAgLTE2aC0xcS0xNiAxIC0zNiAxNWwtMTkwIDE1NXEtMyAzIC0xMCAzdC05IC0zbC0xODEgLTE1NHEtMTggLTE0IC0zNiAtMTVxLTIxIC0yIC0zMSAxNXEtOCAxMSAtOCAyNnEwIDcgNCAyMWw3MiAyMzZ2NCBxMSA1IC0yIDExdC02IDdsLTE4NSAxMjJxLTEwIDcgLTE2IDE0cS0xMSAxMyAtMTEgMjhxMCAxNCA4IDI0cTkgOSAxNiAxMnExMiA1IDI3IDVoMjMwcTYgMCAxMSA0cTcgNSA3IDEwbDY3IDIzOXE0IDE0IDkgMjFxMTMgMTggMzMgMTlxMjAgLTEgMzMgLTE5cTMgLTQgMTAgLTIxbDY2IC0yMzlxMCAtNSA3IC0xMHE1IC00IDExIC00aDIzMHE5IDAgMjAgLTNxMTQgLTQgMjMgLTE0eiIgLz4KPGdseXBoIHVuaWNvZGU9IlQiIGhvcml6LWFkdi14PSI4OTkiIGQ9Ik04MTcgMTg1bDYzIC02NGwtMTYyIC05MWwtOTIgLTE2M2wtNjMgNjRsMTQgMTQ4bC0xNjkgMTY5bC0yMjQgLTM3MWwtNjMgNjNsMTIwIDQ3NWwtMTc2IDE3NXEtMTkgMjAgLTE5IDQ2LjV0MTkgNDUuNXQ0NiAxOXQ0NiAtMTlsMTc2IC0xNzVsNDc1IDEyMGw2MyAtNjNsLTM3MSAtMjI1bDE2OCAtMTY4eiIgLz4KPGdseXBoIHVuaWNvZGU9IlUiIGhvcml6LWFkdi14PSI4OTQiIGQ9Ik03NjAgMTU0cTQ2IC0yMCA3Mi41IC00NC41dDI5LjUgLTM4LjVsMyAtMTR2LTg2aC04MzZ2ODZxMCAyIDAuNSA2dDYgMTV0MTUuNSAyMnQzMS41IDI2dDUwLjUgMjhxMTIgNSA1NCAyOXQ4NyA0M3Q5NCAyOHEtMzMgMzQgLTcyIDEzNHEtMTEgMjggLTExIDEwMHEwIDcgLTEgMzF0LTAuNSA0MS41dDMuNSAyOS41cTMxIDExMSAxNTkgMTExcTEyNyAwIDE1OCAtMTExcTQgLTEyIDQuNSAtMjkuNXQtMSAtNDF0LTEuNSAtMzEuNSBxMCAtNzIgLTEwIC0xMDBxLTM4IC05NiAtNzIgLTEzNHE1MCAtOCA5NC41IC0yN3Q4NyAtNDMuNXQ1NC41IC0yOS41eiIgLz4KPGdseXBoIHVuaWNvZGU9IlYiIGhvcml6LWFkdi14PSI5NDkiIGQ9Ik02NTkgNDE2bDIzNSAxMTF2LTQ0OWwtMjM1IDExMXYxdi0xMDNxMCAtMTkgLTEzIC0zMnQtMzIgLTEzaC01MTBxLTE5IDAgLTMyIDEzdC0xMyAzMnY0MzNxMCAxOSAxMyAzMnQzMiAxM2g1MTBxMTkgMCAzMiAtMTN0MTMgLTMydi0xMDR6IiAvPgo8Z2x5cGggdW5pY29kZT0iVyIgaG9yaXotYWR2LXg9Ijk1NCIgZD0iTTcwNCA1NHYxODFsOTIgOTN2LTI3NHEwIC01MSAtMzYgLTg3dC04NyAtMzZoLTQ5MnEtNTEgMCAtODcgMzZ0LTM2IDg3djQ5M3EwIDUxIDM2IDg3dDg3IDM2aDQ5MnExNyAwIDI0IC0ybC04OSAtOTBoLTQyN3EtMTMgMCAtMjIgLTl0LTkgLTIydi00OTNxMCAtMTMgOSAtMjJ0MjIgLTloNDkycTEzIDAgMjIgOXQ5IDIyek00MzEgMzE0bDM1NCAzNTRsMTMyIC0xMzJsLTM1NCAtMzU0djBsLTE5NSAtNjNsNjMgMTk1djB6TTU0NyAyMDggbC04OSA4OWwtNDMgLTEzMXoiIC8+CjxnbHlwaCB1bmljb2RlPSJYIiBob3Jpei1hZHYteD0iOTIxIiBkPSJNODY4IDU0MnYtNDIzaC02NnEtMTMgMjkgLTQwIDQ2LjV0LTYwIDE3LjV0LTU5LjUgLTE3LjV0LTQwLjUgLTQ2LjVoLTIyMHY0MjNoNDg2ek0yNDAgMTgzcS0zMyAwIC02MCAtMTcuNXQtNDAgLTQ2LjVoLTEwN3YxODBsMTExIDEyM2gxODR2LTI4NHEtMzMgNDUgLTg4IDQ1ek0xMDEgMjg4di01OGgxNjF2MTMyaC05OXpNMjQwIDE0NnEzMCAwIDUxLjUgLTIxdDIxLjUgLTUycTAgLTMwIC0yMS41IC01MS41dC01MS41IC0yMS41IHEtMzEgMCAtNTIgMjEuNXQtMjEgNTEuNXEwIDMxIDIxIDUydDUyIDIxek03MDIgMTQ2cTMxIDAgNTIgLTIxdDIxIC01MnEwIC0zMCAtMjEgLTUxLjV0LTUyIC0yMS41cS0zMCAwIC01MS41IDIxLjV0LTIxLjUgNTEuNXEwIDMxIDIxLjUgNTJ0NTEuNSAyMXoiIC8+CjxnbHlwaCB1bmljb2RlPSJZIiBob3Jpei1hZHYteD0iODYxIiBkPSJNNDI1IDQ4OGwtMTQ1IC00MDlsLTEyNiAxOTNsLTgxIC03NmwtMjIgLTIwbC00NiAzOWwxNjIgMTUxbDk2IC0xNDdsMTcxIDQ4M2wxNTcgLTYwNWwxMzEgNDEzbDExNiAtMzcxbC02MSAtMTZsLTU1IDE3OGwtMTM3IC00MzF6IiAvPgo8Z2x5cGggdW5pY29kZT0iWiIgaG9yaXotYWR2LXg9Ijg5NyIgZD0iTTQwMiA2MDd2LTM2OWgzNzFxMCAtMTUzIC0xMDggLTI2MXQtMjYxIC0xMDh0LTI2MSAxMDh0LTEwOCAyNjFxMCAxNTIgMTA3LjUgMjYwdDI1OS41IDEwOXpNNDk2IDcwMHExNTMgMCAyNjEuNSAtMTA4LjV0MTA4LjUgLTI2MS41aC0zNzF2MzcwaDF6IiAvPgo8Z2x5cGggdW5pY29kZT0iWyIgaG9yaXotYWR2LXg9Ijg2MSIgZD0iTTQ0NSA2NzF2LTI3OGg0MDl2LTE4NWgtNDA5di0yNzdsLTQyNyAzNzB6IiAvPgo8Z2x5cGggdW5pY29kZT0iXCIgaG9yaXotYWR2LXg9Ijg1NCIgZD0iTTcxMCA1NzloODd2LTczOWgtNzQwdjczOWg4OXY0NnEwIDM1IDIwIDU0dDU2IDE5dDU2LjUgLTE5LjV0MjAuNSAtNTMuNXYtNDZoNTJ2NDZxMCAzNCAyMC41IDUzLjV0NTYuNSAxOS41dDU2IC0xOXQyMCAtNTR2LTQ2aDUydjQ2cTAgMzQgMjAuNSA1My41dDU2LjUgMTkuNXQ1Ni41IC0xOS41dDIwLjUgLTUzLjV2LTQ2ek01OTggNjI1di0xMjNxMCAtMzIgMzUgLTMycTE5IDAgMjcuNSA3LjV0OC41IDI0LjV2MTIzcTAgMTcgLTguNSAyNC41IHQtMjcuNSA3LjVxLTM1IDAgLTM1IC0zMnpNMzkyIDYyNXYtMTIzcTAgLTE3IDguNSAtMjQuNXQyNy41IC03LjVxMzUgMCAzNSAzMnYxMjNxMCAzMiAtMzUgMzJxLTE5IDAgLTI3LjUgLTcuNXQtOC41IC0yNC41ek0xODcgNjI1di0xMjNxMCAtMzIgMzUgLTMycTE5IDAgMjcuNSA3LjV0OC41IDI0LjV2MTIzcTAgMTcgLTguNSAyNC41dC0yNy41IDcuNXEtMzUgMCAtMzUgLTMyek03MzUgLTk5djUxNGgtNjE2di01MTRoNjE2ek00MjkgOTkgcTAgLTQ1IC0zNSAtNzB0LTkwIC0yNXEtMzYgMCAtNzMgMTRsNyA1MnEzNSAtMTQgNzMgLTE0cTI0IDAgMzggMTF0MTQgMjhxMCAyMiAtMTYuNSAzMi41dC01OS41IDEyLjV2NTJxNjMgNSA2MyAzOHEwIDI4IC00MiAyOHEtMjkgMCAtNjEgLTE1bC03IDUycTM0IDE1IDg0IDE1cTQ1IDAgNzEgLTE4dDI2IC00NnEwIC01MCAtNjUgLTcydi0xcTczIC0yMCA3MyAtNzR6TTUzNyAyMjlsLTUyIC0yMGwtNyA1Mmw5MSA0NGgzMXYtMjk2aC02M3YyMjB6ICIgLz4KPGdseXBoIHVuaWNvZGU9Il0iIGhvcml6LWFkdi14PSI4NjEiIGQ9Ik00MTUgLTY5djI3N2gtNDA4djE4NWg0MDh2Mjc4bDQyOCAtMzcweiIgLz4KPGdseXBoIHVuaWNvZGU9Il4iIGhvcml6LWFkdi14PSI3NzUiIGQ9Ik03NDkgNTcycTIyIC00NiAtMyAtMTMycS0yNCAtODUgLTUgLTIzNHEtOCAtMiAtMjEgLTR0LTQ5IC04dC02NiAtOHQtNjEgLTJ0LTQ2LjUgOXQtMTAuNSAyNnExNSA0OCAtNDggNDZxLTYxIC0yIC0xODIgLTQ4cS0zNyAtMTQgLTYzIC0zdjM5OXEyMiA2IDU4IDE1dDExMiAyNXQxMjYuNSAxNC41dDUwLjUgLTI0LjVxMCAtMyAtMiAtMTQuNXQtMy41IC0yM3QtMS41IC0yM3Q1IC0xOHQxNiAtNS41cTMwIDQgNzguNSA3dDgyLjUgNHogTTE0NSA2NTh2LTgxN2gtODV2ODE3cTAgMTcgMTIuNSAyOS41dDMwLjUgMTIuNXExNyAwIDI5LjUgLTEyLjV0MTIuNSAtMjkuNXoiIC8+CjxnbHlwaCB1bmljb2RlPSJfIiBob3Jpei1hZHYteD0iODIwIiBkPSJNNTkgMTk4djE5OWg3MDJ2LTE5OWgtNzAyeiIgLz4KPGdseXBoIHVuaWNvZGU9ImAiIGhvcml6LWFkdi14PSI5MzYiIGQ9Ik0zMDYgMzc4bC0xNTIgMTUzbC05NSAtOTZ2Mjc3aDI3N2wtOTUgLTk1bDE1MiAtMTUyek03ODMgNzVsOTUgOTV2LTI3NmgtMjc3bDk1IDk1bC0xNTIgMTUxbDg3IDg3ek02MzEgMzc4bC04NyA4N2wxNTIgMTUybC05NSA5NWgyNzZ2LTI3N2wtOTQgOTV6TTMwNiAyMjdsODcgLTg3bC0xNTIgLTE1Mmw5NSAtOTVsLTI3NyAxdjI3N2w5NSAtOTZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iYSIgaG9yaXotYWR2LXg9IjgxMCIgZD0iTTc0NSAxNDRxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV0LTE0LjUgLTM2dC0zNS41IC0xNXEtMiAwIC02IDAuNXQtNiAwLjVxLTQyIC0zNiAtNzkgLTU5cS04MyAtNTUgLTE1NyAtNzZxLTcxIC00NCAtOTAgLTQ0cS0xNCAwIC05NSA0NXEtNzYgMjIgLTE1NiA3NXEtNDAgMjcgLTc5IDU5cS0yIDAgLTUuNSAtMC41dC01LjUgLTAuNXEtMjEgMCAtMzYgMTV0LTE1IDM2dDE1IDM1LjV0MzYgMTQuNXQzNS41IC0xNC41dDE0LjUgLTM1LjV2LTggcTkgLTggMzQgLTIydDM4IC0yM3E0NyAtMzEgMTQ0IC0zM2wzMiAxNTFxNCA5OCA3IDE5MmgtMTM2bC01MiAxMnEtMTQgLTE3IC0zMyAtMTdxLTE3IDAgLTI5IDExLjV0LTEyIDI4LjV0MTIgMjguNXQyOSAxMS41cTIyIDAgMzMgLTE4aDE5MHEyIDcyIDMgOTZxLTMyIDEwIC01MiAzNi41dC0yMCA2MC41cTAgNDIgMjkuNSA3MS41dDcwLjUgMjkuNXE0MiAwIDcxLjUgLTI5LjV0MjkuNSAtNzEuNXEwIC0zMyAtMjAgLTU5LjV0LTUxIC0zNi41IHEwIC03IDEuNSAtNDAuNWwyLjUgLTU2LjVoMTg5cTExIDE4IDMzIDE4cTE3IDAgMjkgLTExLjV0MTIgLTI4LjV0LTEyIC0yOC41dC0yOSAtMTEuNXEtMjEgMCAtMzIgMTdsLTUzIC0xMmgtMTM1bDYgLTE5MmwzMyAtMTU0cTc5IC00IDEyMCAyMXE1MCAzMCA5NiA2MnEtMSAyIC0xIDZxMCAyMSAxNSAzNS41dDM2IDE0LjV6TTM1MSA2MDFxMCAtMjIgMTUuNSAtMzcuNXQzNy41IC0xNS41cTIzIDAgMzguNSAxNS41dDE1LjUgMzcuNXQtMTYgMzcuNSB0LTM4IDE1LjV0LTM3LjUgLTE1LjV0LTE1LjUgLTM3LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iYiIgaG9yaXotYWR2LXg9IjkxOSIgZD0iTTQ2MSA2OTlsNDA4IC0xMTN2LTU5MWwtNDA4IC0xMTRsLTQxMCAxMTR2NTkxek00MjYgLTM4djQzOWwtMzA2IDg2di00NDF6TTQ2MCA0NjJsMzAwIDg0bC0yOTkgODJsLTMwMCAtODJ6TTgwMSA0NnY0NDBsLTMwNyAtODV2LTQ0MHoiIC8+CjxnbHlwaCB1bmljb2RlPSJjIiBob3Jpei1hZHYteD0iOTA4IiBkPSJNNzY3IDMxOHE0NiAtMTkgNzMuNSAtNjB0MjcuNSAtOTJxMCAtNjggLTQ4IC0xMTZ0LTExNiAtNDhoLTloLTE5OHYxNjJoMzBoNzZxMTIgMCAxNSA2LjV0LTQgMTYuNWwtMTQ1IDE3M3EtOCAxMCAtMTkuNSAxMHQtMTkuNSAtMTBsLTE0NSAtMTczcS04IC0xMCAtNSAtMTYuNXQxNiAtNi41aDc2aDMwdi0xNjJoLTE5OGgtMWgtMWgtMnYxcS02OCAxIC0xMTYuNSA1MHQtNDguNSAxMTdxMCA0NiAyMiA4NHQ2MCA2MXEtNSAxOCAtNSAzNCBxMCA0NyAzMy41IDgwLjV0ODEuNSAzMy41cTM5IDAgNjkgLTI0cTMxIDY0IDkxIDEwM3QxMzMgMzlxMTAzIDAgMTc1LjUgLTcyLjV0NzIuNSAtMTc1LjVxMCAtMTAgLTEgLTE1eiIgLz4KPGdseXBoIHVuaWNvZGU9ImQiIGhvcml6LWFkdi14PSI5MTgiIGQ9Ik00NTkgNjk5cTE3NCAwIDI5Ni41IC0xMjN0MTIyLjUgLTI5NnEwIC0xNzQgLTEyMi41IC0yOTYuNXQtMjk2LjUgLTEyMi41cS0xNzMgMCAtMjk2IDEyMi41dC0xMjMgMjk2LjVxMCAxNzMgMTIzIDI5NnQyOTYgMTIzek03NzQgMjgwcTAgMTMwIC05Mi41IDIyMnQtMjIyLjUgOTJxLTEwMCAwIC0xODIgLTU4bDQzOCAtNDM4cTU5IDgxIDU5IDE4MnpNMTQ1IDI4MHEwIC0xMzAgOTIgLTIyMnQyMjIgLTkycTEwMyAwIDE4MyA1OGwtNDM4IDQzOSBxLTU5IC04MyAtNTkgLTE4M3oiIC8+CjxnbHlwaCB1bmljb2RlPSJlIiBob3Jpei1hZHYteD0iNTU2IiBkPSJNNTUwIDY5OWwtMTkzIC0zNDJoMTU4bC01MTAgLTQ3NmwyMzkgMzg2aC0xNjB6IiAvPgo8Z2x5cGggdW5pY29kZT0iZiIgaG9yaXotYWR2LXg9IjkxMiIgZD0iTTU2IDQxNXExNDkgMCAyNzUgLTczLjV0MjAwIC0xOTkuNXQ3NSAtMjc1aC0xNjBxLTIgMTYxIC0xMTUgMjc0cS0xMTQgMTE0IC0yNzUgMTE0djE2MHpNNTYgNzAwcTE2OSAwIDMyMi41IC02NnQyNjUuNSAtMTc3LjV0MTc4IC0yNjZ0NjcgLTMyMy41aC0xNjBxLTEgMTgzIC05MS41IDMzNy41dC0yNDUgMjQ0LjV0LTMzNi41IDkwdjE2MXpNMTY3IDkwcTQ2IDAgNzguNSAtMzIuNXQzMi41IC03OC41dC0zMi41IC03OC41dC03OC41IC0zMi41IHQtNzguNSAzMi41dC0zMi41IDc4LjV0MzIuNSA3OC41dDc4LjUgMzIuNXoiIC8+CjxnbHlwaCB1bmljb2RlPSJnIiBob3Jpei1hZHYteD0iODk0IiBkPSJNODY1IDM2di0zNWgtMTUxdjQ3djFxLTQgNDMgLTU1IDczcS0xMCAxNiAtMjIgNDdxLTUgMTEgLTUgNDBxMCAzNyAxIDQxcTEzIDQ0IDY0IDQ0dDY0IC00NHYtNDFxMCAtMzAgLTQgLTQwcS0xNSAtMzkgLTI5IC01NHEyMCAtNCAzOCAtMTEuNXQzNS41IC0xN3QyMS41IC0xMS41cTE5IC04IDI5LjUgLTE4dDExLjUgLTE1ek0xODAgNDl2LTF2LTQ3aC0xNTF2MzVxMCAyIDEgNnQxMS41IDE0dDI5LjUgMThxNSAyIDIxLjUgMTJ0MzQuNSAxNy41IHQzOCAxMS41cS0xNCAxNSAtMjkgNTRxLTQgMTAgLTQgNDBxMCAzNyAxIDQxcTExIDQ0IDYzIDQ0cTUxIDAgNjQgLTQ0cTEgLTQgMSAtNDFxMCAtMzAgLTQgLTQwcS0xNSAtMzYgLTI0IC00OHEtNTMgLTMyIC01MyAtNzJ6TTYyMCAxMDJxMjUgLTExIDM5LjUgLTI0LjV0MTYuNSAtMjEuNWwyIC04di00N2gtNDYydjQ3cTAgMyAxLjUgOC41dDE2IDE5LjV0NDAuNSAyNnE2IDMgMjkgMTZ0NDggMjMuNXQ1MiAxNS41cS0xOCAyMSAtMzkgNzQgcS02IDEzIC02IDU2cTAgNTMgMSA1NnExNyA2MSA4NyA2MXQ4OCAtNjFxMSAtMyAxIC01NnEwIC00MSAtNiAtNTZxLTIxIC01NCAtNDAgLTc0cTI4IC01IDUyLjUgLTE1dDQ5IC0yNHQyOS41IC0xNnoiIC8+CjxnbHlwaCB1bmljb2RlPSJoIiBob3Jpei1hZHYteD0iOTA2IiBkPSJNODQ4IDQyNXEyNSAtNjggMjUgLTE0NHQtMjUgLTE0NHEtMTAgLTI4IC00MCAtMjhxLTYgMCAtMTAgMWwtNyAycS01NSAtMTExIC0xNjkgLTE2OWwyIC03cTQgLTE2IC0zLjUgLTMwdC0yMi41IC0yMHEtNzIgLTI1IC0xNDQgLTI1cS03MyAwIC0xNDUgMjVxLTE1IDYgLTIyLjUgMjB0LTMuNSAzMGwyIDdxLTExMiA1NSAtMTcwIDE2OWwtNyAtMnEtMyAtMSAtMTAgLTFxLTI5IDAgLTM5IDI4cS0yNiA3MCAtMjYgMTQ0dDI2IDE0NCBxMTAgMjggMzkgMjhxMyAwIDExIC0ybDYgLTFxNTggMTE1IDE3MCAxNjlsLTIgN3EtNCAxNiAzLjUgMzB0MjIuNSAyMHE3MiAyNSAxNDQgMjVxNzUgMCAxNDUgLTI2cTE1IC01IDIyLjUgLTE5dDMuNSAtMzBsLTIgLTdxMTEzIC01NiAxNzAgLTE2OWw2IDFxOCAyIDExIDJxMjkgMCAzOSAtMjh6TTgwOCAxNTFxMjMgNjMgMjMgMTMwcTAgNjYgLTIyIDEzMGwtMTY2IC00MXEyMCAtNDIgMjAgLTg5dC0yMCAtODl6TTU4MyAtNzRsLTQwIDE2NSBxLTQyIC0yMCAtODkgLTIwdC05MCAyMGwtNDAgLTE2NXE2MSAtMjMgMTMwIC0yM3E2OCAwIDEyOSAyM3pNNTYxIDEyOXExMiAtNyAxNyAtMTZxMjQgMTcgNDQgNDNxLTExIDYgLTE3IDE4cS04IDE3IDAgMzZxMTYgMzIgMTYgNzFxMCAzOCAtMTYgNzFxLTggMTggMCAzNnE3IDEyIDE3IDE4cS0xOSAyNSAtNDQgNDNxLTcgLTEyIC0xNyAtMTZxLTggLTQgLTE4IC00cS0xMSAwIC0xOCA0cS0zMyAxNiAtNzIgMTZxLTM4IDAgLTcxIC0xNiBxLTcgLTQgLTE4IC00cS0xMCAwIC0xOCA0cS0xMiA3IC0xNyAxNnEtMjUgLTE4IC00NCAtNDNxMTEgLTYgMTcgLTE4cTggLTE4IDAgLTM2cS0xNyAtMzYgLTE3IC03MXEwIC0zNiAxNiAtNzFxOSAtMTkgMCAtMzZxLTQgLTExIC0xNiAtMThxMTYgLTIyIDQ0IC00NHE1IDEwIDE3IDE3cTggNCAxOCA0cTExIDAgMTggLTRxMzMgLTE2IDcyIC0xNnEzOCAwIDcxIDE2cTcgNCAxOCA0cTEwIDAgMTggLTR6TTc1IDI4MXEwIC02NCAyMyAtMTMwbDE2NSA0MSBxLTIwIDQ1IC0yMCA4OXEwIDQ1IDIxIDg5bC0xNjYgNDFxLTIzIC02NyAtMjMgLTEzMHpNNDUzIDY1OXEtNjggMCAtMTI5IC0yM2w0MCAtMTY1cTQzIDIwIDg5IDIwcTQ3IDAgOTAgLTIwbDQwIDE2NXEtNjEgMjMgLTEzMCAyM3oiIC8+CjxnbHlwaCB1bmljb2RlPSJpIiBkPSJNNDYwIDY5OXExNzQgMCAyOTcgLTEyM3QxMjMgLTI5N3QtMTIzIC0yOTd0LTI5NyAtMTIzcS0xNzMgMCAtMjk2LjUgMTIzdC0xMjMuNSAyOTd0MTIzLjUgMjk3dDI5Ni41IDEyM3pNNTE0IDU2OXEtMzEgLTEgLTQ5IC0yMnQtMTggLTQ1cTAgLTI1IDEzLjUgLTQwLjV0MzYuNSAtMTUuNWgxcTI5IDAgNDguNSAyMC41dDE5LjUgNDguNXEwIDIzIC0xMyAzN3EtMTUgMTcgLTM5IDE3ek01NjUgOThsMyAzbC0yIDRsLTE4IDM4bC01IC00IHEtMTQgLTE0IC0zNC41IC0yOHQtMjQuNSAtMTV2NXEwIDcgMyAyMGw0NiAxODhxNiAyNSA2IDU3cTAgMTggLTYgMzBxLTcgMTIgLTIyIDEycS0yNSAwIC03MS41IC0yOC41dC05MS41IC03MC41bC0zIC0zbDE2IC00NWw2IDRxMzUgMzEgNTUgMzlxMCAtNiAtMyAtMjFsLTQzIC0xODJxLTYgLTMwIC02IC02MHEwIC0yNSAxMCAtMzZxOSAtMTAgMjYgLTEwcTIzIDAgNzAuNSAyOXQ4OC41IDc0eiIgLz4KPGdseXBoIHVuaWNvZGU9ImoiIGhvcml6LWFkdi14PSI4NzciIGQ9Ik04MzUgMjMydi0xbDEgLTF2LTFxMTkgLTM1IDE5IC03OXEwIC0xOCAtNSAtNDNxLTEyIC00NiAtNDUgLTgwbC02NCAtNjNxLTUxIC01MSAtMTIzIC01MXQtMTIyIDUxbC03NyA3NmwtNDcgNDhsLTMzIDMzcS0zNyAzNyAtNDggOTFxLTIgMjAgLTIgMzFxMCAxNyAzIDM1bDMgMTJxNCAxNSAxNCAzNHYxcTEgMSAyLjUgNGwyLjUgNWwxIDJsMSAxcTEgMSAyLjUgMy41dDIuNSAzLjV2MWwyIDJxMSAxIDMgMy41dDMgMy41djFsMiAybDQgNHQ0IDUgbDI4IDI4bDQgLTVsNTcgLTU2cTAgLTEgMiAtM3QyIC0zdDEgLTMuNXQxIC0zLjVsLTI1IC0yNXEtMSAtMSAtMyAtMy41dC00IC00LjVxMCAtMSAtMSAtMnYtMXEtMiAtMiAtNCAtNnEtMSAwIC0xIC0xdC0xIC0ydC0xLjUgLTMuNXQtMC41IC0zLjVsLTEgLTF2LTJxLTQgLTkgLTQgLTIycTAgLTE1IDcgLTMycTQgLTggMTQgLTIwbDU3IC01N2w0MCAtMzlsNjAgLTYxcTIxIC0yMSA1MiAtMjFxMzIgMCA1MiAyMWw2NCA2NHExMiAxMiAxOCAyOSBxMyAxMSAzIDIzcTAgMTAgLTMgMjFxLTUgMTkgLTE4IDMxbC05OCA5OHExIDYgMSAxN3EwIDIxIC0zIDQwcS0xMiA2OCAtNTkgMTE2cTM5IC0xMiA3MSAtNDJsMiAtMmwxNTcgLTE1N3ExOCAtMTggMjkgLTM5cTAgLTEgMSAtMXpNNTM4IDQ0MXEzOSAtMzkgNDggLTkxcTMgLTE1IDMgLTMxcTAgLTExIC00IC0zNWwtMyAtMTJxLTMgLTEyIC0xMyAtMzRsLTEgLTFxLTEgLTEgLTIuNSAtNGwtMi41IC01bC0xIC0ybC0xIC0xcS0yIC00IC01IC03IGwtMSAtMXEtMSAtMSAtMSAtMnEtMyAtMyAtNSAtN2wtMSAtMWwtMiAtMnEtMiAtMyAtOCAtOWwtMjggLTI4bC00IDVsLTU3IDU2cS0xIDEgLTIgM3QtMiAzdC0xIDMuNXQtMSAzLjVsMjUgMjVxMSAxIDMgMy41dDQgNC41cTAgMSAwLjUgMXQwLjUgMXYxcTIgMiA0IDZsMSAxcTEgMSAxIDJxMiA0IDMgN3YxcTAgMSAxIDJxMyAxMSAzIDIycTAgMTUgLTcgMzJxLTQgOCAtMTQgMjBsLTU3IDU3bC0zOSAzOWwtNjEgNjFxLTIxIDIxIC01MiAyMSB0LTUyIC0yMWwtNjQgLTY0cS0xMiAtMTIgLTE4IC0yOXEtMyAtMTEgLTMgLTIzcTAgLTEwIDMgLTIxcTUgLTE5IDE4IC0zMWw5OCAtOThxLTEgLTYgLTEgLTE3cTAgLTIzIDQgLTQwcTEwIC02NSA1OCAtMTE2cS00MCAxMiAtNzEgNDJsLTIgMmwtMTU3IDE1N3EtMTggMTggLTI5IDM5cTAgMSAtMSAxdjFsLTEgMXYxcS0xOSAzOCAtMTkgNzlxMCAxOCA1IDQzcTEyIDQ2IDQ1IDgwbDY0IDYzcTUxIDUxIDEyMyA1MXQxMjIgLTUxbDc3IC03NiBsNDcgLTQ4eiIgLz4KPGdseXBoIHVuaWNvZGU9ImsiIGhvcml6LWFkdi14PSI4OTYiIGQ9Ik02NTcgNjEwcTg5IDAgMTQ4LjUgLTUwLjV0NTkuNSAtMTU5LjVxMCAtNDkgLTI2IC0xMDF0LTUyIC03OWwtMjYgLTI4bC0zMTMgLTMxMmwtMzEzIDMxMmwtMTEgMTF0LTI1IDMwdC0zMiA0NnQtMjUgNTYuNXQtMTEgNjQuNXEwIDEwOSA1OSAxNTkuNXQxNDggNTAuNXE5MCAwIDE5MSAtMTA3bDE5IC0yMXE0IDUgMTEuNSAxMy41dDMxIDMxdDQ3IDM5dDU2LjUgMzAuNXQ2MyAxNHoiIC8+CjxnbHlwaCB1bmljb2RlPSJsIiBob3Jpei1hZHYteD0iOTQyIiBkPSJNMjc5IDcwMGg2MDV2LTEzM2gtNjA1djEzM3pNMjc5IDI4NHYxMzNoNjA1di0xMzNoLTYwNXpNMjc5IDB2MTMzaDYwNXYtMTMzaC02MDV6TTEyMiA3MDBxMjggMCA0Ny41IC0xOS41dDE5LjUgLTQ2LjVxMCAtMjggLTE5LjUgLTQ3LjV0LTQ3LjUgLTE5LjVxLTI3IDAgLTQ2LjUgMTkuNXQtMTkuNSA0Ny41cTAgMjcgMTkuNSA0Ni41dDQ2LjUgMTkuNXpNMTIyIDQxOHEyOCAwIDQ3LjUgLTE5LjV0MTkuNSAtNDcuNXEwIC0yNyAtMTkuNSAtNDYuNSB0LTQ3LjUgLTE5LjVxLTI3IDAgLTQ2LjUgMTkuNXQtMTkuNSA0Ni41cTAgMjggMTkuNSA0Ny41dDQ2LjUgMTkuNXpNMTIyIDEzNHEyOCAwIDQ3LjUgLTE5LjV0MTkuNSAtNDYuNXEwIC0yOCAtMTkuNSAtNDcuNXQtNDcuNSAtMTkuNXEtMjcgMCAtNDYuNSAxOS41dC0xOS41IDQ3LjVxMCAyNyAxOS41IDQ2LjV0NDYuNSAxOS41eiIgLz4KPGdseXBoIHVuaWNvZGU9Im0iIGhvcml6LWFkdi14PSI4MDgiIGQ9Ik03NzEgNjk4di04M3YtNTE0cS0xIC01MiAtNDYuNSAtODh0LTExMC41IC0zNnQtMTExIDM3dC00NiA4OXQ0NiA4OXQxMTEgMzdxMzYgMCA3MCAtMTN2MzA4bC0zNTIgLTg0di00OTVxLTEgLTUyIC00NyAtODguNXQtMTEwIC0zNi41cS02NSAwIC0xMTEgMzd0LTQ2IDkwcTAgNTIgNDYgODl0MTExIDM3cTM1IDAgNjkgLTEzdjUxM2gybDQzOCAxMDR6IiAvPgo8Z2x5cGggdW5pY29kZT0ibiIgaG9yaXotYWR2LXg9Ijk1NiIgZD0iTTc1OSA3MDBxNTggMCA5OSAtNDF0NDEgLTk5di01NjFxMCAtNTggLTQxIC05OXQtOTkgLTQxaC01NjFxLTU4IDAgLTk5IDQxdC00MSA5OXY1NjFxMCA1OCA0MSA5OXQ5OSA0MWg1NjF6TTc5NCA0OTBoLTUxM3YtMTE3aDUxM3YxMTd6TTI1OSAyMTdoLTk2di0xMTRoOTZ2MTE0ek0xNjMgMjM4aDk2djExNGgtOTZ2LTExNHpNMjgxIDIxN3YtMTE0aDUxM3YxMTRoLTUxM3pNMjgxIDIzOGg1MTN2MTE0aC01MTN2LTExNHpNMjU5IDQ5MGgtOTYgdi0xMTdoOTZ2MTE3ek0xNjMgLTFxMCAtMTQgMTAuNSAtMjQuNXQyNC41IC0xMC41aDYxdjExN2gtOTZ2LTgyek03NTkgLTM2cTE0IDAgMjQuNSAxMC41dDEwLjUgMjQuNXY4MmgtNTEzdi0xMTdoNDc4eiIgLz4KPGdseXBoIHVuaWNvZGU9Im8iIGhvcml6LWFkdi14PSI5NDEiIGQ9Ik04NjcgNTQ1cTExIDAgMTggLTcuNXQ3IC0xNy41di01MjVxMCAtMTEgLTcgLTE4dC0xOCAtN2gtNzg0cS0xMSAwIC0xOCA3dC03IDE4djUyNXEwIDEwIDcgMTcuNXQxOCA3LjVoMzhsMjkgNTlxMTEgMjIgMzYgMjJoMTU4cTI1IDAgMzYgLTIybDI4IC01OWg0NTl6IiAvPgo8Z2x5cGggdW5pY29kZT0icCIgaG9yaXotYWR2LXg9Ijg1NSIgZD0iTTU0MiA1NDlsMTUzIC0xNTNsLTQ2MCAtNDYwdjB2MGwtMjI2IC03NGw3MyAyMjd2MHYwek0xODggNjVsMzc5IDM3OWwtMjUgMjZsLTM4MCAtMzgwek02OTQgNzAxbDE1NCAtMTUzbC0xMDEgLTEwMGwtMTUzIDE1M3oiIC8+CjxnbHlwaCB1bmljb2RlPSJxIiBob3Jpei1hZHYteD0iOTEwIiBkPSJNODY1IDE2MHEwIC00MiAtMjYgLTc1dC02NiAtNDRxMTUgLTQzIDY2IC04MnExMiAtOCAtOSAtMTRxLTQ1IC0xMSAtMTE0IDIxcS01MiAyNSAtOTcgNzFoLTI5OXEtNDIgMCAtNzcgMjdxMzAgMTggNTYgNDNoMjc2cTc0IDAgMTI2LjUgNTIuNXQ1Mi41IDEyNi41djIzNXE0NyAtNSA3OSAtNDB0MzIgLTgzdi0yMzh6TTY5OCAyODZxMCAtNTIgLTM2IC04OHQtODcgLTM2aC0yOThxLTQ5IC01MCAtMTAwIC03MnQtOTAgLTIycS0zNCAwIC0zNCAxMSBxMCAzIDMgNXE1MCAzOCA2NiA4MnEtNDAgMTEgLTY2IDQ0dC0yNiA3NnYyMzdxMCA1MSAzNiA4Ny41dDg4IDM2LjVoNDIxcTUxIDAgODcgLTM2LjV0MzYgLTg3LjV2LTIzN3oiIC8+CjxnbHlwaCB1bmljb2RlPSJyIiBob3Jpei1hZHYteD0iOTAwIiBkPSJNNzI2IDI3OGwyNCAyNGw5MSA5MXYtMjYwcTAgLTEyOCAtMTI4IC0xMjhoLTUwOXYtMTA4bC0xNzEgMTcybDE3MSAxNzJ2LTExNXYtNmg0ODRxMTYgMCAyNyAxMXQxMSAyN3YxMjB6TTE3NCAzMTlsLTI0IC0yNGwtOTEgLTkxdjI2MHEwIDEyNyAxMjggMTI3aDUwOXYxMDhsMTcxIC0xNzFsLTE3MSAtMTcydjExNXY2aC00ODRxLTE2IDAgLTI3IC0xMS41dC0xMSAtMjcuNXYtMTE5eiIgLz4KPGdseXBoIHVuaWNvZGU9InMiIGhvcml6LWFkdi14PSI4NjQiIGQ9Ik04MTYgNHEyMyAtMjMgMjMgLTU0cTAgLTI5IC0yMCAtNDhxLTE5IC0xOSAtNDcgLTE5cS0zMiAwIC01NSAyM2wtMjE5IDIxOXEtNzQgLTQ4IC0xNjYgLTQ4cS0xMjkgMCAtMjIwLjUgOTEuNXQtOTEuNSAyMjAuNXQ5MS41IDIyMC41dDIyMC41IDkxLjV0MjIwLjUgLTkxLjV0OTEuNSAtMjIwLjVxMCAtOTAgLTQ3IC0xNjV6TTUwNiAzODlxMCA3MiAtNTEgMTIzdC0xMjMgNTF0LTEyMyAtNTF0LTUxIC0xMjN0NTEgLTEyM3QxMjMgLTUxIHQxMjMgNTF0NTEgMTIzeiIgLz4KPGdseXBoIHVuaWNvZGU9InQiIGhvcml6LWFkdi14PSI5MTkiIGQ9Ik00NjAgNjk5cTE3MyAwIDI5NiAtMTIzdDEyMyAtMjk2cTAgLTE3NCAtMTIzIC0yOTd0LTI5NiAtMTIzcS0xNzQgMCAtMjk3IDEyM3QtMTIzIDI5N3EwIDE3MyAxMjMgMjk2dDI5NyAxMjN6TTQ2MCAtMzVxMTMwIDAgMjIyIDkyLjV0OTIgMjIyLjV0LTkyIDIyMnQtMjIyIDkydC0yMjIuNSAtOTJ0LTkyLjUgLTIyMnQ5Mi41IC0yMjIuNXQyMjIuNSAtOTIuNXpNNjYzIDE4NnExNCAtMTAgNSAtMjRsLTI0IC0zOXEtNSAtNiAtMTEgLThoLTQgcS01IDAgLTEwIDNsLTE5MyAxMjlxLTEgMSAtMi41IDJ0LTIuNSAxcS01IDcgLTUgMTN2MjI4cTAgNyA1IDEycTcgNSAxMyA1aDQ2cTcgMCAxMiAtNXQ1IC0xMnYtMTkzeiIgLz4KPGdseXBoIHVuaWNvZGU9InUiIGhvcml6LWFkdi14PSI5NTUiIGQ9Ik02MCA2MzFoODM1di02NzNoLTgzNXY2NzN6TTgyNSAyOHY1MzRoLTY5NXYtNTM0aDY5NXpNMjI1IDQzMXEtMTggMCAtMzEgMTN0LTEzIDMxdDEzIDMwLjV0MzEgMTIuNXQzMC41IC0xMi41dDEyLjUgLTMwLjV0LTEyLjUgLTMxdC0zMC41IC0xM3pNNzMxIDQzMXEtMTggMCAtMzEgMTN0LTEzIDMxdDEzIDMwLjV0MzEgMTIuNXQzMC41IC0xMi41dDEyLjUgLTMwLjV0LTEyLjUgLTMxdC0zMC41IC0xM3pNMjI1IDE1OXExOCAwIDMwLjUgLTEzIHQxMi41IC0zMXQtMTIuNSAtMzAuNXQtMzAuNSAtMTIuNXQtMzEgMTIuNXQtMTMgMzAuNXQxMyAzMXQzMSAxM3pNNzMxIDE1OXExOCAwIDMwLjUgLTEzdDEyLjUgLTMxdC0xMi41IC0zMC41dC0zMC41IC0xMi41dC0zMSAxMi41dC0xMyAzMC41dDEzIDMxdDMxIDEzek01OTMgNDU3di0zMjVoLTIyOHYzMjVoMjI4ek01MzMgMTgxdjExOGgtMTA5di0xMThoMTA5eiIgLz4KPGdseXBoIHVuaWNvZGU9InYiIGhvcml6LWFkdi14PSI5NDUiIGQ9Ik04NjYgNTU3cTEwIDAgMTcuNSAtN3Q3LjUgLTE3di00NzJxMCAtMTEgLTcuNSAtMTh0LTE3LjUgLTdoLTc4NnEtMTAgMCAtMTcuNSA3dC03LjUgMTh2NDcycTAgMTAgNy41IDE3dDE3LjUgN2gxNzNxMCAxIDEgMWwyMyA0OHE0IDkgMTUgMTUuNXQyMSA2LjVoMzE5cTI1IDAgMzYgLTIybDI0IC00OHYtMWgxNzR6TTQ3MiAxMjBxNzUgMCAxMjggNTIuNXQ1MyAxMjcuNXQtNTMgMTI4dC0xMjggNTNxLTc0IDAgLTEyNyAtNTN0LTUzIC0xMjggdDUzIC0xMjcuNXQxMjcgLTUyLjV6IiAvPgo8Z2x5cGggdW5pY29kZT0idyIgaG9yaXotYWR2LXg9IjkyNyIgZD0iTTg4NSAzOTdxMTYgLTEzNyAtOTQuNSAtMjQ3dC0yODIuNSAtMTI5cS02MiAtNyAtMTIwIDBxLTkyIC05NSAtMTk3IC0xMDZxLTQ3IC01IC01NiA4cS0zIDQgMyA4cTg4IDY2IDgwIDE0NXEtNjkgMzkgLTExMiA5OHQtNTEgMTMwcS0xNiAxMzYgOTQgMjQ2LjV0MjgyIDEzMC41cTE3MiAxOSAzMDQuNSAtNjR0MTQ5LjUgLTIyMHoiIC8+CjxnbHlwaCB1bmljb2RlPSJ4IiBob3Jpei1hZHYteD0iOTQ5IiBkPSJNNTI2IDEwMHEyIDEwIDIgMTZsOTggOThsMTM5IC0xMzlsOTQgLTY5bDEwIC0zOGwtMTA0IC0xMDRsLTM3IDEwbC03MCA5NHpNNzU1IDIycS0xOCAwIC0zMC41IC0xMi41dC0xMi41IC0zMS41cTAgLTE4IDEyLjUgLTMwLjV0MzAuNSAtMTIuNXExOSAwIDMxLjUgMTIuNXQxMi41IDMwLjVxMCAxOSAtMTIuNSAzMS41dC0zMS41IDEyLjV6TTQ2OSAzNzFsLTk4IC05OHEtNiAwIC0xNiAtMmwtNzEgNzBxLTMyIC0xNSAtNTYgLTE1IHEtNzQgMCAtMTMzLjUgNjB0LTYwLjUgMTM0cTAgMSAxNyAxOHE2MyAtNjMgNzEgLTY4dDQ1IC01cTI5IDAgNjUuNSAzNnQzNi41IDY2cTAgMzYgLTYgNDUuNXQtNjcgNjkuNXExNSAxOCAxOCAxOHE3NCAxIDEzNCAtNTkuNXQ2MCAtMTM0LjVxMCAtMjcgLTE2IC01N3pNNzg2IDIwMnEwIDMgMC41IDcuNXQwLjUgMTguNXQtMS41IDI4dC01LjUgMzJ0LTEwLjUgMzMuNXQtMTkgMzAuNXQtMjguNSAyNGgtM3EtMTAgMCAtMzQgLTIybC0yMTggLTIxNyBxOCAtMjkgLTggLTQ3cS0yIC0xIC03IC02bC0yMDEgLTIwMXEtNSAtNSAtNiAtN3EtMTEgLTExIC0yOSAtMTFxLTQxIDAgLTc3IDQ4dC04IDc3cTMgMiA2IDZsMjAyIDIwMnE1IDMgNiA2cTExIDExIDI4IDExcTkgMCAxOSAtM2wxOTQgMTk0bDQgNnE0IDYgNS41IDh0NSA4LjV0NC41IDExdDEuNSAxMXQtMSAxMy41dC00LjUgMTRxLTE2IDI5IC02MCAzOGgtMXEtMTYgMCAtNTUgMzdsLTYgNnEtMTkgMTkgLTIwIDI1dDE4IDI3bDcyIDczIHExNyAxNyAyNiAxN3E2IDAgMjYgLTIwbDYgLTZxMzMgLTMzIDM3IC00OXE0IC0yMCAyNCAtNDZxMyAtNCAxOCAtNHQxOSAtNGwxMTkgLTExOXE3MyAtNzMgMzAgLTI1MmwtMTUgLTUweiIgLz4KPGdseXBoIHVuaWNvZGU9InkiIGhvcml6LWFkdi14PSI4OTciIGQ9Ik04NDMgMzU5cTkgLTEgMTUuNSAtOXQ2LjUgLTE3di05N3EwIC05IC02LjUgLTE3dC0xNS41IC05bC0xMjQgLTIzcS05IC0yIC0xMiAtOHQyIC0xNGw3MiAtMTA2cTEyIC0xOSAtNCAtMzVsLTY4IC02OHEtMTYgLTE2IC0zNCAtM2wtMTA2IDcxcS03IDUgLTE0LjUgMi41dC04LjUgLTExLjVsLTIzIC0xMjVxLTEgLTkgLTkgLTE1LjV0LTE3IC02LjVoLTk3cS05IDAgLTE3IDYuNXQtOSAxNS41bC0yMyAxMjVxLTEgOSAtOC41IDExLjUgdC0xNC41IC0yLjVsLTEwNSAtNzFxLTIwIC0xMiAtMzUgM2wtNjggNjhxLTE2IDE2IC00IDM1bDcyIDEwNnE1IDggMiAxNHQtMTIgOGwtMTI0IDIzcS05IDEgLTE1LjUgOXQtNi41IDE3djk3cTAgOSA2LjUgMTd0MTUuNSA5bDEyNCAyM3EyMiA2IDEwIDIzbC03MiAxMDZxLTExIDE5IDQgMzRsNjggNjhxMTYgMTYgMzUgNGwxMDUgLTcycTcgLTUgMTQuNSAtMnQ4LjUgMTJsMjMgMTI0cTEgOSA5IDE1LjV0MTcgNi41aDk3cTkgMCAxNyAtNi41IHQ5IC0xNS41bDIzIC0xMjRxMSAtOSA4LjUgLTEydDE0LjUgMmwxMDYgNzJxMTggMTIgMzQgLTRsNjggLTY4cTE1IC0xNSA0IC0zNGwtNzIgLTEwNnEtMTIgLTE3IDEwIC0yM3pNNDQ4IDEzNHE2MyAwIDEwNyA0NHQ0NCAxMDZ0LTQ0IDEwNi41dC0xMDcgNDQuNXEtNjIgMCAtMTA2IC00NC41dC00NCAtMTA2LjV0NDQgLTEwNnQxMDYgLTQ0eiIgLz4KPGdseXBoIHVuaWNvZGU9InoiIGhvcml6LWFkdi14PSI3MzYiIGQ9Ik00MzMgLTMzcTM0IDAgNTUgMjNsMTc2IDE3NmwzOSAtMzlxMTUgLTE1IDAgLTMxbC0yNTQgLTI1NHEtMTUgLTE2IC0zMSAwbC0zNTAgMzUwcS0xNSAxNSAtMTcgMzZsLTggOTdsMzM1IC0zMzVxMjMgLTIzIDU1IC0yM3pNMzUzIDY2NGwzNTAgLTM0OXExNiAtMTYgMCAtMzFsLTI1NCAtMjU1cS03IC02IC0xNiAtNnQtMTUgNmwtMzUwIDM1MHEtMTUgMTcgLTE3IDM3bC0xNyAxOTBxLTIgMjIgMTQgMzZsNDMgNDRxMTUgMTMgMzQgMTNoMyBsMTg5IC0xN3EyMiAtMiAzNiAtMTh6TTExNSA2MTdxLTE0IC0xMyAtMTQgLTMzdDE0IC0zM3ExMyAtMTMgMzMgLTEzdDMzIDEzdDEzIDMzdC0xMyAzM3EtMTQgMTQgLTMzIDE0dC0zMyAtMTR6IiAvPgo8Z2x5cGggdW5pY29kZT0ieyIgaG9yaXotYWR2LXg9Ijc2MiIgZD0iTTc1MSAyOTloLTI3OHYtNDA4aC0xODV2NDA4aC0yNzdsMzcwIDQyOHoiIC8+CjxnbHlwaCB1bmljb2RlPSJ8IiBob3Jpei1hZHYteD0iOTE1IiBkPSJNMTgyIDI4MHEtMyAtMTYgLTMgLTM1di02OXEtNTggMCAtOTguNSA0MC41dC00MC41IDk4LjV2MjQ0cTAgNTggNDAuNSA5OC41dDk4LjUgNDAuNWgzNDhxNTggMCA5OC41IC00MC41dDQwLjUgLTk4LjV2LTEwNWgtMTA0djEwNXEwIDE0IC0xMC41IDI0LjV0LTI0LjUgMTAuNWgtMzQ4cS0xNCAwIC0yNC41IC0xMC41dC0xMC41IC0yNC41di0yNDRxMCAtMTQgMTAuNSAtMjQuNXQyNC41IC0xMC41aDN6TTczNiAzODVxNTcgMCA5OCAtNDEgdDQxIC05OXYtMjQzcTAgLTU4IC00MSAtOTl0LTk4IC00MWgtMzQ4cS01OCAwIC05OC41IDQxdC00MC41IDk5djI0M3EwIDU4IDQwLjUgOTl0OTguNSA0MWgzNDh6TTc3MCAydjI0M3EwIDE1IC0xMCAyNXQtMjQgMTBoLTM0OHEtMTQgMCAtMjQuNSAtMTB0LTEwLjUgLTI1di0yNDNxMCAtMTUgMTAuNSAtMjV0MjQuNSAtMTBoMzQ4cTE0IDAgMjQgMTB0MTAgMjV6IiAvPgo8Z2x5cGggdW5pY29kZT0ifSIgaG9yaXotYWR2LXg9Ijc2MiIgZD0iTTExIDMwMWgyNzd2NDA5aDE4NXYtNDA5aDI3OGwtMzcwIC00Mjd6IiAvPgo8Z2x5cGggdW5pY29kZT0ifiIgZD0iTTQ2MCA2OTlxMTc0IDAgMjk3IC0xMjN0MTIzIC0yOTd0LTEyMyAtMjk3dC0yOTcgLTEyM3QtMjk3IDEyM3QtMTIzIDI5N3QxMjMgMjk3dDI5NyAxMjN6TTYyOCAzNHYyMzJoLTE2NmwxNDUgMTY3aC0xMTJ2MTM1aC03NXYtMTM1aC0xMTJsMTQ0IC0xNjdoLTE2MnYtMjMyaDE0NWwtMzkgLTM5aDEyNmwtMzkgMzloMTQ1ek0zMzMgNzZ2MTQ4aDI1M3YtMTQ4aC0yNTN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZmY7IiBob3Jpei1hZHYteD0iODMzIiAvPgo8Z2x5cGggaG9yaXotYWR2LXg9IjUwMCIgLz4KPC9mb250Pgo8L2RlZnM+PC9zdmc+IA==') format('svg')}.x-tab .x-button-icon:before,.x-button .x-button-icon:before{font-family:"Pictos"}.x-img.x-img-image{text-align:center}.x-img.x-img-image img{width:auto;height:100%}.x-img.x-img-background{background-repeat:no-repeat;background-position:center;background-size:auto 100%}.x-map{background-color:#edeae2}.x-map *{-webkit-box-sizing:content-box;box-sizing:content-box}.x-mask-map{background:transparent !important}.x-map-container{position:absolute !important;top:0;left:0;right:0;bottom:0}.x-mask{min-width:8.5em;position:absolute;top:0;left:0;bottom:0;right:0;height:100%;z-index:10;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;background:rgba(0,0,0,0.3) center center no-repeat}.x-mask.x-mask-gray{background-color:rgba(0,0,0,0.5)}.x-mask.x-mask-transparent{background-color:transparent}.x-mask .x-mask-inner{position:relative;background:rgba(0,0,0,0.25);color:#fff;text-align:center;padding:.4em;font-size:.95em;font-weight:bold}.x-mask .x-loading-spinner-outer{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:100%;min-width:8em;height:8em}.x-mask.x-indicator-hidden .x-mask-inner{padding-bottom:0 !important}.x-mask.x-indicator-hidden .x-loading-spinner-outer{display:none}.x-mask.x-indicator-hidden .x-mask-message{position:relative;bottom:.25em}.x-mask .x-mask-message{position:absolute;bottom:5px;color:#333;left:0;right:0;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.x-mask.x-has-message .x-mask-inner{padding-bottom:2em}.x-mask.x-has-message .x-loading-spinner-outer{height:168px}.x-ie .x-mask[visibility='visible'] ~ div:not(.x-mask) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-panel) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-floating) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-center) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-msgbox) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-mask) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-panel) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-floating) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-center) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-msgbox) .x-input-el{visibility:collapse}.x-video{height:100%;width:100%;background-color:#000}.x-video>*{height:100%;width:100%;position:absolute}.x-video-ghost{-webkit-background-size:100% auto;background:#000 url() center center no-repeat}audio{width:100%}.x-msgbox{min-width:15em;max-width:20em;max-height:90%;margin:6px;border:1px solid #ccc}.x-msgbox .x-docking-vertical{overflow:hidden}.x-msgbox .x-toolbar.x-docked-top{border-bottom:0}.x-msgbox .x-toolbar.x-docked-bottom{border-top:0}.x-ie .x-msgbox .x-dock.x-dock-horizontal.x-unsized>.x-dock-body{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px}.x-msgbox-text{text-align:center}.x-msgbox-buttons .x-button{min-width:4.5em}.x-progressindicator{width:50%;height:1.3em}.x-progressindicator .x-progressindicator-inner{background:#222222;padding:10px;height:100%;border-radius:20px;box-shadow:0px 5px 17px rgba(40,40,40,0.5);box-sizing:content-box;position:relative}.x-progressindicator .x-progressindicator-text{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:100%;height:100%;position:absolute;top:0px;left:0px;color:white;text-shadow:1px 1px 2px black}.x-progressindicator .x-progressindicator-bar{height:100%;width:0%;border-radius:10px}.x-progressindicator:not(.x-item-hidden) .x-progressindicator-bar .x-progressindicator-bar-fill{height:100%;width:100%;background-color:gray;border-radius:10px;-webkit-animation-name:progressIndicator;-moz-animation-name:progressIndicator;-ms-animation-name:progressIndicator;-o-animation-name:progressIndicator;animation-name:progressIndicator;-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;-moz-animation-timing-function:linear;-ms-animation-timing-function:linear;-o-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;-o-animation-iteration-count:infinite;animation-iteration-count:infinite;background-repeat:repeat-x;background-size:30px 30px;background-image:-webkit-linear-gradient(135deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-image:-moz-linear-gradient(135deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-image:-o-linear-gradient(135deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-image:-ms-linear-gradient(-45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}@-webkit-keyframes progressIndicator{to{background-position:30px}}@-moz-keyframes progressIndicator{to{background-position:30px}}@keyframes progressIndicator{to{background-position:30px}}.x-panel,.x-msgbox{position:relative}.x-panel.x-floating,.x-msgbox,.x-form.x-floating{padding:6px;background-color:#ccc}.x-panel.x-floating .x-panel-inner,.x-panel.x-floating>.x-body,.x-msgbox .x-panel-inner,.x-msgbox>.x-body,.x-form.x-floating .x-panel-inner,.x-form.x-floating>.x-body{z-index:1;background-color:#fff}.x-panel.x-floating>.x-dock,.x-msgbox>.x-dock,.x-form.x-floating>.x-dock{z-index:1}.x-panel.x-floating>.x-dock.x-sized,.x-msgbox>.x-dock.x-sized,.x-form.x-floating>.x-dock.x-sized{margin:6px}.x-sheet,.x-sheet-action{height:auto}.x-toolbar{position:relative;background-color:#eee;min-height:2.6em;overflow:hidden}.x-toolbar.x-docked-top{border-bottom:1px solid}.x-toolbar.x-docked-bottom{border-top:1px solid}.x-toolbar.x-docked-left{width:50px;height:auto;border-right:1px solid}.x-toolbar.x-docked-right{width:50px;height:auto;border-left:1px solid}.x-title{font-size:1.2em;text-align:center;font-weight:bold;max-width:100%}.x-title.x-title-align-left{padding-left:10px}.x-title.x-title-align-right{padding-right:10px}.x-title .x-innerhtml{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-navigation-bar .x-container{overflow:visible}.x-toolbar-inner .x-field .x-component-outer{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto}.x-ie .x-toolbar-inner{height:100% !important}.x-toast{min-width:15em;max-width:20em;max-height:90%;margin:6px}.x-toast .x-toast-text{text-align:center}.x-ie .x-toast .x-dock.x-dock-horizontal.x-unsized>.x-dock-body{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px}.x-menu{background:#eee}.x-carousel-inner{position:relative;overflow:hidden}.x-carousel-item,.x-carousel-item>*{position:absolute !important;width:100%;height:100%}.x-carousel-indicator{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.x-carousel-indicator span{display:block;width:10px;height:10px;margin:3px;background-color:#eee}.x-carousel-indicator span.x-carousel-indicator-active{background-color:#ccc}.x-carousel-indicator-horizontal{width:100%}.x-carousel-indicator-vertical{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;height:100%}.x-android-3 .x-surface-wrap,.x-android-3 .x-surface-wrap>*{-webkit-perspective:1}.x-draw-component{position:relative}.x-draw-component .x-inner{overflow:hidden}.x-surface{position:absolute}.x-chart-watermark{opacity:0.5;z-index:9;right:0;bottom:0;background:rgba(0,0,0,0.5);color:white;padding:4px 6px;font-family:"Helvetica";font-size:12px;position:absolute;border-top-left-radius:4px;white-space:nowrap;-webkit-border-top-left-radius:4px}.x-legend .x-legend-inner .x-legend-container{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:1px solid #ccc;background:#fff}.x-legend .x-legend-inner .x-legend-container .x-legend-item{padding:0.8em 1em 0.8em 1.8em;color:#333;background:rgba(255,255,255,0);max-width:20em;min-width:0;font-size:14px;line-height:14px;font-weight:bold;white-space:nowrap;position:relative}.x-legend .x-legend-inner .x-legend-container .x-legend-item .x-legend-inactive{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=30);opacity:.3}.x-legend .x-legend-inner .x-legend-container .x-legend-item .x-legend-item-marker{position:absolute;width:.8em;height:.8em;-moz-border-radius:.4em;-webkit-border-radius:.4em;border-radius:.4em;-moz-box-shadow:rgba(255,255,255,0.3) 0 1px 0,rgba(0,0,0,0.4) 0 1px 0 inset;-webkit-box-shadow:rgba(255,255,255,0.3) 0 1px 0,rgba(0,0,0,0.4) 0 1px 0 inset;box-shadow:rgba(255,255,255,0.3) 0 1px 0,rgba(0,0,0,0.4) 0 1px 0 inset;left:.7em;top:1em}.x-legend.x-docked-top .x-legend-item,.x-legend.x-docked-bottom .x-legend-item{border-right:1px solid rgba(204,204,204,0.5)}.x-legend.x-docked-top .x-legend-item:last-child,.x-legend.x-docked-bottom .x-legend-item:last-child{border-right:0}.x-legend.x-docked-left .x-legend-inner,.x-legend.x-docked-right .x-legend-inner{display:-webkit-box;-webkit-box-align:center;-webkit-box-pack:center}.x-chart-toolbar{position:absolute;z-index:9;display:-webkit-box;display:-moz-box;display:-ms-box;display:box;padding:.6em}.x-chart-toolbar .x-button{margin:.2em}.x-chart-toolbar[data-side=left],.x-chart-toolbar[data-side=right]{top:0;-webkit-box-orient:vertical;-moz-box-orient:vertical;-ms-box-orient:vertical;box-orient:vertical}.x-chart-toolbar[data-side=left]{left:0}.x-chart-toolbar[data-side=right]{right:0}.x-chart-toolbar[data-side=top],.x-chart-toolbar[data-side=bottom]{-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-ms-box-orient:horizontal;box-orient:horizontal;right:0}.x-chart-toolbar[data-side=top]{top:0}.x-chart-toolbar[data-side=bottom]{bottom:0;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-ms-box-orient:horizontal;box-orient:horizontal}.x-tab .x-button-icon.list:before,.x-button .x-button-icon.list:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"l"}.x-tab .x-button-icon.expand:before,.x-button .x-button-icon.expand:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"`"}.x-dataview-inlineblock .x-dataview-item,.x-dataview-inlineblock .x-data-item{display:inline-block !important}.x-dataview-nowrap .x-dataview-container{white-space:nowrap !important}.x-dataview-nowrap .x-container.x-dataview{white-space:nowrap !important}.x-list{overflow:hidden}.x-list .x-scroll-scroller{max-width:100%}.x-list .x-list-inner{width:100% !important}.x-list.x-list-indexed .x-list-disclosure{margin-right:50px}.x-list .x-item-selected .x-list-disclosure{background-color:#fff}.x-list .x-list-scrolldock-hidden{display:none}.x-list .x-list-item{position:absolute !important;left:0;top:0;width:100%}.x-list .x-list-item>.x-dock{height:auto}.x-list .x-list-item .x-dock-horizontal{border-top:1px solid #ccc}.x-list .x-list-item.x-item-selected .x-dock-horizontal,.x-list .x-list-item.x-item-selected.x-list-item-tpl{background-color:#ccc}.x-list .x-list-item.x-item-pressed.x-list-item-tpl,.x-list .x-list-item.x-item-pressed .x-dock-horizontal{background-color:#ddd}.x-list .x-list-item .x-list-item-body,.x-list .x-list-item.x-list-item-tpl .x-innerhtml{padding:5px}.x-list .x-list-item.x-list-item-relative{position:relative !important}.x-list .x-list-header{background-color:#eee;border-top:1px solid #ccc;border-bottom:1px solid #ccc;font-weight:bold}.x-list .x-list-header.x-list-item-relative{position:relative !important}.x-list .x-list-disclosure{margin:5px 15px 5px 0;overflow:visible;width:20px;height:20px;border:1px solid #ccc;background-color:#eee}.x-list .x-list-item-tpl .x-list-disclosure{position:absolute;right:0px;top:0px}.x-list .x-list-emptytext{text-align:center;pointer-events:none;font-color:#333333;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-list.x-list-indexed .x-list-disclosure{margin-right:35px}.x-list .x-list-scrolldockitem{position:absolute !important;left:0;top:0;width:100%}.x-ie .x-list-grouped .x-translatable-container .x-list-item:before,.x-ie .x-list-grouped .x-translatable-container .x-list-header:before{content:". .";color:transparent;position:absolute;left:0px;word-spacing:3000px;opacity:0}.x-list-header{position:absolute;left:0;width:100%;z-index:2 !important}.x-ios .x-list-header{-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.x-list-grouped .x-list-item.x-list-header-wrap .x-dock-horizontal,.x-list-grouped .x-list-item-tpl.x-list-header-wrap{border-top:0}.x-list-inlineblock .x-list-item{display:inline-block !important}.x-list-nowrap .x-list-inner{width:auto}.x-list-nowrap .x-list-container{white-space:nowrap !important}.x-list-item-dragging{border-bottom:1px solid #ccc;background:#fff !important;z-index:1}.x-indexbar-wrapper{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important;pointer-events:none}.x-indexbar{pointer-events:auto;z-index:2;min-height:0 !important;height:auto !important;-webkit-box-flex:0 !important;-ms-flex:0 0 auto !important;flex:0 0 auto !important}.x-indexbar>div{font-size:0.6em;text-align:center;line-height:1.1em;font-weight:bold;display:block}.x-indexbar-vertical{width:15px;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;margin-right:15px}.x-indexbar-horizontal{height:15px;-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.x-phone.x-landscape .x-indexbar>div{font-size:0.38em;line-height:1em}.x-indexbar-pressed{background-color:#ccc}.x-form-label{display:none !important}.x-form-label span{font-weight:bold}.x-form-label-nowrap .x-form-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-field{display:flex;display:-webkit-box;display:-ms-flexbox}.x-field .x-field-input{position:relative;min-width:3.7em}.x-field .x-field-input,.x-field .x-input-el{width:100%}.x-field.x-field-labeled .x-form-label{display:block !important}.x-field .x-component-outer{position:relative}.x-label-align-left,.x-label-align-right{-webkit-box-orient:horizontal !important;-ms-flex-direction:row !important;flex-direction:row !important}.x-label-align-left .x-component-outer,.x-label-align-right .x-component-outer{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px}.x-label-align-right{-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.x-label-align-top,.x-label-align-bottom{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-label-align-bottom{-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.x-input-el{display:block}.x-field-mask{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-ie .x-field.x-field-text .x-field-mask,.x-ie .x-field.x-field-textarea .x-field-mask,.x-ie .x-field.x-field-search .x-field-mask{z-index:-1}.x-field-required .x-form-label:after{content:"*";display:inline}.x-spinner .x-component-outer{display:flex;display:-webkit-box;display:-ms-flexbox}.x-spinner .x-component-outer>*{width:auto}.x-spinner .x-field-input{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px}.x-spinner .x-field-input .x-input-el{width:100%;text-align:center}.x-spinner .x-field-input input::-webkit-outer-spin-button,.x-spinner .x-field-input input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.x-spinner .x-spinner-button{text-align:center;border:1px solid #ccc !important;background-color:#eee}.x-spinner.x-field-grouped-buttons .x-input-el{text-align:left}.x-select-overlay .x-list-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}.x-field-number input::-webkit-outer-spin-button,.x-field-number input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.x-field-input .x-clear-icon,.x-field-input .x-reveal-icon{display:none;width:10px;height:10px;background-color:#ccc;position:absolute;top:50%;right:0}.x-field-clearable .x-clear-icon{display:block}.x-field-clearable .x-field-input{padding-right:10px}.x-field-revealable .x-reveal-icon{display:block}.x-field-revealable .x-field-input{padding-right:10px}.x-field-clearable.x-field-revealable .x-reveal-icon{right:20px}.x-android .x-input-el{-webkit-text-fill-color:#000}.x-android .x-empty .x-input-el{-webkit-text-fill-color:#A9A9A9}.x-android .x-item-disabled .x-input-el{-webkit-text-fill-color:#b3b3b3}.x-form-fieldset .x-form-fieldset-inner{border:1px solid #ccc;overflow:hidden}.x-form-fieldset .x-dock .x-dock-body{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto}.x-form-fieldset-title{font-weight:bold}.x-form-fieldset-title .x-innerhtml{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-form-fieldset-instructions{text-align:center}.x-ie .x-field-select .x-field-mask{z-index:3}.x-sheet.x-picker{padding:0}.x-sheet.x-picker .x-sheet-inner{background-color:#fff;overflow:hidden}.x-sheet.x-picker .x-sheet-inner .x-picker-slot .x-body{border-left:1px solid #999999;border-right:1px solid #ACACAC}.x-sheet.x-picker .x-sheet-inner .x-picker-slot.x-first .x-body{border-left:0}.x-sheet.x-picker .x-sheet-inner .x-picker-slot.x-last .x-body{border-left:0;border-right:0}.x-picker-slot .x-scroll-view{z-index:2;position:relative}.x-picker-mask{position:absolute;top:0;left:0;right:0;bottom:0;z-index:3;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;pointer-events:none}.x-picker-slot-title{position:relative;z-index:2}.x-picker-slot-title>div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:bold}.x-picker-slot .x-dataview-inner{width:100% !important}.x-picker-slot .x-dataview-item{vertical-align:middle;height:30px;line-height:30px}.x-picker-slot .x-dataview-item.x-item-selected{font-weight:bold}.x-picker-slot .x-picker-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-ie .x-picker-item{cursor:default}.x-ie .x-picker-item::before{content:". .";color:transparent;position:absolute;left:0px;word-spacing:3000px}.x-picker-right{text-align:right}.x-picker-center{text-align:center}.x-picker-left{text-align:left}.x-list-paging .x-loading-spinner{display:none;margin:auto}.x-list-paging .x-list-paging-msg{text-align:center;clear:both}.x-list-paging.x-loading .x-loading-spinner{display:block}.x-list-paging.x-loading .x-list-paging-msg{display:none}.x-list-pullrefresh{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;position:absolute;top:-5em;left:0;width:100%;height:4.5em}.x-list-pullrefresh .x-loading-spinner{display:none}.x-list-pullrefresh-arrow{width:2.5em;height:4.5em;background-color:#bbb}.x-list-pullrefresh-wrap{width:20em;font-size:0.7em}.x-list-pullrefresh-message{font-weight:bold;font-size:1.3em;text-align:center}.x-list-pullrefresh-updated{text-align:center}.x-list-pullrefresh-loading *.x-loading-spinner{display:block}.x-list-pullrefresh-loading .x-list-pullrefresh-arrow{display:none}.x-android-2 .x-list-pullrefresh-loading *.x-loading-spinner{display:none}.x-slider,.x-toggle{position:relative;height:16px;min-height:0;min-width:0}.x-slider>*,.x-toggle>*{position:absolute;width:100%;height:100%}.x-thumb{position:absolute;height:16px;width:10px;border:1px solid #ccc;background-color:#ddd}.x-slider:before{content:'';position:absolute;width:auto;height:8px;top:4px;left:0;right:0;margin:0 5px;background-color:#eee}.x-toggle{border:1px solid #ccc;width:30px;overflow:hidden;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.x-toggle-on{background-color:#eee}.x-tab{z-index:1;overflow:visible !important;background-color:#eee;border:1px solid #ccc}.x-tabbar{border-color:#ccc;border-style:solid;border-width:0;background-color:#eee}.x-tabbar.x-docked-top{border-bottom-width:1px}.x-tabbar.x-docked-top .x-tab .x-button-icon{position:relative}.x-tabbar.x-docked-top .x-tab .x-button-icon.x-shown{display:inline-block}.x-tabbar.x-docked-top .x-tab .x-button-icon.x-hidden{display:none}.x-tabbar.x-docked-bottom{border-top-width:1px}.x-tabbar.x-docked-bottom .x-tab .x-button-icon{display:block;position:relative}.x-tabbar.x-docked-bottom .x-tab .x-button-icon.x-shown{visibility:visible}.x-tabbar.x-docked-bottom .x-tab .x-button-icon.x-hidden{visibility:hidden}.x-tab{position:relative;min-width:3.3em}.x-table-inner{display:table !important;width:100% !important;height:100% !important}.x-table-inner.x-fixed-layout{table-layout:fixed !important}.x-table-row{display:table-row !important}.x-table-cell{display:table-cell !important;vertical-align:middle}.x-orientation-inspector{display:none;content:"landscape"}@media (orientation: portrait){.x-orientation-inspector{content:"portrait"}}.x-grid .x-grid-header-container{border-width:0 1px 1px 0;border-style:solid;height:65px;font-weight:bold;overflow:hidden}.x-grid .x-grid-header-container .x-grid-column{display:inline-block}.x-grid .x-grid-header-container .x-grid-header-container-inner{width:100000px;position:absolute;top:0;left:0}.x-grid .x-grid-column{height:64px;border-width:1px 1px 0 1px;border-style:solid;line-height:64px;vertical-align:middle;padding:0 8px}.x-grid .x-grid-column .x-innerhtml{display:inline-block;width:auto;position:relative}.x-grid .x-grid-column.x-column-sorted-asc .x-innerhtml:after,.x-grid .x-grid-column.x-column-sorted-desc .x-innerhtml:after{position:absolute;width:12px;line-height:64px;top:0;height:64px;font-family:'Pictos';font-size:12px}.x-grid .x-grid-column.x-column-align-left .x-innerhtml:after,.x-grid .x-grid-column.x-column-align-center .x-innerhtml:after{right:-16px}.x-grid .x-grid-column.x-column-align-right .x-innerhtml:after{left:-16px}.x-grid .x-grid-column.x-column-sorted-asc .x-innerhtml:after{content:"{"}.x-grid .x-grid-column.x-column-sorted-desc .x-innerhtml:after{content:"}"}.x-grid .x-grid-headergroup{display:inline-block;position:relative;vertical-align:bottom;height:64px;padding-top:32px}.x-grid .x-grid-headergroup .x-inner>.x-innerhtml{height:32px;line-height:28px;vertical-align:middle;display:block;position:absolute;width:100%;top:0;left:0;text-align:center;border-style:solid;border-width:1px;overflow:hidden;text-overflow:ellipsis}.x-grid .x-grid-headergroup .x-grid-column{height:32px !important;line-height:27px !important;font-size:0.7em}.x-grid .x-grid-headergroup .x-grid-column.x-column-sorted-asc .x-innerhtml:after,.x-grid .x-grid-headergroup .x-grid-column.x-column-sorted-desc .x-innerhtml:after{line-height:27px;height:27px}.x-grid .x-grid-row{position:absolute;left:0;top:0;border-width:0 0 1px 0;border-style:solid}.x-grid .x-grid-cell{display:inline-block;vertical-align:middle;line-height:60px;padding:0 8px;height:60px;overflow:hidden;border-width:0 1px 0 0}.x-grid .x-grid-cell-align-center,.x-grid .x-grid-column-align-center{text-align:center}.x-grid .x-grid-cell-align-right,.x-grid .x-grid-column-align-right{text-align:right}.x-grid .x-grid-viewoptions{border-width:0 0 0 1px;border-style:solid}.x-grid .x-grid-viewoptions .x-list-item .x-innerhtml{padding:0px !important}.x-grid .x-grid-viewoptions .x-column-options-header{height:32px;line-height:28px;vertical-align:middle;border-style:solid;border-width:1px;overflow:hidden;padding-left:10px}.x-grid .x-grid-viewoptions .x-column-options-sortablehandle,.x-grid .x-grid-viewoptions .x-column-options-visibleindicator,.x-grid .x-grid-viewoptions .x-column-options-groupindicator,.x-grid .x-grid-viewoptions .x-column-options-folder,.x-grid .x-grid-viewoptions .x-column-options-leaf{width:40px;height:48px;position:absolute;bottom:0}.x-grid .x-grid-viewoptions .x-column-options-sortablehandle:after,.x-grid .x-grid-viewoptions .x-column-options-visibleindicator:after,.x-grid .x-grid-viewoptions .x-column-options-groupindicator:after,.x-grid .x-grid-viewoptions .x-column-options-folder:after,.x-grid .x-grid-viewoptions .x-column-options-leaf:after{position:absolute;top:0;left:0;height:100%;width:100%;text-align:center;font-size:24px;font-family:'Pictos';line-height:48px;content:"l";vertical-align:middle}.x-grid .x-grid-viewoptions .x-column-options-sortablehandle{left:0}.x-grid .x-grid-viewoptions .x-column-options-sortablehandle:after{line-height:54px}.x-grid .x-grid-viewoptions .x-column-options-visibleindicator{right:0}.x-grid .x-grid-viewoptions .x-column-options-visibleindicator:after{font-size:30px;line-height:54px;content:"E"}.x-grid .x-grid-viewoptions .x-column-options-groupindicator{right:40px}.x-grid .x-grid-viewoptions .x-column-options-groupindicator:after{font-size:30px;line-height:54px;content:"g"}.x-grid .x-grid-viewoptions .x-column-options-folder,.x-grid .x-grid-viewoptions .x-column-options-leaf{width:30px;left:40px}.x-grid .x-grid-viewoptions .x-column-options-folder:after,.x-grid .x-grid-viewoptions .x-column-options-leaf:after{line-height:52px;content:"o"}.x-grid .x-grid-viewoptions .x-column-options-leaf:after{content:"F"}.x-grid .x-grid-viewoptions .x-list-item.x-item-selected.x-list-item-tpl{background:transparent}.x-grid .x-grid-viewoptions .x-list-item.x-item-selected.x-list-item-tpl .x-innerhtml{background:transparent}.x-grid .x-grid-viewoptions .x-column-options-text{display:block;height:30px;margin:10px 50px 5px 80px;position:relative;vertical-align:middle;line-height:28px}.x-grid .x-grid-columnoptions{border-width:0 0 1px}.x-grid .x-grid-multiselection-column{position:relative;padding:0}.x-grid .x-grid-multiselection-column:after{position:absolute;top:0;left:0;width:60px;height:64px;line-height:64px;font-family:'Pictos';font-size:26px;text-align:center;content:"2"}.x-grid .x-grid-multiselection-cell{position:relative;padding:0}.x-grid .x-grid-multiselection-cell:after{position:absolute;top:0;left:0;width:60px;height:60px;line-height:60px;font-family:'Pictos';font-size:20px;text-align:center;content:"_"}.x-grid .x-item-selected .x-grid-multiselection-cell:after{content:"3"}.x-grid .x-grid-pagingtoolbar>.x-body{padding:0 30px 0 50px}.x-grid .x-grid-pagingtoolbar-currentpage{position:relative;height:22px}.x-grid .x-grid-pagingtoolbar-currentpage span{position:absolute;right:0;top:0;line-height:22px;height:22px}.x-grid .x-grid-summaryrow{height:32px;font-size:0.8em;position:relative}.x-grid .x-grid-summaryrow .x-grid-cell{height:32px;line-height:30px;border-width:0 0 1px;border-style:solid}.x-grid .x-grid-summaryrow .x-grid-multiselection-cell:after{content:''}.x-ie .x-grid-grouped .x-translatable-container .x-grid-row:before,.x-ie .x-grid-grouped .x-translatable-container .x-grid-header:before{content:". .";color:transparent;position:absolute;left:0px;word-spacing:3000px;opacity:0}.x-grid-header{line-height:44px;font-weight:bold;position:absolute;left:0;width:100%;z-index:2 !important}.x-ios .x-grid-header{-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.x-grid-grouped .x-grid-row.x-grid-header-wrap .x-dock-horizontal,.x-grid-grouped .x-grid-row-tpl.x-grid-header-wrap{border-top:0}.x-scroll-view{position:relative;display:block;overflow:hidden}.x-scroll-container{position:absolute;width:100%;height:100%}.x-scroll-scroller{position:absolute;min-width:100%;min-height:100%;height:auto !important;width:auto !important}.x-scroll-stretcher{position:absolute;visibility:hidden}.x-scroll-bar-grid-wrapper{position:absolute;width:100%;height:100%}.x-scroll-bar-grid{display:table;width:100%;height:100%}.x-scroll-bar-grid>*{display:table-row}.x-scroll-bar-grid>*>*{display:table-cell}.x-scroll-bar-grid>:first-child>:first-child{width:100%;height:100%}.x-scroll-bar-grid>:first-child>:nth-child(2){padding:3px 3px 0 0}.x-scroll-bar-grid>:nth-child(2)>:first-child{padding:0 0 3px 3px}.x-scroll-bar{position:relative;overflow:hidden}.x-scroll-bar-stretcher{position:absolute;visibility:hidden;width:100%;height:100%}.x-scroll-bar-x{width:100%}.x-scroll-bar-x>.x-scroll-bar-stretcher{width:300%}.x-scroll-bar-x.active{height:6px}.x-scroll-bar-y{height:100%}.x-scroll-bar-y>.x-scroll-bar-stretcher{height:300%}.x-scroll-bar-y.active{width:6px}.x-scroll-indicator{background:#333;position:absolute;z-index:3}.x-scroll-indicator-x{height:100%}.x-scroll-indicator-y{width:100%}.x-scroll-indicator.rounded{background:none}.x-scroll-indicator.rounded>*{position:absolute;background-color:#333}.x-scroll-indicator.rounded>:nth-child(2){-webkit-transform-origin:0% 0%;background:none;content:url(data:image/bmp;base64,Qk08AAAAAAAAADYAAAAoAAAAAQAAAAEAAAABABAAAAAAAAYAAAASCwAAEgsAAAAAAAAAAAAAxhgAAAAA)}.x-scroll-indicator.rounded.x-scroll-indicator-light>*{background-color:#eee}.x-scroll-indicator.rounded.x-scroll-indicator-light>:nth-child(2){content:url(data:image/bmp;base64,Qk08AAAAAAAAADYAAAAoAAAAAQAAAAEAAAABABAAAAAAAAYAAAASCwAAEgsAAAAAAAAAAAAAvXcAAAAA)}.x-scroll-indicator.rounded.x-scroll-indicator-y>*{width:100%}.x-scroll-indicator.rounded.x-scroll-indicator-y>:first-child{height:3px;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px}.x-scroll-indicator.rounded.x-scroll-indicator-y>:nth-child(2){height:1px}.x-scroll-indicator.rounded.x-scroll-indicator-y>:last-child{height:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.x-scroll-indicator.rounded.x-scroll-indicator-x>*{height:100%}.x-scroll-indicator.rounded.x-scroll-indicator-x>:first-child{width:3px;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px}.x-scroll-indicator.rounded.x-scroll-indicator-x>:nth-child(2){width:1px}.x-scroll-indicator.rounded.x-scroll-indicator-x>:last-child{width:3px;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.x-list-light .x-scroll-indicator,.x-dataview-light .x-scroll-indicator{background:#fff}.x-ios .x-scroll-scroller{-webkit-transform:translate3d(0, 0, 0)}.x-ie .x-scroll-bar-y{position:absolute;margin-left:-5px}html,body{font-family:"Helvetica Neue",HelveticaNeue,"Helvetica-Neue",Helvetica,"BBAlpha Sans",sans-serif}.x-ios.x-tablet .x-landscape *{-webkit-text-stroke:1px transparent}body{font-size:104%}body.x-android.x-phone{font-size:116%}body.x-ios.x-phone{font-size:114%}body.x-desktop{font-size:114%}.x-layout-card-item{background:#eee}.x-loading-spinner{font-size:250%;height:1em;width:1em;position:relative;-webkit-transform-origin:.5em .5em;transform-origin:.5em .5em}.x-loading-spinner>span,.x-loading-spinner>span:before,.x-loading-spinner>span:after{display:block;position:absolute;width:.1em;height:.25em;top:0;-webkit-transform-origin:.05em .5em;transform-origin:.05em .5em;content:" "}.x-loading-spinner>span{left:50%;margin-left:-0.05em}.x-loading-spinner>span.x-loading-top{background-color:rgba(170,170,170,0.99)}.x-loading-spinner>span.x-loading-top::after{background-color:rgba(170,170,170,0.9)}.x-loading-spinner>span.x-loading-left::before{background-color:rgba(170,170,170,0.8)}.x-loading-spinner>span.x-loading-left{background-color:rgba(170,170,170,0.7)}.x-loading-spinner>span.x-loading-left::after{background-color:rgba(170,170,170,0.6)}.x-loading-spinner>span.x-loading-bottom::before{background-color:rgba(170,170,170,0.5)}.x-loading-spinner>span.x-loading-bottom{background-color:rgba(170,170,170,0.4)}.x-loading-spinner>span.x-loading-bottom::after{background-color:rgba(170,170,170,0.35)}.x-loading-spinner>span.x-loading-right::before{background-color:rgba(170,170,170,0.3)}.x-loading-spinner>span.x-loading-right{background-color:rgba(170,170,170,0.25)}.x-loading-spinner>span.x-loading-right::after{background-color:rgba(170,170,170,0.2)}.x-loading-spinner>span.x-loading-top::before{background-color:rgba(170,170,170,0.15)}.x-loading-spinner>span.x-loading-top{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg)}.x-loading-spinner>span.x-loading-right{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg)}.x-loading-spinner>span.x-loading-bottom{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg)}.x-loading-spinner>span.x-loading-left{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg)}.x-loading-spinner>span::before{-webkit-transform:rotate(30deg);-moz-transform:rotate(30deg);-ms-transform:rotate(30deg)}.x-loading-spinner>span::after{-webkit-transform:rotate(-30deg);-moz-transform:rotate(-30deg);-ms-transform:rotate(-30deg)}.x-loading-spinner{-webkit-animation-name:x-loading-spinner-rotate;-webkit-animation-duration:.5s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-name:x-loading-spinner-rotate;animation-duration:.5s;animation-timing-function:linear;animation-iteration-count:infinite}html,body{font-family:"Helvetica Neue",HelveticaNeue,"Helvetica-Neue",Helvetica,"BBAlpha Sans",sans-serif}.x-ios.x-tablet .x-landscape *{-webkit-text-stroke:1px transparent}body{font-size:104%}body.x-android.x-phone{font-size:116%}body.x-ios.x-phone{font-size:114%}body.x-desktop{font-size:114%}.x-layout-card-item{background:#eee}.x-button{-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-background-clip:padding;background-clip:padding-box;-moz-border-radius:.4em;-webkit-border-radius:.4em;border-radius:.4em;min-height:1.8em;padding:.3em .6em}.x-button,.x-toolbar .x-button{border:1px solid #999;border-top-color:#a6a6a6;background-color:#ccc;color:#000}.x-button.x-button-back:before,.x-button.x-button-forward:before,.x-toolbar .x-button.x-button-back:before,.x-toolbar .x-button.x-button-forward:before{background:#999}.x-button,.x-button.x-button-back:after,.x-button.x-button-forward:after,.x-toolbar .x-button,.x-toolbar .x-button.x-button-back:after,.x-toolbar .x-button.x-button-forward:after{background-image:none;background-color:#ccc;background-image:-webkit-linear-gradient(top, #f2f2f2,#d9d9d9 3%,#bfbfbf);background-image:-moz-linear-gradient(top, #f2f2f2,#d9d9d9 3%,#bfbfbf);background-image:-o-linear-gradient(top, #f2f2f2,#d9d9d9 3%,#bfbfbf);background-image:-ms-linear-gradient(to bottom, #f2f2f2,#d9d9d9 3%,#bfbfbf)}.x-button.x-button-pressing,.x-button.x-button-pressing:after,.x-button.x-button-pressed,.x-button.x-button-pressed:after,.x-button.x-button-active,.x-button.x-button-active:after,.x-toolbar .x-button.x-button-pressing,.x-toolbar .x-button.x-button-pressing:after,.x-toolbar .x-button.x-button-pressed,.x-toolbar .x-button.x-button-pressed:after,.x-toolbar .x-button.x-button-active,.x-toolbar .x-button.x-button-active:after{background-image:none;background-color:#c4c4c4;background-image:-webkit-linear-gradient(top, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6);background-image:-moz-linear-gradient(top, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6);background-image:-o-linear-gradient(top, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6);background-image:-ms-linear-gradient(to bottom, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6)}.x-button .x-button-icon{width:1.5em;height:1.5em}.x-button .x-button-icon:before{font-size:1.6em;line-height:1em}.x-button.x-item-disabled .x-button-label,.x-button.x-item-disabled .x-badge,.x-button.x-item-disabled .x-button-icon{opacity:.5}.x-button-round{-moz-border-radius:.9em;-webkit-border-radius:.9em;border-radius:.9em}.x-ie .x-button{height:0px}.x-ie .x-button .x-button-label,.x-ie .x-button .x-badge{overflow:visible}.x-iconalign-left .x-button-label,.x-iconalign-left .x-badge{margin-left:.6em}.x-iconalign-right .x-button-label,.x-iconalign-right .x-badge{margin-right:.6em}.x-iconalign-top,.x-iconalign-bottom{padding-top:.2em !important;padding-bottom:.2em !important}.x-button-label,.x-badge,.x-hasbadge .x-badge{font-weight:bold;line-height:1.2em;font-family:"Helvetica Neue",HelveticaNeue,"Helvetica-Neue",Helvetica,"BBAlpha Sans",sans-serif;font-size:1em}.x-toolbar .x-button{margin:6px .2em;padding:0 .6em}.x-toolbar .x-button .x-button-label,.x-toolbar .x-button .x-badge{font-size:.7em}.x-toolbar .x-button .x-button-label,.x-toolbar .x-button .x-badge,.x-toolbar .x-button .x-hasbadge .x-badge{line-height:1.6em}.x-toolbar .x-button .x-button-icon:before{font-size:1.3em;line-height:1.3em}.x-ie .x-toolbar .x-button .x-button-icon::before{font-size:.6em;line-height:1em}.x-button-small,.x-toolbar .x-button-small{-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em;padding:.2em .4em;min-height:0}.x-button-small .x-button-label,.x-button-small .x-badge,.x-toolbar .x-button-small .x-button-label,.x-toolbar .x-button-small .x-badge{font-size:.6em}.x-button-small .x-button-icon,.x-toolbar .x-button-small .x-button-icon{width:.75em;height:.75em}.x-button-forward,.x-button-back{position:relative;overflow:visible;height:1.7em;z-index:1}.x-webkit .x-button-forward:before,.x-webkit .x-button-forward:after,.x-webkit .x-button-back:before,.x-webkit .x-button-back:after{content:'';position:absolute;width:15px;height:auto;top:-2px;left:auto;bottom:-2px;z-index:2;-webkit-mask:4px 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAABGCAYAAADb7SQ4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAiNJREFUeNrEWb9LQlEUvj5BcHoQvMnVKXD1D3CLwqBJbHJsazQaWoSCxgbHJiMIAiNok6AhCDdXVycnJ8EQOgeOYaG+d39998KH+HyP753zzjnfd325xfdSgVeV8B6BScuEV0IRSbxHeCMk/AVFXCA8ScQKSXxPqK0fQBBfE5r/D+Y8VzUT9jb94DPimqRYIYkrhGcpKhhxIqTxrpNcExdlQJTTTnRJnCc8ykhUSOIOoZ71ZFfEZ4S2zgUu+rguxZRHEnPbfKRVsOtUl0RtYpOLTYljIS2Z3nVk2DY9SbNCEt8RDm0rUpe4La1jvXSqmtum72raZI24KuNQIYl/nSGSOJb0Jq61M0pxhjwK9304hUjHGSKILzc5Q5drUzttdYY+I97pDH1FzG0zNFUb04gTG4kzJS5kdYauiZtZnaFr4ooKsCIVaDHxKAQxt1NBnGIVHfGCcEQYh3jGU8KBfMKLiyM+lgzAq/qT0ArVTg+Ei1B9fEPoovV4fcfQd2HedScX39GprwGTNjJn0maTELN6IuSzECLB6T5x2eM66jQgnIeSxa60GnS3uL56tr7b1Ai0JPVwYi6yho2U2lgfKym19VxjMRHzEGbvS9K+RBPzetGVUpf29lZHSl2/DMnLvwh1ZMQrKW3Ic4fvJOZS6ZMQW5hpmpT63DvtlFLfm7bBNruM2C2yXb7y3U6ZpRS5P/4jpUjihRTbCJ3q1eL3GMMfAQYAJmB6SBO619IAAAAASUVORK5CYII=') no-repeat;-webkit-mask-size:15px 100%;overflow:hidden}.x-webkit .x-button-back,.x-webkit .x-toolbar .x-button-back{margin-left:.77217em;padding-left:.4em}.x-webkit .x-button-back:before,.x-webkit .x-toolbar .x-button-back:before{left:-15px}.x-webkit .x-button-back:after,.x-webkit .x-toolbar .x-button-back:after{left:-14px}.x-webkit .x-button-forward,.x-webkit .x-toolbar .x-button-forward{margin-right:.78217em;padding-right:.4em}.x-webkit .x-button-forward:before,.x-webkit .x-button-forward:after,.x-webkit .x-toolbar .x-button-forward:before,.x-webkit .x-toolbar .x-button-forward:after{-webkit-mask:-4px 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAABGCAYAAADb7SQ4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXlJREFUaN7lmTFqAlEQhh8EhFSCYJXW1law9QAewMrWAwQWAmmtbPcGHiCQ1gPYCla2QsDKSsgmQecvFqImu2/fzry/2OLb9mt23vwz47Kvn5MwEFxM8DkLB6HHEIOd0GGIwUpoMcRgyRKDOUsMJizxpzBiiMFR6DPEeZl1GWKwFh4ZYvAmPDDEqmVWVQxmLPG3MGaIVcosVAz2whNDDDZCmyEG7yFlpiEGKUsMEpb4XKXMtMXeiVVb7J1YLcRgW1ZmVuLSxGopLkys1mLwwhL/mVhjie8Sayxx3kp7DPFVYo0tzhNriyEGU5Z40TjxtDE/F6WcDowHBE/msDFNImG0xZQRBAonDCvxhhH2vKZIZ9Ds+7EDfaWFnKZ4xhja5owxdcnYCAQv1p1Gi4sprn08cZbDt6ZYZasXIn5mLFHTjLCvVt1V+4rVt/M+4r3FPaJMbHaBKRKb3pyKxKZXtv/Er4yjZpRL6q042u34tzh4xV9H/FHnqBHKBQeEd6aqqwD6AAAAAElFTkSuQmCC') no-repeat;-webkit-mask-size:15px 100%}.x-webkit .x-button-forward:before,.x-webkit .x-toolbar .x-button-forward:before{right:-15px}.x-webkit .x-button-forward:after,.x-webkit .x-toolbar .x-button-forward:after{right:-14px}.x-button.x-button-plain,.x-toolbar .x-button.x-button-plain{background:none;border:0 none;min-height:0;text-shadow:none;line-height:auto;height:1.9em;padding:0 0.5em;-moz-border-radius:none;-webkit-border-radius:none;border-radius:none}.x-button.x-button-plain>*,.x-toolbar .x-button.x-button-plain>*{overflow:visible}.x-button.x-button-plain.x-button-pressing,.x-button.x-button-plain.x-button-pressed,.x-toolbar .x-button.x-button-plain.x-button-pressing,.x-toolbar .x-button.x-button-plain.x-button-pressed{background:none;background-image:-webkit-radial-gradient(rgba(255,255,255,0.7),rgba(255,255,255,0) 24px);background-image:-moz-radial-gradient(rgba(255,255,255,0.7),rgba(255,255,255,0) 24px);background-image:radial-gradient(rgba(255,255,255,0.7),rgba(255,255,255,0) 24px);background-image:-ms-radial-gradient(rgba(255,255,255,0.7),rgba(255,255,255,0) 24px)}.x-segmentedbutton .x-button{margin:0;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.x-segmentedbutton .x-button.x-first{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em}.x-segmentedbutton .x-button.x-last{-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-segmentedbutton .x-button:not(.x-first){border-left:0}.x-hasbadge{overflow:visible}.x-hasbadge .x-badge{border-color:#900;min-width:2em;line-height:1.2em;top:-.2em;padding:.1em .3em;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-background-clip:padding;background-clip:padding-box;color:#fcc;background-image:none;background-color:#c00;background-image:-webkit-linear-gradient(top, #ff1a1a,#e60000 3%,#b30000);background-image:-moz-linear-gradient(top, #ff1a1a,#e60000 3%,#b30000);background-image:-o-linear-gradient(top, #ff1a1a,#e60000 3%,#b30000);background-image:-ms-linear-gradient(to bottom, #ff1a1a,#e60000 3%,#b30000);-moz-border-radius:.2em;-webkit-border-radius:.2em;border-radius:.2em;text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0;-moz-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0.1em;-webkit-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0.1em;box-shadow:rgba(0,0,0,0.5) 0 0.1em 0.1em}.x-panel.x-floating,.x-msgbox,.x-form.x-floating{-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em;-moz-box-shadow:rgba(0,0,0,0.8) 0 0.2em 0.6em;-webkit-box-shadow:rgba(0,0,0,0.8) 0 0.2em 0.6em;box-shadow:rgba(0,0,0,0.8) 0 0.2em 0.6em;background-image:none;background-color:#656565}.x-panel.x-floating.x-floating-light,.x-msgbox.x-floating-light,.x-form.x-floating.x-floating-light{background-image:none;background-color:#cbcbcb}.x-panel.x-floating .x-panel-inner,.x-panel.x-floating>.x-body,.x-msgbox .x-panel-inner,.x-msgbox>.x-body,.x-form.x-floating .x-panel-inner,.x-form.x-floating>.x-body{-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-webkit .x-anchor{position:absolute;overflow:hidden}.x-webkit .x-anchor.x-anchor-top{margin-top:-.68em;margin-left:-.8155em;width:1.631em;height:.7em;-webkit-mask:0 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAPCAYAAABut3YUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPZJREFUeNpi/PX7LwOFwAyIG6HseiA+Ra5BjBQ6xg+IVwAxJ5T/HYgjgHgTOYYxUeCQUiBeh+QQBih7HVSOLiHDDMSTgTiTgLrpQJwLxH9p5RhOaLT4EakeFF3RQPyF2o6RhkaBGYkheRmIPYH4KbXSjC4QnyTDIch6danhGCcgPgwNGXKBNNQMb0ocEwXE24GYn4FyADJjI76Ej88x7UC8FIjZGKgHQDlxGtRsZmISMMjy+dBQoSXYBC0gv+NyDD80xzgx0AeAqg4fIH6NHk0qQHyMjg6B1WvHYDkNFjIgwS1ALMowMOAjEAeBHINe2Q0U+AUQYACQ10C2QNhRogAAAABJRU5ErkJggg==') no-repeat;-webkit-mask-size:1.631em .7em;background-color:#656565}.x-webkit .x-anchor.x-anchor-bottom{margin-left:-.8155em;width:1.631em;height:.7em;-webkit-mask:0 0 url('data:image/png;base64,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') no-repeat;-webkit-mask-size:1.631em .7em;background-color:#656565}.x-webkit .x-anchor.x-anchor-left{margin-left:-.6655em;margin-top:-.35em;height:1.631em;width:.7em;-webkit-mask:0 0 url('data:image/png;base64,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') no-repeat;-webkit-mask-size:.7em 1.631em;background-color:#656565}.x-webkit .x-anchor.x-anchor-right{margin-top:-.35em;height:1.631em;width:.7em;-webkit-mask:0 0 url('data:image/png;base64,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') no-repeat;-webkit-mask-size:.7em 1.631em;background-color:#656565}.x-floating.x-panel-light:after{background-color:#cbcbcb}.x-sheet,.x-picker,.x-sheet-action{padding:.7em;border-top:1px solid #7f7f7f;background-image:none;background-color:rgba(101,101,101,0.9);background-image:-webkit-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-moz-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-o-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-ms-linear-gradient(to bottom, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.x-sheet-inner>.x-button,.x-sheet-action-inner>.x-button{margin-bottom:.5em}.x-sheet-inner>.x-button:last-child,.x-sheet-action-inner>.x-button:last-child{margin-bottom:0}.x-msgbox{margin:.5em;border:0.15em solid #cbcbcb;-moz-box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;-webkit-box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-msgbox .x-icon{margin:0 0.8em 0 0.5em;background:#fff;-webkit-mask-size:100%}.x-msgbox .x-msgbox-info{-webkit-mask-image:url('data:image/png;base64,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')}.x-msgbox .x-msgbox-warning{-webkit-mask-image:url('data:image/png;base64,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')}.x-msgbox .x-msgbox-question{-webkit-mask-image:url('data:image/png;base64,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')}.x-msgbox .x-msgbox-error{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAFGUlEQVRoBe2bzW8VVRxAeS0UMZggaARtGgtNU5pIRCMaEsPChrgh7FhCjHtdEBKNLvwjdOHShSHGmEiMiVFw4cL4EcFoolRSuqBiRDQqCLRS6znDzPP1dub1fbbzLv6S05m57829vzN3Pu+8VhYWFtZ0KyqVygbqHoA74QEYhnmojX4WpuFHuAZz5HSdaVei0mlhJBW7Hx6GJ+AheAwaiS/50rfwGXwNF8nPDdGx6JgwonvJ6hE4CI/DXdBOXGHlz+EEnEb803Yqq65rD7cDFSn4NvwKHh/dwLpt42A7ubpuS7I03Ad74C24DP9AN0Rr67QN27JN2+5rRb5pYRraBC+Bx9ZKiNZKO2+bM/AKbG5WuilhGtgNb4Jn0zCRlV42B3PZ3Yx0w8JUfAQmwcvKSssVtWcu5nSkUemGhKnwKFyE1diFi2SzcnMyt6ONSNcVphJvCl4ATxZZA2WdmqO59tcTLxRmRc/Ez8AvUFbJMC9zNefCM3g9YW8kvocyHbOhYLhsrua8t6iXc4VZYRQ+hJsQVlr2ZXM299E86SXCfNEb/tfhTyi7XFF+5q7DhlB6kTBfqMCzMA1FlfVKuQ66JM8LmXgoPM4XTsIs9IpYUZ466DKeyTr1TJwETztegg7BLhhICnv7jw66HErdEpuqMEvb4Um4O/kkjj+66KRbEokwW2AtS/tgBzgfS+ii077UsbpL30fhBNwLsYVOuum4pg9zz8xj4P7u2FNsoZNuY7q6S3twPwUx9i5aSeim44DC68CxKB/sYw3ddFyn8BBsg5hOVugsCt10HFJ4BGLuXfSS0HFE80HYmBQt/XOdIseJfwfvaDzBlTGy3JRyHNzngTB0HFR4KxSdnS/w2ctwFhxZKHO4t3q1eRV82gtDx60Kb4E7wk/T5d+YTnIPqnjpI73EmnNe6LjFrVJvN3VXya7VeZWUpiyV1ceciyK5Dhd9GGW5W+S2iv+Fg+72eKh3TARfX/XFZfO1h+eg6JLjbec8Z+nSS6c5/k2+/ZAXOs55WboEvqfJu/nYTvlznAHPM3UItMxh5w3BgwVJ6nhJYa+xVyFP2Gv0MYghdLzgVpmCP2IwWsZBxymFz8FlKP1xSo6thm46nlPYrp6EvyDW0E3HqwrPwinwRVSsoZuOs75l83R9Bn4G52MLnXQ7o6s9bMzAR+B+HlvopJuOt4ZpMb/CvF3ulogtdDqVOlbHpZX8DnzQd5QjltBFJ92SyHZpX6p5YB+HH2A++bS3/+igy/HULbGpCqdu7zP9BLxU9XrooItO/wX24SvTnXz6MXgjnj199NrU3HXYucQvLHCZOAzT0GuiWb7mfjjXLbfw1qD886zUiz97MGdzX5vrlldoGbEZ3gAfq7ItV/apuZpz4W8wFx2/oTwrOkh/Am5A2WXN0VwHQ4/a5brCaU+PUMm7UGZpczPHkVq5vPllhWuk3ymptLLmtqxs4pK3FfLKqND3Ni+Ct2rekK/2Lm4O5mJOm/JyzitrqIezFal4PTwNp+EmrJa0bZuDuazP8mtk2pRwViGNDMNr4BPISva2bdmmbQ9n+TQzbUk4a4BGJ8Azo/fh3RS3btuwrYms/Vambf8bD0O4jgM/CgfAXcyfFoT36BS1FIq6634A78FXSLb1YNO2MEkkgbiD9l63x2E/2Ptj0Ky8kmfhJPirWB/tZhD1/rjt6JhwbSbIe3LzBfQ22AV7YAfck+K8MQWOSIjzX8A38BNcQ9Lxto7Gv+RtOqJ9fOwKAAAAAElFTkSuQmCC')}.x-msgbox .x-title{font-size:.9em;line-height:1.4em}.x-msgbox .x-body{background:transparent !important}.x-msgbox .x-toolbar{background:transparent none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.x-msgbox .x-toolbar.x-docked-top{height:1.3em}.x-msgbox .x-field{min-height:2em;background:#fff;-moz-border-radius:.2em;-webkit-border-radius:.2em;border-radius:.2em}.x-msgbox .x-form-field{min-height:1.5em;padding-right:0 !important;-webkit-appearance:none}.x-msgbox .x-field-input{padding-right:2.2em}.x-msgbox-text{padding:6px 0;line-height:1.4em}.x-msgbox-buttons{padding:0.4em 0;height:auto}.x-msgbox-buttons .x-button-normal span{opacity:.7}.x-msgbox-dark .x-msgbox-text{color:rgba(255,255,255,0.9);text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-msgbox-dark .x-msgbox-input{background-image:none;background-color:rgba(255,255,255,0.9);background-image:-webkit-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-moz-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-o-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-ms-linear-gradient(to bottom, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));border:0.1em solid rgba(203,203,203,0.9)}.x-toolbar{padding:0 .2em}.x-toolbar.x-docked-left{width:7em;padding:.2em}.x-toolbar.x-docked-right{width:7em;padding:.2em}.x-title{line-height:2.1em;font-size:1.2em;margin:0 0.3em;padding:0 .3em}.x-spinner .x-input-el,.x-field-select .x-input-el{-webkit-text-fill-color:#000;-webkit-opacity:1}.x-spinner.x-item-disabled .x-input-el,.x-field-select.x-item-disabled .x-input-el{-webkit-text-fill-color:currentcolor}.x-toolbar .x-field-select .x-input-el{-webkit-text-fill-color:#fff}.x-toolbar .x-field-select.x-item-disabled .x-input-el{-webkit-text-fill-color:rgba(255,255,255,0.6)}.x-toolbar .x-form-field-container{padding:0 .3em}.x-toolbar .x-slider-field .x-component-outer,.x-toolbar .x-toggle-field .x-component-outer{padding:0em .3em}.x-toolbar .x-field{width:13em;padding:.5em;min-height:0;border-bottom:0;background:transparent}.x-toolbar .x-field .x-clear-icon{background-size:50% 50%;right:-0.8em;margin-top:-1.06em}.x-toolbar .x-field-input{padding-right:1.6em !important}.x-toolbar .x-field-textarea .x-component-outer,.x-toolbar .x-field-text .x-component-outer,.x-toolbar .x-field-number .x-component-outer,.x-toolbar .x-field-search .x-component-outer{background-color:#fff;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em;-moz-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0 inset,rgba(0,0,0,0.5) 0 -0.1em 0 inset,rgba(0,0,0,0.5) 0.1em 0 0 inset,rgba(0,0,0,0.5) -0.1em 0 0 inset,rgba(0,0,0,0.5) 0 0.15em 0.4em inset;-webkit-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0 inset,rgba(0,0,0,0.5) 0 -0.1em 0 inset,rgba(0,0,0,0.5) 0.1em 0 0 inset,rgba(0,0,0,0.5) -0.1em 0 0 inset,rgba(0,0,0,0.5) 0 0.15em 0.4em inset;box-shadow:rgba(0,0,0,0.5) 0 0.1em 0 inset,rgba(0,0,0,0.5) 0 -0.1em 0 inset,rgba(0,0,0,0.5) 0.1em 0 0 inset,rgba(0,0,0,0.5) -0.1em 0 0 inset,rgba(0,0,0,0.5) 0 0.15em 0.4em inset}.x-toolbar .x-form-label{background:transparent;border:0;padding:0;line-height:1.4em}.x-toolbar .x-form-field{height:1.6em;color:#6e6e6e;background:transparent;min-height:0;-webkit-appearance:none;padding:0em .3em;margin:0}.x-toolbar .x-form-field:focus{color:#000}.x-toolbar .x-field-select .x-component-outer,.x-toolbar .x-field-search .x-component-outer{-moz-border-radius:.8em;-webkit-border-radius:.8em;border-radius:.8em}.x-toolbar .x-field-search .x-field-input{background-position:.5em 50%}.x-toolbar .x-field-select{-webkit-box-shadow:none}.x-toolbar .x-field-select .x-form-field{height:1.4em}.x-toolbar .x-field-select{background:transparent}.x-toolbar .x-field-select .x-component-outer:after{right:.4em}.x-toolbar .x-field-select.x-item-disabled .x-component-outer:after{opacity:.6}.x-toolbar .x-field-select .x-component-outer:before{width:3em;border-left:none;-moz-border-radius-topright:.8em;-webkit-border-top-right-radius:.8em;border-top-right-radius:.8em;-moz-border-radius-bottomright:.8em;-webkit-border-bottom-right-radius:.8em;border-bottom-right-radius:.8em;-webkit-mask:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAABCAYAAACc0f2yAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADJJREFUeNpi/P//PwMjIyMbAwMDOxRzAjEXFHMDMQ8a5kXC6HLcSHo5kcwEmU9TABBgAOcTBAFcRiSpAAAAAElFTkSuQmCC');-webkit-mask-position:right top;-webkit-mask-repeat:repeat-y;-webkit-mask-size:3em 0.05em}.x-toolbar .x-field-select .x-input-text{color:#fff}.x-android .x-field-search .x-field-input{padding-left:.2em !important;padding-right:2.2em !important}.x-toast{margin:.5em;border:0.15em solid #cbcbcb;-moz-box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;-webkit-box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-toast .x-toast-text{padding:6px 0;line-height:1.4em}.x-msgbox-dark .x-msgbox-text{color:rgba(255,255,255,0.9);text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-msgbox-dark .x-msgbox-input{background-image:none;background-color:rgba(255,255,255,0.9);background-image:-webkit-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-moz-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-o-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-ms-linear-gradient(to bottom, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));border:0.1em solid rgba(203,203,203,0.9)}.x-menu{padding:.7em;background-image:none;background-color:rgba(101,101,101,0.9);background-image:-webkit-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-moz-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-o-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-ms-linear-gradient(to bottom, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9))}.x-menu .x-button{margin-bottom:.7em}.x-menu .x-button:last-child{margin-bottom:0}.x-form .x-scroll-container{background-color:#eee}.x-form .x-toolbar .x-scroll-container{background-color:transparent}.x-form-label{text-shadow:#fff 0 1px 1px;color:#333;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0;padding:.6em;background-color:#f7f7f7;color:#080808}.x-form-label span{font-size:.8em}.x-form-fieldset{margin:.5em .5em 1.5em}.x-form-fieldset .x-form-label{border-top:1px solid #fff}.x-form-fieldset .x-form-fieldset-inner{border:1px solid #ddd;background:#fff;padding:0;-moz-border-radius:.4em;-webkit-border-radius:.4em;border-radius:.4em}.x-form-fieldset .x-field{border-bottom:1px solid #ddd;background:transparent}.x-form-fieldset .x-field:first-child{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-form-fieldset .x-field:last-child{border-bottom:0;-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-form-fieldset-title{text-shadow:#fff 0 1px 1px;color:#333;margin:1em .7em 0.3em;color:#333}.x-form-fieldset-instructions{text-shadow:#fff 0 1px 1px;color:#333;color:gray;margin:1em .7em 0.3em;font-size:.8em}.x-label-align-left:first-child .x-form-label{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em}.x-label-align-left:last-child .x-form-label{-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em}.x-label-align-right:first-child .x-form-label{-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-label-align-right:last-child{border-bottom:0}.x-label-align-right:last-child .x-form-label{-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-label-align-top:first-child .x-form-label{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-label-align-bottom:last-child .x-form-label{-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-field{min-height:2.5em;background:#fff}.x-field:last-child{border-bottom:0}.x-field-label{background-color:#f7f7f7;color:#080808}.x-field-input .x-clear-icon{background:url('data:image/png;base64,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') no-repeat;background-position:center center;background-size:55% 55%;width:2.2em;height:2.2em;margin:.5em;margin-top:-1.1em;right:-.5em}.x-field-clearable .x-field-input{padding-right:2.2em}.x-input-el{padding:.4em;min-height:2.5em;border-width:0;-webkit-appearance:none}.x-ie .x-input-el{background:transparent}.x-item-disabled .x-form-label,.x-item-disabled input,.x-item-disabled .x-input-el,.x-item-disabled .x-spinner-body,.x-item-disabled select,.x-item-disabled textarea,.x-item-disabled .x-field-clear-container{color:#b3b3b3;pointer-events:none}.x-item-disabled .x-form-label{color:#aaa}.x-item-disabled .x-form-label:after{color:#666 !important}.x-checkmark-base,.x-field-checkbox .x-field-mask::after,.x-field-radio .x-field-mask::after,.x-select-overlay .x-item-selected.x-list-item::after{position:absolute;top:0;right:10px;bottom:0;content:'3';font-family:'Pictos';font-size:1.6em;text-align:right;line-height:1.6em}.x-field-checkbox .x-field-mask::after,.x-field-radio .x-field-mask::after{color:#ddd}.x-input-checkbox,.x-input-radio{visibility:hidden}.x-input-el:checked+.x-field-mask::after{color:#688AD2}.x-item-disabled.x-field-checkbox .x-input-checkbox:checked+.x-field-mask::after{color:#aebcd9}.x-field-radio .x-field-mask{position:absolute;top:0;right:0;bottom:0;left:0}.x-field-radio .x-field-mask::after{content:'';position:absolute;width:16px;height:16px;top:16px;left:auto;right:16px;background-color:#d0d0d0;-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px}.x-field-radio .x-field-mask::before{content:'';position:absolute;width:26px;height:26px;top:11px;left:auto;right:11px;background-color:#ddd;-moz-border-radius:26px;-webkit-border-radius:26px;border-radius:26px}.x-input-radio:checked+.x-field-mask::after{background:#688AD2}.x-item-disabled.x-field-radio .x-input-radio:checked+.x-field-mask::after{background:#aebcd9}.x-field-search .x-field-input{position:relative}.x-field-search .x-field-input:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"s"}.x-field-search .x-field-input:before{color:#ccc;top:.7em;left:.5em;font-size:1.1em;right:auto}.x-toolbar .x-field-search .x-field-input:before{top:.3em}.x-field-search .x-field-input .x-form-field{margin-left:1em}.x-webkit .x-selectmark-base,.x-webkit .x-field-select .x-component-outer:after,.x-field-select .x-webkit .x-component-outer:after{content:'';position:absolute;width:1em;height:1em;top:50%;left:auto;right:.7em;-webkit-mask-size:1em;-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTJDQUMyNUQwRUE4NjdEQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxQTFBMDFDQ0I5NEYxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyMkRCMDIxMkI5NEUxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjMwRTE0QzVBNDIyMjY4MTFCQ0ZCOTAzOTcwNzcyRkVCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MkNBQzI1RDBFQTg2N0RCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+HfrH/AAAAeVJREFUeNrs2cFHBGEUAPA3zYqIiIhOnTpFRHSKrp26RqeuEV077R/QqWtE166dOkVERHRa9hQRnZalFcv0Hk/W1Mx+38z3vvlm5j3eZW+/9+abne+9KEkSaFPMQMtCwQpWsIIVrGAFK1jBClawgo2ik/4hiqJGwLKuvfpIc5xSkWqYr5hzU1s/mRNxXTPsJ+ZqluvXlwOmSj3XBDvG3M1rpAmYYoUrFzr4ZNqTawqm2MH8Dhh7ZXJUbcAUx4FinzBnJcAUl4FhP/jIgRSYKvkYCJaO2LbNv08RMMUy5nsA4COTLy0XYIqtil9iF6aflq7AwBWuAvuQ9ZKSBgNX2ieWjtKSzeXBNZgqfe8J+4W5aXtbcg0GrvibB/BhkeuhBJhigzsghT0veh+WAlMcCGHvMOMQwcCdcIntYy6WmXhIg2PuiAvsEHO97IhHGgzckb4D8L6LmZYPMHBnhiWwXVdDPF9g4A4Vwd66nFr6BAN3ygbbw1yoMzjmjplgB5hrrufSvsHAHesZDOD2JAbxVYCBOzfIAZ9JbR6qAgN3cPwP9kZy1VIlGLiTdluCmoOBO/pnS9Bk8DzmS3pL4BMcpZEe1qX0GI/atC4dQYXRMa1MU0IX4gpWsIIVrGAFK1jBCnYUPwIMAPUPAyFL+nRdAAAAAElFTkSuQmCC');margin-top:-.5em}.x-field-select{position:relative;z-index:1}.x-field-select .x-component-outer:after{z-index:2;background-color:#ddd}.x-field-select .x-component-outer:before,.x-field-select .x-component-outer:after{pointer-events:none;position:absolute;display:block}.x-select-overlay .x-list-item-label{height:2.6em}.x-select-overlay .x-item-selected .x-list-label{margin-right:2.6em}.x-select-overlay .x-item-selected.x-list-item::after{color:#ddd}.x-spinner .x-field-input .x-input-el{-webkit-text-fill-color:#000}.x-spinner.x-item-disabled .x-input-el{-webkit-text-fill-color:#B3B3B3}.x-spinner.x-item-disabled .x-spinner-button{color:#aaa !important}.x-spinner.x-item-disabled .x-spinner-button,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button{border:1px solid #c4c4c4;border-top-color:#d0d0d0;background-color:#f7f7f7;color:#1e1e1e}.x-spinner.x-item-disabled .x-spinner-button.x-button-back:before,.x-spinner.x-item-disabled .x-spinner-button.x-button-forward:before,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-back:before,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-forward:before{background:#c4c4c4}.x-spinner.x-item-disabled .x-spinner-button,.x-spinner.x-item-disabled .x-spinner-button.x-button-back:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-forward:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-back:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-forward:after{background-image:none;background-color:#f7f7f7;background-image:-webkit-linear-gradient(top, #ffffff,#ffffff 3%,#eaeaea);background-image:-moz-linear-gradient(top, #ffffff,#ffffff 3%,#eaeaea);background-image:-o-linear-gradient(top, #ffffff,#ffffff 3%,#eaeaea);background-image:-ms-linear-gradient(to bottom, #ffffff,#ffffff 3%,#eaeaea)}.x-spinner.x-item-disabled .x-spinner-button.x-button-pressing,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressing:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressed,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressed:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-active,.x-spinner.x-item-disabled .x-spinner-button.x-button-active:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressing,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressing:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressed,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressed:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-active,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-active:after{background-image:none;background-color:#efefef;background-image:-webkit-linear-gradient(top, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0);background-image:-moz-linear-gradient(top, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0);background-image:-o-linear-gradient(top, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0);background-image:-ms-linear-gradient(to bottom, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0)}.x-spinner .x-spinner-button{margin-top:.25em;margin-bottom:.25em;width:2em;padding:.23em 0 .27em;font-weight:bold;text-align:center;border:1px solid #ddd !important;-moz-border-radius:1em;-webkit-border-radius:1em;border-radius:1em}.x-spinner .x-spinner-button,.x-toolbar .x-spinner .x-spinner-button{border:1px solid #b7b7b7;border-top-color:#c4c4c4;background-color:#eaeaea;color:#111}.x-spinner .x-spinner-button.x-button-back:before,.x-spinner .x-spinner-button.x-button-forward:before,.x-toolbar .x-spinner .x-spinner-button.x-button-back:before,.x-toolbar .x-spinner .x-spinner-button.x-button-forward:before{background:#b7b7b7}.x-spinner .x-spinner-button,.x-spinner .x-spinner-button.x-button-back:after,.x-spinner .x-spinner-button.x-button-forward:after,.x-toolbar .x-spinner .x-spinner-button,.x-toolbar .x-spinner .x-spinner-button.x-button-back:after,.x-toolbar .x-spinner .x-spinner-button.x-button-forward:after{background-image:none;background-color:#eaeaea;background-image:-webkit-linear-gradient(top, #ffffff,#f7f7f7 3%,#dddddd);background-image:-moz-linear-gradient(top, #ffffff,#f7f7f7 3%,#dddddd);background-image:-o-linear-gradient(top, #ffffff,#f7f7f7 3%,#dddddd);background-image:-ms-linear-gradient(to bottom, #ffffff,#f7f7f7 3%,#dddddd)}.x-spinner .x-spinner-button.x-button-pressing,.x-spinner .x-spinner-button.x-button-pressing:after,.x-spinner .x-spinner-button.x-button-pressed,.x-spinner .x-spinner-button.x-button-pressed:after,.x-spinner .x-spinner-button.x-button-active,.x-spinner .x-spinner-button.x-button-active:after,.x-toolbar .x-spinner .x-spinner-button.x-button-pressing,.x-toolbar .x-spinner .x-spinner-button.x-button-pressing:after,.x-toolbar .x-spinner .x-spinner-button.x-button-pressed,.x-toolbar .x-spinner .x-spinner-button.x-button-pressed:after,.x-toolbar .x-spinner .x-spinner-button.x-button-active,.x-toolbar .x-spinner .x-spinner-button.x-button-active:after{background-image:none;background-color:#e2e2e2;background-image:-webkit-linear-gradient(top, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3);background-image:-moz-linear-gradient(top, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3);background-image:-o-linear-gradient(top, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3);background-image:-ms-linear-gradient(to bottom, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3)}.x-spinner .x-spinner-button-down{margin-left:.25em}.x-spinner .x-spinner-button-up{margin-right:.25em}.x-spinner.x-field-grouped-buttons .x-spinner-button-down{margin-right:.5em}.x-android .x-spinner-button{padding:.40em 0 .11em !important}.x-ie .x-spinner .x-field-input .x-input-el:disabled{color:#000}.x-list{background-color:#f7f7f7}.x-list .x-list-disclosure{position:relative;overflow:visible;border:0;-moz-border-radius:32px;-webkit-border-radius:32px;border-radius:32px;background-image:none;background-color:#5e86dc;background-image:-webkit-linear-gradient(top, #9db6ea,#7396e0 3%,#4977d7);background-image:-moz-linear-gradient(top, #9db6ea,#7396e0 3%,#4977d7);background-image:-o-linear-gradient(top, #9db6ea,#7396e0 3%,#4977d7);background-image:-ms-linear-gradient(to bottom, #9db6ea,#7396e0 3%,#4977d7);width:32px;height:32px;margin:7px 7px 0 0}.x-list .x-list-disclosure:before{position:absolute;top:0;right:0;bottom:0;left:0;content:']';font-family:'Pictos';color:#fff;font-size:24px;text-align:center;line-height:35px;text-shadow:0 0 0}.x-list.x-list-indexed .x-list-disclosure{margin-right:1.8em}.x-list .x-item-selected .x-list-disclosure{background:#fff none}.x-list .x-item-selected .x-list-disclosure:before{color:#688AD2}.x-list .x-list-item{color:#000}.x-list .x-list-item.x-item-selected .x-dock-horizontal,.x-list .x-list-item.x-item-selected.x-list-item-tpl{background-image:none;background-color:#688AD2;background-image:-webkit-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-moz-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-o-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-ms-linear-gradient(to bottom, #a3b8e4,#7c99d8 3%,#547bcc);color:#fff}.x-list .x-list-item.x-item-pressed.x-list-item-tpl,.x-list .x-list-item.x-item-pressed .x-dock-horizontal{background:#fff none}.x-list .x-list-item .x-list-item-body,.x-list .x-list-item.x-list-item-tpl .x-innerhtml{padding:12px 15px}.x-list-normal .x-list-header{background-image:none;background-color:#fefefe;background-image:-webkit-linear-gradient(top, #ffffff,#ffffff 3%,#f3f0f0);background-image:-moz-linear-gradient(top, #ffffff,#ffffff 3%,#f3f0f0);background-image:-o-linear-gradient(top, #ffffff,#ffffff 3%,#f3f0f0);background-image:-ms-linear-gradient(to bottom, #ffffff,#ffffff 3%,#f3f0f0);color:#b9aaaa;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0;border-top:1px solid #fefefe;border-bottom:1px solid #d0c6c6;font-weight:bold;font-size:0.8em;padding:0.2em 1.02em}.x-list-normal .x-list-item.x-list-item-tpl,.x-list-normal .x-list-item .x-dock-horizontal{border-top:1px solid #dedede}.x-list-normal .x-list-item.x-list-item-tpl.x-list-footer-wrap,.x-list-normal .x-list-item.x-list-footer-wrap .x-dock-horizontal{border-bottom:1px solid #dedede}.x-list-normal .x-list-item.x-item-pressed.x-list-item-tpl,.x-list-normal .x-list-item.x-item-pressed .x-dock-horizontal{border-top-color:#fff;background-color:#fff}.x-list-normal .x-list-item.x-item-selected.x-list-item-tpl,.x-list-normal .x-list-item.x-item-selected .x-dock-horizontal{border-top-color:#688AD2}.x-list-round .x-scroll-view{background-color:#eee}.x-list-round .x-list-header-swap{padding-right:13px}.x-list-round .x-list-inner .x-scroll-container{top:13px;left:13px;bottom:13px;right:13px;width:auto !important;height:auto !important}.x-list-round .x-list-header{color:#777;font-size:1em;font-weight:bold;padding-left:26px;line-height:1.7em;background-image:-webkit-linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4));background-image:-moz-linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4));background-image:-o-linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4));background-image:-ms-linear-gradient(to bottom, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4))}.x-list-round .x-list-container{padding:13px 13px 0 13px}.x-list-round .x-list-container .x-list-header{padding-left:13px;background-image:none}.x-list-round.x-list-ungrouped .x-list-item-tpl,.x-list-round.x-list-ungrouped .x-list-item .x-dock-horizontal,.x-list-round.x-list-grouped .x-list-item-tpl,.x-list-round.x-list-grouped .x-list-item .x-dock-horizontal{border:1px solid #dedede;border-width:1px 1px 0 1px;background:#f7f7f7}.x-list-round.x-list-ungrouped .x-list-item-first{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-list-round.x-list-ungrouped .x-list-item-last{-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em;border-width:1px;margin-bottom:13px}.x-list-round.x-list-grouped .x-list-header-wrap .x-dock-horizontal{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-list-round.x-list-grouped .x-list-header-wrap.x-list-header{border:1px solid #dedede;border-width:1px 1px 0 1px;-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-list-round.x-list-grouped .x-list-footer-wrap{background:transparent}.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-tpl,.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal{border:none;background:transparent;padding-bottom:13px;margin-bottom:13px}.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-tpl>.x-innerhtml,.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-tpl>.x-dock-body,.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal>.x-innerhtml,.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal>.x-dock-body{border:1px solid #dedede;background:#f7f7f7;-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-pressed>.x-innerhtml,.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-pressed>.x-dock-body{background:#fff none}.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-selected>.x-innerhtml,.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-selected>.x-dock-body{background-image:none;background-color:#688AD2;background-image:-webkit-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-moz-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-o-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-ms-linear-gradient(to bottom, #a3b8e4,#7c99d8 3%,#547bcc);color:#fff}.x-list-round .x-indexbar-vertical{margin-right:20px}.x-list-round .x-list-footer-wrap.x-list-item-last.x-list-item-odd.x-list-item.x-list-item-tpl{background-color:transparent !important}.x-list-round.x-list-grouped .x-list-item-odd.x-list-footer-wrap>.x-innerhtml,.x-list-round.x-list-grouped .x-list-item-odd.x-list-footer-wrap>.x-dock-body{background-color:#eaeaea !important}.x-list .x-list-item-odd.x-list-item-tpl,.x-list .x-list-item-odd .x-dock-horizontal{background-color:#eaeaea !important;border-bottom:1px solid #eaeaea}.x-picker .x-picker-inner{background-color:#fff;overflow:hidden;margin:.7em;-moz-border-radius:.4em;-webkit-border-radius:.4em;border-radius:.4em;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-background-clip:padding;background-clip:padding-box;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #bbb), color-stop(30%, #fff), color-stop(70%, #fff), color-stop(100%, #bbb));background:-webkit-linear-gradient(top, #bbb 0%, #fff 30%, #fff 70%, #bbb 100%)}.x-picker-slot .x-scroll-view{-moz-box-shadow:rgba(0,0,0,0.4) -1px 0 1px;-webkit-box-shadow:rgba(0,0,0,0.4) -1px 0 1px;box-shadow:rgba(0,0,0,0.4) -1px 0 1px}.x-picker-slot .x-scroll-view:first-child{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.x-picker-bar{border-top:0.12em solid #688AD2;border-bottom:0.12em solid #688AD2;height:2.5em;background-image:none;background-color:rgba(13,86,242,0.3);background-image:-webkit-linear-gradient(top, rgba(85,137,246,0.3),rgba(37,103,244,0.3) 3%,rgba(11,78,218,0.3));background-image:-moz-linear-gradient(top, rgba(85,137,246,0.3),rgba(37,103,244,0.3) 3%,rgba(11,78,218,0.3));background-image:-o-linear-gradient(top, rgba(85,137,246,0.3),rgba(37,103,244,0.3) 3%,rgba(11,78,218,0.3));background-image:-ms-linear-gradient(to bottom, rgba(85,137,246,0.3),rgba(37,103,244,0.3) 3%,rgba(11,78,218,0.3));-moz-box-shadow:rgba(0,0,0,0.2) 0 0.2em 0.2em;-webkit-box-shadow:rgba(0,0,0,0.2) 0 0.2em 0.2em;box-shadow:rgba(0,0,0,0.2) 0 0.2em 0.2em}.x-use-titles .x-picker-bar{margin-top:1.5em}.x-picker-slot-title{height:1.5em;border-top:1px solid #dcd4d4;border-bottom:1px solid #ae9c9c;padding:0.2em 1.02em;-moz-box-shadow:rgba(0,0,0,0.3) 0px 0.1em 0.3em;-webkit-box-shadow:rgba(0,0,0,0.3) 0px 0.1em 0.3em;box-shadow:rgba(0,0,0,0.3) 0px 0.1em 0.3em;background-image:none;background-color:#dcd4d4;background-image:-webkit-linear-gradient(top, #fefefe,#e7e2e2 3%,#d0c6c6);background-image:-moz-linear-gradient(top, #fefefe,#e7e2e2 3%,#d0c6c6);background-image:-o-linear-gradient(top, #fefefe,#e7e2e2 3%,#d0c6c6);background-image:-ms-linear-gradient(to bottom, #fefefe,#e7e2e2 3%,#d0c6c6)}.x-picker-slot-title>div{font-size:0.8em;color:#8b8b8b;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0}.x-picker-slot{border-left:2px solid #acacac}.x-picker-slot .x-dataview-item{height:2.5em;line-height:2.5em;font-weight:bold;padding:0 10px}.x-picker-slot:first-child{border-left:0}.x-toggle{width:4.4em;border:1px solid #b7b7b7;background-image:none;background-color:#ddd;background-image:-webkit-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:-moz-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:-o-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:-ms-linear-gradient(to bottom, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);-moz-border-radius:1.1em;-webkit-border-radius:1.1em;border-radius:1.1em}.x-toggle .x-thumb.x-dragging{opacity:1}.x-toggle .x-thumb:before{top:.175em}.x-toggle-on{background-image:none;background-color:#92cf00;background-image:-webkit-linear-gradient(top, #6e9c00,#80b600 10%,#92cf00 65%,#94d200);background-image:-moz-linear-gradient(top, #6e9c00,#80b600 10%,#92cf00 65%,#94d200);background-image:-o-linear-gradient(top, #6e9c00,#80b600 10%,#92cf00 65%,#94d200);background-image:-ms-linear-gradient(to bottom, #6e9c00,#80b600 10%,#92cf00 65%,#94d200)}.x-button.border-radius-10{-moz-border-radius:10px !important;-webkit-border-radius:10px;border-radius:10px !important}.x-dataview.color .x-dataview-inner.x-scroll-scroller{width:auto !important;height:auto !important;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-dataview.color .x-dataview-inner.x-scroll-scroller .x-dataview-container{margin-top:12px;margin-left:12px}.x-dataview.color .x-dataview-item{display:inline-block}.x-dataview.color .x-dataview-item.x-item-selected .item-inner{-moz-box-shadow:#3ba8ff 0 0 0 4px;-webkit-box-shadow:#3ba8ff 0 0 0 4px;box-shadow:#3ba8ff 0 0 0 4px}.x-dataview.color .x-dataview-item .item-inner{display:inline-block;width:50px;height:50px;border:1px solid #d8d8d8;margin:6px}.x-list.settings{-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-list.settings.x-list-round .x-scroll-view{-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-list.settings.x-list-round.x-list-grouped .x-list-header-wrap .x-dock-horizontal{padding-top:0}.x-list.settings.x-list-round.x-list-grouped .x-list-header-wrap .x-list-header{display:none}.x-list.settings.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-last .x-dock-horizontal{padding-bottom:0}.x-list.settings.x-list-round.x-list-grouped .x-list-item .x-dock-horizontal{border:1px solid #bcbcbc;border-width:1px 1px 0 1px;background:#fff}.x-list.settings.x-list-round.x-list-grouped .x-list-item .x-dock-horizontal .x-innerhtml{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-pressed .x-dock-horizontal{background-image:-webkit-linear-gradient(top, #7c99d8,#416cc6);background-image:-moz-linear-gradient(top, #7c99d8,#416cc6);background-image:-o-linear-gradient(top, #7c99d8,#416cc6);background-image:-ms-linear-gradient(to bottom, #7c99d8,#416cc6);color:#fff}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-pressed .x-dock-horizontal .disclosure{background-position:-24px 0}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-selected .x-dock-horizontal{color:inherit}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-selected .x-dock-horizontal .x-list-item-body{padding-right:1.2em}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-selected .x-dock-horizontal:after{content:"";width:24px;height:24px;position:absolute;top:11px;right:11px;background-image:url("../img/icons/list-normal.png");background-size:72px 48px;background-position:0 -24px}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-selected.x-item-pressed .x-dock-horizontal{color:#fff}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-selected.x-item-pressed .x-dock-horizontal:after{background-position:-24px -24px}.x-list.settings.x-list-round.x-list-grouped .x-list-item .list-icon{width:24px;height:24px;position:absolute}.x-list.settings.x-list-round.x-list-grouped .x-list-item .icon-offset{margin-left:30px}.x-list.settings.x-list-round.x-list-grouped .x-list-item .disclosure{right:12px;background-image:url("../img/icons/list-normal.png");background-size:72px 48px;background-position:0 0}.x-list.settings.x-list-round.x-list-grouped .x-list-header-wrap.x-list-footer-wrap .x-dock-body{-moz-border-radius:.4em;-webkit-border-radius:.4em;border-radius:.4em}.x-list.settings.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal{border:none;background:transparent;padding-bottom:13.8px}.x-list.settings.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal>.x-dock-body{border:1px solid #bcbcbc;background:#fff}.x-list.settings.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-pressed .x-dock-horizontal{background:transparent}.x-list.settings.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-pressed .x-dock-horizontal>.x-dock-body{-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em;background-image:-webkit-linear-gradient(top, #7c99d8,#416cc6);background-image:-moz-linear-gradient(top, #7c99d8,#416cc6);background-image:-o-linear-gradient(top, #7c99d8,#416cc6);background-image:-ms-linear-gradient(to bottom, #7c99d8,#416cc6);color:#fff}.x-msgbox{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #989898,#656565 10%,#656565);background-image:-moz-linear-gradient(top, #989898,#656565 10%,#656565);background-image:-o-linear-gradient(top, #989898,#656565 10%,#656565);background-image:-ms-linear-gradient(to bottom, #989898,#656565 10%,#656565)}.x-msgbox .x-toolbar.x-docked-bottom .x-button .x-button-label,.x-msgbox .x-toolbar.x-docked-bottom .x-button .x-badge{font-size:.9em;line-height:2em}.x-msgbox .x-title{font-size:1em;line-height:1.4em;color:#ffffff;text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-dataview.icon-view .x-dataview-inner.x-scroll-scroller{width:auto !important;height:auto !important}.x-dataview.icon-view .x-dataview-inner.x-scroll-scroller .x-dataview-container{margin-top:12px;margin-left:12px}.x-dataview.icon-view .x-dataview-item{display:inline-block}.x-dataview.icon-view .x-dataview-item.x-item-pressed .item-inner,.x-dataview.icon-view .x-dataview-item.x-item-selected .item-inner{background-image:-webkit-linear-gradient(top, #7c99d8,#416cc6);background-image:-moz-linear-gradient(top, #7c99d8,#416cc6);background-image:-o-linear-gradient(top, #7c99d8,#416cc6);background-image:-ms-linear-gradient(to bottom, #7c99d8,#416cc6);color:#fff}.x-dataview.icon-view .x-dataview-item .item-inner{display:inline-block;width:77px;height:77px;border:1px solid #bcbcbc;background:#fff;margin:-1px}.x-dataview.icon-view .x-dataview-item .item-inner.top-left{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em}.x-dataview.icon-view .x-dataview-item .item-inner.top-right{-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-dataview.icon-view .x-dataview-item .item-inner.bottom-left{-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em}.x-dataview.icon-view .x-dataview-item .item-inner.bottom-right{-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-0{background-position:0 0px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-0,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-0{background-position:-24px 0px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-1{background-position:0 -24px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-1,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-1{background-position:-24px -24px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-2{background-position:0 -48px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-2,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-2{background-position:-24px -48px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-3{background-position:0 -72px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-3,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-3{background-position:-24px -72px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-4{background-position:0 -96px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-4,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-4{background-position:-24px -96px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-5{background-position:0 -120px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-5,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-5{background-position:-24px -120px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-6{background-position:0 -144px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-6,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-6{background-position:-24px -144px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-7{background-position:0 -168px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-7,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-7{background-position:-24px -168px}.x-dataview.icon-view.bullets .item-inner .text{margin-top:1.4em;text-align:center}.x-dataview.icon-view.bullets .item-inner .icon{width:24px;height:24px;margin:1.4em auto;background-image:url("../img/icons/bullets-normal.png");background-size:48px 168px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-0{background-position:0 0px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-0,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-0{background-position:-74px 0px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-1{background-position:0 -74px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-1,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-1{background-position:-74px -74px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-2{background-position:0 -148px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-2,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-2{background-position:-74px -148px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-3{background-position:0 -222px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-3,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-3{background-position:-74px -222px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-4{background-position:0 -296px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-4,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-4{background-position:-74px -296px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-5{background-position:0 -370px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-5,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-5{background-position:-74px -370px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-6{background-position:0 -444px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-6,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-6{background-position:-74px -444px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-7{background-position:0 -518px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-7,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-7{background-position:-74px -518px}.x-dataview.icon-view.numbering .item-inner .text{position:relative;top:1.4em;text-align:center}.x-dataview.icon-view.numbering .item-inner .icon{width:74px;height:74px;margin:0 auto;background-image:url("../img/icons/numbering-normal.png");background-size:148px 518px}.x-dataview.icon-view.outline .x-dataview-item .icon.outline-0{background-position:0 0px}.x-dataview.icon-view.outline .x-dataview-item.x-item-selected .icon.outline-0,.x-dataview.icon-view.outline .x-dataview-item.x-item-pressed .icon.outline-0{background-position:-74px 0px}.x-dataview.icon-view.outline .x-dataview-item .icon.outline-1{background-position:0 -74px}.x-dataview.icon-view.outline .x-dataview-item.x-item-selected .icon.outline-1,.x-dataview.icon-view.outline .x-dataview-item.x-item-pressed .icon.outline-1{background-position:-74px -74px}.x-dataview.icon-view.outline .x-dataview-item .icon.outline-2{background-position:0 -148px}.x-dataview.icon-view.outline .x-dataview-item.x-item-selected .icon.outline-2,.x-dataview.icon-view.outline .x-dataview-item.x-item-pressed .icon.outline-2{background-position:-74px -148px}.x-dataview.icon-view.outline .item-inner .text{position:relative;top:1.4em;text-align:center}.x-dataview.icon-view.outline .item-inner .icon{width:74px;height:74px;margin:0 auto;background-image:url("../img/icons/outline-normal.png");background-size:148px 222px}.x-panel.x-panel-settings{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #ececec,#cbcbcb);background-image:-moz-linear-gradient(top, #ececec,#cbcbcb);background-image:-o-linear-gradient(top, #ececec,#cbcbcb);background-image:-ms-linear-gradient(to bottom, #ececec,#cbcbcb);-moz-box-shadow:#fff 0 1px 0 inset,rgba(0,0,0,0.3) 0 0.2em 0.6em;-webkit-box-shadow:#fff 0 1px 0 inset,rgba(0,0,0,0.3) 0 0.2em 0.6em;box-shadow:#fff 0 1px 0 inset,rgba(0,0,0,0.3) 0 0.2em 0.6em;border:1px solid #797979}.x-panel.x-panel-settings .x-anchor-top{background-color:#797979;margin-top:-.62em;-moz-box-shadow:#fff 0 -1px 0 0 inset;-webkit-box-shadow:#fff 0 -1px 0 0 inset;box-shadow:#fff 0 -1px 0 0 inset}.x-panel.x-panel-settings .x-anchor-top:after{content:'';position:absolute;width:1.631em;height:.7em;-webkit-mask-size:1.631em .7em;background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #f1f1f1,#ececec);background-image:-moz-linear-gradient(top, #f1f1f1,#ececec);background-image:-o-linear-gradient(top, #f1f1f1,#ececec);background-image:-ms-linear-gradient(to bottom, #f1f1f1,#ececec);top:1px !important}.x-panel.x-panel-settings .x-anchor-bottom{height:.8em;background-color:#797979;margin-top:-0.15em;-moz-box-shadow:#fff 0 -1px 0 0 inset;-webkit-box-shadow:#fff 0 -1px 0 0 inset;box-shadow:#fff 0 -1px 0 0 inset}.x-panel.x-panel-settings .x-anchor-bottom:after{content:'';position:absolute;width:1.631em;height:.8em;-webkit-mask-size:1.631em .7em;background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #cbcbcb,#bebebe);background-image:-moz-linear-gradient(top, #cbcbcb,#bebebe);background-image:-o-linear-gradient(top, #cbcbcb,#bebebe);background-image:-ms-linear-gradient(to bottom, #cbcbcb,#bebebe);top:-1px !important}.x-panel.x-panel-settings .x-panel-inner{background:transparent}.x-panel.x-panel-settings .x-navigation-bar{border-bottom:none;margin-top:-6px;background:transparent;overflow:hidden}.x-panel.x-panel-settings .x-navigation-bar .x-title{color:#323232;text-shadow:#fff 0 0.08em 0}.x-panel.x-panel-settings .x-navigationview.plain .x-navigationview-inner{background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.x-panel.x-panel-settings .x-navigationview.plain .x-navigationview-inner:after{content:none}.x-panel.x-panel-settings .x-navigationview-inner{background-color:#efefef;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-panel.x-panel-settings .x-navigationview-inner:after{content:'';position:absolute;width:100%;height:100%;top:0;left:0;pointer-events:none;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em;-moz-box-shadow:inset 0 1px 2px 2px #c8c8c8;-webkit-box-shadow:inset 0 1px 2px 2px #c8c8c8;box-shadow:inset 0 1px 2px 2px #c8c8c8;border:1px solid #797979}.x-label.info .x-innerhtml{color:#7f7f7f;text-shadow:0 1px 0 #fff;text-align:center}.btn-input-image input[type="file"]{opacity:0;position:absolute;left:0;top:0}.x-mask.transparent{background:transparent}.round{-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-list-header-wrap{-moz-border-radius-topleft:.3em !important;-webkit-border-top-left-radius:.3em !important;border-top-left-radius:.3em !important;-moz-border-radius-topright:.3em !important;-webkit-border-top-right-radius:.3em !important;border-top-right-radius:.3em !important}.x-list-header-wrap .x-innerhtml{-moz-border-radius-topleft:.3em !important;-webkit-border-top-left-radius:.3em !important;border-top-left-radius:.3em !important;-moz-border-radius-topright:.3em !important;-webkit-border-top-right-radius:.3em !important;border-top-right-radius:.3em !important}.x-list-header{display:none}.x-spinner.planar-spinner.x-field-grouped-buttons{background:transparent}.x-spinner.planar-spinner.x-field-grouped-buttons.x-field{min-height:0}.x-spinner.planar-spinner.x-field-grouped-buttons .x-form-label{background:transparent}.x-spinner.planar-spinner.x-field-grouped-buttons .x-form-label span{font-size:inherit}.x-spinner.planar-spinner.x-field-grouped-buttons .x-button{margin-top:9px;margin-bottom:9px;padding:0 8px !important}.x-spinner.planar-spinner.x-field-grouped-buttons .x-form-label{padding:0.16em}.x-spinner.planar-spinner.x-field-grouped-buttons .x-field-input{-moz-box-shadow:#b2b2b2 0 3px 4px -2px inset;-webkit-box-shadow:#b2b2b2 0 3px 4px -2px inset;box-shadow:#b2b2b2 0 3px 4px -2px inset;background:#fff;min-width:2.3em}.x-spinner.planar-spinner.x-field-grouped-buttons .x-field-input .x-input-el{text-align:center;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;padding:3px 0 4px;min-height:0;border-top:1px solid #898989;border-bottom:1px solid #898989}.x-spinner.planar-spinner.x-field-grouped-buttons .x-spinner-button{width:auto;border:1px solid #939393 !important;margin:0}.x-spinner.planar-spinner.x-field-grouped-buttons .x-spinner-button-down{margin-right:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.x-spinner.planar-spinner.x-field-grouped-buttons .x-spinner-button-up{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.x-toolbar{background-color:transparent}.x-toolbar-edit{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-moz-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-o-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-ms-linear-gradient(to bottom, #ffffff,#ececec 3%,#cbcbcb);border-color:#4c4c4c}.x-toolbar-edit .x-title{color:#000;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0}.x-toolbar-edit.x-docked-top{border-bottom:1px solid #939393}.x-toolbar-edit .x-button,.x-toolbar .x-toolbar-edit .x-button,.x-toolbar-edit .x-field-select .x-component-outer,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer,.x-toolbar-edit .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before{border:1px solid #8b8b8b;border-top-color:#989898;background-color:#bebebe;color:#000}.x-toolbar-edit .x-button.x-button-back:before,.x-toolbar-edit .x-button.x-button-forward:before,.x-toolbar .x-toolbar-edit .x-button.x-button-back:before,.x-toolbar .x-toolbar-edit .x-button.x-button-forward:before,.x-toolbar-edit .x-field-select .x-component-outer.x-button-back:before,.x-toolbar-edit .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-back:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-forward:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-forward:before{background:#8b8b8b}.x-toolbar-edit .x-button,.x-toolbar-edit .x-button.x-button-back:after,.x-toolbar-edit .x-button.x-button-forward:after,.x-toolbar .x-toolbar-edit .x-button,.x-toolbar .x-toolbar-edit .x-button.x-button-back:after,.x-toolbar .x-toolbar-edit .x-button.x-button-forward:after,.x-toolbar-edit .x-field-select .x-component-outer,.x-toolbar-edit .x-field-select .x-component-outer.x-button-back:after,.x-toolbar-edit .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-back:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar-edit .x-field-select .x-component-outer:before,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-forward:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-forward:after{background-image:none;background-color:#bebebe;background-image:-webkit-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-moz-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-o-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-ms-linear-gradient(to bottom, #e5e5e5,#cbcbcb 3%,#b2b2b2)}.x-toolbar-edit .x-button.x-button-pressing,.x-toolbar-edit .x-button.x-button-pressing:after,.x-toolbar-edit .x-button.x-button-pressed,.x-toolbar-edit .x-button.x-button-pressed:after,.x-toolbar-edit .x-button.x-button-active,.x-toolbar-edit .x-button.x-button-active:after,.x-toolbar .x-toolbar-edit .x-button.x-button-pressing,.x-toolbar .x-toolbar-edit .x-button.x-button-pressing:after,.x-toolbar .x-toolbar-edit .x-button.x-button-pressed,.x-toolbar .x-toolbar-edit .x-button.x-button-pressed:after,.x-toolbar .x-toolbar-edit .x-button.x-button-active,.x-toolbar .x-toolbar-edit .x-button.x-button-active:after,.x-toolbar-edit .x-field-select .x-component-outer.x-button-pressing,.x-toolbar-edit .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar-edit .x-field-select .x-component-outer.x-button-pressed,.x-toolbar-edit .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar-edit .x-field-select .x-component-outer.x-button-active,.x-toolbar-edit .x-field-select .x-component-outer.x-button-active:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-pressing,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-pressed,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-active,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-active:after,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-active,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-active:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-active,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-active:after{background-image:none;background-color:#b7b7b7;background-image:-webkit-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-moz-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-o-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-ms-linear-gradient(to bottom, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8)}.x-toolbar-edit .x-label,.x-toolbar-edit .x-form-label{font-weight:normal;color:#4c4c4c;text-shadow:0 1px 0 #fff}.x-toolbar{background-color:transparent}.x-toolbar-search{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #cbcbcb,#e7e7e7 20%,#e7e7e7);background-image:-moz-linear-gradient(top, #cbcbcb,#e7e7e7 20%,#e7e7e7);background-image:-o-linear-gradient(top, #cbcbcb,#e7e7e7 20%,#e7e7e7);background-image:-ms-linear-gradient(to bottom, #cbcbcb,#e7e7e7 20%,#e7e7e7);border-color:#4c4c4c}.x-toolbar-search .x-title{color:#000;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0}.x-toolbar-search.x-docked-top{border-bottom:1px solid #939393}.x-toolbar-search .x-button,.x-toolbar .x-toolbar-search .x-button,.x-toolbar-search .x-field-select .x-component-outer,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer,.x-toolbar-search .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before{border:1px solid #8b8b8b;border-top-color:#989898;background-color:#bebebe;color:#000}.x-toolbar-search .x-button.x-button-back:before,.x-toolbar-search .x-button.x-button-forward:before,.x-toolbar .x-toolbar-search .x-button.x-button-back:before,.x-toolbar .x-toolbar-search .x-button.x-button-forward:before,.x-toolbar-search .x-field-select .x-component-outer.x-button-back:before,.x-toolbar-search .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-back:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-forward:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-forward:before{background:#8b8b8b}.x-toolbar-search .x-button,.x-toolbar-search .x-button.x-button-back:after,.x-toolbar-search .x-button.x-button-forward:after,.x-toolbar .x-toolbar-search .x-button,.x-toolbar .x-toolbar-search .x-button.x-button-back:after,.x-toolbar .x-toolbar-search .x-button.x-button-forward:after,.x-toolbar-search .x-field-select .x-component-outer,.x-toolbar-search .x-field-select .x-component-outer.x-button-back:after,.x-toolbar-search .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-back:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar-search .x-field-select .x-component-outer:before,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-forward:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-forward:after{background-image:none;background-color:#bebebe;background-image:-webkit-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-moz-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-o-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-ms-linear-gradient(to bottom, #e5e5e5,#cbcbcb 3%,#b2b2b2)}.x-toolbar-search .x-button.x-button-pressing,.x-toolbar-search .x-button.x-button-pressing:after,.x-toolbar-search .x-button.x-button-pressed,.x-toolbar-search .x-button.x-button-pressed:after,.x-toolbar-search .x-button.x-button-active,.x-toolbar-search .x-button.x-button-active:after,.x-toolbar .x-toolbar-search .x-button.x-button-pressing,.x-toolbar .x-toolbar-search .x-button.x-button-pressing:after,.x-toolbar .x-toolbar-search .x-button.x-button-pressed,.x-toolbar .x-toolbar-search .x-button.x-button-pressed:after,.x-toolbar .x-toolbar-search .x-button.x-button-active,.x-toolbar .x-toolbar-search .x-button.x-button-active:after,.x-toolbar-search .x-field-select .x-component-outer.x-button-pressing,.x-toolbar-search .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar-search .x-field-select .x-component-outer.x-button-pressed,.x-toolbar-search .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar-search .x-field-select .x-component-outer.x-button-active,.x-toolbar-search .x-field-select .x-component-outer.x-button-active:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-pressing,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-pressed,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-active,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-active:after,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-active,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-active:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-active,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-active:after{background-image:none;background-color:#b7b7b7;background-image:-webkit-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-moz-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-o-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-ms-linear-gradient(to bottom, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8)}.x-toolbar-search .x-label,.x-toolbar-search .x-form-label{font-weight:normal;color:#4c4c4c;text-shadow:0 1px 0 #fff}.x-button-icon.save,.list-icon.save{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 0px;background-size:72px 888px}.x-button-pressing .x-button-icon.save,.x-button-pressing .list-icon.save,.x-button-pressed .x-button-icon.save,.x-button-pressed .list-icon.save,.x-button-active .x-button-icon.save,.x-button-active .list-icon.save,.x-item-pressed .x-button-icon.save,.x-item-pressed .list-icon.save{background-position:-24px 0px}.x-button-icon.undo,.list-icon.undo{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -24px;background-size:72px 888px}.x-button-pressing .x-button-icon.undo,.x-button-pressing .list-icon.undo,.x-button-pressed .x-button-icon.undo,.x-button-pressed .list-icon.undo,.x-button-active .x-button-icon.undo,.x-button-active .list-icon.undo,.x-item-pressed .x-button-icon.undo,.x-item-pressed .list-icon.undo{background-position:-24px -24px}.x-button-icon.share,.list-icon.share{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -48px;background-size:72px 888px}.x-button-pressing .x-button-icon.share,.x-button-pressing .list-icon.share,.x-button-pressed .x-button-icon.share,.x-button-pressed .list-icon.share,.x-button-active .x-button-icon.share,.x-button-active .list-icon.share,.x-item-pressed .x-button-icon.share,.x-item-pressed .list-icon.share{background-position:-24px -48px}.x-button-icon.font-style,.list-icon.font-style{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -72px;background-size:72px 888px}.x-button-pressing .x-button-icon.font-style,.x-button-pressing .list-icon.font-style,.x-button-pressed .x-button-icon.font-style,.x-button-pressed .list-icon.font-style,.x-button-active .x-button-icon.font-style,.x-button-active .list-icon.font-style,.x-item-pressed .x-button-icon.font-style,.x-item-pressed .list-icon.font-style{background-position:-24px -72px}.x-button-icon.font-color,.list-icon.font-color{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -96px;background-size:72px 888px}.x-button-pressing .x-button-icon.font-color,.x-button-pressing .list-icon.font-color,.x-button-pressed .x-button-icon.font-color,.x-button-pressed .list-icon.font-color,.x-button-active .x-button-icon.font-color,.x-button-active .list-icon.font-color,.x-item-pressed .x-button-icon.font-color,.x-item-pressed .list-icon.font-color{background-position:-24px -96px}.x-button-icon.bold,.list-icon.bold{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -120px;background-size:72px 888px}.x-button-pressing .x-button-icon.bold,.x-button-pressing .list-icon.bold,.x-button-pressed .x-button-icon.bold,.x-button-pressed .list-icon.bold,.x-button-active .x-button-icon.bold,.x-button-active .list-icon.bold,.x-item-pressed .x-button-icon.bold,.x-item-pressed .list-icon.bold{background-position:-24px -120px}.x-button-icon.italic,.list-icon.italic{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -144px;background-size:72px 888px}.x-button-pressing .x-button-icon.italic,.x-button-pressing .list-icon.italic,.x-button-pressed .x-button-icon.italic,.x-button-pressed .list-icon.italic,.x-button-active .x-button-icon.italic,.x-button-active .list-icon.italic,.x-item-pressed .x-button-icon.italic,.x-item-pressed .list-icon.italic{background-position:-24px -144px}.x-button-icon.underline,.list-icon.underline{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -168px;background-size:72px 888px}.x-button-pressing .x-button-icon.underline,.x-button-pressing .list-icon.underline,.x-button-pressed .x-button-icon.underline,.x-button-pressed .list-icon.underline,.x-button-active .x-button-icon.underline,.x-button-active .list-icon.underline,.x-item-pressed .x-button-icon.underline,.x-item-pressed .list-icon.underline{background-position:-24px -168px}.x-button-icon.align-left,.list-icon.align-left{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -192px;background-size:72px 888px}.x-button-pressing .x-button-icon.align-left,.x-button-pressing .list-icon.align-left,.x-button-pressed .x-button-icon.align-left,.x-button-pressed .list-icon.align-left,.x-button-active .x-button-icon.align-left,.x-button-active .list-icon.align-left,.x-item-pressed .x-button-icon.align-left,.x-item-pressed .list-icon.align-left{background-position:-24px -192px}.x-button-icon.align-center,.list-icon.align-center{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -216px;background-size:72px 888px}.x-button-pressing .x-button-icon.align-center,.x-button-pressing .list-icon.align-center,.x-button-pressed .x-button-icon.align-center,.x-button-pressed .list-icon.align-center,.x-button-active .x-button-icon.align-center,.x-button-active .list-icon.align-center,.x-item-pressed .x-button-icon.align-center,.x-item-pressed .list-icon.align-center{background-position:-24px -216px}.x-button-icon.align-right,.list-icon.align-right{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -240px;background-size:72px 888px}.x-button-pressing .x-button-icon.align-right,.x-button-pressing .list-icon.align-right,.x-button-pressed .x-button-icon.align-right,.x-button-pressed .list-icon.align-right,.x-button-active .x-button-icon.align-right,.x-button-active .list-icon.align-right,.x-item-pressed .x-button-icon.align-right,.x-item-pressed .list-icon.align-right{background-position:-24px -240px}.x-button-icon.align-fill,.list-icon.align-fill{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -264px;background-size:72px 888px}.x-button-pressing .x-button-icon.align-fill,.x-button-pressing .list-icon.align-fill,.x-button-pressed .x-button-icon.align-fill,.x-button-pressed .list-icon.align-fill,.x-button-active .x-button-icon.align-fill,.x-button-active .list-icon.align-fill,.x-item-pressed .x-button-icon.align-fill,.x-item-pressed .list-icon.align-fill{background-position:-24px -264px}.x-button-icon.bullets,.list-icon.bullets{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -288px;background-size:72px 888px}.x-button-pressing .x-button-icon.bullets,.x-button-pressing .list-icon.bullets,.x-button-pressed .x-button-icon.bullets,.x-button-pressed .list-icon.bullets,.x-button-active .x-button-icon.bullets,.x-button-active .list-icon.bullets,.x-item-pressed .x-button-icon.bullets,.x-item-pressed .list-icon.bullets{background-position:-24px -288px}.x-button-icon.spacing,.list-icon.spacing{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -312px;background-size:72px 888px}.x-button-pressing .x-button-icon.spacing,.x-button-pressing .list-icon.spacing,.x-button-pressed .x-button-icon.spacing,.x-button-pressed .list-icon.spacing,.x-button-active .x-button-icon.spacing,.x-button-active .list-icon.spacing,.x-item-pressed .x-button-icon.spacing,.x-item-pressed .list-icon.spacing{background-position:-24px -312px}.x-button-icon.page-number,.list-icon.page-number{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -336px;background-size:72px 888px}.x-button-pressing .x-button-icon.page-number,.x-button-pressing .list-icon.page-number,.x-button-pressed .x-button-icon.page-number,.x-button-pressed .list-icon.page-number,.x-button-active .x-button-icon.page-number,.x-button-active .list-icon.page-number,.x-item-pressed .x-button-icon.page-number,.x-item-pressed .list-icon.page-number{background-position:-24px -336px}.x-button-icon.insert,.list-icon.insert{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -360px;background-size:72px 888px}.x-button-pressing .x-button-icon.insert,.x-button-pressing .list-icon.insert,.x-button-pressed .x-button-icon.insert,.x-button-pressed .list-icon.insert,.x-button-active .x-button-icon.insert,.x-button-active .list-icon.insert,.x-item-pressed .x-button-icon.insert,.x-item-pressed .list-icon.insert{background-position:-24px -360px}.x-button-icon.search,.list-icon.search{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -384px;background-size:72px 888px}.x-button-pressing .x-button-icon.search,.x-button-pressing .list-icon.search,.x-button-pressed .x-button-icon.search,.x-button-pressed .list-icon.search,.x-button-active .x-button-icon.search,.x-button-active .list-icon.search,.x-item-pressed .x-button-icon.search,.x-item-pressed .list-icon.search{background-position:-24px -384px}.x-button-icon.fullscreen,.list-icon.fullscreen{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -408px;background-size:72px 888px}.x-button-pressing .x-button-icon.fullscreen,.x-button-pressing .list-icon.fullscreen,.x-button-pressed .x-button-icon.fullscreen,.x-button-pressed .list-icon.fullscreen,.x-button-active .x-button-icon.fullscreen,.x-button-active .list-icon.fullscreen,.x-item-pressed .x-button-icon.fullscreen,.x-item-pressed .list-icon.fullscreen{background-position:-24px -408px}.x-button-icon.spinner-down,.list-icon.spinner-down{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -432px;background-size:72px 888px}.x-button-pressing .x-button-icon.spinner-down,.x-button-pressing .list-icon.spinner-down,.x-button-pressed .x-button-icon.spinner-down,.x-button-pressed .list-icon.spinner-down,.x-button-active .x-button-icon.spinner-down,.x-button-active .list-icon.spinner-down,.x-item-pressed .x-button-icon.spinner-down,.x-item-pressed .list-icon.spinner-down{background-position:-24px -432px}.x-button-icon.spinner-up,.list-icon.spinner-up{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -456px;background-size:72px 888px}.x-button-pressing .x-button-icon.spinner-up,.x-button-pressing .list-icon.spinner-up,.x-button-pressed .x-button-icon.spinner-up,.x-button-pressed .list-icon.spinner-up,.x-button-active .x-button-icon.spinner-up,.x-button-active .list-icon.spinner-up,.x-item-pressed .x-button-icon.spinner-up,.x-item-pressed .list-icon.spinner-up{background-position:-24px -456px}.x-button-icon.superscript,.list-icon.superscript{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -480px;background-size:72px 888px}.x-button-pressing .x-button-icon.superscript,.x-button-pressing .list-icon.superscript,.x-button-pressed .x-button-icon.superscript,.x-button-pressed .list-icon.superscript,.x-button-active .x-button-icon.superscript,.x-button-active .list-icon.superscript,.x-item-pressed .x-button-icon.superscript,.x-item-pressed .list-icon.superscript{background-position:-24px -480px}.x-button-icon.subscript,.list-icon.subscript{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -504px;background-size:72px 888px}.x-button-pressing .x-button-icon.subscript,.x-button-pressing .list-icon.subscript,.x-button-pressed .x-button-icon.subscript,.x-button-pressed .list-icon.subscript,.x-button-active .x-button-icon.subscript,.x-button-active .list-icon.subscript,.x-item-pressed .x-button-icon.subscript,.x-item-pressed .list-icon.subscript{background-position:-24px -504px}.x-button-icon.table,.list-icon.table{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -528px;background-size:72px 888px}.x-button-pressing .x-button-icon.table,.x-button-pressing .list-icon.table,.x-button-pressed .x-button-icon.table,.x-button-pressed .list-icon.table,.x-button-active .x-button-icon.table,.x-button-active .list-icon.table,.x-item-pressed .x-button-icon.table,.x-item-pressed .list-icon.table{background-position:-24px -528px}.x-button-icon.picture,.list-icon.picture{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -552px;background-size:72px 888px}.x-button-pressing .x-button-icon.picture,.x-button-pressing .list-icon.picture,.x-button-pressed .x-button-icon.picture,.x-button-pressed .list-icon.picture,.x-button-active .x-button-icon.picture,.x-button-active .list-icon.picture,.x-item-pressed .x-button-icon.picture,.x-item-pressed .list-icon.picture{background-position:-24px -552px}.x-button-icon.spacing,.list-icon.spacing{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -576px;background-size:72px 888px}.x-button-pressing .x-button-icon.spacing,.x-button-pressing .list-icon.spacing,.x-button-pressed .x-button-icon.spacing,.x-button-pressed .list-icon.spacing,.x-button-active .x-button-icon.spacing,.x-button-active .list-icon.spacing,.x-item-pressed .x-button-icon.spacing,.x-item-pressed .list-icon.spacing{background-position:-24px -576px}.x-button-icon.indent-inc,.list-icon.indent-inc{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -600px;background-size:72px 888px}.x-button-pressing .x-button-icon.indent-inc,.x-button-pressing .list-icon.indent-inc,.x-button-pressed .x-button-icon.indent-inc,.x-button-pressed .list-icon.indent-inc,.x-button-active .x-button-icon.indent-inc,.x-button-active .list-icon.indent-inc,.x-item-pressed .x-button-icon.indent-inc,.x-item-pressed .list-icon.indent-inc{background-position:-24px -600px}.x-button-icon.indent-dec,.list-icon.indent-dec{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -624px;background-size:72px 888px}.x-button-pressing .x-button-icon.indent-dec,.x-button-pressing .list-icon.indent-dec,.x-button-pressed .x-button-icon.indent-dec,.x-button-pressed .list-icon.indent-dec,.x-button-active .x-button-icon.indent-dec,.x-button-active .list-icon.indent-dec,.x-item-pressed .x-button-icon.indent-dec,.x-item-pressed .list-icon.indent-dec{background-position:-24px -624px}.x-button-icon.numbering,.list-icon.numbering{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -648px;background-size:72px 888px}.x-button-pressing .x-button-icon.numbering,.x-button-pressing .list-icon.numbering,.x-button-pressed .x-button-icon.numbering,.x-button-pressed .list-icon.numbering,.x-button-active .x-button-icon.numbering,.x-button-active .list-icon.numbering,.x-item-pressed .x-button-icon.numbering,.x-item-pressed .list-icon.numbering{background-position:-24px -648px}.x-button-icon.outline,.list-icon.outline{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -672px;background-size:72px 888px}.x-button-pressing .x-button-icon.outline,.x-button-pressing .list-icon.outline,.x-button-pressed .x-button-icon.outline,.x-button-pressed .list-icon.outline,.x-button-active .x-button-icon.outline,.x-button-active .list-icon.outline,.x-item-pressed .x-button-icon.outline,.x-item-pressed .list-icon.outline{background-position:-24px -672px}.x-button-icon.insert-row,.list-icon.insert-row{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -696px;background-size:72px 888px}.x-button-pressing .x-button-icon.insert-row,.x-button-pressing .list-icon.insert-row,.x-button-pressed .x-button-icon.insert-row,.x-button-pressed .list-icon.insert-row,.x-button-active .x-button-icon.insert-row,.x-button-active .list-icon.insert-row,.x-item-pressed .x-button-icon.insert-row,.x-item-pressed .list-icon.insert-row{background-position:-24px -696px}.x-button-icon.insert-column,.list-icon.insert-column{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -720px;background-size:72px 888px}.x-button-pressing .x-button-icon.insert-column,.x-button-pressing .list-icon.insert-column,.x-button-pressed .x-button-icon.insert-column,.x-button-pressed .list-icon.insert-column,.x-button-active .x-button-icon.insert-column,.x-button-active .list-icon.insert-column,.x-item-pressed .x-button-icon.insert-column,.x-item-pressed .list-icon.insert-column{background-position:-24px -720px}.x-button-icon.highlightcolor,.list-icon.highlightcolor{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -744px;background-size:72px 888px}.x-button-pressing .x-button-icon.highlightcolor,.x-button-pressing .list-icon.highlightcolor,.x-button-pressed .x-button-icon.highlightcolor,.x-button-pressed .list-icon.highlightcolor,.x-button-active .x-button-icon.highlightcolor,.x-button-active .list-icon.highlightcolor,.x-item-pressed .x-button-icon.highlightcolor,.x-item-pressed .list-icon.highlightcolor{background-position:-24px -744px}.x-button-icon.textcolor,.list-icon.textcolor{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -768px;background-size:72px 888px}.x-button-pressing .x-button-icon.textcolor,.x-button-pressing .list-icon.textcolor,.x-button-pressed .x-button-icon.textcolor,.x-button-pressed .list-icon.textcolor,.x-button-active .x-button-icon.textcolor,.x-button-active .list-icon.textcolor,.x-item-pressed .x-button-icon.textcolor,.x-item-pressed .list-icon.textcolor{background-position:-24px -768px}.x-button-icon.textbigger,.list-icon.textbigger{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -792px;background-size:72px 888px}.x-button-pressing .x-button-icon.textbigger,.x-button-pressing .list-icon.textbigger,.x-button-pressed .x-button-icon.textbigger,.x-button-pressed .list-icon.textbigger,.x-button-active .x-button-icon.textbigger,.x-button-active .list-icon.textbigger,.x-item-pressed .x-button-icon.textbigger,.x-item-pressed .list-icon.textbigger{background-position:-24px -792px}.x-button-icon.textless,.list-icon.textless{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -816px;background-size:72px 888px}.x-button-pressing .x-button-icon.textless,.x-button-pressing .list-icon.textless,.x-button-pressed .x-button-icon.textless,.x-button-pressed .list-icon.textless,.x-button-active .x-button-icon.textless,.x-button-active .list-icon.textless,.x-item-pressed .x-button-icon.textless,.x-item-pressed .list-icon.textless{background-position:-24px -816px}.x-button-icon.spinner-prev,.list-icon.spinner-prev{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -840px;background-size:72px 888px}.x-button-pressing .x-button-icon.spinner-prev,.x-button-pressing .list-icon.spinner-prev,.x-button-pressed .x-button-icon.spinner-prev,.x-button-pressed .list-icon.spinner-prev,.x-button-active .x-button-icon.spinner-prev,.x-button-active .list-icon.spinner-prev,.x-item-pressed .x-button-icon.spinner-prev,.x-item-pressed .list-icon.spinner-prev{background-position:-24px -840px}.x-button-icon.spinner-next,.list-icon.spinner-next{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -864px;background-size:72px 888px}.x-button-pressing .x-button-icon.spinner-next,.x-button-pressing .list-icon.spinner-next,.x-button-pressed .x-button-icon.spinner-next,.x-button-pressed .list-icon.spinner-next,.x-button-active .x-button-icon.spinner-next,.x-button-active .list-icon.spinner-next,.x-item-pressed .x-button-icon.spinner-next,.x-item-pressed .list-icon.spinner-next{background-position:-24px -864px}.x-button.x-button-base{padding:.3em 8px}.x-button.x-button-base,.x-toolbar .x-button.x-button-base{border:1px solid #939393;border-top-color:#a5a5a5;min-height:29px;padding-top:0;padding-bottom:0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:rgba(255,255,255,0.35) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.35) 0 1px 0;box-shadow:rgba(255,255,255,0.35) 0 1px 0;color:#000}.x-button.x-button-base .x-button-icon,.x-toolbar .x-button.x-button-base .x-button-icon{width:24px;height:24px}.x-button.x-button-base.x-button-forward:before,.x-button.x-button-base.x-button-forward:after,.x-button.x-button-base.x-button-back:before,.x-button.x-button-base.x-button-back:after,.x-toolbar .x-button.x-button-base.x-button-forward:before,.x-toolbar .x-button.x-button-base.x-button-forward:after,.x-toolbar .x-button.x-button-base.x-button-back:before,.x-toolbar .x-button.x-button-base.x-button-back:after{-webkit-mask-size:.80717em 1.75em}.x-button.x-button-base .x-button-label,.x-button.x-button-base .x-badge,.x-toolbar .x-button.x-button-base .x-button-label,.x-toolbar .x-button.x-button-base .x-badge{color:#323232;text-shadow:#fff 0 0.09em 0}.x-button.x-button-base.x-button-back:before,.x-button.x-button-base.x-button-forward:before,.x-toolbar .x-button.x-button-base.x-button-back:before,.x-toolbar .x-button.x-button-base.x-button-forward:before{background:#989898}.x-button.x-button-base,.x-button.x-button-base.x-button-back:after,.x-button.x-button-base.x-button-forward:after,.x-toolbar .x-button.x-button-base,.x-toolbar .x-button.x-button-base.x-button-back:after,.x-toolbar .x-button.x-button-base.x-button-forward:after{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-moz-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-o-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-ms-linear-gradient(to bottom, #ffffff,#ececec 3%,#cbcbcb)}.x-button.x-button-base.x-button-pressing,.x-button.x-button-base.x-button-pressing:after,.x-button.x-button-base.x-button-pressed,.x-button.x-button-base.x-button-pressed:after,.x-button.x-button-base.x-button-active,.x-button.x-button-base.x-button-active:after,.x-toolbar .x-button.x-button-base.x-button-pressing,.x-toolbar .x-button.x-button-base.x-button-pressing:after,.x-toolbar .x-button.x-button-base.x-button-pressed,.x-toolbar .x-button.x-button-base.x-button-pressed:after,.x-toolbar .x-button.x-button-base.x-button-active,.x-toolbar .x-button.x-button-base.x-button-active:after{background-image:none;background-color:#656565;background-image:-webkit-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-moz-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-o-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-ms-linear-gradient(to bottom, #4c4c4c,#585858 10%,#656565 65%,#666666)}.x-button.x-button-base.x-button-pressing .x-button-label,.x-button.x-button-base.x-button-pressing .x-badge,.x-button.x-button-base.x-button-pressed .x-button-label,.x-button.x-button-base.x-button-pressed .x-badge,.x-button.x-button-base.x-button-active .x-button-label,.x-button.x-button-base.x-button-active .x-badge,.x-toolbar .x-button.x-button-base.x-button-pressing .x-button-label,.x-toolbar .x-button.x-button-base.x-button-pressing .x-badge,.x-toolbar .x-button.x-button-base.x-button-pressed .x-button-label,.x-toolbar .x-button.x-button-base.x-button-pressed .x-badge,.x-toolbar .x-button.x-button-base.x-button-active .x-button-label,.x-toolbar .x-button.x-button-base.x-button-active .x-badge{color:#fff;text-shadow:#4c4c4c 0 0.09em 0}.x-segmentedbutton-base:not(.divided){margin:0 .2em}.x-segmentedbutton-base:not(.divided) .x-button-base{margin:0;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.x-segmentedbutton-base:not(.divided) .x-button-base:not(.x-first){border-left:0 !important}.x-segmentedbutton-base.divided .x-button-base:not(.x-first){border-left:1px solid #939393}.x-segmentedbutton-base.divided .x-button-base:not(.x-last){margin-right:7px}.x-segmentedbutton-base .x-button-base.x-first{-moz-border-radius-topleft:2px !important;-webkit-border-top-left-radius:2px !important;border-top-left-radius:2px !important;-moz-border-radius-bottomleft:2px !important;-webkit-border-bottom-left-radius:2px !important;border-bottom-left-radius:2px !important}.x-segmentedbutton-base .x-button-base.x-last{-moz-border-radius-topright:2px !important;-webkit-border-top-right-radius:2px !important;border-top-right-radius:2px !important;-moz-border-radius-bottomright:2px !important;-webkit-border-bottom-right-radius:2px !important;border-bottom-right-radius:2px !important}.x-button.x-button-light{padding:.3em 8px}.x-button.x-button-light,.x-toolbar .x-button.x-button-light{border:1px solid #c7c7c7;border-top-color:#d9d9d9;min-height:29px;padding-top:0;padding-bottom:0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:rgba(255,255,255,0.35) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.35) 0 1px 0;box-shadow:rgba(255,255,255,0.35) 0 1px 0;color:#262626}.x-button.x-button-light .x-button-icon,.x-toolbar .x-button.x-button-light .x-button-icon{width:24px;height:24px}.x-button.x-button-light.x-button-forward:before,.x-button.x-button-light.x-button-forward:after,.x-button.x-button-light.x-button-back:before,.x-button.x-button-light.x-button-back:after,.x-toolbar .x-button.x-button-light.x-button-forward:before,.x-toolbar .x-button.x-button-light.x-button-forward:after,.x-toolbar .x-button.x-button-light.x-button-back:before,.x-toolbar .x-button.x-button-light.x-button-back:after{-webkit-mask-size:.80717em 1.75em}.x-button.x-button-light .x-button-label,.x-button.x-button-light .x-badge,.x-toolbar .x-button.x-button-light .x-button-label,.x-toolbar .x-button.x-button-light .x-badge{color:#666;text-shadow:#fff 0 0.09em 0}.x-button.x-button-light.x-button-back:before,.x-button.x-button-light.x-button-forward:before,.x-toolbar .x-button.x-button-light.x-button-back:before,.x-toolbar .x-button.x-button-light.x-button-forward:before{background:#ccc}.x-button.x-button-light,.x-button.x-button-light.x-button-back:after,.x-button.x-button-light.x-button-forward:after,.x-toolbar .x-button.x-button-light,.x-toolbar .x-button.x-button-light.x-button-back:after,.x-toolbar .x-button.x-button-light.x-button-forward:after{background-image:none;background-color:#fff;background-image:-webkit-linear-gradient(top, #ffffff,#ffffff 3%,#ffffff);background-image:-moz-linear-gradient(top, #ffffff,#ffffff 3%,#ffffff);background-image:-o-linear-gradient(top, #ffffff,#ffffff 3%,#ffffff);background-image:-ms-linear-gradient(to bottom, #ffffff,#ffffff 3%,#ffffff)}.x-button.x-button-light.x-button-pressing,.x-button.x-button-light.x-button-pressing:after,.x-button.x-button-light.x-button-pressed,.x-button.x-button-light.x-button-pressed:after,.x-button.x-button-light.x-button-active,.x-button.x-button-light.x-button-active:after,.x-toolbar .x-button.x-button-light.x-button-pressing,.x-toolbar .x-button.x-button-light.x-button-pressing:after,.x-toolbar .x-button.x-button-light.x-button-pressed,.x-toolbar .x-button.x-button-light.x-button-pressed:after,.x-toolbar .x-button.x-button-light.x-button-active,.x-toolbar .x-button.x-button-light.x-button-active:after{background-image:none;background-color:#999;background-image:-webkit-linear-gradient(top, #808080,#8c8c8c 10%,#999999 65%,#9a9a9a);background-image:-moz-linear-gradient(top, #808080,#8c8c8c 10%,#999999 65%,#9a9a9a);background-image:-o-linear-gradient(top, #808080,#8c8c8c 10%,#999999 65%,#9a9a9a);background-image:-ms-linear-gradient(to bottom, #808080,#8c8c8c 10%,#999999 65%,#9a9a9a)}.x-button.x-button-light.x-button-pressing .x-button-label,.x-button.x-button-light.x-button-pressing .x-badge,.x-button.x-button-light.x-button-pressed .x-button-label,.x-button.x-button-light.x-button-pressed .x-badge,.x-button.x-button-light.x-button-active .x-button-label,.x-button.x-button-light.x-button-active .x-badge,.x-toolbar .x-button.x-button-light.x-button-pressing .x-button-label,.x-toolbar .x-button.x-button-light.x-button-pressing .x-badge,.x-toolbar .x-button.x-button-light.x-button-pressed .x-button-label,.x-toolbar .x-button.x-button-light.x-button-pressed .x-badge,.x-toolbar .x-button.x-button-light.x-button-active .x-button-label,.x-toolbar .x-button.x-button-light.x-button-active .x-badge{color:#fff;text-shadow:gray 0 0.09em 0}.x-segmentedbutton-base:not(.divided){margin:0 .2em}.x-segmentedbutton-base:not(.divided) .x-button-light{margin:0;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.x-segmentedbutton-base:not(.divided) .x-button-light:not(.x-first){border-left:0 !important}.x-segmentedbutton-base.divided .x-button-light:not(.x-first){border-left:1px solid #c7c7c7}.x-segmentedbutton-base.divided .x-button-light:not(.x-last){margin-right:7px}.x-segmentedbutton-base .x-button-light.x-first{-moz-border-radius-topleft:2px !important;-webkit-border-top-left-radius:2px !important;border-top-left-radius:2px !important;-moz-border-radius-bottomleft:2px !important;-webkit-border-bottom-left-radius:2px !important;border-bottom-left-radius:2px !important}.x-segmentedbutton-base .x-button-light.x-last{-moz-border-radius-topright:2px !important;-webkit-border-top-right-radius:2px !important;border-top-right-radius:2px !important;-moz-border-radius-bottomright:2px !important;-webkit-border-bottom-right-radius:2px !important;border-bottom-right-radius:2px !important}.x-button.x-button-base-blue{padding:.3em 8px}.x-button.x-button-base-blue,.x-toolbar .x-button.x-button-base-blue{border:1px solid #2e519b;border-top-color:#3760b7;min-height:29px;padding-top:0;padding-bottom:0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:rgba(255,255,255,0.35) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.35) 0 1px 0;box-shadow:rgba(255,255,255,0.35) 0 1px 0;color:#fff}.x-button.x-button-base-blue .x-button-icon,.x-toolbar .x-button.x-button-base-blue .x-button-icon{width:24px;height:24px}.x-button.x-button-base-blue.x-button-forward:before,.x-button.x-button-base-blue.x-button-forward:after,.x-button.x-button-base-blue.x-button-back:before,.x-button.x-button-base-blue.x-button-back:after,.x-toolbar .x-button.x-button-base-blue.x-button-forward:before,.x-toolbar .x-button.x-button-base-blue.x-button-forward:after,.x-toolbar .x-button.x-button-base-blue.x-button-back:before,.x-toolbar .x-button.x-button-base-blue.x-button-back:after{-webkit-mask-size:.80717em 1.75em}.x-button.x-button-base-blue .x-button-label,.x-button.x-button-base-blue .x-badge,.x-toolbar .x-button.x-button-base-blue .x-button-label,.x-toolbar .x-button.x-button-base-blue .x-badge{color:#fff;text-shadow:#2e519b 0 -0.09em 0}.x-button.x-button-base-blue.x-button-back:before,.x-button.x-button-base-blue.x-button-forward:before,.x-toolbar .x-button.x-button-base-blue.x-button-back:before,.x-toolbar .x-button.x-button-base-blue.x-button-forward:before{background:#3155a3}.x-button.x-button-base-blue,.x-button.x-button-base-blue.x-button-back:after,.x-button.x-button-base-blue.x-button-forward:after,.x-toolbar .x-button.x-button-base-blue,.x-toolbar .x-button.x-button-base-blue.x-button-back:after,.x-toolbar .x-button.x-button-base-blue.x-button-forward:after{background-image:none;background-color:#688AD2;background-image:-webkit-linear-gradient(top, #ffffff,#9bb2e1 3%,#688ad2);background-image:-moz-linear-gradient(top, #ffffff,#9bb2e1 3%,#688ad2);background-image:-o-linear-gradient(top, #ffffff,#9bb2e1 3%,#688ad2);background-image:-ms-linear-gradient(to bottom, #ffffff,#9bb2e1 3%,#688ad2)}.x-button.x-button-base-blue.x-button-pressing,.x-button.x-button-base-blue.x-button-pressing:after,.x-button.x-button-base-blue.x-button-pressed,.x-button.x-button-base-blue.x-button-pressed:after,.x-button.x-button-base-blue.x-button-active,.x-button.x-button-base-blue.x-button-active:after,.x-toolbar .x-button.x-button-base-blue.x-button-pressing,.x-toolbar .x-button.x-button-base-blue.x-button-pressing:after,.x-toolbar .x-button.x-button-base-blue.x-button-pressed,.x-toolbar .x-button.x-button-base-blue.x-button-pressed:after,.x-toolbar .x-button.x-button-base-blue.x-button-active,.x-toolbar .x-button.x-button-base-blue.x-button-active:after{background-image:none;background-color:#416cc6;background-image:-webkit-linear-gradient(top, #3155a3,#3760b7 10%,#416cc6 65%,#436dc7);background-image:-moz-linear-gradient(top, #3155a3,#3760b7 10%,#416cc6 65%,#436dc7);background-image:-o-linear-gradient(top, #3155a3,#3760b7 10%,#416cc6 65%,#436dc7);background-image:-ms-linear-gradient(to bottom, #3155a3,#3760b7 10%,#416cc6 65%,#436dc7)}.x-button.x-button-base-blue.x-button-pressing .x-button-label,.x-button.x-button-base-blue.x-button-pressing .x-badge,.x-button.x-button-base-blue.x-button-pressed .x-button-label,.x-button.x-button-base-blue.x-button-pressed .x-badge,.x-button.x-button-base-blue.x-button-active .x-button-label,.x-button.x-button-base-blue.x-button-active .x-badge,.x-toolbar .x-button.x-button-base-blue.x-button-pressing .x-button-label,.x-toolbar .x-button.x-button-base-blue.x-button-pressing .x-badge,.x-toolbar .x-button.x-button-base-blue.x-button-pressed .x-button-label,.x-toolbar .x-button.x-button-base-blue.x-button-pressed .x-badge,.x-toolbar .x-button.x-button-base-blue.x-button-active .x-button-label,.x-toolbar .x-button.x-button-base-blue.x-button-active .x-badge{text-shadow:#2e519b 0 0.09em 0}.x-segmentedbutton-base:not(.divided){margin:0 .2em}.x-segmentedbutton-base:not(.divided) .x-button-base-blue{margin:0;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.x-segmentedbutton-base:not(.divided) .x-button-base-blue:not(.x-first){border-left:0 !important}.x-segmentedbutton-base.divided .x-button-base-blue:not(.x-first){border-left:1px solid #2e519b}.x-segmentedbutton-base.divided .x-button-base-blue:not(.x-last){margin-right:7px}.x-segmentedbutton-base .x-button-base-blue.x-first{-moz-border-radius-topleft:2px !important;-webkit-border-top-left-radius:2px !important;border-top-left-radius:2px !important;-moz-border-radius-bottomleft:2px !important;-webkit-border-bottom-left-radius:2px !important;border-bottom-left-radius:2px !important}.x-segmentedbutton-base .x-button-base-blue.x-last{-moz-border-radius-topright:2px !important;-webkit-border-top-right-radius:2px !important;border-top-right-radius:2px !important;-moz-border-radius-bottomright:2px !important;-webkit-border-bottom-right-radius:2px !important;border-bottom-right-radius:2px !important}.x-button.x-button-back{padding:.3em 8px}.x-button.x-button-back,.x-toolbar .x-button.x-button-back{border:1px solid #939393;border-top-color:#a5a5a5;min-height:29px;padding-top:0;padding-bottom:0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:rgba(255,255,255,0.35) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.35) 0 1px 0;box-shadow:rgba(255,255,255,0.35) 0 1px 0;color:#000}.x-button.x-button-back .x-button-icon,.x-toolbar .x-button.x-button-back .x-button-icon{width:24px;height:24px}.x-button.x-button-back.x-button-forward:before,.x-button.x-button-back.x-button-forward:after,.x-button.x-button-back.x-button-back:before,.x-button.x-button-back.x-button-back:after,.x-toolbar .x-button.x-button-back.x-button-forward:before,.x-toolbar .x-button.x-button-back.x-button-forward:after,.x-toolbar .x-button.x-button-back.x-button-back:before,.x-toolbar .x-button.x-button-back.x-button-back:after{-webkit-mask-size:.80717em 1.75em}.x-button.x-button-back .x-button-label,.x-button.x-button-back .x-badge,.x-toolbar .x-button.x-button-back .x-button-label,.x-toolbar .x-button.x-button-back .x-badge{color:#323232;text-shadow:#fff 0 0.09em 0}.x-button.x-button-back.x-button-back:before,.x-button.x-button-back.x-button-forward:before,.x-toolbar .x-button.x-button-back.x-button-back:before,.x-toolbar .x-button.x-button-back.x-button-forward:before{background:#989898}.x-button.x-button-back,.x-button.x-button-back.x-button-back:after,.x-button.x-button-back.x-button-forward:after,.x-toolbar .x-button.x-button-back,.x-toolbar .x-button.x-button-back.x-button-back:after,.x-toolbar .x-button.x-button-back.x-button-forward:after{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-moz-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-o-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-ms-linear-gradient(to bottom, #ffffff,#ececec 3%,#cbcbcb)}.x-button.x-button-back.x-button-pressing,.x-button.x-button-back.x-button-pressing:after,.x-button.x-button-back.x-button-pressed,.x-button.x-button-back.x-button-pressed:after,.x-button.x-button-back.x-button-active,.x-button.x-button-back.x-button-active:after,.x-toolbar .x-button.x-button-back.x-button-pressing,.x-toolbar .x-button.x-button-back.x-button-pressing:after,.x-toolbar .x-button.x-button-back.x-button-pressed,.x-toolbar .x-button.x-button-back.x-button-pressed:after,.x-toolbar .x-button.x-button-back.x-button-active,.x-toolbar .x-button.x-button-back.x-button-active:after{background-image:none;background-color:#656565;background-image:-webkit-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-moz-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-o-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-ms-linear-gradient(to bottom, #4c4c4c,#585858 10%,#656565 65%,#666666)}.x-button.x-button-back.x-button-pressing .x-button-label,.x-button.x-button-back.x-button-pressing .x-badge,.x-button.x-button-back.x-button-pressed .x-button-label,.x-button.x-button-back.x-button-pressed .x-badge,.x-button.x-button-back.x-button-active .x-button-label,.x-button.x-button-back.x-button-active .x-badge,.x-toolbar .x-button.x-button-back.x-button-pressing .x-button-label,.x-toolbar .x-button.x-button-back.x-button-pressing .x-badge,.x-toolbar .x-button.x-button-back.x-button-pressed .x-button-label,.x-toolbar .x-button.x-button-back.x-button-pressed .x-badge,.x-toolbar .x-button.x-button-back.x-button-active .x-button-label,.x-toolbar .x-button.x-button-back.x-button-active .x-badge{color:#fff;text-shadow:#4c4c4c 0 0.09em 0}.x-button.x-button-back,.x-toolbar .x-button.x-button-back{-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}.x-segmentedbutton-base:not(.divided){margin:0 .2em}.x-segmentedbutton-base:not(.divided) .x-button-back{margin:0;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.x-segmentedbutton-base:not(.divided) .x-button-back:not(.x-first){border-left:0 !important}.x-segmentedbutton-base.divided .x-button-back:not(.x-first){border-left:1px solid #939393}.x-segmentedbutton-base.divided .x-button-back:not(.x-last){margin-right:7px}.x-segmentedbutton-base .x-button-back.x-first{-moz-border-radius-topleft:2px !important;-webkit-border-top-left-radius:2px !important;border-top-left-radius:2px !important;-moz-border-radius-bottomleft:2px !important;-webkit-border-bottom-left-radius:2px !important;border-bottom-left-radius:2px !important}.x-segmentedbutton-base .x-button-back.x-last{-moz-border-radius-topright:2px !important;-webkit-border-top-right-radius:2px !important;border-top-right-radius:2px !important;-moz-border-radius-bottomright:2px !important;-webkit-border-bottom-right-radius:2px !important;border-bottom-right-radius:2px !important}.unsuported-view{position:absolute;left:0;top:0;right:0;bottom:0;background:url(../img/ios-only.png) no-repeat center #efefef;background-attachment:fixed;z-index:90000}.x-button.text-offset-12{padding-left:12px;padding-right:12px}.x-button.text-offset-30{padding-left:30px;padding-right:30px} +html,body{position:relative;width:100%;height:100%}.x-fullscreen{position:absolute !important}.x-body{position:relative;z-index:0}.x-inner,.x-body{width:100%;height:100%}.x-sized{position:relative}.x-innerhtml{width:100%}.x-layout-box{display:flex;display:-webkit-box;display:-ms-flexbox}.x-layout-box.x-horizontal{-webkit-box-orient:horizontal !important;-ms-flex-direction:row !important;flex-direction:row !important}.x-layout-box.x-horizontal>.x-layout-box-item.x-flexed{min-width:0 !important}.x-layout-box.x-vertical{-webkit-box-orient:vertical !important;-ms-flex-direction:column !important;flex-direction:column !important}.x-layout-box.x-vertical>.x-layout-box-item.x-flexed{min-height:0 !important}.x-layout-box>.x-layout-box-item{display:flex !important;display:-webkit-box !important;display:-ms-flexbox !important}.x-layout-box.x-align-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.x-layout-box.x-align-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.x-layout-box.x-align-end{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.x-layout-box.x-align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.x-layout-box.x-pack-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.x-layout-box.x-pack-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-layout-box.x-pack-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.x-layout-box.x-pack-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.x-layout-box-item.x-sized>.x-inner,.x-layout-box-item.x-sized>.x-body,.x-layout-box-item.x-sized>.x-dock-outer{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-webkit .x-layout-box.x-horizontal>.x-layout-box-item.x-flexed{width:0 !important}.x-webkit .x-layout-box.x-vertical>.x-layout-box-item.x-flexed{height:0 !important}.x-firefox .x-stretched.x-dock-horizontal>.x-dock-body{width:0}.x-firefox .x-stretched.x-dock-vertical>.x-dock-body{height:0}.x-firefox .x-container .x-dock-horizontal.x-unsized .x-dock-body{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px;min-height:0;min-width:0}.x-firefox .x-has-height>.x-dock.x-unsized.x-dock-vertical>.x-dock-body{height:0}.x-layout-card{position:relative;overflow:hidden}.x-layout-card-perspective{-webkit-perspective:1000px;-ms-perspective:1000px;perspective:1000px}.x-layout-card-item-container{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-layout-card-item{position:absolute;top:0;right:0;bottom:0;left:0;position:absolute !important}.x-dock{display:flex;display:-webkit-box;display:-ms-flexbox}.x-dock>.x-dock-body{overflow:hidden}.x-dock.x-sized,.x-dock.x-sized>.x-dock-body>*,.x-dock.x-sized>.x-dock-body>.x-body>.x-inner{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-dock.x-sized>.x-dock-body{position:relative;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-dock.x-unsized,.x-dock.x-stretched{height:100%}.x-dock.x-unsized>.x-dock-body,.x-dock.x-stretched>.x-dock-body{position:relative;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;min-height:0;min-width:0}.x-dock.x-unsized>.x-dock-body>*,.x-dock.x-stretched>.x-dock-body>*{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-dock.x-dock-vertical{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-dock.x-dock-horizontal{-webkit-box-orient:horizontal !important;-ms-flex-direction:row !important;flex-direction:row !important}.x-dock.x-dock-horizontal>.x-dock-item{display:flex;display:-webkit-box;display:-ms-flexbox}.x-dock.x-dock-horizontal>.x-dock-item.x-sized>.x-inner,.x-dock.x-dock-horizontal>.x-dock-item.x-sized>.x-body{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-dock.x-dock-horizontal>.x-dock-item.x-unsized{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-dock.x-dock-horizontal>.x-dock-item.x-unsized>*{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-ie .x-stretched.x-dock-horizontal>.x-dock-body{width:0}.x-ie .x-stretched.x-dock-vertical>.x-dock-body{height:0}.x-ie .x-has-width>.x-dock.x-unsized.x-dock-horizontal>.x-dock-body{width:0}.x-ie .x-has-height>.x-dock.x-unsized.x-dock-vertical>.x-dock-body{height:0}.x-stretched.x-container{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-stretched.x-container>.x-inner,.x-stretched.x-container>.x-body,.x-stretched.x-container>.x-body>.x-inner{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;min-height:0px}.x-layout-fit.x-stretched>.x-layout-fit-item{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-layout-fit{position:relative}.x-layout-fit-item.x-sized{position:absolute;top:0;right:0;bottom:0;left:0}.x-layout-fit-item.x-unsized{width:100%;height:100%}.x-ie .x-stretched>.x-inner,.x-ie .x-stretched>.x-body{min-height:inherit}.x-center,.x-centered{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-center>*,.x-centered>*{position:relative}.x-center>.x-floating,.x-centered>.x-floating{position:relative !important}.x-floating{position:absolute !important}.x-layout-float{overflow:hidden}.x-layout-float>.x-layout-float-item{float:left}.x-layout-float.x-direction-right>.x-layout-float-item{float:right}@-webkit-keyframes x-paint-monitor-helper{from{zoom:1}to{zoom:1}}@keyframes x-paint-monitor-helper{from{zoom:1}to{zoom:1}}.x-paint-monitored{position:relative}.x-paint-monitor{width:0 !important;height:0 !important;visibility:hidden}.x-paint-monitor.cssanimation{-webkit-animation-duration:0.0001ms;-webkit-animation-name:x-paint-monitor-helper;animation-duration:0.0001ms;animation-name:x-paint-monitor-helper}.x-paint-monitor.overflowchange{overflow:hidden}.x-paint-monitor.overflowchange::after{content:'';display:block;width:1px !important;height:1px !important}.x-size-monitored{position:relative}.x-size-monitors{position:absolute;left:0;top:0;width:100%;height:100%;visibility:hidden;overflow:hidden}.x-size-monitors>*{width:100%;height:100%;overflow:hidden}.x-size-monitors.scroll>*.shrink::after{content:'';display:block;width:200%;height:200%;min-width:1px;min-height:1px}.x-size-monitors.scroll>*.expand::after{content:'';display:block;width:100000px;height:100000px}.x-size-monitors.overflowchanged>*.shrink>*{width:100%;height:100%}.x-size-monitors.overflowchanged>*.expand>*{width:200%;height:200%}.x-size-change-detector{visibility:hidden;position:absolute;left:0;top:0;z-index:-1;width:100%;height:100%;overflow:hidden}.x-size-change-detector>*{visibility:hidden}.x-size-change-detector-shrink>*{width:200%;height:200%}.x-size-change-detector-expand>*{width:100000px;height:100000px}.x-translatable{position:absolute !important;top:500000px !important;left:500000px !important;overflow:visible !important;z-index:1}.x-translatable-hboxfix{position:absolute;min-width:100%;top:0;left:0}.x-translatable-hboxfix>.x-translatable{position:relative !important}.x-translatable-container{overflow:hidden;width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-translatable-container::before{content:'';display:block;width:1000000px;height:1000000px;visibility:hidden}.x-button{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#eee;border:1px solid #ccc;position:relative;overflow:hidden;z-index:1}.x-button .x-button-icon{position:relative;background-repeat:no-repeat;background-position:center}.x-button .x-button-icon.x-shown{display:block}.x-button .x-button-icon.x-hidden{display:none}.x-iconalign-left,.x-icon-align-right{-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.x-iconalign-top,.x-iconalign-bottom{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-iconalign-bottom,.x-iconalign-right{-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.x-iconalign-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-button-label,.x-badge,.x-hasbadge .x-badge{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center;white-space:nowrap;text-overflow:ellipsis;text-align:center;display:block;overflow:hidden}.x-badge{background-color:#ccc;border:1px solid #aaa;z-index:2;position:absolute !important;width:auto;font-size:.6em;right:0;top:0;max-width:95%;display:inline-block}html,body{font-family:"Helvetica Neue", HelveticaNeue, "Helvetica-Neue", Helvetica, "BBAlpha Sans", sans-serif;font-weight:normal;-webkit-text-size-adjust:none;margin:0;cursor:default}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}li{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}q:before,q:after{content:''}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{vertical-align:text-bottom}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit}*:focus{outline:none}body.x-desktop{overflow:hidden}@-ms-viewport{width:device-width}*,*:after,*:before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-user-drag:none;-webkit-user-select:none;-ms-user-select:none;-ms-touch-action:none;-moz-user-select:-moz-none}input,textarea{-webkit-user-select:text;-ms-user-select:auto;-moz-user-select:text}.x-hidden-visibility{visibility:hidden !important}.x-hidden-display,.x-field-hidden{display:none !important}.x-hidden-offsets{position:absolute !important;left:-10000em;top:-10000em;visibility:hidden}.x-html{-webkit-user-select:auto;-webkit-touch-callout:inherit;-ms-user-select:auto;line-height:1.5;color:#333;font-size:.8em;padding:1.2em}.x-html body{line-height:1.5;font-family:"Helvetica Neue",Arial,Helvetica,sans-serif;color:#333;font-size:75%}.x-html h1,.x-html h2,.x-html h3,.x-html h4,.x-html h5,.x-html h6{font-weight:normal;color:#222}.x-html h1 img,.x-html h2 img,.x-html h3 img,.x-html h4 img,.x-html h5 img,.x-html h6 img{margin:0}.x-html h1{font-size:3em;line-height:1;margin-bottom:0.50em}.x-html h2{font-size:2em;margin-bottom:0.75em}.x-html h3{font-size:1.5em;line-height:1;margin-bottom:1.00em}.x-html h4{font-size:1.2em;line-height:1.25;margin-bottom:1.25em}.x-html h5{font-size:1em;font-weight:bold;margin-bottom:1.50em}.x-html h6{font-size:1em;font-weight:bold}.x-html p{margin:0 0 1.5em}.x-html p .left{float:left;margin:1.5em 1.5em 1.5em 0;padding:0}.x-html p .right{float:right;margin:1.5em 0 1.5em 1.5em;padding:0}.x-html a{text-decoration:underline;color:#06c}.x-html a:visited{color:#004d99}.x-html a:focus{color:#09f}.x-html a:hover{color:#09f}.x-html a:active{color:#bf00ff}.x-html blockquote{margin:1.5em;color:#666;font-style:italic}.x-html strong,.x-html dfn{font-weight:bold}.x-html em,.x-html dfn{font-style:italic}.x-html sup,.x-html sub{line-height:0}.x-html abbr,.x-html acronym{border-bottom:1px dotted #666666}.x-html address{margin:0 0 1.5em;font-style:italic}.x-html del{color:#666}.x-html pre{margin:1.5em 0;white-space:pre}.x-html pre,.x-html code,.x-html tt{font:1em "andale mono","lucida console",monospace;line-height:1.5}.x-html li ul,.x-html li ol{margin:0}.x-html ul,.x-html ol{margin:0 1.5em 1.5em 0;padding-left:1.5em}.x-html ul{list-style-type:disc}.x-html ol{list-style-type:decimal}.x-html dl{margin:0 0 1.5em 0}.x-html dl dt{font-weight:bold}.x-html dd{margin-left:1.5em}.x-html table{margin-bottom:1.4em;width:100%}.x-html th{font-weight:bold}.x-html thead th{background:#c3d9ff}.x-html th,.x-html td,.x-html caption{padding:4px 10px 4px 5px}.x-html table.striped tr:nth-child(even) td,.x-html table tr.even td{background:#e5ecf9}.x-html tfoot{font-style:italic}.x-html caption{background:#eee}.x-html .quiet{color:#666}.x-html .loud{color:#111}.x-html ul li{list-style-type:circle}.x-html ol li{list-style-type:decimal}@-webkit-keyframes x-loading-spinner-rotate{0%{-webkit-transform:rotate(0deg)}8.32%{-webkit-transform:rotate(0deg)}8.33%{-webkit-transform:rotate(30deg)}16.65%{-webkit-transform:rotate(30deg)}16.66%{-webkit-transform:rotate(60deg)}24.99%{-webkit-transform:rotate(60deg)}25%{-webkit-transform:rotate(90deg)}33.32%{-webkit-transform:rotate(90deg)}33.33%{-webkit-transform:rotate(120deg)}41.65%{-webkit-transform:rotate(120deg)}41.66%{-webkit-transform:rotate(150deg)}49.99%{-webkit-transform:rotate(150deg)}50%{-webkit-transform:rotate(180deg)}58.32%{-webkit-transform:rotate(180deg)}58.33%{-webkit-transform:rotate(210deg)}66.65%{-webkit-transform:rotate(210deg)}66.66%{-webkit-transform:rotate(240deg)}74.99%{-webkit-transform:rotate(240deg)}75%{-webkit-transform:rotate(270deg)}83.32%{-webkit-transform:rotate(270deg)}83.33%{-webkit-transform:rotate(300deg)}91.65%{-webkit-transform:rotate(300deg)}91.66%{-webkit-transform:rotate(330deg)}100%{-webkit-transform:rotate(330deg)}}@keyframes x-loading-spinner-rotate{0%{-ms-transform:rotate(0deg);transform:rotate(0deg)}8.32%{-ms-transform:rotate(0deg);transform:rotate(0deg)}8.33%{-ms-transform:rotate(30deg);transform:rotate(30deg)}16.65%{-ms-transform:rotate(30deg);transform:rotate(30deg)}16.66%{-ms-transform:rotate(60deg);transform:rotate(60deg)}24.99%{-ms-transform:rotate(60deg);transform:rotate(60deg)}25%{-ms-transform:rotate(90deg);transform:rotate(90deg)}33.32%{-ms-transform:rotate(90deg);transform:rotate(90deg)}33.33%{-ms-transform:rotate(120deg);transform:rotate(120deg)}41.65%{-ms-transform:rotate(120deg);transform:rotate(120deg)}41.66%{-ms-transform:rotate(150deg);transform:rotate(150deg)}49.99%{-ms-transform:rotate(150deg);transform:rotate(150deg)}50%{-ms-transform:rotate(180deg);transform:rotate(180deg)}58.32%{-ms-transform:rotate(180deg);transform:rotate(180deg)}58.33%{-ms-transform:rotate(210deg);transform:rotate(210deg)}66.65%{-ms-transform:rotate(210deg);transform:rotate(210deg)}66.66%{-ms-transform:rotate(240deg);transform:rotate(240deg)}74.99%{-ms-transform:rotate(240deg);transform:rotate(240deg)}75%{-ms-transform:rotate(270deg);transform:rotate(270deg)}83.32%{-ms-transform:rotate(270deg);transform:rotate(270deg)}83.33%{-ms-transform:rotate(300deg);transform:rotate(300deg)}91.65%{-ms-transform:rotate(300deg);transform:rotate(300deg)}91.66%{-ms-transform:rotate(330deg);transform:rotate(330deg)}100%{-ms-transform:rotate(330deg);transform:rotate(330deg)}}@font-face{font-family:"Pictos";src:url('data:application/font-woff;base64,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') format('woff'),url('data:font/truetype;base64,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AQIFAw4BAQQCCAEBBAIBAQMDAgYGAgECAgEBAQICAQ0DAQICBQEMBwIFAgICBgMCBQQCBAQMAQMBAQEBBAUBAwkBAwEBAgEDAgIBBAICBgECBgMCBQIGCAUFAQUIAQMFAQELAQEGAQIDAQEBBAEBAQMCBgIEAwQGAgQHAgMDAQIGAQIBAQICAQQBBQECGwQCAQUDAQIDAgcFCAMBBgMEAwQEBAMDAQIDAwUCAgEIBgIKAQ0EBAIGAwQMAwELAQcJCAIDAgYDAQcBBwYDBAYCAgUBAwEBCwcIAgEKIceMUo4vBwIDBQUBBAIKAgEBAQMBAQMCBQIDAgJFAhkBAgEBBwQHAgoBAQUCAwMDAQIJAQUClAEFBQsCCAEDBAcBBAUBAwMBAScCBgEDAwIEAQIBBQEHAgMCAgMMBAMBAQIHARYCAgMEBQQCAgEBBAEBAwYBAwOgAQPKAgMBAQMCAQUCAQEWAgcCBQFxBgoGBQEDAgICCQEJAQ4EAgEBAQQCAgECBAECAQEBAQ8HARMPAgECAQUEAQMFAQIBAQQBBAQGBgMDCwENCgoBBwoDCQQIBAQDAwQEAgECAQIDAgEDAwQCBAEEAQIEAQMDAwUJAQgNAQMICAoQBgIICQYBAgICAQUCBQYGAQUBAgoDAQH+YwMEAgEBEQQHAgMBAggEBQUGIwICAQENAQcBBwIBCAIfBAUGAgEBJgMEAgIBARABAQF9AgICuvb+pPb2AVwzAwMFAggECwIBBAIECQIBAgECBgECAgIEBwECAQMEAgX+wFprEwkCCQIBAwgEBAMHAgQBBAEHAQMDBQoEAQMEAQIBAQIIAgEEAgYCAgMFAQcEDAUMDgIKAQsECQQBAgkBCQICAQEBAQIDAgwDAQQDBAcBAQEKAQQKAQIBBwQCBgkBBQEFAQECAwYDDAMEAgcBAgIBAQESAgMEAwEBAQQJAQgKAQICAQQDBgIEBgYBBAYFAQIBAgECAQIGBAgBAwMCAgEDAQsDAgYCAwoCAgcEAQIGBQ0IBAMCAgIBAQIIBAICCQIEAgECBQQCAQM4QFsBAwEGAgcCBgIBAQICBAEBAQIBAQECAQICAQIDBAMCBAMKBwEKAQoDAQICCwICAQQCBQEBAQEBCwIHBAECAQEBAQIPCAQBAgMEBgoCAQUDAQICAgYGAgQFAgEJAwECAQ0DAQMCBgQBCQMC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') format('truetype'),url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiID4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8bWV0YWRhdGE+ClRoaXMgaXMgYSBjdXN0b20gU1ZHIHdlYmZvbnQgZ2VuZXJhdGVkIGJ5IEZvbnQgU3F1aXJyZWwuCkRlc2lnbmVyICAgIDogRHJldyBXaWxzb24KRm91bmRyeSAgICAgOiBEcmV3IFdpbHNvbgpGb3VuZHJ5IFVSTCA6IGh0dHBwaWN0b3NkcmV3d2lsc29uY29tCjwvbWV0YWRhdGE+CjxkZWZzPgo8Zm9udCBpZD0id2ViZm9udEl5Zlpic2VGIiBob3Jpei1hZHYteD0iOTIwIiA+Cjxmb250LWZhY2UgdW5pdHMtcGVyLWVtPSIxMDAwIiBhc2NlbnQ9Ijc1MCIgZGVzY2VudD0iLTI1MCIgLz4KPG1pc3NpbmctZ2x5cGggaG9yaXotYWR2LXg9IjUwMCIgLz4KPGdseXBoIHVuaWNvZGU9IiAiICBob3Jpei1hZHYteD0iNTAwIiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4MDk7IiBob3Jpei1hZHYteD0iNTAwIiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4YTA7IiBob3Jpei1hZHYteD0iNTAwIiAvPgo8Z2x5cGggdW5pY29kZT0iISIgaG9yaXotYWR2LXg9IjkzNiIgZD0iTTg2NSAxMDNxMzcgLTYyIDExIC0xMDYuNXQtOTggLTQ0LjVoLTYyMXEtNzIgMCAtOTcuNSA0NC41dDExLjUgMTA2LjVsMzEwIDUzNHEzNiA2MiA4Ny41IDYydDg3LjUgLTYyek00NzEgNDZxMjMgMCAzOC41IDE2dDE1LjUgMzh0LTE1LjUgMzcuNXQtMzguNSAxNS41cS0yMiAwIC0zNy41IC0xNS41dC0xNS41IC0zNy41dDE1LjUgLTM4dDM3LjUgLTE2ek01MDkgMTg3bDI2IDMwOGgtMTI3bDI2IC0zMDhoNzV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4MjI7IiBob3Jpei1hZHYteD0iODY1IiBkPSJNNTIgMjg5cTEgNjUgNy41IDExNXQyNi41IDEwMS41dDUzLjUgODYuNXQ5MC41IDU4LjV0MTM1IDI4LjV2LTE1N3EtNjYgMCAtOTUgLTQ2LjV0LTI5IC0xNDcuNWwtNCAtMWg4NHExOCAwIDMxIC0xM3QxMyAtMzJ2LTI1OHEwIC0xOCAtMTMgLTMxdC0zMSAtMTNoLTIyNXEtMTggMCAtMzEgMTN0LTEzIDMxdjI1OHY3ek00OTMgMjg5cTAgNjUgNyAxMTV0MjcgMTAxLjV0NTMuNSA4Ni41dDkwLjUgNTguNXQxMzUgMjguNXYtMTU3IHEtNjcgMCAtOTYgLTQ2LjV0LTI5IC0xNDcuNWwtNCAtMWg4NHExOCAwIDMxIC0xM3QxMyAtMzJ2LTI1OHEwIC0xOCAtMTMgLTMxdC0zMSAtMTNoLTIyNHEtMTkgMCAtMzIgMTN0LTEzIDMxdjI1OHEwIDUgMSA3eiIgLz4KPGdseXBoIHVuaWNvZGU9IiMiIGhvcml6LWFkdi14PSI3NDgiIGQ9Ik03MDUgNDgycTkgLTE0IC04IC0xNGgtNDh2LTU2N3EwIC03IC01IC0xMnQtMTIgLTVoLTUxM3EtNyAwIC0xMiA1dC01IDEydjU2N2gtNTJxLTcgMCAtOS41IDR0MS41IDEwbDMxIDQ2cTkgMTQgMjcgMTRoNzV2NjZxMCAyMCAxMiAzMGw0OCA0OXExMiAxMiAzMCAxMmgyMTZxMTggMCAzMCAtMTJsNTIgLTUycTEzIC0xMyAxMyAtMzB2LTYzaDcxcTE4IDAgMjcgLTE0ek0yNDggNTQ2di00aDI1NHY0djI4cTAgMjAgLTEyIDMwbC05IDEwIHEtMTIgMTIgLTMwIDEyaC0xNTVxLTE4IDAgLTMwIC0xMmwtNiAtNnEtMTIgLTEyIC0xMiAtMzB2LTMyek01NzYgNDUwcTAgMTYgLTE2IDE4aC0yNzloLTg5cS03IDAgLTEyIC01LjV0LTUgLTEyLjV2LTQ3NnEwIC03IDUgLTEydDEyIC01aDM2N3E3IDAgMTIgNXQ1IDEydjQ3NnpNMjYzIDQxOHE3IDAgMTIuNSAtNXQ1LjUgLTEydi0zNzlxMCAtNyAtNS41IC0xMnQtMTIuNSAtNWgtMjFxLTcgMCAtMTIuNSA1dC01LjUgMTJ2Mzc5cTAgNyA1LjUgMTIgdDEyLjUgNWgyMXpNMzY0IDVxLTcgMCAtMTIuNSA1dC01LjUgMTJ2Mzc5cTAgNyA1LjUgMTJ0MTIuNSA1aDIxcTcgMCAxMiAtNXQ1IC0xMnYtMzc5cTAgLTcgLTUgLTEydC0xMiAtNWgtMjF6TTQ4NSA1cS03IDAgLTEyIDV0LTUgMTJ2Mzc5cTAgNyA1IDEydDEyIDVoMjJxNyAwIDEyIC01dDUgLTEydi0zNzlxMCAtNyAtNSAtMTJ0LTEyIC01aC0yMnoiIC8+CjxnbHlwaCB1bmljb2RlPSIkIiBob3Jpei1hZHYteD0iODkzIiBkPSJNNTAzIDI4M2gtMTA4bC0xNiA2OGgxMjR2LTY4ek02ODQgMzUxbC0xOCAtNjhoLTEwNGwxIDY4aDEyMXpNNDAwIDExOHEyOCAwIDQ4LjUgLTIwdDIwLjUgLTQ5dC0yMC41IC00OXQtNDguNSAtMjB0LTQ4LjUgMjB0LTIwLjUgNDl0MjAuNSA0OXQ0OC41IDIwek02NTkgMTE4cTI5IDAgNDkgLTIwdDIwIC00OXQtMjAgLTQ5dC00OSAtMjB0LTQ5IDIwdC0yMCA0OXQyMCA0OXQ0OSAyMHpNODMzIDUxNnEyNSAtNyAyNSAtMzNxMCAtMyAtMiAtOSBsLTg4IC0yOTNxLTcgLTI1IC0zMiAtMjVoLTQxN3EtMTIgMCAtMjEuNSA3LjV0LTExLjUgMTguNWwtODEgMzI3aC0xNDlxLTE0IDAgLTI0IDEwdC0xMCAyNHQxMCAyNHQyNCAxMGgxNzZxMjYgMCAzMyAtMjZsMTggLTczaDUwM2w1IDE1cTYgMjQgMzIgMjRxNyAwIDEwIC0xek03MTIgMjMxbDU0IDE3OWgtNDY2bDQ1IC0xODZoMzY1eiIgLz4KPGdseXBoIHVuaWNvZGU9IiUiIGhvcml6LWFkdi14PSI5MDMiIGQ9Ik04NjcgMjc3cTAgLTc5IC0zNy41IC0xNDl0LTEwMi41IC0xMTdsMTEgLTk2di00cTAgLTE3IC0xMSAtMzBxLTEzIC0xNSAtMzQgLTE1aC0xNDhxLTIxIDAgLTM0IDE1cS0xMSAxMyAtMTEgMzB2NWwyIDE4cS02IC0xIC0xOCAtMWgtMTBsMiAtMTd2LTVxMCAtMTcgLTExIC0zMHEtMTIgLTE1IC0zNCAtMTVoLTE0OHEtMjEgMCAtMzQgMTVxLTExIDEzIC0xMSAzMHY1bDExIDkwcS04NiA2MCAtMTI0IDE1M2wtNDQgLTRoLTRxLTE4IDAgLTMwIDEyIHEtMTUgMTIgLTE1IDMzdjE1MnEwIDIxIDE1IDMzcTEyIDEyIDMwIDEyaDRsNDMgLTRxMzQgODUgMTA3IDE0MWwtMiAxMTB2MXYxcTAgMjggMjUgNDNxMTEgNyAyNiA3cTE0IDAgMjUgLTdsMTI4IC03MnEyNSAzIDUxIDNxMTYwIDAgMjcwIC05OXExMTMgLTEwMCAxMTMgLTI0NHpNNjgxIDQ3cTYxIDQxIDk1LjUgMTAxdDM0LjUgMTI5cTAgMTE4IC05NCAyMDJxLTk2IDg1IC0yMzMgODVxLTI5IDAgLTUzIC00bC05IC0xbC0xMzYgNzdsMiAtMTMwIGwtMTIgLThxLTc5IC01NyAtMTA2IC0xNDRsLTcgLTIybC03NSA3di0xMjdsNzUgOGw3IC0yMnEzMyAtOTYgMTI0IC0xNTVsMTUgLTlsLTEzIC0xMTJoMTIzbC05IDc0bDM1IC00cTEzIC0yIDM5IC0ycTI0IDAgNDcgM2wzNiA0bC05IC03NWgxMjNsLTE1IDExNnpNNTAxIDUyMWw3IC0xcTcgMCAxOCAtMnQyNiAtNXQzMiAtOXQzNSAtMTR0MzcgLTIwLjV0MzYgLTI4LjVxOCAtNyA4IC0xOXQtOCAtMjBxLTggLTkgLTIwIC05cS0xMSAwIC0xOSA4IHEtMjQgMjMgLTU5IDM4LjV0LTU1LjUgMTkuNXQtMzUuNSA1aC00cS0xMSAxIC0xOSA5LjV0LTggMTkuNXExIDEyIDkuNSAyMHQxOS41IDh6TTIzMSAzODRxMTkgMjAgNDEgMjZ0MzQgLTVxMTEgLTExIDYuNSAtMzN0LTIzLjUgLTQydC00MC41IC0yNnQtMzMuNSA1dC03IDMzdDIzIDQyeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeDI2OyIgaG9yaXotYWR2LXg9IjczMiIgZD0iTTQ2NSA0MDVoMjUwdi0xOThoLTI1MHYtMjUwaC0xOTh2MjUwaC0yNTB2MTk4aDI1MHYyNTBoMTk4di0yNTB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJyIgaG9yaXotYWR2LXg9IjkwOCIgZD0iTTI2NSAxMzlxNzggNzggMTg4LjUgNzh0MTg4LjUgLTc4cTEgMCAxIC0xbC01NSAtNTVxLTEgMCAtMSAxcS01NSA1NSAtMTMzIDU1dC0xMzMgLTU1ek0xNDAgMjY0cTg1IDg1IDE5OS41IDExNS41dDIyOC41IDB0MTk5IC0xMTUuNWwxIC0xbC01NiAtNTZxMCAxIC0xIDFxLTEwNiAxMDYgLTI1Ny41IDEwNi41dC0yNTcuNSAtMTA1LjV6TTg5MyAzOTJxMCAtMiAyIC0ybC01NiAtNTZsLTIgMnEtMTA0IDEwNCAtMjQ0IDE0MXQtMjc5LjUgMCB0LTI0My41IC0xNDFxLTEgMCAtMSAtMWwtNTYgNTZsMSAxcTEyMCAxMTkgMjgwIDE2MS41dDMxOS41IDB0Mjc5LjUgLTE2MS41ek0zOTIgMTNxMjYgMjUgNjMgMjV0NjMgLTI1bC02MyAtNjN6IiAvPgo8Z2x5cGggdW5pY29kZT0iKCIgaG9yaXotYWR2LXg9IjY3MSIgZD0iTTU1MCAzNTloNzd2LTQzN2gtNTgydjQzN2g3NXYxMjhxMCA4NyA2MiAxNDl0MTQ5IDYyaDRoNHE4OCAwIDE0OS41IC02MnQ2MS41IC0xNDl2LTEyOHpNNDAyIDJsLTMyIDE0MXEzMiAyMCAzMiA1N3EwIDI4IC0xOSA0N3QtNDcgMTlxLTI3IDAgLTQ2LjUgLTE5dC0xOS41IC00N3EwIC0zOCAzMyAtNTZsLTMzIC0xNDJoMTMyek00NDUgMzU5djEyOHEwIDQzIC0zMSA3NHQtNzUgMzFoLTNoLTVxLTQzIDAgLTc0IC0zMXQtMzEgLTc0di0xMjggaDIxOXoiIC8+CjxnbHlwaCB1bmljb2RlPSIpIiBob3Jpei1hZHYteD0iODg5IiBkPSJNNjQ1IDY5OHE4OCAwIDE1MCAtNjEuNXQ2MiAtMTQ5LjV2LTEyOGgtMTA2djI5bDM2IDM0djEzaC0zNnY1MnEwIDQ0IC0zMSA3NC41dC03NSAzMC41aC0yaC01cS00NCAwIC03NSAtMzAuNXQtMzEgLTc0LjV2LTEyOGg3N3YtNDM4aC01ODR2NDM4aDQwMXYxMjhxMCA4OCA2MiAxNDkuNXQxNTAgNjEuNWgzaDR6TTM4MiAwbC0zMyAxNDJxMzMgMjAgMzMgNTdxMCAyOCAtMTkuNSA0Ny41dC00Ni41IDE5LjVxLTI4IDAgLTQ3LjUgLTE5LjUgdC0xOS41IC00Ny41cTAgLTM3IDMzIC01N2wtMzMgLTE0MmgxMzN6IiAvPgo8Z2x5cGggdW5pY29kZT0iKiIgaG9yaXotYWR2LXg9Ijc3NyIgZD0iTTczNyA0OTBsLTE5NSAtMTk1bDE5NSAtMTk2bC0xNTQgLTE1M2wtMTk1IDE5NWwtMTk1IC0xOTVsLTE1NCAxNTNsMTk1IDE5NmwtMTk1IDE5NWwxNTQgMTU0bDE5NSAtMTk1bDE5NSAxOTV6IiAvPgo8Z2x5cGggdW5pY29kZT0iKyIgZD0iTTQ2MCA3MDJxMTc0IDAgMjk3IC0xMjN0MTIzIC0yOTd0LTEyMyAtMjk3dC0yOTcgLTEyM3QtMjk3IDEyM3QtMTIzIDI5N3QxMjMgMjk3dDI5NyAxMjN6TTcwOSAyNjJ2NDFxMCAxNSAtMTAuNSAyNS41dC0yNS41IDEwLjVoLTEyMXEtMTUgMCAtMjUuNSAxMXQtMTAuNSAyNnYxMjFxMCAxNSAtMTEgMjUuNXQtMjYgMTAuNWgtNDFxLTE1IDAgLTI1LjUgLTEwLjV0LTEwLjUgLTI1LjV2LTEyMXEwIC0xNSAtMTEgLTI2dC0yNiAtMTFoLTEyMCBxLTE2IDAgLTI2LjUgLTEwLjV0LTEwLjUgLTI1LjV2LTQxcTAgLTE1IDEwLjUgLTI2dDI2LjUgLTExaDEyMHExNSAwIDI2IC0xMC41dDExIC0yNS41di0xMjFxMCAtMTUgMTAuNSAtMjUuNXQyNS41IC0xMC41aDQxcTE1IDAgMjYgMTAuNXQxMSAyNS41djEyMXEwIDE1IDEwLjUgMjUuNXQyNS41IDEwLjVoMTIxcTE1IDAgMjUuNSAxMXQxMC41IDI2eiIgLz4KPGdseXBoIHVuaWNvZGU9IiwiIGhvcml6LWFkdi14PSI5MTUiIGQ9Ik00NTggNzAxcTE3MyAwIDI5NSAtMTIyLjV0MTIyIC0yOTUuNXEwIC0xMDQgLTQ2IC0xOTFxLTU5IC0xMTUgLTE3MiAtMTc2cS05NCAtNTEgLTE5OSAtNTFxLTEwMSAwIC0xOTQgNDhxLTExNCA2MCAtMTc1IDE3M3EtNDkgOTMgLTQ5IDE5N3EwIDE3MyAxMjIuNSAyOTUuNXQyOTUuNSAxMjIuNXpNNzYwIDIwM3ExMSA0MSAxMSA4MHEwIDEzMCAtOTIgMjIydC0yMjEgOTJxLTEzMCAwIC0yMjIgLTkydC05MiAtMjIycTAgLTM5IDEyIC04NSBxMyAtOSA5IC0yNXEyMSA2IDQ1IDZxNjUgMCAxMTEuNSAtNDZ0NDYuNSAtMTExcTAgLTE3IC01IC0zN3E0IC0yIDEyIC00cTQyIC0xMSA4MyAtMTFxNDUgMCA4NyAxMnEyIDAgNS41IDJ0NS41IDJxLTUgMjIgLTUgNDBxMCA2NCA0Ni41IDExMC41dDExMC41IDQ2LjVxMjMgMCA0NCAtNnE1IDE1IDggMjZ6TTQ5OCAzMzNxMjUgLTE5IDI1IC01MHEwIC0xNCAtNSAtMjRxLTE2IC0zOSAtNTggLTM5cS0xMSAwIC0yNCA1cS0zOSAxNiAtMzkgNTggcTAgMSAwLjUgNHQwLjUgNWwtNTYgMjQ1bDIxIDl6TTQ3OCA1NjV2LTk1aC0zOXY5NWgzOXpNNjMyIDQ5MGwyNyAtMjdsLTY4IC02OGwtMjcgMjh6TTYyOSAzMDB2MzhoOTZ2LTM4aC05NnpNMTkyIDMwMHYzOGg5NXYtMzhoLTk1ek0yNDQgNDYzbDI4IDI3bDY3IC02N2wtMjcgLTI4eiIgLz4KPGdseXBoIHVuaWNvZGU9Ii0iIGhvcml6LWFkdi14PSI5MjEiIGQ9Ik00NjEgNjk4cTE3NCAwIDI5NyAtMTIzLjV0MTIzIC0yOTcuNXQtMTIzIC0yOTcuNXQtMjk3IC0xMjMuNXEtMTc1IDAgLTI5OCAxMjMuNXQtMTIzIDI5Ny41dDEyMyAyOTcuNXQyOTggMTIzLjV6TTY5NCAyNTh2MzlxMCAxOSAtMTQgMzN0LTMzIDE0aC0zNzZxLTE5IDAgLTMzIC0xNHQtMTQgLTMzdi0zOXEwIC0yMCAxNCAtMzMuNXQzMyAtMTMuNWgzNzZxMTkgMCAzMyAxMy41dDE0IDMzLjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iLiIgaG9yaXotYWR2LXg9Ijk0NSIgZD0iTTE0NyAzOTJxMzcgMCA2NCAtMjd0MjcgLTY0cTAgLTM4IC0yNi41IC02NXQtNjQuNSAtMjd0LTY1IDI3dC0yNyA2NXQyNyA2NC41dDY1IDI2LjV6TTQ3MiAzOTJxMzggMCA2NSAtMjYuNXQyNyAtNjQuNXQtMjcgLTY1dC02NSAtMjd0LTY0LjUgMjd0LTI2LjUgNjVxMCAzNyAyNi41IDY0dDY0LjUgMjd6TTc5OCAzOTJxMzggMCA2NSAtMjYuNXQyNyAtNjQuNXQtMjcgLTY1dC02NSAtMjd0LTY1IDI3dC0yNyA2NXEwIDM3IDI3IDY0dDY1IDI3eiAiIC8+CjxnbHlwaCB1bmljb2RlPSIvIiBob3Jpei1hZHYteD0iOTEyIiBkPSJNNjkzIDUzN2gxODF2LTEyN3YtMzAxaC0xODF2LTUzbC0xMzYgLTEzNmgtMzM2djE4OWgtMTgxdjMwMXYxMjdoMTgxdjE2M2g0NzJ2LTE2M3pNODE2IDQ4MGgtMTA1di01M2gxMDV2NTN6TTI3NSA2NDZ2LTEwOWgzNjR2MTA5aC0zNjR6TTUwMiAtMjZ2MTM2aDEzN3YxMzF2NTVoNTR2LTEyOWg2N3YxOTdoLTYwNHYtMTk3aDY1djExMXYxOGg1NHYtNTV2LTI2N2gyMjd6IiAvPgo8Z2x5cGggdW5pY29kZT0iMCIgaG9yaXotYWR2LXg9Ijg4OSIgZD0iTTY0MyAxNjFsMzkgLTQwbDI4IC0yN3EtNDcgLTYwIC0xMTYuNSAtOTQuNXQtMTQ4LjUgLTM0LjVxLTE0MCAwIC0yMzguNSA5OHQtOTkuNSAyMzhoLTExaC0yaC02N2wxMjYgMTI2bDEyNyAtMTI2aC01MWgtMjhxMCAtMTAwIDcxLjUgLTE3MXQxNzIuNSAtNzFxNjAgMCAxMTIuNSAyNy41dDg1LjUgNzQuNXpNODEwIDMwMWg1MmwtMTI3IC0xMjZsLTEyNiAxMjZoNTBoMzB2MnEwIDEwMSAtNzEuNSAxNzIuNXQtMTcyLjUgNzEuNSBxLTYxIDAgLTExMy41IC0yOC41dC04Ni41IC03Ni41bC0zOSAzOWwtMjggMjhxNDcgNjEgMTE2LjUgOTZ0MTUwLjUgMzVxMTM5IDAgMjM4IC05OXQ5OSAtMjM4di0yaDI4eiIgLz4KPGdseXBoIHVuaWNvZGU9IjEiIGhvcml6LWFkdi14PSI3NDMiIGQ9Ik02ODggMjM1aDI5di0zMHEwIC0xNDMgLTEwMC41IC0yNDMuNXQtMjQzLjUgLTEwMC41dC0yNDQgMTAxdC0xMDEgMjQzcTAgMTQzIDEwMSAyNDR0MjQ0IDEwMXExNiAwIDI1IC0xdjc5djcxbDQ5IC01MGwxNTcgLTE1N2wyMSAtMjFsLTIxIC0yMGwtMTU3IC0xNTdsLTQ5IC01MHY3MHY4OHEtMTggMiAtMjUgMnEtODMgMCAtMTQxIC01OHQtNTggLTE0MXEwIC04MiA1OC41IC0xNDB0MTQwLjUgLTU4dDE0MCA1OHQ1OCAxNDB2MzBoMzBoODd6ICIgLz4KPGdseXBoIHVuaWNvZGU9IjIiIGhvcml6LWFkdi14PSI5MTkiIGQ9Ik00NTkgNzAxcTE3NCAwIDI5NyAtMTIzdDEyMyAtMjk3dC0xMjMgLTI5N3QtMjk3IC0xMjNxLTE3MyAwIC0yOTYgMTIzdC0xMjMgMjk3dDEyMyAyOTd0Mjk2IDEyM3pNNzI4IDM5MnE2IDYgNiAxNXQtNiAxNmwtNTUgNTRxLTYgNiAtMTUgNnQtMTYgLTZsLTI0MyAtMjQ0cS0xNSAtMTYgLTMxIDBsLTg4IDg4cS0xNiAxNiAtMzEgMGwtNTUgLTU0cS02IC03IC02IC0xNnQ2IC0xNWwxMzkgLTE0MHExNSAtMTUgMzcgLTE1aDI2cTIwIDAgMzcgMTV6ICIgLz4KPGdseXBoIHVuaWNvZGU9IjMiIGhvcml6LWFkdi14PSI4NjgiIGQ9Ik0yMiAyMzlxLTEwIDEwIC0xMCAyNHQxMCAyNGw4MyA4M3ExMCAxMCAyMy41IDEwdDIzLjUgLTEwbDEzNiAtMTM1cTEwIC0xMCAyMy41IC0xMHQyMy41IDEwbDM3MSAzNzJxMTAgMTAgMjMuNSAxMHQyMy41IC0xMGw4MyAtODJxMTAgLTEwIDEwIC0yMy41dC0xMCAtMjMuNWwtNDUwIC00NTFxLTI0IC0yNCAtNTcgLTI0aC0zOXEtMzIgMCAtNTYgMjR6IiAvPgo8Z2x5cGggdW5pY29kZT0iNCIgaG9yaXotYWR2LXg9Ijc2MiIgZD0iTTU5IDcwMGw3MDIgLTM1MWwtNzAyIC0zNTB2NzAxeiIgLz4KPGdseXBoIHVuaWNvZGU9IjUiIGhvcml6LWFkdi14PSI4MTYiIGQ9Ik01OSAxdjY5OGgyNjJ2LTY5OGgtMjYyek00OTUgNjk5aDI2MnYtNjk4aC0yNjJ2Njk4eiIgLz4KPGdseXBoIHVuaWNvZGU9IjYiIGhvcml6LWFkdi14PSI4MTciIGQ9Ik03NTggMmgtNjk5djY5OGg2OTl2LTY5OHoiIC8+CjxnbHlwaCB1bmljb2RlPSI3IiBob3Jpei1hZHYteD0iOTIyIiBkPSJNNDIzIDQxN3YxODJsNDg1IC0yNDNsLTQ4NSAtMjQydjE4MWwtMzY0IC0xODF2NDg1eiIgLz4KPGdseXBoIHVuaWNvZGU9IjgiIGhvcml6LWFkdi14PSI5MjIiIGQ9Ik01MDAgMjk1di0xODJsLTQ4NiAyNDNsNDg2IDI0MnYtMTgybDM2MyAxODJ2LTQ4NXoiIC8+CjxnbHlwaCB1bmljb2RlPSI5IiBkPSJNNDYwIDcwMHExNzQgMCAyOTcgLTEyM3QxMjMgLTI5N3QtMTIzIC0yOTd0LTI5NyAtMTIzdC0yOTcgMTIzdC0xMjMgMjk3dDEyMyAyOTd0Mjk3IDEyM3pNMjk4IDY0bDQzMSAyMTZsLTQzMSAyMTZ2LTQzMnoiIC8+CjxnbHlwaCB1bmljb2RlPSI6IiBob3Jpei1hZHYteD0iODAxIiBkPSJNNjcxIDEwMGwxMDUgLTEwMnEwIC0xNiAtMTIgLTI4LjV0LTI5IC0xMi41aC0yNDJxMSAtNCAxIC0xMnEwIC0zOSAtMjcuNSAtNjYuNXQtNjYuNSAtMjcuNXQtNjYuNSAyNy41dC0yNy41IDY2LjVxMCAyIDAuNSA2dDAuNSA2aC0yNDFxLTE2IDAgLTI4LjUgMTIuNXQtMTIuNSAyOC41bDEwNSAxMDJxLTEgOCAtMSAyNXYyMDhxMCA4OCA1MC41IDE1OHQxMzAuNSA5OHEtNCAxMSAtNCAyNnEwIDM5IDI3LjUgNjYuNXQ2Ni41IDI3LjUgdDY2LjUgLTI3LjV0MjcuNSAtNjYuNXEwIC0xNCAtMyAtMjZxODAgLTI4IDEzMC41IC05OC41dDUwLjUgLTE1Ny41di0yMDhxMCAtMTcgLTEgLTI1ek0zNDggNjE1cTAgLTUgMiAtMTVxMjggNSA1MCA1cTIzIDAgNTAgLTVxMyA4IDMgMTVxMCAyMiAtMTUuNSAzN3QtMzcuNSAxNXQtMzcgLTE1dC0xNSAtMzd6IiAvPgo8Z2x5cGggdW5pY29kZT0iOyIgaG9yaXotYWR2LXg9Ijg4NyIgZD0iTTI5OSA0MThsLTQyIC00NHEtNCAtNSAtMTEgLTEyLjVsLTEyLjUgLTEzLjVsLTEwLjUgLTExcS0xOCAxNiAtMjcgMjNxLTQ5IDQwIC04MSA0MGgtMTAxdjExMmgxMDFxNTkgLTEgMTE4IC00MXEzMyAtMjEgNjYgLTUzek0zOTkgMTU2bDQ0IDQ3bDMyIDM0cTE2IC0xNCAyNiAtMjJxNTIgLTQyIDg0IC00MGg4NnY5NGwxNzUgLTE0OGwtMTc1IC0xNDZ2ODhoLTg2cS01NiAwIC0xMjAgNDBxLTI3IDE3IC02NiA1M3pNNTgyIDQwMCBxLTIzIDAgLTU2IC0yMnEtMzUgLTIzIC03OCAtNjhxLTE5IC0xOSAtNTQuNSAtNTcuNWwtNjYuNSAtNjkuNXQtNjAgLTU1cS04MCAtNjQgLTE1NCAtNjVoLTk5djExMmg5OXEyNiAwIDU5IDIycTI5IDE4IDc5IDY4cTUgNSA3MyA3Ny41dDEwNyAxMDQuNXE4MSA2NCAxNTIgNjVoODh2OTJsMTc1IC0xNDdsLTE3NSAtMTQ3djkwaC04OGgtMXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3gzYzsiIGhvcml6LWFkdi14PSIzOTUiIGQ9Ik0xMTUgNDEwbDIyMiAyMjN2LTY2OGwtMjIyIDIyMmgtMTEydjIyM2gxMTJ6IiAvPgo8Z2x5cGggdW5pY29kZT0iPSIgaG9yaXotYWR2LXg9Ijk0NyIgZD0iTTg5NiAzNzl2LTE3NmwtNjMgLTI1di0xMDhoLTc3M3Y0NDJoNzczdi0xMDl6TTc2MCAxNDR2Mjk0aC02MjZ2LTI5NGg2MjZ6TTM3MyAzOTBsMjIyIC0xOThoLTQxM3YxOThoMTkxeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeDNlOyIgaG9yaXotYWR2LXg9Ijg4OSIgZD0iTTEyNiA0MDhsMjIyIDIyM3YtNjY4bC0yMjIgMjIyaC0xMTJ2MjIzaDExMnpNNDM0IDQzOHE3NSAtNTAgNzUgLTE0MHQtNzUgLTEzOWwtMzQgNjdxMzUgMjggMzUgNzJ0LTM1IDcydjJ6TTY4MCAyOThxMCAtOTIgLTQ2IC0xNjguNXQtMTIzIC0xMjAuNWwtMzQgNjZxNTkgMzQgOTQgOTMuNXQzNSAxMjkuNXQtMzUgMTI5LjV0LTk0IDkzLjV2MmwzMyA2NXE3NyAtNDQgMTIzLjUgLTEyMS41dDQ2LjUgLTE2OC41ek01ODcgNzM4IHExMTggLTY2IDE4OC41IC0xODN0NzAuNSAtMjU3dC03MC41IC0yNTd0LTE4OC41IC0xODJsLTMzIDY2cTk5IDU2IDE1OC41IDE1NS41dDU5LjUgMjE3LjV0LTU5LjUgMjE3LjV0LTE1OS41IDE1NS41eiIgLz4KPGdseXBoIHVuaWNvZGU9Ij8iIGhvcml6LWFkdi14PSI5MjIiIGQ9Ik00NjEgNzAycTE3NSAwIDI5OCAtMTIzLjV0MTIzIC0yOTcuNXQtMTIzIC0yOTcuNXQtMjk4IC0xMjMuNXEtMTc0IDAgLTI5Ny41IDEyMy41dC0xMjMuNSAyOTcuNXQxMjMuNSAyOTcuNXQyOTcuNSAxMjMuNXpNNDg5IDI5cTE5IDE4IDE5IDQ3dC0xOSA0N3EtMjAgMTcgLTQ5IDE3cS0yOCAwIC00OCAtMTdxLTIwIC0yMCAtMTggLTQ3cS0yIC0yNyAxOCAtNDdxMTkgLTE3IDQ4IC0xN3EzMiAwIDQ5IDE3ek02MDIgMzUxcTEwIDI0IDEwIDYyIHEwIDU4IC00MSA5M3EtMzggMzQgLTEwOCAzNHEtNDkgMCAtODUgLTEycS0zMyAtMTEgLTYzIC0zMWwtOSAtNmw0NiAtODdsMTAgOHEyIDEgMTkgMTFxNyA0IDIzIDEwcTEwIDQgMjMgNnE3IDIgMjEgMnEzMCAwIDM4IC0xMHExMSAtMTEgMTEgLTMxcTAgLTEzIC03IC0yNXEtMTIgLTE2IC0yMSAtMjRxLTQgLTQgLTguNSAtOGwtMTAgLTl0LTkuNSAtOHEtMTcgLTE2IC0zMCAtMzRxLTEyIC0yMCAtMjAgLTQ2cS01IC0yMiAtNSAtNDEgcTAgLTQgMC41IC0xMnQwLjUgLTEybDEgLTExaDExaDg4djEycTAgMjYgOCA0MnE5IDE2IDIxIDMwcTE0IDE0IDI5IDI1dDMyIDMwcTE0IDE3IDI1IDQyeiIgLz4KPGdseXBoIHVuaWNvZGU9IkAiIGhvcml6LWFkdi14PSI1MDgiIGQ9Ik0yNTggNzAzcTkyIDAgMTU3LjUgLTY2dDY1LjUgLTE1N3EwIC0xMDcgLTIwMyAtNTQ2bC0yNCAtNTBsLTYzIDEzNXQtMTAxIDI0NC41dC02MyAyMTYuNXEwIDkyIDY1LjUgMTU3LjV0MTU3LjUgNjUuNWg0aDR6TTI1NCAzOTdxNDIgMCA3MiAzMHQzMCA3M3EwIDQyIC0zMCA3MnQtNzIgMzBxLTQzIDAgLTczIC0zMHQtMzAgLTcycTAgLTQzIDMwIC03M3Q3MyAtMzB6IiAvPgo8Z2x5cGggdW5pY29kZT0iQSIgaG9yaXotYWR2LXg9Ijg5MyIgZD0iTTMxNSAyOTlsNzAgLTcwcS0zOCAtMzIgLTg4LjUgLTMwdC04Ni41IDM4bC0xNDQgMTQ0cS0zOCAzNyAtMzggOTF0MzggOTFsOTkgOTlxMzggMzggOTEuNSAzOHQ5MS41IC0zOGwxNDQgLTE0NHEzNiAtMzYgMzcuNSAtODYuNXQtMzAuNSAtODguNWwtNzAgNjlxMTAgMjAgLTYgMzhsLTE0NCAxNDRxLTkgOSAtMjIuNSA5dC0yMi41IC05bC05OSAtOTlxLTEwIC0xMCAtMTAgLTIzdDEwIC0yM2wxNDQgLTE0NHExNiAtMTYgMzYgLTZ6TTcyOCAtOTkgcS0zOCAtMzcgLTkxIC0zN3QtOTEgMzdsLTE0NSAxNDVxLTM1IDM1IC0zNyA4NS41dDMwIDg4LjVsNjkgLTcwcS05IC0yMCA3IC0zNmwxNDQgLTE0NHE5IC0xMCAyMi41IC0xMHQyMi41IDEwbDk5IDk5cTEwIDkgMTAgMjIuNXQtMTAgMjIuNWwtMTQ0IDE0NXEtMTYgMTYgLTM3IDVsLTY5IDcwcTM4IDMyIDg4LjUgMzAuNXQ4Ni41IC0zNy41bDE0NCAtMTQ0cTM3IC0zOCAzNyAtOTEuNXQtMzcgLTkxLjV6TTI2MyA0NjVxMTQgMTQgMzQgMTQgdDM0IC0xNGwyOTUgLTI5NXExNCAtMTQgMTQgLTM0dC0xNCAtMzR0LTM0IC0xNHQtMzQgMTRsLTI5NSAyOTRxLTE0IDE0IC0xNCAzNC41dDE0IDM0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iQiIgaG9yaXotYWR2LXg9Ijg4MSIgZD0iTTczNCAzMTFxLTE0IC0yNyAtNDIgLTUwcS0xMiAtMzAgLTMxLjUgLTU4dC01NC41IC02MHQtOTIuNSAtNTEuNXQtMTI5LjUgLTE5LjVxLTc3IDAgLTE0My41IDIxdC0xMDUuNSA1MXQtNjcgNjB0LTM5IDUxbC0xMSAyMXE1IC0zIDE0LjUgLTYuNXQzOC41IC0xMS41dDU4IC0xMnQ3MCAtMC41dDc4IDE3LjVxLTY0IDI3IC05NiA5MXEtMjEgNDMgLTggNTRxNyA3IDI1IC0xMHE1MyAtNTAgMjEyIC00MXE3IDggMjEgMjZ2NXEwIDY3IDQ3IDExNCB0MTE0IDQ3cTY0IDAgMTEwIC00My41dDUxIC0xMDYuNWwxMDIgLTQ5ek02MjYgNDY5cS0xOSAwIC0zMiAtMTMuNXQtMTMgLTMyLjV0MTMgLTMydDMyIC0xM3QzMi41IDEzdDEzLjUgMzJ0LTEzIDMyLjV0LTMzIDEzLjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iQyIgaG9yaXotYWR2LXg9IjkxMyIgZD0iTTc3MSAzMTdxNDYgLTE4IDc0IC01OS41dDI4IC05Mi41cTAgLTY4IC00OC41IC0xMTYuNXQtMTE2LjUgLTQ4LjVxLTIgMCAtNSAwLjV0LTQgMC41aC00OTRoLTFoLTJxLTY5IDEgLTExNy41IDUwdC00OC41IDExOXEwIDQ1IDIyLjUgODMuNXQ2MC41IDYwLjVxLTYgMTYgLTYgMzVxMCA0NyAzNCA4MXQ4MSAzNHEzOCAwIDcxIC0yNXEzMSA2NCA5MSAxMDN0MTMzIDM5cTEwMyAwIDE3NiAtNzIuNXQ3MyAtMTc2LjVxMCAtMTAgLTEgLTE1eiIgLz4KPGdseXBoIHVuaWNvZGU9IkQiIGhvcml6LWFkdi14PSI5MTciIGQ9Ik00NTkgNjk4cTE3MyAwIDI5NS41IC0xMjN0MTIyLjUgLTI5NnQtMTIyLjUgLTI5NS41dC0yOTUuNSAtMTIyLjV0LTI5NiAxMjIuNXQtMTIzIDI5NS41dDEyMyAyOTZ0Mjk2IDEyM3pNNTc0IDI1MnEtMTEgMTIgLTExIDI4dDExIDI4bDEwOSAxMDhxMTEgMTIgMTEgMjguNXQtMTEgMjcuNWwtMzEgMzFxLTEyIDExIC0yOC41IDExdC0yNy41IC0xMWwtMTA4IC0xMDlxLTEyIC0xMSAtMjguNSAtMTF0LTI3LjUgMTFsLTEwOSAxMDkgcS0xMSAxMSAtMjcuNSAxMXQtMjcuNSAtMTFsLTMxIC0zMXEtMTEgLTExIC0xMSAtMjcuNXQxMSAtMjguNWwxMDkgLTEwOHExMSAtMTIgMTEgLTI4dC0xMSAtMjhsLTEwOSAtMTA4cS0xMSAtMTIgLTExIC0yOC41dDExIC0yNy41bDMxIC0zMXExMSAtMTEgMjcuNSAtMTF0MjcuNSAxMWwxMDkgMTA5cTExIDExIDI3LjUgMTF0MjguNSAtMTFsMTA4IC0xMDlxMTEgLTExIDI3LjUgLTExdDI4LjUgMTFsMzEgMzFxMTEgMTEgMTEgMjcuNXQtMTEgMjguNXogIiAvPgo8Z2x5cGggdW5pY29kZT0iRSIgaG9yaXotYWR2LXg9Ijg5NSIgZD0iTTQ0OCA1MzFxNjMgMCAxMjkuNSAtMjMuNXQxMTUuNSAtNTd0ODkuNSAtNjd0NjEuNSAtNTcuNWwyMSAtMjN2LThsLTIyIC0yNC41dC01OS41IC01NC41dC05MiAtNjl0LTExNCAtNTQuNXQtMTMwLjUgLTI0LjV0LTEyOS41IDIzLjV0LTExNS41IDU3dC04OS41IDY3dC02MS41IDU2LjVsLTIxIDI0djlsMjIgMjQuNXQ1OS41IDU0LjV0OTIgNjguNXQxMTQgNTR0MTMwLjUgMjQuNXpNNDQ2IDE1OHE1OCAwIDk4LjUgNDAuNXQ0MC41IDk4LjUgcTAgNTcgLTQwLjUgOTcuNXQtOTguNSA0MC41cS01NyAwIC05Ny41IC00MC41dC00MC41IC05Ny41cTAgLTU4IDQwLjUgLTk4LjV0OTcuNSAtNDAuNXpNNDQ2IDM2MXEyNiAwIDQ1IC0xOXQxOSAtNDV0LTE5IC00NC41dC00NSAtMTguNXQtNDQuNSAxOC41dC0xOC41IDQ0LjV0MTguNSA0NXQ0NC41IDE5eiIgLz4KPGdseXBoIHVuaWNvZGU9IkYiIGhvcml6LWFkdi14PSI3MDQiIGQ9Ik0yMjQgNzAwaDQyMnYtODE4aC01OTN2NjQ2bDE3MSAxNzF2MXpNNTc4IC01MHY2ODJoLTI4NXYtMTcyaC0xNzJ2LTUxMGg0NTd6IiAvPgo8Z2x5cGggdW5pY29kZT0iRyIgZD0iTTQ2MCA2OThxMTc0IDAgMjk3IC0xMjN0MTIzIC0yOTd0LTEyMyAtMjk3dC0yOTcgLTEyM3QtMjk3IDEyM3QtMTIzIDI5N3QxMjMgMjk3dDI5NyAxMjN6TTczOCA0MDFsLTEgLTNxLTEgLTMgLTEgLTUuNXQyIC0yLjVxMCAtMiAzIC02dDMgLTh2LTExcTEgLTIgNSAtM3ExIC00IDYgLTV0NiAzcS0zIDAgLTIuNSA0LjV0LTAuNSA0LjVxMCAyIC0xIDNxLTIgMiAtMiAzaDdxMCAyIC0yIDV0LTIgNHEtMSAwIC0yLjUgLTF0LTIgLTF0LTAuNSAyIHQtNCA2bC0yIDdxMyAwIDYgMXEtMSAwIDQgMnEtMSAxIC0yIDRxLTIgNCAtNyAycS0yIDAgLTUgLTIuNXQtNSAtMi41ek03MzUgODFxNjMgOTAgNjMgMTk3cTAgMTkgLTEgMjhxLTkgMCAtMTMgMnEtNCAwIC0xNC41IDQuNXQtMTYuNSAyLjVxMCAxIC0xIDFxMiAzIC01IDExcS01IDQgLTcgMHEtMiAtMyA1IC0xMHEwIC0yIDIgLTZxMiAtMSAxIC0zdC0xIC0zcTQgMCA1IDdxMCAtMSAxIC0xcS0yIC0zIDEgLTZ2LTVxMTAgMCAxNCAxMCBxMSAwIDEgLTJ0MSAtM3EzIC0zIDIgLTV0MiAtMnEyIC0xIDIgMXYycTQgLTIgNCAtNnQtNCAtNnEwIC0xIC0xIC0zdC0xIC00cTAgLTYgLTQgLThsLTQgLTJxLTQgLTMgLTggLTUuNXQtNCAtMy41cS0xMiAwIC0xNSAtN3EtNyAwIC0xMSAtNHEtNiAwIC04LjUgNnQtNC41IDZsLTIgNXExIDAgLTEuNSA2bC01LjUgMTN0LTMgOWwtNSAxMHEtMiAxIC03IDEycS04IDQgLTEwIDEzcTEwIDAgMTAgNHEtMSAwIC0yIDFxLTIgMiAxIDJsMyA5IHEwIDEgMSA1LjV0MSA2LjVxLTIgMCAtOCAtMnEwIC0xIC0xLjUgLTAuNXQtMy41IDAuNWwtMyAxcTAgMSAtNi41IDB0LTguNSAycS0yIDIgLTQgMTRxLTEgMyAtOCAzcS0zIDEgLTMuNSAtMXQwLjUgLTVsMSAtNHEyIDAgLTIgLTdxLTEgLTEgLTEgLTJxLTQgMSAtNiA2dC00IDZxLTEgNCAtMyA0cTAgMTAgLTEgMTBsLTMgMXEtNCAyIC01IDNxLTIgMCAtNS41IDMuNXQtNi41IDUuNXQtNCAwbDMgLTZxMiAwIDUgLTQuNXQ3IC0zLjV2LTUgcTMgMSA0LjUgLTEuNXQyLjUgLTIuNXEwIC0xIC0zIDBxLTQgMiAtMyAtMXEyIC02IC00IC05cTAgMTIgLTMgMTJxLTIgMyAtNyA1dC02IDRxLTEgMCAtMy41IDMuNXQtNC41IDQuNXEtMiAtMiAtNSAtMnEtMSAtMiAtNC41IC0yLjV0LTcuNSAwLjVsLTMgMXEtNyAtMTggLTggLTIwcS0xIC0zIC0zIC01dC0zIC01cTAgLTEgLTcuNSAtMS41dC03LjUgLTEuNXEtMTEgNCAtMTEgMTN2NXQxIDl0MSA2bDIgLTJoMy41aDQuNXQzLjUgMXQxLjUgMiBxNCAwIDMgLTRxOSAtMyA5IDNxLTIgMCAtMiAycTMgNCAyIDd0LTQgNnQtMyA0bC00IDRxOSAtNiAxMSAtMXEwIDEgLTEgM3YxcTIgLTIgMy41IC0yLjV0Mi41IDEuNXEyIDEgMyAzdjZxMyAtNCA0LjUgMHQyLjUgNXEwIC0zIDMgMHEyIDIgMyAycTEgMiA1IDIuNXQ1IDMuNXEtMyAxIC0zIDEycTIgMCA0LjUgMS41dDMuNSAxLjV0MiAtMnEwIC02IDEgLTZxNCAyIDQgNXEtMiAwIC01IDEwcS0zIDAgLTUgLTJxLTMgMCAtNy41IDF0LTYuNSAxIHEtNyA3IC02IDdxLTIgNCAyIDVoMnEwIDIgMTEuNSA1dDEyLjUgOHEtNiAwIDggMTNxMTAgOCAxNCA4cTEgMCA5LjUgMmwxNC41IDMuNXQ4IC0wLjVxMjIgMCAyMiAtMnExIDAgMy41IC0xdDQgLTEuNXQzLjUgMC41cTMgMiAxMSAtMnQ4IC04cS0zIDAgLTEyIC0xdC0xNCAtMXYtMnEyIDAgNS41IC00LjV0Mi41IC02LjVxMyAwIDYgMnQ0IDJxMCAtMiAxIC0zcTMgLTIgNCAzbC0xIDRxMSAyIDQuNSAyLjV0NC41IDMuNXEtNDcgNTYgLTExNC41IDg4IHQtMTQzLjUgMzJxLTEzNCAwIC0yMzEgLTkxcTEgLTEgNSAybDIgMXEwIC02IDEgLThsMyAtN3E4IDAgOSAtMmgtNXExIC02IC0zIC00cS0zIDEgLTQgMXEwIDEgLTMgMnQtNSAwdDAgLTVxMSAwIDIgLTF0MyAtMnEyIDAgNi41IC0xdDYuNSAtMnEyIDAgNSAwLjV0NCAwLjVxMiAxIDMgMnQtMSAycTEgMiAtNCA0cTAgMSAxMSAxcTIgMiAxLjUgMy41dDAuNSAzLjV0NCAydDQgM3E0IC0yIDUgLTZxMSAwIDMgLTNxOSAtMTAgOSAtM3E2IC0xIDYgLTExIHE3IDEgNyAxMXEtMSAwIC0xIDNoNHEyIC0xIDIgMXExIDAgMSAtMmg4di0xMXEwIC0yIC0yIC0zdC0zIC0xbC0yIC0xcS0zIC00IC0xLjUgLTV0Ni41IC0zLjV0NiAtMy41bC04IDFxLTEgMCAtNC41IC0wLjV0LTYgLTF0LTQuNSAwLjVxNSAwIDcgMTFxLTggMiAtMTEgLTVxLTEgLTQgLTQgLTMuNXQtNCAtMS41bC0yIC0xcS0zIC0xIC01IC0xLjV0LTIgMC41cS03IC0yIC03IC0xN3ExMSAtOCAxMSAtMTJxNCAtMSA5LjUgLTJ0OC41IC0xIHExIC0zIDQgLTNxMCAtNCA5IC00cTAgNiA2IC00cTEgLTIgMSAtM3EtMSAwIDAgLTIuNXQzIC01LjVxLTIgMCAtMSAtMXEyIC0yIDUuNSAtMXQzLjUgM3EtMiAwIC0yIDZxLTYgNiAxIDhxMCAtNCA2IDFxMiAyIC0xIDNxMiA5IDAgMTJxLTEgMSAtMi41IDF0LTIuNSAycTQgMSAxIDE0aDVxMiAwIDUuNSAtMS41dDUuNSAtMXQzIDMuNXEzIC0yIDQuNSAtNXQ0LjUgMXEwIC0xIDQgLTUuNXQ1IC00LjVxMCAtMyAyIC0zbC0xIC0ycTcgMCA3IDEgcTYgMCA2IDhxMSAwIDIuNSAtM2wzIC02dDIuNSAtM2wyLjUgLTIuNWwzIC0zdDIuNSAtM3QxIC0yLjVxMiAtMiAyIC01cTEgMCAyIDJxMyAzIDMgLTFxMiAwIDQuNSAtMi41dDIuNSAtMy41cS0yIDAgLTEuNSAtMnQtMC41IC0ycTAgLTEgLTExIC0xcS0xIC01IC02IC02dC0xMSAwLjV0LTExIC0wLjVxLTQgLTIgLTkuNSAtOC41dC01LjUgLTEwLjVxMyAwIDcuNSAzLjV0Ni41IDQuNXEyIDAgMTAgNHEwIC0xIDEgLTF2LTFxLTYgMCAtMiAtNyBxMSAtMSAxIC0ycTMgLTUgOCAtNXEwIC0xIC0yLjUgLTF0LTIuNSAtMmwtNSAtM2gtNmwxIDFsMSAxaDN2NHEtMyAwIC02IC0xLjV0LTUgLTEuNXEtNCAtNCAtNiAtNHEtMiAtMTAgLTYgLTEybC0yIC0xbC00IC0ybC0yIC0ybC0yIC0ycS0xIC0yIC0yIC01cS0zIC03IC0zIC05cS0xIDAgLTMuNSAtNS41dC02LjUgLTUuNXEtMSAtMiAtNS41IC02dC00LjUgLTEwcTEgLTEgMS41IC00dDEuNSAtNi41dDEgLTQuNXEwIC04IC00IC04bC0yIDN0LTEgMyBxMCA0IC00IDEycTAgMiAtNC41IDEuNXQtNS41IC0wLjVxLTEgMyAtMTMgM3EwIC0xIDEgLTJ0MSAtM3EtNiAtMiAtNyAtMnEtMiAwIC00LjUgMi41dC01LjUgMS41cS0xNCAtMiAtMTQgLTE2cS0xIDAgLTEgLTguNXQxIC04LjVxMCAtMiAyIC02dDIgLTVxMiAwIDYgLTR0NSAtNHExIC00IDUgLTRsMiAxbDIgNHEtMyAxIC0xLjUgMy41dDMuNSAzLjVxMCAtMiA2IDJsNiAybDIgMnExIC0zIC0xIC00cS0yIDAgLTMgLTNsLTEgLTIgcS0xIC0yIC0yIC01dC0xIC01dDEgLTQuNXQwIC00LjVoMTN2M3EzIDAgMi41IC02LjV0MS41IC02LjVxMCAtMiAxIC02dDEgLTVxNSAtMyA0IC04cTEyIDAgMTIgM3E3IDAgNSAtN3E1IDAgNiAzdDEgNS41dDIgMi41cTAgMyAyIDFsNiAzbDMgMnEyIC0xIDIgLTJxNSAwIDkgNHEyIDAgNCAtNXQ2IC01cTEyIDAgMTMgMXEzIC0yIDMgLTNxMSAwIDIgLTFsMSAtMWgxbDQgLTRxMCAtMiAyLjUgLTN0Mi41IC0ybDEgLTFsMyAtMmw5IC0zcTEgMyA0IDAgcTEgLTEgMiAtMWwyIC0ycTEgLTEgNCAtN3EyIC0yIDQgLTExcS0xIDAgLTEgLThsNCAtMXEyIDAgMiAycTIgMCA1IC0ydDQgLTJxLTIgLTIgMSAtMy41dDMgMi41cTMgMCAzIC0xMXEyIDAgNC41IDEuNXQ0LjUgMS41cTYgMCA2IDFxOCAtMiAxMyAtOHE1IC01IDUuNSAtMTR0LTQuNSAtMTRsLTggLTEwcTAgLTEyIC0xIC0xMnEwIC0xNCAtMyAtMTRxMCAtMyAtMi41IC03dC0zLjUgLTZxLTEgLTEgLTYuNSAtNC41dC02LjUgLTUuNSBxLTEgMCAtNCAtMXQtNCAtMWwtMiAtM3EtMyAtMyAtMiAtM3EwIC0xIC0wLjUgLTcuNXQtMS41IC04LjVxLTQgLTIgLTMgLTRxLTEgMCAtMS41IC0xdC0zLjUgLTFxLTIgMCAtNSAtMi41dC0zIC01LjVxLTIgLTggLTYgLTExbC0zIC0ycS00IC0yIC00IC00di04cS02IDAgLTggLTRxLTQgMCAtMTEgLTRxMCAtNCAtMiAtNHEwIC00IC0zIC0zdC00IDBxMiAwIDIgLTZxMCAtMSAtNiAtOWwtMSAtMnEtMiAtMyAtMyAtM3EwIC0xIC0wLjUgLTQgdC0wLjUgLTV2LTNsMiAycTAgMSAyIC0xcS0xIC0yIC0zIC00dC0zIC01cS01IDAgLTUgLThxMCAtMiAxIC0ycTAgLTEgMiAtNWwtMjcgOXEwIDM3IDQgMzdxMCA5IDIgOXYxNHEtMSAyIDEuNSA2LjV0Mi41IDYuNXEzIDEgMy41IDEwdDAuNSAxN3QyIDhxMCA0IDEuNSAyMC41dC0wLjUgMjAuNWwtNyA4cS01IDAgLTkgNi41dC00IDEyLjVxLTMgOSAtMyAxMHExIDAgLTIgNC41dC02IDkuNWwtNCA1cS0zIDMgLTMgNC41dDIgNXQyIDYuNSBxLTQgMiAtMiAxMC41dDUgOC41cTAgMyAzIDRxMSAtMyAzIC0ycTMgMyAwIDV2MTNxMCAxMCAtNSAxMHEtMiAwIC00IC01cS0xIDEgLTUgMS41dC03IDJ0LTMgNC41cTIgNiAtOCAxMXExIDQgLTUuNSA4LjV0LTEwLjUgNC41cTAgMSAtMiAxLjV0LTIgMS41cS0yIDAgLTUgM3QtNiAzcS00IDAgLTEwIDIuNXQtOSAyLjVxLTEgMiAtNi41IDN0LTYuNSAzcS03IDAgLTcgMTNxMCAxOCAtOSAxOHEwIDMgLTQgNi41dC02IDMuNXEtMyA3IC01IDcgcTAgNCAtNiA5cS0zIDIgLTMgMHEtMSAtMiAyLjUgLTUuNXQzLjUgLTUuNXExIDAgOCAtMTNxNiAtMTAgMyAtMTFxLTQgLTEgLTEwIDhxLTIgNCAtMiA2cS0yIDEgLTQuNSA2LjV0LTIuNSA3LjVxLTEgMSAtMi41IDR0LTIuNSA2bC0xIDJxMCAxMCAtMTEgMTBsLTcgOXEwIDEwIC04IDEzcTAgMiAtMSA5dDAgMTBxMCAyMyAtMTAgMzFxLTMzIC02OCAtMzMgLTE0NHEwIC0xNDAgOTkuNSAtMjM5dDIzOS41IC05OXE4MiAwIDE1MyAzN3QxMTggMTAwIHEtNyAtMiAtOSA5cS0zIDE3IDIgMzJxNSAtMiA2IDBxLTQgMSAtMiA2cTEwIC03IDEwIDJsLTIgMnEwIDIgMSAzdDEuNSAwLjV0MC41IC0yLjVxMyAwIDMuNSA0LjV0MS41IDUuNXEwIC0xMSAzIC0xMnEyIC0yIC0wLjUgLTQuNXQtMi41IC0zLjVxLTIgLTEgLTIgLTZoLTNxMCAtMyAtMSAtOC41dC0xIC03LjVxLTIgMCAtMiAtMTZ6TTY2NiAzODNxMiAtMSAyIC00cTI1IDAgMjUgM3ExIC0yIDIgLTN0MiAycTEgMCA0LjUgLTN0Ny41IC0ybDcgNCBsLTIgMXEwIDYgLTUgOS41dC02IDQuNXEtMSAwIC0zLjUgMXQtNC41IDFxLTMgMiAtNiAtMXEtMyAtMiAtMyAwcS0xIDIgLTMgMnEwIDggLTkgN3EtMSAtMyAtMy41IC03dC0zLjUgLTcuNXQtMSAtNy41ek01MTggNDkxcTAgLTUgLTEgLTVxLTUgLTMgLTEwIC0zaC0xMXEtMiAwIC0xMCAycTAgMSAxIDJxMyA0IC0xIDRxNyAzIDggM3YtMXYtNHEwIC0xIDIgLTAuNXQ0LjUgMXQzLjUgMS41cTMgMCA2IDFxMSAxIDEuNSAwLjV0MC41IC0zLjV6IE01NTEgNDQ0cTAgMiAtMSA0dC0xIDRxMCAzIDMgMi41dDQgMy41cTMgLTEgMCAtM3YtNHEyIDAgNCAydDMgMnEtMiAtNyAtMSAtOHE1IC01IDQgLTZxNyAwIDUgLTExcTMgMCAzIDNxMiAtMSAyIC0yLjV0LTIgLTEuNXEtMyAtNSAtMTUgLTVxMCA2IC00IDNxLTMgLTEgLTIgNHExIDIgMSAzcS0yIDEgNSAycS0xIDggLTggOHpNNTM2IDQyOHEtMiAyIDAgOHEtMyAxIDEgMmw1IDJxLTQgMCAtMiA0aDJxMSAtMiAyIC0xaDRxMSAtMSAwIC0zIHEtMyAtMTIgLTEyIC0xMnpNNTUxIDQyMnExIDAgMSAxaDNxMCAtMiAtMS41IC0ydC0yLjUgMXpNMzkyIDQwMXExIDEgNCAzcTAgLTMgLTQgLTN6TTU5OCAzODhxMiAwIC0xIC02cS0xIDIgLTIgNXEzIDAgMyAxek01OTggMzgwcTIgMCAxLjUgLTQuNXQtNS41IC0zLjVxMCA3IDIgN2wxIC0ycTEgMSAxIDN6TTYyMCAzNjVxMCAtNCAtMSAtNC41dC00LjUgMS41dC01LjUgMmg1cTEgLTEgNiAxek03MjggMjQwcTYgMCA2IDFxMTAgMCAxNiAzIHEwIC00IC0yLjUgLTkuNXQtMS41IC05LjVxLTMgMCAtMyAtNWwtMiAtMnEtMiAtMyAtNCAtNHEwIC0yIC05IC0xMXEtMSAtMiAtNS41IC02LjV0LTUuNSAtNi41cS0xNCAtMTQgLTEwIC0xNHEwIC0yNCAyIC0yNGwxIC02cTEgLTYgMSAtMTB0LTEgLTVxMCAtMyAtMiAtNy41dC0yIC02LjVsLTIgLTFsLTMgLTNxLTIgMCAtNCAtMy41dC0zIC0zLjVxMCAtNCAtMSAtMTF0LTEgLTExbC0xIC00bC0yIC02bC0xIC00cS0xNSAtOCAtMTUgLTE3IHEtNyAtMTAgLTggLTEycS0xOSAwIC0xOSAtNGgtMTVxMCAyIC0xIDZ0LTEgN3EtMSAwIC0yIDMuNXQtMiAzLjVxMCAxIC0yLjUgNi41dC00LjUgMTF0LTEgNS41cTAgOSAtMyA5cTAgNCAtMi41IDExdC0yLjUgMTBxLTEgMCAtMiA0dC0xLjUgNy41dDAuNSA0LjVxMCA0IDQgMjJxMSA5IC0zIDIzcS00IDAgLTQgNnEtNiA0IC02IDE1cTYgNiAzIDIwcS0zIDEgLTE0IDFxLTEgMyAtNy41IDR0LTE2LjUgMGwtMTAgLTFxLTEgLTIgLTQuNSAtMS41IHQtOC41IDIuNXQtNSAzcS0zIDAgLTcuNSA0LjV0LTQuNSA4LjVxLTQgMSAtOCA5LjV0LTQgMTIuNXEtNCA0IDAgOXEwIDMgLTMgMTJxMCAyIDEuNSA0dDEuNSA0cTAgMTEgNCAxOXEwIDEgMiA0dDIgNHEyIDMgMyAzcTIgMSAzIDNxMiAxIDUgNXEyIDMgMyA0cTMgMSAwIDRxNCAwIDQgMTBxMiAzIDYgM2wxIDFxNCA1IDUgNXEyIDMgNiAzcTEgLTEgMi41IC0xdDQuNSAxbDMgMXE1IDcgMTQgN3ExIDIgNSAxLjV0MTAuNSAtMS41dDcuNSAtMXYyIHEzIC0xIDcgLTEwdDQgLTEyaDhxMCAtNCAxMCAtNHExNiAwIDE2IDZxNiAwIDYgLTZoNnQ4LjUgLTAuNXQ3LjUgLTJ0MiAtMi41cTIgMCA0IC0zdDMgLTNxMCAtMyAyLjUgLTguNXQ0LjUgLTUuNXEwIC04IDUgLTExcTYgLTE0IDEyIC0xOHEtMSAtMiAxLjUgLTZ0Mi41IC01cTEgLTYgMyAtN3EwIC00IDUgLTExLjV0OCAtNy41cTAgLTEgLTEgLTJ0MiAtMnpNMzEyIDI5NnEwIC0zIDMgMHEwIC00IC00IC0ycS0yIDAgLTEgM3ExIDAgMiAtMXogTTMyOCAyOTdxNCAtMSA3LjUgLTMuNXQ1LjUgLTIuNXEzIC0zIDMuNSAtNHQtMS41IC0ycS04IC0yIC0xMiA1cS01IDAgLTEwIDVxNiAwIDcgMnpNMzYyIDI4M2wyIC0xcTIgLTIgMyAtNGwxIC0xaC0xM3EtMSAtMSAtNC41IC0xdC00LjUgMmg3bC0yIDRxMSAwIDUgLTF0NiAtMXYzek0zMzEgMjc4cTQgMCA0IC0zcS01IDAgLTQgM3pNMzM2IDI3NWwyIDNxMSAwIDEgLTJxLTEgLTEgLTMgLTF6TTM3NiAyNzhxMyAwIDMgLTFxLTQgMiAtMyAxeiBNMzczIDI3OGwyIC0xcS0xIDAgLTEgLTAuNXQtMSAtMC41djJ6TTM1NyAyNTBxMSAxIDEgMmwxIC0xcTAgLTEgLTIgLTF6TTc0MCAxMzRxMCAyIDIgM3oiIC8+CjxnbHlwaCB1bmljb2RlPSJIIiBob3Jpei1hZHYteD0iODY1IiBkPSJNNjg2IDI3OXYtMzc4aC0xNzd2MjM1aC0xNTJ2LTIzNWgtMTgzdjM3OGgtMTUzbDQxMiA0MTFsNDExIC00MTFoLTE1OHoiIC8+CjxnbHlwaCB1bmljb2RlPSJJIiBob3Jpei1hZHYteD0iOTMyIiBkPSJNODg0IDIzNHYtMzE0aC04MzZ2MzE0bDE1NyA0MThoNTIyek01ODIgMjM0aDE5OGwtMTA1IDMyMmwtNDE4IDFsLTEwNCAtMzIzaDE5N2w0OSAtOTZoMTMweiIgLz4KPGdseXBoIHVuaWNvZGU9IkoiIGhvcml6LWFkdi14PSI4NjIiIGQ9Ik04NDggNTM0bC0xMjIgLTEyMmw4MiAtODJsLTM3MCAtNDJsNDMgMzY5bDgxIC04MWwxMjIgMTIyek0xMzYgMTQ4bC04MiA4MmwzNjkgNDNsLTQzIC0zNzBsLTgxIDgybC0xMjIgLTEyMmwtMTYzIDE2M3pNMTgyIDM4OGwxOTcgLTY4bC0yMjEgMTh6TTM5MyA0MTd2LTg1bC0yOCA4MHpNNjgyIDE3NGwtMTk3IDY5bDIyMSAtMTl6TTQ3MSAxNDZ2ODVsMjggLTgxeiIgLz4KPGdseXBoIHVuaWNvZGU9IksiIGhvcml6LWFkdi14PSI4NjkiIGQ9Ik01MzAgMzUxbDMxOCAtMzE4di0xNjh2MGgtMTY4aC0xdjEyOWgtMTI4djEyOGgtMTI4bC02MSA2MXEtNDAgLTE0IC04MyAtMTRxLTEwOSAwIC0xODcgNzcuNXQtNzggMTg3LjV0NzggMTg3LjV0MTg3IDc3LjV0MTg3IC03Ny41dDc4IC0xODcuNXEwIC00MyAtMTQgLTgzek0yMjQgNDAycTM3IDAgNjMgMjZ0MjYgNjN0LTI2IDYzdC02MyAyNnQtNjMuNSAtMjZ0LTI2LjUgLTYzdDI2LjUgLTYzdDYzLjUgLTI2eiIgLz4KPGdseXBoIHVuaWNvZGU9IkwiIGQ9Ik00NjAgNzAxcTE3NCAwIDI5NyAtMTIzdDEyMyAtMjk3dC0xMjMgLTI5N3QtMjk3IC0xMjN0LTI5NyAxMjN0LTEyMyAyOTd0MTIzIDI5N3QyOTcgMTIzek00NjAgLTM0cTEzMCAwIDIyMi41IDkydDkyLjUgMjIzdC05Mi41IDIyM3QtMjIyLjUgOTJ0LTIyMi41IC05MnQtOTIuNSAtMjIzdDkyLjUgLTIyM3QyMjIuNSAtOTJ6TTQ2NCA1MjlxMTAzIDAgMTc2LjUgLTczLjV0NzMuNSAtMTc3LjV0LTczIC0xNzcuNXQtMTc3IC03My41IHQtMTc3LjUgNzMuNXQtNzMuNSAxNzcuNXQ3My41IDE3Ny41dDE3Ny41IDczLjV6TTM5NiAzNTlxMzMgMzMgMTAyIDcwbC0zMCA0MHEtNCAxIC0xMiAxcS02MSAwIC0xMTYuNSAtNTV0LTU1LjUgLTExNnEwIC02IDEgLTlsNDIgLTMycTM4IDcwIDY5IDEwMXpNNTQwIDE1NXExNiAwIDI4IDEydDEyIDI5dC0xMS41IDI5dC0yOC41IDEydC0yOSAtMTJ0LTEyIC0yOXQxMiAtMjl0MjkgLTEyeiIgLz4KPGdseXBoIHVuaWNvZGU9Ik0iIGhvcml6LWFkdi14PSI5NTIiIGQ9Ik04OTIgMzJsLTI3MyAyNjJsMjczIDIzNHEzIC04IDMgLTE1di00NjVxMCAtOCAtMyAtMTZ6TTQ3NiAyMzhsLTcyIDU4bC0zNiAzMGwtMjc1IDIzNXExMCAyIDE0IDJoNzM4cTQgMCAxNCAtMmwtMjc1IC0yMzVsLTM2IC0zMHpNODQ1IC0yaC03MzhxLTUgMCAtMTMgMmwyNzYgMjY1bDEwNiAtODdsMTA3IDg3bDI3NSAtMjY1cS04IC0yIC0xMyAtMnpNNjAgNTI4bDI3MyAtMjM0bC0yNzMgLTI2MnEtMyA4IC0zIDE2djQ2NXEwIDcgMyAxNXoiIC8+CjxnbHlwaCB1bmljb2RlPSJOIiBob3Jpei1hZHYteD0iOTQzIiBkPSJNODU3IDY3MHExNyAwIDIzIC02dDYgLTIzdi02NTVxMCAtMTcgLTYgLTIzdC0yMyAtNmgtMTA4aC01NDZoLTcxcS0yOCAwIC01My41IDI2LjV0LTI1LjUgNTIuNXY0ODFxMCAxNyA2IDIzdDIzIDZoOTJ2OTVxMCAxNyA2IDIzdDIzIDZoNjU0ek04MzcgN3Y2MTNoLTYxNHYtNzR2LTUwdi00NDVoLTQ5djQ0NWgtNzF2LTQ2MHEwIC03IDExIC0xOHQxOCAtMTFoNzFoNTQ2aDg4ek01MTEgNTU2di0yMjNoLTIyM3YyMjNoMjIzek03NjUgNTI1di0zNyBoLTE4NXYzN2gxODV6TTc2NSA0MTF2LTM3aC0xODV2MzdoMTg1ek03NjUgMjU5di0zN2gtNDc3djM3aDQ3N3pNNzY1IDE0NHYtMzdoLTQ3N3YzN2g0Nzd6IiAvPgo8Z2x5cGggdW5pY29kZT0iTyIgaG9yaXotYWR2LXg9IjkzMCIgZD0iTTg4MiA1MTB2LTUxMWgtNzB2NTExaDcwek02OTUgNTEwaDQ3di01MTFoLTU1NnY1MTFoNTJxNjggMTMzIDEyMiAxMzNoMjA3cTMyIDAgNjYuNSAtNDAuNXQ2MS41IC05Mi41ek01MTQgNTIycTEzIDAgMjIgOXQ5IDIydC05IDIxLjV0LTIyIDguNWgtMTA0cS0xMyAwIC0yMS41IC04LjV0LTguNSAtMjEuNXQ4LjUgLTIydDIxLjUgLTloMTA0ek00OCA1MTBoNjl2LTUxMWgtNjl2NTExeiIgLz4KPGdseXBoIHVuaWNvZGU9IlAiIGhvcml6LWFkdi14PSI5MDkiIGQ9Ik03MTkgNDk2aDE0M3YtNDk1aC02NTl2MWwtMTc3IDQ2MWw2MTUgMjM3ek02NjAgNDk2bC01MSAxMzNsLTM0NSAtMTMzaDM5NnpNOTcgNDMybDEwNiAtMjc3djMxOHpNMjU4IDU2aDU0OXYzODVoLTU0OXYtMzg1ek02OTkgMjkybDU4IC0xOTBoLTQzMmwxMDMgMTEybDY2IC00MmwxMjMgMTc3bDM4IC03MXpNMzc5IDI3NXEtMjIgMCAtMzcgMTV0LTE1IDM3dDE1IDM3dDM3IDE1dDM3IC0xNXQxNSAtMzd0LTE1IC0zN3QtMzcgLTE1eiIgLz4KPGdseXBoIHVuaWNvZGU9IlEiIGhvcml6LWFkdi14PSI4NDQiIGQ9Ik02ODEgNTIxcTYxIC01NCA5NS41IC0xMjkuNXQzNC41IC0xNjAuNXEwIC0xNjEgLTExNCAtMjc1LjV0LTI3NSAtMTE0LjV0LTI3NSAxMTQuNXQtMTE0IDI3NS41cTAgODUgMzUgMTYxdDk2IDEzMHEyMCAxNyA0Ni41IDE1LjV0NDMuNSAtMjEuNXExNyAtMTkgMTUuNSAtNDUuNXQtMjEuNSAtNDMuNXEtODggLTc4IC04OCAtMTk2cTAgLTEwOSA3Ni41IC0xODZ0MTg1LjUgLTc3dDE4NS41IDc3dDc3LjUgMTg2cTAgMTE3IC04OCAxOTUgcS0yMCAxOCAtMjEuNSA0NHQxNi41IDQ2cTE3IDE5IDQzLjUgMjAuNXQ0NS41IC0xNS41ek00MjMgMTY2cS0yNiAwIC00NC41IDE5dC0xOC41IDQ1djQwN3EwIDI2IDE4LjUgNDV0NDQuNSAxOXQ0NSAtMTl0MTkgLTQ1di00MDdxMCAtMjYgLTE5IC00NXQtNDUgLTE5eiIgLz4KPGdseXBoIHVuaWNvZGU9IlIiIGhvcml6LWFkdi14PSI5MDkiIGQ9Ik02NjggMTA1djg3bDEwNCA3MHYtMjYyaC03MzF2NTIzaDMyN3EtMiAtMSAtNi41IC0zdC02LjUgLTNxLTg3IC0zOSAtMTQxIC05OWgtNjl2LTMxM2g1MjN6TTg3NyA0MTdsLTMxMyAtMjExdjEzN3EtOTAgMCAtMTQxIC03cS00OSAtNiAtODkuNSAtMjF0LTYzLjUgLTMzLjV0LTM5IC0zNS41dC0yMiAtMjhsLTYgLTEycTAgNTQgMjAgMTAwdDUxLjUgNzUuNXQ3MC41IDUyLjV0NzcuNSAzNXQ3MCAyMHQ1MS41IDEwbDIwIDJ2MTI2eiIgLz4KPGdseXBoIHVuaWNvZGU9IlMiIGhvcml6LWFkdi14PSI4NTMiIGQ9Ik04MjYgMzg5cTEwIC0xMSA4IC0yNHEwIC0xMyAtMTAgLTI4cS0zIC00IC0xNiAtMTRsLTE4NCAtMTIxcS0yIC0xIC01LjUgLTd0LTIuNSAtMTB2LTRsODEgLTIzN3E0IC0xMSA0IC0yM3EwIC0xNSAtNyAtMjVxLTExIC0xNiAtMzAgLTE2aC0xcS0xNiAxIC0zNiAxNWwtMTkwIDE1NXEtMyAzIC0xMCAzdC05IC0zbC0xODEgLTE1NHEtMTggLTE0IC0zNiAtMTVxLTIxIC0yIC0zMSAxNXEtOCAxMSAtOCAyNnEwIDcgNCAyMWw3MiAyMzZ2NCBxMSA1IC0yIDExdC02IDdsLTE4NSAxMjJxLTEwIDcgLTE2IDE0cS0xMSAxMyAtMTEgMjhxMCAxNCA4IDI0cTkgOSAxNiAxMnExMiA1IDI3IDVoMjMwcTYgMCAxMSA0cTcgNSA3IDEwbDY3IDIzOXE0IDE0IDkgMjFxMTMgMTggMzMgMTlxMjAgLTEgMzMgLTE5cTMgLTQgMTAgLTIxbDY2IC0yMzlxMCAtNSA3IC0xMHE1IC00IDExIC00aDIzMHE5IDAgMjAgLTNxMTQgLTQgMjMgLTE0eiIgLz4KPGdseXBoIHVuaWNvZGU9IlQiIGhvcml6LWFkdi14PSI4OTkiIGQ9Ik04MTcgMTg1bDYzIC02NGwtMTYyIC05MWwtOTIgLTE2M2wtNjMgNjRsMTQgMTQ4bC0xNjkgMTY5bC0yMjQgLTM3MWwtNjMgNjNsMTIwIDQ3NWwtMTc2IDE3NXEtMTkgMjAgLTE5IDQ2LjV0MTkgNDUuNXQ0NiAxOXQ0NiAtMTlsMTc2IC0xNzVsNDc1IDEyMGw2MyAtNjNsLTM3MSAtMjI1bDE2OCAtMTY4eiIgLz4KPGdseXBoIHVuaWNvZGU9IlUiIGhvcml6LWFkdi14PSI4OTQiIGQ9Ik03NjAgMTU0cTQ2IC0yMCA3Mi41IC00NC41dDI5LjUgLTM4LjVsMyAtMTR2LTg2aC04MzZ2ODZxMCAyIDAuNSA2dDYgMTV0MTUuNSAyMnQzMS41IDI2dDUwLjUgMjhxMTIgNSA1NCAyOXQ4NyA0M3Q5NCAyOHEtMzMgMzQgLTcyIDEzNHEtMTEgMjggLTExIDEwMHEwIDcgLTEgMzF0LTAuNSA0MS41dDMuNSAyOS41cTMxIDExMSAxNTkgMTExcTEyNyAwIDE1OCAtMTExcTQgLTEyIDQuNSAtMjkuNXQtMSAtNDF0LTEuNSAtMzEuNSBxMCAtNzIgLTEwIC0xMDBxLTM4IC05NiAtNzIgLTEzNHE1MCAtOCA5NC41IC0yN3Q4NyAtNDMuNXQ1NC41IC0yOS41eiIgLz4KPGdseXBoIHVuaWNvZGU9IlYiIGhvcml6LWFkdi14PSI5NDkiIGQ9Ik02NTkgNDE2bDIzNSAxMTF2LTQ0OWwtMjM1IDExMXYxdi0xMDNxMCAtMTkgLTEzIC0zMnQtMzIgLTEzaC01MTBxLTE5IDAgLTMyIDEzdC0xMyAzMnY0MzNxMCAxOSAxMyAzMnQzMiAxM2g1MTBxMTkgMCAzMiAtMTN0MTMgLTMydi0xMDR6IiAvPgo8Z2x5cGggdW5pY29kZT0iVyIgaG9yaXotYWR2LXg9Ijk1NCIgZD0iTTcwNCA1NHYxODFsOTIgOTN2LTI3NHEwIC01MSAtMzYgLTg3dC04NyAtMzZoLTQ5MnEtNTEgMCAtODcgMzZ0LTM2IDg3djQ5M3EwIDUxIDM2IDg3dDg3IDM2aDQ5MnExNyAwIDI0IC0ybC04OSAtOTBoLTQyN3EtMTMgMCAtMjIgLTl0LTkgLTIydi00OTNxMCAtMTMgOSAtMjJ0MjIgLTloNDkycTEzIDAgMjIgOXQ5IDIyek00MzEgMzE0bDM1NCAzNTRsMTMyIC0xMzJsLTM1NCAtMzU0djBsLTE5NSAtNjNsNjMgMTk1djB6TTU0NyAyMDggbC04OSA4OWwtNDMgLTEzMXoiIC8+CjxnbHlwaCB1bmljb2RlPSJYIiBob3Jpei1hZHYteD0iOTIxIiBkPSJNODY4IDU0MnYtNDIzaC02NnEtMTMgMjkgLTQwIDQ2LjV0LTYwIDE3LjV0LTU5LjUgLTE3LjV0LTQwLjUgLTQ2LjVoLTIyMHY0MjNoNDg2ek0yNDAgMTgzcS0zMyAwIC02MCAtMTcuNXQtNDAgLTQ2LjVoLTEwN3YxODBsMTExIDEyM2gxODR2LTI4NHEtMzMgNDUgLTg4IDQ1ek0xMDEgMjg4di01OGgxNjF2MTMyaC05OXpNMjQwIDE0NnEzMCAwIDUxLjUgLTIxdDIxLjUgLTUycTAgLTMwIC0yMS41IC01MS41dC01MS41IC0yMS41IHEtMzEgMCAtNTIgMjEuNXQtMjEgNTEuNXEwIDMxIDIxIDUydDUyIDIxek03MDIgMTQ2cTMxIDAgNTIgLTIxdDIxIC01MnEwIC0zMCAtMjEgLTUxLjV0LTUyIC0yMS41cS0zMCAwIC01MS41IDIxLjV0LTIxLjUgNTEuNXEwIDMxIDIxLjUgNTJ0NTEuNSAyMXoiIC8+CjxnbHlwaCB1bmljb2RlPSJZIiBob3Jpei1hZHYteD0iODYxIiBkPSJNNDI1IDQ4OGwtMTQ1IC00MDlsLTEyNiAxOTNsLTgxIC03NmwtMjIgLTIwbC00NiAzOWwxNjIgMTUxbDk2IC0xNDdsMTcxIDQ4M2wxNTcgLTYwNWwxMzEgNDEzbDExNiAtMzcxbC02MSAtMTZsLTU1IDE3OGwtMTM3IC00MzF6IiAvPgo8Z2x5cGggdW5pY29kZT0iWiIgaG9yaXotYWR2LXg9Ijg5NyIgZD0iTTQwMiA2MDd2LTM2OWgzNzFxMCAtMTUzIC0xMDggLTI2MXQtMjYxIC0xMDh0LTI2MSAxMDh0LTEwOCAyNjFxMCAxNTIgMTA3LjUgMjYwdDI1OS41IDEwOXpNNDk2IDcwMHExNTMgMCAyNjEuNSAtMTA4LjV0MTA4LjUgLTI2MS41aC0zNzF2MzcwaDF6IiAvPgo8Z2x5cGggdW5pY29kZT0iWyIgaG9yaXotYWR2LXg9Ijg2MSIgZD0iTTQ0NSA2NzF2LTI3OGg0MDl2LTE4NWgtNDA5di0yNzdsLTQyNyAzNzB6IiAvPgo8Z2x5cGggdW5pY29kZT0iXCIgaG9yaXotYWR2LXg9Ijg1NCIgZD0iTTcxMCA1NzloODd2LTczOWgtNzQwdjczOWg4OXY0NnEwIDM1IDIwIDU0dDU2IDE5dDU2LjUgLTE5LjV0MjAuNSAtNTMuNXYtNDZoNTJ2NDZxMCAzNCAyMC41IDUzLjV0NTYuNSAxOS41dDU2IC0xOXQyMCAtNTR2LTQ2aDUydjQ2cTAgMzQgMjAuNSA1My41dDU2LjUgMTkuNXQ1Ni41IC0xOS41dDIwLjUgLTUzLjV2LTQ2ek01OTggNjI1di0xMjNxMCAtMzIgMzUgLTMycTE5IDAgMjcuNSA3LjV0OC41IDI0LjV2MTIzcTAgMTcgLTguNSAyNC41IHQtMjcuNSA3LjVxLTM1IDAgLTM1IC0zMnpNMzkyIDYyNXYtMTIzcTAgLTE3IDguNSAtMjQuNXQyNy41IC03LjVxMzUgMCAzNSAzMnYxMjNxMCAzMiAtMzUgMzJxLTE5IDAgLTI3LjUgLTcuNXQtOC41IC0yNC41ek0xODcgNjI1di0xMjNxMCAtMzIgMzUgLTMycTE5IDAgMjcuNSA3LjV0OC41IDI0LjV2MTIzcTAgMTcgLTguNSAyNC41dC0yNy41IDcuNXEtMzUgMCAtMzUgLTMyek03MzUgLTk5djUxNGgtNjE2di01MTRoNjE2ek00MjkgOTkgcTAgLTQ1IC0zNSAtNzB0LTkwIC0yNXEtMzYgMCAtNzMgMTRsNyA1MnEzNSAtMTQgNzMgLTE0cTI0IDAgMzggMTF0MTQgMjhxMCAyMiAtMTYuNSAzMi41dC01OS41IDEyLjV2NTJxNjMgNSA2MyAzOHEwIDI4IC00MiAyOHEtMjkgMCAtNjEgLTE1bC03IDUycTM0IDE1IDg0IDE1cTQ1IDAgNzEgLTE4dDI2IC00NnEwIC01MCAtNjUgLTcydi0xcTczIC0yMCA3MyAtNzR6TTUzNyAyMjlsLTUyIC0yMGwtNyA1Mmw5MSA0NGgzMXYtMjk2aC02M3YyMjB6ICIgLz4KPGdseXBoIHVuaWNvZGU9Il0iIGhvcml6LWFkdi14PSI4NjEiIGQ9Ik00MTUgLTY5djI3N2gtNDA4djE4NWg0MDh2Mjc4bDQyOCAtMzcweiIgLz4KPGdseXBoIHVuaWNvZGU9Il4iIGhvcml6LWFkdi14PSI3NzUiIGQ9Ik03NDkgNTcycTIyIC00NiAtMyAtMTMycS0yNCAtODUgLTUgLTIzNHEtOCAtMiAtMjEgLTR0LTQ5IC04dC02NiAtOHQtNjEgLTJ0LTQ2LjUgOXQtMTAuNSAyNnExNSA0OCAtNDggNDZxLTYxIC0yIC0xODIgLTQ4cS0zNyAtMTQgLTYzIC0zdjM5OXEyMiA2IDU4IDE1dDExMiAyNXQxMjYuNSAxNC41dDUwLjUgLTI0LjVxMCAtMyAtMiAtMTQuNXQtMy41IC0yM3QtMS41IC0yM3Q1IC0xOHQxNiAtNS41cTMwIDQgNzguNSA3dDgyLjUgNHogTTE0NSA2NTh2LTgxN2gtODV2ODE3cTAgMTcgMTIuNSAyOS41dDMwLjUgMTIuNXExNyAwIDI5LjUgLTEyLjV0MTIuNSAtMjkuNXoiIC8+CjxnbHlwaCB1bmljb2RlPSJfIiBob3Jpei1hZHYteD0iODIwIiBkPSJNNTkgMTk4djE5OWg3MDJ2LTE5OWgtNzAyeiIgLz4KPGdseXBoIHVuaWNvZGU9ImAiIGhvcml6LWFkdi14PSI5MzYiIGQ9Ik0zMDYgMzc4bC0xNTIgMTUzbC05NSAtOTZ2Mjc3aDI3N2wtOTUgLTk1bDE1MiAtMTUyek03ODMgNzVsOTUgOTV2LTI3NmgtMjc3bDk1IDk1bC0xNTIgMTUxbDg3IDg3ek02MzEgMzc4bC04NyA4N2wxNTIgMTUybC05NSA5NWgyNzZ2LTI3N2wtOTQgOTV6TTMwNiAyMjdsODcgLTg3bC0xNTIgLTE1Mmw5NSAtOTVsLTI3NyAxdjI3N2w5NSAtOTZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iYSIgaG9yaXotYWR2LXg9IjgxMCIgZD0iTTc0NSAxNDRxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV0LTE0LjUgLTM2dC0zNS41IC0xNXEtMiAwIC02IDAuNXQtNiAwLjVxLTQyIC0zNiAtNzkgLTU5cS04MyAtNTUgLTE1NyAtNzZxLTcxIC00NCAtOTAgLTQ0cS0xNCAwIC05NSA0NXEtNzYgMjIgLTE1NiA3NXEtNDAgMjcgLTc5IDU5cS0yIDAgLTUuNSAtMC41dC01LjUgLTAuNXEtMjEgMCAtMzYgMTV0LTE1IDM2dDE1IDM1LjV0MzYgMTQuNXQzNS41IC0xNC41dDE0LjUgLTM1LjV2LTggcTkgLTggMzQgLTIydDM4IC0yM3E0NyAtMzEgMTQ0IC0zM2wzMiAxNTFxNCA5OCA3IDE5MmgtMTM2bC01MiAxMnEtMTQgLTE3IC0zMyAtMTdxLTE3IDAgLTI5IDExLjV0LTEyIDI4LjV0MTIgMjguNXQyOSAxMS41cTIyIDAgMzMgLTE4aDE5MHEyIDcyIDMgOTZxLTMyIDEwIC01MiAzNi41dC0yMCA2MC41cTAgNDIgMjkuNSA3MS41dDcwLjUgMjkuNXE0MiAwIDcxLjUgLTI5LjV0MjkuNSAtNzEuNXEwIC0zMyAtMjAgLTU5LjV0LTUxIC0zNi41IHEwIC03IDEuNSAtNDAuNWwyLjUgLTU2LjVoMTg5cTExIDE4IDMzIDE4cTE3IDAgMjkgLTExLjV0MTIgLTI4LjV0LTEyIC0yOC41dC0yOSAtMTEuNXEtMjEgMCAtMzIgMTdsLTUzIC0xMmgtMTM1bDYgLTE5MmwzMyAtMTU0cTc5IC00IDEyMCAyMXE1MCAzMCA5NiA2MnEtMSAyIC0xIDZxMCAyMSAxNSAzNS41dDM2IDE0LjV6TTM1MSA2MDFxMCAtMjIgMTUuNSAtMzcuNXQzNy41IC0xNS41cTIzIDAgMzguNSAxNS41dDE1LjUgMzcuNXQtMTYgMzcuNSB0LTM4IDE1LjV0LTM3LjUgLTE1LjV0LTE1LjUgLTM3LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iYiIgaG9yaXotYWR2LXg9IjkxOSIgZD0iTTQ2MSA2OTlsNDA4IC0xMTN2LTU5MWwtNDA4IC0xMTRsLTQxMCAxMTR2NTkxek00MjYgLTM4djQzOWwtMzA2IDg2di00NDF6TTQ2MCA0NjJsMzAwIDg0bC0yOTkgODJsLTMwMCAtODJ6TTgwMSA0NnY0NDBsLTMwNyAtODV2LTQ0MHoiIC8+CjxnbHlwaCB1bmljb2RlPSJjIiBob3Jpei1hZHYteD0iOTA4IiBkPSJNNzY3IDMxOHE0NiAtMTkgNzMuNSAtNjB0MjcuNSAtOTJxMCAtNjggLTQ4IC0xMTZ0LTExNiAtNDhoLTloLTE5OHYxNjJoMzBoNzZxMTIgMCAxNSA2LjV0LTQgMTYuNWwtMTQ1IDE3M3EtOCAxMCAtMTkuNSAxMHQtMTkuNSAtMTBsLTE0NSAtMTczcS04IC0xMCAtNSAtMTYuNXQxNiAtNi41aDc2aDMwdi0xNjJoLTE5OGgtMWgtMWgtMnYxcS02OCAxIC0xMTYuNSA1MHQtNDguNSAxMTdxMCA0NiAyMiA4NHQ2MCA2MXEtNSAxOCAtNSAzNCBxMCA0NyAzMy41IDgwLjV0ODEuNSAzMy41cTM5IDAgNjkgLTI0cTMxIDY0IDkxIDEwM3QxMzMgMzlxMTAzIDAgMTc1LjUgLTcyLjV0NzIuNSAtMTc1LjVxMCAtMTAgLTEgLTE1eiIgLz4KPGdseXBoIHVuaWNvZGU9ImQiIGhvcml6LWFkdi14PSI5MTgiIGQ9Ik00NTkgNjk5cTE3NCAwIDI5Ni41IC0xMjN0MTIyLjUgLTI5NnEwIC0xNzQgLTEyMi41IC0yOTYuNXQtMjk2LjUgLTEyMi41cS0xNzMgMCAtMjk2IDEyMi41dC0xMjMgMjk2LjVxMCAxNzMgMTIzIDI5NnQyOTYgMTIzek03NzQgMjgwcTAgMTMwIC05Mi41IDIyMnQtMjIyLjUgOTJxLTEwMCAwIC0xODIgLTU4bDQzOCAtNDM4cTU5IDgxIDU5IDE4MnpNMTQ1IDI4MHEwIC0xMzAgOTIgLTIyMnQyMjIgLTkycTEwMyAwIDE4MyA1OGwtNDM4IDQzOSBxLTU5IC04MyAtNTkgLTE4M3oiIC8+CjxnbHlwaCB1bmljb2RlPSJlIiBob3Jpei1hZHYteD0iNTU2IiBkPSJNNTUwIDY5OWwtMTkzIC0zNDJoMTU4bC01MTAgLTQ3NmwyMzkgMzg2aC0xNjB6IiAvPgo8Z2x5cGggdW5pY29kZT0iZiIgaG9yaXotYWR2LXg9IjkxMiIgZD0iTTU2IDQxNXExNDkgMCAyNzUgLTczLjV0MjAwIC0xOTkuNXQ3NSAtMjc1aC0xNjBxLTIgMTYxIC0xMTUgMjc0cS0xMTQgMTE0IC0yNzUgMTE0djE2MHpNNTYgNzAwcTE2OSAwIDMyMi41IC02NnQyNjUuNSAtMTc3LjV0MTc4IC0yNjZ0NjcgLTMyMy41aC0xNjBxLTEgMTgzIC05MS41IDMzNy41dC0yNDUgMjQ0LjV0LTMzNi41IDkwdjE2MXpNMTY3IDkwcTQ2IDAgNzguNSAtMzIuNXQzMi41IC03OC41dC0zMi41IC03OC41dC03OC41IC0zMi41IHQtNzguNSAzMi41dC0zMi41IDc4LjV0MzIuNSA3OC41dDc4LjUgMzIuNXoiIC8+CjxnbHlwaCB1bmljb2RlPSJnIiBob3Jpei1hZHYteD0iODk0IiBkPSJNODY1IDM2di0zNWgtMTUxdjQ3djFxLTQgNDMgLTU1IDczcS0xMCAxNiAtMjIgNDdxLTUgMTEgLTUgNDBxMCAzNyAxIDQxcTEzIDQ0IDY0IDQ0dDY0IC00NHYtNDFxMCAtMzAgLTQgLTQwcS0xNSAtMzkgLTI5IC01NHEyMCAtNCAzOCAtMTEuNXQzNS41IC0xN3QyMS41IC0xMS41cTE5IC04IDI5LjUgLTE4dDExLjUgLTE1ek0xODAgNDl2LTF2LTQ3aC0xNTF2MzVxMCAyIDEgNnQxMS41IDE0dDI5LjUgMThxNSAyIDIxLjUgMTJ0MzQuNSAxNy41IHQzOCAxMS41cS0xNCAxNSAtMjkgNTRxLTQgMTAgLTQgNDBxMCAzNyAxIDQxcTExIDQ0IDYzIDQ0cTUxIDAgNjQgLTQ0cTEgLTQgMSAtNDFxMCAtMzAgLTQgLTQwcS0xNSAtMzYgLTI0IC00OHEtNTMgLTMyIC01MyAtNzJ6TTYyMCAxMDJxMjUgLTExIDM5LjUgLTI0LjV0MTYuNSAtMjEuNWwyIC04di00N2gtNDYydjQ3cTAgMyAxLjUgOC41dDE2IDE5LjV0NDAuNSAyNnE2IDMgMjkgMTZ0NDggMjMuNXQ1MiAxNS41cS0xOCAyMSAtMzkgNzQgcS02IDEzIC02IDU2cTAgNTMgMSA1NnExNyA2MSA4NyA2MXQ4OCAtNjFxMSAtMyAxIC01NnEwIC00MSAtNiAtNTZxLTIxIC01NCAtNDAgLTc0cTI4IC01IDUyLjUgLTE1dDQ5IC0yNHQyOS41IC0xNnoiIC8+CjxnbHlwaCB1bmljb2RlPSJoIiBob3Jpei1hZHYteD0iOTA2IiBkPSJNODQ4IDQyNXEyNSAtNjggMjUgLTE0NHQtMjUgLTE0NHEtMTAgLTI4IC00MCAtMjhxLTYgMCAtMTAgMWwtNyAycS01NSAtMTExIC0xNjkgLTE2OWwyIC03cTQgLTE2IC0zLjUgLTMwdC0yMi41IC0yMHEtNzIgLTI1IC0xNDQgLTI1cS03MyAwIC0xNDUgMjVxLTE1IDYgLTIyLjUgMjB0LTMuNSAzMGwyIDdxLTExMiA1NSAtMTcwIDE2OWwtNyAtMnEtMyAtMSAtMTAgLTFxLTI5IDAgLTM5IDI4cS0yNiA3MCAtMjYgMTQ0dDI2IDE0NCBxMTAgMjggMzkgMjhxMyAwIDExIC0ybDYgLTFxNTggMTE1IDE3MCAxNjlsLTIgN3EtNCAxNiAzLjUgMzB0MjIuNSAyMHE3MiAyNSAxNDQgMjVxNzUgMCAxNDUgLTI2cTE1IC01IDIyLjUgLTE5dDMuNSAtMzBsLTIgLTdxMTEzIC01NiAxNzAgLTE2OWw2IDFxOCAyIDExIDJxMjkgMCAzOSAtMjh6TTgwOCAxNTFxMjMgNjMgMjMgMTMwcTAgNjYgLTIyIDEzMGwtMTY2IC00MXEyMCAtNDIgMjAgLTg5dC0yMCAtODl6TTU4MyAtNzRsLTQwIDE2NSBxLTQyIC0yMCAtODkgLTIwdC05MCAyMGwtNDAgLTE2NXE2MSAtMjMgMTMwIC0yM3E2OCAwIDEyOSAyM3pNNTYxIDEyOXExMiAtNyAxNyAtMTZxMjQgMTcgNDQgNDNxLTExIDYgLTE3IDE4cS04IDE3IDAgMzZxMTYgMzIgMTYgNzFxMCAzOCAtMTYgNzFxLTggMTggMCAzNnE3IDEyIDE3IDE4cS0xOSAyNSAtNDQgNDNxLTcgLTEyIC0xNyAtMTZxLTggLTQgLTE4IC00cS0xMSAwIC0xOCA0cS0zMyAxNiAtNzIgMTZxLTM4IDAgLTcxIC0xNiBxLTcgLTQgLTE4IC00cS0xMCAwIC0xOCA0cS0xMiA3IC0xNyAxNnEtMjUgLTE4IC00NCAtNDNxMTEgLTYgMTcgLTE4cTggLTE4IDAgLTM2cS0xNyAtMzYgLTE3IC03MXEwIC0zNiAxNiAtNzFxOSAtMTkgMCAtMzZxLTQgLTExIC0xNiAtMThxMTYgLTIyIDQ0IC00NHE1IDEwIDE3IDE3cTggNCAxOCA0cTExIDAgMTggLTRxMzMgLTE2IDcyIC0xNnEzOCAwIDcxIDE2cTcgNCAxOCA0cTEwIDAgMTggLTR6TTc1IDI4MXEwIC02NCAyMyAtMTMwbDE2NSA0MSBxLTIwIDQ1IC0yMCA4OXEwIDQ1IDIxIDg5bC0xNjYgNDFxLTIzIC02NyAtMjMgLTEzMHpNNDUzIDY1OXEtNjggMCAtMTI5IC0yM2w0MCAtMTY1cTQzIDIwIDg5IDIwcTQ3IDAgOTAgLTIwbDQwIDE2NXEtNjEgMjMgLTEzMCAyM3oiIC8+CjxnbHlwaCB1bmljb2RlPSJpIiBkPSJNNDYwIDY5OXExNzQgMCAyOTcgLTEyM3QxMjMgLTI5N3QtMTIzIC0yOTd0LTI5NyAtMTIzcS0xNzMgMCAtMjk2LjUgMTIzdC0xMjMuNSAyOTd0MTIzLjUgMjk3dDI5Ni41IDEyM3pNNTE0IDU2OXEtMzEgLTEgLTQ5IC0yMnQtMTggLTQ1cTAgLTI1IDEzLjUgLTQwLjV0MzYuNSAtMTUuNWgxcTI5IDAgNDguNSAyMC41dDE5LjUgNDguNXEwIDIzIC0xMyAzN3EtMTUgMTcgLTM5IDE3ek01NjUgOThsMyAzbC0yIDRsLTE4IDM4bC01IC00IHEtMTQgLTE0IC0zNC41IC0yOHQtMjQuNSAtMTV2NXEwIDcgMyAyMGw0NiAxODhxNiAyNSA2IDU3cTAgMTggLTYgMzBxLTcgMTIgLTIyIDEycS0yNSAwIC03MS41IC0yOC41dC05MS41IC03MC41bC0zIC0zbDE2IC00NWw2IDRxMzUgMzEgNTUgMzlxMCAtNiAtMyAtMjFsLTQzIC0xODJxLTYgLTMwIC02IC02MHEwIC0yNSAxMCAtMzZxOSAtMTAgMjYgLTEwcTIzIDAgNzAuNSAyOXQ4OC41IDc0eiIgLz4KPGdseXBoIHVuaWNvZGU9ImoiIGhvcml6LWFkdi14PSI4NzciIGQ9Ik04MzUgMjMydi0xbDEgLTF2LTFxMTkgLTM1IDE5IC03OXEwIC0xOCAtNSAtNDNxLTEyIC00NiAtNDUgLTgwbC02NCAtNjNxLTUxIC01MSAtMTIzIC01MXQtMTIyIDUxbC03NyA3NmwtNDcgNDhsLTMzIDMzcS0zNyAzNyAtNDggOTFxLTIgMjAgLTIgMzFxMCAxNyAzIDM1bDMgMTJxNCAxNSAxNCAzNHYxcTEgMSAyLjUgNGwyLjUgNWwxIDJsMSAxcTEgMSAyLjUgMy41dDIuNSAzLjV2MWwyIDJxMSAxIDMgMy41dDMgMy41djFsMiAybDQgNHQ0IDUgbDI4IDI4bDQgLTVsNTcgLTU2cTAgLTEgMiAtM3QyIC0zdDEgLTMuNXQxIC0zLjVsLTI1IC0yNXEtMSAtMSAtMyAtMy41dC00IC00LjVxMCAtMSAtMSAtMnYtMXEtMiAtMiAtNCAtNnEtMSAwIC0xIC0xdC0xIC0ydC0xLjUgLTMuNXQtMC41IC0zLjVsLTEgLTF2LTJxLTQgLTkgLTQgLTIycTAgLTE1IDcgLTMycTQgLTggMTQgLTIwbDU3IC01N2w0MCAtMzlsNjAgLTYxcTIxIC0yMSA1MiAtMjFxMzIgMCA1MiAyMWw2NCA2NHExMiAxMiAxOCAyOSBxMyAxMSAzIDIzcTAgMTAgLTMgMjFxLTUgMTkgLTE4IDMxbC05OCA5OHExIDYgMSAxN3EwIDIxIC0zIDQwcS0xMiA2OCAtNTkgMTE2cTM5IC0xMiA3MSAtNDJsMiAtMmwxNTcgLTE1N3ExOCAtMTggMjkgLTM5cTAgLTEgMSAtMXpNNTM4IDQ0MXEzOSAtMzkgNDggLTkxcTMgLTE1IDMgLTMxcTAgLTExIC00IC0zNWwtMyAtMTJxLTMgLTEyIC0xMyAtMzRsLTEgLTFxLTEgLTEgLTIuNSAtNGwtMi41IC01bC0xIC0ybC0xIC0xcS0yIC00IC01IC03IGwtMSAtMXEtMSAtMSAtMSAtMnEtMyAtMyAtNSAtN2wtMSAtMWwtMiAtMnEtMiAtMyAtOCAtOWwtMjggLTI4bC00IDVsLTU3IDU2cS0xIDEgLTIgM3QtMiAzdC0xIDMuNXQtMSAzLjVsMjUgMjVxMSAxIDMgMy41dDQgNC41cTAgMSAwLjUgMXQwLjUgMXYxcTIgMiA0IDZsMSAxcTEgMSAxIDJxMiA0IDMgN3YxcTAgMSAxIDJxMyAxMSAzIDIycTAgMTUgLTcgMzJxLTQgOCAtMTQgMjBsLTU3IDU3bC0zOSAzOWwtNjEgNjFxLTIxIDIxIC01MiAyMSB0LTUyIC0yMWwtNjQgLTY0cS0xMiAtMTIgLTE4IC0yOXEtMyAtMTEgLTMgLTIzcTAgLTEwIDMgLTIxcTUgLTE5IDE4IC0zMWw5OCAtOThxLTEgLTYgLTEgLTE3cTAgLTIzIDQgLTQwcTEwIC02NSA1OCAtMTE2cS00MCAxMiAtNzEgNDJsLTIgMmwtMTU3IDE1N3EtMTggMTggLTI5IDM5cTAgMSAtMSAxdjFsLTEgMXYxcS0xOSAzOCAtMTkgNzlxMCAxOCA1IDQzcTEyIDQ2IDQ1IDgwbDY0IDYzcTUxIDUxIDEyMyA1MXQxMjIgLTUxbDc3IC03NiBsNDcgLTQ4eiIgLz4KPGdseXBoIHVuaWNvZGU9ImsiIGhvcml6LWFkdi14PSI4OTYiIGQ9Ik02NTcgNjEwcTg5IDAgMTQ4LjUgLTUwLjV0NTkuNSAtMTU5LjVxMCAtNDkgLTI2IC0xMDF0LTUyIC03OWwtMjYgLTI4bC0zMTMgLTMxMmwtMzEzIDMxMmwtMTEgMTF0LTI1IDMwdC0zMiA0NnQtMjUgNTYuNXQtMTEgNjQuNXEwIDEwOSA1OSAxNTkuNXQxNDggNTAuNXE5MCAwIDE5MSAtMTA3bDE5IC0yMXE0IDUgMTEuNSAxMy41dDMxIDMxdDQ3IDM5dDU2LjUgMzAuNXQ2MyAxNHoiIC8+CjxnbHlwaCB1bmljb2RlPSJsIiBob3Jpei1hZHYteD0iOTQyIiBkPSJNMjc5IDcwMGg2MDV2LTEzM2gtNjA1djEzM3pNMjc5IDI4NHYxMzNoNjA1di0xMzNoLTYwNXpNMjc5IDB2MTMzaDYwNXYtMTMzaC02MDV6TTEyMiA3MDBxMjggMCA0Ny41IC0xOS41dDE5LjUgLTQ2LjVxMCAtMjggLTE5LjUgLTQ3LjV0LTQ3LjUgLTE5LjVxLTI3IDAgLTQ2LjUgMTkuNXQtMTkuNSA0Ny41cTAgMjcgMTkuNSA0Ni41dDQ2LjUgMTkuNXpNMTIyIDQxOHEyOCAwIDQ3LjUgLTE5LjV0MTkuNSAtNDcuNXEwIC0yNyAtMTkuNSAtNDYuNSB0LTQ3LjUgLTE5LjVxLTI3IDAgLTQ2LjUgMTkuNXQtMTkuNSA0Ni41cTAgMjggMTkuNSA0Ny41dDQ2LjUgMTkuNXpNMTIyIDEzNHEyOCAwIDQ3LjUgLTE5LjV0MTkuNSAtNDYuNXEwIC0yOCAtMTkuNSAtNDcuNXQtNDcuNSAtMTkuNXEtMjcgMCAtNDYuNSAxOS41dC0xOS41IDQ3LjVxMCAyNyAxOS41IDQ2LjV0NDYuNSAxOS41eiIgLz4KPGdseXBoIHVuaWNvZGU9Im0iIGhvcml6LWFkdi14PSI4MDgiIGQ9Ik03NzEgNjk4di04M3YtNTE0cS0xIC01MiAtNDYuNSAtODh0LTExMC41IC0zNnQtMTExIDM3dC00NiA4OXQ0NiA4OXQxMTEgMzdxMzYgMCA3MCAtMTN2MzA4bC0zNTIgLTg0di00OTVxLTEgLTUyIC00NyAtODguNXQtMTEwIC0zNi41cS02NSAwIC0xMTEgMzd0LTQ2IDkwcTAgNTIgNDYgODl0MTExIDM3cTM1IDAgNjkgLTEzdjUxM2gybDQzOCAxMDR6IiAvPgo8Z2x5cGggdW5pY29kZT0ibiIgaG9yaXotYWR2LXg9Ijk1NiIgZD0iTTc1OSA3MDBxNTggMCA5OSAtNDF0NDEgLTk5di01NjFxMCAtNTggLTQxIC05OXQtOTkgLTQxaC01NjFxLTU4IDAgLTk5IDQxdC00MSA5OXY1NjFxMCA1OCA0MSA5OXQ5OSA0MWg1NjF6TTc5NCA0OTBoLTUxM3YtMTE3aDUxM3YxMTd6TTI1OSAyMTdoLTk2di0xMTRoOTZ2MTE0ek0xNjMgMjM4aDk2djExNGgtOTZ2LTExNHpNMjgxIDIxN3YtMTE0aDUxM3YxMTRoLTUxM3pNMjgxIDIzOGg1MTN2MTE0aC01MTN2LTExNHpNMjU5IDQ5MGgtOTYgdi0xMTdoOTZ2MTE3ek0xNjMgLTFxMCAtMTQgMTAuNSAtMjQuNXQyNC41IC0xMC41aDYxdjExN2gtOTZ2LTgyek03NTkgLTM2cTE0IDAgMjQuNSAxMC41dDEwLjUgMjQuNXY4MmgtNTEzdi0xMTdoNDc4eiIgLz4KPGdseXBoIHVuaWNvZGU9Im8iIGhvcml6LWFkdi14PSI5NDEiIGQ9Ik04NjcgNTQ1cTExIDAgMTggLTcuNXQ3IC0xNy41di01MjVxMCAtMTEgLTcgLTE4dC0xOCAtN2gtNzg0cS0xMSAwIC0xOCA3dC03IDE4djUyNXEwIDEwIDcgMTcuNXQxOCA3LjVoMzhsMjkgNTlxMTEgMjIgMzYgMjJoMTU4cTI1IDAgMzYgLTIybDI4IC01OWg0NTl6IiAvPgo8Z2x5cGggdW5pY29kZT0icCIgaG9yaXotYWR2LXg9Ijg1NSIgZD0iTTU0MiA1NDlsMTUzIC0xNTNsLTQ2MCAtNDYwdjB2MGwtMjI2IC03NGw3MyAyMjd2MHYwek0xODggNjVsMzc5IDM3OWwtMjUgMjZsLTM4MCAtMzgwek02OTQgNzAxbDE1NCAtMTUzbC0xMDEgLTEwMGwtMTUzIDE1M3oiIC8+CjxnbHlwaCB1bmljb2RlPSJxIiBob3Jpei1hZHYteD0iOTEwIiBkPSJNODY1IDE2MHEwIC00MiAtMjYgLTc1dC02NiAtNDRxMTUgLTQzIDY2IC04MnExMiAtOCAtOSAtMTRxLTQ1IC0xMSAtMTE0IDIxcS01MiAyNSAtOTcgNzFoLTI5OXEtNDIgMCAtNzcgMjdxMzAgMTggNTYgNDNoMjc2cTc0IDAgMTI2LjUgNTIuNXQ1Mi41IDEyNi41djIzNXE0NyAtNSA3OSAtNDB0MzIgLTgzdi0yMzh6TTY5OCAyODZxMCAtNTIgLTM2IC04OHQtODcgLTM2aC0yOThxLTQ5IC01MCAtMTAwIC03MnQtOTAgLTIycS0zNCAwIC0zNCAxMSBxMCAzIDMgNXE1MCAzOCA2NiA4MnEtNDAgMTEgLTY2IDQ0dC0yNiA3NnYyMzdxMCA1MSAzNiA4Ny41dDg4IDM2LjVoNDIxcTUxIDAgODcgLTM2LjV0MzYgLTg3LjV2LTIzN3oiIC8+CjxnbHlwaCB1bmljb2RlPSJyIiBob3Jpei1hZHYteD0iOTAwIiBkPSJNNzI2IDI3OGwyNCAyNGw5MSA5MXYtMjYwcTAgLTEyOCAtMTI4IC0xMjhoLTUwOXYtMTA4bC0xNzEgMTcybDE3MSAxNzJ2LTExNXYtNmg0ODRxMTYgMCAyNyAxMXQxMSAyN3YxMjB6TTE3NCAzMTlsLTI0IC0yNGwtOTEgLTkxdjI2MHEwIDEyNyAxMjggMTI3aDUwOXYxMDhsMTcxIC0xNzFsLTE3MSAtMTcydjExNXY2aC00ODRxLTE2IDAgLTI3IC0xMS41dC0xMSAtMjcuNXYtMTE5eiIgLz4KPGdseXBoIHVuaWNvZGU9InMiIGhvcml6LWFkdi14PSI4NjQiIGQ9Ik04MTYgNHEyMyAtMjMgMjMgLTU0cTAgLTI5IC0yMCAtNDhxLTE5IC0xOSAtNDcgLTE5cS0zMiAwIC01NSAyM2wtMjE5IDIxOXEtNzQgLTQ4IC0xNjYgLTQ4cS0xMjkgMCAtMjIwLjUgOTEuNXQtOTEuNSAyMjAuNXQ5MS41IDIyMC41dDIyMC41IDkxLjV0MjIwLjUgLTkxLjV0OTEuNSAtMjIwLjVxMCAtOTAgLTQ3IC0xNjV6TTUwNiAzODlxMCA3MiAtNTEgMTIzdC0xMjMgNTF0LTEyMyAtNTF0LTUxIC0xMjN0NTEgLTEyM3QxMjMgLTUxIHQxMjMgNTF0NTEgMTIzeiIgLz4KPGdseXBoIHVuaWNvZGU9InQiIGhvcml6LWFkdi14PSI5MTkiIGQ9Ik00NjAgNjk5cTE3MyAwIDI5NiAtMTIzdDEyMyAtMjk2cTAgLTE3NCAtMTIzIC0yOTd0LTI5NiAtMTIzcS0xNzQgMCAtMjk3IDEyM3QtMTIzIDI5N3EwIDE3MyAxMjMgMjk2dDI5NyAxMjN6TTQ2MCAtMzVxMTMwIDAgMjIyIDkyLjV0OTIgMjIyLjV0LTkyIDIyMnQtMjIyIDkydC0yMjIuNSAtOTJ0LTkyLjUgLTIyMnQ5Mi41IC0yMjIuNXQyMjIuNSAtOTIuNXpNNjYzIDE4NnExNCAtMTAgNSAtMjRsLTI0IC0zOXEtNSAtNiAtMTEgLThoLTQgcS01IDAgLTEwIDNsLTE5MyAxMjlxLTEgMSAtMi41IDJ0LTIuNSAxcS01IDcgLTUgMTN2MjI4cTAgNyA1IDEycTcgNSAxMyA1aDQ2cTcgMCAxMiAtNXQ1IC0xMnYtMTkzeiIgLz4KPGdseXBoIHVuaWNvZGU9InUiIGhvcml6LWFkdi14PSI5NTUiIGQ9Ik02MCA2MzFoODM1di02NzNoLTgzNXY2NzN6TTgyNSAyOHY1MzRoLTY5NXYtNTM0aDY5NXpNMjI1IDQzMXEtMTggMCAtMzEgMTN0LTEzIDMxdDEzIDMwLjV0MzEgMTIuNXQzMC41IC0xMi41dDEyLjUgLTMwLjV0LTEyLjUgLTMxdC0zMC41IC0xM3pNNzMxIDQzMXEtMTggMCAtMzEgMTN0LTEzIDMxdDEzIDMwLjV0MzEgMTIuNXQzMC41IC0xMi41dDEyLjUgLTMwLjV0LTEyLjUgLTMxdC0zMC41IC0xM3pNMjI1IDE1OXExOCAwIDMwLjUgLTEzIHQxMi41IC0zMXQtMTIuNSAtMzAuNXQtMzAuNSAtMTIuNXQtMzEgMTIuNXQtMTMgMzAuNXQxMyAzMXQzMSAxM3pNNzMxIDE1OXExOCAwIDMwLjUgLTEzdDEyLjUgLTMxdC0xMi41IC0zMC41dC0zMC41IC0xMi41dC0zMSAxMi41dC0xMyAzMC41dDEzIDMxdDMxIDEzek01OTMgNDU3di0zMjVoLTIyOHYzMjVoMjI4ek01MzMgMTgxdjExOGgtMTA5di0xMThoMTA5eiIgLz4KPGdseXBoIHVuaWNvZGU9InYiIGhvcml6LWFkdi14PSI5NDUiIGQ9Ik04NjYgNTU3cTEwIDAgMTcuNSAtN3Q3LjUgLTE3di00NzJxMCAtMTEgLTcuNSAtMTh0LTE3LjUgLTdoLTc4NnEtMTAgMCAtMTcuNSA3dC03LjUgMTh2NDcycTAgMTAgNy41IDE3dDE3LjUgN2gxNzNxMCAxIDEgMWwyMyA0OHE0IDkgMTUgMTUuNXQyMSA2LjVoMzE5cTI1IDAgMzYgLTIybDI0IC00OHYtMWgxNzR6TTQ3MiAxMjBxNzUgMCAxMjggNTIuNXQ1MyAxMjcuNXQtNTMgMTI4dC0xMjggNTNxLTc0IDAgLTEyNyAtNTN0LTUzIC0xMjggdDUzIC0xMjcuNXQxMjcgLTUyLjV6IiAvPgo8Z2x5cGggdW5pY29kZT0idyIgaG9yaXotYWR2LXg9IjkyNyIgZD0iTTg4NSAzOTdxMTYgLTEzNyAtOTQuNSAtMjQ3dC0yODIuNSAtMTI5cS02MiAtNyAtMTIwIDBxLTkyIC05NSAtMTk3IC0xMDZxLTQ3IC01IC01NiA4cS0zIDQgMyA4cTg4IDY2IDgwIDE0NXEtNjkgMzkgLTExMiA5OHQtNTEgMTMwcS0xNiAxMzYgOTQgMjQ2LjV0MjgyIDEzMC41cTE3MiAxOSAzMDQuNSAtNjR0MTQ5LjUgLTIyMHoiIC8+CjxnbHlwaCB1bmljb2RlPSJ4IiBob3Jpei1hZHYteD0iOTQ5IiBkPSJNNTI2IDEwMHEyIDEwIDIgMTZsOTggOThsMTM5IC0xMzlsOTQgLTY5bDEwIC0zOGwtMTA0IC0xMDRsLTM3IDEwbC03MCA5NHpNNzU1IDIycS0xOCAwIC0zMC41IC0xMi41dC0xMi41IC0zMS41cTAgLTE4IDEyLjUgLTMwLjV0MzAuNSAtMTIuNXExOSAwIDMxLjUgMTIuNXQxMi41IDMwLjVxMCAxOSAtMTIuNSAzMS41dC0zMS41IDEyLjV6TTQ2OSAzNzFsLTk4IC05OHEtNiAwIC0xNiAtMmwtNzEgNzBxLTMyIC0xNSAtNTYgLTE1IHEtNzQgMCAtMTMzLjUgNjB0LTYwLjUgMTM0cTAgMSAxNyAxOHE2MyAtNjMgNzEgLTY4dDQ1IC01cTI5IDAgNjUuNSAzNnQzNi41IDY2cTAgMzYgLTYgNDUuNXQtNjcgNjkuNXExNSAxOCAxOCAxOHE3NCAxIDEzNCAtNTkuNXQ2MCAtMTM0LjVxMCAtMjcgLTE2IC01N3pNNzg2IDIwMnEwIDMgMC41IDcuNXQwLjUgMTguNXQtMS41IDI4dC01LjUgMzJ0LTEwLjUgMzMuNXQtMTkgMzAuNXQtMjguNSAyNGgtM3EtMTAgMCAtMzQgLTIybC0yMTggLTIxNyBxOCAtMjkgLTggLTQ3cS0yIC0xIC03IC02bC0yMDEgLTIwMXEtNSAtNSAtNiAtN3EtMTEgLTExIC0yOSAtMTFxLTQxIDAgLTc3IDQ4dC04IDc3cTMgMiA2IDZsMjAyIDIwMnE1IDMgNiA2cTExIDExIDI4IDExcTkgMCAxOSAtM2wxOTQgMTk0bDQgNnE0IDYgNS41IDh0NSA4LjV0NC41IDExdDEuNSAxMXQtMSAxMy41dC00LjUgMTRxLTE2IDI5IC02MCAzOGgtMXEtMTYgMCAtNTUgMzdsLTYgNnEtMTkgMTkgLTIwIDI1dDE4IDI3bDcyIDczIHExNyAxNyAyNiAxN3E2IDAgMjYgLTIwbDYgLTZxMzMgLTMzIDM3IC00OXE0IC0yMCAyNCAtNDZxMyAtNCAxOCAtNHQxOSAtNGwxMTkgLTExOXE3MyAtNzMgMzAgLTI1MmwtMTUgLTUweiIgLz4KPGdseXBoIHVuaWNvZGU9InkiIGhvcml6LWFkdi14PSI4OTciIGQ9Ik04NDMgMzU5cTkgLTEgMTUuNSAtOXQ2LjUgLTE3di05N3EwIC05IC02LjUgLTE3dC0xNS41IC05bC0xMjQgLTIzcS05IC0yIC0xMiAtOHQyIC0xNGw3MiAtMTA2cTEyIC0xOSAtNCAtMzVsLTY4IC02OHEtMTYgLTE2IC0zNCAtM2wtMTA2IDcxcS03IDUgLTE0LjUgMi41dC04LjUgLTExLjVsLTIzIC0xMjVxLTEgLTkgLTkgLTE1LjV0LTE3IC02LjVoLTk3cS05IDAgLTE3IDYuNXQtOSAxNS41bC0yMyAxMjVxLTEgOSAtOC41IDExLjUgdC0xNC41IC0yLjVsLTEwNSAtNzFxLTIwIC0xMiAtMzUgM2wtNjggNjhxLTE2IDE2IC00IDM1bDcyIDEwNnE1IDggMiAxNHQtMTIgOGwtMTI0IDIzcS05IDEgLTE1LjUgOXQtNi41IDE3djk3cTAgOSA2LjUgMTd0MTUuNSA5bDEyNCAyM3EyMiA2IDEwIDIzbC03MiAxMDZxLTExIDE5IDQgMzRsNjggNjhxMTYgMTYgMzUgNGwxMDUgLTcycTcgLTUgMTQuNSAtMnQ4LjUgMTJsMjMgMTI0cTEgOSA5IDE1LjV0MTcgNi41aDk3cTkgMCAxNyAtNi41IHQ5IC0xNS41bDIzIC0xMjRxMSAtOSA4LjUgLTEydDE0LjUgMmwxMDYgNzJxMTggMTIgMzQgLTRsNjggLTY4cTE1IC0xNSA0IC0zNGwtNzIgLTEwNnEtMTIgLTE3IDEwIC0yM3pNNDQ4IDEzNHE2MyAwIDEwNyA0NHQ0NCAxMDZ0LTQ0IDEwNi41dC0xMDcgNDQuNXEtNjIgMCAtMTA2IC00NC41dC00NCAtMTA2LjV0NDQgLTEwNnQxMDYgLTQ0eiIgLz4KPGdseXBoIHVuaWNvZGU9InoiIGhvcml6LWFkdi14PSI3MzYiIGQ9Ik00MzMgLTMzcTM0IDAgNTUgMjNsMTc2IDE3NmwzOSAtMzlxMTUgLTE1IDAgLTMxbC0yNTQgLTI1NHEtMTUgLTE2IC0zMSAwbC0zNTAgMzUwcS0xNSAxNSAtMTcgMzZsLTggOTdsMzM1IC0zMzVxMjMgLTIzIDU1IC0yM3pNMzUzIDY2NGwzNTAgLTM0OXExNiAtMTYgMCAtMzFsLTI1NCAtMjU1cS03IC02IC0xNiAtNnQtMTUgNmwtMzUwIDM1MHEtMTUgMTcgLTE3IDM3bC0xNyAxOTBxLTIgMjIgMTQgMzZsNDMgNDRxMTUgMTMgMzQgMTNoMyBsMTg5IC0xN3EyMiAtMiAzNiAtMTh6TTExNSA2MTdxLTE0IC0xMyAtMTQgLTMzdDE0IC0zM3ExMyAtMTMgMzMgLTEzdDMzIDEzdDEzIDMzdC0xMyAzM3EtMTQgMTQgLTMzIDE0dC0zMyAtMTR6IiAvPgo8Z2x5cGggdW5pY29kZT0ieyIgaG9yaXotYWR2LXg9Ijc2MiIgZD0iTTc1MSAyOTloLTI3OHYtNDA4aC0xODV2NDA4aC0yNzdsMzcwIDQyOHoiIC8+CjxnbHlwaCB1bmljb2RlPSJ8IiBob3Jpei1hZHYteD0iOTE1IiBkPSJNMTgyIDI4MHEtMyAtMTYgLTMgLTM1di02OXEtNTggMCAtOTguNSA0MC41dC00MC41IDk4LjV2MjQ0cTAgNTggNDAuNSA5OC41dDk4LjUgNDAuNWgzNDhxNTggMCA5OC41IC00MC41dDQwLjUgLTk4LjV2LTEwNWgtMTA0djEwNXEwIDE0IC0xMC41IDI0LjV0LTI0LjUgMTAuNWgtMzQ4cS0xNCAwIC0yNC41IC0xMC41dC0xMC41IC0yNC41di0yNDRxMCAtMTQgMTAuNSAtMjQuNXQyNC41IC0xMC41aDN6TTczNiAzODVxNTcgMCA5OCAtNDEgdDQxIC05OXYtMjQzcTAgLTU4IC00MSAtOTl0LTk4IC00MWgtMzQ4cS01OCAwIC05OC41IDQxdC00MC41IDk5djI0M3EwIDU4IDQwLjUgOTl0OTguNSA0MWgzNDh6TTc3MCAydjI0M3EwIDE1IC0xMCAyNXQtMjQgMTBoLTM0OHEtMTQgMCAtMjQuNSAtMTB0LTEwLjUgLTI1di0yNDNxMCAtMTUgMTAuNSAtMjV0MjQuNSAtMTBoMzQ4cTE0IDAgMjQgMTB0MTAgMjV6IiAvPgo8Z2x5cGggdW5pY29kZT0ifSIgaG9yaXotYWR2LXg9Ijc2MiIgZD0iTTExIDMwMWgyNzd2NDA5aDE4NXYtNDA5aDI3OGwtMzcwIC00Mjd6IiAvPgo8Z2x5cGggdW5pY29kZT0ifiIgZD0iTTQ2MCA2OTlxMTc0IDAgMjk3IC0xMjN0MTIzIC0yOTd0LTEyMyAtMjk3dC0yOTcgLTEyM3QtMjk3IDEyM3QtMTIzIDI5N3QxMjMgMjk3dDI5NyAxMjN6TTYyOCAzNHYyMzJoLTE2NmwxNDUgMTY3aC0xMTJ2MTM1aC03NXYtMTM1aC0xMTJsMTQ0IC0xNjdoLTE2MnYtMjMyaDE0NWwtMzkgLTM5aDEyNmwtMzkgMzloMTQ1ek0zMzMgNzZ2MTQ4aDI1M3YtMTQ4aC0yNTN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZmY7IiBob3Jpei1hZHYteD0iODMzIiAvPgo8Z2x5cGggaG9yaXotYWR2LXg9IjUwMCIgLz4KPC9mb250Pgo8L2RlZnM+PC9zdmc+IA==') format('svg')}.x-tab .x-button-icon:before,.x-button .x-button-icon:before{font-family:"Pictos"}.x-img.x-img-image{text-align:center}.x-img.x-img-image img{width:auto;height:100%}.x-img.x-img-background{background-repeat:no-repeat;background-position:center;background-size:auto 100%}.x-map{background-color:#edeae2}.x-map *{-webkit-box-sizing:content-box;box-sizing:content-box}.x-mask-map{background:transparent !important}.x-map-container{position:absolute !important;top:0;left:0;right:0;bottom:0}.x-mask{min-width:8.5em;position:absolute;top:0;left:0;bottom:0;right:0;height:100%;z-index:10;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;background:rgba(0,0,0,0.3) center center no-repeat}.x-mask.x-mask-gray{background-color:rgba(0,0,0,0.5)}.x-mask.x-mask-transparent{background-color:transparent}.x-mask .x-mask-inner{position:relative;background:rgba(0,0,0,0.25);color:#fff;text-align:center;padding:.4em;font-size:.95em;font-weight:bold}.x-mask .x-loading-spinner-outer{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:100%;min-width:8em;height:8em}.x-mask.x-indicator-hidden .x-mask-inner{padding-bottom:0 !important}.x-mask.x-indicator-hidden .x-loading-spinner-outer{display:none}.x-mask.x-indicator-hidden .x-mask-message{position:relative;bottom:.25em}.x-mask .x-mask-message{position:absolute;bottom:5px;color:#333;left:0;right:0;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.x-mask.x-has-message .x-mask-inner{padding-bottom:2em}.x-mask.x-has-message .x-loading-spinner-outer{height:168px}.x-ie .x-mask[visibility='visible'] ~ div:not(.x-mask) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-panel) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-floating) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-center) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-msgbox) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-mask) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-panel) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-floating) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-center) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-msgbox) .x-input-el{visibility:collapse}.x-video{height:100%;width:100%;background-color:#000}.x-video>*{height:100%;width:100%;position:absolute}.x-video-ghost{-webkit-background-size:100% auto;background:#000 url() center center no-repeat}audio{width:100%}.x-msgbox{min-width:15em;max-width:20em;max-height:90%;margin:6px;border:1px solid #ccc}.x-msgbox .x-docking-vertical{overflow:hidden}.x-msgbox .x-toolbar.x-docked-top{border-bottom:0}.x-msgbox .x-toolbar.x-docked-bottom{border-top:0}.x-ie .x-msgbox .x-dock.x-dock-horizontal.x-unsized>.x-dock-body{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px}.x-msgbox-text{text-align:center}.x-msgbox-buttons .x-button{min-width:4.5em}.x-progressindicator{width:50%;height:1.3em}.x-progressindicator .x-progressindicator-inner{background:#222222;padding:10px;height:100%;border-radius:20px;box-shadow:0px 5px 17px rgba(40,40,40,0.5);box-sizing:content-box;position:relative}.x-progressindicator .x-progressindicator-text{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:100%;height:100%;position:absolute;top:0px;left:0px;color:white;text-shadow:1px 1px 2px black}.x-progressindicator .x-progressindicator-bar{height:100%;width:0%;border-radius:10px}.x-progressindicator:not(.x-item-hidden) .x-progressindicator-bar .x-progressindicator-bar-fill{height:100%;width:100%;background-color:gray;border-radius:10px;-webkit-animation-name:progressIndicator;-moz-animation-name:progressIndicator;-ms-animation-name:progressIndicator;-o-animation-name:progressIndicator;animation-name:progressIndicator;-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;-moz-animation-timing-function:linear;-ms-animation-timing-function:linear;-o-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;-o-animation-iteration-count:infinite;animation-iteration-count:infinite;background-repeat:repeat-x;background-size:30px 30px;background-image:-webkit-linear-gradient(135deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-image:-moz-linear-gradient(135deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-image:-o-linear-gradient(135deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-image:-ms-linear-gradient(-45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}@-webkit-keyframes progressIndicator{to{background-position:30px}}@-moz-keyframes progressIndicator{to{background-position:30px}}@keyframes progressIndicator{to{background-position:30px}}.x-panel,.x-msgbox{position:relative}.x-panel.x-floating,.x-msgbox,.x-form.x-floating{padding:6px;background-color:#ccc}.x-panel.x-floating .x-panel-inner,.x-panel.x-floating>.x-body,.x-msgbox .x-panel-inner,.x-msgbox>.x-body,.x-form.x-floating .x-panel-inner,.x-form.x-floating>.x-body{z-index:1;background-color:#fff}.x-panel.x-floating>.x-dock,.x-msgbox>.x-dock,.x-form.x-floating>.x-dock{z-index:1}.x-panel.x-floating>.x-dock.x-sized,.x-msgbox>.x-dock.x-sized,.x-form.x-floating>.x-dock.x-sized{margin:6px}.x-sheet,.x-sheet-action{height:auto}.x-toolbar{position:relative;background-color:#eee;min-height:2.6em;overflow:hidden}.x-toolbar.x-docked-top{border-bottom:1px solid}.x-toolbar.x-docked-bottom{border-top:1px solid}.x-toolbar.x-docked-left{width:50px;height:auto;border-right:1px solid}.x-toolbar.x-docked-right{width:50px;height:auto;border-left:1px solid}.x-title{font-size:1.2em;text-align:center;font-weight:bold;max-width:100%}.x-title.x-title-align-left{padding-left:10px}.x-title.x-title-align-right{padding-right:10px}.x-title .x-innerhtml{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-navigation-bar .x-container{overflow:visible}.x-toolbar-inner .x-field .x-component-outer{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto}.x-ie .x-toolbar-inner{height:100% !important}.x-toast{min-width:15em;max-width:20em;max-height:90%;margin:6px}.x-toast .x-toast-text{text-align:center}.x-ie .x-toast .x-dock.x-dock-horizontal.x-unsized>.x-dock-body{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px}.x-menu{background:#eee}.x-carousel-inner{position:relative;overflow:hidden}.x-carousel-item,.x-carousel-item>*{position:absolute !important;width:100%;height:100%}.x-carousel-indicator{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.x-carousel-indicator span{display:block;width:10px;height:10px;margin:3px;background-color:#eee}.x-carousel-indicator span.x-carousel-indicator-active{background-color:#ccc}.x-carousel-indicator-horizontal{width:100%}.x-carousel-indicator-vertical{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;height:100%}.x-android-3 .x-surface-wrap,.x-android-3 .x-surface-wrap>*{-webkit-perspective:1}.x-draw-component{position:relative}.x-draw-component .x-inner{overflow:hidden}.x-surface{position:absolute}.x-chart-watermark{opacity:0.5;z-index:9;right:0;bottom:0;background:rgba(0,0,0,0.5);color:white;padding:4px 6px;font-family:"Helvetica";font-size:12px;position:absolute;border-top-left-radius:4px;white-space:nowrap;-webkit-border-top-left-radius:4px}.x-legend .x-legend-inner .x-legend-container{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:1px solid #ccc;background:#fff}.x-legend .x-legend-inner .x-legend-container .x-legend-item{padding:0.8em 1em 0.8em 1.8em;color:#333;background:rgba(255,255,255,0);max-width:20em;min-width:0;font-size:14px;line-height:14px;font-weight:bold;white-space:nowrap;position:relative}.x-legend .x-legend-inner .x-legend-container .x-legend-item .x-legend-inactive{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=30);opacity:.3}.x-legend .x-legend-inner .x-legend-container .x-legend-item .x-legend-item-marker{position:absolute;width:.8em;height:.8em;-moz-border-radius:.4em;-webkit-border-radius:.4em;border-radius:.4em;-moz-box-shadow:rgba(255,255,255,0.3) 0 1px 0,rgba(0,0,0,0.4) 0 1px 0 inset;-webkit-box-shadow:rgba(255,255,255,0.3) 0 1px 0,rgba(0,0,0,0.4) 0 1px 0 inset;box-shadow:rgba(255,255,255,0.3) 0 1px 0,rgba(0,0,0,0.4) 0 1px 0 inset;left:.7em;top:1em}.x-legend.x-docked-top .x-legend-item,.x-legend.x-docked-bottom .x-legend-item{border-right:1px solid rgba(204,204,204,0.5)}.x-legend.x-docked-top .x-legend-item:last-child,.x-legend.x-docked-bottom .x-legend-item:last-child{border-right:0}.x-legend.x-docked-left .x-legend-inner,.x-legend.x-docked-right .x-legend-inner{display:-webkit-box;-webkit-box-align:center;-webkit-box-pack:center}.x-chart-toolbar{position:absolute;z-index:9;display:-webkit-box;display:-moz-box;display:-ms-box;display:box;padding:.6em}.x-chart-toolbar .x-button{margin:.2em}.x-chart-toolbar[data-side=left],.x-chart-toolbar[data-side=right]{top:0;-webkit-box-orient:vertical;-moz-box-orient:vertical;-ms-box-orient:vertical;box-orient:vertical}.x-chart-toolbar[data-side=left]{left:0}.x-chart-toolbar[data-side=right]{right:0}.x-chart-toolbar[data-side=top],.x-chart-toolbar[data-side=bottom]{-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-ms-box-orient:horizontal;box-orient:horizontal;right:0}.x-chart-toolbar[data-side=top]{top:0}.x-chart-toolbar[data-side=bottom]{bottom:0;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-ms-box-orient:horizontal;box-orient:horizontal}.x-tab .x-button-icon.list:before,.x-button .x-button-icon.list:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"l"}.x-tab .x-button-icon.expand:before,.x-button .x-button-icon.expand:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"`"}.x-dataview-inlineblock .x-dataview-item,.x-dataview-inlineblock .x-data-item{display:inline-block !important}.x-dataview-nowrap .x-dataview-container{white-space:nowrap !important}.x-dataview-nowrap .x-container.x-dataview{white-space:nowrap !important}.x-list{overflow:hidden}.x-list .x-scroll-scroller{max-width:100%}.x-list .x-list-inner{width:100% !important}.x-list.x-list-indexed .x-list-disclosure{margin-right:50px}.x-list .x-item-selected .x-list-disclosure{background-color:#fff}.x-list .x-list-scrolldock-hidden{display:none}.x-list .x-list-item{position:absolute !important;left:0;top:0;width:100%}.x-list .x-list-item>.x-dock{height:auto}.x-list .x-list-item .x-dock-horizontal{border-top:1px solid #ccc}.x-list .x-list-item.x-item-selected .x-dock-horizontal,.x-list .x-list-item.x-item-selected.x-list-item-tpl{background-color:#ccc}.x-list .x-list-item.x-item-pressed.x-list-item-tpl,.x-list .x-list-item.x-item-pressed .x-dock-horizontal{background-color:#ddd}.x-list .x-list-item .x-list-item-body,.x-list .x-list-item.x-list-item-tpl .x-innerhtml{padding:5px}.x-list .x-list-item.x-list-item-relative{position:relative !important}.x-list .x-list-header{background-color:#eee;border-top:1px solid #ccc;border-bottom:1px solid #ccc;font-weight:bold}.x-list .x-list-header.x-list-item-relative{position:relative !important}.x-list .x-list-disclosure{margin:5px 15px 5px 0;overflow:visible;width:20px;height:20px;border:1px solid #ccc;background-color:#eee}.x-list .x-list-item-tpl .x-list-disclosure{position:absolute;right:0px;top:0px}.x-list .x-list-emptytext{text-align:center;pointer-events:none;font-color:#333333;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-list.x-list-indexed .x-list-disclosure{margin-right:35px}.x-list .x-list-scrolldockitem{position:absolute !important;left:0;top:0;width:100%}.x-ie .x-list-grouped .x-translatable-container .x-list-item:before,.x-ie .x-list-grouped .x-translatable-container .x-list-header:before{content:". .";color:transparent;position:absolute;left:0px;word-spacing:3000px;opacity:0}.x-list-header{position:absolute;left:0;width:100%;z-index:2 !important}.x-ios .x-list-header{-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.x-list-grouped .x-list-item.x-list-header-wrap .x-dock-horizontal,.x-list-grouped .x-list-item-tpl.x-list-header-wrap{border-top:0}.x-list-inlineblock .x-list-item{display:inline-block !important}.x-list-nowrap .x-list-inner{width:auto}.x-list-nowrap .x-list-container{white-space:nowrap !important}.x-list-item-dragging{border-bottom:1px solid #ccc;background:#fff !important;z-index:1}.x-indexbar-wrapper{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important;pointer-events:none}.x-indexbar{pointer-events:auto;z-index:2;min-height:0 !important;height:auto !important;-webkit-box-flex:0 !important;-ms-flex:0 0 auto !important;flex:0 0 auto !important}.x-indexbar>div{font-size:0.6em;text-align:center;line-height:1.1em;font-weight:bold;display:block}.x-indexbar-vertical{width:15px;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;margin-right:15px}.x-indexbar-horizontal{height:15px;-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.x-phone.x-landscape .x-indexbar>div{font-size:0.38em;line-height:1em}.x-indexbar-pressed{background-color:#ccc}.x-form-label{display:none !important}.x-form-label span{font-weight:bold}.x-form-label-nowrap .x-form-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-field{display:flex;display:-webkit-box;display:-ms-flexbox}.x-field .x-field-input{position:relative;min-width:3.7em}.x-field .x-field-input,.x-field .x-input-el{width:100%}.x-field.x-field-labeled .x-form-label{display:block !important}.x-field .x-component-outer{position:relative}.x-label-align-left,.x-label-align-right{-webkit-box-orient:horizontal !important;-ms-flex-direction:row !important;flex-direction:row !important}.x-label-align-left .x-component-outer,.x-label-align-right .x-component-outer{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px}.x-label-align-right{-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.x-label-align-top,.x-label-align-bottom{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-label-align-bottom{-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.x-input-el{display:block}.x-field-mask{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-ie .x-field.x-field-text .x-field-mask,.x-ie .x-field.x-field-textarea .x-field-mask,.x-ie .x-field.x-field-search .x-field-mask{z-index:-1}.x-field-required .x-form-label:after{content:"*";display:inline}.x-spinner .x-component-outer{display:flex;display:-webkit-box;display:-ms-flexbox}.x-spinner .x-component-outer>*{width:auto}.x-spinner .x-field-input{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px}.x-spinner .x-field-input .x-input-el{width:100%;text-align:center}.x-spinner .x-field-input input::-webkit-outer-spin-button,.x-spinner .x-field-input input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.x-spinner .x-spinner-button{text-align:center;border:1px solid #ccc !important;background-color:#eee}.x-spinner.x-field-grouped-buttons .x-input-el{text-align:left}.x-select-overlay .x-list-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}.x-field-number input::-webkit-outer-spin-button,.x-field-number input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.x-field-input .x-clear-icon,.x-field-input .x-reveal-icon{display:none;width:10px;height:10px;background-color:#ccc;position:absolute;top:50%;right:0}.x-field-clearable .x-clear-icon{display:block}.x-field-clearable .x-field-input{padding-right:10px}.x-field-revealable .x-reveal-icon{display:block}.x-field-revealable .x-field-input{padding-right:10px}.x-field-clearable.x-field-revealable .x-reveal-icon{right:20px}.x-android .x-input-el{-webkit-text-fill-color:#000}.x-android .x-empty .x-input-el{-webkit-text-fill-color:#A9A9A9}.x-android .x-item-disabled .x-input-el{-webkit-text-fill-color:#b3b3b3}.x-form-fieldset .x-form-fieldset-inner{border:1px solid #ccc;overflow:hidden}.x-form-fieldset .x-dock .x-dock-body{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto}.x-form-fieldset-title{font-weight:bold}.x-form-fieldset-title .x-innerhtml{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-form-fieldset-instructions{text-align:center}.x-ie .x-field-select .x-field-mask{z-index:3}.x-sheet.x-picker{padding:0}.x-sheet.x-picker .x-sheet-inner{background-color:#fff;overflow:hidden}.x-sheet.x-picker .x-sheet-inner .x-picker-slot .x-body{border-left:1px solid #999999;border-right:1px solid #ACACAC}.x-sheet.x-picker .x-sheet-inner .x-picker-slot.x-first .x-body{border-left:0}.x-sheet.x-picker .x-sheet-inner .x-picker-slot.x-last .x-body{border-left:0;border-right:0}.x-picker-slot .x-scroll-view{z-index:2;position:relative}.x-picker-mask{position:absolute;top:0;left:0;right:0;bottom:0;z-index:3;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;pointer-events:none}.x-picker-slot-title{position:relative;z-index:2}.x-picker-slot-title>div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:bold}.x-picker-slot .x-dataview-inner{width:100% !important}.x-picker-slot .x-dataview-item{vertical-align:middle;height:30px;line-height:30px}.x-picker-slot .x-dataview-item.x-item-selected{font-weight:bold}.x-picker-slot .x-picker-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-ie .x-picker-item{cursor:default}.x-ie .x-picker-item::before{content:". .";color:transparent;position:absolute;left:0px;word-spacing:3000px}.x-picker-right{text-align:right}.x-picker-center{text-align:center}.x-picker-left{text-align:left}.x-list-paging .x-loading-spinner{display:none;margin:auto}.x-list-paging .x-list-paging-msg{text-align:center;clear:both}.x-list-paging.x-loading .x-loading-spinner{display:block}.x-list-paging.x-loading .x-list-paging-msg{display:none}.x-list-pullrefresh{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;position:absolute;top:-5em;left:0;width:100%;height:4.5em}.x-list-pullrefresh .x-loading-spinner{display:none}.x-list-pullrefresh-arrow{width:2.5em;height:4.5em;background-color:#bbb}.x-list-pullrefresh-wrap{width:20em;font-size:0.7em}.x-list-pullrefresh-message{font-weight:bold;font-size:1.3em;text-align:center}.x-list-pullrefresh-updated{text-align:center}.x-list-pullrefresh-loading *.x-loading-spinner{display:block}.x-list-pullrefresh-loading .x-list-pullrefresh-arrow{display:none}.x-android-2 .x-list-pullrefresh-loading *.x-loading-spinner{display:none}.x-slider,.x-toggle{position:relative;height:16px;min-height:0;min-width:0}.x-slider>*,.x-toggle>*{position:absolute;width:100%;height:100%}.x-thumb{position:absolute;height:16px;width:10px;border:1px solid #ccc;background-color:#ddd}.x-slider:before{content:'';position:absolute;width:auto;height:8px;top:4px;left:0;right:0;margin:0 5px;background-color:#eee}.x-toggle{border:1px solid #ccc;width:30px;overflow:hidden;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.x-toggle-on{background-color:#eee}.x-tab{z-index:1;overflow:visible !important;background-color:#eee;border:1px solid #ccc}.x-tabbar{border-color:#ccc;border-style:solid;border-width:0;background-color:#eee}.x-tabbar.x-docked-top{border-bottom-width:1px}.x-tabbar.x-docked-top .x-tab .x-button-icon{position:relative}.x-tabbar.x-docked-top .x-tab .x-button-icon.x-shown{display:inline-block}.x-tabbar.x-docked-top .x-tab .x-button-icon.x-hidden{display:none}.x-tabbar.x-docked-bottom{border-top-width:1px}.x-tabbar.x-docked-bottom .x-tab .x-button-icon{display:block;position:relative}.x-tabbar.x-docked-bottom .x-tab .x-button-icon.x-shown{visibility:visible}.x-tabbar.x-docked-bottom .x-tab .x-button-icon.x-hidden{visibility:hidden}.x-tab{position:relative;min-width:3.3em}.x-table-inner{display:table !important;width:100% !important;height:100% !important}.x-table-inner.x-fixed-layout{table-layout:fixed !important}.x-table-row{display:table-row !important}.x-table-cell{display:table-cell !important;vertical-align:middle}.x-orientation-inspector{display:none;content:"landscape"}@media (orientation: portrait){.x-orientation-inspector{content:"portrait"}}.x-grid .x-grid-header-container{border-width:0 1px 1px 0;border-style:solid;height:65px;font-weight:bold;overflow:hidden}.x-grid .x-grid-header-container .x-grid-column{display:inline-block}.x-grid .x-grid-header-container .x-grid-header-container-inner{width:100000px;position:absolute;top:0;left:0}.x-grid .x-grid-column{height:64px;border-width:1px 1px 0 1px;border-style:solid;line-height:64px;vertical-align:middle;padding:0 8px}.x-grid .x-grid-column .x-innerhtml{display:inline-block;width:auto;position:relative}.x-grid .x-grid-column.x-column-sorted-asc .x-innerhtml:after,.x-grid .x-grid-column.x-column-sorted-desc .x-innerhtml:after{position:absolute;width:12px;line-height:64px;top:0;height:64px;font-family:'Pictos';font-size:12px}.x-grid .x-grid-column.x-column-align-left .x-innerhtml:after,.x-grid .x-grid-column.x-column-align-center .x-innerhtml:after{right:-16px}.x-grid .x-grid-column.x-column-align-right .x-innerhtml:after{left:-16px}.x-grid .x-grid-column.x-column-sorted-asc .x-innerhtml:after{content:"{"}.x-grid .x-grid-column.x-column-sorted-desc .x-innerhtml:after{content:"}"}.x-grid .x-grid-headergroup{display:inline-block;position:relative;vertical-align:bottom;height:64px;padding-top:32px}.x-grid .x-grid-headergroup .x-inner>.x-innerhtml{height:32px;line-height:28px;vertical-align:middle;display:block;position:absolute;width:100%;top:0;left:0;text-align:center;border-style:solid;border-width:1px;overflow:hidden;text-overflow:ellipsis}.x-grid .x-grid-headergroup .x-grid-column{height:32px !important;line-height:27px !important;font-size:0.7em}.x-grid .x-grid-headergroup .x-grid-column.x-column-sorted-asc .x-innerhtml:after,.x-grid .x-grid-headergroup .x-grid-column.x-column-sorted-desc .x-innerhtml:after{line-height:27px;height:27px}.x-grid .x-grid-row{position:absolute;left:0;top:0;border-width:0 0 1px 0;border-style:solid}.x-grid .x-grid-cell{display:inline-block;vertical-align:middle;line-height:60px;padding:0 8px;height:60px;overflow:hidden;border-width:0 1px 0 0}.x-grid .x-grid-cell-align-center,.x-grid .x-grid-column-align-center{text-align:center}.x-grid .x-grid-cell-align-right,.x-grid .x-grid-column-align-right{text-align:right}.x-grid .x-grid-viewoptions{border-width:0 0 0 1px;border-style:solid}.x-grid .x-grid-viewoptions .x-list-item .x-innerhtml{padding:0px !important}.x-grid .x-grid-viewoptions .x-column-options-header{height:32px;line-height:28px;vertical-align:middle;border-style:solid;border-width:1px;overflow:hidden;padding-left:10px}.x-grid .x-grid-viewoptions .x-column-options-sortablehandle,.x-grid .x-grid-viewoptions .x-column-options-visibleindicator,.x-grid .x-grid-viewoptions .x-column-options-groupindicator,.x-grid .x-grid-viewoptions .x-column-options-folder,.x-grid .x-grid-viewoptions .x-column-options-leaf{width:40px;height:48px;position:absolute;bottom:0}.x-grid .x-grid-viewoptions .x-column-options-sortablehandle:after,.x-grid .x-grid-viewoptions .x-column-options-visibleindicator:after,.x-grid .x-grid-viewoptions .x-column-options-groupindicator:after,.x-grid .x-grid-viewoptions .x-column-options-folder:after,.x-grid .x-grid-viewoptions .x-column-options-leaf:after{position:absolute;top:0;left:0;height:100%;width:100%;text-align:center;font-size:24px;font-family:'Pictos';line-height:48px;content:"l";vertical-align:middle}.x-grid .x-grid-viewoptions .x-column-options-sortablehandle{left:0}.x-grid .x-grid-viewoptions .x-column-options-sortablehandle:after{line-height:54px}.x-grid .x-grid-viewoptions .x-column-options-visibleindicator{right:0}.x-grid .x-grid-viewoptions .x-column-options-visibleindicator:after{font-size:30px;line-height:54px;content:"E"}.x-grid .x-grid-viewoptions .x-column-options-groupindicator{right:40px}.x-grid .x-grid-viewoptions .x-column-options-groupindicator:after{font-size:30px;line-height:54px;content:"g"}.x-grid .x-grid-viewoptions .x-column-options-folder,.x-grid .x-grid-viewoptions .x-column-options-leaf{width:30px;left:40px}.x-grid .x-grid-viewoptions .x-column-options-folder:after,.x-grid .x-grid-viewoptions .x-column-options-leaf:after{line-height:52px;content:"o"}.x-grid .x-grid-viewoptions .x-column-options-leaf:after{content:"F"}.x-grid .x-grid-viewoptions .x-list-item.x-item-selected.x-list-item-tpl{background:transparent}.x-grid .x-grid-viewoptions .x-list-item.x-item-selected.x-list-item-tpl .x-innerhtml{background:transparent}.x-grid .x-grid-viewoptions .x-column-options-text{display:block;height:30px;margin:10px 50px 5px 80px;position:relative;vertical-align:middle;line-height:28px}.x-grid .x-grid-columnoptions{border-width:0 0 1px}.x-grid .x-grid-multiselection-column{position:relative;padding:0}.x-grid .x-grid-multiselection-column:after{position:absolute;top:0;left:0;width:60px;height:64px;line-height:64px;font-family:'Pictos';font-size:26px;text-align:center;content:"2"}.x-grid .x-grid-multiselection-cell{position:relative;padding:0}.x-grid .x-grid-multiselection-cell:after{position:absolute;top:0;left:0;width:60px;height:60px;line-height:60px;font-family:'Pictos';font-size:20px;text-align:center;content:"_"}.x-grid .x-item-selected .x-grid-multiselection-cell:after{content:"3"}.x-grid .x-grid-pagingtoolbar>.x-body{padding:0 30px 0 50px}.x-grid .x-grid-pagingtoolbar-currentpage{position:relative;height:22px}.x-grid .x-grid-pagingtoolbar-currentpage span{position:absolute;right:0;top:0;line-height:22px;height:22px}.x-grid .x-grid-summaryrow{height:32px;font-size:0.8em;position:relative}.x-grid .x-grid-summaryrow .x-grid-cell{height:32px;line-height:30px;border-width:0 0 1px;border-style:solid}.x-grid .x-grid-summaryrow .x-grid-multiselection-cell:after{content:''}.x-ie .x-grid-grouped .x-translatable-container .x-grid-row:before,.x-ie .x-grid-grouped .x-translatable-container .x-grid-header:before{content:". .";color:transparent;position:absolute;left:0px;word-spacing:3000px;opacity:0}.x-grid-header{line-height:44px;font-weight:bold;position:absolute;left:0;width:100%;z-index:2 !important}.x-ios .x-grid-header{-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.x-grid-grouped .x-grid-row.x-grid-header-wrap .x-dock-horizontal,.x-grid-grouped .x-grid-row-tpl.x-grid-header-wrap{border-top:0}.x-scroll-view{position:relative;display:block;overflow:hidden}.x-scroll-container{position:absolute;width:100%;height:100%}.x-scroll-scroller{position:absolute;min-width:100%;min-height:100%;height:auto !important;width:auto !important}.x-scroll-stretcher{position:absolute;visibility:hidden}.x-scroll-bar-grid-wrapper{position:absolute;width:100%;height:100%}.x-scroll-bar-grid{display:table;width:100%;height:100%}.x-scroll-bar-grid>*{display:table-row}.x-scroll-bar-grid>*>*{display:table-cell}.x-scroll-bar-grid>:first-child>:first-child{width:100%;height:100%}.x-scroll-bar-grid>:first-child>:nth-child(2){padding:3px 3px 0 0}.x-scroll-bar-grid>:nth-child(2)>:first-child{padding:0 0 3px 3px}.x-scroll-bar{position:relative;overflow:hidden}.x-scroll-bar-stretcher{position:absolute;visibility:hidden;width:100%;height:100%}.x-scroll-bar-x{width:100%}.x-scroll-bar-x>.x-scroll-bar-stretcher{width:300%}.x-scroll-bar-x.active{height:6px}.x-scroll-bar-y{height:100%}.x-scroll-bar-y>.x-scroll-bar-stretcher{height:300%}.x-scroll-bar-y.active{width:6px}.x-scroll-indicator{background:#333;position:absolute;z-index:3}.x-scroll-indicator-x{height:100%}.x-scroll-indicator-y{width:100%}.x-scroll-indicator.rounded{background:none}.x-scroll-indicator.rounded>*{position:absolute;background-color:#333}.x-scroll-indicator.rounded>:nth-child(2){-webkit-transform-origin:0% 0%;background:none;content:url(data:image/bmp;base64,Qk08AAAAAAAAADYAAAAoAAAAAQAAAAEAAAABABAAAAAAAAYAAAASCwAAEgsAAAAAAAAAAAAAxhgAAAAA)}.x-scroll-indicator.rounded.x-scroll-indicator-light>*{background-color:#eee}.x-scroll-indicator.rounded.x-scroll-indicator-light>:nth-child(2){content:url(data:image/bmp;base64,Qk08AAAAAAAAADYAAAAoAAAAAQAAAAEAAAABABAAAAAAAAYAAAASCwAAEgsAAAAAAAAAAAAAvXcAAAAA)}.x-scroll-indicator.rounded.x-scroll-indicator-y>*{width:100%}.x-scroll-indicator.rounded.x-scroll-indicator-y>:first-child{height:3px;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px}.x-scroll-indicator.rounded.x-scroll-indicator-y>:nth-child(2){height:1px}.x-scroll-indicator.rounded.x-scroll-indicator-y>:last-child{height:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.x-scroll-indicator.rounded.x-scroll-indicator-x>*{height:100%}.x-scroll-indicator.rounded.x-scroll-indicator-x>:first-child{width:3px;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px}.x-scroll-indicator.rounded.x-scroll-indicator-x>:nth-child(2){width:1px}.x-scroll-indicator.rounded.x-scroll-indicator-x>:last-child{width:3px;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.x-list-light .x-scroll-indicator,.x-dataview-light .x-scroll-indicator{background:#fff}.x-ios .x-scroll-scroller{-webkit-transform:translate3d(0, 0, 0)}.x-ie .x-scroll-bar-y{position:absolute;margin-left:-5px}html,body{font-family:"Helvetica Neue",HelveticaNeue,"Helvetica-Neue",Helvetica,"BBAlpha Sans",sans-serif}.x-ios.x-tablet .x-landscape *{-webkit-text-stroke:1px transparent}body{font-size:104%}body.x-android.x-phone{font-size:116%}body.x-ios.x-phone{font-size:114%}body.x-desktop{font-size:114%}.x-layout-card-item{background:#eee}.x-loading-spinner{font-size:250%;height:1em;width:1em;position:relative;-webkit-transform-origin:.5em .5em;transform-origin:.5em .5em}.x-loading-spinner>span,.x-loading-spinner>span:before,.x-loading-spinner>span:after{display:block;position:absolute;width:.1em;height:.25em;top:0;-webkit-transform-origin:.05em .5em;transform-origin:.05em .5em;content:" "}.x-loading-spinner>span{left:50%;margin-left:-0.05em}.x-loading-spinner>span.x-loading-top{background-color:rgba(170,170,170,0.99)}.x-loading-spinner>span.x-loading-top::after{background-color:rgba(170,170,170,0.9)}.x-loading-spinner>span.x-loading-left::before{background-color:rgba(170,170,170,0.8)}.x-loading-spinner>span.x-loading-left{background-color:rgba(170,170,170,0.7)}.x-loading-spinner>span.x-loading-left::after{background-color:rgba(170,170,170,0.6)}.x-loading-spinner>span.x-loading-bottom::before{background-color:rgba(170,170,170,0.5)}.x-loading-spinner>span.x-loading-bottom{background-color:rgba(170,170,170,0.4)}.x-loading-spinner>span.x-loading-bottom::after{background-color:rgba(170,170,170,0.35)}.x-loading-spinner>span.x-loading-right::before{background-color:rgba(170,170,170,0.3)}.x-loading-spinner>span.x-loading-right{background-color:rgba(170,170,170,0.25)}.x-loading-spinner>span.x-loading-right::after{background-color:rgba(170,170,170,0.2)}.x-loading-spinner>span.x-loading-top::before{background-color:rgba(170,170,170,0.15)}.x-loading-spinner>span.x-loading-top{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg)}.x-loading-spinner>span.x-loading-right{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg)}.x-loading-spinner>span.x-loading-bottom{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg)}.x-loading-spinner>span.x-loading-left{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg)}.x-loading-spinner>span::before{-webkit-transform:rotate(30deg);-moz-transform:rotate(30deg);-ms-transform:rotate(30deg)}.x-loading-spinner>span::after{-webkit-transform:rotate(-30deg);-moz-transform:rotate(-30deg);-ms-transform:rotate(-30deg)}.x-loading-spinner{-webkit-animation-name:x-loading-spinner-rotate;-webkit-animation-duration:.5s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-name:x-loading-spinner-rotate;animation-duration:.5s;animation-timing-function:linear;animation-iteration-count:infinite}html,body{font-family:"Helvetica Neue",HelveticaNeue,"Helvetica-Neue",Helvetica,"BBAlpha Sans",sans-serif}.x-ios.x-tablet .x-landscape *{-webkit-text-stroke:1px transparent}body{font-size:104%}body.x-android.x-phone{font-size:116%}body.x-ios.x-phone{font-size:114%}body.x-desktop{font-size:114%}.x-layout-card-item{background:#eee}.x-button{-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-background-clip:padding;background-clip:padding-box;-moz-border-radius:.4em;-webkit-border-radius:.4em;border-radius:.4em;min-height:1.8em;padding:.3em .6em}.x-button,.x-toolbar .x-button{border:1px solid #999;border-top-color:#a6a6a6;background-color:#ccc;color:#000}.x-button.x-button-back:before,.x-button.x-button-forward:before,.x-toolbar .x-button.x-button-back:before,.x-toolbar .x-button.x-button-forward:before{background:#999}.x-button,.x-button.x-button-back:after,.x-button.x-button-forward:after,.x-toolbar .x-button,.x-toolbar .x-button.x-button-back:after,.x-toolbar .x-button.x-button-forward:after{background-image:none;background-color:#ccc;background-image:-webkit-linear-gradient(top, #f2f2f2,#d9d9d9 3%,#bfbfbf);background-image:-moz-linear-gradient(top, #f2f2f2,#d9d9d9 3%,#bfbfbf);background-image:-o-linear-gradient(top, #f2f2f2,#d9d9d9 3%,#bfbfbf);background-image:-ms-linear-gradient(to bottom, #f2f2f2,#d9d9d9 3%,#bfbfbf)}.x-button.x-button-pressing,.x-button.x-button-pressing:after,.x-button.x-button-pressed,.x-button.x-button-pressed:after,.x-button.x-button-active,.x-button.x-button-active:after,.x-toolbar .x-button.x-button-pressing,.x-toolbar .x-button.x-button-pressing:after,.x-toolbar .x-button.x-button-pressed,.x-toolbar .x-button.x-button-pressed:after,.x-toolbar .x-button.x-button-active,.x-toolbar .x-button.x-button-active:after{background-image:none;background-color:#c4c4c4;background-image:-webkit-linear-gradient(top, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6);background-image:-moz-linear-gradient(top, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6);background-image:-o-linear-gradient(top, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6);background-image:-ms-linear-gradient(to bottom, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6)}.x-button .x-button-icon{width:1.5em;height:1.5em}.x-button .x-button-icon:before{font-size:1.6em;line-height:1em}.x-button.x-item-disabled .x-button-label,.x-button.x-item-disabled .x-badge,.x-button.x-item-disabled .x-button-icon{opacity:.5}.x-button-round{-moz-border-radius:.9em;-webkit-border-radius:.9em;border-radius:.9em}.x-ie .x-button{height:0px}.x-ie .x-button .x-button-label,.x-ie .x-button .x-badge{overflow:visible}.x-iconalign-left .x-button-label,.x-iconalign-left .x-badge{margin-left:.6em}.x-iconalign-right .x-button-label,.x-iconalign-right .x-badge{margin-right:.6em}.x-iconalign-top,.x-iconalign-bottom{padding-top:.2em !important;padding-bottom:.2em !important}.x-button-label,.x-badge,.x-hasbadge .x-badge{font-weight:bold;line-height:1.2em;font-family:"Helvetica Neue",HelveticaNeue,"Helvetica-Neue",Helvetica,"BBAlpha Sans",sans-serif;font-size:1em}.x-toolbar .x-button{margin:6px .2em;padding:0 .6em}.x-toolbar .x-button .x-button-label,.x-toolbar .x-button .x-badge{font-size:.7em}.x-toolbar .x-button .x-button-label,.x-toolbar .x-button .x-badge,.x-toolbar .x-button .x-hasbadge .x-badge{line-height:1.6em}.x-toolbar .x-button .x-button-icon:before{font-size:1.3em;line-height:1.3em}.x-ie .x-toolbar .x-button .x-button-icon::before{font-size:.6em;line-height:1em}.x-button-small,.x-toolbar .x-button-small{-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em;padding:.2em .4em;min-height:0}.x-button-small .x-button-label,.x-button-small .x-badge,.x-toolbar .x-button-small .x-button-label,.x-toolbar .x-button-small .x-badge{font-size:.6em}.x-button-small .x-button-icon,.x-toolbar .x-button-small .x-button-icon{width:.75em;height:.75em}.x-button-forward,.x-button-back{position:relative;overflow:visible;height:1.7em;z-index:1}.x-webkit .x-button-forward:before,.x-webkit .x-button-forward:after,.x-webkit .x-button-back:before,.x-webkit .x-button-back:after{content:'';position:absolute;width:15px;height:auto;top:-2px;left:auto;bottom:-2px;z-index:2;-webkit-mask:4px 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAABGCAYAAADb7SQ4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAiNJREFUeNrEWb9LQlEUvj5BcHoQvMnVKXD1D3CLwqBJbHJsazQaWoSCxgbHJiMIAiNok6AhCDdXVycnJ8EQOgeOYaG+d39998KH+HyP753zzjnfd325xfdSgVeV8B6BScuEV0IRSbxHeCMk/AVFXCA8ScQKSXxPqK0fQBBfE5r/D+Y8VzUT9jb94DPimqRYIYkrhGcpKhhxIqTxrpNcExdlQJTTTnRJnCc8ykhUSOIOoZ71ZFfEZ4S2zgUu+rguxZRHEnPbfKRVsOtUl0RtYpOLTYljIS2Z3nVk2DY9SbNCEt8RDm0rUpe4La1jvXSqmtum72raZI24KuNQIYl/nSGSOJb0Jq61M0pxhjwK9304hUjHGSKILzc5Q5drUzttdYY+I97pDH1FzG0zNFUb04gTG4kzJS5kdYauiZtZnaFr4ooKsCIVaDHxKAQxt1NBnGIVHfGCcEQYh3jGU8KBfMKLiyM+lgzAq/qT0ArVTg+Ei1B9fEPoovV4fcfQd2HedScX39GprwGTNjJn0maTELN6IuSzECLB6T5x2eM66jQgnIeSxa60GnS3uL56tr7b1Ai0JPVwYi6yho2U2lgfKym19VxjMRHzEGbvS9K+RBPzetGVUpf29lZHSl2/DMnLvwh1ZMQrKW3Ic4fvJOZS6ZMQW5hpmpT63DvtlFLfm7bBNruM2C2yXb7y3U6ZpRS5P/4jpUjihRTbCJ3q1eL3GMMfAQYAJmB6SBO619IAAAAASUVORK5CYII=') no-repeat;-webkit-mask-size:15px 100%;overflow:hidden}.x-webkit .x-button-back,.x-webkit .x-toolbar .x-button-back{margin-left:.77217em;padding-left:.4em}.x-webkit .x-button-back:before,.x-webkit .x-toolbar .x-button-back:before{left:-15px}.x-webkit .x-button-back:after,.x-webkit .x-toolbar .x-button-back:after{left:-14px}.x-webkit .x-button-forward,.x-webkit .x-toolbar .x-button-forward{margin-right:.78217em;padding-right:.4em}.x-webkit .x-button-forward:before,.x-webkit .x-button-forward:after,.x-webkit .x-toolbar .x-button-forward:before,.x-webkit .x-toolbar .x-button-forward:after{-webkit-mask:-4px 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAABGCAYAAADb7SQ4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXlJREFUaN7lmTFqAlEQhh8EhFSCYJXW1law9QAewMrWAwQWAmmtbPcGHiCQ1gPYCla2QsDKSsgmQecvFqImu2/fzry/2OLb9mt23vwz47Kvn5MwEFxM8DkLB6HHEIOd0GGIwUpoMcRgyRKDOUsMJizxpzBiiMFR6DPEeZl1GWKwFh4ZYvAmPDDEqmVWVQxmLPG3MGaIVcosVAz2whNDDDZCmyEG7yFlpiEGKUsMEpb4XKXMtMXeiVVb7J1YLcRgW1ZmVuLSxGopLkys1mLwwhL/mVhjie8Sayxx3kp7DPFVYo0tzhNriyEGU5Z40TjxtDE/F6WcDowHBE/msDFNImG0xZQRBAonDCvxhhH2vKZIZ9Ds+7EDfaWFnKZ4xhja5owxdcnYCAQv1p1Gi4sprn08cZbDt6ZYZasXIn5mLFHTjLCvVt1V+4rVt/M+4r3FPaJMbHaBKRKb3pyKxKZXtv/Er4yjZpRL6q042u34tzh4xV9H/FHnqBHKBQeEd6aqqwD6AAAAAElFTkSuQmCC') no-repeat;-webkit-mask-size:15px 100%}.x-webkit .x-button-forward:before,.x-webkit .x-toolbar .x-button-forward:before{right:-15px}.x-webkit .x-button-forward:after,.x-webkit .x-toolbar .x-button-forward:after{right:-14px}.x-button.x-button-plain,.x-toolbar .x-button.x-button-plain{background:none;border:0 none;min-height:0;text-shadow:none;line-height:auto;height:1.9em;padding:0 0.5em;-moz-border-radius:none;-webkit-border-radius:none;border-radius:none}.x-button.x-button-plain>*,.x-toolbar .x-button.x-button-plain>*{overflow:visible}.x-button.x-button-plain.x-button-pressing,.x-button.x-button-plain.x-button-pressed,.x-toolbar .x-button.x-button-plain.x-button-pressing,.x-toolbar .x-button.x-button-plain.x-button-pressed{background:none;background-image:-webkit-radial-gradient(rgba(255,255,255,0.7),rgba(255,255,255,0) 24px);background-image:-moz-radial-gradient(rgba(255,255,255,0.7),rgba(255,255,255,0) 24px);background-image:radial-gradient(rgba(255,255,255,0.7),rgba(255,255,255,0) 24px);background-image:-ms-radial-gradient(rgba(255,255,255,0.7),rgba(255,255,255,0) 24px)}.x-segmentedbutton .x-button{margin:0;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.x-segmentedbutton .x-button.x-first{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em}.x-segmentedbutton .x-button.x-last{-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-segmentedbutton .x-button:not(.x-first){border-left:0}.x-hasbadge{overflow:visible}.x-hasbadge .x-badge{border-color:#900;min-width:2em;line-height:1.2em;top:-.2em;padding:.1em .3em;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-background-clip:padding;background-clip:padding-box;color:#fcc;background-image:none;background-color:#c00;background-image:-webkit-linear-gradient(top, #ff1a1a,#e60000 3%,#b30000);background-image:-moz-linear-gradient(top, #ff1a1a,#e60000 3%,#b30000);background-image:-o-linear-gradient(top, #ff1a1a,#e60000 3%,#b30000);background-image:-ms-linear-gradient(to bottom, #ff1a1a,#e60000 3%,#b30000);-moz-border-radius:.2em;-webkit-border-radius:.2em;border-radius:.2em;text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0;-moz-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0.1em;-webkit-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0.1em;box-shadow:rgba(0,0,0,0.5) 0 0.1em 0.1em}.x-panel.x-floating,.x-msgbox,.x-form.x-floating{-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em;-moz-box-shadow:rgba(0,0,0,0.8) 0 0.2em 0.6em;-webkit-box-shadow:rgba(0,0,0,0.8) 0 0.2em 0.6em;box-shadow:rgba(0,0,0,0.8) 0 0.2em 0.6em;background-image:none;background-color:#656565}.x-panel.x-floating.x-floating-light,.x-msgbox.x-floating-light,.x-form.x-floating.x-floating-light{background-image:none;background-color:#cbcbcb}.x-panel.x-floating .x-panel-inner,.x-panel.x-floating>.x-body,.x-msgbox .x-panel-inner,.x-msgbox>.x-body,.x-form.x-floating .x-panel-inner,.x-form.x-floating>.x-body{-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-webkit .x-anchor{position:absolute;overflow:hidden}.x-webkit .x-anchor.x-anchor-top{margin-top:-.68em;margin-left:-.8155em;width:1.631em;height:.7em;-webkit-mask:0 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAPCAYAAABut3YUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPZJREFUeNpi/PX7LwOFwAyIG6HseiA+Ra5BjBQ6xg+IVwAxJ5T/HYgjgHgTOYYxUeCQUiBeh+QQBih7HVSOLiHDDMSTgTiTgLrpQJwLxH9p5RhOaLT4EakeFF3RQPyF2o6RhkaBGYkheRmIPYH4KbXSjC4QnyTDIch6danhGCcgPgwNGXKBNNQMb0ocEwXE24GYn4FyADJjI76Ej88x7UC8FIjZGKgHQDlxGtRsZmISMMjy+dBQoSXYBC0gv+NyDD80xzgx0AeAqg4fIH6NHk0qQHyMjg6B1WvHYDkNFjIgwS1ALMowMOAjEAeBHINe2Q0U+AUQYACQ10C2QNhRogAAAABJRU5ErkJggg==') no-repeat;-webkit-mask-size:1.631em .7em;background-color:#656565}.x-webkit .x-anchor.x-anchor-bottom{margin-left:-.8155em;width:1.631em;height:.7em;-webkit-mask:0 0 url('data:image/png;base64,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') no-repeat;-webkit-mask-size:1.631em .7em;background-color:#656565}.x-webkit .x-anchor.x-anchor-left{margin-left:-.6655em;margin-top:-.35em;height:1.631em;width:.7em;-webkit-mask:0 0 url('data:image/png;base64,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') no-repeat;-webkit-mask-size:.7em 1.631em;background-color:#656565}.x-webkit .x-anchor.x-anchor-right{margin-top:-.35em;height:1.631em;width:.7em;-webkit-mask:0 0 url('data:image/png;base64,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') no-repeat;-webkit-mask-size:.7em 1.631em;background-color:#656565}.x-floating.x-panel-light:after{background-color:#cbcbcb}.x-sheet,.x-picker,.x-sheet-action{padding:.7em;border-top:1px solid #7f7f7f;background-image:none;background-color:rgba(101,101,101,0.9);background-image:-webkit-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-moz-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-o-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-ms-linear-gradient(to bottom, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.x-sheet-inner>.x-button,.x-sheet-action-inner>.x-button{margin-bottom:.5em}.x-sheet-inner>.x-button:last-child,.x-sheet-action-inner>.x-button:last-child{margin-bottom:0}.x-msgbox{margin:.5em;border:0.15em solid #cbcbcb;-moz-box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;-webkit-box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-msgbox .x-icon{margin:0 0.8em 0 0.5em;background:#fff;-webkit-mask-size:100%}.x-msgbox .x-msgbox-info{-webkit-mask-image:url('data:image/png;base64,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')}.x-msgbox .x-msgbox-warning{-webkit-mask-image:url('data:image/png;base64,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')}.x-msgbox .x-msgbox-question{-webkit-mask-image:url('data:image/png;base64,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')}.x-msgbox .x-msgbox-error{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAFGUlEQVRoBe2bzW8VVRxAeS0UMZggaARtGgtNU5pIRCMaEsPChrgh7FhCjHtdEBKNLvwjdOHShSHGmEiMiVFw4cL4EcFoolRSuqBiRDQqCLRS6znDzPP1dub1fbbzLv6S05m57829vzN3Pu+8VhYWFtZ0KyqVygbqHoA74QEYhnmojX4WpuFHuAZz5HSdaVei0mlhJBW7Hx6GJ+AheAwaiS/50rfwGXwNF8nPDdGx6JgwonvJ6hE4CI/DXdBOXGHlz+EEnEb803Yqq65rD7cDFSn4NvwKHh/dwLpt42A7ubpuS7I03Ad74C24DP9AN0Rr67QN27JN2+5rRb5pYRraBC+Bx9ZKiNZKO2+bM/AKbG5WuilhGtgNb4Jn0zCRlV42B3PZ3Yx0w8JUfAQmwcvKSssVtWcu5nSkUemGhKnwKFyE1diFi2SzcnMyt6ONSNcVphJvCl4ATxZZA2WdmqO59tcTLxRmRc/Ez8AvUFbJMC9zNefCM3g9YW8kvocyHbOhYLhsrua8t6iXc4VZYRQ+hJsQVlr2ZXM299E86SXCfNEb/tfhTyi7XFF+5q7DhlB6kTBfqMCzMA1FlfVKuQ66JM8LmXgoPM4XTsIs9IpYUZ466DKeyTr1TJwETztegg7BLhhICnv7jw66HErdEpuqMEvb4Um4O/kkjj+66KRbEokwW2AtS/tgBzgfS+ii077UsbpL30fhBNwLsYVOuum4pg9zz8xj4P7u2FNsoZNuY7q6S3twPwUx9i5aSeim44DC68CxKB/sYw3ddFyn8BBsg5hOVugsCt10HFJ4BGLuXfSS0HFE80HYmBQt/XOdIseJfwfvaDzBlTGy3JRyHNzngTB0HFR4KxSdnS/w2ctwFhxZKHO4t3q1eRV82gtDx60Kb4E7wk/T5d+YTnIPqnjpI73EmnNe6LjFrVJvN3VXya7VeZWUpiyV1ceciyK5Dhd9GGW5W+S2iv+Fg+72eKh3TARfX/XFZfO1h+eg6JLjbec8Z+nSS6c5/k2+/ZAXOs55WboEvqfJu/nYTvlznAHPM3UItMxh5w3BgwVJ6nhJYa+xVyFP2Gv0MYghdLzgVpmCP2IwWsZBxymFz8FlKP1xSo6thm46nlPYrp6EvyDW0E3HqwrPwinwRVSsoZuOs75l83R9Bn4G52MLnXQ7o6s9bMzAR+B+HlvopJuOt4ZpMb/CvF3ulogtdDqVOlbHpZX8DnzQd5QjltBFJ92SyHZpX6p5YB+HH2A++bS3/+igy/HULbGpCqdu7zP9BLxU9XrooItO/wX24SvTnXz6MXgjnj199NrU3HXYucQvLHCZOAzT0GuiWb7mfjjXLbfw1qD886zUiz97MGdzX5vrlldoGbEZ3gAfq7ItV/apuZpz4W8wFx2/oTwrOkh/Am5A2WXN0VwHQ4/a5brCaU+PUMm7UGZpczPHkVq5vPllhWuk3ymptLLmtqxs4pK3FfLKqND3Ni+Ct2rekK/2Lm4O5mJOm/JyzitrqIezFal4PTwNp+EmrJa0bZuDuazP8mtk2pRwViGNDMNr4BPISva2bdmmbQ9n+TQzbUk4a4BGJ8Azo/fh3RS3btuwrYms/Vambf8bD0O4jgM/CgfAXcyfFoT36BS1FIq6634A78FXSLb1YNO2MEkkgbiD9l63x2E/2Ptj0Ky8kmfhJPirWB/tZhD1/rjt6JhwbSbIe3LzBfQ22AV7YAfck+K8MQWOSIjzX8A38BNcQ9Lxto7Gv+RtOqJ9fOwKAAAAAElFTkSuQmCC')}.x-msgbox .x-title{font-size:.9em;line-height:1.4em}.x-msgbox .x-body{background:transparent !important}.x-msgbox .x-toolbar{background:transparent none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.x-msgbox .x-toolbar.x-docked-top{height:1.3em}.x-msgbox .x-field{min-height:2em;background:#fff;-moz-border-radius:.2em;-webkit-border-radius:.2em;border-radius:.2em}.x-msgbox .x-form-field{min-height:1.5em;padding-right:0 !important;-webkit-appearance:none}.x-msgbox .x-field-input{padding-right:2.2em}.x-msgbox-text{padding:6px 0;line-height:1.4em}.x-msgbox-buttons{padding:0.4em 0;height:auto}.x-msgbox-buttons .x-button-normal span{opacity:.7}.x-msgbox-dark .x-msgbox-text{color:rgba(255,255,255,0.9);text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-msgbox-dark .x-msgbox-input{background-image:none;background-color:rgba(255,255,255,0.9);background-image:-webkit-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-moz-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-o-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-ms-linear-gradient(to bottom, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));border:0.1em solid rgba(203,203,203,0.9)}.x-toolbar{padding:0 .2em}.x-toolbar.x-docked-left{width:7em;padding:.2em}.x-toolbar.x-docked-right{width:7em;padding:.2em}.x-title{line-height:2.1em;font-size:1.2em;margin:0 0.3em;padding:0 .3em}.x-spinner .x-input-el,.x-field-select .x-input-el{-webkit-text-fill-color:#000;-webkit-opacity:1}.x-spinner.x-item-disabled .x-input-el,.x-field-select.x-item-disabled .x-input-el{-webkit-text-fill-color:currentcolor}.x-toolbar .x-field-select .x-input-el{-webkit-text-fill-color:#fff}.x-toolbar .x-field-select.x-item-disabled .x-input-el{-webkit-text-fill-color:rgba(255,255,255,0.6)}.x-toolbar .x-form-field-container{padding:0 .3em}.x-toolbar .x-slider-field .x-component-outer,.x-toolbar .x-toggle-field .x-component-outer{padding:0em .3em}.x-toolbar .x-field{width:13em;padding:.5em;min-height:0;border-bottom:0;background:transparent}.x-toolbar .x-field .x-clear-icon{background-size:50% 50%;right:-0.8em;margin-top:-1.06em}.x-toolbar .x-field-input{padding-right:1.6em !important}.x-toolbar .x-field-textarea .x-component-outer,.x-toolbar .x-field-text .x-component-outer,.x-toolbar .x-field-number .x-component-outer,.x-toolbar .x-field-search .x-component-outer{background-color:#fff;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em;-moz-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0 inset,rgba(0,0,0,0.5) 0 -0.1em 0 inset,rgba(0,0,0,0.5) 0.1em 0 0 inset,rgba(0,0,0,0.5) -0.1em 0 0 inset,rgba(0,0,0,0.5) 0 0.15em 0.4em inset;-webkit-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0 inset,rgba(0,0,0,0.5) 0 -0.1em 0 inset,rgba(0,0,0,0.5) 0.1em 0 0 inset,rgba(0,0,0,0.5) -0.1em 0 0 inset,rgba(0,0,0,0.5) 0 0.15em 0.4em inset;box-shadow:rgba(0,0,0,0.5) 0 0.1em 0 inset,rgba(0,0,0,0.5) 0 -0.1em 0 inset,rgba(0,0,0,0.5) 0.1em 0 0 inset,rgba(0,0,0,0.5) -0.1em 0 0 inset,rgba(0,0,0,0.5) 0 0.15em 0.4em inset}.x-toolbar .x-form-label{background:transparent;border:0;padding:0;line-height:1.4em}.x-toolbar .x-form-field{height:1.6em;color:#6e6e6e;background:transparent;min-height:0;-webkit-appearance:none;padding:0em .3em;margin:0}.x-toolbar .x-form-field:focus{color:#000}.x-toolbar .x-field-select .x-component-outer,.x-toolbar .x-field-search .x-component-outer{-moz-border-radius:.8em;-webkit-border-radius:.8em;border-radius:.8em}.x-toolbar .x-field-search .x-field-input{background-position:.5em 50%}.x-toolbar .x-field-select{-webkit-box-shadow:none}.x-toolbar .x-field-select .x-form-field{height:1.4em}.x-toolbar .x-field-select{background:transparent}.x-toolbar .x-field-select .x-component-outer:after{right:.4em}.x-toolbar .x-field-select.x-item-disabled .x-component-outer:after{opacity:.6}.x-toolbar .x-field-select .x-component-outer:before{width:3em;border-left:none;-moz-border-radius-topright:.8em;-webkit-border-top-right-radius:.8em;border-top-right-radius:.8em;-moz-border-radius-bottomright:.8em;-webkit-border-bottom-right-radius:.8em;border-bottom-right-radius:.8em;-webkit-mask:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAABCAYAAACc0f2yAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADJJREFUeNpi/P//PwMjIyMbAwMDOxRzAjEXFHMDMQ8a5kXC6HLcSHo5kcwEmU9TABBgAOcTBAFcRiSpAAAAAElFTkSuQmCC');-webkit-mask-position:right top;-webkit-mask-repeat:repeat-y;-webkit-mask-size:3em 0.05em}.x-toolbar .x-field-select .x-input-text{color:#fff}.x-android .x-field-search .x-field-input{padding-left:.2em !important;padding-right:2.2em !important}.x-toast{margin:.5em;border:0.15em solid #cbcbcb;-moz-box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;-webkit-box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-toast .x-toast-text{padding:6px 0;line-height:1.4em}.x-msgbox-dark .x-msgbox-text{color:rgba(255,255,255,0.9);text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-msgbox-dark .x-msgbox-input{background-image:none;background-color:rgba(255,255,255,0.9);background-image:-webkit-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-moz-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-o-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-ms-linear-gradient(to bottom, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));border:0.1em solid rgba(203,203,203,0.9)}.x-menu{padding:.7em;background-image:none;background-color:rgba(101,101,101,0.9);background-image:-webkit-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-moz-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-o-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-ms-linear-gradient(to bottom, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9))}.x-menu .x-button{margin-bottom:.7em}.x-menu .x-button:last-child{margin-bottom:0}.x-form .x-scroll-container{background-color:#eee}.x-form .x-toolbar .x-scroll-container{background-color:transparent}.x-form-label{text-shadow:#fff 0 1px 1px;color:#333;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0;padding:.6em;background-color:#f7f7f7;color:#080808}.x-form-label span{font-size:.8em}.x-form-fieldset{margin:.5em .5em 1.5em}.x-form-fieldset .x-form-label{border-top:1px solid #fff}.x-form-fieldset .x-form-fieldset-inner{border:1px solid #ddd;background:#fff;padding:0;-moz-border-radius:.4em;-webkit-border-radius:.4em;border-radius:.4em}.x-form-fieldset .x-field{border-bottom:1px solid #ddd;background:transparent}.x-form-fieldset .x-field:first-child{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-form-fieldset .x-field:last-child{border-bottom:0;-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-form-fieldset-title{text-shadow:#fff 0 1px 1px;color:#333;margin:1em .7em 0.3em;color:#333}.x-form-fieldset-instructions{text-shadow:#fff 0 1px 1px;color:#333;color:gray;margin:1em .7em 0.3em;font-size:.8em}.x-label-align-left:first-child .x-form-label{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em}.x-label-align-left:last-child .x-form-label{-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em}.x-label-align-right:first-child .x-form-label{-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-label-align-right:last-child{border-bottom:0}.x-label-align-right:last-child .x-form-label{-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-label-align-top:first-child .x-form-label{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-label-align-bottom:last-child .x-form-label{-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-field{min-height:2.5em;background:#fff}.x-field:last-child{border-bottom:0}.x-field-label{background-color:#f7f7f7;color:#080808}.x-field-input .x-clear-icon{background:url('data:image/png;base64,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') no-repeat;background-position:center center;background-size:55% 55%;width:2.2em;height:2.2em;margin:.5em;margin-top:-1.1em;right:-.5em}.x-field-clearable .x-field-input{padding-right:2.2em}.x-input-el{padding:.4em;min-height:2.5em;border-width:0;-webkit-appearance:none}.x-ie .x-input-el{background:transparent}.x-item-disabled .x-form-label,.x-item-disabled input,.x-item-disabled .x-input-el,.x-item-disabled .x-spinner-body,.x-item-disabled select,.x-item-disabled textarea,.x-item-disabled .x-field-clear-container{color:#b3b3b3;pointer-events:none}.x-item-disabled .x-form-label{color:#aaa}.x-item-disabled .x-form-label:after{color:#666 !important}.x-checkmark-base,.x-field-checkbox .x-field-mask::after,.x-field-radio .x-field-mask::after,.x-select-overlay .x-item-selected.x-list-item::after{position:absolute;top:0;right:10px;bottom:0;content:'3';font-family:'Pictos';font-size:1.6em;text-align:right;line-height:1.6em}.x-field-checkbox .x-field-mask::after,.x-field-radio .x-field-mask::after{color:#ddd}.x-input-checkbox,.x-input-radio{visibility:hidden}.x-input-el:checked+.x-field-mask::after{color:#688AD2}.x-item-disabled.x-field-checkbox .x-input-checkbox:checked+.x-field-mask::after{color:#aebcd9}.x-field-radio .x-field-mask{position:absolute;top:0;right:0;bottom:0;left:0}.x-field-radio .x-field-mask::after{content:'';position:absolute;width:16px;height:16px;top:16px;left:auto;right:16px;background-color:#d0d0d0;-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px}.x-field-radio .x-field-mask::before{content:'';position:absolute;width:26px;height:26px;top:11px;left:auto;right:11px;background-color:#ddd;-moz-border-radius:26px;-webkit-border-radius:26px;border-radius:26px}.x-input-radio:checked+.x-field-mask::after{background:#688AD2}.x-item-disabled.x-field-radio .x-input-radio:checked+.x-field-mask::after{background:#aebcd9}.x-field-search .x-field-input{position:relative}.x-field-search .x-field-input:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"s"}.x-field-search .x-field-input:before{color:#ccc;top:.7em;left:.5em;font-size:1.1em;right:auto}.x-toolbar .x-field-search .x-field-input:before{top:.3em}.x-field-search .x-field-input .x-form-field{margin-left:1em}.x-webkit .x-selectmark-base,.x-webkit .x-field-select .x-component-outer:after,.x-field-select .x-webkit .x-component-outer:after{content:'';position:absolute;width:1em;height:1em;top:50%;left:auto;right:.7em;-webkit-mask-size:1em;-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTJDQUMyNUQwRUE4NjdEQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxQTFBMDFDQ0I5NEYxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyMkRCMDIxMkI5NEUxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjMwRTE0QzVBNDIyMjY4MTFCQ0ZCOTAzOTcwNzcyRkVCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MkNBQzI1RDBFQTg2N0RCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+HfrH/AAAAeVJREFUeNrs2cFHBGEUAPA3zYqIiIhOnTpFRHSKrp26RqeuEV077R/QqWtE166dOkVERHRa9hQRnZalFcv0Hk/W1Mx+38z3vvlm5j3eZW+/9+abne+9KEkSaFPMQMtCwQpWsIIVrGAFK1jBClawgo2ik/4hiqJGwLKuvfpIc5xSkWqYr5hzU1s/mRNxXTPsJ+ZqluvXlwOmSj3XBDvG3M1rpAmYYoUrFzr4ZNqTawqm2MH8Dhh7ZXJUbcAUx4FinzBnJcAUl4FhP/jIgRSYKvkYCJaO2LbNv08RMMUy5nsA4COTLy0XYIqtil9iF6aflq7AwBWuAvuQ9ZKSBgNX2ieWjtKSzeXBNZgqfe8J+4W5aXtbcg0GrvibB/BhkeuhBJhigzsghT0veh+WAlMcCGHvMOMQwcCdcIntYy6WmXhIg2PuiAvsEHO97IhHGgzckb4D8L6LmZYPMHBnhiWwXVdDPF9g4A4Vwd66nFr6BAN3ygbbw1yoMzjmjplgB5hrrufSvsHAHesZDOD2JAbxVYCBOzfIAZ9JbR6qAgN3cPwP9kZy1VIlGLiTdluCmoOBO/pnS9Bk8DzmS3pL4BMcpZEe1qX0GI/atC4dQYXRMa1MU0IX4gpWsIIVrGAFK1jBCnYUPwIMAPUPAyFL+nRdAAAAAElFTkSuQmCC');margin-top:-.5em}.x-field-select{position:relative;z-index:1}.x-field-select .x-component-outer:after{z-index:2;background-color:#ddd}.x-field-select .x-component-outer:before,.x-field-select .x-component-outer:after{pointer-events:none;position:absolute;display:block}.x-select-overlay .x-list-item-label{height:2.6em}.x-select-overlay .x-item-selected .x-list-label{margin-right:2.6em}.x-select-overlay .x-item-selected.x-list-item::after{color:#ddd}.x-spinner .x-field-input .x-input-el{-webkit-text-fill-color:#000}.x-spinner.x-item-disabled .x-input-el{-webkit-text-fill-color:#B3B3B3}.x-spinner.x-item-disabled .x-spinner-button{color:#aaa !important}.x-spinner.x-item-disabled .x-spinner-button,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button{border:1px solid #c4c4c4;border-top-color:#d0d0d0;background-color:#f7f7f7;color:#1e1e1e}.x-spinner.x-item-disabled .x-spinner-button.x-button-back:before,.x-spinner.x-item-disabled .x-spinner-button.x-button-forward:before,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-back:before,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-forward:before{background:#c4c4c4}.x-spinner.x-item-disabled .x-spinner-button,.x-spinner.x-item-disabled .x-spinner-button.x-button-back:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-forward:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-back:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-forward:after{background-image:none;background-color:#f7f7f7;background-image:-webkit-linear-gradient(top, #ffffff,#ffffff 3%,#eaeaea);background-image:-moz-linear-gradient(top, #ffffff,#ffffff 3%,#eaeaea);background-image:-o-linear-gradient(top, #ffffff,#ffffff 3%,#eaeaea);background-image:-ms-linear-gradient(to bottom, #ffffff,#ffffff 3%,#eaeaea)}.x-spinner.x-item-disabled .x-spinner-button.x-button-pressing,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressing:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressed,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressed:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-active,.x-spinner.x-item-disabled .x-spinner-button.x-button-active:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressing,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressing:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressed,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressed:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-active,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-active:after{background-image:none;background-color:#efefef;background-image:-webkit-linear-gradient(top, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0);background-image:-moz-linear-gradient(top, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0);background-image:-o-linear-gradient(top, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0);background-image:-ms-linear-gradient(to bottom, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0)}.x-spinner .x-spinner-button{margin-top:.25em;margin-bottom:.25em;width:2em;padding:.23em 0 .27em;font-weight:bold;text-align:center;border:1px solid #ddd !important;-moz-border-radius:1em;-webkit-border-radius:1em;border-radius:1em}.x-spinner .x-spinner-button,.x-toolbar .x-spinner .x-spinner-button{border:1px solid #b7b7b7;border-top-color:#c4c4c4;background-color:#eaeaea;color:#111}.x-spinner .x-spinner-button.x-button-back:before,.x-spinner .x-spinner-button.x-button-forward:before,.x-toolbar .x-spinner .x-spinner-button.x-button-back:before,.x-toolbar .x-spinner .x-spinner-button.x-button-forward:before{background:#b7b7b7}.x-spinner .x-spinner-button,.x-spinner .x-spinner-button.x-button-back:after,.x-spinner .x-spinner-button.x-button-forward:after,.x-toolbar .x-spinner .x-spinner-button,.x-toolbar .x-spinner .x-spinner-button.x-button-back:after,.x-toolbar .x-spinner .x-spinner-button.x-button-forward:after{background-image:none;background-color:#eaeaea;background-image:-webkit-linear-gradient(top, #ffffff,#f7f7f7 3%,#dddddd);background-image:-moz-linear-gradient(top, #ffffff,#f7f7f7 3%,#dddddd);background-image:-o-linear-gradient(top, #ffffff,#f7f7f7 3%,#dddddd);background-image:-ms-linear-gradient(to bottom, #ffffff,#f7f7f7 3%,#dddddd)}.x-spinner .x-spinner-button.x-button-pressing,.x-spinner .x-spinner-button.x-button-pressing:after,.x-spinner .x-spinner-button.x-button-pressed,.x-spinner .x-spinner-button.x-button-pressed:after,.x-spinner .x-spinner-button.x-button-active,.x-spinner .x-spinner-button.x-button-active:after,.x-toolbar .x-spinner .x-spinner-button.x-button-pressing,.x-toolbar .x-spinner .x-spinner-button.x-button-pressing:after,.x-toolbar .x-spinner .x-spinner-button.x-button-pressed,.x-toolbar .x-spinner .x-spinner-button.x-button-pressed:after,.x-toolbar .x-spinner .x-spinner-button.x-button-active,.x-toolbar .x-spinner .x-spinner-button.x-button-active:after{background-image:none;background-color:#e2e2e2;background-image:-webkit-linear-gradient(top, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3);background-image:-moz-linear-gradient(top, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3);background-image:-o-linear-gradient(top, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3);background-image:-ms-linear-gradient(to bottom, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3)}.x-spinner .x-spinner-button-down{margin-left:.25em}.x-spinner .x-spinner-button-up{margin-right:.25em}.x-spinner.x-field-grouped-buttons .x-spinner-button-down{margin-right:.5em}.x-android .x-spinner-button{padding:.40em 0 .11em !important}.x-ie .x-spinner .x-field-input .x-input-el:disabled{color:#000}.x-list{background-color:#f7f7f7}.x-list .x-list-disclosure{position:relative;overflow:visible;border:0;-moz-border-radius:32px;-webkit-border-radius:32px;border-radius:32px;background-image:none;background-color:#5e86dc;background-image:-webkit-linear-gradient(top, #9db6ea,#7396e0 3%,#4977d7);background-image:-moz-linear-gradient(top, #9db6ea,#7396e0 3%,#4977d7);background-image:-o-linear-gradient(top, #9db6ea,#7396e0 3%,#4977d7);background-image:-ms-linear-gradient(to bottom, #9db6ea,#7396e0 3%,#4977d7);width:32px;height:32px;margin:7px 7px 0 0}.x-list .x-list-disclosure:before{position:absolute;top:0;right:0;bottom:0;left:0;content:']';font-family:'Pictos';color:#fff;font-size:24px;text-align:center;line-height:35px;text-shadow:0 0 0}.x-list.x-list-indexed .x-list-disclosure{margin-right:1.8em}.x-list .x-item-selected .x-list-disclosure{background:#fff none}.x-list .x-item-selected .x-list-disclosure:before{color:#688AD2}.x-list .x-list-item{color:#000}.x-list .x-list-item.x-item-selected .x-dock-horizontal,.x-list .x-list-item.x-item-selected.x-list-item-tpl{background-image:none;background-color:#688AD2;background-image:-webkit-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-moz-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-o-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-ms-linear-gradient(to bottom, #a3b8e4,#7c99d8 3%,#547bcc);color:#fff}.x-list .x-list-item.x-item-pressed.x-list-item-tpl,.x-list .x-list-item.x-item-pressed .x-dock-horizontal{background:#fff none}.x-list .x-list-item .x-list-item-body,.x-list .x-list-item.x-list-item-tpl .x-innerhtml{padding:12px 15px}.x-list-normal .x-list-header{background-image:none;background-color:#fefefe;background-image:-webkit-linear-gradient(top, #ffffff,#ffffff 3%,#f3f0f0);background-image:-moz-linear-gradient(top, #ffffff,#ffffff 3%,#f3f0f0);background-image:-o-linear-gradient(top, #ffffff,#ffffff 3%,#f3f0f0);background-image:-ms-linear-gradient(to bottom, #ffffff,#ffffff 3%,#f3f0f0);color:#b9aaaa;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0;border-top:1px solid #fefefe;border-bottom:1px solid #d0c6c6;font-weight:bold;font-size:0.8em;padding:0.2em 1.02em}.x-list-normal .x-list-item.x-list-item-tpl,.x-list-normal .x-list-item .x-dock-horizontal{border-top:1px solid #dedede}.x-list-normal .x-list-item.x-list-item-tpl.x-list-footer-wrap,.x-list-normal .x-list-item.x-list-footer-wrap .x-dock-horizontal{border-bottom:1px solid #dedede}.x-list-normal .x-list-item.x-item-pressed.x-list-item-tpl,.x-list-normal .x-list-item.x-item-pressed .x-dock-horizontal{border-top-color:#fff;background-color:#fff}.x-list-normal .x-list-item.x-item-selected.x-list-item-tpl,.x-list-normal .x-list-item.x-item-selected .x-dock-horizontal{border-top-color:#688AD2}.x-list-round .x-scroll-view{background-color:#eee}.x-list-round .x-list-header-swap{padding-right:13px}.x-list-round .x-list-inner .x-scroll-container{top:13px;left:13px;bottom:13px;right:13px;width:auto !important;height:auto !important}.x-list-round .x-list-header{color:#777;font-size:1em;font-weight:bold;padding-left:26px;line-height:1.7em;background-image:-webkit-linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4));background-image:-moz-linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4));background-image:-o-linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4));background-image:-ms-linear-gradient(to bottom, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4))}.x-list-round .x-list-container{padding:13px 13px 0 13px}.x-list-round .x-list-container .x-list-header{padding-left:13px;background-image:none}.x-list-round.x-list-ungrouped .x-list-item-tpl,.x-list-round.x-list-ungrouped .x-list-item .x-dock-horizontal,.x-list-round.x-list-grouped .x-list-item-tpl,.x-list-round.x-list-grouped .x-list-item .x-dock-horizontal{border:1px solid #dedede;border-width:1px 1px 0 1px;background:#f7f7f7}.x-list-round.x-list-ungrouped .x-list-item-first{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-list-round.x-list-ungrouped .x-list-item-last{-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em;border-width:1px;margin-bottom:13px}.x-list-round.x-list-grouped .x-list-header-wrap .x-dock-horizontal{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-list-round.x-list-grouped .x-list-header-wrap.x-list-header{border:1px solid #dedede;border-width:1px 1px 0 1px;-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-list-round.x-list-grouped .x-list-footer-wrap{background:transparent}.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-tpl,.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal{border:none;background:transparent;padding-bottom:13px;margin-bottom:13px}.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-tpl>.x-innerhtml,.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-tpl>.x-dock-body,.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal>.x-innerhtml,.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal>.x-dock-body{border:1px solid #dedede;background:#f7f7f7;-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-pressed>.x-innerhtml,.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-pressed>.x-dock-body{background:#fff none}.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-selected>.x-innerhtml,.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-selected>.x-dock-body{background-image:none;background-color:#688AD2;background-image:-webkit-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-moz-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-o-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-ms-linear-gradient(to bottom, #a3b8e4,#7c99d8 3%,#547bcc);color:#fff}.x-list-round .x-indexbar-vertical{margin-right:20px}.x-list-round .x-list-footer-wrap.x-list-item-last.x-list-item-odd.x-list-item.x-list-item-tpl{background-color:transparent !important}.x-list-round.x-list-grouped .x-list-item-odd.x-list-footer-wrap>.x-innerhtml,.x-list-round.x-list-grouped .x-list-item-odd.x-list-footer-wrap>.x-dock-body{background-color:#eaeaea !important}.x-list .x-list-item-odd.x-list-item-tpl,.x-list .x-list-item-odd .x-dock-horizontal{background-color:#eaeaea !important;border-bottom:1px solid #eaeaea}.x-picker .x-picker-inner{background-color:#fff;overflow:hidden;margin:.7em;-moz-border-radius:.4em;-webkit-border-radius:.4em;border-radius:.4em;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-background-clip:padding;background-clip:padding-box;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #bbb), color-stop(30%, #fff), color-stop(70%, #fff), color-stop(100%, #bbb));background:-webkit-linear-gradient(top, #bbb 0%, #fff 30%, #fff 70%, #bbb 100%)}.x-picker-slot .x-scroll-view{-moz-box-shadow:rgba(0,0,0,0.4) -1px 0 1px;-webkit-box-shadow:rgba(0,0,0,0.4) -1px 0 1px;box-shadow:rgba(0,0,0,0.4) -1px 0 1px}.x-picker-slot .x-scroll-view:first-child{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.x-picker-bar{border-top:0.12em solid #688AD2;border-bottom:0.12em solid #688AD2;height:2.5em;background-image:none;background-color:rgba(13,86,242,0.3);background-image:-webkit-linear-gradient(top, rgba(85,137,246,0.3),rgba(37,103,244,0.3) 3%,rgba(11,78,218,0.3));background-image:-moz-linear-gradient(top, rgba(85,137,246,0.3),rgba(37,103,244,0.3) 3%,rgba(11,78,218,0.3));background-image:-o-linear-gradient(top, rgba(85,137,246,0.3),rgba(37,103,244,0.3) 3%,rgba(11,78,218,0.3));background-image:-ms-linear-gradient(to bottom, rgba(85,137,246,0.3),rgba(37,103,244,0.3) 3%,rgba(11,78,218,0.3));-moz-box-shadow:rgba(0,0,0,0.2) 0 0.2em 0.2em;-webkit-box-shadow:rgba(0,0,0,0.2) 0 0.2em 0.2em;box-shadow:rgba(0,0,0,0.2) 0 0.2em 0.2em}.x-use-titles .x-picker-bar{margin-top:1.5em}.x-picker-slot-title{height:1.5em;border-top:1px solid #dcd4d4;border-bottom:1px solid #ae9c9c;padding:0.2em 1.02em;-moz-box-shadow:rgba(0,0,0,0.3) 0px 0.1em 0.3em;-webkit-box-shadow:rgba(0,0,0,0.3) 0px 0.1em 0.3em;box-shadow:rgba(0,0,0,0.3) 0px 0.1em 0.3em;background-image:none;background-color:#dcd4d4;background-image:-webkit-linear-gradient(top, #fefefe,#e7e2e2 3%,#d0c6c6);background-image:-moz-linear-gradient(top, #fefefe,#e7e2e2 3%,#d0c6c6);background-image:-o-linear-gradient(top, #fefefe,#e7e2e2 3%,#d0c6c6);background-image:-ms-linear-gradient(to bottom, #fefefe,#e7e2e2 3%,#d0c6c6)}.x-picker-slot-title>div{font-size:0.8em;color:#8b8b8b;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0}.x-picker-slot{border-left:2px solid #acacac}.x-picker-slot .x-dataview-item{height:2.5em;line-height:2.5em;font-weight:bold;padding:0 10px}.x-picker-slot:first-child{border-left:0}.x-toggle{width:4.4em;border:1px solid #b7b7b7;background-image:none;background-color:#ddd;background-image:-webkit-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:-moz-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:-o-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:-ms-linear-gradient(to bottom, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);-moz-border-radius:1.1em;-webkit-border-radius:1.1em;border-radius:1.1em}.x-toggle .x-thumb.x-dragging{opacity:1}.x-toggle .x-thumb:before{top:.175em}.x-toggle-on{background-image:none;background-color:#92cf00;background-image:-webkit-linear-gradient(top, #6e9c00,#80b600 10%,#92cf00 65%,#94d200);background-image:-moz-linear-gradient(top, #6e9c00,#80b600 10%,#92cf00 65%,#94d200);background-image:-o-linear-gradient(top, #6e9c00,#80b600 10%,#92cf00 65%,#94d200);background-image:-ms-linear-gradient(to bottom, #6e9c00,#80b600 10%,#92cf00 65%,#94d200)}.x-button.border-radius-10{-moz-border-radius:10px !important;-webkit-border-radius:10px;border-radius:10px !important}.x-dataview.color .x-dataview-inner.x-scroll-scroller{width:auto !important;height:auto !important;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-dataview.color .x-dataview-inner.x-scroll-scroller .x-dataview-container{margin-top:12px;margin-left:12px}.x-dataview.color .x-dataview-item{display:inline-block}.x-dataview.color .x-dataview-item.x-item-selected .item-inner{-moz-box-shadow:#3ba8ff 0 0 0 4px;-webkit-box-shadow:#3ba8ff 0 0 0 4px;box-shadow:#3ba8ff 0 0 0 4px}.x-dataview.color .x-dataview-item .item-inner{display:inline-block;width:50px;height:50px;border:1px solid #d8d8d8;margin:6px}.x-list.settings{-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-list.settings.x-list-round .x-scroll-view{-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-list.settings.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-tpl{padding-bottom:0}.x-list.settings.x-list-round.x-list-grouped .x-list-header-wrap .x-dock-horizontal{padding-top:0}.x-list.settings.x-list-round.x-list-grouped .x-list-header-wrap .x-list-header{display:none}.x-list.settings.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-last .x-dock-horizontal{padding-bottom:0}.x-list.settings.x-list-round.x-list-grouped .x-list-item .x-dock-horizontal{border:1px solid #bcbcbc;border-width:1px 1px 0 1px;background:#fff}.x-list.settings.x-list-round.x-list-grouped .x-list-item .x-dock-horizontal .x-innerhtml{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-pressed .x-dock-horizontal{background-image:-webkit-linear-gradient(top, #7c99d8,#416cc6);background-image:-moz-linear-gradient(top, #7c99d8,#416cc6);background-image:-o-linear-gradient(top, #7c99d8,#416cc6);background-image:-ms-linear-gradient(to bottom, #7c99d8,#416cc6);color:#fff}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-pressed .x-dock-horizontal .disclosure{background-position:-24px 0}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-selected .x-dock-horizontal{color:inherit}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-selected .x-dock-horizontal .x-list-item-body{padding-right:1.2em}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-selected .x-dock-horizontal:after{content:"";width:24px;height:24px;position:absolute;top:11px;right:11px;background-image:url("../img/icons/list-normal.png");background-size:72px 48px;background-position:0 -24px}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-selected.x-item-pressed .x-dock-horizontal{color:#fff}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-selected.x-item-pressed .x-dock-horizontal:after{background-position:-24px -24px}.x-list.settings.x-list-round.x-list-grouped .x-list-item .list-icon{width:24px;height:24px;position:absolute}.x-list.settings.x-list-round.x-list-grouped .x-list-item .icon-offset{margin-left:30px}.x-list.settings.x-list-round.x-list-grouped .x-list-item .disclosure{right:12px;background-image:url("../img/icons/list-normal.png");background-size:72px 48px;background-position:0 0}.x-list.settings.x-list-round.x-list-grouped .x-list-header-wrap.x-list-footer-wrap .x-dock-body{-moz-border-radius:.4em;-webkit-border-radius:.4em;border-radius:.4em}.x-list.settings.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal{border:none;background:transparent;padding-bottom:13.8px}.x-list.settings.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal>.x-dock-body{border:1px solid #bcbcbc;background:#fff}.x-list.settings.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-pressed .x-dock-horizontal{background:transparent}.x-list.settings.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-pressed .x-dock-horizontal>.x-dock-body{-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em;background-image:-webkit-linear-gradient(top, #7c99d8,#416cc6);background-image:-moz-linear-gradient(top, #7c99d8,#416cc6);background-image:-o-linear-gradient(top, #7c99d8,#416cc6);background-image:-ms-linear-gradient(to bottom, #7c99d8,#416cc6);color:#fff}.x-msgbox{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #989898,#656565 10%,#656565);background-image:-moz-linear-gradient(top, #989898,#656565 10%,#656565);background-image:-o-linear-gradient(top, #989898,#656565 10%,#656565);background-image:-ms-linear-gradient(to bottom, #989898,#656565 10%,#656565)}.x-msgbox .x-toolbar.x-docked-bottom .x-button .x-button-label,.x-msgbox .x-toolbar.x-docked-bottom .x-button .x-badge{font-size:.9em;line-height:2em}.x-msgbox .x-title{font-size:1em;line-height:1.4em;color:#ffffff;text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-dataview.icon-view .x-dataview-inner.x-scroll-scroller{width:auto !important;height:auto !important}.x-dataview.icon-view .x-dataview-inner.x-scroll-scroller .x-dataview-container{margin-top:12px;margin-left:12px}.x-dataview.icon-view .x-dataview-item{display:inline-block}.x-dataview.icon-view .x-dataview-item.x-item-pressed .item-inner,.x-dataview.icon-view .x-dataview-item.x-item-selected .item-inner{background-image:-webkit-linear-gradient(top, #7c99d8,#416cc6);background-image:-moz-linear-gradient(top, #7c99d8,#416cc6);background-image:-o-linear-gradient(top, #7c99d8,#416cc6);background-image:-ms-linear-gradient(to bottom, #7c99d8,#416cc6);color:#fff}.x-dataview.icon-view .x-dataview-item .item-inner{display:inline-block;width:77px;height:77px;border:1px solid #bcbcbc;background:#fff;margin:-1px}.x-dataview.icon-view .x-dataview-item .item-inner.top-left{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em}.x-dataview.icon-view .x-dataview-item .item-inner.top-right{-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-dataview.icon-view .x-dataview-item .item-inner.bottom-left{-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em}.x-dataview.icon-view .x-dataview-item .item-inner.bottom-right{-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-0{background-position:0 0px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-0,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-0{background-position:-24px 0px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-1{background-position:0 -24px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-1,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-1{background-position:-24px -24px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-2{background-position:0 -48px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-2,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-2{background-position:-24px -48px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-3{background-position:0 -72px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-3,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-3{background-position:-24px -72px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-4{background-position:0 -96px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-4,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-4{background-position:-24px -96px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-5{background-position:0 -120px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-5,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-5{background-position:-24px -120px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-6{background-position:0 -144px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-6,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-6{background-position:-24px -144px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-7{background-position:0 -168px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-7,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-7{background-position:-24px -168px}.x-dataview.icon-view.bullets .item-inner .text{margin-top:1.4em;text-align:center}.x-dataview.icon-view.bullets .item-inner .icon{width:24px;height:24px;margin:1.4em auto;background-image:url("../img/icons/bullets-normal.png");background-size:48px 168px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-0{background-position:0 0px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-0,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-0{background-position:-74px 0px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-1{background-position:0 -74px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-1,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-1{background-position:-74px -74px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-2{background-position:0 -148px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-2,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-2{background-position:-74px -148px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-3{background-position:0 -222px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-3,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-3{background-position:-74px -222px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-4{background-position:0 -296px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-4,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-4{background-position:-74px -296px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-5{background-position:0 -370px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-5,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-5{background-position:-74px -370px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-6{background-position:0 -444px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-6,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-6{background-position:-74px -444px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-7{background-position:0 -518px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-7,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-7{background-position:-74px -518px}.x-dataview.icon-view.numbering .item-inner .text{position:relative;top:1.4em;text-align:center}.x-dataview.icon-view.numbering .item-inner .icon{width:74px;height:74px;margin:0 auto;background-image:url("../img/icons/numbering-normal.png");background-size:148px 518px}.x-dataview.icon-view.outline .x-dataview-item .icon.outline-0{background-position:0 0px}.x-dataview.icon-view.outline .x-dataview-item.x-item-selected .icon.outline-0,.x-dataview.icon-view.outline .x-dataview-item.x-item-pressed .icon.outline-0{background-position:-74px 0px}.x-dataview.icon-view.outline .x-dataview-item .icon.outline-1{background-position:0 -74px}.x-dataview.icon-view.outline .x-dataview-item.x-item-selected .icon.outline-1,.x-dataview.icon-view.outline .x-dataview-item.x-item-pressed .icon.outline-1{background-position:-74px -74px}.x-dataview.icon-view.outline .x-dataview-item .icon.outline-2{background-position:0 -148px}.x-dataview.icon-view.outline .x-dataview-item.x-item-selected .icon.outline-2,.x-dataview.icon-view.outline .x-dataview-item.x-item-pressed .icon.outline-2{background-position:-74px -148px}.x-dataview.icon-view.outline .item-inner .text{position:relative;top:1.4em;text-align:center}.x-dataview.icon-view.outline .item-inner .icon{width:74px;height:74px;margin:0 auto;background-image:url("../img/icons/outline-normal.png");background-size:148px 222px}.x-panel.x-panel-settings{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #ececec,#cbcbcb);background-image:-moz-linear-gradient(top, #ececec,#cbcbcb);background-image:-o-linear-gradient(top, #ececec,#cbcbcb);background-image:-ms-linear-gradient(to bottom, #ececec,#cbcbcb);-moz-box-shadow:#fff 0 1px 0 inset,rgba(0,0,0,0.3) 0 0.2em 0.6em;-webkit-box-shadow:#fff 0 1px 0 inset,rgba(0,0,0,0.3) 0 0.2em 0.6em;box-shadow:#fff 0 1px 0 inset,rgba(0,0,0,0.3) 0 0.2em 0.6em;border:1px solid #797979}.x-panel.x-panel-settings .x-anchor-top{background-color:#797979;margin-top:-.62em;-moz-box-shadow:#fff 0 -1px 0 0 inset;-webkit-box-shadow:#fff 0 -1px 0 0 inset;box-shadow:#fff 0 -1px 0 0 inset}.x-panel.x-panel-settings .x-anchor-top:after{content:'';position:absolute;width:1.631em;height:.7em;-webkit-mask-size:1.631em .7em;background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #f1f1f1,#ececec);background-image:-moz-linear-gradient(top, #f1f1f1,#ececec);background-image:-o-linear-gradient(top, #f1f1f1,#ececec);background-image:-ms-linear-gradient(to bottom, #f1f1f1,#ececec);top:1px !important}.x-panel.x-panel-settings .x-anchor-bottom{height:.8em;background-color:#797979;margin-top:-0.15em;-moz-box-shadow:#fff 0 -1px 0 0 inset;-webkit-box-shadow:#fff 0 -1px 0 0 inset;box-shadow:#fff 0 -1px 0 0 inset}.x-panel.x-panel-settings .x-anchor-bottom:after{content:'';position:absolute;width:1.631em;height:.8em;-webkit-mask-size:1.631em .7em;background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #cbcbcb,#bebebe);background-image:-moz-linear-gradient(top, #cbcbcb,#bebebe);background-image:-o-linear-gradient(top, #cbcbcb,#bebebe);background-image:-ms-linear-gradient(to bottom, #cbcbcb,#bebebe);top:-1px !important}.x-panel.x-panel-settings .x-panel-inner{background:transparent}.x-panel.x-panel-settings .x-navigation-bar{border-bottom:none;margin-top:-6px;background:transparent;overflow:hidden}.x-panel.x-panel-settings .x-navigation-bar .x-title{color:#323232;text-shadow:#fff 0 0.08em 0}.x-panel.x-panel-settings .x-navigationview.plain .x-navigationview-inner{background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.x-panel.x-panel-settings .x-navigationview.plain .x-navigationview-inner:after{content:none}.x-panel.x-panel-settings .x-navigationview-inner{background-color:#efefef;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-panel.x-panel-settings .x-navigationview-inner:after{content:'';position:absolute;width:100%;height:100%;top:0;left:0;pointer-events:none;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em;-moz-box-shadow:inset 0 1px 2px 2px #c8c8c8;-webkit-box-shadow:inset 0 1px 2px 2px #c8c8c8;box-shadow:inset 0 1px 2px 2px #c8c8c8;border:1px solid #797979}.x-label.info .x-innerhtml{color:#7f7f7f;text-shadow:0 1px 0 #fff;text-align:center}.btn-input-image input[type="file"]{opacity:0;position:absolute;left:0;top:0}.x-mask.transparent{background:transparent}.round{-moz-border-radius:.4em;-webkit-border-radius:.4em;border-radius:.4em}.x-list-header-wrap{-moz-border-radius-topleft:.4em !important;-webkit-border-top-left-radius:.4em !important;border-top-left-radius:.4em !important;-moz-border-radius-topright:.4em !important;-webkit-border-top-right-radius:.4em !important;border-top-right-radius:.4em !important}.x-list-header-wrap .x-innerhtml{-moz-border-radius-topleft:.4em !important;-webkit-border-top-left-radius:.4em !important;border-top-left-radius:.4em !important;-moz-border-radius-topright:.4em !important;-webkit-border-top-right-radius:.4em !important;border-top-right-radius:.4em !important}.x-list-header{display:none}.x-spinner.planar-spinner.x-field-grouped-buttons{background:transparent}.x-spinner.planar-spinner.x-field-grouped-buttons.x-field{min-height:0}.x-spinner.planar-spinner.x-field-grouped-buttons .x-form-label{background:transparent}.x-spinner.planar-spinner.x-field-grouped-buttons .x-form-label span{font-size:inherit}.x-spinner.planar-spinner.x-field-grouped-buttons .x-button{margin-top:9px;margin-bottom:9px;padding:0 8px !important}.x-spinner.planar-spinner.x-field-grouped-buttons .x-form-label{padding:0.16em}.x-spinner.planar-spinner.x-field-grouped-buttons .x-field-input{-moz-box-shadow:#b2b2b2 0 3px 4px -2px inset;-webkit-box-shadow:#b2b2b2 0 3px 4px -2px inset;box-shadow:#b2b2b2 0 3px 4px -2px inset;background:#fff;min-width:2.3em}.x-spinner.planar-spinner.x-field-grouped-buttons .x-field-input .x-input-el{text-align:center;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;padding:3px 0 4px;min-height:0;border-top:1px solid #898989;border-bottom:1px solid #898989}.x-spinner.planar-spinner.x-field-grouped-buttons .x-spinner-button{width:auto;border:1px solid #939393 !important;margin:0}.x-spinner.planar-spinner.x-field-grouped-buttons .x-spinner-button-down{margin-right:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.x-spinner.planar-spinner.x-field-grouped-buttons .x-spinner-button-up{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.x-toolbar{background-color:transparent}.x-toolbar-edit{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-moz-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-o-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-ms-linear-gradient(to bottom, #ffffff,#ececec 3%,#cbcbcb);border-color:#4c4c4c}.x-toolbar-edit .x-title{color:#000;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0}.x-toolbar-edit.x-docked-top{border-bottom:1px solid #939393}.x-toolbar-edit .x-button,.x-toolbar .x-toolbar-edit .x-button,.x-toolbar-edit .x-field-select .x-component-outer,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer,.x-toolbar-edit .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before{border:1px solid #8b8b8b;border-top-color:#989898;background-color:#bebebe;color:#000}.x-toolbar-edit .x-button.x-button-back:before,.x-toolbar-edit .x-button.x-button-forward:before,.x-toolbar .x-toolbar-edit .x-button.x-button-back:before,.x-toolbar .x-toolbar-edit .x-button.x-button-forward:before,.x-toolbar-edit .x-field-select .x-component-outer.x-button-back:before,.x-toolbar-edit .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-back:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-forward:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-forward:before{background:#8b8b8b}.x-toolbar-edit .x-button,.x-toolbar-edit .x-button.x-button-back:after,.x-toolbar-edit .x-button.x-button-forward:after,.x-toolbar .x-toolbar-edit .x-button,.x-toolbar .x-toolbar-edit .x-button.x-button-back:after,.x-toolbar .x-toolbar-edit .x-button.x-button-forward:after,.x-toolbar-edit .x-field-select .x-component-outer,.x-toolbar-edit .x-field-select .x-component-outer.x-button-back:after,.x-toolbar-edit .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-back:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar-edit .x-field-select .x-component-outer:before,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-forward:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-forward:after{background-image:none;background-color:#bebebe;background-image:-webkit-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-moz-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-o-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-ms-linear-gradient(to bottom, #e5e5e5,#cbcbcb 3%,#b2b2b2)}.x-toolbar-edit .x-button.x-button-pressing,.x-toolbar-edit .x-button.x-button-pressing:after,.x-toolbar-edit .x-button.x-button-pressed,.x-toolbar-edit .x-button.x-button-pressed:after,.x-toolbar-edit .x-button.x-button-active,.x-toolbar-edit .x-button.x-button-active:after,.x-toolbar .x-toolbar-edit .x-button.x-button-pressing,.x-toolbar .x-toolbar-edit .x-button.x-button-pressing:after,.x-toolbar .x-toolbar-edit .x-button.x-button-pressed,.x-toolbar .x-toolbar-edit .x-button.x-button-pressed:after,.x-toolbar .x-toolbar-edit .x-button.x-button-active,.x-toolbar .x-toolbar-edit .x-button.x-button-active:after,.x-toolbar-edit .x-field-select .x-component-outer.x-button-pressing,.x-toolbar-edit .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar-edit .x-field-select .x-component-outer.x-button-pressed,.x-toolbar-edit .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar-edit .x-field-select .x-component-outer.x-button-active,.x-toolbar-edit .x-field-select .x-component-outer.x-button-active:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-pressing,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-pressed,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-active,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-active:after,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-active,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-active:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-active,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-active:after{background-image:none;background-color:#b7b7b7;background-image:-webkit-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-moz-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-o-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-ms-linear-gradient(to bottom, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8)}.x-toolbar-edit .x-label,.x-toolbar-edit .x-form-label{font-weight:normal;color:#4c4c4c;text-shadow:0 1px 0 #fff}.x-toolbar{background-color:transparent}.x-toolbar-search{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #cbcbcb,#e7e7e7 20%,#e7e7e7);background-image:-moz-linear-gradient(top, #cbcbcb,#e7e7e7 20%,#e7e7e7);background-image:-o-linear-gradient(top, #cbcbcb,#e7e7e7 20%,#e7e7e7);background-image:-ms-linear-gradient(to bottom, #cbcbcb,#e7e7e7 20%,#e7e7e7);border-color:#4c4c4c}.x-toolbar-search .x-title{color:#000;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0}.x-toolbar-search.x-docked-top{border-bottom:1px solid #939393}.x-toolbar-search .x-button,.x-toolbar .x-toolbar-search .x-button,.x-toolbar-search .x-field-select .x-component-outer,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer,.x-toolbar-search .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before{border:1px solid #8b8b8b;border-top-color:#989898;background-color:#bebebe;color:#000}.x-toolbar-search .x-button.x-button-back:before,.x-toolbar-search .x-button.x-button-forward:before,.x-toolbar .x-toolbar-search .x-button.x-button-back:before,.x-toolbar .x-toolbar-search .x-button.x-button-forward:before,.x-toolbar-search .x-field-select .x-component-outer.x-button-back:before,.x-toolbar-search .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-back:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-forward:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-forward:before{background:#8b8b8b}.x-toolbar-search .x-button,.x-toolbar-search .x-button.x-button-back:after,.x-toolbar-search .x-button.x-button-forward:after,.x-toolbar .x-toolbar-search .x-button,.x-toolbar .x-toolbar-search .x-button.x-button-back:after,.x-toolbar .x-toolbar-search .x-button.x-button-forward:after,.x-toolbar-search .x-field-select .x-component-outer,.x-toolbar-search .x-field-select .x-component-outer.x-button-back:after,.x-toolbar-search .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-back:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar-search .x-field-select .x-component-outer:before,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-forward:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-forward:after{background-image:none;background-color:#bebebe;background-image:-webkit-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-moz-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-o-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-ms-linear-gradient(to bottom, #e5e5e5,#cbcbcb 3%,#b2b2b2)}.x-toolbar-search .x-button.x-button-pressing,.x-toolbar-search .x-button.x-button-pressing:after,.x-toolbar-search .x-button.x-button-pressed,.x-toolbar-search .x-button.x-button-pressed:after,.x-toolbar-search .x-button.x-button-active,.x-toolbar-search .x-button.x-button-active:after,.x-toolbar .x-toolbar-search .x-button.x-button-pressing,.x-toolbar .x-toolbar-search .x-button.x-button-pressing:after,.x-toolbar .x-toolbar-search .x-button.x-button-pressed,.x-toolbar .x-toolbar-search .x-button.x-button-pressed:after,.x-toolbar .x-toolbar-search .x-button.x-button-active,.x-toolbar .x-toolbar-search .x-button.x-button-active:after,.x-toolbar-search .x-field-select .x-component-outer.x-button-pressing,.x-toolbar-search .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar-search .x-field-select .x-component-outer.x-button-pressed,.x-toolbar-search .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar-search .x-field-select .x-component-outer.x-button-active,.x-toolbar-search .x-field-select .x-component-outer.x-button-active:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-pressing,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-pressed,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-active,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-active:after,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-active,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-active:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-active,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-active:after{background-image:none;background-color:#b7b7b7;background-image:-webkit-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-moz-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-o-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-ms-linear-gradient(to bottom, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8)}.x-toolbar-search .x-label,.x-toolbar-search .x-form-label{font-weight:normal;color:#4c4c4c;text-shadow:0 1px 0 #fff}.x-button-icon.save,.list-icon.save{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 0px;background-size:72px 888px}.x-button-pressing .x-button-icon.save,.x-button-pressing .list-icon.save,.x-button-pressed .x-button-icon.save,.x-button-pressed .list-icon.save,.x-button-active .x-button-icon.save,.x-button-active .list-icon.save,.x-item-pressed .x-button-icon.save,.x-item-pressed .list-icon.save{background-position:-24px 0px}.x-button-icon.undo,.list-icon.undo{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -24px;background-size:72px 888px}.x-button-pressing .x-button-icon.undo,.x-button-pressing .list-icon.undo,.x-button-pressed .x-button-icon.undo,.x-button-pressed .list-icon.undo,.x-button-active .x-button-icon.undo,.x-button-active .list-icon.undo,.x-item-pressed .x-button-icon.undo,.x-item-pressed .list-icon.undo{background-position:-24px -24px}.x-button-icon.share,.list-icon.share{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -48px;background-size:72px 888px}.x-button-pressing .x-button-icon.share,.x-button-pressing .list-icon.share,.x-button-pressed .x-button-icon.share,.x-button-pressed .list-icon.share,.x-button-active .x-button-icon.share,.x-button-active .list-icon.share,.x-item-pressed .x-button-icon.share,.x-item-pressed .list-icon.share{background-position:-24px -48px}.x-button-icon.font-style,.list-icon.font-style{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -72px;background-size:72px 888px}.x-button-pressing .x-button-icon.font-style,.x-button-pressing .list-icon.font-style,.x-button-pressed .x-button-icon.font-style,.x-button-pressed .list-icon.font-style,.x-button-active .x-button-icon.font-style,.x-button-active .list-icon.font-style,.x-item-pressed .x-button-icon.font-style,.x-item-pressed .list-icon.font-style{background-position:-24px -72px}.x-button-icon.font-color,.list-icon.font-color{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -96px;background-size:72px 888px}.x-button-pressing .x-button-icon.font-color,.x-button-pressing .list-icon.font-color,.x-button-pressed .x-button-icon.font-color,.x-button-pressed .list-icon.font-color,.x-button-active .x-button-icon.font-color,.x-button-active .list-icon.font-color,.x-item-pressed .x-button-icon.font-color,.x-item-pressed .list-icon.font-color{background-position:-24px -96px}.x-button-icon.bold,.list-icon.bold{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -120px;background-size:72px 888px}.x-button-pressing .x-button-icon.bold,.x-button-pressing .list-icon.bold,.x-button-pressed .x-button-icon.bold,.x-button-pressed .list-icon.bold,.x-button-active .x-button-icon.bold,.x-button-active .list-icon.bold,.x-item-pressed .x-button-icon.bold,.x-item-pressed .list-icon.bold{background-position:-24px -120px}.x-button-icon.italic,.list-icon.italic{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -144px;background-size:72px 888px}.x-button-pressing .x-button-icon.italic,.x-button-pressing .list-icon.italic,.x-button-pressed .x-button-icon.italic,.x-button-pressed .list-icon.italic,.x-button-active .x-button-icon.italic,.x-button-active .list-icon.italic,.x-item-pressed .x-button-icon.italic,.x-item-pressed .list-icon.italic{background-position:-24px -144px}.x-button-icon.underline,.list-icon.underline{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -168px;background-size:72px 888px}.x-button-pressing .x-button-icon.underline,.x-button-pressing .list-icon.underline,.x-button-pressed .x-button-icon.underline,.x-button-pressed .list-icon.underline,.x-button-active .x-button-icon.underline,.x-button-active .list-icon.underline,.x-item-pressed .x-button-icon.underline,.x-item-pressed .list-icon.underline{background-position:-24px -168px}.x-button-icon.align-left,.list-icon.align-left{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -192px;background-size:72px 888px}.x-button-pressing .x-button-icon.align-left,.x-button-pressing .list-icon.align-left,.x-button-pressed .x-button-icon.align-left,.x-button-pressed .list-icon.align-left,.x-button-active .x-button-icon.align-left,.x-button-active .list-icon.align-left,.x-item-pressed .x-button-icon.align-left,.x-item-pressed .list-icon.align-left{background-position:-24px -192px}.x-button-icon.align-center,.list-icon.align-center{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -216px;background-size:72px 888px}.x-button-pressing .x-button-icon.align-center,.x-button-pressing .list-icon.align-center,.x-button-pressed .x-button-icon.align-center,.x-button-pressed .list-icon.align-center,.x-button-active .x-button-icon.align-center,.x-button-active .list-icon.align-center,.x-item-pressed .x-button-icon.align-center,.x-item-pressed .list-icon.align-center{background-position:-24px -216px}.x-button-icon.align-right,.list-icon.align-right{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -240px;background-size:72px 888px}.x-button-pressing .x-button-icon.align-right,.x-button-pressing .list-icon.align-right,.x-button-pressed .x-button-icon.align-right,.x-button-pressed .list-icon.align-right,.x-button-active .x-button-icon.align-right,.x-button-active .list-icon.align-right,.x-item-pressed .x-button-icon.align-right,.x-item-pressed .list-icon.align-right{background-position:-24px -240px}.x-button-icon.align-fill,.list-icon.align-fill{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -264px;background-size:72px 888px}.x-button-pressing .x-button-icon.align-fill,.x-button-pressing .list-icon.align-fill,.x-button-pressed .x-button-icon.align-fill,.x-button-pressed .list-icon.align-fill,.x-button-active .x-button-icon.align-fill,.x-button-active .list-icon.align-fill,.x-item-pressed .x-button-icon.align-fill,.x-item-pressed .list-icon.align-fill{background-position:-24px -264px}.x-button-icon.bullets,.list-icon.bullets{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -288px;background-size:72px 888px}.x-button-pressing .x-button-icon.bullets,.x-button-pressing .list-icon.bullets,.x-button-pressed .x-button-icon.bullets,.x-button-pressed .list-icon.bullets,.x-button-active .x-button-icon.bullets,.x-button-active .list-icon.bullets,.x-item-pressed .x-button-icon.bullets,.x-item-pressed .list-icon.bullets{background-position:-24px -288px}.x-button-icon.spacing,.list-icon.spacing{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -312px;background-size:72px 888px}.x-button-pressing .x-button-icon.spacing,.x-button-pressing .list-icon.spacing,.x-button-pressed .x-button-icon.spacing,.x-button-pressed .list-icon.spacing,.x-button-active .x-button-icon.spacing,.x-button-active .list-icon.spacing,.x-item-pressed .x-button-icon.spacing,.x-item-pressed .list-icon.spacing{background-position:-24px -312px}.x-button-icon.page-number,.list-icon.page-number{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -336px;background-size:72px 888px}.x-button-pressing .x-button-icon.page-number,.x-button-pressing .list-icon.page-number,.x-button-pressed .x-button-icon.page-number,.x-button-pressed .list-icon.page-number,.x-button-active .x-button-icon.page-number,.x-button-active .list-icon.page-number,.x-item-pressed .x-button-icon.page-number,.x-item-pressed .list-icon.page-number{background-position:-24px -336px}.x-button-icon.insert,.list-icon.insert{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -360px;background-size:72px 888px}.x-button-pressing .x-button-icon.insert,.x-button-pressing .list-icon.insert,.x-button-pressed .x-button-icon.insert,.x-button-pressed .list-icon.insert,.x-button-active .x-button-icon.insert,.x-button-active .list-icon.insert,.x-item-pressed .x-button-icon.insert,.x-item-pressed .list-icon.insert{background-position:-24px -360px}.x-button-icon.search,.list-icon.search{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -384px;background-size:72px 888px}.x-button-pressing .x-button-icon.search,.x-button-pressing .list-icon.search,.x-button-pressed .x-button-icon.search,.x-button-pressed .list-icon.search,.x-button-active .x-button-icon.search,.x-button-active .list-icon.search,.x-item-pressed .x-button-icon.search,.x-item-pressed .list-icon.search{background-position:-24px -384px}.x-button-icon.fullscreen,.list-icon.fullscreen{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -408px;background-size:72px 888px}.x-button-pressing .x-button-icon.fullscreen,.x-button-pressing .list-icon.fullscreen,.x-button-pressed .x-button-icon.fullscreen,.x-button-pressed .list-icon.fullscreen,.x-button-active .x-button-icon.fullscreen,.x-button-active .list-icon.fullscreen,.x-item-pressed .x-button-icon.fullscreen,.x-item-pressed .list-icon.fullscreen{background-position:-24px -408px}.x-button-icon.spinner-down,.list-icon.spinner-down{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -432px;background-size:72px 888px}.x-button-pressing .x-button-icon.spinner-down,.x-button-pressing .list-icon.spinner-down,.x-button-pressed .x-button-icon.spinner-down,.x-button-pressed .list-icon.spinner-down,.x-button-active .x-button-icon.spinner-down,.x-button-active .list-icon.spinner-down,.x-item-pressed .x-button-icon.spinner-down,.x-item-pressed .list-icon.spinner-down{background-position:-24px -432px}.x-button-icon.spinner-up,.list-icon.spinner-up{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -456px;background-size:72px 888px}.x-button-pressing .x-button-icon.spinner-up,.x-button-pressing .list-icon.spinner-up,.x-button-pressed .x-button-icon.spinner-up,.x-button-pressed .list-icon.spinner-up,.x-button-active .x-button-icon.spinner-up,.x-button-active .list-icon.spinner-up,.x-item-pressed .x-button-icon.spinner-up,.x-item-pressed .list-icon.spinner-up{background-position:-24px -456px}.x-button-icon.superscript,.list-icon.superscript{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -480px;background-size:72px 888px}.x-button-pressing .x-button-icon.superscript,.x-button-pressing .list-icon.superscript,.x-button-pressed .x-button-icon.superscript,.x-button-pressed .list-icon.superscript,.x-button-active .x-button-icon.superscript,.x-button-active .list-icon.superscript,.x-item-pressed .x-button-icon.superscript,.x-item-pressed .list-icon.superscript{background-position:-24px -480px}.x-button-icon.subscript,.list-icon.subscript{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -504px;background-size:72px 888px}.x-button-pressing .x-button-icon.subscript,.x-button-pressing .list-icon.subscript,.x-button-pressed .x-button-icon.subscript,.x-button-pressed .list-icon.subscript,.x-button-active .x-button-icon.subscript,.x-button-active .list-icon.subscript,.x-item-pressed .x-button-icon.subscript,.x-item-pressed .list-icon.subscript{background-position:-24px -504px}.x-button-icon.table,.list-icon.table{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -528px;background-size:72px 888px}.x-button-pressing .x-button-icon.table,.x-button-pressing .list-icon.table,.x-button-pressed .x-button-icon.table,.x-button-pressed .list-icon.table,.x-button-active .x-button-icon.table,.x-button-active .list-icon.table,.x-item-pressed .x-button-icon.table,.x-item-pressed .list-icon.table{background-position:-24px -528px}.x-button-icon.picture,.list-icon.picture{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -552px;background-size:72px 888px}.x-button-pressing .x-button-icon.picture,.x-button-pressing .list-icon.picture,.x-button-pressed .x-button-icon.picture,.x-button-pressed .list-icon.picture,.x-button-active .x-button-icon.picture,.x-button-active .list-icon.picture,.x-item-pressed .x-button-icon.picture,.x-item-pressed .list-icon.picture{background-position:-24px -552px}.x-button-icon.spacing,.list-icon.spacing{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -576px;background-size:72px 888px}.x-button-pressing .x-button-icon.spacing,.x-button-pressing .list-icon.spacing,.x-button-pressed .x-button-icon.spacing,.x-button-pressed .list-icon.spacing,.x-button-active .x-button-icon.spacing,.x-button-active .list-icon.spacing,.x-item-pressed .x-button-icon.spacing,.x-item-pressed .list-icon.spacing{background-position:-24px -576px}.x-button-icon.indent-inc,.list-icon.indent-inc{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -600px;background-size:72px 888px}.x-button-pressing .x-button-icon.indent-inc,.x-button-pressing .list-icon.indent-inc,.x-button-pressed .x-button-icon.indent-inc,.x-button-pressed .list-icon.indent-inc,.x-button-active .x-button-icon.indent-inc,.x-button-active .list-icon.indent-inc,.x-item-pressed .x-button-icon.indent-inc,.x-item-pressed .list-icon.indent-inc{background-position:-24px -600px}.x-button-icon.indent-dec,.list-icon.indent-dec{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -624px;background-size:72px 888px}.x-button-pressing .x-button-icon.indent-dec,.x-button-pressing .list-icon.indent-dec,.x-button-pressed .x-button-icon.indent-dec,.x-button-pressed .list-icon.indent-dec,.x-button-active .x-button-icon.indent-dec,.x-button-active .list-icon.indent-dec,.x-item-pressed .x-button-icon.indent-dec,.x-item-pressed .list-icon.indent-dec{background-position:-24px -624px}.x-button-icon.numbering,.list-icon.numbering{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -648px;background-size:72px 888px}.x-button-pressing .x-button-icon.numbering,.x-button-pressing .list-icon.numbering,.x-button-pressed .x-button-icon.numbering,.x-button-pressed .list-icon.numbering,.x-button-active .x-button-icon.numbering,.x-button-active .list-icon.numbering,.x-item-pressed .x-button-icon.numbering,.x-item-pressed .list-icon.numbering{background-position:-24px -648px}.x-button-icon.outline,.list-icon.outline{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -672px;background-size:72px 888px}.x-button-pressing .x-button-icon.outline,.x-button-pressing .list-icon.outline,.x-button-pressed .x-button-icon.outline,.x-button-pressed .list-icon.outline,.x-button-active .x-button-icon.outline,.x-button-active .list-icon.outline,.x-item-pressed .x-button-icon.outline,.x-item-pressed .list-icon.outline{background-position:-24px -672px}.x-button-icon.insert-row,.list-icon.insert-row{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -696px;background-size:72px 888px}.x-button-pressing .x-button-icon.insert-row,.x-button-pressing .list-icon.insert-row,.x-button-pressed .x-button-icon.insert-row,.x-button-pressed .list-icon.insert-row,.x-button-active .x-button-icon.insert-row,.x-button-active .list-icon.insert-row,.x-item-pressed .x-button-icon.insert-row,.x-item-pressed .list-icon.insert-row{background-position:-24px -696px}.x-button-icon.insert-column,.list-icon.insert-column{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -720px;background-size:72px 888px}.x-button-pressing .x-button-icon.insert-column,.x-button-pressing .list-icon.insert-column,.x-button-pressed .x-button-icon.insert-column,.x-button-pressed .list-icon.insert-column,.x-button-active .x-button-icon.insert-column,.x-button-active .list-icon.insert-column,.x-item-pressed .x-button-icon.insert-column,.x-item-pressed .list-icon.insert-column{background-position:-24px -720px}.x-button-icon.highlightcolor,.list-icon.highlightcolor{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -744px;background-size:72px 888px}.x-button-pressing .x-button-icon.highlightcolor,.x-button-pressing .list-icon.highlightcolor,.x-button-pressed .x-button-icon.highlightcolor,.x-button-pressed .list-icon.highlightcolor,.x-button-active .x-button-icon.highlightcolor,.x-button-active .list-icon.highlightcolor,.x-item-pressed .x-button-icon.highlightcolor,.x-item-pressed .list-icon.highlightcolor{background-position:-24px -744px}.x-button-icon.textcolor,.list-icon.textcolor{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -768px;background-size:72px 888px}.x-button-pressing .x-button-icon.textcolor,.x-button-pressing .list-icon.textcolor,.x-button-pressed .x-button-icon.textcolor,.x-button-pressed .list-icon.textcolor,.x-button-active .x-button-icon.textcolor,.x-button-active .list-icon.textcolor,.x-item-pressed .x-button-icon.textcolor,.x-item-pressed .list-icon.textcolor{background-position:-24px -768px}.x-button-icon.textbigger,.list-icon.textbigger{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -792px;background-size:72px 888px}.x-button-pressing .x-button-icon.textbigger,.x-button-pressing .list-icon.textbigger,.x-button-pressed .x-button-icon.textbigger,.x-button-pressed .list-icon.textbigger,.x-button-active .x-button-icon.textbigger,.x-button-active .list-icon.textbigger,.x-item-pressed .x-button-icon.textbigger,.x-item-pressed .list-icon.textbigger{background-position:-24px -792px}.x-button-icon.textless,.list-icon.textless{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -816px;background-size:72px 888px}.x-button-pressing .x-button-icon.textless,.x-button-pressing .list-icon.textless,.x-button-pressed .x-button-icon.textless,.x-button-pressed .list-icon.textless,.x-button-active .x-button-icon.textless,.x-button-active .list-icon.textless,.x-item-pressed .x-button-icon.textless,.x-item-pressed .list-icon.textless{background-position:-24px -816px}.x-button-icon.spinner-prev,.list-icon.spinner-prev{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -840px;background-size:72px 888px}.x-button-pressing .x-button-icon.spinner-prev,.x-button-pressing .list-icon.spinner-prev,.x-button-pressed .x-button-icon.spinner-prev,.x-button-pressed .list-icon.spinner-prev,.x-button-active .x-button-icon.spinner-prev,.x-button-active .list-icon.spinner-prev,.x-item-pressed .x-button-icon.spinner-prev,.x-item-pressed .list-icon.spinner-prev{background-position:-24px -840px}.x-button-icon.spinner-next,.list-icon.spinner-next{background-image:url("../img/icons/icons-normal.png");background-color:transparent;background-position:0 -864px;background-size:72px 888px}.x-button-pressing .x-button-icon.spinner-next,.x-button-pressing .list-icon.spinner-next,.x-button-pressed .x-button-icon.spinner-next,.x-button-pressed .list-icon.spinner-next,.x-button-active .x-button-icon.spinner-next,.x-button-active .list-icon.spinner-next,.x-item-pressed .x-button-icon.spinner-next,.x-item-pressed .list-icon.spinner-next{background-position:-24px -864px}.x-button.x-button-base{padding:.3em 8px}.x-button.x-button-base,.x-toolbar .x-button.x-button-base{border:1px solid #939393;border-top-color:#a5a5a5;min-height:29px;padding-top:0;padding-bottom:0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:rgba(255,255,255,0.35) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.35) 0 1px 0;box-shadow:rgba(255,255,255,0.35) 0 1px 0;color:#000}.x-button.x-button-base .x-button-icon,.x-toolbar .x-button.x-button-base .x-button-icon{width:24px;height:24px}.x-button.x-button-base.x-button-forward:before,.x-button.x-button-base.x-button-forward:after,.x-button.x-button-base.x-button-back:before,.x-button.x-button-base.x-button-back:after,.x-toolbar .x-button.x-button-base.x-button-forward:before,.x-toolbar .x-button.x-button-base.x-button-forward:after,.x-toolbar .x-button.x-button-base.x-button-back:before,.x-toolbar .x-button.x-button-base.x-button-back:after{-webkit-mask-size:.80717em 1.75em}.x-button.x-button-base .x-button-label,.x-button.x-button-base .x-badge,.x-toolbar .x-button.x-button-base .x-button-label,.x-toolbar .x-button.x-button-base .x-badge{color:#323232;text-shadow:#fff 0 0.09em 0}.x-button.x-button-base.x-button-back:before,.x-button.x-button-base.x-button-forward:before,.x-toolbar .x-button.x-button-base.x-button-back:before,.x-toolbar .x-button.x-button-base.x-button-forward:before{background:#989898}.x-button.x-button-base,.x-button.x-button-base.x-button-back:after,.x-button.x-button-base.x-button-forward:after,.x-toolbar .x-button.x-button-base,.x-toolbar .x-button.x-button-base.x-button-back:after,.x-toolbar .x-button.x-button-base.x-button-forward:after{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-moz-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-o-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-ms-linear-gradient(to bottom, #ffffff,#ececec 3%,#cbcbcb)}.x-button.x-button-base.x-button-pressing,.x-button.x-button-base.x-button-pressing:after,.x-button.x-button-base.x-button-pressed,.x-button.x-button-base.x-button-pressed:after,.x-button.x-button-base.x-button-active,.x-button.x-button-base.x-button-active:after,.x-toolbar .x-button.x-button-base.x-button-pressing,.x-toolbar .x-button.x-button-base.x-button-pressing:after,.x-toolbar .x-button.x-button-base.x-button-pressed,.x-toolbar .x-button.x-button-base.x-button-pressed:after,.x-toolbar .x-button.x-button-base.x-button-active,.x-toolbar .x-button.x-button-base.x-button-active:after{background-image:none;background-color:#656565;background-image:-webkit-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-moz-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-o-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-ms-linear-gradient(to bottom, #4c4c4c,#585858 10%,#656565 65%,#666666)}.x-button.x-button-base.x-button-pressing .x-button-label,.x-button.x-button-base.x-button-pressing .x-badge,.x-button.x-button-base.x-button-pressed .x-button-label,.x-button.x-button-base.x-button-pressed .x-badge,.x-button.x-button-base.x-button-active .x-button-label,.x-button.x-button-base.x-button-active .x-badge,.x-toolbar .x-button.x-button-base.x-button-pressing .x-button-label,.x-toolbar .x-button.x-button-base.x-button-pressing .x-badge,.x-toolbar .x-button.x-button-base.x-button-pressed .x-button-label,.x-toolbar .x-button.x-button-base.x-button-pressed .x-badge,.x-toolbar .x-button.x-button-base.x-button-active .x-button-label,.x-toolbar .x-button.x-button-base.x-button-active .x-badge{color:#fff;text-shadow:#4c4c4c 0 0.09em 0}.x-segmentedbutton-base:not(.divided){margin:0 .2em}.x-segmentedbutton-base:not(.divided) .x-button-base{margin:0;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.x-segmentedbutton-base:not(.divided) .x-button-base:not(.x-first){border-left:0 !important}.x-segmentedbutton-base.divided .x-button-base:not(.x-first){border-left:1px solid #939393}.x-segmentedbutton-base.divided .x-button-base:not(.x-last){margin-right:7px}.x-segmentedbutton-base .x-button-base.x-first{-moz-border-radius-topleft:2px !important;-webkit-border-top-left-radius:2px !important;border-top-left-radius:2px !important;-moz-border-radius-bottomleft:2px !important;-webkit-border-bottom-left-radius:2px !important;border-bottom-left-radius:2px !important}.x-segmentedbutton-base .x-button-base.x-last{-moz-border-radius-topright:2px !important;-webkit-border-top-right-radius:2px !important;border-top-right-radius:2px !important;-moz-border-radius-bottomright:2px !important;-webkit-border-bottom-right-radius:2px !important;border-bottom-right-radius:2px !important}.x-button.x-button-light{padding:.3em 8px}.x-button.x-button-light,.x-toolbar .x-button.x-button-light{border:1px solid #c7c7c7;border-top-color:#d9d9d9;min-height:29px;padding-top:0;padding-bottom:0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:rgba(255,255,255,0.35) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.35) 0 1px 0;box-shadow:rgba(255,255,255,0.35) 0 1px 0;color:#262626}.x-button.x-button-light .x-button-icon,.x-toolbar .x-button.x-button-light .x-button-icon{width:24px;height:24px}.x-button.x-button-light.x-button-forward:before,.x-button.x-button-light.x-button-forward:after,.x-button.x-button-light.x-button-back:before,.x-button.x-button-light.x-button-back:after,.x-toolbar .x-button.x-button-light.x-button-forward:before,.x-toolbar .x-button.x-button-light.x-button-forward:after,.x-toolbar .x-button.x-button-light.x-button-back:before,.x-toolbar .x-button.x-button-light.x-button-back:after{-webkit-mask-size:.80717em 1.75em}.x-button.x-button-light .x-button-label,.x-button.x-button-light .x-badge,.x-toolbar .x-button.x-button-light .x-button-label,.x-toolbar .x-button.x-button-light .x-badge{color:#666;text-shadow:#fff 0 0.09em 0}.x-button.x-button-light.x-button-back:before,.x-button.x-button-light.x-button-forward:before,.x-toolbar .x-button.x-button-light.x-button-back:before,.x-toolbar .x-button.x-button-light.x-button-forward:before{background:#ccc}.x-button.x-button-light,.x-button.x-button-light.x-button-back:after,.x-button.x-button-light.x-button-forward:after,.x-toolbar .x-button.x-button-light,.x-toolbar .x-button.x-button-light.x-button-back:after,.x-toolbar .x-button.x-button-light.x-button-forward:after{background-image:none;background-color:#fff;background-image:-webkit-linear-gradient(top, #ffffff,#ffffff 3%,#ffffff);background-image:-moz-linear-gradient(top, #ffffff,#ffffff 3%,#ffffff);background-image:-o-linear-gradient(top, #ffffff,#ffffff 3%,#ffffff);background-image:-ms-linear-gradient(to bottom, #ffffff,#ffffff 3%,#ffffff)}.x-button.x-button-light.x-button-pressing,.x-button.x-button-light.x-button-pressing:after,.x-button.x-button-light.x-button-pressed,.x-button.x-button-light.x-button-pressed:after,.x-button.x-button-light.x-button-active,.x-button.x-button-light.x-button-active:after,.x-toolbar .x-button.x-button-light.x-button-pressing,.x-toolbar .x-button.x-button-light.x-button-pressing:after,.x-toolbar .x-button.x-button-light.x-button-pressed,.x-toolbar .x-button.x-button-light.x-button-pressed:after,.x-toolbar .x-button.x-button-light.x-button-active,.x-toolbar .x-button.x-button-light.x-button-active:after{background-image:none;background-color:#999;background-image:-webkit-linear-gradient(top, #808080,#8c8c8c 10%,#999999 65%,#9a9a9a);background-image:-moz-linear-gradient(top, #808080,#8c8c8c 10%,#999999 65%,#9a9a9a);background-image:-o-linear-gradient(top, #808080,#8c8c8c 10%,#999999 65%,#9a9a9a);background-image:-ms-linear-gradient(to bottom, #808080,#8c8c8c 10%,#999999 65%,#9a9a9a)}.x-button.x-button-light.x-button-pressing .x-button-label,.x-button.x-button-light.x-button-pressing .x-badge,.x-button.x-button-light.x-button-pressed .x-button-label,.x-button.x-button-light.x-button-pressed .x-badge,.x-button.x-button-light.x-button-active .x-button-label,.x-button.x-button-light.x-button-active .x-badge,.x-toolbar .x-button.x-button-light.x-button-pressing .x-button-label,.x-toolbar .x-button.x-button-light.x-button-pressing .x-badge,.x-toolbar .x-button.x-button-light.x-button-pressed .x-button-label,.x-toolbar .x-button.x-button-light.x-button-pressed .x-badge,.x-toolbar .x-button.x-button-light.x-button-active .x-button-label,.x-toolbar .x-button.x-button-light.x-button-active .x-badge{color:#fff;text-shadow:gray 0 0.09em 0}.x-segmentedbutton-base:not(.divided){margin:0 .2em}.x-segmentedbutton-base:not(.divided) .x-button-light{margin:0;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.x-segmentedbutton-base:not(.divided) .x-button-light:not(.x-first){border-left:0 !important}.x-segmentedbutton-base.divided .x-button-light:not(.x-first){border-left:1px solid #c7c7c7}.x-segmentedbutton-base.divided .x-button-light:not(.x-last){margin-right:7px}.x-segmentedbutton-base .x-button-light.x-first{-moz-border-radius-topleft:2px !important;-webkit-border-top-left-radius:2px !important;border-top-left-radius:2px !important;-moz-border-radius-bottomleft:2px !important;-webkit-border-bottom-left-radius:2px !important;border-bottom-left-radius:2px !important}.x-segmentedbutton-base .x-button-light.x-last{-moz-border-radius-topright:2px !important;-webkit-border-top-right-radius:2px !important;border-top-right-radius:2px !important;-moz-border-radius-bottomright:2px !important;-webkit-border-bottom-right-radius:2px !important;border-bottom-right-radius:2px !important}.x-button.x-button-base-blue{padding:.3em 8px}.x-button.x-button-base-blue,.x-toolbar .x-button.x-button-base-blue{border:1px solid #2e519b;border-top-color:#3760b7;min-height:29px;padding-top:0;padding-bottom:0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:rgba(255,255,255,0.35) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.35) 0 1px 0;box-shadow:rgba(255,255,255,0.35) 0 1px 0;color:#fff}.x-button.x-button-base-blue .x-button-icon,.x-toolbar .x-button.x-button-base-blue .x-button-icon{width:24px;height:24px}.x-button.x-button-base-blue.x-button-forward:before,.x-button.x-button-base-blue.x-button-forward:after,.x-button.x-button-base-blue.x-button-back:before,.x-button.x-button-base-blue.x-button-back:after,.x-toolbar .x-button.x-button-base-blue.x-button-forward:before,.x-toolbar .x-button.x-button-base-blue.x-button-forward:after,.x-toolbar .x-button.x-button-base-blue.x-button-back:before,.x-toolbar .x-button.x-button-base-blue.x-button-back:after{-webkit-mask-size:.80717em 1.75em}.x-button.x-button-base-blue .x-button-label,.x-button.x-button-base-blue .x-badge,.x-toolbar .x-button.x-button-base-blue .x-button-label,.x-toolbar .x-button.x-button-base-blue .x-badge{color:#fff;text-shadow:#2e519b 0 -0.09em 0}.x-button.x-button-base-blue.x-button-back:before,.x-button.x-button-base-blue.x-button-forward:before,.x-toolbar .x-button.x-button-base-blue.x-button-back:before,.x-toolbar .x-button.x-button-base-blue.x-button-forward:before{background:#3155a3}.x-button.x-button-base-blue,.x-button.x-button-base-blue.x-button-back:after,.x-button.x-button-base-blue.x-button-forward:after,.x-toolbar .x-button.x-button-base-blue,.x-toolbar .x-button.x-button-base-blue.x-button-back:after,.x-toolbar .x-button.x-button-base-blue.x-button-forward:after{background-image:none;background-color:#688AD2;background-image:-webkit-linear-gradient(top, #ffffff,#9bb2e1 3%,#688ad2);background-image:-moz-linear-gradient(top, #ffffff,#9bb2e1 3%,#688ad2);background-image:-o-linear-gradient(top, #ffffff,#9bb2e1 3%,#688ad2);background-image:-ms-linear-gradient(to bottom, #ffffff,#9bb2e1 3%,#688ad2)}.x-button.x-button-base-blue.x-button-pressing,.x-button.x-button-base-blue.x-button-pressing:after,.x-button.x-button-base-blue.x-button-pressed,.x-button.x-button-base-blue.x-button-pressed:after,.x-button.x-button-base-blue.x-button-active,.x-button.x-button-base-blue.x-button-active:after,.x-toolbar .x-button.x-button-base-blue.x-button-pressing,.x-toolbar .x-button.x-button-base-blue.x-button-pressing:after,.x-toolbar .x-button.x-button-base-blue.x-button-pressed,.x-toolbar .x-button.x-button-base-blue.x-button-pressed:after,.x-toolbar .x-button.x-button-base-blue.x-button-active,.x-toolbar .x-button.x-button-base-blue.x-button-active:after{background-image:none;background-color:#416cc6;background-image:-webkit-linear-gradient(top, #3155a3,#3760b7 10%,#416cc6 65%,#436dc7);background-image:-moz-linear-gradient(top, #3155a3,#3760b7 10%,#416cc6 65%,#436dc7);background-image:-o-linear-gradient(top, #3155a3,#3760b7 10%,#416cc6 65%,#436dc7);background-image:-ms-linear-gradient(to bottom, #3155a3,#3760b7 10%,#416cc6 65%,#436dc7)}.x-button.x-button-base-blue.x-button-pressing .x-button-label,.x-button.x-button-base-blue.x-button-pressing .x-badge,.x-button.x-button-base-blue.x-button-pressed .x-button-label,.x-button.x-button-base-blue.x-button-pressed .x-badge,.x-button.x-button-base-blue.x-button-active .x-button-label,.x-button.x-button-base-blue.x-button-active .x-badge,.x-toolbar .x-button.x-button-base-blue.x-button-pressing .x-button-label,.x-toolbar .x-button.x-button-base-blue.x-button-pressing .x-badge,.x-toolbar .x-button.x-button-base-blue.x-button-pressed .x-button-label,.x-toolbar .x-button.x-button-base-blue.x-button-pressed .x-badge,.x-toolbar .x-button.x-button-base-blue.x-button-active .x-button-label,.x-toolbar .x-button.x-button-base-blue.x-button-active .x-badge{text-shadow:#2e519b 0 0.09em 0}.x-segmentedbutton-base:not(.divided){margin:0 .2em}.x-segmentedbutton-base:not(.divided) .x-button-base-blue{margin:0;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.x-segmentedbutton-base:not(.divided) .x-button-base-blue:not(.x-first){border-left:0 !important}.x-segmentedbutton-base.divided .x-button-base-blue:not(.x-first){border-left:1px solid #2e519b}.x-segmentedbutton-base.divided .x-button-base-blue:not(.x-last){margin-right:7px}.x-segmentedbutton-base .x-button-base-blue.x-first{-moz-border-radius-topleft:2px !important;-webkit-border-top-left-radius:2px !important;border-top-left-radius:2px !important;-moz-border-radius-bottomleft:2px !important;-webkit-border-bottom-left-radius:2px !important;border-bottom-left-radius:2px !important}.x-segmentedbutton-base .x-button-base-blue.x-last{-moz-border-radius-topright:2px !important;-webkit-border-top-right-radius:2px !important;border-top-right-radius:2px !important;-moz-border-radius-bottomright:2px !important;-webkit-border-bottom-right-radius:2px !important;border-bottom-right-radius:2px !important}.x-button.x-button-back{padding:.3em 8px}.x-button.x-button-back,.x-toolbar .x-button.x-button-back{border:1px solid #939393;border-top-color:#a5a5a5;min-height:29px;padding-top:0;padding-bottom:0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:rgba(255,255,255,0.35) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.35) 0 1px 0;box-shadow:rgba(255,255,255,0.35) 0 1px 0;color:#000}.x-button.x-button-back .x-button-icon,.x-toolbar .x-button.x-button-back .x-button-icon{width:24px;height:24px}.x-button.x-button-back.x-button-forward:before,.x-button.x-button-back.x-button-forward:after,.x-button.x-button-back.x-button-back:before,.x-button.x-button-back.x-button-back:after,.x-toolbar .x-button.x-button-back.x-button-forward:before,.x-toolbar .x-button.x-button-back.x-button-forward:after,.x-toolbar .x-button.x-button-back.x-button-back:before,.x-toolbar .x-button.x-button-back.x-button-back:after{-webkit-mask-size:.80717em 1.75em}.x-button.x-button-back .x-button-label,.x-button.x-button-back .x-badge,.x-toolbar .x-button.x-button-back .x-button-label,.x-toolbar .x-button.x-button-back .x-badge{color:#323232;text-shadow:#fff 0 0.09em 0}.x-button.x-button-back.x-button-back:before,.x-button.x-button-back.x-button-forward:before,.x-toolbar .x-button.x-button-back.x-button-back:before,.x-toolbar .x-button.x-button-back.x-button-forward:before{background:#989898}.x-button.x-button-back,.x-button.x-button-back.x-button-back:after,.x-button.x-button-back.x-button-forward:after,.x-toolbar .x-button.x-button-back,.x-toolbar .x-button.x-button-back.x-button-back:after,.x-toolbar .x-button.x-button-back.x-button-forward:after{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-moz-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-o-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-ms-linear-gradient(to bottom, #ffffff,#ececec 3%,#cbcbcb)}.x-button.x-button-back.x-button-pressing,.x-button.x-button-back.x-button-pressing:after,.x-button.x-button-back.x-button-pressed,.x-button.x-button-back.x-button-pressed:after,.x-button.x-button-back.x-button-active,.x-button.x-button-back.x-button-active:after,.x-toolbar .x-button.x-button-back.x-button-pressing,.x-toolbar .x-button.x-button-back.x-button-pressing:after,.x-toolbar .x-button.x-button-back.x-button-pressed,.x-toolbar .x-button.x-button-back.x-button-pressed:after,.x-toolbar .x-button.x-button-back.x-button-active,.x-toolbar .x-button.x-button-back.x-button-active:after{background-image:none;background-color:#656565;background-image:-webkit-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-moz-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-o-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-ms-linear-gradient(to bottom, #4c4c4c,#585858 10%,#656565 65%,#666666)}.x-button.x-button-back.x-button-pressing .x-button-label,.x-button.x-button-back.x-button-pressing .x-badge,.x-button.x-button-back.x-button-pressed .x-button-label,.x-button.x-button-back.x-button-pressed .x-badge,.x-button.x-button-back.x-button-active .x-button-label,.x-button.x-button-back.x-button-active .x-badge,.x-toolbar .x-button.x-button-back.x-button-pressing .x-button-label,.x-toolbar .x-button.x-button-back.x-button-pressing .x-badge,.x-toolbar .x-button.x-button-back.x-button-pressed .x-button-label,.x-toolbar .x-button.x-button-back.x-button-pressed .x-badge,.x-toolbar .x-button.x-button-back.x-button-active .x-button-label,.x-toolbar .x-button.x-button-back.x-button-active .x-badge{color:#fff;text-shadow:#4c4c4c 0 0.09em 0}.x-button.x-button-back,.x-toolbar .x-button.x-button-back{-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}.x-segmentedbutton-base:not(.divided){margin:0 .2em}.x-segmentedbutton-base:not(.divided) .x-button-back{margin:0;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.x-segmentedbutton-base:not(.divided) .x-button-back:not(.x-first){border-left:0 !important}.x-segmentedbutton-base.divided .x-button-back:not(.x-first){border-left:1px solid #939393}.x-segmentedbutton-base.divided .x-button-back:not(.x-last){margin-right:7px}.x-segmentedbutton-base .x-button-back.x-first{-moz-border-radius-topleft:2px !important;-webkit-border-top-left-radius:2px !important;border-top-left-radius:2px !important;-moz-border-radius-bottomleft:2px !important;-webkit-border-bottom-left-radius:2px !important;border-bottom-left-radius:2px !important}.x-segmentedbutton-base .x-button-back.x-last{-moz-border-radius-topright:2px !important;-webkit-border-top-right-radius:2px !important;border-top-right-radius:2px !important;-moz-border-radius-bottomright:2px !important;-webkit-border-bottom-right-radius:2px !important;border-bottom-right-radius:2px !important}.unsuported-view{position:absolute;left:0;top:0;right:0;bottom:0;background:url(../img/ios-only.png) no-repeat center #efefef;background-attachment:fixed;z-index:90000}.x-button.text-offset-12{padding-left:12px;padding-right:12px}.x-button.text-offset-30{padding-left:30px;padding-right:30px} diff --git a/apps/documenteditor/mobile/resources/css/application-retina.css b/apps/documenteditor/mobile/resources/css/application-retina.css index 2112312a5..e879e83e7 100644 --- a/apps/documenteditor/mobile/resources/css/application-retina.css +++ b/apps/documenteditor/mobile/resources/css/application-retina.css @@ -1 +1 @@ -html,body{position:relative;width:100%;height:100%}.x-fullscreen{position:absolute !important}.x-body{position:relative;z-index:0}.x-inner,.x-body{width:100%;height:100%}.x-sized{position:relative}.x-innerhtml{width:100%}.x-layout-box{display:flex;display:-webkit-box;display:-ms-flexbox}.x-layout-box.x-horizontal{-webkit-box-orient:horizontal !important;-ms-flex-direction:row !important;flex-direction:row !important}.x-layout-box.x-horizontal>.x-layout-box-item.x-flexed{min-width:0 !important}.x-layout-box.x-vertical{-webkit-box-orient:vertical !important;-ms-flex-direction:column !important;flex-direction:column !important}.x-layout-box.x-vertical>.x-layout-box-item.x-flexed{min-height:0 !important}.x-layout-box>.x-layout-box-item{display:flex !important;display:-webkit-box !important;display:-ms-flexbox !important}.x-layout-box.x-align-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.x-layout-box.x-align-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.x-layout-box.x-align-end{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.x-layout-box.x-align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.x-layout-box.x-pack-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.x-layout-box.x-pack-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-layout-box.x-pack-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.x-layout-box.x-pack-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.x-layout-box-item.x-sized>.x-inner,.x-layout-box-item.x-sized>.x-body,.x-layout-box-item.x-sized>.x-dock-outer{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-webkit .x-layout-box.x-horizontal>.x-layout-box-item.x-flexed{width:0 !important}.x-webkit .x-layout-box.x-vertical>.x-layout-box-item.x-flexed{height:0 !important}.x-firefox .x-stretched.x-dock-horizontal>.x-dock-body{width:0}.x-firefox .x-stretched.x-dock-vertical>.x-dock-body{height:0}.x-firefox .x-container .x-dock-horizontal.x-unsized .x-dock-body{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px;min-height:0;min-width:0}.x-firefox .x-has-height>.x-dock.x-unsized.x-dock-vertical>.x-dock-body{height:0}.x-layout-card{position:relative;overflow:hidden}.x-layout-card-perspective{-webkit-perspective:1000px;-ms-perspective:1000px;perspective:1000px}.x-layout-card-item-container{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-layout-card-item{position:absolute;top:0;right:0;bottom:0;left:0;position:absolute !important}.x-dock{display:flex;display:-webkit-box;display:-ms-flexbox}.x-dock>.x-dock-body{overflow:hidden}.x-dock.x-sized,.x-dock.x-sized>.x-dock-body>*,.x-dock.x-sized>.x-dock-body>.x-body>.x-inner{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-dock.x-sized>.x-dock-body{position:relative;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-dock.x-unsized,.x-dock.x-stretched{height:100%}.x-dock.x-unsized>.x-dock-body,.x-dock.x-stretched>.x-dock-body{position:relative;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;min-height:0;min-width:0}.x-dock.x-unsized>.x-dock-body>*,.x-dock.x-stretched>.x-dock-body>*{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-dock.x-dock-vertical{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-dock.x-dock-horizontal{-webkit-box-orient:horizontal !important;-ms-flex-direction:row !important;flex-direction:row !important}.x-dock.x-dock-horizontal>.x-dock-item{display:flex;display:-webkit-box;display:-ms-flexbox}.x-dock.x-dock-horizontal>.x-dock-item.x-sized>.x-inner,.x-dock.x-dock-horizontal>.x-dock-item.x-sized>.x-body{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-dock.x-dock-horizontal>.x-dock-item.x-unsized{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-dock.x-dock-horizontal>.x-dock-item.x-unsized>*{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-ie .x-stretched.x-dock-horizontal>.x-dock-body{width:0}.x-ie .x-stretched.x-dock-vertical>.x-dock-body{height:0}.x-ie .x-has-width>.x-dock.x-unsized.x-dock-horizontal>.x-dock-body{width:0}.x-ie .x-has-height>.x-dock.x-unsized.x-dock-vertical>.x-dock-body{height:0}.x-stretched.x-container{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-stretched.x-container>.x-inner,.x-stretched.x-container>.x-body,.x-stretched.x-container>.x-body>.x-inner{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;min-height:0px}.x-layout-fit.x-stretched>.x-layout-fit-item{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-layout-fit{position:relative}.x-layout-fit-item.x-sized{position:absolute;top:0;right:0;bottom:0;left:0}.x-layout-fit-item.x-unsized{width:100%;height:100%}.x-ie .x-stretched>.x-inner,.x-ie .x-stretched>.x-body{min-height:inherit}.x-center,.x-centered{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-center>*,.x-centered>*{position:relative}.x-center>.x-floating,.x-centered>.x-floating{position:relative !important}.x-floating{position:absolute !important}.x-layout-float{overflow:hidden}.x-layout-float>.x-layout-float-item{float:left}.x-layout-float.x-direction-right>.x-layout-float-item{float:right}@-webkit-keyframes x-paint-monitor-helper{from{zoom:1}to{zoom:1}}@keyframes x-paint-monitor-helper{from{zoom:1}to{zoom:1}}.x-paint-monitored{position:relative}.x-paint-monitor{width:0 !important;height:0 !important;visibility:hidden}.x-paint-monitor.cssanimation{-webkit-animation-duration:0.0001ms;-webkit-animation-name:x-paint-monitor-helper;animation-duration:0.0001ms;animation-name:x-paint-monitor-helper}.x-paint-monitor.overflowchange{overflow:hidden}.x-paint-monitor.overflowchange::after{content:'';display:block;width:1px !important;height:1px !important}.x-size-monitored{position:relative}.x-size-monitors{position:absolute;left:0;top:0;width:100%;height:100%;visibility:hidden;overflow:hidden}.x-size-monitors>*{width:100%;height:100%;overflow:hidden}.x-size-monitors.scroll>*.shrink::after{content:'';display:block;width:200%;height:200%;min-width:1px;min-height:1px}.x-size-monitors.scroll>*.expand::after{content:'';display:block;width:100000px;height:100000px}.x-size-monitors.overflowchanged>*.shrink>*{width:100%;height:100%}.x-size-monitors.overflowchanged>*.expand>*{width:200%;height:200%}.x-size-change-detector{visibility:hidden;position:absolute;left:0;top:0;z-index:-1;width:100%;height:100%;overflow:hidden}.x-size-change-detector>*{visibility:hidden}.x-size-change-detector-shrink>*{width:200%;height:200%}.x-size-change-detector-expand>*{width:100000px;height:100000px}.x-translatable{position:absolute !important;top:500000px !important;left:500000px !important;overflow:visible !important;z-index:1}.x-translatable-hboxfix{position:absolute;min-width:100%;top:0;left:0}.x-translatable-hboxfix>.x-translatable{position:relative !important}.x-translatable-container{overflow:hidden;width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-translatable-container::before{content:'';display:block;width:1000000px;height:1000000px;visibility:hidden}.x-button{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#eee;border:1px solid #ccc;position:relative;overflow:hidden;z-index:1}.x-button .x-button-icon{position:relative;background-repeat:no-repeat;background-position:center}.x-button .x-button-icon.x-shown{display:block}.x-button .x-button-icon.x-hidden{display:none}.x-iconalign-left,.x-icon-align-right{-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.x-iconalign-top,.x-iconalign-bottom{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-iconalign-bottom,.x-iconalign-right{-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.x-iconalign-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-button-label,.x-badge,.x-hasbadge .x-badge{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center;white-space:nowrap;text-overflow:ellipsis;text-align:center;display:block;overflow:hidden}.x-badge{background-color:#ccc;border:1px solid #aaa;z-index:2;position:absolute !important;width:auto;font-size:.6em;right:0;top:0;max-width:95%;display:inline-block}html,body{font-family:"Helvetica Neue", HelveticaNeue, "Helvetica-Neue", Helvetica, "BBAlpha Sans", sans-serif;font-weight:normal;-webkit-text-size-adjust:none;margin:0;cursor:default}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}li{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}q:before,q:after{content:''}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{vertical-align:text-bottom}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit}*:focus{outline:none}body.x-desktop{overflow:hidden}@-ms-viewport{width:device-width}*,*:after,*:before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-user-drag:none;-webkit-user-select:none;-ms-user-select:none;-ms-touch-action:none;-moz-user-select:-moz-none}input,textarea{-webkit-user-select:text;-ms-user-select:auto;-moz-user-select:text}.x-hidden-visibility{visibility:hidden !important}.x-hidden-display,.x-field-hidden{display:none !important}.x-hidden-offsets{position:absolute !important;left:-10000em;top:-10000em;visibility:hidden}.x-html{-webkit-user-select:auto;-webkit-touch-callout:inherit;-ms-user-select:auto;line-height:1.5;color:#333;font-size:.8em;padding:1.2em}.x-html body{line-height:1.5;font-family:"Helvetica Neue",Arial,Helvetica,sans-serif;color:#333;font-size:75%}.x-html h1,.x-html h2,.x-html h3,.x-html h4,.x-html h5,.x-html h6{font-weight:normal;color:#222}.x-html h1 img,.x-html h2 img,.x-html h3 img,.x-html h4 img,.x-html h5 img,.x-html h6 img{margin:0}.x-html h1{font-size:3em;line-height:1;margin-bottom:0.50em}.x-html h2{font-size:2em;margin-bottom:0.75em}.x-html h3{font-size:1.5em;line-height:1;margin-bottom:1.00em}.x-html h4{font-size:1.2em;line-height:1.25;margin-bottom:1.25em}.x-html h5{font-size:1em;font-weight:bold;margin-bottom:1.50em}.x-html h6{font-size:1em;font-weight:bold}.x-html p{margin:0 0 1.5em}.x-html p .left{float:left;margin:1.5em 1.5em 1.5em 0;padding:0}.x-html p .right{float:right;margin:1.5em 0 1.5em 1.5em;padding:0}.x-html a{text-decoration:underline;color:#06c}.x-html a:visited{color:#004d99}.x-html a:focus{color:#09f}.x-html a:hover{color:#09f}.x-html a:active{color:#bf00ff}.x-html blockquote{margin:1.5em;color:#666;font-style:italic}.x-html strong,.x-html dfn{font-weight:bold}.x-html em,.x-html dfn{font-style:italic}.x-html sup,.x-html sub{line-height:0}.x-html abbr,.x-html acronym{border-bottom:1px dotted #666666}.x-html address{margin:0 0 1.5em;font-style:italic}.x-html del{color:#666}.x-html pre{margin:1.5em 0;white-space:pre}.x-html pre,.x-html code,.x-html tt{font:1em "andale mono","lucida console",monospace;line-height:1.5}.x-html li ul,.x-html li ol{margin:0}.x-html ul,.x-html ol{margin:0 1.5em 1.5em 0;padding-left:1.5em}.x-html ul{list-style-type:disc}.x-html ol{list-style-type:decimal}.x-html dl{margin:0 0 1.5em 0}.x-html dl dt{font-weight:bold}.x-html dd{margin-left:1.5em}.x-html table{margin-bottom:1.4em;width:100%}.x-html th{font-weight:bold}.x-html thead th{background:#c3d9ff}.x-html th,.x-html td,.x-html caption{padding:4px 10px 4px 5px}.x-html table.striped tr:nth-child(even) td,.x-html table tr.even td{background:#e5ecf9}.x-html tfoot{font-style:italic}.x-html caption{background:#eee}.x-html .quiet{color:#666}.x-html .loud{color:#111}.x-html ul li{list-style-type:circle}.x-html ol li{list-style-type:decimal}@-webkit-keyframes x-loading-spinner-rotate{0%{-webkit-transform:rotate(0deg)}8.32%{-webkit-transform:rotate(0deg)}8.33%{-webkit-transform:rotate(30deg)}16.65%{-webkit-transform:rotate(30deg)}16.66%{-webkit-transform:rotate(60deg)}24.99%{-webkit-transform:rotate(60deg)}25%{-webkit-transform:rotate(90deg)}33.32%{-webkit-transform:rotate(90deg)}33.33%{-webkit-transform:rotate(120deg)}41.65%{-webkit-transform:rotate(120deg)}41.66%{-webkit-transform:rotate(150deg)}49.99%{-webkit-transform:rotate(150deg)}50%{-webkit-transform:rotate(180deg)}58.32%{-webkit-transform:rotate(180deg)}58.33%{-webkit-transform:rotate(210deg)}66.65%{-webkit-transform:rotate(210deg)}66.66%{-webkit-transform:rotate(240deg)}74.99%{-webkit-transform:rotate(240deg)}75%{-webkit-transform:rotate(270deg)}83.32%{-webkit-transform:rotate(270deg)}83.33%{-webkit-transform:rotate(300deg)}91.65%{-webkit-transform:rotate(300deg)}91.66%{-webkit-transform:rotate(330deg)}100%{-webkit-transform:rotate(330deg)}}@keyframes x-loading-spinner-rotate{0%{-ms-transform:rotate(0deg);transform:rotate(0deg)}8.32%{-ms-transform:rotate(0deg);transform:rotate(0deg)}8.33%{-ms-transform:rotate(30deg);transform:rotate(30deg)}16.65%{-ms-transform:rotate(30deg);transform:rotate(30deg)}16.66%{-ms-transform:rotate(60deg);transform:rotate(60deg)}24.99%{-ms-transform:rotate(60deg);transform:rotate(60deg)}25%{-ms-transform:rotate(90deg);transform:rotate(90deg)}33.32%{-ms-transform:rotate(90deg);transform:rotate(90deg)}33.33%{-ms-transform:rotate(120deg);transform:rotate(120deg)}41.65%{-ms-transform:rotate(120deg);transform:rotate(120deg)}41.66%{-ms-transform:rotate(150deg);transform:rotate(150deg)}49.99%{-ms-transform:rotate(150deg);transform:rotate(150deg)}50%{-ms-transform:rotate(180deg);transform:rotate(180deg)}58.32%{-ms-transform:rotate(180deg);transform:rotate(180deg)}58.33%{-ms-transform:rotate(210deg);transform:rotate(210deg)}66.65%{-ms-transform:rotate(210deg);transform:rotate(210deg)}66.66%{-ms-transform:rotate(240deg);transform:rotate(240deg)}74.99%{-ms-transform:rotate(240deg);transform:rotate(240deg)}75%{-ms-transform:rotate(270deg);transform:rotate(270deg)}83.32%{-ms-transform:rotate(270deg);transform:rotate(270deg)}83.33%{-ms-transform:rotate(300deg);transform:rotate(300deg)}91.65%{-ms-transform:rotate(300deg);transform:rotate(300deg)}91.66%{-ms-transform:rotate(330deg);transform:rotate(330deg)}100%{-ms-transform:rotate(330deg);transform:rotate(330deg)}}@font-face{font-family:"Pictos";src:url('data:application/font-woff;base64,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') format('woff'),url('data:font/truetype;base64,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AQIFAw4BAQQCCAEBBAIBAQMDAgYGAgECAgEBAQICAQ0DAQICBQEMBwIFAgICBgMCBQQCBAQMAQMBAQEBBAUBAwkBAwEBAgEDAgIBBAICBgECBgMCBQIGCAUFAQUIAQMFAQELAQEGAQIDAQEBBAEBAQMCBgIEAwQGAgQHAgMDAQIGAQIBAQICAQQBBQECGwQCAQUDAQIDAgcFCAMBBgMEAwQEBAMDAQIDAwUCAgEIBgIKAQ0EBAIGAwQMAwELAQcJCAIDAgYDAQcBBwYDBAYCAgUBAwEBCwcIAgEKIceMUo4vBwIDBQUBBAIKAgEBAQMBAQMCBQIDAgJFAhkBAgEBBwQHAgoBAQUCAwMDAQIJAQUClAEFBQsCCAEDBAcBBAUBAwMBAScCBgEDAwIEAQIBBQEHAgMCAgMMBAMBAQIHARYCAgMEBQQCAgEBBAEBAwYBAwOgAQPKAgMBAQMCAQUCAQEWAgcCBQFxBgoGBQEDAgICCQEJAQ4EAgEBAQQCAgECBAECAQEBAQ8HARMPAgECAQUEAQMFAQIBAQQBBAQGBgMDCwENCgoBBwoDCQQIBAQDAwQEAgECAQIDAgEDAwQCBAEEAQIEAQMDAwUJAQgNAQMICAoQBgIICQYBAgICAQUCBQYGAQUBAgoDAQH+YwMEAgEBEQQHAgMBAggEBQUGIwICAQENAQcBBwIBCAIfBAUGAgEBJgMEAgIBARABAQF9AgICuvb+pPb2AVwzAwMFAggECwIBBAIECQIBAgECBgECAgIEBwECAQMEAgX+wFprEwkCCQIBAwgEBAMHAgQBBAEHAQMDBQoEAQMEAQIBAQIIAgEEAgYCAgMFAQcEDAUMDgIKAQsECQQBAgkBCQICAQEBAQIDAgwDAQQDBAcBAQEKAQQKAQIBBwQCBgkBBQEFAQECAwYDDAMEAgcBAgIBAQESAgMEAwEBAQQJAQgKAQICAQQDBgIEBgYBBAYFAQIBAgECAQIGBAgBAwMCAgEDAQsDAgYCAwoCAgcEAQIGBQ0IBAMCAgIBAQIIBAICCQIEAgECBQQCAQM4QFsBAwEGAgcCBgIBAQICBAEBAQIBAQECAQICAQIDBAMCBAMKBwEKAQoDAQICCwICAQQCBQEBAQEBCwIHBAECAQEBAQIPCAQBAgMEBgoCAQUDAQICAgYGAgQFAgEJAwECAQ0DAQMCBgQBCQMCAQgGBgEDAwMBAgMCAwQFAQQBBQIDAgINBAcBBAEBBwEBBQECAwEBBAMECgIBAQECAgIDBwILAggGAQYHAQgDAwQIAgEDAQICAgUBAg4RAggBCAQBAgIBBQECBAICAwEDAgIGBAUCAw0CCAEDBQMHBgUDAgMCAQEECgECAQEBBAICAQECAwMDAQIBBgIJCAECBAIDBAsDAQIGBRIFCgwOAwgCAQcCAgMDAQ0CAgICBQMIAwICAggEBAQEAQEBBgEIAgMBBgIDAgECAgQDCAIBBAklCQ4CCQIBEhAEIQQIDQYJAQkFBQMDBwMCEQMBAwEDAg0KBQEBAwMGBQQJAQEBBgUCAgINEgMHBwQFAgICBwINCgEBCQQCAQsCAQYDAgoJCgMCDgMXCERMjMZKPwILEQ8CAgEFBwkCAgEBAQIJAQsBAgUBAQUDCwIBHgEDAwICAwYBBAEGBwECAgMCAgIIAQMIB2gFAwIBAQQDAQQBAQEBAQEBAy0CBAIDAQQBAgQEBwEFAQsDAQMFBgMBBQIBAQEIEAIGAQECBAIBAQIMBgECFAECAw0GAgMHCQEHAgENBAEEAXsBAwQLBAUCAwECCQIJAg4YBgYIAQMJAgECAQcEDgQEAwMECAkKAgQCCAMHAQsLCQQOAwgHAQQSCQ4GBAsGDgEDAgEBAgEEAQkEAREEBAUDCQIEAgsIAQYBAwECAQQDAQEDCgMBBQMBAQEHAgECAgESAwQGBgEDAQMDAwsIAw4EAggBBgEEDwEBATcDAwQCAwEFAwIBAgcFDAECAgEBAgQCAgMDAgEDAQIBAQEaAQEBAXQCAQMAAAAAAQAV/50DTAKyAAoAAAERIzUjFSMRIwkBAq6xmLeZAZwBmwEX/obr6wF6AZv+ZQAAAgAw/7ADdAKMAAUADQAAJREhERMhAzMDJQMzFzMDdPy8nQIKkcZp/l5oxTGC6v7GAToBov5eAUIB/r1gAAAAAAYADv93A1ACugAGAA0AEAATABYAGQAAAQcXBRMXNwEnJQMnBycTFyc3FScFJxcHNRcDUHpS/o4rUXr93FIBcStReqOoxd3rHAE9xd3rHAIWelIqAXFRev3aUiv+jlJ6owFqRBJPVVDuRRNOVVEAAAACAA7/eQNQArsAFAAcAAAJARUxKwE1IzUjJwYjIiY0NjIWFRQkMjY0JiIGFAISAT6oAYCAPSgrbZyc2pz+m0o0NEo1AV/+wqiBgD0Om9ybm24rCzRKNDRKAAAAAAUAKP91A3ACvQAHAA8AGAAlAC4AAAAgFhAGICYQACA2ECYgBhABMhYUBiImNDYXNjcnJiMiBhUUHwE2FzI2NCYiBhQWAR4BXPb2/qT2ASIBBLm5/vy5AT9nk5LQk5MkIUUeBAg9bwEqJq8QGBciGBgCvfb+pPb2AVz+F7gBBri4/voBe5PQk5PQk6ohJSgBbj0GAyBGrRgiGBgiGAAAAAAEADn//gN/AjMABgARABoAIQAAJQElFhURFCUvASU2MyEyFwUHASEiJwEXNwEGAQUBJjURNAN8/u8BEQP+XUgk/u0KBALiBAr+7SQBKf0eBQgBFGprARMI/OoBEf7vAyABBuoIB/4vCMY6HusCAuse/tYCAQlXV/73AgIS6v76CAgB0QcAAAAABwA1/9UDdgKeABYAJQApAC0AMQA1ADkAAAEyFhURFAYrASEjIiY1ETQ2OwE1NDYzAREhHQERIxEjERQWOwEhAxUjNQUVIzUXFSM1FxUhNQUVITUDWREMDBFs/d5HHDMMEVwMEQJ6/ZoxRxYHRwIi7t8B3bm5ubn+IwHd/iMCngwR/XERDDUaAeERDF8RDP1pAmVKMv5DAb3+NAcWAiXf3x8lJXIlJZglJXMlJQAAAAAEADD//wNyAoMAAwAOABoAHgAAAREjESMzESERMzY7ATIWBzI2NCYrASIGFBYzBTMRIwNyRnUv/dQ0RDbPIEWaDRISDWgNEREN/pZFRQH+/gEB//4BAf+FUSgSGhERGhIM/gEABgAaAAEDXgK8AAYACQAMABAAFwAfAAABMxEhNQMlFycFBxMREyERIQUXITcXNxcGIiY0NjIWFALPj/1tsQJnEzP+p6dqNwIl/dsBuTr+UGdCeyb+LB4eLB4B8P4RAQHN7cyFhUD+6wE+/l8BgZW+cCqxRwMeLB4eLAAAAAIAIf9hAysCvQAfACsAAAEeARUUBiAmNTQ2NzYWFxYGBwYVFBYyNjc0Jy4BNz4BAiImNRE0NjIWFREUAqk9ReT+vuRGPRQ1EREDFFiZ2pkBWBQDEhE11TQlJTQmAgk2l1Wh5eWhVZg2EQMUEzURTnZtmpptdU4SNBQTA/6MJhoBlxomJhr+aRoAAAAAAgApAAADbQJzAA0AIQAAJTU3ESERIQ4BBwYHIxEBBTUiBw4DDwE0PgQ/ATUCnGj9JQFHAgkCVzZFAtz+x1ozMVEuIAYGKD9OTT8UFGlXRv76AgsBBAEnPP7HATjTiQcGHiUiCww2XDsuGBACAn4AAAEAEv+IA0ICuwBJAAABFgcUBwYPAQ4BFxUXFhUUBwYrASYvASYiDwEGBwYnJjU0PwE1NiYvASYnJjU0NzY3NjsBMjc2NTc2NzY3FhcWHwEUFxY7ATIXFgM6CgIKAw24AgcBUQQHCxMBEBS+Aw4CtRISFQoIBEgBBgO5CgYLCAkHDA/mBgUHQwQFDRQUDQMHQgcFBuYJCw4BhQsNDQ8ECnkBDAQE7QsMDwoQAQ6bAwOaDgECEQsPBw7sBAUMAXoHBw0PDgoJAwUEBQXvDgcSAQESBBHvBQUEAwQAAAABAC7/ewNwAr0AFAAAJRcPASc3JwMnEycmNDYyHwElFwUXAzE/olw/DqngP3iwEyY2E7AB2z/+jai5QFujQJSp/o0/AduvFDUmE694P+GoAAEAHf/jA2ECvQAoAAAlHgEfARUhNTQ+Azc+AjcmJyY1NCY2NzYzMhceAQYVFAcGBx4CAvguNQMD/LwBCxQrHQxUWjEhJwsCAQMfgH8fBAEDCiYiMllVmhQxDg5WVgIIFhYeDQUwJgkiZBxIBzAjDG9vDCMvCEgcYCYIJjEAAAAAAQA7ACoDfgI1ABQAAAE3ESc1FRQGIyEiJjURNDYzITIWFQKT6+saE/4CExoaEwH+ExoBoG/+P28BZxMaGhMBsRMaGhMAAAAAAwA6/7sDlQKeAB0AJAAnAAAlNTcRFAYjISImNRE0NjMhMhcHISIGFREUFjMhMjYJARcBMQc3FycHAsBcSDP+FDNISDMB7BEHWf5VDRISDQHsDRL+7wFihP6ewz90WSs2tV3+7jNISDMB7TNIAloSDf4TDRISAREBYoT+nj/DalmDAAAABQAhAAADZAIeAAkAEwAYACQAMAAAAREjLgEiBgcjEQMiBgcjNTczESYnFTM1IxcyFhUUBiMiJjU0NiEyFhUUBiMiJjU0NgNkQg02QjUO3I4hNg1rb7ghwqFjTR4rKx4fKioB7R8qKh8eKysCHv5ZHSMjHQGn/pkjHbR7/uQtaTqE2CofHisrHh8qKh8eKyseHyoAAAEABf9+A0YCvgAOAAABAycPASc3FxsDBycDAamRflEWLqJgq52DdD03iQHo/mfBTBQnl5MB4/2jAZ3+jRCy/lEAAAAAAgAj/30DYgK8AAkADwAAAREhFAYgJjU0NjcyFhUhEQGSAXPY/s7Y1/aZ2f6NAl/+j5nY2JmY2F7ZmQFyAAAAAAEAEv+7A1YCnwAGAAABESEVIREBAb0Bmf5n/lUCn/7quf7rAXIAAAAHADn/YAMdAroAGwAnADMAPwBDAGMAagAAATMRIREzNTQ2MhYdATM1NDYyFh0BMzU0NjIWFSMVFDMyNj0BNCYjIgcVFBYzMj0BNCMiBgcVFDMyNj0BNCYjIgERIRElFAYjIic3FjMyNjU0Jic1NjU0IyIHJzYzMhYVFAcVFjcHJzczESMCxlf9HFkoSCk0KUgoNClIKXAjExEREyPOERMjIxMRzSMTERETIwIk/ZgBNkY3JCUHIyYYHCErPyodIAciMi00QUlsNAdbHz8CQ/0dAuMuIyYnIi4uIicmIy4uIicnInsgDxF7EQ8gexEPIHsgDxF7IA8RexEP/QwCAv3+xi0yDjQOFhEWFQI0BSEcDzQPJBwyFgEUTBQ0LP7YAAABAAf/uwNLAp8ABgAABREhNSERAQGf/mgBmAGsRQEVuQEW/o4AAAAAAgA8/2EC7QK8ACAAKQAAARYHBhcOAyImNzYHBgcGJxE+AhYVFA4BFBY3PgE3JREjETQ2MzIWAu0WGRgTCBpIPD4fBQ8/PXklGhZImGUEAwoLHmEi/cVVGRIRGQI8LlZVlQIEDAQSETACAi4OCwGPBhIgAxcDFxcXDQEEBgFY/M8DMREZGQAAAAEAOwDGAvkBjQADAAA3NSEVOwK+xsfHAAQAO/+VA24CyAAGAA0AFAAbAAABJwcRIQcXATcRITcnNzUnNychEScBFwcXJREXATKYXwEVX5gBhl/+61+YV1eYXwEUXv4jV5hf/utfAXqZYAEVX5j+el/+7F+XV5dXmF/+61/+0VeYXwEBFWAAAAACAA//eQMbAr4AWQBiAAAkMhYUBiMiJiMGBwYHBiMiJyYnJiciBiMiJjQ2MhYdAR4BFxYXNzY3IycGIyImNDYzMhczNjcuATU0NjMyFhUUBgcUFhczNjMyFhQGIyInByMfARY3NjcmNTQAFBYzMjY0JiIC1CodHRUCCAIqJVNKRxMOUUxQKCcCBwIVHh4qHQkyDS9hIAQDiDQOExEYGBEWC74CASAoOykqOygfAwG9CxYRGBgRFQs1hwYhTykyLgH+qR8WFx8gLJAdKh4BJBc3FSwtFjUbIAEeKh0dFQgIHAkfApdiXgwRFyIXEkgYCjUiKjs7KiE1CgdDFxIXIhcRDMCaBBkeIAIEFQH8LB8fLB8AAAAEADP/iQNlArsABQAJAA0AEQAAAQURBSURARElEQEtAQUBEQURAc0BmP5o/mYBd/7OAVQBLP7V/tQCgP7NArtx/bFycgJP/ZABt1b+RwGgVFJS/gwBuFX+SAAAAAEAIwACA2QCRQAyAAABHgEVFAYrAjU7ATI2LwEmIg8BBhY7AhUrAzUuATU0NjcmNTQ2MzIXPgEzMhYVFAL/LjdgRAnGHkwMBgeRCBcIkQgGDUwexgEBAkRhLCYFQzAnHh94SWeRAT4TUjNEYKINCq0KCq0KDaIBAWJELkwXEhAvQxhATpFnCgADACj/dQNuArsACwATABsAAAEyFhUUBiMiJjU0NgE0JiMiBwE2JRQWMzI3AQYBy6719a6t9vYB6LmCZFIBtjv9i7iCZ1D+SjsCu/atrvX1rq32/l2CuDr+SlFlgrg6AbdTAAAAAQAF/4kCJgK7AAUAAAEDMwETIwImwZ7+Au+gArv+qv4kAYIAAwA4/3sDeQK8AAkAFAAcAAATMh4BFyMmJyYjETIEFhIXIyYCJCMSMhYUBiImNDiV/JQBoAJxcqGpATPghAGgAbX+y7ZBXEFBXEEBn5P8laFxcgG9hN/+y6m3ATW0/j9BXEFBXAAAAAADAB0AAQNhAZQAGwA5AFsAACUVIz0BJicmJyY1NDc2MhcVFAcGBx4CFx4BFyUdASM1ND4BNz4CNyYnJjU0NzYzMhcWFRQHBgcGJR4BHwEVITU0PgE3PgI3JicmNTQ3NjIXFhUUBwYHHgIDYZcEMwoMBQENZg0EDw4UJCMEExUB/VSXAhUTBSEkFA4PBAELNDMNAQQPCTUBuBkdAgL+MgMdGgYuMhsSFQYBEYwSAQYVExwxMSQjLwErHhAfCx0lBCwsKR4KJw8EDxMCCBQFBwEvIwIIFAgCFA8EDycKHiUELCwEJR4KJAwgDQsbCAgvLwMLHAwDGhUFFTUNKzUDPT0DNSkPNhQFFBwAAAAABgAh/3UDaQK9ADkAQgBLAIsAlQCfAAABFhQHBiMiLwEGBxcWBgcGIyInLgE/ASYnBwYjIicmNDc2MzIfATY3JyY2NzYzMhceAQ8BFhc3NjMyAzY1NCcHFhQHAycGIicHFjMyNxYXNjcmJyY3NjU0JyY3NjcmJwYHBiMiJyYjIgcGIyInJicGBxYXFgcGFRQXFgcGBxYXNjc2MzIXFjMyNzYzMiUUFzcmNTQ3JwYBIgcXNjMyFzcmA1AZGQoeBgQHN3ICBA8PSEhJSA8PBAJwOgcDBx0KGhoKHQMIBjpwAgQPD0hIS0YPDwQCcTkGCAMdHhcWphQUPCgqXisoPUVEJwwFGBQLBggIEBAICAcKExkHCggKCwchJyYhBwsKCAwFGRMLBggIERAJCQQMEBwFDAgKCwchJyYhBwsK/iIXpRQVphcBekQ9KCsuLysoPQGpRJhEHAECbzoHEBwGGRkGHBAHN3ICARxGlEYcAgFzNgcQHAYZGgUcEAc4cQEC/tI/Q0JAKSpeKv72pRQUpRfiBwkRGgYMERMgJyYhEhIMBhkSDAQEBBAQBAQHCRIZBgwSEiQjJCMTEQsHFhYKBwQEEBAElEBCKS0sLSwpQwE7F6UUFKUXAAAAAAMAKP9zA3ACuwAJABcAPAAAATIWEAYjIiYQNhcOARUUFjsBMjY1NCcmEzcvAQcOAQc1ND8BNjU0JyYjIgYPARc3NjcUDwEGFRQXFjMyNgHMrvb2rq339+MfJBsXAR0nDQ8bAwISBQ4pBAMuBgYHDxldLQMQBiMUAysGCgkRF18Cu/b+pPb2AVz2ggEqGBkfKRwXDhH+KQMEJgQOHAEFBw28GSASDAw5KgMtBB8IBg+2Hh4ZCwo6AAACABb/qQNXAokAaADQAAAlFRcVFhUUBwYPAQYiLwMmJyY1ND8BNjc1PgE/Aj4BNzU3PgE3NTc+AT8BHwEUFhQWFQcOAQcUBxUGByIUDgEVBxUGFRQXFh8DFjMyPwE2NzY1NCcmLwE2NTQnJicWHwIWFxQlFhcWFRQPAQYPAQ4BDwIGDwEGFQYPAgYPAS8BLgI0Jzc+ATc0Mj0BNj8BNjU2NzU0NzY1NCcmLwMmIg8BBgcGFRQXFh8BBhUUFxYXJi8CJic0IzUnNSY1NDc2PwE2Mh8CA0MBEwUMIUAzkDJNLyElCwIDAwQKAQMBAQEBAwECAQQBAgEGARwEOQQCGQEEAgECAgECAQEEBwQKOSg8FR8gFEAMBgMDBQ1iAQMMLycgAp0SC/7YJwkDBAMDCgEBAwEBAQIDAQEDAgECAgYcBDkBAgIBGQEEAgECAgEBAgEBAwcECjknPRU+FUAMBgMDBQ1iAQQKMCgfAp0SCwEBEwUMIUAzkDJNL+gBAQEjLBIZLiI/MzNMMCElNhQLERIMDxMBAQYCAgEBBQEBAgEFAQECAQYCHAU4AQQCBQEZAQUCAQEBAgQCAgUBAQIJDQ8RCAw5Jz0VFUAMEQsMCgsTDGIGCxUTRDAMHgKdEhUB0Sc0DxALGAwMFgEBBgICAQQDAQEBAwQBAgMGHAU4AQQCBQEZAQUCAQEBAgQBAQEEAwEBAQsLDxEIDDknPRUVQAwRCwwKCxMMYgYLFxFBMwweAp0SFQEBAQEmKRIZLiI/MzNMMAAAAQAf/4gDYQJiABsAAAEyFhUUBg8BCQEuBDU0NjMyFxYxPgQCkVl3NBoa/sf+xwQOJBwWdllaZRMEDy8vQgJiZW0xaBsc/sgBOAQOLi5DH21laxUFES0hHAAAAAAGADgAAAN0ArwAAwAHAAsAFwAjAC8AAAEhFSERNSEVATUhFQEyFhUUBiMiJjU0NhMyFhUUBiMiJjU0NhMyFhUUBiMiJjU0NgEXAl39owJd/aMCXf0GHCcnHBsnJxscJyccGycnGxwnJxwbJycCvIX+5YWF/uSFhQK8JxscJyccGyf+5iccGycnGxwn/uQnGxwnJxwbJwAAAAEAEv9MAwMCugAcAAABFREOASImNDYzMhcRBREOASMiJjU0NjMyFxEzJQMDAVuCXFxBJCL+oAFcQEFcXEEjIgIBtgK6U/3+NEhKaEoNATRU/hE0SUo1NEoNAgFoAAAAAAkAOv9zA4MCvAAPABMAFwAbAB8AIwAnAC4ANQAAATIWFREUBiMhIiY1ETQ2MwUhFSEFIxUzJzM1IxcVITUlITUhJyMVMwMUFjsBNSMFMjY9ASEVAvc6UlI6/c86UlI6AlT9/wIB/elgYGBgYHYCAf3/AgH9/xZgYGAVDj1gAlQOFf3/ArxSOv3POlJSOgIxOlLSdZxyh3KHcnIVcop1/ooOFXV1FQ5SdQAAAAABADr/4gN8AnIAFwAAATIWFREUBiMhIiY1ETQ2OwE3NjsBMh8BA2MLDg4L/PALDg4LJh0LGZ4ZCxwCIQ8K/fMLDg4LAg0KDzsWFjsAAwAJ/3YDUAK9AAgADAAQAAABFwE5AQc3OQEXAScJARcHJwIemf404klqAXsZ/oQCFJplmQIlmf40SuMYAXsa/oQCY5lkmQAAAgAe/8kDYQKHABgAMQAAJRQGBxYXFgcGJyYnISInNjchMjY9AR4BFQcUBiMhDgEjIjU0NzY3LgE9ATQ2MyEyFhUDYTQoDzMMFS1FNC3+1SojHhoBFEppL0CnSDP+1jFmJyIDMhAoNEg0AaUzSKAqQgsrJwgGCyAZLhsSGWlK6wVGMHA0SDIsCwMCJiwLQivtM0lJMwAAAAACACH/mQNjArsADwAfAAABPwERFCMhFSc3HQEhMjY1JQ8BETQzITUXBz0BISIGFQLWGFuA/gOrqwHkEBb92BhbgAH9q6v+HBAWARYYW/78gGysrHMGFhChGFsBBH9sq6xzBhcQAAAAAAIAFP+LA0cCvQAUABwAACUWFRQHBiMiLwEGIyImEDYgFhUUByY0JiIGFBYyAzAXFBMcIBfbSlyBt7cBArcvW2aQZmaQBBcfHRMTF9swtwECt7eBWktdkGZmkGYAAwAo/3QDbwK7AAsAEwAsAAABMhYVFAYjIiY1NDYSIDYQJiAGECUWDwEGByMiLwEuASMmPQE0NzY7ATIWHQEBzK329q2u9vYsAQS4uP78uQIGDgkYBQYEBQXBAQMBBQUHBi4HCgK79q2u9vaurfb9IrkBBLi4/vwkCg4nBgIDgQECBwbkBwUFCgfBAAAIADz/1gN/AncAAwAHAA8AFwAfACcAKwAvAAATIREhJREhERIiJjQ2MhYUBCImNDYyFhQAMhYUBiImNCQyFhQGIiY0AxEjERM1IxU8A0P8vQL9/UlxJBoaJBkB4SQaGiQZ/ckkGRkkGgIUJBkZJBpe5KhtAnf9X0YCFv3qAZMaJBkZJBoaJBkZJP7WGiQZGSQaGiQZGSQBRP67AUX+7HZ2AAAAAAIANwAkA3sCdAAbACUAAAEyFhURFAYjISImNRE0NjsBNDM3PgEzITIfARUDMjY0JiMiBhQWA2IKDw8K/O4KDw8KrQEXBBYKAT8ZCxjcS2pqS0pqagItDgr+KAsODgsB2AoOATAJDRYwAf5LaZZqapZpAAAAAQA3/6sDdQKpABUAAAEWBgcGJwYHBicmNzYnLgEnJjY3NgQDdRDdrD46XGkvCQMGWAhFVggQ3KysAQkBjYncEwcHXwsFDQQEQk8ndkeI3RQTpgAABAAi/3gDZQK9AAkAFQAxAHcAACU2NTcfAgcvATciBhUUFjMyNjU0JgEHIgcnBiMiJic0Nx4BMzI2NTQmJzYzNhYVFAcFNDY0LgMnIyIPARYHBg8BBgcGIyImNzY/ATY3NjMyFz8BPgQmJyYnIyIvAS4BPwE2MzIfARYXFhcWMh8BFgcGMQIOAmKLXgpoJUZhEhkZEhMZGf7PYgYKRyAYSncBET8QJR1JDD0PA0p4EAGKAQMIDRkQAwoY2ggQAgXJBQELEilIHAMDygUBCxEJCsIEBAMHAgEDAxAsARAnBhMCE0gRCQYUBiEEBBQDHgR3SSsPZAoGYotFJmgKXjYZExIZGRITGQFdYgJGD3hKARE/CkgeJBM8EgF5Shse9wMJHBwkHx4JFtkdEgEFyQUCC2AdAgTKAwMLA8IGBgQNCQ0OBx0JJQYTDBVJERQGIRAUGgQEd0mzMgACACD/fANhAr0AVQBfAAABHgEdARQGDwEOAR8BFg8BBi8BJgYPAQ4BKwEiJi8BLgEPAQYvASY/ATYmLwEuAT0BNDY/ATYvASY/ATYfARY2PwE+ATsBMhYfAR4BPwE2HwEWDwEGFwUyNjQmIyIGFBYDSwkNDQl8CQYFSAwQRBASagcPARcBEAlhCRABFwEPB2kUD0QQDEgFBgl8CQ0NCXwWDEgLD0QQE2kHDwEXARAJYQkQARcBDwdqEhBEDwtIDBb+8T9YWD8+WFgBZwEQCWEJEAEXAgwIahMQRBANRwUFCX0JDQ0JfQkFBUcMD0QQE2oIDAIXARAJYQkQARcGEWoTD0QQDEgFBgl8CQ0NCXwJBgVIDBBEDxNqEQb4WHxZWXxYAAAAAwAi/2ICvwK7AA8AIwAuAAAFMj8BFxYPAQYnASYvAQEWAwEWDwEGIicBJi8BJj8BNjsBFxYHBhQXFjI2NCcmIgGxIhWwJw8P/g8Q/qIPAggBTxcwAV4QEP4HEgb+og8CEQIQKw8TA70W4A4ODSgaDQ4mIRewJw8Q/hAQAV4PFWH+sRcCuf6jEA//BgYBXhEUvhYOLA0RAj8NKA0NGigNDgAAAAABAAv/kwLvAtcABgAAASERIxEhAQLv/uq5/usBcgEr/mgBmAGsAAAAAwAo/3YDawK6ABwALAA8AAATBh0BIiY9ATQ2MyEyFh0BIzU0JiMhIgYdARQWMyUyFh0BFAYjISImPQE0NjMBNTQmIyEiBh0BFBYzITI2tgM6UVE6AVw6UWgVDv6kDhUVDgItOVJSOf6kOlFROgF+FA7+pA4VFQ4BXA4UARgQE0VROvQ6UVE6aWkOFRUO9A4VaVI68zpSUjrzOlL+gfMPFBQP8w8UFAAAAQAL/4IC7wLGAAYAABMhETMRIQELARW5ARb+jgEtAZn+Z/5VAAAAAAMAKP9zA3ACuwAHABcAGwAAACAWEAYgJhABNSM3IzUjFSMXIxUzBzMvATUzFQEeAVz29v6k9gJMppFwS3CQopEnfieW/QK79v6k9vYBXP5d6KeHh6foJycqlJQAAQAAAAEAAE8dYDFfDzz1AAsD6AAAAADI+gQNAAAAAMj6BA0AA/9MA5UC4gAAAAgAAgAAAAAAAAABAAAC7v8GAAADvAAAAAADlQABAAAAAAAAAAAAAAAAAAAAZAH0AAAAAAAAAU0AAAH0AAADqAA7A2EANALsACgDfQAWA4cAIALcABEDjAANAp8ALQN5ABkDCQAnA5gAKAOTACgDmQAoA7EANwOQACgDeQAbAucAHAOXACgDZAAMAvoAOwMwADsDMQA7A5oAOwOaAA4DmAAoAyEAGQN3AA4BiwADA7MAPAN5AA4DmgAoAfwAGwN9ABwDcQASA5EAJAOVACgDfwAeAsAANQOYACgDYQAVA6QAMANeAA4DZQAOA5gAKAO4ADkDrwA1A6IAMAONABoDTAAhA40AKQNVABIDgwAuA34AHQO1ADsDugA6A5kAIQNdAAUDgQAjA10AEgNWADkDXQAHAwcAPAM0ADsDqAA7AyoADwOXADMDjAAjA5YAKAIsAAUDkAA4A34AHQOKACEDmAAoA20AFgOAAB8DrgA4AygAEgO8ADoDrQA6A1cACQOOAB4DhAAhA2AAFAOXACgDuwA8A7EANwOfADcDtQAiA4EAIALgACIC+gALA5MAKAL6AAsDmAAoA0EAAAH0AAAAAAAAAAAAAAAAADAAeAEYAXICNAJKApYC0AMOAygDdAP4BCQEUgSMBMoE/AU2BWIFcAWGBZQFqAW8BdgGJAaCBpIGtAb6B3IHnggUCFwIjgjmCSgJRA+iD7oP2hASEEAQkBDUESwRXhGcEeISGhKIErAS8BMUE1YToBPCE+IT9hSGFJoU3hTqFSIVrBXaFh4WUBZiFpYXHBgIGGQZhhm0GgAaMBqGGqwa0BscG1AbfhvEHBYcUBx6HSYduB4KHh4ech6GHrQetB60AAAAAQAAAGQE4QAWAAAAAAACAAAAAQABAAAAQAAAAAAAAAAAAA8AugABAAAAAAABAAAAAAABAAAAAAAEAA4AAAADAAEECQAAAEIADgADAAEECQABAAAAUAADAAEECQACAAIAUAADAAEECQADAAAAUgADAAEECQAEAAIAUgADAAEECQAFAPwAVAADAAEECQAGAAIBUAADAAEECQAKAPwBUgADAAEECQBjAC4CTgADAAEECQBkAAwCfAADAAEECQBlAA4CiAADAAEECQBmAAwClgADAAEECQBnAAwColBpY3RvcyBXZWJmb250AKkAIABEAHIAZQB3ACAAVwBpAGwAcwBvAG4AOgAgAHcAdwB3AC4AZAByAGUAdwB3AGkAbABzAG8AbgAuAGMAbwBtAH8AfwBUAGgAaQBzACAAaQBzACAAYQAgAHAAcgBvAHQAZQBjAHQAZQBkACAAdwBlAGIAZgBvAG4AdAAgAGEAbgBkACAAaQBzACAAaQBuAHQAZQBuAGQAZQBkACAAZgBvAHIAIABDAFMAUwAgAEAAZgBvAG4AdAAtAGYAYQBjAGUAIAB1AHMAZQAgAE8ATgBMAFkALgAgAFIAZQB2AGUAcgBzAGUAIABlAG4AZwBpAG4AZQBlAHIAaQBuAGcAIAB0AGgAaQBzACAAZgBvAG4AdAAgAGkAcwAgAHMAdAByAGkAYwB0AGwAeQAgAHAAcgBvAGgAaQBiAGkAdABlAGQALgB/AFQAaABpAHMAIABpAHMAIABhACAAcAByAG8AdABlAGMAdABlAGQAIAB3AGUAYgBmAG8AbgB0ACAAYQBuAGQAIABpAHMAIABpAG4AdABlAG4AZABlAGQAIABmAG8AcgAgAEMAUwBTACAAQABmAG8AbgB0AC0AZgBhAGMAZQAgAHUAcwBlACAATwBOAEwAWQAuACAAUgBlAHYAZQByAHMAZQAgAGUAbgBnAGkAbgBlAGUAcgBpAG4AZwAgAHQAaABpAHMAIABmAG8AbgB0ACAAaQBzACAAcwB0AHIAaQBjAHQAbAB5ACAAcAByAG8AaABpAGIAaQB0AGUAZAAuAFQAaABpAHMAIABmAG8AbgB0ACAAaQBzACAAcAByAG8AdABlAGMAdABlAGQALgBQAGkAYwB0AG8AcwBSAGUAZwB1AGwAYQByAFAAaQBjAHQAbwBzAFAAaQBjAHQAbwBzAAIAAAAAAAD/tQAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAF4AXwBgAGEAugECAkNSAAAA') format('truetype'),url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiID4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8bWV0YWRhdGE+ClRoaXMgaXMgYSBjdXN0b20gU1ZHIHdlYmZvbnQgZ2VuZXJhdGVkIGJ5IEZvbnQgU3F1aXJyZWwuCkRlc2lnbmVyICAgIDogRHJldyBXaWxzb24KRm91bmRyeSAgICAgOiBEcmV3IFdpbHNvbgpGb3VuZHJ5IFVSTCA6IGh0dHBwaWN0b3NkcmV3d2lsc29uY29tCjwvbWV0YWRhdGE+CjxkZWZzPgo8Zm9udCBpZD0id2ViZm9udEl5Zlpic2VGIiBob3Jpei1hZHYteD0iOTIwIiA+Cjxmb250LWZhY2UgdW5pdHMtcGVyLWVtPSIxMDAwIiBhc2NlbnQ9Ijc1MCIgZGVzY2VudD0iLTI1MCIgLz4KPG1pc3NpbmctZ2x5cGggaG9yaXotYWR2LXg9IjUwMCIgLz4KPGdseXBoIHVuaWNvZGU9IiAiICBob3Jpei1hZHYteD0iNTAwIiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4MDk7IiBob3Jpei1hZHYteD0iNTAwIiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4YTA7IiBob3Jpei1hZHYteD0iNTAwIiAvPgo8Z2x5cGggdW5pY29kZT0iISIgaG9yaXotYWR2LXg9IjkzNiIgZD0iTTg2NSAxMDNxMzcgLTYyIDExIC0xMDYuNXQtOTggLTQ0LjVoLTYyMXEtNzIgMCAtOTcuNSA0NC41dDExLjUgMTA2LjVsMzEwIDUzNHEzNiA2MiA4Ny41IDYydDg3LjUgLTYyek00NzEgNDZxMjMgMCAzOC41IDE2dDE1LjUgMzh0LTE1LjUgMzcuNXQtMzguNSAxNS41cS0yMiAwIC0zNy41IC0xNS41dC0xNS41IC0zNy41dDE1LjUgLTM4dDM3LjUgLTE2ek01MDkgMTg3bDI2IDMwOGgtMTI3bDI2IC0zMDhoNzV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4MjI7IiBob3Jpei1hZHYteD0iODY1IiBkPSJNNTIgMjg5cTEgNjUgNy41IDExNXQyNi41IDEwMS41dDUzLjUgODYuNXQ5MC41IDU4LjV0MTM1IDI4LjV2LTE1N3EtNjYgMCAtOTUgLTQ2LjV0LTI5IC0xNDcuNWwtNCAtMWg4NHExOCAwIDMxIC0xM3QxMyAtMzJ2LTI1OHEwIC0xOCAtMTMgLTMxdC0zMSAtMTNoLTIyNXEtMTggMCAtMzEgMTN0LTEzIDMxdjI1OHY3ek00OTMgMjg5cTAgNjUgNyAxMTV0MjcgMTAxLjV0NTMuNSA4Ni41dDkwLjUgNTguNXQxMzUgMjguNXYtMTU3IHEtNjcgMCAtOTYgLTQ2LjV0LTI5IC0xNDcuNWwtNCAtMWg4NHExOCAwIDMxIC0xM3QxMyAtMzJ2LTI1OHEwIC0xOCAtMTMgLTMxdC0zMSAtMTNoLTIyNHEtMTkgMCAtMzIgMTN0LTEzIDMxdjI1OHEwIDUgMSA3eiIgLz4KPGdseXBoIHVuaWNvZGU9IiMiIGhvcml6LWFkdi14PSI3NDgiIGQ9Ik03MDUgNDgycTkgLTE0IC04IC0xNGgtNDh2LTU2N3EwIC03IC01IC0xMnQtMTIgLTVoLTUxM3EtNyAwIC0xMiA1dC01IDEydjU2N2gtNTJxLTcgMCAtOS41IDR0MS41IDEwbDMxIDQ2cTkgMTQgMjcgMTRoNzV2NjZxMCAyMCAxMiAzMGw0OCA0OXExMiAxMiAzMCAxMmgyMTZxMTggMCAzMCAtMTJsNTIgLTUycTEzIC0xMyAxMyAtMzB2LTYzaDcxcTE4IDAgMjcgLTE0ek0yNDggNTQ2di00aDI1NHY0djI4cTAgMjAgLTEyIDMwbC05IDEwIHEtMTIgMTIgLTMwIDEyaC0xNTVxLTE4IDAgLTMwIC0xMmwtNiAtNnEtMTIgLTEyIC0xMiAtMzB2LTMyek01NzYgNDUwcTAgMTYgLTE2IDE4aC0yNzloLTg5cS03IDAgLTEyIC01LjV0LTUgLTEyLjV2LTQ3NnEwIC03IDUgLTEydDEyIC01aDM2N3E3IDAgMTIgNXQ1IDEydjQ3NnpNMjYzIDQxOHE3IDAgMTIuNSAtNXQ1LjUgLTEydi0zNzlxMCAtNyAtNS41IC0xMnQtMTIuNSAtNWgtMjFxLTcgMCAtMTIuNSA1dC01LjUgMTJ2Mzc5cTAgNyA1LjUgMTIgdDEyLjUgNWgyMXpNMzY0IDVxLTcgMCAtMTIuNSA1dC01LjUgMTJ2Mzc5cTAgNyA1LjUgMTJ0MTIuNSA1aDIxcTcgMCAxMiAtNXQ1IC0xMnYtMzc5cTAgLTcgLTUgLTEydC0xMiAtNWgtMjF6TTQ4NSA1cS03IDAgLTEyIDV0LTUgMTJ2Mzc5cTAgNyA1IDEydDEyIDVoMjJxNyAwIDEyIC01dDUgLTEydi0zNzlxMCAtNyAtNSAtMTJ0LTEyIC01aC0yMnoiIC8+CjxnbHlwaCB1bmljb2RlPSIkIiBob3Jpei1hZHYteD0iODkzIiBkPSJNNTAzIDI4M2gtMTA4bC0xNiA2OGgxMjR2LTY4ek02ODQgMzUxbC0xOCAtNjhoLTEwNGwxIDY4aDEyMXpNNDAwIDExOHEyOCAwIDQ4LjUgLTIwdDIwLjUgLTQ5dC0yMC41IC00OXQtNDguNSAtMjB0LTQ4LjUgMjB0LTIwLjUgNDl0MjAuNSA0OXQ0OC41IDIwek02NTkgMTE4cTI5IDAgNDkgLTIwdDIwIC00OXQtMjAgLTQ5dC00OSAtMjB0LTQ5IDIwdC0yMCA0OXQyMCA0OXQ0OSAyMHpNODMzIDUxNnEyNSAtNyAyNSAtMzNxMCAtMyAtMiAtOSBsLTg4IC0yOTNxLTcgLTI1IC0zMiAtMjVoLTQxN3EtMTIgMCAtMjEuNSA3LjV0LTExLjUgMTguNWwtODEgMzI3aC0xNDlxLTE0IDAgLTI0IDEwdC0xMCAyNHQxMCAyNHQyNCAxMGgxNzZxMjYgMCAzMyAtMjZsMTggLTczaDUwM2w1IDE1cTYgMjQgMzIgMjRxNyAwIDEwIC0xek03MTIgMjMxbDU0IDE3OWgtNDY2bDQ1IC0xODZoMzY1eiIgLz4KPGdseXBoIHVuaWNvZGU9IiUiIGhvcml6LWFkdi14PSI5MDMiIGQ9Ik04NjcgMjc3cTAgLTc5IC0zNy41IC0xNDl0LTEwMi41IC0xMTdsMTEgLTk2di00cTAgLTE3IC0xMSAtMzBxLTEzIC0xNSAtMzQgLTE1aC0xNDhxLTIxIDAgLTM0IDE1cS0xMSAxMyAtMTEgMzB2NWwyIDE4cS02IC0xIC0xOCAtMWgtMTBsMiAtMTd2LTVxMCAtMTcgLTExIC0zMHEtMTIgLTE1IC0zNCAtMTVoLTE0OHEtMjEgMCAtMzQgMTVxLTExIDEzIC0xMSAzMHY1bDExIDkwcS04NiA2MCAtMTI0IDE1M2wtNDQgLTRoLTRxLTE4IDAgLTMwIDEyIHEtMTUgMTIgLTE1IDMzdjE1MnEwIDIxIDE1IDMzcTEyIDEyIDMwIDEyaDRsNDMgLTRxMzQgODUgMTA3IDE0MWwtMiAxMTB2MXYxcTAgMjggMjUgNDNxMTEgNyAyNiA3cTE0IDAgMjUgLTdsMTI4IC03MnEyNSAzIDUxIDNxMTYwIDAgMjcwIC05OXExMTMgLTEwMCAxMTMgLTI0NHpNNjgxIDQ3cTYxIDQxIDk1LjUgMTAxdDM0LjUgMTI5cTAgMTE4IC05NCAyMDJxLTk2IDg1IC0yMzMgODVxLTI5IDAgLTUzIC00bC05IC0xbC0xMzYgNzdsMiAtMTMwIGwtMTIgLThxLTc5IC01NyAtMTA2IC0xNDRsLTcgLTIybC03NSA3di0xMjdsNzUgOGw3IC0yMnEzMyAtOTYgMTI0IC0xNTVsMTUgLTlsLTEzIC0xMTJoMTIzbC05IDc0bDM1IC00cTEzIC0yIDM5IC0ycTI0IDAgNDcgM2wzNiA0bC05IC03NWgxMjNsLTE1IDExNnpNNTAxIDUyMWw3IC0xcTcgMCAxOCAtMnQyNiAtNXQzMiAtOXQzNSAtMTR0MzcgLTIwLjV0MzYgLTI4LjVxOCAtNyA4IC0xOXQtOCAtMjBxLTggLTkgLTIwIC05cS0xMSAwIC0xOSA4IHEtMjQgMjMgLTU5IDM4LjV0LTU1LjUgMTkuNXQtMzUuNSA1aC00cS0xMSAxIC0xOSA5LjV0LTggMTkuNXExIDEyIDkuNSAyMHQxOS41IDh6TTIzMSAzODRxMTkgMjAgNDEgMjZ0MzQgLTVxMTEgLTExIDYuNSAtMzN0LTIzLjUgLTQydC00MC41IC0yNnQtMzMuNSA1dC03IDMzdDIzIDQyeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeDI2OyIgaG9yaXotYWR2LXg9IjczMiIgZD0iTTQ2NSA0MDVoMjUwdi0xOThoLTI1MHYtMjUwaC0xOTh2MjUwaC0yNTB2MTk4aDI1MHYyNTBoMTk4di0yNTB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJyIgaG9yaXotYWR2LXg9IjkwOCIgZD0iTTI2NSAxMzlxNzggNzggMTg4LjUgNzh0MTg4LjUgLTc4cTEgMCAxIC0xbC01NSAtNTVxLTEgMCAtMSAxcS01NSA1NSAtMTMzIDU1dC0xMzMgLTU1ek0xNDAgMjY0cTg1IDg1IDE5OS41IDExNS41dDIyOC41IDB0MTk5IC0xMTUuNWwxIC0xbC01NiAtNTZxMCAxIC0xIDFxLTEwNiAxMDYgLTI1Ny41IDEwNi41dC0yNTcuNSAtMTA1LjV6TTg5MyAzOTJxMCAtMiAyIC0ybC01NiAtNTZsLTIgMnEtMTA0IDEwNCAtMjQ0IDE0MXQtMjc5LjUgMCB0LTI0My41IC0xNDFxLTEgMCAtMSAtMWwtNTYgNTZsMSAxcTEyMCAxMTkgMjgwIDE2MS41dDMxOS41IDB0Mjc5LjUgLTE2MS41ek0zOTIgMTNxMjYgMjUgNjMgMjV0NjMgLTI1bC02MyAtNjN6IiAvPgo8Z2x5cGggdW5pY29kZT0iKCIgaG9yaXotYWR2LXg9IjY3MSIgZD0iTTU1MCAzNTloNzd2LTQzN2gtNTgydjQzN2g3NXYxMjhxMCA4NyA2MiAxNDl0MTQ5IDYyaDRoNHE4OCAwIDE0OS41IC02MnQ2MS41IC0xNDl2LTEyOHpNNDAyIDJsLTMyIDE0MXEzMiAyMCAzMiA1N3EwIDI4IC0xOSA0N3QtNDcgMTlxLTI3IDAgLTQ2LjUgLTE5dC0xOS41IC00N3EwIC0zOCAzMyAtNTZsLTMzIC0xNDJoMTMyek00NDUgMzU5djEyOHEwIDQzIC0zMSA3NHQtNzUgMzFoLTNoLTVxLTQzIDAgLTc0IC0zMXQtMzEgLTc0di0xMjggaDIxOXoiIC8+CjxnbHlwaCB1bmljb2RlPSIpIiBob3Jpei1hZHYteD0iODg5IiBkPSJNNjQ1IDY5OHE4OCAwIDE1MCAtNjEuNXQ2MiAtMTQ5LjV2LTEyOGgtMTA2djI5bDM2IDM0djEzaC0zNnY1MnEwIDQ0IC0zMSA3NC41dC03NSAzMC41aC0yaC01cS00NCAwIC03NSAtMzAuNXQtMzEgLTc0LjV2LTEyOGg3N3YtNDM4aC01ODR2NDM4aDQwMXYxMjhxMCA4OCA2MiAxNDkuNXQxNTAgNjEuNWgzaDR6TTM4MiAwbC0zMyAxNDJxMzMgMjAgMzMgNTdxMCAyOCAtMTkuNSA0Ny41dC00Ni41IDE5LjVxLTI4IDAgLTQ3LjUgLTE5LjUgdC0xOS41IC00Ny41cTAgLTM3IDMzIC01N2wtMzMgLTE0MmgxMzN6IiAvPgo8Z2x5cGggdW5pY29kZT0iKiIgaG9yaXotYWR2LXg9Ijc3NyIgZD0iTTczNyA0OTBsLTE5NSAtMTk1bDE5NSAtMTk2bC0xNTQgLTE1M2wtMTk1IDE5NWwtMTk1IC0xOTVsLTE1NCAxNTNsMTk1IDE5NmwtMTk1IDE5NWwxNTQgMTU0bDE5NSAtMTk1bDE5NSAxOTV6IiAvPgo8Z2x5cGggdW5pY29kZT0iKyIgZD0iTTQ2MCA3MDJxMTc0IDAgMjk3IC0xMjN0MTIzIC0yOTd0LTEyMyAtMjk3dC0yOTcgLTEyM3QtMjk3IDEyM3QtMTIzIDI5N3QxMjMgMjk3dDI5NyAxMjN6TTcwOSAyNjJ2NDFxMCAxNSAtMTAuNSAyNS41dC0yNS41IDEwLjVoLTEyMXEtMTUgMCAtMjUuNSAxMXQtMTAuNSAyNnYxMjFxMCAxNSAtMTEgMjUuNXQtMjYgMTAuNWgtNDFxLTE1IDAgLTI1LjUgLTEwLjV0LTEwLjUgLTI1LjV2LTEyMXEwIC0xNSAtMTEgLTI2dC0yNiAtMTFoLTEyMCBxLTE2IDAgLTI2LjUgLTEwLjV0LTEwLjUgLTI1LjV2LTQxcTAgLTE1IDEwLjUgLTI2dDI2LjUgLTExaDEyMHExNSAwIDI2IC0xMC41dDExIC0yNS41di0xMjFxMCAtMTUgMTAuNSAtMjUuNXQyNS41IC0xMC41aDQxcTE1IDAgMjYgMTAuNXQxMSAyNS41djEyMXEwIDE1IDEwLjUgMjUuNXQyNS41IDEwLjVoMTIxcTE1IDAgMjUuNSAxMXQxMC41IDI2eiIgLz4KPGdseXBoIHVuaWNvZGU9IiwiIGhvcml6LWFkdi14PSI5MTUiIGQ9Ik00NTggNzAxcTE3MyAwIDI5NSAtMTIyLjV0MTIyIC0yOTUuNXEwIC0xMDQgLTQ2IC0xOTFxLTU5IC0xMTUgLTE3MiAtMTc2cS05NCAtNTEgLTE5OSAtNTFxLTEwMSAwIC0xOTQgNDhxLTExNCA2MCAtMTc1IDE3M3EtNDkgOTMgLTQ5IDE5N3EwIDE3MyAxMjIuNSAyOTUuNXQyOTUuNSAxMjIuNXpNNzYwIDIwM3ExMSA0MSAxMSA4MHEwIDEzMCAtOTIgMjIydC0yMjEgOTJxLTEzMCAwIC0yMjIgLTkydC05MiAtMjIycTAgLTM5IDEyIC04NSBxMyAtOSA5IC0yNXEyMSA2IDQ1IDZxNjUgMCAxMTEuNSAtNDZ0NDYuNSAtMTExcTAgLTE3IC01IC0zN3E0IC0yIDEyIC00cTQyIC0xMSA4MyAtMTFxNDUgMCA4NyAxMnEyIDAgNS41IDJ0NS41IDJxLTUgMjIgLTUgNDBxMCA2NCA0Ni41IDExMC41dDExMC41IDQ2LjVxMjMgMCA0NCAtNnE1IDE1IDggMjZ6TTQ5OCAzMzNxMjUgLTE5IDI1IC01MHEwIC0xNCAtNSAtMjRxLTE2IC0zOSAtNTggLTM5cS0xMSAwIC0yNCA1cS0zOSAxNiAtMzkgNTggcTAgMSAwLjUgNHQwLjUgNWwtNTYgMjQ1bDIxIDl6TTQ3OCA1NjV2LTk1aC0zOXY5NWgzOXpNNjMyIDQ5MGwyNyAtMjdsLTY4IC02OGwtMjcgMjh6TTYyOSAzMDB2MzhoOTZ2LTM4aC05NnpNMTkyIDMwMHYzOGg5NXYtMzhoLTk1ek0yNDQgNDYzbDI4IDI3bDY3IC02N2wtMjcgLTI4eiIgLz4KPGdseXBoIHVuaWNvZGU9Ii0iIGhvcml6LWFkdi14PSI5MjEiIGQ9Ik00NjEgNjk4cTE3NCAwIDI5NyAtMTIzLjV0MTIzIC0yOTcuNXQtMTIzIC0yOTcuNXQtMjk3IC0xMjMuNXEtMTc1IDAgLTI5OCAxMjMuNXQtMTIzIDI5Ny41dDEyMyAyOTcuNXQyOTggMTIzLjV6TTY5NCAyNTh2MzlxMCAxOSAtMTQgMzN0LTMzIDE0aC0zNzZxLTE5IDAgLTMzIC0xNHQtMTQgLTMzdi0zOXEwIC0yMCAxNCAtMzMuNXQzMyAtMTMuNWgzNzZxMTkgMCAzMyAxMy41dDE0IDMzLjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iLiIgaG9yaXotYWR2LXg9Ijk0NSIgZD0iTTE0NyAzOTJxMzcgMCA2NCAtMjd0MjcgLTY0cTAgLTM4IC0yNi41IC02NXQtNjQuNSAtMjd0LTY1IDI3dC0yNyA2NXQyNyA2NC41dDY1IDI2LjV6TTQ3MiAzOTJxMzggMCA2NSAtMjYuNXQyNyAtNjQuNXQtMjcgLTY1dC02NSAtMjd0LTY0LjUgMjd0LTI2LjUgNjVxMCAzNyAyNi41IDY0dDY0LjUgMjd6TTc5OCAzOTJxMzggMCA2NSAtMjYuNXQyNyAtNjQuNXQtMjcgLTY1dC02NSAtMjd0LTY1IDI3dC0yNyA2NXEwIDM3IDI3IDY0dDY1IDI3eiAiIC8+CjxnbHlwaCB1bmljb2RlPSIvIiBob3Jpei1hZHYteD0iOTEyIiBkPSJNNjkzIDUzN2gxODF2LTEyN3YtMzAxaC0xODF2LTUzbC0xMzYgLTEzNmgtMzM2djE4OWgtMTgxdjMwMXYxMjdoMTgxdjE2M2g0NzJ2LTE2M3pNODE2IDQ4MGgtMTA1di01M2gxMDV2NTN6TTI3NSA2NDZ2LTEwOWgzNjR2MTA5aC0zNjR6TTUwMiAtMjZ2MTM2aDEzN3YxMzF2NTVoNTR2LTEyOWg2N3YxOTdoLTYwNHYtMTk3aDY1djExMXYxOGg1NHYtNTV2LTI2N2gyMjd6IiAvPgo8Z2x5cGggdW5pY29kZT0iMCIgaG9yaXotYWR2LXg9Ijg4OSIgZD0iTTY0MyAxNjFsMzkgLTQwbDI4IC0yN3EtNDcgLTYwIC0xMTYuNSAtOTQuNXQtMTQ4LjUgLTM0LjVxLTE0MCAwIC0yMzguNSA5OHQtOTkuNSAyMzhoLTExaC0yaC02N2wxMjYgMTI2bDEyNyAtMTI2aC01MWgtMjhxMCAtMTAwIDcxLjUgLTE3MXQxNzIuNSAtNzFxNjAgMCAxMTIuNSAyNy41dDg1LjUgNzQuNXpNODEwIDMwMWg1MmwtMTI3IC0xMjZsLTEyNiAxMjZoNTBoMzB2MnEwIDEwMSAtNzEuNSAxNzIuNXQtMTcyLjUgNzEuNSBxLTYxIDAgLTExMy41IC0yOC41dC04Ni41IC03Ni41bC0zOSAzOWwtMjggMjhxNDcgNjEgMTE2LjUgOTZ0MTUwLjUgMzVxMTM5IDAgMjM4IC05OXQ5OSAtMjM4di0yaDI4eiIgLz4KPGdseXBoIHVuaWNvZGU9IjEiIGhvcml6LWFkdi14PSI3NDMiIGQ9Ik02ODggMjM1aDI5di0zMHEwIC0xNDMgLTEwMC41IC0yNDMuNXQtMjQzLjUgLTEwMC41dC0yNDQgMTAxdC0xMDEgMjQzcTAgMTQzIDEwMSAyNDR0MjQ0IDEwMXExNiAwIDI1IC0xdjc5djcxbDQ5IC01MGwxNTcgLTE1N2wyMSAtMjFsLTIxIC0yMGwtMTU3IC0xNTdsLTQ5IC01MHY3MHY4OHEtMTggMiAtMjUgMnEtODMgMCAtMTQxIC01OHQtNTggLTE0MXEwIC04MiA1OC41IC0xNDB0MTQwLjUgLTU4dDE0MCA1OHQ1OCAxNDB2MzBoMzBoODd6ICIgLz4KPGdseXBoIHVuaWNvZGU9IjIiIGhvcml6LWFkdi14PSI5MTkiIGQ9Ik00NTkgNzAxcTE3NCAwIDI5NyAtMTIzdDEyMyAtMjk3dC0xMjMgLTI5N3QtMjk3IC0xMjNxLTE3MyAwIC0yOTYgMTIzdC0xMjMgMjk3dDEyMyAyOTd0Mjk2IDEyM3pNNzI4IDM5MnE2IDYgNiAxNXQtNiAxNmwtNTUgNTRxLTYgNiAtMTUgNnQtMTYgLTZsLTI0MyAtMjQ0cS0xNSAtMTYgLTMxIDBsLTg4IDg4cS0xNiAxNiAtMzEgMGwtNTUgLTU0cS02IC03IC02IC0xNnQ2IC0xNWwxMzkgLTE0MHExNSAtMTUgMzcgLTE1aDI2cTIwIDAgMzcgMTV6ICIgLz4KPGdseXBoIHVuaWNvZGU9IjMiIGhvcml6LWFkdi14PSI4NjgiIGQ9Ik0yMiAyMzlxLTEwIDEwIC0xMCAyNHQxMCAyNGw4MyA4M3ExMCAxMCAyMy41IDEwdDIzLjUgLTEwbDEzNiAtMTM1cTEwIC0xMCAyMy41IC0xMHQyMy41IDEwbDM3MSAzNzJxMTAgMTAgMjMuNSAxMHQyMy41IC0xMGw4MyAtODJxMTAgLTEwIDEwIC0yMy41dC0xMCAtMjMuNWwtNDUwIC00NTFxLTI0IC0yNCAtNTcgLTI0aC0zOXEtMzIgMCAtNTYgMjR6IiAvPgo8Z2x5cGggdW5pY29kZT0iNCIgaG9yaXotYWR2LXg9Ijc2MiIgZD0iTTU5IDcwMGw3MDIgLTM1MWwtNzAyIC0zNTB2NzAxeiIgLz4KPGdseXBoIHVuaWNvZGU9IjUiIGhvcml6LWFkdi14PSI4MTYiIGQ9Ik01OSAxdjY5OGgyNjJ2LTY5OGgtMjYyek00OTUgNjk5aDI2MnYtNjk4aC0yNjJ2Njk4eiIgLz4KPGdseXBoIHVuaWNvZGU9IjYiIGhvcml6LWFkdi14PSI4MTciIGQ9Ik03NTggMmgtNjk5djY5OGg2OTl2LTY5OHoiIC8+CjxnbHlwaCB1bmljb2RlPSI3IiBob3Jpei1hZHYteD0iOTIyIiBkPSJNNDIzIDQxN3YxODJsNDg1IC0yNDNsLTQ4NSAtMjQydjE4MWwtMzY0IC0xODF2NDg1eiIgLz4KPGdseXBoIHVuaWNvZGU9IjgiIGhvcml6LWFkdi14PSI5MjIiIGQ9Ik01MDAgMjk1di0xODJsLTQ4NiAyNDNsNDg2IDI0MnYtMTgybDM2MyAxODJ2LTQ4NXoiIC8+CjxnbHlwaCB1bmljb2RlPSI5IiBkPSJNNDYwIDcwMHExNzQgMCAyOTcgLTEyM3QxMjMgLTI5N3QtMTIzIC0yOTd0LTI5NyAtMTIzdC0yOTcgMTIzdC0xMjMgMjk3dDEyMyAyOTd0Mjk3IDEyM3pNMjk4IDY0bDQzMSAyMTZsLTQzMSAyMTZ2LTQzMnoiIC8+CjxnbHlwaCB1bmljb2RlPSI6IiBob3Jpei1hZHYteD0iODAxIiBkPSJNNjcxIDEwMGwxMDUgLTEwMnEwIC0xNiAtMTIgLTI4LjV0LTI5IC0xMi41aC0yNDJxMSAtNCAxIC0xMnEwIC0zOSAtMjcuNSAtNjYuNXQtNjYuNSAtMjcuNXQtNjYuNSAyNy41dC0yNy41IDY2LjVxMCAyIDAuNSA2dDAuNSA2aC0yNDFxLTE2IDAgLTI4LjUgMTIuNXQtMTIuNSAyOC41bDEwNSAxMDJxLTEgOCAtMSAyNXYyMDhxMCA4OCA1MC41IDE1OHQxMzAuNSA5OHEtNCAxMSAtNCAyNnEwIDM5IDI3LjUgNjYuNXQ2Ni41IDI3LjUgdDY2LjUgLTI3LjV0MjcuNSAtNjYuNXEwIC0xNCAtMyAtMjZxODAgLTI4IDEzMC41IC05OC41dDUwLjUgLTE1Ny41di0yMDhxMCAtMTcgLTEgLTI1ek0zNDggNjE1cTAgLTUgMiAtMTVxMjggNSA1MCA1cTIzIDAgNTAgLTVxMyA4IDMgMTVxMCAyMiAtMTUuNSAzN3QtMzcuNSAxNXQtMzcgLTE1dC0xNSAtMzd6IiAvPgo8Z2x5cGggdW5pY29kZT0iOyIgaG9yaXotYWR2LXg9Ijg4NyIgZD0iTTI5OSA0MThsLTQyIC00NHEtNCAtNSAtMTEgLTEyLjVsLTEyLjUgLTEzLjVsLTEwLjUgLTExcS0xOCAxNiAtMjcgMjNxLTQ5IDQwIC04MSA0MGgtMTAxdjExMmgxMDFxNTkgLTEgMTE4IC00MXEzMyAtMjEgNjYgLTUzek0zOTkgMTU2bDQ0IDQ3bDMyIDM0cTE2IC0xNCAyNiAtMjJxNTIgLTQyIDg0IC00MGg4NnY5NGwxNzUgLTE0OGwtMTc1IC0xNDZ2ODhoLTg2cS01NiAwIC0xMjAgNDBxLTI3IDE3IC02NiA1M3pNNTgyIDQwMCBxLTIzIDAgLTU2IC0yMnEtMzUgLTIzIC03OCAtNjhxLTE5IC0xOSAtNTQuNSAtNTcuNWwtNjYuNSAtNjkuNXQtNjAgLTU1cS04MCAtNjQgLTE1NCAtNjVoLTk5djExMmg5OXEyNiAwIDU5IDIycTI5IDE4IDc5IDY4cTUgNSA3MyA3Ny41dDEwNyAxMDQuNXE4MSA2NCAxNTIgNjVoODh2OTJsMTc1IC0xNDdsLTE3NSAtMTQ3djkwaC04OGgtMXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3gzYzsiIGhvcml6LWFkdi14PSIzOTUiIGQ9Ik0xMTUgNDEwbDIyMiAyMjN2LTY2OGwtMjIyIDIyMmgtMTEydjIyM2gxMTJ6IiAvPgo8Z2x5cGggdW5pY29kZT0iPSIgaG9yaXotYWR2LXg9Ijk0NyIgZD0iTTg5NiAzNzl2LTE3NmwtNjMgLTI1di0xMDhoLTc3M3Y0NDJoNzczdi0xMDl6TTc2MCAxNDR2Mjk0aC02MjZ2LTI5NGg2MjZ6TTM3MyAzOTBsMjIyIC0xOThoLTQxM3YxOThoMTkxeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeDNlOyIgaG9yaXotYWR2LXg9Ijg4OSIgZD0iTTEyNiA0MDhsMjIyIDIyM3YtNjY4bC0yMjIgMjIyaC0xMTJ2MjIzaDExMnpNNDM0IDQzOHE3NSAtNTAgNzUgLTE0MHQtNzUgLTEzOWwtMzQgNjdxMzUgMjggMzUgNzJ0LTM1IDcydjJ6TTY4MCAyOThxMCAtOTIgLTQ2IC0xNjguNXQtMTIzIC0xMjAuNWwtMzQgNjZxNTkgMzQgOTQgOTMuNXQzNSAxMjkuNXQtMzUgMTI5LjV0LTk0IDkzLjV2MmwzMyA2NXE3NyAtNDQgMTIzLjUgLTEyMS41dDQ2LjUgLTE2OC41ek01ODcgNzM4IHExMTggLTY2IDE4OC41IC0xODN0NzAuNSAtMjU3dC03MC41IC0yNTd0LTE4OC41IC0xODJsLTMzIDY2cTk5IDU2IDE1OC41IDE1NS41dDU5LjUgMjE3LjV0LTU5LjUgMjE3LjV0LTE1OS41IDE1NS41eiIgLz4KPGdseXBoIHVuaWNvZGU9Ij8iIGhvcml6LWFkdi14PSI5MjIiIGQ9Ik00NjEgNzAycTE3NSAwIDI5OCAtMTIzLjV0MTIzIC0yOTcuNXQtMTIzIC0yOTcuNXQtMjk4IC0xMjMuNXEtMTc0IDAgLTI5Ny41IDEyMy41dC0xMjMuNSAyOTcuNXQxMjMuNSAyOTcuNXQyOTcuNSAxMjMuNXpNNDg5IDI5cTE5IDE4IDE5IDQ3dC0xOSA0N3EtMjAgMTcgLTQ5IDE3cS0yOCAwIC00OCAtMTdxLTIwIC0yMCAtMTggLTQ3cS0yIC0yNyAxOCAtNDdxMTkgLTE3IDQ4IC0xN3EzMiAwIDQ5IDE3ek02MDIgMzUxcTEwIDI0IDEwIDYyIHEwIDU4IC00MSA5M3EtMzggMzQgLTEwOCAzNHEtNDkgMCAtODUgLTEycS0zMyAtMTEgLTYzIC0zMWwtOSAtNmw0NiAtODdsMTAgOHEyIDEgMTkgMTFxNyA0IDIzIDEwcTEwIDQgMjMgNnE3IDIgMjEgMnEzMCAwIDM4IC0xMHExMSAtMTEgMTEgLTMxcTAgLTEzIC03IC0yNXEtMTIgLTE2IC0yMSAtMjRxLTQgLTQgLTguNSAtOGwtMTAgLTl0LTkuNSAtOHEtMTcgLTE2IC0zMCAtMzRxLTEyIC0yMCAtMjAgLTQ2cS01IC0yMiAtNSAtNDEgcTAgLTQgMC41IC0xMnQwLjUgLTEybDEgLTExaDExaDg4djEycTAgMjYgOCA0MnE5IDE2IDIxIDMwcTE0IDE0IDI5IDI1dDMyIDMwcTE0IDE3IDI1IDQyeiIgLz4KPGdseXBoIHVuaWNvZGU9IkAiIGhvcml6LWFkdi14PSI1MDgiIGQ9Ik0yNTggNzAzcTkyIDAgMTU3LjUgLTY2dDY1LjUgLTE1N3EwIC0xMDcgLTIwMyAtNTQ2bC0yNCAtNTBsLTYzIDEzNXQtMTAxIDI0NC41dC02MyAyMTYuNXEwIDkyIDY1LjUgMTU3LjV0MTU3LjUgNjUuNWg0aDR6TTI1NCAzOTdxNDIgMCA3MiAzMHQzMCA3M3EwIDQyIC0zMCA3MnQtNzIgMzBxLTQzIDAgLTczIC0zMHQtMzAgLTcycTAgLTQzIDMwIC03M3Q3MyAtMzB6IiAvPgo8Z2x5cGggdW5pY29kZT0iQSIgaG9yaXotYWR2LXg9Ijg5MyIgZD0iTTMxNSAyOTlsNzAgLTcwcS0zOCAtMzIgLTg4LjUgLTMwdC04Ni41IDM4bC0xNDQgMTQ0cS0zOCAzNyAtMzggOTF0MzggOTFsOTkgOTlxMzggMzggOTEuNSAzOHQ5MS41IC0zOGwxNDQgLTE0NHEzNiAtMzYgMzcuNSAtODYuNXQtMzAuNSAtODguNWwtNzAgNjlxMTAgMjAgLTYgMzhsLTE0NCAxNDRxLTkgOSAtMjIuNSA5dC0yMi41IC05bC05OSAtOTlxLTEwIC0xMCAtMTAgLTIzdDEwIC0yM2wxNDQgLTE0NHExNiAtMTYgMzYgLTZ6TTcyOCAtOTkgcS0zOCAtMzcgLTkxIC0zN3QtOTEgMzdsLTE0NSAxNDVxLTM1IDM1IC0zNyA4NS41dDMwIDg4LjVsNjkgLTcwcS05IC0yMCA3IC0zNmwxNDQgLTE0NHE5IC0xMCAyMi41IC0xMHQyMi41IDEwbDk5IDk5cTEwIDkgMTAgMjIuNXQtMTAgMjIuNWwtMTQ0IDE0NXEtMTYgMTYgLTM3IDVsLTY5IDcwcTM4IDMyIDg4LjUgMzAuNXQ4Ni41IC0zNy41bDE0NCAtMTQ0cTM3IC0zOCAzNyAtOTEuNXQtMzcgLTkxLjV6TTI2MyA0NjVxMTQgMTQgMzQgMTQgdDM0IC0xNGwyOTUgLTI5NXExNCAtMTQgMTQgLTM0dC0xNCAtMzR0LTM0IC0xNHQtMzQgMTRsLTI5NSAyOTRxLTE0IDE0IC0xNCAzNC41dDE0IDM0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iQiIgaG9yaXotYWR2LXg9Ijg4MSIgZD0iTTczNCAzMTFxLTE0IC0yNyAtNDIgLTUwcS0xMiAtMzAgLTMxLjUgLTU4dC01NC41IC02MHQtOTIuNSAtNTEuNXQtMTI5LjUgLTE5LjVxLTc3IDAgLTE0My41IDIxdC0xMDUuNSA1MXQtNjcgNjB0LTM5IDUxbC0xMSAyMXE1IC0zIDE0LjUgLTYuNXQzOC41IC0xMS41dDU4IC0xMnQ3MCAtMC41dDc4IDE3LjVxLTY0IDI3IC05NiA5MXEtMjEgNDMgLTggNTRxNyA3IDI1IC0xMHE1MyAtNTAgMjEyIC00MXE3IDggMjEgMjZ2NXEwIDY3IDQ3IDExNCB0MTE0IDQ3cTY0IDAgMTEwIC00My41dDUxIC0xMDYuNWwxMDIgLTQ5ek02MjYgNDY5cS0xOSAwIC0zMiAtMTMuNXQtMTMgLTMyLjV0MTMgLTMydDMyIC0xM3QzMi41IDEzdDEzLjUgMzJ0LTEzIDMyLjV0LTMzIDEzLjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iQyIgaG9yaXotYWR2LXg9IjkxMyIgZD0iTTc3MSAzMTdxNDYgLTE4IDc0IC01OS41dDI4IC05Mi41cTAgLTY4IC00OC41IC0xMTYuNXQtMTE2LjUgLTQ4LjVxLTIgMCAtNSAwLjV0LTQgMC41aC00OTRoLTFoLTJxLTY5IDEgLTExNy41IDUwdC00OC41IDExOXEwIDQ1IDIyLjUgODMuNXQ2MC41IDYwLjVxLTYgMTYgLTYgMzVxMCA0NyAzNCA4MXQ4MSAzNHEzOCAwIDcxIC0yNXEzMSA2NCA5MSAxMDN0MTMzIDM5cTEwMyAwIDE3NiAtNzIuNXQ3MyAtMTc2LjVxMCAtMTAgLTEgLTE1eiIgLz4KPGdseXBoIHVuaWNvZGU9IkQiIGhvcml6LWFkdi14PSI5MTciIGQ9Ik00NTkgNjk4cTE3MyAwIDI5NS41IC0xMjN0MTIyLjUgLTI5NnQtMTIyLjUgLTI5NS41dC0yOTUuNSAtMTIyLjV0LTI5NiAxMjIuNXQtMTIzIDI5NS41dDEyMyAyOTZ0Mjk2IDEyM3pNNTc0IDI1MnEtMTEgMTIgLTExIDI4dDExIDI4bDEwOSAxMDhxMTEgMTIgMTEgMjguNXQtMTEgMjcuNWwtMzEgMzFxLTEyIDExIC0yOC41IDExdC0yNy41IC0xMWwtMTA4IC0xMDlxLTEyIC0xMSAtMjguNSAtMTF0LTI3LjUgMTFsLTEwOSAxMDkgcS0xMSAxMSAtMjcuNSAxMXQtMjcuNSAtMTFsLTMxIC0zMXEtMTEgLTExIC0xMSAtMjcuNXQxMSAtMjguNWwxMDkgLTEwOHExMSAtMTIgMTEgLTI4dC0xMSAtMjhsLTEwOSAtMTA4cS0xMSAtMTIgLTExIC0yOC41dDExIC0yNy41bDMxIC0zMXExMSAtMTEgMjcuNSAtMTF0MjcuNSAxMWwxMDkgMTA5cTExIDExIDI3LjUgMTF0MjguNSAtMTFsMTA4IC0xMDlxMTEgLTExIDI3LjUgLTExdDI4LjUgMTFsMzEgMzFxMTEgMTEgMTEgMjcuNXQtMTEgMjguNXogIiAvPgo8Z2x5cGggdW5pY29kZT0iRSIgaG9yaXotYWR2LXg9Ijg5NSIgZD0iTTQ0OCA1MzFxNjMgMCAxMjkuNSAtMjMuNXQxMTUuNSAtNTd0ODkuNSAtNjd0NjEuNSAtNTcuNWwyMSAtMjN2LThsLTIyIC0yNC41dC01OS41IC01NC41dC05MiAtNjl0LTExNCAtNTQuNXQtMTMwLjUgLTI0LjV0LTEyOS41IDIzLjV0LTExNS41IDU3dC04OS41IDY3dC02MS41IDU2LjVsLTIxIDI0djlsMjIgMjQuNXQ1OS41IDU0LjV0OTIgNjguNXQxMTQgNTR0MTMwLjUgMjQuNXpNNDQ2IDE1OHE1OCAwIDk4LjUgNDAuNXQ0MC41IDk4LjUgcTAgNTcgLTQwLjUgOTcuNXQtOTguNSA0MC41cS01NyAwIC05Ny41IC00MC41dC00MC41IC05Ny41cTAgLTU4IDQwLjUgLTk4LjV0OTcuNSAtNDAuNXpNNDQ2IDM2MXEyNiAwIDQ1IC0xOXQxOSAtNDV0LTE5IC00NC41dC00NSAtMTguNXQtNDQuNSAxOC41dC0xOC41IDQ0LjV0MTguNSA0NXQ0NC41IDE5eiIgLz4KPGdseXBoIHVuaWNvZGU9IkYiIGhvcml6LWFkdi14PSI3MDQiIGQ9Ik0yMjQgNzAwaDQyMnYtODE4aC01OTN2NjQ2bDE3MSAxNzF2MXpNNTc4IC01MHY2ODJoLTI4NXYtMTcyaC0xNzJ2LTUxMGg0NTd6IiAvPgo8Z2x5cGggdW5pY29kZT0iRyIgZD0iTTQ2MCA2OThxMTc0IDAgMjk3IC0xMjN0MTIzIC0yOTd0LTEyMyAtMjk3dC0yOTcgLTEyM3QtMjk3IDEyM3QtMTIzIDI5N3QxMjMgMjk3dDI5NyAxMjN6TTczOCA0MDFsLTEgLTNxLTEgLTMgLTEgLTUuNXQyIC0yLjVxMCAtMiAzIC02dDMgLTh2LTExcTEgLTIgNSAtM3ExIC00IDYgLTV0NiAzcS0zIDAgLTIuNSA0LjV0LTAuNSA0LjVxMCAyIC0xIDNxLTIgMiAtMiAzaDdxMCAyIC0yIDV0LTIgNHEtMSAwIC0yLjUgLTF0LTIgLTF0LTAuNSAyIHQtNCA2bC0yIDdxMyAwIDYgMXEtMSAwIDQgMnEtMSAxIC0yIDRxLTIgNCAtNyAycS0yIDAgLTUgLTIuNXQtNSAtMi41ek03MzUgODFxNjMgOTAgNjMgMTk3cTAgMTkgLTEgMjhxLTkgMCAtMTMgMnEtNCAwIC0xNC41IDQuNXQtMTYuNSAyLjVxMCAxIC0xIDFxMiAzIC01IDExcS01IDQgLTcgMHEtMiAtMyA1IC0xMHEwIC0yIDIgLTZxMiAtMSAxIC0zdC0xIC0zcTQgMCA1IDdxMCAtMSAxIC0xcS0yIC0zIDEgLTZ2LTVxMTAgMCAxNCAxMCBxMSAwIDEgLTJ0MSAtM3EzIC0zIDIgLTV0MiAtMnEyIC0xIDIgMXYycTQgLTIgNCAtNnQtNCAtNnEwIC0xIC0xIC0zdC0xIC00cTAgLTYgLTQgLThsLTQgLTJxLTQgLTMgLTggLTUuNXQtNCAtMy41cS0xMiAwIC0xNSAtN3EtNyAwIC0xMSAtNHEtNiAwIC04LjUgNnQtNC41IDZsLTIgNXExIDAgLTEuNSA2bC01LjUgMTN0LTMgOWwtNSAxMHEtMiAxIC03IDEycS04IDQgLTEwIDEzcTEwIDAgMTAgNHEtMSAwIC0yIDFxLTIgMiAxIDJsMyA5IHEwIDEgMSA1LjV0MSA2LjVxLTIgMCAtOCAtMnEwIC0xIC0xLjUgLTAuNXQtMy41IDAuNWwtMyAxcTAgMSAtNi41IDB0LTguNSAycS0yIDIgLTQgMTRxLTEgMyAtOCAzcS0zIDEgLTMuNSAtMXQwLjUgLTVsMSAtNHEyIDAgLTIgLTdxLTEgLTEgLTEgLTJxLTQgMSAtNiA2dC00IDZxLTEgNCAtMyA0cTAgMTAgLTEgMTBsLTMgMXEtNCAyIC01IDNxLTIgMCAtNS41IDMuNXQtNi41IDUuNXQtNCAwbDMgLTZxMiAwIDUgLTQuNXQ3IC0zLjV2LTUgcTMgMSA0LjUgLTEuNXQyLjUgLTIuNXEwIC0xIC0zIDBxLTQgMiAtMyAtMXEyIC02IC00IC05cTAgMTIgLTMgMTJxLTIgMyAtNyA1dC02IDRxLTEgMCAtMy41IDMuNXQtNC41IDQuNXEtMiAtMiAtNSAtMnEtMSAtMiAtNC41IC0yLjV0LTcuNSAwLjVsLTMgMXEtNyAtMTggLTggLTIwcS0xIC0zIC0zIC01dC0zIC01cTAgLTEgLTcuNSAtMS41dC03LjUgLTEuNXEtMTEgNCAtMTEgMTN2NXQxIDl0MSA2bDIgLTJoMy41aDQuNXQzLjUgMXQxLjUgMiBxNCAwIDMgLTRxOSAtMyA5IDNxLTIgMCAtMiAycTMgNCAyIDd0LTQgNnQtMyA0bC00IDRxOSAtNiAxMSAtMXEwIDEgLTEgM3YxcTIgLTIgMy41IC0yLjV0Mi41IDEuNXEyIDEgMyAzdjZxMyAtNCA0LjUgMHQyLjUgNXEwIC0zIDMgMHEyIDIgMyAycTEgMiA1IDIuNXQ1IDMuNXEtMyAxIC0zIDEycTIgMCA0LjUgMS41dDMuNSAxLjV0MiAtMnEwIC02IDEgLTZxNCAyIDQgNXEtMiAwIC01IDEwcS0zIDAgLTUgLTJxLTMgMCAtNy41IDF0LTYuNSAxIHEtNyA3IC02IDdxLTIgNCAyIDVoMnEwIDIgMTEuNSA1dDEyLjUgOHEtNiAwIDggMTNxMTAgOCAxNCA4cTEgMCA5LjUgMmwxNC41IDMuNXQ4IC0wLjVxMjIgMCAyMiAtMnExIDAgMy41IC0xdDQgLTEuNXQzLjUgMC41cTMgMiAxMSAtMnQ4IC04cS0zIDAgLTEyIC0xdC0xNCAtMXYtMnEyIDAgNS41IC00LjV0Mi41IC02LjVxMyAwIDYgMnQ0IDJxMCAtMiAxIC0zcTMgLTIgNCAzbC0xIDRxMSAyIDQuNSAyLjV0NC41IDMuNXEtNDcgNTYgLTExNC41IDg4IHQtMTQzLjUgMzJxLTEzNCAwIC0yMzEgLTkxcTEgLTEgNSAybDIgMXEwIC02IDEgLThsMyAtN3E4IDAgOSAtMmgtNXExIC02IC0zIC00cS0zIDEgLTQgMXEwIDEgLTMgMnQtNSAwdDAgLTVxMSAwIDIgLTF0MyAtMnEyIDAgNi41IC0xdDYuNSAtMnEyIDAgNSAwLjV0NCAwLjVxMiAxIDMgMnQtMSAycTEgMiAtNCA0cTAgMSAxMSAxcTIgMiAxLjUgMy41dDAuNSAzLjV0NCAydDQgM3E0IC0yIDUgLTZxMSAwIDMgLTNxOSAtMTAgOSAtM3E2IC0xIDYgLTExIHE3IDEgNyAxMXEtMSAwIC0xIDNoNHEyIC0xIDIgMXExIDAgMSAtMmg4di0xMXEwIC0yIC0yIC0zdC0zIC0xbC0yIC0xcS0zIC00IC0xLjUgLTV0Ni41IC0zLjV0NiAtMy41bC04IDFxLTEgMCAtNC41IC0wLjV0LTYgLTF0LTQuNSAwLjVxNSAwIDcgMTFxLTggMiAtMTEgLTVxLTEgLTQgLTQgLTMuNXQtNCAtMS41bC0yIC0xcS0zIC0xIC01IC0xLjV0LTIgMC41cS03IC0yIC03IC0xN3ExMSAtOCAxMSAtMTJxNCAtMSA5LjUgLTJ0OC41IC0xIHExIC0zIDQgLTNxMCAtNCA5IC00cTAgNiA2IC00cTEgLTIgMSAtM3EtMSAwIDAgLTIuNXQzIC01LjVxLTIgMCAtMSAtMXEyIC0yIDUuNSAtMXQzLjUgM3EtMiAwIC0yIDZxLTYgNiAxIDhxMCAtNCA2IDFxMiAyIC0xIDNxMiA5IDAgMTJxLTEgMSAtMi41IDF0LTIuNSAycTQgMSAxIDE0aDVxMiAwIDUuNSAtMS41dDUuNSAtMXQzIDMuNXEzIC0yIDQuNSAtNXQ0LjUgMXEwIC0xIDQgLTUuNXQ1IC00LjVxMCAtMyAyIC0zbC0xIC0ycTcgMCA3IDEgcTYgMCA2IDhxMSAwIDIuNSAtM2wzIC02dDIuNSAtM2wyLjUgLTIuNWwzIC0zdDIuNSAtM3QxIC0yLjVxMiAtMiAyIC01cTEgMCAyIDJxMyAzIDMgLTFxMiAwIDQuNSAtMi41dDIuNSAtMy41cS0yIDAgLTEuNSAtMnQtMC41IC0ycTAgLTEgLTExIC0xcS0xIC01IC02IC02dC0xMSAwLjV0LTExIC0wLjVxLTQgLTIgLTkuNSAtOC41dC01LjUgLTEwLjVxMyAwIDcuNSAzLjV0Ni41IDQuNXEyIDAgMTAgNHEwIC0xIDEgLTF2LTFxLTYgMCAtMiAtNyBxMSAtMSAxIC0ycTMgLTUgOCAtNXEwIC0xIC0yLjUgLTF0LTIuNSAtMmwtNSAtM2gtNmwxIDFsMSAxaDN2NHEtMyAwIC02IC0xLjV0LTUgLTEuNXEtNCAtNCAtNiAtNHEtMiAtMTAgLTYgLTEybC0yIC0xbC00IC0ybC0yIC0ybC0yIC0ycS0xIC0yIC0yIC01cS0zIC03IC0zIC05cS0xIDAgLTMuNSAtNS41dC02LjUgLTUuNXEtMSAtMiAtNS41IC02dC00LjUgLTEwcTEgLTEgMS41IC00dDEuNSAtNi41dDEgLTQuNXEwIC04IC00IC04bC0yIDN0LTEgMyBxMCA0IC00IDEycTAgMiAtNC41IDEuNXQtNS41IC0wLjVxLTEgMyAtMTMgM3EwIC0xIDEgLTJ0MSAtM3EtNiAtMiAtNyAtMnEtMiAwIC00LjUgMi41dC01LjUgMS41cS0xNCAtMiAtMTQgLTE2cS0xIDAgLTEgLTguNXQxIC04LjVxMCAtMiAyIC02dDIgLTVxMiAwIDYgLTR0NSAtNHExIC00IDUgLTRsMiAxbDIgNHEtMyAxIC0xLjUgMy41dDMuNSAzLjVxMCAtMiA2IDJsNiAybDIgMnExIC0zIC0xIC00cS0yIDAgLTMgLTNsLTEgLTIgcS0xIC0yIC0yIC01dC0xIC01dDEgLTQuNXQwIC00LjVoMTN2M3EzIDAgMi41IC02LjV0MS41IC02LjVxMCAtMiAxIC02dDEgLTVxNSAtMyA0IC04cTEyIDAgMTIgM3E3IDAgNSAtN3E1IDAgNiAzdDEgNS41dDIgMi41cTAgMyAyIDFsNiAzbDMgMnEyIC0xIDIgLTJxNSAwIDkgNHEyIDAgNCAtNXQ2IC01cTEyIDAgMTMgMXEzIC0yIDMgLTNxMSAwIDIgLTFsMSAtMWgxbDQgLTRxMCAtMiAyLjUgLTN0Mi41IC0ybDEgLTFsMyAtMmw5IC0zcTEgMyA0IDAgcTEgLTEgMiAtMWwyIC0ycTEgLTEgNCAtN3EyIC0yIDQgLTExcS0xIDAgLTEgLThsNCAtMXEyIDAgMiAycTIgMCA1IC0ydDQgLTJxLTIgLTIgMSAtMy41dDMgMi41cTMgMCAzIC0xMXEyIDAgNC41IDEuNXQ0LjUgMS41cTYgMCA2IDFxOCAtMiAxMyAtOHE1IC01IDUuNSAtMTR0LTQuNSAtMTRsLTggLTEwcTAgLTEyIC0xIC0xMnEwIC0xNCAtMyAtMTRxMCAtMyAtMi41IC03dC0zLjUgLTZxLTEgLTEgLTYuNSAtNC41dC02LjUgLTUuNSBxLTEgMCAtNCAtMXQtNCAtMWwtMiAtM3EtMyAtMyAtMiAtM3EwIC0xIC0wLjUgLTcuNXQtMS41IC04LjVxLTQgLTIgLTMgLTRxLTEgMCAtMS41IC0xdC0zLjUgLTFxLTIgMCAtNSAtMi41dC0zIC01LjVxLTIgLTggLTYgLTExbC0zIC0ycS00IC0yIC00IC00di04cS02IDAgLTggLTRxLTQgMCAtMTEgLTRxMCAtNCAtMiAtNHEwIC00IC0zIC0zdC00IDBxMiAwIDIgLTZxMCAtMSAtNiAtOWwtMSAtMnEtMiAtMyAtMyAtM3EwIC0xIC0wLjUgLTQgdC0wLjUgLTV2LTNsMiAycTAgMSAyIC0xcS0xIC0yIC0zIC00dC0zIC01cS01IDAgLTUgLThxMCAtMiAxIC0ycTAgLTEgMiAtNWwtMjcgOXEwIDM3IDQgMzdxMCA5IDIgOXYxNHEtMSAyIDEuNSA2LjV0Mi41IDYuNXEzIDEgMy41IDEwdDAuNSAxN3QyIDhxMCA0IDEuNSAyMC41dC0wLjUgMjAuNWwtNyA4cS01IDAgLTkgNi41dC00IDEyLjVxLTMgOSAtMyAxMHExIDAgLTIgNC41dC02IDkuNWwtNCA1cS0zIDMgLTMgNC41dDIgNXQyIDYuNSBxLTQgMiAtMiAxMC41dDUgOC41cTAgMyAzIDRxMSAtMyAzIC0ycTMgMyAwIDV2MTNxMCAxMCAtNSAxMHEtMiAwIC00IC01cS0xIDEgLTUgMS41dC03IDJ0LTMgNC41cTIgNiAtOCAxMXExIDQgLTUuNSA4LjV0LTEwLjUgNC41cTAgMSAtMiAxLjV0LTIgMS41cS0yIDAgLTUgM3QtNiAzcS00IDAgLTEwIDIuNXQtOSAyLjVxLTEgMiAtNi41IDN0LTYuNSAzcS03IDAgLTcgMTNxMCAxOCAtOSAxOHEwIDMgLTQgNi41dC02IDMuNXEtMyA3IC01IDcgcTAgNCAtNiA5cS0zIDIgLTMgMHEtMSAtMiAyLjUgLTUuNXQzLjUgLTUuNXExIDAgOCAtMTNxNiAtMTAgMyAtMTFxLTQgLTEgLTEwIDhxLTIgNCAtMiA2cS0yIDEgLTQuNSA2LjV0LTIuNSA3LjVxLTEgMSAtMi41IDR0LTIuNSA2bC0xIDJxMCAxMCAtMTEgMTBsLTcgOXEwIDEwIC04IDEzcTAgMiAtMSA5dDAgMTBxMCAyMyAtMTAgMzFxLTMzIC02OCAtMzMgLTE0NHEwIC0xNDAgOTkuNSAtMjM5dDIzOS41IC05OXE4MiAwIDE1MyAzN3QxMTggMTAwIHEtNyAtMiAtOSA5cS0zIDE3IDIgMzJxNSAtMiA2IDBxLTQgMSAtMiA2cTEwIC03IDEwIDJsLTIgMnEwIDIgMSAzdDEuNSAwLjV0MC41IC0yLjVxMyAwIDMuNSA0LjV0MS41IDUuNXEwIC0xMSAzIC0xMnEyIC0yIC0wLjUgLTQuNXQtMi41IC0zLjVxLTIgLTEgLTIgLTZoLTNxMCAtMyAtMSAtOC41dC0xIC03LjVxLTIgMCAtMiAtMTZ6TTY2NiAzODNxMiAtMSAyIC00cTI1IDAgMjUgM3ExIC0yIDIgLTN0MiAycTEgMCA0LjUgLTN0Ny41IC0ybDcgNCBsLTIgMXEwIDYgLTUgOS41dC02IDQuNXEtMSAwIC0zLjUgMXQtNC41IDFxLTMgMiAtNiAtMXEtMyAtMiAtMyAwcS0xIDIgLTMgMnEwIDggLTkgN3EtMSAtMyAtMy41IC03dC0zLjUgLTcuNXQtMSAtNy41ek01MTggNDkxcTAgLTUgLTEgLTVxLTUgLTMgLTEwIC0zaC0xMXEtMiAwIC0xMCAycTAgMSAxIDJxMyA0IC0xIDRxNyAzIDggM3YtMXYtNHEwIC0xIDIgLTAuNXQ0LjUgMXQzLjUgMS41cTMgMCA2IDFxMSAxIDEuNSAwLjV0MC41IC0zLjV6IE01NTEgNDQ0cTAgMiAtMSA0dC0xIDRxMCAzIDMgMi41dDQgMy41cTMgLTEgMCAtM3YtNHEyIDAgNCAydDMgMnEtMiAtNyAtMSAtOHE1IC01IDQgLTZxNyAwIDUgLTExcTMgMCAzIDNxMiAtMSAyIC0yLjV0LTIgLTEuNXEtMyAtNSAtMTUgLTVxMCA2IC00IDNxLTMgLTEgLTIgNHExIDIgMSAzcS0yIDEgNSAycS0xIDggLTggOHpNNTM2IDQyOHEtMiAyIDAgOHEtMyAxIDEgMmw1IDJxLTQgMCAtMiA0aDJxMSAtMiAyIC0xaDRxMSAtMSAwIC0zIHEtMyAtMTIgLTEyIC0xMnpNNTUxIDQyMnExIDAgMSAxaDNxMCAtMiAtMS41IC0ydC0yLjUgMXpNMzkyIDQwMXExIDEgNCAzcTAgLTMgLTQgLTN6TTU5OCAzODhxMiAwIC0xIC02cS0xIDIgLTIgNXEzIDAgMyAxek01OTggMzgwcTIgMCAxLjUgLTQuNXQtNS41IC0zLjVxMCA3IDIgN2wxIC0ycTEgMSAxIDN6TTYyMCAzNjVxMCAtNCAtMSAtNC41dC00LjUgMS41dC01LjUgMmg1cTEgLTEgNiAxek03MjggMjQwcTYgMCA2IDFxMTAgMCAxNiAzIHEwIC00IC0yLjUgLTkuNXQtMS41IC05LjVxLTMgMCAtMyAtNWwtMiAtMnEtMiAtMyAtNCAtNHEwIC0yIC05IC0xMXEtMSAtMiAtNS41IC02LjV0LTUuNSAtNi41cS0xNCAtMTQgLTEwIC0xNHEwIC0yNCAyIC0yNGwxIC02cTEgLTYgMSAtMTB0LTEgLTVxMCAtMyAtMiAtNy41dC0yIC02LjVsLTIgLTFsLTMgLTNxLTIgMCAtNCAtMy41dC0zIC0zLjVxMCAtNCAtMSAtMTF0LTEgLTExbC0xIC00bC0yIC02bC0xIC00cS0xNSAtOCAtMTUgLTE3IHEtNyAtMTAgLTggLTEycS0xOSAwIC0xOSAtNGgtMTVxMCAyIC0xIDZ0LTEgN3EtMSAwIC0yIDMuNXQtMiAzLjVxMCAxIC0yLjUgNi41dC00LjUgMTF0LTEgNS41cTAgOSAtMyA5cTAgNCAtMi41IDExdC0yLjUgMTBxLTEgMCAtMiA0dC0xLjUgNy41dDAuNSA0LjVxMCA0IDQgMjJxMSA5IC0zIDIzcS00IDAgLTQgNnEtNiA0IC02IDE1cTYgNiAzIDIwcS0zIDEgLTE0IDFxLTEgMyAtNy41IDR0LTE2LjUgMGwtMTAgLTFxLTEgLTIgLTQuNSAtMS41IHQtOC41IDIuNXQtNSAzcS0zIDAgLTcuNSA0LjV0LTQuNSA4LjVxLTQgMSAtOCA5LjV0LTQgMTIuNXEtNCA0IDAgOXEwIDMgLTMgMTJxMCAyIDEuNSA0dDEuNSA0cTAgMTEgNCAxOXEwIDEgMiA0dDIgNHEyIDMgMyAzcTIgMSAzIDNxMiAxIDUgNXEyIDMgMyA0cTMgMSAwIDRxNCAwIDQgMTBxMiAzIDYgM2wxIDFxNCA1IDUgNXEyIDMgNiAzcTEgLTEgMi41IC0xdDQuNSAxbDMgMXE1IDcgMTQgN3ExIDIgNSAxLjV0MTAuNSAtMS41dDcuNSAtMXYyIHEzIC0xIDcgLTEwdDQgLTEyaDhxMCAtNCAxMCAtNHExNiAwIDE2IDZxNiAwIDYgLTZoNnQ4LjUgLTAuNXQ3LjUgLTJ0MiAtMi41cTIgMCA0IC0zdDMgLTNxMCAtMyAyLjUgLTguNXQ0LjUgLTUuNXEwIC04IDUgLTExcTYgLTE0IDEyIC0xOHEtMSAtMiAxLjUgLTZ0Mi41IC01cTEgLTYgMyAtN3EwIC00IDUgLTExLjV0OCAtNy41cTAgLTEgLTEgLTJ0MiAtMnpNMzEyIDI5NnEwIC0zIDMgMHEwIC00IC00IC0ycS0yIDAgLTEgM3ExIDAgMiAtMXogTTMyOCAyOTdxNCAtMSA3LjUgLTMuNXQ1LjUgLTIuNXEzIC0zIDMuNSAtNHQtMS41IC0ycS04IC0yIC0xMiA1cS01IDAgLTEwIDVxNiAwIDcgMnpNMzYyIDI4M2wyIC0xcTIgLTIgMyAtNGwxIC0xaC0xM3EtMSAtMSAtNC41IC0xdC00LjUgMmg3bC0yIDRxMSAwIDUgLTF0NiAtMXYzek0zMzEgMjc4cTQgMCA0IC0zcS01IDAgLTQgM3pNMzM2IDI3NWwyIDNxMSAwIDEgLTJxLTEgLTEgLTMgLTF6TTM3NiAyNzhxMyAwIDMgLTFxLTQgMiAtMyAxeiBNMzczIDI3OGwyIC0xcS0xIDAgLTEgLTAuNXQtMSAtMC41djJ6TTM1NyAyNTBxMSAxIDEgMmwxIC0xcTAgLTEgLTIgLTF6TTc0MCAxMzRxMCAyIDIgM3oiIC8+CjxnbHlwaCB1bmljb2RlPSJIIiBob3Jpei1hZHYteD0iODY1IiBkPSJNNjg2IDI3OXYtMzc4aC0xNzd2MjM1aC0xNTJ2LTIzNWgtMTgzdjM3OGgtMTUzbDQxMiA0MTFsNDExIC00MTFoLTE1OHoiIC8+CjxnbHlwaCB1bmljb2RlPSJJIiBob3Jpei1hZHYteD0iOTMyIiBkPSJNODg0IDIzNHYtMzE0aC04MzZ2MzE0bDE1NyA0MThoNTIyek01ODIgMjM0aDE5OGwtMTA1IDMyMmwtNDE4IDFsLTEwNCAtMzIzaDE5N2w0OSAtOTZoMTMweiIgLz4KPGdseXBoIHVuaWNvZGU9IkoiIGhvcml6LWFkdi14PSI4NjIiIGQ9Ik04NDggNTM0bC0xMjIgLTEyMmw4MiAtODJsLTM3MCAtNDJsNDMgMzY5bDgxIC04MWwxMjIgMTIyek0xMzYgMTQ4bC04MiA4MmwzNjkgNDNsLTQzIC0zNzBsLTgxIDgybC0xMjIgLTEyMmwtMTYzIDE2M3pNMTgyIDM4OGwxOTcgLTY4bC0yMjEgMTh6TTM5MyA0MTd2LTg1bC0yOCA4MHpNNjgyIDE3NGwtMTk3IDY5bDIyMSAtMTl6TTQ3MSAxNDZ2ODVsMjggLTgxeiIgLz4KPGdseXBoIHVuaWNvZGU9IksiIGhvcml6LWFkdi14PSI4NjkiIGQ9Ik01MzAgMzUxbDMxOCAtMzE4di0xNjh2MGgtMTY4aC0xdjEyOWgtMTI4djEyOGgtMTI4bC02MSA2MXEtNDAgLTE0IC04MyAtMTRxLTEwOSAwIC0xODcgNzcuNXQtNzggMTg3LjV0NzggMTg3LjV0MTg3IDc3LjV0MTg3IC03Ny41dDc4IC0xODcuNXEwIC00MyAtMTQgLTgzek0yMjQgNDAycTM3IDAgNjMgMjZ0MjYgNjN0LTI2IDYzdC02MyAyNnQtNjMuNSAtMjZ0LTI2LjUgLTYzdDI2LjUgLTYzdDYzLjUgLTI2eiIgLz4KPGdseXBoIHVuaWNvZGU9IkwiIGQ9Ik00NjAgNzAxcTE3NCAwIDI5NyAtMTIzdDEyMyAtMjk3dC0xMjMgLTI5N3QtMjk3IC0xMjN0LTI5NyAxMjN0LTEyMyAyOTd0MTIzIDI5N3QyOTcgMTIzek00NjAgLTM0cTEzMCAwIDIyMi41IDkydDkyLjUgMjIzdC05Mi41IDIyM3QtMjIyLjUgOTJ0LTIyMi41IC05MnQtOTIuNSAtMjIzdDkyLjUgLTIyM3QyMjIuNSAtOTJ6TTQ2NCA1MjlxMTAzIDAgMTc2LjUgLTczLjV0NzMuNSAtMTc3LjV0LTczIC0xNzcuNXQtMTc3IC03My41IHQtMTc3LjUgNzMuNXQtNzMuNSAxNzcuNXQ3My41IDE3Ny41dDE3Ny41IDczLjV6TTM5NiAzNTlxMzMgMzMgMTAyIDcwbC0zMCA0MHEtNCAxIC0xMiAxcS02MSAwIC0xMTYuNSAtNTV0LTU1LjUgLTExNnEwIC02IDEgLTlsNDIgLTMycTM4IDcwIDY5IDEwMXpNNTQwIDE1NXExNiAwIDI4IDEydDEyIDI5dC0xMS41IDI5dC0yOC41IDEydC0yOSAtMTJ0LTEyIC0yOXQxMiAtMjl0MjkgLTEyeiIgLz4KPGdseXBoIHVuaWNvZGU9Ik0iIGhvcml6LWFkdi14PSI5NTIiIGQ9Ik04OTIgMzJsLTI3MyAyNjJsMjczIDIzNHEzIC04IDMgLTE1di00NjVxMCAtOCAtMyAtMTZ6TTQ3NiAyMzhsLTcyIDU4bC0zNiAzMGwtMjc1IDIzNXExMCAyIDE0IDJoNzM4cTQgMCAxNCAtMmwtMjc1IC0yMzVsLTM2IC0zMHpNODQ1IC0yaC03MzhxLTUgMCAtMTMgMmwyNzYgMjY1bDEwNiAtODdsMTA3IDg3bDI3NSAtMjY1cS04IC0yIC0xMyAtMnpNNjAgNTI4bDI3MyAtMjM0bC0yNzMgLTI2MnEtMyA4IC0zIDE2djQ2NXEwIDcgMyAxNXoiIC8+CjxnbHlwaCB1bmljb2RlPSJOIiBob3Jpei1hZHYteD0iOTQzIiBkPSJNODU3IDY3MHExNyAwIDIzIC02dDYgLTIzdi02NTVxMCAtMTcgLTYgLTIzdC0yMyAtNmgtMTA4aC01NDZoLTcxcS0yOCAwIC01My41IDI2LjV0LTI1LjUgNTIuNXY0ODFxMCAxNyA2IDIzdDIzIDZoOTJ2OTVxMCAxNyA2IDIzdDIzIDZoNjU0ek04MzcgN3Y2MTNoLTYxNHYtNzR2LTUwdi00NDVoLTQ5djQ0NWgtNzF2LTQ2MHEwIC03IDExIC0xOHQxOCAtMTFoNzFoNTQ2aDg4ek01MTEgNTU2di0yMjNoLTIyM3YyMjNoMjIzek03NjUgNTI1di0zNyBoLTE4NXYzN2gxODV6TTc2NSA0MTF2LTM3aC0xODV2MzdoMTg1ek03NjUgMjU5di0zN2gtNDc3djM3aDQ3N3pNNzY1IDE0NHYtMzdoLTQ3N3YzN2g0Nzd6IiAvPgo8Z2x5cGggdW5pY29kZT0iTyIgaG9yaXotYWR2LXg9IjkzMCIgZD0iTTg4MiA1MTB2LTUxMWgtNzB2NTExaDcwek02OTUgNTEwaDQ3di01MTFoLTU1NnY1MTFoNTJxNjggMTMzIDEyMiAxMzNoMjA3cTMyIDAgNjYuNSAtNDAuNXQ2MS41IC05Mi41ek01MTQgNTIycTEzIDAgMjIgOXQ5IDIydC05IDIxLjV0LTIyIDguNWgtMTA0cS0xMyAwIC0yMS41IC04LjV0LTguNSAtMjEuNXQ4LjUgLTIydDIxLjUgLTloMTA0ek00OCA1MTBoNjl2LTUxMWgtNjl2NTExeiIgLz4KPGdseXBoIHVuaWNvZGU9IlAiIGhvcml6LWFkdi14PSI5MDkiIGQ9Ik03MTkgNDk2aDE0M3YtNDk1aC02NTl2MWwtMTc3IDQ2MWw2MTUgMjM3ek02NjAgNDk2bC01MSAxMzNsLTM0NSAtMTMzaDM5NnpNOTcgNDMybDEwNiAtMjc3djMxOHpNMjU4IDU2aDU0OXYzODVoLTU0OXYtMzg1ek02OTkgMjkybDU4IC0xOTBoLTQzMmwxMDMgMTEybDY2IC00MmwxMjMgMTc3bDM4IC03MXpNMzc5IDI3NXEtMjIgMCAtMzcgMTV0LTE1IDM3dDE1IDM3dDM3IDE1dDM3IC0xNXQxNSAtMzd0LTE1IC0zN3QtMzcgLTE1eiIgLz4KPGdseXBoIHVuaWNvZGU9IlEiIGhvcml6LWFkdi14PSI4NDQiIGQ9Ik02ODEgNTIxcTYxIC01NCA5NS41IC0xMjkuNXQzNC41IC0xNjAuNXEwIC0xNjEgLTExNCAtMjc1LjV0LTI3NSAtMTE0LjV0LTI3NSAxMTQuNXQtMTE0IDI3NS41cTAgODUgMzUgMTYxdDk2IDEzMHEyMCAxNyA0Ni41IDE1LjV0NDMuNSAtMjEuNXExNyAtMTkgMTUuNSAtNDUuNXQtMjEuNSAtNDMuNXEtODggLTc4IC04OCAtMTk2cTAgLTEwOSA3Ni41IC0xODZ0MTg1LjUgLTc3dDE4NS41IDc3dDc3LjUgMTg2cTAgMTE3IC04OCAxOTUgcS0yMCAxOCAtMjEuNSA0NHQxNi41IDQ2cTE3IDE5IDQzLjUgMjAuNXQ0NS41IC0xNS41ek00MjMgMTY2cS0yNiAwIC00NC41IDE5dC0xOC41IDQ1djQwN3EwIDI2IDE4LjUgNDV0NDQuNSAxOXQ0NSAtMTl0MTkgLTQ1di00MDdxMCAtMjYgLTE5IC00NXQtNDUgLTE5eiIgLz4KPGdseXBoIHVuaWNvZGU9IlIiIGhvcml6LWFkdi14PSI5MDkiIGQ9Ik02NjggMTA1djg3bDEwNCA3MHYtMjYyaC03MzF2NTIzaDMyN3EtMiAtMSAtNi41IC0zdC02LjUgLTNxLTg3IC0zOSAtMTQxIC05OWgtNjl2LTMxM2g1MjN6TTg3NyA0MTdsLTMxMyAtMjExdjEzN3EtOTAgMCAtMTQxIC03cS00OSAtNiAtODkuNSAtMjF0LTYzLjUgLTMzLjV0LTM5IC0zNS41dC0yMiAtMjhsLTYgLTEycTAgNTQgMjAgMTAwdDUxLjUgNzUuNXQ3MC41IDUyLjV0NzcuNSAzNXQ3MCAyMHQ1MS41IDEwbDIwIDJ2MTI2eiIgLz4KPGdseXBoIHVuaWNvZGU9IlMiIGhvcml6LWFkdi14PSI4NTMiIGQ9Ik04MjYgMzg5cTEwIC0xMSA4IC0yNHEwIC0xMyAtMTAgLTI4cS0zIC00IC0xNiAtMTRsLTE4NCAtMTIxcS0yIC0xIC01LjUgLTd0LTIuNSAtMTB2LTRsODEgLTIzN3E0IC0xMSA0IC0yM3EwIC0xNSAtNyAtMjVxLTExIC0xNiAtMzAgLTE2aC0xcS0xNiAxIC0zNiAxNWwtMTkwIDE1NXEtMyAzIC0xMCAzdC05IC0zbC0xODEgLTE1NHEtMTggLTE0IC0zNiAtMTVxLTIxIC0yIC0zMSAxNXEtOCAxMSAtOCAyNnEwIDcgNCAyMWw3MiAyMzZ2NCBxMSA1IC0yIDExdC02IDdsLTE4NSAxMjJxLTEwIDcgLTE2IDE0cS0xMSAxMyAtMTEgMjhxMCAxNCA4IDI0cTkgOSAxNiAxMnExMiA1IDI3IDVoMjMwcTYgMCAxMSA0cTcgNSA3IDEwbDY3IDIzOXE0IDE0IDkgMjFxMTMgMTggMzMgMTlxMjAgLTEgMzMgLTE5cTMgLTQgMTAgLTIxbDY2IC0yMzlxMCAtNSA3IC0xMHE1IC00IDExIC00aDIzMHE5IDAgMjAgLTNxMTQgLTQgMjMgLTE0eiIgLz4KPGdseXBoIHVuaWNvZGU9IlQiIGhvcml6LWFkdi14PSI4OTkiIGQ9Ik04MTcgMTg1bDYzIC02NGwtMTYyIC05MWwtOTIgLTE2M2wtNjMgNjRsMTQgMTQ4bC0xNjkgMTY5bC0yMjQgLTM3MWwtNjMgNjNsMTIwIDQ3NWwtMTc2IDE3NXEtMTkgMjAgLTE5IDQ2LjV0MTkgNDUuNXQ0NiAxOXQ0NiAtMTlsMTc2IC0xNzVsNDc1IDEyMGw2MyAtNjNsLTM3MSAtMjI1bDE2OCAtMTY4eiIgLz4KPGdseXBoIHVuaWNvZGU9IlUiIGhvcml6LWFkdi14PSI4OTQiIGQ9Ik03NjAgMTU0cTQ2IC0yMCA3Mi41IC00NC41dDI5LjUgLTM4LjVsMyAtMTR2LTg2aC04MzZ2ODZxMCAyIDAuNSA2dDYgMTV0MTUuNSAyMnQzMS41IDI2dDUwLjUgMjhxMTIgNSA1NCAyOXQ4NyA0M3Q5NCAyOHEtMzMgMzQgLTcyIDEzNHEtMTEgMjggLTExIDEwMHEwIDcgLTEgMzF0LTAuNSA0MS41dDMuNSAyOS41cTMxIDExMSAxNTkgMTExcTEyNyAwIDE1OCAtMTExcTQgLTEyIDQuNSAtMjkuNXQtMSAtNDF0LTEuNSAtMzEuNSBxMCAtNzIgLTEwIC0xMDBxLTM4IC05NiAtNzIgLTEzNHE1MCAtOCA5NC41IC0yN3Q4NyAtNDMuNXQ1NC41IC0yOS41eiIgLz4KPGdseXBoIHVuaWNvZGU9IlYiIGhvcml6LWFkdi14PSI5NDkiIGQ9Ik02NTkgNDE2bDIzNSAxMTF2LTQ0OWwtMjM1IDExMXYxdi0xMDNxMCAtMTkgLTEzIC0zMnQtMzIgLTEzaC01MTBxLTE5IDAgLTMyIDEzdC0xMyAzMnY0MzNxMCAxOSAxMyAzMnQzMiAxM2g1MTBxMTkgMCAzMiAtMTN0MTMgLTMydi0xMDR6IiAvPgo8Z2x5cGggdW5pY29kZT0iVyIgaG9yaXotYWR2LXg9Ijk1NCIgZD0iTTcwNCA1NHYxODFsOTIgOTN2LTI3NHEwIC01MSAtMzYgLTg3dC04NyAtMzZoLTQ5MnEtNTEgMCAtODcgMzZ0LTM2IDg3djQ5M3EwIDUxIDM2IDg3dDg3IDM2aDQ5MnExNyAwIDI0IC0ybC04OSAtOTBoLTQyN3EtMTMgMCAtMjIgLTl0LTkgLTIydi00OTNxMCAtMTMgOSAtMjJ0MjIgLTloNDkycTEzIDAgMjIgOXQ5IDIyek00MzEgMzE0bDM1NCAzNTRsMTMyIC0xMzJsLTM1NCAtMzU0djBsLTE5NSAtNjNsNjMgMTk1djB6TTU0NyAyMDggbC04OSA4OWwtNDMgLTEzMXoiIC8+CjxnbHlwaCB1bmljb2RlPSJYIiBob3Jpei1hZHYteD0iOTIxIiBkPSJNODY4IDU0MnYtNDIzaC02NnEtMTMgMjkgLTQwIDQ2LjV0LTYwIDE3LjV0LTU5LjUgLTE3LjV0LTQwLjUgLTQ2LjVoLTIyMHY0MjNoNDg2ek0yNDAgMTgzcS0zMyAwIC02MCAtMTcuNXQtNDAgLTQ2LjVoLTEwN3YxODBsMTExIDEyM2gxODR2LTI4NHEtMzMgNDUgLTg4IDQ1ek0xMDEgMjg4di01OGgxNjF2MTMyaC05OXpNMjQwIDE0NnEzMCAwIDUxLjUgLTIxdDIxLjUgLTUycTAgLTMwIC0yMS41IC01MS41dC01MS41IC0yMS41IHEtMzEgMCAtNTIgMjEuNXQtMjEgNTEuNXEwIDMxIDIxIDUydDUyIDIxek03MDIgMTQ2cTMxIDAgNTIgLTIxdDIxIC01MnEwIC0zMCAtMjEgLTUxLjV0LTUyIC0yMS41cS0zMCAwIC01MS41IDIxLjV0LTIxLjUgNTEuNXEwIDMxIDIxLjUgNTJ0NTEuNSAyMXoiIC8+CjxnbHlwaCB1bmljb2RlPSJZIiBob3Jpei1hZHYteD0iODYxIiBkPSJNNDI1IDQ4OGwtMTQ1IC00MDlsLTEyNiAxOTNsLTgxIC03NmwtMjIgLTIwbC00NiAzOWwxNjIgMTUxbDk2IC0xNDdsMTcxIDQ4M2wxNTcgLTYwNWwxMzEgNDEzbDExNiAtMzcxbC02MSAtMTZsLTU1IDE3OGwtMTM3IC00MzF6IiAvPgo8Z2x5cGggdW5pY29kZT0iWiIgaG9yaXotYWR2LXg9Ijg5NyIgZD0iTTQwMiA2MDd2LTM2OWgzNzFxMCAtMTUzIC0xMDggLTI2MXQtMjYxIC0xMDh0LTI2MSAxMDh0LTEwOCAyNjFxMCAxNTIgMTA3LjUgMjYwdDI1OS41IDEwOXpNNDk2IDcwMHExNTMgMCAyNjEuNSAtMTA4LjV0MTA4LjUgLTI2MS41aC0zNzF2MzcwaDF6IiAvPgo8Z2x5cGggdW5pY29kZT0iWyIgaG9yaXotYWR2LXg9Ijg2MSIgZD0iTTQ0NSA2NzF2LTI3OGg0MDl2LTE4NWgtNDA5di0yNzdsLTQyNyAzNzB6IiAvPgo8Z2x5cGggdW5pY29kZT0iXCIgaG9yaXotYWR2LXg9Ijg1NCIgZD0iTTcxMCA1NzloODd2LTczOWgtNzQwdjczOWg4OXY0NnEwIDM1IDIwIDU0dDU2IDE5dDU2LjUgLTE5LjV0MjAuNSAtNTMuNXYtNDZoNTJ2NDZxMCAzNCAyMC41IDUzLjV0NTYuNSAxOS41dDU2IC0xOXQyMCAtNTR2LTQ2aDUydjQ2cTAgMzQgMjAuNSA1My41dDU2LjUgMTkuNXQ1Ni41IC0xOS41dDIwLjUgLTUzLjV2LTQ2ek01OTggNjI1di0xMjNxMCAtMzIgMzUgLTMycTE5IDAgMjcuNSA3LjV0OC41IDI0LjV2MTIzcTAgMTcgLTguNSAyNC41IHQtMjcuNSA3LjVxLTM1IDAgLTM1IC0zMnpNMzkyIDYyNXYtMTIzcTAgLTE3IDguNSAtMjQuNXQyNy41IC03LjVxMzUgMCAzNSAzMnYxMjNxMCAzMiAtMzUgMzJxLTE5IDAgLTI3LjUgLTcuNXQtOC41IC0yNC41ek0xODcgNjI1di0xMjNxMCAtMzIgMzUgLTMycTE5IDAgMjcuNSA3LjV0OC41IDI0LjV2MTIzcTAgMTcgLTguNSAyNC41dC0yNy41IDcuNXEtMzUgMCAtMzUgLTMyek03MzUgLTk5djUxNGgtNjE2di01MTRoNjE2ek00MjkgOTkgcTAgLTQ1IC0zNSAtNzB0LTkwIC0yNXEtMzYgMCAtNzMgMTRsNyA1MnEzNSAtMTQgNzMgLTE0cTI0IDAgMzggMTF0MTQgMjhxMCAyMiAtMTYuNSAzMi41dC01OS41IDEyLjV2NTJxNjMgNSA2MyAzOHEwIDI4IC00MiAyOHEtMjkgMCAtNjEgLTE1bC03IDUycTM0IDE1IDg0IDE1cTQ1IDAgNzEgLTE4dDI2IC00NnEwIC01MCAtNjUgLTcydi0xcTczIC0yMCA3MyAtNzR6TTUzNyAyMjlsLTUyIC0yMGwtNyA1Mmw5MSA0NGgzMXYtMjk2aC02M3YyMjB6ICIgLz4KPGdseXBoIHVuaWNvZGU9Il0iIGhvcml6LWFkdi14PSI4NjEiIGQ9Ik00MTUgLTY5djI3N2gtNDA4djE4NWg0MDh2Mjc4bDQyOCAtMzcweiIgLz4KPGdseXBoIHVuaWNvZGU9Il4iIGhvcml6LWFkdi14PSI3NzUiIGQ9Ik03NDkgNTcycTIyIC00NiAtMyAtMTMycS0yNCAtODUgLTUgLTIzNHEtOCAtMiAtMjEgLTR0LTQ5IC04dC02NiAtOHQtNjEgLTJ0LTQ2LjUgOXQtMTAuNSAyNnExNSA0OCAtNDggNDZxLTYxIC0yIC0xODIgLTQ4cS0zNyAtMTQgLTYzIC0zdjM5OXEyMiA2IDU4IDE1dDExMiAyNXQxMjYuNSAxNC41dDUwLjUgLTI0LjVxMCAtMyAtMiAtMTQuNXQtMy41IC0yM3QtMS41IC0yM3Q1IC0xOHQxNiAtNS41cTMwIDQgNzguNSA3dDgyLjUgNHogTTE0NSA2NTh2LTgxN2gtODV2ODE3cTAgMTcgMTIuNSAyOS41dDMwLjUgMTIuNXExNyAwIDI5LjUgLTEyLjV0MTIuNSAtMjkuNXoiIC8+CjxnbHlwaCB1bmljb2RlPSJfIiBob3Jpei1hZHYteD0iODIwIiBkPSJNNTkgMTk4djE5OWg3MDJ2LTE5OWgtNzAyeiIgLz4KPGdseXBoIHVuaWNvZGU9ImAiIGhvcml6LWFkdi14PSI5MzYiIGQ9Ik0zMDYgMzc4bC0xNTIgMTUzbC05NSAtOTZ2Mjc3aDI3N2wtOTUgLTk1bDE1MiAtMTUyek03ODMgNzVsOTUgOTV2LTI3NmgtMjc3bDk1IDk1bC0xNTIgMTUxbDg3IDg3ek02MzEgMzc4bC04NyA4N2wxNTIgMTUybC05NSA5NWgyNzZ2LTI3N2wtOTQgOTV6TTMwNiAyMjdsODcgLTg3bC0xNTIgLTE1Mmw5NSAtOTVsLTI3NyAxdjI3N2w5NSAtOTZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iYSIgaG9yaXotYWR2LXg9IjgxMCIgZD0iTTc0NSAxNDRxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV0LTE0LjUgLTM2dC0zNS41IC0xNXEtMiAwIC02IDAuNXQtNiAwLjVxLTQyIC0zNiAtNzkgLTU5cS04MyAtNTUgLTE1NyAtNzZxLTcxIC00NCAtOTAgLTQ0cS0xNCAwIC05NSA0NXEtNzYgMjIgLTE1NiA3NXEtNDAgMjcgLTc5IDU5cS0yIDAgLTUuNSAtMC41dC01LjUgLTAuNXEtMjEgMCAtMzYgMTV0LTE1IDM2dDE1IDM1LjV0MzYgMTQuNXQzNS41IC0xNC41dDE0LjUgLTM1LjV2LTggcTkgLTggMzQgLTIydDM4IC0yM3E0NyAtMzEgMTQ0IC0zM2wzMiAxNTFxNCA5OCA3IDE5MmgtMTM2bC01MiAxMnEtMTQgLTE3IC0zMyAtMTdxLTE3IDAgLTI5IDExLjV0LTEyIDI4LjV0MTIgMjguNXQyOSAxMS41cTIyIDAgMzMgLTE4aDE5MHEyIDcyIDMgOTZxLTMyIDEwIC01MiAzNi41dC0yMCA2MC41cTAgNDIgMjkuNSA3MS41dDcwLjUgMjkuNXE0MiAwIDcxLjUgLTI5LjV0MjkuNSAtNzEuNXEwIC0zMyAtMjAgLTU5LjV0LTUxIC0zNi41IHEwIC03IDEuNSAtNDAuNWwyLjUgLTU2LjVoMTg5cTExIDE4IDMzIDE4cTE3IDAgMjkgLTExLjV0MTIgLTI4LjV0LTEyIC0yOC41dC0yOSAtMTEuNXEtMjEgMCAtMzIgMTdsLTUzIC0xMmgtMTM1bDYgLTE5MmwzMyAtMTU0cTc5IC00IDEyMCAyMXE1MCAzMCA5NiA2MnEtMSAyIC0xIDZxMCAyMSAxNSAzNS41dDM2IDE0LjV6TTM1MSA2MDFxMCAtMjIgMTUuNSAtMzcuNXQzNy41IC0xNS41cTIzIDAgMzguNSAxNS41dDE1LjUgMzcuNXQtMTYgMzcuNSB0LTM4IDE1LjV0LTM3LjUgLTE1LjV0LTE1LjUgLTM3LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iYiIgaG9yaXotYWR2LXg9IjkxOSIgZD0iTTQ2MSA2OTlsNDA4IC0xMTN2LTU5MWwtNDA4IC0xMTRsLTQxMCAxMTR2NTkxek00MjYgLTM4djQzOWwtMzA2IDg2di00NDF6TTQ2MCA0NjJsMzAwIDg0bC0yOTkgODJsLTMwMCAtODJ6TTgwMSA0NnY0NDBsLTMwNyAtODV2LTQ0MHoiIC8+CjxnbHlwaCB1bmljb2RlPSJjIiBob3Jpei1hZHYteD0iOTA4IiBkPSJNNzY3IDMxOHE0NiAtMTkgNzMuNSAtNjB0MjcuNSAtOTJxMCAtNjggLTQ4IC0xMTZ0LTExNiAtNDhoLTloLTE5OHYxNjJoMzBoNzZxMTIgMCAxNSA2LjV0LTQgMTYuNWwtMTQ1IDE3M3EtOCAxMCAtMTkuNSAxMHQtMTkuNSAtMTBsLTE0NSAtMTczcS04IC0xMCAtNSAtMTYuNXQxNiAtNi41aDc2aDMwdi0xNjJoLTE5OGgtMWgtMWgtMnYxcS02OCAxIC0xMTYuNSA1MHQtNDguNSAxMTdxMCA0NiAyMiA4NHQ2MCA2MXEtNSAxOCAtNSAzNCBxMCA0NyAzMy41IDgwLjV0ODEuNSAzMy41cTM5IDAgNjkgLTI0cTMxIDY0IDkxIDEwM3QxMzMgMzlxMTAzIDAgMTc1LjUgLTcyLjV0NzIuNSAtMTc1LjVxMCAtMTAgLTEgLTE1eiIgLz4KPGdseXBoIHVuaWNvZGU9ImQiIGhvcml6LWFkdi14PSI5MTgiIGQ9Ik00NTkgNjk5cTE3NCAwIDI5Ni41IC0xMjN0MTIyLjUgLTI5NnEwIC0xNzQgLTEyMi41IC0yOTYuNXQtMjk2LjUgLTEyMi41cS0xNzMgMCAtMjk2IDEyMi41dC0xMjMgMjk2LjVxMCAxNzMgMTIzIDI5NnQyOTYgMTIzek03NzQgMjgwcTAgMTMwIC05Mi41IDIyMnQtMjIyLjUgOTJxLTEwMCAwIC0xODIgLTU4bDQzOCAtNDM4cTU5IDgxIDU5IDE4MnpNMTQ1IDI4MHEwIC0xMzAgOTIgLTIyMnQyMjIgLTkycTEwMyAwIDE4MyA1OGwtNDM4IDQzOSBxLTU5IC04MyAtNTkgLTE4M3oiIC8+CjxnbHlwaCB1bmljb2RlPSJlIiBob3Jpei1hZHYteD0iNTU2IiBkPSJNNTUwIDY5OWwtMTkzIC0zNDJoMTU4bC01MTAgLTQ3NmwyMzkgMzg2aC0xNjB6IiAvPgo8Z2x5cGggdW5pY29kZT0iZiIgaG9yaXotYWR2LXg9IjkxMiIgZD0iTTU2IDQxNXExNDkgMCAyNzUgLTczLjV0MjAwIC0xOTkuNXQ3NSAtMjc1aC0xNjBxLTIgMTYxIC0xMTUgMjc0cS0xMTQgMTE0IC0yNzUgMTE0djE2MHpNNTYgNzAwcTE2OSAwIDMyMi41IC02NnQyNjUuNSAtMTc3LjV0MTc4IC0yNjZ0NjcgLTMyMy41aC0xNjBxLTEgMTgzIC05MS41IDMzNy41dC0yNDUgMjQ0LjV0LTMzNi41IDkwdjE2MXpNMTY3IDkwcTQ2IDAgNzguNSAtMzIuNXQzMi41IC03OC41dC0zMi41IC03OC41dC03OC41IC0zMi41IHQtNzguNSAzMi41dC0zMi41IDc4LjV0MzIuNSA3OC41dDc4LjUgMzIuNXoiIC8+CjxnbHlwaCB1bmljb2RlPSJnIiBob3Jpei1hZHYteD0iODk0IiBkPSJNODY1IDM2di0zNWgtMTUxdjQ3djFxLTQgNDMgLTU1IDczcS0xMCAxNiAtMjIgNDdxLTUgMTEgLTUgNDBxMCAzNyAxIDQxcTEzIDQ0IDY0IDQ0dDY0IC00NHYtNDFxMCAtMzAgLTQgLTQwcS0xNSAtMzkgLTI5IC01NHEyMCAtNCAzOCAtMTEuNXQzNS41IC0xN3QyMS41IC0xMS41cTE5IC04IDI5LjUgLTE4dDExLjUgLTE1ek0xODAgNDl2LTF2LTQ3aC0xNTF2MzVxMCAyIDEgNnQxMS41IDE0dDI5LjUgMThxNSAyIDIxLjUgMTJ0MzQuNSAxNy41IHQzOCAxMS41cS0xNCAxNSAtMjkgNTRxLTQgMTAgLTQgNDBxMCAzNyAxIDQxcTExIDQ0IDYzIDQ0cTUxIDAgNjQgLTQ0cTEgLTQgMSAtNDFxMCAtMzAgLTQgLTQwcS0xNSAtMzYgLTI0IC00OHEtNTMgLTMyIC01MyAtNzJ6TTYyMCAxMDJxMjUgLTExIDM5LjUgLTI0LjV0MTYuNSAtMjEuNWwyIC04di00N2gtNDYydjQ3cTAgMyAxLjUgOC41dDE2IDE5LjV0NDAuNSAyNnE2IDMgMjkgMTZ0NDggMjMuNXQ1MiAxNS41cS0xOCAyMSAtMzkgNzQgcS02IDEzIC02IDU2cTAgNTMgMSA1NnExNyA2MSA4NyA2MXQ4OCAtNjFxMSAtMyAxIC01NnEwIC00MSAtNiAtNTZxLTIxIC01NCAtNDAgLTc0cTI4IC01IDUyLjUgLTE1dDQ5IC0yNHQyOS41IC0xNnoiIC8+CjxnbHlwaCB1bmljb2RlPSJoIiBob3Jpei1hZHYteD0iOTA2IiBkPSJNODQ4IDQyNXEyNSAtNjggMjUgLTE0NHQtMjUgLTE0NHEtMTAgLTI4IC00MCAtMjhxLTYgMCAtMTAgMWwtNyAycS01NSAtMTExIC0xNjkgLTE2OWwyIC03cTQgLTE2IC0zLjUgLTMwdC0yMi41IC0yMHEtNzIgLTI1IC0xNDQgLTI1cS03MyAwIC0xNDUgMjVxLTE1IDYgLTIyLjUgMjB0LTMuNSAzMGwyIDdxLTExMiA1NSAtMTcwIDE2OWwtNyAtMnEtMyAtMSAtMTAgLTFxLTI5IDAgLTM5IDI4cS0yNiA3MCAtMjYgMTQ0dDI2IDE0NCBxMTAgMjggMzkgMjhxMyAwIDExIC0ybDYgLTFxNTggMTE1IDE3MCAxNjlsLTIgN3EtNCAxNiAzLjUgMzB0MjIuNSAyMHE3MiAyNSAxNDQgMjVxNzUgMCAxNDUgLTI2cTE1IC01IDIyLjUgLTE5dDMuNSAtMzBsLTIgLTdxMTEzIC01NiAxNzAgLTE2OWw2IDFxOCAyIDExIDJxMjkgMCAzOSAtMjh6TTgwOCAxNTFxMjMgNjMgMjMgMTMwcTAgNjYgLTIyIDEzMGwtMTY2IC00MXEyMCAtNDIgMjAgLTg5dC0yMCAtODl6TTU4MyAtNzRsLTQwIDE2NSBxLTQyIC0yMCAtODkgLTIwdC05MCAyMGwtNDAgLTE2NXE2MSAtMjMgMTMwIC0yM3E2OCAwIDEyOSAyM3pNNTYxIDEyOXExMiAtNyAxNyAtMTZxMjQgMTcgNDQgNDNxLTExIDYgLTE3IDE4cS04IDE3IDAgMzZxMTYgMzIgMTYgNzFxMCAzOCAtMTYgNzFxLTggMTggMCAzNnE3IDEyIDE3IDE4cS0xOSAyNSAtNDQgNDNxLTcgLTEyIC0xNyAtMTZxLTggLTQgLTE4IC00cS0xMSAwIC0xOCA0cS0zMyAxNiAtNzIgMTZxLTM4IDAgLTcxIC0xNiBxLTcgLTQgLTE4IC00cS0xMCAwIC0xOCA0cS0xMiA3IC0xNyAxNnEtMjUgLTE4IC00NCAtNDNxMTEgLTYgMTcgLTE4cTggLTE4IDAgLTM2cS0xNyAtMzYgLTE3IC03MXEwIC0zNiAxNiAtNzFxOSAtMTkgMCAtMzZxLTQgLTExIC0xNiAtMThxMTYgLTIyIDQ0IC00NHE1IDEwIDE3IDE3cTggNCAxOCA0cTExIDAgMTggLTRxMzMgLTE2IDcyIC0xNnEzOCAwIDcxIDE2cTcgNCAxOCA0cTEwIDAgMTggLTR6TTc1IDI4MXEwIC02NCAyMyAtMTMwbDE2NSA0MSBxLTIwIDQ1IC0yMCA4OXEwIDQ1IDIxIDg5bC0xNjYgNDFxLTIzIC02NyAtMjMgLTEzMHpNNDUzIDY1OXEtNjggMCAtMTI5IC0yM2w0MCAtMTY1cTQzIDIwIDg5IDIwcTQ3IDAgOTAgLTIwbDQwIDE2NXEtNjEgMjMgLTEzMCAyM3oiIC8+CjxnbHlwaCB1bmljb2RlPSJpIiBkPSJNNDYwIDY5OXExNzQgMCAyOTcgLTEyM3QxMjMgLTI5N3QtMTIzIC0yOTd0LTI5NyAtMTIzcS0xNzMgMCAtMjk2LjUgMTIzdC0xMjMuNSAyOTd0MTIzLjUgMjk3dDI5Ni41IDEyM3pNNTE0IDU2OXEtMzEgLTEgLTQ5IC0yMnQtMTggLTQ1cTAgLTI1IDEzLjUgLTQwLjV0MzYuNSAtMTUuNWgxcTI5IDAgNDguNSAyMC41dDE5LjUgNDguNXEwIDIzIC0xMyAzN3EtMTUgMTcgLTM5IDE3ek01NjUgOThsMyAzbC0yIDRsLTE4IDM4bC01IC00IHEtMTQgLTE0IC0zNC41IC0yOHQtMjQuNSAtMTV2NXEwIDcgMyAyMGw0NiAxODhxNiAyNSA2IDU3cTAgMTggLTYgMzBxLTcgMTIgLTIyIDEycS0yNSAwIC03MS41IC0yOC41dC05MS41IC03MC41bC0zIC0zbDE2IC00NWw2IDRxMzUgMzEgNTUgMzlxMCAtNiAtMyAtMjFsLTQzIC0xODJxLTYgLTMwIC02IC02MHEwIC0yNSAxMCAtMzZxOSAtMTAgMjYgLTEwcTIzIDAgNzAuNSAyOXQ4OC41IDc0eiIgLz4KPGdseXBoIHVuaWNvZGU9ImoiIGhvcml6LWFkdi14PSI4NzciIGQ9Ik04MzUgMjMydi0xbDEgLTF2LTFxMTkgLTM1IDE5IC03OXEwIC0xOCAtNSAtNDNxLTEyIC00NiAtNDUgLTgwbC02NCAtNjNxLTUxIC01MSAtMTIzIC01MXQtMTIyIDUxbC03NyA3NmwtNDcgNDhsLTMzIDMzcS0zNyAzNyAtNDggOTFxLTIgMjAgLTIgMzFxMCAxNyAzIDM1bDMgMTJxNCAxNSAxNCAzNHYxcTEgMSAyLjUgNGwyLjUgNWwxIDJsMSAxcTEgMSAyLjUgMy41dDIuNSAzLjV2MWwyIDJxMSAxIDMgMy41dDMgMy41djFsMiAybDQgNHQ0IDUgbDI4IDI4bDQgLTVsNTcgLTU2cTAgLTEgMiAtM3QyIC0zdDEgLTMuNXQxIC0zLjVsLTI1IC0yNXEtMSAtMSAtMyAtMy41dC00IC00LjVxMCAtMSAtMSAtMnYtMXEtMiAtMiAtNCAtNnEtMSAwIC0xIC0xdC0xIC0ydC0xLjUgLTMuNXQtMC41IC0zLjVsLTEgLTF2LTJxLTQgLTkgLTQgLTIycTAgLTE1IDcgLTMycTQgLTggMTQgLTIwbDU3IC01N2w0MCAtMzlsNjAgLTYxcTIxIC0yMSA1MiAtMjFxMzIgMCA1MiAyMWw2NCA2NHExMiAxMiAxOCAyOSBxMyAxMSAzIDIzcTAgMTAgLTMgMjFxLTUgMTkgLTE4IDMxbC05OCA5OHExIDYgMSAxN3EwIDIxIC0zIDQwcS0xMiA2OCAtNTkgMTE2cTM5IC0xMiA3MSAtNDJsMiAtMmwxNTcgLTE1N3ExOCAtMTggMjkgLTM5cTAgLTEgMSAtMXpNNTM4IDQ0MXEzOSAtMzkgNDggLTkxcTMgLTE1IDMgLTMxcTAgLTExIC00IC0zNWwtMyAtMTJxLTMgLTEyIC0xMyAtMzRsLTEgLTFxLTEgLTEgLTIuNSAtNGwtMi41IC01bC0xIC0ybC0xIC0xcS0yIC00IC01IC03IGwtMSAtMXEtMSAtMSAtMSAtMnEtMyAtMyAtNSAtN2wtMSAtMWwtMiAtMnEtMiAtMyAtOCAtOWwtMjggLTI4bC00IDVsLTU3IDU2cS0xIDEgLTIgM3QtMiAzdC0xIDMuNXQtMSAzLjVsMjUgMjVxMSAxIDMgMy41dDQgNC41cTAgMSAwLjUgMXQwLjUgMXYxcTIgMiA0IDZsMSAxcTEgMSAxIDJxMiA0IDMgN3YxcTAgMSAxIDJxMyAxMSAzIDIycTAgMTUgLTcgMzJxLTQgOCAtMTQgMjBsLTU3IDU3bC0zOSAzOWwtNjEgNjFxLTIxIDIxIC01MiAyMSB0LTUyIC0yMWwtNjQgLTY0cS0xMiAtMTIgLTE4IC0yOXEtMyAtMTEgLTMgLTIzcTAgLTEwIDMgLTIxcTUgLTE5IDE4IC0zMWw5OCAtOThxLTEgLTYgLTEgLTE3cTAgLTIzIDQgLTQwcTEwIC02NSA1OCAtMTE2cS00MCAxMiAtNzEgNDJsLTIgMmwtMTU3IDE1N3EtMTggMTggLTI5IDM5cTAgMSAtMSAxdjFsLTEgMXYxcS0xOSAzOCAtMTkgNzlxMCAxOCA1IDQzcTEyIDQ2IDQ1IDgwbDY0IDYzcTUxIDUxIDEyMyA1MXQxMjIgLTUxbDc3IC03NiBsNDcgLTQ4eiIgLz4KPGdseXBoIHVuaWNvZGU9ImsiIGhvcml6LWFkdi14PSI4OTYiIGQ9Ik02NTcgNjEwcTg5IDAgMTQ4LjUgLTUwLjV0NTkuNSAtMTU5LjVxMCAtNDkgLTI2IC0xMDF0LTUyIC03OWwtMjYgLTI4bC0zMTMgLTMxMmwtMzEzIDMxMmwtMTEgMTF0LTI1IDMwdC0zMiA0NnQtMjUgNTYuNXQtMTEgNjQuNXEwIDEwOSA1OSAxNTkuNXQxNDggNTAuNXE5MCAwIDE5MSAtMTA3bDE5IC0yMXE0IDUgMTEuNSAxMy41dDMxIDMxdDQ3IDM5dDU2LjUgMzAuNXQ2MyAxNHoiIC8+CjxnbHlwaCB1bmljb2RlPSJsIiBob3Jpei1hZHYteD0iOTQyIiBkPSJNMjc5IDcwMGg2MDV2LTEzM2gtNjA1djEzM3pNMjc5IDI4NHYxMzNoNjA1di0xMzNoLTYwNXpNMjc5IDB2MTMzaDYwNXYtMTMzaC02MDV6TTEyMiA3MDBxMjggMCA0Ny41IC0xOS41dDE5LjUgLTQ2LjVxMCAtMjggLTE5LjUgLTQ3LjV0LTQ3LjUgLTE5LjVxLTI3IDAgLTQ2LjUgMTkuNXQtMTkuNSA0Ny41cTAgMjcgMTkuNSA0Ni41dDQ2LjUgMTkuNXpNMTIyIDQxOHEyOCAwIDQ3LjUgLTE5LjV0MTkuNSAtNDcuNXEwIC0yNyAtMTkuNSAtNDYuNSB0LTQ3LjUgLTE5LjVxLTI3IDAgLTQ2LjUgMTkuNXQtMTkuNSA0Ni41cTAgMjggMTkuNSA0Ny41dDQ2LjUgMTkuNXpNMTIyIDEzNHEyOCAwIDQ3LjUgLTE5LjV0MTkuNSAtNDYuNXEwIC0yOCAtMTkuNSAtNDcuNXQtNDcuNSAtMTkuNXEtMjcgMCAtNDYuNSAxOS41dC0xOS41IDQ3LjVxMCAyNyAxOS41IDQ2LjV0NDYuNSAxOS41eiIgLz4KPGdseXBoIHVuaWNvZGU9Im0iIGhvcml6LWFkdi14PSI4MDgiIGQ9Ik03NzEgNjk4di04M3YtNTE0cS0xIC01MiAtNDYuNSAtODh0LTExMC41IC0zNnQtMTExIDM3dC00NiA4OXQ0NiA4OXQxMTEgMzdxMzYgMCA3MCAtMTN2MzA4bC0zNTIgLTg0di00OTVxLTEgLTUyIC00NyAtODguNXQtMTEwIC0zNi41cS02NSAwIC0xMTEgMzd0LTQ2IDkwcTAgNTIgNDYgODl0MTExIDM3cTM1IDAgNjkgLTEzdjUxM2gybDQzOCAxMDR6IiAvPgo8Z2x5cGggdW5pY29kZT0ibiIgaG9yaXotYWR2LXg9Ijk1NiIgZD0iTTc1OSA3MDBxNTggMCA5OSAtNDF0NDEgLTk5di01NjFxMCAtNTggLTQxIC05OXQtOTkgLTQxaC01NjFxLTU4IDAgLTk5IDQxdC00MSA5OXY1NjFxMCA1OCA0MSA5OXQ5OSA0MWg1NjF6TTc5NCA0OTBoLTUxM3YtMTE3aDUxM3YxMTd6TTI1OSAyMTdoLTk2di0xMTRoOTZ2MTE0ek0xNjMgMjM4aDk2djExNGgtOTZ2LTExNHpNMjgxIDIxN3YtMTE0aDUxM3YxMTRoLTUxM3pNMjgxIDIzOGg1MTN2MTE0aC01MTN2LTExNHpNMjU5IDQ5MGgtOTYgdi0xMTdoOTZ2MTE3ek0xNjMgLTFxMCAtMTQgMTAuNSAtMjQuNXQyNC41IC0xMC41aDYxdjExN2gtOTZ2LTgyek03NTkgLTM2cTE0IDAgMjQuNSAxMC41dDEwLjUgMjQuNXY4MmgtNTEzdi0xMTdoNDc4eiIgLz4KPGdseXBoIHVuaWNvZGU9Im8iIGhvcml6LWFkdi14PSI5NDEiIGQ9Ik04NjcgNTQ1cTExIDAgMTggLTcuNXQ3IC0xNy41di01MjVxMCAtMTEgLTcgLTE4dC0xOCAtN2gtNzg0cS0xMSAwIC0xOCA3dC03IDE4djUyNXEwIDEwIDcgMTcuNXQxOCA3LjVoMzhsMjkgNTlxMTEgMjIgMzYgMjJoMTU4cTI1IDAgMzYgLTIybDI4IC01OWg0NTl6IiAvPgo8Z2x5cGggdW5pY29kZT0icCIgaG9yaXotYWR2LXg9Ijg1NSIgZD0iTTU0MiA1NDlsMTUzIC0xNTNsLTQ2MCAtNDYwdjB2MGwtMjI2IC03NGw3MyAyMjd2MHYwek0xODggNjVsMzc5IDM3OWwtMjUgMjZsLTM4MCAtMzgwek02OTQgNzAxbDE1NCAtMTUzbC0xMDEgLTEwMGwtMTUzIDE1M3oiIC8+CjxnbHlwaCB1bmljb2RlPSJxIiBob3Jpei1hZHYteD0iOTEwIiBkPSJNODY1IDE2MHEwIC00MiAtMjYgLTc1dC02NiAtNDRxMTUgLTQzIDY2IC04MnExMiAtOCAtOSAtMTRxLTQ1IC0xMSAtMTE0IDIxcS01MiAyNSAtOTcgNzFoLTI5OXEtNDIgMCAtNzcgMjdxMzAgMTggNTYgNDNoMjc2cTc0IDAgMTI2LjUgNTIuNXQ1Mi41IDEyNi41djIzNXE0NyAtNSA3OSAtNDB0MzIgLTgzdi0yMzh6TTY5OCAyODZxMCAtNTIgLTM2IC04OHQtODcgLTM2aC0yOThxLTQ5IC01MCAtMTAwIC03MnQtOTAgLTIycS0zNCAwIC0zNCAxMSBxMCAzIDMgNXE1MCAzOCA2NiA4MnEtNDAgMTEgLTY2IDQ0dC0yNiA3NnYyMzdxMCA1MSAzNiA4Ny41dDg4IDM2LjVoNDIxcTUxIDAgODcgLTM2LjV0MzYgLTg3LjV2LTIzN3oiIC8+CjxnbHlwaCB1bmljb2RlPSJyIiBob3Jpei1hZHYteD0iOTAwIiBkPSJNNzI2IDI3OGwyNCAyNGw5MSA5MXYtMjYwcTAgLTEyOCAtMTI4IC0xMjhoLTUwOXYtMTA4bC0xNzEgMTcybDE3MSAxNzJ2LTExNXYtNmg0ODRxMTYgMCAyNyAxMXQxMSAyN3YxMjB6TTE3NCAzMTlsLTI0IC0yNGwtOTEgLTkxdjI2MHEwIDEyNyAxMjggMTI3aDUwOXYxMDhsMTcxIC0xNzFsLTE3MSAtMTcydjExNXY2aC00ODRxLTE2IDAgLTI3IC0xMS41dC0xMSAtMjcuNXYtMTE5eiIgLz4KPGdseXBoIHVuaWNvZGU9InMiIGhvcml6LWFkdi14PSI4NjQiIGQ9Ik04MTYgNHEyMyAtMjMgMjMgLTU0cTAgLTI5IC0yMCAtNDhxLTE5IC0xOSAtNDcgLTE5cS0zMiAwIC01NSAyM2wtMjE5IDIxOXEtNzQgLTQ4IC0xNjYgLTQ4cS0xMjkgMCAtMjIwLjUgOTEuNXQtOTEuNSAyMjAuNXQ5MS41IDIyMC41dDIyMC41IDkxLjV0MjIwLjUgLTkxLjV0OTEuNSAtMjIwLjVxMCAtOTAgLTQ3IC0xNjV6TTUwNiAzODlxMCA3MiAtNTEgMTIzdC0xMjMgNTF0LTEyMyAtNTF0LTUxIC0xMjN0NTEgLTEyM3QxMjMgLTUxIHQxMjMgNTF0NTEgMTIzeiIgLz4KPGdseXBoIHVuaWNvZGU9InQiIGhvcml6LWFkdi14PSI5MTkiIGQ9Ik00NjAgNjk5cTE3MyAwIDI5NiAtMTIzdDEyMyAtMjk2cTAgLTE3NCAtMTIzIC0yOTd0LTI5NiAtMTIzcS0xNzQgMCAtMjk3IDEyM3QtMTIzIDI5N3EwIDE3MyAxMjMgMjk2dDI5NyAxMjN6TTQ2MCAtMzVxMTMwIDAgMjIyIDkyLjV0OTIgMjIyLjV0LTkyIDIyMnQtMjIyIDkydC0yMjIuNSAtOTJ0LTkyLjUgLTIyMnQ5Mi41IC0yMjIuNXQyMjIuNSAtOTIuNXpNNjYzIDE4NnExNCAtMTAgNSAtMjRsLTI0IC0zOXEtNSAtNiAtMTEgLThoLTQgcS01IDAgLTEwIDNsLTE5MyAxMjlxLTEgMSAtMi41IDJ0LTIuNSAxcS01IDcgLTUgMTN2MjI4cTAgNyA1IDEycTcgNSAxMyA1aDQ2cTcgMCAxMiAtNXQ1IC0xMnYtMTkzeiIgLz4KPGdseXBoIHVuaWNvZGU9InUiIGhvcml6LWFkdi14PSI5NTUiIGQ9Ik02MCA2MzFoODM1di02NzNoLTgzNXY2NzN6TTgyNSAyOHY1MzRoLTY5NXYtNTM0aDY5NXpNMjI1IDQzMXEtMTggMCAtMzEgMTN0LTEzIDMxdDEzIDMwLjV0MzEgMTIuNXQzMC41IC0xMi41dDEyLjUgLTMwLjV0LTEyLjUgLTMxdC0zMC41IC0xM3pNNzMxIDQzMXEtMTggMCAtMzEgMTN0LTEzIDMxdDEzIDMwLjV0MzEgMTIuNXQzMC41IC0xMi41dDEyLjUgLTMwLjV0LTEyLjUgLTMxdC0zMC41IC0xM3pNMjI1IDE1OXExOCAwIDMwLjUgLTEzIHQxMi41IC0zMXQtMTIuNSAtMzAuNXQtMzAuNSAtMTIuNXQtMzEgMTIuNXQtMTMgMzAuNXQxMyAzMXQzMSAxM3pNNzMxIDE1OXExOCAwIDMwLjUgLTEzdDEyLjUgLTMxdC0xMi41IC0zMC41dC0zMC41IC0xMi41dC0zMSAxMi41dC0xMyAzMC41dDEzIDMxdDMxIDEzek01OTMgNDU3di0zMjVoLTIyOHYzMjVoMjI4ek01MzMgMTgxdjExOGgtMTA5di0xMThoMTA5eiIgLz4KPGdseXBoIHVuaWNvZGU9InYiIGhvcml6LWFkdi14PSI5NDUiIGQ9Ik04NjYgNTU3cTEwIDAgMTcuNSAtN3Q3LjUgLTE3di00NzJxMCAtMTEgLTcuNSAtMTh0LTE3LjUgLTdoLTc4NnEtMTAgMCAtMTcuNSA3dC03LjUgMTh2NDcycTAgMTAgNy41IDE3dDE3LjUgN2gxNzNxMCAxIDEgMWwyMyA0OHE0IDkgMTUgMTUuNXQyMSA2LjVoMzE5cTI1IDAgMzYgLTIybDI0IC00OHYtMWgxNzR6TTQ3MiAxMjBxNzUgMCAxMjggNTIuNXQ1MyAxMjcuNXQtNTMgMTI4dC0xMjggNTNxLTc0IDAgLTEyNyAtNTN0LTUzIC0xMjggdDUzIC0xMjcuNXQxMjcgLTUyLjV6IiAvPgo8Z2x5cGggdW5pY29kZT0idyIgaG9yaXotYWR2LXg9IjkyNyIgZD0iTTg4NSAzOTdxMTYgLTEzNyAtOTQuNSAtMjQ3dC0yODIuNSAtMTI5cS02MiAtNyAtMTIwIDBxLTkyIC05NSAtMTk3IC0xMDZxLTQ3IC01IC01NiA4cS0zIDQgMyA4cTg4IDY2IDgwIDE0NXEtNjkgMzkgLTExMiA5OHQtNTEgMTMwcS0xNiAxMzYgOTQgMjQ2LjV0MjgyIDEzMC41cTE3MiAxOSAzMDQuNSAtNjR0MTQ5LjUgLTIyMHoiIC8+CjxnbHlwaCB1bmljb2RlPSJ4IiBob3Jpei1hZHYteD0iOTQ5IiBkPSJNNTI2IDEwMHEyIDEwIDIgMTZsOTggOThsMTM5IC0xMzlsOTQgLTY5bDEwIC0zOGwtMTA0IC0xMDRsLTM3IDEwbC03MCA5NHpNNzU1IDIycS0xOCAwIC0zMC41IC0xMi41dC0xMi41IC0zMS41cTAgLTE4IDEyLjUgLTMwLjV0MzAuNSAtMTIuNXExOSAwIDMxLjUgMTIuNXQxMi41IDMwLjVxMCAxOSAtMTIuNSAzMS41dC0zMS41IDEyLjV6TTQ2OSAzNzFsLTk4IC05OHEtNiAwIC0xNiAtMmwtNzEgNzBxLTMyIC0xNSAtNTYgLTE1IHEtNzQgMCAtMTMzLjUgNjB0LTYwLjUgMTM0cTAgMSAxNyAxOHE2MyAtNjMgNzEgLTY4dDQ1IC01cTI5IDAgNjUuNSAzNnQzNi41IDY2cTAgMzYgLTYgNDUuNXQtNjcgNjkuNXExNSAxOCAxOCAxOHE3NCAxIDEzNCAtNTkuNXQ2MCAtMTM0LjVxMCAtMjcgLTE2IC01N3pNNzg2IDIwMnEwIDMgMC41IDcuNXQwLjUgMTguNXQtMS41IDI4dC01LjUgMzJ0LTEwLjUgMzMuNXQtMTkgMzAuNXQtMjguNSAyNGgtM3EtMTAgMCAtMzQgLTIybC0yMTggLTIxNyBxOCAtMjkgLTggLTQ3cS0yIC0xIC03IC02bC0yMDEgLTIwMXEtNSAtNSAtNiAtN3EtMTEgLTExIC0yOSAtMTFxLTQxIDAgLTc3IDQ4dC04IDc3cTMgMiA2IDZsMjAyIDIwMnE1IDMgNiA2cTExIDExIDI4IDExcTkgMCAxOSAtM2wxOTQgMTk0bDQgNnE0IDYgNS41IDh0NSA4LjV0NC41IDExdDEuNSAxMXQtMSAxMy41dC00LjUgMTRxLTE2IDI5IC02MCAzOGgtMXEtMTYgMCAtNTUgMzdsLTYgNnEtMTkgMTkgLTIwIDI1dDE4IDI3bDcyIDczIHExNyAxNyAyNiAxN3E2IDAgMjYgLTIwbDYgLTZxMzMgLTMzIDM3IC00OXE0IC0yMCAyNCAtNDZxMyAtNCAxOCAtNHQxOSAtNGwxMTkgLTExOXE3MyAtNzMgMzAgLTI1MmwtMTUgLTUweiIgLz4KPGdseXBoIHVuaWNvZGU9InkiIGhvcml6LWFkdi14PSI4OTciIGQ9Ik04NDMgMzU5cTkgLTEgMTUuNSAtOXQ2LjUgLTE3di05N3EwIC05IC02LjUgLTE3dC0xNS41IC05bC0xMjQgLTIzcS05IC0yIC0xMiAtOHQyIC0xNGw3MiAtMTA2cTEyIC0xOSAtNCAtMzVsLTY4IC02OHEtMTYgLTE2IC0zNCAtM2wtMTA2IDcxcS03IDUgLTE0LjUgMi41dC04LjUgLTExLjVsLTIzIC0xMjVxLTEgLTkgLTkgLTE1LjV0LTE3IC02LjVoLTk3cS05IDAgLTE3IDYuNXQtOSAxNS41bC0yMyAxMjVxLTEgOSAtOC41IDExLjUgdC0xNC41IC0yLjVsLTEwNSAtNzFxLTIwIC0xMiAtMzUgM2wtNjggNjhxLTE2IDE2IC00IDM1bDcyIDEwNnE1IDggMiAxNHQtMTIgOGwtMTI0IDIzcS05IDEgLTE1LjUgOXQtNi41IDE3djk3cTAgOSA2LjUgMTd0MTUuNSA5bDEyNCAyM3EyMiA2IDEwIDIzbC03MiAxMDZxLTExIDE5IDQgMzRsNjggNjhxMTYgMTYgMzUgNGwxMDUgLTcycTcgLTUgMTQuNSAtMnQ4LjUgMTJsMjMgMTI0cTEgOSA5IDE1LjV0MTcgNi41aDk3cTkgMCAxNyAtNi41IHQ5IC0xNS41bDIzIC0xMjRxMSAtOSA4LjUgLTEydDE0LjUgMmwxMDYgNzJxMTggMTIgMzQgLTRsNjggLTY4cTE1IC0xNSA0IC0zNGwtNzIgLTEwNnEtMTIgLTE3IDEwIC0yM3pNNDQ4IDEzNHE2MyAwIDEwNyA0NHQ0NCAxMDZ0LTQ0IDEwNi41dC0xMDcgNDQuNXEtNjIgMCAtMTA2IC00NC41dC00NCAtMTA2LjV0NDQgLTEwNnQxMDYgLTQ0eiIgLz4KPGdseXBoIHVuaWNvZGU9InoiIGhvcml6LWFkdi14PSI3MzYiIGQ9Ik00MzMgLTMzcTM0IDAgNTUgMjNsMTc2IDE3NmwzOSAtMzlxMTUgLTE1IDAgLTMxbC0yNTQgLTI1NHEtMTUgLTE2IC0zMSAwbC0zNTAgMzUwcS0xNSAxNSAtMTcgMzZsLTggOTdsMzM1IC0zMzVxMjMgLTIzIDU1IC0yM3pNMzUzIDY2NGwzNTAgLTM0OXExNiAtMTYgMCAtMzFsLTI1NCAtMjU1cS03IC02IC0xNiAtNnQtMTUgNmwtMzUwIDM1MHEtMTUgMTcgLTE3IDM3bC0xNyAxOTBxLTIgMjIgMTQgMzZsNDMgNDRxMTUgMTMgMzQgMTNoMyBsMTg5IC0xN3EyMiAtMiAzNiAtMTh6TTExNSA2MTdxLTE0IC0xMyAtMTQgLTMzdDE0IC0zM3ExMyAtMTMgMzMgLTEzdDMzIDEzdDEzIDMzdC0xMyAzM3EtMTQgMTQgLTMzIDE0dC0zMyAtMTR6IiAvPgo8Z2x5cGggdW5pY29kZT0ieyIgaG9yaXotYWR2LXg9Ijc2MiIgZD0iTTc1MSAyOTloLTI3OHYtNDA4aC0xODV2NDA4aC0yNzdsMzcwIDQyOHoiIC8+CjxnbHlwaCB1bmljb2RlPSJ8IiBob3Jpei1hZHYteD0iOTE1IiBkPSJNMTgyIDI4MHEtMyAtMTYgLTMgLTM1di02OXEtNTggMCAtOTguNSA0MC41dC00MC41IDk4LjV2MjQ0cTAgNTggNDAuNSA5OC41dDk4LjUgNDAuNWgzNDhxNTggMCA5OC41IC00MC41dDQwLjUgLTk4LjV2LTEwNWgtMTA0djEwNXEwIDE0IC0xMC41IDI0LjV0LTI0LjUgMTAuNWgtMzQ4cS0xNCAwIC0yNC41IC0xMC41dC0xMC41IC0yNC41di0yNDRxMCAtMTQgMTAuNSAtMjQuNXQyNC41IC0xMC41aDN6TTczNiAzODVxNTcgMCA5OCAtNDEgdDQxIC05OXYtMjQzcTAgLTU4IC00MSAtOTl0LTk4IC00MWgtMzQ4cS01OCAwIC05OC41IDQxdC00MC41IDk5djI0M3EwIDU4IDQwLjUgOTl0OTguNSA0MWgzNDh6TTc3MCAydjI0M3EwIDE1IC0xMCAyNXQtMjQgMTBoLTM0OHEtMTQgMCAtMjQuNSAtMTB0LTEwLjUgLTI1di0yNDNxMCAtMTUgMTAuNSAtMjV0MjQuNSAtMTBoMzQ4cTE0IDAgMjQgMTB0MTAgMjV6IiAvPgo8Z2x5cGggdW5pY29kZT0ifSIgaG9yaXotYWR2LXg9Ijc2MiIgZD0iTTExIDMwMWgyNzd2NDA5aDE4NXYtNDA5aDI3OGwtMzcwIC00Mjd6IiAvPgo8Z2x5cGggdW5pY29kZT0ifiIgZD0iTTQ2MCA2OTlxMTc0IDAgMjk3IC0xMjN0MTIzIC0yOTd0LTEyMyAtMjk3dC0yOTcgLTEyM3QtMjk3IDEyM3QtMTIzIDI5N3QxMjMgMjk3dDI5NyAxMjN6TTYyOCAzNHYyMzJoLTE2NmwxNDUgMTY3aC0xMTJ2MTM1aC03NXYtMTM1aC0xMTJsMTQ0IC0xNjdoLTE2MnYtMjMyaDE0NWwtMzkgLTM5aDEyNmwtMzkgMzloMTQ1ek0zMzMgNzZ2MTQ4aDI1M3YtMTQ4aC0yNTN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZmY7IiBob3Jpei1hZHYteD0iODMzIiAvPgo8Z2x5cGggaG9yaXotYWR2LXg9IjUwMCIgLz4KPC9mb250Pgo8L2RlZnM+PC9zdmc+IA==') format('svg')}.x-tab .x-button-icon:before,.x-button .x-button-icon:before{font-family:"Pictos"}.x-img.x-img-image{text-align:center}.x-img.x-img-image img{width:auto;height:100%}.x-img.x-img-background{background-repeat:no-repeat;background-position:center;background-size:auto 100%}.x-map{background-color:#edeae2}.x-map *{-webkit-box-sizing:content-box;box-sizing:content-box}.x-mask-map{background:transparent !important}.x-map-container{position:absolute !important;top:0;left:0;right:0;bottom:0}.x-mask{min-width:8.5em;position:absolute;top:0;left:0;bottom:0;right:0;height:100%;z-index:10;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;background:rgba(0,0,0,0.3) center center no-repeat}.x-mask.x-mask-gray{background-color:rgba(0,0,0,0.5)}.x-mask.x-mask-transparent{background-color:transparent}.x-mask .x-mask-inner{position:relative;background:rgba(0,0,0,0.25);color:#fff;text-align:center;padding:.4em;font-size:.95em;font-weight:bold}.x-mask .x-loading-spinner-outer{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:100%;min-width:8em;height:8em}.x-mask.x-indicator-hidden .x-mask-inner{padding-bottom:0 !important}.x-mask.x-indicator-hidden .x-loading-spinner-outer{display:none}.x-mask.x-indicator-hidden .x-mask-message{position:relative;bottom:.25em}.x-mask .x-mask-message{position:absolute;bottom:5px;color:#333;left:0;right:0;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.x-mask.x-has-message .x-mask-inner{padding-bottom:2em}.x-mask.x-has-message .x-loading-spinner-outer{height:168px}.x-ie .x-mask[visibility='visible'] ~ div:not(.x-mask) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-panel) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-floating) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-center) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-msgbox) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-mask) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-panel) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-floating) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-center) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-msgbox) .x-input-el{visibility:collapse}.x-video{height:100%;width:100%;background-color:#000}.x-video>*{height:100%;width:100%;position:absolute}.x-video-ghost{-webkit-background-size:100% auto;background:#000 url() center center no-repeat}audio{width:100%}.x-msgbox{min-width:15em;max-width:20em;max-height:90%;margin:6px;border:1px solid #ccc}.x-msgbox .x-docking-vertical{overflow:hidden}.x-msgbox .x-toolbar.x-docked-top{border-bottom:0}.x-msgbox .x-toolbar.x-docked-bottom{border-top:0}.x-ie .x-msgbox .x-dock.x-dock-horizontal.x-unsized>.x-dock-body{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px}.x-msgbox-text{text-align:center}.x-msgbox-buttons .x-button{min-width:4.5em}.x-progressindicator{width:50%;height:1.3em}.x-progressindicator .x-progressindicator-inner{background:#222222;padding:10px;height:100%;border-radius:20px;box-shadow:0px 5px 17px rgba(40,40,40,0.5);box-sizing:content-box;position:relative}.x-progressindicator .x-progressindicator-text{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:100%;height:100%;position:absolute;top:0px;left:0px;color:white;text-shadow:1px 1px 2px black}.x-progressindicator .x-progressindicator-bar{height:100%;width:0%;border-radius:10px}.x-progressindicator:not(.x-item-hidden) .x-progressindicator-bar .x-progressindicator-bar-fill{height:100%;width:100%;background-color:gray;border-radius:10px;-webkit-animation-name:progressIndicator;-moz-animation-name:progressIndicator;-ms-animation-name:progressIndicator;-o-animation-name:progressIndicator;animation-name:progressIndicator;-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;-moz-animation-timing-function:linear;-ms-animation-timing-function:linear;-o-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;-o-animation-iteration-count:infinite;animation-iteration-count:infinite;background-repeat:repeat-x;background-size:30px 30px;background-image:-webkit-linear-gradient(135deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-image:-moz-linear-gradient(135deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-image:-o-linear-gradient(135deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-image:-ms-linear-gradient(-45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}@-webkit-keyframes progressIndicator{to{background-position:30px}}@-moz-keyframes progressIndicator{to{background-position:30px}}@keyframes progressIndicator{to{background-position:30px}}.x-panel,.x-msgbox{position:relative}.x-panel.x-floating,.x-msgbox,.x-form.x-floating{padding:6px;background-color:#ccc}.x-panel.x-floating .x-panel-inner,.x-panel.x-floating>.x-body,.x-msgbox .x-panel-inner,.x-msgbox>.x-body,.x-form.x-floating .x-panel-inner,.x-form.x-floating>.x-body{z-index:1;background-color:#fff}.x-panel.x-floating>.x-dock,.x-msgbox>.x-dock,.x-form.x-floating>.x-dock{z-index:1}.x-panel.x-floating>.x-dock.x-sized,.x-msgbox>.x-dock.x-sized,.x-form.x-floating>.x-dock.x-sized{margin:6px}.x-sheet,.x-sheet-action{height:auto}.x-toolbar{position:relative;background-color:#eee;min-height:2.6em;overflow:hidden}.x-toolbar.x-docked-top{border-bottom:1px solid}.x-toolbar.x-docked-bottom{border-top:1px solid}.x-toolbar.x-docked-left{width:50px;height:auto;border-right:1px solid}.x-toolbar.x-docked-right{width:50px;height:auto;border-left:1px solid}.x-title{font-size:1.2em;text-align:center;font-weight:bold;max-width:100%}.x-title.x-title-align-left{padding-left:10px}.x-title.x-title-align-right{padding-right:10px}.x-title .x-innerhtml{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-navigation-bar .x-container{overflow:visible}.x-toolbar-inner .x-field .x-component-outer{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto}.x-ie .x-toolbar-inner{height:100% !important}.x-toast{min-width:15em;max-width:20em;max-height:90%;margin:6px}.x-toast .x-toast-text{text-align:center}.x-ie .x-toast .x-dock.x-dock-horizontal.x-unsized>.x-dock-body{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px}.x-menu{background:#eee}.x-carousel-inner{position:relative;overflow:hidden}.x-carousel-item,.x-carousel-item>*{position:absolute !important;width:100%;height:100%}.x-carousel-indicator{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.x-carousel-indicator span{display:block;width:10px;height:10px;margin:3px;background-color:#eee}.x-carousel-indicator span.x-carousel-indicator-active{background-color:#ccc}.x-carousel-indicator-horizontal{width:100%}.x-carousel-indicator-vertical{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;height:100%}.x-android-3 .x-surface-wrap,.x-android-3 .x-surface-wrap>*{-webkit-perspective:1}.x-draw-component{position:relative}.x-draw-component .x-inner{overflow:hidden}.x-surface{position:absolute}.x-chart-watermark{opacity:0.5;z-index:9;right:0;bottom:0;background:rgba(0,0,0,0.5);color:white;padding:4px 6px;font-family:"Helvetica";font-size:12px;position:absolute;border-top-left-radius:4px;white-space:nowrap;-webkit-border-top-left-radius:4px}.x-legend .x-legend-inner .x-legend-container{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:1px solid #ccc;background:#fff}.x-legend .x-legend-inner .x-legend-container .x-legend-item{padding:0.8em 1em 0.8em 1.8em;color:#333;background:rgba(255,255,255,0);max-width:20em;min-width:0;font-size:14px;line-height:14px;font-weight:bold;white-space:nowrap;position:relative}.x-legend .x-legend-inner .x-legend-container .x-legend-item .x-legend-inactive{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=30);opacity:.3}.x-legend .x-legend-inner .x-legend-container .x-legend-item .x-legend-item-marker{position:absolute;width:.8em;height:.8em;-moz-border-radius:.4em;-webkit-border-radius:.4em;border-radius:.4em;-moz-box-shadow:rgba(255,255,255,0.3) 0 1px 0,rgba(0,0,0,0.4) 0 1px 0 inset;-webkit-box-shadow:rgba(255,255,255,0.3) 0 1px 0,rgba(0,0,0,0.4) 0 1px 0 inset;box-shadow:rgba(255,255,255,0.3) 0 1px 0,rgba(0,0,0,0.4) 0 1px 0 inset;left:.7em;top:1em}.x-legend.x-docked-top .x-legend-item,.x-legend.x-docked-bottom .x-legend-item{border-right:1px solid rgba(204,204,204,0.5)}.x-legend.x-docked-top .x-legend-item:last-child,.x-legend.x-docked-bottom .x-legend-item:last-child{border-right:0}.x-legend.x-docked-left .x-legend-inner,.x-legend.x-docked-right .x-legend-inner{display:-webkit-box;-webkit-box-align:center;-webkit-box-pack:center}.x-chart-toolbar{position:absolute;z-index:9;display:-webkit-box;display:-moz-box;display:-ms-box;display:box;padding:.6em}.x-chart-toolbar .x-button{margin:.2em}.x-chart-toolbar[data-side=left],.x-chart-toolbar[data-side=right]{top:0;-webkit-box-orient:vertical;-moz-box-orient:vertical;-ms-box-orient:vertical;box-orient:vertical}.x-chart-toolbar[data-side=left]{left:0}.x-chart-toolbar[data-side=right]{right:0}.x-chart-toolbar[data-side=top],.x-chart-toolbar[data-side=bottom]{-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-ms-box-orient:horizontal;box-orient:horizontal;right:0}.x-chart-toolbar[data-side=top]{top:0}.x-chart-toolbar[data-side=bottom]{bottom:0;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-ms-box-orient:horizontal;box-orient:horizontal}.x-tab .x-button-icon.list:before,.x-button .x-button-icon.list:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"l"}.x-tab .x-button-icon.expand:before,.x-button .x-button-icon.expand:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"`"}.x-dataview-inlineblock .x-dataview-item,.x-dataview-inlineblock .x-data-item{display:inline-block !important}.x-dataview-nowrap .x-dataview-container{white-space:nowrap !important}.x-dataview-nowrap .x-container.x-dataview{white-space:nowrap !important}.x-list{overflow:hidden}.x-list .x-scroll-scroller{max-width:100%}.x-list .x-list-inner{width:100% !important}.x-list.x-list-indexed .x-list-disclosure{margin-right:50px}.x-list .x-item-selected .x-list-disclosure{background-color:#fff}.x-list .x-list-scrolldock-hidden{display:none}.x-list .x-list-item{position:absolute !important;left:0;top:0;width:100%}.x-list .x-list-item>.x-dock{height:auto}.x-list .x-list-item .x-dock-horizontal{border-top:1px solid #ccc}.x-list .x-list-item.x-item-selected .x-dock-horizontal,.x-list .x-list-item.x-item-selected.x-list-item-tpl{background-color:#ccc}.x-list .x-list-item.x-item-pressed.x-list-item-tpl,.x-list .x-list-item.x-item-pressed .x-dock-horizontal{background-color:#ddd}.x-list .x-list-item .x-list-item-body,.x-list .x-list-item.x-list-item-tpl .x-innerhtml{padding:5px}.x-list .x-list-item.x-list-item-relative{position:relative !important}.x-list .x-list-header{background-color:#eee;border-top:1px solid #ccc;border-bottom:1px solid #ccc;font-weight:bold}.x-list .x-list-header.x-list-item-relative{position:relative !important}.x-list .x-list-disclosure{margin:5px 15px 5px 0;overflow:visible;width:20px;height:20px;border:1px solid #ccc;background-color:#eee}.x-list .x-list-item-tpl .x-list-disclosure{position:absolute;right:0px;top:0px}.x-list .x-list-emptytext{text-align:center;pointer-events:none;font-color:#333333;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-list.x-list-indexed .x-list-disclosure{margin-right:35px}.x-list .x-list-scrolldockitem{position:absolute !important;left:0;top:0;width:100%}.x-ie .x-list-grouped .x-translatable-container .x-list-item:before,.x-ie .x-list-grouped .x-translatable-container .x-list-header:before{content:". .";color:transparent;position:absolute;left:0px;word-spacing:3000px;opacity:0}.x-list-header{position:absolute;left:0;width:100%;z-index:2 !important}.x-ios .x-list-header{-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.x-list-grouped .x-list-item.x-list-header-wrap .x-dock-horizontal,.x-list-grouped .x-list-item-tpl.x-list-header-wrap{border-top:0}.x-list-inlineblock .x-list-item{display:inline-block !important}.x-list-nowrap .x-list-inner{width:auto}.x-list-nowrap .x-list-container{white-space:nowrap !important}.x-list-item-dragging{border-bottom:1px solid #ccc;background:#fff !important;z-index:1}.x-indexbar-wrapper{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important;pointer-events:none}.x-indexbar{pointer-events:auto;z-index:2;min-height:0 !important;height:auto !important;-webkit-box-flex:0 !important;-ms-flex:0 0 auto !important;flex:0 0 auto !important}.x-indexbar>div{font-size:0.6em;text-align:center;line-height:1.1em;font-weight:bold;display:block}.x-indexbar-vertical{width:15px;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;margin-right:15px}.x-indexbar-horizontal{height:15px;-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.x-phone.x-landscape .x-indexbar>div{font-size:0.38em;line-height:1em}.x-indexbar-pressed{background-color:#ccc}.x-form-label{display:none !important}.x-form-label span{font-weight:bold}.x-form-label-nowrap .x-form-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-field{display:flex;display:-webkit-box;display:-ms-flexbox}.x-field .x-field-input{position:relative;min-width:3.7em}.x-field .x-field-input,.x-field .x-input-el{width:100%}.x-field.x-field-labeled .x-form-label{display:block !important}.x-field .x-component-outer{position:relative}.x-label-align-left,.x-label-align-right{-webkit-box-orient:horizontal !important;-ms-flex-direction:row !important;flex-direction:row !important}.x-label-align-left .x-component-outer,.x-label-align-right .x-component-outer{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px}.x-label-align-right{-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.x-label-align-top,.x-label-align-bottom{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-label-align-bottom{-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.x-input-el{display:block}.x-field-mask{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-ie .x-field.x-field-text .x-field-mask,.x-ie .x-field.x-field-textarea .x-field-mask,.x-ie .x-field.x-field-search .x-field-mask{z-index:-1}.x-field-required .x-form-label:after{content:"*";display:inline}.x-spinner .x-component-outer{display:flex;display:-webkit-box;display:-ms-flexbox}.x-spinner .x-component-outer>*{width:auto}.x-spinner .x-field-input{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px}.x-spinner .x-field-input .x-input-el{width:100%;text-align:center}.x-spinner .x-field-input input::-webkit-outer-spin-button,.x-spinner .x-field-input input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.x-spinner .x-spinner-button{text-align:center;border:1px solid #ccc !important;background-color:#eee}.x-spinner.x-field-grouped-buttons .x-input-el{text-align:left}.x-select-overlay .x-list-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}.x-field-number input::-webkit-outer-spin-button,.x-field-number input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.x-field-input .x-clear-icon,.x-field-input .x-reveal-icon{display:none;width:10px;height:10px;background-color:#ccc;position:absolute;top:50%;right:0}.x-field-clearable .x-clear-icon{display:block}.x-field-clearable .x-field-input{padding-right:10px}.x-field-revealable .x-reveal-icon{display:block}.x-field-revealable .x-field-input{padding-right:10px}.x-field-clearable.x-field-revealable .x-reveal-icon{right:20px}.x-android .x-input-el{-webkit-text-fill-color:#000}.x-android .x-empty .x-input-el{-webkit-text-fill-color:#A9A9A9}.x-android .x-item-disabled .x-input-el{-webkit-text-fill-color:#b3b3b3}.x-form-fieldset .x-form-fieldset-inner{border:1px solid #ccc;overflow:hidden}.x-form-fieldset .x-dock .x-dock-body{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto}.x-form-fieldset-title{font-weight:bold}.x-form-fieldset-title .x-innerhtml{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-form-fieldset-instructions{text-align:center}.x-ie .x-field-select .x-field-mask{z-index:3}.x-sheet.x-picker{padding:0}.x-sheet.x-picker .x-sheet-inner{background-color:#fff;overflow:hidden}.x-sheet.x-picker .x-sheet-inner .x-picker-slot .x-body{border-left:1px solid #999999;border-right:1px solid #ACACAC}.x-sheet.x-picker .x-sheet-inner .x-picker-slot.x-first .x-body{border-left:0}.x-sheet.x-picker .x-sheet-inner .x-picker-slot.x-last .x-body{border-left:0;border-right:0}.x-picker-slot .x-scroll-view{z-index:2;position:relative}.x-picker-mask{position:absolute;top:0;left:0;right:0;bottom:0;z-index:3;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;pointer-events:none}.x-picker-slot-title{position:relative;z-index:2}.x-picker-slot-title>div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:bold}.x-picker-slot .x-dataview-inner{width:100% !important}.x-picker-slot .x-dataview-item{vertical-align:middle;height:30px;line-height:30px}.x-picker-slot .x-dataview-item.x-item-selected{font-weight:bold}.x-picker-slot .x-picker-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-ie .x-picker-item{cursor:default}.x-ie .x-picker-item::before{content:". .";color:transparent;position:absolute;left:0px;word-spacing:3000px}.x-picker-right{text-align:right}.x-picker-center{text-align:center}.x-picker-left{text-align:left}.x-list-paging .x-loading-spinner{display:none;margin:auto}.x-list-paging .x-list-paging-msg{text-align:center;clear:both}.x-list-paging.x-loading .x-loading-spinner{display:block}.x-list-paging.x-loading .x-list-paging-msg{display:none}.x-list-pullrefresh{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;position:absolute;top:-5em;left:0;width:100%;height:4.5em}.x-list-pullrefresh .x-loading-spinner{display:none}.x-list-pullrefresh-arrow{width:2.5em;height:4.5em;background-color:#bbb}.x-list-pullrefresh-wrap{width:20em;font-size:0.7em}.x-list-pullrefresh-message{font-weight:bold;font-size:1.3em;text-align:center}.x-list-pullrefresh-updated{text-align:center}.x-list-pullrefresh-loading *.x-loading-spinner{display:block}.x-list-pullrefresh-loading .x-list-pullrefresh-arrow{display:none}.x-android-2 .x-list-pullrefresh-loading *.x-loading-spinner{display:none}.x-slider,.x-toggle{position:relative;height:16px;min-height:0;min-width:0}.x-slider>*,.x-toggle>*{position:absolute;width:100%;height:100%}.x-thumb{position:absolute;height:16px;width:10px;border:1px solid #ccc;background-color:#ddd}.x-slider:before{content:'';position:absolute;width:auto;height:8px;top:4px;left:0;right:0;margin:0 5px;background-color:#eee}.x-toggle{border:1px solid #ccc;width:30px;overflow:hidden;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.x-toggle-on{background-color:#eee}.x-tab{z-index:1;overflow:visible !important;background-color:#eee;border:1px solid #ccc}.x-tabbar{border-color:#ccc;border-style:solid;border-width:0;background-color:#eee}.x-tabbar.x-docked-top{border-bottom-width:1px}.x-tabbar.x-docked-top .x-tab .x-button-icon{position:relative}.x-tabbar.x-docked-top .x-tab .x-button-icon.x-shown{display:inline-block}.x-tabbar.x-docked-top .x-tab .x-button-icon.x-hidden{display:none}.x-tabbar.x-docked-bottom{border-top-width:1px}.x-tabbar.x-docked-bottom .x-tab .x-button-icon{display:block;position:relative}.x-tabbar.x-docked-bottom .x-tab .x-button-icon.x-shown{visibility:visible}.x-tabbar.x-docked-bottom .x-tab .x-button-icon.x-hidden{visibility:hidden}.x-tab{position:relative;min-width:3.3em}.x-table-inner{display:table !important;width:100% !important;height:100% !important}.x-table-inner.x-fixed-layout{table-layout:fixed !important}.x-table-row{display:table-row !important}.x-table-cell{display:table-cell !important;vertical-align:middle}.x-orientation-inspector{display:none;content:"landscape"}@media (orientation: portrait){.x-orientation-inspector{content:"portrait"}}.x-grid .x-grid-header-container{border-width:0 1px 1px 0;border-style:solid;height:65px;font-weight:bold;overflow:hidden}.x-grid .x-grid-header-container .x-grid-column{display:inline-block}.x-grid .x-grid-header-container .x-grid-header-container-inner{width:100000px;position:absolute;top:0;left:0}.x-grid .x-grid-column{height:64px;border-width:1px 1px 0 1px;border-style:solid;line-height:64px;vertical-align:middle;padding:0 8px}.x-grid .x-grid-column .x-innerhtml{display:inline-block;width:auto;position:relative}.x-grid .x-grid-column.x-column-sorted-asc .x-innerhtml:after,.x-grid .x-grid-column.x-column-sorted-desc .x-innerhtml:after{position:absolute;width:12px;line-height:64px;top:0;height:64px;font-family:'Pictos';font-size:12px}.x-grid .x-grid-column.x-column-align-left .x-innerhtml:after,.x-grid .x-grid-column.x-column-align-center .x-innerhtml:after{right:-16px}.x-grid .x-grid-column.x-column-align-right .x-innerhtml:after{left:-16px}.x-grid .x-grid-column.x-column-sorted-asc .x-innerhtml:after{content:"{"}.x-grid .x-grid-column.x-column-sorted-desc .x-innerhtml:after{content:"}"}.x-grid .x-grid-headergroup{display:inline-block;position:relative;vertical-align:bottom;height:64px;padding-top:32px}.x-grid .x-grid-headergroup .x-inner>.x-innerhtml{height:32px;line-height:28px;vertical-align:middle;display:block;position:absolute;width:100%;top:0;left:0;text-align:center;border-style:solid;border-width:1px;overflow:hidden;text-overflow:ellipsis}.x-grid .x-grid-headergroup .x-grid-column{height:32px !important;line-height:27px !important;font-size:0.7em}.x-grid .x-grid-headergroup .x-grid-column.x-column-sorted-asc .x-innerhtml:after,.x-grid .x-grid-headergroup .x-grid-column.x-column-sorted-desc .x-innerhtml:after{line-height:27px;height:27px}.x-grid .x-grid-row{position:absolute;left:0;top:0;border-width:0 0 1px 0;border-style:solid}.x-grid .x-grid-cell{display:inline-block;vertical-align:middle;line-height:60px;padding:0 8px;height:60px;overflow:hidden;border-width:0 1px 0 0}.x-grid .x-grid-cell-align-center,.x-grid .x-grid-column-align-center{text-align:center}.x-grid .x-grid-cell-align-right,.x-grid .x-grid-column-align-right{text-align:right}.x-grid .x-grid-viewoptions{border-width:0 0 0 1px;border-style:solid}.x-grid .x-grid-viewoptions .x-list-item .x-innerhtml{padding:0px !important}.x-grid .x-grid-viewoptions .x-column-options-header{height:32px;line-height:28px;vertical-align:middle;border-style:solid;border-width:1px;overflow:hidden;padding-left:10px}.x-grid .x-grid-viewoptions .x-column-options-sortablehandle,.x-grid .x-grid-viewoptions .x-column-options-visibleindicator,.x-grid .x-grid-viewoptions .x-column-options-groupindicator,.x-grid .x-grid-viewoptions .x-column-options-folder,.x-grid .x-grid-viewoptions .x-column-options-leaf{width:40px;height:48px;position:absolute;bottom:0}.x-grid .x-grid-viewoptions .x-column-options-sortablehandle:after,.x-grid .x-grid-viewoptions .x-column-options-visibleindicator:after,.x-grid .x-grid-viewoptions .x-column-options-groupindicator:after,.x-grid .x-grid-viewoptions .x-column-options-folder:after,.x-grid .x-grid-viewoptions .x-column-options-leaf:after{position:absolute;top:0;left:0;height:100%;width:100%;text-align:center;font-size:24px;font-family:'Pictos';line-height:48px;content:"l";vertical-align:middle}.x-grid .x-grid-viewoptions .x-column-options-sortablehandle{left:0}.x-grid .x-grid-viewoptions .x-column-options-sortablehandle:after{line-height:54px}.x-grid .x-grid-viewoptions .x-column-options-visibleindicator{right:0}.x-grid .x-grid-viewoptions .x-column-options-visibleindicator:after{font-size:30px;line-height:54px;content:"E"}.x-grid .x-grid-viewoptions .x-column-options-groupindicator{right:40px}.x-grid .x-grid-viewoptions .x-column-options-groupindicator:after{font-size:30px;line-height:54px;content:"g"}.x-grid .x-grid-viewoptions .x-column-options-folder,.x-grid .x-grid-viewoptions .x-column-options-leaf{width:30px;left:40px}.x-grid .x-grid-viewoptions .x-column-options-folder:after,.x-grid .x-grid-viewoptions .x-column-options-leaf:after{line-height:52px;content:"o"}.x-grid .x-grid-viewoptions .x-column-options-leaf:after{content:"F"}.x-grid .x-grid-viewoptions .x-list-item.x-item-selected.x-list-item-tpl{background:transparent}.x-grid .x-grid-viewoptions .x-list-item.x-item-selected.x-list-item-tpl .x-innerhtml{background:transparent}.x-grid .x-grid-viewoptions .x-column-options-text{display:block;height:30px;margin:10px 50px 5px 80px;position:relative;vertical-align:middle;line-height:28px}.x-grid .x-grid-columnoptions{border-width:0 0 1px}.x-grid .x-grid-multiselection-column{position:relative;padding:0}.x-grid .x-grid-multiselection-column:after{position:absolute;top:0;left:0;width:60px;height:64px;line-height:64px;font-family:'Pictos';font-size:26px;text-align:center;content:"2"}.x-grid .x-grid-multiselection-cell{position:relative;padding:0}.x-grid .x-grid-multiselection-cell:after{position:absolute;top:0;left:0;width:60px;height:60px;line-height:60px;font-family:'Pictos';font-size:20px;text-align:center;content:"_"}.x-grid .x-item-selected .x-grid-multiselection-cell:after{content:"3"}.x-grid .x-grid-pagingtoolbar>.x-body{padding:0 30px 0 50px}.x-grid .x-grid-pagingtoolbar-currentpage{position:relative;height:22px}.x-grid .x-grid-pagingtoolbar-currentpage span{position:absolute;right:0;top:0;line-height:22px;height:22px}.x-grid .x-grid-summaryrow{height:32px;font-size:0.8em;position:relative}.x-grid .x-grid-summaryrow .x-grid-cell{height:32px;line-height:30px;border-width:0 0 1px;border-style:solid}.x-grid .x-grid-summaryrow .x-grid-multiselection-cell:after{content:''}.x-ie .x-grid-grouped .x-translatable-container .x-grid-row:before,.x-ie .x-grid-grouped .x-translatable-container .x-grid-header:before{content:". .";color:transparent;position:absolute;left:0px;word-spacing:3000px;opacity:0}.x-grid-header{line-height:44px;font-weight:bold;position:absolute;left:0;width:100%;z-index:2 !important}.x-ios .x-grid-header{-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.x-grid-grouped .x-grid-row.x-grid-header-wrap .x-dock-horizontal,.x-grid-grouped .x-grid-row-tpl.x-grid-header-wrap{border-top:0}.x-scroll-view{position:relative;display:block;overflow:hidden}.x-scroll-container{position:absolute;width:100%;height:100%}.x-scroll-scroller{position:absolute;min-width:100%;min-height:100%;height:auto !important;width:auto !important}.x-scroll-stretcher{position:absolute;visibility:hidden}.x-scroll-bar-grid-wrapper{position:absolute;width:100%;height:100%}.x-scroll-bar-grid{display:table;width:100%;height:100%}.x-scroll-bar-grid>*{display:table-row}.x-scroll-bar-grid>*>*{display:table-cell}.x-scroll-bar-grid>:first-child>:first-child{width:100%;height:100%}.x-scroll-bar-grid>:first-child>:nth-child(2){padding:3px 3px 0 0}.x-scroll-bar-grid>:nth-child(2)>:first-child{padding:0 0 3px 3px}.x-scroll-bar{position:relative;overflow:hidden}.x-scroll-bar-stretcher{position:absolute;visibility:hidden;width:100%;height:100%}.x-scroll-bar-x{width:100%}.x-scroll-bar-x>.x-scroll-bar-stretcher{width:300%}.x-scroll-bar-x.active{height:6px}.x-scroll-bar-y{height:100%}.x-scroll-bar-y>.x-scroll-bar-stretcher{height:300%}.x-scroll-bar-y.active{width:6px}.x-scroll-indicator{background:#333;position:absolute;z-index:3}.x-scroll-indicator-x{height:100%}.x-scroll-indicator-y{width:100%}.x-scroll-indicator.rounded{background:none}.x-scroll-indicator.rounded>*{position:absolute;background-color:#333}.x-scroll-indicator.rounded>:nth-child(2){-webkit-transform-origin:0% 0%;background:none;content:url(data:image/bmp;base64,Qk08AAAAAAAAADYAAAAoAAAAAQAAAAEAAAABABAAAAAAAAYAAAASCwAAEgsAAAAAAAAAAAAAxhgAAAAA)}.x-scroll-indicator.rounded.x-scroll-indicator-light>*{background-color:#eee}.x-scroll-indicator.rounded.x-scroll-indicator-light>:nth-child(2){content:url(data:image/bmp;base64,Qk08AAAAAAAAADYAAAAoAAAAAQAAAAEAAAABABAAAAAAAAYAAAASCwAAEgsAAAAAAAAAAAAAvXcAAAAA)}.x-scroll-indicator.rounded.x-scroll-indicator-y>*{width:100%}.x-scroll-indicator.rounded.x-scroll-indicator-y>:first-child{height:3px;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px}.x-scroll-indicator.rounded.x-scroll-indicator-y>:nth-child(2){height:1px}.x-scroll-indicator.rounded.x-scroll-indicator-y>:last-child{height:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.x-scroll-indicator.rounded.x-scroll-indicator-x>*{height:100%}.x-scroll-indicator.rounded.x-scroll-indicator-x>:first-child{width:3px;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px}.x-scroll-indicator.rounded.x-scroll-indicator-x>:nth-child(2){width:1px}.x-scroll-indicator.rounded.x-scroll-indicator-x>:last-child{width:3px;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.x-list-light .x-scroll-indicator,.x-dataview-light .x-scroll-indicator{background:#fff}.x-ios .x-scroll-scroller{-webkit-transform:translate3d(0, 0, 0)}.x-ie .x-scroll-bar-y{position:absolute;margin-left:-5px}html,body{font-family:"Helvetica Neue",HelveticaNeue,"Helvetica-Neue",Helvetica,"BBAlpha Sans",sans-serif}.x-ios.x-tablet .x-landscape *{-webkit-text-stroke:1px transparent}body{font-size:104%}body.x-android.x-phone{font-size:116%}body.x-ios.x-phone{font-size:114%}body.x-desktop{font-size:114%}.x-layout-card-item{background:#eee}.x-loading-spinner{font-size:250%;height:1em;width:1em;position:relative;-webkit-transform-origin:.5em .5em;transform-origin:.5em .5em}.x-loading-spinner>span,.x-loading-spinner>span:before,.x-loading-spinner>span:after{display:block;position:absolute;width:.1em;height:.25em;top:0;-webkit-transform-origin:.05em .5em;transform-origin:.05em .5em;content:" "}.x-loading-spinner>span{left:50%;margin-left:-0.05em}.x-loading-spinner>span.x-loading-top{background-color:rgba(170,170,170,0.99)}.x-loading-spinner>span.x-loading-top::after{background-color:rgba(170,170,170,0.9)}.x-loading-spinner>span.x-loading-left::before{background-color:rgba(170,170,170,0.8)}.x-loading-spinner>span.x-loading-left{background-color:rgba(170,170,170,0.7)}.x-loading-spinner>span.x-loading-left::after{background-color:rgba(170,170,170,0.6)}.x-loading-spinner>span.x-loading-bottom::before{background-color:rgba(170,170,170,0.5)}.x-loading-spinner>span.x-loading-bottom{background-color:rgba(170,170,170,0.4)}.x-loading-spinner>span.x-loading-bottom::after{background-color:rgba(170,170,170,0.35)}.x-loading-spinner>span.x-loading-right::before{background-color:rgba(170,170,170,0.3)}.x-loading-spinner>span.x-loading-right{background-color:rgba(170,170,170,0.25)}.x-loading-spinner>span.x-loading-right::after{background-color:rgba(170,170,170,0.2)}.x-loading-spinner>span.x-loading-top::before{background-color:rgba(170,170,170,0.15)}.x-loading-spinner>span.x-loading-top{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg)}.x-loading-spinner>span.x-loading-right{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg)}.x-loading-spinner>span.x-loading-bottom{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg)}.x-loading-spinner>span.x-loading-left{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg)}.x-loading-spinner>span::before{-webkit-transform:rotate(30deg);-moz-transform:rotate(30deg);-ms-transform:rotate(30deg)}.x-loading-spinner>span::after{-webkit-transform:rotate(-30deg);-moz-transform:rotate(-30deg);-ms-transform:rotate(-30deg)}.x-loading-spinner{-webkit-animation-name:x-loading-spinner-rotate;-webkit-animation-duration:.5s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-name:x-loading-spinner-rotate;animation-duration:.5s;animation-timing-function:linear;animation-iteration-count:infinite}html,body{font-family:"Helvetica Neue",HelveticaNeue,"Helvetica-Neue",Helvetica,"BBAlpha Sans",sans-serif}.x-ios.x-tablet .x-landscape *{-webkit-text-stroke:1px transparent}body{font-size:104%}body.x-android.x-phone{font-size:116%}body.x-ios.x-phone{font-size:114%}body.x-desktop{font-size:114%}.x-layout-card-item{background:#eee}.x-button{-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-background-clip:padding;background-clip:padding-box;-moz-border-radius:.4em;-webkit-border-radius:.4em;border-radius:.4em;min-height:1.8em;padding:.3em .6em}.x-button,.x-toolbar .x-button{border:1px solid #999;border-top-color:#a6a6a6;background-color:#ccc;color:#000}.x-button.x-button-back:before,.x-button.x-button-forward:before,.x-toolbar .x-button.x-button-back:before,.x-toolbar .x-button.x-button-forward:before{background:#999}.x-button,.x-button.x-button-back:after,.x-button.x-button-forward:after,.x-toolbar .x-button,.x-toolbar .x-button.x-button-back:after,.x-toolbar .x-button.x-button-forward:after{background-image:none;background-color:#ccc;background-image:-webkit-linear-gradient(top, #f2f2f2,#d9d9d9 3%,#bfbfbf);background-image:-moz-linear-gradient(top, #f2f2f2,#d9d9d9 3%,#bfbfbf);background-image:-o-linear-gradient(top, #f2f2f2,#d9d9d9 3%,#bfbfbf);background-image:-ms-linear-gradient(to bottom, #f2f2f2,#d9d9d9 3%,#bfbfbf)}.x-button.x-button-pressing,.x-button.x-button-pressing:after,.x-button.x-button-pressed,.x-button.x-button-pressed:after,.x-button.x-button-active,.x-button.x-button-active:after,.x-toolbar .x-button.x-button-pressing,.x-toolbar .x-button.x-button-pressing:after,.x-toolbar .x-button.x-button-pressed,.x-toolbar .x-button.x-button-pressed:after,.x-toolbar .x-button.x-button-active,.x-toolbar .x-button.x-button-active:after{background-image:none;background-color:#c4c4c4;background-image:-webkit-linear-gradient(top, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6);background-image:-moz-linear-gradient(top, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6);background-image:-o-linear-gradient(top, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6);background-image:-ms-linear-gradient(to bottom, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6)}.x-button .x-button-icon{width:1.5em;height:1.5em}.x-button .x-button-icon:before{font-size:1.6em;line-height:1em}.x-button.x-item-disabled .x-button-label,.x-button.x-item-disabled .x-badge,.x-button.x-item-disabled .x-button-icon{opacity:.5}.x-button-round{-moz-border-radius:.9em;-webkit-border-radius:.9em;border-radius:.9em}.x-ie .x-button{height:0px}.x-ie .x-button .x-button-label,.x-ie .x-button .x-badge{overflow:visible}.x-iconalign-left .x-button-label,.x-iconalign-left .x-badge{margin-left:.6em}.x-iconalign-right .x-button-label,.x-iconalign-right .x-badge{margin-right:.6em}.x-iconalign-top,.x-iconalign-bottom{padding-top:.2em !important;padding-bottom:.2em !important}.x-button-label,.x-badge,.x-hasbadge .x-badge{font-weight:bold;line-height:1.2em;font-family:"Helvetica Neue",HelveticaNeue,"Helvetica-Neue",Helvetica,"BBAlpha Sans",sans-serif;font-size:1em}.x-toolbar .x-button{margin:6px .2em;padding:0 .6em}.x-toolbar .x-button .x-button-label,.x-toolbar .x-button .x-badge{font-size:.7em}.x-toolbar .x-button .x-button-label,.x-toolbar .x-button .x-badge,.x-toolbar .x-button .x-hasbadge .x-badge{line-height:1.6em}.x-toolbar .x-button .x-button-icon:before{font-size:1.3em;line-height:1.3em}.x-ie .x-toolbar .x-button .x-button-icon::before{font-size:.6em;line-height:1em}.x-button-small,.x-toolbar .x-button-small{-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em;padding:.2em .4em;min-height:0}.x-button-small .x-button-label,.x-button-small .x-badge,.x-toolbar .x-button-small .x-button-label,.x-toolbar .x-button-small .x-badge{font-size:.6em}.x-button-small .x-button-icon,.x-toolbar .x-button-small .x-button-icon{width:.75em;height:.75em}.x-button-forward,.x-button-back{position:relative;overflow:visible;height:1.7em;z-index:1}.x-webkit .x-button-forward:before,.x-webkit .x-button-forward:after,.x-webkit .x-button-back:before,.x-webkit .x-button-back:after{content:'';position:absolute;width:15px;height:auto;top:-2px;left:auto;bottom:-2px;z-index:2;-webkit-mask:4px 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAABGCAYAAADb7SQ4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAiNJREFUeNrEWb9LQlEUvj5BcHoQvMnVKXD1D3CLwqBJbHJsazQaWoSCxgbHJiMIAiNok6AhCDdXVycnJ8EQOgeOYaG+d39998KH+HyP753zzjnfd325xfdSgVeV8B6BScuEV0IRSbxHeCMk/AVFXCA8ScQKSXxPqK0fQBBfE5r/D+Y8VzUT9jb94DPimqRYIYkrhGcpKhhxIqTxrpNcExdlQJTTTnRJnCc8ykhUSOIOoZ71ZFfEZ4S2zgUu+rguxZRHEnPbfKRVsOtUl0RtYpOLTYljIS2Z3nVk2DY9SbNCEt8RDm0rUpe4La1jvXSqmtum72raZI24KuNQIYl/nSGSOJb0Jq61M0pxhjwK9304hUjHGSKILzc5Q5drUzttdYY+I97pDH1FzG0zNFUb04gTG4kzJS5kdYauiZtZnaFr4ooKsCIVaDHxKAQxt1NBnGIVHfGCcEQYh3jGU8KBfMKLiyM+lgzAq/qT0ArVTg+Ei1B9fEPoovV4fcfQd2HedScX39GprwGTNjJn0maTELN6IuSzECLB6T5x2eM66jQgnIeSxa60GnS3uL56tr7b1Ai0JPVwYi6yho2U2lgfKym19VxjMRHzEGbvS9K+RBPzetGVUpf29lZHSl2/DMnLvwh1ZMQrKW3Ic4fvJOZS6ZMQW5hpmpT63DvtlFLfm7bBNruM2C2yXb7y3U6ZpRS5P/4jpUjihRTbCJ3q1eL3GMMfAQYAJmB6SBO619IAAAAASUVORK5CYII=') no-repeat;-webkit-mask-size:15px 100%;overflow:hidden}.x-webkit .x-button-back,.x-webkit .x-toolbar .x-button-back{margin-left:.77217em;padding-left:.4em}.x-webkit .x-button-back:before,.x-webkit .x-toolbar .x-button-back:before{left:-15px}.x-webkit .x-button-back:after,.x-webkit .x-toolbar .x-button-back:after{left:-14px}.x-webkit .x-button-forward,.x-webkit .x-toolbar .x-button-forward{margin-right:.78217em;padding-right:.4em}.x-webkit .x-button-forward:before,.x-webkit .x-button-forward:after,.x-webkit .x-toolbar .x-button-forward:before,.x-webkit .x-toolbar .x-button-forward:after{-webkit-mask:-4px 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAABGCAYAAADb7SQ4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXlJREFUaN7lmTFqAlEQhh8EhFSCYJXW1law9QAewMrWAwQWAmmtbPcGHiCQ1gPYCla2QsDKSsgmQecvFqImu2/fzry/2OLb9mt23vwz47Kvn5MwEFxM8DkLB6HHEIOd0GGIwUpoMcRgyRKDOUsMJizxpzBiiMFR6DPEeZl1GWKwFh4ZYvAmPDDEqmVWVQxmLPG3MGaIVcosVAz2whNDDDZCmyEG7yFlpiEGKUsMEpb4XKXMtMXeiVVb7J1YLcRgW1ZmVuLSxGopLkys1mLwwhL/mVhjie8Sayxx3kp7DPFVYo0tzhNriyEGU5Z40TjxtDE/F6WcDowHBE/msDFNImG0xZQRBAonDCvxhhH2vKZIZ9Ds+7EDfaWFnKZ4xhja5owxdcnYCAQv1p1Gi4sprn08cZbDt6ZYZasXIn5mLFHTjLCvVt1V+4rVt/M+4r3FPaJMbHaBKRKb3pyKxKZXtv/Er4yjZpRL6q042u34tzh4xV9H/FHnqBHKBQeEd6aqqwD6AAAAAElFTkSuQmCC') no-repeat;-webkit-mask-size:15px 100%}.x-webkit .x-button-forward:before,.x-webkit .x-toolbar .x-button-forward:before{right:-15px}.x-webkit .x-button-forward:after,.x-webkit .x-toolbar .x-button-forward:after{right:-14px}.x-button.x-button-plain,.x-toolbar .x-button.x-button-plain{background:none;border:0 none;min-height:0;text-shadow:none;line-height:auto;height:1.9em;padding:0 0.5em;-moz-border-radius:none;-webkit-border-radius:none;border-radius:none}.x-button.x-button-plain>*,.x-toolbar .x-button.x-button-plain>*{overflow:visible}.x-button.x-button-plain.x-button-pressing,.x-button.x-button-plain.x-button-pressed,.x-toolbar .x-button.x-button-plain.x-button-pressing,.x-toolbar .x-button.x-button-plain.x-button-pressed{background:none;background-image:-webkit-radial-gradient(rgba(255,255,255,0.7),rgba(255,255,255,0) 24px);background-image:-moz-radial-gradient(rgba(255,255,255,0.7),rgba(255,255,255,0) 24px);background-image:radial-gradient(rgba(255,255,255,0.7),rgba(255,255,255,0) 24px);background-image:-ms-radial-gradient(rgba(255,255,255,0.7),rgba(255,255,255,0) 24px)}.x-segmentedbutton .x-button{margin:0;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.x-segmentedbutton .x-button.x-first{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em}.x-segmentedbutton .x-button.x-last{-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-segmentedbutton .x-button:not(.x-first){border-left:0}.x-hasbadge{overflow:visible}.x-hasbadge .x-badge{border-color:#900;min-width:2em;line-height:1.2em;top:-.2em;padding:.1em .3em;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-background-clip:padding;background-clip:padding-box;color:#fcc;background-image:none;background-color:#c00;background-image:-webkit-linear-gradient(top, #ff1a1a,#e60000 3%,#b30000);background-image:-moz-linear-gradient(top, #ff1a1a,#e60000 3%,#b30000);background-image:-o-linear-gradient(top, #ff1a1a,#e60000 3%,#b30000);background-image:-ms-linear-gradient(to bottom, #ff1a1a,#e60000 3%,#b30000);-moz-border-radius:.2em;-webkit-border-radius:.2em;border-radius:.2em;text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0;-moz-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0.1em;-webkit-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0.1em;box-shadow:rgba(0,0,0,0.5) 0 0.1em 0.1em}.x-panel.x-floating,.x-msgbox,.x-form.x-floating{-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em;-moz-box-shadow:rgba(0,0,0,0.8) 0 0.2em 0.6em;-webkit-box-shadow:rgba(0,0,0,0.8) 0 0.2em 0.6em;box-shadow:rgba(0,0,0,0.8) 0 0.2em 0.6em;background-image:none;background-color:#656565}.x-panel.x-floating.x-floating-light,.x-msgbox.x-floating-light,.x-form.x-floating.x-floating-light{background-image:none;background-color:#cbcbcb}.x-panel.x-floating .x-panel-inner,.x-panel.x-floating>.x-body,.x-msgbox .x-panel-inner,.x-msgbox>.x-body,.x-form.x-floating .x-panel-inner,.x-form.x-floating>.x-body{-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-webkit .x-anchor{position:absolute;overflow:hidden}.x-webkit .x-anchor.x-anchor-top{margin-top:-.68em;margin-left:-.8155em;width:1.631em;height:.7em;-webkit-mask:0 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAPCAYAAABut3YUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPZJREFUeNpi/PX7LwOFwAyIG6HseiA+Ra5BjBQ6xg+IVwAxJ5T/HYgjgHgTOYYxUeCQUiBeh+QQBih7HVSOLiHDDMSTgTiTgLrpQJwLxH9p5RhOaLT4EakeFF3RQPyF2o6RhkaBGYkheRmIPYH4KbXSjC4QnyTDIch6danhGCcgPgwNGXKBNNQMb0ocEwXE24GYn4FyADJjI76Ej88x7UC8FIjZGKgHQDlxGtRsZmISMMjy+dBQoSXYBC0gv+NyDD80xzgx0AeAqg4fIH6NHk0qQHyMjg6B1WvHYDkNFjIgwS1ALMowMOAjEAeBHINe2Q0U+AUQYACQ10C2QNhRogAAAABJRU5ErkJggg==') no-repeat;-webkit-mask-size:1.631em .7em;background-color:#656565}.x-webkit .x-anchor.x-anchor-bottom{margin-left:-.8155em;width:1.631em;height:.7em;-webkit-mask:0 0 url('data:image/png;base64,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') no-repeat;-webkit-mask-size:1.631em .7em;background-color:#656565}.x-webkit .x-anchor.x-anchor-left{margin-left:-.6655em;margin-top:-.35em;height:1.631em;width:.7em;-webkit-mask:0 0 url('data:image/png;base64,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') no-repeat;-webkit-mask-size:.7em 1.631em;background-color:#656565}.x-webkit .x-anchor.x-anchor-right{margin-top:-.35em;height:1.631em;width:.7em;-webkit-mask:0 0 url('data:image/png;base64,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') no-repeat;-webkit-mask-size:.7em 1.631em;background-color:#656565}.x-floating.x-panel-light:after{background-color:#cbcbcb}.x-sheet,.x-picker,.x-sheet-action{padding:.7em;border-top:1px solid #7f7f7f;background-image:none;background-color:rgba(101,101,101,0.9);background-image:-webkit-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-moz-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-o-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-ms-linear-gradient(to bottom, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.x-sheet-inner>.x-button,.x-sheet-action-inner>.x-button{margin-bottom:.5em}.x-sheet-inner>.x-button:last-child,.x-sheet-action-inner>.x-button:last-child{margin-bottom:0}.x-msgbox{margin:.5em;border:0.15em solid #cbcbcb;-moz-box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;-webkit-box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-msgbox .x-icon{margin:0 0.8em 0 0.5em;background:#fff;-webkit-mask-size:100%}.x-msgbox .x-msgbox-info{-webkit-mask-image:url('data:image/png;base64,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')}.x-msgbox .x-msgbox-warning{-webkit-mask-image:url('data:image/png;base64,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')}.x-msgbox .x-msgbox-question{-webkit-mask-image:url('data:image/png;base64,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')}.x-msgbox .x-msgbox-error{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAFGUlEQVRoBe2bzW8VVRxAeS0UMZggaARtGgtNU5pIRCMaEsPChrgh7FhCjHtdEBKNLvwjdOHShSHGmEiMiVFw4cL4EcFoolRSuqBiRDQqCLRS6znDzPP1dub1fbbzLv6S05m57829vzN3Pu+8VhYWFtZ0KyqVygbqHoA74QEYhnmojX4WpuFHuAZz5HSdaVei0mlhJBW7Hx6GJ+AheAwaiS/50rfwGXwNF8nPDdGx6JgwonvJ6hE4CI/DXdBOXGHlz+EEnEb803Yqq65rD7cDFSn4NvwKHh/dwLpt42A7ubpuS7I03Ad74C24DP9AN0Rr67QN27JN2+5rRb5pYRraBC+Bx9ZKiNZKO2+bM/AKbG5WuilhGtgNb4Jn0zCRlV42B3PZ3Yx0w8JUfAQmwcvKSssVtWcu5nSkUemGhKnwKFyE1diFi2SzcnMyt6ONSNcVphJvCl4ATxZZA2WdmqO59tcTLxRmRc/Ez8AvUFbJMC9zNefCM3g9YW8kvocyHbOhYLhsrua8t6iXc4VZYRQ+hJsQVlr2ZXM299E86SXCfNEb/tfhTyi7XFF+5q7DhlB6kTBfqMCzMA1FlfVKuQ66JM8LmXgoPM4XTsIs9IpYUZ466DKeyTr1TJwETztegg7BLhhICnv7jw66HErdEpuqMEvb4Um4O/kkjj+66KRbEokwW2AtS/tgBzgfS+ii077UsbpL30fhBNwLsYVOuum4pg9zz8xj4P7u2FNsoZNuY7q6S3twPwUx9i5aSeim44DC68CxKB/sYw3ddFyn8BBsg5hOVugsCt10HFJ4BGLuXfSS0HFE80HYmBQt/XOdIseJfwfvaDzBlTGy3JRyHNzngTB0HFR4KxSdnS/w2ctwFhxZKHO4t3q1eRV82gtDx60Kb4E7wk/T5d+YTnIPqnjpI73EmnNe6LjFrVJvN3VXya7VeZWUpiyV1ceciyK5Dhd9GGW5W+S2iv+Fg+72eKh3TARfX/XFZfO1h+eg6JLjbec8Z+nSS6c5/k2+/ZAXOs55WboEvqfJu/nYTvlznAHPM3UItMxh5w3BgwVJ6nhJYa+xVyFP2Gv0MYghdLzgVpmCP2IwWsZBxymFz8FlKP1xSo6thm46nlPYrp6EvyDW0E3HqwrPwinwRVSsoZuOs75l83R9Bn4G52MLnXQ7o6s9bMzAR+B+HlvopJuOt4ZpMb/CvF3ulogtdDqVOlbHpZX8DnzQd5QjltBFJ92SyHZpX6p5YB+HH2A++bS3/+igy/HULbGpCqdu7zP9BLxU9XrooItO/wX24SvTnXz6MXgjnj199NrU3HXYucQvLHCZOAzT0GuiWb7mfjjXLbfw1qD886zUiz97MGdzX5vrlldoGbEZ3gAfq7ItV/apuZpz4W8wFx2/oTwrOkh/Am5A2WXN0VwHQ4/a5brCaU+PUMm7UGZpczPHkVq5vPllhWuk3ymptLLmtqxs4pK3FfLKqND3Ni+Ct2rekK/2Lm4O5mJOm/JyzitrqIezFal4PTwNp+EmrJa0bZuDuazP8mtk2pRwViGNDMNr4BPISva2bdmmbQ9n+TQzbUk4a4BGJ8Azo/fh3RS3btuwrYms/Vambf8bD0O4jgM/CgfAXcyfFoT36BS1FIq6634A78FXSLb1YNO2MEkkgbiD9l63x2E/2Ptj0Ky8kmfhJPirWB/tZhD1/rjt6JhwbSbIe3LzBfQ22AV7YAfck+K8MQWOSIjzX8A38BNcQ9Lxto7Gv+RtOqJ9fOwKAAAAAElFTkSuQmCC')}.x-msgbox .x-title{font-size:.9em;line-height:1.4em}.x-msgbox .x-body{background:transparent !important}.x-msgbox .x-toolbar{background:transparent none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.x-msgbox .x-toolbar.x-docked-top{height:1.3em}.x-msgbox .x-field{min-height:2em;background:#fff;-moz-border-radius:.2em;-webkit-border-radius:.2em;border-radius:.2em}.x-msgbox .x-form-field{min-height:1.5em;padding-right:0 !important;-webkit-appearance:none}.x-msgbox .x-field-input{padding-right:2.2em}.x-msgbox-text{padding:6px 0;line-height:1.4em}.x-msgbox-buttons{padding:0.4em 0;height:auto}.x-msgbox-buttons .x-button-normal span{opacity:.7}.x-msgbox-dark .x-msgbox-text{color:rgba(255,255,255,0.9);text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-msgbox-dark .x-msgbox-input{background-image:none;background-color:rgba(255,255,255,0.9);background-image:-webkit-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-moz-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-o-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-ms-linear-gradient(to bottom, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));border:0.1em solid rgba(203,203,203,0.9)}.x-toolbar{padding:0 .2em}.x-toolbar.x-docked-left{width:7em;padding:.2em}.x-toolbar.x-docked-right{width:7em;padding:.2em}.x-title{line-height:2.1em;font-size:1.2em;margin:0 0.3em;padding:0 .3em}.x-spinner .x-input-el,.x-field-select .x-input-el{-webkit-text-fill-color:#000;-webkit-opacity:1}.x-spinner.x-item-disabled .x-input-el,.x-field-select.x-item-disabled .x-input-el{-webkit-text-fill-color:currentcolor}.x-toolbar .x-field-select .x-input-el{-webkit-text-fill-color:#fff}.x-toolbar .x-field-select.x-item-disabled .x-input-el{-webkit-text-fill-color:rgba(255,255,255,0.6)}.x-toolbar .x-form-field-container{padding:0 .3em}.x-toolbar .x-slider-field .x-component-outer,.x-toolbar .x-toggle-field .x-component-outer{padding:0em .3em}.x-toolbar .x-field{width:13em;padding:.5em;min-height:0;border-bottom:0;background:transparent}.x-toolbar .x-field .x-clear-icon{background-size:50% 50%;right:-0.8em;margin-top:-1.06em}.x-toolbar .x-field-input{padding-right:1.6em !important}.x-toolbar .x-field-textarea .x-component-outer,.x-toolbar .x-field-text .x-component-outer,.x-toolbar .x-field-number .x-component-outer,.x-toolbar .x-field-search .x-component-outer{background-color:#fff;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em;-moz-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0 inset,rgba(0,0,0,0.5) 0 -0.1em 0 inset,rgba(0,0,0,0.5) 0.1em 0 0 inset,rgba(0,0,0,0.5) -0.1em 0 0 inset,rgba(0,0,0,0.5) 0 0.15em 0.4em inset;-webkit-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0 inset,rgba(0,0,0,0.5) 0 -0.1em 0 inset,rgba(0,0,0,0.5) 0.1em 0 0 inset,rgba(0,0,0,0.5) -0.1em 0 0 inset,rgba(0,0,0,0.5) 0 0.15em 0.4em inset;box-shadow:rgba(0,0,0,0.5) 0 0.1em 0 inset,rgba(0,0,0,0.5) 0 -0.1em 0 inset,rgba(0,0,0,0.5) 0.1em 0 0 inset,rgba(0,0,0,0.5) -0.1em 0 0 inset,rgba(0,0,0,0.5) 0 0.15em 0.4em inset}.x-toolbar .x-form-label{background:transparent;border:0;padding:0;line-height:1.4em}.x-toolbar .x-form-field{height:1.6em;color:#6e6e6e;background:transparent;min-height:0;-webkit-appearance:none;padding:0em .3em;margin:0}.x-toolbar .x-form-field:focus{color:#000}.x-toolbar .x-field-select .x-component-outer,.x-toolbar .x-field-search .x-component-outer{-moz-border-radius:.8em;-webkit-border-radius:.8em;border-radius:.8em}.x-toolbar .x-field-search .x-field-input{background-position:.5em 50%}.x-toolbar .x-field-select{-webkit-box-shadow:none}.x-toolbar .x-field-select .x-form-field{height:1.4em}.x-toolbar .x-field-select{background:transparent}.x-toolbar .x-field-select .x-component-outer:after{right:.4em}.x-toolbar .x-field-select.x-item-disabled .x-component-outer:after{opacity:.6}.x-toolbar .x-field-select .x-component-outer:before{width:3em;border-left:none;-moz-border-radius-topright:.8em;-webkit-border-top-right-radius:.8em;border-top-right-radius:.8em;-moz-border-radius-bottomright:.8em;-webkit-border-bottom-right-radius:.8em;border-bottom-right-radius:.8em;-webkit-mask:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAABCAYAAACc0f2yAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADJJREFUeNpi/P//PwMjIyMbAwMDOxRzAjEXFHMDMQ8a5kXC6HLcSHo5kcwEmU9TABBgAOcTBAFcRiSpAAAAAElFTkSuQmCC');-webkit-mask-position:right top;-webkit-mask-repeat:repeat-y;-webkit-mask-size:3em 0.05em}.x-toolbar .x-field-select .x-input-text{color:#fff}.x-android .x-field-search .x-field-input{padding-left:.2em !important;padding-right:2.2em !important}.x-toast{margin:.5em;border:0.15em solid #cbcbcb;-moz-box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;-webkit-box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-toast .x-toast-text{padding:6px 0;line-height:1.4em}.x-msgbox-dark .x-msgbox-text{color:rgba(255,255,255,0.9);text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-msgbox-dark .x-msgbox-input{background-image:none;background-color:rgba(255,255,255,0.9);background-image:-webkit-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-moz-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-o-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-ms-linear-gradient(to bottom, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));border:0.1em solid rgba(203,203,203,0.9)}.x-menu{padding:.7em;background-image:none;background-color:rgba(101,101,101,0.9);background-image:-webkit-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-moz-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-o-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-ms-linear-gradient(to bottom, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9))}.x-menu .x-button{margin-bottom:.7em}.x-menu .x-button:last-child{margin-bottom:0}.x-form .x-scroll-container{background-color:#eee}.x-form .x-toolbar .x-scroll-container{background-color:transparent}.x-form-label{text-shadow:#fff 0 1px 1px;color:#333;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0;padding:.6em;background-color:#f7f7f7;color:#080808}.x-form-label span{font-size:.8em}.x-form-fieldset{margin:.5em .5em 1.5em}.x-form-fieldset .x-form-label{border-top:1px solid #fff}.x-form-fieldset .x-form-fieldset-inner{border:1px solid #ddd;background:#fff;padding:0;-moz-border-radius:.4em;-webkit-border-radius:.4em;border-radius:.4em}.x-form-fieldset .x-field{border-bottom:1px solid #ddd;background:transparent}.x-form-fieldset .x-field:first-child{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-form-fieldset .x-field:last-child{border-bottom:0;-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-form-fieldset-title{text-shadow:#fff 0 1px 1px;color:#333;margin:1em .7em 0.3em;color:#333}.x-form-fieldset-instructions{text-shadow:#fff 0 1px 1px;color:#333;color:gray;margin:1em .7em 0.3em;font-size:.8em}.x-label-align-left:first-child .x-form-label{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em}.x-label-align-left:last-child .x-form-label{-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em}.x-label-align-right:first-child .x-form-label{-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-label-align-right:last-child{border-bottom:0}.x-label-align-right:last-child .x-form-label{-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-label-align-top:first-child .x-form-label{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-label-align-bottom:last-child .x-form-label{-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-field{min-height:2.5em;background:#fff}.x-field:last-child{border-bottom:0}.x-field-label{background-color:#f7f7f7;color:#080808}.x-field-input .x-clear-icon{background:url('data:image/png;base64,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') no-repeat;background-position:center center;background-size:55% 55%;width:2.2em;height:2.2em;margin:.5em;margin-top:-1.1em;right:-.5em}.x-field-clearable .x-field-input{padding-right:2.2em}.x-input-el{padding:.4em;min-height:2.5em;border-width:0;-webkit-appearance:none}.x-ie .x-input-el{background:transparent}.x-item-disabled .x-form-label,.x-item-disabled input,.x-item-disabled .x-input-el,.x-item-disabled .x-spinner-body,.x-item-disabled select,.x-item-disabled textarea,.x-item-disabled .x-field-clear-container{color:#b3b3b3;pointer-events:none}.x-item-disabled .x-form-label{color:#aaa}.x-item-disabled .x-form-label:after{color:#666 !important}.x-checkmark-base,.x-field-checkbox .x-field-mask::after,.x-field-radio .x-field-mask::after,.x-select-overlay .x-item-selected.x-list-item::after{position:absolute;top:0;right:10px;bottom:0;content:'3';font-family:'Pictos';font-size:1.6em;text-align:right;line-height:1.6em}.x-field-checkbox .x-field-mask::after,.x-field-radio .x-field-mask::after{color:#ddd}.x-input-checkbox,.x-input-radio{visibility:hidden}.x-input-el:checked+.x-field-mask::after{color:#688AD2}.x-item-disabled.x-field-checkbox .x-input-checkbox:checked+.x-field-mask::after{color:#aebcd9}.x-field-radio .x-field-mask{position:absolute;top:0;right:0;bottom:0;left:0}.x-field-radio .x-field-mask::after{content:'';position:absolute;width:16px;height:16px;top:16px;left:auto;right:16px;background-color:#d0d0d0;-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px}.x-field-radio .x-field-mask::before{content:'';position:absolute;width:26px;height:26px;top:11px;left:auto;right:11px;background-color:#ddd;-moz-border-radius:26px;-webkit-border-radius:26px;border-radius:26px}.x-input-radio:checked+.x-field-mask::after{background:#688AD2}.x-item-disabled.x-field-radio .x-input-radio:checked+.x-field-mask::after{background:#aebcd9}.x-field-search .x-field-input{position:relative}.x-field-search .x-field-input:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"s"}.x-field-search .x-field-input:before{color:#ccc;top:.7em;left:.5em;font-size:1.1em;right:auto}.x-toolbar .x-field-search .x-field-input:before{top:.3em}.x-field-search .x-field-input .x-form-field{margin-left:1em}.x-webkit .x-selectmark-base,.x-webkit .x-field-select .x-component-outer:after,.x-field-select .x-webkit .x-component-outer:after{content:'';position:absolute;width:1em;height:1em;top:50%;left:auto;right:.7em;-webkit-mask-size:1em;-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTJDQUMyNUQwRUE4NjdEQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxQTFBMDFDQ0I5NEYxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyMkRCMDIxMkI5NEUxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjMwRTE0QzVBNDIyMjY4MTFCQ0ZCOTAzOTcwNzcyRkVCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MkNBQzI1RDBFQTg2N0RCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+HfrH/AAAAeVJREFUeNrs2cFHBGEUAPA3zYqIiIhOnTpFRHSKrp26RqeuEV077R/QqWtE166dOkVERHRa9hQRnZalFcv0Hk/W1Mx+38z3vvlm5j3eZW+/9+abne+9KEkSaFPMQMtCwQpWsIIVrGAFK1jBClawgo2ik/4hiqJGwLKuvfpIc5xSkWqYr5hzU1s/mRNxXTPsJ+ZqluvXlwOmSj3XBDvG3M1rpAmYYoUrFzr4ZNqTawqm2MH8Dhh7ZXJUbcAUx4FinzBnJcAUl4FhP/jIgRSYKvkYCJaO2LbNv08RMMUy5nsA4COTLy0XYIqtil9iF6aflq7AwBWuAvuQ9ZKSBgNX2ieWjtKSzeXBNZgqfe8J+4W5aXtbcg0GrvibB/BhkeuhBJhigzsghT0veh+WAlMcCGHvMOMQwcCdcIntYy6WmXhIg2PuiAvsEHO97IhHGgzckb4D8L6LmZYPMHBnhiWwXVdDPF9g4A4Vwd66nFr6BAN3ygbbw1yoMzjmjplgB5hrrufSvsHAHesZDOD2JAbxVYCBOzfIAZ9JbR6qAgN3cPwP9kZy1VIlGLiTdluCmoOBO/pnS9Bk8DzmS3pL4BMcpZEe1qX0GI/atC4dQYXRMa1MU0IX4gpWsIIVrGAFK1jBCnYUPwIMAPUPAyFL+nRdAAAAAElFTkSuQmCC');margin-top:-.5em}.x-field-select{position:relative;z-index:1}.x-field-select .x-component-outer:after{z-index:2;background-color:#ddd}.x-field-select .x-component-outer:before,.x-field-select .x-component-outer:after{pointer-events:none;position:absolute;display:block}.x-select-overlay .x-list-item-label{height:2.6em}.x-select-overlay .x-item-selected .x-list-label{margin-right:2.6em}.x-select-overlay .x-item-selected.x-list-item::after{color:#ddd}.x-spinner .x-field-input .x-input-el{-webkit-text-fill-color:#000}.x-spinner.x-item-disabled .x-input-el{-webkit-text-fill-color:#B3B3B3}.x-spinner.x-item-disabled .x-spinner-button{color:#aaa !important}.x-spinner.x-item-disabled .x-spinner-button,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button{border:1px solid #c4c4c4;border-top-color:#d0d0d0;background-color:#f7f7f7;color:#1e1e1e}.x-spinner.x-item-disabled .x-spinner-button.x-button-back:before,.x-spinner.x-item-disabled .x-spinner-button.x-button-forward:before,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-back:before,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-forward:before{background:#c4c4c4}.x-spinner.x-item-disabled .x-spinner-button,.x-spinner.x-item-disabled .x-spinner-button.x-button-back:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-forward:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-back:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-forward:after{background-image:none;background-color:#f7f7f7;background-image:-webkit-linear-gradient(top, #ffffff,#ffffff 3%,#eaeaea);background-image:-moz-linear-gradient(top, #ffffff,#ffffff 3%,#eaeaea);background-image:-o-linear-gradient(top, #ffffff,#ffffff 3%,#eaeaea);background-image:-ms-linear-gradient(to bottom, #ffffff,#ffffff 3%,#eaeaea)}.x-spinner.x-item-disabled .x-spinner-button.x-button-pressing,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressing:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressed,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressed:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-active,.x-spinner.x-item-disabled .x-spinner-button.x-button-active:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressing,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressing:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressed,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressed:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-active,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-active:after{background-image:none;background-color:#efefef;background-image:-webkit-linear-gradient(top, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0);background-image:-moz-linear-gradient(top, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0);background-image:-o-linear-gradient(top, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0);background-image:-ms-linear-gradient(to bottom, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0)}.x-spinner .x-spinner-button{margin-top:.25em;margin-bottom:.25em;width:2em;padding:.23em 0 .27em;font-weight:bold;text-align:center;border:1px solid #ddd !important;-moz-border-radius:1em;-webkit-border-radius:1em;border-radius:1em}.x-spinner .x-spinner-button,.x-toolbar .x-spinner .x-spinner-button{border:1px solid #b7b7b7;border-top-color:#c4c4c4;background-color:#eaeaea;color:#111}.x-spinner .x-spinner-button.x-button-back:before,.x-spinner .x-spinner-button.x-button-forward:before,.x-toolbar .x-spinner .x-spinner-button.x-button-back:before,.x-toolbar .x-spinner .x-spinner-button.x-button-forward:before{background:#b7b7b7}.x-spinner .x-spinner-button,.x-spinner .x-spinner-button.x-button-back:after,.x-spinner .x-spinner-button.x-button-forward:after,.x-toolbar .x-spinner .x-spinner-button,.x-toolbar .x-spinner .x-spinner-button.x-button-back:after,.x-toolbar .x-spinner .x-spinner-button.x-button-forward:after{background-image:none;background-color:#eaeaea;background-image:-webkit-linear-gradient(top, #ffffff,#f7f7f7 3%,#dddddd);background-image:-moz-linear-gradient(top, #ffffff,#f7f7f7 3%,#dddddd);background-image:-o-linear-gradient(top, #ffffff,#f7f7f7 3%,#dddddd);background-image:-ms-linear-gradient(to bottom, #ffffff,#f7f7f7 3%,#dddddd)}.x-spinner .x-spinner-button.x-button-pressing,.x-spinner .x-spinner-button.x-button-pressing:after,.x-spinner .x-spinner-button.x-button-pressed,.x-spinner .x-spinner-button.x-button-pressed:after,.x-spinner .x-spinner-button.x-button-active,.x-spinner .x-spinner-button.x-button-active:after,.x-toolbar .x-spinner .x-spinner-button.x-button-pressing,.x-toolbar .x-spinner .x-spinner-button.x-button-pressing:after,.x-toolbar .x-spinner .x-spinner-button.x-button-pressed,.x-toolbar .x-spinner .x-spinner-button.x-button-pressed:after,.x-toolbar .x-spinner .x-spinner-button.x-button-active,.x-toolbar .x-spinner .x-spinner-button.x-button-active:after{background-image:none;background-color:#e2e2e2;background-image:-webkit-linear-gradient(top, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3);background-image:-moz-linear-gradient(top, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3);background-image:-o-linear-gradient(top, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3);background-image:-ms-linear-gradient(to bottom, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3)}.x-spinner .x-spinner-button-down{margin-left:.25em}.x-spinner .x-spinner-button-up{margin-right:.25em}.x-spinner.x-field-grouped-buttons .x-spinner-button-down{margin-right:.5em}.x-android .x-spinner-button{padding:.40em 0 .11em !important}.x-ie .x-spinner .x-field-input .x-input-el:disabled{color:#000}.x-list{background-color:#f7f7f7}.x-list .x-list-disclosure{position:relative;overflow:visible;border:0;-moz-border-radius:32px;-webkit-border-radius:32px;border-radius:32px;background-image:none;background-color:#5e86dc;background-image:-webkit-linear-gradient(top, #9db6ea,#7396e0 3%,#4977d7);background-image:-moz-linear-gradient(top, #9db6ea,#7396e0 3%,#4977d7);background-image:-o-linear-gradient(top, #9db6ea,#7396e0 3%,#4977d7);background-image:-ms-linear-gradient(to bottom, #9db6ea,#7396e0 3%,#4977d7);width:32px;height:32px;margin:7px 7px 0 0}.x-list .x-list-disclosure:before{position:absolute;top:0;right:0;bottom:0;left:0;content:']';font-family:'Pictos';color:#fff;font-size:24px;text-align:center;line-height:35px;text-shadow:0 0 0}.x-list.x-list-indexed .x-list-disclosure{margin-right:1.8em}.x-list .x-item-selected .x-list-disclosure{background:#fff none}.x-list .x-item-selected .x-list-disclosure:before{color:#688AD2}.x-list .x-list-item{color:#000}.x-list .x-list-item.x-item-selected .x-dock-horizontal,.x-list .x-list-item.x-item-selected.x-list-item-tpl{background-image:none;background-color:#688AD2;background-image:-webkit-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-moz-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-o-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-ms-linear-gradient(to bottom, #a3b8e4,#7c99d8 3%,#547bcc);color:#fff}.x-list .x-list-item.x-item-pressed.x-list-item-tpl,.x-list .x-list-item.x-item-pressed .x-dock-horizontal{background:#fff none}.x-list .x-list-item .x-list-item-body,.x-list .x-list-item.x-list-item-tpl .x-innerhtml{padding:12px 15px}.x-list-normal .x-list-header{background-image:none;background-color:#fefefe;background-image:-webkit-linear-gradient(top, #ffffff,#ffffff 3%,#f3f0f0);background-image:-moz-linear-gradient(top, #ffffff,#ffffff 3%,#f3f0f0);background-image:-o-linear-gradient(top, #ffffff,#ffffff 3%,#f3f0f0);background-image:-ms-linear-gradient(to bottom, #ffffff,#ffffff 3%,#f3f0f0);color:#b9aaaa;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0;border-top:1px solid #fefefe;border-bottom:1px solid #d0c6c6;font-weight:bold;font-size:0.8em;padding:0.2em 1.02em}.x-list-normal .x-list-item.x-list-item-tpl,.x-list-normal .x-list-item .x-dock-horizontal{border-top:1px solid #dedede}.x-list-normal .x-list-item.x-list-item-tpl.x-list-footer-wrap,.x-list-normal .x-list-item.x-list-footer-wrap .x-dock-horizontal{border-bottom:1px solid #dedede}.x-list-normal .x-list-item.x-item-pressed.x-list-item-tpl,.x-list-normal .x-list-item.x-item-pressed .x-dock-horizontal{border-top-color:#fff;background-color:#fff}.x-list-normal .x-list-item.x-item-selected.x-list-item-tpl,.x-list-normal .x-list-item.x-item-selected .x-dock-horizontal{border-top-color:#688AD2}.x-list-round .x-scroll-view{background-color:#eee}.x-list-round .x-list-header-swap{padding-right:13px}.x-list-round .x-list-inner .x-scroll-container{top:13px;left:13px;bottom:13px;right:13px;width:auto !important;height:auto !important}.x-list-round .x-list-header{color:#777;font-size:1em;font-weight:bold;padding-left:26px;line-height:1.7em;background-image:-webkit-linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4));background-image:-moz-linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4));background-image:-o-linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4));background-image:-ms-linear-gradient(to bottom, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4))}.x-list-round .x-list-container{padding:13px 13px 0 13px}.x-list-round .x-list-container .x-list-header{padding-left:13px;background-image:none}.x-list-round.x-list-ungrouped .x-list-item-tpl,.x-list-round.x-list-ungrouped .x-list-item .x-dock-horizontal,.x-list-round.x-list-grouped .x-list-item-tpl,.x-list-round.x-list-grouped .x-list-item .x-dock-horizontal{border:1px solid #dedede;border-width:1px 1px 0 1px;background:#f7f7f7}.x-list-round.x-list-ungrouped .x-list-item-first{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-list-round.x-list-ungrouped .x-list-item-last{-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em;border-width:1px;margin-bottom:13px}.x-list-round.x-list-grouped .x-list-header-wrap .x-dock-horizontal{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-list-round.x-list-grouped .x-list-header-wrap.x-list-header{border:1px solid #dedede;border-width:1px 1px 0 1px;-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-list-round.x-list-grouped .x-list-footer-wrap{background:transparent}.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-tpl,.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal{border:none;background:transparent;padding-bottom:13px;margin-bottom:13px}.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-tpl>.x-innerhtml,.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-tpl>.x-dock-body,.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal>.x-innerhtml,.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal>.x-dock-body{border:1px solid #dedede;background:#f7f7f7;-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-pressed>.x-innerhtml,.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-pressed>.x-dock-body{background:#fff none}.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-selected>.x-innerhtml,.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-selected>.x-dock-body{background-image:none;background-color:#688AD2;background-image:-webkit-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-moz-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-o-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-ms-linear-gradient(to bottom, #a3b8e4,#7c99d8 3%,#547bcc);color:#fff}.x-list-round .x-indexbar-vertical{margin-right:20px}.x-list-round .x-list-footer-wrap.x-list-item-last.x-list-item-odd.x-list-item.x-list-item-tpl{background-color:transparent !important}.x-list-round.x-list-grouped .x-list-item-odd.x-list-footer-wrap>.x-innerhtml,.x-list-round.x-list-grouped .x-list-item-odd.x-list-footer-wrap>.x-dock-body{background-color:#eaeaea !important}.x-list .x-list-item-odd.x-list-item-tpl,.x-list .x-list-item-odd .x-dock-horizontal{background-color:#eaeaea !important;border-bottom:1px solid #eaeaea}.x-picker .x-picker-inner{background-color:#fff;overflow:hidden;margin:.7em;-moz-border-radius:.4em;-webkit-border-radius:.4em;border-radius:.4em;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-background-clip:padding;background-clip:padding-box;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #bbb), color-stop(30%, #fff), color-stop(70%, #fff), color-stop(100%, #bbb));background:-webkit-linear-gradient(top, #bbb 0%, #fff 30%, #fff 70%, #bbb 100%)}.x-picker-slot .x-scroll-view{-moz-box-shadow:rgba(0,0,0,0.4) -1px 0 1px;-webkit-box-shadow:rgba(0,0,0,0.4) -1px 0 1px;box-shadow:rgba(0,0,0,0.4) -1px 0 1px}.x-picker-slot .x-scroll-view:first-child{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.x-picker-bar{border-top:0.12em solid #688AD2;border-bottom:0.12em solid #688AD2;height:2.5em;background-image:none;background-color:rgba(13,86,242,0.3);background-image:-webkit-linear-gradient(top, rgba(85,137,246,0.3),rgba(37,103,244,0.3) 3%,rgba(11,78,218,0.3));background-image:-moz-linear-gradient(top, rgba(85,137,246,0.3),rgba(37,103,244,0.3) 3%,rgba(11,78,218,0.3));background-image:-o-linear-gradient(top, rgba(85,137,246,0.3),rgba(37,103,244,0.3) 3%,rgba(11,78,218,0.3));background-image:-ms-linear-gradient(to bottom, rgba(85,137,246,0.3),rgba(37,103,244,0.3) 3%,rgba(11,78,218,0.3));-moz-box-shadow:rgba(0,0,0,0.2) 0 0.2em 0.2em;-webkit-box-shadow:rgba(0,0,0,0.2) 0 0.2em 0.2em;box-shadow:rgba(0,0,0,0.2) 0 0.2em 0.2em}.x-use-titles .x-picker-bar{margin-top:1.5em}.x-picker-slot-title{height:1.5em;border-top:1px solid #dcd4d4;border-bottom:1px solid #ae9c9c;padding:0.2em 1.02em;-moz-box-shadow:rgba(0,0,0,0.3) 0px 0.1em 0.3em;-webkit-box-shadow:rgba(0,0,0,0.3) 0px 0.1em 0.3em;box-shadow:rgba(0,0,0,0.3) 0px 0.1em 0.3em;background-image:none;background-color:#dcd4d4;background-image:-webkit-linear-gradient(top, #fefefe,#e7e2e2 3%,#d0c6c6);background-image:-moz-linear-gradient(top, #fefefe,#e7e2e2 3%,#d0c6c6);background-image:-o-linear-gradient(top, #fefefe,#e7e2e2 3%,#d0c6c6);background-image:-ms-linear-gradient(to bottom, #fefefe,#e7e2e2 3%,#d0c6c6)}.x-picker-slot-title>div{font-size:0.8em;color:#8b8b8b;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0}.x-picker-slot{border-left:2px solid #acacac}.x-picker-slot .x-dataview-item{height:2.5em;line-height:2.5em;font-weight:bold;padding:0 10px}.x-picker-slot:first-child{border-left:0}.x-toggle{width:4.4em;border:1px solid #b7b7b7;background-image:none;background-color:#ddd;background-image:-webkit-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:-moz-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:-o-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:-ms-linear-gradient(to bottom, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);-moz-border-radius:1.1em;-webkit-border-radius:1.1em;border-radius:1.1em}.x-toggle .x-thumb.x-dragging{opacity:1}.x-toggle .x-thumb:before{top:.175em}.x-toggle-on{background-image:none;background-color:#92cf00;background-image:-webkit-linear-gradient(top, #6e9c00,#80b600 10%,#92cf00 65%,#94d200);background-image:-moz-linear-gradient(top, #6e9c00,#80b600 10%,#92cf00 65%,#94d200);background-image:-o-linear-gradient(top, #6e9c00,#80b600 10%,#92cf00 65%,#94d200);background-image:-ms-linear-gradient(to bottom, #6e9c00,#80b600 10%,#92cf00 65%,#94d200)}.x-button.border-radius-10{-moz-border-radius:10px !important;-webkit-border-radius:10px;border-radius:10px !important}.x-dataview.color .x-dataview-inner.x-scroll-scroller{width:auto !important;height:auto !important;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-dataview.color .x-dataview-inner.x-scroll-scroller .x-dataview-container{margin-top:12px;margin-left:12px}.x-dataview.color .x-dataview-item{display:inline-block}.x-dataview.color .x-dataview-item.x-item-selected .item-inner{-moz-box-shadow:#3ba8ff 0 0 0 4px;-webkit-box-shadow:#3ba8ff 0 0 0 4px;box-shadow:#3ba8ff 0 0 0 4px}.x-dataview.color .x-dataview-item .item-inner{display:inline-block;width:50px;height:50px;border:1px solid #d8d8d8;margin:6px}.x-list.settings{-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-list.settings.x-list-round .x-scroll-view{-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-list.settings.x-list-round.x-list-grouped .x-list-header-wrap .x-dock-horizontal{padding-top:0}.x-list.settings.x-list-round.x-list-grouped .x-list-header-wrap .x-list-header{display:none}.x-list.settings.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-last .x-dock-horizontal{padding-bottom:0}.x-list.settings.x-list-round.x-list-grouped .x-list-item .x-dock-horizontal{border:1px solid #bcbcbc;border-width:1px 1px 0 1px;background:#fff}.x-list.settings.x-list-round.x-list-grouped .x-list-item .x-dock-horizontal .x-innerhtml{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-pressed .x-dock-horizontal{background-image:-webkit-linear-gradient(top, #7c99d8,#416cc6);background-image:-moz-linear-gradient(top, #7c99d8,#416cc6);background-image:-o-linear-gradient(top, #7c99d8,#416cc6);background-image:-ms-linear-gradient(to bottom, #7c99d8,#416cc6);color:#fff}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-pressed .x-dock-horizontal .disclosure{background-position:-24px 0}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-selected .x-dock-horizontal{color:inherit}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-selected .x-dock-horizontal .x-list-item-body{padding-right:1.2em}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-selected .x-dock-horizontal:after{content:"";width:24px;height:24px;position:absolute;top:11px;right:11px;background-image:url("../img/icons/list-retina.png");background-size:72px 48px;background-position:0 -24px}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-selected.x-item-pressed .x-dock-horizontal{color:#fff}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-selected.x-item-pressed .x-dock-horizontal:after{background-position:-24px -24px}.x-list.settings.x-list-round.x-list-grouped .x-list-item .list-icon{width:24px;height:24px;position:absolute}.x-list.settings.x-list-round.x-list-grouped .x-list-item .icon-offset{margin-left:30px}.x-list.settings.x-list-round.x-list-grouped .x-list-item .disclosure{right:12px;background-image:url("../img/icons/list-retina.png");background-size:72px 48px;background-position:0 0}.x-list.settings.x-list-round.x-list-grouped .x-list-header-wrap.x-list-footer-wrap .x-dock-body{-moz-border-radius:.4em;-webkit-border-radius:.4em;border-radius:.4em}.x-list.settings.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal{border:none;background:transparent;padding-bottom:13.8px}.x-list.settings.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal>.x-dock-body{border:1px solid #bcbcbc;background:#fff}.x-list.settings.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-pressed .x-dock-horizontal{background:transparent}.x-list.settings.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-pressed .x-dock-horizontal>.x-dock-body{-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em;background-image:-webkit-linear-gradient(top, #7c99d8,#416cc6);background-image:-moz-linear-gradient(top, #7c99d8,#416cc6);background-image:-o-linear-gradient(top, #7c99d8,#416cc6);background-image:-ms-linear-gradient(to bottom, #7c99d8,#416cc6);color:#fff}.x-msgbox{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #989898,#656565 10%,#656565);background-image:-moz-linear-gradient(top, #989898,#656565 10%,#656565);background-image:-o-linear-gradient(top, #989898,#656565 10%,#656565);background-image:-ms-linear-gradient(to bottom, #989898,#656565 10%,#656565)}.x-msgbox .x-toolbar.x-docked-bottom .x-button .x-button-label,.x-msgbox .x-toolbar.x-docked-bottom .x-button .x-badge{font-size:.9em;line-height:2em}.x-msgbox .x-title{font-size:1em;line-height:1.4em;color:#ffffff;text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-dataview.icon-view .x-dataview-inner.x-scroll-scroller{width:auto !important;height:auto !important}.x-dataview.icon-view .x-dataview-inner.x-scroll-scroller .x-dataview-container{margin-top:12px;margin-left:12px}.x-dataview.icon-view .x-dataview-item{display:inline-block}.x-dataview.icon-view .x-dataview-item.x-item-pressed .item-inner,.x-dataview.icon-view .x-dataview-item.x-item-selected .item-inner{background-image:-webkit-linear-gradient(top, #7c99d8,#416cc6);background-image:-moz-linear-gradient(top, #7c99d8,#416cc6);background-image:-o-linear-gradient(top, #7c99d8,#416cc6);background-image:-ms-linear-gradient(to bottom, #7c99d8,#416cc6);color:#fff}.x-dataview.icon-view .x-dataview-item .item-inner{display:inline-block;width:77px;height:77px;border:1px solid #bcbcbc;background:#fff;margin:-1px}.x-dataview.icon-view .x-dataview-item .item-inner.top-left{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em}.x-dataview.icon-view .x-dataview-item .item-inner.top-right{-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-dataview.icon-view .x-dataview-item .item-inner.bottom-left{-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em}.x-dataview.icon-view .x-dataview-item .item-inner.bottom-right{-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-0{background-position:0 0px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-0,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-0{background-position:-24px 0px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-1{background-position:0 -24px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-1,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-1{background-position:-24px -24px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-2{background-position:0 -48px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-2,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-2{background-position:-24px -48px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-3{background-position:0 -72px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-3,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-3{background-position:-24px -72px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-4{background-position:0 -96px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-4,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-4{background-position:-24px -96px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-5{background-position:0 -120px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-5,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-5{background-position:-24px -120px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-6{background-position:0 -144px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-6,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-6{background-position:-24px -144px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-7{background-position:0 -168px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-7,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-7{background-position:-24px -168px}.x-dataview.icon-view.bullets .item-inner .text{margin-top:1.4em;text-align:center}.x-dataview.icon-view.bullets .item-inner .icon{width:24px;height:24px;margin:1.4em auto;background-image:url("../img/icons/bullets-retina.png");background-size:48px 168px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-0{background-position:0 0px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-0,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-0{background-position:-74px 0px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-1{background-position:0 -74px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-1,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-1{background-position:-74px -74px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-2{background-position:0 -148px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-2,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-2{background-position:-74px -148px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-3{background-position:0 -222px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-3,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-3{background-position:-74px -222px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-4{background-position:0 -296px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-4,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-4{background-position:-74px -296px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-5{background-position:0 -370px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-5,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-5{background-position:-74px -370px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-6{background-position:0 -444px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-6,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-6{background-position:-74px -444px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-7{background-position:0 -518px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-7,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-7{background-position:-74px -518px}.x-dataview.icon-view.numbering .item-inner .text{position:relative;top:1.4em;text-align:center}.x-dataview.icon-view.numbering .item-inner .icon{width:74px;height:74px;margin:0 auto;background-image:url("../img/icons/numbering-retina.png");background-size:148px 518px}.x-dataview.icon-view.outline .x-dataview-item .icon.outline-0{background-position:0 0px}.x-dataview.icon-view.outline .x-dataview-item.x-item-selected .icon.outline-0,.x-dataview.icon-view.outline .x-dataview-item.x-item-pressed .icon.outline-0{background-position:-74px 0px}.x-dataview.icon-view.outline .x-dataview-item .icon.outline-1{background-position:0 -74px}.x-dataview.icon-view.outline .x-dataview-item.x-item-selected .icon.outline-1,.x-dataview.icon-view.outline .x-dataview-item.x-item-pressed .icon.outline-1{background-position:-74px -74px}.x-dataview.icon-view.outline .x-dataview-item .icon.outline-2{background-position:0 -148px}.x-dataview.icon-view.outline .x-dataview-item.x-item-selected .icon.outline-2,.x-dataview.icon-view.outline .x-dataview-item.x-item-pressed .icon.outline-2{background-position:-74px -148px}.x-dataview.icon-view.outline .item-inner .text{position:relative;top:1.4em;text-align:center}.x-dataview.icon-view.outline .item-inner .icon{width:74px;height:74px;margin:0 auto;background-image:url("../img/icons/outline-retina.png");background-size:148px 222px}.x-panel.x-panel-settings{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #ececec,#cbcbcb);background-image:-moz-linear-gradient(top, #ececec,#cbcbcb);background-image:-o-linear-gradient(top, #ececec,#cbcbcb);background-image:-ms-linear-gradient(to bottom, #ececec,#cbcbcb);-moz-box-shadow:#fff 0 1px 0 inset,rgba(0,0,0,0.3) 0 0.2em 0.6em;-webkit-box-shadow:#fff 0 1px 0 inset,rgba(0,0,0,0.3) 0 0.2em 0.6em;box-shadow:#fff 0 1px 0 inset,rgba(0,0,0,0.3) 0 0.2em 0.6em;border:1px solid #797979}.x-panel.x-panel-settings .x-anchor-top{background-color:#797979;margin-top:-.62em;-moz-box-shadow:#fff 0 -1px 0 0 inset;-webkit-box-shadow:#fff 0 -1px 0 0 inset;box-shadow:#fff 0 -1px 0 0 inset}.x-panel.x-panel-settings .x-anchor-top:after{content:'';position:absolute;width:1.631em;height:.7em;-webkit-mask-size:1.631em .7em;background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #f1f1f1,#ececec);background-image:-moz-linear-gradient(top, #f1f1f1,#ececec);background-image:-o-linear-gradient(top, #f1f1f1,#ececec);background-image:-ms-linear-gradient(to bottom, #f1f1f1,#ececec);top:1px !important}.x-panel.x-panel-settings .x-anchor-bottom{height:.8em;background-color:#797979;margin-top:-0.15em;-moz-box-shadow:#fff 0 -1px 0 0 inset;-webkit-box-shadow:#fff 0 -1px 0 0 inset;box-shadow:#fff 0 -1px 0 0 inset}.x-panel.x-panel-settings .x-anchor-bottom:after{content:'';position:absolute;width:1.631em;height:.8em;-webkit-mask-size:1.631em .7em;background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #cbcbcb,#bebebe);background-image:-moz-linear-gradient(top, #cbcbcb,#bebebe);background-image:-o-linear-gradient(top, #cbcbcb,#bebebe);background-image:-ms-linear-gradient(to bottom, #cbcbcb,#bebebe);top:-1px !important}.x-panel.x-panel-settings .x-panel-inner{background:transparent}.x-panel.x-panel-settings .x-navigation-bar{border-bottom:none;margin-top:-6px;background:transparent;overflow:hidden}.x-panel.x-panel-settings .x-navigation-bar .x-title{color:#323232;text-shadow:#fff 0 0.08em 0}.x-panel.x-panel-settings .x-navigationview.plain .x-navigationview-inner{background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.x-panel.x-panel-settings .x-navigationview.plain .x-navigationview-inner:after{content:none}.x-panel.x-panel-settings .x-navigationview-inner{background-color:#efefef;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-panel.x-panel-settings .x-navigationview-inner:after{content:'';position:absolute;width:100%;height:100%;top:0;left:0;pointer-events:none;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em;-moz-box-shadow:inset 0 1px 2px 2px #c8c8c8;-webkit-box-shadow:inset 0 1px 2px 2px #c8c8c8;box-shadow:inset 0 1px 2px 2px #c8c8c8;border:1px solid #797979}.x-label.info .x-innerhtml{color:#7f7f7f;text-shadow:0 1px 0 #fff;text-align:center}.btn-input-image input[type="file"]{opacity:0;position:absolute;left:0;top:0}.x-mask.transparent{background:transparent}.round{-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-list-header-wrap{-moz-border-radius-topleft:.3em !important;-webkit-border-top-left-radius:.3em !important;border-top-left-radius:.3em !important;-moz-border-radius-topright:.3em !important;-webkit-border-top-right-radius:.3em !important;border-top-right-radius:.3em !important}.x-list-header-wrap .x-innerhtml{-moz-border-radius-topleft:.3em !important;-webkit-border-top-left-radius:.3em !important;border-top-left-radius:.3em !important;-moz-border-radius-topright:.3em !important;-webkit-border-top-right-radius:.3em !important;border-top-right-radius:.3em !important}.x-list-header{display:none}.x-spinner.planar-spinner.x-field-grouped-buttons{background:transparent}.x-spinner.planar-spinner.x-field-grouped-buttons.x-field{min-height:0}.x-spinner.planar-spinner.x-field-grouped-buttons .x-form-label{background:transparent}.x-spinner.planar-spinner.x-field-grouped-buttons .x-form-label span{font-size:inherit}.x-spinner.planar-spinner.x-field-grouped-buttons .x-button{margin-top:9px;margin-bottom:9px;padding:0 8px !important}.x-spinner.planar-spinner.x-field-grouped-buttons .x-form-label{padding:0.16em}.x-spinner.planar-spinner.x-field-grouped-buttons .x-field-input{-moz-box-shadow:#b2b2b2 0 3px 4px -2px inset;-webkit-box-shadow:#b2b2b2 0 3px 4px -2px inset;box-shadow:#b2b2b2 0 3px 4px -2px inset;background:#fff;min-width:2.3em}.x-spinner.planar-spinner.x-field-grouped-buttons .x-field-input .x-input-el{text-align:center;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;padding:3px 0 4px;min-height:0;border-top:1px solid #898989;border-bottom:1px solid #898989}.x-spinner.planar-spinner.x-field-grouped-buttons .x-spinner-button{width:auto;border:1px solid #939393 !important;margin:0}.x-spinner.planar-spinner.x-field-grouped-buttons .x-spinner-button-down{margin-right:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.x-spinner.planar-spinner.x-field-grouped-buttons .x-spinner-button-up{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.x-toolbar{background-color:transparent}.x-toolbar-edit{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-moz-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-o-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-ms-linear-gradient(to bottom, #ffffff,#ececec 3%,#cbcbcb);border-color:#4c4c4c}.x-toolbar-edit .x-title{color:#000;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0}.x-toolbar-edit.x-docked-top{border-bottom:1px solid #939393}.x-toolbar-edit .x-button,.x-toolbar .x-toolbar-edit .x-button,.x-toolbar-edit .x-field-select .x-component-outer,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer,.x-toolbar-edit .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before{border:1px solid #8b8b8b;border-top-color:#989898;background-color:#bebebe;color:#000}.x-toolbar-edit .x-button.x-button-back:before,.x-toolbar-edit .x-button.x-button-forward:before,.x-toolbar .x-toolbar-edit .x-button.x-button-back:before,.x-toolbar .x-toolbar-edit .x-button.x-button-forward:before,.x-toolbar-edit .x-field-select .x-component-outer.x-button-back:before,.x-toolbar-edit .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-back:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-forward:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-forward:before{background:#8b8b8b}.x-toolbar-edit .x-button,.x-toolbar-edit .x-button.x-button-back:after,.x-toolbar-edit .x-button.x-button-forward:after,.x-toolbar .x-toolbar-edit .x-button,.x-toolbar .x-toolbar-edit .x-button.x-button-back:after,.x-toolbar .x-toolbar-edit .x-button.x-button-forward:after,.x-toolbar-edit .x-field-select .x-component-outer,.x-toolbar-edit .x-field-select .x-component-outer.x-button-back:after,.x-toolbar-edit .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-back:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar-edit .x-field-select .x-component-outer:before,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-forward:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-forward:after{background-image:none;background-color:#bebebe;background-image:-webkit-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-moz-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-o-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-ms-linear-gradient(to bottom, #e5e5e5,#cbcbcb 3%,#b2b2b2)}.x-toolbar-edit .x-button.x-button-pressing,.x-toolbar-edit .x-button.x-button-pressing:after,.x-toolbar-edit .x-button.x-button-pressed,.x-toolbar-edit .x-button.x-button-pressed:after,.x-toolbar-edit .x-button.x-button-active,.x-toolbar-edit .x-button.x-button-active:after,.x-toolbar .x-toolbar-edit .x-button.x-button-pressing,.x-toolbar .x-toolbar-edit .x-button.x-button-pressing:after,.x-toolbar .x-toolbar-edit .x-button.x-button-pressed,.x-toolbar .x-toolbar-edit .x-button.x-button-pressed:after,.x-toolbar .x-toolbar-edit .x-button.x-button-active,.x-toolbar .x-toolbar-edit .x-button.x-button-active:after,.x-toolbar-edit .x-field-select .x-component-outer.x-button-pressing,.x-toolbar-edit .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar-edit .x-field-select .x-component-outer.x-button-pressed,.x-toolbar-edit .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar-edit .x-field-select .x-component-outer.x-button-active,.x-toolbar-edit .x-field-select .x-component-outer.x-button-active:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-pressing,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-pressed,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-active,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-active:after,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-active,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-active:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-active,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-active:after{background-image:none;background-color:#b7b7b7;background-image:-webkit-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-moz-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-o-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-ms-linear-gradient(to bottom, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8)}.x-toolbar-edit .x-label,.x-toolbar-edit .x-form-label{font-weight:normal;color:#4c4c4c;text-shadow:0 1px 0 #fff}.x-toolbar{background-color:transparent}.x-toolbar-search{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #cbcbcb,#e7e7e7 20%,#e7e7e7);background-image:-moz-linear-gradient(top, #cbcbcb,#e7e7e7 20%,#e7e7e7);background-image:-o-linear-gradient(top, #cbcbcb,#e7e7e7 20%,#e7e7e7);background-image:-ms-linear-gradient(to bottom, #cbcbcb,#e7e7e7 20%,#e7e7e7);border-color:#4c4c4c}.x-toolbar-search .x-title{color:#000;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0}.x-toolbar-search.x-docked-top{border-bottom:1px solid #939393}.x-toolbar-search .x-button,.x-toolbar .x-toolbar-search .x-button,.x-toolbar-search .x-field-select .x-component-outer,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer,.x-toolbar-search .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before{border:1px solid #8b8b8b;border-top-color:#989898;background-color:#bebebe;color:#000}.x-toolbar-search .x-button.x-button-back:before,.x-toolbar-search .x-button.x-button-forward:before,.x-toolbar .x-toolbar-search .x-button.x-button-back:before,.x-toolbar .x-toolbar-search .x-button.x-button-forward:before,.x-toolbar-search .x-field-select .x-component-outer.x-button-back:before,.x-toolbar-search .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-back:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-forward:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-forward:before{background:#8b8b8b}.x-toolbar-search .x-button,.x-toolbar-search .x-button.x-button-back:after,.x-toolbar-search .x-button.x-button-forward:after,.x-toolbar .x-toolbar-search .x-button,.x-toolbar .x-toolbar-search .x-button.x-button-back:after,.x-toolbar .x-toolbar-search .x-button.x-button-forward:after,.x-toolbar-search .x-field-select .x-component-outer,.x-toolbar-search .x-field-select .x-component-outer.x-button-back:after,.x-toolbar-search .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-back:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar-search .x-field-select .x-component-outer:before,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-forward:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-forward:after{background-image:none;background-color:#bebebe;background-image:-webkit-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-moz-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-o-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-ms-linear-gradient(to bottom, #e5e5e5,#cbcbcb 3%,#b2b2b2)}.x-toolbar-search .x-button.x-button-pressing,.x-toolbar-search .x-button.x-button-pressing:after,.x-toolbar-search .x-button.x-button-pressed,.x-toolbar-search .x-button.x-button-pressed:after,.x-toolbar-search .x-button.x-button-active,.x-toolbar-search .x-button.x-button-active:after,.x-toolbar .x-toolbar-search .x-button.x-button-pressing,.x-toolbar .x-toolbar-search .x-button.x-button-pressing:after,.x-toolbar .x-toolbar-search .x-button.x-button-pressed,.x-toolbar .x-toolbar-search .x-button.x-button-pressed:after,.x-toolbar .x-toolbar-search .x-button.x-button-active,.x-toolbar .x-toolbar-search .x-button.x-button-active:after,.x-toolbar-search .x-field-select .x-component-outer.x-button-pressing,.x-toolbar-search .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar-search .x-field-select .x-component-outer.x-button-pressed,.x-toolbar-search .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar-search .x-field-select .x-component-outer.x-button-active,.x-toolbar-search .x-field-select .x-component-outer.x-button-active:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-pressing,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-pressed,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-active,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-active:after,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-active,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-active:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-active,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-active:after{background-image:none;background-color:#b7b7b7;background-image:-webkit-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-moz-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-o-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-ms-linear-gradient(to bottom, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8)}.x-toolbar-search .x-label,.x-toolbar-search .x-form-label{font-weight:normal;color:#4c4c4c;text-shadow:0 1px 0 #fff}.x-button-icon.save,.list-icon.save{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 0px;background-size:72px 888px}.x-button-pressing .x-button-icon.save,.x-button-pressing .list-icon.save,.x-button-pressed .x-button-icon.save,.x-button-pressed .list-icon.save,.x-button-active .x-button-icon.save,.x-button-active .list-icon.save,.x-item-pressed .x-button-icon.save,.x-item-pressed .list-icon.save{background-position:-24px 0px}.x-button-icon.undo,.list-icon.undo{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -24px;background-size:72px 888px}.x-button-pressing .x-button-icon.undo,.x-button-pressing .list-icon.undo,.x-button-pressed .x-button-icon.undo,.x-button-pressed .list-icon.undo,.x-button-active .x-button-icon.undo,.x-button-active .list-icon.undo,.x-item-pressed .x-button-icon.undo,.x-item-pressed .list-icon.undo{background-position:-24px -24px}.x-button-icon.share,.list-icon.share{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -48px;background-size:72px 888px}.x-button-pressing .x-button-icon.share,.x-button-pressing .list-icon.share,.x-button-pressed .x-button-icon.share,.x-button-pressed .list-icon.share,.x-button-active .x-button-icon.share,.x-button-active .list-icon.share,.x-item-pressed .x-button-icon.share,.x-item-pressed .list-icon.share{background-position:-24px -48px}.x-button-icon.font-style,.list-icon.font-style{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -72px;background-size:72px 888px}.x-button-pressing .x-button-icon.font-style,.x-button-pressing .list-icon.font-style,.x-button-pressed .x-button-icon.font-style,.x-button-pressed .list-icon.font-style,.x-button-active .x-button-icon.font-style,.x-button-active .list-icon.font-style,.x-item-pressed .x-button-icon.font-style,.x-item-pressed .list-icon.font-style{background-position:-24px -72px}.x-button-icon.font-color,.list-icon.font-color{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -96px;background-size:72px 888px}.x-button-pressing .x-button-icon.font-color,.x-button-pressing .list-icon.font-color,.x-button-pressed .x-button-icon.font-color,.x-button-pressed .list-icon.font-color,.x-button-active .x-button-icon.font-color,.x-button-active .list-icon.font-color,.x-item-pressed .x-button-icon.font-color,.x-item-pressed .list-icon.font-color{background-position:-24px -96px}.x-button-icon.bold,.list-icon.bold{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -120px;background-size:72px 888px}.x-button-pressing .x-button-icon.bold,.x-button-pressing .list-icon.bold,.x-button-pressed .x-button-icon.bold,.x-button-pressed .list-icon.bold,.x-button-active .x-button-icon.bold,.x-button-active .list-icon.bold,.x-item-pressed .x-button-icon.bold,.x-item-pressed .list-icon.bold{background-position:-24px -120px}.x-button-icon.italic,.list-icon.italic{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -144px;background-size:72px 888px}.x-button-pressing .x-button-icon.italic,.x-button-pressing .list-icon.italic,.x-button-pressed .x-button-icon.italic,.x-button-pressed .list-icon.italic,.x-button-active .x-button-icon.italic,.x-button-active .list-icon.italic,.x-item-pressed .x-button-icon.italic,.x-item-pressed .list-icon.italic{background-position:-24px -144px}.x-button-icon.underline,.list-icon.underline{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -168px;background-size:72px 888px}.x-button-pressing .x-button-icon.underline,.x-button-pressing .list-icon.underline,.x-button-pressed .x-button-icon.underline,.x-button-pressed .list-icon.underline,.x-button-active .x-button-icon.underline,.x-button-active .list-icon.underline,.x-item-pressed .x-button-icon.underline,.x-item-pressed .list-icon.underline{background-position:-24px -168px}.x-button-icon.align-left,.list-icon.align-left{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -192px;background-size:72px 888px}.x-button-pressing .x-button-icon.align-left,.x-button-pressing .list-icon.align-left,.x-button-pressed .x-button-icon.align-left,.x-button-pressed .list-icon.align-left,.x-button-active .x-button-icon.align-left,.x-button-active .list-icon.align-left,.x-item-pressed .x-button-icon.align-left,.x-item-pressed .list-icon.align-left{background-position:-24px -192px}.x-button-icon.align-center,.list-icon.align-center{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -216px;background-size:72px 888px}.x-button-pressing .x-button-icon.align-center,.x-button-pressing .list-icon.align-center,.x-button-pressed .x-button-icon.align-center,.x-button-pressed .list-icon.align-center,.x-button-active .x-button-icon.align-center,.x-button-active .list-icon.align-center,.x-item-pressed .x-button-icon.align-center,.x-item-pressed .list-icon.align-center{background-position:-24px -216px}.x-button-icon.align-right,.list-icon.align-right{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -240px;background-size:72px 888px}.x-button-pressing .x-button-icon.align-right,.x-button-pressing .list-icon.align-right,.x-button-pressed .x-button-icon.align-right,.x-button-pressed .list-icon.align-right,.x-button-active .x-button-icon.align-right,.x-button-active .list-icon.align-right,.x-item-pressed .x-button-icon.align-right,.x-item-pressed .list-icon.align-right{background-position:-24px -240px}.x-button-icon.align-fill,.list-icon.align-fill{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -264px;background-size:72px 888px}.x-button-pressing .x-button-icon.align-fill,.x-button-pressing .list-icon.align-fill,.x-button-pressed .x-button-icon.align-fill,.x-button-pressed .list-icon.align-fill,.x-button-active .x-button-icon.align-fill,.x-button-active .list-icon.align-fill,.x-item-pressed .x-button-icon.align-fill,.x-item-pressed .list-icon.align-fill{background-position:-24px -264px}.x-button-icon.bullets,.list-icon.bullets{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -288px;background-size:72px 888px}.x-button-pressing .x-button-icon.bullets,.x-button-pressing .list-icon.bullets,.x-button-pressed .x-button-icon.bullets,.x-button-pressed .list-icon.bullets,.x-button-active .x-button-icon.bullets,.x-button-active .list-icon.bullets,.x-item-pressed .x-button-icon.bullets,.x-item-pressed .list-icon.bullets{background-position:-24px -288px}.x-button-icon.spacing,.list-icon.spacing{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -312px;background-size:72px 888px}.x-button-pressing .x-button-icon.spacing,.x-button-pressing .list-icon.spacing,.x-button-pressed .x-button-icon.spacing,.x-button-pressed .list-icon.spacing,.x-button-active .x-button-icon.spacing,.x-button-active .list-icon.spacing,.x-item-pressed .x-button-icon.spacing,.x-item-pressed .list-icon.spacing{background-position:-24px -312px}.x-button-icon.page-number,.list-icon.page-number{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -336px;background-size:72px 888px}.x-button-pressing .x-button-icon.page-number,.x-button-pressing .list-icon.page-number,.x-button-pressed .x-button-icon.page-number,.x-button-pressed .list-icon.page-number,.x-button-active .x-button-icon.page-number,.x-button-active .list-icon.page-number,.x-item-pressed .x-button-icon.page-number,.x-item-pressed .list-icon.page-number{background-position:-24px -336px}.x-button-icon.insert,.list-icon.insert{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -360px;background-size:72px 888px}.x-button-pressing .x-button-icon.insert,.x-button-pressing .list-icon.insert,.x-button-pressed .x-button-icon.insert,.x-button-pressed .list-icon.insert,.x-button-active .x-button-icon.insert,.x-button-active .list-icon.insert,.x-item-pressed .x-button-icon.insert,.x-item-pressed .list-icon.insert{background-position:-24px -360px}.x-button-icon.search,.list-icon.search{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -384px;background-size:72px 888px}.x-button-pressing .x-button-icon.search,.x-button-pressing .list-icon.search,.x-button-pressed .x-button-icon.search,.x-button-pressed .list-icon.search,.x-button-active .x-button-icon.search,.x-button-active .list-icon.search,.x-item-pressed .x-button-icon.search,.x-item-pressed .list-icon.search{background-position:-24px -384px}.x-button-icon.fullscreen,.list-icon.fullscreen{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -408px;background-size:72px 888px}.x-button-pressing .x-button-icon.fullscreen,.x-button-pressing .list-icon.fullscreen,.x-button-pressed .x-button-icon.fullscreen,.x-button-pressed .list-icon.fullscreen,.x-button-active .x-button-icon.fullscreen,.x-button-active .list-icon.fullscreen,.x-item-pressed .x-button-icon.fullscreen,.x-item-pressed .list-icon.fullscreen{background-position:-24px -408px}.x-button-icon.spinner-down,.list-icon.spinner-down{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -432px;background-size:72px 888px}.x-button-pressing .x-button-icon.spinner-down,.x-button-pressing .list-icon.spinner-down,.x-button-pressed .x-button-icon.spinner-down,.x-button-pressed .list-icon.spinner-down,.x-button-active .x-button-icon.spinner-down,.x-button-active .list-icon.spinner-down,.x-item-pressed .x-button-icon.spinner-down,.x-item-pressed .list-icon.spinner-down{background-position:-24px -432px}.x-button-icon.spinner-up,.list-icon.spinner-up{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -456px;background-size:72px 888px}.x-button-pressing .x-button-icon.spinner-up,.x-button-pressing .list-icon.spinner-up,.x-button-pressed .x-button-icon.spinner-up,.x-button-pressed .list-icon.spinner-up,.x-button-active .x-button-icon.spinner-up,.x-button-active .list-icon.spinner-up,.x-item-pressed .x-button-icon.spinner-up,.x-item-pressed .list-icon.spinner-up{background-position:-24px -456px}.x-button-icon.superscript,.list-icon.superscript{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -480px;background-size:72px 888px}.x-button-pressing .x-button-icon.superscript,.x-button-pressing .list-icon.superscript,.x-button-pressed .x-button-icon.superscript,.x-button-pressed .list-icon.superscript,.x-button-active .x-button-icon.superscript,.x-button-active .list-icon.superscript,.x-item-pressed .x-button-icon.superscript,.x-item-pressed .list-icon.superscript{background-position:-24px -480px}.x-button-icon.subscript,.list-icon.subscript{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -504px;background-size:72px 888px}.x-button-pressing .x-button-icon.subscript,.x-button-pressing .list-icon.subscript,.x-button-pressed .x-button-icon.subscript,.x-button-pressed .list-icon.subscript,.x-button-active .x-button-icon.subscript,.x-button-active .list-icon.subscript,.x-item-pressed .x-button-icon.subscript,.x-item-pressed .list-icon.subscript{background-position:-24px -504px}.x-button-icon.table,.list-icon.table{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -528px;background-size:72px 888px}.x-button-pressing .x-button-icon.table,.x-button-pressing .list-icon.table,.x-button-pressed .x-button-icon.table,.x-button-pressed .list-icon.table,.x-button-active .x-button-icon.table,.x-button-active .list-icon.table,.x-item-pressed .x-button-icon.table,.x-item-pressed .list-icon.table{background-position:-24px -528px}.x-button-icon.picture,.list-icon.picture{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -552px;background-size:72px 888px}.x-button-pressing .x-button-icon.picture,.x-button-pressing .list-icon.picture,.x-button-pressed .x-button-icon.picture,.x-button-pressed .list-icon.picture,.x-button-active .x-button-icon.picture,.x-button-active .list-icon.picture,.x-item-pressed .x-button-icon.picture,.x-item-pressed .list-icon.picture{background-position:-24px -552px}.x-button-icon.spacing,.list-icon.spacing{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -576px;background-size:72px 888px}.x-button-pressing .x-button-icon.spacing,.x-button-pressing .list-icon.spacing,.x-button-pressed .x-button-icon.spacing,.x-button-pressed .list-icon.spacing,.x-button-active .x-button-icon.spacing,.x-button-active .list-icon.spacing,.x-item-pressed .x-button-icon.spacing,.x-item-pressed .list-icon.spacing{background-position:-24px -576px}.x-button-icon.indent-inc,.list-icon.indent-inc{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -600px;background-size:72px 888px}.x-button-pressing .x-button-icon.indent-inc,.x-button-pressing .list-icon.indent-inc,.x-button-pressed .x-button-icon.indent-inc,.x-button-pressed .list-icon.indent-inc,.x-button-active .x-button-icon.indent-inc,.x-button-active .list-icon.indent-inc,.x-item-pressed .x-button-icon.indent-inc,.x-item-pressed .list-icon.indent-inc{background-position:-24px -600px}.x-button-icon.indent-dec,.list-icon.indent-dec{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -624px;background-size:72px 888px}.x-button-pressing .x-button-icon.indent-dec,.x-button-pressing .list-icon.indent-dec,.x-button-pressed .x-button-icon.indent-dec,.x-button-pressed .list-icon.indent-dec,.x-button-active .x-button-icon.indent-dec,.x-button-active .list-icon.indent-dec,.x-item-pressed .x-button-icon.indent-dec,.x-item-pressed .list-icon.indent-dec{background-position:-24px -624px}.x-button-icon.numbering,.list-icon.numbering{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -648px;background-size:72px 888px}.x-button-pressing .x-button-icon.numbering,.x-button-pressing .list-icon.numbering,.x-button-pressed .x-button-icon.numbering,.x-button-pressed .list-icon.numbering,.x-button-active .x-button-icon.numbering,.x-button-active .list-icon.numbering,.x-item-pressed .x-button-icon.numbering,.x-item-pressed .list-icon.numbering{background-position:-24px -648px}.x-button-icon.outline,.list-icon.outline{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -672px;background-size:72px 888px}.x-button-pressing .x-button-icon.outline,.x-button-pressing .list-icon.outline,.x-button-pressed .x-button-icon.outline,.x-button-pressed .list-icon.outline,.x-button-active .x-button-icon.outline,.x-button-active .list-icon.outline,.x-item-pressed .x-button-icon.outline,.x-item-pressed .list-icon.outline{background-position:-24px -672px}.x-button-icon.insert-row,.list-icon.insert-row{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -696px;background-size:72px 888px}.x-button-pressing .x-button-icon.insert-row,.x-button-pressing .list-icon.insert-row,.x-button-pressed .x-button-icon.insert-row,.x-button-pressed .list-icon.insert-row,.x-button-active .x-button-icon.insert-row,.x-button-active .list-icon.insert-row,.x-item-pressed .x-button-icon.insert-row,.x-item-pressed .list-icon.insert-row{background-position:-24px -696px}.x-button-icon.insert-column,.list-icon.insert-column{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -720px;background-size:72px 888px}.x-button-pressing .x-button-icon.insert-column,.x-button-pressing .list-icon.insert-column,.x-button-pressed .x-button-icon.insert-column,.x-button-pressed .list-icon.insert-column,.x-button-active .x-button-icon.insert-column,.x-button-active .list-icon.insert-column,.x-item-pressed .x-button-icon.insert-column,.x-item-pressed .list-icon.insert-column{background-position:-24px -720px}.x-button-icon.highlightcolor,.list-icon.highlightcolor{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -744px;background-size:72px 888px}.x-button-pressing .x-button-icon.highlightcolor,.x-button-pressing .list-icon.highlightcolor,.x-button-pressed .x-button-icon.highlightcolor,.x-button-pressed .list-icon.highlightcolor,.x-button-active .x-button-icon.highlightcolor,.x-button-active .list-icon.highlightcolor,.x-item-pressed .x-button-icon.highlightcolor,.x-item-pressed .list-icon.highlightcolor{background-position:-24px -744px}.x-button-icon.textcolor,.list-icon.textcolor{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -768px;background-size:72px 888px}.x-button-pressing .x-button-icon.textcolor,.x-button-pressing .list-icon.textcolor,.x-button-pressed .x-button-icon.textcolor,.x-button-pressed .list-icon.textcolor,.x-button-active .x-button-icon.textcolor,.x-button-active .list-icon.textcolor,.x-item-pressed .x-button-icon.textcolor,.x-item-pressed .list-icon.textcolor{background-position:-24px -768px}.x-button-icon.textbigger,.list-icon.textbigger{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -792px;background-size:72px 888px}.x-button-pressing .x-button-icon.textbigger,.x-button-pressing .list-icon.textbigger,.x-button-pressed .x-button-icon.textbigger,.x-button-pressed .list-icon.textbigger,.x-button-active .x-button-icon.textbigger,.x-button-active .list-icon.textbigger,.x-item-pressed .x-button-icon.textbigger,.x-item-pressed .list-icon.textbigger{background-position:-24px -792px}.x-button-icon.textless,.list-icon.textless{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -816px;background-size:72px 888px}.x-button-pressing .x-button-icon.textless,.x-button-pressing .list-icon.textless,.x-button-pressed .x-button-icon.textless,.x-button-pressed .list-icon.textless,.x-button-active .x-button-icon.textless,.x-button-active .list-icon.textless,.x-item-pressed .x-button-icon.textless,.x-item-pressed .list-icon.textless{background-position:-24px -816px}.x-button-icon.spinner-prev,.list-icon.spinner-prev{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -840px;background-size:72px 888px}.x-button-pressing .x-button-icon.spinner-prev,.x-button-pressing .list-icon.spinner-prev,.x-button-pressed .x-button-icon.spinner-prev,.x-button-pressed .list-icon.spinner-prev,.x-button-active .x-button-icon.spinner-prev,.x-button-active .list-icon.spinner-prev,.x-item-pressed .x-button-icon.spinner-prev,.x-item-pressed .list-icon.spinner-prev{background-position:-24px -840px}.x-button-icon.spinner-next,.list-icon.spinner-next{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -864px;background-size:72px 888px}.x-button-pressing .x-button-icon.spinner-next,.x-button-pressing .list-icon.spinner-next,.x-button-pressed .x-button-icon.spinner-next,.x-button-pressed .list-icon.spinner-next,.x-button-active .x-button-icon.spinner-next,.x-button-active .list-icon.spinner-next,.x-item-pressed .x-button-icon.spinner-next,.x-item-pressed .list-icon.spinner-next{background-position:-24px -864px}.x-button.x-button-base{padding:.3em 8px}.x-button.x-button-base,.x-toolbar .x-button.x-button-base{border:1px solid #939393;border-top-color:#a5a5a5;min-height:29px;padding-top:0;padding-bottom:0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:rgba(255,255,255,0.35) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.35) 0 1px 0;box-shadow:rgba(255,255,255,0.35) 0 1px 0;color:#000}.x-button.x-button-base .x-button-icon,.x-toolbar .x-button.x-button-base .x-button-icon{width:24px;height:24px}.x-button.x-button-base.x-button-forward:before,.x-button.x-button-base.x-button-forward:after,.x-button.x-button-base.x-button-back:before,.x-button.x-button-base.x-button-back:after,.x-toolbar .x-button.x-button-base.x-button-forward:before,.x-toolbar .x-button.x-button-base.x-button-forward:after,.x-toolbar .x-button.x-button-base.x-button-back:before,.x-toolbar .x-button.x-button-base.x-button-back:after{-webkit-mask-size:.80717em 1.75em}.x-button.x-button-base .x-button-label,.x-button.x-button-base .x-badge,.x-toolbar .x-button.x-button-base .x-button-label,.x-toolbar .x-button.x-button-base .x-badge{color:#323232;text-shadow:#fff 0 0.09em 0}.x-button.x-button-base.x-button-back:before,.x-button.x-button-base.x-button-forward:before,.x-toolbar .x-button.x-button-base.x-button-back:before,.x-toolbar .x-button.x-button-base.x-button-forward:before{background:#989898}.x-button.x-button-base,.x-button.x-button-base.x-button-back:after,.x-button.x-button-base.x-button-forward:after,.x-toolbar .x-button.x-button-base,.x-toolbar .x-button.x-button-base.x-button-back:after,.x-toolbar .x-button.x-button-base.x-button-forward:after{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-moz-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-o-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-ms-linear-gradient(to bottom, #ffffff,#ececec 3%,#cbcbcb)}.x-button.x-button-base.x-button-pressing,.x-button.x-button-base.x-button-pressing:after,.x-button.x-button-base.x-button-pressed,.x-button.x-button-base.x-button-pressed:after,.x-button.x-button-base.x-button-active,.x-button.x-button-base.x-button-active:after,.x-toolbar .x-button.x-button-base.x-button-pressing,.x-toolbar .x-button.x-button-base.x-button-pressing:after,.x-toolbar .x-button.x-button-base.x-button-pressed,.x-toolbar .x-button.x-button-base.x-button-pressed:after,.x-toolbar .x-button.x-button-base.x-button-active,.x-toolbar .x-button.x-button-base.x-button-active:after{background-image:none;background-color:#656565;background-image:-webkit-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-moz-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-o-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-ms-linear-gradient(to bottom, #4c4c4c,#585858 10%,#656565 65%,#666666)}.x-button.x-button-base.x-button-pressing .x-button-label,.x-button.x-button-base.x-button-pressing .x-badge,.x-button.x-button-base.x-button-pressed .x-button-label,.x-button.x-button-base.x-button-pressed .x-badge,.x-button.x-button-base.x-button-active .x-button-label,.x-button.x-button-base.x-button-active .x-badge,.x-toolbar .x-button.x-button-base.x-button-pressing .x-button-label,.x-toolbar .x-button.x-button-base.x-button-pressing .x-badge,.x-toolbar .x-button.x-button-base.x-button-pressed .x-button-label,.x-toolbar .x-button.x-button-base.x-button-pressed .x-badge,.x-toolbar .x-button.x-button-base.x-button-active .x-button-label,.x-toolbar .x-button.x-button-base.x-button-active .x-badge{color:#fff;text-shadow:#4c4c4c 0 0.09em 0}.x-segmentedbutton-base:not(.divided){margin:0 .2em}.x-segmentedbutton-base:not(.divided) .x-button-base{margin:0;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.x-segmentedbutton-base:not(.divided) .x-button-base:not(.x-first){border-left:0 !important}.x-segmentedbutton-base.divided .x-button-base:not(.x-first){border-left:1px solid #939393}.x-segmentedbutton-base.divided .x-button-base:not(.x-last){margin-right:7px}.x-segmentedbutton-base .x-button-base.x-first{-moz-border-radius-topleft:2px !important;-webkit-border-top-left-radius:2px !important;border-top-left-radius:2px !important;-moz-border-radius-bottomleft:2px !important;-webkit-border-bottom-left-radius:2px !important;border-bottom-left-radius:2px !important}.x-segmentedbutton-base .x-button-base.x-last{-moz-border-radius-topright:2px !important;-webkit-border-top-right-radius:2px !important;border-top-right-radius:2px !important;-moz-border-radius-bottomright:2px !important;-webkit-border-bottom-right-radius:2px !important;border-bottom-right-radius:2px !important}.x-button.x-button-light{padding:.3em 8px}.x-button.x-button-light,.x-toolbar .x-button.x-button-light{border:1px solid #c7c7c7;border-top-color:#d9d9d9;min-height:29px;padding-top:0;padding-bottom:0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:rgba(255,255,255,0.35) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.35) 0 1px 0;box-shadow:rgba(255,255,255,0.35) 0 1px 0;color:#262626}.x-button.x-button-light .x-button-icon,.x-toolbar .x-button.x-button-light .x-button-icon{width:24px;height:24px}.x-button.x-button-light.x-button-forward:before,.x-button.x-button-light.x-button-forward:after,.x-button.x-button-light.x-button-back:before,.x-button.x-button-light.x-button-back:after,.x-toolbar .x-button.x-button-light.x-button-forward:before,.x-toolbar .x-button.x-button-light.x-button-forward:after,.x-toolbar .x-button.x-button-light.x-button-back:before,.x-toolbar .x-button.x-button-light.x-button-back:after{-webkit-mask-size:.80717em 1.75em}.x-button.x-button-light .x-button-label,.x-button.x-button-light .x-badge,.x-toolbar .x-button.x-button-light .x-button-label,.x-toolbar .x-button.x-button-light .x-badge{color:#666;text-shadow:#fff 0 0.09em 0}.x-button.x-button-light.x-button-back:before,.x-button.x-button-light.x-button-forward:before,.x-toolbar .x-button.x-button-light.x-button-back:before,.x-toolbar .x-button.x-button-light.x-button-forward:before{background:#ccc}.x-button.x-button-light,.x-button.x-button-light.x-button-back:after,.x-button.x-button-light.x-button-forward:after,.x-toolbar .x-button.x-button-light,.x-toolbar .x-button.x-button-light.x-button-back:after,.x-toolbar .x-button.x-button-light.x-button-forward:after{background-image:none;background-color:#fff;background-image:-webkit-linear-gradient(top, #ffffff,#ffffff 3%,#ffffff);background-image:-moz-linear-gradient(top, #ffffff,#ffffff 3%,#ffffff);background-image:-o-linear-gradient(top, #ffffff,#ffffff 3%,#ffffff);background-image:-ms-linear-gradient(to bottom, #ffffff,#ffffff 3%,#ffffff)}.x-button.x-button-light.x-button-pressing,.x-button.x-button-light.x-button-pressing:after,.x-button.x-button-light.x-button-pressed,.x-button.x-button-light.x-button-pressed:after,.x-button.x-button-light.x-button-active,.x-button.x-button-light.x-button-active:after,.x-toolbar .x-button.x-button-light.x-button-pressing,.x-toolbar .x-button.x-button-light.x-button-pressing:after,.x-toolbar .x-button.x-button-light.x-button-pressed,.x-toolbar .x-button.x-button-light.x-button-pressed:after,.x-toolbar .x-button.x-button-light.x-button-active,.x-toolbar .x-button.x-button-light.x-button-active:after{background-image:none;background-color:#999;background-image:-webkit-linear-gradient(top, #808080,#8c8c8c 10%,#999999 65%,#9a9a9a);background-image:-moz-linear-gradient(top, #808080,#8c8c8c 10%,#999999 65%,#9a9a9a);background-image:-o-linear-gradient(top, #808080,#8c8c8c 10%,#999999 65%,#9a9a9a);background-image:-ms-linear-gradient(to bottom, #808080,#8c8c8c 10%,#999999 65%,#9a9a9a)}.x-button.x-button-light.x-button-pressing .x-button-label,.x-button.x-button-light.x-button-pressing .x-badge,.x-button.x-button-light.x-button-pressed .x-button-label,.x-button.x-button-light.x-button-pressed .x-badge,.x-button.x-button-light.x-button-active .x-button-label,.x-button.x-button-light.x-button-active .x-badge,.x-toolbar .x-button.x-button-light.x-button-pressing .x-button-label,.x-toolbar .x-button.x-button-light.x-button-pressing .x-badge,.x-toolbar .x-button.x-button-light.x-button-pressed .x-button-label,.x-toolbar .x-button.x-button-light.x-button-pressed .x-badge,.x-toolbar .x-button.x-button-light.x-button-active .x-button-label,.x-toolbar .x-button.x-button-light.x-button-active .x-badge{color:#fff;text-shadow:gray 0 0.09em 0}.x-segmentedbutton-base:not(.divided){margin:0 .2em}.x-segmentedbutton-base:not(.divided) .x-button-light{margin:0;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.x-segmentedbutton-base:not(.divided) .x-button-light:not(.x-first){border-left:0 !important}.x-segmentedbutton-base.divided .x-button-light:not(.x-first){border-left:1px solid #c7c7c7}.x-segmentedbutton-base.divided .x-button-light:not(.x-last){margin-right:7px}.x-segmentedbutton-base .x-button-light.x-first{-moz-border-radius-topleft:2px !important;-webkit-border-top-left-radius:2px !important;border-top-left-radius:2px !important;-moz-border-radius-bottomleft:2px !important;-webkit-border-bottom-left-radius:2px !important;border-bottom-left-radius:2px !important}.x-segmentedbutton-base .x-button-light.x-last{-moz-border-radius-topright:2px !important;-webkit-border-top-right-radius:2px !important;border-top-right-radius:2px !important;-moz-border-radius-bottomright:2px !important;-webkit-border-bottom-right-radius:2px !important;border-bottom-right-radius:2px !important}.x-button.x-button-base-blue{padding:.3em 8px}.x-button.x-button-base-blue,.x-toolbar .x-button.x-button-base-blue{border:1px solid #2e519b;border-top-color:#3760b7;min-height:29px;padding-top:0;padding-bottom:0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:rgba(255,255,255,0.35) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.35) 0 1px 0;box-shadow:rgba(255,255,255,0.35) 0 1px 0;color:#fff}.x-button.x-button-base-blue .x-button-icon,.x-toolbar .x-button.x-button-base-blue .x-button-icon{width:24px;height:24px}.x-button.x-button-base-blue.x-button-forward:before,.x-button.x-button-base-blue.x-button-forward:after,.x-button.x-button-base-blue.x-button-back:before,.x-button.x-button-base-blue.x-button-back:after,.x-toolbar .x-button.x-button-base-blue.x-button-forward:before,.x-toolbar .x-button.x-button-base-blue.x-button-forward:after,.x-toolbar .x-button.x-button-base-blue.x-button-back:before,.x-toolbar .x-button.x-button-base-blue.x-button-back:after{-webkit-mask-size:.80717em 1.75em}.x-button.x-button-base-blue .x-button-label,.x-button.x-button-base-blue .x-badge,.x-toolbar .x-button.x-button-base-blue .x-button-label,.x-toolbar .x-button.x-button-base-blue .x-badge{color:#fff;text-shadow:#2e519b 0 -0.09em 0}.x-button.x-button-base-blue.x-button-back:before,.x-button.x-button-base-blue.x-button-forward:before,.x-toolbar .x-button.x-button-base-blue.x-button-back:before,.x-toolbar .x-button.x-button-base-blue.x-button-forward:before{background:#3155a3}.x-button.x-button-base-blue,.x-button.x-button-base-blue.x-button-back:after,.x-button.x-button-base-blue.x-button-forward:after,.x-toolbar .x-button.x-button-base-blue,.x-toolbar .x-button.x-button-base-blue.x-button-back:after,.x-toolbar .x-button.x-button-base-blue.x-button-forward:after{background-image:none;background-color:#688AD2;background-image:-webkit-linear-gradient(top, #ffffff,#9bb2e1 3%,#688ad2);background-image:-moz-linear-gradient(top, #ffffff,#9bb2e1 3%,#688ad2);background-image:-o-linear-gradient(top, #ffffff,#9bb2e1 3%,#688ad2);background-image:-ms-linear-gradient(to bottom, #ffffff,#9bb2e1 3%,#688ad2)}.x-button.x-button-base-blue.x-button-pressing,.x-button.x-button-base-blue.x-button-pressing:after,.x-button.x-button-base-blue.x-button-pressed,.x-button.x-button-base-blue.x-button-pressed:after,.x-button.x-button-base-blue.x-button-active,.x-button.x-button-base-blue.x-button-active:after,.x-toolbar .x-button.x-button-base-blue.x-button-pressing,.x-toolbar .x-button.x-button-base-blue.x-button-pressing:after,.x-toolbar .x-button.x-button-base-blue.x-button-pressed,.x-toolbar .x-button.x-button-base-blue.x-button-pressed:after,.x-toolbar .x-button.x-button-base-blue.x-button-active,.x-toolbar .x-button.x-button-base-blue.x-button-active:after{background-image:none;background-color:#416cc6;background-image:-webkit-linear-gradient(top, #3155a3,#3760b7 10%,#416cc6 65%,#436dc7);background-image:-moz-linear-gradient(top, #3155a3,#3760b7 10%,#416cc6 65%,#436dc7);background-image:-o-linear-gradient(top, #3155a3,#3760b7 10%,#416cc6 65%,#436dc7);background-image:-ms-linear-gradient(to bottom, #3155a3,#3760b7 10%,#416cc6 65%,#436dc7)}.x-button.x-button-base-blue.x-button-pressing .x-button-label,.x-button.x-button-base-blue.x-button-pressing .x-badge,.x-button.x-button-base-blue.x-button-pressed .x-button-label,.x-button.x-button-base-blue.x-button-pressed .x-badge,.x-button.x-button-base-blue.x-button-active .x-button-label,.x-button.x-button-base-blue.x-button-active .x-badge,.x-toolbar .x-button.x-button-base-blue.x-button-pressing .x-button-label,.x-toolbar .x-button.x-button-base-blue.x-button-pressing .x-badge,.x-toolbar .x-button.x-button-base-blue.x-button-pressed .x-button-label,.x-toolbar .x-button.x-button-base-blue.x-button-pressed .x-badge,.x-toolbar .x-button.x-button-base-blue.x-button-active .x-button-label,.x-toolbar .x-button.x-button-base-blue.x-button-active .x-badge{text-shadow:#2e519b 0 0.09em 0}.x-segmentedbutton-base:not(.divided){margin:0 .2em}.x-segmentedbutton-base:not(.divided) .x-button-base-blue{margin:0;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.x-segmentedbutton-base:not(.divided) .x-button-base-blue:not(.x-first){border-left:0 !important}.x-segmentedbutton-base.divided .x-button-base-blue:not(.x-first){border-left:1px solid #2e519b}.x-segmentedbutton-base.divided .x-button-base-blue:not(.x-last){margin-right:7px}.x-segmentedbutton-base .x-button-base-blue.x-first{-moz-border-radius-topleft:2px !important;-webkit-border-top-left-radius:2px !important;border-top-left-radius:2px !important;-moz-border-radius-bottomleft:2px !important;-webkit-border-bottom-left-radius:2px !important;border-bottom-left-radius:2px !important}.x-segmentedbutton-base .x-button-base-blue.x-last{-moz-border-radius-topright:2px !important;-webkit-border-top-right-radius:2px !important;border-top-right-radius:2px !important;-moz-border-radius-bottomright:2px !important;-webkit-border-bottom-right-radius:2px !important;border-bottom-right-radius:2px !important}.x-button.x-button-back{padding:.3em 8px}.x-button.x-button-back,.x-toolbar .x-button.x-button-back{border:1px solid #939393;border-top-color:#a5a5a5;min-height:29px;padding-top:0;padding-bottom:0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:rgba(255,255,255,0.35) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.35) 0 1px 0;box-shadow:rgba(255,255,255,0.35) 0 1px 0;color:#000}.x-button.x-button-back .x-button-icon,.x-toolbar .x-button.x-button-back .x-button-icon{width:24px;height:24px}.x-button.x-button-back.x-button-forward:before,.x-button.x-button-back.x-button-forward:after,.x-button.x-button-back.x-button-back:before,.x-button.x-button-back.x-button-back:after,.x-toolbar .x-button.x-button-back.x-button-forward:before,.x-toolbar .x-button.x-button-back.x-button-forward:after,.x-toolbar .x-button.x-button-back.x-button-back:before,.x-toolbar .x-button.x-button-back.x-button-back:after{-webkit-mask-size:.80717em 1.75em}.x-button.x-button-back .x-button-label,.x-button.x-button-back .x-badge,.x-toolbar .x-button.x-button-back .x-button-label,.x-toolbar .x-button.x-button-back .x-badge{color:#323232;text-shadow:#fff 0 0.09em 0}.x-button.x-button-back.x-button-back:before,.x-button.x-button-back.x-button-forward:before,.x-toolbar .x-button.x-button-back.x-button-back:before,.x-toolbar .x-button.x-button-back.x-button-forward:before{background:#989898}.x-button.x-button-back,.x-button.x-button-back.x-button-back:after,.x-button.x-button-back.x-button-forward:after,.x-toolbar .x-button.x-button-back,.x-toolbar .x-button.x-button-back.x-button-back:after,.x-toolbar .x-button.x-button-back.x-button-forward:after{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-moz-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-o-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-ms-linear-gradient(to bottom, #ffffff,#ececec 3%,#cbcbcb)}.x-button.x-button-back.x-button-pressing,.x-button.x-button-back.x-button-pressing:after,.x-button.x-button-back.x-button-pressed,.x-button.x-button-back.x-button-pressed:after,.x-button.x-button-back.x-button-active,.x-button.x-button-back.x-button-active:after,.x-toolbar .x-button.x-button-back.x-button-pressing,.x-toolbar .x-button.x-button-back.x-button-pressing:after,.x-toolbar .x-button.x-button-back.x-button-pressed,.x-toolbar .x-button.x-button-back.x-button-pressed:after,.x-toolbar .x-button.x-button-back.x-button-active,.x-toolbar .x-button.x-button-back.x-button-active:after{background-image:none;background-color:#656565;background-image:-webkit-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-moz-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-o-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-ms-linear-gradient(to bottom, #4c4c4c,#585858 10%,#656565 65%,#666666)}.x-button.x-button-back.x-button-pressing .x-button-label,.x-button.x-button-back.x-button-pressing .x-badge,.x-button.x-button-back.x-button-pressed .x-button-label,.x-button.x-button-back.x-button-pressed .x-badge,.x-button.x-button-back.x-button-active .x-button-label,.x-button.x-button-back.x-button-active .x-badge,.x-toolbar .x-button.x-button-back.x-button-pressing .x-button-label,.x-toolbar .x-button.x-button-back.x-button-pressing .x-badge,.x-toolbar .x-button.x-button-back.x-button-pressed .x-button-label,.x-toolbar .x-button.x-button-back.x-button-pressed .x-badge,.x-toolbar .x-button.x-button-back.x-button-active .x-button-label,.x-toolbar .x-button.x-button-back.x-button-active .x-badge{color:#fff;text-shadow:#4c4c4c 0 0.09em 0}.x-button.x-button-back,.x-toolbar .x-button.x-button-back{-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}.x-segmentedbutton-base:not(.divided){margin:0 .2em}.x-segmentedbutton-base:not(.divided) .x-button-back{margin:0;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.x-segmentedbutton-base:not(.divided) .x-button-back:not(.x-first){border-left:0 !important}.x-segmentedbutton-base.divided .x-button-back:not(.x-first){border-left:1px solid #939393}.x-segmentedbutton-base.divided .x-button-back:not(.x-last){margin-right:7px}.x-segmentedbutton-base .x-button-back.x-first{-moz-border-radius-topleft:2px !important;-webkit-border-top-left-radius:2px !important;border-top-left-radius:2px !important;-moz-border-radius-bottomleft:2px !important;-webkit-border-bottom-left-radius:2px !important;border-bottom-left-radius:2px !important}.x-segmentedbutton-base .x-button-back.x-last{-moz-border-radius-topright:2px !important;-webkit-border-top-right-radius:2px !important;border-top-right-radius:2px !important;-moz-border-radius-bottomright:2px !important;-webkit-border-bottom-right-radius:2px !important;border-bottom-right-radius:2px !important}.unsuported-view{position:absolute;left:0;top:0;right:0;bottom:0;background:url(../img/ios-only.png) no-repeat center #efefef;background-attachment:fixed;z-index:90000}.x-button.text-offset-12{padding-left:12px;padding-right:12px}.x-button.text-offset-30{padding-left:30px;padding-right:30px} +html,body{position:relative;width:100%;height:100%}.x-fullscreen{position:absolute !important}.x-body{position:relative;z-index:0}.x-inner,.x-body{width:100%;height:100%}.x-sized{position:relative}.x-innerhtml{width:100%}.x-layout-box{display:flex;display:-webkit-box;display:-ms-flexbox}.x-layout-box.x-horizontal{-webkit-box-orient:horizontal !important;-ms-flex-direction:row !important;flex-direction:row !important}.x-layout-box.x-horizontal>.x-layout-box-item.x-flexed{min-width:0 !important}.x-layout-box.x-vertical{-webkit-box-orient:vertical !important;-ms-flex-direction:column !important;flex-direction:column !important}.x-layout-box.x-vertical>.x-layout-box-item.x-flexed{min-height:0 !important}.x-layout-box>.x-layout-box-item{display:flex !important;display:-webkit-box !important;display:-ms-flexbox !important}.x-layout-box.x-align-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.x-layout-box.x-align-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.x-layout-box.x-align-end{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.x-layout-box.x-align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.x-layout-box.x-pack-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.x-layout-box.x-pack-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-layout-box.x-pack-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.x-layout-box.x-pack-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.x-layout-box-item.x-sized>.x-inner,.x-layout-box-item.x-sized>.x-body,.x-layout-box-item.x-sized>.x-dock-outer{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-webkit .x-layout-box.x-horizontal>.x-layout-box-item.x-flexed{width:0 !important}.x-webkit .x-layout-box.x-vertical>.x-layout-box-item.x-flexed{height:0 !important}.x-firefox .x-stretched.x-dock-horizontal>.x-dock-body{width:0}.x-firefox .x-stretched.x-dock-vertical>.x-dock-body{height:0}.x-firefox .x-container .x-dock-horizontal.x-unsized .x-dock-body{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px;min-height:0;min-width:0}.x-firefox .x-has-height>.x-dock.x-unsized.x-dock-vertical>.x-dock-body{height:0}.x-layout-card{position:relative;overflow:hidden}.x-layout-card-perspective{-webkit-perspective:1000px;-ms-perspective:1000px;perspective:1000px}.x-layout-card-item-container{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-layout-card-item{position:absolute;top:0;right:0;bottom:0;left:0;position:absolute !important}.x-dock{display:flex;display:-webkit-box;display:-ms-flexbox}.x-dock>.x-dock-body{overflow:hidden}.x-dock.x-sized,.x-dock.x-sized>.x-dock-body>*,.x-dock.x-sized>.x-dock-body>.x-body>.x-inner{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-dock.x-sized>.x-dock-body{position:relative;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-dock.x-unsized,.x-dock.x-stretched{height:100%}.x-dock.x-unsized>.x-dock-body,.x-dock.x-stretched>.x-dock-body{position:relative;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;min-height:0;min-width:0}.x-dock.x-unsized>.x-dock-body>*,.x-dock.x-stretched>.x-dock-body>*{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-dock.x-dock-vertical{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-dock.x-dock-horizontal{-webkit-box-orient:horizontal !important;-ms-flex-direction:row !important;flex-direction:row !important}.x-dock.x-dock-horizontal>.x-dock-item{display:flex;display:-webkit-box;display:-ms-flexbox}.x-dock.x-dock-horizontal>.x-dock-item.x-sized>.x-inner,.x-dock.x-dock-horizontal>.x-dock-item.x-sized>.x-body{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-dock.x-dock-horizontal>.x-dock-item.x-unsized{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-dock.x-dock-horizontal>.x-dock-item.x-unsized>*{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-ie .x-stretched.x-dock-horizontal>.x-dock-body{width:0}.x-ie .x-stretched.x-dock-vertical>.x-dock-body{height:0}.x-ie .x-has-width>.x-dock.x-unsized.x-dock-horizontal>.x-dock-body{width:0}.x-ie .x-has-height>.x-dock.x-unsized.x-dock-vertical>.x-dock-body{height:0}.x-stretched.x-container{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-stretched.x-container>.x-inner,.x-stretched.x-container>.x-body,.x-stretched.x-container>.x-body>.x-inner{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;min-height:0px}.x-layout-fit.x-stretched>.x-layout-fit-item{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-layout-fit{position:relative}.x-layout-fit-item.x-sized{position:absolute;top:0;right:0;bottom:0;left:0}.x-layout-fit-item.x-unsized{width:100%;height:100%}.x-ie .x-stretched>.x-inner,.x-ie .x-stretched>.x-body{min-height:inherit}.x-center,.x-centered{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-center>*,.x-centered>*{position:relative}.x-center>.x-floating,.x-centered>.x-floating{position:relative !important}.x-floating{position:absolute !important}.x-layout-float{overflow:hidden}.x-layout-float>.x-layout-float-item{float:left}.x-layout-float.x-direction-right>.x-layout-float-item{float:right}@-webkit-keyframes x-paint-monitor-helper{from{zoom:1}to{zoom:1}}@keyframes x-paint-monitor-helper{from{zoom:1}to{zoom:1}}.x-paint-monitored{position:relative}.x-paint-monitor{width:0 !important;height:0 !important;visibility:hidden}.x-paint-monitor.cssanimation{-webkit-animation-duration:0.0001ms;-webkit-animation-name:x-paint-monitor-helper;animation-duration:0.0001ms;animation-name:x-paint-monitor-helper}.x-paint-monitor.overflowchange{overflow:hidden}.x-paint-monitor.overflowchange::after{content:'';display:block;width:1px !important;height:1px !important}.x-size-monitored{position:relative}.x-size-monitors{position:absolute;left:0;top:0;width:100%;height:100%;visibility:hidden;overflow:hidden}.x-size-monitors>*{width:100%;height:100%;overflow:hidden}.x-size-monitors.scroll>*.shrink::after{content:'';display:block;width:200%;height:200%;min-width:1px;min-height:1px}.x-size-monitors.scroll>*.expand::after{content:'';display:block;width:100000px;height:100000px}.x-size-monitors.overflowchanged>*.shrink>*{width:100%;height:100%}.x-size-monitors.overflowchanged>*.expand>*{width:200%;height:200%}.x-size-change-detector{visibility:hidden;position:absolute;left:0;top:0;z-index:-1;width:100%;height:100%;overflow:hidden}.x-size-change-detector>*{visibility:hidden}.x-size-change-detector-shrink>*{width:200%;height:200%}.x-size-change-detector-expand>*{width:100000px;height:100000px}.x-translatable{position:absolute !important;top:500000px !important;left:500000px !important;overflow:visible !important;z-index:1}.x-translatable-hboxfix{position:absolute;min-width:100%;top:0;left:0}.x-translatable-hboxfix>.x-translatable{position:relative !important}.x-translatable-container{overflow:hidden;width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-translatable-container::before{content:'';display:block;width:1000000px;height:1000000px;visibility:hidden}.x-button{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#eee;border:1px solid #ccc;position:relative;overflow:hidden;z-index:1}.x-button .x-button-icon{position:relative;background-repeat:no-repeat;background-position:center}.x-button .x-button-icon.x-shown{display:block}.x-button .x-button-icon.x-hidden{display:none}.x-iconalign-left,.x-icon-align-right{-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.x-iconalign-top,.x-iconalign-bottom{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-iconalign-bottom,.x-iconalign-right{-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.x-iconalign-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-button-label,.x-badge,.x-hasbadge .x-badge{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center;white-space:nowrap;text-overflow:ellipsis;text-align:center;display:block;overflow:hidden}.x-badge{background-color:#ccc;border:1px solid #aaa;z-index:2;position:absolute !important;width:auto;font-size:.6em;right:0;top:0;max-width:95%;display:inline-block}html,body{font-family:"Helvetica Neue", HelveticaNeue, "Helvetica-Neue", Helvetica, "BBAlpha Sans", sans-serif;font-weight:normal;-webkit-text-size-adjust:none;margin:0;cursor:default}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}li{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}q:before,q:after{content:''}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{vertical-align:text-bottom}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit}*:focus{outline:none}body.x-desktop{overflow:hidden}@-ms-viewport{width:device-width}*,*:after,*:before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-user-drag:none;-webkit-user-select:none;-ms-user-select:none;-ms-touch-action:none;-moz-user-select:-moz-none}input,textarea{-webkit-user-select:text;-ms-user-select:auto;-moz-user-select:text}.x-hidden-visibility{visibility:hidden !important}.x-hidden-display,.x-field-hidden{display:none !important}.x-hidden-offsets{position:absolute !important;left:-10000em;top:-10000em;visibility:hidden}.x-html{-webkit-user-select:auto;-webkit-touch-callout:inherit;-ms-user-select:auto;line-height:1.5;color:#333;font-size:.8em;padding:1.2em}.x-html body{line-height:1.5;font-family:"Helvetica Neue",Arial,Helvetica,sans-serif;color:#333;font-size:75%}.x-html h1,.x-html h2,.x-html h3,.x-html h4,.x-html h5,.x-html h6{font-weight:normal;color:#222}.x-html h1 img,.x-html h2 img,.x-html h3 img,.x-html h4 img,.x-html h5 img,.x-html h6 img{margin:0}.x-html h1{font-size:3em;line-height:1;margin-bottom:0.50em}.x-html h2{font-size:2em;margin-bottom:0.75em}.x-html h3{font-size:1.5em;line-height:1;margin-bottom:1.00em}.x-html h4{font-size:1.2em;line-height:1.25;margin-bottom:1.25em}.x-html h5{font-size:1em;font-weight:bold;margin-bottom:1.50em}.x-html h6{font-size:1em;font-weight:bold}.x-html p{margin:0 0 1.5em}.x-html p .left{float:left;margin:1.5em 1.5em 1.5em 0;padding:0}.x-html p .right{float:right;margin:1.5em 0 1.5em 1.5em;padding:0}.x-html a{text-decoration:underline;color:#06c}.x-html a:visited{color:#004d99}.x-html a:focus{color:#09f}.x-html a:hover{color:#09f}.x-html a:active{color:#bf00ff}.x-html blockquote{margin:1.5em;color:#666;font-style:italic}.x-html strong,.x-html dfn{font-weight:bold}.x-html em,.x-html dfn{font-style:italic}.x-html sup,.x-html sub{line-height:0}.x-html abbr,.x-html acronym{border-bottom:1px dotted #666666}.x-html address{margin:0 0 1.5em;font-style:italic}.x-html del{color:#666}.x-html pre{margin:1.5em 0;white-space:pre}.x-html pre,.x-html code,.x-html tt{font:1em "andale mono","lucida console",monospace;line-height:1.5}.x-html li ul,.x-html li ol{margin:0}.x-html ul,.x-html ol{margin:0 1.5em 1.5em 0;padding-left:1.5em}.x-html ul{list-style-type:disc}.x-html ol{list-style-type:decimal}.x-html dl{margin:0 0 1.5em 0}.x-html dl dt{font-weight:bold}.x-html dd{margin-left:1.5em}.x-html table{margin-bottom:1.4em;width:100%}.x-html th{font-weight:bold}.x-html thead th{background:#c3d9ff}.x-html th,.x-html td,.x-html caption{padding:4px 10px 4px 5px}.x-html table.striped tr:nth-child(even) td,.x-html table tr.even td{background:#e5ecf9}.x-html tfoot{font-style:italic}.x-html caption{background:#eee}.x-html .quiet{color:#666}.x-html .loud{color:#111}.x-html ul li{list-style-type:circle}.x-html ol li{list-style-type:decimal}@-webkit-keyframes x-loading-spinner-rotate{0%{-webkit-transform:rotate(0deg)}8.32%{-webkit-transform:rotate(0deg)}8.33%{-webkit-transform:rotate(30deg)}16.65%{-webkit-transform:rotate(30deg)}16.66%{-webkit-transform:rotate(60deg)}24.99%{-webkit-transform:rotate(60deg)}25%{-webkit-transform:rotate(90deg)}33.32%{-webkit-transform:rotate(90deg)}33.33%{-webkit-transform:rotate(120deg)}41.65%{-webkit-transform:rotate(120deg)}41.66%{-webkit-transform:rotate(150deg)}49.99%{-webkit-transform:rotate(150deg)}50%{-webkit-transform:rotate(180deg)}58.32%{-webkit-transform:rotate(180deg)}58.33%{-webkit-transform:rotate(210deg)}66.65%{-webkit-transform:rotate(210deg)}66.66%{-webkit-transform:rotate(240deg)}74.99%{-webkit-transform:rotate(240deg)}75%{-webkit-transform:rotate(270deg)}83.32%{-webkit-transform:rotate(270deg)}83.33%{-webkit-transform:rotate(300deg)}91.65%{-webkit-transform:rotate(300deg)}91.66%{-webkit-transform:rotate(330deg)}100%{-webkit-transform:rotate(330deg)}}@keyframes x-loading-spinner-rotate{0%{-ms-transform:rotate(0deg);transform:rotate(0deg)}8.32%{-ms-transform:rotate(0deg);transform:rotate(0deg)}8.33%{-ms-transform:rotate(30deg);transform:rotate(30deg)}16.65%{-ms-transform:rotate(30deg);transform:rotate(30deg)}16.66%{-ms-transform:rotate(60deg);transform:rotate(60deg)}24.99%{-ms-transform:rotate(60deg);transform:rotate(60deg)}25%{-ms-transform:rotate(90deg);transform:rotate(90deg)}33.32%{-ms-transform:rotate(90deg);transform:rotate(90deg)}33.33%{-ms-transform:rotate(120deg);transform:rotate(120deg)}41.65%{-ms-transform:rotate(120deg);transform:rotate(120deg)}41.66%{-ms-transform:rotate(150deg);transform:rotate(150deg)}49.99%{-ms-transform:rotate(150deg);transform:rotate(150deg)}50%{-ms-transform:rotate(180deg);transform:rotate(180deg)}58.32%{-ms-transform:rotate(180deg);transform:rotate(180deg)}58.33%{-ms-transform:rotate(210deg);transform:rotate(210deg)}66.65%{-ms-transform:rotate(210deg);transform:rotate(210deg)}66.66%{-ms-transform:rotate(240deg);transform:rotate(240deg)}74.99%{-ms-transform:rotate(240deg);transform:rotate(240deg)}75%{-ms-transform:rotate(270deg);transform:rotate(270deg)}83.32%{-ms-transform:rotate(270deg);transform:rotate(270deg)}83.33%{-ms-transform:rotate(300deg);transform:rotate(300deg)}91.65%{-ms-transform:rotate(300deg);transform:rotate(300deg)}91.66%{-ms-transform:rotate(330deg);transform:rotate(330deg)}100%{-ms-transform:rotate(330deg);transform:rotate(330deg)}}@font-face{font-family:"Pictos";src:url('data:application/font-woff;base64,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') format('woff'),url('data:font/truetype;base64,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AQIFAw4BAQQCCAEBBAIBAQMDAgYGAgECAgEBAQICAQ0DAQICBQEMBwIFAgICBgMCBQQCBAQMAQMBAQEBBAUBAwkBAwEBAgEDAgIBBAICBgECBgMCBQIGCAUFAQUIAQMFAQELAQEGAQIDAQEBBAEBAQMCBgIEAwQGAgQHAgMDAQIGAQIBAQICAQQBBQECGwQCAQUDAQIDAgcFCAMBBgMEAwQEBAMDAQIDAwUCAgEIBgIKAQ0EBAIGAwQMAwELAQcJCAIDAgYDAQcBBwYDBAYCAgUBAwEBCwcIAgEKIceMUo4vBwIDBQUBBAIKAgEBAQMBAQMCBQIDAgJFAhkBAgEBBwQHAgoBAQUCAwMDAQIJAQUClAEFBQsCCAEDBAcBBAUBAwMBAScCBgEDAwIEAQIBBQEHAgMCAgMMBAMBAQIHARYCAgMEBQQCAgEBBAEBAwYBAwOgAQPKAgMBAQMCAQUCAQEWAgcCBQFxBgoGBQEDAgICCQEJAQ4EAgEBAQQCAgECBAECAQEBAQ8HARMPAgECAQUEAQMFAQIBAQQBBAQGBgMDCwENCgoBBwoDCQQIBAQDAwQEAgECAQIDAgEDAwQCBAEEAQIEAQMDAwUJAQgNAQMICAoQBgIICQYBAgICAQUCBQYGAQUBAgoDAQH+YwMEAgEBEQQHAgMBAggEBQUGIwICAQENAQcBBwIBCAIfBAUGAgEBJgMEAgIBARABAQF9AgICuvb+pPb2AVwzAwMFAggECwIBBAIECQIBAgECBgECAgIEBwECAQMEAgX+wFprEwkCCQIBAwgEBAMHAgQBBAEHAQMDBQoEAQMEAQIBAQIIAgEEAgYCAgMFAQcEDAUMDgIKAQsECQQBAgkBCQICAQEBAQIDAgwDAQQDBAcBAQEKAQQKAQIBBwQCBgkBBQEFAQECAwYDDAMEAgcBAgIBAQESAgMEAwEBAQQJAQgKAQICAQQDBgIEBgYBBAYFAQIBAgECAQIGBAgBAwMCAgEDAQsDAgYCAwoCAgcEAQIGBQ0IBAMCAgIBAQIIBAICCQIEAgECBQQCAQM4QFsBAwEGAgcCBgIBAQICBAEBAQIBAQECAQICAQIDBAMCBAMKBwEKAQoDAQICCwICAQQCBQEBAQEBCwIHBAECAQEBAQIPCAQBAgMEBgoCAQUDAQICAgYGAgQFAgEJAwECAQ0DAQMCBgQBCQMC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') format('truetype'),url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiID4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8bWV0YWRhdGE+ClRoaXMgaXMgYSBjdXN0b20gU1ZHIHdlYmZvbnQgZ2VuZXJhdGVkIGJ5IEZvbnQgU3F1aXJyZWwuCkRlc2lnbmVyICAgIDogRHJldyBXaWxzb24KRm91bmRyeSAgICAgOiBEcmV3IFdpbHNvbgpGb3VuZHJ5IFVSTCA6IGh0dHBwaWN0b3NkcmV3d2lsc29uY29tCjwvbWV0YWRhdGE+CjxkZWZzPgo8Zm9udCBpZD0id2ViZm9udEl5Zlpic2VGIiBob3Jpei1hZHYteD0iOTIwIiA+Cjxmb250LWZhY2UgdW5pdHMtcGVyLWVtPSIxMDAwIiBhc2NlbnQ9Ijc1MCIgZGVzY2VudD0iLTI1MCIgLz4KPG1pc3NpbmctZ2x5cGggaG9yaXotYWR2LXg9IjUwMCIgLz4KPGdseXBoIHVuaWNvZGU9IiAiICBob3Jpei1hZHYteD0iNTAwIiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4MDk7IiBob3Jpei1hZHYteD0iNTAwIiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4YTA7IiBob3Jpei1hZHYteD0iNTAwIiAvPgo8Z2x5cGggdW5pY29kZT0iISIgaG9yaXotYWR2LXg9IjkzNiIgZD0iTTg2NSAxMDNxMzcgLTYyIDExIC0xMDYuNXQtOTggLTQ0LjVoLTYyMXEtNzIgMCAtOTcuNSA0NC41dDExLjUgMTA2LjVsMzEwIDUzNHEzNiA2MiA4Ny41IDYydDg3LjUgLTYyek00NzEgNDZxMjMgMCAzOC41IDE2dDE1LjUgMzh0LTE1LjUgMzcuNXQtMzguNSAxNS41cS0yMiAwIC0zNy41IC0xNS41dC0xNS41IC0zNy41dDE1LjUgLTM4dDM3LjUgLTE2ek01MDkgMTg3bDI2IDMwOGgtMTI3bDI2IC0zMDhoNzV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4MjI7IiBob3Jpei1hZHYteD0iODY1IiBkPSJNNTIgMjg5cTEgNjUgNy41IDExNXQyNi41IDEwMS41dDUzLjUgODYuNXQ5MC41IDU4LjV0MTM1IDI4LjV2LTE1N3EtNjYgMCAtOTUgLTQ2LjV0LTI5IC0xNDcuNWwtNCAtMWg4NHExOCAwIDMxIC0xM3QxMyAtMzJ2LTI1OHEwIC0xOCAtMTMgLTMxdC0zMSAtMTNoLTIyNXEtMTggMCAtMzEgMTN0LTEzIDMxdjI1OHY3ek00OTMgMjg5cTAgNjUgNyAxMTV0MjcgMTAxLjV0NTMuNSA4Ni41dDkwLjUgNTguNXQxMzUgMjguNXYtMTU3IHEtNjcgMCAtOTYgLTQ2LjV0LTI5IC0xNDcuNWwtNCAtMWg4NHExOCAwIDMxIC0xM3QxMyAtMzJ2LTI1OHEwIC0xOCAtMTMgLTMxdC0zMSAtMTNoLTIyNHEtMTkgMCAtMzIgMTN0LTEzIDMxdjI1OHEwIDUgMSA3eiIgLz4KPGdseXBoIHVuaWNvZGU9IiMiIGhvcml6LWFkdi14PSI3NDgiIGQ9Ik03MDUgNDgycTkgLTE0IC04IC0xNGgtNDh2LTU2N3EwIC03IC01IC0xMnQtMTIgLTVoLTUxM3EtNyAwIC0xMiA1dC01IDEydjU2N2gtNTJxLTcgMCAtOS41IDR0MS41IDEwbDMxIDQ2cTkgMTQgMjcgMTRoNzV2NjZxMCAyMCAxMiAzMGw0OCA0OXExMiAxMiAzMCAxMmgyMTZxMTggMCAzMCAtMTJsNTIgLTUycTEzIC0xMyAxMyAtMzB2LTYzaDcxcTE4IDAgMjcgLTE0ek0yNDggNTQ2di00aDI1NHY0djI4cTAgMjAgLTEyIDMwbC05IDEwIHEtMTIgMTIgLTMwIDEyaC0xNTVxLTE4IDAgLTMwIC0xMmwtNiAtNnEtMTIgLTEyIC0xMiAtMzB2LTMyek01NzYgNDUwcTAgMTYgLTE2IDE4aC0yNzloLTg5cS03IDAgLTEyIC01LjV0LTUgLTEyLjV2LTQ3NnEwIC03IDUgLTEydDEyIC01aDM2N3E3IDAgMTIgNXQ1IDEydjQ3NnpNMjYzIDQxOHE3IDAgMTIuNSAtNXQ1LjUgLTEydi0zNzlxMCAtNyAtNS41IC0xMnQtMTIuNSAtNWgtMjFxLTcgMCAtMTIuNSA1dC01LjUgMTJ2Mzc5cTAgNyA1LjUgMTIgdDEyLjUgNWgyMXpNMzY0IDVxLTcgMCAtMTIuNSA1dC01LjUgMTJ2Mzc5cTAgNyA1LjUgMTJ0MTIuNSA1aDIxcTcgMCAxMiAtNXQ1IC0xMnYtMzc5cTAgLTcgLTUgLTEydC0xMiAtNWgtMjF6TTQ4NSA1cS03IDAgLTEyIDV0LTUgMTJ2Mzc5cTAgNyA1IDEydDEyIDVoMjJxNyAwIDEyIC01dDUgLTEydi0zNzlxMCAtNyAtNSAtMTJ0LTEyIC01aC0yMnoiIC8+CjxnbHlwaCB1bmljb2RlPSIkIiBob3Jpei1hZHYteD0iODkzIiBkPSJNNTAzIDI4M2gtMTA4bC0xNiA2OGgxMjR2LTY4ek02ODQgMzUxbC0xOCAtNjhoLTEwNGwxIDY4aDEyMXpNNDAwIDExOHEyOCAwIDQ4LjUgLTIwdDIwLjUgLTQ5dC0yMC41IC00OXQtNDguNSAtMjB0LTQ4LjUgMjB0LTIwLjUgNDl0MjAuNSA0OXQ0OC41IDIwek02NTkgMTE4cTI5IDAgNDkgLTIwdDIwIC00OXQtMjAgLTQ5dC00OSAtMjB0LTQ5IDIwdC0yMCA0OXQyMCA0OXQ0OSAyMHpNODMzIDUxNnEyNSAtNyAyNSAtMzNxMCAtMyAtMiAtOSBsLTg4IC0yOTNxLTcgLTI1IC0zMiAtMjVoLTQxN3EtMTIgMCAtMjEuNSA3LjV0LTExLjUgMTguNWwtODEgMzI3aC0xNDlxLTE0IDAgLTI0IDEwdC0xMCAyNHQxMCAyNHQyNCAxMGgxNzZxMjYgMCAzMyAtMjZsMTggLTczaDUwM2w1IDE1cTYgMjQgMzIgMjRxNyAwIDEwIC0xek03MTIgMjMxbDU0IDE3OWgtNDY2bDQ1IC0xODZoMzY1eiIgLz4KPGdseXBoIHVuaWNvZGU9IiUiIGhvcml6LWFkdi14PSI5MDMiIGQ9Ik04NjcgMjc3cTAgLTc5IC0zNy41IC0xNDl0LTEwMi41IC0xMTdsMTEgLTk2di00cTAgLTE3IC0xMSAtMzBxLTEzIC0xNSAtMzQgLTE1aC0xNDhxLTIxIDAgLTM0IDE1cS0xMSAxMyAtMTEgMzB2NWwyIDE4cS02IC0xIC0xOCAtMWgtMTBsMiAtMTd2LTVxMCAtMTcgLTExIC0zMHEtMTIgLTE1IC0zNCAtMTVoLTE0OHEtMjEgMCAtMzQgMTVxLTExIDEzIC0xMSAzMHY1bDExIDkwcS04NiA2MCAtMTI0IDE1M2wtNDQgLTRoLTRxLTE4IDAgLTMwIDEyIHEtMTUgMTIgLTE1IDMzdjE1MnEwIDIxIDE1IDMzcTEyIDEyIDMwIDEyaDRsNDMgLTRxMzQgODUgMTA3IDE0MWwtMiAxMTB2MXYxcTAgMjggMjUgNDNxMTEgNyAyNiA3cTE0IDAgMjUgLTdsMTI4IC03MnEyNSAzIDUxIDNxMTYwIDAgMjcwIC05OXExMTMgLTEwMCAxMTMgLTI0NHpNNjgxIDQ3cTYxIDQxIDk1LjUgMTAxdDM0LjUgMTI5cTAgMTE4IC05NCAyMDJxLTk2IDg1IC0yMzMgODVxLTI5IDAgLTUzIC00bC05IC0xbC0xMzYgNzdsMiAtMTMwIGwtMTIgLThxLTc5IC01NyAtMTA2IC0xNDRsLTcgLTIybC03NSA3di0xMjdsNzUgOGw3IC0yMnEzMyAtOTYgMTI0IC0xNTVsMTUgLTlsLTEzIC0xMTJoMTIzbC05IDc0bDM1IC00cTEzIC0yIDM5IC0ycTI0IDAgNDcgM2wzNiA0bC05IC03NWgxMjNsLTE1IDExNnpNNTAxIDUyMWw3IC0xcTcgMCAxOCAtMnQyNiAtNXQzMiAtOXQzNSAtMTR0MzcgLTIwLjV0MzYgLTI4LjVxOCAtNyA4IC0xOXQtOCAtMjBxLTggLTkgLTIwIC05cS0xMSAwIC0xOSA4IHEtMjQgMjMgLTU5IDM4LjV0LTU1LjUgMTkuNXQtMzUuNSA1aC00cS0xMSAxIC0xOSA5LjV0LTggMTkuNXExIDEyIDkuNSAyMHQxOS41IDh6TTIzMSAzODRxMTkgMjAgNDEgMjZ0MzQgLTVxMTEgLTExIDYuNSAtMzN0LTIzLjUgLTQydC00MC41IC0yNnQtMzMuNSA1dC03IDMzdDIzIDQyeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeDI2OyIgaG9yaXotYWR2LXg9IjczMiIgZD0iTTQ2NSA0MDVoMjUwdi0xOThoLTI1MHYtMjUwaC0xOTh2MjUwaC0yNTB2MTk4aDI1MHYyNTBoMTk4di0yNTB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJyIgaG9yaXotYWR2LXg9IjkwOCIgZD0iTTI2NSAxMzlxNzggNzggMTg4LjUgNzh0MTg4LjUgLTc4cTEgMCAxIC0xbC01NSAtNTVxLTEgMCAtMSAxcS01NSA1NSAtMTMzIDU1dC0xMzMgLTU1ek0xNDAgMjY0cTg1IDg1IDE5OS41IDExNS41dDIyOC41IDB0MTk5IC0xMTUuNWwxIC0xbC01NiAtNTZxMCAxIC0xIDFxLTEwNiAxMDYgLTI1Ny41IDEwNi41dC0yNTcuNSAtMTA1LjV6TTg5MyAzOTJxMCAtMiAyIC0ybC01NiAtNTZsLTIgMnEtMTA0IDEwNCAtMjQ0IDE0MXQtMjc5LjUgMCB0LTI0My41IC0xNDFxLTEgMCAtMSAtMWwtNTYgNTZsMSAxcTEyMCAxMTkgMjgwIDE2MS41dDMxOS41IDB0Mjc5LjUgLTE2MS41ek0zOTIgMTNxMjYgMjUgNjMgMjV0NjMgLTI1bC02MyAtNjN6IiAvPgo8Z2x5cGggdW5pY29kZT0iKCIgaG9yaXotYWR2LXg9IjY3MSIgZD0iTTU1MCAzNTloNzd2LTQzN2gtNTgydjQzN2g3NXYxMjhxMCA4NyA2MiAxNDl0MTQ5IDYyaDRoNHE4OCAwIDE0OS41IC02MnQ2MS41IC0xNDl2LTEyOHpNNDAyIDJsLTMyIDE0MXEzMiAyMCAzMiA1N3EwIDI4IC0xOSA0N3QtNDcgMTlxLTI3IDAgLTQ2LjUgLTE5dC0xOS41IC00N3EwIC0zOCAzMyAtNTZsLTMzIC0xNDJoMTMyek00NDUgMzU5djEyOHEwIDQzIC0zMSA3NHQtNzUgMzFoLTNoLTVxLTQzIDAgLTc0IC0zMXQtMzEgLTc0di0xMjggaDIxOXoiIC8+CjxnbHlwaCB1bmljb2RlPSIpIiBob3Jpei1hZHYteD0iODg5IiBkPSJNNjQ1IDY5OHE4OCAwIDE1MCAtNjEuNXQ2MiAtMTQ5LjV2LTEyOGgtMTA2djI5bDM2IDM0djEzaC0zNnY1MnEwIDQ0IC0zMSA3NC41dC03NSAzMC41aC0yaC01cS00NCAwIC03NSAtMzAuNXQtMzEgLTc0LjV2LTEyOGg3N3YtNDM4aC01ODR2NDM4aDQwMXYxMjhxMCA4OCA2MiAxNDkuNXQxNTAgNjEuNWgzaDR6TTM4MiAwbC0zMyAxNDJxMzMgMjAgMzMgNTdxMCAyOCAtMTkuNSA0Ny41dC00Ni41IDE5LjVxLTI4IDAgLTQ3LjUgLTE5LjUgdC0xOS41IC00Ny41cTAgLTM3IDMzIC01N2wtMzMgLTE0MmgxMzN6IiAvPgo8Z2x5cGggdW5pY29kZT0iKiIgaG9yaXotYWR2LXg9Ijc3NyIgZD0iTTczNyA0OTBsLTE5NSAtMTk1bDE5NSAtMTk2bC0xNTQgLTE1M2wtMTk1IDE5NWwtMTk1IC0xOTVsLTE1NCAxNTNsMTk1IDE5NmwtMTk1IDE5NWwxNTQgMTU0bDE5NSAtMTk1bDE5NSAxOTV6IiAvPgo8Z2x5cGggdW5pY29kZT0iKyIgZD0iTTQ2MCA3MDJxMTc0IDAgMjk3IC0xMjN0MTIzIC0yOTd0LTEyMyAtMjk3dC0yOTcgLTEyM3QtMjk3IDEyM3QtMTIzIDI5N3QxMjMgMjk3dDI5NyAxMjN6TTcwOSAyNjJ2NDFxMCAxNSAtMTAuNSAyNS41dC0yNS41IDEwLjVoLTEyMXEtMTUgMCAtMjUuNSAxMXQtMTAuNSAyNnYxMjFxMCAxNSAtMTEgMjUuNXQtMjYgMTAuNWgtNDFxLTE1IDAgLTI1LjUgLTEwLjV0LTEwLjUgLTI1LjV2LTEyMXEwIC0xNSAtMTEgLTI2dC0yNiAtMTFoLTEyMCBxLTE2IDAgLTI2LjUgLTEwLjV0LTEwLjUgLTI1LjV2LTQxcTAgLTE1IDEwLjUgLTI2dDI2LjUgLTExaDEyMHExNSAwIDI2IC0xMC41dDExIC0yNS41di0xMjFxMCAtMTUgMTAuNSAtMjUuNXQyNS41IC0xMC41aDQxcTE1IDAgMjYgMTAuNXQxMSAyNS41djEyMXEwIDE1IDEwLjUgMjUuNXQyNS41IDEwLjVoMTIxcTE1IDAgMjUuNSAxMXQxMC41IDI2eiIgLz4KPGdseXBoIHVuaWNvZGU9IiwiIGhvcml6LWFkdi14PSI5MTUiIGQ9Ik00NTggNzAxcTE3MyAwIDI5NSAtMTIyLjV0MTIyIC0yOTUuNXEwIC0xMDQgLTQ2IC0xOTFxLTU5IC0xMTUgLTE3MiAtMTc2cS05NCAtNTEgLTE5OSAtNTFxLTEwMSAwIC0xOTQgNDhxLTExNCA2MCAtMTc1IDE3M3EtNDkgOTMgLTQ5IDE5N3EwIDE3MyAxMjIuNSAyOTUuNXQyOTUuNSAxMjIuNXpNNzYwIDIwM3ExMSA0MSAxMSA4MHEwIDEzMCAtOTIgMjIydC0yMjEgOTJxLTEzMCAwIC0yMjIgLTkydC05MiAtMjIycTAgLTM5IDEyIC04NSBxMyAtOSA5IC0yNXEyMSA2IDQ1IDZxNjUgMCAxMTEuNSAtNDZ0NDYuNSAtMTExcTAgLTE3IC01IC0zN3E0IC0yIDEyIC00cTQyIC0xMSA4MyAtMTFxNDUgMCA4NyAxMnEyIDAgNS41IDJ0NS41IDJxLTUgMjIgLTUgNDBxMCA2NCA0Ni41IDExMC41dDExMC41IDQ2LjVxMjMgMCA0NCAtNnE1IDE1IDggMjZ6TTQ5OCAzMzNxMjUgLTE5IDI1IC01MHEwIC0xNCAtNSAtMjRxLTE2IC0zOSAtNTggLTM5cS0xMSAwIC0yNCA1cS0zOSAxNiAtMzkgNTggcTAgMSAwLjUgNHQwLjUgNWwtNTYgMjQ1bDIxIDl6TTQ3OCA1NjV2LTk1aC0zOXY5NWgzOXpNNjMyIDQ5MGwyNyAtMjdsLTY4IC02OGwtMjcgMjh6TTYyOSAzMDB2MzhoOTZ2LTM4aC05NnpNMTkyIDMwMHYzOGg5NXYtMzhoLTk1ek0yNDQgNDYzbDI4IDI3bDY3IC02N2wtMjcgLTI4eiIgLz4KPGdseXBoIHVuaWNvZGU9Ii0iIGhvcml6LWFkdi14PSI5MjEiIGQ9Ik00NjEgNjk4cTE3NCAwIDI5NyAtMTIzLjV0MTIzIC0yOTcuNXQtMTIzIC0yOTcuNXQtMjk3IC0xMjMuNXEtMTc1IDAgLTI5OCAxMjMuNXQtMTIzIDI5Ny41dDEyMyAyOTcuNXQyOTggMTIzLjV6TTY5NCAyNTh2MzlxMCAxOSAtMTQgMzN0LTMzIDE0aC0zNzZxLTE5IDAgLTMzIC0xNHQtMTQgLTMzdi0zOXEwIC0yMCAxNCAtMzMuNXQzMyAtMTMuNWgzNzZxMTkgMCAzMyAxMy41dDE0IDMzLjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iLiIgaG9yaXotYWR2LXg9Ijk0NSIgZD0iTTE0NyAzOTJxMzcgMCA2NCAtMjd0MjcgLTY0cTAgLTM4IC0yNi41IC02NXQtNjQuNSAtMjd0LTY1IDI3dC0yNyA2NXQyNyA2NC41dDY1IDI2LjV6TTQ3MiAzOTJxMzggMCA2NSAtMjYuNXQyNyAtNjQuNXQtMjcgLTY1dC02NSAtMjd0LTY0LjUgMjd0LTI2LjUgNjVxMCAzNyAyNi41IDY0dDY0LjUgMjd6TTc5OCAzOTJxMzggMCA2NSAtMjYuNXQyNyAtNjQuNXQtMjcgLTY1dC02NSAtMjd0LTY1IDI3dC0yNyA2NXEwIDM3IDI3IDY0dDY1IDI3eiAiIC8+CjxnbHlwaCB1bmljb2RlPSIvIiBob3Jpei1hZHYteD0iOTEyIiBkPSJNNjkzIDUzN2gxODF2LTEyN3YtMzAxaC0xODF2LTUzbC0xMzYgLTEzNmgtMzM2djE4OWgtMTgxdjMwMXYxMjdoMTgxdjE2M2g0NzJ2LTE2M3pNODE2IDQ4MGgtMTA1di01M2gxMDV2NTN6TTI3NSA2NDZ2LTEwOWgzNjR2MTA5aC0zNjR6TTUwMiAtMjZ2MTM2aDEzN3YxMzF2NTVoNTR2LTEyOWg2N3YxOTdoLTYwNHYtMTk3aDY1djExMXYxOGg1NHYtNTV2LTI2N2gyMjd6IiAvPgo8Z2x5cGggdW5pY29kZT0iMCIgaG9yaXotYWR2LXg9Ijg4OSIgZD0iTTY0MyAxNjFsMzkgLTQwbDI4IC0yN3EtNDcgLTYwIC0xMTYuNSAtOTQuNXQtMTQ4LjUgLTM0LjVxLTE0MCAwIC0yMzguNSA5OHQtOTkuNSAyMzhoLTExaC0yaC02N2wxMjYgMTI2bDEyNyAtMTI2aC01MWgtMjhxMCAtMTAwIDcxLjUgLTE3MXQxNzIuNSAtNzFxNjAgMCAxMTIuNSAyNy41dDg1LjUgNzQuNXpNODEwIDMwMWg1MmwtMTI3IC0xMjZsLTEyNiAxMjZoNTBoMzB2MnEwIDEwMSAtNzEuNSAxNzIuNXQtMTcyLjUgNzEuNSBxLTYxIDAgLTExMy41IC0yOC41dC04Ni41IC03Ni41bC0zOSAzOWwtMjggMjhxNDcgNjEgMTE2LjUgOTZ0MTUwLjUgMzVxMTM5IDAgMjM4IC05OXQ5OSAtMjM4di0yaDI4eiIgLz4KPGdseXBoIHVuaWNvZGU9IjEiIGhvcml6LWFkdi14PSI3NDMiIGQ9Ik02ODggMjM1aDI5di0zMHEwIC0xNDMgLTEwMC41IC0yNDMuNXQtMjQzLjUgLTEwMC41dC0yNDQgMTAxdC0xMDEgMjQzcTAgMTQzIDEwMSAyNDR0MjQ0IDEwMXExNiAwIDI1IC0xdjc5djcxbDQ5IC01MGwxNTcgLTE1N2wyMSAtMjFsLTIxIC0yMGwtMTU3IC0xNTdsLTQ5IC01MHY3MHY4OHEtMTggMiAtMjUgMnEtODMgMCAtMTQxIC01OHQtNTggLTE0MXEwIC04MiA1OC41IC0xNDB0MTQwLjUgLTU4dDE0MCA1OHQ1OCAxNDB2MzBoMzBoODd6ICIgLz4KPGdseXBoIHVuaWNvZGU9IjIiIGhvcml6LWFkdi14PSI5MTkiIGQ9Ik00NTkgNzAxcTE3NCAwIDI5NyAtMTIzdDEyMyAtMjk3dC0xMjMgLTI5N3QtMjk3IC0xMjNxLTE3MyAwIC0yOTYgMTIzdC0xMjMgMjk3dDEyMyAyOTd0Mjk2IDEyM3pNNzI4IDM5MnE2IDYgNiAxNXQtNiAxNmwtNTUgNTRxLTYgNiAtMTUgNnQtMTYgLTZsLTI0MyAtMjQ0cS0xNSAtMTYgLTMxIDBsLTg4IDg4cS0xNiAxNiAtMzEgMGwtNTUgLTU0cS02IC03IC02IC0xNnQ2IC0xNWwxMzkgLTE0MHExNSAtMTUgMzcgLTE1aDI2cTIwIDAgMzcgMTV6ICIgLz4KPGdseXBoIHVuaWNvZGU9IjMiIGhvcml6LWFkdi14PSI4NjgiIGQ9Ik0yMiAyMzlxLTEwIDEwIC0xMCAyNHQxMCAyNGw4MyA4M3ExMCAxMCAyMy41IDEwdDIzLjUgLTEwbDEzNiAtMTM1cTEwIC0xMCAyMy41IC0xMHQyMy41IDEwbDM3MSAzNzJxMTAgMTAgMjMuNSAxMHQyMy41IC0xMGw4MyAtODJxMTAgLTEwIDEwIC0yMy41dC0xMCAtMjMuNWwtNDUwIC00NTFxLTI0IC0yNCAtNTcgLTI0aC0zOXEtMzIgMCAtNTYgMjR6IiAvPgo8Z2x5cGggdW5pY29kZT0iNCIgaG9yaXotYWR2LXg9Ijc2MiIgZD0iTTU5IDcwMGw3MDIgLTM1MWwtNzAyIC0zNTB2NzAxeiIgLz4KPGdseXBoIHVuaWNvZGU9IjUiIGhvcml6LWFkdi14PSI4MTYiIGQ9Ik01OSAxdjY5OGgyNjJ2LTY5OGgtMjYyek00OTUgNjk5aDI2MnYtNjk4aC0yNjJ2Njk4eiIgLz4KPGdseXBoIHVuaWNvZGU9IjYiIGhvcml6LWFkdi14PSI4MTciIGQ9Ik03NTggMmgtNjk5djY5OGg2OTl2LTY5OHoiIC8+CjxnbHlwaCB1bmljb2RlPSI3IiBob3Jpei1hZHYteD0iOTIyIiBkPSJNNDIzIDQxN3YxODJsNDg1IC0yNDNsLTQ4NSAtMjQydjE4MWwtMzY0IC0xODF2NDg1eiIgLz4KPGdseXBoIHVuaWNvZGU9IjgiIGhvcml6LWFkdi14PSI5MjIiIGQ9Ik01MDAgMjk1di0xODJsLTQ4NiAyNDNsNDg2IDI0MnYtMTgybDM2MyAxODJ2LTQ4NXoiIC8+CjxnbHlwaCB1bmljb2RlPSI5IiBkPSJNNDYwIDcwMHExNzQgMCAyOTcgLTEyM3QxMjMgLTI5N3QtMTIzIC0yOTd0LTI5NyAtMTIzdC0yOTcgMTIzdC0xMjMgMjk3dDEyMyAyOTd0Mjk3IDEyM3pNMjk4IDY0bDQzMSAyMTZsLTQzMSAyMTZ2LTQzMnoiIC8+CjxnbHlwaCB1bmljb2RlPSI6IiBob3Jpei1hZHYteD0iODAxIiBkPSJNNjcxIDEwMGwxMDUgLTEwMnEwIC0xNiAtMTIgLTI4LjV0LTI5IC0xMi41aC0yNDJxMSAtNCAxIC0xMnEwIC0zOSAtMjcuNSAtNjYuNXQtNjYuNSAtMjcuNXQtNjYuNSAyNy41dC0yNy41IDY2LjVxMCAyIDAuNSA2dDAuNSA2aC0yNDFxLTE2IDAgLTI4LjUgMTIuNXQtMTIuNSAyOC41bDEwNSAxMDJxLTEgOCAtMSAyNXYyMDhxMCA4OCA1MC41IDE1OHQxMzAuNSA5OHEtNCAxMSAtNCAyNnEwIDM5IDI3LjUgNjYuNXQ2Ni41IDI3LjUgdDY2LjUgLTI3LjV0MjcuNSAtNjYuNXEwIC0xNCAtMyAtMjZxODAgLTI4IDEzMC41IC05OC41dDUwLjUgLTE1Ny41di0yMDhxMCAtMTcgLTEgLTI1ek0zNDggNjE1cTAgLTUgMiAtMTVxMjggNSA1MCA1cTIzIDAgNTAgLTVxMyA4IDMgMTVxMCAyMiAtMTUuNSAzN3QtMzcuNSAxNXQtMzcgLTE1dC0xNSAtMzd6IiAvPgo8Z2x5cGggdW5pY29kZT0iOyIgaG9yaXotYWR2LXg9Ijg4NyIgZD0iTTI5OSA0MThsLTQyIC00NHEtNCAtNSAtMTEgLTEyLjVsLTEyLjUgLTEzLjVsLTEwLjUgLTExcS0xOCAxNiAtMjcgMjNxLTQ5IDQwIC04MSA0MGgtMTAxdjExMmgxMDFxNTkgLTEgMTE4IC00MXEzMyAtMjEgNjYgLTUzek0zOTkgMTU2bDQ0IDQ3bDMyIDM0cTE2IC0xNCAyNiAtMjJxNTIgLTQyIDg0IC00MGg4NnY5NGwxNzUgLTE0OGwtMTc1IC0xNDZ2ODhoLTg2cS01NiAwIC0xMjAgNDBxLTI3IDE3IC02NiA1M3pNNTgyIDQwMCBxLTIzIDAgLTU2IC0yMnEtMzUgLTIzIC03OCAtNjhxLTE5IC0xOSAtNTQuNSAtNTcuNWwtNjYuNSAtNjkuNXQtNjAgLTU1cS04MCAtNjQgLTE1NCAtNjVoLTk5djExMmg5OXEyNiAwIDU5IDIycTI5IDE4IDc5IDY4cTUgNSA3MyA3Ny41dDEwNyAxMDQuNXE4MSA2NCAxNTIgNjVoODh2OTJsMTc1IC0xNDdsLTE3NSAtMTQ3djkwaC04OGgtMXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3gzYzsiIGhvcml6LWFkdi14PSIzOTUiIGQ9Ik0xMTUgNDEwbDIyMiAyMjN2LTY2OGwtMjIyIDIyMmgtMTEydjIyM2gxMTJ6IiAvPgo8Z2x5cGggdW5pY29kZT0iPSIgaG9yaXotYWR2LXg9Ijk0NyIgZD0iTTg5NiAzNzl2LTE3NmwtNjMgLTI1di0xMDhoLTc3M3Y0NDJoNzczdi0xMDl6TTc2MCAxNDR2Mjk0aC02MjZ2LTI5NGg2MjZ6TTM3MyAzOTBsMjIyIC0xOThoLTQxM3YxOThoMTkxeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeDNlOyIgaG9yaXotYWR2LXg9Ijg4OSIgZD0iTTEyNiA0MDhsMjIyIDIyM3YtNjY4bC0yMjIgMjIyaC0xMTJ2MjIzaDExMnpNNDM0IDQzOHE3NSAtNTAgNzUgLTE0MHQtNzUgLTEzOWwtMzQgNjdxMzUgMjggMzUgNzJ0LTM1IDcydjJ6TTY4MCAyOThxMCAtOTIgLTQ2IC0xNjguNXQtMTIzIC0xMjAuNWwtMzQgNjZxNTkgMzQgOTQgOTMuNXQzNSAxMjkuNXQtMzUgMTI5LjV0LTk0IDkzLjV2MmwzMyA2NXE3NyAtNDQgMTIzLjUgLTEyMS41dDQ2LjUgLTE2OC41ek01ODcgNzM4IHExMTggLTY2IDE4OC41IC0xODN0NzAuNSAtMjU3dC03MC41IC0yNTd0LTE4OC41IC0xODJsLTMzIDY2cTk5IDU2IDE1OC41IDE1NS41dDU5LjUgMjE3LjV0LTU5LjUgMjE3LjV0LTE1OS41IDE1NS41eiIgLz4KPGdseXBoIHVuaWNvZGU9Ij8iIGhvcml6LWFkdi14PSI5MjIiIGQ9Ik00NjEgNzAycTE3NSAwIDI5OCAtMTIzLjV0MTIzIC0yOTcuNXQtMTIzIC0yOTcuNXQtMjk4IC0xMjMuNXEtMTc0IDAgLTI5Ny41IDEyMy41dC0xMjMuNSAyOTcuNXQxMjMuNSAyOTcuNXQyOTcuNSAxMjMuNXpNNDg5IDI5cTE5IDE4IDE5IDQ3dC0xOSA0N3EtMjAgMTcgLTQ5IDE3cS0yOCAwIC00OCAtMTdxLTIwIC0yMCAtMTggLTQ3cS0yIC0yNyAxOCAtNDdxMTkgLTE3IDQ4IC0xN3EzMiAwIDQ5IDE3ek02MDIgMzUxcTEwIDI0IDEwIDYyIHEwIDU4IC00MSA5M3EtMzggMzQgLTEwOCAzNHEtNDkgMCAtODUgLTEycS0zMyAtMTEgLTYzIC0zMWwtOSAtNmw0NiAtODdsMTAgOHEyIDEgMTkgMTFxNyA0IDIzIDEwcTEwIDQgMjMgNnE3IDIgMjEgMnEzMCAwIDM4IC0xMHExMSAtMTEgMTEgLTMxcTAgLTEzIC03IC0yNXEtMTIgLTE2IC0yMSAtMjRxLTQgLTQgLTguNSAtOGwtMTAgLTl0LTkuNSAtOHEtMTcgLTE2IC0zMCAtMzRxLTEyIC0yMCAtMjAgLTQ2cS01IC0yMiAtNSAtNDEgcTAgLTQgMC41IC0xMnQwLjUgLTEybDEgLTExaDExaDg4djEycTAgMjYgOCA0MnE5IDE2IDIxIDMwcTE0IDE0IDI5IDI1dDMyIDMwcTE0IDE3IDI1IDQyeiIgLz4KPGdseXBoIHVuaWNvZGU9IkAiIGhvcml6LWFkdi14PSI1MDgiIGQ9Ik0yNTggNzAzcTkyIDAgMTU3LjUgLTY2dDY1LjUgLTE1N3EwIC0xMDcgLTIwMyAtNTQ2bC0yNCAtNTBsLTYzIDEzNXQtMTAxIDI0NC41dC02MyAyMTYuNXEwIDkyIDY1LjUgMTU3LjV0MTU3LjUgNjUuNWg0aDR6TTI1NCAzOTdxNDIgMCA3MiAzMHQzMCA3M3EwIDQyIC0zMCA3MnQtNzIgMzBxLTQzIDAgLTczIC0zMHQtMzAgLTcycTAgLTQzIDMwIC03M3Q3MyAtMzB6IiAvPgo8Z2x5cGggdW5pY29kZT0iQSIgaG9yaXotYWR2LXg9Ijg5MyIgZD0iTTMxNSAyOTlsNzAgLTcwcS0zOCAtMzIgLTg4LjUgLTMwdC04Ni41IDM4bC0xNDQgMTQ0cS0zOCAzNyAtMzggOTF0MzggOTFsOTkgOTlxMzggMzggOTEuNSAzOHQ5MS41IC0zOGwxNDQgLTE0NHEzNiAtMzYgMzcuNSAtODYuNXQtMzAuNSAtODguNWwtNzAgNjlxMTAgMjAgLTYgMzhsLTE0NCAxNDRxLTkgOSAtMjIuNSA5dC0yMi41IC05bC05OSAtOTlxLTEwIC0xMCAtMTAgLTIzdDEwIC0yM2wxNDQgLTE0NHExNiAtMTYgMzYgLTZ6TTcyOCAtOTkgcS0zOCAtMzcgLTkxIC0zN3QtOTEgMzdsLTE0NSAxNDVxLTM1IDM1IC0zNyA4NS41dDMwIDg4LjVsNjkgLTcwcS05IC0yMCA3IC0zNmwxNDQgLTE0NHE5IC0xMCAyMi41IC0xMHQyMi41IDEwbDk5IDk5cTEwIDkgMTAgMjIuNXQtMTAgMjIuNWwtMTQ0IDE0NXEtMTYgMTYgLTM3IDVsLTY5IDcwcTM4IDMyIDg4LjUgMzAuNXQ4Ni41IC0zNy41bDE0NCAtMTQ0cTM3IC0zOCAzNyAtOTEuNXQtMzcgLTkxLjV6TTI2MyA0NjVxMTQgMTQgMzQgMTQgdDM0IC0xNGwyOTUgLTI5NXExNCAtMTQgMTQgLTM0dC0xNCAtMzR0LTM0IC0xNHQtMzQgMTRsLTI5NSAyOTRxLTE0IDE0IC0xNCAzNC41dDE0IDM0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iQiIgaG9yaXotYWR2LXg9Ijg4MSIgZD0iTTczNCAzMTFxLTE0IC0yNyAtNDIgLTUwcS0xMiAtMzAgLTMxLjUgLTU4dC01NC41IC02MHQtOTIuNSAtNTEuNXQtMTI5LjUgLTE5LjVxLTc3IDAgLTE0My41IDIxdC0xMDUuNSA1MXQtNjcgNjB0LTM5IDUxbC0xMSAyMXE1IC0zIDE0LjUgLTYuNXQzOC41IC0xMS41dDU4IC0xMnQ3MCAtMC41dDc4IDE3LjVxLTY0IDI3IC05NiA5MXEtMjEgNDMgLTggNTRxNyA3IDI1IC0xMHE1MyAtNTAgMjEyIC00MXE3IDggMjEgMjZ2NXEwIDY3IDQ3IDExNCB0MTE0IDQ3cTY0IDAgMTEwIC00My41dDUxIC0xMDYuNWwxMDIgLTQ5ek02MjYgNDY5cS0xOSAwIC0zMiAtMTMuNXQtMTMgLTMyLjV0MTMgLTMydDMyIC0xM3QzMi41IDEzdDEzLjUgMzJ0LTEzIDMyLjV0LTMzIDEzLjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iQyIgaG9yaXotYWR2LXg9IjkxMyIgZD0iTTc3MSAzMTdxNDYgLTE4IDc0IC01OS41dDI4IC05Mi41cTAgLTY4IC00OC41IC0xMTYuNXQtMTE2LjUgLTQ4LjVxLTIgMCAtNSAwLjV0LTQgMC41aC00OTRoLTFoLTJxLTY5IDEgLTExNy41IDUwdC00OC41IDExOXEwIDQ1IDIyLjUgODMuNXQ2MC41IDYwLjVxLTYgMTYgLTYgMzVxMCA0NyAzNCA4MXQ4MSAzNHEzOCAwIDcxIC0yNXEzMSA2NCA5MSAxMDN0MTMzIDM5cTEwMyAwIDE3NiAtNzIuNXQ3MyAtMTc2LjVxMCAtMTAgLTEgLTE1eiIgLz4KPGdseXBoIHVuaWNvZGU9IkQiIGhvcml6LWFkdi14PSI5MTciIGQ9Ik00NTkgNjk4cTE3MyAwIDI5NS41IC0xMjN0MTIyLjUgLTI5NnQtMTIyLjUgLTI5NS41dC0yOTUuNSAtMTIyLjV0LTI5NiAxMjIuNXQtMTIzIDI5NS41dDEyMyAyOTZ0Mjk2IDEyM3pNNTc0IDI1MnEtMTEgMTIgLTExIDI4dDExIDI4bDEwOSAxMDhxMTEgMTIgMTEgMjguNXQtMTEgMjcuNWwtMzEgMzFxLTEyIDExIC0yOC41IDExdC0yNy41IC0xMWwtMTA4IC0xMDlxLTEyIC0xMSAtMjguNSAtMTF0LTI3LjUgMTFsLTEwOSAxMDkgcS0xMSAxMSAtMjcuNSAxMXQtMjcuNSAtMTFsLTMxIC0zMXEtMTEgLTExIC0xMSAtMjcuNXQxMSAtMjguNWwxMDkgLTEwOHExMSAtMTIgMTEgLTI4dC0xMSAtMjhsLTEwOSAtMTA4cS0xMSAtMTIgLTExIC0yOC41dDExIC0yNy41bDMxIC0zMXExMSAtMTEgMjcuNSAtMTF0MjcuNSAxMWwxMDkgMTA5cTExIDExIDI3LjUgMTF0MjguNSAtMTFsMTA4IC0xMDlxMTEgLTExIDI3LjUgLTExdDI4LjUgMTFsMzEgMzFxMTEgMTEgMTEgMjcuNXQtMTEgMjguNXogIiAvPgo8Z2x5cGggdW5pY29kZT0iRSIgaG9yaXotYWR2LXg9Ijg5NSIgZD0iTTQ0OCA1MzFxNjMgMCAxMjkuNSAtMjMuNXQxMTUuNSAtNTd0ODkuNSAtNjd0NjEuNSAtNTcuNWwyMSAtMjN2LThsLTIyIC0yNC41dC01OS41IC01NC41dC05MiAtNjl0LTExNCAtNTQuNXQtMTMwLjUgLTI0LjV0LTEyOS41IDIzLjV0LTExNS41IDU3dC04OS41IDY3dC02MS41IDU2LjVsLTIxIDI0djlsMjIgMjQuNXQ1OS41IDU0LjV0OTIgNjguNXQxMTQgNTR0MTMwLjUgMjQuNXpNNDQ2IDE1OHE1OCAwIDk4LjUgNDAuNXQ0MC41IDk4LjUgcTAgNTcgLTQwLjUgOTcuNXQtOTguNSA0MC41cS01NyAwIC05Ny41IC00MC41dC00MC41IC05Ny41cTAgLTU4IDQwLjUgLTk4LjV0OTcuNSAtNDAuNXpNNDQ2IDM2MXEyNiAwIDQ1IC0xOXQxOSAtNDV0LTE5IC00NC41dC00NSAtMTguNXQtNDQuNSAxOC41dC0xOC41IDQ0LjV0MTguNSA0NXQ0NC41IDE5eiIgLz4KPGdseXBoIHVuaWNvZGU9IkYiIGhvcml6LWFkdi14PSI3MDQiIGQ9Ik0yMjQgNzAwaDQyMnYtODE4aC01OTN2NjQ2bDE3MSAxNzF2MXpNNTc4IC01MHY2ODJoLTI4NXYtMTcyaC0xNzJ2LTUxMGg0NTd6IiAvPgo8Z2x5cGggdW5pY29kZT0iRyIgZD0iTTQ2MCA2OThxMTc0IDAgMjk3IC0xMjN0MTIzIC0yOTd0LTEyMyAtMjk3dC0yOTcgLTEyM3QtMjk3IDEyM3QtMTIzIDI5N3QxMjMgMjk3dDI5NyAxMjN6TTczOCA0MDFsLTEgLTNxLTEgLTMgLTEgLTUuNXQyIC0yLjVxMCAtMiAzIC02dDMgLTh2LTExcTEgLTIgNSAtM3ExIC00IDYgLTV0NiAzcS0zIDAgLTIuNSA0LjV0LTAuNSA0LjVxMCAyIC0xIDNxLTIgMiAtMiAzaDdxMCAyIC0yIDV0LTIgNHEtMSAwIC0yLjUgLTF0LTIgLTF0LTAuNSAyIHQtNCA2bC0yIDdxMyAwIDYgMXEtMSAwIDQgMnEtMSAxIC0yIDRxLTIgNCAtNyAycS0yIDAgLTUgLTIuNXQtNSAtMi41ek03MzUgODFxNjMgOTAgNjMgMTk3cTAgMTkgLTEgMjhxLTkgMCAtMTMgMnEtNCAwIC0xNC41IDQuNXQtMTYuNSAyLjVxMCAxIC0xIDFxMiAzIC01IDExcS01IDQgLTcgMHEtMiAtMyA1IC0xMHEwIC0yIDIgLTZxMiAtMSAxIC0zdC0xIC0zcTQgMCA1IDdxMCAtMSAxIC0xcS0yIC0zIDEgLTZ2LTVxMTAgMCAxNCAxMCBxMSAwIDEgLTJ0MSAtM3EzIC0zIDIgLTV0MiAtMnEyIC0xIDIgMXYycTQgLTIgNCAtNnQtNCAtNnEwIC0xIC0xIC0zdC0xIC00cTAgLTYgLTQgLThsLTQgLTJxLTQgLTMgLTggLTUuNXQtNCAtMy41cS0xMiAwIC0xNSAtN3EtNyAwIC0xMSAtNHEtNiAwIC04LjUgNnQtNC41IDZsLTIgNXExIDAgLTEuNSA2bC01LjUgMTN0LTMgOWwtNSAxMHEtMiAxIC03IDEycS04IDQgLTEwIDEzcTEwIDAgMTAgNHEtMSAwIC0yIDFxLTIgMiAxIDJsMyA5IHEwIDEgMSA1LjV0MSA2LjVxLTIgMCAtOCAtMnEwIC0xIC0xLjUgLTAuNXQtMy41IDAuNWwtMyAxcTAgMSAtNi41IDB0LTguNSAycS0yIDIgLTQgMTRxLTEgMyAtOCAzcS0zIDEgLTMuNSAtMXQwLjUgLTVsMSAtNHEyIDAgLTIgLTdxLTEgLTEgLTEgLTJxLTQgMSAtNiA2dC00IDZxLTEgNCAtMyA0cTAgMTAgLTEgMTBsLTMgMXEtNCAyIC01IDNxLTIgMCAtNS41IDMuNXQtNi41IDUuNXQtNCAwbDMgLTZxMiAwIDUgLTQuNXQ3IC0zLjV2LTUgcTMgMSA0LjUgLTEuNXQyLjUgLTIuNXEwIC0xIC0zIDBxLTQgMiAtMyAtMXEyIC02IC00IC05cTAgMTIgLTMgMTJxLTIgMyAtNyA1dC02IDRxLTEgMCAtMy41IDMuNXQtNC41IDQuNXEtMiAtMiAtNSAtMnEtMSAtMiAtNC41IC0yLjV0LTcuNSAwLjVsLTMgMXEtNyAtMTggLTggLTIwcS0xIC0zIC0zIC01dC0zIC01cTAgLTEgLTcuNSAtMS41dC03LjUgLTEuNXEtMTEgNCAtMTEgMTN2NXQxIDl0MSA2bDIgLTJoMy41aDQuNXQzLjUgMXQxLjUgMiBxNCAwIDMgLTRxOSAtMyA5IDNxLTIgMCAtMiAycTMgNCAyIDd0LTQgNnQtMyA0bC00IDRxOSAtNiAxMSAtMXEwIDEgLTEgM3YxcTIgLTIgMy41IC0yLjV0Mi41IDEuNXEyIDEgMyAzdjZxMyAtNCA0LjUgMHQyLjUgNXEwIC0zIDMgMHEyIDIgMyAycTEgMiA1IDIuNXQ1IDMuNXEtMyAxIC0zIDEycTIgMCA0LjUgMS41dDMuNSAxLjV0MiAtMnEwIC02IDEgLTZxNCAyIDQgNXEtMiAwIC01IDEwcS0zIDAgLTUgLTJxLTMgMCAtNy41IDF0LTYuNSAxIHEtNyA3IC02IDdxLTIgNCAyIDVoMnEwIDIgMTEuNSA1dDEyLjUgOHEtNiAwIDggMTNxMTAgOCAxNCA4cTEgMCA5LjUgMmwxNC41IDMuNXQ4IC0wLjVxMjIgMCAyMiAtMnExIDAgMy41IC0xdDQgLTEuNXQzLjUgMC41cTMgMiAxMSAtMnQ4IC04cS0zIDAgLTEyIC0xdC0xNCAtMXYtMnEyIDAgNS41IC00LjV0Mi41IC02LjVxMyAwIDYgMnQ0IDJxMCAtMiAxIC0zcTMgLTIgNCAzbC0xIDRxMSAyIDQuNSAyLjV0NC41IDMuNXEtNDcgNTYgLTExNC41IDg4IHQtMTQzLjUgMzJxLTEzNCAwIC0yMzEgLTkxcTEgLTEgNSAybDIgMXEwIC02IDEgLThsMyAtN3E4IDAgOSAtMmgtNXExIC02IC0zIC00cS0zIDEgLTQgMXEwIDEgLTMgMnQtNSAwdDAgLTVxMSAwIDIgLTF0MyAtMnEyIDAgNi41IC0xdDYuNSAtMnEyIDAgNSAwLjV0NCAwLjVxMiAxIDMgMnQtMSAycTEgMiAtNCA0cTAgMSAxMSAxcTIgMiAxLjUgMy41dDAuNSAzLjV0NCAydDQgM3E0IC0yIDUgLTZxMSAwIDMgLTNxOSAtMTAgOSAtM3E2IC0xIDYgLTExIHE3IDEgNyAxMXEtMSAwIC0xIDNoNHEyIC0xIDIgMXExIDAgMSAtMmg4di0xMXEwIC0yIC0yIC0zdC0zIC0xbC0yIC0xcS0zIC00IC0xLjUgLTV0Ni41IC0zLjV0NiAtMy41bC04IDFxLTEgMCAtNC41IC0wLjV0LTYgLTF0LTQuNSAwLjVxNSAwIDcgMTFxLTggMiAtMTEgLTVxLTEgLTQgLTQgLTMuNXQtNCAtMS41bC0yIC0xcS0zIC0xIC01IC0xLjV0LTIgMC41cS03IC0yIC03IC0xN3ExMSAtOCAxMSAtMTJxNCAtMSA5LjUgLTJ0OC41IC0xIHExIC0zIDQgLTNxMCAtNCA5IC00cTAgNiA2IC00cTEgLTIgMSAtM3EtMSAwIDAgLTIuNXQzIC01LjVxLTIgMCAtMSAtMXEyIC0yIDUuNSAtMXQzLjUgM3EtMiAwIC0yIDZxLTYgNiAxIDhxMCAtNCA2IDFxMiAyIC0xIDNxMiA5IDAgMTJxLTEgMSAtMi41IDF0LTIuNSAycTQgMSAxIDE0aDVxMiAwIDUuNSAtMS41dDUuNSAtMXQzIDMuNXEzIC0yIDQuNSAtNXQ0LjUgMXEwIC0xIDQgLTUuNXQ1IC00LjVxMCAtMyAyIC0zbC0xIC0ycTcgMCA3IDEgcTYgMCA2IDhxMSAwIDIuNSAtM2wzIC02dDIuNSAtM2wyLjUgLTIuNWwzIC0zdDIuNSAtM3QxIC0yLjVxMiAtMiAyIC01cTEgMCAyIDJxMyAzIDMgLTFxMiAwIDQuNSAtMi41dDIuNSAtMy41cS0yIDAgLTEuNSAtMnQtMC41IC0ycTAgLTEgLTExIC0xcS0xIC01IC02IC02dC0xMSAwLjV0LTExIC0wLjVxLTQgLTIgLTkuNSAtOC41dC01LjUgLTEwLjVxMyAwIDcuNSAzLjV0Ni41IDQuNXEyIDAgMTAgNHEwIC0xIDEgLTF2LTFxLTYgMCAtMiAtNyBxMSAtMSAxIC0ycTMgLTUgOCAtNXEwIC0xIC0yLjUgLTF0LTIuNSAtMmwtNSAtM2gtNmwxIDFsMSAxaDN2NHEtMyAwIC02IC0xLjV0LTUgLTEuNXEtNCAtNCAtNiAtNHEtMiAtMTAgLTYgLTEybC0yIC0xbC00IC0ybC0yIC0ybC0yIC0ycS0xIC0yIC0yIC01cS0zIC03IC0zIC05cS0xIDAgLTMuNSAtNS41dC02LjUgLTUuNXEtMSAtMiAtNS41IC02dC00LjUgLTEwcTEgLTEgMS41IC00dDEuNSAtNi41dDEgLTQuNXEwIC04IC00IC04bC0yIDN0LTEgMyBxMCA0IC00IDEycTAgMiAtNC41IDEuNXQtNS41IC0wLjVxLTEgMyAtMTMgM3EwIC0xIDEgLTJ0MSAtM3EtNiAtMiAtNyAtMnEtMiAwIC00LjUgMi41dC01LjUgMS41cS0xNCAtMiAtMTQgLTE2cS0xIDAgLTEgLTguNXQxIC04LjVxMCAtMiAyIC02dDIgLTVxMiAwIDYgLTR0NSAtNHExIC00IDUgLTRsMiAxbDIgNHEtMyAxIC0xLjUgMy41dDMuNSAzLjVxMCAtMiA2IDJsNiAybDIgMnExIC0zIC0xIC00cS0yIDAgLTMgLTNsLTEgLTIgcS0xIC0yIC0yIC01dC0xIC01dDEgLTQuNXQwIC00LjVoMTN2M3EzIDAgMi41IC02LjV0MS41IC02LjVxMCAtMiAxIC02dDEgLTVxNSAtMyA0IC04cTEyIDAgMTIgM3E3IDAgNSAtN3E1IDAgNiAzdDEgNS41dDIgMi41cTAgMyAyIDFsNiAzbDMgMnEyIC0xIDIgLTJxNSAwIDkgNHEyIDAgNCAtNXQ2IC01cTEyIDAgMTMgMXEzIC0yIDMgLTNxMSAwIDIgLTFsMSAtMWgxbDQgLTRxMCAtMiAyLjUgLTN0Mi41IC0ybDEgLTFsMyAtMmw5IC0zcTEgMyA0IDAgcTEgLTEgMiAtMWwyIC0ycTEgLTEgNCAtN3EyIC0yIDQgLTExcS0xIDAgLTEgLThsNCAtMXEyIDAgMiAycTIgMCA1IC0ydDQgLTJxLTIgLTIgMSAtMy41dDMgMi41cTMgMCAzIC0xMXEyIDAgNC41IDEuNXQ0LjUgMS41cTYgMCA2IDFxOCAtMiAxMyAtOHE1IC01IDUuNSAtMTR0LTQuNSAtMTRsLTggLTEwcTAgLTEyIC0xIC0xMnEwIC0xNCAtMyAtMTRxMCAtMyAtMi41IC03dC0zLjUgLTZxLTEgLTEgLTYuNSAtNC41dC02LjUgLTUuNSBxLTEgMCAtNCAtMXQtNCAtMWwtMiAtM3EtMyAtMyAtMiAtM3EwIC0xIC0wLjUgLTcuNXQtMS41IC04LjVxLTQgLTIgLTMgLTRxLTEgMCAtMS41IC0xdC0zLjUgLTFxLTIgMCAtNSAtMi41dC0zIC01LjVxLTIgLTggLTYgLTExbC0zIC0ycS00IC0yIC00IC00di04cS02IDAgLTggLTRxLTQgMCAtMTEgLTRxMCAtNCAtMiAtNHEwIC00IC0zIC0zdC00IDBxMiAwIDIgLTZxMCAtMSAtNiAtOWwtMSAtMnEtMiAtMyAtMyAtM3EwIC0xIC0wLjUgLTQgdC0wLjUgLTV2LTNsMiAycTAgMSAyIC0xcS0xIC0yIC0zIC00dC0zIC01cS01IDAgLTUgLThxMCAtMiAxIC0ycTAgLTEgMiAtNWwtMjcgOXEwIDM3IDQgMzdxMCA5IDIgOXYxNHEtMSAyIDEuNSA2LjV0Mi41IDYuNXEzIDEgMy41IDEwdDAuNSAxN3QyIDhxMCA0IDEuNSAyMC41dC0wLjUgMjAuNWwtNyA4cS01IDAgLTkgNi41dC00IDEyLjVxLTMgOSAtMyAxMHExIDAgLTIgNC41dC02IDkuNWwtNCA1cS0zIDMgLTMgNC41dDIgNXQyIDYuNSBxLTQgMiAtMiAxMC41dDUgOC41cTAgMyAzIDRxMSAtMyAzIC0ycTMgMyAwIDV2MTNxMCAxMCAtNSAxMHEtMiAwIC00IC01cS0xIDEgLTUgMS41dC03IDJ0LTMgNC41cTIgNiAtOCAxMXExIDQgLTUuNSA4LjV0LTEwLjUgNC41cTAgMSAtMiAxLjV0LTIgMS41cS0yIDAgLTUgM3QtNiAzcS00IDAgLTEwIDIuNXQtOSAyLjVxLTEgMiAtNi41IDN0LTYuNSAzcS03IDAgLTcgMTNxMCAxOCAtOSAxOHEwIDMgLTQgNi41dC02IDMuNXEtMyA3IC01IDcgcTAgNCAtNiA5cS0zIDIgLTMgMHEtMSAtMiAyLjUgLTUuNXQzLjUgLTUuNXExIDAgOCAtMTNxNiAtMTAgMyAtMTFxLTQgLTEgLTEwIDhxLTIgNCAtMiA2cS0yIDEgLTQuNSA2LjV0LTIuNSA3LjVxLTEgMSAtMi41IDR0LTIuNSA2bC0xIDJxMCAxMCAtMTEgMTBsLTcgOXEwIDEwIC04IDEzcTAgMiAtMSA5dDAgMTBxMCAyMyAtMTAgMzFxLTMzIC02OCAtMzMgLTE0NHEwIC0xNDAgOTkuNSAtMjM5dDIzOS41IC05OXE4MiAwIDE1MyAzN3QxMTggMTAwIHEtNyAtMiAtOSA5cS0zIDE3IDIgMzJxNSAtMiA2IDBxLTQgMSAtMiA2cTEwIC03IDEwIDJsLTIgMnEwIDIgMSAzdDEuNSAwLjV0MC41IC0yLjVxMyAwIDMuNSA0LjV0MS41IDUuNXEwIC0xMSAzIC0xMnEyIC0yIC0wLjUgLTQuNXQtMi41IC0zLjVxLTIgLTEgLTIgLTZoLTNxMCAtMyAtMSAtOC41dC0xIC03LjVxLTIgMCAtMiAtMTZ6TTY2NiAzODNxMiAtMSAyIC00cTI1IDAgMjUgM3ExIC0yIDIgLTN0MiAycTEgMCA0LjUgLTN0Ny41IC0ybDcgNCBsLTIgMXEwIDYgLTUgOS41dC02IDQuNXEtMSAwIC0zLjUgMXQtNC41IDFxLTMgMiAtNiAtMXEtMyAtMiAtMyAwcS0xIDIgLTMgMnEwIDggLTkgN3EtMSAtMyAtMy41IC03dC0zLjUgLTcuNXQtMSAtNy41ek01MTggNDkxcTAgLTUgLTEgLTVxLTUgLTMgLTEwIC0zaC0xMXEtMiAwIC0xMCAycTAgMSAxIDJxMyA0IC0xIDRxNyAzIDggM3YtMXYtNHEwIC0xIDIgLTAuNXQ0LjUgMXQzLjUgMS41cTMgMCA2IDFxMSAxIDEuNSAwLjV0MC41IC0zLjV6IE01NTEgNDQ0cTAgMiAtMSA0dC0xIDRxMCAzIDMgMi41dDQgMy41cTMgLTEgMCAtM3YtNHEyIDAgNCAydDMgMnEtMiAtNyAtMSAtOHE1IC01IDQgLTZxNyAwIDUgLTExcTMgMCAzIDNxMiAtMSAyIC0yLjV0LTIgLTEuNXEtMyAtNSAtMTUgLTVxMCA2IC00IDNxLTMgLTEgLTIgNHExIDIgMSAzcS0yIDEgNSAycS0xIDggLTggOHpNNTM2IDQyOHEtMiAyIDAgOHEtMyAxIDEgMmw1IDJxLTQgMCAtMiA0aDJxMSAtMiAyIC0xaDRxMSAtMSAwIC0zIHEtMyAtMTIgLTEyIC0xMnpNNTUxIDQyMnExIDAgMSAxaDNxMCAtMiAtMS41IC0ydC0yLjUgMXpNMzkyIDQwMXExIDEgNCAzcTAgLTMgLTQgLTN6TTU5OCAzODhxMiAwIC0xIC02cS0xIDIgLTIgNXEzIDAgMyAxek01OTggMzgwcTIgMCAxLjUgLTQuNXQtNS41IC0zLjVxMCA3IDIgN2wxIC0ycTEgMSAxIDN6TTYyMCAzNjVxMCAtNCAtMSAtNC41dC00LjUgMS41dC01LjUgMmg1cTEgLTEgNiAxek03MjggMjQwcTYgMCA2IDFxMTAgMCAxNiAzIHEwIC00IC0yLjUgLTkuNXQtMS41IC05LjVxLTMgMCAtMyAtNWwtMiAtMnEtMiAtMyAtNCAtNHEwIC0yIC05IC0xMXEtMSAtMiAtNS41IC02LjV0LTUuNSAtNi41cS0xNCAtMTQgLTEwIC0xNHEwIC0yNCAyIC0yNGwxIC02cTEgLTYgMSAtMTB0LTEgLTVxMCAtMyAtMiAtNy41dC0yIC02LjVsLTIgLTFsLTMgLTNxLTIgMCAtNCAtMy41dC0zIC0zLjVxMCAtNCAtMSAtMTF0LTEgLTExbC0xIC00bC0yIC02bC0xIC00cS0xNSAtOCAtMTUgLTE3IHEtNyAtMTAgLTggLTEycS0xOSAwIC0xOSAtNGgtMTVxMCAyIC0xIDZ0LTEgN3EtMSAwIC0yIDMuNXQtMiAzLjVxMCAxIC0yLjUgNi41dC00LjUgMTF0LTEgNS41cTAgOSAtMyA5cTAgNCAtMi41IDExdC0yLjUgMTBxLTEgMCAtMiA0dC0xLjUgNy41dDAuNSA0LjVxMCA0IDQgMjJxMSA5IC0zIDIzcS00IDAgLTQgNnEtNiA0IC02IDE1cTYgNiAzIDIwcS0zIDEgLTE0IDFxLTEgMyAtNy41IDR0LTE2LjUgMGwtMTAgLTFxLTEgLTIgLTQuNSAtMS41IHQtOC41IDIuNXQtNSAzcS0zIDAgLTcuNSA0LjV0LTQuNSA4LjVxLTQgMSAtOCA5LjV0LTQgMTIuNXEtNCA0IDAgOXEwIDMgLTMgMTJxMCAyIDEuNSA0dDEuNSA0cTAgMTEgNCAxOXEwIDEgMiA0dDIgNHEyIDMgMyAzcTIgMSAzIDNxMiAxIDUgNXEyIDMgMyA0cTMgMSAwIDRxNCAwIDQgMTBxMiAzIDYgM2wxIDFxNCA1IDUgNXEyIDMgNiAzcTEgLTEgMi41IC0xdDQuNSAxbDMgMXE1IDcgMTQgN3ExIDIgNSAxLjV0MTAuNSAtMS41dDcuNSAtMXYyIHEzIC0xIDcgLTEwdDQgLTEyaDhxMCAtNCAxMCAtNHExNiAwIDE2IDZxNiAwIDYgLTZoNnQ4LjUgLTAuNXQ3LjUgLTJ0MiAtMi41cTIgMCA0IC0zdDMgLTNxMCAtMyAyLjUgLTguNXQ0LjUgLTUuNXEwIC04IDUgLTExcTYgLTE0IDEyIC0xOHEtMSAtMiAxLjUgLTZ0Mi41IC01cTEgLTYgMyAtN3EwIC00IDUgLTExLjV0OCAtNy41cTAgLTEgLTEgLTJ0MiAtMnpNMzEyIDI5NnEwIC0zIDMgMHEwIC00IC00IC0ycS0yIDAgLTEgM3ExIDAgMiAtMXogTTMyOCAyOTdxNCAtMSA3LjUgLTMuNXQ1LjUgLTIuNXEzIC0zIDMuNSAtNHQtMS41IC0ycS04IC0yIC0xMiA1cS01IDAgLTEwIDVxNiAwIDcgMnpNMzYyIDI4M2wyIC0xcTIgLTIgMyAtNGwxIC0xaC0xM3EtMSAtMSAtNC41IC0xdC00LjUgMmg3bC0yIDRxMSAwIDUgLTF0NiAtMXYzek0zMzEgMjc4cTQgMCA0IC0zcS01IDAgLTQgM3pNMzM2IDI3NWwyIDNxMSAwIDEgLTJxLTEgLTEgLTMgLTF6TTM3NiAyNzhxMyAwIDMgLTFxLTQgMiAtMyAxeiBNMzczIDI3OGwyIC0xcS0xIDAgLTEgLTAuNXQtMSAtMC41djJ6TTM1NyAyNTBxMSAxIDEgMmwxIC0xcTAgLTEgLTIgLTF6TTc0MCAxMzRxMCAyIDIgM3oiIC8+CjxnbHlwaCB1bmljb2RlPSJIIiBob3Jpei1hZHYteD0iODY1IiBkPSJNNjg2IDI3OXYtMzc4aC0xNzd2MjM1aC0xNTJ2LTIzNWgtMTgzdjM3OGgtMTUzbDQxMiA0MTFsNDExIC00MTFoLTE1OHoiIC8+CjxnbHlwaCB1bmljb2RlPSJJIiBob3Jpei1hZHYteD0iOTMyIiBkPSJNODg0IDIzNHYtMzE0aC04MzZ2MzE0bDE1NyA0MThoNTIyek01ODIgMjM0aDE5OGwtMTA1IDMyMmwtNDE4IDFsLTEwNCAtMzIzaDE5N2w0OSAtOTZoMTMweiIgLz4KPGdseXBoIHVuaWNvZGU9IkoiIGhvcml6LWFkdi14PSI4NjIiIGQ9Ik04NDggNTM0bC0xMjIgLTEyMmw4MiAtODJsLTM3MCAtNDJsNDMgMzY5bDgxIC04MWwxMjIgMTIyek0xMzYgMTQ4bC04MiA4MmwzNjkgNDNsLTQzIC0zNzBsLTgxIDgybC0xMjIgLTEyMmwtMTYzIDE2M3pNMTgyIDM4OGwxOTcgLTY4bC0yMjEgMTh6TTM5MyA0MTd2LTg1bC0yOCA4MHpNNjgyIDE3NGwtMTk3IDY5bDIyMSAtMTl6TTQ3MSAxNDZ2ODVsMjggLTgxeiIgLz4KPGdseXBoIHVuaWNvZGU9IksiIGhvcml6LWFkdi14PSI4NjkiIGQ9Ik01MzAgMzUxbDMxOCAtMzE4di0xNjh2MGgtMTY4aC0xdjEyOWgtMTI4djEyOGgtMTI4bC02MSA2MXEtNDAgLTE0IC04MyAtMTRxLTEwOSAwIC0xODcgNzcuNXQtNzggMTg3LjV0NzggMTg3LjV0MTg3IDc3LjV0MTg3IC03Ny41dDc4IC0xODcuNXEwIC00MyAtMTQgLTgzek0yMjQgNDAycTM3IDAgNjMgMjZ0MjYgNjN0LTI2IDYzdC02MyAyNnQtNjMuNSAtMjZ0LTI2LjUgLTYzdDI2LjUgLTYzdDYzLjUgLTI2eiIgLz4KPGdseXBoIHVuaWNvZGU9IkwiIGQ9Ik00NjAgNzAxcTE3NCAwIDI5NyAtMTIzdDEyMyAtMjk3dC0xMjMgLTI5N3QtMjk3IC0xMjN0LTI5NyAxMjN0LTEyMyAyOTd0MTIzIDI5N3QyOTcgMTIzek00NjAgLTM0cTEzMCAwIDIyMi41IDkydDkyLjUgMjIzdC05Mi41IDIyM3QtMjIyLjUgOTJ0LTIyMi41IC05MnQtOTIuNSAtMjIzdDkyLjUgLTIyM3QyMjIuNSAtOTJ6TTQ2NCA1MjlxMTAzIDAgMTc2LjUgLTczLjV0NzMuNSAtMTc3LjV0LTczIC0xNzcuNXQtMTc3IC03My41IHQtMTc3LjUgNzMuNXQtNzMuNSAxNzcuNXQ3My41IDE3Ny41dDE3Ny41IDczLjV6TTM5NiAzNTlxMzMgMzMgMTAyIDcwbC0zMCA0MHEtNCAxIC0xMiAxcS02MSAwIC0xMTYuNSAtNTV0LTU1LjUgLTExNnEwIC02IDEgLTlsNDIgLTMycTM4IDcwIDY5IDEwMXpNNTQwIDE1NXExNiAwIDI4IDEydDEyIDI5dC0xMS41IDI5dC0yOC41IDEydC0yOSAtMTJ0LTEyIC0yOXQxMiAtMjl0MjkgLTEyeiIgLz4KPGdseXBoIHVuaWNvZGU9Ik0iIGhvcml6LWFkdi14PSI5NTIiIGQ9Ik04OTIgMzJsLTI3MyAyNjJsMjczIDIzNHEzIC04IDMgLTE1di00NjVxMCAtOCAtMyAtMTZ6TTQ3NiAyMzhsLTcyIDU4bC0zNiAzMGwtMjc1IDIzNXExMCAyIDE0IDJoNzM4cTQgMCAxNCAtMmwtMjc1IC0yMzVsLTM2IC0zMHpNODQ1IC0yaC03MzhxLTUgMCAtMTMgMmwyNzYgMjY1bDEwNiAtODdsMTA3IDg3bDI3NSAtMjY1cS04IC0yIC0xMyAtMnpNNjAgNTI4bDI3MyAtMjM0bC0yNzMgLTI2MnEtMyA4IC0zIDE2djQ2NXEwIDcgMyAxNXoiIC8+CjxnbHlwaCB1bmljb2RlPSJOIiBob3Jpei1hZHYteD0iOTQzIiBkPSJNODU3IDY3MHExNyAwIDIzIC02dDYgLTIzdi02NTVxMCAtMTcgLTYgLTIzdC0yMyAtNmgtMTA4aC01NDZoLTcxcS0yOCAwIC01My41IDI2LjV0LTI1LjUgNTIuNXY0ODFxMCAxNyA2IDIzdDIzIDZoOTJ2OTVxMCAxNyA2IDIzdDIzIDZoNjU0ek04MzcgN3Y2MTNoLTYxNHYtNzR2LTUwdi00NDVoLTQ5djQ0NWgtNzF2LTQ2MHEwIC03IDExIC0xOHQxOCAtMTFoNzFoNTQ2aDg4ek01MTEgNTU2di0yMjNoLTIyM3YyMjNoMjIzek03NjUgNTI1di0zNyBoLTE4NXYzN2gxODV6TTc2NSA0MTF2LTM3aC0xODV2MzdoMTg1ek03NjUgMjU5di0zN2gtNDc3djM3aDQ3N3pNNzY1IDE0NHYtMzdoLTQ3N3YzN2g0Nzd6IiAvPgo8Z2x5cGggdW5pY29kZT0iTyIgaG9yaXotYWR2LXg9IjkzMCIgZD0iTTg4MiA1MTB2LTUxMWgtNzB2NTExaDcwek02OTUgNTEwaDQ3di01MTFoLTU1NnY1MTFoNTJxNjggMTMzIDEyMiAxMzNoMjA3cTMyIDAgNjYuNSAtNDAuNXQ2MS41IC05Mi41ek01MTQgNTIycTEzIDAgMjIgOXQ5IDIydC05IDIxLjV0LTIyIDguNWgtMTA0cS0xMyAwIC0yMS41IC04LjV0LTguNSAtMjEuNXQ4LjUgLTIydDIxLjUgLTloMTA0ek00OCA1MTBoNjl2LTUxMWgtNjl2NTExeiIgLz4KPGdseXBoIHVuaWNvZGU9IlAiIGhvcml6LWFkdi14PSI5MDkiIGQ9Ik03MTkgNDk2aDE0M3YtNDk1aC02NTl2MWwtMTc3IDQ2MWw2MTUgMjM3ek02NjAgNDk2bC01MSAxMzNsLTM0NSAtMTMzaDM5NnpNOTcgNDMybDEwNiAtMjc3djMxOHpNMjU4IDU2aDU0OXYzODVoLTU0OXYtMzg1ek02OTkgMjkybDU4IC0xOTBoLTQzMmwxMDMgMTEybDY2IC00MmwxMjMgMTc3bDM4IC03MXpNMzc5IDI3NXEtMjIgMCAtMzcgMTV0LTE1IDM3dDE1IDM3dDM3IDE1dDM3IC0xNXQxNSAtMzd0LTE1IC0zN3QtMzcgLTE1eiIgLz4KPGdseXBoIHVuaWNvZGU9IlEiIGhvcml6LWFkdi14PSI4NDQiIGQ9Ik02ODEgNTIxcTYxIC01NCA5NS41IC0xMjkuNXQzNC41IC0xNjAuNXEwIC0xNjEgLTExNCAtMjc1LjV0LTI3NSAtMTE0LjV0LTI3NSAxMTQuNXQtMTE0IDI3NS41cTAgODUgMzUgMTYxdDk2IDEzMHEyMCAxNyA0Ni41IDE1LjV0NDMuNSAtMjEuNXExNyAtMTkgMTUuNSAtNDUuNXQtMjEuNSAtNDMuNXEtODggLTc4IC04OCAtMTk2cTAgLTEwOSA3Ni41IC0xODZ0MTg1LjUgLTc3dDE4NS41IDc3dDc3LjUgMTg2cTAgMTE3IC04OCAxOTUgcS0yMCAxOCAtMjEuNSA0NHQxNi41IDQ2cTE3IDE5IDQzLjUgMjAuNXQ0NS41IC0xNS41ek00MjMgMTY2cS0yNiAwIC00NC41IDE5dC0xOC41IDQ1djQwN3EwIDI2IDE4LjUgNDV0NDQuNSAxOXQ0NSAtMTl0MTkgLTQ1di00MDdxMCAtMjYgLTE5IC00NXQtNDUgLTE5eiIgLz4KPGdseXBoIHVuaWNvZGU9IlIiIGhvcml6LWFkdi14PSI5MDkiIGQ9Ik02NjggMTA1djg3bDEwNCA3MHYtMjYyaC03MzF2NTIzaDMyN3EtMiAtMSAtNi41IC0zdC02LjUgLTNxLTg3IC0zOSAtMTQxIC05OWgtNjl2LTMxM2g1MjN6TTg3NyA0MTdsLTMxMyAtMjExdjEzN3EtOTAgMCAtMTQxIC03cS00OSAtNiAtODkuNSAtMjF0LTYzLjUgLTMzLjV0LTM5IC0zNS41dC0yMiAtMjhsLTYgLTEycTAgNTQgMjAgMTAwdDUxLjUgNzUuNXQ3MC41IDUyLjV0NzcuNSAzNXQ3MCAyMHQ1MS41IDEwbDIwIDJ2MTI2eiIgLz4KPGdseXBoIHVuaWNvZGU9IlMiIGhvcml6LWFkdi14PSI4NTMiIGQ9Ik04MjYgMzg5cTEwIC0xMSA4IC0yNHEwIC0xMyAtMTAgLTI4cS0zIC00IC0xNiAtMTRsLTE4NCAtMTIxcS0yIC0xIC01LjUgLTd0LTIuNSAtMTB2LTRsODEgLTIzN3E0IC0xMSA0IC0yM3EwIC0xNSAtNyAtMjVxLTExIC0xNiAtMzAgLTE2aC0xcS0xNiAxIC0zNiAxNWwtMTkwIDE1NXEtMyAzIC0xMCAzdC05IC0zbC0xODEgLTE1NHEtMTggLTE0IC0zNiAtMTVxLTIxIC0yIC0zMSAxNXEtOCAxMSAtOCAyNnEwIDcgNCAyMWw3MiAyMzZ2NCBxMSA1IC0yIDExdC02IDdsLTE4NSAxMjJxLTEwIDcgLTE2IDE0cS0xMSAxMyAtMTEgMjhxMCAxNCA4IDI0cTkgOSAxNiAxMnExMiA1IDI3IDVoMjMwcTYgMCAxMSA0cTcgNSA3IDEwbDY3IDIzOXE0IDE0IDkgMjFxMTMgMTggMzMgMTlxMjAgLTEgMzMgLTE5cTMgLTQgMTAgLTIxbDY2IC0yMzlxMCAtNSA3IC0xMHE1IC00IDExIC00aDIzMHE5IDAgMjAgLTNxMTQgLTQgMjMgLTE0eiIgLz4KPGdseXBoIHVuaWNvZGU9IlQiIGhvcml6LWFkdi14PSI4OTkiIGQ9Ik04MTcgMTg1bDYzIC02NGwtMTYyIC05MWwtOTIgLTE2M2wtNjMgNjRsMTQgMTQ4bC0xNjkgMTY5bC0yMjQgLTM3MWwtNjMgNjNsMTIwIDQ3NWwtMTc2IDE3NXEtMTkgMjAgLTE5IDQ2LjV0MTkgNDUuNXQ0NiAxOXQ0NiAtMTlsMTc2IC0xNzVsNDc1IDEyMGw2MyAtNjNsLTM3MSAtMjI1bDE2OCAtMTY4eiIgLz4KPGdseXBoIHVuaWNvZGU9IlUiIGhvcml6LWFkdi14PSI4OTQiIGQ9Ik03NjAgMTU0cTQ2IC0yMCA3Mi41IC00NC41dDI5LjUgLTM4LjVsMyAtMTR2LTg2aC04MzZ2ODZxMCAyIDAuNSA2dDYgMTV0MTUuNSAyMnQzMS41IDI2dDUwLjUgMjhxMTIgNSA1NCAyOXQ4NyA0M3Q5NCAyOHEtMzMgMzQgLTcyIDEzNHEtMTEgMjggLTExIDEwMHEwIDcgLTEgMzF0LTAuNSA0MS41dDMuNSAyOS41cTMxIDExMSAxNTkgMTExcTEyNyAwIDE1OCAtMTExcTQgLTEyIDQuNSAtMjkuNXQtMSAtNDF0LTEuNSAtMzEuNSBxMCAtNzIgLTEwIC0xMDBxLTM4IC05NiAtNzIgLTEzNHE1MCAtOCA5NC41IC0yN3Q4NyAtNDMuNXQ1NC41IC0yOS41eiIgLz4KPGdseXBoIHVuaWNvZGU9IlYiIGhvcml6LWFkdi14PSI5NDkiIGQ9Ik02NTkgNDE2bDIzNSAxMTF2LTQ0OWwtMjM1IDExMXYxdi0xMDNxMCAtMTkgLTEzIC0zMnQtMzIgLTEzaC01MTBxLTE5IDAgLTMyIDEzdC0xMyAzMnY0MzNxMCAxOSAxMyAzMnQzMiAxM2g1MTBxMTkgMCAzMiAtMTN0MTMgLTMydi0xMDR6IiAvPgo8Z2x5cGggdW5pY29kZT0iVyIgaG9yaXotYWR2LXg9Ijk1NCIgZD0iTTcwNCA1NHYxODFsOTIgOTN2LTI3NHEwIC01MSAtMzYgLTg3dC04NyAtMzZoLTQ5MnEtNTEgMCAtODcgMzZ0LTM2IDg3djQ5M3EwIDUxIDM2IDg3dDg3IDM2aDQ5MnExNyAwIDI0IC0ybC04OSAtOTBoLTQyN3EtMTMgMCAtMjIgLTl0LTkgLTIydi00OTNxMCAtMTMgOSAtMjJ0MjIgLTloNDkycTEzIDAgMjIgOXQ5IDIyek00MzEgMzE0bDM1NCAzNTRsMTMyIC0xMzJsLTM1NCAtMzU0djBsLTE5NSAtNjNsNjMgMTk1djB6TTU0NyAyMDggbC04OSA4OWwtNDMgLTEzMXoiIC8+CjxnbHlwaCB1bmljb2RlPSJYIiBob3Jpei1hZHYteD0iOTIxIiBkPSJNODY4IDU0MnYtNDIzaC02NnEtMTMgMjkgLTQwIDQ2LjV0LTYwIDE3LjV0LTU5LjUgLTE3LjV0LTQwLjUgLTQ2LjVoLTIyMHY0MjNoNDg2ek0yNDAgMTgzcS0zMyAwIC02MCAtMTcuNXQtNDAgLTQ2LjVoLTEwN3YxODBsMTExIDEyM2gxODR2LTI4NHEtMzMgNDUgLTg4IDQ1ek0xMDEgMjg4di01OGgxNjF2MTMyaC05OXpNMjQwIDE0NnEzMCAwIDUxLjUgLTIxdDIxLjUgLTUycTAgLTMwIC0yMS41IC01MS41dC01MS41IC0yMS41IHEtMzEgMCAtNTIgMjEuNXQtMjEgNTEuNXEwIDMxIDIxIDUydDUyIDIxek03MDIgMTQ2cTMxIDAgNTIgLTIxdDIxIC01MnEwIC0zMCAtMjEgLTUxLjV0LTUyIC0yMS41cS0zMCAwIC01MS41IDIxLjV0LTIxLjUgNTEuNXEwIDMxIDIxLjUgNTJ0NTEuNSAyMXoiIC8+CjxnbHlwaCB1bmljb2RlPSJZIiBob3Jpei1hZHYteD0iODYxIiBkPSJNNDI1IDQ4OGwtMTQ1IC00MDlsLTEyNiAxOTNsLTgxIC03NmwtMjIgLTIwbC00NiAzOWwxNjIgMTUxbDk2IC0xNDdsMTcxIDQ4M2wxNTcgLTYwNWwxMzEgNDEzbDExNiAtMzcxbC02MSAtMTZsLTU1IDE3OGwtMTM3IC00MzF6IiAvPgo8Z2x5cGggdW5pY29kZT0iWiIgaG9yaXotYWR2LXg9Ijg5NyIgZD0iTTQwMiA2MDd2LTM2OWgzNzFxMCAtMTUzIC0xMDggLTI2MXQtMjYxIC0xMDh0LTI2MSAxMDh0LTEwOCAyNjFxMCAxNTIgMTA3LjUgMjYwdDI1OS41IDEwOXpNNDk2IDcwMHExNTMgMCAyNjEuNSAtMTA4LjV0MTA4LjUgLTI2MS41aC0zNzF2MzcwaDF6IiAvPgo8Z2x5cGggdW5pY29kZT0iWyIgaG9yaXotYWR2LXg9Ijg2MSIgZD0iTTQ0NSA2NzF2LTI3OGg0MDl2LTE4NWgtNDA5di0yNzdsLTQyNyAzNzB6IiAvPgo8Z2x5cGggdW5pY29kZT0iXCIgaG9yaXotYWR2LXg9Ijg1NCIgZD0iTTcxMCA1NzloODd2LTczOWgtNzQwdjczOWg4OXY0NnEwIDM1IDIwIDU0dDU2IDE5dDU2LjUgLTE5LjV0MjAuNSAtNTMuNXYtNDZoNTJ2NDZxMCAzNCAyMC41IDUzLjV0NTYuNSAxOS41dDU2IC0xOXQyMCAtNTR2LTQ2aDUydjQ2cTAgMzQgMjAuNSA1My41dDU2LjUgMTkuNXQ1Ni41IC0xOS41dDIwLjUgLTUzLjV2LTQ2ek01OTggNjI1di0xMjNxMCAtMzIgMzUgLTMycTE5IDAgMjcuNSA3LjV0OC41IDI0LjV2MTIzcTAgMTcgLTguNSAyNC41IHQtMjcuNSA3LjVxLTM1IDAgLTM1IC0zMnpNMzkyIDYyNXYtMTIzcTAgLTE3IDguNSAtMjQuNXQyNy41IC03LjVxMzUgMCAzNSAzMnYxMjNxMCAzMiAtMzUgMzJxLTE5IDAgLTI3LjUgLTcuNXQtOC41IC0yNC41ek0xODcgNjI1di0xMjNxMCAtMzIgMzUgLTMycTE5IDAgMjcuNSA3LjV0OC41IDI0LjV2MTIzcTAgMTcgLTguNSAyNC41dC0yNy41IDcuNXEtMzUgMCAtMzUgLTMyek03MzUgLTk5djUxNGgtNjE2di01MTRoNjE2ek00MjkgOTkgcTAgLTQ1IC0zNSAtNzB0LTkwIC0yNXEtMzYgMCAtNzMgMTRsNyA1MnEzNSAtMTQgNzMgLTE0cTI0IDAgMzggMTF0MTQgMjhxMCAyMiAtMTYuNSAzMi41dC01OS41IDEyLjV2NTJxNjMgNSA2MyAzOHEwIDI4IC00MiAyOHEtMjkgMCAtNjEgLTE1bC03IDUycTM0IDE1IDg0IDE1cTQ1IDAgNzEgLTE4dDI2IC00NnEwIC01MCAtNjUgLTcydi0xcTczIC0yMCA3MyAtNzR6TTUzNyAyMjlsLTUyIC0yMGwtNyA1Mmw5MSA0NGgzMXYtMjk2aC02M3YyMjB6ICIgLz4KPGdseXBoIHVuaWNvZGU9Il0iIGhvcml6LWFkdi14PSI4NjEiIGQ9Ik00MTUgLTY5djI3N2gtNDA4djE4NWg0MDh2Mjc4bDQyOCAtMzcweiIgLz4KPGdseXBoIHVuaWNvZGU9Il4iIGhvcml6LWFkdi14PSI3NzUiIGQ9Ik03NDkgNTcycTIyIC00NiAtMyAtMTMycS0yNCAtODUgLTUgLTIzNHEtOCAtMiAtMjEgLTR0LTQ5IC04dC02NiAtOHQtNjEgLTJ0LTQ2LjUgOXQtMTAuNSAyNnExNSA0OCAtNDggNDZxLTYxIC0yIC0xODIgLTQ4cS0zNyAtMTQgLTYzIC0zdjM5OXEyMiA2IDU4IDE1dDExMiAyNXQxMjYuNSAxNC41dDUwLjUgLTI0LjVxMCAtMyAtMiAtMTQuNXQtMy41IC0yM3QtMS41IC0yM3Q1IC0xOHQxNiAtNS41cTMwIDQgNzguNSA3dDgyLjUgNHogTTE0NSA2NTh2LTgxN2gtODV2ODE3cTAgMTcgMTIuNSAyOS41dDMwLjUgMTIuNXExNyAwIDI5LjUgLTEyLjV0MTIuNSAtMjkuNXoiIC8+CjxnbHlwaCB1bmljb2RlPSJfIiBob3Jpei1hZHYteD0iODIwIiBkPSJNNTkgMTk4djE5OWg3MDJ2LTE5OWgtNzAyeiIgLz4KPGdseXBoIHVuaWNvZGU9ImAiIGhvcml6LWFkdi14PSI5MzYiIGQ9Ik0zMDYgMzc4bC0xNTIgMTUzbC05NSAtOTZ2Mjc3aDI3N2wtOTUgLTk1bDE1MiAtMTUyek03ODMgNzVsOTUgOTV2LTI3NmgtMjc3bDk1IDk1bC0xNTIgMTUxbDg3IDg3ek02MzEgMzc4bC04NyA4N2wxNTIgMTUybC05NSA5NWgyNzZ2LTI3N2wtOTQgOTV6TTMwNiAyMjdsODcgLTg3bC0xNTIgLTE1Mmw5NSAtOTVsLTI3NyAxdjI3N2w5NSAtOTZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iYSIgaG9yaXotYWR2LXg9IjgxMCIgZD0iTTc0NSAxNDRxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV0LTE0LjUgLTM2dC0zNS41IC0xNXEtMiAwIC02IDAuNXQtNiAwLjVxLTQyIC0zNiAtNzkgLTU5cS04MyAtNTUgLTE1NyAtNzZxLTcxIC00NCAtOTAgLTQ0cS0xNCAwIC05NSA0NXEtNzYgMjIgLTE1NiA3NXEtNDAgMjcgLTc5IDU5cS0yIDAgLTUuNSAtMC41dC01LjUgLTAuNXEtMjEgMCAtMzYgMTV0LTE1IDM2dDE1IDM1LjV0MzYgMTQuNXQzNS41IC0xNC41dDE0LjUgLTM1LjV2LTggcTkgLTggMzQgLTIydDM4IC0yM3E0NyAtMzEgMTQ0IC0zM2wzMiAxNTFxNCA5OCA3IDE5MmgtMTM2bC01MiAxMnEtMTQgLTE3IC0zMyAtMTdxLTE3IDAgLTI5IDExLjV0LTEyIDI4LjV0MTIgMjguNXQyOSAxMS41cTIyIDAgMzMgLTE4aDE5MHEyIDcyIDMgOTZxLTMyIDEwIC01MiAzNi41dC0yMCA2MC41cTAgNDIgMjkuNSA3MS41dDcwLjUgMjkuNXE0MiAwIDcxLjUgLTI5LjV0MjkuNSAtNzEuNXEwIC0zMyAtMjAgLTU5LjV0LTUxIC0zNi41IHEwIC03IDEuNSAtNDAuNWwyLjUgLTU2LjVoMTg5cTExIDE4IDMzIDE4cTE3IDAgMjkgLTExLjV0MTIgLTI4LjV0LTEyIC0yOC41dC0yOSAtMTEuNXEtMjEgMCAtMzIgMTdsLTUzIC0xMmgtMTM1bDYgLTE5MmwzMyAtMTU0cTc5IC00IDEyMCAyMXE1MCAzMCA5NiA2MnEtMSAyIC0xIDZxMCAyMSAxNSAzNS41dDM2IDE0LjV6TTM1MSA2MDFxMCAtMjIgMTUuNSAtMzcuNXQzNy41IC0xNS41cTIzIDAgMzguNSAxNS41dDE1LjUgMzcuNXQtMTYgMzcuNSB0LTM4IDE1LjV0LTM3LjUgLTE1LjV0LTE1LjUgLTM3LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iYiIgaG9yaXotYWR2LXg9IjkxOSIgZD0iTTQ2MSA2OTlsNDA4IC0xMTN2LTU5MWwtNDA4IC0xMTRsLTQxMCAxMTR2NTkxek00MjYgLTM4djQzOWwtMzA2IDg2di00NDF6TTQ2MCA0NjJsMzAwIDg0bC0yOTkgODJsLTMwMCAtODJ6TTgwMSA0NnY0NDBsLTMwNyAtODV2LTQ0MHoiIC8+CjxnbHlwaCB1bmljb2RlPSJjIiBob3Jpei1hZHYteD0iOTA4IiBkPSJNNzY3IDMxOHE0NiAtMTkgNzMuNSAtNjB0MjcuNSAtOTJxMCAtNjggLTQ4IC0xMTZ0LTExNiAtNDhoLTloLTE5OHYxNjJoMzBoNzZxMTIgMCAxNSA2LjV0LTQgMTYuNWwtMTQ1IDE3M3EtOCAxMCAtMTkuNSAxMHQtMTkuNSAtMTBsLTE0NSAtMTczcS04IC0xMCAtNSAtMTYuNXQxNiAtNi41aDc2aDMwdi0xNjJoLTE5OGgtMWgtMWgtMnYxcS02OCAxIC0xMTYuNSA1MHQtNDguNSAxMTdxMCA0NiAyMiA4NHQ2MCA2MXEtNSAxOCAtNSAzNCBxMCA0NyAzMy41IDgwLjV0ODEuNSAzMy41cTM5IDAgNjkgLTI0cTMxIDY0IDkxIDEwM3QxMzMgMzlxMTAzIDAgMTc1LjUgLTcyLjV0NzIuNSAtMTc1LjVxMCAtMTAgLTEgLTE1eiIgLz4KPGdseXBoIHVuaWNvZGU9ImQiIGhvcml6LWFkdi14PSI5MTgiIGQ9Ik00NTkgNjk5cTE3NCAwIDI5Ni41IC0xMjN0MTIyLjUgLTI5NnEwIC0xNzQgLTEyMi41IC0yOTYuNXQtMjk2LjUgLTEyMi41cS0xNzMgMCAtMjk2IDEyMi41dC0xMjMgMjk2LjVxMCAxNzMgMTIzIDI5NnQyOTYgMTIzek03NzQgMjgwcTAgMTMwIC05Mi41IDIyMnQtMjIyLjUgOTJxLTEwMCAwIC0xODIgLTU4bDQzOCAtNDM4cTU5IDgxIDU5IDE4MnpNMTQ1IDI4MHEwIC0xMzAgOTIgLTIyMnQyMjIgLTkycTEwMyAwIDE4MyA1OGwtNDM4IDQzOSBxLTU5IC04MyAtNTkgLTE4M3oiIC8+CjxnbHlwaCB1bmljb2RlPSJlIiBob3Jpei1hZHYteD0iNTU2IiBkPSJNNTUwIDY5OWwtMTkzIC0zNDJoMTU4bC01MTAgLTQ3NmwyMzkgMzg2aC0xNjB6IiAvPgo8Z2x5cGggdW5pY29kZT0iZiIgaG9yaXotYWR2LXg9IjkxMiIgZD0iTTU2IDQxNXExNDkgMCAyNzUgLTczLjV0MjAwIC0xOTkuNXQ3NSAtMjc1aC0xNjBxLTIgMTYxIC0xMTUgMjc0cS0xMTQgMTE0IC0yNzUgMTE0djE2MHpNNTYgNzAwcTE2OSAwIDMyMi41IC02NnQyNjUuNSAtMTc3LjV0MTc4IC0yNjZ0NjcgLTMyMy41aC0xNjBxLTEgMTgzIC05MS41IDMzNy41dC0yNDUgMjQ0LjV0LTMzNi41IDkwdjE2MXpNMTY3IDkwcTQ2IDAgNzguNSAtMzIuNXQzMi41IC03OC41dC0zMi41IC03OC41dC03OC41IC0zMi41IHQtNzguNSAzMi41dC0zMi41IDc4LjV0MzIuNSA3OC41dDc4LjUgMzIuNXoiIC8+CjxnbHlwaCB1bmljb2RlPSJnIiBob3Jpei1hZHYteD0iODk0IiBkPSJNODY1IDM2di0zNWgtMTUxdjQ3djFxLTQgNDMgLTU1IDczcS0xMCAxNiAtMjIgNDdxLTUgMTEgLTUgNDBxMCAzNyAxIDQxcTEzIDQ0IDY0IDQ0dDY0IC00NHYtNDFxMCAtMzAgLTQgLTQwcS0xNSAtMzkgLTI5IC01NHEyMCAtNCAzOCAtMTEuNXQzNS41IC0xN3QyMS41IC0xMS41cTE5IC04IDI5LjUgLTE4dDExLjUgLTE1ek0xODAgNDl2LTF2LTQ3aC0xNTF2MzVxMCAyIDEgNnQxMS41IDE0dDI5LjUgMThxNSAyIDIxLjUgMTJ0MzQuNSAxNy41IHQzOCAxMS41cS0xNCAxNSAtMjkgNTRxLTQgMTAgLTQgNDBxMCAzNyAxIDQxcTExIDQ0IDYzIDQ0cTUxIDAgNjQgLTQ0cTEgLTQgMSAtNDFxMCAtMzAgLTQgLTQwcS0xNSAtMzYgLTI0IC00OHEtNTMgLTMyIC01MyAtNzJ6TTYyMCAxMDJxMjUgLTExIDM5LjUgLTI0LjV0MTYuNSAtMjEuNWwyIC04di00N2gtNDYydjQ3cTAgMyAxLjUgOC41dDE2IDE5LjV0NDAuNSAyNnE2IDMgMjkgMTZ0NDggMjMuNXQ1MiAxNS41cS0xOCAyMSAtMzkgNzQgcS02IDEzIC02IDU2cTAgNTMgMSA1NnExNyA2MSA4NyA2MXQ4OCAtNjFxMSAtMyAxIC01NnEwIC00MSAtNiAtNTZxLTIxIC01NCAtNDAgLTc0cTI4IC01IDUyLjUgLTE1dDQ5IC0yNHQyOS41IC0xNnoiIC8+CjxnbHlwaCB1bmljb2RlPSJoIiBob3Jpei1hZHYteD0iOTA2IiBkPSJNODQ4IDQyNXEyNSAtNjggMjUgLTE0NHQtMjUgLTE0NHEtMTAgLTI4IC00MCAtMjhxLTYgMCAtMTAgMWwtNyAycS01NSAtMTExIC0xNjkgLTE2OWwyIC03cTQgLTE2IC0zLjUgLTMwdC0yMi41IC0yMHEtNzIgLTI1IC0xNDQgLTI1cS03MyAwIC0xNDUgMjVxLTE1IDYgLTIyLjUgMjB0LTMuNSAzMGwyIDdxLTExMiA1NSAtMTcwIDE2OWwtNyAtMnEtMyAtMSAtMTAgLTFxLTI5IDAgLTM5IDI4cS0yNiA3MCAtMjYgMTQ0dDI2IDE0NCBxMTAgMjggMzkgMjhxMyAwIDExIC0ybDYgLTFxNTggMTE1IDE3MCAxNjlsLTIgN3EtNCAxNiAzLjUgMzB0MjIuNSAyMHE3MiAyNSAxNDQgMjVxNzUgMCAxNDUgLTI2cTE1IC01IDIyLjUgLTE5dDMuNSAtMzBsLTIgLTdxMTEzIC01NiAxNzAgLTE2OWw2IDFxOCAyIDExIDJxMjkgMCAzOSAtMjh6TTgwOCAxNTFxMjMgNjMgMjMgMTMwcTAgNjYgLTIyIDEzMGwtMTY2IC00MXEyMCAtNDIgMjAgLTg5dC0yMCAtODl6TTU4MyAtNzRsLTQwIDE2NSBxLTQyIC0yMCAtODkgLTIwdC05MCAyMGwtNDAgLTE2NXE2MSAtMjMgMTMwIC0yM3E2OCAwIDEyOSAyM3pNNTYxIDEyOXExMiAtNyAxNyAtMTZxMjQgMTcgNDQgNDNxLTExIDYgLTE3IDE4cS04IDE3IDAgMzZxMTYgMzIgMTYgNzFxMCAzOCAtMTYgNzFxLTggMTggMCAzNnE3IDEyIDE3IDE4cS0xOSAyNSAtNDQgNDNxLTcgLTEyIC0xNyAtMTZxLTggLTQgLTE4IC00cS0xMSAwIC0xOCA0cS0zMyAxNiAtNzIgMTZxLTM4IDAgLTcxIC0xNiBxLTcgLTQgLTE4IC00cS0xMCAwIC0xOCA0cS0xMiA3IC0xNyAxNnEtMjUgLTE4IC00NCAtNDNxMTEgLTYgMTcgLTE4cTggLTE4IDAgLTM2cS0xNyAtMzYgLTE3IC03MXEwIC0zNiAxNiAtNzFxOSAtMTkgMCAtMzZxLTQgLTExIC0xNiAtMThxMTYgLTIyIDQ0IC00NHE1IDEwIDE3IDE3cTggNCAxOCA0cTExIDAgMTggLTRxMzMgLTE2IDcyIC0xNnEzOCAwIDcxIDE2cTcgNCAxOCA0cTEwIDAgMTggLTR6TTc1IDI4MXEwIC02NCAyMyAtMTMwbDE2NSA0MSBxLTIwIDQ1IC0yMCA4OXEwIDQ1IDIxIDg5bC0xNjYgNDFxLTIzIC02NyAtMjMgLTEzMHpNNDUzIDY1OXEtNjggMCAtMTI5IC0yM2w0MCAtMTY1cTQzIDIwIDg5IDIwcTQ3IDAgOTAgLTIwbDQwIDE2NXEtNjEgMjMgLTEzMCAyM3oiIC8+CjxnbHlwaCB1bmljb2RlPSJpIiBkPSJNNDYwIDY5OXExNzQgMCAyOTcgLTEyM3QxMjMgLTI5N3QtMTIzIC0yOTd0LTI5NyAtMTIzcS0xNzMgMCAtMjk2LjUgMTIzdC0xMjMuNSAyOTd0MTIzLjUgMjk3dDI5Ni41IDEyM3pNNTE0IDU2OXEtMzEgLTEgLTQ5IC0yMnQtMTggLTQ1cTAgLTI1IDEzLjUgLTQwLjV0MzYuNSAtMTUuNWgxcTI5IDAgNDguNSAyMC41dDE5LjUgNDguNXEwIDIzIC0xMyAzN3EtMTUgMTcgLTM5IDE3ek01NjUgOThsMyAzbC0yIDRsLTE4IDM4bC01IC00IHEtMTQgLTE0IC0zNC41IC0yOHQtMjQuNSAtMTV2NXEwIDcgMyAyMGw0NiAxODhxNiAyNSA2IDU3cTAgMTggLTYgMzBxLTcgMTIgLTIyIDEycS0yNSAwIC03MS41IC0yOC41dC05MS41IC03MC41bC0zIC0zbDE2IC00NWw2IDRxMzUgMzEgNTUgMzlxMCAtNiAtMyAtMjFsLTQzIC0xODJxLTYgLTMwIC02IC02MHEwIC0yNSAxMCAtMzZxOSAtMTAgMjYgLTEwcTIzIDAgNzAuNSAyOXQ4OC41IDc0eiIgLz4KPGdseXBoIHVuaWNvZGU9ImoiIGhvcml6LWFkdi14PSI4NzciIGQ9Ik04MzUgMjMydi0xbDEgLTF2LTFxMTkgLTM1IDE5IC03OXEwIC0xOCAtNSAtNDNxLTEyIC00NiAtNDUgLTgwbC02NCAtNjNxLTUxIC01MSAtMTIzIC01MXQtMTIyIDUxbC03NyA3NmwtNDcgNDhsLTMzIDMzcS0zNyAzNyAtNDggOTFxLTIgMjAgLTIgMzFxMCAxNyAzIDM1bDMgMTJxNCAxNSAxNCAzNHYxcTEgMSAyLjUgNGwyLjUgNWwxIDJsMSAxcTEgMSAyLjUgMy41dDIuNSAzLjV2MWwyIDJxMSAxIDMgMy41dDMgMy41djFsMiAybDQgNHQ0IDUgbDI4IDI4bDQgLTVsNTcgLTU2cTAgLTEgMiAtM3QyIC0zdDEgLTMuNXQxIC0zLjVsLTI1IC0yNXEtMSAtMSAtMyAtMy41dC00IC00LjVxMCAtMSAtMSAtMnYtMXEtMiAtMiAtNCAtNnEtMSAwIC0xIC0xdC0xIC0ydC0xLjUgLTMuNXQtMC41IC0zLjVsLTEgLTF2LTJxLTQgLTkgLTQgLTIycTAgLTE1IDcgLTMycTQgLTggMTQgLTIwbDU3IC01N2w0MCAtMzlsNjAgLTYxcTIxIC0yMSA1MiAtMjFxMzIgMCA1MiAyMWw2NCA2NHExMiAxMiAxOCAyOSBxMyAxMSAzIDIzcTAgMTAgLTMgMjFxLTUgMTkgLTE4IDMxbC05OCA5OHExIDYgMSAxN3EwIDIxIC0zIDQwcS0xMiA2OCAtNTkgMTE2cTM5IC0xMiA3MSAtNDJsMiAtMmwxNTcgLTE1N3ExOCAtMTggMjkgLTM5cTAgLTEgMSAtMXpNNTM4IDQ0MXEzOSAtMzkgNDggLTkxcTMgLTE1IDMgLTMxcTAgLTExIC00IC0zNWwtMyAtMTJxLTMgLTEyIC0xMyAtMzRsLTEgLTFxLTEgLTEgLTIuNSAtNGwtMi41IC01bC0xIC0ybC0xIC0xcS0yIC00IC01IC03IGwtMSAtMXEtMSAtMSAtMSAtMnEtMyAtMyAtNSAtN2wtMSAtMWwtMiAtMnEtMiAtMyAtOCAtOWwtMjggLTI4bC00IDVsLTU3IDU2cS0xIDEgLTIgM3QtMiAzdC0xIDMuNXQtMSAzLjVsMjUgMjVxMSAxIDMgMy41dDQgNC41cTAgMSAwLjUgMXQwLjUgMXYxcTIgMiA0IDZsMSAxcTEgMSAxIDJxMiA0IDMgN3YxcTAgMSAxIDJxMyAxMSAzIDIycTAgMTUgLTcgMzJxLTQgOCAtMTQgMjBsLTU3IDU3bC0zOSAzOWwtNjEgNjFxLTIxIDIxIC01MiAyMSB0LTUyIC0yMWwtNjQgLTY0cS0xMiAtMTIgLTE4IC0yOXEtMyAtMTEgLTMgLTIzcTAgLTEwIDMgLTIxcTUgLTE5IDE4IC0zMWw5OCAtOThxLTEgLTYgLTEgLTE3cTAgLTIzIDQgLTQwcTEwIC02NSA1OCAtMTE2cS00MCAxMiAtNzEgNDJsLTIgMmwtMTU3IDE1N3EtMTggMTggLTI5IDM5cTAgMSAtMSAxdjFsLTEgMXYxcS0xOSAzOCAtMTkgNzlxMCAxOCA1IDQzcTEyIDQ2IDQ1IDgwbDY0IDYzcTUxIDUxIDEyMyA1MXQxMjIgLTUxbDc3IC03NiBsNDcgLTQ4eiIgLz4KPGdseXBoIHVuaWNvZGU9ImsiIGhvcml6LWFkdi14PSI4OTYiIGQ9Ik02NTcgNjEwcTg5IDAgMTQ4LjUgLTUwLjV0NTkuNSAtMTU5LjVxMCAtNDkgLTI2IC0xMDF0LTUyIC03OWwtMjYgLTI4bC0zMTMgLTMxMmwtMzEzIDMxMmwtMTEgMTF0LTI1IDMwdC0zMiA0NnQtMjUgNTYuNXQtMTEgNjQuNXEwIDEwOSA1OSAxNTkuNXQxNDggNTAuNXE5MCAwIDE5MSAtMTA3bDE5IC0yMXE0IDUgMTEuNSAxMy41dDMxIDMxdDQ3IDM5dDU2LjUgMzAuNXQ2MyAxNHoiIC8+CjxnbHlwaCB1bmljb2RlPSJsIiBob3Jpei1hZHYteD0iOTQyIiBkPSJNMjc5IDcwMGg2MDV2LTEzM2gtNjA1djEzM3pNMjc5IDI4NHYxMzNoNjA1di0xMzNoLTYwNXpNMjc5IDB2MTMzaDYwNXYtMTMzaC02MDV6TTEyMiA3MDBxMjggMCA0Ny41IC0xOS41dDE5LjUgLTQ2LjVxMCAtMjggLTE5LjUgLTQ3LjV0LTQ3LjUgLTE5LjVxLTI3IDAgLTQ2LjUgMTkuNXQtMTkuNSA0Ny41cTAgMjcgMTkuNSA0Ni41dDQ2LjUgMTkuNXpNMTIyIDQxOHEyOCAwIDQ3LjUgLTE5LjV0MTkuNSAtNDcuNXEwIC0yNyAtMTkuNSAtNDYuNSB0LTQ3LjUgLTE5LjVxLTI3IDAgLTQ2LjUgMTkuNXQtMTkuNSA0Ni41cTAgMjggMTkuNSA0Ny41dDQ2LjUgMTkuNXpNMTIyIDEzNHEyOCAwIDQ3LjUgLTE5LjV0MTkuNSAtNDYuNXEwIC0yOCAtMTkuNSAtNDcuNXQtNDcuNSAtMTkuNXEtMjcgMCAtNDYuNSAxOS41dC0xOS41IDQ3LjVxMCAyNyAxOS41IDQ2LjV0NDYuNSAxOS41eiIgLz4KPGdseXBoIHVuaWNvZGU9Im0iIGhvcml6LWFkdi14PSI4MDgiIGQ9Ik03NzEgNjk4di04M3YtNTE0cS0xIC01MiAtNDYuNSAtODh0LTExMC41IC0zNnQtMTExIDM3dC00NiA4OXQ0NiA4OXQxMTEgMzdxMzYgMCA3MCAtMTN2MzA4bC0zNTIgLTg0di00OTVxLTEgLTUyIC00NyAtODguNXQtMTEwIC0zNi41cS02NSAwIC0xMTEgMzd0LTQ2IDkwcTAgNTIgNDYgODl0MTExIDM3cTM1IDAgNjkgLTEzdjUxM2gybDQzOCAxMDR6IiAvPgo8Z2x5cGggdW5pY29kZT0ibiIgaG9yaXotYWR2LXg9Ijk1NiIgZD0iTTc1OSA3MDBxNTggMCA5OSAtNDF0NDEgLTk5di01NjFxMCAtNTggLTQxIC05OXQtOTkgLTQxaC01NjFxLTU4IDAgLTk5IDQxdC00MSA5OXY1NjFxMCA1OCA0MSA5OXQ5OSA0MWg1NjF6TTc5NCA0OTBoLTUxM3YtMTE3aDUxM3YxMTd6TTI1OSAyMTdoLTk2di0xMTRoOTZ2MTE0ek0xNjMgMjM4aDk2djExNGgtOTZ2LTExNHpNMjgxIDIxN3YtMTE0aDUxM3YxMTRoLTUxM3pNMjgxIDIzOGg1MTN2MTE0aC01MTN2LTExNHpNMjU5IDQ5MGgtOTYgdi0xMTdoOTZ2MTE3ek0xNjMgLTFxMCAtMTQgMTAuNSAtMjQuNXQyNC41IC0xMC41aDYxdjExN2gtOTZ2LTgyek03NTkgLTM2cTE0IDAgMjQuNSAxMC41dDEwLjUgMjQuNXY4MmgtNTEzdi0xMTdoNDc4eiIgLz4KPGdseXBoIHVuaWNvZGU9Im8iIGhvcml6LWFkdi14PSI5NDEiIGQ9Ik04NjcgNTQ1cTExIDAgMTggLTcuNXQ3IC0xNy41di01MjVxMCAtMTEgLTcgLTE4dC0xOCAtN2gtNzg0cS0xMSAwIC0xOCA3dC03IDE4djUyNXEwIDEwIDcgMTcuNXQxOCA3LjVoMzhsMjkgNTlxMTEgMjIgMzYgMjJoMTU4cTI1IDAgMzYgLTIybDI4IC01OWg0NTl6IiAvPgo8Z2x5cGggdW5pY29kZT0icCIgaG9yaXotYWR2LXg9Ijg1NSIgZD0iTTU0MiA1NDlsMTUzIC0xNTNsLTQ2MCAtNDYwdjB2MGwtMjI2IC03NGw3MyAyMjd2MHYwek0xODggNjVsMzc5IDM3OWwtMjUgMjZsLTM4MCAtMzgwek02OTQgNzAxbDE1NCAtMTUzbC0xMDEgLTEwMGwtMTUzIDE1M3oiIC8+CjxnbHlwaCB1bmljb2RlPSJxIiBob3Jpei1hZHYteD0iOTEwIiBkPSJNODY1IDE2MHEwIC00MiAtMjYgLTc1dC02NiAtNDRxMTUgLTQzIDY2IC04MnExMiAtOCAtOSAtMTRxLTQ1IC0xMSAtMTE0IDIxcS01MiAyNSAtOTcgNzFoLTI5OXEtNDIgMCAtNzcgMjdxMzAgMTggNTYgNDNoMjc2cTc0IDAgMTI2LjUgNTIuNXQ1Mi41IDEyNi41djIzNXE0NyAtNSA3OSAtNDB0MzIgLTgzdi0yMzh6TTY5OCAyODZxMCAtNTIgLTM2IC04OHQtODcgLTM2aC0yOThxLTQ5IC01MCAtMTAwIC03MnQtOTAgLTIycS0zNCAwIC0zNCAxMSBxMCAzIDMgNXE1MCAzOCA2NiA4MnEtNDAgMTEgLTY2IDQ0dC0yNiA3NnYyMzdxMCA1MSAzNiA4Ny41dDg4IDM2LjVoNDIxcTUxIDAgODcgLTM2LjV0MzYgLTg3LjV2LTIzN3oiIC8+CjxnbHlwaCB1bmljb2RlPSJyIiBob3Jpei1hZHYteD0iOTAwIiBkPSJNNzI2IDI3OGwyNCAyNGw5MSA5MXYtMjYwcTAgLTEyOCAtMTI4IC0xMjhoLTUwOXYtMTA4bC0xNzEgMTcybDE3MSAxNzJ2LTExNXYtNmg0ODRxMTYgMCAyNyAxMXQxMSAyN3YxMjB6TTE3NCAzMTlsLTI0IC0yNGwtOTEgLTkxdjI2MHEwIDEyNyAxMjggMTI3aDUwOXYxMDhsMTcxIC0xNzFsLTE3MSAtMTcydjExNXY2aC00ODRxLTE2IDAgLTI3IC0xMS41dC0xMSAtMjcuNXYtMTE5eiIgLz4KPGdseXBoIHVuaWNvZGU9InMiIGhvcml6LWFkdi14PSI4NjQiIGQ9Ik04MTYgNHEyMyAtMjMgMjMgLTU0cTAgLTI5IC0yMCAtNDhxLTE5IC0xOSAtNDcgLTE5cS0zMiAwIC01NSAyM2wtMjE5IDIxOXEtNzQgLTQ4IC0xNjYgLTQ4cS0xMjkgMCAtMjIwLjUgOTEuNXQtOTEuNSAyMjAuNXQ5MS41IDIyMC41dDIyMC41IDkxLjV0MjIwLjUgLTkxLjV0OTEuNSAtMjIwLjVxMCAtOTAgLTQ3IC0xNjV6TTUwNiAzODlxMCA3MiAtNTEgMTIzdC0xMjMgNTF0LTEyMyAtNTF0LTUxIC0xMjN0NTEgLTEyM3QxMjMgLTUxIHQxMjMgNTF0NTEgMTIzeiIgLz4KPGdseXBoIHVuaWNvZGU9InQiIGhvcml6LWFkdi14PSI5MTkiIGQ9Ik00NjAgNjk5cTE3MyAwIDI5NiAtMTIzdDEyMyAtMjk2cTAgLTE3NCAtMTIzIC0yOTd0LTI5NiAtMTIzcS0xNzQgMCAtMjk3IDEyM3QtMTIzIDI5N3EwIDE3MyAxMjMgMjk2dDI5NyAxMjN6TTQ2MCAtMzVxMTMwIDAgMjIyIDkyLjV0OTIgMjIyLjV0LTkyIDIyMnQtMjIyIDkydC0yMjIuNSAtOTJ0LTkyLjUgLTIyMnQ5Mi41IC0yMjIuNXQyMjIuNSAtOTIuNXpNNjYzIDE4NnExNCAtMTAgNSAtMjRsLTI0IC0zOXEtNSAtNiAtMTEgLThoLTQgcS01IDAgLTEwIDNsLTE5MyAxMjlxLTEgMSAtMi41IDJ0LTIuNSAxcS01IDcgLTUgMTN2MjI4cTAgNyA1IDEycTcgNSAxMyA1aDQ2cTcgMCAxMiAtNXQ1IC0xMnYtMTkzeiIgLz4KPGdseXBoIHVuaWNvZGU9InUiIGhvcml6LWFkdi14PSI5NTUiIGQ9Ik02MCA2MzFoODM1di02NzNoLTgzNXY2NzN6TTgyNSAyOHY1MzRoLTY5NXYtNTM0aDY5NXpNMjI1IDQzMXEtMTggMCAtMzEgMTN0LTEzIDMxdDEzIDMwLjV0MzEgMTIuNXQzMC41IC0xMi41dDEyLjUgLTMwLjV0LTEyLjUgLTMxdC0zMC41IC0xM3pNNzMxIDQzMXEtMTggMCAtMzEgMTN0LTEzIDMxdDEzIDMwLjV0MzEgMTIuNXQzMC41IC0xMi41dDEyLjUgLTMwLjV0LTEyLjUgLTMxdC0zMC41IC0xM3pNMjI1IDE1OXExOCAwIDMwLjUgLTEzIHQxMi41IC0zMXQtMTIuNSAtMzAuNXQtMzAuNSAtMTIuNXQtMzEgMTIuNXQtMTMgMzAuNXQxMyAzMXQzMSAxM3pNNzMxIDE1OXExOCAwIDMwLjUgLTEzdDEyLjUgLTMxdC0xMi41IC0zMC41dC0zMC41IC0xMi41dC0zMSAxMi41dC0xMyAzMC41dDEzIDMxdDMxIDEzek01OTMgNDU3di0zMjVoLTIyOHYzMjVoMjI4ek01MzMgMTgxdjExOGgtMTA5di0xMThoMTA5eiIgLz4KPGdseXBoIHVuaWNvZGU9InYiIGhvcml6LWFkdi14PSI5NDUiIGQ9Ik04NjYgNTU3cTEwIDAgMTcuNSAtN3Q3LjUgLTE3di00NzJxMCAtMTEgLTcuNSAtMTh0LTE3LjUgLTdoLTc4NnEtMTAgMCAtMTcuNSA3dC03LjUgMTh2NDcycTAgMTAgNy41IDE3dDE3LjUgN2gxNzNxMCAxIDEgMWwyMyA0OHE0IDkgMTUgMTUuNXQyMSA2LjVoMzE5cTI1IDAgMzYgLTIybDI0IC00OHYtMWgxNzR6TTQ3MiAxMjBxNzUgMCAxMjggNTIuNXQ1MyAxMjcuNXQtNTMgMTI4dC0xMjggNTNxLTc0IDAgLTEyNyAtNTN0LTUzIC0xMjggdDUzIC0xMjcuNXQxMjcgLTUyLjV6IiAvPgo8Z2x5cGggdW5pY29kZT0idyIgaG9yaXotYWR2LXg9IjkyNyIgZD0iTTg4NSAzOTdxMTYgLTEzNyAtOTQuNSAtMjQ3dC0yODIuNSAtMTI5cS02MiAtNyAtMTIwIDBxLTkyIC05NSAtMTk3IC0xMDZxLTQ3IC01IC01NiA4cS0zIDQgMyA4cTg4IDY2IDgwIDE0NXEtNjkgMzkgLTExMiA5OHQtNTEgMTMwcS0xNiAxMzYgOTQgMjQ2LjV0MjgyIDEzMC41cTE3MiAxOSAzMDQuNSAtNjR0MTQ5LjUgLTIyMHoiIC8+CjxnbHlwaCB1bmljb2RlPSJ4IiBob3Jpei1hZHYteD0iOTQ5IiBkPSJNNTI2IDEwMHEyIDEwIDIgMTZsOTggOThsMTM5IC0xMzlsOTQgLTY5bDEwIC0zOGwtMTA0IC0xMDRsLTM3IDEwbC03MCA5NHpNNzU1IDIycS0xOCAwIC0zMC41IC0xMi41dC0xMi41IC0zMS41cTAgLTE4IDEyLjUgLTMwLjV0MzAuNSAtMTIuNXExOSAwIDMxLjUgMTIuNXQxMi41IDMwLjVxMCAxOSAtMTIuNSAzMS41dC0zMS41IDEyLjV6TTQ2OSAzNzFsLTk4IC05OHEtNiAwIC0xNiAtMmwtNzEgNzBxLTMyIC0xNSAtNTYgLTE1IHEtNzQgMCAtMTMzLjUgNjB0LTYwLjUgMTM0cTAgMSAxNyAxOHE2MyAtNjMgNzEgLTY4dDQ1IC01cTI5IDAgNjUuNSAzNnQzNi41IDY2cTAgMzYgLTYgNDUuNXQtNjcgNjkuNXExNSAxOCAxOCAxOHE3NCAxIDEzNCAtNTkuNXQ2MCAtMTM0LjVxMCAtMjcgLTE2IC01N3pNNzg2IDIwMnEwIDMgMC41IDcuNXQwLjUgMTguNXQtMS41IDI4dC01LjUgMzJ0LTEwLjUgMzMuNXQtMTkgMzAuNXQtMjguNSAyNGgtM3EtMTAgMCAtMzQgLTIybC0yMTggLTIxNyBxOCAtMjkgLTggLTQ3cS0yIC0xIC03IC02bC0yMDEgLTIwMXEtNSAtNSAtNiAtN3EtMTEgLTExIC0yOSAtMTFxLTQxIDAgLTc3IDQ4dC04IDc3cTMgMiA2IDZsMjAyIDIwMnE1IDMgNiA2cTExIDExIDI4IDExcTkgMCAxOSAtM2wxOTQgMTk0bDQgNnE0IDYgNS41IDh0NSA4LjV0NC41IDExdDEuNSAxMXQtMSAxMy41dC00LjUgMTRxLTE2IDI5IC02MCAzOGgtMXEtMTYgMCAtNTUgMzdsLTYgNnEtMTkgMTkgLTIwIDI1dDE4IDI3bDcyIDczIHExNyAxNyAyNiAxN3E2IDAgMjYgLTIwbDYgLTZxMzMgLTMzIDM3IC00OXE0IC0yMCAyNCAtNDZxMyAtNCAxOCAtNHQxOSAtNGwxMTkgLTExOXE3MyAtNzMgMzAgLTI1MmwtMTUgLTUweiIgLz4KPGdseXBoIHVuaWNvZGU9InkiIGhvcml6LWFkdi14PSI4OTciIGQ9Ik04NDMgMzU5cTkgLTEgMTUuNSAtOXQ2LjUgLTE3di05N3EwIC05IC02LjUgLTE3dC0xNS41IC05bC0xMjQgLTIzcS05IC0yIC0xMiAtOHQyIC0xNGw3MiAtMTA2cTEyIC0xOSAtNCAtMzVsLTY4IC02OHEtMTYgLTE2IC0zNCAtM2wtMTA2IDcxcS03IDUgLTE0LjUgMi41dC04LjUgLTExLjVsLTIzIC0xMjVxLTEgLTkgLTkgLTE1LjV0LTE3IC02LjVoLTk3cS05IDAgLTE3IDYuNXQtOSAxNS41bC0yMyAxMjVxLTEgOSAtOC41IDExLjUgdC0xNC41IC0yLjVsLTEwNSAtNzFxLTIwIC0xMiAtMzUgM2wtNjggNjhxLTE2IDE2IC00IDM1bDcyIDEwNnE1IDggMiAxNHQtMTIgOGwtMTI0IDIzcS05IDEgLTE1LjUgOXQtNi41IDE3djk3cTAgOSA2LjUgMTd0MTUuNSA5bDEyNCAyM3EyMiA2IDEwIDIzbC03MiAxMDZxLTExIDE5IDQgMzRsNjggNjhxMTYgMTYgMzUgNGwxMDUgLTcycTcgLTUgMTQuNSAtMnQ4LjUgMTJsMjMgMTI0cTEgOSA5IDE1LjV0MTcgNi41aDk3cTkgMCAxNyAtNi41IHQ5IC0xNS41bDIzIC0xMjRxMSAtOSA4LjUgLTEydDE0LjUgMmwxMDYgNzJxMTggMTIgMzQgLTRsNjggLTY4cTE1IC0xNSA0IC0zNGwtNzIgLTEwNnEtMTIgLTE3IDEwIC0yM3pNNDQ4IDEzNHE2MyAwIDEwNyA0NHQ0NCAxMDZ0LTQ0IDEwNi41dC0xMDcgNDQuNXEtNjIgMCAtMTA2IC00NC41dC00NCAtMTA2LjV0NDQgLTEwNnQxMDYgLTQ0eiIgLz4KPGdseXBoIHVuaWNvZGU9InoiIGhvcml6LWFkdi14PSI3MzYiIGQ9Ik00MzMgLTMzcTM0IDAgNTUgMjNsMTc2IDE3NmwzOSAtMzlxMTUgLTE1IDAgLTMxbC0yNTQgLTI1NHEtMTUgLTE2IC0zMSAwbC0zNTAgMzUwcS0xNSAxNSAtMTcgMzZsLTggOTdsMzM1IC0zMzVxMjMgLTIzIDU1IC0yM3pNMzUzIDY2NGwzNTAgLTM0OXExNiAtMTYgMCAtMzFsLTI1NCAtMjU1cS03IC02IC0xNiAtNnQtMTUgNmwtMzUwIDM1MHEtMTUgMTcgLTE3IDM3bC0xNyAxOTBxLTIgMjIgMTQgMzZsNDMgNDRxMTUgMTMgMzQgMTNoMyBsMTg5IC0xN3EyMiAtMiAzNiAtMTh6TTExNSA2MTdxLTE0IC0xMyAtMTQgLTMzdDE0IC0zM3ExMyAtMTMgMzMgLTEzdDMzIDEzdDEzIDMzdC0xMyAzM3EtMTQgMTQgLTMzIDE0dC0zMyAtMTR6IiAvPgo8Z2x5cGggdW5pY29kZT0ieyIgaG9yaXotYWR2LXg9Ijc2MiIgZD0iTTc1MSAyOTloLTI3OHYtNDA4aC0xODV2NDA4aC0yNzdsMzcwIDQyOHoiIC8+CjxnbHlwaCB1bmljb2RlPSJ8IiBob3Jpei1hZHYteD0iOTE1IiBkPSJNMTgyIDI4MHEtMyAtMTYgLTMgLTM1di02OXEtNTggMCAtOTguNSA0MC41dC00MC41IDk4LjV2MjQ0cTAgNTggNDAuNSA5OC41dDk4LjUgNDAuNWgzNDhxNTggMCA5OC41IC00MC41dDQwLjUgLTk4LjV2LTEwNWgtMTA0djEwNXEwIDE0IC0xMC41IDI0LjV0LTI0LjUgMTAuNWgtMzQ4cS0xNCAwIC0yNC41IC0xMC41dC0xMC41IC0yNC41di0yNDRxMCAtMTQgMTAuNSAtMjQuNXQyNC41IC0xMC41aDN6TTczNiAzODVxNTcgMCA5OCAtNDEgdDQxIC05OXYtMjQzcTAgLTU4IC00MSAtOTl0LTk4IC00MWgtMzQ4cS01OCAwIC05OC41IDQxdC00MC41IDk5djI0M3EwIDU4IDQwLjUgOTl0OTguNSA0MWgzNDh6TTc3MCAydjI0M3EwIDE1IC0xMCAyNXQtMjQgMTBoLTM0OHEtMTQgMCAtMjQuNSAtMTB0LTEwLjUgLTI1di0yNDNxMCAtMTUgMTAuNSAtMjV0MjQuNSAtMTBoMzQ4cTE0IDAgMjQgMTB0MTAgMjV6IiAvPgo8Z2x5cGggdW5pY29kZT0ifSIgaG9yaXotYWR2LXg9Ijc2MiIgZD0iTTExIDMwMWgyNzd2NDA5aDE4NXYtNDA5aDI3OGwtMzcwIC00Mjd6IiAvPgo8Z2x5cGggdW5pY29kZT0ifiIgZD0iTTQ2MCA2OTlxMTc0IDAgMjk3IC0xMjN0MTIzIC0yOTd0LTEyMyAtMjk3dC0yOTcgLTEyM3QtMjk3IDEyM3QtMTIzIDI5N3QxMjMgMjk3dDI5NyAxMjN6TTYyOCAzNHYyMzJoLTE2NmwxNDUgMTY3aC0xMTJ2MTM1aC03NXYtMTM1aC0xMTJsMTQ0IC0xNjdoLTE2MnYtMjMyaDE0NWwtMzkgLTM5aDEyNmwtMzkgMzloMTQ1ek0zMzMgNzZ2MTQ4aDI1M3YtMTQ4aC0yNTN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZmY7IiBob3Jpei1hZHYteD0iODMzIiAvPgo8Z2x5cGggaG9yaXotYWR2LXg9IjUwMCIgLz4KPC9mb250Pgo8L2RlZnM+PC9zdmc+IA==') format('svg')}.x-tab .x-button-icon:before,.x-button .x-button-icon:before{font-family:"Pictos"}.x-img.x-img-image{text-align:center}.x-img.x-img-image img{width:auto;height:100%}.x-img.x-img-background{background-repeat:no-repeat;background-position:center;background-size:auto 100%}.x-map{background-color:#edeae2}.x-map *{-webkit-box-sizing:content-box;box-sizing:content-box}.x-mask-map{background:transparent !important}.x-map-container{position:absolute !important;top:0;left:0;right:0;bottom:0}.x-mask{min-width:8.5em;position:absolute;top:0;left:0;bottom:0;right:0;height:100%;z-index:10;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;background:rgba(0,0,0,0.3) center center no-repeat}.x-mask.x-mask-gray{background-color:rgba(0,0,0,0.5)}.x-mask.x-mask-transparent{background-color:transparent}.x-mask .x-mask-inner{position:relative;background:rgba(0,0,0,0.25);color:#fff;text-align:center;padding:.4em;font-size:.95em;font-weight:bold}.x-mask .x-loading-spinner-outer{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:100%;min-width:8em;height:8em}.x-mask.x-indicator-hidden .x-mask-inner{padding-bottom:0 !important}.x-mask.x-indicator-hidden .x-loading-spinner-outer{display:none}.x-mask.x-indicator-hidden .x-mask-message{position:relative;bottom:.25em}.x-mask .x-mask-message{position:absolute;bottom:5px;color:#333;left:0;right:0;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.x-mask.x-has-message .x-mask-inner{padding-bottom:2em}.x-mask.x-has-message .x-loading-spinner-outer{height:168px}.x-ie .x-mask[visibility='visible'] ~ div:not(.x-mask) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-panel) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-floating) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-center) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-msgbox) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-mask) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-panel) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-floating) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-center) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-msgbox) .x-input-el{visibility:collapse}.x-video{height:100%;width:100%;background-color:#000}.x-video>*{height:100%;width:100%;position:absolute}.x-video-ghost{-webkit-background-size:100% auto;background:#000 url() center center no-repeat}audio{width:100%}.x-msgbox{min-width:15em;max-width:20em;max-height:90%;margin:6px;border:1px solid #ccc}.x-msgbox .x-docking-vertical{overflow:hidden}.x-msgbox .x-toolbar.x-docked-top{border-bottom:0}.x-msgbox .x-toolbar.x-docked-bottom{border-top:0}.x-ie .x-msgbox .x-dock.x-dock-horizontal.x-unsized>.x-dock-body{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px}.x-msgbox-text{text-align:center}.x-msgbox-buttons .x-button{min-width:4.5em}.x-progressindicator{width:50%;height:1.3em}.x-progressindicator .x-progressindicator-inner{background:#222222;padding:10px;height:100%;border-radius:20px;box-shadow:0px 5px 17px rgba(40,40,40,0.5);box-sizing:content-box;position:relative}.x-progressindicator .x-progressindicator-text{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:100%;height:100%;position:absolute;top:0px;left:0px;color:white;text-shadow:1px 1px 2px black}.x-progressindicator .x-progressindicator-bar{height:100%;width:0%;border-radius:10px}.x-progressindicator:not(.x-item-hidden) .x-progressindicator-bar .x-progressindicator-bar-fill{height:100%;width:100%;background-color:gray;border-radius:10px;-webkit-animation-name:progressIndicator;-moz-animation-name:progressIndicator;-ms-animation-name:progressIndicator;-o-animation-name:progressIndicator;animation-name:progressIndicator;-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;-moz-animation-timing-function:linear;-ms-animation-timing-function:linear;-o-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;-o-animation-iteration-count:infinite;animation-iteration-count:infinite;background-repeat:repeat-x;background-size:30px 30px;background-image:-webkit-linear-gradient(135deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-image:-moz-linear-gradient(135deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-image:-o-linear-gradient(135deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-image:-ms-linear-gradient(-45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}@-webkit-keyframes progressIndicator{to{background-position:30px}}@-moz-keyframes progressIndicator{to{background-position:30px}}@keyframes progressIndicator{to{background-position:30px}}.x-panel,.x-msgbox{position:relative}.x-panel.x-floating,.x-msgbox,.x-form.x-floating{padding:6px;background-color:#ccc}.x-panel.x-floating .x-panel-inner,.x-panel.x-floating>.x-body,.x-msgbox .x-panel-inner,.x-msgbox>.x-body,.x-form.x-floating .x-panel-inner,.x-form.x-floating>.x-body{z-index:1;background-color:#fff}.x-panel.x-floating>.x-dock,.x-msgbox>.x-dock,.x-form.x-floating>.x-dock{z-index:1}.x-panel.x-floating>.x-dock.x-sized,.x-msgbox>.x-dock.x-sized,.x-form.x-floating>.x-dock.x-sized{margin:6px}.x-sheet,.x-sheet-action{height:auto}.x-toolbar{position:relative;background-color:#eee;min-height:2.6em;overflow:hidden}.x-toolbar.x-docked-top{border-bottom:1px solid}.x-toolbar.x-docked-bottom{border-top:1px solid}.x-toolbar.x-docked-left{width:50px;height:auto;border-right:1px solid}.x-toolbar.x-docked-right{width:50px;height:auto;border-left:1px solid}.x-title{font-size:1.2em;text-align:center;font-weight:bold;max-width:100%}.x-title.x-title-align-left{padding-left:10px}.x-title.x-title-align-right{padding-right:10px}.x-title .x-innerhtml{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-navigation-bar .x-container{overflow:visible}.x-toolbar-inner .x-field .x-component-outer{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto}.x-ie .x-toolbar-inner{height:100% !important}.x-toast{min-width:15em;max-width:20em;max-height:90%;margin:6px}.x-toast .x-toast-text{text-align:center}.x-ie .x-toast .x-dock.x-dock-horizontal.x-unsized>.x-dock-body{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px}.x-menu{background:#eee}.x-carousel-inner{position:relative;overflow:hidden}.x-carousel-item,.x-carousel-item>*{position:absolute !important;width:100%;height:100%}.x-carousel-indicator{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.x-carousel-indicator span{display:block;width:10px;height:10px;margin:3px;background-color:#eee}.x-carousel-indicator span.x-carousel-indicator-active{background-color:#ccc}.x-carousel-indicator-horizontal{width:100%}.x-carousel-indicator-vertical{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;height:100%}.x-android-3 .x-surface-wrap,.x-android-3 .x-surface-wrap>*{-webkit-perspective:1}.x-draw-component{position:relative}.x-draw-component .x-inner{overflow:hidden}.x-surface{position:absolute}.x-chart-watermark{opacity:0.5;z-index:9;right:0;bottom:0;background:rgba(0,0,0,0.5);color:white;padding:4px 6px;font-family:"Helvetica";font-size:12px;position:absolute;border-top-left-radius:4px;white-space:nowrap;-webkit-border-top-left-radius:4px}.x-legend .x-legend-inner .x-legend-container{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:1px solid #ccc;background:#fff}.x-legend .x-legend-inner .x-legend-container .x-legend-item{padding:0.8em 1em 0.8em 1.8em;color:#333;background:rgba(255,255,255,0);max-width:20em;min-width:0;font-size:14px;line-height:14px;font-weight:bold;white-space:nowrap;position:relative}.x-legend .x-legend-inner .x-legend-container .x-legend-item .x-legend-inactive{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=30);opacity:.3}.x-legend .x-legend-inner .x-legend-container .x-legend-item .x-legend-item-marker{position:absolute;width:.8em;height:.8em;-moz-border-radius:.4em;-webkit-border-radius:.4em;border-radius:.4em;-moz-box-shadow:rgba(255,255,255,0.3) 0 1px 0,rgba(0,0,0,0.4) 0 1px 0 inset;-webkit-box-shadow:rgba(255,255,255,0.3) 0 1px 0,rgba(0,0,0,0.4) 0 1px 0 inset;box-shadow:rgba(255,255,255,0.3) 0 1px 0,rgba(0,0,0,0.4) 0 1px 0 inset;left:.7em;top:1em}.x-legend.x-docked-top .x-legend-item,.x-legend.x-docked-bottom .x-legend-item{border-right:1px solid rgba(204,204,204,0.5)}.x-legend.x-docked-top .x-legend-item:last-child,.x-legend.x-docked-bottom .x-legend-item:last-child{border-right:0}.x-legend.x-docked-left .x-legend-inner,.x-legend.x-docked-right .x-legend-inner{display:-webkit-box;-webkit-box-align:center;-webkit-box-pack:center}.x-chart-toolbar{position:absolute;z-index:9;display:-webkit-box;display:-moz-box;display:-ms-box;display:box;padding:.6em}.x-chart-toolbar .x-button{margin:.2em}.x-chart-toolbar[data-side=left],.x-chart-toolbar[data-side=right]{top:0;-webkit-box-orient:vertical;-moz-box-orient:vertical;-ms-box-orient:vertical;box-orient:vertical}.x-chart-toolbar[data-side=left]{left:0}.x-chart-toolbar[data-side=right]{right:0}.x-chart-toolbar[data-side=top],.x-chart-toolbar[data-side=bottom]{-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-ms-box-orient:horizontal;box-orient:horizontal;right:0}.x-chart-toolbar[data-side=top]{top:0}.x-chart-toolbar[data-side=bottom]{bottom:0;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-ms-box-orient:horizontal;box-orient:horizontal}.x-tab .x-button-icon.list:before,.x-button .x-button-icon.list:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"l"}.x-tab .x-button-icon.expand:before,.x-button .x-button-icon.expand:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"`"}.x-dataview-inlineblock .x-dataview-item,.x-dataview-inlineblock .x-data-item{display:inline-block !important}.x-dataview-nowrap .x-dataview-container{white-space:nowrap !important}.x-dataview-nowrap .x-container.x-dataview{white-space:nowrap !important}.x-list{overflow:hidden}.x-list .x-scroll-scroller{max-width:100%}.x-list .x-list-inner{width:100% !important}.x-list.x-list-indexed .x-list-disclosure{margin-right:50px}.x-list .x-item-selected .x-list-disclosure{background-color:#fff}.x-list .x-list-scrolldock-hidden{display:none}.x-list .x-list-item{position:absolute !important;left:0;top:0;width:100%}.x-list .x-list-item>.x-dock{height:auto}.x-list .x-list-item .x-dock-horizontal{border-top:1px solid #ccc}.x-list .x-list-item.x-item-selected .x-dock-horizontal,.x-list .x-list-item.x-item-selected.x-list-item-tpl{background-color:#ccc}.x-list .x-list-item.x-item-pressed.x-list-item-tpl,.x-list .x-list-item.x-item-pressed .x-dock-horizontal{background-color:#ddd}.x-list .x-list-item .x-list-item-body,.x-list .x-list-item.x-list-item-tpl .x-innerhtml{padding:5px}.x-list .x-list-item.x-list-item-relative{position:relative !important}.x-list .x-list-header{background-color:#eee;border-top:1px solid #ccc;border-bottom:1px solid #ccc;font-weight:bold}.x-list .x-list-header.x-list-item-relative{position:relative !important}.x-list .x-list-disclosure{margin:5px 15px 5px 0;overflow:visible;width:20px;height:20px;border:1px solid #ccc;background-color:#eee}.x-list .x-list-item-tpl .x-list-disclosure{position:absolute;right:0px;top:0px}.x-list .x-list-emptytext{text-align:center;pointer-events:none;font-color:#333333;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-list.x-list-indexed .x-list-disclosure{margin-right:35px}.x-list .x-list-scrolldockitem{position:absolute !important;left:0;top:0;width:100%}.x-ie .x-list-grouped .x-translatable-container .x-list-item:before,.x-ie .x-list-grouped .x-translatable-container .x-list-header:before{content:". .";color:transparent;position:absolute;left:0px;word-spacing:3000px;opacity:0}.x-list-header{position:absolute;left:0;width:100%;z-index:2 !important}.x-ios .x-list-header{-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.x-list-grouped .x-list-item.x-list-header-wrap .x-dock-horizontal,.x-list-grouped .x-list-item-tpl.x-list-header-wrap{border-top:0}.x-list-inlineblock .x-list-item{display:inline-block !important}.x-list-nowrap .x-list-inner{width:auto}.x-list-nowrap .x-list-container{white-space:nowrap !important}.x-list-item-dragging{border-bottom:1px solid #ccc;background:#fff !important;z-index:1}.x-indexbar-wrapper{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important;pointer-events:none}.x-indexbar{pointer-events:auto;z-index:2;min-height:0 !important;height:auto !important;-webkit-box-flex:0 !important;-ms-flex:0 0 auto !important;flex:0 0 auto !important}.x-indexbar>div{font-size:0.6em;text-align:center;line-height:1.1em;font-weight:bold;display:block}.x-indexbar-vertical{width:15px;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;margin-right:15px}.x-indexbar-horizontal{height:15px;-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.x-phone.x-landscape .x-indexbar>div{font-size:0.38em;line-height:1em}.x-indexbar-pressed{background-color:#ccc}.x-form-label{display:none !important}.x-form-label span{font-weight:bold}.x-form-label-nowrap .x-form-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-field{display:flex;display:-webkit-box;display:-ms-flexbox}.x-field .x-field-input{position:relative;min-width:3.7em}.x-field .x-field-input,.x-field .x-input-el{width:100%}.x-field.x-field-labeled .x-form-label{display:block !important}.x-field .x-component-outer{position:relative}.x-label-align-left,.x-label-align-right{-webkit-box-orient:horizontal !important;-ms-flex-direction:row !important;flex-direction:row !important}.x-label-align-left .x-component-outer,.x-label-align-right .x-component-outer{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px}.x-label-align-right{-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.x-label-align-top,.x-label-align-bottom{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-label-align-bottom{-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.x-input-el{display:block}.x-field-mask{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-ie .x-field.x-field-text .x-field-mask,.x-ie .x-field.x-field-textarea .x-field-mask,.x-ie .x-field.x-field-search .x-field-mask{z-index:-1}.x-field-required .x-form-label:after{content:"*";display:inline}.x-spinner .x-component-outer{display:flex;display:-webkit-box;display:-ms-flexbox}.x-spinner .x-component-outer>*{width:auto}.x-spinner .x-field-input{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px}.x-spinner .x-field-input .x-input-el{width:100%;text-align:center}.x-spinner .x-field-input input::-webkit-outer-spin-button,.x-spinner .x-field-input input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.x-spinner .x-spinner-button{text-align:center;border:1px solid #ccc !important;background-color:#eee}.x-spinner.x-field-grouped-buttons .x-input-el{text-align:left}.x-select-overlay .x-list-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}.x-field-number input::-webkit-outer-spin-button,.x-field-number input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.x-field-input .x-clear-icon,.x-field-input .x-reveal-icon{display:none;width:10px;height:10px;background-color:#ccc;position:absolute;top:50%;right:0}.x-field-clearable .x-clear-icon{display:block}.x-field-clearable .x-field-input{padding-right:10px}.x-field-revealable .x-reveal-icon{display:block}.x-field-revealable .x-field-input{padding-right:10px}.x-field-clearable.x-field-revealable .x-reveal-icon{right:20px}.x-android .x-input-el{-webkit-text-fill-color:#000}.x-android .x-empty .x-input-el{-webkit-text-fill-color:#A9A9A9}.x-android .x-item-disabled .x-input-el{-webkit-text-fill-color:#b3b3b3}.x-form-fieldset .x-form-fieldset-inner{border:1px solid #ccc;overflow:hidden}.x-form-fieldset .x-dock .x-dock-body{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto}.x-form-fieldset-title{font-weight:bold}.x-form-fieldset-title .x-innerhtml{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-form-fieldset-instructions{text-align:center}.x-ie .x-field-select .x-field-mask{z-index:3}.x-sheet.x-picker{padding:0}.x-sheet.x-picker .x-sheet-inner{background-color:#fff;overflow:hidden}.x-sheet.x-picker .x-sheet-inner .x-picker-slot .x-body{border-left:1px solid #999999;border-right:1px solid #ACACAC}.x-sheet.x-picker .x-sheet-inner .x-picker-slot.x-first .x-body{border-left:0}.x-sheet.x-picker .x-sheet-inner .x-picker-slot.x-last .x-body{border-left:0;border-right:0}.x-picker-slot .x-scroll-view{z-index:2;position:relative}.x-picker-mask{position:absolute;top:0;left:0;right:0;bottom:0;z-index:3;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;pointer-events:none}.x-picker-slot-title{position:relative;z-index:2}.x-picker-slot-title>div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:bold}.x-picker-slot .x-dataview-inner{width:100% !important}.x-picker-slot .x-dataview-item{vertical-align:middle;height:30px;line-height:30px}.x-picker-slot .x-dataview-item.x-item-selected{font-weight:bold}.x-picker-slot .x-picker-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-ie .x-picker-item{cursor:default}.x-ie .x-picker-item::before{content:". .";color:transparent;position:absolute;left:0px;word-spacing:3000px}.x-picker-right{text-align:right}.x-picker-center{text-align:center}.x-picker-left{text-align:left}.x-list-paging .x-loading-spinner{display:none;margin:auto}.x-list-paging .x-list-paging-msg{text-align:center;clear:both}.x-list-paging.x-loading .x-loading-spinner{display:block}.x-list-paging.x-loading .x-list-paging-msg{display:none}.x-list-pullrefresh{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;position:absolute;top:-5em;left:0;width:100%;height:4.5em}.x-list-pullrefresh .x-loading-spinner{display:none}.x-list-pullrefresh-arrow{width:2.5em;height:4.5em;background-color:#bbb}.x-list-pullrefresh-wrap{width:20em;font-size:0.7em}.x-list-pullrefresh-message{font-weight:bold;font-size:1.3em;text-align:center}.x-list-pullrefresh-updated{text-align:center}.x-list-pullrefresh-loading *.x-loading-spinner{display:block}.x-list-pullrefresh-loading .x-list-pullrefresh-arrow{display:none}.x-android-2 .x-list-pullrefresh-loading *.x-loading-spinner{display:none}.x-slider,.x-toggle{position:relative;height:16px;min-height:0;min-width:0}.x-slider>*,.x-toggle>*{position:absolute;width:100%;height:100%}.x-thumb{position:absolute;height:16px;width:10px;border:1px solid #ccc;background-color:#ddd}.x-slider:before{content:'';position:absolute;width:auto;height:8px;top:4px;left:0;right:0;margin:0 5px;background-color:#eee}.x-toggle{border:1px solid #ccc;width:30px;overflow:hidden;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.x-toggle-on{background-color:#eee}.x-tab{z-index:1;overflow:visible !important;background-color:#eee;border:1px solid #ccc}.x-tabbar{border-color:#ccc;border-style:solid;border-width:0;background-color:#eee}.x-tabbar.x-docked-top{border-bottom-width:1px}.x-tabbar.x-docked-top .x-tab .x-button-icon{position:relative}.x-tabbar.x-docked-top .x-tab .x-button-icon.x-shown{display:inline-block}.x-tabbar.x-docked-top .x-tab .x-button-icon.x-hidden{display:none}.x-tabbar.x-docked-bottom{border-top-width:1px}.x-tabbar.x-docked-bottom .x-tab .x-button-icon{display:block;position:relative}.x-tabbar.x-docked-bottom .x-tab .x-button-icon.x-shown{visibility:visible}.x-tabbar.x-docked-bottom .x-tab .x-button-icon.x-hidden{visibility:hidden}.x-tab{position:relative;min-width:3.3em}.x-table-inner{display:table !important;width:100% !important;height:100% !important}.x-table-inner.x-fixed-layout{table-layout:fixed !important}.x-table-row{display:table-row !important}.x-table-cell{display:table-cell !important;vertical-align:middle}.x-orientation-inspector{display:none;content:"landscape"}@media (orientation: portrait){.x-orientation-inspector{content:"portrait"}}.x-grid .x-grid-header-container{border-width:0 1px 1px 0;border-style:solid;height:65px;font-weight:bold;overflow:hidden}.x-grid .x-grid-header-container .x-grid-column{display:inline-block}.x-grid .x-grid-header-container .x-grid-header-container-inner{width:100000px;position:absolute;top:0;left:0}.x-grid .x-grid-column{height:64px;border-width:1px 1px 0 1px;border-style:solid;line-height:64px;vertical-align:middle;padding:0 8px}.x-grid .x-grid-column .x-innerhtml{display:inline-block;width:auto;position:relative}.x-grid .x-grid-column.x-column-sorted-asc .x-innerhtml:after,.x-grid .x-grid-column.x-column-sorted-desc .x-innerhtml:after{position:absolute;width:12px;line-height:64px;top:0;height:64px;font-family:'Pictos';font-size:12px}.x-grid .x-grid-column.x-column-align-left .x-innerhtml:after,.x-grid .x-grid-column.x-column-align-center .x-innerhtml:after{right:-16px}.x-grid .x-grid-column.x-column-align-right .x-innerhtml:after{left:-16px}.x-grid .x-grid-column.x-column-sorted-asc .x-innerhtml:after{content:"{"}.x-grid .x-grid-column.x-column-sorted-desc .x-innerhtml:after{content:"}"}.x-grid .x-grid-headergroup{display:inline-block;position:relative;vertical-align:bottom;height:64px;padding-top:32px}.x-grid .x-grid-headergroup .x-inner>.x-innerhtml{height:32px;line-height:28px;vertical-align:middle;display:block;position:absolute;width:100%;top:0;left:0;text-align:center;border-style:solid;border-width:1px;overflow:hidden;text-overflow:ellipsis}.x-grid .x-grid-headergroup .x-grid-column{height:32px !important;line-height:27px !important;font-size:0.7em}.x-grid .x-grid-headergroup .x-grid-column.x-column-sorted-asc .x-innerhtml:after,.x-grid .x-grid-headergroup .x-grid-column.x-column-sorted-desc .x-innerhtml:after{line-height:27px;height:27px}.x-grid .x-grid-row{position:absolute;left:0;top:0;border-width:0 0 1px 0;border-style:solid}.x-grid .x-grid-cell{display:inline-block;vertical-align:middle;line-height:60px;padding:0 8px;height:60px;overflow:hidden;border-width:0 1px 0 0}.x-grid .x-grid-cell-align-center,.x-grid .x-grid-column-align-center{text-align:center}.x-grid .x-grid-cell-align-right,.x-grid .x-grid-column-align-right{text-align:right}.x-grid .x-grid-viewoptions{border-width:0 0 0 1px;border-style:solid}.x-grid .x-grid-viewoptions .x-list-item .x-innerhtml{padding:0px !important}.x-grid .x-grid-viewoptions .x-column-options-header{height:32px;line-height:28px;vertical-align:middle;border-style:solid;border-width:1px;overflow:hidden;padding-left:10px}.x-grid .x-grid-viewoptions .x-column-options-sortablehandle,.x-grid .x-grid-viewoptions .x-column-options-visibleindicator,.x-grid .x-grid-viewoptions .x-column-options-groupindicator,.x-grid .x-grid-viewoptions .x-column-options-folder,.x-grid .x-grid-viewoptions .x-column-options-leaf{width:40px;height:48px;position:absolute;bottom:0}.x-grid .x-grid-viewoptions .x-column-options-sortablehandle:after,.x-grid .x-grid-viewoptions .x-column-options-visibleindicator:after,.x-grid .x-grid-viewoptions .x-column-options-groupindicator:after,.x-grid .x-grid-viewoptions .x-column-options-folder:after,.x-grid .x-grid-viewoptions .x-column-options-leaf:after{position:absolute;top:0;left:0;height:100%;width:100%;text-align:center;font-size:24px;font-family:'Pictos';line-height:48px;content:"l";vertical-align:middle}.x-grid .x-grid-viewoptions .x-column-options-sortablehandle{left:0}.x-grid .x-grid-viewoptions .x-column-options-sortablehandle:after{line-height:54px}.x-grid .x-grid-viewoptions .x-column-options-visibleindicator{right:0}.x-grid .x-grid-viewoptions .x-column-options-visibleindicator:after{font-size:30px;line-height:54px;content:"E"}.x-grid .x-grid-viewoptions .x-column-options-groupindicator{right:40px}.x-grid .x-grid-viewoptions .x-column-options-groupindicator:after{font-size:30px;line-height:54px;content:"g"}.x-grid .x-grid-viewoptions .x-column-options-folder,.x-grid .x-grid-viewoptions .x-column-options-leaf{width:30px;left:40px}.x-grid .x-grid-viewoptions .x-column-options-folder:after,.x-grid .x-grid-viewoptions .x-column-options-leaf:after{line-height:52px;content:"o"}.x-grid .x-grid-viewoptions .x-column-options-leaf:after{content:"F"}.x-grid .x-grid-viewoptions .x-list-item.x-item-selected.x-list-item-tpl{background:transparent}.x-grid .x-grid-viewoptions .x-list-item.x-item-selected.x-list-item-tpl .x-innerhtml{background:transparent}.x-grid .x-grid-viewoptions .x-column-options-text{display:block;height:30px;margin:10px 50px 5px 80px;position:relative;vertical-align:middle;line-height:28px}.x-grid .x-grid-columnoptions{border-width:0 0 1px}.x-grid .x-grid-multiselection-column{position:relative;padding:0}.x-grid .x-grid-multiselection-column:after{position:absolute;top:0;left:0;width:60px;height:64px;line-height:64px;font-family:'Pictos';font-size:26px;text-align:center;content:"2"}.x-grid .x-grid-multiselection-cell{position:relative;padding:0}.x-grid .x-grid-multiselection-cell:after{position:absolute;top:0;left:0;width:60px;height:60px;line-height:60px;font-family:'Pictos';font-size:20px;text-align:center;content:"_"}.x-grid .x-item-selected .x-grid-multiselection-cell:after{content:"3"}.x-grid .x-grid-pagingtoolbar>.x-body{padding:0 30px 0 50px}.x-grid .x-grid-pagingtoolbar-currentpage{position:relative;height:22px}.x-grid .x-grid-pagingtoolbar-currentpage span{position:absolute;right:0;top:0;line-height:22px;height:22px}.x-grid .x-grid-summaryrow{height:32px;font-size:0.8em;position:relative}.x-grid .x-grid-summaryrow .x-grid-cell{height:32px;line-height:30px;border-width:0 0 1px;border-style:solid}.x-grid .x-grid-summaryrow .x-grid-multiselection-cell:after{content:''}.x-ie .x-grid-grouped .x-translatable-container .x-grid-row:before,.x-ie .x-grid-grouped .x-translatable-container .x-grid-header:before{content:". .";color:transparent;position:absolute;left:0px;word-spacing:3000px;opacity:0}.x-grid-header{line-height:44px;font-weight:bold;position:absolute;left:0;width:100%;z-index:2 !important}.x-ios .x-grid-header{-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.x-grid-grouped .x-grid-row.x-grid-header-wrap .x-dock-horizontal,.x-grid-grouped .x-grid-row-tpl.x-grid-header-wrap{border-top:0}.x-scroll-view{position:relative;display:block;overflow:hidden}.x-scroll-container{position:absolute;width:100%;height:100%}.x-scroll-scroller{position:absolute;min-width:100%;min-height:100%;height:auto !important;width:auto !important}.x-scroll-stretcher{position:absolute;visibility:hidden}.x-scroll-bar-grid-wrapper{position:absolute;width:100%;height:100%}.x-scroll-bar-grid{display:table;width:100%;height:100%}.x-scroll-bar-grid>*{display:table-row}.x-scroll-bar-grid>*>*{display:table-cell}.x-scroll-bar-grid>:first-child>:first-child{width:100%;height:100%}.x-scroll-bar-grid>:first-child>:nth-child(2){padding:3px 3px 0 0}.x-scroll-bar-grid>:nth-child(2)>:first-child{padding:0 0 3px 3px}.x-scroll-bar{position:relative;overflow:hidden}.x-scroll-bar-stretcher{position:absolute;visibility:hidden;width:100%;height:100%}.x-scroll-bar-x{width:100%}.x-scroll-bar-x>.x-scroll-bar-stretcher{width:300%}.x-scroll-bar-x.active{height:6px}.x-scroll-bar-y{height:100%}.x-scroll-bar-y>.x-scroll-bar-stretcher{height:300%}.x-scroll-bar-y.active{width:6px}.x-scroll-indicator{background:#333;position:absolute;z-index:3}.x-scroll-indicator-x{height:100%}.x-scroll-indicator-y{width:100%}.x-scroll-indicator.rounded{background:none}.x-scroll-indicator.rounded>*{position:absolute;background-color:#333}.x-scroll-indicator.rounded>:nth-child(2){-webkit-transform-origin:0% 0%;background:none;content:url(data:image/bmp;base64,Qk08AAAAAAAAADYAAAAoAAAAAQAAAAEAAAABABAAAAAAAAYAAAASCwAAEgsAAAAAAAAAAAAAxhgAAAAA)}.x-scroll-indicator.rounded.x-scroll-indicator-light>*{background-color:#eee}.x-scroll-indicator.rounded.x-scroll-indicator-light>:nth-child(2){content:url(data:image/bmp;base64,Qk08AAAAAAAAADYAAAAoAAAAAQAAAAEAAAABABAAAAAAAAYAAAASCwAAEgsAAAAAAAAAAAAAvXcAAAAA)}.x-scroll-indicator.rounded.x-scroll-indicator-y>*{width:100%}.x-scroll-indicator.rounded.x-scroll-indicator-y>:first-child{height:3px;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px}.x-scroll-indicator.rounded.x-scroll-indicator-y>:nth-child(2){height:1px}.x-scroll-indicator.rounded.x-scroll-indicator-y>:last-child{height:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.x-scroll-indicator.rounded.x-scroll-indicator-x>*{height:100%}.x-scroll-indicator.rounded.x-scroll-indicator-x>:first-child{width:3px;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px}.x-scroll-indicator.rounded.x-scroll-indicator-x>:nth-child(2){width:1px}.x-scroll-indicator.rounded.x-scroll-indicator-x>:last-child{width:3px;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.x-list-light .x-scroll-indicator,.x-dataview-light .x-scroll-indicator{background:#fff}.x-ios .x-scroll-scroller{-webkit-transform:translate3d(0, 0, 0)}.x-ie .x-scroll-bar-y{position:absolute;margin-left:-5px}html,body{font-family:"Helvetica Neue",HelveticaNeue,"Helvetica-Neue",Helvetica,"BBAlpha Sans",sans-serif}.x-ios.x-tablet .x-landscape *{-webkit-text-stroke:1px transparent}body{font-size:104%}body.x-android.x-phone{font-size:116%}body.x-ios.x-phone{font-size:114%}body.x-desktop{font-size:114%}.x-layout-card-item{background:#eee}.x-loading-spinner{font-size:250%;height:1em;width:1em;position:relative;-webkit-transform-origin:.5em .5em;transform-origin:.5em .5em}.x-loading-spinner>span,.x-loading-spinner>span:before,.x-loading-spinner>span:after{display:block;position:absolute;width:.1em;height:.25em;top:0;-webkit-transform-origin:.05em .5em;transform-origin:.05em .5em;content:" "}.x-loading-spinner>span{left:50%;margin-left:-0.05em}.x-loading-spinner>span.x-loading-top{background-color:rgba(170,170,170,0.99)}.x-loading-spinner>span.x-loading-top::after{background-color:rgba(170,170,170,0.9)}.x-loading-spinner>span.x-loading-left::before{background-color:rgba(170,170,170,0.8)}.x-loading-spinner>span.x-loading-left{background-color:rgba(170,170,170,0.7)}.x-loading-spinner>span.x-loading-left::after{background-color:rgba(170,170,170,0.6)}.x-loading-spinner>span.x-loading-bottom::before{background-color:rgba(170,170,170,0.5)}.x-loading-spinner>span.x-loading-bottom{background-color:rgba(170,170,170,0.4)}.x-loading-spinner>span.x-loading-bottom::after{background-color:rgba(170,170,170,0.35)}.x-loading-spinner>span.x-loading-right::before{background-color:rgba(170,170,170,0.3)}.x-loading-spinner>span.x-loading-right{background-color:rgba(170,170,170,0.25)}.x-loading-spinner>span.x-loading-right::after{background-color:rgba(170,170,170,0.2)}.x-loading-spinner>span.x-loading-top::before{background-color:rgba(170,170,170,0.15)}.x-loading-spinner>span.x-loading-top{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg)}.x-loading-spinner>span.x-loading-right{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg)}.x-loading-spinner>span.x-loading-bottom{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg)}.x-loading-spinner>span.x-loading-left{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg)}.x-loading-spinner>span::before{-webkit-transform:rotate(30deg);-moz-transform:rotate(30deg);-ms-transform:rotate(30deg)}.x-loading-spinner>span::after{-webkit-transform:rotate(-30deg);-moz-transform:rotate(-30deg);-ms-transform:rotate(-30deg)}.x-loading-spinner{-webkit-animation-name:x-loading-spinner-rotate;-webkit-animation-duration:.5s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-name:x-loading-spinner-rotate;animation-duration:.5s;animation-timing-function:linear;animation-iteration-count:infinite}html,body{font-family:"Helvetica Neue",HelveticaNeue,"Helvetica-Neue",Helvetica,"BBAlpha Sans",sans-serif}.x-ios.x-tablet .x-landscape *{-webkit-text-stroke:1px transparent}body{font-size:104%}body.x-android.x-phone{font-size:116%}body.x-ios.x-phone{font-size:114%}body.x-desktop{font-size:114%}.x-layout-card-item{background:#eee}.x-button{-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-background-clip:padding;background-clip:padding-box;-moz-border-radius:.4em;-webkit-border-radius:.4em;border-radius:.4em;min-height:1.8em;padding:.3em .6em}.x-button,.x-toolbar .x-button{border:1px solid #999;border-top-color:#a6a6a6;background-color:#ccc;color:#000}.x-button.x-button-back:before,.x-button.x-button-forward:before,.x-toolbar .x-button.x-button-back:before,.x-toolbar .x-button.x-button-forward:before{background:#999}.x-button,.x-button.x-button-back:after,.x-button.x-button-forward:after,.x-toolbar .x-button,.x-toolbar .x-button.x-button-back:after,.x-toolbar .x-button.x-button-forward:after{background-image:none;background-color:#ccc;background-image:-webkit-linear-gradient(top, #f2f2f2,#d9d9d9 3%,#bfbfbf);background-image:-moz-linear-gradient(top, #f2f2f2,#d9d9d9 3%,#bfbfbf);background-image:-o-linear-gradient(top, #f2f2f2,#d9d9d9 3%,#bfbfbf);background-image:-ms-linear-gradient(to bottom, #f2f2f2,#d9d9d9 3%,#bfbfbf)}.x-button.x-button-pressing,.x-button.x-button-pressing:after,.x-button.x-button-pressed,.x-button.x-button-pressed:after,.x-button.x-button-active,.x-button.x-button-active:after,.x-toolbar .x-button.x-button-pressing,.x-toolbar .x-button.x-button-pressing:after,.x-toolbar .x-button.x-button-pressed,.x-toolbar .x-button.x-button-pressed:after,.x-toolbar .x-button.x-button-active,.x-toolbar .x-button.x-button-active:after{background-image:none;background-color:#c4c4c4;background-image:-webkit-linear-gradient(top, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6);background-image:-moz-linear-gradient(top, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6);background-image:-o-linear-gradient(top, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6);background-image:-ms-linear-gradient(to bottom, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6)}.x-button .x-button-icon{width:1.5em;height:1.5em}.x-button .x-button-icon:before{font-size:1.6em;line-height:1em}.x-button.x-item-disabled .x-button-label,.x-button.x-item-disabled .x-badge,.x-button.x-item-disabled .x-button-icon{opacity:.5}.x-button-round{-moz-border-radius:.9em;-webkit-border-radius:.9em;border-radius:.9em}.x-ie .x-button{height:0px}.x-ie .x-button .x-button-label,.x-ie .x-button .x-badge{overflow:visible}.x-iconalign-left .x-button-label,.x-iconalign-left .x-badge{margin-left:.6em}.x-iconalign-right .x-button-label,.x-iconalign-right .x-badge{margin-right:.6em}.x-iconalign-top,.x-iconalign-bottom{padding-top:.2em !important;padding-bottom:.2em !important}.x-button-label,.x-badge,.x-hasbadge .x-badge{font-weight:bold;line-height:1.2em;font-family:"Helvetica Neue",HelveticaNeue,"Helvetica-Neue",Helvetica,"BBAlpha Sans",sans-serif;font-size:1em}.x-toolbar .x-button{margin:6px .2em;padding:0 .6em}.x-toolbar .x-button .x-button-label,.x-toolbar .x-button .x-badge{font-size:.7em}.x-toolbar .x-button .x-button-label,.x-toolbar .x-button .x-badge,.x-toolbar .x-button .x-hasbadge .x-badge{line-height:1.6em}.x-toolbar .x-button .x-button-icon:before{font-size:1.3em;line-height:1.3em}.x-ie .x-toolbar .x-button .x-button-icon::before{font-size:.6em;line-height:1em}.x-button-small,.x-toolbar .x-button-small{-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em;padding:.2em .4em;min-height:0}.x-button-small .x-button-label,.x-button-small .x-badge,.x-toolbar .x-button-small .x-button-label,.x-toolbar .x-button-small .x-badge{font-size:.6em}.x-button-small .x-button-icon,.x-toolbar .x-button-small .x-button-icon{width:.75em;height:.75em}.x-button-forward,.x-button-back{position:relative;overflow:visible;height:1.7em;z-index:1}.x-webkit .x-button-forward:before,.x-webkit .x-button-forward:after,.x-webkit .x-button-back:before,.x-webkit .x-button-back:after{content:'';position:absolute;width:15px;height:auto;top:-2px;left:auto;bottom:-2px;z-index:2;-webkit-mask:4px 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAABGCAYAAADb7SQ4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAiNJREFUeNrEWb9LQlEUvj5BcHoQvMnVKXD1D3CLwqBJbHJsazQaWoSCxgbHJiMIAiNok6AhCDdXVycnJ8EQOgeOYaG+d39998KH+HyP753zzjnfd325xfdSgVeV8B6BScuEV0IRSbxHeCMk/AVFXCA8ScQKSXxPqK0fQBBfE5r/D+Y8VzUT9jb94DPimqRYIYkrhGcpKhhxIqTxrpNcExdlQJTTTnRJnCc8ykhUSOIOoZ71ZFfEZ4S2zgUu+rguxZRHEnPbfKRVsOtUl0RtYpOLTYljIS2Z3nVk2DY9SbNCEt8RDm0rUpe4La1jvXSqmtum72raZI24KuNQIYl/nSGSOJb0Jq61M0pxhjwK9304hUjHGSKILzc5Q5drUzttdYY+I97pDH1FzG0zNFUb04gTG4kzJS5kdYauiZtZnaFr4ooKsCIVaDHxKAQxt1NBnGIVHfGCcEQYh3jGU8KBfMKLiyM+lgzAq/qT0ArVTg+Ei1B9fEPoovV4fcfQd2HedScX39GprwGTNjJn0maTELN6IuSzECLB6T5x2eM66jQgnIeSxa60GnS3uL56tr7b1Ai0JPVwYi6yho2U2lgfKym19VxjMRHzEGbvS9K+RBPzetGVUpf29lZHSl2/DMnLvwh1ZMQrKW3Ic4fvJOZS6ZMQW5hpmpT63DvtlFLfm7bBNruM2C2yXb7y3U6ZpRS5P/4jpUjihRTbCJ3q1eL3GMMfAQYAJmB6SBO619IAAAAASUVORK5CYII=') no-repeat;-webkit-mask-size:15px 100%;overflow:hidden}.x-webkit .x-button-back,.x-webkit .x-toolbar .x-button-back{margin-left:.77217em;padding-left:.4em}.x-webkit .x-button-back:before,.x-webkit .x-toolbar .x-button-back:before{left:-15px}.x-webkit .x-button-back:after,.x-webkit .x-toolbar .x-button-back:after{left:-14px}.x-webkit .x-button-forward,.x-webkit .x-toolbar .x-button-forward{margin-right:.78217em;padding-right:.4em}.x-webkit .x-button-forward:before,.x-webkit .x-button-forward:after,.x-webkit .x-toolbar .x-button-forward:before,.x-webkit .x-toolbar .x-button-forward:after{-webkit-mask:-4px 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAABGCAYAAADb7SQ4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXlJREFUaN7lmTFqAlEQhh8EhFSCYJXW1law9QAewMrWAwQWAmmtbPcGHiCQ1gPYCla2QsDKSsgmQecvFqImu2/fzry/2OLb9mt23vwz47Kvn5MwEFxM8DkLB6HHEIOd0GGIwUpoMcRgyRKDOUsMJizxpzBiiMFR6DPEeZl1GWKwFh4ZYvAmPDDEqmVWVQxmLPG3MGaIVcosVAz2whNDDDZCmyEG7yFlpiEGKUsMEpb4XKXMtMXeiVVb7J1YLcRgW1ZmVuLSxGopLkys1mLwwhL/mVhjie8Sayxx3kp7DPFVYo0tzhNriyEGU5Z40TjxtDE/F6WcDowHBE/msDFNImG0xZQRBAonDCvxhhH2vKZIZ9Ds+7EDfaWFnKZ4xhja5owxdcnYCAQv1p1Gi4sprn08cZbDt6ZYZasXIn5mLFHTjLCvVt1V+4rVt/M+4r3FPaJMbHaBKRKb3pyKxKZXtv/Er4yjZpRL6q042u34tzh4xV9H/FHnqBHKBQeEd6aqqwD6AAAAAElFTkSuQmCC') no-repeat;-webkit-mask-size:15px 100%}.x-webkit .x-button-forward:before,.x-webkit .x-toolbar .x-button-forward:before{right:-15px}.x-webkit .x-button-forward:after,.x-webkit .x-toolbar .x-button-forward:after{right:-14px}.x-button.x-button-plain,.x-toolbar .x-button.x-button-plain{background:none;border:0 none;min-height:0;text-shadow:none;line-height:auto;height:1.9em;padding:0 0.5em;-moz-border-radius:none;-webkit-border-radius:none;border-radius:none}.x-button.x-button-plain>*,.x-toolbar .x-button.x-button-plain>*{overflow:visible}.x-button.x-button-plain.x-button-pressing,.x-button.x-button-plain.x-button-pressed,.x-toolbar .x-button.x-button-plain.x-button-pressing,.x-toolbar .x-button.x-button-plain.x-button-pressed{background:none;background-image:-webkit-radial-gradient(rgba(255,255,255,0.7),rgba(255,255,255,0) 24px);background-image:-moz-radial-gradient(rgba(255,255,255,0.7),rgba(255,255,255,0) 24px);background-image:radial-gradient(rgba(255,255,255,0.7),rgba(255,255,255,0) 24px);background-image:-ms-radial-gradient(rgba(255,255,255,0.7),rgba(255,255,255,0) 24px)}.x-segmentedbutton .x-button{margin:0;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.x-segmentedbutton .x-button.x-first{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em}.x-segmentedbutton .x-button.x-last{-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-segmentedbutton .x-button:not(.x-first){border-left:0}.x-hasbadge{overflow:visible}.x-hasbadge .x-badge{border-color:#900;min-width:2em;line-height:1.2em;top:-.2em;padding:.1em .3em;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-background-clip:padding;background-clip:padding-box;color:#fcc;background-image:none;background-color:#c00;background-image:-webkit-linear-gradient(top, #ff1a1a,#e60000 3%,#b30000);background-image:-moz-linear-gradient(top, #ff1a1a,#e60000 3%,#b30000);background-image:-o-linear-gradient(top, #ff1a1a,#e60000 3%,#b30000);background-image:-ms-linear-gradient(to bottom, #ff1a1a,#e60000 3%,#b30000);-moz-border-radius:.2em;-webkit-border-radius:.2em;border-radius:.2em;text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0;-moz-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0.1em;-webkit-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0.1em;box-shadow:rgba(0,0,0,0.5) 0 0.1em 0.1em}.x-panel.x-floating,.x-msgbox,.x-form.x-floating{-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em;-moz-box-shadow:rgba(0,0,0,0.8) 0 0.2em 0.6em;-webkit-box-shadow:rgba(0,0,0,0.8) 0 0.2em 0.6em;box-shadow:rgba(0,0,0,0.8) 0 0.2em 0.6em;background-image:none;background-color:#656565}.x-panel.x-floating.x-floating-light,.x-msgbox.x-floating-light,.x-form.x-floating.x-floating-light{background-image:none;background-color:#cbcbcb}.x-panel.x-floating .x-panel-inner,.x-panel.x-floating>.x-body,.x-msgbox .x-panel-inner,.x-msgbox>.x-body,.x-form.x-floating .x-panel-inner,.x-form.x-floating>.x-body{-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-webkit .x-anchor{position:absolute;overflow:hidden}.x-webkit .x-anchor.x-anchor-top{margin-top:-.68em;margin-left:-.8155em;width:1.631em;height:.7em;-webkit-mask:0 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAPCAYAAABut3YUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPZJREFUeNpi/PX7LwOFwAyIG6HseiA+Ra5BjBQ6xg+IVwAxJ5T/HYgjgHgTOYYxUeCQUiBeh+QQBih7HVSOLiHDDMSTgTiTgLrpQJwLxH9p5RhOaLT4EakeFF3RQPyF2o6RhkaBGYkheRmIPYH4KbXSjC4QnyTDIch6danhGCcgPgwNGXKBNNQMb0ocEwXE24GYn4FyADJjI76Ej88x7UC8FIjZGKgHQDlxGtRsZmISMMjy+dBQoSXYBC0gv+NyDD80xzgx0AeAqg4fIH6NHk0qQHyMjg6B1WvHYDkNFjIgwS1ALMowMOAjEAeBHINe2Q0U+AUQYACQ10C2QNhRogAAAABJRU5ErkJggg==') no-repeat;-webkit-mask-size:1.631em .7em;background-color:#656565}.x-webkit .x-anchor.x-anchor-bottom{margin-left:-.8155em;width:1.631em;height:.7em;-webkit-mask:0 0 url('data:image/png;base64,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') no-repeat;-webkit-mask-size:1.631em .7em;background-color:#656565}.x-webkit .x-anchor.x-anchor-left{margin-left:-.6655em;margin-top:-.35em;height:1.631em;width:.7em;-webkit-mask:0 0 url('data:image/png;base64,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') no-repeat;-webkit-mask-size:.7em 1.631em;background-color:#656565}.x-webkit .x-anchor.x-anchor-right{margin-top:-.35em;height:1.631em;width:.7em;-webkit-mask:0 0 url('data:image/png;base64,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') no-repeat;-webkit-mask-size:.7em 1.631em;background-color:#656565}.x-floating.x-panel-light:after{background-color:#cbcbcb}.x-sheet,.x-picker,.x-sheet-action{padding:.7em;border-top:1px solid #7f7f7f;background-image:none;background-color:rgba(101,101,101,0.9);background-image:-webkit-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-moz-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-o-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-ms-linear-gradient(to bottom, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.x-sheet-inner>.x-button,.x-sheet-action-inner>.x-button{margin-bottom:.5em}.x-sheet-inner>.x-button:last-child,.x-sheet-action-inner>.x-button:last-child{margin-bottom:0}.x-msgbox{margin:.5em;border:0.15em solid #cbcbcb;-moz-box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;-webkit-box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-msgbox .x-icon{margin:0 0.8em 0 0.5em;background:#fff;-webkit-mask-size:100%}.x-msgbox .x-msgbox-info{-webkit-mask-image:url('data:image/png;base64,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')}.x-msgbox .x-msgbox-warning{-webkit-mask-image:url('data:image/png;base64,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')}.x-msgbox .x-msgbox-question{-webkit-mask-image:url('data:image/png;base64,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')}.x-msgbox .x-msgbox-error{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAFGUlEQVRoBe2bzW8VVRxAeS0UMZggaARtGgtNU5pIRCMaEsPChrgh7FhCjHtdEBKNLvwjdOHShSHGmEiMiVFw4cL4EcFoolRSuqBiRDQqCLRS6znDzPP1dub1fbbzLv6S05m57829vzN3Pu+8VhYWFtZ0KyqVygbqHoA74QEYhnmojX4WpuFHuAZz5HSdaVei0mlhJBW7Hx6GJ+AheAwaiS/50rfwGXwNF8nPDdGx6JgwonvJ6hE4CI/DXdBOXGHlz+EEnEb803Yqq65rD7cDFSn4NvwKHh/dwLpt42A7ubpuS7I03Ad74C24DP9AN0Rr67QN27JN2+5rRb5pYRraBC+Bx9ZKiNZKO2+bM/AKbG5WuilhGtgNb4Jn0zCRlV42B3PZ3Yx0w8JUfAQmwcvKSssVtWcu5nSkUemGhKnwKFyE1diFi2SzcnMyt6ONSNcVphJvCl4ATxZZA2WdmqO59tcTLxRmRc/Ez8AvUFbJMC9zNefCM3g9YW8kvocyHbOhYLhsrua8t6iXc4VZYRQ+hJsQVlr2ZXM299E86SXCfNEb/tfhTyi7XFF+5q7DhlB6kTBfqMCzMA1FlfVKuQ66JM8LmXgoPM4XTsIs9IpYUZ466DKeyTr1TJwETztegg7BLhhICnv7jw66HErdEpuqMEvb4Um4O/kkjj+66KRbEokwW2AtS/tgBzgfS+ii077UsbpL30fhBNwLsYVOuum4pg9zz8xj4P7u2FNsoZNuY7q6S3twPwUx9i5aSeim44DC68CxKB/sYw3ddFyn8BBsg5hOVugsCt10HFJ4BGLuXfSS0HFE80HYmBQt/XOdIseJfwfvaDzBlTGy3JRyHNzngTB0HFR4KxSdnS/w2ctwFhxZKHO4t3q1eRV82gtDx60Kb4E7wk/T5d+YTnIPqnjpI73EmnNe6LjFrVJvN3VXya7VeZWUpiyV1ceciyK5Dhd9GGW5W+S2iv+Fg+72eKh3TARfX/XFZfO1h+eg6JLjbec8Z+nSS6c5/k2+/ZAXOs55WboEvqfJu/nYTvlznAHPM3UItMxh5w3BgwVJ6nhJYa+xVyFP2Gv0MYghdLzgVpmCP2IwWsZBxymFz8FlKP1xSo6thm46nlPYrp6EvyDW0E3HqwrPwinwRVSsoZuOs75l83R9Bn4G52MLnXQ7o6s9bMzAR+B+HlvopJuOt4ZpMb/CvF3ulogtdDqVOlbHpZX8DnzQd5QjltBFJ92SyHZpX6p5YB+HH2A++bS3/+igy/HULbGpCqdu7zP9BLxU9XrooItO/wX24SvTnXz6MXgjnj199NrU3HXYucQvLHCZOAzT0GuiWb7mfjjXLbfw1qD886zUiz97MGdzX5vrlldoGbEZ3gAfq7ItV/apuZpz4W8wFx2/oTwrOkh/Am5A2WXN0VwHQ4/a5brCaU+PUMm7UGZpczPHkVq5vPllhWuk3ymptLLmtqxs4pK3FfLKqND3Ni+Ct2rekK/2Lm4O5mJOm/JyzitrqIezFal4PTwNp+EmrJa0bZuDuazP8mtk2pRwViGNDMNr4BPISva2bdmmbQ9n+TQzbUk4a4BGJ8Azo/fh3RS3btuwrYms/Vambf8bD0O4jgM/CgfAXcyfFoT36BS1FIq6634A78FXSLb1YNO2MEkkgbiD9l63x2E/2Ptj0Ky8kmfhJPirWB/tZhD1/rjt6JhwbSbIe3LzBfQ22AV7YAfck+K8MQWOSIjzX8A38BNcQ9Lxto7Gv+RtOqJ9fOwKAAAAAElFTkSuQmCC')}.x-msgbox .x-title{font-size:.9em;line-height:1.4em}.x-msgbox .x-body{background:transparent !important}.x-msgbox .x-toolbar{background:transparent none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.x-msgbox .x-toolbar.x-docked-top{height:1.3em}.x-msgbox .x-field{min-height:2em;background:#fff;-moz-border-radius:.2em;-webkit-border-radius:.2em;border-radius:.2em}.x-msgbox .x-form-field{min-height:1.5em;padding-right:0 !important;-webkit-appearance:none}.x-msgbox .x-field-input{padding-right:2.2em}.x-msgbox-text{padding:6px 0;line-height:1.4em}.x-msgbox-buttons{padding:0.4em 0;height:auto}.x-msgbox-buttons .x-button-normal span{opacity:.7}.x-msgbox-dark .x-msgbox-text{color:rgba(255,255,255,0.9);text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-msgbox-dark .x-msgbox-input{background-image:none;background-color:rgba(255,255,255,0.9);background-image:-webkit-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-moz-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-o-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-ms-linear-gradient(to bottom, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));border:0.1em solid rgba(203,203,203,0.9)}.x-toolbar{padding:0 .2em}.x-toolbar.x-docked-left{width:7em;padding:.2em}.x-toolbar.x-docked-right{width:7em;padding:.2em}.x-title{line-height:2.1em;font-size:1.2em;margin:0 0.3em;padding:0 .3em}.x-spinner .x-input-el,.x-field-select .x-input-el{-webkit-text-fill-color:#000;-webkit-opacity:1}.x-spinner.x-item-disabled .x-input-el,.x-field-select.x-item-disabled .x-input-el{-webkit-text-fill-color:currentcolor}.x-toolbar .x-field-select .x-input-el{-webkit-text-fill-color:#fff}.x-toolbar .x-field-select.x-item-disabled .x-input-el{-webkit-text-fill-color:rgba(255,255,255,0.6)}.x-toolbar .x-form-field-container{padding:0 .3em}.x-toolbar .x-slider-field .x-component-outer,.x-toolbar .x-toggle-field .x-component-outer{padding:0em .3em}.x-toolbar .x-field{width:13em;padding:.5em;min-height:0;border-bottom:0;background:transparent}.x-toolbar .x-field .x-clear-icon{background-size:50% 50%;right:-0.8em;margin-top:-1.06em}.x-toolbar .x-field-input{padding-right:1.6em !important}.x-toolbar .x-field-textarea .x-component-outer,.x-toolbar .x-field-text .x-component-outer,.x-toolbar .x-field-number .x-component-outer,.x-toolbar .x-field-search .x-component-outer{background-color:#fff;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em;-moz-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0 inset,rgba(0,0,0,0.5) 0 -0.1em 0 inset,rgba(0,0,0,0.5) 0.1em 0 0 inset,rgba(0,0,0,0.5) -0.1em 0 0 inset,rgba(0,0,0,0.5) 0 0.15em 0.4em inset;-webkit-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0 inset,rgba(0,0,0,0.5) 0 -0.1em 0 inset,rgba(0,0,0,0.5) 0.1em 0 0 inset,rgba(0,0,0,0.5) -0.1em 0 0 inset,rgba(0,0,0,0.5) 0 0.15em 0.4em inset;box-shadow:rgba(0,0,0,0.5) 0 0.1em 0 inset,rgba(0,0,0,0.5) 0 -0.1em 0 inset,rgba(0,0,0,0.5) 0.1em 0 0 inset,rgba(0,0,0,0.5) -0.1em 0 0 inset,rgba(0,0,0,0.5) 0 0.15em 0.4em inset}.x-toolbar .x-form-label{background:transparent;border:0;padding:0;line-height:1.4em}.x-toolbar .x-form-field{height:1.6em;color:#6e6e6e;background:transparent;min-height:0;-webkit-appearance:none;padding:0em .3em;margin:0}.x-toolbar .x-form-field:focus{color:#000}.x-toolbar .x-field-select .x-component-outer,.x-toolbar .x-field-search .x-component-outer{-moz-border-radius:.8em;-webkit-border-radius:.8em;border-radius:.8em}.x-toolbar .x-field-search .x-field-input{background-position:.5em 50%}.x-toolbar .x-field-select{-webkit-box-shadow:none}.x-toolbar .x-field-select .x-form-field{height:1.4em}.x-toolbar .x-field-select{background:transparent}.x-toolbar .x-field-select .x-component-outer:after{right:.4em}.x-toolbar .x-field-select.x-item-disabled .x-component-outer:after{opacity:.6}.x-toolbar .x-field-select .x-component-outer:before{width:3em;border-left:none;-moz-border-radius-topright:.8em;-webkit-border-top-right-radius:.8em;border-top-right-radius:.8em;-moz-border-radius-bottomright:.8em;-webkit-border-bottom-right-radius:.8em;border-bottom-right-radius:.8em;-webkit-mask:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAABCAYAAACc0f2yAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADJJREFUeNpi/P//PwMjIyMbAwMDOxRzAjEXFHMDMQ8a5kXC6HLcSHo5kcwEmU9TABBgAOcTBAFcRiSpAAAAAElFTkSuQmCC');-webkit-mask-position:right top;-webkit-mask-repeat:repeat-y;-webkit-mask-size:3em 0.05em}.x-toolbar .x-field-select .x-input-text{color:#fff}.x-android .x-field-search .x-field-input{padding-left:.2em !important;padding-right:2.2em !important}.x-toast{margin:.5em;border:0.15em solid #cbcbcb;-moz-box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;-webkit-box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-toast .x-toast-text{padding:6px 0;line-height:1.4em}.x-msgbox-dark .x-msgbox-text{color:rgba(255,255,255,0.9);text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-msgbox-dark .x-msgbox-input{background-image:none;background-color:rgba(255,255,255,0.9);background-image:-webkit-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-moz-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-o-linear-gradient(top, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));background-image:-ms-linear-gradient(to bottom, rgba(230,230,230,0.9),rgba(242,242,242,0.9) 10%,rgba(255,255,255,0.9) 65%,rgba(255,255,255,0.9));border:0.1em solid rgba(203,203,203,0.9)}.x-menu{padding:.7em;background-image:none;background-color:rgba(101,101,101,0.9);background-image:-webkit-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-moz-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-o-linear-gradient(top, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9));background-image:-ms-linear-gradient(to bottom, rgba(139,139,139,0.9),rgba(114,114,114,0.9) 3%,rgba(88,88,88,0.9))}.x-menu .x-button{margin-bottom:.7em}.x-menu .x-button:last-child{margin-bottom:0}.x-form .x-scroll-container{background-color:#eee}.x-form .x-toolbar .x-scroll-container{background-color:transparent}.x-form-label{text-shadow:#fff 0 1px 1px;color:#333;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0;padding:.6em;background-color:#f7f7f7;color:#080808}.x-form-label span{font-size:.8em}.x-form-fieldset{margin:.5em .5em 1.5em}.x-form-fieldset .x-form-label{border-top:1px solid #fff}.x-form-fieldset .x-form-fieldset-inner{border:1px solid #ddd;background:#fff;padding:0;-moz-border-radius:.4em;-webkit-border-radius:.4em;border-radius:.4em}.x-form-fieldset .x-field{border-bottom:1px solid #ddd;background:transparent}.x-form-fieldset .x-field:first-child{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-form-fieldset .x-field:last-child{border-bottom:0;-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-form-fieldset-title{text-shadow:#fff 0 1px 1px;color:#333;margin:1em .7em 0.3em;color:#333}.x-form-fieldset-instructions{text-shadow:#fff 0 1px 1px;color:#333;color:gray;margin:1em .7em 0.3em;font-size:.8em}.x-label-align-left:first-child .x-form-label{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em}.x-label-align-left:last-child .x-form-label{-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em}.x-label-align-right:first-child .x-form-label{-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-label-align-right:last-child{border-bottom:0}.x-label-align-right:last-child .x-form-label{-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-label-align-top:first-child .x-form-label{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-label-align-bottom:last-child .x-form-label{-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-field{min-height:2.5em;background:#fff}.x-field:last-child{border-bottom:0}.x-field-label{background-color:#f7f7f7;color:#080808}.x-field-input .x-clear-icon{background:url('data:image/png;base64,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') no-repeat;background-position:center center;background-size:55% 55%;width:2.2em;height:2.2em;margin:.5em;margin-top:-1.1em;right:-.5em}.x-field-clearable .x-field-input{padding-right:2.2em}.x-input-el{padding:.4em;min-height:2.5em;border-width:0;-webkit-appearance:none}.x-ie .x-input-el{background:transparent}.x-item-disabled .x-form-label,.x-item-disabled input,.x-item-disabled .x-input-el,.x-item-disabled .x-spinner-body,.x-item-disabled select,.x-item-disabled textarea,.x-item-disabled .x-field-clear-container{color:#b3b3b3;pointer-events:none}.x-item-disabled .x-form-label{color:#aaa}.x-item-disabled .x-form-label:after{color:#666 !important}.x-checkmark-base,.x-field-checkbox .x-field-mask::after,.x-field-radio .x-field-mask::after,.x-select-overlay .x-item-selected.x-list-item::after{position:absolute;top:0;right:10px;bottom:0;content:'3';font-family:'Pictos';font-size:1.6em;text-align:right;line-height:1.6em}.x-field-checkbox .x-field-mask::after,.x-field-radio .x-field-mask::after{color:#ddd}.x-input-checkbox,.x-input-radio{visibility:hidden}.x-input-el:checked+.x-field-mask::after{color:#688AD2}.x-item-disabled.x-field-checkbox .x-input-checkbox:checked+.x-field-mask::after{color:#aebcd9}.x-field-radio .x-field-mask{position:absolute;top:0;right:0;bottom:0;left:0}.x-field-radio .x-field-mask::after{content:'';position:absolute;width:16px;height:16px;top:16px;left:auto;right:16px;background-color:#d0d0d0;-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px}.x-field-radio .x-field-mask::before{content:'';position:absolute;width:26px;height:26px;top:11px;left:auto;right:11px;background-color:#ddd;-moz-border-radius:26px;-webkit-border-radius:26px;border-radius:26px}.x-input-radio:checked+.x-field-mask::after{background:#688AD2}.x-item-disabled.x-field-radio .x-input-radio:checked+.x-field-mask::after{background:#aebcd9}.x-field-search .x-field-input{position:relative}.x-field-search .x-field-input:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"s"}.x-field-search .x-field-input:before{color:#ccc;top:.7em;left:.5em;font-size:1.1em;right:auto}.x-toolbar .x-field-search .x-field-input:before{top:.3em}.x-field-search .x-field-input .x-form-field{margin-left:1em}.x-webkit .x-selectmark-base,.x-webkit .x-field-select .x-component-outer:after,.x-field-select .x-webkit .x-component-outer:after{content:'';position:absolute;width:1em;height:1em;top:50%;left:auto;right:.7em;-webkit-mask-size:1em;-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTJDQUMyNUQwRUE4NjdEQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxQTFBMDFDQ0I5NEYxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyMkRCMDIxMkI5NEUxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjMwRTE0QzVBNDIyMjY4MTFCQ0ZCOTAzOTcwNzcyRkVCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MkNBQzI1RDBFQTg2N0RCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+HfrH/AAAAeVJREFUeNrs2cFHBGEUAPA3zYqIiIhOnTpFRHSKrp26RqeuEV077R/QqWtE166dOkVERHRa9hQRnZalFcv0Hk/W1Mx+38z3vvlm5j3eZW+/9+abne+9KEkSaFPMQMtCwQpWsIIVrGAFK1jBClawgo2ik/4hiqJGwLKuvfpIc5xSkWqYr5hzU1s/mRNxXTPsJ+ZqluvXlwOmSj3XBDvG3M1rpAmYYoUrFzr4ZNqTawqm2MH8Dhh7ZXJUbcAUx4FinzBnJcAUl4FhP/jIgRSYKvkYCJaO2LbNv08RMMUy5nsA4COTLy0XYIqtil9iF6aflq7AwBWuAvuQ9ZKSBgNX2ieWjtKSzeXBNZgqfe8J+4W5aXtbcg0GrvibB/BhkeuhBJhigzsghT0veh+WAlMcCGHvMOMQwcCdcIntYy6WmXhIg2PuiAvsEHO97IhHGgzckb4D8L6LmZYPMHBnhiWwXVdDPF9g4A4Vwd66nFr6BAN3ygbbw1yoMzjmjplgB5hrrufSvsHAHesZDOD2JAbxVYCBOzfIAZ9JbR6qAgN3cPwP9kZy1VIlGLiTdluCmoOBO/pnS9Bk8DzmS3pL4BMcpZEe1qX0GI/atC4dQYXRMa1MU0IX4gpWsIIVrGAFK1jBCnYUPwIMAPUPAyFL+nRdAAAAAElFTkSuQmCC');margin-top:-.5em}.x-field-select{position:relative;z-index:1}.x-field-select .x-component-outer:after{z-index:2;background-color:#ddd}.x-field-select .x-component-outer:before,.x-field-select .x-component-outer:after{pointer-events:none;position:absolute;display:block}.x-select-overlay .x-list-item-label{height:2.6em}.x-select-overlay .x-item-selected .x-list-label{margin-right:2.6em}.x-select-overlay .x-item-selected.x-list-item::after{color:#ddd}.x-spinner .x-field-input .x-input-el{-webkit-text-fill-color:#000}.x-spinner.x-item-disabled .x-input-el{-webkit-text-fill-color:#B3B3B3}.x-spinner.x-item-disabled .x-spinner-button{color:#aaa !important}.x-spinner.x-item-disabled .x-spinner-button,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button{border:1px solid #c4c4c4;border-top-color:#d0d0d0;background-color:#f7f7f7;color:#1e1e1e}.x-spinner.x-item-disabled .x-spinner-button.x-button-back:before,.x-spinner.x-item-disabled .x-spinner-button.x-button-forward:before,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-back:before,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-forward:before{background:#c4c4c4}.x-spinner.x-item-disabled .x-spinner-button,.x-spinner.x-item-disabled .x-spinner-button.x-button-back:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-forward:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-back:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-forward:after{background-image:none;background-color:#f7f7f7;background-image:-webkit-linear-gradient(top, #ffffff,#ffffff 3%,#eaeaea);background-image:-moz-linear-gradient(top, #ffffff,#ffffff 3%,#eaeaea);background-image:-o-linear-gradient(top, #ffffff,#ffffff 3%,#eaeaea);background-image:-ms-linear-gradient(to bottom, #ffffff,#ffffff 3%,#eaeaea)}.x-spinner.x-item-disabled .x-spinner-button.x-button-pressing,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressing:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressed,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressed:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-active,.x-spinner.x-item-disabled .x-spinner-button.x-button-active:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressing,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressing:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressed,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressed:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-active,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-active:after{background-image:none;background-color:#efefef;background-image:-webkit-linear-gradient(top, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0);background-image:-moz-linear-gradient(top, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0);background-image:-o-linear-gradient(top, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0);background-image:-ms-linear-gradient(to bottom, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0)}.x-spinner .x-spinner-button{margin-top:.25em;margin-bottom:.25em;width:2em;padding:.23em 0 .27em;font-weight:bold;text-align:center;border:1px solid #ddd !important;-moz-border-radius:1em;-webkit-border-radius:1em;border-radius:1em}.x-spinner .x-spinner-button,.x-toolbar .x-spinner .x-spinner-button{border:1px solid #b7b7b7;border-top-color:#c4c4c4;background-color:#eaeaea;color:#111}.x-spinner .x-spinner-button.x-button-back:before,.x-spinner .x-spinner-button.x-button-forward:before,.x-toolbar .x-spinner .x-spinner-button.x-button-back:before,.x-toolbar .x-spinner .x-spinner-button.x-button-forward:before{background:#b7b7b7}.x-spinner .x-spinner-button,.x-spinner .x-spinner-button.x-button-back:after,.x-spinner .x-spinner-button.x-button-forward:after,.x-toolbar .x-spinner .x-spinner-button,.x-toolbar .x-spinner .x-spinner-button.x-button-back:after,.x-toolbar .x-spinner .x-spinner-button.x-button-forward:after{background-image:none;background-color:#eaeaea;background-image:-webkit-linear-gradient(top, #ffffff,#f7f7f7 3%,#dddddd);background-image:-moz-linear-gradient(top, #ffffff,#f7f7f7 3%,#dddddd);background-image:-o-linear-gradient(top, #ffffff,#f7f7f7 3%,#dddddd);background-image:-ms-linear-gradient(to bottom, #ffffff,#f7f7f7 3%,#dddddd)}.x-spinner .x-spinner-button.x-button-pressing,.x-spinner .x-spinner-button.x-button-pressing:after,.x-spinner .x-spinner-button.x-button-pressed,.x-spinner .x-spinner-button.x-button-pressed:after,.x-spinner .x-spinner-button.x-button-active,.x-spinner .x-spinner-button.x-button-active:after,.x-toolbar .x-spinner .x-spinner-button.x-button-pressing,.x-toolbar .x-spinner .x-spinner-button.x-button-pressing:after,.x-toolbar .x-spinner .x-spinner-button.x-button-pressed,.x-toolbar .x-spinner .x-spinner-button.x-button-pressed:after,.x-toolbar .x-spinner .x-spinner-button.x-button-active,.x-toolbar .x-spinner .x-spinner-button.x-button-active:after{background-image:none;background-color:#e2e2e2;background-image:-webkit-linear-gradient(top, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3);background-image:-moz-linear-gradient(top, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3);background-image:-o-linear-gradient(top, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3);background-image:-ms-linear-gradient(to bottom, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3)}.x-spinner .x-spinner-button-down{margin-left:.25em}.x-spinner .x-spinner-button-up{margin-right:.25em}.x-spinner.x-field-grouped-buttons .x-spinner-button-down{margin-right:.5em}.x-android .x-spinner-button{padding:.40em 0 .11em !important}.x-ie .x-spinner .x-field-input .x-input-el:disabled{color:#000}.x-list{background-color:#f7f7f7}.x-list .x-list-disclosure{position:relative;overflow:visible;border:0;-moz-border-radius:32px;-webkit-border-radius:32px;border-radius:32px;background-image:none;background-color:#5e86dc;background-image:-webkit-linear-gradient(top, #9db6ea,#7396e0 3%,#4977d7);background-image:-moz-linear-gradient(top, #9db6ea,#7396e0 3%,#4977d7);background-image:-o-linear-gradient(top, #9db6ea,#7396e0 3%,#4977d7);background-image:-ms-linear-gradient(to bottom, #9db6ea,#7396e0 3%,#4977d7);width:32px;height:32px;margin:7px 7px 0 0}.x-list .x-list-disclosure:before{position:absolute;top:0;right:0;bottom:0;left:0;content:']';font-family:'Pictos';color:#fff;font-size:24px;text-align:center;line-height:35px;text-shadow:0 0 0}.x-list.x-list-indexed .x-list-disclosure{margin-right:1.8em}.x-list .x-item-selected .x-list-disclosure{background:#fff none}.x-list .x-item-selected .x-list-disclosure:before{color:#688AD2}.x-list .x-list-item{color:#000}.x-list .x-list-item.x-item-selected .x-dock-horizontal,.x-list .x-list-item.x-item-selected.x-list-item-tpl{background-image:none;background-color:#688AD2;background-image:-webkit-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-moz-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-o-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-ms-linear-gradient(to bottom, #a3b8e4,#7c99d8 3%,#547bcc);color:#fff}.x-list .x-list-item.x-item-pressed.x-list-item-tpl,.x-list .x-list-item.x-item-pressed .x-dock-horizontal{background:#fff none}.x-list .x-list-item .x-list-item-body,.x-list .x-list-item.x-list-item-tpl .x-innerhtml{padding:12px 15px}.x-list-normal .x-list-header{background-image:none;background-color:#fefefe;background-image:-webkit-linear-gradient(top, #ffffff,#ffffff 3%,#f3f0f0);background-image:-moz-linear-gradient(top, #ffffff,#ffffff 3%,#f3f0f0);background-image:-o-linear-gradient(top, #ffffff,#ffffff 3%,#f3f0f0);background-image:-ms-linear-gradient(to bottom, #ffffff,#ffffff 3%,#f3f0f0);color:#b9aaaa;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0;border-top:1px solid #fefefe;border-bottom:1px solid #d0c6c6;font-weight:bold;font-size:0.8em;padding:0.2em 1.02em}.x-list-normal .x-list-item.x-list-item-tpl,.x-list-normal .x-list-item .x-dock-horizontal{border-top:1px solid #dedede}.x-list-normal .x-list-item.x-list-item-tpl.x-list-footer-wrap,.x-list-normal .x-list-item.x-list-footer-wrap .x-dock-horizontal{border-bottom:1px solid #dedede}.x-list-normal .x-list-item.x-item-pressed.x-list-item-tpl,.x-list-normal .x-list-item.x-item-pressed .x-dock-horizontal{border-top-color:#fff;background-color:#fff}.x-list-normal .x-list-item.x-item-selected.x-list-item-tpl,.x-list-normal .x-list-item.x-item-selected .x-dock-horizontal{border-top-color:#688AD2}.x-list-round .x-scroll-view{background-color:#eee}.x-list-round .x-list-header-swap{padding-right:13px}.x-list-round .x-list-inner .x-scroll-container{top:13px;left:13px;bottom:13px;right:13px;width:auto !important;height:auto !important}.x-list-round .x-list-header{color:#777;font-size:1em;font-weight:bold;padding-left:26px;line-height:1.7em;background-image:-webkit-linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4));background-image:-moz-linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4));background-image:-o-linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4));background-image:-ms-linear-gradient(to bottom, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4))}.x-list-round .x-list-container{padding:13px 13px 0 13px}.x-list-round .x-list-container .x-list-header{padding-left:13px;background-image:none}.x-list-round.x-list-ungrouped .x-list-item-tpl,.x-list-round.x-list-ungrouped .x-list-item .x-dock-horizontal,.x-list-round.x-list-grouped .x-list-item-tpl,.x-list-round.x-list-grouped .x-list-item .x-dock-horizontal{border:1px solid #dedede;border-width:1px 1px 0 1px;background:#f7f7f7}.x-list-round.x-list-ungrouped .x-list-item-first{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-list-round.x-list-ungrouped .x-list-item-last{-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em;border-width:1px;margin-bottom:13px}.x-list-round.x-list-grouped .x-list-header-wrap .x-dock-horizontal{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-list-round.x-list-grouped .x-list-header-wrap.x-list-header{border:1px solid #dedede;border-width:1px 1px 0 1px;-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em;-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-list-round.x-list-grouped .x-list-footer-wrap{background:transparent}.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-tpl,.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal{border:none;background:transparent;padding-bottom:13px;margin-bottom:13px}.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-tpl>.x-innerhtml,.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-tpl>.x-dock-body,.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal>.x-innerhtml,.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal>.x-dock-body{border:1px solid #dedede;background:#f7f7f7;-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-pressed>.x-innerhtml,.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-pressed>.x-dock-body{background:#fff none}.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-selected>.x-innerhtml,.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-selected>.x-dock-body{background-image:none;background-color:#688AD2;background-image:-webkit-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-moz-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-o-linear-gradient(top, #a3b8e4,#7c99d8 3%,#547bcc);background-image:-ms-linear-gradient(to bottom, #a3b8e4,#7c99d8 3%,#547bcc);color:#fff}.x-list-round .x-indexbar-vertical{margin-right:20px}.x-list-round .x-list-footer-wrap.x-list-item-last.x-list-item-odd.x-list-item.x-list-item-tpl{background-color:transparent !important}.x-list-round.x-list-grouped .x-list-item-odd.x-list-footer-wrap>.x-innerhtml,.x-list-round.x-list-grouped .x-list-item-odd.x-list-footer-wrap>.x-dock-body{background-color:#eaeaea !important}.x-list .x-list-item-odd.x-list-item-tpl,.x-list .x-list-item-odd .x-dock-horizontal{background-color:#eaeaea !important;border-bottom:1px solid #eaeaea}.x-picker .x-picker-inner{background-color:#fff;overflow:hidden;margin:.7em;-moz-border-radius:.4em;-webkit-border-radius:.4em;border-radius:.4em;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-background-clip:padding;background-clip:padding-box;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #bbb), color-stop(30%, #fff), color-stop(70%, #fff), color-stop(100%, #bbb));background:-webkit-linear-gradient(top, #bbb 0%, #fff 30%, #fff 70%, #bbb 100%)}.x-picker-slot .x-scroll-view{-moz-box-shadow:rgba(0,0,0,0.4) -1px 0 1px;-webkit-box-shadow:rgba(0,0,0,0.4) -1px 0 1px;box-shadow:rgba(0,0,0,0.4) -1px 0 1px}.x-picker-slot .x-scroll-view:first-child{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.x-picker-bar{border-top:0.12em solid #688AD2;border-bottom:0.12em solid #688AD2;height:2.5em;background-image:none;background-color:rgba(13,86,242,0.3);background-image:-webkit-linear-gradient(top, rgba(85,137,246,0.3),rgba(37,103,244,0.3) 3%,rgba(11,78,218,0.3));background-image:-moz-linear-gradient(top, rgba(85,137,246,0.3),rgba(37,103,244,0.3) 3%,rgba(11,78,218,0.3));background-image:-o-linear-gradient(top, rgba(85,137,246,0.3),rgba(37,103,244,0.3) 3%,rgba(11,78,218,0.3));background-image:-ms-linear-gradient(to bottom, rgba(85,137,246,0.3),rgba(37,103,244,0.3) 3%,rgba(11,78,218,0.3));-moz-box-shadow:rgba(0,0,0,0.2) 0 0.2em 0.2em;-webkit-box-shadow:rgba(0,0,0,0.2) 0 0.2em 0.2em;box-shadow:rgba(0,0,0,0.2) 0 0.2em 0.2em}.x-use-titles .x-picker-bar{margin-top:1.5em}.x-picker-slot-title{height:1.5em;border-top:1px solid #dcd4d4;border-bottom:1px solid #ae9c9c;padding:0.2em 1.02em;-moz-box-shadow:rgba(0,0,0,0.3) 0px 0.1em 0.3em;-webkit-box-shadow:rgba(0,0,0,0.3) 0px 0.1em 0.3em;box-shadow:rgba(0,0,0,0.3) 0px 0.1em 0.3em;background-image:none;background-color:#dcd4d4;background-image:-webkit-linear-gradient(top, #fefefe,#e7e2e2 3%,#d0c6c6);background-image:-moz-linear-gradient(top, #fefefe,#e7e2e2 3%,#d0c6c6);background-image:-o-linear-gradient(top, #fefefe,#e7e2e2 3%,#d0c6c6);background-image:-ms-linear-gradient(to bottom, #fefefe,#e7e2e2 3%,#d0c6c6)}.x-picker-slot-title>div{font-size:0.8em;color:#8b8b8b;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0}.x-picker-slot{border-left:2px solid #acacac}.x-picker-slot .x-dataview-item{height:2.5em;line-height:2.5em;font-weight:bold;padding:0 10px}.x-picker-slot:first-child{border-left:0}.x-toggle{width:4.4em;border:1px solid #b7b7b7;background-image:none;background-color:#ddd;background-image:-webkit-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:-moz-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:-o-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:-ms-linear-gradient(to bottom, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);-moz-border-radius:1.1em;-webkit-border-radius:1.1em;border-radius:1.1em}.x-toggle .x-thumb.x-dragging{opacity:1}.x-toggle .x-thumb:before{top:.175em}.x-toggle-on{background-image:none;background-color:#92cf00;background-image:-webkit-linear-gradient(top, #6e9c00,#80b600 10%,#92cf00 65%,#94d200);background-image:-moz-linear-gradient(top, #6e9c00,#80b600 10%,#92cf00 65%,#94d200);background-image:-o-linear-gradient(top, #6e9c00,#80b600 10%,#92cf00 65%,#94d200);background-image:-ms-linear-gradient(to bottom, #6e9c00,#80b600 10%,#92cf00 65%,#94d200)}.x-button.border-radius-10{-moz-border-radius:10px !important;-webkit-border-radius:10px;border-radius:10px !important}.x-dataview.color .x-dataview-inner.x-scroll-scroller{width:auto !important;height:auto !important;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-dataview.color .x-dataview-inner.x-scroll-scroller .x-dataview-container{margin-top:12px;margin-left:12px}.x-dataview.color .x-dataview-item{display:inline-block}.x-dataview.color .x-dataview-item.x-item-selected .item-inner{-moz-box-shadow:#3ba8ff 0 0 0 4px;-webkit-box-shadow:#3ba8ff 0 0 0 4px;box-shadow:#3ba8ff 0 0 0 4px}.x-dataview.color .x-dataview-item .item-inner{display:inline-block;width:50px;height:50px;border:1px solid #d8d8d8;margin:6px}.x-list.settings{-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-list.settings.x-list-round .x-scroll-view{-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-list.settings.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-tpl{padding-bottom:0}.x-list.settings.x-list-round.x-list-grouped .x-list-header-wrap .x-dock-horizontal{padding-top:0}.x-list.settings.x-list-round.x-list-grouped .x-list-header-wrap .x-list-header{display:none}.x-list.settings.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-last .x-dock-horizontal{padding-bottom:0}.x-list.settings.x-list-round.x-list-grouped .x-list-item .x-dock-horizontal{border:1px solid #bcbcbc;border-width:1px 1px 0 1px;background:#fff}.x-list.settings.x-list-round.x-list-grouped .x-list-item .x-dock-horizontal .x-innerhtml{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-pressed .x-dock-horizontal{background-image:-webkit-linear-gradient(top, #7c99d8,#416cc6);background-image:-moz-linear-gradient(top, #7c99d8,#416cc6);background-image:-o-linear-gradient(top, #7c99d8,#416cc6);background-image:-ms-linear-gradient(to bottom, #7c99d8,#416cc6);color:#fff}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-pressed .x-dock-horizontal .disclosure{background-position:-24px 0}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-selected .x-dock-horizontal{color:inherit}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-selected .x-dock-horizontal .x-list-item-body{padding-right:1.2em}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-selected .x-dock-horizontal:after{content:"";width:24px;height:24px;position:absolute;top:11px;right:11px;background-image:url("../img/icons/list-retina.png");background-size:72px 48px;background-position:0 -24px}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-selected.x-item-pressed .x-dock-horizontal{color:#fff}.x-list.settings.x-list-round.x-list-grouped .x-list-item.x-item-selected.x-item-pressed .x-dock-horizontal:after{background-position:-24px -24px}.x-list.settings.x-list-round.x-list-grouped .x-list-item .list-icon{width:24px;height:24px;position:absolute}.x-list.settings.x-list-round.x-list-grouped .x-list-item .icon-offset{margin-left:30px}.x-list.settings.x-list-round.x-list-grouped .x-list-item .disclosure{right:12px;background-image:url("../img/icons/list-retina.png");background-size:72px 48px;background-position:0 0}.x-list.settings.x-list-round.x-list-grouped .x-list-header-wrap.x-list-footer-wrap .x-dock-body{-moz-border-radius:.4em;-webkit-border-radius:.4em;border-radius:.4em}.x-list.settings.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal{border:none;background:transparent;padding-bottom:13.8px}.x-list.settings.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal>.x-dock-body{border:1px solid #bcbcbc;background:#fff}.x-list.settings.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-pressed .x-dock-horizontal{background:transparent}.x-list.settings.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-pressed .x-dock-horizontal>.x-dock-body{-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em;-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em;background-image:-webkit-linear-gradient(top, #7c99d8,#416cc6);background-image:-moz-linear-gradient(top, #7c99d8,#416cc6);background-image:-o-linear-gradient(top, #7c99d8,#416cc6);background-image:-ms-linear-gradient(to bottom, #7c99d8,#416cc6);color:#fff}.x-msgbox{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #989898,#656565 10%,#656565);background-image:-moz-linear-gradient(top, #989898,#656565 10%,#656565);background-image:-o-linear-gradient(top, #989898,#656565 10%,#656565);background-image:-ms-linear-gradient(to bottom, #989898,#656565 10%,#656565)}.x-msgbox .x-toolbar.x-docked-bottom .x-button .x-button-label,.x-msgbox .x-toolbar.x-docked-bottom .x-button .x-badge{font-size:.9em;line-height:2em}.x-msgbox .x-title{font-size:1em;line-height:1.4em;color:#ffffff;text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-dataview.icon-view .x-dataview-inner.x-scroll-scroller{width:auto !important;height:auto !important}.x-dataview.icon-view .x-dataview-inner.x-scroll-scroller .x-dataview-container{margin-top:12px;margin-left:12px}.x-dataview.icon-view .x-dataview-item{display:inline-block}.x-dataview.icon-view .x-dataview-item.x-item-pressed .item-inner,.x-dataview.icon-view .x-dataview-item.x-item-selected .item-inner{background-image:-webkit-linear-gradient(top, #7c99d8,#416cc6);background-image:-moz-linear-gradient(top, #7c99d8,#416cc6);background-image:-o-linear-gradient(top, #7c99d8,#416cc6);background-image:-ms-linear-gradient(to bottom, #7c99d8,#416cc6);color:#fff}.x-dataview.icon-view .x-dataview-item .item-inner{display:inline-block;width:77px;height:77px;border:1px solid #bcbcbc;background:#fff;margin:-1px}.x-dataview.icon-view .x-dataview-item .item-inner.top-left{-moz-border-radius-topleft:.4em;-webkit-border-top-left-radius:.4em;border-top-left-radius:.4em}.x-dataview.icon-view .x-dataview-item .item-inner.top-right{-moz-border-radius-topright:.4em;-webkit-border-top-right-radius:.4em;border-top-right-radius:.4em}.x-dataview.icon-view .x-dataview-item .item-inner.bottom-left{-moz-border-radius-bottomleft:.4em;-webkit-border-bottom-left-radius:.4em;border-bottom-left-radius:.4em}.x-dataview.icon-view .x-dataview-item .item-inner.bottom-right{-moz-border-radius-bottomright:.4em;-webkit-border-bottom-right-radius:.4em;border-bottom-right-radius:.4em}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-0{background-position:0 0px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-0,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-0{background-position:-24px 0px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-1{background-position:0 -24px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-1,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-1{background-position:-24px -24px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-2{background-position:0 -48px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-2,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-2{background-position:-24px -48px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-3{background-position:0 -72px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-3,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-3{background-position:-24px -72px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-4{background-position:0 -96px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-4,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-4{background-position:-24px -96px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-5{background-position:0 -120px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-5,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-5{background-position:-24px -120px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-6{background-position:0 -144px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-6,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-6{background-position:-24px -144px}.x-dataview.icon-view.bullets .x-dataview-item .icon.bullet-7{background-position:0 -168px}.x-dataview.icon-view.bullets .x-dataview-item.x-item-selected .icon.bullet-7,.x-dataview.icon-view.bullets .x-dataview-item.x-item-pressed .icon.bullet-7{background-position:-24px -168px}.x-dataview.icon-view.bullets .item-inner .text{margin-top:1.4em;text-align:center}.x-dataview.icon-view.bullets .item-inner .icon{width:24px;height:24px;margin:1.4em auto;background-image:url("../img/icons/bullets-retina.png");background-size:48px 168px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-0{background-position:0 0px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-0,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-0{background-position:-74px 0px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-1{background-position:0 -74px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-1,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-1{background-position:-74px -74px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-2{background-position:0 -148px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-2,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-2{background-position:-74px -148px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-3{background-position:0 -222px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-3,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-3{background-position:-74px -222px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-4{background-position:0 -296px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-4,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-4{background-position:-74px -296px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-5{background-position:0 -370px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-5,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-5{background-position:-74px -370px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-6{background-position:0 -444px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-6,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-6{background-position:-74px -444px}.x-dataview.icon-view.numbering .x-dataview-item .icon.numbering-7{background-position:0 -518px}.x-dataview.icon-view.numbering .x-dataview-item.x-item-selected .icon.numbering-7,.x-dataview.icon-view.numbering .x-dataview-item.x-item-pressed .icon.numbering-7{background-position:-74px -518px}.x-dataview.icon-view.numbering .item-inner .text{position:relative;top:1.4em;text-align:center}.x-dataview.icon-view.numbering .item-inner .icon{width:74px;height:74px;margin:0 auto;background-image:url("../img/icons/numbering-retina.png");background-size:148px 518px}.x-dataview.icon-view.outline .x-dataview-item .icon.outline-0{background-position:0 0px}.x-dataview.icon-view.outline .x-dataview-item.x-item-selected .icon.outline-0,.x-dataview.icon-view.outline .x-dataview-item.x-item-pressed .icon.outline-0{background-position:-74px 0px}.x-dataview.icon-view.outline .x-dataview-item .icon.outline-1{background-position:0 -74px}.x-dataview.icon-view.outline .x-dataview-item.x-item-selected .icon.outline-1,.x-dataview.icon-view.outline .x-dataview-item.x-item-pressed .icon.outline-1{background-position:-74px -74px}.x-dataview.icon-view.outline .x-dataview-item .icon.outline-2{background-position:0 -148px}.x-dataview.icon-view.outline .x-dataview-item.x-item-selected .icon.outline-2,.x-dataview.icon-view.outline .x-dataview-item.x-item-pressed .icon.outline-2{background-position:-74px -148px}.x-dataview.icon-view.outline .item-inner .text{position:relative;top:1.4em;text-align:center}.x-dataview.icon-view.outline .item-inner .icon{width:74px;height:74px;margin:0 auto;background-image:url("../img/icons/outline-retina.png");background-size:148px 222px}.x-panel.x-panel-settings{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #ececec,#cbcbcb);background-image:-moz-linear-gradient(top, #ececec,#cbcbcb);background-image:-o-linear-gradient(top, #ececec,#cbcbcb);background-image:-ms-linear-gradient(to bottom, #ececec,#cbcbcb);-moz-box-shadow:#fff 0 1px 0 inset,rgba(0,0,0,0.3) 0 0.2em 0.6em;-webkit-box-shadow:#fff 0 1px 0 inset,rgba(0,0,0,0.3) 0 0.2em 0.6em;box-shadow:#fff 0 1px 0 inset,rgba(0,0,0,0.3) 0 0.2em 0.6em;border:1px solid #797979}.x-panel.x-panel-settings .x-anchor-top{background-color:#797979;margin-top:-.62em;-moz-box-shadow:#fff 0 -1px 0 0 inset;-webkit-box-shadow:#fff 0 -1px 0 0 inset;box-shadow:#fff 0 -1px 0 0 inset}.x-panel.x-panel-settings .x-anchor-top:after{content:'';position:absolute;width:1.631em;height:.7em;-webkit-mask-size:1.631em .7em;background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #f1f1f1,#ececec);background-image:-moz-linear-gradient(top, #f1f1f1,#ececec);background-image:-o-linear-gradient(top, #f1f1f1,#ececec);background-image:-ms-linear-gradient(to bottom, #f1f1f1,#ececec);top:1px !important}.x-panel.x-panel-settings .x-anchor-bottom{height:.8em;background-color:#797979;margin-top:-0.15em;-moz-box-shadow:#fff 0 -1px 0 0 inset;-webkit-box-shadow:#fff 0 -1px 0 0 inset;box-shadow:#fff 0 -1px 0 0 inset}.x-panel.x-panel-settings .x-anchor-bottom:after{content:'';position:absolute;width:1.631em;height:.8em;-webkit-mask-size:1.631em .7em;background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #cbcbcb,#bebebe);background-image:-moz-linear-gradient(top, #cbcbcb,#bebebe);background-image:-o-linear-gradient(top, #cbcbcb,#bebebe);background-image:-ms-linear-gradient(to bottom, #cbcbcb,#bebebe);top:-1px !important}.x-panel.x-panel-settings .x-panel-inner{background:transparent}.x-panel.x-panel-settings .x-navigation-bar{border-bottom:none;margin-top:-6px;background:transparent;overflow:hidden}.x-panel.x-panel-settings .x-navigation-bar .x-title{color:#323232;text-shadow:#fff 0 0.08em 0}.x-panel.x-panel-settings .x-navigationview.plain .x-navigationview-inner{background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.x-panel.x-panel-settings .x-navigationview.plain .x-navigationview-inner:after{content:none}.x-panel.x-panel-settings .x-navigationview-inner{background-color:#efefef;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em}.x-panel.x-panel-settings .x-navigationview-inner:after{content:'';position:absolute;width:100%;height:100%;top:0;left:0;pointer-events:none;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em;-moz-box-shadow:inset 0 1px 2px 2px #c8c8c8;-webkit-box-shadow:inset 0 1px 2px 2px #c8c8c8;box-shadow:inset 0 1px 2px 2px #c8c8c8;border:1px solid #797979}.x-label.info .x-innerhtml{color:#7f7f7f;text-shadow:0 1px 0 #fff;text-align:center}.btn-input-image input[type="file"]{opacity:0;position:absolute;left:0;top:0}.x-mask.transparent{background:transparent}.round{-moz-border-radius:.4em;-webkit-border-radius:.4em;border-radius:.4em}.x-list-header-wrap{-moz-border-radius-topleft:.4em !important;-webkit-border-top-left-radius:.4em !important;border-top-left-radius:.4em !important;-moz-border-radius-topright:.4em !important;-webkit-border-top-right-radius:.4em !important;border-top-right-radius:.4em !important}.x-list-header-wrap .x-innerhtml{-moz-border-radius-topleft:.4em !important;-webkit-border-top-left-radius:.4em !important;border-top-left-radius:.4em !important;-moz-border-radius-topright:.4em !important;-webkit-border-top-right-radius:.4em !important;border-top-right-radius:.4em !important}.x-list-header{display:none}.x-spinner.planar-spinner.x-field-grouped-buttons{background:transparent}.x-spinner.planar-spinner.x-field-grouped-buttons.x-field{min-height:0}.x-spinner.planar-spinner.x-field-grouped-buttons .x-form-label{background:transparent}.x-spinner.planar-spinner.x-field-grouped-buttons .x-form-label span{font-size:inherit}.x-spinner.planar-spinner.x-field-grouped-buttons .x-button{margin-top:9px;margin-bottom:9px;padding:0 8px !important}.x-spinner.planar-spinner.x-field-grouped-buttons .x-form-label{padding:0.16em}.x-spinner.planar-spinner.x-field-grouped-buttons .x-field-input{-moz-box-shadow:#b2b2b2 0 3px 4px -2px inset;-webkit-box-shadow:#b2b2b2 0 3px 4px -2px inset;box-shadow:#b2b2b2 0 3px 4px -2px inset;background:#fff;min-width:2.3em}.x-spinner.planar-spinner.x-field-grouped-buttons .x-field-input .x-input-el{text-align:center;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;padding:3px 0 4px;min-height:0;border-top:1px solid #898989;border-bottom:1px solid #898989}.x-spinner.planar-spinner.x-field-grouped-buttons .x-spinner-button{width:auto;border:1px solid #939393 !important;margin:0}.x-spinner.planar-spinner.x-field-grouped-buttons .x-spinner-button-down{margin-right:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.x-spinner.planar-spinner.x-field-grouped-buttons .x-spinner-button-up{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.x-toolbar{background-color:transparent}.x-toolbar-edit{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-moz-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-o-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-ms-linear-gradient(to bottom, #ffffff,#ececec 3%,#cbcbcb);border-color:#4c4c4c}.x-toolbar-edit .x-title{color:#000;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0}.x-toolbar-edit.x-docked-top{border-bottom:1px solid #939393}.x-toolbar-edit .x-button,.x-toolbar .x-toolbar-edit .x-button,.x-toolbar-edit .x-field-select .x-component-outer,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer,.x-toolbar-edit .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before{border:1px solid #8b8b8b;border-top-color:#989898;background-color:#bebebe;color:#000}.x-toolbar-edit .x-button.x-button-back:before,.x-toolbar-edit .x-button.x-button-forward:before,.x-toolbar .x-toolbar-edit .x-button.x-button-back:before,.x-toolbar .x-toolbar-edit .x-button.x-button-forward:before,.x-toolbar-edit .x-field-select .x-component-outer.x-button-back:before,.x-toolbar-edit .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-back:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-forward:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-forward:before{background:#8b8b8b}.x-toolbar-edit .x-button,.x-toolbar-edit .x-button.x-button-back:after,.x-toolbar-edit .x-button.x-button-forward:after,.x-toolbar .x-toolbar-edit .x-button,.x-toolbar .x-toolbar-edit .x-button.x-button-back:after,.x-toolbar .x-toolbar-edit .x-button.x-button-forward:after,.x-toolbar-edit .x-field-select .x-component-outer,.x-toolbar-edit .x-field-select .x-component-outer.x-button-back:after,.x-toolbar-edit .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-back:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar-edit .x-field-select .x-component-outer:before,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-forward:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-forward:after{background-image:none;background-color:#bebebe;background-image:-webkit-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-moz-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-o-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-ms-linear-gradient(to bottom, #e5e5e5,#cbcbcb 3%,#b2b2b2)}.x-toolbar-edit .x-button.x-button-pressing,.x-toolbar-edit .x-button.x-button-pressing:after,.x-toolbar-edit .x-button.x-button-pressed,.x-toolbar-edit .x-button.x-button-pressed:after,.x-toolbar-edit .x-button.x-button-active,.x-toolbar-edit .x-button.x-button-active:after,.x-toolbar .x-toolbar-edit .x-button.x-button-pressing,.x-toolbar .x-toolbar-edit .x-button.x-button-pressing:after,.x-toolbar .x-toolbar-edit .x-button.x-button-pressed,.x-toolbar .x-toolbar-edit .x-button.x-button-pressed:after,.x-toolbar .x-toolbar-edit .x-button.x-button-active,.x-toolbar .x-toolbar-edit .x-button.x-button-active:after,.x-toolbar-edit .x-field-select .x-component-outer.x-button-pressing,.x-toolbar-edit .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar-edit .x-field-select .x-component-outer.x-button-pressed,.x-toolbar-edit .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar-edit .x-field-select .x-component-outer.x-button-active,.x-toolbar-edit .x-field-select .x-component-outer.x-button-active:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-pressing,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-pressed,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-active,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer.x-button-active:after,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-active,.x-toolbar-edit .x-field-select .x-component-outer:before.x-button-active:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-active,.x-toolbar .x-toolbar-edit .x-field-select .x-component-outer:before.x-button-active:after{background-image:none;background-color:#b7b7b7;background-image:-webkit-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-moz-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-o-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-ms-linear-gradient(to bottom, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8)}.x-toolbar-edit .x-label,.x-toolbar-edit .x-form-label{font-weight:normal;color:#4c4c4c;text-shadow:0 1px 0 #fff}.x-toolbar{background-color:transparent}.x-toolbar-search{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #cbcbcb,#e7e7e7 20%,#e7e7e7);background-image:-moz-linear-gradient(top, #cbcbcb,#e7e7e7 20%,#e7e7e7);background-image:-o-linear-gradient(top, #cbcbcb,#e7e7e7 20%,#e7e7e7);background-image:-ms-linear-gradient(to bottom, #cbcbcb,#e7e7e7 20%,#e7e7e7);border-color:#4c4c4c}.x-toolbar-search .x-title{color:#000;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0}.x-toolbar-search.x-docked-top{border-bottom:1px solid #939393}.x-toolbar-search .x-button,.x-toolbar .x-toolbar-search .x-button,.x-toolbar-search .x-field-select .x-component-outer,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer,.x-toolbar-search .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before{border:1px solid #8b8b8b;border-top-color:#989898;background-color:#bebebe;color:#000}.x-toolbar-search .x-button.x-button-back:before,.x-toolbar-search .x-button.x-button-forward:before,.x-toolbar .x-toolbar-search .x-button.x-button-back:before,.x-toolbar .x-toolbar-search .x-button.x-button-forward:before,.x-toolbar-search .x-field-select .x-component-outer.x-button-back:before,.x-toolbar-search .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-back:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-forward:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-forward:before{background:#8b8b8b}.x-toolbar-search .x-button,.x-toolbar-search .x-button.x-button-back:after,.x-toolbar-search .x-button.x-button-forward:after,.x-toolbar .x-toolbar-search .x-button,.x-toolbar .x-toolbar-search .x-button.x-button-back:after,.x-toolbar .x-toolbar-search .x-button.x-button-forward:after,.x-toolbar-search .x-field-select .x-component-outer,.x-toolbar-search .x-field-select .x-component-outer.x-button-back:after,.x-toolbar-search .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-back:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar-search .x-field-select .x-component-outer:before,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-forward:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-forward:after{background-image:none;background-color:#bebebe;background-image:-webkit-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-moz-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-o-linear-gradient(top, #e5e5e5,#cbcbcb 3%,#b2b2b2);background-image:-ms-linear-gradient(to bottom, #e5e5e5,#cbcbcb 3%,#b2b2b2)}.x-toolbar-search .x-button.x-button-pressing,.x-toolbar-search .x-button.x-button-pressing:after,.x-toolbar-search .x-button.x-button-pressed,.x-toolbar-search .x-button.x-button-pressed:after,.x-toolbar-search .x-button.x-button-active,.x-toolbar-search .x-button.x-button-active:after,.x-toolbar .x-toolbar-search .x-button.x-button-pressing,.x-toolbar .x-toolbar-search .x-button.x-button-pressing:after,.x-toolbar .x-toolbar-search .x-button.x-button-pressed,.x-toolbar .x-toolbar-search .x-button.x-button-pressed:after,.x-toolbar .x-toolbar-search .x-button.x-button-active,.x-toolbar .x-toolbar-search .x-button.x-button-active:after,.x-toolbar-search .x-field-select .x-component-outer.x-button-pressing,.x-toolbar-search .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar-search .x-field-select .x-component-outer.x-button-pressed,.x-toolbar-search .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar-search .x-field-select .x-component-outer.x-button-active,.x-toolbar-search .x-field-select .x-component-outer.x-button-active:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-pressing,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-pressed,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-active,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer.x-button-active:after,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-active,.x-toolbar-search .x-field-select .x-component-outer:before.x-button-active:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-active,.x-toolbar .x-toolbar-search .x-field-select .x-component-outer:before.x-button-active:after{background-image:none;background-color:#b7b7b7;background-image:-webkit-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-moz-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-o-linear-gradient(top, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8);background-image:-ms-linear-gradient(to bottom, #9d9d9d,#aaaaaa 10%,#b7b7b7 65%,#b8b8b8)}.x-toolbar-search .x-label,.x-toolbar-search .x-form-label{font-weight:normal;color:#4c4c4c;text-shadow:0 1px 0 #fff}.x-button-icon.save,.list-icon.save{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 0px;background-size:72px 888px}.x-button-pressing .x-button-icon.save,.x-button-pressing .list-icon.save,.x-button-pressed .x-button-icon.save,.x-button-pressed .list-icon.save,.x-button-active .x-button-icon.save,.x-button-active .list-icon.save,.x-item-pressed .x-button-icon.save,.x-item-pressed .list-icon.save{background-position:-24px 0px}.x-button-icon.undo,.list-icon.undo{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -24px;background-size:72px 888px}.x-button-pressing .x-button-icon.undo,.x-button-pressing .list-icon.undo,.x-button-pressed .x-button-icon.undo,.x-button-pressed .list-icon.undo,.x-button-active .x-button-icon.undo,.x-button-active .list-icon.undo,.x-item-pressed .x-button-icon.undo,.x-item-pressed .list-icon.undo{background-position:-24px -24px}.x-button-icon.share,.list-icon.share{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -48px;background-size:72px 888px}.x-button-pressing .x-button-icon.share,.x-button-pressing .list-icon.share,.x-button-pressed .x-button-icon.share,.x-button-pressed .list-icon.share,.x-button-active .x-button-icon.share,.x-button-active .list-icon.share,.x-item-pressed .x-button-icon.share,.x-item-pressed .list-icon.share{background-position:-24px -48px}.x-button-icon.font-style,.list-icon.font-style{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -72px;background-size:72px 888px}.x-button-pressing .x-button-icon.font-style,.x-button-pressing .list-icon.font-style,.x-button-pressed .x-button-icon.font-style,.x-button-pressed .list-icon.font-style,.x-button-active .x-button-icon.font-style,.x-button-active .list-icon.font-style,.x-item-pressed .x-button-icon.font-style,.x-item-pressed .list-icon.font-style{background-position:-24px -72px}.x-button-icon.font-color,.list-icon.font-color{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -96px;background-size:72px 888px}.x-button-pressing .x-button-icon.font-color,.x-button-pressing .list-icon.font-color,.x-button-pressed .x-button-icon.font-color,.x-button-pressed .list-icon.font-color,.x-button-active .x-button-icon.font-color,.x-button-active .list-icon.font-color,.x-item-pressed .x-button-icon.font-color,.x-item-pressed .list-icon.font-color{background-position:-24px -96px}.x-button-icon.bold,.list-icon.bold{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -120px;background-size:72px 888px}.x-button-pressing .x-button-icon.bold,.x-button-pressing .list-icon.bold,.x-button-pressed .x-button-icon.bold,.x-button-pressed .list-icon.bold,.x-button-active .x-button-icon.bold,.x-button-active .list-icon.bold,.x-item-pressed .x-button-icon.bold,.x-item-pressed .list-icon.bold{background-position:-24px -120px}.x-button-icon.italic,.list-icon.italic{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -144px;background-size:72px 888px}.x-button-pressing .x-button-icon.italic,.x-button-pressing .list-icon.italic,.x-button-pressed .x-button-icon.italic,.x-button-pressed .list-icon.italic,.x-button-active .x-button-icon.italic,.x-button-active .list-icon.italic,.x-item-pressed .x-button-icon.italic,.x-item-pressed .list-icon.italic{background-position:-24px -144px}.x-button-icon.underline,.list-icon.underline{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -168px;background-size:72px 888px}.x-button-pressing .x-button-icon.underline,.x-button-pressing .list-icon.underline,.x-button-pressed .x-button-icon.underline,.x-button-pressed .list-icon.underline,.x-button-active .x-button-icon.underline,.x-button-active .list-icon.underline,.x-item-pressed .x-button-icon.underline,.x-item-pressed .list-icon.underline{background-position:-24px -168px}.x-button-icon.align-left,.list-icon.align-left{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -192px;background-size:72px 888px}.x-button-pressing .x-button-icon.align-left,.x-button-pressing .list-icon.align-left,.x-button-pressed .x-button-icon.align-left,.x-button-pressed .list-icon.align-left,.x-button-active .x-button-icon.align-left,.x-button-active .list-icon.align-left,.x-item-pressed .x-button-icon.align-left,.x-item-pressed .list-icon.align-left{background-position:-24px -192px}.x-button-icon.align-center,.list-icon.align-center{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -216px;background-size:72px 888px}.x-button-pressing .x-button-icon.align-center,.x-button-pressing .list-icon.align-center,.x-button-pressed .x-button-icon.align-center,.x-button-pressed .list-icon.align-center,.x-button-active .x-button-icon.align-center,.x-button-active .list-icon.align-center,.x-item-pressed .x-button-icon.align-center,.x-item-pressed .list-icon.align-center{background-position:-24px -216px}.x-button-icon.align-right,.list-icon.align-right{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -240px;background-size:72px 888px}.x-button-pressing .x-button-icon.align-right,.x-button-pressing .list-icon.align-right,.x-button-pressed .x-button-icon.align-right,.x-button-pressed .list-icon.align-right,.x-button-active .x-button-icon.align-right,.x-button-active .list-icon.align-right,.x-item-pressed .x-button-icon.align-right,.x-item-pressed .list-icon.align-right{background-position:-24px -240px}.x-button-icon.align-fill,.list-icon.align-fill{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -264px;background-size:72px 888px}.x-button-pressing .x-button-icon.align-fill,.x-button-pressing .list-icon.align-fill,.x-button-pressed .x-button-icon.align-fill,.x-button-pressed .list-icon.align-fill,.x-button-active .x-button-icon.align-fill,.x-button-active .list-icon.align-fill,.x-item-pressed .x-button-icon.align-fill,.x-item-pressed .list-icon.align-fill{background-position:-24px -264px}.x-button-icon.bullets,.list-icon.bullets{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -288px;background-size:72px 888px}.x-button-pressing .x-button-icon.bullets,.x-button-pressing .list-icon.bullets,.x-button-pressed .x-button-icon.bullets,.x-button-pressed .list-icon.bullets,.x-button-active .x-button-icon.bullets,.x-button-active .list-icon.bullets,.x-item-pressed .x-button-icon.bullets,.x-item-pressed .list-icon.bullets{background-position:-24px -288px}.x-button-icon.spacing,.list-icon.spacing{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -312px;background-size:72px 888px}.x-button-pressing .x-button-icon.spacing,.x-button-pressing .list-icon.spacing,.x-button-pressed .x-button-icon.spacing,.x-button-pressed .list-icon.spacing,.x-button-active .x-button-icon.spacing,.x-button-active .list-icon.spacing,.x-item-pressed .x-button-icon.spacing,.x-item-pressed .list-icon.spacing{background-position:-24px -312px}.x-button-icon.page-number,.list-icon.page-number{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -336px;background-size:72px 888px}.x-button-pressing .x-button-icon.page-number,.x-button-pressing .list-icon.page-number,.x-button-pressed .x-button-icon.page-number,.x-button-pressed .list-icon.page-number,.x-button-active .x-button-icon.page-number,.x-button-active .list-icon.page-number,.x-item-pressed .x-button-icon.page-number,.x-item-pressed .list-icon.page-number{background-position:-24px -336px}.x-button-icon.insert,.list-icon.insert{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -360px;background-size:72px 888px}.x-button-pressing .x-button-icon.insert,.x-button-pressing .list-icon.insert,.x-button-pressed .x-button-icon.insert,.x-button-pressed .list-icon.insert,.x-button-active .x-button-icon.insert,.x-button-active .list-icon.insert,.x-item-pressed .x-button-icon.insert,.x-item-pressed .list-icon.insert{background-position:-24px -360px}.x-button-icon.search,.list-icon.search{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -384px;background-size:72px 888px}.x-button-pressing .x-button-icon.search,.x-button-pressing .list-icon.search,.x-button-pressed .x-button-icon.search,.x-button-pressed .list-icon.search,.x-button-active .x-button-icon.search,.x-button-active .list-icon.search,.x-item-pressed .x-button-icon.search,.x-item-pressed .list-icon.search{background-position:-24px -384px}.x-button-icon.fullscreen,.list-icon.fullscreen{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -408px;background-size:72px 888px}.x-button-pressing .x-button-icon.fullscreen,.x-button-pressing .list-icon.fullscreen,.x-button-pressed .x-button-icon.fullscreen,.x-button-pressed .list-icon.fullscreen,.x-button-active .x-button-icon.fullscreen,.x-button-active .list-icon.fullscreen,.x-item-pressed .x-button-icon.fullscreen,.x-item-pressed .list-icon.fullscreen{background-position:-24px -408px}.x-button-icon.spinner-down,.list-icon.spinner-down{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -432px;background-size:72px 888px}.x-button-pressing .x-button-icon.spinner-down,.x-button-pressing .list-icon.spinner-down,.x-button-pressed .x-button-icon.spinner-down,.x-button-pressed .list-icon.spinner-down,.x-button-active .x-button-icon.spinner-down,.x-button-active .list-icon.spinner-down,.x-item-pressed .x-button-icon.spinner-down,.x-item-pressed .list-icon.spinner-down{background-position:-24px -432px}.x-button-icon.spinner-up,.list-icon.spinner-up{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -456px;background-size:72px 888px}.x-button-pressing .x-button-icon.spinner-up,.x-button-pressing .list-icon.spinner-up,.x-button-pressed .x-button-icon.spinner-up,.x-button-pressed .list-icon.spinner-up,.x-button-active .x-button-icon.spinner-up,.x-button-active .list-icon.spinner-up,.x-item-pressed .x-button-icon.spinner-up,.x-item-pressed .list-icon.spinner-up{background-position:-24px -456px}.x-button-icon.superscript,.list-icon.superscript{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -480px;background-size:72px 888px}.x-button-pressing .x-button-icon.superscript,.x-button-pressing .list-icon.superscript,.x-button-pressed .x-button-icon.superscript,.x-button-pressed .list-icon.superscript,.x-button-active .x-button-icon.superscript,.x-button-active .list-icon.superscript,.x-item-pressed .x-button-icon.superscript,.x-item-pressed .list-icon.superscript{background-position:-24px -480px}.x-button-icon.subscript,.list-icon.subscript{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -504px;background-size:72px 888px}.x-button-pressing .x-button-icon.subscript,.x-button-pressing .list-icon.subscript,.x-button-pressed .x-button-icon.subscript,.x-button-pressed .list-icon.subscript,.x-button-active .x-button-icon.subscript,.x-button-active .list-icon.subscript,.x-item-pressed .x-button-icon.subscript,.x-item-pressed .list-icon.subscript{background-position:-24px -504px}.x-button-icon.table,.list-icon.table{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -528px;background-size:72px 888px}.x-button-pressing .x-button-icon.table,.x-button-pressing .list-icon.table,.x-button-pressed .x-button-icon.table,.x-button-pressed .list-icon.table,.x-button-active .x-button-icon.table,.x-button-active .list-icon.table,.x-item-pressed .x-button-icon.table,.x-item-pressed .list-icon.table{background-position:-24px -528px}.x-button-icon.picture,.list-icon.picture{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -552px;background-size:72px 888px}.x-button-pressing .x-button-icon.picture,.x-button-pressing .list-icon.picture,.x-button-pressed .x-button-icon.picture,.x-button-pressed .list-icon.picture,.x-button-active .x-button-icon.picture,.x-button-active .list-icon.picture,.x-item-pressed .x-button-icon.picture,.x-item-pressed .list-icon.picture{background-position:-24px -552px}.x-button-icon.spacing,.list-icon.spacing{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -576px;background-size:72px 888px}.x-button-pressing .x-button-icon.spacing,.x-button-pressing .list-icon.spacing,.x-button-pressed .x-button-icon.spacing,.x-button-pressed .list-icon.spacing,.x-button-active .x-button-icon.spacing,.x-button-active .list-icon.spacing,.x-item-pressed .x-button-icon.spacing,.x-item-pressed .list-icon.spacing{background-position:-24px -576px}.x-button-icon.indent-inc,.list-icon.indent-inc{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -600px;background-size:72px 888px}.x-button-pressing .x-button-icon.indent-inc,.x-button-pressing .list-icon.indent-inc,.x-button-pressed .x-button-icon.indent-inc,.x-button-pressed .list-icon.indent-inc,.x-button-active .x-button-icon.indent-inc,.x-button-active .list-icon.indent-inc,.x-item-pressed .x-button-icon.indent-inc,.x-item-pressed .list-icon.indent-inc{background-position:-24px -600px}.x-button-icon.indent-dec,.list-icon.indent-dec{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -624px;background-size:72px 888px}.x-button-pressing .x-button-icon.indent-dec,.x-button-pressing .list-icon.indent-dec,.x-button-pressed .x-button-icon.indent-dec,.x-button-pressed .list-icon.indent-dec,.x-button-active .x-button-icon.indent-dec,.x-button-active .list-icon.indent-dec,.x-item-pressed .x-button-icon.indent-dec,.x-item-pressed .list-icon.indent-dec{background-position:-24px -624px}.x-button-icon.numbering,.list-icon.numbering{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -648px;background-size:72px 888px}.x-button-pressing .x-button-icon.numbering,.x-button-pressing .list-icon.numbering,.x-button-pressed .x-button-icon.numbering,.x-button-pressed .list-icon.numbering,.x-button-active .x-button-icon.numbering,.x-button-active .list-icon.numbering,.x-item-pressed .x-button-icon.numbering,.x-item-pressed .list-icon.numbering{background-position:-24px -648px}.x-button-icon.outline,.list-icon.outline{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -672px;background-size:72px 888px}.x-button-pressing .x-button-icon.outline,.x-button-pressing .list-icon.outline,.x-button-pressed .x-button-icon.outline,.x-button-pressed .list-icon.outline,.x-button-active .x-button-icon.outline,.x-button-active .list-icon.outline,.x-item-pressed .x-button-icon.outline,.x-item-pressed .list-icon.outline{background-position:-24px -672px}.x-button-icon.insert-row,.list-icon.insert-row{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -696px;background-size:72px 888px}.x-button-pressing .x-button-icon.insert-row,.x-button-pressing .list-icon.insert-row,.x-button-pressed .x-button-icon.insert-row,.x-button-pressed .list-icon.insert-row,.x-button-active .x-button-icon.insert-row,.x-button-active .list-icon.insert-row,.x-item-pressed .x-button-icon.insert-row,.x-item-pressed .list-icon.insert-row{background-position:-24px -696px}.x-button-icon.insert-column,.list-icon.insert-column{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -720px;background-size:72px 888px}.x-button-pressing .x-button-icon.insert-column,.x-button-pressing .list-icon.insert-column,.x-button-pressed .x-button-icon.insert-column,.x-button-pressed .list-icon.insert-column,.x-button-active .x-button-icon.insert-column,.x-button-active .list-icon.insert-column,.x-item-pressed .x-button-icon.insert-column,.x-item-pressed .list-icon.insert-column{background-position:-24px -720px}.x-button-icon.highlightcolor,.list-icon.highlightcolor{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -744px;background-size:72px 888px}.x-button-pressing .x-button-icon.highlightcolor,.x-button-pressing .list-icon.highlightcolor,.x-button-pressed .x-button-icon.highlightcolor,.x-button-pressed .list-icon.highlightcolor,.x-button-active .x-button-icon.highlightcolor,.x-button-active .list-icon.highlightcolor,.x-item-pressed .x-button-icon.highlightcolor,.x-item-pressed .list-icon.highlightcolor{background-position:-24px -744px}.x-button-icon.textcolor,.list-icon.textcolor{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -768px;background-size:72px 888px}.x-button-pressing .x-button-icon.textcolor,.x-button-pressing .list-icon.textcolor,.x-button-pressed .x-button-icon.textcolor,.x-button-pressed .list-icon.textcolor,.x-button-active .x-button-icon.textcolor,.x-button-active .list-icon.textcolor,.x-item-pressed .x-button-icon.textcolor,.x-item-pressed .list-icon.textcolor{background-position:-24px -768px}.x-button-icon.textbigger,.list-icon.textbigger{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -792px;background-size:72px 888px}.x-button-pressing .x-button-icon.textbigger,.x-button-pressing .list-icon.textbigger,.x-button-pressed .x-button-icon.textbigger,.x-button-pressed .list-icon.textbigger,.x-button-active .x-button-icon.textbigger,.x-button-active .list-icon.textbigger,.x-item-pressed .x-button-icon.textbigger,.x-item-pressed .list-icon.textbigger{background-position:-24px -792px}.x-button-icon.textless,.list-icon.textless{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -816px;background-size:72px 888px}.x-button-pressing .x-button-icon.textless,.x-button-pressing .list-icon.textless,.x-button-pressed .x-button-icon.textless,.x-button-pressed .list-icon.textless,.x-button-active .x-button-icon.textless,.x-button-active .list-icon.textless,.x-item-pressed .x-button-icon.textless,.x-item-pressed .list-icon.textless{background-position:-24px -816px}.x-button-icon.spinner-prev,.list-icon.spinner-prev{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -840px;background-size:72px 888px}.x-button-pressing .x-button-icon.spinner-prev,.x-button-pressing .list-icon.spinner-prev,.x-button-pressed .x-button-icon.spinner-prev,.x-button-pressed .list-icon.spinner-prev,.x-button-active .x-button-icon.spinner-prev,.x-button-active .list-icon.spinner-prev,.x-item-pressed .x-button-icon.spinner-prev,.x-item-pressed .list-icon.spinner-prev{background-position:-24px -840px}.x-button-icon.spinner-next,.list-icon.spinner-next{background-image:url("../img/icons/icons-retina.png");background-color:transparent;background-position:0 -864px;background-size:72px 888px}.x-button-pressing .x-button-icon.spinner-next,.x-button-pressing .list-icon.spinner-next,.x-button-pressed .x-button-icon.spinner-next,.x-button-pressed .list-icon.spinner-next,.x-button-active .x-button-icon.spinner-next,.x-button-active .list-icon.spinner-next,.x-item-pressed .x-button-icon.spinner-next,.x-item-pressed .list-icon.spinner-next{background-position:-24px -864px}.x-button.x-button-base{padding:.3em 8px}.x-button.x-button-base,.x-toolbar .x-button.x-button-base{border:1px solid #939393;border-top-color:#a5a5a5;min-height:29px;padding-top:0;padding-bottom:0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:rgba(255,255,255,0.35) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.35) 0 1px 0;box-shadow:rgba(255,255,255,0.35) 0 1px 0;color:#000}.x-button.x-button-base .x-button-icon,.x-toolbar .x-button.x-button-base .x-button-icon{width:24px;height:24px}.x-button.x-button-base.x-button-forward:before,.x-button.x-button-base.x-button-forward:after,.x-button.x-button-base.x-button-back:before,.x-button.x-button-base.x-button-back:after,.x-toolbar .x-button.x-button-base.x-button-forward:before,.x-toolbar .x-button.x-button-base.x-button-forward:after,.x-toolbar .x-button.x-button-base.x-button-back:before,.x-toolbar .x-button.x-button-base.x-button-back:after{-webkit-mask-size:.80717em 1.75em}.x-button.x-button-base .x-button-label,.x-button.x-button-base .x-badge,.x-toolbar .x-button.x-button-base .x-button-label,.x-toolbar .x-button.x-button-base .x-badge{color:#323232;text-shadow:#fff 0 0.09em 0}.x-button.x-button-base.x-button-back:before,.x-button.x-button-base.x-button-forward:before,.x-toolbar .x-button.x-button-base.x-button-back:before,.x-toolbar .x-button.x-button-base.x-button-forward:before{background:#989898}.x-button.x-button-base,.x-button.x-button-base.x-button-back:after,.x-button.x-button-base.x-button-forward:after,.x-toolbar .x-button.x-button-base,.x-toolbar .x-button.x-button-base.x-button-back:after,.x-toolbar .x-button.x-button-base.x-button-forward:after{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-moz-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-o-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-ms-linear-gradient(to bottom, #ffffff,#ececec 3%,#cbcbcb)}.x-button.x-button-base.x-button-pressing,.x-button.x-button-base.x-button-pressing:after,.x-button.x-button-base.x-button-pressed,.x-button.x-button-base.x-button-pressed:after,.x-button.x-button-base.x-button-active,.x-button.x-button-base.x-button-active:after,.x-toolbar .x-button.x-button-base.x-button-pressing,.x-toolbar .x-button.x-button-base.x-button-pressing:after,.x-toolbar .x-button.x-button-base.x-button-pressed,.x-toolbar .x-button.x-button-base.x-button-pressed:after,.x-toolbar .x-button.x-button-base.x-button-active,.x-toolbar .x-button.x-button-base.x-button-active:after{background-image:none;background-color:#656565;background-image:-webkit-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-moz-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-o-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-ms-linear-gradient(to bottom, #4c4c4c,#585858 10%,#656565 65%,#666666)}.x-button.x-button-base.x-button-pressing .x-button-label,.x-button.x-button-base.x-button-pressing .x-badge,.x-button.x-button-base.x-button-pressed .x-button-label,.x-button.x-button-base.x-button-pressed .x-badge,.x-button.x-button-base.x-button-active .x-button-label,.x-button.x-button-base.x-button-active .x-badge,.x-toolbar .x-button.x-button-base.x-button-pressing .x-button-label,.x-toolbar .x-button.x-button-base.x-button-pressing .x-badge,.x-toolbar .x-button.x-button-base.x-button-pressed .x-button-label,.x-toolbar .x-button.x-button-base.x-button-pressed .x-badge,.x-toolbar .x-button.x-button-base.x-button-active .x-button-label,.x-toolbar .x-button.x-button-base.x-button-active .x-badge{color:#fff;text-shadow:#4c4c4c 0 0.09em 0}.x-segmentedbutton-base:not(.divided){margin:0 .2em}.x-segmentedbutton-base:not(.divided) .x-button-base{margin:0;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.x-segmentedbutton-base:not(.divided) .x-button-base:not(.x-first){border-left:0 !important}.x-segmentedbutton-base.divided .x-button-base:not(.x-first){border-left:1px solid #939393}.x-segmentedbutton-base.divided .x-button-base:not(.x-last){margin-right:7px}.x-segmentedbutton-base .x-button-base.x-first{-moz-border-radius-topleft:2px !important;-webkit-border-top-left-radius:2px !important;border-top-left-radius:2px !important;-moz-border-radius-bottomleft:2px !important;-webkit-border-bottom-left-radius:2px !important;border-bottom-left-radius:2px !important}.x-segmentedbutton-base .x-button-base.x-last{-moz-border-radius-topright:2px !important;-webkit-border-top-right-radius:2px !important;border-top-right-radius:2px !important;-moz-border-radius-bottomright:2px !important;-webkit-border-bottom-right-radius:2px !important;border-bottom-right-radius:2px !important}.x-button.x-button-light{padding:.3em 8px}.x-button.x-button-light,.x-toolbar .x-button.x-button-light{border:1px solid #c7c7c7;border-top-color:#d9d9d9;min-height:29px;padding-top:0;padding-bottom:0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:rgba(255,255,255,0.35) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.35) 0 1px 0;box-shadow:rgba(255,255,255,0.35) 0 1px 0;color:#262626}.x-button.x-button-light .x-button-icon,.x-toolbar .x-button.x-button-light .x-button-icon{width:24px;height:24px}.x-button.x-button-light.x-button-forward:before,.x-button.x-button-light.x-button-forward:after,.x-button.x-button-light.x-button-back:before,.x-button.x-button-light.x-button-back:after,.x-toolbar .x-button.x-button-light.x-button-forward:before,.x-toolbar .x-button.x-button-light.x-button-forward:after,.x-toolbar .x-button.x-button-light.x-button-back:before,.x-toolbar .x-button.x-button-light.x-button-back:after{-webkit-mask-size:.80717em 1.75em}.x-button.x-button-light .x-button-label,.x-button.x-button-light .x-badge,.x-toolbar .x-button.x-button-light .x-button-label,.x-toolbar .x-button.x-button-light .x-badge{color:#666;text-shadow:#fff 0 0.09em 0}.x-button.x-button-light.x-button-back:before,.x-button.x-button-light.x-button-forward:before,.x-toolbar .x-button.x-button-light.x-button-back:before,.x-toolbar .x-button.x-button-light.x-button-forward:before{background:#ccc}.x-button.x-button-light,.x-button.x-button-light.x-button-back:after,.x-button.x-button-light.x-button-forward:after,.x-toolbar .x-button.x-button-light,.x-toolbar .x-button.x-button-light.x-button-back:after,.x-toolbar .x-button.x-button-light.x-button-forward:after{background-image:none;background-color:#fff;background-image:-webkit-linear-gradient(top, #ffffff,#ffffff 3%,#ffffff);background-image:-moz-linear-gradient(top, #ffffff,#ffffff 3%,#ffffff);background-image:-o-linear-gradient(top, #ffffff,#ffffff 3%,#ffffff);background-image:-ms-linear-gradient(to bottom, #ffffff,#ffffff 3%,#ffffff)}.x-button.x-button-light.x-button-pressing,.x-button.x-button-light.x-button-pressing:after,.x-button.x-button-light.x-button-pressed,.x-button.x-button-light.x-button-pressed:after,.x-button.x-button-light.x-button-active,.x-button.x-button-light.x-button-active:after,.x-toolbar .x-button.x-button-light.x-button-pressing,.x-toolbar .x-button.x-button-light.x-button-pressing:after,.x-toolbar .x-button.x-button-light.x-button-pressed,.x-toolbar .x-button.x-button-light.x-button-pressed:after,.x-toolbar .x-button.x-button-light.x-button-active,.x-toolbar .x-button.x-button-light.x-button-active:after{background-image:none;background-color:#999;background-image:-webkit-linear-gradient(top, #808080,#8c8c8c 10%,#999999 65%,#9a9a9a);background-image:-moz-linear-gradient(top, #808080,#8c8c8c 10%,#999999 65%,#9a9a9a);background-image:-o-linear-gradient(top, #808080,#8c8c8c 10%,#999999 65%,#9a9a9a);background-image:-ms-linear-gradient(to bottom, #808080,#8c8c8c 10%,#999999 65%,#9a9a9a)}.x-button.x-button-light.x-button-pressing .x-button-label,.x-button.x-button-light.x-button-pressing .x-badge,.x-button.x-button-light.x-button-pressed .x-button-label,.x-button.x-button-light.x-button-pressed .x-badge,.x-button.x-button-light.x-button-active .x-button-label,.x-button.x-button-light.x-button-active .x-badge,.x-toolbar .x-button.x-button-light.x-button-pressing .x-button-label,.x-toolbar .x-button.x-button-light.x-button-pressing .x-badge,.x-toolbar .x-button.x-button-light.x-button-pressed .x-button-label,.x-toolbar .x-button.x-button-light.x-button-pressed .x-badge,.x-toolbar .x-button.x-button-light.x-button-active .x-button-label,.x-toolbar .x-button.x-button-light.x-button-active .x-badge{color:#fff;text-shadow:gray 0 0.09em 0}.x-segmentedbutton-base:not(.divided){margin:0 .2em}.x-segmentedbutton-base:not(.divided) .x-button-light{margin:0;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.x-segmentedbutton-base:not(.divided) .x-button-light:not(.x-first){border-left:0 !important}.x-segmentedbutton-base.divided .x-button-light:not(.x-first){border-left:1px solid #c7c7c7}.x-segmentedbutton-base.divided .x-button-light:not(.x-last){margin-right:7px}.x-segmentedbutton-base .x-button-light.x-first{-moz-border-radius-topleft:2px !important;-webkit-border-top-left-radius:2px !important;border-top-left-radius:2px !important;-moz-border-radius-bottomleft:2px !important;-webkit-border-bottom-left-radius:2px !important;border-bottom-left-radius:2px !important}.x-segmentedbutton-base .x-button-light.x-last{-moz-border-radius-topright:2px !important;-webkit-border-top-right-radius:2px !important;border-top-right-radius:2px !important;-moz-border-radius-bottomright:2px !important;-webkit-border-bottom-right-radius:2px !important;border-bottom-right-radius:2px !important}.x-button.x-button-base-blue{padding:.3em 8px}.x-button.x-button-base-blue,.x-toolbar .x-button.x-button-base-blue{border:1px solid #2e519b;border-top-color:#3760b7;min-height:29px;padding-top:0;padding-bottom:0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:rgba(255,255,255,0.35) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.35) 0 1px 0;box-shadow:rgba(255,255,255,0.35) 0 1px 0;color:#fff}.x-button.x-button-base-blue .x-button-icon,.x-toolbar .x-button.x-button-base-blue .x-button-icon{width:24px;height:24px}.x-button.x-button-base-blue.x-button-forward:before,.x-button.x-button-base-blue.x-button-forward:after,.x-button.x-button-base-blue.x-button-back:before,.x-button.x-button-base-blue.x-button-back:after,.x-toolbar .x-button.x-button-base-blue.x-button-forward:before,.x-toolbar .x-button.x-button-base-blue.x-button-forward:after,.x-toolbar .x-button.x-button-base-blue.x-button-back:before,.x-toolbar .x-button.x-button-base-blue.x-button-back:after{-webkit-mask-size:.80717em 1.75em}.x-button.x-button-base-blue .x-button-label,.x-button.x-button-base-blue .x-badge,.x-toolbar .x-button.x-button-base-blue .x-button-label,.x-toolbar .x-button.x-button-base-blue .x-badge{color:#fff;text-shadow:#2e519b 0 -0.09em 0}.x-button.x-button-base-blue.x-button-back:before,.x-button.x-button-base-blue.x-button-forward:before,.x-toolbar .x-button.x-button-base-blue.x-button-back:before,.x-toolbar .x-button.x-button-base-blue.x-button-forward:before{background:#3155a3}.x-button.x-button-base-blue,.x-button.x-button-base-blue.x-button-back:after,.x-button.x-button-base-blue.x-button-forward:after,.x-toolbar .x-button.x-button-base-blue,.x-toolbar .x-button.x-button-base-blue.x-button-back:after,.x-toolbar .x-button.x-button-base-blue.x-button-forward:after{background-image:none;background-color:#688AD2;background-image:-webkit-linear-gradient(top, #ffffff,#9bb2e1 3%,#688ad2);background-image:-moz-linear-gradient(top, #ffffff,#9bb2e1 3%,#688ad2);background-image:-o-linear-gradient(top, #ffffff,#9bb2e1 3%,#688ad2);background-image:-ms-linear-gradient(to bottom, #ffffff,#9bb2e1 3%,#688ad2)}.x-button.x-button-base-blue.x-button-pressing,.x-button.x-button-base-blue.x-button-pressing:after,.x-button.x-button-base-blue.x-button-pressed,.x-button.x-button-base-blue.x-button-pressed:after,.x-button.x-button-base-blue.x-button-active,.x-button.x-button-base-blue.x-button-active:after,.x-toolbar .x-button.x-button-base-blue.x-button-pressing,.x-toolbar .x-button.x-button-base-blue.x-button-pressing:after,.x-toolbar .x-button.x-button-base-blue.x-button-pressed,.x-toolbar .x-button.x-button-base-blue.x-button-pressed:after,.x-toolbar .x-button.x-button-base-blue.x-button-active,.x-toolbar .x-button.x-button-base-blue.x-button-active:after{background-image:none;background-color:#416cc6;background-image:-webkit-linear-gradient(top, #3155a3,#3760b7 10%,#416cc6 65%,#436dc7);background-image:-moz-linear-gradient(top, #3155a3,#3760b7 10%,#416cc6 65%,#436dc7);background-image:-o-linear-gradient(top, #3155a3,#3760b7 10%,#416cc6 65%,#436dc7);background-image:-ms-linear-gradient(to bottom, #3155a3,#3760b7 10%,#416cc6 65%,#436dc7)}.x-button.x-button-base-blue.x-button-pressing .x-button-label,.x-button.x-button-base-blue.x-button-pressing .x-badge,.x-button.x-button-base-blue.x-button-pressed .x-button-label,.x-button.x-button-base-blue.x-button-pressed .x-badge,.x-button.x-button-base-blue.x-button-active .x-button-label,.x-button.x-button-base-blue.x-button-active .x-badge,.x-toolbar .x-button.x-button-base-blue.x-button-pressing .x-button-label,.x-toolbar .x-button.x-button-base-blue.x-button-pressing .x-badge,.x-toolbar .x-button.x-button-base-blue.x-button-pressed .x-button-label,.x-toolbar .x-button.x-button-base-blue.x-button-pressed .x-badge,.x-toolbar .x-button.x-button-base-blue.x-button-active .x-button-label,.x-toolbar .x-button.x-button-base-blue.x-button-active .x-badge{text-shadow:#2e519b 0 0.09em 0}.x-segmentedbutton-base:not(.divided){margin:0 .2em}.x-segmentedbutton-base:not(.divided) .x-button-base-blue{margin:0;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.x-segmentedbutton-base:not(.divided) .x-button-base-blue:not(.x-first){border-left:0 !important}.x-segmentedbutton-base.divided .x-button-base-blue:not(.x-first){border-left:1px solid #2e519b}.x-segmentedbutton-base.divided .x-button-base-blue:not(.x-last){margin-right:7px}.x-segmentedbutton-base .x-button-base-blue.x-first{-moz-border-radius-topleft:2px !important;-webkit-border-top-left-radius:2px !important;border-top-left-radius:2px !important;-moz-border-radius-bottomleft:2px !important;-webkit-border-bottom-left-radius:2px !important;border-bottom-left-radius:2px !important}.x-segmentedbutton-base .x-button-base-blue.x-last{-moz-border-radius-topright:2px !important;-webkit-border-top-right-radius:2px !important;border-top-right-radius:2px !important;-moz-border-radius-bottomright:2px !important;-webkit-border-bottom-right-radius:2px !important;border-bottom-right-radius:2px !important}.x-button.x-button-back{padding:.3em 8px}.x-button.x-button-back,.x-toolbar .x-button.x-button-back{border:1px solid #939393;border-top-color:#a5a5a5;min-height:29px;padding-top:0;padding-bottom:0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:rgba(255,255,255,0.35) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.35) 0 1px 0;box-shadow:rgba(255,255,255,0.35) 0 1px 0;color:#000}.x-button.x-button-back .x-button-icon,.x-toolbar .x-button.x-button-back .x-button-icon{width:24px;height:24px}.x-button.x-button-back.x-button-forward:before,.x-button.x-button-back.x-button-forward:after,.x-button.x-button-back.x-button-back:before,.x-button.x-button-back.x-button-back:after,.x-toolbar .x-button.x-button-back.x-button-forward:before,.x-toolbar .x-button.x-button-back.x-button-forward:after,.x-toolbar .x-button.x-button-back.x-button-back:before,.x-toolbar .x-button.x-button-back.x-button-back:after{-webkit-mask-size:.80717em 1.75em}.x-button.x-button-back .x-button-label,.x-button.x-button-back .x-badge,.x-toolbar .x-button.x-button-back .x-button-label,.x-toolbar .x-button.x-button-back .x-badge{color:#323232;text-shadow:#fff 0 0.09em 0}.x-button.x-button-back.x-button-back:before,.x-button.x-button-back.x-button-forward:before,.x-toolbar .x-button.x-button-back.x-button-back:before,.x-toolbar .x-button.x-button-back.x-button-forward:before{background:#989898}.x-button.x-button-back,.x-button.x-button-back.x-button-back:after,.x-button.x-button-back.x-button-forward:after,.x-toolbar .x-button.x-button-back,.x-toolbar .x-button.x-button-back.x-button-back:after,.x-toolbar .x-button.x-button-back.x-button-forward:after{background-image:none;background-color:#cbcbcb;background-image:-webkit-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-moz-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-o-linear-gradient(top, #ffffff,#ececec 3%,#cbcbcb);background-image:-ms-linear-gradient(to bottom, #ffffff,#ececec 3%,#cbcbcb)}.x-button.x-button-back.x-button-pressing,.x-button.x-button-back.x-button-pressing:after,.x-button.x-button-back.x-button-pressed,.x-button.x-button-back.x-button-pressed:after,.x-button.x-button-back.x-button-active,.x-button.x-button-back.x-button-active:after,.x-toolbar .x-button.x-button-back.x-button-pressing,.x-toolbar .x-button.x-button-back.x-button-pressing:after,.x-toolbar .x-button.x-button-back.x-button-pressed,.x-toolbar .x-button.x-button-back.x-button-pressed:after,.x-toolbar .x-button.x-button-back.x-button-active,.x-toolbar .x-button.x-button-back.x-button-active:after{background-image:none;background-color:#656565;background-image:-webkit-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-moz-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-o-linear-gradient(top, #4c4c4c,#585858 10%,#656565 65%,#666666);background-image:-ms-linear-gradient(to bottom, #4c4c4c,#585858 10%,#656565 65%,#666666)}.x-button.x-button-back.x-button-pressing .x-button-label,.x-button.x-button-back.x-button-pressing .x-badge,.x-button.x-button-back.x-button-pressed .x-button-label,.x-button.x-button-back.x-button-pressed .x-badge,.x-button.x-button-back.x-button-active .x-button-label,.x-button.x-button-back.x-button-active .x-badge,.x-toolbar .x-button.x-button-back.x-button-pressing .x-button-label,.x-toolbar .x-button.x-button-back.x-button-pressing .x-badge,.x-toolbar .x-button.x-button-back.x-button-pressed .x-button-label,.x-toolbar .x-button.x-button-back.x-button-pressed .x-badge,.x-toolbar .x-button.x-button-back.x-button-active .x-button-label,.x-toolbar .x-button.x-button-back.x-button-active .x-badge{color:#fff;text-shadow:#4c4c4c 0 0.09em 0}.x-button.x-button-back,.x-toolbar .x-button.x-button-back{-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}.x-segmentedbutton-base:not(.divided){margin:0 .2em}.x-segmentedbutton-base:not(.divided) .x-button-back{margin:0;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.x-segmentedbutton-base:not(.divided) .x-button-back:not(.x-first){border-left:0 !important}.x-segmentedbutton-base.divided .x-button-back:not(.x-first){border-left:1px solid #939393}.x-segmentedbutton-base.divided .x-button-back:not(.x-last){margin-right:7px}.x-segmentedbutton-base .x-button-back.x-first{-moz-border-radius-topleft:2px !important;-webkit-border-top-left-radius:2px !important;border-top-left-radius:2px !important;-moz-border-radius-bottomleft:2px !important;-webkit-border-bottom-left-radius:2px !important;border-bottom-left-radius:2px !important}.x-segmentedbutton-base .x-button-back.x-last{-moz-border-radius-topright:2px !important;-webkit-border-top-right-radius:2px !important;border-top-right-radius:2px !important;-moz-border-radius-bottomright:2px !important;-webkit-border-bottom-right-radius:2px !important;border-bottom-right-radius:2px !important}.unsuported-view{position:absolute;left:0;top:0;right:0;bottom:0;background:url(../img/ios-only.png) no-repeat center #efefef;background-attachment:fixed;z-index:90000}.x-button.text-offset-12{padding-left:12px;padding-right:12px}.x-button.text-offset-30{padding-left:30px;padding-right:30px} diff --git a/vendor/touch/license.txt b/vendor/touch/license.txt index 66aed1463..2eed6cd4b 100644 --- a/vendor/touch/license.txt +++ b/vendor/touch/license.txt @@ -1,4 +1,4 @@ -Sencha Touch - JavaScript Library +Sencha Touch & Sencha Touch Charts - JavaScript Libraries Copyright (c) 2010-2015, Sencha, Inc. All rights reserved. licensing@sencha.com @@ -6,23 +6,43 @@ licensing@sencha.com http://www.sencha.com/products/touch/license.php -Commercial License +Open Source License ------------------------------------------------------------------------------------------ -This version of Sencha Touch is licensed commercially. +This version of Sencha Touch and Sencha Touch Charts is licensed under the terms of the Open +Source GPL 3.0 license. + +http://www.gnu.org/licenses/gpl.html + +There are several FLOSS exceptions available for use with this release for +open source applications that are distributed under a license other than the GPL. + +* Open Source License Exception for Applications + + http://www.sencha.com/products/floss-exception.php + +* Open Source License Exception for Development + + http://www.sencha.com/products/ux-exception.php + + +Alternate Licensing for Sencha Touch +------------------------------------------------------------------------------------------ +Commercial and OEM Licenses are available for an alternate download of Sencha Touch. This is the appropriate option if you are creating proprietary applications and you are not prepared to distribute and share the source code of your application under the GPL v3 license. Please visit http://www.sencha.com/store/touch/license.php for more details. -OEM / Reseller License +Alternate Licensing for Sencha Touch Charts ------------------------------------------------------------------------------------------ -For more details, please visit: http://www.sencha.com/products/touch/license.php +Commercial and OEM Licenses are available for an alternate download of Sencha Touch Charts. +This is the appropriate option if you are creating proprietary applications and you are +not prepared to distribute and share the source code of your application under the +GPL v3 license. - -Open Source Licensing ------------------------------------------------------------------------------------------- -Open Source Licensing is available for an alternate download of Sencha Touch. -For more details, please visit http://www.sencha.com/store/touch/license.php for more details. +Sencha Touch Charts is available commercially only as a part of Sencha Complete or Sencha +Complete Team. Please visit http://www.sencha.com/products/complete/license or +http://www.sencha.com/products/complete-team/license for more details. Third Party Content diff --git a/vendor/touch/resources/css/base.css b/vendor/touch/resources/css/base.css index 87225dfad..a5e4d8254 100644 --- a/vendor/touch/resources/css/base.css +++ b/vendor/touch/resources/css/base.css @@ -5,10 +5,13 @@ Copyright (c) 2011-2015 Sencha Inc Contact: http://www.sencha.com/contact -Commercial Usage -Licensees holding valid commercial licenses may use this file in accordance with the Commercial -Software License Agreement provided with the Software or, alternatively, in accordance with the -terms contained in a written agreement between you and Sencha. +GNU General Public License Usage +This file may be used under the terms of the GNU General Public License version 3.0 as +published by the Free Software Foundation and appearing in the file LICENSE included in the +packaging of this file. + +Please review the following information to ensure the GNU General Public License version 3.0 +requirements will be met: http://www.gnu.org/copyleft/gpl.html. If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact. diff --git a/vendor/touch/resources/css/bb10.css b/vendor/touch/resources/css/bb10.css index a839cb775..d12d75ce2 100644 --- a/vendor/touch/resources/css/bb10.css +++ b/vendor/touch/resources/css/bb10.css @@ -5,10 +5,13 @@ Copyright (c) 2011-2015 Sencha Inc Contact: http://www.sencha.com/contact -Commercial Usage -Licensees holding valid commercial licenses may use this file in accordance with the Commercial -Software License Agreement provided with the Software or, alternatively, in accordance with the -terms contained in a written agreement between you and Sencha. +GNU General Public License Usage +This file may be used under the terms of the GNU General Public License version 3.0 as +published by the Free Software Foundation and appearing in the file LICENSE included in the +packaging of this file. + +Please review the following information to ensure the GNU General Public License version 3.0 +requirements will be met: http://www.gnu.org/copyleft/gpl.html. If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact. diff --git a/vendor/touch/resources/css/bb103.css b/vendor/touch/resources/css/bb103.css index 46e976762..91beda130 100644 --- a/vendor/touch/resources/css/bb103.css +++ b/vendor/touch/resources/css/bb103.css @@ -5,10 +5,13 @@ Copyright (c) 2011-2015 Sencha Inc Contact: http://www.sencha.com/contact -Commercial Usage -Licensees holding valid commercial licenses may use this file in accordance with the Commercial -Software License Agreement provided with the Software or, alternatively, in accordance with the -terms contained in a written agreement between you and Sencha. +GNU General Public License Usage +This file may be used under the terms of the GNU General Public License version 3.0 as +published by the Free Software Foundation and appearing in the file LICENSE included in the +packaging of this file. + +Please review the following information to ensure the GNU General Public License version 3.0 +requirements will be met: http://www.gnu.org/copyleft/gpl.html. If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact. diff --git a/vendor/touch/resources/css/cupertino-classic.css b/vendor/touch/resources/css/cupertino-classic.css index ba3ea953d..3bcec6e8a 100644 --- a/vendor/touch/resources/css/cupertino-classic.css +++ b/vendor/touch/resources/css/cupertino-classic.css @@ -5,10 +5,13 @@ Copyright (c) 2011-2015 Sencha Inc Contact: http://www.sencha.com/contact -Commercial Usage -Licensees holding valid commercial licenses may use this file in accordance with the Commercial -Software License Agreement provided with the Software or, alternatively, in accordance with the -terms contained in a written agreement between you and Sencha. +GNU General Public License Usage +This file may be used under the terms of the GNU General Public License version 3.0 as +published by the Free Software Foundation and appearing in the file LICENSE included in the +packaging of this file. + +Please review the following information to ensure the GNU General Public License version 3.0 +requirements will be met: http://www.gnu.org/copyleft/gpl.html. If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact. diff --git a/vendor/touch/resources/css/cupertino.css b/vendor/touch/resources/css/cupertino.css index 0d1489a6f..7a090c08d 100644 --- a/vendor/touch/resources/css/cupertino.css +++ b/vendor/touch/resources/css/cupertino.css @@ -5,10 +5,13 @@ Copyright (c) 2011-2015 Sencha Inc Contact: http://www.sencha.com/contact -Commercial Usage -Licensees holding valid commercial licenses may use this file in accordance with the Commercial -Software License Agreement provided with the Software or, alternatively, in accordance with the -terms contained in a written agreement between you and Sencha. +GNU General Public License Usage +This file may be used under the terms of the GNU General Public License version 3.0 as +published by the Free Software Foundation and appearing in the file LICENSE included in the +packaging of this file. + +Please review the following information to ensure the GNU General Public License version 3.0 +requirements will be met: http://www.gnu.org/copyleft/gpl.html. If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact. diff --git a/vendor/touch/resources/css/mountainview.css b/vendor/touch/resources/css/mountainview.css index ff412410a..d326f0901 100644 --- a/vendor/touch/resources/css/mountainview.css +++ b/vendor/touch/resources/css/mountainview.css @@ -5,10 +5,13 @@ Copyright (c) 2011-2015 Sencha Inc Contact: http://www.sencha.com/contact -Commercial Usage -Licensees holding valid commercial licenses may use this file in accordance with the Commercial -Software License Agreement provided with the Software or, alternatively, in accordance with the -terms contained in a written agreement between you and Sencha. +GNU General Public License Usage +This file may be used under the terms of the GNU General Public License version 3.0 as +published by the Free Software Foundation and appearing in the file LICENSE included in the +packaging of this file. + +Please review the following information to ensure the GNU General Public License version 3.0 +requirements will be met: http://www.gnu.org/copyleft/gpl.html. If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact. diff --git a/vendor/touch/resources/css/sencha-touch.css b/vendor/touch/resources/css/sencha-touch.css index 518e45547..48055db05 100644 --- a/vendor/touch/resources/css/sencha-touch.css +++ b/vendor/touch/resources/css/sencha-touch.css @@ -5,10 +5,13 @@ Copyright (c) 2011-2015 Sencha Inc Contact: http://www.sencha.com/contact -Commercial Usage -Licensees holding valid commercial licenses may use this file in accordance with the Commercial -Software License Agreement provided with the Software or, alternatively, in accordance with the -terms contained in a written agreement between you and Sencha. +GNU General Public License Usage +This file may be used under the terms of the GNU General Public License version 3.0 as +published by the Free Software Foundation and appearing in the file LICENSE included in the +packaging of this file. + +Please review the following information to ensure the GNU General Public License version 3.0 +requirements will be met: http://www.gnu.org/copyleft/gpl.html. If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact. diff --git a/vendor/touch/resources/css/tizen.css b/vendor/touch/resources/css/tizen.css index f7083787f..c90503485 100644 --- a/vendor/touch/resources/css/tizen.css +++ b/vendor/touch/resources/css/tizen.css @@ -5,10 +5,13 @@ Copyright (c) 2011-2015 Sencha Inc Contact: http://www.sencha.com/contact -Commercial Usage -Licensees holding valid commercial licenses may use this file in accordance with the Commercial -Software License Agreement provided with the Software or, alternatively, in accordance with the -terms contained in a written agreement between you and Sencha. +GNU General Public License Usage +This file may be used under the terms of the GNU General Public License version 3.0 as +published by the Free Software Foundation and appearing in the file LICENSE included in the +packaging of this file. + +Please review the following information to ensure the GNU General Public License version 3.0 +requirements will be met: http://www.gnu.org/copyleft/gpl.html. If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact. diff --git a/vendor/touch/resources/css/wp.css b/vendor/touch/resources/css/wp.css index 367360307..1705c8689 100644 --- a/vendor/touch/resources/css/wp.css +++ b/vendor/touch/resources/css/wp.css @@ -5,10 +5,13 @@ Copyright (c) 2011-2015 Sencha Inc Contact: http://www.sencha.com/contact -Commercial Usage -Licensees holding valid commercial licenses may use this file in accordance with the Commercial -Software License Agreement provided with the Software or, alternatively, in accordance with the -terms contained in a written agreement between you and Sencha. +GNU General Public License Usage +This file may be used under the terms of the GNU General Public License version 3.0 as +published by the Free Software Foundation and appearing in the file LICENSE included in the +packaging of this file. + +Please review the following information to ensure the GNU General Public License version 3.0 +requirements will be met: http://www.gnu.org/copyleft/gpl.html. If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact. diff --git a/vendor/touch/sencha-touch-all-debug.js b/vendor/touch/sencha-touch-all-debug.js index e9d75a916..ec180d325 100644 --- a/vendor/touch/sencha-touch-all-debug.js +++ b/vendor/touch/sencha-touch-all-debug.js @@ -5,10 +5,13 @@ Copyright (c) 2011-2015 Sencha Inc Contact: http://www.sencha.com/contact -Commercial Usage -Licensees holding valid commercial licenses may use this file in accordance with the Commercial -Software License Agreement provided with the Software or, alternatively, in accordance with the -terms contained in a written agreement between you and Sencha. +GNU General Public License Usage +This file may be used under the terms of the GNU General Public License version 3.0 as +published by the Free Software Foundation and appearing in the file LICENSE included in the +packaging of this file. + +Please review the following information to ensure the GNU General Public License version 3.0 +requirements will be met: http://www.gnu.org/copyleft/gpl.html. If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact. @@ -9290,6 +9293,11 @@ Ext.apply(Ext, { elementSize: { xclass: 'Ext.event.publisher.ElementSize' } + // + ,seriesItemEvents: { + xclass: 'Ext.chart.series.ItemPublisher' + } + // }, // @@ -48659,6 +48667,13877 @@ Ext.define('Ext.carousel.Infinite', { } }); +(function () { + if (!Ext.global.Float32Array) { + // Typed Array polyfill + var Float32Array = function (array) { + if (typeof array === 'number') { + this.length = array; + } else if ('length' in array) { + this.length = array.length; + for (var i = 0, len = array.length; i < len; i++) { + this[i] = +array[i]; + } + } + }; + + Float32Array.prototype = []; + Ext.global.Float32Array = Float32Array; + } +})(); + +/** + * Utility class providing mathematics functionalities through all the draw package. + */ +Ext.define('Ext.draw.Draw', { + singleton: true, + + radian: Math.PI / 180, + pi2: Math.PI * 2, + + /** + * Function that returns its first element. + * @param {Mixed} a + * @return {Mixed} + */ + reflectFn: function (a) { + return a; + }, + + /** + * Converting degrees to radians. + * @param {Number} degrees + * @return {Number} + */ + rad: function (degrees) { + return degrees % 360 * Math.PI / 180; + }, + + /** + * Converting radians to degrees. + * @param {Number} radian + * @return {Number} + */ + degrees: function (radian) { + return radian * 180 / Math.PI % 360; + }, + + /** + * + * @param {Object} bbox1 + * @param {Object} bbox2 + * @param {Number} [padding] + * @return {Boolean} + */ + isBBoxIntersect: function (bbox1, bbox2, padding) { + padding = padding || 0; + return (Math.max(bbox1.x, bbox2.x) - padding > Math.min(bbox1.x + bbox1.width, bbox2.x + bbox2.width)) || + (Math.max(bbox1.y, bbox2.y) - padding > Math.min(bbox1.y + bbox1.height, bbox2.y + bbox2.height)); + }, + + /** + * Natural cubic spline interpolation. + * This algorithm runs in linear time. + * + * @param {Array} points Array of numbers. + */ + spline: function (points) { + var i, j, ln = points.length, + nd, d, y, ny, + r = 0, + zs = new Float32Array(points.length), + result = new Float32Array(points.length * 3 - 2); + + zs[0] = 0; + zs[ln - 1] = 0; + + for (i = 1; i < ln - 1; i++) { + zs[i] = (points[i + 1] + points[i - 1] - 2 * points[i]) - zs[i - 1]; + r = 1 / (4 - r); + zs[i] *= r; + } + + for (i = ln - 2; i > 0; i--) { + r = 3.732050807568877 + 48.248711305964385 / (-13.928203230275537 + Math.pow(0.07179676972449123, i)); + zs[i] -= zs[i + 1] * r; + } + + ny = points[0]; + nd = ny - zs[0]; + for (i = 0, j = 0; i < ln - 1; j += 3) { + y = ny; + d = nd; + i++; + ny = points[i]; + nd = ny - zs[i]; + result[j] = y; + result[j + 1] = (nd + 2 * d) / 3; + result[j + 2] = (nd * 2 + d) / 3; + } + result[j] = ny; + return result; + }, + + /** + * @private + * + * Calculates bezier curve control anchor points for a particular point in a path, with a + * smoothing curve applied. The smoothness of the curve is controlled by the 'value' parameter. + * Note that this algorithm assumes that the line being smoothed is normalized going from left + * to right; it makes special adjustments assuming this orientation. + * + * @param {Number} prevX X coordinate of the previous point in the path + * @param {Number} prevY Y coordinate of the previous point in the path + * @param {Number} curX X coordinate of the current point in the path + * @param {Number} curY Y coordinate of the current point in the path + * @param {Number} nextX X coordinate of the next point in the path + * @param {Number} nextY Y coordinate of the next point in the path + * @param {Number} value A value to control the smoothness of the curve; this is used to + * divide the distance between points, so a value of 2 corresponds to + * half the distance between points (a very smooth line) while higher values + * result in less smooth curves. Defaults to 4. + * @return {Object} Object containing x1, y1, x2, y2 bezier control anchor points; x1 and y1 + * are the control point for the curve toward the previous path point, and + * x2 and y2 are the control point for the curve toward the next path point. + */ + getAnchors: function (prevX, prevY, curX, curY, nextX, nextY, value) { + value = value || 4; + var PI = Math.PI, + halfPI = PI / 2, + abs = Math.abs, + sin = Math.sin, + cos = Math.cos, + atan = Math.atan, + control1Length, control2Length, control1Angle, control2Angle, + control1X, control1Y, control2X, control2Y, alpha; + + // Find the length of each control anchor line, by dividing the horizontal distance + // between points by the value parameter. + control1Length = (curX - prevX) / value; + control2Length = (nextX - curX) / value; + + // Determine the angle of each control anchor line. If the middle point is a vertical + // turnaround then we force it to a flat horizontal angle to prevent the curve from + // dipping above or below the middle point. Otherwise we use an angle that points + // toward the previous/next target point. + if ((curY >= prevY && curY >= nextY) || (curY <= prevY && curY <= nextY)) { + control1Angle = control2Angle = halfPI; + } else { + control1Angle = atan((curX - prevX) / abs(curY - prevY)); + if (prevY < curY) { + control1Angle = PI - control1Angle; + } + control2Angle = atan((nextX - curX) / abs(curY - nextY)); + if (nextY < curY) { + control2Angle = PI - control2Angle; + } + } + + // Adjust the calculated angles so they point away from each other on the same line + alpha = halfPI - ((control1Angle + control2Angle) % (PI * 2)) / 2; + if (alpha > halfPI) { + alpha -= PI; + } + control1Angle += alpha; + control2Angle += alpha; + + // Find the control anchor points from the angles and length + control1X = curX - control1Length * sin(control1Angle); + control1Y = curY + control1Length * cos(control1Angle); + control2X = curX + control2Length * sin(control2Angle); + control2Y = curY + control2Length * cos(control2Angle); + + // One last adjustment, make sure that no control anchor point extends vertically past + // its target prev/next point, as that results in curves dipping above or below and + // bending back strangely. If we find this happening we keep the control angle but + // reduce the length of the control line so it stays within bounds. + if ((curY > prevY && control1Y < prevY) || (curY < prevY && control1Y > prevY)) { + control1X += abs(prevY - control1Y) * (control1X - curX) / (control1Y - curY); + control1Y = prevY; + } + if ((curY > nextY && control2Y < nextY) || (curY < nextY && control2Y > nextY)) { + control2X -= abs(nextY - control2Y) * (control2X - curX) / (control2Y - curY); + control2Y = nextY; + } + + return { + x1: control1X, + y1: control1Y, + x2: control2X, + y2: control2Y + }; + }, + + /** + * Given coordinates of the points, calculates coordinates of a Bezier curve that goes through them. + * @param dataX x-coordinates of the points. + * @param dataY y-coordinates of the points. + * @param value A value to control the smoothness of the curve. + * @return {Object} Object holding two arrays, for x and y coordinates of the curve. + */ + smooth: function (dataX, dataY, value) { + var ln = dataX.length, + prevX, prevY, + curX, curY, + nextX, nextY, + x, y, + smoothX = [], smoothY = [], + i, anchors; + + for (i = 0; i < ln - 1; i++) { + prevX = dataX[i]; + prevY = dataY[i]; + if (i === 0) { + x = prevX; + y = prevY; + smoothX.push(x); + smoothY.push(y); + if (ln === 1) { + break; + } + } + curX = dataX[i+1]; + curY = dataY[i+1]; + nextX = dataX[i+2]; + nextY = dataY[i+2]; + if (isNaN(nextX) || isNaN(nextY)) { + smoothX.push(x, curX, curX); + smoothY.push(y, curY, curY); + break; + } + anchors = this.getAnchors(prevX, prevY, curX, curY, nextX, nextY, value); + smoothX.push(x, anchors.x1, curX); + smoothY.push(y, anchors.y1, curY); + x = anchors.x2; + y = anchors.y2; + } + return { + smoothX: smoothX, + smoothY: smoothY + } + }, + + /** + * @method + * @private + * Work around for iOS. + * Nested 3d-transforms seems to prevent the redraw inside it until some event is fired. + */ + updateIOS: Ext.os.is.iOS ? function () { + Ext.getBody().createChild({id: 'frame-workaround', style: 'position: absolute; top: 0px; bottom: 0px; left: 0px; right: 0px; background: rgba(0,0,0,0.001); z-index: 100000'}); + Ext.draw.Animator.schedule(function () {Ext.get('frame-workaround').destroy();}); + } : Ext.emptyFn +}); + +/** + * @class Ext.draw.gradient.Gradient + * + * Creates a gradient. + */ +Ext.define('Ext.draw.gradient.Gradient', { + + isGradient: true, + + config: { + /** + * @cfg {Array/Object} Defines the stops of the gradient. + */ + stops: [] + }, + + applyStops: function (newStops) { + var stops = [], + ln = newStops.length, + i, stop, color; + + for (i = 0; i < ln; i++) { + stop = newStops[i]; + color = Ext.draw.Color.fly(stop.color || 'none'); + stops.push({ + offset: Math.min(1, Math.max(0, 'offset' in stop ? stop.offset : stop.position || 0)), + color: color.toString() + }); + } + stops.sort(function (a, b) { + return a.offset - b.offset; + }); + return stops; + }, + + onClassExtended: function (subClass, member) { + if (!member.alias && member.type) { + member.alias = 'gradient.' + member.type; + } + }, + + constructor: function (config) { + this.initConfig(config); + }, + + /** + * @protected + * Generates the gradient for the given context. + * @param {Ext.draw.engine.SvgContext} ctx The context. + * @param {Object} bbox + * @return {Object} + */ + generateGradient: Ext.emptyFn + +}); + +(function () { + /** + * Represents an RGB color and provides helper functions on it e.g. to get + * color components in HSL color space. + */ + Ext.define('Ext.draw.Color', { + statics: { + colorToHexRe: /(.*?)rgb\((\d+),\s*(\d+),\s*(\d+)\)/, + rgbToHexRe: /\s*rgb\((\d+),\s*(\d+),\s*(\d+)\)/, + rgbaToHexRe: /\s*rgba\((\d+),\s*(\d+),\s*(\d+),\s*([\.\d]+)\)/, + hexRe: /\s*#([0-9a-fA-F][0-9a-fA-F]?)([0-9a-fA-F][0-9a-fA-F]?)([0-9a-fA-F][0-9a-fA-F]?)\s*/ + }, + + isColor: true, + /** + * @cfg {Number} lightnessFactor + * + * The default factor to compute the lighter or darker color. + */ + lightnessFactor: 0.2, + + /** + * @constructor + * @param {Number} red Red component (0..255) + * @param {Number} green Green component (0..255) + * @param {Number} blue Blue component (0..255) + * @param {Number} [alpha=1] (optional) Alpha component (0..1) + */ + constructor: function (red, green, blue, alpha) { + this.setRGB(red, green, blue, alpha); + }, + + setRGB: function (red, green, blue, alpha) { + var me = this; + me.r = Math.min(255, Math.max(0, red)); + me.g = Math.min(255, Math.max(0, green)); + me.b = Math.min(255, Math.max(0, blue)); + if (alpha === undefined) { + me.a = 1; + } else { + me.a = Math.min(1, Math.max(0, alpha)); + } + }, + + /** + * Returns the gray value (0 to 255) of the color. + * + * The gray value is calculated using the formula r*0.3 + g*0.59 + b*0.11. + * + * @return {Number} + */ + getGrayscale: function () { + // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale + return this.r * 0.3 + this.g * 0.59 + this.b * 0.11; + }, + + /** + * Get the equivalent HSL components of the color. + * @param {Array} [target] Optional array to receive the values. + * @return {Array} + */ + getHSL: function (target) { + var me = this, + r = me.r / 255, + g = me.g / 255, + b = me.b / 255, + max = Math.max(r, g, b), + min = Math.min(r, g, b), + delta = max - min, + h, + s = 0, + l = 0.5 * (max + min); + + // min==max means achromatic (hue is undefined) + if (min !== max) { + s = (l < 0.5) ? delta / (max + min) : delta / (2 - max - min); + if (r === max) { + h = 60 * (g - b) / delta; + } else if (g === max) { + h = 120 + 60 * (b - r) / delta; + } else { + h = 240 + 60 * (r - g) / delta; + } + if (h < 0) { + h += 360; + } + if (h >= 360) { + h -= 360; + } + } + if (target) { + target[0] = h; + target[1] = s; + target[2] = l; + } else { + target = [h, s, l]; + } + return target; + }, + + /** + * Set current color based on the specified HSL values. + * + * @param {Number} h Hue component (0..359) + * @param {Number} s Saturation component (0..1) + * @param {Number} l Lightness component (0..1) + * @return this + */ + setHSL: function (h, s, l) { + var c, x, m, + abs = Math.abs, + floor = Math.floor; + h = (h % 360 + 360 ) % 360; + s = s > 1 ? 1 : s < 0 ? 0 : s; + l = l > 1 ? 1 : l < 0 ? 0 : l; + if (s === 0 || h === null) { + l *= 255; + this.setRGB(l, l, l); + } + else { + // http://en.wikipedia.org/wiki/HSL_and_HSV#From_HSL + // C is the chroma + // X is the second largest component + // m is the lightness adjustment + h /= 60; + c = s * (1 - abs(2 * l - 1)); + x = c * (1 - abs(h - 2 * floor(h / 2) - 1)); + m = l - c / 2; + m *= 255; + c *= 255; + x *= 255; + switch (floor(h)) { + case 0: + this.setRGB(c + m, x + m, m); + break; + case 1: + this.setRGB(x + m, c + m, m); + break; + case 2: + this.setRGB(m, c + m, x + m); + break; + case 3: + this.setRGB(m, x + m, c + m); + break; + case 4: + this.setRGB(x + m, m, c + m); + break; + case 5: + this.setRGB(c + m, m, x + m); + break; + } + } + return this; + }, + + /** + * Return a new color that is lighter than this color. + * @param {Number} [factor=0.2] Lighter factor (0..1). + * @return {Ext.draw.Color} + */ + createLighter: function (factor) { + var hsl = this.getHSL(); + factor = factor || this.lightnessFactor; + // COMPAT Ext.util.Numbers -> Ext.Number + hsl[2] = hsl[2] + factor; + if (hsl[2] > 1) { + hsl[2] = 1; + } else if (hsl[2] < 0) { + hsl[2] = 0; + } + return Ext.draw.Color.fromHSL(hsl[0], hsl[1], hsl[2]); + }, + + /** + * Return a new color that is darker than this color. + * @param {Number} [factor=0.2] Darker factor (0..1). + * @return {Ext.draw.Color} + */ + createDarker: function (factor) { + factor = factor || this.lightnessFactor; + return this.createLighter(-factor); + }, + + /** + * Return the color in the hex format, i.e. '#rrggbb'. + * @return {String} + */ + toString: function () { + if (this.a === 1) { + var me = this, + round = Math.round, + r = round(me.r).toString(16), + g = round(me.g).toString(16), + b = round(me.b).toString(16); + r = (r.length === 1) ? '0' + r : r; + g = (g.length === 1) ? '0' + g : g; + b = (b.length === 1) ? '0' + b : b; + return ['#', r, g, b].join(''); + } else { + return 'rgba(' + [Math.round(this.r), Math.round(this.g), Math.round(this.b), this.a.toFixed(15)].join(',') + ')'; + } + }, + + /** + * Convert a color to hexadecimal format. + * + * @param {String/Array} color The color value (i.e 'rgb(255, 255, 255)', 'color: #ffffff'). + * Can also be an Array, in this case the function handles the first member. + * @return {String} The color in hexadecimal format. + */ + toHex: function (color) { + if (Ext.isArray(color)) { + color = color[0]; + } + if (!Ext.isString(color)) { + return ''; + } + if (color.substr(0, 1) === '#') { + return color; + } + var digits = Ext.draw.Color.colorToHexRe.exec(color); + + if (Ext.isArray(digits)) { + var red = parseInt(digits[2], 10), + green = parseInt(digits[3], 10), + blue = parseInt(digits[4], 10), + rgb = blue | (green << 8) | (red << 16); + return digits[1] + '#' + ("000000" + rgb.toString(16)).slice(-6); + } + else { + return ''; + } + }, + + /** + * Parse the string and set current color. + * + * Supported formats: '#rrggbb', '#rgb', and 'rgb(r,g,b)'. + * + * If the string is not recognized, an `undefined` will be returned instead. + * + * @param {String} str Color in string. + * @return this + */ + setFromString: function (str) { + var values, r, g, b, a = 1, + parse = parseInt; + + if (str === 'none') { + this.r = this.g = this.b = this.a = 0; + return this; + } + + if ((str.length === 4 || str.length === 7) && str.substr(0, 1) === '#') { + values = str.match(Ext.draw.Color.hexRe); + if (values) { + r = parse(values[1], 16) >> 0; + g = parse(values[2], 16) >> 0; + b = parse(values[3], 16) >> 0; + if (str.length === 4) { + r += (r * 16); + g += (g * 16); + b += (b * 16); + } + } + } + else if ((values = str.match(Ext.draw.Color.rgbToHexRe))) { + r = +values[1]; + g = +values[2]; + b = +values[3]; + } else if ((values = str.match(Ext.draw.Color.rgbaToHexRe))) { + r = +values[1]; + g = +values[2]; + b = +values[3]; + a = +values[4]; + } else { + if (Ext.draw.Color.ColorList.hasOwnProperty(str.toLowerCase())) { + return this.setFromString(Ext.draw.Color.ColorList[str.toLowerCase()]); + } + } + if (typeof r === 'undefined') { + return this; + } + this.r = r; + this.g = g; + this.b = b; + this.a = a; + return this; + } + }, function () { + var flyColor = new this(); + + + this.addStatics({ + /** + * Returns a flyweight instance of Ext.draw.Color. + * + * Can be called with either a CSS color string or with separate + * arguments for red, green, blue, alpha. + * + * @param {Number/String} red Red component (0..255) or CSS color string. + * @param {Number} [green] Green component (0..255) + * @param {Number} [blue] Blue component (0..255) + * @param {Number} [alpha=1] Alpha component (0..1) + * @return {Ext.draw.Color} + * @static + */ + fly: function (r, g, b, a) { + switch (arguments.length) { + case 1: + flyColor.setFromString(r); + break; + case 3: + case 4: + flyColor.setRGB(r, g, b, a); + break; + default: + return null; + } + return flyColor; + }, + + ColorList: { + "aliceblue": "#f0f8ff", "antiquewhite": "#faebd7", "aqua": "#00ffff", "aquamarine": "#7fffd4", "azure": "#f0ffff", + "beige": "#f5f5dc", "bisque": "#ffe4c4", "black": "#000000", "blanchedalmond": "#ffebcd", "blue": "#0000ff", "blueviolet": "#8a2be2", "brown": "#a52a2a", "burlywood": "#deb887", + "cadetblue": "#5f9ea0", "chartreuse": "#7fff00", "chocolate": "#d2691e", "coral": "#ff7f50", "cornflowerblue": "#6495ed", "cornsilk": "#fff8dc", "crimson": "#dc143c", "cyan": "#00ffff", + "darkblue": "#00008b", "darkcyan": "#008b8b", "darkgoldenrod": "#b8860b", "darkgray": "#a9a9a9", "darkgreen": "#006400", "darkkhaki": "#bdb76b", "darkmagenta": "#8b008b", "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", "darkorchid": "#9932cc", "darkred": "#8b0000", "darksalmon": "#e9967a", "darkseagreen": "#8fbc8f", "darkslateblue": "#483d8b", "darkslategray": "#2f4f4f", "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", "deeppink": "#ff1493", "deepskyblue": "#00bfff", "dimgray": "#696969", "dodgerblue": "#1e90ff", + "firebrick": "#b22222", "floralwhite": "#fffaf0", "forestgreen": "#228b22", "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", "ghostwhite": "#f8f8ff", "gold": "#ffd700", "goldenrod": "#daa520", "gray": "#808080", "green": "#008000", "greenyellow": "#adff2f", + "honeydew": "#f0fff0", "hotpink": "#ff69b4", + "indianred ": "#cd5c5c", "indigo ": "#4b0082", "ivory": "#fffff0", "khaki": "#f0e68c", + "lavender": "#e6e6fa", "lavenderblush": "#fff0f5", "lawngreen": "#7cfc00", "lemonchiffon": "#fffacd", "lightblue": "#add8e6", "lightcoral": "#f08080", "lightcyan": "#e0ffff", "lightgoldenrodyellow": "#fafad2", + "lightgray": "#d3d3d3", "lightgrey": "#d3d3d3", "lightgreen": "#90ee90", "lightpink": "#ffb6c1", "lightsalmon": "#ffa07a", "lightseagreen": "#20b2aa", "lightskyblue": "#87cefa", "lightslategray": "#778899", "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", "lime": "#00ff00", "limegreen": "#32cd32", "linen": "#faf0e6", + "magenta": "#ff00ff", "maroon": "#800000", "mediumaquamarine": "#66cdaa", "mediumblue": "#0000cd", "mediumorchid": "#ba55d3", "mediumpurple": "#9370d8", "mediumseagreen": "#3cb371", "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", "mediumturquoise": "#48d1cc", "mediumvioletred": "#c71585", "midnightblue": "#191970", "mintcream": "#f5fffa", "mistyrose": "#ffe4e1", "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", "navy": "#000080", + "oldlace": "#fdf5e6", "olive": "#808000", "olivedrab": "#6b8e23", "orange": "#ffa500", "orangered": "#ff4500", "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", "palegreen": "#98fb98", "paleturquoise": "#afeeee", "palevioletred": "#d87093", "papayawhip": "#ffefd5", "peachpuff": "#ffdab9", "peru": "#cd853f", "pink": "#ffc0cb", "plum": "#dda0dd", "powderblue": "#b0e0e6", "purple": "#800080", + "red": "#ff0000", "rosybrown": "#bc8f8f", "royalblue": "#4169e1", + "saddlebrown": "#8b4513", "salmon": "#fa8072", "sandybrown": "#f4a460", "seagreen": "#2e8b57", "seashell": "#fff5ee", "sienna": "#a0522d", "silver": "#c0c0c0", "skyblue": "#87ceeb", "slateblue": "#6a5acd", "slategray": "#708090", "snow": "#fffafa", "springgreen": "#00ff7f", "steelblue": "#4682b4", + "tan": "#d2b48c", "teal": "#008080", "thistle": "#d8bfd8", "tomato": "#ff6347", "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", "white": "#ffffff", "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", "yellowgreen": "#9acd32" + }, + + /** + * Create a new color based on the specified HSL values. + * + * @param {Number} h Hue component (0..359) + * @param {Number} s Saturation component (0..1) + * @param {Number} l Lightness component (0..1) + * @return {Ext.draw.Color} + * @static + */ + fromHSL: function (h, s, l) { + return (new this(0, 0, 0, 0)).setHSL(h, s, l); + }, + + /** + * Parse the string and create a new color. + * + * Supported formats: '#rrggbb', '#rgb', and 'rgb(r,g,b)'. + * + * If the string is not recognized, an undefined will be returned instead. + * + * @param {String} string Color in string. + * @returns {Ext.draw.Color} + * @static + */ + fromString: function (string) { + return (new this(0, 0, 0, 0)).setFromString(string); + }, + + /** + * Convenience method for creating a color. + * + * Can be called with several different combinations of arguments: + * + * // Ext.draw.Color is returned unchanged. + * Ext.draw.Color.create(new Ext.draw.color(255, 0, 0, 0)); + * + * // CSS color string. + * Ext.draw.Color.create("red"); + * + * // Array of red, green, blue, alpha + * Ext.draw.Color.create([255, 0, 0, 0]); + * + * // Separate arguments of red, green, blue, alpha + * Ext.draw.Color.create(255, 0, 0, 0); + * + * // Returns black when no arguments given. + * Ext.draw.Color.create(); + * + * @param {Ext.draw.Color/String/Number[]/Number} [red] Red component (0..255), + * CSS color string or array of all components. + * @param {Number} [green] Green component (0..255) + * @param {Number} [blue] Blue component (0..255) + * @param {Number} [alpha=1] Alpha component (0..1) + * @return {Ext.draw.Color} + * @static + */ + create: function (arg) { + if (arg instanceof this) { + return arg; + } else if (Ext.isArray(arg)) { + return new Ext.draw.Color(arg[0], arg[1], arg[2], arg[3]); + } else if (Ext.isString(arg)) { + return Ext.draw.Color.fromString(arg); + } else if (arguments.length > 2) { + return new Ext.draw.Color(arguments[0], arguments[1], arguments[2], arguments[3]); + } else { + return new Ext.draw.Color(0, 0, 0, 0); + } + } + }); + }); +})(); + +Ext.define('Ext.draw.gradient.GradientDefinition', { + singleton: true, + + urlStringRe: /^url\(#([\w\-]+)\)$/, + gradients: {}, + + add: function (gradients) { + var store = this.gradients, + i, n, gradient; + for (i = 0, n = gradients.length; i < n; i++) { + gradient = gradients[i]; + if (Ext.isString(gradient.id)) { + store[gradient.id] = gradient; + } + } + }, + + get: function (str) { + var store = this.gradients, + match = str.match(this.urlStringRe), + gradient; + if (match && match[1] && (gradient = store[match[1]])) { + return gradient || str; + } + return str; + } +}); + +/** + * @private + * @class Ext.draw.sprite.AttributeParser + * + * Parsers used for sprite attributes. + */ +Ext.define("Ext.draw.sprite.AttributeParser", { + singleton: true, + attributeRe: /^url\(#([a-zA-Z\-]+)\)$/, + + + + + + "default": function (n) { + return n; + }, + + string: function (n) { + return String(n); + }, + + number: function (n) { + if (!isNaN(n)) { + return n; + } + }, + + angle: function (n) { + if (!isNaN(n)) { + n %= Math.PI * 2; + if (n < -Math.PI) { + n += Math.PI * 2; + } + if (n > Math.PI) { + n -= Math.PI * 2; + } + return n; + } + }, + + data: function (n) { + if (Ext.isArray(n)) { + return n.slice(); + } else if (n instanceof Float32Array) { + return new Float32Array(n); + } + }, + + bool: function (n) { + return !!n; + }, + + color: function (n) { + if (n instanceof Ext.draw.Color) { + return n.toString(); + } else if (n instanceof Ext.draw.gradient.Gradient) { + return n; + } else if (!n) { + return 'none'; + } else if (Ext.isString(n)) { + n = Ext.draw.gradient.GradientDefinition.get(n); + if (Ext.isString(n)) { + return n; + } + } + if (n.type === 'linear') { + return Ext.create('Ext.draw.gradient.Linear', n); + } else if (n.type === 'radial') { + return Ext.create('Ext.draw.gradient.Radial', n); + } else if (n.type === 'pattern') { + return Ext.create('Ext.draw.gradient.Pattern', n); + } + }, + + limited: function (low, hi) { + return (function (n) { + return isNaN(n) ? undefined : Math.min(Math.max(+n, low), hi); + }); + }, + + limited01: function (n) { + return isNaN(n) ? undefined : Math.min(Math.max(+n, 0), 1); + }, + + enums: function () { + var enums = {}, + args = Array.prototype.slice.call(arguments, 0), + i, ln; + + for (i = 0, ln = args.length; i < ln; i++) { + enums[args[i]] = true; + } + return (function (n) { + return n in enums ? n : undefined; + }); + } +}); + +(function () { + function compute(from, to, delta) { + return from + (to - from) * delta; + } + + /** + * @private + * @class Ext.draw.sprite.AnimationParser + * + * Parsers for sprite attributes used in animations. + */ + Ext.define("Ext.draw.sprite.AnimationParser", { + singleton: true, + attributeRe: /^url\(#([a-zA-Z\-]+)\)$/, + + + color: { + parseInitial: function (color1, color2) { + if (Ext.isString(color1)) { + color1 = Ext.draw.Color.create(color1); + } + if (Ext.isString(color2)) { + color2 = Ext.draw.Color.create(color2); + + } + if ((color1 instanceof Ext.draw.Color) && (color2 instanceof Ext.draw.Color)) { + return [ + [color1.r, color1.g, color1.b, color1.a], + [color2.r, color2.g, color2.b, color2.a] + ]; + } else { + return [color1 || color2, color2 || color1]; + } + }, + compute: function (from, to, delta) { + if (!Ext.isArray(from) || !Ext.isArray(to)) { + return to || from; + } else { + return [compute(from[0], to[0], delta), compute(from[1], to[1], delta), compute(from[2], to[2], delta), compute(from[3], to[3], delta)]; + + } + }, + serve: function (array) { + var color = Ext.draw.Color.fly(array[0], array[1], array[2], array[3]); + return color.toString(); + } + }, + + number: { + parse: function (n) { + return n === null ? null : +n; + }, + + compute: function (from, to, delta) { + if (!Ext.isNumber(from) || !Ext.isNumber(to)) { + return to || from; + } else { + return compute(from, to, delta); + } + } + }, + + angle: { + parseInitial: function (from, to) { + if (to - from > Math.PI) { + to -= Math.PI * 2; + } else if (to - from < -Math.PI) { + to += Math.PI * 2; + } + return [from, to]; + }, + + compute: function (from, to, delta) { + if (!Ext.isNumber(from) || !Ext.isNumber(to)) { + return to || from; + } else { + return compute(from, to, delta); + } + } + }, + + path: { + parseInitial: function (from, to) { + var fromStripes = from.toStripes(), + toStripes = to.toStripes(), + i, j, + fromLength = fromStripes.length, toLength = toStripes.length, + fromStripe, toStripe, + length, + lastStripe = toStripes[toLength - 1], + endPoint = [lastStripe[lastStripe.length - 2], lastStripe[lastStripe.length - 1]]; + for (i = fromLength; i < toLength; i++) { + fromStripes.push(fromStripes[fromLength - 1].slice(0)); + } + for (i = toLength; i < fromLength; i++) { + toStripes.push(endPoint.slice(0)); + } + length = fromStripes.length; + + toStripes.path = to; + toStripes.temp = new Ext.draw.Path(); + + for (i = 0; i < length; i++) { + fromStripe = fromStripes[i]; + toStripe = toStripes[i]; + fromLength = fromStripe.length; + toLength = toStripe.length; + toStripes.temp.types.push('M'); + for (j = toLength; j < fromLength; j += 6) { + toStripe.push(endPoint[0], endPoint[1], endPoint[0], endPoint[1], endPoint[0], endPoint[1]); + } + + lastStripe = toStripes[toStripes.length - 1]; + endPoint = [lastStripe[lastStripe.length - 2], lastStripe[lastStripe.length - 1]]; + for (j = fromLength; j < toLength; j += 6) { + fromStripe.push(endPoint[0], endPoint[1], endPoint[0], endPoint[1], endPoint[0], endPoint[1]); + } + for (i = 0; i < toStripe.length; i++) { + toStripe[i] -= fromStripe[i]; + } + for (i = 2; i < toStripe.length; i += 6) { + toStripes.temp.types.push('C'); + } + } + + return [fromStripes, toStripes]; + }, + + compute: function (fromStripes, toStripes, delta) { + if (delta >= 1) { + return toStripes.path; + } + var i = 0, ln = fromStripes.length, + j = 0, ln2, from, to, + temp = toStripes.temp.coords, pos = 0; + for (; i < ln; i++) { + from = fromStripes[i]; + to = toStripes[i]; + ln2 = from.length; + for (j = 0; j < ln2; j++) { + temp[pos++] = to[j] * delta + from[j]; + } + } + return toStripes.temp; + } + }, + + data: { + compute: function (from, to, delta, target) { + var lf = from.length - 1, + lt = to.length - 1, + len = Math.max(lf, lt), + f, t, i; + if (!target || target === from) { + target = []; + } + target.length = len + 1; + for (i = 0; i <= len; i++) { + f = from[Math.min(i, lf)]; + t = to[Math.min(i, lt)]; + if (isNaN(f)) { + target[i] = t; + } else { + target[i] = (t - f) * delta + f; + } + } + return target; + } + }, + + text: { + compute: function (from, to, delta) { + return from.substr(0, Math.round(from.length * (1 - delta))) + to.substr(Math.round(to.length * (1 - delta))); + } + }, + + limited: "number", + limited01: "number" + }); +})(); + +/** + * @private + * Flyweight object to process the attribute of a sprite. + */ +Ext.define("Ext.draw.sprite.AttributeDefinition", { + + + + + + config: { + /** + * @cfg {Object} defaults Defines the default values of attributes. + */ + defaults: { + + }, + + /** + * @cfg {Object} aliases Defines the aletrnative names for attributes. + */ + aliases: { + + }, + + /** + * @cfg {Object} animationProcessors Defines the process used to animate between attributes. + */ + animationProcessors: { + + }, + + /** + * @cfg {Object} processors Defines the preprocessing used on the attribute. + */ + processors: { + + }, + + /** + * @cfg {Object} dirty Defines what other attributes need to be updated when an attribute is changed. + */ + dirtyTriggers: { + + }, + + /** + * @cfg {Object} updaters Defines the postprocessing used by the attribute. + */ + updaters: { + + } + }, + + inheritableStatics: { + processorRe: /^(\w+)\(([\w\-,]*)\)$/ + }, + + constructor: function (config) { + var me = this; + me.initConfig(config); + }, + + applyDefaults: function (defaults, oldDefaults) { + oldDefaults = Ext.apply(oldDefaults || {}, this.normalize(defaults)); + return oldDefaults; + }, + + applyAliases: function (aliases, oldAliases) { + return Ext.apply(oldAliases || {}, aliases); + }, + + applyProcessors: function (processors, oldProcessors) { + this.getAnimationProcessors(); + var name, + result = oldProcessors || {}, + defaultProcessor = Ext.draw.sprite.AttributeParser, + processorRe = this.self.processorRe, + animationProcessors = {}, anyAnimationProcessors, + match, fn; + + for (name in processors) { + fn = processors[name]; + if (!Ext.isFunction(fn)) { + if (Ext.isString(fn)) { + match = fn.match(processorRe); + if (match) { + fn = defaultProcessor[match[1]].apply(defaultProcessor, match[2].split(',')); + } else { + animationProcessors[name] = fn; + anyAnimationProcessors = true; + fn = defaultProcessor[fn]; + } + } else { + continue; + } + } + result[name] = fn; + } + + if (anyAnimationProcessors) { + this.setAnimationProcessors(animationProcessors); + } + + return result; + }, + + applyAnimationProcessors: function (animationProcessors, oldAnimationProcessors) { + var parser = Ext.draw.sprite.AnimationParser, + item; + + if (!oldAnimationProcessors) { + oldAnimationProcessors = {}; + } + + for (var name in animationProcessors) { + item = animationProcessors[name]; + if (item === 'none') { + oldAnimationProcessors[name] = null; + } else if (Ext.isString(item) && !(name in oldAnimationProcessors)) { + if (item in parser) { + while (Ext.isString(parser[item])) { + item = parser[item]; + } + oldAnimationProcessors[name] = parser[item]; + } + } else if (Ext.isObject(item)) { + oldAnimationProcessors[name] = item; + } + } + return oldAnimationProcessors; + }, + + applyDirtyTriggers: function (dirtyTriggers, oldDirtyTrigger) { + if (!oldDirtyTrigger) { + oldDirtyTrigger = {}; + } + for (var name in dirtyTriggers) { + oldDirtyTrigger[name] = dirtyTriggers[name].split(','); + } + return oldDirtyTrigger; + }, + + applyUpdaters: function (updaters, oldUpdaters) { + return Ext.apply(oldUpdaters || {}, updaters); + }, + + batchedNormalize: function (batchedChanges, reserveUnrecognized) { + if (!batchedChanges) { + return {}; + } + var definition = this, + processors = definition.getProcessors(), + aliases = definition.getAliases(), + normalized = {}, + i, ln, name, val, + translation, rotation, scaling, + matrix, subVal, split; + if ('rotation' in batchedChanges) { + rotation = batchedChanges.rotation; + } + else { + rotation = ('rotate' in batchedChanges) ? batchedChanges.rotate : undefined; + } + + if ('scaling' in batchedChanges) { + scaling = batchedChanges.scaling; + } + else { + scaling = ('scale' in batchedChanges) ? batchedChanges.scale : undefined; + } + + if ('translation' in batchedChanges) { + translation = batchedChanges.translation; + } else { + translation = ('translate' in batchedChanges) ? batchedChanges.translate : undefined; + } + + if (typeof scaling !== 'undefined') { + if (Ext.isNumber(scaling)) { + normalized.scalingX = scaling; + normalized.scalingY = scaling; + } else { + if ('x' in scaling) { + normalized.scalingX = scaling.x; + } + if ('y' in scaling) { + normalized.scalingY = scaling.y; + } + if ('centerX' in scaling) { + normalized.scalingCenterX = scaling.centerX; + } + if ('centerY' in scaling) { + normalized.scalingCenterY = scaling.centerY; + } + } + } + + if (typeof rotation !== 'undefined') { + if (Ext.isNumber(rotation)) { + rotation = Ext.draw.Draw.rad(rotation); + normalized.rotationRads = rotation; + } else { + if ('rads' in rotation) { + normalized.rotationRads = rotation.rads; + } else if ('degrees' in rotation) { + if (Ext.isArray(rotation.degrees)) { + normalized.rotationRads = rotation.degrees.map(function (deg) { + return Ext.draw.Draw.rad(deg); + }); + } else { + normalized.rotationRads = Ext.draw.Draw.rad(rotation.degrees); + } + } + if ('centerX' in rotation) { + normalized.rotationCenterX = rotation.centerX; + } + if ('centerY' in rotation) { + normalized.rotationCenterY = rotation.centerY; + } + } + } + if (typeof translation !== 'undefined') { + if ('x' in translation) { + normalized.translationX = translation.x; + } + if ('y' in translation) { + normalized.translationY = translation.y; + } + } + + if ('matrix' in batchedChanges) { + matrix = Ext.draw.Matrix.create(batchedChanges.matrix); + split = matrix.split(); + + normalized.matrix = matrix; + normalized.rotationRads = split.rotation; + normalized.rotationCenterX = 0; + normalized.rotationCenterY = 0; + normalized.scalingX = split.scaleX; + normalized.scalingY = split.scaleY; + normalized.scalingCenterX = 0; + normalized.scalingCenterY = 0; + normalized.translationX = split.translateX; + normalized.translationY = split.translateY; + } + + for (name in batchedChanges) { + val = batchedChanges[name]; + if (typeof val === 'undefined') { + continue; + } else if (Ext.isArray(val)) { + if (name in aliases) { + name = aliases[name]; + } + if (name in processors) { + normalized[name] = []; + for (i = 0, ln = val.length; i < ln; i++) { + subVal = processors[name].call(this, val[i]); + if (typeof subVal !== 'undefined') { + normalized[name][i] = subVal; + } + } + } else if (reserveUnrecognized){ + normalized[name] = val; + } + } else { + if (name in aliases) { + name = aliases[name]; + } + if (name in processors) { + val = processors[name].call(this, val); + if (typeof val !== 'undefined') { + normalized[name] = val; + } + } else if (reserveUnrecognized){ + normalized[name] = val; + } + } + } + return normalized; + }, + + /** + * Normalizes the changes given via their processors before they are applied as attributes. + * + * @param {Object} changes The changes given. + * @return {Object} The normalized values. + */ + normalize: function (changes, reserveUnrecognized) { + if (!changes) { + return {}; + } + var definition = this, + processors = definition.getProcessors(), + aliases = definition.getAliases(), + translation = changes.translation || changes.translate, + normalized = {}, + name, val, rotation, scaling, matrix, split; + + if ('rotation' in changes) { + rotation = changes.rotation; + } + else { + rotation = ('rotate' in changes) ? changes.rotate : undefined; + } + + if ('scaling' in changes) { + scaling = changes.scaling; + } + else { + scaling = ('scale' in changes) ? changes.scale : undefined; + } + + if (translation) { + if ('x' in translation) { + normalized.translationX = translation.x; + } + if ('y' in translation) { + normalized.translationY = translation.y; + } + } + + if (typeof scaling !== 'undefined') { + if (Ext.isNumber(scaling)) { + normalized.scalingX = scaling; + normalized.scalingY = scaling; + } else { + if ('x' in scaling) { + normalized.scalingX = scaling.x; + } + if ('y' in scaling) { + normalized.scalingY = scaling.y; + } + if ('centerX' in scaling) { + normalized.scalingCenterX = scaling.centerX; + } + if ('centerY' in scaling) { + normalized.scalingCenterY = scaling.centerY; + } + } + } + + if (typeof rotation !== 'undefined') { + if (Ext.isNumber(rotation)) { + rotation = Ext.draw.Draw.rad(rotation); + normalized.rotationRads = rotation; + } else { + if ('rads' in rotation) { + normalized.rotationRads = rotation.rads; + } else if ('degrees' in rotation) { + normalized.rotationRads = Ext.draw.Draw.rad(rotation.degrees); + } + if ('centerX' in rotation) { + normalized.rotationCenterX = rotation.centerX; + } + if ('centerY' in rotation) { + normalized.rotationCenterY = rotation.centerY; + } + } + } + + if ('matrix' in changes) { + matrix = Ext.draw.Matrix.create(changes.matrix); + split = matrix.split(); + + normalized.matrix = matrix; + normalized.rotationRads = split.rotation; + normalized.rotationCenterX = 0; + normalized.rotationCenterY = 0; + normalized.scalingX = split.scaleX; + normalized.scalingY = split.scaleY; + normalized.scalingCenterX = 0; + normalized.scalingCenterY = 0; + normalized.translationX = split.translateX; + normalized.translationY = split.translateY; + } + + for (name in changes) { + val = changes[name]; + if (typeof val === 'undefined') { + continue; + } + if (name in aliases) { + name = aliases[name]; + } + if (name in processors) { + val = processors[name].call(this, val); + if (typeof val !== 'undefined') { + normalized[name] = val; + } + } else if (reserveUnrecognized){ + normalized[name] = val; + } + } + return normalized; + }, + + setBypassingNormalization: function (attr, modifierStack, changes) { + return modifierStack.pushDown(attr, changes); + }, + + set: function (attr, modifierStack, changes) { + changes = this.normalize(changes); + return this.setBypassingNormalization(attr, modifierStack, changes); + } +}); + +/** + * @class Ext.draw.modifier.Modifier + * + * Each sprite has a stack of modifiers. The resulting attributes of sprite is + * the content of the stack top. When setting attributes to a sprite, + * changes will be pushed-down though the stack of modifiers and pop-back the + * additive changes; When modifier is triggered to change the attribute of a + * sprite, it will pop-up the changes to the top. + */ +Ext.define("Ext.draw.modifier.Modifier", { + config: { + /** + * @cfg {Ext.draw.modifier.Modifier} previous Previous modifier that receives + * the push-down changes. + */ + previous: null, + + /** + * @cfg {Ext.draw.modifier.Modifier} next Next modifier that receives the + * pop-up changes. + */ + next: null, + + /** + * @cfg {Ext.draw.sprite.Sprite} sprite The sprite to which the modifier belongs. + */ + sprite: null + }, + + constructor: function (config) { + this.initConfig(config); + }, + + updateNext: function (next) { + if (next) { + next.setPrevious(this); + } + }, + + updatePrev: function (prev) { + if (prev) { + prev.setNext (this); + } + }, + + /** + * Validate attribute set before use. + * + * @param {Object} attr The attribute to be validated. Note that it may be already initialized, so do + * not override properties that have already been used. + */ + prepareAttributes: function (attr) { + if (this._previous) { + this._previous.prepareAttributes(attr); + } + }, + + /** + * Invoked when changes need to be popped up to the top. + * @param {Object} attributes The source attributes. + * @param {Object} changes The changes to be popped up. + */ + popUp: function (attributes, changes) { + if (this._next) { + this._next.popUp(attributes, changes); + } else { + Ext.apply(attributes, changes); + } + }, + + /** + * Invoked when changes need to be pushed down to the sprite. + * @param {Object} attr The source attributes. + * @param {Object} changes The changes to make. This object might be changed unexpectedly inside the method. + * @return {Mixed} + */ + pushDown: function (attr, changes) { + if (this._previous) { + return this._previous.pushDown(attr, changes); + } else { + for (var name in changes) { + if (changes[name] === attr[name]) { + delete changes[name]; + } + } + return changes; + } + } +}); + +/** + * @class Ext.draw.modifier.Target + * @extends Ext.draw.modifier.Modifier + * + * This is the destination modifier that has to be put at + * the top of the modifier stack. + * + */ +Ext.define("Ext.draw.modifier.Target", { + extend: Ext.draw.modifier.Modifier , + alias: 'modifier.target', + statics: { + uniqueId: 0 + }, + + /** + * @inheritdoc + */ + prepareAttributes: function (attr) { + if (this._previous) { + this._previous.prepareAttributes(attr); + } + // TODO: Investigate the performance hit for introducing an id + attr.attributeId = 'attribute-' + Ext.draw.modifier.Target.uniqueId++; + if (!attr.hasOwnProperty('canvasAttributes')) { + attr.bbox = { + plain: {dirty: true}, + transform: {dirty: true} + }; + attr.dirty = true; + attr.dirtyFlags = {}; + attr.canvasAttributes = {}; + attr.matrix = new Ext.draw.Matrix(); + attr.inverseMatrix = new Ext.draw.Matrix(); + } + }, + + /** + * @private + * Applies the appropriate dirty flags from the modifier changes. + * @param {Object} attr The source attributes. + * @param {Object} changes The modifier changes. + */ + setDirtyFlags: function (attr, changes) { + Ext.apply(attr, changes); + var sprite = this._sprite, + dirtyTriggers = sprite.self.def._dirtyTriggers, + name, dirtyFlags = attr.dirtyFlags, flags, any = false, + triggers, trigger, i, ln, canvasNames; + + for (name in changes) { + if ((triggers = dirtyTriggers[name])) { + i = 0; + while ((trigger = triggers[i++])) { + if (!(flags = dirtyFlags[trigger])) { + flags = dirtyFlags[trigger] = []; + } + flags.push(name); + } + } + } + + for (name in changes) { + any = true; + break; + } + + if (!any) { + return; + } + + // This can prevent sub objects to set duplicated attributes to + // context. + if (dirtyFlags.canvas) { + canvasNames = dirtyFlags.canvas; + delete dirtyFlags.canvas; + for (i = 0, ln = canvasNames.length; i < ln; i++) { + name = canvasNames[i]; + attr.canvasAttributes[name] = attr[name]; + } + } + + // Spreading dirty flags to children + if (attr.hasOwnProperty('children')) { + for (i = 0, ln = attr.children.length; i < ln; i++) { + Ext.apply(attr.children[i].dirtyFlags, dirtyFlags); + sprite.updateDirtyFlags(attr.children[i]); + } + } + + sprite.setDirty(true); + }, + + /** + * @inheritdoc + */ + popUp: function (attributes, changes) { + this.setDirtyFlags(attributes, changes); + this._sprite.updateDirtyFlags(attributes); + }, + + /** + * @inheritdoc + */ + pushDown: function (attr, changes) { + if (this._previous) { + changes = this._previous.pushDown(attr, changes); + } + this.setDirtyFlags(attr, changes); + this._sprite.updateDirtyFlags(attr); + return changes; + } +}); + +(function () { + var pow = Math.pow, + sin = Math.sin, + cos = Math.cos, + sqrt = Math.sqrt, + pi = Math.PI, + easings, addEasing, poly, createPoly, easing, i, l; + + //create polynomial easing equations + poly = ['quad', 'cubic', 'quart', 'quint']; + + //create other easing equations + easings = { + pow: function (p, x) { + return pow(p, x[0] || 6); + }, + + expo: function (p) { + return pow(2, 8 * (p - 1)); + }, + + circ: function (p) { + return 1 - sqrt(1 - p * p); + }, + + sine: function (p) { + return 1 - sin((1 - p) * pi / 2); + }, + + back: function (p, n) { + n = n || 1.616; + return p * p * ((n + 1) * p - n); + }, + + bounce: function (p) { + var value; + for (var a = 0, b = 1; 1; a += b, b /= 2) { + if (p >= (7 - 4 * a) / 11) { + value = b * b - pow((11 - 6 * a - 11 * p) / 4, 2); + break; + } + } + return value; + }, + + elastic: function (p, x) { + return pow(2, 10 * --p) * cos(20 * p * pi * (x || 1) / 3); + } + }; + + //Add easeIn, easeOut, easeInOut options to all easing equations. + addEasing = function (easing, params) { + params = params && params.length ? params : [ params ]; + return Ext.apply(easing, { + + easeIn: function (pos) { + return easing(pos, params); + }, + + easeOut: function (pos) { + return 1 - easing(1 - pos, params); + }, + + easeInOut: function (pos) { + return (pos <= 0.5) ? easing(2 * pos, params) / 2 + : (2 - easing(2 * (1 - pos), params)) / 2; + } + }); + }; + + //Append the polynomial equations with easing support to the EasingPrototype. + createPoly = function (times) { + return function (p) { + return pow(p, times); + }; + }; + + for (i = 0, l = poly.length; i < l; ++i) { + easings[poly[i]] = createPoly(i + 2); + } + + //Add linear interpolator + easings.linear = function (x) { + return x; + }; + + for (easing in easings) { + if (easings.hasOwnProperty(easing)) { + addEasing(easings[easing]); + } + } + + /** + * @class + * Contains transition equations such as `Quad`, `Cubic`, `Quart`, `Quint`, + * `Expo`, `Circ`, `Pow`, `Sine`, `Back`, `Bounce`, `Elastic`, etc. + * + * Contains transition equations such as `Quad`, `Cubic`, `Quart`, `Quint`, `Expo`, `Circ`, `Pow`, `Sine`, `Back`, `Bounce`, `Elastic`, etc. + * Each transition also contains methods for applying this function as ease in, ease out or ease in and out accelerations. + * + * var fx = Ext.create('Ext.draw.fx.Sprite', { + * sprite: sprite, + * duration: 1000, + * easing: 'backOut' + * }); + */ + Ext.define('Ext.draw.TimingFunctions', { + singleton: true, + easingMap: { + linear: easings.linear, + easeIn: easings.quad.easeIn, + easeOut: easings.quad.easeOut, + easeInOut: easings.quad.easeInOut, + backIn: easings.back, + backOut: function (x, n) { + return 1 - easings.back(1 - x, n); + }, + backInOut: function (x, n) { + if (x < 0.5) { + return easings.back(x * 2, n) * 0.5; + } else { + return 1 - easings.back((1 - x) * 2, n) * 0.5; + } + }, + elasticIn: function (x, n) { + return 1 - easings.elastic(1 - x, n); + }, + elasticOut: easings.elastic, + bounceIn: easings.bounce, + bounceOut: function (x) { + return 1 - easings.bounce(1 - x); + } + } + }, function () { + Ext.apply(this, easings); + }); + +})(); + + +/** + * @class Ext.draw.Animator + * + * Singleton class that manages the animation pool. + */ +Ext.define('Ext.draw.Animator', { + + singleton: true, + + frameCallbacks: {}, + frameCallbackId: 0, + scheduled: 0, + frameStartTimeOffset:Date.now(), + animations: [], + running: false, + + /** + * Cross platform `animationTime` implementation. + * @return {Number} + */ + animationTime: function () { + return Ext.AnimationQueue.frameStartTime - this.frameStartTimeOffset; + }, + + /** + * Adds an animated object to the animation pool. + * + * @param {Object} animation The animation descriptor to add to the pool. + */ + add: function (animation) { + if (!this.contains(animation)) { + this.animations.push(animation); + Ext.draw.Animator.ignite(); + if ('fireEvent' in animation) { + animation.fireEvent('animationstart', animation); + } + } + }, + + /** + * Removes an animation from the pool. + * TODO: This is broken when called within `step` method. + * @param {Object} animation The animation to remove from the pool. + */ + remove: function (animation) { + var me = this, + animations = me.animations, + i = 0, + l = animations.length; + + for (; i < l; ++i) { + if (animations[i] === animation) { + animations.splice(i, 1); + if ('fireEvent' in animation) { + animation.fireEvent('animationend', animation); + } + return; + } + } + }, + + /** + * Returns `true` or `false` whether it contains the given animation or not. + * + * @param {Object} animation The animation to check for. + * @return {Boolean} + */ + contains: function (animation) { + return this.animations.indexOf(animation) > -1; + }, + + /** + * Returns `true` or `false` whether the pool is empty or not. + * @return {Boolean} + */ + empty: function () { + return this.animations.length === 0; + }, + + /** + * Given a frame time it will filter out finished animations from the pool. + * + * @param {Number} frameTime The frame's start time, in milliseconds. + */ + step: function (frameTime) { + var me = this, + animations = me.animations, + animation, + i = 0, + ln = animations.length; + + for (; i < ln; i++) { + animation = animations[i]; + animation.step(frameTime); + if (!animation.animating) { + animations.splice(i, 1); + i--; + ln--; + if (animation.fireEvent) { + animation.fireEvent('animationend'); + } + } + } + }, + + /** + * Register an one-time callback that will be called at the next frame. + * @param {Function} callback + * @param {Object} scope + * @return {String} + */ + schedule: function (callback, scope) { + scope = scope || this; + var id = 'frameCallback' + (this.frameCallbackId++); + + if (Ext.isString(callback)) { + callback = scope[callback]; + } + Ext.draw.Animator.frameCallbacks[id] = {fn: callback, scope: scope, once: true}; + this.scheduled++; + Ext.draw.Animator.ignite(); + return id; + }, + + /** + * Cancel a registered one-time callback + * @param {String} id + */ + cancel: function (id) { + if (Ext.draw.Animator.frameCallbacks[id] && Ext.draw.Animator.frameCallbacks[id].once) { + this.scheduled--; + delete Ext.draw.Animator.frameCallbacks[id]; + } + }, + + /** + * Register a recursive callback that will be called at every frame. + * + * @param {Function} callback + * @param {Object} scope + * @return {String} + */ + addFrameCallback: function (callback, scope) { + scope = scope || this; + if (Ext.isString(callback)) { + callback = scope[callback]; + } + var id = 'frameCallback' + (this.frameCallbackId++); + + Ext.draw.Animator.frameCallbacks[id] = {fn: callback, scope: scope}; + return id; + }, + + /** + * Unregister a recursive callback. + * @param {String} id + */ + removeFrameCallback: function (id) { + delete Ext.draw.Animator.frameCallbacks[id]; + }, + + /** + * @private + */ + fireFrameCallbacks: function () { + var callbacks = this.frameCallbacks, + id, fn, cb; + + for (id in callbacks) { + cb = callbacks[id]; + fn = cb.fn; + if (Ext.isString(fn)) { + fn = cb.scope[fn]; + } + + fn.call(cb.scope); + + if (callbacks[id] && cb.once) { + this.scheduled--; + delete callbacks[id]; + } + } + }, + + handleFrame: function() { + this.step(this.animationTime()); + this.fireFrameCallbacks(); + if (!this.scheduled && this.empty()) { + Ext.AnimationQueue.stop(this.handleFrame, this); + this.running = false; + } + }, + + ignite: function() { + if (!this.running) { + this.running = true; + Ext.AnimationQueue.start(this.handleFrame, this); + Ext.draw.Draw.updateIOS(); + } + } +}); + +/** + * The Animation modifier. + * + * Sencha Touch allows users to use transitional animation on sprites. Simply set the duration + * and easing in the animation modifier, then all the changes to the sprites will be animated. + * + * Also, you can use different durations and easing functions on different attributes by using + * {@link #customDuration} and {@link #customEasings}. + * + * By default, an animation modifier will be created during the initialization of a sprite. + * You can get the modifier of `sprite` by `sprite.fx`. + * + */ +Ext.define("Ext.draw.modifier.Animation", { + mixins: { + observable: Ext.mixin.Observable + }, + + + + + extend: Ext.draw.modifier.Modifier , + alias: 'modifier.animation', + + config: { + /** + * @cfg {Function} easing + * Default easing function. + */ + easing: function (x) { + return x; + }, + + /** + * @cfg {Number} duration + * Default duration time (ms). + */ + duration: 0, + + /** + * @cfg {Object} customEasings Overrides the default easing function for defined attributes. + */ + customEasings: {}, + + /** + * @cfg {Object} customDuration Overrides the default duration for defined attributes. + */ + customDuration: {} + }, + + constructor: function () { + this.anyAnimation = false; + this.anySpecialAnimations = false; + this.animating = 0; + this.animatingPool = []; + this.callSuper(arguments); + }, + + /** + * @inheritdoc + */ + prepareAttributes: function (attr) { + if (!attr.hasOwnProperty('timers')) { + attr.animating = false; + attr.timers = {}; + attr.animationOriginal = Ext.Object.chain(attr); + attr.animationOriginal.upperLevel = attr; + } + if (this._previous) { + this._previous.prepareAttributes(attr.animationOriginal); + } + }, + + updateSprite: function (sprite) { + // Apply the config that was configured in the sprite. + this.setConfig(sprite.config.fx); + }, + + updateDuration: function (duration) { + this.anyAnimation = duration > 0; + }, + + applyEasing: function (easing) { + if (typeof easing === 'string') { + return Ext.draw.TimingFunctions.easingMap[easing]; + } else { + return easing; + } + }, + + applyCustomEasings: function (newCustomEasing, oldCustomEasing) { + oldCustomEasing = oldCustomEasing || {}; + var attr, attrs, easing, i, ln; + + for (attr in newCustomEasing) { + easing = newCustomEasing[attr]; + attrs = attr.split(','); + if (typeof easing === 'string') { + easing = Ext.draw.TimingFunctions.easingMap[easing]; + } + for (i = 0, ln = attrs.length; i < ln; i++) { + oldCustomEasing[attrs[i]] = easing; + } + } + return oldCustomEasing; + }, + + /** + * Set special easings on the given attributes. E.g.: + * + * circleSprite.fx.setEasingOn('r', 'elasticIn'); + * + * @param {String/Array} attrs The source attribute(s). + * @param {String} easing The special easings. + */ + setEasingOn: function (attrs, easing) { + attrs = Ext.Array.from(attrs).slice(); + var customEasings = {}, + i = 0, + ln = attrs.length; + + for (; i < ln; i++) { + customEasings[attrs[i]] = easing; + } + this.setCustomEasings(customEasings); + }, + + /** + * Remove special easings on the given attributes. + * @param {String/Array} attrs The source attribute(s). + */ + clearEasingOn: function (attrs) { + attrs = Ext.Array.from(attrs, true); + var i = 0, ln = attrs.length; + for (; i < ln; i++) { + delete this._customEasings[attrs[i]]; + } + }, + + applyCustomDuration: function (newCustomDuration, oldCustomDuration) { + oldCustomDuration = oldCustomDuration || {}; + var attr, duration, attrs, i, ln, anySpecialAnimations = this.anySpecialAnimations; + + for (attr in newCustomDuration) { + duration = newCustomDuration[attr]; + attrs = attr.split(','); + anySpecialAnimations = true; + + for (i = 0, ln = attrs.length; i < ln; i++) { + oldCustomDuration[attrs[i]] = duration; + } + } + this.anySpecialAnimations = anySpecialAnimations; + return oldCustomDuration; + }, + + /** + * Set special duration on the given attributes. E.g.: + * + * rectSprite.fx.setDurationOn('height', 2000); + * + * @param {String/Array} attrs The source attributes. + * @param {Number} duration The special duration. + */ + setDurationOn: function (attrs, duration) { + attrs = Ext.Array.from(attrs).slice(); + var customDurations = {}, + i = 0, + ln = attrs.length; + + for (; i < ln; i++) { + customDurations[attrs[i]] = duration; + } + this.setCustomDuration(customDurations); + }, + + /** + * Remove special easings on the given attributes. + * @param {Object} attrs The source attributes. + */ + clearDurationOn: function (attrs) { + attrs = Ext.Array.from(attrs, true); + var i = 0, ln = attrs.length; + + for (; i < ln; i++) { + delete this._customDuration[attrs[i]]; + } + }, + + /** + * @private + * Initializes Animator for the animation. + * @param {Object} attributes The source attributes. + * @param {String} animating The animating flag. + */ + setAnimating: function (attributes, animating) { + var me = this, + i, j; + + if (attributes.animating !== animating) { + attributes.animating = animating; + if (animating) { + me.animatingPool.push(attributes); + if (me.animating === 0) { + Ext.draw.Animator.add(me); + } + me.animating++; + } else { + for (i = 0, j = 0; i < me.animatingPool.length; i++) { + if (me.animatingPool[i] !== attributes) { + me.animatingPool[j++] = me.animatingPool[i]; + } + } + me.animating = me.animatingPool.length = j; + } + } + }, + + /** + * @private + * Set the attr with given easing and duration. + * @param {Object} attr The attributes collection. + * @param {Object} changes The changes that popped up from lower modifier. + * @return {Object} The changes to pop up. + */ + setAttrs: function (attr, changes) { + var timers = attr.timers, + parsers = this._sprite.self.def._animationProcessors, + defaultEasing = this._easing, + defaultDuration = this._duration, + customDuration = this._customDuration, + customEasings = this._customEasings, + anySpecial = this.anySpecialAnimations, + any = this.anyAnimation || anySpecial, + original = attr.animationOriginal, + ignite = false, + timer, name, newValue, startValue, parser, easing, duration; + + if (!any) { + // If there is no animation enabled + // When applying changes to attributes, simply stop current animation + // and set the value. + for (name in changes) { + if (attr[name] === changes[name]) { + delete changes[name]; + } else { + attr[name] = changes[name]; + } + delete original[name]; + delete timers[name]; + } + return changes; + } else { + // If any animation + for (name in changes) { + newValue = changes[name]; + startValue = attr[name]; + if (newValue !== startValue && any && startValue !== undefined && startValue !== null && (parser = parsers[name])) { + // If this property is animating. + + // Figure out the desired duration and easing. + easing = defaultEasing; + duration = defaultDuration; + if (anySpecial) { + // Deducing the easing function and duration + if (name in customEasings) { + easing = customEasings[name]; + } + if (name in customDuration) { + duration = customDuration[name]; + } + } + + // If the property is animating + if (duration) { + if (!timers[name]) { + timers[name] = {}; + } + + timer = timers[name]; + timer.start = 0; + timer.easing = easing; + timer.duration = duration; + timer.compute = parser.compute; + timer.serve = parser.serve || Ext.draw.Draw.reflectFn; + + if (parser.parseInitial) { + var initial = parser.parseInitial(startValue, newValue); + timer.source = initial[0]; + timer.target = initial[1]; + } else if (parser.parse) { + timer.source = parser.parse(startValue); + timer.target = parser.parse(newValue); + } else { + timer.source = startValue; + timer.target = newValue; + } + // The animation started. Change to originalVal. + timers[name] = timer; + original[name] = newValue; + delete changes[name]; + ignite = true; + continue; + } else { + delete original[name]; + } + } else { + delete original[name]; + } + + // If the property is not animating. + delete timers[name]; + } + } + + if (ignite && !attr.animating) { + this.setAnimating(attr, true); + } + + return changes; + }, + + /** + * @private + * + * Update attributes to current value according to current animation time. + * This method will not effect the values of lower layers, but may delete a + * value from it. + * @param {Object} attr The source attributes. + * @return {Object} the changes to popup. + */ + updateAttributes: function (attr) { + if (!attr.animating) { + return {}; + } + var changes = {}, + any = false, + original = attr.animationOriginal, + timers = attr.timers, + now = Ext.draw.Animator.animationTime(), + name, timer, delta; + + // If updated in the same frame, return. + if (attr.lastUpdate === now) { + return {}; + } + + for (name in timers) { + timer = timers[name]; + if (!timer.start) { + timer.start = now; + delta = 0; + } else { + delta = (now - timer.start) / timer.duration; + } + if (delta >= 1) { + changes[name] = original[name]; + delete original[name]; + delete timers[name]; + } else { + changes[name] = timer.serve(timer.compute(timer.source, timer.target, timer.easing(delta), attr[name])); + any = true; + } + } + attr.lastUpdate = now; + this.setAnimating(attr, any); + return changes; + }, + + /** + * @inheritdoc + */ + pushDown: function (attr, changes) { + changes = Ext.draw.modifier.Modifier.prototype.pushDown.call(this, attr.animationOriginal, changes); + return this.setAttrs(attr, changes); + }, + + /** + * @inheritdoc + */ + popUp: function (attr, changes) { + attr = attr.upperLevel; + changes = this.setAttrs(attr, changes); + if (this._next) { + return this._next.popUp(attr, changes); + } else { + return Ext.apply(attr, changes); + } + }, + + // This is called as an animated object in `Ext.draw.Animator`. + step: function () { + var me = this, + pool = me.animatingPool.slice(), + attributes, + i, ln; + + for (i = 0, ln = pool.length; i < ln; i++) { + attributes = pool[i]; + var changes = this.updateAttributes(attributes), + name; + + // Looking for anything in changes + //noinspection LoopStatementThatDoesntLoopJS + for (name in changes) { + if (this._next) { + this._next.popUp(attributes, changes); + } + break; + } + } + }, + + /** + * Stop all animations effected by this modifier + */ + stop: function () { + this.step(); + + var me = this, + pool = me.animatingPool, + i, ln; + + for (i = 0, ln = pool.length; i < ln; i++) { + pool[i].animating = false; + } + me.animatingPool.length = 0; + me.animating = 0; + Ext.draw.Animator.remove(me); + }, + + destroy: function () { + var me = this; + me.animatingPool.length = 0; + me.animating = 0; + } +}); + +/** + * @class Ext.draw.modifier.Highlight + * @extends Ext.draw.modifier.Modifier + * + * Highlight is a modifier that will override the attributes + * with its `highlightStyle` attributes when `highlighted` is true. + */ +Ext.define("Ext.draw.modifier.Highlight", { + extend: Ext.draw.modifier.Modifier , + alias: 'modifier.highlight', + + config: { + + /** + * @cfg {Boolean} enabled 'true' if the highlight is applied. + */ + enabled: false, + + /** + * @cfg {Object} highlightStyle The style attributes of the highlight modifier. + */ + highlightStyle: null + }, + + preFx: true, + + applyHighlightStyle: function (style, oldStyle) { + oldStyle = oldStyle || {}; + if (this.getSprite()) { + Ext.apply(oldStyle, this.getSprite().self.def.normalize(style)); + } else { + Ext.apply(oldStyle, style); + } + return oldStyle; + }, + + /** + * @inheritdoc + */ + prepareAttributes: function (attr) { + if (!attr.hasOwnProperty('highlightOriginal')) { + attr.highlighted = false; + attr.highlightOriginal = Ext.Object.chain(attr); + } + if (this._previous) { + this._previous.prepareAttributes(attr.highlightOriginal); + } + }, + + updateSprite: function (sprite, oldSprite) { + if (sprite) { + if (this.getHighlightStyle()) { + this._highlightStyle = sprite.self.def.normalize(this.getHighlightStyle()); + } + this.setHighlightStyle(sprite.config.highlightCfg); + } + + // Before attaching to a sprite, register the highlight related + // attributes to its definition. + // + // TODO(zhangbei): Unfortunately this will effect all the sprites of the same type. + // As the redundant attributes would not effect performance, it is not yet a big problem. + var def = sprite.self.def; + this.setSprite(sprite); + def.setConfig({ + defaults: { + highlighted: false + }, + + processors: { + highlighted: 'bool' + }, + + aliases: { + "highlight": "highlighted", + "highlighting": "highlighted" + }, + + dirtyFlags: { + }, + + updaters: { + + } + }); + }, + + /** + * Filter modifier changes if overriding source attributes. + * @param {Object} attr The source attributes. + * @param {Object} changes The modifier changes. + * @return {*} The filtered changes. + */ + filterChanges: function (attr, changes) { + var me = this, + name, + original = attr.highlightOriginal, + style = me.getHighlightStyle(); + if (attr.highlighted) { + for (name in changes) { + if (style.hasOwnProperty(name)) { + // If it's highlighted, then save the changes to lower level + // on overridden attributes. + original[name] = changes[name]; + delete changes[name]; + } + } + } + + for (name in changes) { + if (name !== 'highlighted' && original[name] === changes[name]) { + // If it's highlighted, then save the changes to lower level + // on overridden attributes. + delete changes[name]; + } + } + + return changes; + }, + + /** + * @inheritdoc + */ + pushDown: function (attr, changes) { + var style = this.getHighlightStyle(), + original = attr.highlightOriginal, + oldHighlighted, name; + + if (changes.hasOwnProperty('highlighted')) { + oldHighlighted = changes.highlighted; + // Hide `highlighted` and `highlightStyle` to underlying modifiers. + delete changes.highlighted; + + if (this._previous) { + changes = this._previous.pushDown(original, changes); + } + changes = this.filterChanges(attr, changes); + + if (oldHighlighted !== attr.highlighted) { + if (oldHighlighted) { + // switching on + // At this time, original should be empty. + for (name in style) { + // If changes[name] just changed the value in lower levels, + if (name in changes) { + original[name] = changes[name]; + } else { + original[name] = attr[name]; + } + if (original[name] !== style[name]) { + changes[name] = style[name]; + } + } + } else { + // switching off + for (name in style) { + if (!(name in changes)) { + changes[name] = original[name]; + } + delete original[name]; // TODO: Need deletion API? + } + } + changes.highlighted = oldHighlighted; + } + } else { + if (this._previous) { + changes = this._previous.pushDown(original, changes); + } + changes = this.filterChanges(attr, changes); + } + + return changes; + }, + + /** + * @inheritdoc + */ + popUp: function (attr, changes) { + changes = this.filterChanges(attr, changes); + Ext.draw.modifier.Modifier.prototype.popUp.call(this, attr, changes); + } +}); + +/** + * A sprite is an object rendered in a drawing {@link Ext.draw.Surface}. + * The Sprite class itself is an abstract class and is not meant to be used directly. + * Every sprite in the Draw and Chart packages is a subclass of the Ext.draw.sprite.Sprite. + * The standard Sprite subclasses are: + * + * * {@link Ext.draw.sprite.Path} - A sprite that represents a path. + * * {@link Ext.draw.sprite.Rect} - A sprite that represents a rectangle. + * * {@link Ext.draw.sprite.Circle} - A sprite that represents a circle. + * * {@link Ext.draw.sprite.Sector} - A sprite representing a pie slice. + * * {@link Ext.draw.sprite.Arc} - A sprite that represents a circular arc. + * * {@link Ext.draw.sprite.Ellipse} - A sprite that represents an ellipse. + * * {@link Ext.draw.sprite.EllipticalArc} - A sprite that represents an elliptical arc. + * * {@link Ext.draw.sprite.Text} - A sprite that represents text. + * * {@link Ext.draw.sprite.Image} - A sprite that represents an image. + * * {@link Ext.draw.sprite.Instancing} - A sprite that represents multiple instances based on the given template. + * * {@link Ext.draw.sprite.Composite} - Represents a group of sprites. + * + * Sprites can be created with a reference to a {@link Ext.draw.Surface} + * + * var drawComponent = Ext.create('Ext.draw.Component', { + * // ... + * }); + * + * var sprite = Ext.create('Ext.draw.sprite.Sprite', { + * type: 'circle', + * fill: '#ff0', + * surface: drawComponent.getSurface('main'), + * radius: 5 + * }); + * + * Sprites can also be added to the surface as a configuration object: + * + * var sprite = drawComponent.getSurface('main').add({ + * type: 'circle', + * fill: '#ff0', + * radius: 5 + * }); + */ +Ext.define('Ext.draw.sprite.Sprite', { + alias: 'sprite.sprite', + + mixins: { + observable: Ext.mixin.Observable + }, + + + + + + + + + + + + isSprite: true, + + inheritableStatics: { + def: { + processors: { + /** + * @cfg {String} [strokeStyle="none"] The color of the stroke (a CSS color value). + */ + strokeStyle: "color", + + /** + * @cfg {String} [fillStyle="none"] The color of the shape (a CSS color value). + */ + fillStyle: "color", + + /** + * @cfg {Number} [strokeOpacity=1] The opacity of the stroke. Limited from 0 to 1. + */ + strokeOpacity: "limited01", + + /** + * @cfg {Number} [fillOpacity=1] The opacity of the fill. Limited from 0 to 1. + */ + fillOpacity: "limited01", + + /** + * @cfg {Number} [lineWidth=1] The width of the line stroke. + */ + lineWidth: "number", + + /** + * @cfg {String} [lineCap="butt"] The style of the line caps. + */ + lineCap: "enums(butt,round,square)", + + /** + * @cfg {String} [lineJoin="miter"] The style of the line join. + */ + lineJoin: "enums(round,bevel,miter)", + + /** + * @cfg {Array} An array of non-negative numbers specifying a dash/space sequence. + */ + lineDash: "data", + + /** + * @cfg {Number} A number specifying how far into the line dash sequence drawing commences. + */ + lineDashOffset: "number", + + /** + * @cfg {Number} [miterLimit=1] Sets the distance between the inner corner and the outer corner where two lines meet. + */ + miterLimit: "number", + + /** + * @cfg {String} [shadowColor="none"] The color of the shadow (a CSS color value). + */ + shadowColor: "color", + + /** + * @cfg {Number} [shadowOffsetX=0] The offset of the sprite's shadow on the x-axis. + */ + shadowOffsetX: "number", + + /** + * @cfg {Number} [shadowOffsetY=0] The offset of the sprite's shadow on the y-axis. + */ + shadowOffsetY: "number", + + /** + * @cfg {Number} [shadowBlur=0] The amount blur used on the shadow. + */ + shadowBlur: "number", + + /** + * @cfg {Number} [globalAlpha=1] The opacity of the sprite. Limited from 0 to 1. + */ + globalAlpha: "limited01", + globalCompositeOperation: "enums(source-over,destination-over,source-in,destination-in,source-out,destination-out,source-atop,destination-atop,lighter,xor,copy)", + + /** + * @cfg {Boolean} [hidden=false] Determines whether or not the sprite is hidden. + */ + hidden: "bool", + + /** + * @cfg {Boolean} [transformFillStroke=false] Determines whether the fill and stroke are affected by sprite transformations. + */ + transformFillStroke: "bool", + + /** + * @cfg {Number} [zIndex=0] The stacking order of the sprite. + */ + zIndex: "number", + + /** + * @cfg {Number} [translationX=0] The translation of the sprite on the x-axis. + */ + translationX: "number", + + /** + * @cfg {Number} [translationY=0] The translation of the sprite on the y-axis. + */ + translationY: "number", + + /** + * @cfg {Number} [rotationRads=0] The degree of rotation of the sprite. + */ + rotationRads: "number", + + /** + * @cfg {Number} [rotationCenterX=null] The central coordinate of the sprite's scale operation on the x-axis. + */ + rotationCenterX: "number", + + /** + * @cfg {Number} [rotationCenterY=null] The central coordinate of the sprite's rotate operation on the y-axis. + */ + rotationCenterY: "number", + + /** + * @cfg {Number} [scalingX=1] The scaling of the sprite on the x-axis. + */ + scalingX: "number", + + /** + * @cfg {Number} [scalingY=1] The scaling of the sprite on the y-axis. + */ + scalingY: "number", + + /** + * @cfg {Number} [scalingCenterX=null] The central coordinate of the sprite's scale operation on the x-axis. + */ + scalingCenterX: "number", + + /** + * @cfg {Number} [scalingCenterY=null] The central coordinate of the sprite's scale operation on the y-axis. + */ + scalingCenterY: "number", + + constrainGradients: "bool" + }, + + aliases: { + "stroke": "strokeStyle", + "fill": "fillStyle", + "color": "fillStyle", + "stroke-width": "lineWidth", + "stroke-linecap": "lineCap", + "stroke-linejoin": "lineJoin", + "stroke-miterlimit": "miterLimit", + "text-anchor": "textAlign", + "opacity": "globalAlpha", + + translateX: "translationX", + translateY: "translationY", + rotateRads: "rotationRads", + rotateCenterX: "rotationCenterX", + rotateCenterY: "rotationCenterY", + scaleX: "scalingX", + scaleY: "scalingY", + scaleCenterX: "scalingCenterX", + scaleCenterY: "scalingCenterY" + }, + + defaults: { + hidden: false, + zIndex: 0, + + strokeStyle: "none", + fillStyle: "none", + lineWidth: 1, + lineDash: [], + lineDashOffset: 0, + lineCap: "butt", + lineJoin: "miter", + miterLimit: 1, + + shadowColor: "none", + shadowOffsetX: 0, + shadowOffsetY: 0, + shadowBlur: 0, + + globalAlpha: 1, + strokeOpacity: 1, + fillOpacity: 1, + transformFillStroke: false, + + translationX: 0, + translationY: 0, + rotationRads: 0, + rotationCenterX: null, + rotationCenterY: null, + scalingX: 1, + scalingY: 1, + scalingCenterX: null, + scalingCenterY: null, + + constrainGradients: false + }, + + dirtyTriggers: { + hidden: "canvas", + zIndex: "zIndex", + + globalAlpha: "canvas", + globalCompositeOperation: "canvas", + + transformFillStroke: "canvas", + strokeStyle: "canvas", + fillStyle: "canvas", + strokeOpacity: "canvas", + fillOpacity: "canvas", + + lineWidth: "canvas", + lineCap: "canvas", + lineJoin: "canvas", + lineDash: "canvas", + lineDashOffset: "canvas", + miterLimit: "canvas", + + shadowColor: "canvas", + shadowOffsetX: "canvas", + shadowOffsetY: "canvas", + shadowBlur: "canvas", + + translationX: "transform", + translationY: "transform", + rotationRads: "transform", + rotationCenterX: "transform", + rotationCenterY: "transform", + scalingX: "transform", + scalingY: "transform", + scalingCenterX: "transform", + scalingCenterY: "transform", + + constrainGradients: "canvas" + }, + + updaters: { + "bbox": function (attrs) { + attrs.bbox.plain.dirty = true; + attrs.bbox.transform.dirty = true; + if ( + attrs.rotationRads !== 0 && (attrs.rotationCenterX === null || attrs.rotationCenterY === null) || + ((attrs.scalingX !== 1 || attrs.scalingY !== 1) && + (attrs.scalingCenterX === null || attrs.scalingCenterY === null) + ) + ) { + if (!attrs.dirtyFlags.transform) { + attrs.dirtyFlags.transform = []; + } + } + }, + + "zIndex": function (attrs) { + attrs.dirtyZIndex = true; + }, + + "transform": function (attrs) { + attrs.dirtyTransform = true; + attrs.bbox.transform.dirty = true; + } + } + } + }, + + /** + * @property {Object} attr + * The visual attributes of the sprite, e.g. strokeStyle, fillStyle, lineWidth... + */ + attr: {}, + + config: { + parent: null + }, + + onClassExtended: function (Class, member) { + var initCfg = Class.superclass.self.def.initialConfig, + cfg; + + if (member.inheritableStatics && member.inheritableStatics.def) { + cfg = Ext.merge({}, initCfg, member.inheritableStatics.def); + Class.def = Ext.create("Ext.draw.sprite.AttributeDefinition", cfg); + delete member.inheritableStatics.def; + } else { + Class.def = Ext.create("Ext.draw.sprite.AttributeDefinition", initCfg); + } + }, + + constructor: function (config) { + if (this.$className === 'Ext.draw.sprite.Sprite') { + throw 'Ext.draw.sprite.Sprite is an abstract class'; + } + config = config || {}; + var me = this; + + me.id = config.id || Ext.id(null, 'ext-sprite-'); + me.attr = {}; + me.initConfig(config); + var modifiers = Ext.Array.from(config.modifiers, true); + me.prepareModifiers(modifiers); + me.initializeAttributes(); + me.setAttributes(me.self.def.getDefaults(), true); + me.setAttributes(config); + }, + + getDirty: function () { + return this.attr.dirty; + }, + + setDirty: function (dirty) { + if ((this.attr.dirty = dirty)) { + if (this._parent) { + this._parent.setDirty(true); + } + } + }, + + addModifier: function (modifier, reinitializeAttributes) { + var me = this; + if (!(modifier instanceof Ext.draw.modifier.Modifier)) { + modifier = Ext.factory(modifier, null, null, 'modifier'); + } + modifier.setSprite(this); + if (modifier.preFx || modifier.config && modifier.config.preFx) { + if (me.fx.getPrevious()) { + me.fx.getPrevious().setNext(modifier); + } + modifier.setNext(me.fx); + } else { + me.topModifier.getPrevious().setNext(modifier); + modifier.setNext(me.topModifier); + } + if (reinitializeAttributes) { + me.initializeAttributes(); + } + return modifier; + }, + + prepareModifiers: function (additionalModifiers) { + // Set defaults + var me = this, + modifier, i, ln; + + me.topModifier = new Ext.draw.modifier.Target({sprite: me}); + + // Link modifiers + me.fx = new Ext.draw.modifier.Animation({sprite: me}); + me.fx.setNext(me.topModifier); + + for (i = 0, ln = additionalModifiers.length; i < ln; i++) { + me.addModifier(additionalModifiers[i], false); + } + }, + + initializeAttributes: function () { + var me = this; + me.topModifier.prepareAttributes(me.attr); + }, + + updateDirtyFlags: function (attrs) { + var me = this, + dirtyFlags = attrs.dirtyFlags, flags, + updaters = me.self.def._updaters, + any = false, + dirty = false, + flag; + + do { + any = false; + for (flag in dirtyFlags) { + me.updateDirtyFlags = Ext.emptyFn; + flags = dirtyFlags[flag]; + delete dirtyFlags[flag]; + if (updaters[flag]) { + updaters[flag].call(me, attrs, flags); + } + any = true; + delete me.updateDirtyFlags; + } + dirty = dirty || any; + } while (any); + + if (dirty) { + me.setDirty(true); + } + }, + + /** + * Set attributes of the sprite. + * + * @param {Object} changes The content of the change. + * @param {Boolean} [bypassNormalization] `true` to avoid normalization of the given changes. + * @param {Boolean} [avoidCopy] `true` to avoid copying the `changes` object. + * The content of object may be destroyed. + */ + setAttributes: function (changes, bypassNormalization, avoidCopy) { + var attributes = this.attr; + if (bypassNormalization) { + if (avoidCopy) { + this.topModifier.pushDown(attributes, changes); + } else { + this.topModifier.pushDown(attributes, Ext.apply({}, changes)); + } + } else { + this.topModifier.pushDown(attributes, this.self.def.normalize(changes)); + } + }, + + /** + * Set attributes of the sprite, assuming the names and values have already been + * normalized. + * + * @deprecated Use setAttributes directy with bypassNormalization argument being `true`. + * @param {Object} changes The content of the change. + * @param {Boolean} [avoidCopy] `true` to avoid copying the `changes` object. + * The content of object may be destroyed. + */ + setAttributesBypassingNormalization: function (changes, avoidCopy) { + return this.setAttributes(changes, true, avoidCopy); + }, + + /** + * Returns the bounding box for the given Sprite as calculated with the Canvas engine. + * + * @param {Boolean} [isWithoutTransform] Whether to calculate the bounding box with the current transforms or not. + */ + getBBox: function (isWithoutTransform) { + var me = this, + attr = me.attr, + bbox = attr.bbox, + plain = bbox.plain, + transform = bbox.transform; + if (plain.dirty) { + me.updatePlainBBox(plain); + plain.dirty = false; + } + if (isWithoutTransform) { + return plain; + } else { + me.applyTransformations(); + if (transform.dirty) { + me.updateTransformedBBox(transform, plain); + transform.dirty = false; + } + return transform; + } + }, + + /** + * @protected + * Subclass will fill the plain object with `x`, `y`, `width`, `height` information of the plain bounding box of + * this sprite. + * + * @param {Object} plain Target object. + */ + updatePlainBBox: Ext.emptyFn, + + /** + * @protected + * Subclass will fill the plain object with `x`, `y`, `width`, `height` information of the transformed + * bounding box of this sprite. + * + * @param {Object} transform Target object. + * @param {Object} plain Auxiliary object providing information of plain object. + */ + updateTransformedBBox: function (transform, plain) { + this.attr.matrix.transformBBox(plain, 0, transform); + }, + + /** + * Subclass can rewrite this function to gain better performance. + * @param {Boolean} isWithoutTransform + * @return {Array} + */ + getBBoxCenter: function (isWithoutTransform) { + var bbox = this.getBBox(isWithoutTransform); + if (bbox) { + return [ + bbox.x + bbox.width * 0.5, + bbox.y + bbox.height * 0.5 + ]; + } else { + return [0, 0]; + } + }, + + /** + * Hide the sprite. + * @return {Ext.draw.sprite.Sprite} this + * @chainable + */ + hide: function () { + this.attr.hidden = true; + this.setDirty(true); + return this; + }, + + /** + * Show the sprite. + * @return {Ext.draw.sprite.Sprite} this + * @chainable + */ + show: function () { + this.attr.hidden = false; + this.setDirty(true); + return this; + }, + + /** + * Applies sprite's attributes to the given context. + * @param {Object} ctx Context to apply sprite's attributes to. + * @param {Array} region The region of the context to be affected by gradients. + */ + useAttributes: function (ctx, region) { + this.applyTransformations(); + var attrs = this.attr, + canvasAttributes = attrs.canvasAttributes, + strokeStyle = canvasAttributes.strokeStyle, + fillStyle = canvasAttributes.fillStyle, + lineDash = canvasAttributes.lineDash, + lineDashOffset = canvasAttributes.lineDashOffset, + id; + + if (strokeStyle) { + if (strokeStyle.isGradient) { + ctx.strokeStyle = 'black'; + ctx.strokeGradient = strokeStyle; + } else { + ctx.strokeGradient = false; + } + } + + if (fillStyle) { + if (fillStyle.isGradient) { + ctx.fillStyle = 'black'; + ctx.fillGradient = fillStyle; + } else { + ctx.fillGradient = false; + } + } + + if (lineDash && ctx.setLineDash) { + ctx.setLineDash(lineDash); + } + + if (lineDashOffset && typeof ctx.lineDashOffset === 'number') { + ctx.lineDashOffset = lineDashOffset; + } + + for (id in canvasAttributes) { + if (canvasAttributes[id] !== undefined && canvasAttributes[id] !== ctx[id]) { + ctx[id] = canvasAttributes[id]; + } + } + + if(attrs.constrainGradients) { + ctx.setGradientBBox({x: region[0], y: region[1], width: region[2], height: region[3]}); + } else { + ctx.setGradientBBox(this.getBBox(attrs.transformFillStroke)); + } + }, + + /** + * @private + * + * Calculates forward and inverse transform matrices. + * @param {Boolean} force Forces recalculation of transform matrices even when sprite's transform attributes supposedly haven't changed. + */ + applyTransformations: function (force) { + if (!force && !this.attr.dirtyTransform) { + return; + } + var me = this, + attr = me.attr, + center = me.getBBoxCenter(true), + centerX = center[0], + centerY = center[1], + + x = attr.translationX, + y = attr.translationY, + + sx = attr.scalingX, + sy = attr.scalingY === null ? attr.scalingX : attr.scalingY, + scx = attr.scalingCenterX === null ? centerX : attr.scalingCenterX, + scy = attr.scalingCenterY === null ? centerY : attr.scalingCenterY, + + rad = attr.rotationRads, + rcx = attr.rotationCenterX === null ? centerX : attr.rotationCenterX, + rcy = attr.rotationCenterY === null ? centerY : attr.rotationCenterY, + + cos = Math.cos(rad), + sin = Math.sin(rad); + + if (sx === 1 && sy === 1) { + scx = 0; + scy = 0; + } + + if (rad === 0) { + rcx = 0; + rcy = 0; + } + + attr.matrix.elements = [ + cos * sx, sin * sy, + -sin * sx, cos * sy, + scx + (rcx - cos * rcx - scx + rcy * sin) * sx + x, + scy + (rcy - cos * rcy - scy + rcx * -sin) * sy + y + ]; + attr.matrix.inverse(attr.inverseMatrix); + attr.dirtyTransform = false; + attr.bbox.transform.dirty = true; + }, + + /** + * Called before rendering. + */ + preRender: Ext.emptyFn, + + /** + * Render method. + * @param {Ext.draw.Surface} surface The surface. + * @param {Object} ctx A context object compatible with CanvasRenderingContext2D. + * @param {Array} region The clip region (or called dirty rect) of the current rendering. Not be confused + * with `surface.getRegion()`. + * + * @return {*} returns `false` to stop rendering in this frame. All the sprite haven't been rendered + * will have their dirty flag untouched. + */ + render: Ext.emptyFn, + + repaint: function () { + var parent = this.getParent(); + while (parent && !(parent instanceof Ext.draw.Surface)) { + parent = parent.getParent(); + } + if (parent) { + parent.renderFrame(); + } + }, + + /** + * Removes the sprite and clears all listeners. + */ + destroy: function () { + var me = this, modifier = me.topModifier, curr; + while (modifier) { + curr = modifier; + modifier = modifier.getPrevious(); + curr.destroy(); + } + delete me.attr; + + me.destroy = Ext.emptyFn; + if (me.fireEvent('beforedestroy', me) !== false) { + me.fireEvent('destroy', me); + } + this.callSuper(); + } +}, function () { + this.def = Ext.create("Ext.draw.sprite.AttributeDefinition", this.def); +}); + + +Ext.define('Ext.draw.sprite.Line', { + extend: Ext.draw.sprite.Sprite , + alias: 'sprite.line', + type: 'line', + + inheritableStatics: { + def: { + processors: { + fromX: 'number', + fromY: 'number', + toX: 'number', + toY: 'number' + }, + + defaults: { + fromX: 0, + fromY: 0, + toX: 1, + toY: 1 + } + } + }, + + render: function (surface, ctx, clipRegion) { + var attr = this.attr, + matrix = this.attr.matrix; + + matrix.toContext(ctx); + + ctx.beginPath(); + ctx.moveTo(attr.fromX, attr.fromY); + ctx.lineTo(attr.toX, attr.toY); + ctx.stroke(); + } +}); + +(function () { + var PI2_3 = 2.0943951023931953/* 120 Deg */, + abs = Math.abs, + sin = Math.cos, + cos = Math.cos, + acos = Math.acos, + sqrt = Math.sqrt, + exp = Math.exp, + log = Math.log; + + /** + * @private + * Singleton Class that provides methods to solve cubic equation. + */ + Ext.define("Ext.draw.Solver", { + singleton: true, + /** + * Cubic root of number + * @param {Number} number + */ + cubicRoot: function (number) { + if (number > 0) { + return exp(log(number) / 3); + } else if (number < 0) { + return -exp(log(-number) / 3); + } else { + return 0; + } + }, + + /** + * Returns the function f(x) = a * x + b and solver for f(x) = y + * @param {Number} a + * @param {Number} b + */ + linearFunction: function (a, b) { + var result; + if (a === 0) { + result = function (t) { + return b; + }; + result.solve = function (y) { + // if y == d there should be a real root + // but we can ignore it for geometry calculations. + return []; + }; + } else { + result = function (t) { + return a * t + b; + }; + result.solve = function (y) { + return [(y - b) / a]; + }; + } + return result; + }, + + /** + * Returns the function f(x) = a * x ^ 2 + b * x + c and solver for f(x) = y + * + * @param {Number} a + * @param {Number} b + * @param {Number} c + */ + quadraticFunction: function (a, b, c) { + var result; + if (a === 0) { + return this.linearFunction(b, c); + } else { + // Quadratic equation. + result = function (t) { + return (a * t + b) * t + c; + }; + var delta0temp = b * b - 4 * a * c, + delta = function (y) { + return delta0temp + 4 * a * y; + }, solveTemp0 = 1 / a * 0.5, + solveTemp1 = -solveTemp0 * b; + solveTemp0 = abs(solveTemp0); + result.solve = function (y) { + var deltaTemp = delta(y); + if (deltaTemp < 0) { + return []; + } + deltaTemp = sqrt(deltaTemp); + // have to distinct roots here. + return [solveTemp1 - deltaTemp * solveTemp0, solveTemp1 + deltaTemp * solveTemp0]; + }; + } + return result; + }, + + /** + * Returns the function f(x) = a * x^3 + b * x^2 + c * x + d and solver for f(x) = y + * @param {Number} a + * @param {Number} b + * @param {Number} c + * @param {Number} d + */ + cubicFunction: function (a, b, c, d) { + var result; + if (a === 0) { + return this.quadraticFunction(b, c, d); + } else { + result = function (t) { + return ((a * t + b) * t + c) * t + d; + }; + + var b_a_3 = b / a / 3, + c_a = c / a, + d_a = d / a, + b2 = b_a_3 * b_a_3, + deltaTemp0 = (b_a_3 * c_a - d_a) * 0.5 - b_a_3 * b2, + deltaTemp1 = b2 - c_a / 3, + deltaTemp13 = deltaTemp1 * deltaTemp1 * deltaTemp1; + + if (deltaTemp1 === 0) { + result.solve = function (y) { + return [-b_a_3 + this.cubicRoot(deltaTemp0 * 2 + y / a)]; + }; + } else { + if (deltaTemp1 > 0) { + var deltaTemp1_2 = sqrt(deltaTemp1), + deltaTemp13_2 = deltaTemp1_2 * deltaTemp1_2 * deltaTemp1_2; + deltaTemp1_2 += deltaTemp1_2; + } + result.solve = function (y) { + y /= a; + var d0 = deltaTemp0 + y * 0.5, + deltaTemp = d0 * d0 - deltaTemp13; + if (deltaTemp > 0) { + deltaTemp = sqrt(deltaTemp); + return [-b_a_3 + this.cubicRoot(d0 + deltaTemp) + this.cubicRoot(d0 - deltaTemp)]; + } else if (deltaTemp === 0) { + var cr = this.cubicRoot(d0), + root0 = -b_a_3 - cr; + if (d0 >= 0) { + return [root0, root0, -b_a_3 + 2 * cr]; + } else { + return [-b_a_3 + 2 * cr, root0, root0]; + } + } else { + var theta = acos(d0 / deltaTemp13_2) / 3, + ra = deltaTemp1_2 * cos(theta) - b_a_3, + rb = deltaTemp1_2 * cos(theta + PI2_3) - b_a_3, + rc = deltaTemp1_2 * cos(theta - PI2_3) - b_a_3; + if (ra < rb) { + if (rb < rc) { + return [ra, rb, rc]; + } else if (ra < rc) { + return[ra, rc, rb]; + } else { + return [rc, ra, rb]; + } + } else { + if (ra < rc) { + return [rb, ra, rc]; + } else if (rb < rc) { + return [rb, rc, ra]; + } else { + return [rc, rb, ra]; + } + } + } + }; + } + } + return result; + }, + + createBezierSolver: function (a, b, c, d) { + return this.cubicFunction(3 * (b - c) + d - a, 3 * (a - 2 * b + c), 3 * (b - a), a); + } + }); +})(); + +/** + * Class representing a path. + * Designed to be compatible with [CanvasPathMethods](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#canvaspathmethods) + * and will hopefully be replaced by the browsers' implementation of the Path object. + */ +Ext.define('Ext.draw.Path', { + + statics: { + pathRe: /,?([achlmqrstvxz]),?/gi, + pathRe2: /-/gi, + pathSplitRe: /\s|,/g + }, + svgString: '', + + /** + * Create a path from pathString + * @constructor + * @param {String} pathString + */ + constructor: function (pathString) { + var me = this; + me.coords = []; + me.types = []; + me.cursor = null; + me.startX = 0; + me.startY = 0; + me.solvers = {}; + if (pathString) { + me.fromSvgString(pathString); + } + }, + + /** + * Clear the path. + */ + clear: function () { + var me = this; + me.coords.length = 0; + me.types.length = 0; + me.cursor = null; + me.startX = 0; + me.startY = 0; + me.solvers = {}; + me.dirt(); + }, + + /** + * @private + */ + dirt: function () { + this.svgString = ''; + }, + + /** + * Move to a position. + * @param {Number} x + * @param {Number} y + */ + moveTo: function (x, y) { + var me = this; + if (!me.cursor) { + me.cursor = [x, y]; + } + me.coords.push(x, y); + me.types.push('M'); + me.startX = x; + me.startY = y; + me.cursor[0] = x; + me.cursor[1] = y; + me.dirt(); + }, + + /** + * A straight line to a position. + * @param {Number} x + * @param {Number} y + */ + lineTo: function (x, y) { + var me = this; + if (!me.cursor) { + me.cursor = [x, y]; + me.coords.push(x, y); + me.types.push('M'); + } else { + me.coords.push(x, y); + me.types.push('L'); + } + me.cursor[0] = x; + me.cursor[1] = y; + me.dirt(); + }, + + /** + * A cubic bezier curve to a position. + * @param {Number} cx1 + * @param {Number} cy1 + * @param {Number} cx2 + * @param {Number} cy2 + * @param {Number} x + * @param {Number} y + */ + bezierCurveTo: function (cx1, cy1, cx2, cy2, x, y) { + var me = this; + if (!me.cursor) { + me.moveTo(cx1, cy1); + } + me.coords.push(cx1, cy1, cx2, cy2, x, y); + me.types.push('C'); + me.cursor[0] = x; + me.cursor[1] = y; + me.dirt(); + }, + + /** + * A quadratic bezier curve to a position. + * @param {Number} cx + * @param {Number} cy + * @param {Number} x + * @param {Number} y + */ + quadraticCurveTo: function (cx, cy, x, y) { + var me = this; + if (!me.cursor) { + me.moveTo(cx, cy); + } + me.bezierCurveTo( + (me.cursor[0] * 2 + cx) / 3, (me.cursor[1] * 2 + cy) / 3, + (x * 2 + cx) / 3, (y * 2 + cy) / 3, + x, y + ); + }, + + /** + * Close this path with a straight line. + */ + closePath: function () { + var me = this; + if (me.cursor) { + me.types.push('Z'); + me.dirt(); + } + }, + + /** + * Create a elliptic arc curve compatible with SVG's arc to instruction. + * + * The curve start from (`x1`, `y1`) and ends at (`x2`, `y2`). The ellipse + * has radius `rx` and `ry` and a rotation of `rotation`. + * @param {Number} x1 + * @param {Number} y1 + * @param {Number} x2 + * @param {Number} y2 + * @param {Number} [rx] + * @param {Number} [ry] + * @param {Number} [rotation] + */ + arcTo: function (x1, y1, x2, y2, rx, ry, rotation) { + var me = this; + if (ry === undefined) { + ry = rx; + } + + if (rotation === undefined) { + rotation = 0; + } + + if (!me.cursor) { + me.moveTo(x1, y1); + return; + } + + if (rx === 0 || ry === 0) { + me.lineTo(x1, y1); + return; + } + + x2 -= x1; + y2 -= y1; + + var x0 = me.cursor[0] - x1, + y0 = me.cursor[1] - y1, + area = x2 * y0 - y2 * x0, + cos, sin, xx, yx, xy, yy, + l0 = Math.sqrt(x0 * x0 + y0 * y0), + l2 = Math.sqrt(x2 * x2 + y2 * y2), + dist, cx, cy; + // cos rx, -sin ry , x1 - cos rx x1 + ry sin y1 + // sin rx, cos ry, -rx sin x1 + y1 - cos ry y1 + if (area === 0) { + me.lineTo(x1, y1); + return; + } + + if (ry !== rx) { + cos = Math.cos(rotation); + sin = Math.sin(rotation); + xx = cos / rx; + yx = sin / ry; + xy = -sin / rx; + yy = cos / ry; + var temp = xx * x0 + yx * y0; + y0 = xy * x0 + yy * y0; + x0 = temp; + temp = xx * x2 + yx * y2; + y2 = xy * x2 + yy * y2; + x2 = temp; + } else { + x0 /= rx; + y0 /= ry; + x2 /= rx; + y2 /= ry; + } + + cx = x0 * l2 + x2 * l0; + cy = y0 * l2 + y2 * l0; + dist = 1 / (Math.sin(Math.asin(Math.abs(area) / (l0 * l2)) * 0.5) * Math.sqrt(cx * cx + cy * cy)); + cx *= dist; + cy *= dist; + + var k0 = (cx * x0 + cy * y0) / (x0 * x0 + y0 * y0), + k2 = (cx * x2 + cy * y2) / (x2 * x2 + y2 * y2); + var cosStart = x0 * k0 - cx, + sinStart = y0 * k0 - cy, + cosEnd = x2 * k2 - cx, + sinEnd = y2 * k2 - cy, + startAngle = Math.atan2(sinStart, cosStart), + endAngle = Math.atan2(sinEnd, cosEnd); + if (area > 0) { + if (endAngle < startAngle) { + endAngle += Math.PI * 2; + } + } else { + if (startAngle < endAngle) { + startAngle += Math.PI * 2; + } + } + if (ry !== rx) { + cx = cos * cx * rx - sin * cy * ry + x1; + cy = sin * cy * ry + cos * cy * ry + y1; + me.lineTo(cos * rx * cosStart - sin * ry * sinStart + cx, + sin * rx * cosStart + cos * ry * sinStart + cy); + me.ellipse(cx, cy, rx, ry, rotation, startAngle, endAngle, area < 0); + } else { + cx = cx * rx + x1; + cy = cy * ry + y1; + me.lineTo(rx * cosStart + cx, ry * sinStart + cy); + me.ellipse(cx, cy, rx, ry, rotation, startAngle, endAngle, area < 0); + } + }, + + /** + * Create an elliptic arc. + * + * See [the whatwg reference of ellipse](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-ellipse). + * + * @param {Number} cx + * @param {Number} cy + * @param {Number} radiusX + * @param {Number} radiusY + * @param {Number} rotation + * @param {Number} startAngle + * @param {Number} endAngle + * @param {Number} anticlockwise + */ + ellipse: function (cx, cy, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) { + var me = this, + coords = me.coords, + start = coords.length, count, + i, j; + if (endAngle - startAngle >= Math.PI * 2) { + me.ellipse(cx, cy, radiusX, radiusY, rotation, startAngle, startAngle + Math.PI, anticlockwise); + me.ellipse(cx, cy, radiusX, radiusY, rotation, startAngle + Math.PI, endAngle, anticlockwise); + return; + } + if (!anticlockwise) { + if (endAngle < startAngle) { + endAngle += Math.PI * 2; + } + count = me.approximateArc(coords, cx, cy, radiusX, radiusY, rotation, startAngle, endAngle); + } else { + if (startAngle < endAngle) { + startAngle += Math.PI * 2; + } + count = me.approximateArc(coords, cx, cy, radiusX, radiusY, rotation, endAngle, startAngle); + for (i = start, j = coords.length - 2; i < j; i += 2, j -= 2) { + var temp = coords[i]; + coords[i] = coords[j]; + coords[j] = temp; + temp = coords[i + 1]; + coords[i + 1] = coords[j + 1]; + coords[j + 1] = temp; + } + } + + if (!me.cursor) { + me.cursor = [coords[coords.length - 2], coords[coords.length - 1]]; + me.types.push('M'); + } else { + me.cursor[0] = coords[coords.length - 2]; + me.cursor[1] = coords[coords.length - 1]; + me.types.push('L'); + } + + for (i = 2; i < count; i += 6) { + me.types.push('C'); + } + me.dirt(); + }, + + /** + * Create an circular arc. + * + * @param {Number} x + * @param {Number} y + * @param {Number} radius + * @param {Number} startAngle + * @param {Number} endAngle + * @param {Number} anticlockwise + */ + arc: function (x, y, radius, startAngle, endAngle, anticlockwise) { + this.ellipse(x, y, radius, radius, 0, startAngle, endAngle, anticlockwise); + }, + + /** + * Draw a rectangle and close it. + * + * @param {Number} x + * @param {Number} y + * @param {Number} width + * @param {Number} height + */ + rect: function (x, y, width, height) { + if (width == 0 || height == 0) { + return; + } + var me = this; + me.moveTo(x, y); + me.lineTo(x + width, y); + me.lineTo(x + width, y + height); + me.lineTo(x, y + height); + me.closePath(); + }, + + /** + * @private + * @param {Array} result + * @param {Number} cx + * @param {Number} cy + * @param {Number} rx + * @param {Number} ry + * @param {Number} phi + * @param {Number} theta1 + * @param {Number} theta2 + * @return {Number} + */ + approximateArc: function (result, cx, cy, rx, ry, phi, theta1, theta2) { + var cosPhi = Math.cos(phi), + sinPhi = Math.sin(phi), + cosTheta1 = Math.cos(theta1), + sinTheta1 = Math.sin(theta1), + xx = cosPhi * cosTheta1 * rx - sinPhi * sinTheta1 * ry, + yx = -cosPhi * sinTheta1 * rx - sinPhi * cosTheta1 * ry, + xy = sinPhi * cosTheta1 * rx + cosPhi * sinTheta1 * ry, + yy = -sinPhi * sinTheta1 * rx + cosPhi * cosTheta1 * ry, + rightAngle = Math.PI / 2, + count = 2, + exx = xx, + eyx = yx, + exy = xy, + eyy = yy, + rho = 0.547443256150549, + temp, y1, x3, y3, x2, y2; + + theta2 -= theta1; + if (theta2 < 0) { + theta2 += Math.PI * 2; + } + result.push(xx + cx, xy + cy); + while (theta2 >= rightAngle) { + result.push( + exx + eyx * rho + cx, exy + eyy * rho + cy, + exx * rho + eyx + cx, exy * rho + eyy + cy, + eyx + cx, eyy + cy + ); + count += 6; + theta2 -= rightAngle; + temp = exx; + exx = eyx; + eyx = -temp; + temp = exy; + exy = eyy; + eyy = -temp; + } + if (theta2) { + y1 = (0.3294738052815987 + 0.012120855841304373 * theta2) * theta2; + x3 = Math.cos(theta2); + y3 = Math.sin(theta2); + x2 = x3 + y1 * y3; + y2 = y3 - y1 * x3; + result.push( + exx + eyx * y1 + cx, exy + eyy * y1 + cy, + exx * x2 + eyx * y2 + cx, exy * x2 + eyy * y2 + cy, + exx * x3 + eyx * y3 + cx, exy * x3 + eyy * y3 + cy + ); + count += 6; + } + return count; + }, + + /** + * [http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes](http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes) + * @param {Number} rx + * @param {Number} ry + * @param {Number} rotation Differ from svg spec, this is radian. + * @param {Number} fA + * @param {Number} fS + * @param {Number} x2 + * @param {Number} y2 + */ + arcSvg: function (rx, ry, rotation, fA, fS, x2, y2) { + if (rx < 0) { + rx = -rx; + } + if (ry < 0) { + ry = -ry; + } + var me = this, + x1 = me.cursor[0], + y1 = me.cursor[1], + hdx = (x1 - x2) / 2, + hdy = (y1 - y2) / 2, + cosPhi = Math.cos(rotation), + sinPhi = Math.sin(rotation), + xp = hdx * cosPhi + hdy * sinPhi, + yp = -hdx * sinPhi + hdy * cosPhi, + ratX = xp / rx, + ratY = yp / ry, + lambda = ratX * ratX + ratY * ratY, + cx = (x1 + x2) * 0.5, cy = (y1 + y2) * 0.5, + cpx = 0, cpy = 0; + if (lambda >= 1) { + lambda = Math.sqrt(lambda); + rx *= lambda; + ry *= lambda; + // me gives lambda == cpx == cpy == 0; + } else { + lambda = Math.sqrt(1 / lambda - 1); + if (fA === fS) { + lambda = -lambda; + } + cpx = lambda * rx * ratY; + cpy = -lambda * ry * ratX; + cx += cosPhi * cpx - sinPhi * cpy; + cy += sinPhi * cpx + cosPhi * cpy; + } + + var theta1 = Math.atan2((yp - cpy) / ry, (xp - cpx) / rx), + deltaTheta = Math.atan2((-yp - cpy) / ry, (-xp - cpx) / rx) - theta1; + + if (fS) { + if (deltaTheta <= 0) { + deltaTheta += Math.PI * 2; + } + } else { + if (deltaTheta >= 0) { + deltaTheta -= Math.PI * 2; + } + } + me.ellipse(cx, cy, rx, ry, rotation, theta1, theta1 + deltaTheta, 1 - fS); + }, + + /** + * Feed the path from svg path string. + * @param {String} pathString + */ + fromSvgString: function (pathString) { + if (!pathString) { + return; + } + var me = this, + parts, + paramCounts = { + a: 7, c: 6, h: 1, l: 2, m: 2, q: 4, s: 4, t: 2, v: 1, z: 0, + A: 7, C: 6, H: 1, L: 2, M: 2, Q: 4, S: 4, T: 2, V: 1, Z: 0 + }, + lastCommand = '', + lastControlX, lastControlY, + lastX = 0, lastY = 0, + part = false, i, partLength, relative; + + // Split the string to items. + if (Ext.isString(pathString)) { + parts = pathString.replace(Ext.draw.Path.pathRe, " $1 ").replace(Ext.draw.Path.pathRe2, " -").split(Ext.draw.Path.pathSplitRe); + } else if (Ext.isArray(pathString)) { + parts = pathString.join(',').split(Ext.draw.Path.pathSplitRe); + } + + // Remove empty entries + for (i = 0, partLength = 0; i < parts.length; i++) { + if (parts[i] !== '') { + parts[partLength++] = parts[i]; + } + } + parts.length = partLength; + + me.clear(); + for (i = 0; i < parts.length;) { + lastCommand = part; + part = parts[i]; + relative = (part.toUpperCase() !== part); + i++; + switch (part) { + case 'M': + me.moveTo(lastX = +parts[i], lastY = +parts[i + 1]); + i += 2; + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.lineTo(lastX = +parts[i], lastY = +parts[i + 1]); + i += 2; + } + break; + case 'L': + me.lineTo(lastX = +parts[i], lastY = +parts[i + 1]); + i += 2; + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.lineTo(lastX = +parts[i], lastY = +parts[i + 1]); + i += 2; + } + break; + case 'A': + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.arcSvg( + +parts[i], +parts[i + 1], + +parts[i + 2] * Math.PI / 180, + +parts[i + 3], +parts[i + 4], + lastX = +parts[i + 5], lastY = +parts[i + 6]); + i += 7; + } + break; + case 'C': + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.bezierCurveTo( + +parts[i ], +parts[i + 1], + lastControlX = +parts[i + 2], lastControlY = +parts[i + 3], + lastX = +parts[i + 4], lastY = +parts[i + 5]); + i += 6; + } + break; + case 'Z': + me.closePath(); + break; + case 'm': + me.moveTo(lastX += +parts[i], lastY += +parts[i + 1]); + i += 2; + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.lineTo(lastX += +parts[i], lastY += +parts[i + 1]); + i += 2; + } + break; + case 'l': + me.lineTo(lastX += +parts[i], lastY += +parts[i + 1]); + i += 2; + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.lineTo(lastX += +parts[i], lastY += +parts[i + 1]); + i += 2; + } + break; + case 'a': + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.arcSvg( + +parts[i], +parts[i + 1], + +parts[i + 2] * Math.PI / 180, + +parts[i + 3], +parts[i + 4], + lastX += +parts[i + 5], lastY += +parts[i + 6]); + i += 7; + } + break; + case 'c': + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.bezierCurveTo(lastX + (+parts[i]), lastY + (+parts[i + 1]), + lastControlX = lastX + (+parts[i + 2]), lastControlY = lastY + (+parts[i + 3]), + lastX += +parts[i + 4], lastY += +parts[i + 5]); + i += 6; + } + break; + case 'z': + me.closePath(); + break; + case 's': + if (!(lastCommand === 'c' || lastCommand === 'C' || lastCommand === 's' || lastCommand === 'S')) { + lastControlX = lastX; + lastControlY = lastY; + } + + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.bezierCurveTo( + lastX + lastX - lastControlX, lastY + lastY - lastControlY, + lastControlX = lastX + (+parts[i]), lastControlY = lastY + (+parts[i + 1]), + lastX += +parts[i + 2], lastY += +parts[i + 3]); + i += 4; + } + break; + case 'S': + if (!(lastCommand === 'c' || lastCommand === 'C' || lastCommand === 's' || lastCommand === 'S')) { + lastControlX = lastX; + lastControlY = lastY; + } + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.bezierCurveTo( + lastX + lastX - lastControlX, lastY + lastY - lastControlY, + lastControlX = +parts[i], lastControlY = +parts[i + 1], + lastX = (+parts[i + 2]), lastY = (+parts[i + 3])); + i += 4; + } + break; + case 'q': + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.quadraticCurveTo( + lastControlX = lastX + (+parts[i]), lastControlY = lastY + (+parts[i + 1]), + lastX += +parts[i + 2], lastY += +parts[i + 3]); + i += 4; + } + break; + case 'Q': + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.quadraticCurveTo( + lastControlX = +parts[i], lastControlY = +parts[i + 1], + lastX = +parts[i + 2], lastY = +parts[i + 3]); + i += 4; + } + break; + case 't': + if (!(lastCommand === 'q' || lastCommand === 'Q' || lastCommand === 't' || lastCommand === 'T')) { + lastControlX = lastX; + lastControlY = lastY; + } + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.quadraticCurveTo( + lastControlX = lastX + lastX - lastControlX, lastControlY = lastY + lastY - lastControlY, + lastX += +parts[i + 1], lastY += +parts[i + 2]); + i += 2; + } + break; + case 'T': + if (!(lastCommand === 'q' || lastCommand === 'Q' || lastCommand === 't' || lastCommand === 'T')) { + lastControlX = lastX; + lastControlY = lastY; + } + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.quadraticCurveTo( + lastControlX = lastX + lastX - lastControlX, lastControlY = lastY + lastY - lastControlY, + lastX = (+parts[i + 1]), lastY = (+parts[i + 2])); + i += 2; + } + break; + case 'h': + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.lineTo(lastX += +parts[i], lastY); + i++; + } + break; + case 'H': + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.lineTo(lastX = +parts[i], lastY); + i++; + } + break; + case 'v': + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.lineTo(lastX, lastY += +parts[i]); + i++; + } + break; + case 'V': + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.lineTo(lastX, lastY = +parts[i]); + i++; + } + break; + } + } + }, + + /** + * @private + * @param {Number} x1 + * @param {Number} y1 + * @param {Number} x2 + * @param {Number} y2 + * @param {Number} x + * @param {Number} y + * @return {Number} + */ + rayTestLine: function (x1, y1, x2, y2, x, y) { + var cx; + if (y1 === y2) { + if (y === y1) { + if (Math.min(x1, x2) <= x && x <= Math.max(x1, x2)) { + return -1; + } + } else { + return 0; + } + } + if (y1 < y && y < y2 || y2 < y && y < y1) { + cx = (y - y1) * (x2 - x1) / (y2 - y1) + x1; + if (cx === x) { + return -1; + } else if (cx < x) { + return 0; + } else { + return 1; + } + } else { + return 0; + } + }, + + /** + * @private + * @param {Number} x1 + * @param {Number} y1 + * @param {Number} x2 + * @param {Number} y2 + * @param {Number} x3 + * @param {Number} y3 + * @param {Number} x4 + * @param {Number} y4 + * @param {Number} x + * @param {Number} y + * @param {Number} idx + * @return {*} + */ + rayTestCubicBezier: function (x1, y1, x2, y2, x3, y3, x4, y4, x, y, idx) { + if (Math.min(x1, x2, x3, x4) <= x && x <= Math.max(x1, x2, x3, x4)) { + if (Math.min(y1, y2, y3, y4) <= y && y <= Math.max(y1, y2, y3, y4)) { + var me = this, + solver = me.solvers[idx] || (me.solvers[idx] = Ext.draw.Solver.createBezierSolver(x1, x2, x3, x4)), + result = solver.solve(y); + return (+(x <= result[0] && 0 <= result[0] && result[0] <= 1)) + + (+(x <= result[1] && 0 <= result[1] && result[1] <= 1)) + + (+(x <= result[2] && 0 <= result[2] && result[2] <= 1)); + } + } + return 0; + }, + + /** + * Test whether the given point is on or inside the path. + * @param {Number} x + * @param {Number} y + * @return {Boolean} + */ + isPointInPath: function (x, y) { + var me = this, + i, j, count = 0, test = 0, + types = me.types, + coords = me.coords, + ln = types.length, firstX = null, firstY = null, lastX = 0, lastY = 0; + for (i = 0, j = 0; i < ln; i++) { + switch (types[i]) { + case 'M': + if (firstX !== null) { + test = me.rayTestLine(firstX, firstY, lastX, lastY, x, y); + if (test < 0) { + count += 1; + } else { + count += test; + } + } + firstX = lastX = coords[j]; + firstY = lastY = coords[j + 1]; + j += 2; + break; + case 'L': + test = me.rayTestLine(lastX, lastY, coords[j], coords[j + 1], x, y); + if (test < 0) { + return true; + } + count += test; + lastX = coords[j]; + lastY = coords[j + 1]; + j += 2; + break; + case 'C': + test = me.rayTestCubicBezier( + lastX, lastY, + coords[j], coords[j + 1], + coords[j + 2], coords[j + 3], + coords[j + 4], coords[j + 5], + x, y, i); + if (test < 0) { + return true; + } + count += test; + lastX = coords[j + 4]; + lastY = coords[j + 5]; + j += 6; + break; + case 'Z': + break; + } + } + return count % 2 === 1; + }, + + /** + * Clone this path. + * @return {Ext.draw.Path} + */ + clone: function () { + var me = this, + path = new Ext.draw.Path(); + path.coords = me.coords.slice(0); + path.types = me.types.slice(0); + path.cursor = me.cursor ? me.cursor.slice(0) : null; + path.startX = me.startX; + path.startY = me.startY; + path.svgString = me.svgString; + return path; + }, + + /** + * Transform the current path by a matrix. + * @param {Ext.draw.Matrix} matrix + */ + transform: function (matrix) { + if (matrix.isIdentity()) { + return; + } + var xx = matrix.getXX(), yx = matrix.getYX(), dx = matrix.getDX(), + xy = matrix.getXY(), yy = matrix.getYY(), dy = matrix.getDY(), + coords = this.coords, + i = 0, ln = coords.length, + x, y; + + for (; i < ln; i += 2) { + x = coords[i]; + y = coords[i + 1]; + coords[i] = x * xx + y * yx + dx; + coords[i + 1] = x * xy + y * yy + dy; + } + this.dirt(); + }, + + /** + * Get the bounding box of this matrix. + * @param {Object} [target] Optional object to receive the result. + * + * @return {Object} Object with x, y, width and height + */ + getDimension: function (target) { + if (!target) { + target = {}; + } + + if (!this.types || !this.types.length) { + target.x = 0; + target.y = 0; + target.width = 0; + target.height = 0; + return target; + } + + target.left = Infinity; + target.top = Infinity; + target.right = -Infinity; + target.bottom = -Infinity; + var i = 0, j = 0, + types = this.types, + coords = this.coords, + ln = types.length, x, y; + for (; i < ln; i++) { + switch (types[i]) { + case 'M': + case 'L': + x = coords[j]; + y = coords[j + 1]; + target.left = Math.min(x, target.left); + target.top = Math.min(y, target.top); + target.right = Math.max(x, target.right); + target.bottom = Math.max(y, target.bottom); + j += 2; + break; + case 'C': + this.expandDimension(target, x, y, + coords[j], coords[j + 1], + coords[j + 2], coords[j + 3], + x = coords[j + 4], y = coords[j + 5]); + j += 6; + break; + } + } + + target.x = target.left; + target.y = target.top; + target.width = target.right - target.left; + target.height = target.bottom - target.top; + return target; + }, + + /** + * Get the bounding box as if the path is transformed by a matrix. + * + * @param {Ext.draw.Matrix} matrix + * @param {Object} [target] Optional object to receive the result. + * + * @return {Object} An object with x, y, width and height. + */ + getDimensionWithTransform: function (matrix, target) { + if (!this.types || !this.types.length) { + if (!target) { + target = {}; + } + target.x = 0; + target.y = 0; + target.width = 0; + target.height = 0; + return target; + } + + target.left = Infinity; + target.top = Infinity; + target.right = -Infinity; + target.bottom = -Infinity; + + var xx = matrix.getXX(), yx = matrix.getYX(), dx = matrix.getDX(), + xy = matrix.getXY(), yy = matrix.getYY(), dy = matrix.getDY(), + i = 0, j = 0, + types = this.types, + coords = this.coords, + ln = types.length, x, y; + for (; i < ln; i++) { + switch (types[i]) { + case 'M': + case 'L': + x = coords[j] * xx + coords[j + 1] * yx + dx; + y = coords[j] * xy + coords[j + 1] * yy + dy; + target.left = Math.min(x, target.left); + target.top = Math.min(y, target.top); + target.right = Math.max(x, target.right); + target.bottom = Math.max(y, target.bottom); + j += 2; + break; + case 'C': + this.expandDimension(target, + x, y, + coords[j] * xx + coords[j + 1] * yx + dx, + coords[j] * xy + coords[j + 1] * yy + dy, + coords[j + 2] * xx + coords[j + 3] * yx + dx, + coords[j + 2] * xy + coords[j + 3] * yy + dy, + x = coords[j + 4] * xx + coords[j + 5] * yx + dx, + y = coords[j + 4] * xy + coords[j + 5] * yy + dy); + j += 6; + break; + } + } + if (!target) { + target = {}; + } + target.x = target.left; + target.y = target.top; + target.width = target.right - target.left; + target.height = target.bottom - target.top; + return target; + }, + + /** + * @private + * Expand the rect by the bbox of a bezier curve. + * + * @param {Object} target + * @param {Number} x1 + * @param {Number} y1 + * @param {Number} cx1 + * @param {Number} cy1 + * @param {Number} cx2 + * @param {Number} cy2 + * @param {Number} x2 + * @param {Number} y2 + */ + expandDimension: function (target, x1, y1, cx1, cy1, cx2, cy2, x2, y2) { + var me = this, + l = target.left, r = target.right, t = target.top, b = target.bottom, + dim = me.dim || (me.dim = []); + + me.curveDimension(x1, cx1, cx2, x2, dim); + l = Math.min(l, dim[0]); + r = Math.max(r, dim[1]); + + me.curveDimension(y1, cy1, cy2, y2, dim); + t = Math.min(t, dim[0]); + b = Math.max(b, dim[1]); + + target.left = l; + target.right = r; + target.top = t; + target.bottom = b; + }, + + /** + * @private + * Determine the curve + * @param {Number} a + * @param {Number} b + * @param {Number} c + * @param {Number} d + * @param {Number} dim + */ + curveDimension: function (a, b, c, d, dim) { + var qa = 3 * (-a + 3 * (b - c) + d), + qb = 6 * (a - 2 * b + c), + qc = -3 * (a - b), x, y, + min = Math.min(a, d), + max = Math.max(a, d), delta; + + if (qa === 0) { + if (qb === 0) { + dim[0] = min; + dim[1] = max; + return; + } else { + x = -qc / qb; + if (0 < x && x < 1) { + y = this.interpolate(a, b, c, d, x); + min = Math.min(min, y); + max = Math.max(max, y); + } + } + } else { + delta = qb * qb - 4 * qa * qc; + if (delta >= 0) { + delta = Math.sqrt(delta); + x = (delta - qb) / 2 / qa; + if (0 < x && x < 1) { + y = this.interpolate(a, b, c, d, x); + min = Math.min(min, y); + max = Math.max(max, y); + } + if (delta > 0) { + x -= delta / qa; + if (0 < x && x < 1) { + y = this.interpolate(a, b, c, d, x); + min = Math.min(min, y); + max = Math.max(max, y); + } + } + } + } + dim[0] = min; + dim[1] = max; + }, + + /** + * @private + * + * Returns `a * (1 - t) ^ 3 + 3 * b (1 - t) ^ 2 * t + 3 * c (1 - t) * t ^ 3 + d * t ^ 3`. + * + * @param {Number} a + * @param {Number} b + * @param {Number} c + * @param {Number} d + * @param {Number} t + * @return {Number} + */ + interpolate: function (a, b, c, d, t) { + if (t === 0) { + return a; + } + if (t === 1) { + return d; + } + var rate = (1 - t) / t; + return t * t * t * (d + rate * (3 * c + rate * (3 * b + rate * a))); + }, + + /** + * Reconstruct path from cubic bezier curve stripes. + * @param {Array} stripes + */ + fromStripes: function (stripes) { + var me = this, + i = 0, ln = stripes.length, + j, ln2, stripe; + me.clear(); + for (; i < ln; i++) { + stripe = stripes[i]; + me.coords.push.apply(me.coords, stripe); + me.types.push('M'); + for (j = 2, ln2 = stripe.length; j < ln2; j += 6) { + me.types.push('C'); + } + } + if (!me.cursor) { + me.cursor = []; + } + me.cursor[0] = me.coords[me.coords.length - 2]; + me.cursor[1] = me.coords[me.coords.length - 1]; + me.dirt(); + }, + + /** + * Convert path to bezier curve stripes. + * @param {Array} [target] The optional array to receive the result. + * @return {Array} + */ + toStripes: function (target) { + var stripes = target || [], curr, + x, y, lastX, lastY, startX, startY, + i, j, + types = this.types, + coords = this.coords, + ln = types.length; + for (i = 0, j = 0; i < ln; i++) { + switch (types[i]) { + case 'M': + curr = [startX = lastX = coords[j++], startY = lastY = coords[j++]]; + stripes.push(curr); + break; + case 'L': + x = coords[j++]; + y = coords[j++]; + curr.push((lastX + lastX + x) / 3, (lastY + lastY + y) / 3, (lastX + x + x) / 3, (lastY + y + y) / 3, lastX = x, lastY = y); + break; + case 'C': + curr.push(coords[j++], coords[j++], coords[j++], coords[j++], lastX = coords[j++], lastY = coords[j++]); + break; + case 'Z': + x = startX; + y = startY; + curr.push((lastX + lastX + x) / 3, (lastY + lastY + y) / 3, (lastX + x + x) / 3, (lastY + y + y) / 3, lastX = x, lastY = y); + break; + } + } + return stripes; + }, + + /** + * @private + * Update cache for svg string of this path. + */ + updateSvgString: function () { + var result = [], + types = this.types, + coords = this.coords, + ln = types.length, + i = 0, j = 0; + for (; i < ln; i++) { + switch (types[i]) { + case 'M': + result.push('M' + coords[j] + ',' + coords[j + 1]); + j += 2; + break; + case 'L': + result.push('L' + coords[j] + ',' + coords[j + 1]); + j += 2; + break; + case 'C': + result.push('C' + coords[j] + ',' + coords[j + 1] + ' ' + + coords[j + 2] + ',' + coords[j + 3] + ' ' + + coords[j + 4] + ',' + coords[j + 5]); + j += 6; + break; + case 'Z': + result.push('Z'); + break; + } + } + this.svgString = result.join(''); + }, + + /** + * Return an svg path string for this path. + * @return {String} + */ + toString: function () { + if (!this.svgString) { + this.updateSvgString(); + } + return this.svgString; + } +}); + +/** + * @class Ext.draw.sprite.Path + * @extends Ext.draw.sprite.Sprite + * + * A sprite that represents a path. + * + * @example preview miniphone + * var component = new Ext.draw.Component({ + * items: [{ + * type: 'path', + * path: 'M75,75 c0,-25 50,25 50,0 c0,-25 -50,25 -50,0', + * fillStyle: 'blue' + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(component); + */ +Ext.define('Ext.draw.sprite.Path', { + extend: Ext.draw.sprite.Sprite , + + alias: 'sprite.path', + type: 'path', + inheritableStatics: { + def: { + processors: { + /** + * @cfg {String} path The SVG based path string used by the sprite. + */ + path: function (n, o) { + if (!(n instanceof Ext.draw.Path)) { + n = new Ext.draw.Path(n); + } + return n; + } + }, + aliases: { + d: 'path' + }, + dirtyTriggers: { + path: 'bbox' + }, + updaters: { + path: function (attr) { + var path = attr.path; + if (!path || path.bindAttr !== attr) { + path = new Ext.draw.Path(); + path.bindAttr = attr; + attr.path = path; + } + path.clear(); + this.updatePath(path, attr); + attr.dirtyFlags.bbox = ['path']; + } + } + } + }, + + updatePlainBBox: function (plain) { + if (this.attr.path) { + this.attr.path.getDimension(plain); + } + }, + + updateTransformedBBox: function (transform) { + if (this.attr.path) { + this.attr.path.getDimensionWithTransform(this.attr.matrix, transform); + } + }, + + render: function (surface, ctx) { + var mat = this.attr.matrix, + attr = this.attr; + if (!attr.path || attr.path.coords.length === 0) { + return; + } + mat.toContext(ctx); + ctx.appendPath(attr.path); + ctx.fillStroke(attr); + }, + + /** + * Update the path. + * @param {Ext.draw.Path} path An empty path to draw on using path API. + * @param {Object} attr The attribute object. Note: DO NOT use the `sprite.attr` instead of this + * if you want to work with instancing. + */ + updatePath: function (path, attr) {} +}); + +/** + * @class Ext.draw.sprite.Circle + * @extends Ext.draw.sprite.Path + * + * A sprite that represents a circle. + * + * @example preview miniphone + * new Ext.draw.Component({ + * fullscreen: true, + * items: [{ + * type: 'circle', + * cx: 100, + * cy: 100, + * r: 25, + * fillStyle: 'blue' + * }] + * }); + * + */ +Ext.define("Ext.draw.sprite.Circle", { + extend: Ext.draw.sprite.Path , + alias: 'sprite.circle', + type: 'circle', + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Number} [cx=0] The center coordinate of the sprite on the x-axis. + */ + cx: "number", + + /** + * @cfg {Number} [cy=0] The center coordinate of the sprite on the y-axis. + */ + cy: "number", + + /** + * @cfg {Number} [r=0] The radius of the sprite. + */ + r: "number" + }, + aliases: { + radius: "r", + x: "cx", + y: "cy", + centerX: "cx", + centerY: "cy" + }, + defaults: { + cx: 0, + cy: 0, + r: 0 + }, + dirtyTriggers: { + cx: 'path', + cy: 'path', + r: 'path' + } + } + }, + + updatePlainBBox: function (plain) { + var attr = this.attr, + cx = attr.cx, + cy = attr.cy, + r = attr.r; + plain.x = cx - r; + plain.y = cy - r; + plain.width = r + r; + plain.height = r + r; + }, + + updateTransformedBBox: function (transform) { + var attr = this.attr, + cx = attr.cx, + cy = attr.cy, + r = attr.r, + matrix = attr.matrix, + scalesX = matrix.getScaleX(), + scalesY = matrix.getScaleY(), + w, h; + w = scalesX * r; + h = scalesY * r; + transform.x = matrix.x(cx, cy) - w; + transform.y = matrix.y(cx, cy) - h; + transform.width = w + w; + transform.height = h + h; + }, + + updatePath: function (path, attr) { + path.arc(attr.cx, attr.cy, attr.r, 0, Math.PI * 2, false); + } +}); + +/** + * @class Ext.draw.sprite.Ellipse + * @extends Ext.draw.sprite.Path + * + * A sprite that represents an ellipse. + * + * @example preview miniphone + * var component = new Ext.draw.Component({ + * items: [{ + * type: 'ellipse', + * cx: 100, + * cy: 100, + * rx: 40, + * ry: 25, + * fillStyle: 'blue' + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(component); + */ +Ext.define("Ext.draw.sprite.Ellipse", { + extend: Ext.draw.sprite.Path , + alias: 'sprite.ellipse', + type: 'circle', + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Number} [cx=0] The center coordinate of the sprite on the x-axis. + */ + cx: "number", + + /** + * @cfg {Number} [cy=0] The center coordinate of the sprite on the y-axis. + */ + cy: "number", + + /** + * @cfg {Number} [rx=1] The radius of the sprite on the x-axis. + */ + rx: "number", + + /** + * @cfg {Number} [ry=1] The radius of the sprite on the y-axis. + */ + ry: "number", + + /** + * @cfg {Number} [axisRotation=0] The rotation of the sprite about its axis. + */ + axisRotation: "number" + }, + aliases: { + radius: "r", + x: "cx", + y: "cy", + centerX: "cx", + centerY: "cy", + radiusX: "rx", + radiusY: "ry" + }, + defaults: { + cx: 0, + cy: 0, + rx: 1, + ry: 1, + axisRotation: 0 + }, + dirtyTriggers: { + cx: 'path', + cy: 'path', + rx: 'path', + ry: 'path', + axisRotation: 'path' + } + } + }, + + updatePlainBBox: function (plain) { + var attr = this.attr, + cx = attr.cx, + cy = attr.cy, + rx = attr.rx, + ry = attr.ry; + plain.x = cx - rx; + plain.y = cy - ry; + plain.width = rx + rx; + plain.height = ry + ry; + }, + + updateTransformedBBox: function (transform) { + var attr = this.attr, + cx = attr.cx, + cy = attr.cy, + rx = attr.rx, + ry = attr.ry, + rxy = ry / rx, + matrix = attr.matrix.clone(), + xx, xy, yx, yy, dx, dy, w, h; + matrix.append(1, 0, 0, rxy, 0, cy * (1 - rxy)); + xx = matrix.getXX(); + yx = matrix.getYX(); + dx = matrix.getDX(); + xy = matrix.getXY(); + yy = matrix.getYY(); + dy = matrix.getDY(); + w = Math.sqrt(xx * xx + yx * yx) * rx; + h = Math.sqrt(xy * xy + yy * yy) * rx; + transform.x = cx * xx + cy * yx + dx - w; + transform.y = cx * xy + cy * yy + dy - h; + transform.width = w + w; + transform.height = h + h; + }, + + updatePath: function (path, attr) { + path.ellipse(attr.cx, attr.cy, attr.rx, attr.ry, attr.axisRotation, 0, Math.PI * 2, false); + } +}); + +/** + * Utility class to provide a way to *approximately* measure the dimension of texts without a drawing context. + */ +Ext.define("Ext.draw.TextMeasurer", { + singleton: true, + + + + measureDiv: null, + measureCache: {}, + + /** + * @private Measure the size of a text with specific font by using DOM to measure it. + * Could be very expensive therefore should be used lazily. + * @param {String} text + * @param {String} font + * @return {Object} An object with `width` and `height` properties. + * @return {Number} return.width + * @return {Number} return.height + */ + actualMeasureText: function (text, font) { + var me = Ext.draw.TextMeasurer, + measureDiv = me.measureDiv, + FARAWAY = 100000, + size; + + if (!measureDiv) { + var parent = Ext.Element.create({ + style: { + "overflow": "hidden", + "position": "relative", + "float": "left", // DO NOT REMOVE THE QUOTE OR IT WILL BREAK COMPRESSOR + "width": 0, + "height": 0 + } + }); + me.measureDiv = measureDiv = Ext.Element.create({}); + measureDiv.setStyle({ + "position": 'absolute', + "x": FARAWAY, + "y": FARAWAY, + "z-index": -FARAWAY, + "white-space": "nowrap", + "display": 'block', + "padding": 0, + "margin": 0 + }); + Ext.getBody().appendChild(parent); + parent.appendChild(measureDiv); + } + if (font) { + measureDiv.setStyle({ + font: font, + lineHeight: 'normal' + }); + } + measureDiv.setText('(' + text + ')'); + size = measureDiv.getSize(); + measureDiv.setText('()'); + size.width -= measureDiv.getSize().width; + return size; + }, + + /** + * Measure a single-line text with specific font. + * This will split the text to characters and add up their size. + * That may *not* be the exact size of the text as it is displayed. + * @param {String} text + * @param {String} font + * @return {Object} An object with `width` and `height` properties. + * @return {Number} return.width + * @return {Number} return.height + */ + measureTextSingleLine: function (text, font) { + text = text.toString(); + var cache = this.measureCache, + chars = text.split(''), + width = 0, + height = 0, + cachedItem, charactor, i, ln, size; + + if (!cache[font]) { + cache[font] = {}; + } + cache = cache[font]; + + if (cache[text]) { + return cache[text]; + } + + for (i = 0, ln = chars.length; i < ln; i++) { + charactor = chars[i]; + if (!(cachedItem = cache[charactor])) { + size = this.actualMeasureText(charactor, font); + cachedItem = cache[charactor] = size; + } + width += cachedItem.width; + height = Math.max(height, cachedItem.height); + } + return cache[text] = { + width: width, + height: height + }; + }, + + /** + * Measure a text with specific font. + * This will split the text to lines and add up their size. + * That may *not* be the exact size of the text as it is displayed. + * @param {String} text + * @param {String} font + * @return {Object} An object with `width`, `height` and `sizes` properties. + * @return {Number} return.width + * @return {Number} return.height + * @return {Array} return.sizes Results of individual line measurements, in case of multiline text. + */ + measureText: function (text, font) { + var lines = text.split('\n'), + ln = lines.length, + height = 0, + width = 0, + line, i, + sizes; + + if (ln === 1) { + return this.measureTextSingleLine(text, font); + } + + sizes = []; + for (i = 0; i < ln; i++) { + line = this.measureTextSingleLine(lines[i], font); + sizes.push(line); + height += line.height; + width = Math.max(width, line.width); + } + + return { + width: width, + height: height, + sizes: sizes + }; + } +}); + +/** + * @class Ext.draw.sprite.Text + * @extends Ext.draw.sprite.Sprite + * + * A sprite that represents text. + * + * @example preview miniphone + * var component = new Ext.draw.Component({ + * items: [{ + * type: 'text', + * x: 50, + * y: 50, + * text: 'Sencha', + * fontSize: 18, + * fillStyle: 'blue' + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(component); + */ +Ext.define("Ext.draw.sprite.Text", { + extend: Ext.draw.sprite.Sprite , + + alias: 'sprite.text', + type: 'text', + lineBreakRe: /\n/g, + inheritableStatics: { + shortHand1Re: /'(.*)'/g, + shortHand2Re: / /g, + shortHand3Re: /\s*,\s*/g, + shortHand4Re: /\$\$\$\$/g, + def: { + processors: { + /** + * @cfg {Number} [x=0] The position of the sprite on the x-axis. + */ + x: "number", + + /** + * @cfg {Number} [y=0] The position of the sprite on the y-axis. + */ + y: "number", + + /** + * @cfg {String} [text=''] The text represented in the sprite. + */ + text: "string", + + /** + * @cfg {String/Number} [fontSize='10px'] The size of the font displayed. + */ + fontSize: function (n) { + if (!isNaN(n)) { + return +n + 'px'; + } else if (n.match(Ext.dom.Element.unitRe)) { + return n; + } + }, + + /** + * @cfg {String} [fontStyle=''] The style of the font displayed. {normal, italic, oblique} + */ + fontStyle: "enums(,italic,oblique)", + + /** + * @cfg {String} [fontVariant=''] The variant of the font displayed. {normal, small-caps} + */ + fontVariant: "enums(,small-caps)", + + /** + * @cfg {String} [fontWeight=''] The weight of the font displayed. {normal, bold, bolder, lighter} + */ + fontWeight: (function (fontWeights) { + return function (n) { + if (!n) { + return ""; + } else if (n === 'normal') { + return ''; + } else if (!isNaN(n)) { + n = +n; + if (100 <= n && n <= 900) { + return n; + } + } else if (n in fontWeights) { + return n; + } + }; + })({"normal": true, "bold": true, "bolder": true, "lighter": true}), + + /** + * @cfg {String} [fontFamily='sans-serif'] The family of the font displayed. + */ + fontFamily: "string", + + /** + * @cfg {String} [textAlign='start'] The alignment of the text displayed. {left, right, center, start, end} + */ + textAlign: (function (textAligns) { + return function (n) { + if (n === 'middle') { + return 'center'; + } else if (!n) { + return "center"; + } else if (!Ext.isString(n)) { + return undefined; + } else if (n in textAligns) { + return n; + } + }; + })({"left": true, "right": true, "center": true, "start": true, "end": true}), + + /** + * @cfg {String} [textBaseline="alphabetic"] The baseline of the text displayed. {top, hanging, middle, alphabetic, ideographic, bottom} + */ + textBaseline: (function (textBaselines) { + return function (n) { + if (n === false) { + return "alphabetic"; + } else if (n in textBaselines) { + return n; + } else if (n === 'center') { + return 'middle'; + } + }; + })({"top": true, "hanging": true, "middle": true, "alphabetic": true, "ideographic": true, "bottom": true}), + + /** + * @cfg {String} [font='10px sans-serif'] The font displayed. + */ + font: "string" + }, + aliases: { + "font-size": "fontSize", + "font-family": "fontFamily", + "font-weight": "fontWeight", + "font-variant": "fontVariant", + "text-anchor": "textAlign" + }, + defaults: { + fontStyle: '', + fontVariant: '', + fontWeight: '', + fontSize: '10px', + fontFamily: 'sans-serif', + font: '10px sans-serif', + textBaseline: "alphabetic", + textAlign: "start", + strokeStyle: 'rgba(0, 0, 0, 0)', + divBased: true, + fillStyle: '#000', + x: 0, + y: 0, + text: '' + }, + dirtyTriggers: { + fontStyle: 'font,bbox', + fontVariant: 'font,bbox', + fontWeight: 'font,bbox', + fontSize: 'font,bbox', + fontFamily: 'font,bbox', + font: 'font-short-hand,bbox,canvas', + textBaseline: 'bbox', + textAlign: 'bbox', + x: "bbox", + y: "bbox", + text: "bbox" + }, + updaters: { + "font-short-hand": (function (dispatcher) { + return function (attrs) { + // TODO: Do this according to http://www.w3.org/TR/CSS21/fonts.html#font-shorthand + var value = attrs.font, + parts, part, i, ln, dispKey; + value = value.replace(Ext.draw.sprite.Text.shortHand1Re, function (a, arg1) { + return arg1.replace(Ext.draw.sprite.Text.shortHand2Re, '$$$$'); + }); + value = value.replace(Ext.draw.sprite.Text.shortHand3Re, ','); + parts = value.split(' '); + + attrs = {}; + for (i = 0, ln = parts.length; i < ln; i++) { + part = parts[i]; + dispKey = dispatcher[part]; + if (dispKey) { + attrs[dispKey] = part; + } else if (part.match(Ext.dom.Element.unitRe)) { + attrs.fontSize = part; + } else { + attrs.fontFamily = part.replace(Ext.draw.sprite.Text.shortHand4Re, ' '); + } + } + this.setAttributes(attrs, true); + }; + })({ + "italic": "fontStyles", + "oblique": "fontStyles", + "bold": "fontWeights", + "bolder": "fontWeights", + "lighter": "fontWeights", + "100": "fontWeights", + "200": "fontWeights", + "300": "fontWeights", + "400": "fontWeights", + "500": "fontWeights", + "600": "fontWeights", + "700": "fontWeights", + "800": "fontWeights", + "900": "fontWeights", + "small-caps": "fontVariant" + }), + "font": function (attrs) { + var font = ''; + if (attrs.fontWeight) { + font += attrs.fontWeight + ' '; + } + if (attrs.fontVariant) { + font += attrs.fontVariant + ' '; + } + if (attrs.fontSize) { + font += attrs.fontSize + ' '; + } + if (attrs.fontFamily) { + font += attrs.fontFamily + ' '; + } + this.setAttributes({ + font: font.substr(0, font.length - 1) + }, true); + } + } + } + }, + + constructor: function (config) { + Ext.draw.sprite.Sprite.prototype.constructor.call(this, config); + }, + + updatePlainBBox: function (plain) { + var me = this, + attr = me.attr, + x = attr.x, + y = attr.y, + dx = [], + font = attr.font, + text = attr.text, + baseline = attr.textBaseline, + alignment = attr.textAlign, + size = Ext.draw.TextMeasurer.measureText(text, font), + sizes = size.sizes, + height = size.height, + width = size.width, + ln = sizes ? sizes.length : 0, + i = 0; + + switch (baseline) { + case 'hanging' : + case 'top': + break; + case 'ideographic' : + case 'bottom' : + y -= height; + break; + case 'alphabetic' : + y -= height * 0.8; + break; + case 'middle' : + case 'center' : + y -= height * 0.5; + break; + } + switch (alignment) { + case 'end' : + case 'right' : + x -= width; + for (; i < ln; i++) { + dx.push(width - sizes[i].width); + } + break; + case 'middle' : + case 'center' : + x -= width * 0.5; + for (; i < ln; i++) { + dx.push((width - sizes[i].width) * 0.5); + } + break; + } + + attr.textAlignOffsets = dx; + + plain.x = x; + plain.y = y; + plain.width = width; + plain.height = height; + }, + + setText: function (text) { + this.setAttributes({text: text}, true); + }, + + setElementStyles: function (element, styles) { + var stylesCache = element.stylesCache || (element.stylesCache = {}), + style = element.dom.style, + name; + for (name in styles) { + if (stylesCache[name] !== styles[name]) { + stylesCache[name] = style[name] = styles[name]; + } + } + }, + + render: function (surface, ctx) { + var attr = this.attr, + mat = Ext.draw.Matrix.fly(attr.matrix.elements.slice(0)), + bbox = this.getBBox(true), + dx = attr.textAlignOffsets, + x, y, i, lines; + if (attr.text.length === 0) { + return; + } + + lines = attr.text.split('\n'); + // Simulate textBaseline and textAlign. + x = attr.bbox.plain.x; + y = attr.bbox.plain.y; + mat.toContext(ctx); + for (i = 0; i < lines.length; i++) { + if (ctx.fillStyle !== 'rgba(0, 0, 0, 0)') { + ctx.fillText(lines[i], x + (dx[i] || 0), y + bbox.height / lines.length * i); + } + if (ctx.strokeStyle !== 'rgba(0, 0, 0, 0)') { + ctx.strokeText(lines[i], x + (dx[i] || 0), y + bbox.height / lines.length * i); + } + } + } +}); + +/** + * @class Ext.draw.sprite.EllipticalArc + * @extends Ext.draw.sprite.Ellipse + * + * A sprite that represents an elliptical arc. + * + * @example preview miniphone + * var component = new Ext.draw.Component({ + * items: [{ + * type: 'ellipticalArc', + * cx: 100, + * cy: 100, + * rx: 40, + * ry: 25, + * fillStyle: 'blue', + * startAngle: 0, + * endAngle: Math.PI, + * anticlockwise: true + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(component); + */ +Ext.define("Ext.draw.sprite.EllipticalArc", { + extend: Ext.draw.sprite.Ellipse , + alias: 'sprite.ellipticalArc', + type: 'ellipticalArc', + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Number} [startAngle=0] The beginning angle of the arc. + */ + startAngle: "number", + + /** + * @cfg {Number} [endAngle=Math.PI*2] The ending angle of the arc. + */ + endAngle: "number", + + /** + * @cfg {Boolean} [anticlockwise=false] Determines whether or not the arc is drawn clockwise. + */ + anticlockwise: "bool" + }, + aliases: { + from: "startAngle", + to: "endAngle", + start: "startAngle", + end: "endAngle" + }, + defaults: { + startAngle: 0, + endAngle: Math.PI * 2, + anticlockwise: false + }, + dirtyTriggers: { + startAngle: 'path', + endAngle: 'path', + anticlockwise: 'path' + } + } + }, + + updatePath: function (path, attr) { + path.ellipse(attr.cx, attr.cy, attr.rx, attr.ry, attr.axisRotation, attr.startAngle, attr.endAngle, attr.anticlockwise); + } +}); + +/** + * @class Ext.draw.sprite.Sector + * @extends Ext.draw.sprite.Path + * + * A sprite representing a pie slice. + */ +Ext.define('Ext.draw.sprite.Sector', { + extend: Ext.draw.sprite.Path , + alias: 'sprite.sector', + type: 'sector', + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Number} [centerX=0] The center coordinate of the sprite on the x-axis. + */ + centerX: 'number', + + /** + * @cfg {Number} [centerY=0] The center coordinate of the sprite on the y-axis. + */ + centerY: 'number', + + /** + * @cfg {Number} [startAngle=0] The starting angle of the sprite. + */ + startAngle: 'number', + + /** + * @cfg {Number} [endAngle=0] The ending angle of the sprite. + */ + endAngle: 'number', + + /** + * @cfg {Number} [startRho=0] The starting point of the radius of the sprite. + */ + startRho: 'number', + + /** + * @cfg {Number} [endRho=150] The ending point of the radius of the sprite. + */ + endRho: 'number', + + /** + * @cfg {Number} [margin=0] The margin of the sprite from the center of pie. + */ + margin: 'number' + }, + aliases: { + rho: 'endRho' + }, + dirtyTriggers: { + centerX: 'path,bbox', + centerY: 'path,bbox', + startAngle: 'path,bbox', + endAngle: 'path,bbox', + startRho: 'path,bbox', + endRho: 'path,bbox', + margin: 'path,bbox' + }, + defaults: { + centerX: 0, + centerY: 0, + startAngle: 0, + endAngle: 0, + startRho: 0, + endRho: 150, + margin: 0, + path: 'M 0,0' + } + } + }, + + updatePath: function (path, attr) { + var startAngle = Math.min(attr.startAngle, attr.endAngle), + endAngle = Math.max(attr.startAngle, attr.endAngle), + midAngle = (startAngle + endAngle) * 0.5, + margin = attr.margin, + centerX = attr.centerX, + centerY = attr.centerY, + startRho = Math.min(attr.startRho, attr.endRho), + endRho = Math.max(attr.startRho, attr.endRho); + + if (margin) { + centerX += margin * Math.cos(midAngle); + centerY += margin * Math.sin(midAngle); + } + path.moveTo(centerX + startRho * Math.cos(startAngle), centerY + startRho * Math.sin(startAngle)); + path.lineTo(centerX + endRho * Math.cos(startAngle), centerY + endRho * Math.sin(startAngle)); + path.arc(centerX, centerY, endRho, startAngle, endAngle, false); + path.lineTo(centerX + startRho * Math.cos(endAngle), centerY + startRho * Math.sin(endAngle)); + path.arc(centerX, centerY, startRho, endAngle, startAngle, true); + } +}); + +/** + * @class Ext.draw.sprite.Composite + * @extends Ext.draw.sprite.Sprite + * + * Represents a group of sprites. + */ +Ext.define('Ext.draw.sprite.Composite', { + extend: Ext.draw.sprite.Sprite , + alias: 'sprite.composite', + type: 'composite', + + constructor: function () { + this.callSuper(arguments); + this.sprites = []; + this.sprites.map = {}; + }, + + /** + * Adds a sprite to the composite. + * @param {Ext.draw.sprite.Sprite|Object} sprite + */ + add: function (sprite) { + if (!(sprite instanceof Ext.draw.sprite.Sprite)) { + sprite = Ext.create('sprite.' + sprite.type, sprite); + sprite.setParent(this); + } + var oldTransformations = sprite.applyTransformations, + me = this, + attr = me.attr; + + sprite.applyTransformations = function () { + if (sprite.attr.dirtyTransform) { + attr.dirtyTransform = true; + attr.bbox.plain.dirty = true; + attr.bbox.transform.dirty = true; + } + oldTransformations.call(sprite); + }; + this.sprites.push(sprite); + this.sprites.map[sprite.id] = sprite.getId(); + attr.bbox.plain.dirty = true; + attr.bbox.transform.dirty = true; + return sprite; + }, + + /** + * Adds a list of sprites to the composite. + * @param {Ext.draw.sprite.Sprite[]|Object[]|Ext.draw.sprite.Sprite|Object} sprites + */ + addAll: function (sprites) { + if (sprites.isSprite || sprites.type) { + this.add(sprites); + } else if (Ext.isArray(sprites)) { + var i = 0; + while (i < sprites.length) { + this.add(sprites[i++]); + } + } + }, + + /** + * Updates the bounding box of the composite, which contains the bounding box of all sprites in the composite. + */ + updatePlainBBox: function (plain) { + var me = this, + left = Infinity, + right = -Infinity, + top = Infinity, + bottom = -Infinity, + sprite, bbox, i, ln; + + for (i = 0, ln = me.sprites.length; i < ln; i++) { + sprite = me.sprites[i]; + sprite.applyTransformations(); + bbox = sprite.getBBox(); + if (left > bbox.x) { + left = bbox.x; + } + if (right < bbox.x + bbox.width) { + right = bbox.x + bbox.width; + } + if (top > bbox.y) { + top = bbox.y; + } + if (bottom < bbox.y + bbox.height) { + bottom = bbox.y + bbox.height; + } + } + plain.x = left; + plain.y = top; + plain.width = right - left; + plain.height = bottom - top; + }, + + /** + * Renders all sprites contained in the composite to the surface. + */ + render: function (surface, ctx, region) { + var mat = this.attr.matrix, + i, ln; + + mat.toContext(ctx); + for (i = 0, ln = this.sprites.length; i < ln; i++) { + surface.renderSprite(this.sprites[i], region); + } + } +}); + +/** + * @class Ext.draw.sprite.Arc + * @extend Ext.draw.sprite.Circle + * + * A sprite that represents a circular arc. + * + * @example preview miniphone + * var component = new Ext.draw.Component({ + * items: [{ + * type: 'arc', + * cx: 100, + * cy: 100, + * r: 25, + * fillStyle: 'blue', + * startAngle: 0, + * endAngle: Math.PI, + * anticlockwise: true + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(component); + */ +Ext.define("Ext.draw.sprite.Arc", { + extend: Ext.draw.sprite.Circle , + alias: 'sprite.arc', + type: 'arc', + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Number} [startAngle=0] The beginning angle of the arc. + */ + startAngle: "number", + + /** + * @cfg {Number} [endAngle=Math.PI*2] The ending angle of the arc. + */ + endAngle: "number", + + /** + * @cfg {Boolean} [anticlockwise=false] Determines whether or not the arc is drawn clockwise. + */ + anticlockwise: "bool" + }, + aliases: { + from: "startAngle", + to: "endAngle", + start: "startAngle", + end: "endAngle" + }, + defaults: { + startAngle: 0, + endAngle: Math.PI * 2, + anticlockwise: false + }, + dirtyTriggers: { + startAngle: 'path', + endAngle: 'path', + anticlockwise: 'path' + } + } + }, + + updatePath: function (path, attr) { + path.arc(attr.cx, attr.cy, attr.r, attr.startAngle, attr.endAngle, attr.anticlockwise); + } +}); + +/** + * @class Ext.draw.sprite.Rect + * @extends Ext.draw.sprite.Path + * + * A sprite that represents a rectangle. + * + * @example preview miniphone + * var component = new Ext.draw.Component({ + * items: [{ + * type: 'rect', + * x: 50, + * y: 50, + * width: 50, + * height: 50, + * fillStyle: 'blue' + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(component); + */ +Ext.define('Ext.draw.sprite.Rect', { + extend: Ext.draw.sprite.Path , + alias: 'sprite.rect', + type: 'rect', + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Number} [x=0] The position of the sprite on the x-axis. + */ + x: 'number', + + /** + * @cfg {Number} [y=0] The position of the sprite on the y-axis. + */ + y: 'number', + + /** + * @cfg {Number} [width=1] The width of the sprite. + */ + width: 'number', + + /** + * @cfg {Number} [height=1] The height of the sprite. + */ + height: 'number', + + /** + * @cfg {Number} [radius=0] The radius of the rounded corners. + */ + radius: 'number' + }, + aliases: { + + }, + dirtyTriggers: { + x: 'path', + y: 'path', + width: 'path', + height: 'path', + radius: 'path' + }, + defaults: { + x: 0, + y: 0, + width: 1, + height: 1, + radius: 0 + } + } + }, + + updatePlainBBox: function (plain) { + var attr = this.attr; + plain.x = attr.x; + plain.y = attr.y; + plain.width = attr.width; + plain.height = attr.height; + }, + + updateTransformedBBox: function (transform, plain) { + this.attr.matrix.transformBBox(plain, this.attr.radius, transform); + }, + + updatePath: function (path, attr) { + var x = attr.x, + y = attr.y, + width = attr.width, + height = attr.height, + radius = Math.min(attr.radius, Math.abs(attr.height) * 0.5, Math.abs(attr.width) * 0.5); + if (radius === 0) { + path.rect(x, y, width, height); + } else { + path.moveTo(x + radius, y); + path.arcTo(x + width, y, x + width, y + height, radius); + path.arcTo(x + width, y + height, x, y + height, radius); + path.arcTo(x, y + height, x, y, radius); + path.arcTo(x, y, x + radius, y, radius); + } + } +}); + +/** + * @class Ext.draw.sprite.Image + * @extends Ext.draw.sprite.Rect + * + * A sprite that represents an image. + */ +Ext.define("Ext.draw.sprite.Image", { + extend: Ext.draw.sprite.Rect , + alias: 'sprite.image', + type: 'image', + statics: { + imageLoaders: {} + }, + + inheritableStatics: { + def: { + processors: { + /** + * @cfg {String} [src=''] The image source of the sprite. + */ + src: 'string' + }, + defaults: { + src: '', + width: null, + height: null + } + } + }, + + render: function (surface, ctx) { + var me = this, + attr = me.attr, + mat = attr.matrix, + src = attr.src, + x = attr.x, + y = attr.y, + width = attr.width, + height = attr.height, + loadingStub = Ext.draw.sprite.Image.imageLoaders[src], + imageLoader, + i; + + if (loadingStub && loadingStub.done) { + mat.toContext(ctx); + ctx.drawImage(loadingStub.image, x, y, width || loadingStub.width, height || loadingStub.width); + } else if (!loadingStub) { + imageLoader = new Image(); + loadingStub = Ext.draw.sprite.Image.imageLoaders[src] = { + image: imageLoader, + done: false, + pendingSprites: [me], + pendingSurfaces: [surface] + }; + imageLoader.width = width; + imageLoader.height = height; + imageLoader.onload = function () { + if (!loadingStub.done) { + loadingStub.done = true; + for (i = 0; i < loadingStub.pendingSprites.length; i++) { + loadingStub.pendingSprites[i].setDirty(true); + } + for (i in loadingStub.pendingSurfaces) { + loadingStub.pendingSurfaces[i].renderFrame(); + } + } + }; + imageLoader.src = src; + } else { + Ext.Array.include(loadingStub.pendingSprites, me); + Ext.Array.include(loadingStub.pendingSurfaces, surface); + } + } +}); + +/** + * @class Ext.draw.sprite.Instancing + * @extends Ext.draw.sprite.Sprite + * + * Sprite that represents multiple instances based on the given template. + */ +Ext.define("Ext.draw.sprite.Instancing", { + extend: Ext.draw.sprite.Sprite , + alias: 'sprite.instancing', + type: 'instancing', + config: { + + /** + * @cfg {Object} [template=null] The sprite template used by all instances. + */ + template: null + }, + instances: null, + constructor: function (config) { + this.instances = []; + this.callSuper([config]); + if (config && config.template) { + this.setTemplate(config.template); + } + }, + + applyTemplate: function (template) { + if (!(template instanceof Ext.draw.sprite.Sprite)) { + template = Ext.create(template.xclass || "sprite." + template.type, template); + } + template.setParent(this); + template.attr.children = []; + this.instances = []; + this.position = 0; + return template; + }, + + /** + * Creates a new sprite instance. + * + * @param {Object} config The configuration of the instance. + * @param {Object} [data] + * @param {Boolean} [bypassNormalization] 'true' to bypass attribute normalization. + * @param {Boolean} [avoidCopy] 'true' to avoid copying. + * @return {Object} The attributes of the instance. + */ + createInstance: function (config, data, bypassNormalization, avoidCopy) { + var template = this.getTemplate(), + originalAttr = template.attr, + attr = Ext.Object.chain(originalAttr); + template.topModifier.prepareAttributes(attr); + template.attr = attr; + template.setAttributes(config, bypassNormalization, avoidCopy); + attr.data = data; + this.instances.push(attr); + template.attr = originalAttr; + this.position++; + originalAttr.children.push(attr); + return attr; + }, + + /** + * Not supported. + * + * @return {null} + */ + getBBox: function () { return null; }, + + /** + * Returns the bounding box for the instance at the given index. + * + * @param {Number} index The index of the instance. + * @param {Boolean} [isWithoutTransform] 'true' to not apply sprite transforms to the bounding box. + * @return {Object} The bounding box for the instance. + */ + getBBoxFor: function (index, isWithoutTransform) { + var template = this.getTemplate(), + originalAttr = template.attr, + bbox; + template.attr = this.instances[index]; + bbox = template.getBBox(isWithoutTransform); + template.attr = originalAttr; + return bbox; + }, + + render: function (surface, ctx, clipRegion, region) { + var me = this, + mat = me.attr.matrix, + template = me.getTemplate(), + originalAttr = template.attr, + instances = me.instances, + i, ln = me.position; + + mat.toContext(ctx); + template.preRender(surface, ctx, clipRegion, region); + template.useAttributes(ctx, region); + for (i = 0; i < ln; i++) { + if (instances[i].dirtyZIndex) { + break; + } + } + for (i = 0; i < ln; i++) { + if (instances[i].hidden) { + continue; + } + ctx.save(); + template.attr = instances[i]; + template.applyTransformations(); + template.useAttributes(ctx, region); + template.render(surface, ctx, clipRegion, region); + ctx.restore(); + } + template.attr = originalAttr; + }, + + /** + * Sets the attributes for the instance at the given index. + * + * @param {Number} index the index of the instance + * @param {Object} changes the attributes to change + * @param {Boolean} [bypassNormalization] 'true' to avoid attribute normalization + */ + setAttributesFor: function (index, changes, bypassNormalization) { + var template = this.getTemplate(), + originalAttr = template.attr, + attr = this.instances[index]; + template.attr = attr; + try { + if (bypassNormalization) { + changes = Ext.apply({}, changes); + } else { + changes = template.self.def.normalize(changes); + } + template.topModifier.pushDown(attr, changes); + template.updateDirtyFlags(attr); + } finally { + template.attr = originalAttr; + } + }, + + destroy: function () { + this.callSuper(); + this.instances.length = 0; + this.instances = null; + if (this.getTemplate()) { + this.getTemplate().destroy(); + } + } +}); + +/** + * Linear gradient. + * + * @example preview miniphone + * var component = new Ext.draw.Component({ + * items: [{ + * type: 'circle', + * cx: 50, + * cy: 50, + * r: 100, + * fillStyle: { + * type: 'linear', + * degrees: 0, + * stops: [ + * { + * offset: 0, + * color: 'white' + * }, + * { + * offset: 1, + * color: 'blue' + * } + * ] + * } + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(component); + */ + +Ext.define("Ext.draw.gradient.Linear", { + extend: Ext.draw.gradient.Gradient , + type: 'linear', + config: { + /** + * @cfg {Number} The degree of rotation of the gradient. + */ + degrees: 0 + }, + + setAngle: function (angle) { + this.setDegrees(angle); + }, + + /** + * @inheritdoc + */ + generateGradient: function (ctx, bbox) { + var angle = Ext.draw.Draw.rad(this.getDegrees()), + cos = Math.cos(angle), + sin = Math.sin(angle), + w = bbox.width, + h = bbox.height, + cx = bbox.x + w * 0.5, + cy = bbox.y + h * 0.5, + stops = this.getStops(), + ln = stops.length, + gradient, + l, i; + + if (!isNaN(cx) && !isNaN(cy) && h > 0 && w > 0) { + l = (Math.sqrt(h * h + w * w) * Math.abs(Math.cos(angle - Math.atan(h / w)))) / 2; + gradient = ctx.createLinearGradient( + cx + cos * l, cy + sin * l, + cx - cos * l, cy - sin * l + ); + + for (i = 0; i < ln; i++) { + gradient.addColorStop(stops[i].offset, stops[i].color); + } + return gradient; + } + return 'none'; + } +}); + +/** + * Radial gradient. + * + * @example preview miniphone + * var component = new Ext.draw.Component({ + * items: [{ + * type: 'circle', + * cx: 50, + * cy: 50, + * r: 100, + * fillStyle: { + * type: 'radial', + * start: { + * x: 0, + * y: 0, + * r: 0 + * }, + * end: { + * x: 0, + * y: 0, + * r: 1 + * }, + * stops: [ + * { + * offset: 0, + * color: 'white' + * }, + * { + * offset: 1, + * color: 'blue' + * } + * ] + * } + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(component); + */ +Ext.define("Ext.draw.gradient.Radial", { + extend: Ext.draw.gradient.Gradient , + type: 'radial', + config: { + /** + * @cfg {Object} start The starting circle of the gradient. + */ + start: { + x: 0, + y: 0, + r: 0 + }, + /** + * @cfg {Object} end The ending circle of the gradient. + */ + end: { + x: 0, + y: 0, + r: 1 + } + }, + + applyStart: function (newStart, oldStart) { + if (!oldStart) { + return newStart; + } + var circle = { + x: oldStart.x, + y: oldStart.y, + r: oldStart.r + }; + + if ('x' in newStart) { + circle.x = newStart.x; + } else if ('centerX' in newStart) { + circle.x = newStart.centerX; + } + + if ('y' in newStart) { + circle.y = newStart.y; + } else if ('centerY' in newStart) { + circle.y = newStart.centerY; + } + + if ('r' in newStart) { + circle.r = newStart.r; + } else if ('radius' in newStart) { + circle.r = newStart.radius; + } + return circle; + }, + + applyEnd: function (newEnd, oldEnd) { + if (!oldEnd) { + return newEnd; + } + var circle = { + x: oldEnd.x, + y: oldEnd.y, + r: oldEnd.r + }; + + if ('x' in newEnd) { + circle.x = newEnd.x; + } else if ('centerX' in newEnd) { + circle.x = newEnd.centerX; + } + + if ('y' in newEnd) { + circle.y = newEnd.y; + } else if ('centerY' in newEnd) { + circle.y = newEnd.centerY; + } + + if ('r' in newEnd) { + circle.r = newEnd.r; + } else if ('radius' in newEnd) { + circle.r = newEnd.radius; + } + return circle; + }, + + /** + * @inheritdoc + */ + generateGradient: function (ctx, bbox) { + var start = this.getStart(), + end = this.getEnd(), + w = bbox.width * 0.5, + h = bbox.height * 0.5, + x = bbox.x + w, + y = bbox.y + h, + gradient = ctx.createRadialGradient( + x + start.x * w, y + start.y * h, start.r * Math.max(w, h), + x + end.x * w, y + end.y * h, end.r * Math.max(w, h) + ), + stops = this.getStops(), + ln = stops.length, + i; + + for (i = 0; i < ln; i++) { + gradient.addColorStop(stops[i].offset, stops[i].color); + } + return gradient; + } +}); + +/** + * Utility class to calculate [affine transformation](http://en.wikipedia.org/wiki/Affine_transformation) matrix. + * + * This class is compatible with SVGMatrix except: + * + * 1. Ext.draw.Matrix is not read only. + * 2. Using Number as its components rather than floats. + * + * Using this class to reduce the severe numeric problem with HTML Canvas and SVG transformation. + * + */ +Ext.define('Ext.draw.Matrix', { + + statics: { + /** + * @static + * Return the affine matrix that transform two points (x0, y0) and (x1, y1) to (x0p, y0p) and (x1p, y1p) + * @param {Number} x0 + * @param {Number} y0 + * @param {Number} x1 + * @param {Number} y1 + * @param {Number} x0p + * @param {Number} y0p + * @param {Number} x1p + * @param {Number} y1p + */ + createAffineMatrixFromTwoPair: function (x0, y0, x1, y1, x0p, y0p, x1p, y1p) { + var dx = x1 - x0, + dy = y1 - y0, + dxp = x1p - x0p, + dyp = y1p - y0p, + r = 1 / (dx * dx + dy * dy), + a = dx * dxp + dy * dyp, + b = dxp * dy - dx * dyp, + c = -a * x0 - b * y0, + f = b * x0 - a * y0; + + return new this(a * r, -b * r, b * r, a * r, c * r + x0p, f * r + y0p); + }, + + /** + * @static + * Return the affine matrix that transform two points (x0, y0) and (x1, y1) to (x0p, y0p) and (x1p, y1p) + * @param {Number} x0 + * @param {Number} y0 + * @param {Number} x1 + * @param {Number} y1 + * @param {Number} x0p + * @param {Number} y0p + * @param {Number} x1p + * @param {Number} y1p + */ + createPanZoomFromTwoPair: function (x0, y0, x1, y1, x0p, y0p, x1p, y1p) { + if (arguments.length === 2) { + return this.createPanZoomFromTwoPair.apply(this, x0.concat(y0)); + } + var dx = x1 - x0, + dy = y1 - y0, + cx = (x0 + x1) * 0.5, + cy = (y0 + y1) * 0.5, + dxp = x1p - x0p, + dyp = y1p - y0p, + cxp = (x0p + x1p) * 0.5, + cyp = (y0p + y1p) * 0.5, + r = dx * dx + dy * dy, + rp = dxp * dxp + dyp * dyp, + scale = Math.sqrt(rp / r); + + return new this(scale, 0, 0, scale, cxp - scale * cx, cyp - scale * cy); + }, + + /** + * @static + * Create a flyweight to wrap the given array. + * The flyweight will directly refer the object and the elements can be changed by other methods. + * + * Do not hold the instance of flyweight matrix. + * + * @param {Array} elements + * @return {Ext.draw.Matrix} + */ + fly: (function () { + var flyMatrix = null, + simplefly = function (elements) { + flyMatrix.elements = elements; + return flyMatrix; + }; + + return function (elements) { + if (!flyMatrix) { + flyMatrix = new Ext.draw.Matrix(); + } + flyMatrix.elements = elements; + Ext.draw.Matrix.fly = simplefly; + return flyMatrix; + }; + })(), + + /** + * @static + * Create a matrix from `mat`. If `mat` is already a matrix, returns it. + * @param {Mixed} mat + * @return {Ext.draw.Matrix} + */ + create: function (mat) { + if (mat instanceof this) { + return mat; + } + return new this(mat); + } + }, + + /** + * Create an affine transform matrix. + * + * @param {Number} xx Coefficient from x to x + * @param {Number} xy Coefficient from x to y + * @param {Number} yx Coefficient from y to x + * @param {Number} yy Coefficient from y to y + * @param {Number} dx Offset of x + * @param {Number} dy Offset of y + */ + constructor: function (xx, xy, yx, yy, dx, dy) { + if (xx && xx.length === 6) { + this.elements = xx.slice(); + } else if (xx !== undefined) { + this.elements = [xx, xy, yx, yy, dx, dy]; + } else { + this.elements = [1, 0, 0, 1, 0, 0]; + } + }, + + /** + * Prepend a matrix onto the current. + * + * __Note:__ The given transform will come after the current one. + * + * @param {Number} xx Coefficient from x to x. + * @param {Number} xy Coefficient from x to y. + * @param {Number} yx Coefficient from y to x. + * @param {Number} yy Coefficient from y to y. + * @param {Number} dx Offset of x. + * @param {Number} dy Offset of y. + * @return {Ext.draw.Matrix} this + */ + prepend: function (xx, xy, yx, yy, dx, dy) { + var elements = this.elements, + xx0 = elements[0], + xy0 = elements[1], + yx0 = elements[2], + yy0 = elements[3], + dx0 = elements[4], + dy0 = elements[5]; + + elements[0] = xx * xx0 + yx * xy0; + elements[1] = xy * xx0 + yy * xy0; + elements[2] = xx * yx0 + yx * yy0; + elements[3] = xy * yx0 + yy * yy0; + elements[4] = xx * dx0 + yx * dy0 + dx; + elements[5] = xy * dx0 + yy * dy0 + dy; + return this; + }, + + /** + * Prepend a matrix onto the current. + * + * __Note:__ The given transform will come after the current one. + * @param {Ext.draw.Matrix} matrix + * @return {Ext.draw.Matrix} this + */ + prependMatrix: function (matrix) { + return this.prepend.apply(this, matrix.elements); + }, + + /** + * Postpend a matrix onto the current. + * + * __Note:__ The given transform will come before the current one. + * + * @param {Number} xx Coefficient from x to x. + * @param {Number} xy Coefficient from x to y. + * @param {Number} yx Coefficient from y to x. + * @param {Number} yy Coefficient from y to y. + * @param {Number} dx Offset of x. + * @param {Number} dy Offset of y. + * @return {Ext.draw.Matrix} this + */ + append: function (xx, xy, yx, yy, dx, dy) { + var elements = this.elements, + xx0 = elements[0], + xy0 = elements[1], + yx0 = elements[2], + yy0 = elements[3], + dx0 = elements[4], + dy0 = elements[5]; + + elements[0] = xx * xx0 + xy * yx0; + elements[1] = xx * xy0 + xy * yy0; + elements[2] = yx * xx0 + yy * yx0; + elements[3] = yx * xy0 + yy * yy0; + elements[4] = dx * xx0 + dy * yx0 + dx0; + elements[5] = dx * xy0 + dy * yy0 + dy0; + return this; + }, + + /** + * Postpend a matrix onto the current. + * + * __Note:__ The given transform will come before the current one. + * + * @param {Ext.draw.Matrix} matrix + * @return {Ext.draw.Matrix} this + */ + appendMatrix: function (matrix) { + return this.append.apply(this, matrix.elements); + }, + + /** + * Set the elements of a Matrix + * @param {Number} xx + * @param {Number} xy + * @param {Number} yx + * @param {Number} yy + * @param {Number} dx + * @param {Number} dy + * @return {Ext.draw.Matrix} this + */ + set: function (xx, xy, yx, yy, dx, dy) { + var elements = this.elements; + + elements[0] = xx; + elements[1] = xy; + elements[2] = yx; + elements[3] = yy; + elements[4] = dx; + elements[5] = dy; + return this; + }, + + /** + * Return a new matrix represents the opposite transformation of the current one. + * + * @param {Ext.draw.Matrix} [target] A target matrix. If present, it will receive + * the result of inversion to avoid creating a new object. + * + * @return {Ext.draw.Matrix} + */ + inverse: function (target) { + var elements = this.elements, + a = elements[0], + b = elements[1], + c = elements[2], + d = elements[3], + e = elements[4], + f = elements[5], + rDim = 1 / (a * d - b * c); + + a *= rDim; + b *= rDim; + c *= rDim; + d *= rDim; + if (target) { + target.set(d, -b, -c, a, c * f - d * e, b * e - a * f); + return target; + } else { + return new Ext.draw.Matrix(d, -b, -c, a, c * f - d * e, b * e - a * f); + } + }, + + /** + * Translate the matrix. + * + * @param {Number} x + * @param {Number} y + * @param {Boolean} [prepend] If `true`, this will transformation be prepended to the matrix. + * @return {Ext.draw.Matrix} this + */ + translate: function (x, y, prepend) { + if (prepend) { + return this.prepend(1, 0, 0, 1, x, y); + } else { + return this.append(1, 0, 0, 1, x, y); + } + }, + + /** + * Scale the matrix. + * + * @param {Number} sx + * @param {Number} sy + * @param {Number} scx + * @param {Number} scy + * @param {Boolean} [prepend] If `true`, this will transformation be prepended to the matrix. + * @return {Ext.draw.Matrix} this + */ + scale: function (sx, sy, scx, scy, prepend) { + var me = this; + + // null or undefined + if (sy == null) { + sy = sx; + } + if (scx === undefined) { + scx = 0; + } + if (scy === undefined) { + scy = 0; + } + + if (prepend) { + return me.prepend(sx, 0, 0, sy, scx - scx * sx, scy - scy * sy); + } else { + return me.append(sx, 0, 0, sy, scx - scx * sx, scy - scy * sy); + } + }, + + /** + * Rotate the matrix. + * + * @param {Number} angle Radians to rotate + * @param {Number|null} rcx Center of rotation. + * @param {Number|null} rcy Center of rotation. + * @param {Boolean} [prepend] If `true`, this will transformation be prepended to the matrix. + * @return {Ext.draw.Matrix} this + */ + rotate: function (angle, rcx, rcy, prepend) { + var me = this, + cos = Math.cos(angle), + sin = Math.sin(angle); + + rcx = rcx || 0; + rcy = rcy || 0; + + if (prepend) { + return me.prepend( + cos, sin, + -sin, cos, + rcx - cos * rcx + rcy * sin, + rcy - cos * rcy - rcx * sin + ); + } else { + return me.append( + cos, sin, + -sin, cos, + rcx - cos * rcx + rcy * sin, + rcy - cos * rcy - rcx * sin + ); + } + }, + + /** + * Rotate the matrix by the angle of a vector. + * + * @param {Number} x + * @param {Number} y + * @param {Boolean} [prepend] If `true`, this will transformation be prepended to the matrix. + * @return {Ext.draw.Matrix} this + */ + rotateFromVector: function (x, y, prepend) { + var me = this, + d = Math.sqrt(x * x + y * y), + cos = x / d, + sin = y / d; + if (prepend) { + return me.prepend(cos, sin, -sin, cos, 0, 0); + } else { + return me.append(cos, sin, -sin, cos, 0, 0); + } + }, + + /** + * Clone this matrix. + * @return {Ext.draw.Matrix} + */ + clone: function () { + return new Ext.draw.Matrix(this.elements); + }, + + /** + * Horizontally flip the matrix + * @return {Ext.draw.Matrix} this + */ + flipX: function () { + return this.append(-1, 0, 0, 1, 0, 0); + }, + + /** + * Vertically flip the matrix + * @return {Ext.draw.Matrix} this + */ + flipY: function () { + return this.append(1, 0, 0, -1, 0, 0); + }, + + /** + * Skew the matrix + * @param {Number} angle + * @return {Ext.draw.Matrix} this + */ + skewX: function (angle) { + return this.append(1, Math.tan(angle), 0, -1, 0, 0); + }, + + /** + * Skew the matrix + * @param {Number} angle + * @return {Ext.draw.Matrix} this + */ + skewY: function (angle) { + return this.append(1, 0, Math.tan(angle), -1, 0, 0); + }, + + /** + * Reset the matrix to identical. + * @return {Ext.draw.Matrix} this + */ + reset: function () { + return this.set(1, 0, 0, 1, 0, 0); + }, + + /** + * @private + * Split Matrix to `{{devicePixelRatio,c,0},{b,devicePixelRatio,0},{0,0,1}}.{{xx,0,dx},{0,yy,dy},{0,0,1}}` + * @return {Object} Object with b,c,d=devicePixelRatio,xx,yy,dx,dy + */ + precisionCompensate: function (devicePixelRatio, comp) { + var elements = this.elements, + x2x = elements[0], + x2y = elements[1], + y2x = elements[2], + y2y = elements[3], + newDx = elements[4], + newDy = elements[5], + r = x2y * y2x - x2x * y2y; + + comp.b = devicePixelRatio * x2y / x2x; + comp.c = devicePixelRatio * y2x / y2y; + comp.d = devicePixelRatio; + comp.xx = x2x / devicePixelRatio; + comp.yy = y2y / devicePixelRatio; + comp.dx = (newDy * x2x * y2x - newDx * x2x * y2y) / r / devicePixelRatio; + comp.dy = (newDx * x2y * y2y - newDy * x2x * y2y) / r / devicePixelRatio; + }, + + /** + * @private + * Split Matrix to `{{1,c,0},{b,d,0},{0,0,1}}.{{xx,0,dx},{0,xx,dy},{0,0,1}}` + * @return {Object} Object with b,c,d,xx,yy=xx,dx,dy + */ + precisionCompensateRect: function (devicePixelRatio, comp) { + var elements = this.elements, + x2x = elements[0], + x2y = elements[1], + y2x = elements[2], + y2y = elements[3], + newDx = elements[4], + newDy = elements[5], + yxOnXx = y2x / x2x; + + comp.b = devicePixelRatio * x2y / x2x; + comp.c = devicePixelRatio * yxOnXx; + comp.d = devicePixelRatio * y2y / x2x; + comp.xx = x2x / devicePixelRatio; + comp.yy = x2x / devicePixelRatio; + comp.dx = (newDy * y2x - newDx * y2y) / (x2y * yxOnXx - y2y) / devicePixelRatio; + comp.dy = -(newDy * x2x - newDx * x2y) / (x2y * yxOnXx - y2y) / devicePixelRatio; + }, + + /** + * Transform point returning the x component of the result. + * @param {Number} x + * @param {Number} y + * @return {Number} x component of the result. + */ + x: function (x, y) { + var elements = this.elements; + return x * elements[0] + y * elements[2] + elements[4]; + }, + + /** + * Transform point returning the y component of the result. + * @param {Number} x + * @param {Number} y + * @return {Number} y component of the result. + */ + y: function (x, y) { + var elements = this.elements; + + return x * elements[1] + y * elements[3] + elements[5]; + }, + + /** + * @private + * @param {Number} i + * @param {Number} j + * @return {String} + */ + get: function (i, j) { + return +this.elements[i + j * 2].toFixed(4); + }, + + /** + * Transform a point to a new array. + * @param {Array} point + * @return {Array} + */ + transformPoint: function (point) { + var elements = this.elements; + + return [ + point[0] * elements[0] + point[1] * elements[2] + elements[4], + point[0] * elements[1] + point[1] * elements[3] + elements[5] + ]; + }, + + /** + * @param {Object} bbox Given as `{x: Number, y: Number, width: Number, height: Number}`. + * @param {Number} [radius] + * @param {Object} [target] Optional target object to recieve the result. + * Recommended to use it for better gc. + * + * @return {Object} Object with x, y, width and height. + */ + transformBBox: function (bbox, radius, target) { + var elements = this.elements, + l = bbox.x, + t = bbox.y, + w0 = bbox.width * 0.5, + h0 = bbox.height * 0.5, + xx = elements[0], + xy = elements[1], + yx = elements[2], + yy = elements[3], + cx = l + w0, + cy = t + h0, + w, h, scales; + + if (radius) { + w0 -= radius; + h0 -= radius; + scales = [ + Math.sqrt(elements[0] * elements[0] + elements[2] * elements[2]), + Math.sqrt(elements[1] * elements[1] + elements[3] * elements[3]) + ]; + w = Math.abs(w0 * xx) + Math.abs(h0 * yx) + Math.abs(scales[0] * radius); + h = Math.abs(w0 * xy) + Math.abs(h0 * yy) + Math.abs(scales[1] * radius); + } else { + w = Math.abs(w0 * xx) + Math.abs(h0 * yx); + h = Math.abs(w0 * xy) + Math.abs(h0 * yy); + } + + if (!target) { + target = {}; + } + + target.x = cx * xx + cy * yx + elements[4] - w; + target.y = cx * xy + cy * yy + elements[5] - h; + target.width = w + w; + target.height = h + h; + + return target; + }, + + /** + * Transform a list for points. + * + * __Note:__ will change the original list but not points inside it. + * @param {Array} list + * @return {Array} list + */ + transformList: function (list) { + var elements = this.elements, + xx = elements[0], yx = elements[2], dx = elements[4], + xy = elements[1], yy = elements[3], dy = elements[5], + ln = list.length, + p, i; + + for (i = 0; i < ln; i++) { + p = list[i]; + list[i] = [ + p[0] * xx + p[1] * yx + dx, + p[0] * xy + p[1] * yy + dy + ]; + } + return list; + }, + + /** + * Determines whether this matrix is an identity matrix (no transform). + * @return {Boolean} + */ + isIdentity: function () { + var elements = this.elements; + + return elements[0] === 1 && + elements[1] === 0 && + elements[2] === 0 && + elements[3] === 1 && + elements[4] === 0 && + elements[5] === 0; + }, + + /** + * Determines if this matrix has the same values as another matrix. + * @param {Ext.draw.Matrix} matrix + * @return {Boolean} + */ + equals: function (matrix) { + var elements = this.elements, + elements2 = matrix.elements; + + return elements[0] === elements2[0] && + elements[1] === elements2[1] && + elements[2] === elements2[2] && + elements[3] === elements2[3] && + elements[4] === elements2[4] && + elements[5] === elements2[5]; + }, + + /** + * Create an array of elements by horizontal order (xx,yx,dx,yx,yy,dy). + * @return {Array} + */ + toArray: function () { + var elements = this.elements; + return [elements[0], elements[2], elements[4], elements[1], elements[3], elements[5]]; + }, + + /** + * Create an array of elements by vertical order (xx,xy,yx,yy,dx,dy). + * @return {Array|String} + */ + toVerticalArray: function () { + return this.elements.slice(); + }, + + /** + * Get an array of elements. + * The numbers are rounded to keep only 4 decimals. + * @return {Array} + */ + toString: function () { + var me = this; + return [me.get(0, 0), me.get(0, 1), me.get(1, 0), me.get(1, 1), me.get(2, 0), me.get(2, 1)].join(','); + }, + + /** + * Apply the matrix to a drawing context. + * @param {Object} ctx + * @return {Ext.draw.Matrix} this + */ + toContext: function (ctx) { + ctx.transform.apply(ctx, this.elements); + return this; + }, + + /** + * Return a string that can be used as transform attribute in SVG. + * @return {String} + */ + toSvg: function () { + var elements = this.elements; + // The reason why we cannot use `.join` is the `1e5` form is not accepted in svg. + return "matrix(" + + elements[0].toFixed(9) + ',' + + elements[1].toFixed(9) + ',' + + elements[2].toFixed(9) + ',' + + elements[3].toFixed(9) + ',' + + elements[4].toFixed(9) + ',' + + elements[5].toFixed(9) + + ")"; + }, + + /** + * Get the x scale of the matrix. + * @return {Number} + */ + getScaleX: function () { + var elements = this.elements; + return Math.sqrt(elements[0] * elements[0] + elements[2] * elements[2]); + }, + + /** + * Get the y scale of the matrix. + * @return {Number} + */ + getScaleY: function () { + var elements = this.elements; + return Math.sqrt(elements[1] * elements[1] + elements[3] * elements[3]); + }, + + /** + * Get x-to-x component of the matrix + * @return {Number} + */ + getXX: function () { + return this.elements[0]; + }, + + /** + * Get x-to-y component of the matrix. + * @return {Number} + */ + getXY: function () { + return this.elements[1]; + }, + + /** + * Get y-to-x component of the matrix. + * @return {Number} + */ + getYX: function () { + return this.elements[2]; + }, + + /** + * Get y-to-y component of the matrix. + * @return {Number} + */ + getYY: function () { + return this.elements[3]; + }, + + /** + * Get offset x component of the matrix. + * @return {Number} + */ + getDX: function () { + return this.elements[4]; + }, + + /** + * Get offset y component of the matrix. + * @return {Number} + */ + getDY: function () { + return this.elements[5]; + }, + + /** + * Split matrix into Translate, Scale, Shear, and Rotate. + * @return {Object} + */ + split: function () { + var el = this.elements, + xx = el[0], + xy = el[1], + yx = el[2], + yy = el[3], + out = { + translateX: el[4], + translateY: el[5] + }; + out.scaleX = Math.sqrt(xx * xx + yx * yx); + out.shear = (xx * xy + yx * yy) / out.scaleX; + xy -= out.shear * xx; + yy -= out.shear * yx; + out.scaleY = Math.sqrt(xy * xy + yy * yy); + out.shear /= out.scaleY; + out.rotation = -Math.atan2(yx / out.scaleX, xy / out.scaleY); + out.isSimple = Math.abs(out.shear) < 1e-9 && (!out.rotation || Math.abs(out.scaleX - out.scaleY) < 1e-9); + return out; + } +}, function () { + function registerName(properties, name, i) { + properties[name] = { + get: function () { + return this.elements[i]; + }, + set: function (val) { + this.elements[i] = val; + } + }; + } + + // Compatibility with SVGMatrix + // https://developer.mozilla.org/en/DOM/SVGMatrix + if (Object.defineProperties) { + var properties = {}; + /** + * @property {Number} a Get x-to-x component of the matrix. Avoid using it for performance consideration. + * Use {@link #getXX} instead. + */ + registerName(properties, 'a', 0); + + // TODO: Help me finish this. + registerName(properties, 'b', 1); + registerName(properties, 'c', 2); + registerName(properties, 'd', 3); + registerName(properties, 'e', 4); + registerName(properties, 'f', 5); + Object.defineProperties(this.prototype, properties); + } + + /** + * Postpend a matrix onto the current. + * + * __Note:__ The given transform will come before the current one. + * + * @method + * @param {Ext.draw.Matrix} matrix + * @return {Ext.draw.Matrix} this + */ + this.prototype.multiply = this.prototype.appendMatrix; +}); + +/** + * A Surface is an interface to render methods inside a draw {@link Ext.draw.Component}. + * A Surface contains methods to render sprites, get bounding boxes of sprites, add + * sprites to the canvas, initialize other graphic components, etc. One of the most used + * methods for this class is the `add` method, to add Sprites to the surface. + * + * Most of the Surface methods are abstract and they have a concrete implementation + * in Canvas or SVG engines. + * + * A Surface instance can be accessed as a property of a draw component. For example: + * + * drawComponent.getSurface('main').add({ + * type: 'circle', + * fill: '#ffc', + * radius: 100, + * x: 100, + * y: 100 + * }); + * + * The configuration object passed in the `add` method is the same as described in the {@link Ext.draw.sprite.Sprite} + * class documentation. + * + * ## Example + * + * drawComponent.getSurface('main').add([ + * { + * type: 'circle', + * radius: 10, + * fill: '#f00', + * x: 10, + * y: 10 + * }, + * { + * type: 'circle', + * radius: 10, + * fill: '#0f0', + * x: 50, + * y: 50 + * }, + * { + * type: 'circle', + * radius: 10, + * fill: '#00f', + * x: 100, + * y: 100 + * }, + * { + * type: 'rect', + * radius: 10, + * x: 10, + * y: 10 + * }, + * { + * type: 'rect', + * radius: 10, + * x: 50, + * y: 50 + * }, + * { + * type: 'rect', + * radius: 10, + * x: 100, + * y: 100 + * } + * ]); + * + */ +Ext.define('Ext.draw.Surface', { + extend: Ext.Component , + xtype: 'surface', + + + + + + + + + + + + + + defaultIdPrefix: 'ext-surface-', + + /** + * The reported device pixel density. + */ + devicePixelRatio: window.devicePixelRatio || 1, + + statics: { + /** + * Stably sort the list of sprites by their zIndex. + * TODO: Improve the performance. Reduce gc impact. + * @param {Array} list + */ + stableSort: function (list) { + if (list.length < 2) { + return; + } + var keys = {}, sortedKeys, result = [], i, ln, zIndex; + + for (i = 0, ln = list.length; i < ln; i++) { + zIndex = list[i].attr.zIndex; + if (!keys[zIndex]) { + keys[zIndex] = [list[i]]; + } else { + keys[zIndex].push(list[i]); + } + } + sortedKeys = Ext.Object.getKeys(keys).sort(function (a, b) {return a - b;}); + for (i = 0, ln = sortedKeys.length; i < ln; i++) { + result.push.apply(result, keys[sortedKeys[i]]); + } + for (i = 0, ln = list.length; i < ln; i++) { + list[i] = result[i]; + } + } + }, + + config: { + /** + * @cfg {Array} + * The region of the surface related to its component. + */ + region: null, + + /** + * @cfg {Object} + * Background sprite config of the surface. + */ + background: null, + + /** + * @cfg {Array} + * Array of sprite instances. + */ + items: [], + + /** + * @cfg {Boolean} + * Indicates whether the surface needs redraw. + */ + dirty: false + }, + + dirtyPredecessor: 0, + + constructor: function (config) { + var me = this; + + me.predecessors = []; + me.successors = []; + // The `pendingRenderFrame` flag is used to indicate that `predecessors` (surfaces that should render first) + // are dirty, and to call `renderFrame` when all `predecessors` have their `renderFrame` called + // (i.e. not dirty anymore). + me.pendingRenderFrame = false; + me.map = {}; + + me.callSuper([config]); + me.matrix = new Ext.draw.Matrix(); + me.inverseMatrix = me.matrix.inverse(me.inverseMatrix); + me.resetTransform(); + }, + + /** + * Round the number to align to the pixels on device. + * @param {Number} num The number to align. + * @return {Number} The resultant alignment. + */ + roundPixel: function (num) { + return Math.round(this.devicePixelRatio * num) / this.devicePixelRatio; + }, + + /** + * Mark the surface to render after another surface is updated. + * @param {Ext.draw.Surface} surface The surface to wait for. + */ + waitFor: function (surface) { + var me = this, + predecessors = me.predecessors; + if (!Ext.Array.contains(predecessors, surface)) { + predecessors.push(surface); + surface.successors.push(me); + if (surface._dirty) { + me.dirtyPredecessor++; + } + } + }, + + setDirty: function (dirty) { + if (this._dirty !== dirty) { + var successors = this.successors, successor, + i, ln = successors.length; + for (i = 0; i < ln; i++) { + successor = successors[i]; + if (dirty) { + successor.dirtyPredecessor++; + successor.setDirty(true); + } else { + successor.dirtyPredecessor--; + if (successor.dirtyPredecessor === 0 && successor.pendingRenderFrame) { + successor.renderFrame(); + } + } + } + this._dirty = dirty; + } + }, + + applyElement: function (newElement, oldElement) { + if (oldElement) { + oldElement.set(newElement); + } else { + oldElement = Ext.Element.create(newElement); + } + this.setDirty(true); + return oldElement; + }, + + applyBackground: function (background, oldBackground) { + this.setDirty(true); + if (Ext.isString(background)) { + background = { fillStyle: background }; + } + return Ext.factory(background, Ext.draw.sprite.Rect, oldBackground); + }, + + applyRegion: function (region, oldRegion) { + if (oldRegion && region[0] === oldRegion[0] && region[1] === oldRegion[1] && region[2] === oldRegion[2] && region[3] === oldRegion[3]) { + return; + } + if (Ext.isArray(region)) { + return [region[0], region[1], region[2], region[3]]; + } else if (Ext.isObject(region)) { + return [ + region.x || region.left, + region.y || region.top, + region.width || (region.right - region.left), + region.height || (region.bottom - region.top) + ]; + } + }, + + updateRegion: function (region) { + var me = this, + l = region[0], + t = region[1], + r = l + region[2], + b = t + region[3], + background = this.getBackground(), + element = me.element; + + element.setBox({ + top: Math.floor(t), + left: Math.floor(l), + width: Math.ceil(r - Math.floor(l)), + height: Math.ceil(b - Math.floor(t)) + }); + + if (background) { + background.setAttributes({ + x: 0, + y: 0, + width: Math.ceil(r - Math.floor(l)), + height: Math.ceil(b - Math.floor(t)) + }); + } + me.setDirty(true); + }, + + /** + * Reset the matrix of the surface. + */ + resetTransform: function () { + this.matrix.set(1, 0, 0, 1, 0, 0); + this.inverseMatrix.set(1, 0, 0, 1, 0, 0); + this.setDirty(true); + }, + + updateComponent: function (component, oldComponent) { + if (component) { + component.element.dom.appendChild(this.element.dom); + } + }, + + /** + * Get the sprite by id or index. + * It will first try to find a sprite with the given id, otherwise will try to use the id as an index. + * @param {String|Number} id + * @returns {Ext.draw.sprite.Sprite} + */ + get: function (id) { + return this.map[id] || this.items[id]; + }, + + /** + * Add a Sprite to the surface. + * You can put any number of object as parameter. + * See {@link Ext.draw.sprite.Sprite} for the configuration object to be passed into this method. + * + * For example: + * + * drawComponent.surface.add({ + * type: 'circle', + * fill: '#ffc', + * radius: 100, + * x: 100, + * y: 100 + * }); + * + */ + add: function () { + var me = this, + args = Array.prototype.slice.call(arguments), + argIsArray = Ext.isArray(args[0]), + results = [], + sprite, sprites, items, i, ln; + + items = Ext.Array.clean(argIsArray ? args[0] : args); + if (!items.length) { + return results; + } + sprites = me.prepareItems(items); + + for (i = 0, ln = sprites.length; i < ln; i++) { + sprite = sprites[i]; + me.map[sprite.getId()] = sprite; + results.push(sprite); + sprite.setParent(this); + me.onAdd(sprite); + } + + items = me.getItems(); + if (items) { + items.push.apply(items, results); + } + + me.dirtyZIndex = true; + me.setDirty(true); + + if (!argIsArray && results.length === 1) { + return results[0]; + } else { + return results; + } + }, + + /** + * @protected + * Invoked when a sprite is added to the surface. + * @param {Ext.draw.sprite.Sprite} sprite The sprite to be added. + */ + onAdd: Ext.emptyFn, + + /** + * Remove a given sprite from the surface, optionally destroying the sprite in the process. + * You can also call the sprite own `remove` method. + * + * For example: + * + * drawComponent.surface.remove(sprite); + * // or... + * sprite.remove(); + * + * @param {Ext.draw.sprite.Sprite} sprite + * @param {Boolean} [destroySprite=false] + */ + remove: function (sprite, destroySprite) { + if (sprite) { + delete this.map[sprite.getId()]; + if (destroySprite) { + sprite.destroy(); + } else { + sprite.setParent(null); + Ext.Array.remove(this.getItems(), sprite); + } + this.dirtyZIndex = true; + this.setDirty(true); + } + }, + + /** + * Remove all sprites from the surface, optionally destroying the sprites in the process. + * + * For example: + * + * drawComponent.getSurface('main').removeAll(); + * + * @param {Boolean} [destroySprites=false] + */ + removeAll: function (destroySprites) { + var items = this.getItems(), + i = items.length; + if (destroySprites) { + while (i > 0) { + items[--i].destroy(); + } + } else { + while (i > 0) { + items[--i].setParent(null); + } + } + items.length = 0; + this.map = {}; + this.dirtyZIndex = true; + }, + + // @private + applyItems: function (items) { + if (this.getItems()) { + this.removeAll(true); + } + return Ext.Array.from(this.add(items)); + }, + + /** + * @private + * Initialize and apply defaults to surface items. + */ + prepareItems: function (items) { + items = [].concat(items); + // Make sure defaults are applied and item is initialized + + var me = this, + item, i, ln, j, + removeSprite = function (sprite) { + this.remove(sprite, false); + }; + + for (i = 0, ln = items.length; i < ln; i++) { + item = items[i]; + if (!(item instanceof Ext.draw.sprite.Sprite)) { + // Temporary, just take in configs... + item = items[i] = me.createItem(item); + } + item.on('beforedestroy', removeSprite, me); + } + return items; + }, + + /** + * @private Creates an item and appends it to the surface. Called + * as an internal method when calling `add`. + */ + createItem: function (config) { + var sprite = Ext.create(config.xclass || 'sprite.' + config.type, config); + return sprite; + }, + + /** + * Return the minimal bounding box that contains all the sprites bounding boxes in the given list of sprites. + * @param {Ext.draw.sprite.Sprite[]|Ext.draw.sprite.Sprite} sprites + * @param {Boolean} [isWithoutTransform=false] + * @returns {{x: Number, y: Number, width: number, height: number}} + */ + getBBox: function (sprites, isWithoutTransform) { + var sprites = Ext.Array.from(sprites), + left = Infinity, + right = -Infinity, + top = Infinity, + bottom = -Infinity, + sprite, bbox, i, ln; + + for (i = 0, ln = sprites.length; i < ln; i++) { + sprite = sprites[i]; + bbox = sprite.getBBox(isWithoutTransform); + if (left > bbox.x) { + left = bbox.x; + } + if (right < bbox.x + bbox.width) { + right = bbox.x + bbox.width; + } + if (top > bbox.y) { + top = bbox.y; + } + if (bottom < bbox.y + bbox.height) { + bottom = bbox.y + bbox.height; + } + } + return { + x: left, + y: top, + width: right - left, + height: bottom - top + }; + }, + + /** + * Empty the surface content (without touching the sprites.) + */ + clear: Ext.emptyFn, + + /** + * @private + * Order the items by their z-index if any of that has been changed since last sort. + */ + orderByZIndex: function () { + var me = this, + items = me.getItems(), + dirtyZIndex = false, + i, ln; + + if (me.getDirty()) { + for (i = 0, ln = items.length; i < ln; i++) { + if (items[i].attr.dirtyZIndex) { + dirtyZIndex = true; + break; + } + } + if (dirtyZIndex) { + // sort by zIndex + Ext.draw.Surface.stableSort(items); + this.setDirty(true); + } + + for (i = 0, ln = items.length; i < ln; i++) { + items[i].attr.dirtyZIndex = false; + } + } + }, + + /** + * Force the element to redraw. + */ + repaint: function () { + var me = this; + me.repaint = Ext.emptyFn; + setTimeout(function () { + delete me.repaint; + me.element.repaint(); + }, 1); + }, + + /** + * Triggers the re-rendering of the canvas. + */ + renderFrame: function () { + if (!this.element) { + return; + } + if (this.dirtyPredecessor > 0) { + this.pendingRenderFrame = true; + return; + } + + var me = this, + region = this.getRegion(), + background = me.getBackground(), + items = me.getItems(), + item, i, ln; + + // Cannot render before the surface is placed. + if (!region) { + return; + } + + // This will also check the dirty flags of the sprites. + me.orderByZIndex(); + if (me.getDirty()) { + me.clear(); + me.clearTransform(); + + if (background) { + me.renderSprite(background); + } + + for (i = 0, ln = items.length; i < ln; i++) { + item = items[i]; + if (false === me.renderSprite(item)) { + return; + } + item.attr.textPositionCount = me.textPosition; + } + + me.setDirty(false); + } + }, + + /** + * @private + * Renders a single sprite into the surface. + * Do not call it from outside `renderFrame` method. + * + * @param {Ext.draw.sprite.Sprite} sprite The Sprite to be rendered. + * @return {Boolean} returns `false` to stop the rendering to continue. + */ + renderSprite: Ext.emptyFn, + + /** + * @private + * Clears the current transformation state on the surface. + */ + clearTransform: Ext.emptyFn, + + /** + * Returns 'true' if the surface is dirty. + * @return {Boolean} 'true' if the surface is dirty + */ + getDirty: function () { + return this._dirty; + }, + + /** + * Destroys the surface. This is done by removing all components from it and + * also removing its reference to a DOM element. + * + * For example: + * + * drawComponent.surface.destroy(); + */ + destroy: function () { + var me = this; + me.removeAll(); + me.setBackground(null); + me.predecessors = null; + me.successors = null; + me.callSuper(); + } +}); + + + +/** + * @class Ext.draw.engine.SvgContext + * + * A class that imitates a canvas context but generates svg elements instead. + */ +Ext.define('Ext.draw.engine.SvgContext', { + /** + * @private + * Properties to be saved/restored in `save` and `restore` method. + */ + toSave: ["strokeOpacity", "strokeStyle", "fillOpacity", "fillStyle", "globalAlpha", "lineWidth", "lineCap", + "lineJoin", "lineDash", "lineDashOffset", "miterLimit", "shadowOffsetX", "shadowOffsetY", "shadowBlur", + "shadowColor", "globalCompositeOperation", "position"], + + "strokeOpacity": 1, + "strokeStyle": "none", + "fillOpacity": 1, + "fillStyle": "none", + "lineDash": [], + "lineDashOffset": 0, + "globalAlpha": 1, + "lineWidth": 1, + "lineCap": "butt", + "lineJoin": "miter", + "miterLimit": 10, + "shadowOffsetX": 0, + "shadowOffsetY": 0, + "shadowBlur": 0, + "shadowColor": "none", + "globalCompositeOperation": "src", + + urlStringRe: /^url\(#([\w\-]+)\)$/, + + constructor: function (SvgSurface) { + this.surface = SvgSurface; + this.status = []; + this.matrix = new Ext.draw.Matrix(); + this.path = null; + this.clear(); + }, + + /** + * Clears the context. + */ + clear: function () { + this.group = this.surface.mainGroup; + this.position = 0; + this.path = null; + }, + + /** + * @private + * @param {String} tag + * @return {*} + */ + getElement: function (tag) { + return this.surface.getSvgElement(this.group, tag, this.position++); + }, + + /** + * @private + * + * Destroys the DOM element and all associated gradients. + * + * @param element {HTMLElement|Ext.dom.Element|String} DOM element. + */ + removeElement: function (element) { + var element = Ext.fly(element), + fill, stroke, fillMatch, strokeMatch, + gradients, gradient, key; + + if (!element) { + return; + } + if (element.dom.tagName === 'g') { + gradients = element.dom.gradients; + for (key in gradients) { + gradients[key].destroy(); + } + } else { + fill = element.getAttribute('fill'); + stroke = element.getAttribute('stroke'); + fillMatch = fill && fill.match(this.urlStringRe); + strokeMatch = stroke && stroke.match(this.urlStringRe); + if (fillMatch && fillMatch[1]) { + gradient = Ext.fly(fillMatch[1]); + if (gradient) { + gradient.destroy(); + } + } + if (strokeMatch && strokeMatch[1]) { + gradient = Ext.fly(strokeMatch[1]); + if (gradient) { + gradient.destroy(); + } + } + } + element.destroy(); + }, + + /** + * Pushes the context state to the state stack. + */ + save: function () { + var toSave = this.toSave, + obj = {}, + group = this.getElement('g'), + key, i; + + for (i = 0; i < toSave.length; i++) { + key = toSave[i]; + if (key in this) { + obj[key] = this[key]; + } + } + this.position = 0; + obj.matrix = this.matrix.clone(); + this.status.push(obj); + this.group = group; + return group; + }, + + /** + * Pops the state stack and restores the state. + */ + restore: function () { + var toSave = this.toSave, + obj = this.status.pop(), + children = this.group.dom.childNodes, + key, i; + + // Removing extra DOM elements that were not reused. + while (children.length > this.position) { + this.removeElement(children[children.length - 1]); + } + for (i = 0; i < toSave.length; i++) { + key = toSave[i]; + if (key in obj) { + this[key] = obj[key]; + } else { + delete this[key]; + } + } + + this.setTransform.apply(this, obj.matrix.elements); + this.group = this.group.getParent(); + }, + + /** + * Changes the transformation matrix to apply the matrix given by the arguments as described below. + * @param {Number} xx + * @param {Number} yx + * @param {Number} xy + * @param {Number} yy + * @param {Number} dx + * @param {Number} dy + */ + transform: function (xx, yx, xy, yy, dx, dy) { + if (this.path) { + var inv = Ext.draw.Matrix.fly([xx, yx, xy, yy, dx, dy]).inverse(); + this.path.transform(inv); + } + this.matrix.append(xx, yx, xy, yy, dx, dy); + }, + + /** + * Changes the transformation matrix to the matrix given by the arguments as described below. + * @param {Number} xx + * @param {Number} yx + * @param {Number} xy + * @param {Number} yy + * @param {Number} dx + * @param {Number} dy + */ + setTransform: function (xx, yx, xy, yy, dx, dy) { + if (this.path) { + this.path.transform(this.matrix); + } + this.matrix.reset(); + this.transform(xx, yx, xy, yy, dx, dy); + }, + + /** + * Scales the current context by the specified horizontal (x) and vertical (y) factors. + * @param {Number} x The horizontal scaling factor, where 1 equals unity or 100% scale. + * @param {Number} y The vertical scaling factor. + */ + scale: function (x, y) { + this.transform(x, 0, 0, y, 0, 0); + }, + + /** + * Rotates the current context coordinates (that is, a transformation matrix). + * @param {Number} angle The rotation angle, in radians. + */ + rotate: function (angle) { + var xx = Math.cos(angle), + yx = Math.sin(angle), + xy = -Math.sin(angle), + yy = Math.cos(angle); + this.transform(xx, yx, xy, yy, 0, 0); + }, + + /** + * Specifies values to move the origin point in a canvas. + * @param {Number} x The value to add to horizontal (or x) coordinates. + * @param {Number} y The value to add to vertical (or y) coordinates. + */ + translate: function (x, y) { + this.transform(1, 0, 0, 1, x, y); + }, + + setGradientBBox: function (bbox) { + this.bbox = bbox; + }, + + /** + * Resets the current default path. + */ + beginPath: function () { + this.path = new Ext.draw.Path(); + }, + + /** + * Creates a new subpath with the given point. + * @param {Number} x + * @param {Number} y + */ + moveTo: function (x, y) { + if (!this.path) { + this.beginPath(); + } + this.path.moveTo(x, y); + this.path.element = null; + }, + + /** + * Adds the given point to the current subpath, connected to the previous one by a straight line. + * @param {Number} x + * @param {Number} y + */ + lineTo: function (x, y) { + if (!this.path) { + this.beginPath(); + } + this.path.lineTo(x, y); + this.path.element = null; + }, + + /** + * Adds a new closed subpath to the path, representing the given rectangle. + * @param {Number} x + * @param {Number} y + * @param {Number} width + * @param {Number} height + */ + rect: function (x, y, width, height) { + this.moveTo(x, y); + this.lineTo(x + width, y); + this.lineTo(x + width, y + height); + this.lineTo(x, y + height); + this.closePath(); + }, + + /** + * Paints the box that outlines the given rectangle onto the canvas, using the current stroke style. + * @param {Number} x + * @param {Number} y + * @param {Number} width + * @param {Number} height + */ + strokeRect: function (x, y, width, height) { + this.beginPath(); + this.rect(x, y, width, height); + this.stroke(); + }, + + /** + * Paints the given rectangle onto the canvas, using the current fill style. + * @param {Number} x + * @param {Number} y + * @param {Number} width + * @param {Number} height + */ + fillRect: function (x, y, width, height) { + this.beginPath(); + this.rect(x, y, width, height); + this.fill(); + }, + + /** + * Marks the current subpath as closed, and starts a new subpath with a point the same as the start and end of the newly closed subpath. + */ + closePath: function () { + if (!this.path) { + this.beginPath(); + } + this.path.closePath(); + this.path.element = null; + }, + + /** + * Arc command using svg parameters. + * @param {Number} r1 + * @param {Number} r2 + * @param {Number} rotation + * @param {Number} large + * @param {Number} swipe + * @param {Number} x2 + * @param {Number} y2 + */ + arcSvg: function (r1, r2, rotation, large, swipe, x2, y2) { + if (!this.path) { + this.beginPath(); + } + this.path.arcSvg(r1, r2, rotation, large, swipe, x2, y2); + this.path.element = null; + }, + + /** + * Adds points to the subpath such that the arc described by the circumference of the circle described by the arguments, starting at the given start angle and ending at the given end angle, going in the given direction (defaulting to clockwise), is added to the path, connected to the previous point by a straight line. + * @param {Number} x + * @param {Number} y + * @param {Number} radius + * @param {Number} startAngle + * @param {Number} endAngle + * @param {Number} anticlockwise + */ + arc: function (x, y, radius, startAngle, endAngle, anticlockwise) { + if (!this.path) { + this.beginPath(); + } + this.path.arc(x, y, radius, startAngle, endAngle, anticlockwise); + this.path.element = null; + }, + + /** + * Adds points to the subpath such that the arc described by the circumference of the ellipse described by the arguments, starting at the given start angle and ending at the given end angle, going in the given direction (defaulting to clockwise), is added to the path, connected to the previous point by a straight line. + * @param {Number} x + * @param {Number} y + * @param {Number} radiusX + * @param {Number} radiusY + * @param {Number} rotation + * @param {Number} startAngle + * @param {Number} endAngle + * @param {Number} anticlockwise + */ + ellipse: function (x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) { + if (!this.path) { + this.beginPath(); + } + this.path.ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise); + this.path.element = null; + }, + + /** + * Adds an arc with the given control points and radius to the current subpath, connected to the previous point by a straight line. + * If two radii are provided, the first controls the width of the arc's ellipse, and the second controls the height. If only one is provided, or if they are the same, the arc is from a circle. + * In the case of an ellipse, the rotation argument controls the clockwise inclination of the ellipse relative to the x-axis. + * @param {Number} x1 + * @param {Number} y1 + * @param {Number} x2 + * @param {Number} y2 + * @param {Number} radiusX + * @param {Number} radiusY + * @param {Number} rotation + */ + arcTo: function (x1, y1, x2, y2, radiusX, radiusY, rotation) { + if (!this.path) { + this.beginPath(); + } + this.path.arcTo(x1, y1, x2, y2, radiusX, radiusY, rotation); + this.path.element = null; + }, + + /** + * Adds the given point to the current subpath, connected to the previous one by a cubic Bézier curve with the given control points. + * @param {Number} x1 + * @param {Number} y1 + * @param {Number} x2 + * @param {Number} y2 + * @param {Number} x3 + * @param {Number} y3 + */ + bezierCurveTo: function (x1, y1, x2, y2, x3, y3) { + if (!this.path) { + this.beginPath(); + } + this.path.bezierCurveTo(x1, y1, x2, y2, x3, y3); + this.path.element = null; + }, + + /** + * Strokes the given text at the given position. If a maximum width is provided, the text will be scaled to fit that width if necessary. + * @param {String} text + * @param {Number} x + * @param {Number} y + */ + strokeText: function (text, x, y) { + text = String(text); + if (this.strokeStyle) { + var element = this.getElement('text'), + tspan = this.surface.getSvgElement(element, 'tspan', 0); + this.surface.setElementAttributes(element, { + "x": x, + "y": y, + "transform": this.matrix.toSvg(), + "stroke": this.strokeStyle, + "fill": "none", + "opacity": this.globalAlpha, + "stroke-opacity": this.strokeOpacity, + "style": "font: " + this.font + }); + if (this.lineDash.length) { + this.surface.setElementAttributes(element, { + "stroke-dasharray": this.lineDash.join(','), + "stroke-dashoffset": this.lineDashOffset + }); + } + if (tspan.dom.firstChild) { + tspan.dom.removeChild(tspan.dom.firstChild); + } + this.surface.setElementAttributes(tspan, { + "alignment-baseline": "middle", + "baseline-shift": "-50%" + }); + tspan.appendChild(document.createTextNode(Ext.String.htmlDecode(text))); + } + }, + + /** + * Fills the given text at the given position. If a maximum width is provided, the text will be scaled to fit that width if necessary. + * @param {String} text + * @param {Number} x + * @param {Number} y + */ + fillText: function (text, x, y) { + text = String(text); + if (this.fillStyle) { + var element = this.getElement('text'), + tspan = this.surface.getSvgElement(element, 'tspan', 0); + this.surface.setElementAttributes(element, { + "x": x, + "y": y, + "transform": this.matrix.toSvg(), + "fill": this.fillStyle, + "opacity": this.globalAlpha, + "fill-opacity": this.fillOpacity, + "style": "font: " + this.font + }); + if (tspan.dom.firstChild) { + tspan.dom.removeChild(tspan.dom.firstChild); + } + this.surface.setElementAttributes(tspan, { + "alignment-baseline": "middle", + "baseline-shift": "-50%" + }); + tspan.appendChild(document.createTextNode(Ext.String.htmlDecode(text))); + } + }, + + /** + * Draws the given image onto the canvas. + * If the first argument isn't an img, canvas, or video element, throws a TypeMismatchError exception. If the image has no image data, throws an InvalidStateError exception. If the one of the source rectangle dimensions is zero, throws an IndexSizeError exception. If the image isn't yet fully decoded, then nothing is drawn. + * @param {HTMLElement} image + * @param {Number} sx + * @param {Number} sy + * @param {Number} sw + * @param {Number} sh + * @param {Number} dx + * @param {Number} dy + * @param {Number} dw + * @param {Number} dh + */ + drawImage: function (image, sx, sy, sw, sh, dx, dy, dw, dh) { + var me = this, + element = me.getElement('image'), + x = sx, y = sy, + width = typeof sw === 'undefined' ? image.width : sw, + height = typeof sh === 'undefined' ? image.height : sh, + viewBox = null; + if (typeof dh !== 'undefined') { + viewBox = sx + " " + sy + " " + sw + " " + sh; + x = dx; + y = dy; + width = dw; + height = dh; + } + element.dom.setAttributeNS("http:/" + "/www.w3.org/1999/xlink", "href", image.src); + me.surface.setElementAttributes(element, { + viewBox: viewBox, + x: x, + y: y, + width: width, + height: height, + opacity: me.globalAlpha, + transform: me.matrix.toSvg() + }); + }, + + /** + * Fills the subpaths of the current default path or the given path with the current fill style. + */ + fill: function () { + if (!this.path) { + return; + } + if (this.fillStyle) { + var path, + fillGradient = this.fillGradient, + bbox = this.bbox, + element = this.path.element; + if (!element) { + path = this.path.toString(); + element = this.path.element = this.getElement('path'); + this.surface.setElementAttributes(element, { + "d": path, + "transform": this.matrix.toSvg() + }); + } + this.surface.setElementAttributes(element, { + "fill": fillGradient && bbox ? fillGradient.generateGradient(this, bbox) : this.fillStyle, + "fill-opacity": this.fillOpacity * this.globalAlpha + }); + } + }, + + /** + * Strokes the subpaths of the current default path or the given path with the current stroke style. + */ + stroke: function () { + if (!this.path) { + return; + } + if (this.strokeStyle) { + var path, + strokeGradient = this.strokeGradient, + bbox = this.bbox, + element = this.path.element; + if (!element || !this.path.svgString) { + path = this.path.toString(); + element = this.path.element = this.getElement('path'); + this.surface.setElementAttributes(element, { + "fill": "none", + "d": path, + "transform": this.matrix.toSvg() + }); + } + this.surface.setElementAttributes(element, { + "stroke": strokeGradient && bbox ? strokeGradient.generateGradient(this, bbox) : this.strokeStyle, + "stroke-linecap": this.lineCap, + "stroke-linejoin": this.lineJoin, + "stroke-width": this.lineWidth, + "stroke-opacity": this.strokeOpacity * this.globalAlpha + }); + if (this.lineDash.length) { + this.surface.setElementAttributes(element, { + "stroke-dasharray": this.lineDash.join(','), + "stroke-dashoffset": this.lineDashOffset + }); + } + } + }, + + /** + * @protected + * + * Note: After the method guarantees the transform matrix will be inverted. + * @param {Object} attr The attribute object + * @param {Boolean} [transformFillStroke] Indicate whether to transform fill and stroke. If this is not + * given, then uses `attr.transformFillStroke` instead. + */ + fillStroke: function (attr, transformFillStroke) { + var ctx = this, + fillStyle = ctx.fillStyle, + strokeStyle = ctx.strokeStyle, + fillOpacity = ctx.fillOpacity, + strokeOpacity = ctx.strokeOpacity; + + if (transformFillStroke === undefined) { + transformFillStroke = attr.transformFillStroke; + } + + if (!transformFillStroke) { + attr.inverseMatrix.toContext(ctx); + } + + if (fillStyle && fillOpacity !== 0) { + ctx.fill(); + } + + if (strokeStyle && strokeOpacity !== 0) { + ctx.stroke(); + } + }, + + appendPath: function (path) { + this.path = path.clone(); + }, + + /** + * Returns an object that represents a linear gradient that paints along the line given by the coordinates represented by the arguments. + * @param {Number} x0 + * @param {Number} y0 + * @param {Number} x1 + * @param {Number} y1 + * @return {Ext.draw.engine.SvgContext.Gradient} + */ + createLinearGradient: function (x0, y0, x1, y1) { + var me = this, + element = me.surface.getNextDef('linearGradient'), + gradients = me.group.dom.gradients || (me.group.dom.gradients = {}), + gradient; + me.surface.setElementAttributes(element, { + "x1": x0, + "y1": y0, + "x2": x1, + "y2": y1, + "gradientUnits": "userSpaceOnUse" + }); + gradient = new Ext.draw.engine.SvgContext.Gradient(me, me.surface, element); + gradients[element.dom.id] = gradient; + return gradient; + }, + + /** + * Returns a CanvasGradient object that represents a radial gradient that paints along the cone given by the circles represented by the arguments. + * If either of the radii are negative, throws an IndexSizeError exception. + * @param {Number} x0 + * @param {Number} y0 + * @param {Number} r0 + * @param {Number} x1 + * @param {Number} y1 + * @param {Number} r1 + * @return {Ext.draw.engine.SvgContext.Gradient} + */ + createRadialGradient: function (x0, y0, r0, x1, y1, r1) { + var me = this, + element = me.surface.getNextDef('radialGradient'), + gradients = me.group.dom.gradients || (me.group.dom.gradients = {}), + gradient; + me.surface.setElementAttributes(element, { + "fx": x0, + "fy": y0, + "cx": x1, + "cy": y1, + "r": r1, + "gradientUnits": "userSpaceOnUse" + }); + gradient = new Ext.draw.engine.SvgContext.Gradient(me, me.surface, element, r0 / r1); + gradients[element.dom.id] = gradient; + return gradient; + } +}); + +/** + * @class Ext.draw.engine.SvgContext.Gradient + */ +Ext.define("Ext.draw.engine.SvgContext.Gradient", { + + statics: { + map: {} + }, + + constructor: function (ctx, surface, element, compression) { + var map = this.statics().map, + oldInstance; + + // Because of the way Ext.draw.engine.Svg.getNextDef works, + // there is no guarantee that an existing DOM element from the 'defs' section won't be used + // for the 'element' param. + oldInstance = map[element.dom.id]; + if (oldInstance) { + oldInstance.element = null; + } + map[element.dom.id] = this; + + this.ctx = ctx; + this.surface = surface; + this.element = element; + this.position = 0; + this.compression = compression || 0; + }, + + /** + * Adds a color stop with the given color to the gradient at the given offset. 0.0 is the offset at one end of the gradient, 1.0 is the offset at the other end. + * @param {Number} offset + * @param {String} color + */ + addColorStop: function (offset, color) { + var stop = this.surface.getSvgElement(this.element, 'stop', this.position++), + compression = this.compression; + this.surface.setElementAttributes(stop, { + "offset": (((1 - compression) * offset + compression) * 100).toFixed(2) + '%', + "stop-color": color, + "stop-opacity": Ext.draw.Color.fly(color).a.toFixed(15) + }); + }, + + toString: function () { + var children = this.element.dom.childNodes; + // Removing surplus stops in case existing gradient element with more stops was reused. + while (children.length > this.position) { + Ext.fly(children[children.length - 1]).destroy(); + } + return 'url(#' + this.element.getId() + ')'; + }, + + destroy: function () { + var map = this.statics().map, + element = this.element; + if (element) { + delete map[element.dom.id]; + element.destroy(); + } + this.callSuper(); + } +}); + +/** + * @class Ext.draw.engine.Svg + * @extends Ext.draw.Surface + * + * SVG engine. + */ +Ext.define('Ext.draw.engine.Svg', { + extend: Ext.draw.Surface , + + + statics: { + BBoxTextCache: {} + }, + + config: { + /** + * Nothing needs to be done in high precision mode. + */ + highPrecision: false + }, + + getElementConfig: function () { + return { + reference: 'element', + style: { + position: 'absolute' + }, + children: [ + { + reference: 'innerElement', + style: { + width: '100%', + height: '100%', + position: 'relative' + }, + children: [ + { + tag: 'svg', + reference: 'svgElement', + namespace: "http://www.w3.org/2000/svg", + version: 1.1, + cls: 'x-surface' + } + ] + } + ] + }; + }, + + constructor: function (config) { + var me = this; + me.callSuper([config]); + me.mainGroup = me.createSvgNode("g"); + me.defElement = me.createSvgNode("defs"); + // me.svgElement is assigned in element creation of Ext.Component. + me.svgElement.appendChild(me.mainGroup); + me.svgElement.appendChild(me.defElement); + me.ctx = new Ext.draw.engine.SvgContext(me); + }, + + /** + * Creates a DOM element under the SVG namespace of the given type. + * @param {String} type The type of the SVG DOM element. + * @return {*} The created element. + */ + createSvgNode: function (type) { + var node = document.createElementNS("http://www.w3.org/2000/svg", type); + return Ext.get(node); + }, + + /** + * @private + * Returns the SVG DOM element at the given position. If it does not already exist or is a different element tag + * it will be created and inserted into the DOM. + * @param {Ext.dom.Element} group The parent DOM element. + * @param {String} tag The SVG element tag. + * @param {Number} position The position of the element in the DOM. + * @return {Ext.dom.Element} The SVG element. + */ + getSvgElement: function (group, tag, position) { + var element; + if (group.dom.childNodes.length > position) { + element = group.dom.childNodes[position]; + if (element.tagName === tag) { + return Ext.get(element); + } else { + Ext.destroy(element); + } + } + + element = Ext.get(this.createSvgNode(tag)); + if (position === 0) { + group.insertFirst(element); + } else { + element.insertAfter(Ext.fly(group.dom.childNodes[position - 1])); + } + element.cache = {}; + return element; + }, + + /** + * @private + * Applies attributes to the given element. + * @param {Ext.dom.Element} element The DOM element to be applied. + * @param {Object} attributes The attributes to apply to the element. + */ + setElementAttributes: function (element, attributes) { + var dom = element.dom, + cache = element.cache, + name, value; + for (name in attributes) { + value = attributes[name]; + if (cache[name] !== value) { + cache[name] = value; + dom.setAttribute(name, value); + } + } + }, + + /** + * @private + * Gets the next reference element under the SVG 'defs' tag. + * @param {String} tagName The type of reference element. + * @return {Ext.dom.Element} The reference element. + */ + getNextDef: function (tagName) { + return this.getSvgElement(this.defElement, tagName, this.defPosition++); + }, + + /** + * @inheritdoc + */ + clearTransform: function () { + var me = this; + me.mainGroup.set({transform: me.matrix.toSvg()}); + }, + + /** + * @inheritdoc + */ + clear: function () { + this.ctx.clear(); + this.defPosition = 0; + }, + + /** + * @inheritdoc + */ + renderSprite: function (sprite) { + var me = this, + region = me.getRegion(), + ctx = me.ctx; + if (sprite.attr.hidden || sprite.attr.opacity === 0) { + ctx.save(); + ctx.restore(); + return; + } + try { + sprite.element = ctx.save(); + sprite.preRender(this); + sprite.useAttributes(ctx, region); + if (false === sprite.render(this, ctx, [0, 0, region[2], region[3]])) { + return false; + } + sprite.setDirty(false); + } finally { + ctx.restore(); + } + }, + + /** + * Destroys the Canvas element and prepares it for Garbage Collection. + */ + destroy: function (path, matrix, band) { + var me = this; + me.ctx.destroy(); + me.mainGroup.destroy(); + delete me.mainGroup; + delete me.ctx; + me.callSuper(arguments); + }, + + remove: function (sprite, destroySprite) { + if (sprite && sprite.element) { + //if sprite has an associated svg element remove it from the surface + if (this.ctx) { + this.ctx.removeElement(sprite.element); + } else { + sprite.element.destroy(); + } + sprite.element = null; + } + this.callSuper(arguments); + } +}); + +/** + * Provides specific methods to draw with 2D Canvas element. + */ +Ext.define('Ext.draw.engine.Canvas', { + extend: Ext.draw.Surface , + config: { + /** + * @cfg {Boolean} highPrecision + * True to have the canvas use JavaScript Number instead of single precision floating point for transforms. + * + * For example, when using huge data to plot line series, the transform matrix of the canvas will have + * a big element. Due to the implementation of SVGMatrix, the elements are restored by 32-bits floats, which + * will work incorrectly. To compensate that, we enable the canvas context to perform all the transform by + * JavaScript. Do not use it if you are not encountering 32-bits floating point errors problem since it will + * have a performance penalty. + */ + highPrecision: false + }, + + + statics: { + contextOverrides: { + /** + * @ignore + */ + setGradientBBox: function (bbox) { + this.bbox = bbox; + }, + + /** + * Fills the subpaths of the current default path or the given path with the current fill style. + * @ignore + */ + fill: function () { + var fillStyle = this.fillStyle, + fillGradient = this.fillGradient, + fillOpacity = this.fillOpacity, + rgba = 'rgba(0, 0, 0, 0)', + rgba0 = 'rgba(0, 0, 0, 0.0)', + bbox = this.bbox, + alpha = this.globalAlpha; + + if (fillStyle !== rgba && fillStyle !== rgba0 && fillOpacity !== 0) { + if (fillGradient && bbox) { + this.fillStyle = fillGradient.generateGradient(this, bbox); + } + + if (fillOpacity !== 1) { + this.globalAlpha = alpha * fillOpacity; + } + this.$fill(); + if (fillOpacity !== 1) { + this.globalAlpha = alpha; + } + + if (fillGradient && bbox) { + this.fillStyle = fillStyle; + } + } + }, + + /** + * Strokes the subpaths of the current default path or the given path with the current stroke style. + * @ignore + */ + stroke: function () { + var strokeStyle = this.strokeStyle, + strokeGradient = this.strokeGradient, + strokeOpacity = this.strokeOpacity, + rgba = 'rgba(0, 0, 0, 0)', + rgba0 = 'rgba(0, 0, 0, 0.0)', + bbox = this.bbox, + alpha = this.globalAlpha; + + if (strokeStyle !== rgba && strokeStyle !== rgba0 && strokeOpacity !== 0) { + if (strokeGradient && bbox) { + this.strokeStyle = strokeGradient.generateGradient(this, bbox); + } + + if (strokeOpacity !== 1) { + this.globalAlpha = alpha * strokeOpacity; + } + this.$stroke(); + if (strokeOpacity !== 1) { + this.globalAlpha = alpha; + } + + if (strokeGradient && bbox) { + this.strokeStyle = strokeStyle; + } + } + }, + + /** + * @ignore + */ + fillStroke: function (attr, transformFillStroke) { + var ctx = this, + fillStyle = this.fillStyle, + fillOpacity = this.fillOpacity, + strokeStyle = this.strokeStyle, + strokeOpacity = this.strokeOpacity, + shadowColor = ctx.shadowColor, + shadowBlur = ctx.shadowBlur, + rgba = 'rgba(0, 0, 0, 0)', + rgba0 = 'rgba(0, 0, 0, 0.0)'; + + if (transformFillStroke === undefined) { + transformFillStroke = attr.transformFillStroke; + } + + if (!transformFillStroke) { + attr.inverseMatrix.toContext(ctx); + } + if (fillStyle !== rgba && fillStyle !== rgba0 && fillOpacity !== 0) { + ctx.fill(); + ctx.shadowColor = 'rgba(0,0,0,0)'; + ctx.shadowBlur = 0; + } + if (strokeStyle !== rgba && strokeStyle !== rgba0 && strokeOpacity !== 0) { + ctx.stroke(); + } + ctx.shadowColor = shadowColor; + ctx.shadowBlur = shadowBlur; + }, + + /** + * Adds points to the subpath such that the arc described by the circumference of the + * ellipse described by the arguments, starting at the given start angle and ending at + * the given end angle, going in the given direction (defaulting to clockwise), is added + * to the path, connected to the previous point by a straight line. + * @ignore + */ + ellipse: function (cx, cy, rx, ry, rotation, start, end, anticlockwise) { + var cos = Math.cos(rotation), + sin = Math.sin(rotation); + this.transform(cos * rx, sin * rx, -sin * ry, cos * ry, cx, cy); + this.arc(0, 0, 1, start, end, anticlockwise); + this.transform( + cos / rx, -sin / ry, + sin / rx, cos / ry, + -(cos * cx + sin * cy) / rx, (sin * cx - cos * cy) / ry); + }, + + /** + * Uses the given path commands to begin a new path on the canvas. + * @ignore + */ + appendPath: function (path) { + var me = this, + i = 0, j = 0, + types = path.types, + coords = path.coords, + ln = path.types.length; + me.beginPath(); + for (; i < ln; i++) { + switch (types[i]) { + case "M": + me.moveTo(coords[j], coords[j + 1]); + j += 2; + break; + case "L": + me.lineTo(coords[j], coords[j + 1]); + j += 2; + break; + case "C": + me.bezierCurveTo( + coords[j], coords[j + 1], + coords[j + 2], coords[j + 3], + coords[j + 4], coords[j + 5] + ); + j += 6; + break; + case "Z": + me.closePath(); + break; + } + } + } + } + }, + + splitThreshold: 1800, + + getElementConfig: function () { + return { + reference: 'element', + style: { + position: 'absolute' + }, + children: [ + { + reference: 'innerElement', + style: { + width: '100%', + height: '100%', + position: 'relative' + } + } + ] + }; + }, + + /** + * @private + * + * Creates the canvas element. + */ + createCanvas: function () { + var canvas = Ext.Element.create({ + tag: 'canvas', + cls: 'x-surface' + }), + overrides = Ext.draw.engine.Canvas.contextOverrides, + ctx = canvas.dom.getContext('2d'), + backingStoreRatio = ctx.webkitBackingStorePixelRatio || + ctx.mozBackingStorePixelRatio || + ctx.msBackingStorePixelRatio || + ctx.oBackingStorePixelRatio || + ctx.backingStorePixelRatio || 1, + name; + + // Windows Phone does not currently support backingStoreRatio + this.devicePixelRatio /= (Ext.os.is.WindowsPhone) ? window.innerWidth / window.screen.width : backingStoreRatio; + + if (ctx.ellipse) { + delete overrides.ellipse; + } + + for (name in overrides) { + ctx['$' + name] = ctx[name]; + } + Ext.apply(ctx, overrides); + + if (this.getHighPrecision()) { + this.enablePrecisionCompensation(ctx); + } else { + this.disablePrecisionCompensation(ctx); + } + + this.innerElement.appendChild(canvas); + this.canvases.push(canvas); + this.contexts.push(ctx); + }, + + /** + * Initialize the canvas element. + */ + initElement: function () { + this.callSuper(); + this.canvases = []; + this.contexts = []; + this.createCanvas(); + this.activeCanvases = 0; + }, + + updateHighPrecision: function (pc) { + var contexts = this.contexts, + ln = contexts.length, + i, context; + + for (i = 0; i < ln; i++) { + context = contexts[i]; + if (pc) { + this.enablePrecisionCompensation(context); + } else { + this.disablePrecisionCompensation(context); + } + } + }, + + precisionMethods: { + rect: false, + fillRect: false, + strokeRect: false, + clearRect: false, + moveTo: false, + lineTo: false, + arc: false, + arcTo: false, + save: false, + restore: false, + updatePrecisionCompensate: false, + setTransform: false, + transform: false, + scale: false, + translate: false, + rotate: false, + quadraticCurveTo: false, + bezierCurveTo: false, + createLinearGradient: false, + createRadialGradient: false, + fillText: false, + strokeText: false, + drawImage: false + }, + + /** + * @private + * Clears canvas of compensation for canvas' use of single precision floating point. + * @param {CanvasRenderingContext2D} ctx The canvas context. + */ + disablePrecisionCompensation: function (ctx) { + var precisionMethods = this.precisionMethods, + name; + + for (name in precisionMethods) { + delete ctx[name]; + } + + this.setDirty(true); + }, + + /** + * @private + * Compensate for canvas' use of single precision floating point. + * @param {CanvasRenderingContext2D} ctx The canvas context. + */ + enablePrecisionCompensation: function (ctx) { + var surface = this, + xx = 1, yy = 1, + dx = 0, dy = 0, + matrix = new Ext.draw.Matrix(), + transStack = [], + comp = {}, + originalCtx = ctx.constructor.prototype; + + /** + * @class CanvasRenderingContext2D + * @ignore + */ + var override = { + /** + * Adds a new closed subpath to the path, representing the given rectangle. + * @return {*} + * @ignore + */ + rect: function (x, y, w, h) { + return originalCtx.rect.call(this, x * xx + dx, y * yy + dy, w * xx, h * yy); + }, + + /** + * Paints the given rectangle onto the canvas, using the current fill style. + * @ignore + */ + fillRect: function (x, y, w, h) { + this.updatePrecisionCompensateRect(); + originalCtx.fillRect.call(this, x * xx + dx, y * yy + dy, w * xx, h * yy); + this.updatePrecisionCompensate(); + }, + + /** + * Paints the box that outlines the given rectangle onto the canvas, using the current stroke style. + * @ignore + */ + strokeRect: function (x, y, w, h) { + this.updatePrecisionCompensateRect(); + originalCtx.strokeRect.call(this, x * xx + dx, y * yy + dy, w * xx, h * yy); + this.updatePrecisionCompensate(); + }, + + /** + * Clears all pixels on the canvas in the given rectangle to transparent black. + * @ignore + */ + clearRect: function (x, y, w, h) { + return originalCtx.clearRect.call(this, x * xx + dx, y * yy + dy, w * xx, h * yy); + }, + + /** + * Creates a new subpath with the given point. + * @ignore + */ + moveTo: function (x, y) { + return originalCtx.moveTo.call(this, x * xx + dx, y * yy + dy); + }, + + /** + * Adds the given point to the current subpath, connected to the previous one by a straight line. + * @ignore + */ + lineTo: function (x, y) { + return originalCtx.lineTo.call(this, x * xx + dx, y * yy + dy); + }, + + /** + * Adds points to the subpath such that the arc described by the circumference of the + * circle described by the arguments, starting at the given start angle and ending at + * the given end angle, going in the given direction (defaulting to clockwise), is added + * to the path, connected to the previous point by a straight line. + * @ignore + */ + arc: function (x, y, radius, startAngle, endAngle, anticlockwise) { + this.updatePrecisionCompensateRect(); + originalCtx.arc.call(this, x * xx + dx, y * xx + dy, radius * xx, startAngle, endAngle, anticlockwise); + this.updatePrecisionCompensate(); + }, + + /** + * Adds an arc with the given control points and radius to the current subpath, + * connected to the previous point by a straight line. If two radii are provided, the + * first controls the width of the arc's ellipse, and the second controls the height. If + * only one is provided, or if they are the same, the arc is from a circle. + * + * In the case of an ellipse, the rotation argument controls the clockwise inclination + * of the ellipse relative to the x-axis. + * @ignore + */ + arcTo: function (x1, y1, x2, y2, radius) { + this.updatePrecisionCompensateRect(); + originalCtx.arcTo.call(this, x1 * xx + dx, y1 * yy + dy, x2 * xx + dx, y2 * yy + dy, radius * xx); + this.updatePrecisionCompensate(); + }, + + /** + * Pushes the context state to the state stack. + * @ignore + */ + save: function () { + transStack.push(matrix); + matrix = matrix.clone(); + return originalCtx.save.call(this); + }, + + /** + * Pops the state stack and restores the state. + * @ignore + */ + restore: function () { + matrix = transStack.pop(); + originalCtx.restore.call(this); + this.updatePrecisionCompensate(); + }, + + /** + * @ignore + */ + updatePrecisionCompensate: function () { + matrix.precisionCompensate(surface.devicePixelRatio, comp); + xx = comp.xx; + yy = comp.yy; + dx = comp.dx; + dy = comp.dy; + return originalCtx.setTransform.call(this, surface.devicePixelRatio, comp.b, comp.c, comp.d, 0, 0); + }, + + /** + * @ignore + */ + updatePrecisionCompensateRect: function () { + matrix.precisionCompensateRect(surface.devicePixelRatio, comp); + xx = comp.xx; + yy = comp.yy; + dx = comp.dx; + dy = comp.dy; + return originalCtx.setTransform.call(this, surface.devicePixelRatio, comp.b, comp.c, comp.d, 0, 0); + }, + + /** + * Changes the transformation matrix to the matrix given by the arguments as described below. + * @ignore + */ + setTransform: function (x2x, x2y, y2x, y2y, newDx, newDy) { + matrix.set(x2x, x2y, y2x, y2y, newDx, newDy); + this.updatePrecisionCompensate(); + }, + + /** + * Changes the transformation matrix to apply the matrix given by the arguments as described below. + * @ignore + */ + transform: function (x2x, x2y, y2x, y2y, newDx, newDy) { + matrix.append(x2x, x2y, y2x, y2y, newDx, newDy); + this.updatePrecisionCompensate(); + }, + + /** + * Scales the transformation matrix. + * @return {*} + * @ignore + */ + scale: function (sx, sy) { + return this.transform(sx, 0, 0, sy, 0, 0); + }, + + /** + * Translates the transformation matrix. + * @return {*} + * @ignore + */ + translate: function (dx, dy) { + return this.transform(1, 0, 0, 1, dx, dy); + }, + + /** + * Rotates the transformation matrix. + * @return {*} + * @ignore + */ + rotate: function (radians) { + var cos = Math.cos(radians), + sin = Math.sin(radians); + return this.transform(cos, sin, -sin, cos, 0, 0); + }, + + /** + * Adds the given point to the current subpath, connected to the previous one by a + * quadratic Bézier curve with the given control point. + * @return {*} + * @ignore + */ + quadraticCurveTo: function (cx, cy, x, y) { + return originalCtx.quadraticCurveTo.call(this, + cx * xx + dx, + cy * yy + dy, + x * xx + dx, + y * yy + dy + ); + }, + + /** + * Adds the given point to the current subpath, connected to the previous one by a cubic + * Bézier curve with the given control points. + * @return {*} + * @ignore + */ + bezierCurveTo: function (c1x, c1y, c2x, c2y, x, y) { + return originalCtx.bezierCurveTo.call(this, + c1x * xx + dx, + c1y * yy + dy, + c2x * xx + dx, + c2y * yy + dy, + x * xx + dx, + y * yy + dy + ); + }, + + /** + * Returns an object that represents a linear gradient that paints along the line given + * by the coordinates represented by the arguments. + * @return {*} + * @ignore + */ + createLinearGradient: function (x0, y0, x1, y1) { + this.updatePrecisionCompensateRect(); + var grad = originalCtx.createLinearGradient.call(this, + x0 * xx + dx, + y0 * yy + dy, + x1 * xx + dx, + y1 * yy + dy + ); + this.updatePrecisionCompensate(); + return grad; + }, + + /** + * Returns a CanvasGradient object that represents a radial gradient that paints along + * the cone given by the circles represented by the arguments. If either of the radii + * are negative, throws an IndexSizeError exception. + * @return {*} + * @ignore + */ + createRadialGradient: function (x0, y0, r0, x1, y1, r1) { + this.updatePrecisionCompensateRect(); + var grad = originalCtx.createLinearGradient.call(this, + x0 * xx + dx, + y0 * xx + dy, + r0 * xx, + x1 * xx + dx, + y1 * xx + dy, + r1 * xx + ); + this.updatePrecisionCompensate(); + return grad; + }, + + /** + * Fills the given text at the given position. If a maximum width is provided, the text + * will be scaled to fit that width if necessary. + * @ignore + */ + fillText: function (text, x, y, maxWidth) { + originalCtx.setTransform.apply(this, matrix.elements); + if (typeof maxWidth === 'undefined') { + originalCtx.fillText.call(this, text, x, y); + } else { + originalCtx.fillText.call(this, text, x, y, maxWidth); + } + this.updatePrecisionCompensate(); + }, + + /** + * Strokes the given text at the given position. If a + * maximum width is provided, the text will be scaled to + * fit that width if necessary. + * @ignore + */ + strokeText: function (text, x, y, maxWidth) { + originalCtx.setTransform.apply(this, matrix.elements); + if (typeof maxWidth === 'undefined') { + originalCtx.strokeText.call(this, text, x, y); + } else { + originalCtx.strokeText.call(this, text, x, y, maxWidth); + } + this.updatePrecisionCompensate(); + }, + + /** + * Fills the subpaths of the current default path or the given path with the current fill style. + * @ignore + */ + fill: function () { + this.updatePrecisionCompensateRect(); + originalCtx.fill.call(this); + this.updatePrecisionCompensate(); + }, + + /** + * Strokes the subpaths of the current default path or the given path with the current stroke style. + * @ignore + */ + stroke: function () { + this.updatePrecisionCompensateRect(); + originalCtx.stroke.call(this); + this.updatePrecisionCompensate(); + }, + + /** + * Draws the given image onto the canvas. If the first argument isn't an img, canvas, + * or video element, throws a TypeMismatchError exception. If the image has no image + * data, throws an InvalidStateError exception. If the one of the source rectangle + * dimensions is zero, throws an IndexSizeError exception. If the image isn't yet fully + * decoded, then nothing is drawn. + * @return {*} + * @ignore + */ + drawImage: function (img_elem, arg1, arg2, arg3, arg4, dst_x, dst_y, dw, dh) { + switch (arguments.length) { + case 3: + return originalCtx.drawImage.call(this, img_elem, arg1 * xx + dx, arg2 * yy + dy); + case 5: + return originalCtx.drawImage.call(this, img_elem, arg1 * xx + dx, arg2 * yy + dy, arg3 * xx, arg4 * yy); + case 9: + return originalCtx.drawImage.call(this, img_elem, arg1, arg2, arg3, arg4, dst_x * xx + dx, dst_y * yy * dy, dw * xx, dh * yy); + } + } + }; + Ext.apply(ctx, override); + this.setDirty(true); + }, + + // Continue docs for the Canvas class + /** @class Ext.draw.engine.Canvas */ + + updateRegion: function (region) { + this.callSuper([region]); + + var me = this, + l = Math.floor(region[0]), + t = Math.floor(region[1]), + r = Math.ceil(region[0] + region[2]), + b = Math.ceil(region[1] + region[3]), + devicePixelRatio = me.devicePixelRatio, + w = r - l, + h = b - t, + splitThreshold = Math.round(me.splitThreshold / devicePixelRatio), + splits = Math.ceil(w / splitThreshold), + activeCanvases = me.activeCanvases, + i, offsetX, dom, leftWidth; + + for (i = 0, offsetX = 0; i < splits; i++, offsetX += splitThreshold) { + if (i >= me.canvases.length) { + me.createCanvas(); + } + dom = me.canvases[i].dom; + dom.style.left = offsetX + 'px'; + if (h * devicePixelRatio !== dom.height) { + dom.height = h * devicePixelRatio; + dom.style.height = h + 'px'; + } + leftWidth = Math.min(splitThreshold, w - offsetX); + if (leftWidth * devicePixelRatio !== dom.width) { + dom.width = leftWidth * devicePixelRatio; + dom.style.width = leftWidth + 'px'; + } + me.applyDefaults(me.contexts[i]); + } + + for (; i < activeCanvases; i++) { + dom = me.canvases[i].dom; + dom.width = 0; + dom.height = 0; + } + me.activeCanvases = splits; + me.clear(); + }, + + /** + * @inheritdoc + */ + clearTransform: function () { + var me = this, + activeCanvases = me.activeCanvases, + i, ctx; + + for (i = 0; i < activeCanvases; i++) { + ctx = me.contexts[i]; + ctx.translate(-me.splitThreshold * i, 0); + ctx.scale(me.devicePixelRatio, me.devicePixelRatio); + me.matrix.toContext(ctx); + } + + }, + + /** + * @private + * @inheritdoc + */ + renderSprite: function (sprite) { + var me = this, + region = me._region, + surfaceMatrix = me.matrix, + parent = sprite._parent, + matrix = Ext.draw.Matrix.fly([1, 0, 0, 1, 0, 0]), + bbox, i, offsetX, ctx, width, left = 0, top, right = region[2], bottom; + + while (parent && (parent !== me)) { + matrix.prependMatrix(parent.matrix || parent.attr && parent.attr.matrix); + parent = parent.getParent(); + } + matrix.prependMatrix(surfaceMatrix); + bbox = sprite.getBBox(); + if (bbox) { + bbox = matrix.transformBBox(bbox); + } + + sprite.preRender(me); + + if (sprite.attr.hidden || sprite.attr.globalAlpha === 0) { + sprite.setDirty(false); + return; + } + + top = 0; + bottom = top + region[3]; + + for (i = 0, offsetX = 0; i < me.activeCanvases; i++, offsetX += me.splitThreshold / me.devicePixelRatio) { + ctx = me.contexts[i]; + width = Math.min(region[2] - offsetX, me.splitThreshold / me.devicePixelRatio); + left = offsetX; + right = left + width; + + if (bbox) { + if (bbox.x > right || + bbox.x + bbox.width < left || + bbox.y > bottom || + bbox.y + bbox.height < top) { + continue; + } + } + + try { + ctx.save(); + // Set attributes to context. + sprite.useAttributes(ctx, region); + // Render shape + if (false === sprite.render(me, ctx, [left, top, width, bottom - top], region)) { + return false; + } + } finally { + ctx.restore(); + } + } + sprite.setDirty(false); + }, + + applyDefaults: function (ctx) { + ctx.strokeStyle = 'rgba(0,0,0,0)'; + ctx.fillStyle = 'rgba(0,0,0,0)'; + ctx.textAlign = 'start'; + ctx.textBaseline = 'top'; + ctx.miterLimit = 1; + }, + + /** + * @inheritdoc + */ + clear: function () { + var me = this, + activeCanvases = this.activeCanvases, + i, canvas, ctx; + for (i = 0; i < activeCanvases; i++) { + canvas = me.canvases[i].dom; + ctx = me.contexts[i]; + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.clearRect(0, 0, canvas.width, canvas.height); + } + me.setDirty(true); + }, + + /** + * Destroys the Canvas element and prepares it for Garbage Collection. + */ + destroy: function () { + var me = this, + i, ln = me.canvases.length; + for (i = 0; i < ln; i++) { + me.contexts[i] = null; + me.canvases[i].destroy(); + me.canvases[i] = null; + } + delete me.contexts; + delete me.canvases; + me.callSuper(arguments); + } +}, function () { + if (Ext.os.is.Android4 && Ext.browser.is.Chrome) { + this.prototype.splitThreshold = 3000; + } else if (Ext.os.is.Android) { + this.prototype.splitThreshold = 1e10; + } +}); + +/** + * The Draw Component is a surface in which sprites can be rendered. The Draw Component + * manages and holds a `Surface` instance: an interface that has + * an SVG or VML implementation depending on the browser capabilities and where + * Sprites can be appended. + * One way to create a draw component is: + * + * var drawComponent = new Ext.draw.Component({ + * fullscreen: true, + * sprites: [{ + * type: 'circle', + * fill: '#79BB3F', + * radius: 100, + * x: 100, + * y: 100 + * }] + * }); + * + * In this case we created a draw component and added a sprite to it. + * The *type* of the sprite is *circle* so if you run this code you'll see a yellow-ish + * circle in a Window. When setting `viewBox` to `false` we are responsible for setting the object's position and + * dimensions accordingly. + * + * You can also add sprites by using the surface's add method: + * + * drawComponent.getSurface('main').add({ + * type: 'circle', + * fill: 'blue', + * radius: 100, + * x: 100, + * y: 100 + * }); + * + * For more information on Sprites, the core elements added to a draw component's surface, + * refer to the {@link Ext.draw.sprite.Sprite} documentation. + */ +Ext.define('Ext.draw.Component', { + + extend: Ext.Container , + xtype: 'draw', + defaultType: 'surface', + + + + + + + + engine: 'Ext.draw.engine.Canvas', + statics: { + WATERMARK: 'Powered by Sencha Touch GPLv3' + }, + config: { + cls: 'x-draw-component', + + /** + * @deprecated 2.2.0 Please implement custom resize event handler. + * Resize the draw component by the content size of the main surface. + * + * __Note:__ It is applied only when there is only one surface. + */ + autoSize: false, + + /** + * @deprecated 2.2.0 Please implement custom resize event handler. + * Pan/Zoom the content in main surface to fit the component size. + * + * __Note:__ It is applied only when there is only one surface. + */ + viewBox: false, + + /** + * @deprecated 2.2.0 Please implement custom resize event handler. + * Fit the main surface to the size of component. + * + * __Note:__ It is applied only when there is only one surface. + */ + fitSurface: true, + + /** + * @cfg {Function} [resizeHandler] The resize function that can be configured to have a behavior. + * + * __Note:__ since resize events trigger {@link #renderFrame} calls automatically, + * return `false` from the resize function, if it also calls `renderFrame`, to prevent double rendering. + */ + resizeHandler: null, + + background: null, + + sprites: null, + + /** + * @cfg {Object[]} gradients + * Defines a set of gradients that can be used as color properties + * (fillStyle and strokeStyle, but not shadowColor) in sprites. + * The gradients array is an array of objects with the following properties: + * - **id** - string - The unique name of the gradient. + * - **type** - string, optional - The type of the gradient. Available types are: 'linear', 'radial'. Defaults to 'linear'. + * - **angle** - number, optional - The angle of the gradient in degrees. + * - **stops** - array - An array of objects with 'color' and 'offset' properties, where 'offset' is a real number from 0 to 1. + * + * For example: + * + * gradients: [{ + * id: 'gradientId1', + * type: 'linear', + * angle: 45, + * stops: [{ + * offset: 0, + * color: 'red' + * }, { + * offset: 1, + * color: 'yellow' + * }] + * }, { + * id: 'gradientId2', + * type: 'radial', + * stops: [{ + * offset: 0, + * color: '#555', + * }, { + * offset: 1, + * color: '#ddd', + * }] + * }] + * + * Then the sprites can use 'gradientId1' and 'gradientId2' by setting the color attributes to those ids, for example: + * + * sprite.setAttributes({ + * fillStyle: 'url(#gradientId1)', + * strokeStyle: 'url(#gradientId2)' + * }); + */ + gradients: [] + }, + + constructor: function (config) { + config = config || {}; + this.callSuper(arguments); + this.frameCallbackId = Ext.draw.Animator.addFrameCallback('renderFrame', this); + }, + + applyGradients: function (gradients) { + var result = [], + i, n, gradient, offset; + if (!Ext.isArray(gradients)) { + return result; + } + for (i = 0, n = gradients.length; i < n; i++) { + gradient = gradients[i]; + if (!Ext.isObject(gradient)) { + continue; + } + // ExtJS only supported linear gradients, so we didn't have to specify their type + if (typeof gradient.type !== 'string') { + gradient.type = 'linear'; + } + if (gradient.angle) { + gradient.degrees = gradient.angle; + delete gradient.angle; + } + // Convert ExtJS stops object to Touch stops array + if (Ext.isObject(gradient.stops)) { + gradient.stops = (function (stops) { + var result = [], stop; + for (offset in stops) { + stop = stops[offset]; + stop.offset = offset / 100; + result.push(stop); + } + return result; + })(gradient.stops); + } + result.push(gradient); + } + Ext.draw.gradient.GradientDefinition.add(result); + return result; + }, + + initialize: function () { + var me = this; + me.callSuper(); + me.element.on('resize', 'onResize', this); + }, + + applySprites: function (sprites) { + // Never update + if (!sprites) { + return; + } + + sprites = Ext.Array.from(sprites); + + var ln = sprites.length, + i, surface; + + for (i = 0; i < ln; i++) { + if (sprites[i].surface instanceof Ext.draw.Surface) { + surface = sprites[i].surface; + } else if (Ext.isString(sprites[i].surface)) { + surface = this.getSurface(sprites[i].surface); + } else { + surface = this.getSurface('main'); + } + surface.add(sprites[i]); + } + }, + + getElementConfig: function () { + return { + reference: 'element', + className: 'x-container', + children: [ + { + reference: 'innerElement', + className: 'x-inner', + children: [ + { + reference: 'watermarkElement', + cls: 'x-chart-watermark', + html: Ext.draw.Component.WATERMARK, + style: Ext.draw.Component.WATERMARK ? '': 'display: none' + } + ] + } + ] + }; + }, + + updateBackground: function (background) { + this.element.setStyle({ + background: background + }); + }, + + /** + * @protected + * Place water mark after resize. + */ + onPlaceWatermark: function () { + // Do nothing + }, + + onResize: function () { + var me = this, + size = me.element.getSize(), + resizeHandler = me.getResizeHandler() || me.resizeHandler, + result; + me.fireEvent('resize', me, size); + result = resizeHandler.call(me, size); + if (result !== false) { + me.renderFrame(); + me.onPlaceWatermark(); + } + }, + + resizeHandler: function (size) { + var me = this; + + + me.getItems().each(function (surface) { + surface.setRegion([0, 0, size.width, size.height]); + }); + }, + + /** + * Get a surface by the given id or create one if it doesn't exist. + * @param {String} [id="main"] + * @return {Ext.draw.Surface} + */ + getSurface: function (id) { + id = this.getId() + '-' + (id || 'main'); + var me = this, + surfaces = me.getItems(), + surface = surfaces.get(id), + size; + + if (!surface) { + surface = me.add({xclass: me.engine, id: id}); + if (me.getFitSurface()) { + size = me.element.getSize(); + surface.setRegion([0, 0, size.width, size.height]); + } + surface.renderFrame(); + } + return surface; + }, + + /** + * Render all the surfaces in the component. + */ + renderFrame: function () { + var me = this, + i, ln, bbox, + surfaces = me.getItems(); + + for (i = 0, ln = surfaces.length; i < ln; i++) { + surfaces.items[i].renderFrame(); + } + }, + + destroy: function () { + Ext.draw.Animator.removeFrameCallback(this.frameCallbackId); + this.callSuper(); + } + +}, function () { + if (location.search.match('svg')) { + Ext.draw.Component.prototype.engine = 'Ext.draw.engine.Svg'; + } else if ((Ext.os.is.BlackBerry && Ext.os.version.getMajor() === 10) || (Ext.browser.is.AndroidStock4 && (Ext.os.version.getMinor() === 1 || Ext.os.version.getMinor() === 2 || Ext.os.version.getMinor() === 3))) { + // http://code.google.com/p/android/issues/detail?id=37529 + Ext.draw.Component.prototype.engine = 'Ext.draw.engine.Svg'; + } +}); + +/** + * @class Ext.chart.Markers + * @extends Ext.draw.sprite.Instancing + * + * Marker sprite. A specialized version of instancing sprite that groups instances. + * Putting a marker is grouped by its category id. Clearing removes that category. + */ +Ext.define('Ext.chart.Markers', { + extend: Ext.draw.sprite.Instancing , + revisions: 0, + + constructor: function () { + this.callSuper(arguments); + this.map = {}; + this.revisions = {}; + }, + + /** + * Clear the markers in the category + * @param {String} category + */ + clear: function (category) { + category = category || 'default'; + if (!(category in this.revisions)) { + this.revisions[category] = 1; + } else { + this.revisions[category]++; + } + }, + + /** + * Put a marker in the category with additional + * attributes. + * @param {String} category + * @param {Object} markerAttr + * @param {String|Number} index + * @param {Boolean} [canonical] + * @param {Boolean} [keepRevision] + */ + putMarkerFor: function (category, markerAttr, index, canonical, keepRevision) { + category = category || 'default'; + + var me = this, + map = me.map[category] || (me.map[category] = {}); + if (index in map) { + me.setAttributesFor(map[index], markerAttr, canonical); + } else { + map[index] = me.instances.length; + me.createInstance(markerAttr, null, canonical); + } + me.instances[map[index]].category = category; + if (!keepRevision) { + me.instances[map[index]].revision = me.revisions[category] || (me.revisions[category] = 1); + } + }, + + /** + * + * @param {String} category + * @param {Mixed} index + * @param {Boolean} [isWithoutTransform] + */ + getMarkerBBoxFor: function (category, index, isWithoutTransform) { + if (category in this.map) { + if (index in this.map[category]) { + return this.getBBoxFor(this.map[category][index], isWithoutTransform); + } + } + return { + x: Infinity, + y: Infinity, + width: -Infinity, + height: -Infinity + }; + }, + + getBBox: function () { return null; }, + + render: function (surface, ctx, clipRegion) { + var me = this, + revisions = me.revisions, + mat = me.attr.matrix, + template = me.getTemplate(), + originalAttr = template.attr, + instances = me.instances, + i, ln = me.instances.length; + mat.toContext(ctx); + template.preRender(surface, ctx, clipRegion); + template.useAttributes(ctx); + for (i = 0; i < ln; i++) { + if (instances[i].hidden || instances[i].revision !== revisions[instances[i].category]) { + continue; + } + ctx.save(); + template.attr = instances[i]; + template.applyTransformations(); + template.useAttributes(ctx); + template.render(surface, ctx, clipRegion); + ctx.restore(); + } + template.attr = originalAttr; + } +}); + +/** + * @class Ext.chart.label.Callout + * @extends Ext.draw.modifier.Modifier + * + * This is a modifier to place labels and callouts by additional attributes. + */ +Ext.define("Ext.chart.label.Callout", { + extend: Ext.draw.modifier.Modifier , + + prepareAttributes: function (attr) { + if (!attr.hasOwnProperty('calloutOriginal')) { + attr.calloutOriginal = Ext.Object.chain(attr); + } + if (this._previous) { + this._previous.prepareAttributes(attr.calloutOriginal); + } + }, + + setAttrs: function (attr, changes) { + var callout = attr.callout, + origin = attr.calloutOriginal, + bbox = attr.bbox.plain, + width = (bbox.width || 0) + attr.labelOverflowPadding, + height = (bbox.height || 0) + attr.labelOverflowPadding, + dx, dy; + + if ('callout' in changes) { + callout = changes.callout; + } + + if ('callout' in changes || 'calloutPlaceX' in changes || 'calloutPlaceY' in changes || 'x' in changes || 'y' in changes) { + var rotationRads = 'rotationRads' in changes ? origin.rotationRads = changes.rotationRads : origin.rotationRads, + x = 'x' in changes ? (origin.x = changes.x) : origin.x, + y = 'y' in changes ? (origin.y = changes.y) : origin.y, + calloutPlaceX = 'calloutPlaceX' in changes ? changes.calloutPlaceX : attr.calloutPlaceX, + calloutPlaceY = 'calloutPlaceY' in changes ? changes.calloutPlaceY : attr.calloutPlaceY, + calloutVertical = 'calloutVertical' in changes ? changes.calloutVertical : attr.calloutVertical, + temp; + + // Normalize Rotations + rotationRads %= Math.PI * 2; + if (Math.cos(rotationRads) < 0) { + rotationRads = (rotationRads + Math.PI) % (Math.PI * 2); + } + + if (rotationRads > Math.PI) { + rotationRads -= Math.PI * 2; + } + + if (calloutVertical) { + rotationRads = rotationRads * (1 - callout) - Math.PI / 2 * callout; + temp = width; + width = height; + height = temp; + } else { + rotationRads = rotationRads * (1 - callout); + } + changes.rotationRads = rotationRads; + + + // Placing label. + changes.x = x * (1 - callout) + calloutPlaceX * callout; + changes.y = y * (1 - callout) + calloutPlaceY * callout; + + + // Placing the end of the callout line. + dx = calloutPlaceX - x; + dy = calloutPlaceY - y; + if (Math.abs(dy * width) > Math.abs(height * dx)) { + // on top/bottom + if (dy > 0) { + changes.calloutEndX = changes.x - (height / (dy * 2) * dx) * callout; + changes.calloutEndY = changes.y - height / 2 * callout; + } else { + changes.calloutEndX = changes.x + (height / (dy * 2) * dx) * callout; + changes.calloutEndY = changes.y + height / 2 * callout; + } + } else { + // on left/right + if (dx > 0) { + changes.calloutEndX = changes.x - width / 2; + changes.calloutEndY = changes.y - (width / (dx * 2) * dy) * callout; + } else { + changes.calloutEndX = changes.x + width / 2; + changes.calloutEndY = changes.y + (width / (dx * 2) * dy) * callout; + } + } + } + + return changes; + }, + + pushDown: function (attr, changes) { + changes = Ext.draw.modifier.Modifier.prototype.pushDown.call(this, attr.calloutOriginal, changes); + return this.setAttrs(attr, changes); + }, + + popUp: function (attr, changes) { + attr = Object.getPrototypeOf(attr); + changes = this.setAttrs(attr, changes); + if (this._next) { + return this._next.popUp(attr, changes); + } else { + return Ext.apply(attr, changes); + } + } +}); + +/** + * @class Ext.chart.label.Label + * @extends Ext.draw.sprite.Text + * + * Sprite used to represent labels in series. + */ +Ext.define('Ext.chart.label.Label', { + extend: Ext.draw.sprite.Text , + + + inheritableStatics: { + def: { + processors: { + callout: 'limited01', + calloutPlaceX: 'number', + calloutPlaceY: 'number', + calloutStartX: 'number', + calloutStartY: 'number', + calloutEndX: 'number', + calloutEndY: 'number', + calloutColor: 'color', + calloutVertical: 'bool', + labelOverflowPadding: 'number', + display: 'enums(none,under,over,rotate,insideStart,insideEnd,outside)', + orientation: 'enums(horizontal,vertical)', + renderer: 'default' + }, + defaults: { + callout: 0, + calloutPlaceX: 0, + calloutPlaceY: 0, + calloutStartX: 0, + calloutStartY: 0, + calloutEndX: 0, + calloutEndY: 0, + calloutVertical: false, + calloutColor: 'black', + labelOverflowPadding: 5, + display: 'none', + orientation: '', + renderer: null + }, + + dirtyTriggers: { + callout: 'transform', + calloutPlaceX: 'transform', + calloutPlaceY: 'transform', + labelOverflowPadding: 'transform', + calloutRotation: 'transform', + display: 'hidden' + }, + + updaters: { + hidden: function (attrs) { + attrs.hidden = attrs.display === 'none'; + } + } + } + }, + + config: { + /** + * @cfg {Object} fx Animation configuration. + */ + fx: { + customDuration: { + callout: 200 + } + }, + field: null + }, + + prepareModifiers: function () { + this.callSuper(arguments); + this.calloutModifier = new Ext.chart.label.Callout({sprite: this}); + this.fx.setNext(this.calloutModifier); + this.calloutModifier.setNext(this.topModifier); + }, + + render: function (surface, ctx, clipRegion) { + var me = this, + attr = me.attr; + ctx.save(); + ctx.globalAlpha *= Math.max(0, attr.callout - 0.5) * 2; + if (ctx.globalAlpha > 0) { + ctx.strokeStyle = attr.calloutColor; + ctx.fillStyle = attr.calloutColor; + ctx.beginPath(); + ctx.moveTo(me.attr.calloutStartX, me.attr.calloutStartY); + ctx.lineTo(me.attr.calloutEndX, me.attr.calloutEndY); + ctx.stroke(); + + ctx.beginPath(); + ctx.arc(me.attr.calloutStartX, me.attr.calloutStartY, 1, 0, 2 * Math.PI, true); + ctx.fill(); + + ctx.beginPath(); + ctx.arc(me.attr.calloutEndX, me.attr.calloutEndY, 1, 0, 2 * Math.PI, true); + ctx.fill(); + } + ctx.restore(); + + Ext.draw.sprite.Text.prototype.render.apply(me, arguments); + } +}); + +/** + * Series is the abstract class containing the common logic to all chart series. Series includes + * methods from Labels, Highlights, and Callouts mixins. This class implements the logic of + * animating, hiding, showing all elements and returning the color of the series to be used as a legend item. + * + * ## Listeners + * + * The series class supports listeners via the Observable syntax. Some of these listeners are: + * + * - `itemmouseup` When the user interacts with a marker. + * - `itemmousedown` When the user interacts with a marker. + * - `itemmousemove` When the user interacts with a marker. + * - (similar `item*` events occur for many raw mouse and touch events) + * - `afterrender` Will be triggered when the animation ends or when the series has been rendered completely. + * + * For example: + * + * series: [{ + * type: 'bar', + * axis: 'left', + * listeners: { + * 'afterrender': function() { + * console('afterrender'); + * } + * }, + * xField: 'category', + * yField: 'data1' + * }] + * + */ +Ext.define('Ext.chart.series.Series', { + + + + mixins: { + observable: Ext.mixin.Observable + }, + + /** + * @property {String} type + * The type of series. Set in subclasses. + * @protected + */ + type: null, + + /** + * @property {String} seriesType + * Default series sprite type. + */ + seriesType: 'sprite', + + identifiablePrefix: 'ext-line-', + + observableType: 'series', + + /** + * @event chartattached + * Fires when the {@link Ext.chart.AbstractChart} has been attached to this series. + * @param {Ext.chart.AbstractChart} chart + * @param {Ext.chart.series.Series} series + */ + /** + * @event chartdetached + * Fires when the {@link Ext.chart.AbstractChart} has been detached from this series. + * @param {Ext.chart.AbstractChart} chart + * @param {Ext.chart.series.Series} series + */ + + config: { + /** + * @private + * @cfg {Object} chart The chart that the series is bound. + */ + chart: null, + + /** + * @cfg {String|String[]} title + * The human-readable name of the series (displayed in the legend). + */ + title: null, + + /** + * @cfg {Function} renderer + * A function that can be provided to set custom styling properties to each rendered element. + * It receives `(sprite, config, rendererData, index)` as parameters. + * + * @param {Object} sprite The sprite affected by the renderer. The visual attributes are in `sprite.attr`. + * The data field is available in `sprite.getField()`. + * @param {Object} config The sprite configuration. It varies with the series and the type of sprite: + * for instance, a Line chart sprite might have just the `x` and `y` properties while a Bar + * chart sprite also has `width` and `height`. A `type` might be present too. For instance to + * draw each marker and each segment of a Line chart, the renderer is called with the + * `config.type` set to either `marker` or `line`. + * @param {Object} rendererData A record with different properties depending on the type of chart. + * The only guaranteed property is `rendererData.store`, the store used by the series. + * In some cases, a store may not exist: for instance a Gauge chart may read its value directly + * from its configuration; in this case rendererData.store is null and the value is + * available in rendererData.value. + * @param {Number} index The index of the sprite. It is usually the index of the store record associated + * with the sprite, in which case the record can be obtained with `store.getData().items[index]`. + * If the chart is not associated with a store, the index represents the index of the sprite within + * the series. For instance a Gauge chart may have as many sprites as there are sectors in the + * background of the gauge, plus one for the needle. + * + * @return {Object} The attributes that have been changed or added. Note: it is usually possible to + * add or modify the attributes directly into the `config` parameter and not return anything, + * but returning an object with only those attributes that have been changed may allow for + * optimizations in the rendering of some series. Example to draw every other item in red: + * + * renderer: function (sprite, config, rendererData, index) { + * if (index % 2 == 0) { + * return { strokeStyle: 'red' }; + * } + * } + */ + renderer: null, + + /** + * @cfg {Boolean} showInLegend + * Whether to show this series in the legend. + */ + showInLegend: true, + + //@private triggerdrawlistener flag + triggerAfterDraw: false, + + /** + * @private + * Not supported. + */ + themeStyle: {}, + + /** + * @cfg {Object} style Custom style configuration for the sprite used in the series. + */ + style: {}, + + /** + * @cfg {Object} subStyle This is the cyclic used if the series has multiple sprites. + */ + subStyle: {}, + + /** + * @cfg {Array} colors + * An array of color values which will be used, in order, as the pie slice fill colors. + */ + colors: null, + + /** + * @protected + * @cfg {Object} store The store of values used in the series. + */ + store: null, + + /** + * @cfg {Object} label + * The style object for labels. + */ + + /** + * @cfg {Object} label + * Object with the following properties: + * + * @cfg {String} label.display + * + * Specifies the presence and position of the labels. The possible values depend on the chart type. + * For Line charts: 'under' | 'over' | 'rotate'. + * For Bar charts: 'insideStart' | 'insideEnd' | 'outside'. + * For Pie charts: 'outside' | 'rotate'. + * For all charts: 'none' hides the labels. + * + * Default value: 'none'. + * + * @cfg {String} label.color + * + * The color of the label text. + * + * Default value: '#000' (black). + * + * @cfg {String|String[]} label.field + * + * The name(s) of the field(s) to be displayed in the labels. If your chart has 3 series + * that correspond to the fields 'a', 'b', and 'c' of your model and you only want to + * display labels for the series 'c', you must still provide an array `[null, null, 'c']`. + * + * Default value: null. + * + * @cfg {String} label.font + * + * The font used for the labels. + * + * Default value: '14px Helvetica'. + * + * @cfg {String} label.orientation + * + * Either 'horizontal' or 'vertical'. If not set (default), the orientation is inferred + * from the value of the flipXY property of the series. + * + * Default value: ''. + * + * @cfg {Function} label.renderer + * + * Optional function for formatting the label into a displayable value. + * + * The arguments to the method are: + * + * - *`text`*, *`sprite`*, *`config`*, *`rendererData`*, *`index`* + * + * Label's renderer is passed the same arguments as {@link #renderer} + * plus one extra 'text' argument which comes first. + * + * @return {Object|String} The attributes that have been changed or added, or the text for the label. + * Example to enclose every other label in parentheses: + * + * renderer: function (text) { + * if (index % 2 == 0) { + * return '(' + text + ')' + * } + * } + * + * Default value: null. + */ + label: {textBaseline: 'middle', textAlign: 'center', font: '14px Helvetica'}, + + /** + * @cfg {Number} labelOverflowPadding + * Extra distance value for which the labelOverflow listener is triggered. + */ + labelOverflowPadding: 5, + + /** + * @cfg {String|String[]} labelField + * @deprecated Use 'field' property of {@link Ext.chart.series.Series#label} instead. + * The store record field name to be used for the series labels. + */ + labelField: null, + + /** + * @cfg {Object} marker + * The sprite template used by marker instances on the series. + */ + marker: null, + + /** + * @cfg {Object} markerSubStyle + * This is cyclic used if series have multiple marker sprites. + */ + markerSubStyle: null, + + /** + * @protected + * @cfg {Object} itemInstancing The sprite template used to create sprite instances in the series. + */ + itemInstancing: null, + + /** + * @cfg {Object} background Sets the background of the surface the series is attached. + */ + background: null, + + /** + * @cfg {Object} highlightItem The item currently highlighted in the series. + */ + highlightItem: null, + + /** + * @protected + * @cfg {Object} surface The surface that the series is attached. + */ + surface: null, + + /** + * @protected + * @cfg {Object} overlaySurface The surface that series markers are attached. + */ + overlaySurface: null, + + /** + * @cfg {Boolean|Array} hidden + */ + hidden: false, + + /** + * @cfg {Object} highlightCfg The sprite configuration used when highlighting items in the series. + */ + highlightCfg: null, + + /** + * @cfg {Object} animate The series animation configuration. + */ + animate: null + }, + + directions: [], + + sprites: null, + + getFields: function (fieldCategory) { + var me = this, + fields = [], fieldsItem, + i, ln; + for (i = 0, ln = fieldCategory.length; i < ln; i++) { + fieldsItem = me['get' + fieldCategory[i] + 'Field'](); + fields.push(fieldsItem); + } + return fields; + }, + + updateAnimate: function (animate) { + var sprites = this.getSprites(), i = -1, ln = sprites.length; + while (++i < ln) { + sprites[i].fx.setConfig(animate); + } + }, + + updateTitle: function (newTitle) { + if (newTitle) { + var chart = this.getChart(), + series = chart.getSeries(), + legendStore = chart.getLegendStore(), + index, rec; + + if (series) { + index = Ext.Array.indexOf(series, this); + + if (index !== -1) { + rec = legendStore.getAt(index); + rec.set('name', newTitle); + } + } + } + }, + + updateColors: function (colorSet) { + this.setSubStyle({fillStyle: colorSet}); + this.doUpdateStyles(); + }, + + applyHighlightCfg: function (highlight, oldHighlight) { + return Ext.apply(oldHighlight || {}, highlight); + }, + + applyItemInstancing: function (instancing, oldInstancing) { + return Ext.merge(oldInstancing || {}, instancing); + }, + + setAttributesForItem: function (item, change) { + if (item && item.sprite) { + if (item.sprite.itemsMarker && item.category === 'items') { + item.sprite.putMarker(item.category, change, item.index, false, true); + } + if (item.sprite.isMarkerHolder && item.category === 'markers') { + item.sprite.putMarker(item.category, change, item.index, false, true); + } else if (item.sprite instanceof Ext.draw.sprite.Instancing) { + item.sprite.setAttributesFor(item.index, change); + } else { + + item.sprite.setAttributes(change); + } + } + }, + + applyHighlightItem: function (newHighlightItem, oldHighlightItem) { + if (newHighlightItem === oldHighlightItem) { + return; + } + if (Ext.isObject(newHighlightItem) && Ext.isObject(oldHighlightItem)) { + if (newHighlightItem.sprite === oldHighlightItem.sprite && + newHighlightItem.index === oldHighlightItem.index + ) { + return; + } + } + return newHighlightItem; + }, + + updateHighlightItem: function (newHighlightItem, oldHighlightItem) { + this.setAttributesForItem(oldHighlightItem, {highlighted: false}); + this.setAttributesForItem(newHighlightItem, {highlighted: true}); + }, + + constructor: function (config) { + var me = this; + me.getId(); + me.sprites = []; + me.dataRange = []; + Ext.ComponentManager.register(me); + me.mixins.observable.constructor.apply(me, arguments); + }, + + applyStore: function (store) { + return Ext.StoreManager.lookup(store); + }, + + getStore: function () { + return this._store || this.getChart() && this.getChart().getStore(); + }, + + updateStore: function (newStore, oldStore) { + var me = this, + chartStore = this.getChart() && this.getChart().getStore(), + sprites = me.getSprites(), + ln = sprites.length, + i, sprite; + newStore = newStore || chartStore; + oldStore = oldStore || chartStore; + + if (oldStore) { + oldStore.un('updaterecord', 'onUpdateRecord', me); + oldStore.un('refresh', 'refresh', me); + } + if (newStore) { + newStore.on('updaterecord', 'onUpdateRecord', me); + newStore.on('refresh', 'refresh', me); + for (i = 0; i < ln; i++) { + sprite = sprites[i]; + if (sprite.setStore) { + sprite.setStore(newStore); + } + } + me.refresh(); + } + }, + + onStoreChanged: function (store, oldStore) { + if (!this._store) { + this.updateStore(store, oldStore); + } + }, + + coordinateStacked: function (direction, directionOffset, directionCount) { + var me = this, + store = me.getStore(), + items = store.getData().items, + axis = me['get' + direction + 'Axis'](), + hidden = me.getHidden(), + range = {min: 0, max: 0}, + directions = me['fieldCategory' + direction], + fieldCategoriesItem, + i, j, k, fields, field, data, style = {}, + dataStart = [], dataEnd, posDataStart = [], negDataStart = [], + stacked = me.getStacked(), + sprites = me.getSprites(); + + if (sprites.length > 0) { + for (i = 0; i < directions.length; i++) { + fieldCategoriesItem = directions[i]; + fields = me.getFields([fieldCategoriesItem]); + for (j = 0; j < items.length; j++) { + dataStart[j] = 0; + posDataStart[j] = 0; + negDataStart[j] = 0; + } + for (j = 0; j < fields.length; j++) { + style = {}; + field = fields[j]; + if (hidden[j]) { + style['dataStart' + fieldCategoriesItem] = dataStart; + style['data' + fieldCategoriesItem] = dataStart; + sprites[j].setAttributes(style); + continue; + } + data = me.coordinateData(items, field, axis); + if (stacked) { + dataEnd = []; + for (k = 0; k < items.length; k++) { + if (!data[k]) { + data[k] = 0; + } + if (data[k] >= 0) { + dataStart[k] = posDataStart[k]; + posDataStart[k] += data[k]; + dataEnd[k] = posDataStart[k]; + } else { + dataStart[k] = negDataStart[k]; + negDataStart[k] += data[k]; + dataEnd[k] = negDataStart[k]; + } + } + style['dataStart' + fieldCategoriesItem] = dataStart; + style['data' + fieldCategoriesItem] = dataEnd; + me.getRangeOfData(dataStart, range); + me.getRangeOfData(dataEnd, range); + } else { + style['dataStart' + fieldCategoriesItem] = dataStart; + style['data' + fieldCategoriesItem] = data; + me.getRangeOfData(data, range); + } + sprites[j].setAttributes(style); + } + } + me.dataRange[directionOffset] = range.min; + me.dataRange[directionOffset + directionCount] = range.max; + style = {}; + style['dataMin' + direction] = range.min; + style['dataMax' + direction] = range.max; + for (i = 0; i < sprites.length; i++) { + sprites[i].setAttributes(style); + } + } + }, + + coordinate: function (direction, directionOffset, directionCount) { + var me = this, + store = me.getStore(), + hidden = me.getHidden(), + items = store.getData().items, + axis = me['get' + direction + 'Axis'](), + range = {min: Infinity, max: -Infinity}, + fieldCategory = me['fieldCategory' + direction] || [direction], + fields = me.getFields(fieldCategory), + i, field, data, style = {}, + sprites = me.getSprites(); + if (sprites.length > 0) { + if (!Ext.isBoolean(hidden) || !hidden) { + for (i = 0; i < fieldCategory.length; i++) { + field = fields[i]; + data = me.coordinateData(items, field, axis); + me.getRangeOfData(data, range); + style['data' + fieldCategory[i]] = data; + } + } + me.dataRange[directionOffset] = range.min; + me.dataRange[directionOffset + directionCount] = range.max; + style['dataMin' + direction] = range.min; + style['dataMax' + direction] = range.max; + if (axis) { + axis.range = null; + style['range' + direction] = axis.getRange(); + } + for (i = 0; i < sprites.length; i++) { + sprites[i].setAttributes(style); + } + } + }, + + /** + * @private + * This method will return an array containing data coordinated by a specific axis. + * @param {Array} items + * @param {String} field + * @param {Ext.chart.axis.Axis} axis + * @return {Array} + */ + coordinateData: function (items, field, axis) { + var data = [], + length = items.length, + layout = axis && axis.getLayout(), + coord = axis ? function (x, field, idx, items) { + return layout.getCoordFor(x, field, idx, items); + } : function (x) { return +x; }, + i, x; + for (i = 0; i < length; i++) { + x = items[i].data[field]; + data[i] = !Ext.isEmpty(x) ? coord(x, field, i, items) : x; + } + return data; + }, + + getRangeOfData: function (data, range) { + var i, length = data.length, + value, min = range.min, max = range.max; + for (i = 0; i < length; i++) { + value = data[i]; + if (value < min) { + min = value; + } + if (value > max) { + max = value; + } + } + range.min = min; + range.max = max; + }, + + updateLabelData: function () { + var me = this, + store = me.getStore(), + items = store.getData().items, + sprites = me.getSprites(), + labelTpl = me.getLabel().getTemplate(), + labelFields = Ext.Array.from(labelTpl.getField() || me.getLabelField()), + i, j, ln, labels, + sprite, field; + + if (!sprites.length || !labelFields.length) { + return; + } + + for (i = 0; i < sprites.length; i++) { + labels = []; + sprite = sprites[i]; + field = sprite.getField(); + if (labelFields.indexOf(field) < 0) { + field = labelFields[i]; + } + for (j = 0, ln = items.length; j < ln; j++) { + labels.push(items[j].get(field)); + } + sprite.setAttributes({labels: labels}); + } + }, + + updateLabelField: function (labelField) { + var labelTpl = this.getLabel().getTemplate(); + if (!labelTpl.config.field) { + labelTpl.setField(labelField) + } + }, + + processData: function () { + if (!this.getStore()) { + return; + } + + var me = this, + directions = this.directions, + i, ln = directions.length, + fieldCategory, axis; + + for (i = 0; i < ln; i++) { + fieldCategory = directions[i]; + if (me['get' + fieldCategory + 'Axis']) { + axis = me['get' + fieldCategory + 'Axis'](); + if (axis) { + axis.processData(me); + continue; + } + } + if (me['coordinate' + fieldCategory]) { + me['coordinate' + fieldCategory](); + } + } + me.updateLabelData(); + }, + + applyBackground: function (background) { + if (this.getChart()) { + this.getSurface().setBackground(background); + return this.getSurface().getBackground(); + } else { + return background; + } + }, + + updateChart: function (newChart, oldChart) { + var me = this; + if (oldChart) { + oldChart.un('axeschanged', 'onAxesChanged', me); + // TODO: destroy them + me.sprites = []; + me.setSurface(null); + me.setOverlaySurface(null); + me.onChartDetached(oldChart); + } + if (newChart) { + me.setSurface(newChart.getSurface('series-surface', 'series')); + me.setOverlaySurface(newChart.getSurface('overlay-surface', 'overlay')); + + newChart.on('axeschanged', 'onAxesChanged', me); + if (newChart.getAxes()) { + me.onAxesChanged(newChart); + } + me.onChartAttached(newChart); + } + + me.updateStore(me._store, null); + }, + + onAxesChanged: function (chart) { + var me = this, + axes = chart.getAxes(), axis, + directionMap = {}, directionMapItem, + fieldMap = {}, fieldMapItem, + needHighPrecision = false, + directions = this.directions, direction, + i, ln, j, ln2, k, ln3; + + for (i = 0, ln = directions.length; i < ln; i++) { + direction = directions[i]; + fieldMap[direction] = me.getFields(me['fieldCategory' + direction]); + } + + for (i = 0, ln = axes.length; i < ln; i++) { + axis = axes[i]; + if (!directionMap[axis.getDirection()]) { + directionMap[axis.getDirection()] = [axis]; + } else { + directionMap[axis.getDirection()].push(axis); + } + } + + for (i = 0, ln = directions.length; i < ln; i++) { + direction = directions[i]; + if (directionMap[direction]) { + directionMapItem = directionMap[direction]; + for (j = 0, ln2 = directionMapItem.length; j < ln2; j++) { + axis = directionMapItem[j]; + if (axis.getFields().length === 0) { + me['set' + direction + 'Axis'](axis); + if (axis.getNeedHighPrecision()) { + needHighPrecision = true; + } + } else { + fieldMapItem = fieldMap[direction]; + if (fieldMapItem) { + for (k = 0, ln3 = fieldMapItem.length; k < ln3; k++) { + if (axis.fieldsMap[fieldMapItem[k]]) { + me['set' + direction + 'Axis'](axis); + if (axis.getNeedHighPrecision()) { + needHighPrecision = true; + } + break; + } + } + } + } + } + } + } + this.getSurface().setHighPrecision(needHighPrecision); + }, + + onChartDetached: function (oldChart) { + var me = this; + me.fireEvent('chartdetached', oldChart, me); + oldChart.un('storechanged', 'onStoreChanged', me); + }, + + onChartAttached: function (chart) { + var me = this; + me.setBackground(me.getBackground()); + me.fireEvent('chartattached', chart, me); + chart.on('storechanged', 'onStoreChanged', me); + me.processData(); + }, + + updateOverlaySurface: function (overlaySurface) { + var me = this; + if (overlaySurface) { + if (me.getLabel()) { + me.getOverlaySurface().add(me.getLabel()); + } + } + }, + + applyLabel: function (newLabel, oldLabel) { + if (!oldLabel) { + oldLabel = new Ext.chart.Markers({zIndex: 10}); + oldLabel.setTemplate(new Ext.chart.label.Label(newLabel)); + } else { + oldLabel.getTemplate().setAttributes(newLabel); + } + return oldLabel; + }, + + createItemInstancingSprite: function (sprite, itemInstancing) { + var me = this, + template, + markers = new Ext.chart.Markers(); + + markers.setAttributes({zIndex: Number.MAX_VALUE}); + var config = Ext.apply({}, itemInstancing); + if (me.getHighlightCfg()) { + config.highlightCfg = me.getHighlightCfg(); + config.modifiers = ['highlight']; + } + markers.setTemplate(config); + template = markers.getTemplate(); + template.setAttributes(me.getStyle()); + template.fx.on('animationstart', 'onSpriteAnimationStart', this); + template.fx.on('animationend', 'onSpriteAnimationEnd', this); + sprite.bindMarker('items', markers); + + me.getSurface().add(markers); + return markers; + }, + + getDefaultSpriteConfig: function () { + return { + type: this.seriesType, + renderer: this.getRenderer() + }; + }, + + createSprite: function () { + var me = this, + surface = me.getSurface(), + itemInstancing = me.getItemInstancing(), + marker, config, + sprite = surface.add(me.getDefaultSpriteConfig()); + + sprite.setAttributes(this.getStyle()); + + if (itemInstancing) { + sprite.itemsMarker = me.createItemInstancingSprite(sprite, itemInstancing); + } + + if (sprite.bindMarker) { + if (me.getMarker()) { + marker = new Ext.chart.Markers(); + config = Ext.merge({}, me.getMarker()); + if (me.getHighlightCfg()) { + config.highlightCfg = me.getHighlightCfg(); + config.modifiers = ['highlight']; + } + marker.setTemplate(config); + marker.getTemplate().fx.setCustomDuration({ + translationX: 0, + translationY: 0 + }); + sprite.dataMarker = marker; + sprite.bindMarker('markers', marker); + me.getOverlaySurface().add(marker); + } + if (me.getLabel().getTemplate().getField() || me.getLabelField()) { + sprite.bindMarker('labels', me.getLabel()); + } + } + + if (sprite.setStore) { + sprite.setStore(me.getStore()); + } + + sprite.fx.on('animationstart', 'onSpriteAnimationStart', me); + sprite.fx.on('animationend', 'onSpriteAnimationEnd', me); + + me.sprites.push(sprite); + + return sprite; + }, + + /** + * Performs drawing of this series. + */ + getSprites: Ext.emptyFn, + + onUpdateRecord: function () { + // TODO: do something REALLY FAST. + this.processData(); + }, + + refresh: function () { + this.processData(); + }, + + isXType: function (xtype) { + return xtype === 'series'; + }, + + getItemId: function () { + return this.getId(); + }, + + applyStyle: function (style, oldStyle) { + // TODO: Incremental setter + var cls = Ext.ClassManager.get(Ext.ClassManager.getNameByAlias('sprite.' + this.seriesType)); + if (cls && cls.def) { + style = cls.def.normalize(style); + } + return Ext.apply(oldStyle || Ext.Object.chain(this.getThemeStyle()), style); + }, + + applyMarker: function (marker, oldMarker) { + var type = (marker && marker.type) || (oldMarker && oldMarker.type) || this.seriesType, + cls; + if (type) { + cls = Ext.ClassManager.get(Ext.ClassManager.getNameByAlias('sprite.' + type)); + if (cls && cls.def) { + marker = cls.def.normalize(marker, true); + marker.type = type; + return Ext.merge(oldMarker || {}, marker); + } + return Ext.merge(oldMarker || {}, marker); + } + }, + + applyMarkerSubStyle: function (marker, oldMarker) { + var type = (marker && marker.type) || (oldMarker && oldMarker.type) || this.seriesType, + cls; + if (type) { + cls = Ext.ClassManager.get(Ext.ClassManager.getNameByAlias('sprite.' + type)); + if (cls && cls.def) { + marker = cls.def.batchedNormalize(marker, true); + return Ext.merge(oldMarker || {}, marker); + } + return Ext.merge(oldMarker || {}, marker); + } + }, + + applySubStyle: function (subStyle, oldSubStyle) { + var cls = Ext.ClassManager.get(Ext.ClassManager.getNameByAlias('sprite.' + this.seriesType)); + if (cls && cls.def) { + subStyle = cls.def.batchedNormalize(subStyle, true); + return Ext.merge(oldSubStyle || {}, subStyle); + } + return Ext.merge(oldSubStyle || {}, subStyle); + }, + + updateHidden: function (hidden) { + // TODO: remove this when jacky fix the problem. + this.getColors(); + this.getSubStyle(); + this.setSubStyle({hidden: hidden}); + this.processData(); + this.doUpdateStyles(); + }, + + /** + * + * @param {Number} index + * @param {Boolean} value + */ + setHiddenByIndex: function (index, value) { + if (Ext.isArray(this.getHidden())) { + this.getHidden()[index] = value; + this.updateHidden(this.getHidden()); + } else { + this.setHidden(value); + } + }, + + updateStyle: function () { + this.doUpdateStyles(); + }, + + updateSubStyle: function () { + this.doUpdateStyles(); + }, + + doUpdateStyles: function () { + var sprites = this.sprites, + itemInstancing = this.getItemInstancing(), + i = 0, ln = sprites && sprites.length, + markerCfg = this.getMarker(), + style; + for (; i < ln; i++) { + style = this.getStyleByIndex(i); + if (itemInstancing) { + sprites[i].itemsMarker.getTemplate().setAttributes(style); + } + sprites[i].setAttributes(style); + if (markerCfg && sprites[i].dataMarker) { + sprites[i].dataMarker.getTemplate().setAttributes(this.getMarkerStyleByIndex(i)); + } + } + }, + + getMarkerStyleByIndex: function (i) { + return this.getOverriddenStyleByIndex(i, this.getOverriddenStyleByIndex(i, this.getMarkerSubStyle(), this.getMarker()), this.getStyleByIndex(i)); + }, + + getStyleByIndex: function (i) { + return this.getOverriddenStyleByIndex(i, this.getSubStyle(), this.getStyle()); + }, + + getOverriddenStyleByIndex: function (i, subStyle, baseStyle) { + var subStyleItem, + result = Ext.Object.chain(baseStyle || {}); + for (var name in subStyle) { + subStyleItem = subStyle[name]; + if (Ext.isArray(subStyleItem)) { + result[name] = subStyleItem[i % subStyle[name].length]; + } else { + result[name] = subStyleItem; + } + } + return result; + }, + + /** + * For a given x/y point relative to the main region, find a corresponding item from this + * series, if any. + * @param {Number} x + * @param {Number} y + * @param {Object} [target] optional target to receive the result + * @return {Object} An object describing the item, or null if there is no matching item. The exact contents of + * this object will vary by series type, but should always contain at least the following: + * + * @return {Ext.data.Model} return.record the record of the item. + * @return {Array} return.point the x/y coordinates relative to the chart box of a single point + * for this data item, which can be used as e.g. a tooltip anchor point. + * @return {Ext.draw.sprite.Sprite} return.sprite the item's rendering Sprite. + * @return {Number} return.subSprite the index if sprite is an instancing sprite. + */ + getItemForPoint: Ext.emptyFn, + + onSpriteAnimationStart: function (sprite) { + this.fireEvent('animationstart', sprite); + }, + + onSpriteAnimationEnd: function (sprite) { + this.fireEvent('animationend', sprite); + }, + + /** + * Provide legend information to target array. + * + * @param {Array} target + * + * The information consists: + * @param {String} target.name + * @param {String} target.markColor + * @param {Boolean} target.disabled + * @param {String} target.series + * @param {Number} target.index + */ + provideLegendInfo: function (target) { + target.push({ + name: this.getTitle() || this.getId(), + mark: 'black', + disabled: false, + series: this.getId(), + index: 0 + }); + }, + + destroy: function () { + this.clearListeners(); + Ext.ComponentManager.unregister(this); + var store = this.getStore(); + if (store && store.getAutoDestroy()) { + Ext.destroy(store); + } + this.setStore(null); + this.callSuper(); + } +}); + +/** + * @class Ext.chart.interactions.Abstract + * + * Defines a common abstract parent class for all interactions. + * + */ +Ext.define('Ext.chart.interactions.Abstract', { + + xtype: 'interaction', + + mixins: { + observable: Ext.mixin.Observable + }, + + config: { + /** + * @cfg {String} gesture + * Specifies which gesture type should be used for starting the interaction. + */ + gesture: 'tap', + + /** + * @cfg {Ext.chart.AbstractChart} chart The chart that the interaction is bound. + */ + chart: null, + + /** + * @cfg {Boolean} enabled 'true' if the interaction is enabled. + */ + enabled: true + }, + + /** + * Android device is emerging too many events so if we re-render every frame it will take for-ever to finish a frame. + * This throttle technique will limit the timespan between two frames. + */ + throttleGap: 0, + + stopAnimationBeforeSync: false, + + constructor: function (config) { + var me = this; + me.initConfig(config); + Ext.ComponentManager.register(this); + }, + + /** + * @protected + * A method to be implemented by subclasses where all event attachment should occur. + */ + initialize: Ext.emptyFn, + + updateChart: function (newChart, oldChart) { + var me = this, gestures = me.getGestures(); + if (oldChart) { + me.removeChartListener(oldChart); + } + if (newChart) { + me.addChartListener(); + } + }, + + updateEnabled: function (enabled) { + var me = this, + chart = me.getChart(); + if (chart) { + if (enabled) { + me.addChartListener(); + } else { + me.removeChartListener(chart); + } + } + }, + + getGestures: function () { + var gestures = {}; + gestures[this.getGesture()] = this.onGesture; + return gestures; + }, + + /** + * @protected + * Placeholder method. + */ + onGesture: Ext.emptyFn, + + /** + * @protected Find and return a single series item corresponding to the given event, + * or null if no matching item is found. + * @param {Event} e + * @return {Object} the item object or null if none found. + */ + getItemForEvent: function (e) { + var me = this, + chart = me.getChart(), + chartXY = chart.getEventXY(e); + return chart.getItemForPoint(chartXY[0], chartXY[1]); + }, + + /** + * @protected Find and return all series items corresponding to the given event. + * @param {Event} e + * @return {Array} array of matching item objects + */ + getItemsForEvent: function (e) { + var me = this, + chart = me.getChart(), + chartXY = chart.getEventXY(e); + return chart.getItemsForPoint(chartXY[0], chartXY[1]); + }, + + /** + * @private + */ + addChartListener: function () { + var me = this, + chart = me.getChart(), + gestures = me.getGestures(), + gesture; + + if (!me.getEnabled()) { + return; + } + + function insertGesture(name, fn) { + chart.on( + name, + // wrap the handler so it does not fire if the event is locked by another interaction + me.listeners[name] = function (e) { + var locks = me.getLocks(), result; + if (me.getEnabled() && (!(name in locks) || locks[name] === me)) { + result = (Ext.isFunction(fn) ? fn : me[fn]).apply(this, arguments); + if (result === false && e && e.stopPropagation) { + e.stopPropagation(); + } + return result; + } + }, + me + ); + } + + me.listeners = me.listeners || {}; + for (gesture in gestures) { + insertGesture(gesture, gestures[gesture]); + } + }, + + removeChartListener: function (chart) { + var me = this, + gestures = me.getGestures(), + gesture; + + function removeGesture(name) { + chart.un(name, me.listeners[name]); + delete me.listeners[name]; + } + + for (gesture in gestures) { + removeGesture(gesture); + } + }, + + lockEvents: function () { + var me = this, + locks = me.getLocks(), + args = Array.prototype.slice.call(arguments), + i = args.length; + while (i--) { + locks[args[i]] = me; + } + }, + + unlockEvents: function () { + var locks = this.getLocks(), + args = Array.prototype.slice.call(arguments), + i = args.length; + while (i--) { + delete locks[args[i]]; + } + }, + + getLocks: function () { + var chart = this.getChart(); + return chart.lockedEvents || (chart.lockedEvents = {}); + }, + + isMultiTouch: function () { + if (Ext.browser.is.IE10) { + return true; + } + return !(Ext.os.is.MultiTouch === false || Ext.browser.is.AndroidStock2 || Ext.os.is.Desktop); + }, + + initializeDefaults: Ext.emptyFn, + + doSync: function () { + var chart = this.getChart(); + if (this.syncTimer) { + clearTimeout(this.syncTimer); + this.syncTimer = null; + } + if (this.stopAnimationBeforeSync) { + chart.resizing = true; + } + chart.redraw(); + if (this.stopAnimationBeforeSync) { + chart.resizing = false; + } + this.syncThrottle = Date.now() + this.throttleGap; + }, + + sync: function () { + var me = this; + if (me.throttleGap && Ext.frameStartTime < me.syncThrottle) { + if (me.syncTimer) { + return; + } + me.syncTimer = setTimeout(function () { + me.doSync(); + }, me.throttleGap); + } else { + me.doSync(); + } + }, + + getItemId: function () { + return this.getId(); + }, + + isXType: function (xtype) { + return xtype === 'interaction'; + }, + + destroy: function () { + Ext.ComponentManager.unregister(this); + this.listeners = []; + this.callSuper(); + } +}, function () { + if (Ext.browser.is.AndroidStock2) { + this.prototype.throttleGap = 20; + } else if (Ext.os.is.Android4) { + this.prototype.throttleGap = 40; + } +}); + +/** + * @class Ext.chart.MarkerHolder + * @extends Ext.mixin.Mixin + * + * Mixin that provides the functionality to place markers. + */ +Ext.define('Ext.chart.MarkerHolder', { + extend: Ext.mixin.Mixin , + mixinConfig: { + id: 'markerHolder', + hooks: { + constructor: 'constructor', + preRender: 'preRender' + } + }, + + isMarkerHolder: true, + + constructor: function () { + this.boundMarkers = {}; + this.cleanRedraw = false; + }, + + /** + * + * @param {String} name + * @param {Ext.chart.Markers} marker + */ + bindMarker: function (name, marker) { + if (marker) { + if (!this.boundMarkers[name]) { + this.boundMarkers[name] = []; + } + Ext.Array.include(this.boundMarkers[name], marker); + } + }, + + getBoundMarker: function (name) { + return this.boundMarkers[name]; + }, + + preRender: function () { + var boundMarkers = this.boundMarkers, boundMarkersItem, + name, i, ln, id = this.getId(), + parent = this.getParent(), + matrix = this.surfaceMatrix ? this.surfaceMatrix.set(1, 0, 0, 1, 0, 0) : (this.surfaceMatrix = new Ext.draw.Matrix()); + + this.cleanRedraw = !this.attr.dirty; + if (!this.cleanRedraw) { + for (name in this.boundMarkers) { + if (boundMarkers[name]) { + for (boundMarkersItem = boundMarkers[name], i = 0, ln = boundMarkersItem.length; i < ln; i++) { + boundMarkersItem[i].clear(id); + } + } + } + } + + while (parent && parent.attr && parent.attr.matrix) { + matrix.prependMatrix(parent.attr.matrix); + parent = parent.getParent(); + } + matrix.prependMatrix(parent.matrix); + this.surfaceMatrix = matrix; + this.inverseSurfaceMatrix = matrix.inverse(this.inverseSurfaceMatrix); + }, + + putMarker: function (name, markerAttr, index, canonical, keepRevision) { + var boundMarkersItem, i, ln, id = this.getId(); + if (this.boundMarkers[name]) { + for (boundMarkersItem = this.boundMarkers[name], i = 0, ln = boundMarkersItem.length; i < ln; i++) { + boundMarkersItem[i].putMarkerFor(id, markerAttr, index, canonical); + } + } + }, + + getMarkerBBox: function (name, index, isWithoutTransform) { + var id = this.getId(), + left = Infinity, + right = -Infinity, + top = Infinity, + bottom = -Infinity, + bbox, boundMarker, i, ln; + + if (this.boundMarkers[name]) { + for (boundMarker = this.boundMarkers[name], i = 0, ln = boundMarker.length; i < ln; i++) { + bbox = boundMarker[i].getMarkerBBoxFor(id, index, isWithoutTransform); + if (left > bbox.x) { + left = bbox.x; + } + if (right < bbox.x + bbox.width) { + right = bbox.x + bbox.width; + } + if (top > bbox.y) { + top = bbox.y; + } + if (bottom < bbox.y + bbox.height) { + bottom = bbox.y + bbox.height; + } + } + } + return { + x: left, + y: top, + width: right - left, + height: bottom - top + }; + } +}); + +/** + * @private + * @class Ext.chart.axis.sprite.Axis + * @extends Ext.draw.sprite.Sprite + * + * The axis sprite. Currently all types of the axis will be rendered with this sprite. + * TODO(touch-2.2): Split different types of axis into different sprite classes. + */ +Ext.define('Ext.chart.axis.sprite.Axis', { + extend: Ext.draw.sprite.Sprite , + mixins: { + markerHolder: Ext.chart.MarkerHolder + }, + + + + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Boolean} grid 'true' if the axis has a grid. + */ + grid: 'bool', + + /** + * @cfg {Boolean} axisLine 'true' if the main line of the axis is drawn. + */ + axisLine: 'bool', + + /** + * @cfg {Boolean} minorTricks 'true' if the axis has sub ticks. + */ + minorTicks: 'bool', + + /** + * @cfg {Number} minorTickSize The length of the minor ticks. + */ + minorTickSize: 'number', + + /** + * @cfg {Boolean} majorTicks 'true' if the axis has major ticks. + */ + majorTicks: 'bool', + + /** + * @cfg {Number} majorTickSize The length of the major ticks. + */ + majorTickSize: 'number', + + /** + * @cfg {Number} length The total length of the axis. + */ + length: 'number', + + /** + * @private + * @cfg {Number} startGap Axis start determined by the chart inset padding. + */ + startGap: 'number', + + /** + * @private + * @cfg {Number} endGap Axis end determined by the chart inset padding. + */ + endGap: 'number', + + /** + * @cfg {Number} dataMin The minimum value of the axis data. + */ + dataMin: 'number', + + /** + * @cfg {Number} dataMax The maximum value of the axis data. + */ + dataMax: 'number', + + /** + * @cfg {Number} visibleMin The minimum value that is displayed. + */ + visibleMin: 'number', + + /** + * @cfg {Number} visibleMax The maximum value that is displayed. + */ + visibleMax: 'number', + + /** + * @cfg {String} position The position of the axis on the chart. + */ + position: 'enums(left,right,top,bottom,angular,radial)', + + /** + * @cfg {Number} minStepSize The minimum step size between ticks. + */ + minStepSize: 'number', + + /** + * @private + * @cfg {Number} estStepSize The estimated step size between ticks. + */ + estStepSize: 'number', + + /** + * @private + * Unused. + */ + titleOffset: 'number', + + /** + * @cfg {Number} textPadding The padding around axis labels to determine collision. + */ + textPadding: 'number', + + /** + * @cfg {Number} min The minimum value of the axis. + */ + min: 'number', + + /** + * @cfg {Number} max The maximum value of the axis. + */ + max: 'number', + + /** + * @cfg {Number} centerX The central point of the angular axis on the x-axis. + */ + centerX: 'number', + + /** + * @cfg {Number} centerY The central point of the angular axis on the y-axis. + */ + centerY: 'number', + + /** + * @private + * @cfg {Number} radius + * Unused. + */ + radius: 'number', + + /** + * @cfg {Number} The starting rotation of the angular axis. + */ + baseRotation: 'number', + + /** + * @private + * Unused. + */ + data: 'default', + + /** + * @cfg {Boolean} 'true' if the estimated step size is adjusted by text size. + */ + enlargeEstStepSizeByText: 'bool' + }, + + defaults: { + grid: false, + axisLine: true, + minorTicks: false, + minorTickSize: 3, + majorTicks: true, + majorTickSize: 5, + length: 0, + startGap: 0, + endGap: 0, + visibleMin: 0, + visibleMax: 1, + dataMin: 0, + dataMax: 1, + position: '', + minStepSize: 0, + estStepSize: 20, + min: 0, + max: 1, + centerX: 0, + centerY: 0, + radius: 1, + baseRotation: 0, + data: null, + titleOffset: 0, + textPadding: 5, + scalingCenterY: 0, + scalingCenterX: 0, + // Override default + strokeStyle: 'black', + enlargeEstStepSizeByText: false + }, + + dirtyTriggers: { + minorTickSize: 'bbox', + majorTickSize: 'bbox', + position: 'bbox,layout', + axisLine: 'bbox,layout', + min: 'layout', + max: 'layout', + length: 'layout', + minStepSize: 'layout', + estStepSize: 'layout', + data: 'layout', + dataMin: 'layout', + dataMax: 'layout', + visibleMin: 'layout', + visibleMax: 'layout', + enlargeEstStepSizeByText: 'layout' + }, + updaters: { + 'layout': function () { + this.doLayout(); + } + } + } + }, + + config: { + + /** + * @cfg {Object} label + * + * The label configuration object for the Axis. This object may include style attributes + * like `spacing`, `padding`, `font` that receives a string or number and + * returns a new string with the modified values. + */ + label: null, + + /** + * @cfg {Object|Ext.chart.axis.layout.Layout} layout The layout configuration used by the axis. + */ + layout: null, + + /** + * @cfg {Object|Ext.chart.axis.segmenter.Segmenter} segmenter The method of segmenter used by the axis. + */ + segmenter: null, + + /** + * @cfg {Function} renderer Allows direct customisation of rendered axis sprites. + */ + renderer: null, + + /** + * @private + * @cfg {Object} layoutContext Stores the context after calculating layout. + */ + layoutContext: null, + + /** + * @cfg {Ext.chart.axis.Axis} axis The axis represented by the this sprite. + */ + axis: null + }, + + thickness: 0, + + stepSize: 0, + + getBBox: function () { return null; }, + + doLayout: function () { + var me = this, + attr = me.attr, + layout = me.getLayout(), + min = attr.dataMin + (attr.dataMax - attr.dataMin) * attr.visibleMin, + max = attr.dataMin + (attr.dataMax - attr.dataMin) * attr.visibleMax, + context = { + attr: attr, + segmenter: me.getSegmenter() + }; + + if (attr.position === 'left' || attr.position === 'right') { + attr.translationX = 0; + attr.translationY = max * attr.length / (max - min); + attr.scalingX = 1; + attr.scalingY = -attr.length / (max - min); + attr.scalingCenterY = 0; + attr.scalingCenterX = 0; + me.applyTransformations(true); + } else if (attr.position === 'top' || attr.position === 'bottom') { + attr.translationX = -min * attr.length / (max - min); + attr.translationY = 0; + attr.scalingX = attr.length / (max - min); + attr.scalingY = 1; + attr.scalingCenterY = 0; + attr.scalingCenterX = 0; + me.applyTransformations(true); + } + + if (layout) { + layout.calculateLayout(context); + me.setLayoutContext(context); + } + }, + + iterate: function (snaps, fn) { + var i, position; + if (snaps.getLabel) { + if (snaps.min < snaps.from) { + fn.call(this, snaps.min, snaps.getLabel(snaps.min), -1, snaps); + } + for (i = 0; i <= snaps.steps; i++) { + fn.call(this, snaps.get(i), snaps.getLabel(i), i, snaps); + } + if (snaps.max > snaps.to) { + fn.call(this, snaps.max, snaps.getLabel(snaps.max), snaps.steps + 1, snaps); + } + } else { + if (snaps.min < snaps.from) { + fn.call(this, snaps.min, snaps.min, -1, snaps); + } + for (i = 0; i <= snaps.steps; i++) { + position = snaps.get(i); + fn.call(this, position, position, i, snaps); + } + if (snaps.max > snaps.to) { + fn.call(this, snaps.max, snaps.max, snaps.steps + 1, snaps); + } + } + }, + + renderTicks: function (surface, ctx, layout, clipRegion) { + var me = this, + attr = me.attr, + docked = attr.position, + matrix = attr.matrix, + halfLineWidth = 0.5 * attr.lineWidth, + xx = matrix.getXX(), + dx = matrix.getDX(), + yy = matrix.getYY(), + dy = matrix.getDY(), + majorTicks = layout.majorTicks, + majorTickSize = attr.majorTickSize, + minorTicks = layout.minorTicks, + minorTickSize = attr.minorTickSize; + + if (majorTicks) { + switch (docked) { + case 'right': + function getRightTickFn(size) { + return function (position, labelText, i) { + position = surface.roundPixel(position * yy + dy) + halfLineWidth; + ctx.moveTo(0, position); + ctx.lineTo(size, position); + }; + } + me.iterate(majorTicks, getRightTickFn(majorTickSize)); + minorTicks && me.iterate(minorTicks, getRightTickFn(minorTickSize)); + break; + case 'left': + function getLeftTickFn(size) { + return function (position, labelText, i) { + position = surface.roundPixel(position * yy + dy) + halfLineWidth; + ctx.moveTo(clipRegion[2] - size, position); + ctx.lineTo(clipRegion[2], position); + }; + } + me.iterate(majorTicks, getLeftTickFn(majorTickSize)); + minorTicks && me.iterate(minorTicks, getLeftTickFn(minorTickSize)); + break; + case 'bottom': + function getBottomTickFn(size) { + return function (position, labelText, i) { + position = surface.roundPixel(position * xx + dx) - halfLineWidth; + ctx.moveTo(position, 0); + ctx.lineTo(position, size); + }; + } + me.iterate(majorTicks, getBottomTickFn(majorTickSize)); + minorTicks && me.iterate(minorTicks, getBottomTickFn(minorTickSize)); + break; + case 'top': + function getTopTickFn(size) { + return function (position, labelText, i) { + position = surface.roundPixel(position * xx + dx) - halfLineWidth; + ctx.moveTo(position, clipRegion[3]); + ctx.lineTo(position, clipRegion[3] - size); + }; + } + me.iterate(majorTicks, getTopTickFn(majorTickSize)); + minorTicks && me.iterate(minorTicks, getTopTickFn(minorTickSize)); + break; + case 'angular': + me.iterate(majorTicks, function (position, labelText, i) { + position = position / (attr.max + 1) * Math.PI * 2 + attr.baseRotation; + ctx.moveTo( + attr.centerX + (attr.length) * Math.cos(position), + attr.centerY + (attr.length) * Math.sin(position) + ); + ctx.lineTo( + attr.centerX + (attr.length + majorTickSize) * Math.cos(position), + attr.centerY + (attr.length + majorTickSize) * Math.sin(position) + ); + }); + break; + } + } + }, + + renderLabels: function (surface, ctx, layout, clipRegion) { + var me = this, + attr = me.attr, + halfLineWidth = 0.5 * attr.lineWidth, + docked = attr.position, + matrix = attr.matrix, + textPadding = attr.textPadding, + xx = matrix.getXX(), + dx = matrix.getDX(), + yy = matrix.getYY(), + dy = matrix.getDY(), + thickness = 0, + majorTicks = layout.majorTicks, + padding = Math.max(attr.majorTickSize, attr.minorTickSize) + attr.lineWidth, + label = this.getLabel(), font, + lastLabelText = null, + textSize = 0, textCount = 0, + segmenter = layout.segmenter, + renderer = this.getRenderer(), + labelInverseMatrix, lastBBox = null, bbox, fly, text; + if (majorTicks && label && !label.attr.hidden) { + font = label.attr.font; + if (ctx.font !== font) { + ctx.font = font; + } // This can profoundly improve performance. + label.setAttributes({translationX: 0, translationY: 0}, true, true); + label.applyTransformations(); + labelInverseMatrix = label.attr.inverseMatrix.elements.slice(0); + switch (docked) { + case 'left': + label.setAttributes({ + translationX: surface.roundPixel(clipRegion[2] - padding + dx) - halfLineWidth - me.thickness / 2 + }, true, true); + break; + case 'right': + label.setAttributes({ + translationX: surface.roundPixel(padding + dx) - halfLineWidth + me.thickness / 2 + }, true, true); + break; + case 'top': + label.setAttributes({ + translationY: surface.roundPixel(clipRegion[3] - padding) - halfLineWidth - me.thickness / 2 + }, true, true); + break; + case 'bottom': + label.setAttributes({ + translationY: surface.roundPixel(padding) - halfLineWidth + me.thickness / 2 + }, true, true); + break; + case 'radial' : + label.setAttributes({ + translationX: attr.centerX + }, true, true); + break; + case 'angular': + label.setAttributes({ + translationY: attr.centerY + }, true, true); + break; + } + + // TODO: there are better ways to detect collision. + if (docked === 'left' || docked === 'right') { + me.iterate(majorTicks, function (position, labelText, i) { + if (labelText === undefined) { + return; + } + text = renderer ? renderer.call(this, labelText, layout, lastLabelText) : segmenter.renderer(labelText, layout, lastLabelText); + lastLabelText = labelText; + label.setAttributes({ + text: String(text), + translationY: surface.roundPixel(position * yy + dy) + }, true, true); + label.applyTransformations(); + thickness = Math.max(thickness, label.getBBox().width + padding); + if (thickness <= me.thickness) { + fly = Ext.draw.Matrix.fly(label.attr.matrix.elements.slice(0)); + bbox = fly.prepend.apply(fly, labelInverseMatrix).transformBBox(label.getBBox(true)); + if (lastBBox && !Ext.draw.Draw.isBBoxIntersect(bbox, lastBBox, textPadding)) { + return; + } + surface.renderSprite(label); + lastBBox = bbox; + textSize += bbox.height; + textCount++; + } + }); + } else if (docked === 'top' || docked === 'bottom') { + me.iterate(majorTicks, function (position, labelText, i) { + if (labelText === undefined) { + return; + } + text = renderer ? renderer.call(this, labelText, layout, lastLabelText) : segmenter.renderer(labelText, layout, lastLabelText); + lastLabelText = labelText; + label.setAttributes({ + text: String(text), + translationX: surface.roundPixel(position * xx + dx) + }, true, true); + label.applyTransformations(); + thickness = Math.max(thickness, label.getBBox().height + padding); + if (thickness <= me.thickness) { + fly = Ext.draw.Matrix.fly(label.attr.matrix.elements.slice(0)); + bbox = fly.prepend.apply(fly, labelInverseMatrix).transformBBox(label.getBBox(true)); + if (lastBBox && !Ext.draw.Draw.isBBoxIntersect(bbox, lastBBox, textPadding)) { + return; + } + surface.renderSprite(label); + lastBBox = bbox; + textSize += bbox.width; + textCount++; + } + }); + } else if (docked === 'radial') { + me.iterate(majorTicks, function (position, labelText, i) { + if (labelText === undefined) { + return; + } + text = renderer ? renderer.call(this, labelText, layout, lastLabelText) : segmenter.renderer(labelText, layout, lastLabelText); + lastLabelText = labelText; + if (typeof text !== 'undefined') { + label.setAttributes({ + text: String(text), + translationY: attr.centerY - surface.roundPixel(position) / attr.max * attr.length + }, true, true); + label.applyTransformations(); + bbox = label.attr.matrix.transformBBox(label.getBBox(true)); + if (lastBBox && !Ext.draw.Draw.isBBoxIntersect(bbox, lastBBox)) { + return; + } + surface.renderSprite(label); + lastBBox = bbox; + textSize += bbox.width; + textCount++; + } + }); + } else if (docked === 'angular') { + me.iterate(majorTicks, function (position, labelText, i) { + if (labelText === undefined) { + return; + } + text = renderer ? renderer.call(this, labelText, layout, lastLabelText) : segmenter.renderer(labelText, layout, lastLabelText); + lastLabelText = labelText; + + if (typeof text !== 'undefined') { + var angle = position / (attr.max + 1) * Math.PI * 2 + attr.baseRotation; + label.setAttributes({ + text: String(text), + translationX: attr.centerX + (attr.length + 10) * Math.cos(angle), + translationY: attr.centerY + (attr.length + 10) * Math.sin(angle) + }, true, true); + label.applyTransformations(); + bbox = label.attr.matrix.transformBBox(label.getBBox(true)); + if (lastBBox && !Ext.draw.Draw.isBBoxIntersect(bbox, lastBBox)) { + return; + } + surface.renderSprite(label); + lastBBox = bbox; + textSize += bbox.width; + textCount++; + } + }); + } + + if (attr.enlargeEstStepSizeByText && textCount) { + textSize /= textCount; + textSize += padding; + textSize *= 2; + if (attr.estStepSize < textSize) { + attr.estStepSize = textSize; + } + } + + if (Math.abs(me.thickness - (thickness)) > 1) { + me.thickness = thickness; + attr.bbox.plain.dirty = true; + attr.bbox.transform.dirty = true; + me.doThicknessChanged(); + return false; + } + } + }, + + renderAxisLine: function (surface, ctx, layout, clipRegion) { + var me = this, + attr = me.attr, + halfLineWidth = attr.lineWidth * 0.5, + docked = attr.position, + position; + if (attr.axisLine) { + switch (docked) { + case 'left': + position = surface.roundPixel(clipRegion[2]) - halfLineWidth; + ctx.moveTo(position, -attr.endGap); + ctx.lineTo(position, attr.length + attr.startGap); + break; + case 'right': + ctx.moveTo(halfLineWidth, -attr.endGap); + ctx.lineTo(halfLineWidth, attr.length + attr.startGap); + break; + case 'bottom': + ctx.moveTo(-attr.startGap, halfLineWidth); + ctx.lineTo(attr.length + attr.endGap, halfLineWidth); + break; + case 'top': + position = surface.roundPixel(clipRegion[3]) - halfLineWidth; + ctx.moveTo(-attr.startGap, position); + ctx.lineTo(attr.length + attr.endGap, position); + break; + case 'angular': + ctx.moveTo(attr.centerX + attr.length, attr.centerY); + ctx.arc(attr.centerX, attr.centerY, attr.length, 0, Math.PI * 2, true); + break; + } + } + }, + + renderGridLines: function (surface, ctx, layout, clipRegion) { + var me = this, + attr = me.attr, + matrix = attr.matrix, + startGap = attr.startGap, + endGap = attr.endGap, + xx = matrix.getXX(), + yy = matrix.getYY(), + dx = matrix.getDX(), + dy = matrix.getDY(), + position = attr.position, + majorTicks = layout.majorTicks, + anchor, j, lastAnchor; + if (attr.grid) { + if (majorTicks) { + if (position === 'left' || position === 'right') { + lastAnchor = attr.min * yy + dy + endGap + startGap; + me.iterate(majorTicks, function (position, labelText, i) { + anchor = position * yy + dy + endGap; + me.putMarker('horizontal-' + (i % 2 ? 'odd' : 'even'), { + y: anchor, + height: lastAnchor - anchor + }, j = i, true); + lastAnchor = anchor; + }); + j++; + anchor = 0; + me.putMarker('horizontal-' + (j % 2 ? 'odd' : 'even'), { + y: anchor, + height: lastAnchor - anchor + }, j, true); + } else if (position === 'top' || position === 'bottom') { + lastAnchor = attr.min * xx + dx + startGap; + if (startGap) { + me.putMarker('vertical-even', { + x: 0, + width: lastAnchor + }, -1, true); + } + me.iterate(majorTicks, function (position, labelText, i) { + anchor = position * xx + dx + startGap; + me.putMarker('vertical-' + (i % 2 ? 'odd' : 'even'), { + x: anchor, + width: lastAnchor - anchor + }, j = i, true); + lastAnchor = anchor; + }); + j++; + anchor = attr.length + attr.startGap + attr.endGap; + me.putMarker('vertical-' + (j % 2 ? 'odd' : 'even'), { + x: anchor, + width: lastAnchor - anchor + }, j, true); + } else if (position === 'radial') { + me.iterate(majorTicks, function (position, labelText, i) { + anchor = position / attr.max * attr.length; + me.putMarker('circular-' + (i % 2 ? 'odd' : 'even'), { + scalingX: anchor, + scalingY: anchor + }, i, true); + lastAnchor = anchor; + }); + } else if (position === 'angular') { + me.iterate(majorTicks, function (position, labelText, i) { + anchor = position / (attr.max + 1) * Math.PI * 2 + attr.baseRotation; + me.putMarker('radial-' + (i % 2 ? 'odd' : 'even'), { + rotationRads: anchor, + rotationCenterX: 0, + rotationCenterY: 0, + scalingX: attr.length, + scalingY: attr.length + }, i, true); + lastAnchor = anchor; + }); + } + } + } + }, + + doThicknessChanged: function () { + var axis = this.getAxis(); + if (axis) { + axis.onThicknessChanged(); + } + }, + + render: function (surface, ctx, clipRegion) { + var me = this, + layout = me.getLayoutContext(); + if (layout) { + if (false === me.renderLabels(surface, ctx, layout, clipRegion)) { + return false; + } + ctx.beginPath(); + me.renderTicks(surface, ctx, layout, clipRegion); + me.renderAxisLine(surface, ctx, layout, clipRegion); + me.renderGridLines(surface, ctx, layout, clipRegion); + ctx.stroke(); + } + } +}); + +/** + * @abstract + * @class Ext.chart.axis.segmenter.Segmenter + * + * Interface for a segmenter in an Axis. A segmenter defines the operations you can do to a specific + * data type. + * + * See {@link Ext.chart.axis.Axis}. + * + */ +Ext.define('Ext.chart.axis.segmenter.Segmenter', { + + config: { + /** + * @cfg {Ext.chart.axis.Axis} axis The axis that the Segmenter is bound. + */ + axis: null + }, + + constructor: function (config) { + this.initConfig(config); + }, + + /** + * This method formats the value. + * + * @param {*} value The value to format. + * @param {Object} context Axis layout context. + * @return {String} + */ + renderer: function (value, context) { + return String(value); + }, + + /** + * Convert from any data into the target type. + * @param {*} value The value to convert from + * @return {*} The converted value. + */ + from: function (value) { + return value; + }, + + /** + * Returns the difference between the min and max value based on the given unit scale. + * + * @param {*} min The smaller value. + * @param {*} max The larger value. + * @param {*} unit The unit scale. Unit can be any type. + * @return {Number} The number of `unit`s between min and max. It is the minimum n that min + n * unit >= max. + */ + diff: Ext.emptyFn, + + /** + * Align value with step of units. + * For example, for the date segmenter, if the unit is "Month" and step is 3, the value will be aligned by + * seasons. + * + * @param {*} value The value to be aligned. + * @param {Number} step The step of units. + * @param {*} unit The unit. + * @return {*} Aligned value. + */ + align: Ext.emptyFn, + + /** + * Add `step` `unit`s to the value. + * @param {*} value The value to be added. + * @param {Number} step The step of units. Negative value are allowed. + * @param {*} unit The unit. + */ + add: Ext.emptyFn, + + /** + * Given a start point and estimated step size of a range, determine the preferred step size. + * + * @param {*} start The start point of range. + * @param {*} estStepSize The estimated step size. + * @return {Object} Return the step size by an object of step x unit. + * @return {Number} return.step The step count of units. + * @return {Number|Object} return.unit The unit. + */ + preferredStep: Ext.emptyFn +}); + +/** + * @class Ext.chart.axis.segmenter.Names + * @extends Ext.chart.axis.segmenter.Segmenter + * + * Names data type. Names will be calculated as their indices in the methods in this class. + * The `preferredStep` always return `{ unit: 1, step: 1 }` to indicate "show every item". + * + */ +Ext.define("Ext.chart.axis.segmenter.Names", { + extend: Ext.chart.axis.segmenter.Segmenter , + alias: 'segmenter.names', + + renderer: function (value, context) { + return value; + }, + + diff: function (min, max, unit) { + return Math.floor(max - min); + }, + + align: function (value, step, unit) { + return Math.floor(value); + }, + + + add: function (value, step, unit) { + return value + step; + }, + + preferredStep: function (min, estStepSize, minIdx, data) { + return { + unit: 1, + step: 1 + }; + } +}); + +/** + * @class Ext.chart.axis.segmenter.Time + * @extends Ext.chart.axis.segmenter.Segmenter + * + * Time data type. + */ +Ext.define('Ext.chart.axis.segmenter.Time', { + extend: Ext.chart.axis.segmenter.Segmenter , + alias: 'segmenter.time', + + config: { + /** + * @cfg {Object} step + * If specified, the will override the result of {@link #preferredStep}. + */ + step: null + }, + + renderer: function (value, context) { + var ExtDate = Ext.Date; + switch (context.majorTicks.unit) { + case 'y': + return ExtDate.format(value, 'Y'); + case 'mo': + return ExtDate.format(value, 'Y-m'); + case 'd': + return ExtDate.format(value, 'Y-m-d'); + } + return ExtDate.format(value, 'Y-m-d\nH:i:s'); + }, + + from: function (value) { + return new Date(value); + }, + + diff: function (min, max, unit) { + var ExtDate = Ext.Date; + if (isFinite(min)) { + min = new Date(min); + } + if (isFinite(max)) { + max = new Date(max); + } + return ExtDate.diff(min, max, unit); + }, + + align: function (date, step, unit) { + if (unit === 'd' && step >= 7) { + date = Ext.Date.align(date, 'd', step); + date.setDate(date.getDate() - date.getDay() + 1); + return date; + } else { + return Ext.Date.align(date, unit, step); + } + }, + + add: function (value, step, unit) { + return Ext.Date.add(new Date(value), unit, step); + }, + + preferredStep: function (min, estStepSize) { + if (this.getStep()) { + return this.getStep(); + } + var from = new Date(+min), + to = new Date(+min + Math.ceil(estStepSize)), + ExtDate = Ext.Date, + units = [ + [ExtDate.YEAR, 1, 2, 5, 10, 20, 50, 100, 200, 500], + [ExtDate.MONTH, 1, 3, 6], + [ExtDate.DAY, 1, 7, 14], + [ExtDate.HOUR, 1, 6, 12], + [ExtDate.MINUTE, 1, 5, 15, 30], + [ExtDate.SECOND, 1, 5, 15, 30], + [ExtDate.MILLI, 1, 2, 5, 10, 20, 50, 100, 200, 500] + ], + result; + + for (var i = 0; i < units.length; i++) { + var unit = units[i][0], + diff = this.diff(from, to, unit); + if (diff > 0) { + for (var j = 1; j < units[i].length; j++) { + if (diff <= units[i][j]) { + result = { + unit: unit, + step: units[i][j] + }; + break; + } + } + if (!result) { + i--; + result = { + unit: units[i][0], + step: 1 + }; + } + break; + } + } + if (!result) { + result = {unit: ExtDate.DAY, step: 1}; // Default step is one Day. + } + return result; + } +}); + +/** + * @class Ext.chart.axis.segmenter.Numeric + * @extends Ext.chart.axis.segmenter.Segmenter + * + * Numeric data type. + */ +Ext.define('Ext.chart.axis.segmenter.Numeric', { + extend: Ext.chart.axis.segmenter.Segmenter , + alias: 'segmenter.numeric', + + renderer: function (value, context) { + return value.toFixed(Math.max(0, context.majorTicks.unit.fixes)); + }, + + diff: function (min, max, unit) { + return Math.floor((max - min) / unit.scale); + }, + + align: function (value, step, unit) { + return Math.floor(value / (unit.scale * step)) * unit.scale * step; + }, + + + add: function (value, step, unit) { + return value + step * unit.scale; + }, + + preferredStep: function (min, estStepSize) { + var logs = Math.floor(Math.log(estStepSize) * Math.LOG10E), // common logarithm of estStepSize + scale = Math.pow(10, logs); + estStepSize /= scale; + if (estStepSize < 2) { + estStepSize = 2; + } else if (estStepSize < 5) { + estStepSize = 5; + } else if (estStepSize < 10) { + estStepSize = 10; + logs++; + } + return { + unit: { + // when estStepSize < 1, rounded down log10(estStepSize) is equal to -number_of_leading_zeros in estStepSize + fixes: -logs, // number of fractional digits + scale: scale + }, + step: estStepSize + }; + }, + + /** + * Wraps the provided estimated step size of a range without altering it into a step size object. + * + * @param {*} min The start point of range. + * @param {*} estStepSize The estimated step size. + * @return {Object} Return the step size by an object of step x unit. + * @return {Number} return.step The step count of units. + * @return {Object} return.unit The unit. + */ + + exactStep: function (min, estStepSize) { + var logs = Math.floor(Math.log(estStepSize) * Math.LOG10E), + scale = Math.pow(10, logs); + return { + unit: { + // add one decimal point if estStepSize is not a multiple of scale + fixes: -logs + (estStepSize % scale === 0 ? 0 : 1), + scale: 1 + }, + step: estStepSize + } + } +}); + +/** + * @abstract + * @class Ext.chart.axis.layout.Layout + * + * Interface used by Axis to process its data into a meaningful layout. + */ +Ext.define("Ext.chart.axis.layout.Layout", { + config: { + /** + * @cfg {Ext.chart.axis.Axis} axis The axis that the Layout is bound. + */ + axis: null + }, + + constructor: function (config) { + this.initConfig(); + }, + + /** + * Processes the data of the series bound to the axis. + * @param {Ext.chart.series.Series} series The bound series. + */ + processData: function (series) { + var me = this, + axis = me.getAxis(), + direction = axis.getDirection(), + boundSeries = axis.boundSeries, + i, ln, item; + if (series) { + series['coordinate' + direction](); + } else { + for (i = 0, ln = boundSeries.length; i < ln; i++) { + item = boundSeries[i]; + if (item['get' + direction + 'Axis']() === axis) { + item['coordinate' + direction](); + } + } + } + }, + + /** + * Calculates the position of major ticks for the axis. + * @param {Object} context + */ + calculateMajorTicks: function (context) { + var me = this, + attr = context.attr, + range = attr.max - attr.min, + zoom = range / Math.max(1, attr.length) * (attr.visibleMax - attr.visibleMin), + viewMin = attr.min + range * attr.visibleMin, + viewMax = attr.min + range * attr.visibleMax, + estStepSize = attr.estStepSize * zoom, + out = me.snapEnds(context, attr.min, attr.max, estStepSize); + if (out) { + me.trimByRange(context, out, viewMin, viewMax); + context.majorTicks = out; + } + }, + + /** + * Calculates the position of sub ticks for the axis. + * @param {Object} context + */ + calculateMinorTicks: function (context) { + var attr = context.attr; + if (this.snapMinorEnds) { + context.minorTicks = this.snapMinorEnds(context); + } + }, + + /** + * Calculates the position of tick marks for the axis. + * @param {Object} context + * @return {*} + */ + calculateLayout: function (context) { + var me = this, + attr = context.attr, + majorTicks = attr.majorTicks, + minorTicks = attr.minorTicks; + if (attr.length === 0) { + return null; + } + + if (majorTicks) { + this.calculateMajorTicks(context); + if (minorTicks) { + this.calculateMinorTicks(context); + } + } + }, + + /** + * Snaps the data bound to the axis to meaningful tick marks. + * @param {Object} context + * @param {Number} min + * @param {Number} max + * @param {Number} estStepSize + */ + snapEnds: Ext.emptyFn, + + /** + * Trims the layout of the axis by the defined minimum and maximum. + * @param {Object} context + * @param {Object} out + * @param {Number} trimMin + * @param {Number} trimMax + */ + trimByRange: function (context, out, trimMin, trimMax) { + var segmenter = context.segmenter, + unit = out.unit, + beginIdx = segmenter.diff(out.from, trimMin, unit), + endIdx = segmenter.diff(out.from, trimMax, unit), + begin = Math.max(0, Math.ceil(beginIdx / out.step)), + end = Math.min(out.steps, Math.floor(endIdx / out.step)); + + if (end < out.steps) { + out.to = segmenter.add(out.from, end * out.step, unit); + } + + if (out.max > trimMax) { + out.max = out.to; + } + + if (out.from < trimMin) { + out.from = segmenter.add(out.from, begin * out.step, unit); + while (out.from < trimMin) { + begin++; + out.from = segmenter.add(out.from, out.step, unit); + } + } + + if (out.min < trimMin) { + out.min = out.from; + } + + out.steps = end - begin; + } +}); + +/** + * @class Ext.chart.axis.layout.Discrete + * @extends Ext.chart.axis.layout.Layout + * + * Simple processor for data that cannot be interpolated. + */ +Ext.define('Ext.chart.axis.layout.Discrete', { + extend: Ext.chart.axis.layout.Layout , + alias: 'axisLayout.discrete', + + processData: function () { + var me = this, + axis = me.getAxis(), + boundSeries = axis.boundSeries, + direction = axis.getDirection(), + i, ln, item; + this.labels = []; + this.labelMap = {}; + for (i = 0, ln = boundSeries.length; i < ln; i++) { + item = boundSeries[i]; + if (item['get' + direction + 'Axis']() === axis) { + item['coordinate' + direction](); + } + } + // About the labels on Category axes (aka. axes with a Discrete layout)... + // + // When the data set from the store changes, series.processData() is called, which does its thing + // at the series level and then calls series.updateLabelData() to update the labels in the sprites + // that belong to the series. At the same time, series.processData() calls axis.processData(), which + // also does its thing but at the axis level, and also needs to update the labels for the sprite(s) + // that belong to the axis. This is not that simple, however. So how are the axis labels rendered? + // First, axis.sprite.Axis.render() calls renderLabels() which obtains the majorTicks from the + // axis.layout and iterate() through them. The majorTicks are an object returned by snapEnds() below + // which provides a getLabel() function that returns the label from the axis.layoutContext.data array. + // So now the question is: how are the labels transferred from the axis.layout to the axis.layoutContext? + // The easy response is: it's in calculateLayout() below. The issue is to call calculateLayout() because + // it takes in an axis.layoutContext that can only be created in axis.sprite.Axis.doLayout(), which is + // a private "updater" function that is called by all the sprite's "dirtyTriggers". Of course, we don't + // want to call doLayout() directly from here, so instead we update the sprite's data attribute, which + // sets the dirtyTrigger which calls doLayout() which calls calculateLayout() etc... + // Note that the sprite's data attribute could be set to any value and it would still result in the + // dirtyTrigger we need. For consistency, however, it is set to the labels. + axis.getSprites()[0].setAttributes({data:this.labels}); + }, + + // @inheritdoc + calculateLayout: function (context) { + context.data = this.labels; + this.callSuper([context]); + }, + + //@inheritdoc + calculateMajorTicks: function (context) { + var me = this, + attr = context.attr, + data = context.data, + range = attr.max - attr.min, + zoom = range / Math.max(1, attr.length) * (attr.visibleMax - attr.visibleMin), + viewMin = attr.min + range * attr.visibleMin, + viewMax = attr.min + range * attr.visibleMax, + estStepSize = attr.estStepSize * zoom; + + var out = me.snapEnds(context, Math.max(0, attr.min), Math.min(attr.max, data.length - 1), estStepSize); + if (out) { + me.trimByRange(context, out, viewMin, viewMax); + context.majorTicks = out; + } + }, + + // @inheritdoc + snapEnds: function (context, min, max, estStepSize) { + estStepSize = Math.ceil(estStepSize); + var steps = Math.floor((max - min) / estStepSize), + data = context.data; + return { + min: min, + max: max, + from: min, + to: steps * estStepSize + min, + step: estStepSize, + steps: steps, + unit: 1, + getLabel: function (current) { + return data[this.from + this.step * current]; + }, + get: function (current) { + return this.from + this.step * current; + } + }; + }, + + // @inheritdoc + trimByRange: function (context, out, trimMin, trimMax) { + var unit = out.unit, + beginIdx = Math.ceil((trimMin - out.from) / unit) * unit, + endIdx = Math.floor((trimMax - out.from) / unit) * unit, + begin = Math.max(0, Math.ceil(beginIdx / out.step)), + end = Math.min(out.steps, Math.floor(endIdx / out.step)); + + if (end < out.steps) { + out.to = end; + } + + if (out.max > trimMax) { + out.max = out.to; + } + + if (out.from < trimMin && out.step > 0) { + out.from = out.from + begin * out.step * unit; + while (out.from < trimMin) { + begin++; + out.from += out.step * unit; + } + } + + if (out.min < trimMin) { + out.min = out.from; + } + + out.steps = end - begin; + }, + + getCoordFor: function (value, field, idx, items) { + this.labels.push(value); + return this.labels.length - 1; + } +}); + +/** + * @class Ext.chart.axis.layout.Continuous + * @extends Ext.chart.axis.layout.Layout + * + * Processor for axis data that can be interpolated. + */ +Ext.define('Ext.chart.axis.layout.Continuous', { + extend: Ext.chart.axis.layout.Layout , + alias: 'axisLayout.continuous', + config: { + adjustMinimumByMajorUnit: false, + adjustMaximumByMajorUnit: false + }, + + getCoordFor: function (value, field, idx, items) { + return +value; + }, + + //@inheritdoc + snapEnds: function (context, min, max, estStepSize) { + var segmenter = context.segmenter, + axis = this.getAxis(), + minimum = axis.getMinimum(), + maximum = axis.getMaximum(), + majorTickSteps = axis.getMajorTickSteps(), + out = majorTickSteps && Ext.isNumber(minimum) && Ext.isNumber(maximum) && segmenter.exactStep ? + segmenter.exactStep(min, (max - min) / majorTickSteps) : + segmenter.preferredStep(min, estStepSize), + unit = out.unit, + step = out.step, + from = segmenter.align(min, step, unit), + steps = segmenter.diff(min, max, unit) + 1; + return { + min: segmenter.from(min), + max: segmenter.from(max), + from: from, + to: segmenter.add(from, steps * step, unit), + step: step, + steps: steps, + unit: unit, + get: function (current) { + return segmenter.add(this.from, this.step * current, unit); + } + }; + }, + + snapMinorEnds: function (context) { + var majorTicks = context.majorTicks, + minorTickSteps = this.getAxis().getMinorTickSteps(), + segmenter = context.segmenter, + min = majorTicks.min, + max = majorTicks.max, + from = majorTicks.from, + unit = majorTicks.unit, + step = majorTicks.step / minorTickSteps, + scaledStep = step * unit.scale, + fromMargin = from - min, + offset = Math.floor(fromMargin / scaledStep), + extraSteps = offset + Math.floor((max - majorTicks.to) / scaledStep) + 1, + steps = majorTicks.steps * minorTickSteps + extraSteps; + return { + min: min, + max: max, + from: min + fromMargin % scaledStep, + to: segmenter.add(from, steps * step, unit), + step: step, + steps: steps, + unit: unit, + get: function (current) { + return (current % minorTickSteps + offset + 1 !== 0) ? // don't render minor tick in major tick position + segmenter.add(this.from, this.step * current, unit) : + null; + } + } + } +}); + +/** + * @class Ext.chart.axis.layout.CombineDuplicate + * @extends Ext.chart.axis.layout.Discrete + * + * Discrete processor that combines duplicate data points. + */ +Ext.define("Ext.chart.axis.layout.CombineDuplicate", { + extend: Ext.chart.axis.layout.Discrete , + alias: 'axisLayout.combineDuplicate', + + getCoordFor: function (value, field, idx, items) { + if (!(value in this.labelMap)) { + var result = this.labelMap[value] = this.labels.length; + this.labels.push(value); + return result; + } + return this.labelMap[value]; + } + +}); + +/** + * @class Ext.chart.axis.Axis + * + * Defines axis for charts. + * + * Using the current model, the type of axis can be easily extended. By default, Sencha Touch provides three different + * types of axis: + * + * * **numeric** - the data attached with this axes are considered to be numeric and continuous. + * * **time** - the data attached with this axes are considered (or get converted into) date/time and they are continuous. + * * **category** - the data attached with this axes conforms a finite set. They will be evenly placed on the axis and displayed in the same form they were provided. + * + * The behavior of an axis can be easily changed by setting different types of axis layout and axis segmenter to the axis. + * + * Axis layout defines how the data points are placed. Using continuous layout, the data points will be distributed by + * the numeric value. Using discrete layout the data points will be spaced evenly. Furthermore, if you want to combine + * the data points with the duplicate values in a discrete layout, you should use combineDuplicate layout. + * + * Segmenter defines the way to segment data range. For example, if you have a Date-type data range from Jan 1, 1997 to + * Jan 1, 2017, the segmenter will segement the data range into years, months or days based on the current zooming + * level. + * + * It is possible to write custom axis layouts and segmenters to extends this behavior by simply implementing interfaces + * {@link Ext.chart.axis.layout.Layout} and {@link Ext.chart.axis.segmenter.Segmenter}. + * + * Here's an example for the axes part of a chart definition: + * An example of axis for a series (in this case for an area chart that has multiple layers of yFields) could be: + * + * axes: [{ + * type: 'numeric', + * position: 'left', + * title: 'Number of Hits', + * grid: { + * odd: { + * opacity: 1, + * fill: '#ddd', + * stroke: '#bbb', + * lineWidth: 1 + * } + * }, + * minimum: 0 + * }, { + * type: 'category', + * position: 'bottom', + * title: 'Month of the Year', + * grid: true, + * label: { + * rotate: { + * degrees: 315 + * } + * } + * }] + * + * In this case we use a `numeric` axis for displaying the values of the Area series and a `category` axis for displaying the names of + * the store elements. The numeric axis is placed on the left of the screen, while the category axis is placed at the bottom of the chart. + * Both the category and numeric axes have `grid` set, which means that horizontal and vertical lines will cover the chart background. In the + * category axis the labels will be rotated so they can fit the space better. + */ +Ext.define('Ext.chart.axis.Axis', { + xtype: 'axis', + + mixins: { + observable: Ext.mixin.Observable + }, + + + + + + + + config: { + /** + * @cfg {String} position + * Where to set the axis. Available options are `left`, `bottom`, `right`, `top`, `radial` and `angular`. + */ + position: 'bottom', + + /** + * @cfg {Array} fields + * An array containing the names of the record fields which should be mapped along the axis. + * This is optional if the binding between series and fields is clear. + */ + fields: [], + + /** + * @cfg {Object} label + * + * The label configuration object for the Axis. This object may include style attributes + * like `spacing`, `padding`, `font` that receives a string or number and + * returns a new string with the modified values. + * + * For more supported values, see the configurations for {@link Ext.chart.label.Label}. + */ + label: { x: 0, y: 0, textBaseline: 'middle', textAlign: 'center', fontSize: 12, fontFamily: 'Helvetica' }, + + /** + * @cfg {Object} grid + * The grid configuration object for the Axis style. Can contain `stroke` or `fill` attributes. + * Also may contain an `odd` or `even` property in which you only style things on odd or even rows. + * For example: + * + * + * grid { + * odd: { + * stroke: '#555' + * }, + * even: { + * stroke: '#ccc' + * } + * } + */ + grid: false, + + /** + * @cfg {Function} renderer Allows direct customisation of rendered axis sprites. + * @param {String} label The label. + * @param {Object|Ext.chart.axis.layout.Layout} layout The layout configuration used by the axis. + * @param {String} lastLabel The last label. + * @return {String} The label to display. + */ + renderer: null, + + /** + * @protected + * @cfg {Ext.chart.AbstractChart} chart The Chart that the Axis is bound. + */ + chart: null, + + /** + * @cfg {Object} style + * The style for the axis line and ticks. + * Refer to the {@link Ext.chart.axis.sprite.Axis} + */ + style: null, + + /** + * @cfg {Number} titleMargin + * The margin around the axis title. Unlike CSS where the margin is added on all 4 + * sides of an element, the `titleMargin` is the total space that is added horizontally + * for a vertical title and vertically for an horizontal title, with half the `titleMargin` + * being added on either side. + */ + titleMargin: 4, + + /** + * @cfg {Object} background + * The background config for the axis surface. + */ + background: null, + + /** + * @cfg {Number} minimum + * The minimum value drawn by the axis. If not set explicitly, the axis + * minimum will be calculated automatically. + */ + minimum: NaN, + + /** + * @cfg {Number} maximum + * The maximum value drawn by the axis. If not set explicitly, the axis + * maximum will be calculated automatically. + */ + maximum: NaN, + + /** + * @cfg {Number} minZoom + * The minimum zooming level for axis. + */ + minZoom: 1, + + /** + * @cfg {Number} maxZoom + * The maximum zooming level for axis + */ + maxZoom: 10000, + + /** + * @cfg {Object|Ext.chart.axis.layout.Layout} layout + * The axis layout config. See {@link Ext.chart.axis.layout.Layout} + */ + layout: 'continuous', + + /** + * @cfg {Object|Ext.chart.axis.segmenter.Segmenter} segmenter + * The segmenter config. See {@link Ext.chart.axis.segmenter.Segmenter} + */ + segmenter: 'numeric', + + /** + * @cfg {Boolean} hidden + * Indicate whether to hide the axis. + * If the axis is hidden, one of the axis line, ticks, labels or the title will be shown and + * no margin will be taken. + * The coordination mechanism works fine no matter if the axis is hidden. + */ + hidden: false, + + /** + * @cfg {Number} majorTickSteps + * If `minimum` and `maximum` are specified it forces the number of major ticks to the specified value. + */ + majorTickSteps: false, + + /** + * @cfg {Number} [minorTickSteps=0] + * The number of small ticks between two major ticks. + */ + minorTickSteps: false, + + /** + * @private + * @cfg {Boolean} adjustMaximumByMajorUnit + * Will be supported soon. + */ + adjustMaximumByMajorUnit: false, + + /** + * @private + * @cfg {Boolean} adjustMinimumByMajorUnit + * Will be supported soon. + * + */ + adjustMinimumByMajorUnit: false, + + /** + * @cfg {String|Object} title + * The title for the Axis. + * If given a String, the text style of the title sprite will be set, + * otherwise the style will be set. + */ + title: { fontSize: 18, fontFamily: 'Helvetica'}, + + /** + * @cfg {Number} increment + * Given a minimum and maximum bound for the series to be rendered (that can be obtained + * automatically or by manually setting `minimum` and `maximum`) tick marks will be added + * on each `increment` from the minimum value to the maximum one. + */ + increment: 0.5, + + /** + * @private + * @cfg {Number} length + * Length of the axis position. Equals to the size of inner region on the docking side of this axis. + * WARNING: Meant to be set automatically by chart. Do not set it manually. + */ + length: 0, + + /** + * @private + * @cfg {Array} center + * Center of the polar axis. + * WARNING: Meant to be set automatically by chart. Do not set it manually. + */ + center: null, + + /** + * @private + * @cfg {Number} radius + * Radius of the polar axis. + * WARNING: Meant to be set automatically by chart. Do not set it manually. + */ + radius: null, + + /** + * @private + * @cfg {Number} rotation + * Rotation of the polar axis. + * WARNING: Meant to be set automatically by chart. Do not set it manually. + */ + rotation: null, + + /** + * @cfg {Boolean} [labelInSpan] + * Draws the labels in the middle of the spans. + */ + labelInSpan: null, + + /** + * @cfg {Array} visibleRange + * Specify the proportion of the axis to be rendered. The series bound to + * this axis will be synchronized and transformed. + */ + visibleRange: [0, 1], + + /** + * @cfg {Boolean} needHighPrecision + * Indicates that the axis needs high precision surface implementation. + * See {@link Ext.draw.engine.Canvas#highPrecision} + */ + needHighPrecision: false + }, + + observableType: 'component', + + titleOffset: 0, + + animating: 0, + + prevMin: 0, + + prevMax: 1, + + boundSeries: [], + + sprites: null, + + /** + * @private + * @property {Array} The full data range of the axis. Should not be set directly, clear it to `null` and use + * `getRange` to update. + */ + range: null, + + xValues: [], + + yValues: [], + + applyRotation: function (rotation) { + var twoPie = Math.PI * 2; + return (rotation % twoPie + Math.PI) % twoPie - Math.PI; + }, + + updateRotation: function (rotation) { + var sprites = this.getSprites(), + position = this.getPosition(); + if (!this.getHidden() && position === 'angular' && sprites[0]) { + sprites[0].setAttributes({ + baseRotation: rotation + }); + } + }, + + applyTitle: function (title, oldTitle) { + var surface; + + if (Ext.isString(title)) { + title = { text: title }; + } + + if (!oldTitle) { + oldTitle = Ext.create('sprite.text', title); + if ((surface = this.getSurface())) { + surface.add(oldTitle); + } + } else { + oldTitle.setAttributes(title); + } + return oldTitle; + }, + + constructor: function (config) { + var me = this; + me.sprites = []; + this.labels = []; + this.initConfig(config); + me.getId(); + me.mixins.observable.constructor.apply(me, arguments); + Ext.ComponentManager.register(me); + }, + + /** + * @private + * @return {String} + */ + getAlignment: function () { + switch (this.getPosition()) { + case 'left': + case 'right': + return 'vertical'; + case 'top': + case 'bottom': + return 'horizontal'; + case 'radial': + return 'radial'; + case 'angular': + return 'angular'; + } + }, + + /** + * @private + * @return {String} + */ + getGridAlignment: function () { + switch (this.getPosition()) { + case 'left': + case 'right': + return 'horizontal'; + case 'top': + case 'bottom': + return 'vertical'; + case 'radial': + return 'circular'; + case 'angular': + return "radial"; + } + }, + + /** + * @private + * Get the surface for drawing the series sprites + */ + getSurface: function () { + if (!this.surface) { + var chart = this.getChart(); + if (!chart) { + return null; + } + var surface = this.surface = chart.getSurface(this.getId(), 'axis'), + gridSurface = this.gridSurface = chart.getSurface('main'), + sprites = this.getSprites(), + sprite = sprites[0], + grid = this.getGrid(), + gridAlignment = this.getGridAlignment(), + gridSprite; + if (grid) { + gridSprite = this.gridSpriteEven = new Ext.chart.Markers(); + gridSprite.setTemplate({xclass: 'grid.' + gridAlignment}); + if (Ext.isObject(grid)) { + gridSprite.getTemplate().setAttributes(grid); + if (Ext.isObject(grid.even)) { + gridSprite.getTemplate().setAttributes(grid.even); + } + } + gridSurface.add(gridSprite); + sprite.bindMarker(gridAlignment + '-even', gridSprite); + + gridSprite = this.gridSpriteOdd = new Ext.chart.Markers(); + gridSprite.setTemplate({xclass: 'grid.' + gridAlignment}); + if (Ext.isObject(grid)) { + gridSprite.getTemplate().setAttributes(grid); + if (Ext.isObject(grid.odd)) { + gridSprite.getTemplate().setAttributes(grid.odd); + } + } + gridSurface.add(gridSprite); + sprite.bindMarker(gridAlignment + '-odd', gridSprite); + + gridSurface.waitFor(surface); + } + } + return this.surface; + }, + + /** + * + * Mapping data value into coordinate. + * + * @param {*} value + * @param {String} field + * @param {Number} [idx] + * @param {Ext.util.MixedCollection} [items] + * @return {Number} + */ + getCoordFor: function (value, field, idx, items) { + return this.getLayout().getCoordFor(value, field, idx, items); + }, + + applyPosition: function (pos) { + return pos.toLowerCase(); + }, + + applyLabel: function (newText, oldText) { + if (!oldText) { + oldText = new Ext.draw.sprite.Text({}); + } + oldText.setAttributes(newText); + return oldText; + }, + + applyLayout: function (layout, oldLayout) { + // TODO: finish this + layout = Ext.factory(layout, null, oldLayout, 'axisLayout'); + layout.setAxis(this); + return layout; + }, + + applySegmenter: function (segmenter, oldSegmenter) { + // TODO: finish this + segmenter = Ext.factory(segmenter, null, oldSegmenter, 'segmenter'); + segmenter.setAxis(this); + return segmenter; + }, + + updateMinimum: function () { + this.range = null; + }, + + updateMaximum: function () { + this.range = null; + }, + + hideLabels: function () { + this.getSprites()[0].setDirty(true); + this.setLabel({hidden: true}); + }, + + showLabels: function () { + this.getSprites()[0].setDirty(true); + this.setLabel({hidden: false}); + }, + + /** + * Invokes renderFrame on this axis's surface(s) + */ + renderFrame: function () { + this.getSurface().renderFrame(); + }, + + updateChart: function (newChart, oldChart) { + var me = this, surface; + if (oldChart) { + oldChart.un('serieschanged', me.onSeriesChanged, me); + } + if (newChart) { + newChart.on('serieschanged', me.onSeriesChanged, me); + if (newChart.getSeries()) { + me.onSeriesChanged(newChart); + } + me.surface = null; + surface = me.getSurface(); + surface.add(me.getSprites()); + surface.add(me.getTitle()); + } + }, + + applyBackground: function (background) { + var rect = Ext.ClassManager.getByAlias('sprite.rect'); + return rect.def.normalize(background); + }, + + /** + * @protected + * Invoked when data has changed. + */ + processData: function () { + this.getLayout().processData(); + this.range = null; + }, + + getDirection: function () { + return this.getChart().getDirectionForAxis(this.getPosition()); + }, + + isSide: function () { + var position = this.getPosition(); + return position === 'left' || position === 'right'; + }, + + applyFields: function (fields) { + return [].concat(fields); + }, + + updateFields: function (fields) { + this.fieldsMap = {}; + for (var i = 0; i < fields.length; i++) { + this.fieldsMap[fields[i]] = true; + } + }, + + applyVisibleRange: function (visibleRange, oldVisibleRange) { + // If it is in reversed order swap them + if (visibleRange[0] > visibleRange[1]) { + var temp = visibleRange[0]; + visibleRange[0] = visibleRange[1]; + visibleRange[0] = temp; + } + if (visibleRange[1] === visibleRange[0]) { + visibleRange[1] += 1 / this.getMaxZoom(); + } + if (visibleRange[1] > visibleRange[0] + 1) { + visibleRange[0] = 0; + visibleRange[1] = 1; + } else if (visibleRange[0] < 0) { + visibleRange[1] -= visibleRange[0]; + visibleRange[0] = 0; + } else if (visibleRange[1] > 1) { + visibleRange[0] -= visibleRange[1] - 1; + visibleRange[1] = 1; + } + + if (oldVisibleRange && visibleRange[0] === oldVisibleRange[0] && visibleRange[1] === oldVisibleRange[1]) { + return undefined; + } + + return visibleRange; + }, + + updateVisibleRange: function (visibleRange) { + this.fireEvent('transformed', this, visibleRange); + }, + + onSeriesChanged: function (chart) { + var me = this, + series = chart.getSeries(), + getAxisMethod = 'get' + me.getDirection() + 'Axis', + boundSeries = [], i, ln = series.length; + for (i = 0; i < ln; i++) { + if (this === series[i][getAxisMethod]()) { + boundSeries.push(series[i]); + } + } + + me.boundSeries = boundSeries; + me.getLayout().processData(); + }, + + applyRange: function (newRange) { + if (!newRange) { + return this.dataRange.slice(0); + } else { + return [ + newRange[0] === null ? this.dataRange[0] : newRange[0], + newRange[1] === null ? this.dataRange[1] : newRange[1] + ]; + } + }, + + /** + * Get the range derived from all the bound series. + * @return {Array} + */ + getRange: function () { + var me = this, + getRangeMethod = 'get' + me.getDirection() + 'Range'; + + if (me.range) { + return me.range; + } + if (!isNaN(me.getMinimum()) && !isNaN(me.getMaximum())) { + return this.range = [me.getMinimum(), me.getMaximum()]; + } + var min = Infinity, + max = -Infinity, + boundSeries = me.boundSeries, + series, i, ln; + + // For each series bound to this axis, ask the series for its min/max values + // and use them to find the overall min/max. + for (i = 0, ln = boundSeries.length; i < ln; i++) { + series = boundSeries[i]; + var minMax = series[getRangeMethod](); + + if (minMax) { + if (minMax[0] < min) { + min = minMax[0]; + } + if (minMax[1] > max) { + max = minMax[1]; + } + } + } + if (!isFinite(max)) { + max = me.prevMax; + } + + if (!isFinite(min)) { + min = me.prevMin; + } + + if (this.getLabelInSpan() || min === max) { + max += this.getIncrement(); + min -= this.getIncrement(); + } + + if (!isNaN(me.getMinimum())) { + min = me.getMinimum(); + } else { + me.prevMin = min; + } + + if (!isNaN(me.getMaximum())) { + max = me.getMaximum(); + } else { + me.prevMax = max; + } + + return this.range = [min, max]; + }, + + applyStyle: function (style, oldStyle) { + var cls = Ext.ClassManager.getByAlias('sprite.' + this.seriesType); + if (cls && cls.def) { + style = cls.def.normalize(style); + } + oldStyle = Ext.apply(oldStyle || {}, style); + return oldStyle; + }, + + updateCenter: function (center) { + var sprites = this.getSprites(), + axisSprite = sprites[0], + centerX = center[0], + centerY = center[1]; + if (axisSprite) { + axisSprite.setAttributes({ + centerX: centerX, + centerY: centerY + }); + } + if (this.gridSpriteEven) { + this.gridSpriteEven.getTemplate().setAttributes({ + translationX: centerX, + translationY: centerY, + rotationCenterX: centerX, + rotationCenterY: centerY + }); + } + if (this.gridSpriteOdd) { + this.gridSpriteOdd.getTemplate().setAttributes({ + translationX: centerX, + translationY: centerY, + rotationCenterX: centerX, + rotationCenterY: centerY + }); + } + }, + + getSprites: function () { + if (!this.getChart()) { + return; + } + var me = this, + range = me.getRange(), + position = me.getPosition(), + chart = me.getChart(), + animation = chart.getAnimate(), + baseSprite, style, + length = me.getLength(); + + // If animation is false, then stop animation. + if (animation === false) { + animation = { + duration: 0 + }; + } + if (range) { + style = Ext.applyIf({ + position: position, + axis: me, + min: range[0], + max: range[1], + length: length, + grid: me.getGrid(), + hidden: me.getHidden(), + titleOffset: me.titleOffset, + layout: me.getLayout(), + segmenter: me.getSegmenter(), + label: me.getLabel() + }, me.getStyle()); + + // If the sprites are not created. + if (!me.sprites.length) { + baseSprite = new Ext.chart.axis.sprite.Axis(style); + baseSprite.fx.setCustomDuration({ + baseRotation: 0 + }); + baseSprite.fx.on("animationstart", "onAnimationStart", me); + baseSprite.fx.on("animationend", "onAnimationEnd", me); + me.sprites.push(baseSprite); + me.updateTitleSprite(); + } else { + baseSprite = me.sprites[0]; + baseSprite.fx.setConfig(animation); + baseSprite.setAttributes(style); + baseSprite.setLayout(me.getLayout()); + baseSprite.setSegmenter(me.getSegmenter()); + baseSprite.setLabel(me.getLabel()); + } + + if (me.getRenderer()) { + baseSprite.setRenderer(me.getRenderer()); + } + } + + return me.sprites; + }, + + updateTitleSprite: function () { + if (!this.sprites[0]) { + return; + } + var me = this, + thickness = this.sprites[0].thickness, + surface = me.getSurface(), + title = this.getTitle(), + position = me.getPosition(), + titleMargin = me.getTitleMargin(), + length = me.getLength(), + anchor = surface.roundPixel(length / 2); + + if (title) { + switch (position) { + case 'top': + title.setAttributes({ + x: anchor, + y: titleMargin / 2, + textBaseline: 'top', + textAlign: 'center' + }, true, true); + title.applyTransformations(); + me.titleOffset = title.getBBox().height + titleMargin; + break; + case 'bottom': + title.setAttributes({ + x: anchor, + y: thickness + titleMargin / 2, + textBaseline: 'top', + textAlign: 'center' + }, true, true); + title.applyTransformations(); + me.titleOffset = title.getBBox().height + titleMargin; + break; + case 'left': + title.setAttributes({ + x: titleMargin / 2, + y: anchor, + textBaseline: 'top', + textAlign: 'center', + rotationCenterX: titleMargin / 2, + rotationCenterY: anchor, + rotationRads: -Math.PI / 2 + }, true, true); + title.applyTransformations(); + me.titleOffset = title.getBBox().width + titleMargin; + break; + case 'right': + title.setAttributes({ + x: thickness + titleMargin / 2, + y: anchor, + textBaseline: 'bottom', + textAlign: 'center', + rotationCenterX: thickness + titleMargin / 2, + rotationCenterY: anchor, + rotationRads: Math.PI / 2 + }, true, true); + title.applyTransformations(); + me.titleOffset = title.getBBox().width + titleMargin; + break; + } + } + }, + + onThicknessChanged: function () { + var me = this; + me.getChart().onThicknessChanged(); + }, + + getThickness: function () { + if (this.getHidden()) { + return 0; + } + return (this.sprites[0] && this.sprites[0].thickness || 1) + this.titleOffset; + }, + + onAnimationStart: function () { + this.animating++; + if (this.animating === 1) { + this.fireEvent("animationstart"); + } + }, + + onAnimationEnd: function () { + this.animating--; + if (this.animating === 0) { + this.fireEvent("animationend"); + } + }, + + // Methods used in ComponentQuery and controller + getItemId: function () { + return this.getId(); + }, + + getAncestorIds: function () { + return [this.getChart().getId()]; + }, + + isXType: function (xtype) { + return xtype === 'axis'; + }, + + destroy: function () { + Ext.ComponentManager.unregister(this); + this.callSuper(); + } +}); + + /** * @private */ @@ -55789,6 +69668,154 @@ Ext.define('Ext.dataview.DataView', { } }); +/** + * @class Ext.chart.Legend + * @extends Ext.dataview.DataView + * + * A default legend for charts. + * + * @example preview + * var chart = new Ext.chart.Chart({ + * animate: true, + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':'metric one', 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':'metric two', 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':'metric three', 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':'metric four', 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':'metric five', 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * legend: { + * position: 'bottom' + * }, + * axes: [{ + * type: 'numeric', + * position: 'left', + * fields: ['data1'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * grid: true, + * minimum: 0 + * }, { + * type: 'category', + * position: 'bottom', + * fields: ['name'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * } + * }], + * series: [{ + * type: 'area', + * title: ['Data1', 'Data2', 'Data3'], + * subStyle: { + * fill: ['blue', 'green', 'red'] + * }, + * xField: 'name', + * yField: ['data1', 'data2', 'data3'] + * + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + */ +Ext.define("Ext.chart.Legend", { + xtype: 'legend', + extend: Ext.dataview.DataView , + config: { + itemTpl: [ + "{name}" + ], + baseCls: 'x-legend', + padding: 5, + disableSelection: true, + inline: true, + /** + * @cfg {String} position + * @deprecated Use `docked` instead. + * Delegates to `docked` + */ + position: null, + /** + * @cfg {Boolean} toggleable 'true' if the series items in the legend can be toggled on and off. + */ + toggleable: true, + docked: 'top', + horizontalHeight: 48, + verticalWidth: 150 + }, + + constructor: function () { + this.callSuper(arguments); + + var scroller = this.getScrollable().getScroller(), + onDrag = scroller.onDrag; + scroller.onDrag = function (e) { + e.stopPropagation(); + onDrag.call(this, e); + }; + }, + + doSetDocked: function (docked) { + this.callSuper(arguments); + if (docked === 'top' || docked === 'bottom') { + this.setLayout({type: 'hbox', pack: 'center'}); + this.setInline(true); + // TODO: Remove this when possible + this.setWidth(null); + this.setHeight(this.getHorizontalHeight()); + if (this.getScrollable()) { + this.setScrollable({direction: 'horizontal'}); + } + } else { + this.setLayout({pack: 'center'}); + this.setInline(false); + // TODO: Remove this when possible + this.setWidth(this.getVerticalWidth()); + this.setHeight(null); + if (this.getScrollable()) { + this.setScrollable({direction: 'vertical'}); + } + } + }, + + setScrollable: function (scrollable) { + this.callSuper(arguments); + if (scrollable === true) { + if (this.getDocked() === 'top' || this.getDocked() === 'bottom') { + this.setScrollable({direction: 'horizontal'}); + } else if (this.getDocked() === 'left' || this.getDocked() === 'right') { + this.setScrollable({direction: 'vertical'}); + } + } + }, + + + setPosition: function (position) { + this.setDocked(position); + }, + + getPosition: function () { + return this.getDocked(); + }, + + onItemTap: function (container, target, index, e) { + this.callSuper(arguments); + if(this.getToggleable()) { + var me = this, + store = me.getStore(), + record = store && store.getAt(index); + record.beginEdit(); + record.set('disabled', !record.get('disabled')); + record.commit(); + } + } +}); + /** * @class Ext.data.SortTypes * This class defines a series of static methods that are used on a @@ -64102,6 +78129,3405 @@ Ext.define('Ext.data.Store', { }); +/** + * Exports an SVG document to an image. To do this, + * the SVG string must be sent to a remote server and processed. + * + * # Sending the data + * + * A post request is made to the URL. The following fields are sent: + * + * + width: The width of the image + * + height: The height of the image + * + type: The image type to save as, see {@link #supportedTypes} + * + svg: The svg string for the surface + * + * # The response + * + * It is expected that the user will be prompted with an image download. + * As such, the following options should be set on the server: + * + * + Content-Disposition: 'attachment, filename="chart.png"' + * + Content-Type: 'image/png' + * + * **Important**: By default, chart data is sent to a server operated + * by Sencha to do data processing. You may change this default by + * setting the {@link #defaultUrl} of this class. + * In addition, please note that this service only creates PNG images. + */ +// TODO: can't use the canvas element to convert SVG to bitmap on the client, see: +// TODO: http://stackoverflow.com/questions/18586808/canvas-todatauri-on-chrome-security-issue +Ext.define('Ext.draw.engine.SvgExporter', { + singleton: true, + + /** + * @property {String} [defaultUrl="http://svg.sencha.io"] + * The default URL to submit the form request. + */ + defaultUrl: 'http://svg.sencha.io', + + /** + * @property {Array} [supportedTypes=["image/png", "image/jpeg"]] + * A list of export types supported by the server + */ + supportedTypes: ['image/png', 'image/jpeg'], + + /** + * @property {String} [widthParam="width"] + * The name of the width parameter to be sent to the server. + * The Sencha IO server expects it to be the default value. + */ + widthParam: 'width', + + /** + * @property {String} [heightParam="height"] + * The name of the height parameter to be sent to the server. + * The Sencha IO server expects it to be the default value. + */ + heightParam: 'height', + + /** + * @property {String} [typeParam="type"] + * The name of the type parameter to be sent to the server. + * The Sencha IO server expects it to be the default value. + */ + typeParam: 'type', + + /** + * @property {String} [svgParam="svg"] + * The name of the svg parameter to be sent to the server. + * The Sencha IO server expects it to be the default value. + */ + svgParam: 'svg', + + formCls: Ext.baseCSSPrefix + 'hide-display', + + /** + * Exports the surface to an image + * @param {String} svg The SVG document. + * @param {Object} [config] The following config options are supported: + * + * @param {Number} config.width A width to send to the server to for + * configuring the image width (required) + * + * @param {Number} config.height A height to send to the server for + * configuring the image height (required) + * + * @param {String} config.url The url to post the data to. Defaults to + * the {@link #defaultUrl} configuration on the class. + * + * @param {String} config.type The type of image to export. See the + * {@link #supportedTypes} + * + * @param {String} config.widthParam The name of the width parameter to send + * to the server. Defaults to {@link #widthParam} + * + * @param {String} config.heightParam The name of the height parameter to send + * to the server. Defaults to {@link #heightParam} + * + * @param {String} config.typeParam The name of the type parameter to send + * to the server. Defaults to {@link #typeParam} + * + * @param {String} config.svgParam The name of the svg parameter to send + * to the server. Defaults to {@link #svgParam} + * + * @return {Boolean} True if the surface was successfully sent to the server. + */ + generate: function(svg, config) { + config = config || {}; + var me = this, + type = config.type, + form; + + if (Ext.Array.indexOf(me.supportedTypes, type) === -1) { + return false; + } + + form = Ext.getBody().createChild({ + tag: 'form', + method: 'POST', + action: config.url || me.defaultUrl, + cls: me.formCls, + children: [{ + tag: 'input', + type: 'hidden', + name: config.widthParam || me.widthParam, + value: config.width + }, { + tag: 'input', + type: 'hidden', + name: config.heightParam || me.heightParam, + value: config.height + }, { + tag: 'input', + type: 'hidden', + name: config.typeParam || me.typeParam, + value: type + }, { + tag: 'input', + type: 'hidden', + name: config.svgParam || me.svgParam + }] + }); + + // Assign the data on the value so it doesn't get messed up in the html insertion + form.last(null, true).value = svg; + + form.dom.submit(); + form.remove(); + return true; + } + +}); + +/** + * The Ext.chart package provides the capability to visualize data. + * Each chart binds directly to an {@link Ext.data.Store} enabling automatic updates of the chart. + * A chart configuration object has some overall styling options as well as an array of axes + * and series. A chart instance example could look like: + * + * new Ext.chart.CartesianChart({ + * width: 800, + * height: 600, + * animate: true, + * store: store1, + * legend: { + * position: 'right' + * }, + * axes: [ + * // ...some axes options... + * ], + * series: [ + * // ...some series options... + * ] + * }); + * + * In this example we set the `width` and `height` of a cartesian chart; We decide whether our series are + * animated or not and we select a store to be bound to the chart; We also set the legend to the right part of the + * chart. + * + * You can register certain interactions such as {@link Ext.chart.interactions.PanZoom} on the chart by specify an + * array of names or more specific config objects. All the events will be wired automatically. + * + * You can also listen to `itemXXX` events directly on charts. That case all the contained series will relay this event to the + * chart. + * + * For more information about the axes and series configurations please check the documentation of + * each series (Line, Bar, Pie, etc). + * + */ + +Ext.define('Ext.chart.AbstractChart', { + + extend: Ext.draw.Component , + + + + + + + + + + + /** + * @event beforerefresh + * Fires before a refresh to the chart data is called. If the `beforerefresh` handler returns + * `false` the {@link #refresh} action will be canceled. + * @param {Ext.chart.AbstractChart} this + */ + + /** + * @event refresh + * Fires after the chart data has been refreshed. + * @param {Ext.chart.AbstractChart} this + */ + + /** + * @event redraw + * Fires after the chart is redrawn. + * @param {Ext.chart.AbstractChart} this + */ + + /** + * @event itemmousemove + * Fires when the mouse is moved on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemmouseup + * Fires when a mouseup event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemmousedown + * Fires when a mousedown event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemmouseover + * Fires when the mouse enters a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemmouseout + * Fires when the mouse exits a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemclick + * Fires when a click event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemdoubleclick + * Fires when a doubleclick event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemtap + * Fires when a tap event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemtapstart + * Fires when a tapstart event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemtapend + * Fires when a tapend event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemtapcancel + * Fires when a tapcancel event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemtaphold + * Fires when a taphold event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemdoubletap + * Fires when a doubletap event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemsingletap + * Fires when a singletap event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemtouchstart + * Fires when a touchstart event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemtouchmove + * Fires when a touchmove event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemtouchend + * Fires when a touchend event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemdragstart + * Fires when a dragstart event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemdrag + * Fires when a drag event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemdragend + * Fires when a dragend event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itempinchstart + * Fires when a pinchstart event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itempinch + * Fires when a pinch event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itempinchend + * Fires when a pinchend event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemswipe + * Fires when a swipe event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + + /** + * @property version Current Version of Touch Charts + * @type {String} + */ + version: '2.0.0', + + // @ignore + viewBox: false, + + delegationRegex: /^item([a-z]+)$/i, + + domEvents: /click|focus|blur|paste|input|mousemove|mousedown|mouseup|mouseover|mouseout|keyup|keydown|keypress|submit|pinch|pinchstart|pinchend|touchstart|touchend|rotate|rotatestart|rotateend|drag|dragstart|dragend|tap|doubletap|singletap/, + + config: { + + /** + * @cfg {Ext.data.Store} store + * The store that supplies data to this chart. + */ + store: null, + + /** + * @cfg {Boolean/Object} shadow (optional) `true` for the default shadow configuration `{shadowOffsetX: 2, shadowOffsetY: 2, shadowBlur: 3, shadowColor: '#444'}` + * or a standard shadow config object to be used for default chart shadows. + */ + shadow: false, + + /** + * @cfg {Boolean/Object} animate (optional) `true` for the default animation (easing: 'ease' and duration: 500) + * or a standard animation config object to be used for default chart animations. + */ + animate: true, + + /** + * @cfg {Ext.chart.series.Series/Array} series + * Array of {@link Ext.chart.series.Series Series} instances or config objects. For example: + * + * series: [{ + * type: 'column', + * axis: 'left', + * listeners: { + * 'afterrender': function() { + * console.log('afterrender'); + * } + * }, + * xField: 'category', + * yField: 'data1' + * }] + */ + series: [], + + /** + * @cfg {Ext.chart.axis.Axis/Array/Object} axes + * Array of {@link Ext.chart.axis.Axis Axis} instances or config objects. For example: + * + * axes: [{ + * type: 'numeric', + * position: 'left', + * title: 'Number of Hits', + * minimum: 0 + * }, { + * type: 'category', + * position: 'bottom', + * title: 'Month of the Year' + * }] + */ + axes: [], + + /** + * @cfg {Ext.chart.Legend/Object} legend + */ + legend: null, + + /** + * @cfg {Boolean/Array} colors Array of colors/gradients to override the color of items and legends. + */ + colors: null, + + /** + * @cfg {Object|Number} insetPadding The amount of inset padding in pixels for the chart. Inset padding is + * the padding from the boundary of the chart to any of its contents. + * @cfg {Number} insetPadding.top + */ + insetPadding: { + top: 10, + left: 10, + right: 10, + bottom: 10 + }, + + /** + * @cfg {Object} innerPadding The amount of inner padding in pixel. Inner padding is the padding from + * axis to the series. + */ + innerPadding: { + top: 0, + left: 0, + right: 0, + bottom: 0 + }, + + /** + * @cfg {Object} background Set the chart background. This can be a gradient object, image, or color. + * + * For example, if `background` were to be a color we could set the object as + * + * background: { + * //color string + * fill: '#ccc' + * } + * + * You can specify an image by using: + * + * background: { + * image: 'http://path.to.image/' + * } + * + * Also you can specify a gradient by using the gradient object syntax: + * + * background: { + * gradient: { + * type: 'linear', + * angle: 45, + * stops: { + * 0: { + * color: '#555' + * }, + * 100: { + * color: '#ddd' + * } + * } + * } + * } + */ + background: null, + + /** + * @cfg {Array} interactions + * Interactions are optional modules that can be plugged in to a chart to allow the user to interact + * with the chart and its data in special ways. The `interactions` config takes an Array of Object + * configurations, each one corresponding to a particular interaction class identified by a `type` property: + * + * new Ext.chart.AbstractChart({ + * renderTo: Ext.getBody(), + * width: 800, + * height: 600, + * store: store1, + * axes: [ + * // ...some axes options... + * ], + * series: [ + * // ...some series options... + * ], + * interactions: [{ + * type: 'interactiontype' + * // ...additional configs for the interaction... + * }] + * }); + * + * When adding an interaction which uses only its default configuration (no extra properties other than `type`), + * you can alternately specify only the type as a String rather than the full Object: + * + * interactions: ['reset', 'rotate'] + * + * The current supported interaction types include: + * + * - {@link Ext.chart.interactions.PanZoom panzoom} - allows pan and zoom of axes + * - {@link Ext.chart.interactions.ItemHighlight itemhighlight} - allows highlighting of series data points + * - {@link Ext.chart.interactions.ItemInfo iteminfo} - allows displaying details of a data point in a popup panel + * - {@link Ext.chart.interactions.Rotate rotate} - allows rotation of pie and radar series + * + * See the documentation for each of those interaction classes to see how they can be configured. + * + * Additional custom interactions can be registered using `'interactions.'` alias prefix. + */ + interactions: [], + + /** + * @private + * The main region of the chart. + */ + mainRegion: null, + + /** + * @private + * Override value + */ + autoSize: false, + + /** + * @private + * Override value + */ + viewBox: false, + + /** + * @private + * Override value + */ + fitSurface: false, + + /** + * @private + * Override value + */ + resizeHandler: null, + + /** + * @readonly + * @cfg {Object} highlightItem + * The current highlight item in the chart. + * The object must be the one that you get from item events. + * + * Note that series can also own highlight items. + * This notion is separate from this one and should not be used at the same time. + */ + highlightItem: null + }, + + /** + * @private + */ + resizing: 0, + + /** + * Toggle for chart interactions that require animation to be suspended. + * @private + */ + animationSuspended: 0, + + /** + * @private The z-indexes to use for the various surfaces + */ + surfaceZIndexes: { + main: 0, + grid: 1, + series: 2, + axis: 3, + overlay: 4, + events: 5 + }, + + animating: 0, + + layoutSuspended: 0, + + applyAnimate: function (newAnimate, oldAnimate) { + if (!newAnimate) { + newAnimate = { + duration: 0 + }; + } else if (newAnimate === true) { + newAnimate = { + easing: 'easeInOut', + duration: 500 + }; + } + if (!oldAnimate) { + return newAnimate; + } else { + oldAnimate = Ext.apply({}, newAnimate, oldAnimate); + } + return oldAnimate; + }, + + applyInsetPadding: function (padding, oldPadding) { + if (Ext.isNumber(padding)) { + return { + top: padding, + left: padding, + right: padding, + bottom: padding + }; + } else if (!oldPadding) { + return padding; + } else { + return Ext.apply(oldPadding, padding); + } + }, + + applyInnerPadding: function (padding, oldPadding) { + if (Ext.isNumber(padding)) { + return { + top: padding, + left: padding, + right: padding, + bottom: padding + }; + } else if (!oldPadding) { + return padding; + } else { + return Ext.apply(oldPadding, padding); + } + }, + + suspendAnimation: function () { + this.animationSuspended++; + if (this.animationSuspended === 1) { + var series = this.getSeries(), i = -1, n = series.length; + while (++i < n) { + //update animation config to not animate + series[i].setAnimate(this.getAnimate()); + } + } + }, + + resumeAnimation: function () { + this.animationSuspended--; + if (this.animationSuspended === 0) { + var series = this.getSeries(), i = -1, n = series.length; + while (++i < n) { + //update animation config to animate + series[i].setAnimate(this.getAnimate()); + } + } + }, + + suspendLayout: function () { + this.layoutSuspended++; + if (this.layoutSuspended === 1) { + if (this.scheduledLayoutId) { + this.layoutInSuspension = true; + this.cancelLayout(); + } else { + this.layoutInSuspension = false; + } + } + }, + + resumeLayout: function () { + this.layoutSuspended--; + if (this.layoutSuspended === 0) { + if (this.layoutInSuspension) { + this.scheduleLayout(); + } + } + }, + + /** + * Cancel a scheduled layout. + */ + cancelLayout: function () { + if (this.scheduledLayoutId) { + Ext.draw.Animator.cancel(this.scheduledLayoutId); + this.scheduledLayoutId = null; + } + }, + + /** + * Schedule a layout at next frame. + */ + scheduleLayout: function () { + if (!this.scheduledLayoutId) { + this.scheduledLayoutId = Ext.draw.Animator.schedule('doScheduleLayout', this); + } + }, + + doScheduleLayout: function () { + if (this.layoutSuspended) { + this.layoutInSuspension = true; + } else { + this.performLayout(); + } + }, + + getAnimate: function () { + if (this.resizing || this.animationSuspended) { + return { + duration: 0 + }; + } else { + return this._animate; + } + }, + + constructor: function () { + var me = this; + me.itemListeners = {}; + me.surfaceMap = {}; + me.legendStore = new Ext.data.Store({ + storeId: this.getId() + '-legendStore', + autoDestroy: true, + fields: [ + 'id', 'name', 'mark', 'disabled', 'series', 'index' + ] + }); + me.suspendLayout(); + me.callSuper(arguments); + me.refreshLegendStore(); + me.getLegendStore().on('updaterecord', 'onUpdateLegendStore', me); + me.resumeLayout(); + }, + + /** + * Return the legend store that contains all the legend information. These + * information are collected from all the series. + * @return {Ext.data.Store} + */ + getLegendStore: function () { + return this.legendStore; + }, + + refreshLegendStore: function () { + if (this.getLegendStore()) { + var i, ln, + series = this.getSeries(), seriesItem, + legendData = []; + if (series) { + for (i = 0, ln = series.length; i < ln; i++) { + seriesItem = series[i]; + if (seriesItem.getShowInLegend()) { + seriesItem.provideLegendInfo(legendData); + } + } + } + this.getLegendStore().setData(legendData); + } + }, + + resetLegendStore: function () { + if (this.getLegendStore()) { + var data = this.getLegendStore().getData().items, + i, ln = data.length, + record; + for (i = 0; i < ln; i++) { + record = data[i]; + record.beginEdit(); + record.set('disabled', false); + record.commit(); + } + } + }, + + onUpdateLegendStore: function (store, record) { + var series = this.getSeries(), seriesItem; + if (record && series) { + seriesItem = series.map[record.get('series')]; + if (seriesItem) { + seriesItem.setHiddenByIndex(record.get('index'), record.get('disabled')); + this.redraw(); + } + } + }, + + initialize: function () { + var me = this; + me.callSuper(); + me.getSurface('main'); + me.getSurface('overlay-surface', 'overlay').waitFor(me.getSurface('series-surface', 'series')); + }, + + resizeHandler: function (size) { + var me = this; + me.scheduleLayout(); + return false; + }, + + applyMainRegion: function (newRegion, region) { + if (!region) { + return newRegion; + } + this.getSeries(); + this.getAxes(); + if (newRegion[0] === region[0] && + newRegion[1] === region[1] && + newRegion[2] === region[2] && + newRegion[3] === region[3]) { + return region; + } else { + return newRegion; + } + }, + + getSurface: function (name, type) { + name = name || 'main'; + type = type || name; + var me = this, + surface = this.callSuper([name]), + zIndexes = me.surfaceZIndexes; + if (type in zIndexes) { + surface.element.setStyle('zIndex', zIndexes[type]); + } + if (!me.surfaceMap[type]) { + me.surfaceMap[type] = []; + } + surface.type = type; + me.surfaceMap[type].push(surface); + return surface; + }, + + updateColors: function (colors) { + var series = this.getSeries(), + seriesCount = series && series.length, + seriesItem; + for (var i = 0; i < seriesCount; i++) { + seriesItem = series[i]; + if (!seriesItem.getColors()) { + seriesItem.updateColors(colors); + } + } + }, + + applyAxes: function (newAxes, oldAxes) { + this.resizing++; + try { + if (!oldAxes) { + oldAxes = []; + oldAxes.map = {}; + } + var result = [], i, ln, axis, oldAxis, oldMap = oldAxes.map; + result.map = {}; + newAxes = Ext.Array.from(newAxes, true); + for (i = 0, ln = newAxes.length; i < ln; i++) { + axis = newAxes[i]; + if (!axis) { + continue; + } + axis = Ext.factory(axis, null, oldAxis = oldMap[axis.getId && axis.getId() || axis.id], 'axis'); + if (axis) { + axis.setChart(this); + result.push(axis); + result.map[axis.getId()] = axis; + if (!oldAxis) { + axis.on('animationstart', 'onAnimationStart', this); + axis.on('animationend', 'onAnimationEnd', this); + } + } + } + + for (i in oldMap) { + if (!result.map[i]) { + oldMap[i].destroy(); + } + } + return result; + } finally { + this.resizing--; + } + }, + + updateAxes: function (newAxes) { + this.scheduleLayout(); + }, + + applySeries: function (newSeries, oldSeries) { + this.resizing++; + try { + this.getAxes(); + if (!oldSeries) { + oldSeries = []; + oldSeries.map = {}; + } + var me = this, + result = [], + i, ln, series, oldMap = oldSeries.map, oldSeriesItem; + result.map = {}; + newSeries = Ext.Array.from(newSeries, true); + for (i = 0, ln = newSeries.length; i < ln; i++) { + series = newSeries[i]; + if (!series) { + continue; + } + oldSeriesItem = oldSeries.map[series.getId && series.getId() || series.id]; + if (series instanceof Ext.chart.series.Series) { + if (oldSeriesItem !== series) { + // Replacing + if (oldSeriesItem) { + oldSeriesItem.destroy(); + } + me.addItemListenersToSeries(series); + } + series.setChart(this); + } else if (Ext.isObject(series)) { + if (oldSeriesItem) { + // Update + oldSeriesItem.setConfig(series); + series = oldSeriesItem; + } else { + // Create a series. + if (Ext.isString(series)) { + series = Ext.create(series.xclass || ("series." + series), {chart: this}); + } else { + series.chart = this; + series = Ext.create(series.xclass || ("series." + series.type), series); + } + series.on('animationstart', 'onAnimationStart', this); + series.on('animationend', 'onAnimationEnd', this); + me.addItemListenersToSeries(series); + } + } + + result.push(series); + result.map[series.getId()] = series; + } + + for (i in oldMap) { + if (!result.map[oldMap[i].getId()]) { + oldMap[i].destroy(); + } + } + return result; + } finally { + this.resizing--; + } + }, + + applyLegend: function (newLegend, oldLegend) { + return Ext.factory(newLegend, Ext.chart.Legend, oldLegend); + }, + + updateLegend: function (legend) { + if (legend) { + // On create + legend.setStore(this.getLegendStore()); + if (!legend.getDocked()) { + legend.setDocked('bottom'); + } + if (this.getParent()) { + this.getParent().add(legend); + } + } + }, + + setParent: function (parent) { + this.callSuper(arguments); + if (parent && this.getLegend()) { + parent.add(this.getLegend()); + } + }, + + updateSeries: function (newSeries, oldSeries) { + this.resizing++; + try { + this.fireEvent('serieschanged', this, newSeries, oldSeries); + this.refreshLegendStore(); + this.scheduleLayout(); + } finally { + this.resizing--; + } + }, + + applyInteractions: function (interactions, oldInteractions) { + if (!oldInteractions) { + oldInteractions = []; + oldInteractions.map = {}; + } + var me = this, + result = [], oldMap = oldInteractions.map, + i, ln, interaction; + result.map = {}; + interactions = Ext.Array.from(interactions, true); + for (i = 0, ln = interactions.length; i < ln; i++) { + interaction = interactions[i]; + if (!interaction) { + continue; + } + interaction = Ext.factory(interaction, null, oldMap[interaction.getId && interaction.getId() || interaction.id], 'interaction'); + if (interaction) { + interaction.setChart(me); + result.push(interaction); + result.map[interaction.getId()] = interaction; + } + } + + for (i in oldMap) { + if (!result.map[oldMap[i]]) { + oldMap[i].destroy(); + } + } + return result; + }, + + applyStore: function (store) { + return Ext.StoreManager.lookup(store); + }, + + updateStore: function (newStore, oldStore) { + var me = this; + if (oldStore) { + oldStore.un('refresh', 'onRefresh', me, null, 'after'); + if (oldStore.autoDestroy) { + oldStore.destroy(); + } + } + if (newStore) { + newStore.on('refresh', 'onRefresh', me, null, 'after'); + } + + me.fireEvent('storechanged', newStore, oldStore); + me.onRefresh(); + }, + + /** + * Redraw the chart. If animations are set this will animate the chart too. + */ + redraw: function () { + this.fireEvent('redraw', this); + }, + + performLayout: function () { + this.cancelLayout(); + }, + + getEventXY: function (e) { + e = (e.changedTouches && e.changedTouches[0]) || e.event || e.browserEvent || e; + var me = this, + xy = me.element.getXY(), + region = me.getMainRegion(); + return [e.pageX - xy[0] - region[0], e.pageY - xy[1] - region[1]]; + }, + + /** + * Given an x/y point relative to the chart, find and return the first series item that + * matches that point. + * @param {Number} x + * @param {Number} y + * @return {Object} An object with `series` and `item` properties, or `false` if no item found. + */ + getItemForPoint: function (x, y) { + var me = this, + i = 0, + items = me.getSeries(), + l = items.length, + series, item; + + for (; i < l; i++) { + series = items[i]; + item = series.getItemForPoint(x, y); + if (item) { + return item; + } + } + + return null; + }, + + /** + * Given an x/y point relative to the chart, find and return all series items that match that point. + * @param {Number} x + * @param {Number} y + * @return {Array} An array of objects with `series` and `item` properties. + */ + getItemsForPoint: function (x, y) { + var me = this, + series = me.getSeries(), + seriesItem, + items = []; + + for (var i = 0; i < series.length; i++) { + seriesItem = series[i]; + var item = seriesItem.getItemForPoint(x, y); + if (item) { + items.push(item); + } + } + + return items; + }, + + /** + * @private + */ + delayThicknessChanged: 0, + + /** + * @private + */ + thicknessChanged: false, + + /** + * Suspend the layout initialized by thickness change + */ + suspendThicknessChanged: function () { + this.delayThicknessChanged++; + }, + + /** + * Resume the layout initialized by thickness change + */ + resumeThicknessChanged: function () { + this.delayThicknessChanged--; + if (this.delayThicknessChanged === 0 && this.thicknessChanged) { + this.onThicknessChanged(); + } + }, + + onAnimationStart: function () { + this.fireEvent('animationstart', this); + }, + + onAnimationEnd: function () { + this.fireEvent('animationend', this); + }, + + onThicknessChanged: function () { + if (this.delayThicknessChanged === 0) { + this.thicknessChanged = false; + this.performLayout(); + } else { + this.thicknessChanged = true; + } + }, + + /** + * @private + */ + onRefresh: function () { + var region = this.getMainRegion(), + axes = this.getAxes(), + store = this.getStore(), + series = this.getSeries(); + if (!store || !axes || !series || !region) { + return; + } + this.redraw(); + }, + + /** + * Changes the data store bound to this chart and refreshes it. + * @param {Ext.data.Store} store The store to bind to this chart. + */ + bindStore: function (store) { + this.setStore(store); + }, + + applyHighlightItem: function (newHighlightItem, oldHighlightItem) { + if (newHighlightItem === oldHighlightItem) { + return; + } + if (Ext.isObject(newHighlightItem) && Ext.isObject(oldHighlightItem)) { + if (newHighlightItem.sprite === oldHighlightItem.sprite && + newHighlightItem.index === oldHighlightItem.index + ) { + return; + } + } + return newHighlightItem; + }, + + updateHighlightItem: function (newHighlightItem, oldHighlightItem) { + if (oldHighlightItem) { + oldHighlightItem.series.setAttributesForItem(oldHighlightItem, {highlighted: false}); + } + if (newHighlightItem) { + newHighlightItem.series.setAttributesForItem(newHighlightItem, {highlighted: true}); + } + }, + + addItemListenersToSeries: function (series) { + for (var name in this.itemListeners) { + var listenerMap = this.itemListeners[name], i, ln; + for (i = 0, ln = listenerMap.length; i < ln; i++) { + series.addListener.apply(series, listenerMap[i]); + } + } + }, + + addItemListener: function (name, fn, scope, options, order) { + var listenerMap = this.itemListeners[name] || (this.itemListeners[name] = []), + series = this.getSeries(), seriesItem, + i, ln; + listenerMap.push([name, fn, scope, options, order]); + if (series) { + for (i = 0, ln = series.length; i < ln; i++) { + seriesItem = series[i]; + seriesItem.addListener(name, fn, scope, options, order); + } + } + }, + + remoteItemListener: function (name, fn, scope, options, order) { + var listenerMap = this.itemListeners[name], + series = this.getSeries(), seriesItem, + i, ln; + if (listenerMap) { + for (i = 0, ln = listenerMap.length; i < ln; i++) { + if (listenerMap[i].fn === fn) { + listenerMap.splice(i, 1); + if (series) { + for (i = 0, ln = series.length; i < ln; i++) { + seriesItem = series[i]; + seriesItem.removeListener(name, fn, scope, options, order); + } + } + break; + } + } + } + }, + + doAddListener: function (name, fn, scope, options, order) { + if (name.match(this.delegationRegex)) { + return this.addItemListener(name, fn, scope || this, options, order); + } else if (name.match(this.domEvents)) { + return this.element.doAddListener.apply(this.element, arguments); + } else { + return this.callSuper(arguments); + } + }, + + doRemoveListener: function (name, fn, scope, options, order) { + if (name.match(this.delegationRegex)) { + return this.remoteItemListener(name, fn, scope || this, options, order); + } else if (name.match(this.domEvents)) { + return this.element.doRemoveListener.apply(this.element, arguments); + } else { + return this.callSuper(arguments); + } + }, + + onItemRemove: function (item) { + this.callSuper(arguments); + if (this.surfaceMap) { + Ext.Array.remove(this.surfaceMap[item.type], item); + if (this.surfaceMap[item.type].length === 0) { + delete this.surfaceMap[item.type]; + } + } + }, + + // @private remove gently. + destroy: function () { + var me = this, + emptyArray = [], + legend = me.getLegend(), + legendStore = me.getLegendStore(); + me.surfaceMap = null; + me.setHighlightItem(null); + me.setSeries(emptyArray); + me.setAxes(emptyArray); + me.setInteractions(emptyArray); + if (legendStore) { + legendStore.destroy(); + me.legendStore = null; + } + if (legend) { + legend.destroy(); + me.setLegend(null); + } + me.setStore(null); + Ext.Viewport.un('orientationchange', me.redraw, me); + me.cancelLayout(); + this.callSuper(arguments); + }, + + /* --------------------------------- + Methods needed for ComponentQuery + ----------------------------------*/ + + /** + * @private + * @param {Boolean} deep + * @return {Array} + */ + getRefItems: function (deep) { + var me = this, + series = me.getSeries(), + axes = me.getAxes(), + interaction = me.getInteractions(), + ans = [], i, ln; + + for (i = 0, ln = series.length; i < ln; i++) { + ans.push(series[i]); + if (series[i].getRefItems) { + ans.push.apply(ans, series[i].getRefItems(deep)); + } + } + + for (i = 0, ln = axes.length; i < ln; i++) { + ans.push(axes[i]); + if (axes[i].getRefItems) { + ans.push.apply(ans, axes[i].getRefItems(deep)); + } + } + + for (i = 0, ln = interaction.length; i < ln; i++) { + ans.push(interaction[i]); + if (interaction[i].getRefItems) { + ans.push.apply(ans, interaction[i].getRefItems(deep)); + } + } + + return ans; + }, + + /** + * Flattens the given chart surfaces into a single image. + * Note: Surfaces whose class name is different from chart's engine will be omitted. + * @param {Array} surfaces A list of chart's surfaces to flatten. + * @param {String} format If set to 'image', the method will return an Image object. Otherwise, the dataURL + * of the flattened image will be returned. + * @returns {String|Image} An Image DOM element containing the flattened image or its dataURL. + */ + flatten: function (surfaces, format) { + var me = this, + size = me.element.getSize(), + svg, canvas, ctx, + i, surface, region, + img, dataURL; + + switch (me.engine) { + case 'Ext.draw.engine.Canvas': + canvas = document.createElement('canvas'); + canvas.width = size.width; + canvas.height = size.height; + ctx = canvas.getContext('2d'); + for (i = 0; i < surfaces.length; i++) { + surface = surfaces[i]; + if (Ext.getClassName(surface) !== me.engine) { + continue; + } + region = surface.getRegion(); + ctx.drawImage(surface.canvases[0].dom, region[0], region[1]); + } + dataURL = canvas.toDataURL(); + break; + case 'Ext.draw.engine.Svg': + svg = ''; + svg += ''; + for (i = 0; i < surfaces.length - 1; i++) { + surface = surfaces[i]; + if (Ext.getClassName(surface) !== me.engine) { + continue; + } + region = surface.getRegion(); + svg += ''; + svg += Ext.dom.Element.serializeNode(surface.svgElement.dom); + svg += ''; + } + svg += ''; + dataURL = 'data:image/svg+xml;utf8,' + svg; + break; + } + if (format === 'image') { + img = new Image(); + img.src = dataURL; + return img; + } + if (format === 'stream') { + return dataURL.replace(/^data:image\/[^;]+/, 'data:application/octet-stream'); + } + return dataURL; + }, + + save: function (download) { + if (download) { + // TODO: no control over filename, we are at the browser's mercy + // TODO: unfortunatelly, a.download attribute remains a novelty on mobile: http://caniuse.com/#feat=download + window.open(this.flatten(this.items.items, 'stream')); + } else { + Ext.Viewport.add({ + xtype: 'panel', + layout: 'fit', + modal: true, + width: '90%', + height: '90%', + hideOnMaskTap: true, + centered: true, + scrollable: false, + items: { + xtype: 'image', + mode: 'img', + src: this.flatten(this.items.items) + }, + listeners: { + hide: function () { + Ext.Viewport.remove(this); + } + } + }).show(); + } + } +}); + +/** + * @class Ext.chart.grid.HorizontalGrid + * @extends Ext.draw.sprite.Sprite + * + * Horizontal Grid sprite. Used in Cartesian Charts. + */ +Ext.define("Ext.chart.grid.HorizontalGrid", { + extend: Ext.draw.sprite.Sprite , + alias: 'grid.horizontal', + + inheritableStatics: { + def: { + processors: { + x: 'number', + y: 'number', + width: 'number', + height: 'number' + }, + + defaults: { + x: 0, + y: 0, + width: 1, + height: 1, + strokeStyle: '#DDD' + } + } + }, + + render: function (surface, ctx, clipRegion) { + var attr = this.attr, + y = surface.roundPixel(attr.y), + halfLineWidth = ctx.lineWidth * 0.5; + ctx.beginPath(); + ctx.rect(clipRegion[0] - surface.matrix.getDX(), y + halfLineWidth, +clipRegion[2], attr.height); + ctx.fill(); + + ctx.beginPath(); + ctx.moveTo(clipRegion[0] - surface.matrix.getDX(), y + halfLineWidth); + ctx.lineTo(clipRegion[0] + clipRegion[2] - surface.matrix.getDX(), y + halfLineWidth); + ctx.stroke(); + } +}); + +/** + * @class Ext.chart.grid.VerticalGrid + * @extends Ext.draw.sprite.Sprite + * + * Vertical Grid sprite. Used in Cartesian Charts. + */ +Ext.define("Ext.chart.grid.VerticalGrid", { + extend: Ext.draw.sprite.Sprite , + alias: 'grid.vertical', + + inheritableStatics: { + def: { + processors: { + x: 'number', + y: 'number', + width: 'number', + height: 'number' + }, + + defaults: { + x: 0, + y: 0, + width: 1, + height: 1, + strokeStyle: '#DDD' + } + } + }, + + render: function (surface, ctx, clipRegion) { + var attr = this.attr, + x = surface.roundPixel(attr.x), + halfLineWidth = ctx.lineWidth * 0.5; + ctx.beginPath(); + ctx.rect(x - halfLineWidth, clipRegion[1] - surface.matrix.getDY(), attr.width, clipRegion[3]); + ctx.fill(); + + ctx.beginPath(); + ctx.moveTo(x - halfLineWidth, clipRegion[1] - surface.matrix.getDY()); + ctx.lineTo(x - halfLineWidth, clipRegion[1] + clipRegion[3] - surface.matrix.getDY()); + ctx.stroke(); + } +}); + +/** + * @class Ext.chart.CartesianChart + * @extends Ext.chart.AbstractChart + * + * Represents a chart that uses cartesian coordinates. + * A cartesian chart have two directions, X direction and Y direction. + * The series and axes are coordinated along these directions. + * By default the x direction is horizontal and y direction is vertical, + * You can swap the by setting {@link #flipXY} config to `true`. + * + * Cartesian series often treats x direction an y direction differently. + * In most cases, data on x direction are assumed to be monotonically increasing. + * Based on this property, cartesian series can be trimmed and summarized properly + * to gain a better performance. + * + * @xtype chart + */ + +Ext.define('Ext.chart.CartesianChart', { + extend: Ext.chart.AbstractChart , + alternateClassName: 'Ext.chart.Chart', + + config: { + /** + * @cfg {Boolean} flipXY Flip the direction of X and Y axis. + * If flipXY is true, the X axes will be vertical and Y axes will be horizontal. + */ + flipXY: false, + + innerRegion: [0, 0, 1, 1] + }, + xtype: 'chart', + alias: 'Ext.chart.Chart', + + getDirectionForAxis: function (position) { + var flipXY = this.getFlipXY(); + if (position === 'left' || position === 'right') { + if (flipXY) { + return 'X'; + } else { + return 'Y'; + } + } else { + if (flipXY) { + return 'Y'; + } else { + return 'X'; + } + } + }, + + /** + * Layout the axes and series. + */ + performLayout: function () { + try { + this.resizing++; + this.callSuper(); + this.suspendThicknessChanged(); + var me = this, + axes = me.getAxes(), axis, + seriesList = me.getSeries(), series, + axisSurface, thickness, + size = me.element.getSize(), + width = size.width, + height = size.height, + insetPadding = me.getInsetPadding(), + innerPadding = me.getInnerPadding(), + surface, + shrinkBox = { + top: insetPadding.top, + left: insetPadding.left, + right: insetPadding.right, + bottom: insetPadding.bottom + }, + gridSurface, + mainRegion, innerWidth, innerHeight, + elements, floating, matrix, i, ln, + flipXY = me.getFlipXY(); + + if (width <= 0 || height <= 0) { + return; + } + + for (i = 0; i < axes.length; i++) { + axis = axes[i]; + axisSurface = axis.getSurface(); + floating = axis.getStyle && axis.getStyle() && axis.getStyle().floating; + thickness = axis.getThickness(); + switch (axis.getPosition()) { + case 'top': + axisSurface.setRegion([0, shrinkBox.top, width, thickness]); + break; + case 'bottom': + axisSurface.setRegion([0, height - (shrinkBox.bottom + thickness), width, thickness]); + break; + case 'left': + axisSurface.setRegion([shrinkBox.left, 0, thickness, height]); + break; + case 'right': + axisSurface.setRegion([width - (shrinkBox.right + thickness), 0, thickness, height]); + break; + } + if (!floating) { + shrinkBox[axis.getPosition()] += thickness; + } + } + + width -= shrinkBox.left + shrinkBox.right; + height -= shrinkBox.top + shrinkBox.bottom; + + mainRegion = [shrinkBox.left, shrinkBox.top, width, height]; + + shrinkBox.left += innerPadding.left; + shrinkBox.top += innerPadding.top; + shrinkBox.right += innerPadding.right; + shrinkBox.bottom += innerPadding.bottom; + + innerWidth = width - innerPadding.left - innerPadding.right; + innerHeight = height - innerPadding.top - innerPadding.bottom; + + me.setInnerRegion([shrinkBox.left, shrinkBox.top, innerWidth, innerHeight]); + + if (innerWidth <= 0 || innerHeight <= 0) { + return; + } + + me.setMainRegion(mainRegion); + me.getSurface('main').setRegion(mainRegion); + + for (i = 0, ln = me.surfaceMap.grid && me.surfaceMap.grid.length; i < ln; i++) { + gridSurface = me.surfaceMap.grid[i]; + gridSurface.setRegion(mainRegion); + gridSurface.matrix.set(1, 0, 0, 1, innerPadding.left, innerPadding.top); + gridSurface.matrix.inverse(gridSurface.inverseMatrix); + } + + for (i = 0; i < axes.length; i++) { + axis = axes[i]; + axisSurface = axis.getSurface(); + matrix = axisSurface.matrix; + elements = matrix.elements; + switch (axis.getPosition()) { + case 'top': + case 'bottom': + elements[4] = shrinkBox.left; + axis.setLength(innerWidth); + break; + case 'left': + case 'right': + elements[5] = shrinkBox.top; + axis.setLength(innerHeight); + break; + } + axis.updateTitleSprite(); + matrix.inverse(axisSurface.inverseMatrix); + } + + for (i = 0, ln = seriesList.length; i < ln; i++) { + series = seriesList[i]; + surface = series.getSurface(); + surface.setRegion(mainRegion); + if (flipXY) { + surface.matrix.set(0, -1, 1, 0, innerPadding.left, innerHeight + innerPadding.top); + } else { + surface.matrix.set(1, 0, 0, -1, innerPadding.left, innerHeight + innerPadding.top); + } + surface.matrix.inverse(surface.inverseMatrix); + series.getOverlaySurface().setRegion(mainRegion); + } + me.redraw(); + me.onPlaceWatermark(); + } finally { + this.resizing--; + this.resumeThicknessChanged(); + } + }, + + redraw: function () { + var me = this, + series = me.getSeries(), + axes = me.getAxes(), + region = me.getMainRegion(), + innerWidth, innerHeight, + innerPadding = me.getInnerPadding(), + left, right, top, bottom, i, j, + sprites, xRange, yRange, isSide, attr, + axisX, axisY, range, visibleRange, + flipXY = me.getFlipXY(), + sprite, zIndex, zBase = 1000, + markers, markerCount, markerIndex, markerSprite, markerZIndex; + + if (!region) { + return; + } + + innerWidth = region[2] - innerPadding.left - innerPadding.right; + innerHeight = region[3] - innerPadding.top - innerPadding.bottom; + for (i = 0; i < series.length; i++) { + if ((axisX = series[i].getXAxis())) { + visibleRange = axisX.getVisibleRange(); + xRange = axisX.getRange(); + xRange = [xRange[0] + (xRange[1] - xRange[0]) * visibleRange[0], xRange[0] + (xRange[1] - xRange[0]) * visibleRange[1]]; + } else { + xRange = series[i].getXRange(); + } + + if ((axisY = series[i].getYAxis())) { + visibleRange = axisY.getVisibleRange(); + yRange = axisY.getRange(); + yRange = [yRange[0] + (yRange[1] - yRange[0]) * visibleRange[0], yRange[0] + (yRange[1] - yRange[0]) * visibleRange[1]]; + } else { + yRange = series[i].getYRange(); + } + + left = xRange[0]; + right = xRange[1]; + top = yRange[0]; + bottom = yRange[1]; + + attr = { + visibleMinX: xRange[0], + visibleMaxX: xRange[1], + visibleMinY: yRange[0], + visibleMaxY: yRange[1], + innerWidth: innerWidth, + innerHeight: innerHeight, + flipXY: flipXY + }; + + sprites = series[i].getSprites(); + for (j = 0; j < sprites.length; j++) { + + // All the series now share the same surface, so we must assign + // the sprites a zIndex that depends on the index of their series. + sprite = sprites[j]; + zIndex = (sprite.attr.zIndex || 0); + if (zIndex < zBase) { + // Set the sprite's zIndex + zIndex += (i+1) * 100 + zBase; + sprite.attr.zIndex = zIndex; + // Iterate through its marker sprites to do the same. + markers = sprite.boundMarkers; + if (markers) { + markerCount = (markers.items ? markers.items.length : 0); + if (markerCount) { + for (markerIndex = 0; markerIndex < markerCount; markerIndex++) { + markerSprite = markers.items[markerIndex]; + markerZIndex = (markerSprite.attr.zIndex || 0); + if (markerZIndex == Number.MAX_VALUE) { + markerSprite.attr.zIndex = zIndex; + } else { + if (markerZIndex < zBase) { + markerSprite.attr.zIndex = zIndex + markerZIndex; + } + } + } + } + } + } + + sprite.setAttributes(attr, true); + } + } + + for (i = 0; i < axes.length; i++) { + isSide = axes[i].isSide(); + sprites = axes[i].getSprites(); + range = axes[i].getRange(); + visibleRange = axes[i].getVisibleRange(); + attr = { + dataMin: range[0], + dataMax: range[1], + visibleMin: visibleRange[0], + visibleMax: visibleRange[1] + }; + if (isSide) { + attr.length = innerHeight; + attr.startGap = innerPadding.bottom; + attr.endGap = innerPadding.top; + } else { + attr.length = innerWidth; + attr.startGap = innerPadding.left; + attr.endGap = innerPadding.right; + } + for (j = 0; j < sprites.length; j++) { + sprites[j].setAttributes(attr, true); + } + } + me.renderFrame(); + me.callSuper(arguments); + }, + + onPlaceWatermark: function () { + var region0 = this.element.getBox(), + region = this.getSurface ? this.getSurface('main').getRegion() : this.getItems().get(0).getRegion(); + if (region) { + this.watermarkElement.setStyle({ + right: Math.round(region0.width - (region[2] + region[0])) + 'px', + bottom: Math.round(region0.height - (region[3] + region[1])) + 'px' + }); + } + } +}); + +/** + * @class Ext.chart.grid.CircularGrid + * @extends Ext.draw.sprite.Circle + * + * Circular Grid sprite. Used by Radar chart to render a series of concentric circles. + */ +Ext.define('Ext.chart.grid.CircularGrid', { + extend: Ext.draw.sprite.Circle , + alias: 'grid.circular', + + inheritableStatics: { + def: { + defaults: { + r: 1, + strokeStyle: '#DDD' + } + } + } +}); + +/** + * @class Ext.chart.grid.RadialGrid + * @extends Ext.draw.sprite.Path + * + * Radial Grid sprite. Used by Radar chart to render a series of radial lines. + * Represents the scale of the radar chart on the yField. + */ +Ext.define('Ext.chart.grid.RadialGrid', { + extend: Ext.draw.sprite.Path , + alias: 'grid.radial', + + inheritableStatics: { + def: { + processors: { + startRadius: 'number', + endRadius: 'number' + }, + + defaults: { + startRadius: 0, + endRadius: 1, + scalingCenterX: 0, + scalingCenterY: 0, + strokeStyle: '#DDD' + }, + + dirtyTriggers: { + startRadius: 'path,bbox', + endRadius: 'path,bbox' + } + } + }, + + render: function () { + this.callSuper(arguments); + }, + + updatePath: function (path, attr) { + var startRadius = attr.startRadius, + endRadius = attr.endRadius; + path.moveTo(startRadius, 0); + path.lineTo(endRadius, 0); + } +}); + +/** + * @class Ext.chart.PolarChart + * @extends Ext.chart.AbstractChart + * + * Creates a chart that uses polar coordinates. + */ +Ext.define('Ext.chart.PolarChart', { + + + + + + + extend: Ext.chart.AbstractChart , + xtype: 'polar', + + config: { + /** + * @cfg {Array} center Determines the center of the polar chart. + * Updated when the chart performs layout. + */ + center: [0, 0], + /** + * @cfg {Number} radius Determines the radius of the polar chart. + * Updated when the chart performs layout. + */ + radius: 0 + }, + + getDirectionForAxis: function (position) { + if (position === 'radial') { + return 'Y'; + } else { + return 'X'; + } + }, + + applyCenter: function (center, oldCenter) { + if (oldCenter && center[0] === oldCenter[0] && center[1] === oldCenter[1]) { + return; + } + return [+center[0], +center[1]]; + }, + + updateCenter: function (center) { + var me = this, + axes = me.getAxes(), axis, + series = me.getSeries(), seriesItem, + i, ln; + for (i = 0, ln = axes.length; i < ln; i++) { + axis = axes[i]; + axis.setCenter(center); + } + + for (i = 0, ln = series.length; i < ln; i++) { + seriesItem = series[i]; + seriesItem.setCenter(center); + } + }, + + updateRadius: function (radius) { + var me = this, + axes = me.getAxes(), axis, + series = me.getSeries(), seriesItem, + i, ln; + for (i = 0, ln = axes.length; i < ln; i++) { + axis = axes[i]; + axis.setMinimum(0); + axis.setLength(radius); + axis.getSprites(); + } + + for (i = 0, ln = series.length; i < ln; i++) { + seriesItem = series[i]; + seriesItem.setRadius(radius); + } + }, + + doSetSurfaceRegion: function (surface, region) { + var mainRegion = this.getMainRegion(); + surface.setRegion(region); + surface.matrix.set(1, 0, 0, 1, mainRegion[0] - region[0], mainRegion[1] - region[1]); + surface.inverseMatrix.set(1, 0, 0, 1, region[0] - mainRegion[0], region[1] - mainRegion[1]); + }, + + performLayout: function () { + try { + this.resizing++; + this.callSuper(); + var me = this, + size = me.element.getSize(), + fullRegion = [0, 0, size.width, size.height], + + inset = me.getInsetPadding(), + inner = me.getInnerPadding(), + + left = inset.left, + top = inset.top, + width = size.width - left - inset.right, + height = size.height - top - inset.bottom, + region = [inset.left, inset.top, width, height], + + innerWidth = width - inner.left - inner.right, + innerHeight = height - inner.top - inner.bottom, + + center = [innerWidth * 0.5 + inner.left, innerHeight * 0.5 + inner.top], + radius = Math.min(innerWidth, innerHeight) * 0.5, + axes = me.getAxes(), axis, + series = me.getSeries(), seriesItem, + i, ln; + + me.setMainRegion(region); + + for (i = 0, ln = series.length; i < ln; i++) { + seriesItem = series[i]; + me.doSetSurfaceRegion(seriesItem.getSurface(), region); + me.doSetSurfaceRegion(seriesItem.getOverlaySurface(), fullRegion); + } + + me.doSetSurfaceRegion(me.getSurface(), fullRegion); + for (i = 0, ln = me.surfaceMap.grid && me.surfaceMap.grid.length; i < ln; i++) { + me.doSetSurfaceRegion(me.surfaceMap.grid[i], fullRegion); + } + for (i = 0, ln = axes.length; i < ln; i++) { + axis = axes[i]; + me.doSetSurfaceRegion(axis.getSurface(), fullRegion); + } + + me.setRadius(radius); + me.setCenter(center); + me.redraw(); + } finally { + this.resizing--; + } + }, + + getEventXY: function (e) { + e = (e.changedTouches && e.changedTouches[0]) || e.event || e.browserEvent || e; + var me = this, + xy = me.element.getXY(), + padding = me.getInsetPadding(); + return [e.pageX - xy[0] - padding.left, e.pageY - xy[1] - padding.top]; + }, + + redraw: function () { + var me = this, + axes = me.getAxes(), axis, + series = me.getSeries(), seriesItem, + i, ln; + + for (i = 0, ln = axes.length; i < ln; i++) { + axis = axes[i]; + axis.getSprites(); + } + + for (i = 0, ln = series.length; i < ln; i++) { + seriesItem = series[i]; + seriesItem.getSprites(); + } + + me.renderFrame(); + me.callSuper(arguments); + } +}); + +/** + * @class Ext.chart.SpaceFillingChart + * @extends Ext.chart.AbstractChart + * + * Creates a chart that fills the entire area of the chart. + * e.g. Gauge Charts + */ +Ext.define('Ext.chart.SpaceFillingChart', { + + extend: Ext.chart.AbstractChart , + xtype: 'spacefilling', + + config: { + + }, + + performLayout: function () { + try { + this.resizing++; + this.callSuper(); + var me = this, + size = me.element.getSize(), + series = me.getSeries(), seriesItem, + padding = me.getInsetPadding(), + width = size.width - padding.left - padding.right, + height = size.height - padding.top - padding.bottom, + region = [padding.left, padding.top, width, height], + fullRegion = [0, 0, size.width, size.height], + i, ln; + me.getSurface().setRegion(region); + me.setMainRegion(region); + for (i = 0, ln = series.length; i < ln; i++) { + seriesItem = series[i]; + seriesItem.getSurface().setRegion(region); + seriesItem.setRegion(region); + + seriesItem.getOverlaySurface().setRegion(fullRegion); + } + me.redraw(); + } finally { + this.resizing--; + } + }, + + redraw: function () { + var me = this, + series = me.getSeries(), seriesItem, + i, ln; + + for (i = 0, ln = series.length; i < ln; i++) { + seriesItem = series[i]; + seriesItem.getSprites(); + } + + me.renderFrame(); + me.callSuper(arguments); + } +}); + +/** + * @class Ext.chart.axis.Category + * @extends Ext.chart.axis.Axis + * + * A type of axis that displays items in categories. This axis is generally used to + * display categorical information like names of items, month names, quarters, etc. + * but no quantitative values. For that other type of information {@link Ext.chart.axis.Numeric Numeric} + * axis are more suitable. + * + * As with other axis you can set the position of the axis and its title. For example: + * + * @example preview + * var chart = new Ext.chart.CartesianChart({ + * animate: true, + * innerPadding: { + * left: 40, + * right: 40 + * }, + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':'metric one', 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':'metric two', 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':'metric three', 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':'metric four', 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':'metric five', 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * axes: [{ + * type: 'category', + * position: 'bottom', + * fields: ['name'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * } + * }], + * series: [{ + * type: 'area', + * subStyle: { + * fill: ['blue', 'green', 'red'] + * }, + * xField: 'name', + * yField: ['data1', 'data2', 'data3'] + * + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + * + * In this example with set the category axis to the bottom of the surface, bound the axis to + * the `name` property and set as title "Sample Values". + */ + +Ext.define('Ext.chart.axis.Category', { + + + + + extend: Ext.chart.axis.Axis , + alias: 'axis.category', + type: 'category', + + config: { + layout: 'combineDuplicate', + + segmenter: 'names' + } +}); + +/** + * @class Ext.chart.axis.Numeric + * @extends Ext.chart.axis.Axis + * + * An axis to handle numeric values. This axis is used for quantitative data as + * opposed to the category axis. You can set minimum and maximum values to the + * axis so that the values are bound to that. If no values are set, then the + * scale will auto-adjust to the values. + * + * @example preview + * var chart = new Ext.chart.CartesianChart({ + * animate: true, + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':1, 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':2, 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':3, 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':4, 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':5, 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * axes: [{ + * type: 'numeric', + * position: 'left', + * fields: ['data1', 'data2', 'data3', 'data4', 'data5'], + * title: 'Sample Values', + * grid: { + * odd: { + * opacity: 1, + * fill: '#ddd', + * stroke: '#bbb', + * 'lineWidth': 1 + * } + * }, + * minimum: 0, + * adjustMinimumByMajorUnit: 0 + * }], + * series: [{ + * type: 'area', + * subStyle: { + * fill: ['blue', 'green', 'red'] + * }, + * xField: 'name', + * yField: ['data1', 'data2', 'data3'] + * + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + * In this example we create an axis of Numeric type. We set a minimum value so that + * even if all series have values greater than zero, the grid starts at zero. We bind + * the axis onto the left part of the surface by setting _position_ to _left_. + * We bind three different store fields to this axis by setting _fields_ to an array. + * We set the title of the axis to _Number of Hits_ by using the _title_ property. + * We use a _grid_ configuration to set odd background rows to a certain style and even rows + * to be transparent/ignored. + * + */ +Ext.define('Ext.chart.axis.Numeric', { + extend: Ext.chart.axis.Axis , + alias: 'axis.numeric', + type: 'numeric', + + config: { + layout: 'continuous', + + segmenter: 'numeric', + + aggregator: 'double' + } +}); + +/** + * @class Ext.chart.axis.Time + * @extends Ext.chart.axis.Numeric + * + * A type of axis whose units are measured in time values. Use this axis + * for listing dates that you will want to group or dynamically change. + * If you just want to display dates as categories then use the + * Category class for axis instead. + * + * @example preview + * var chart = new Ext.chart.CartesianChart({ + * animate: true, + * store: { + * fields: ['time', 'open', 'high', 'low', 'close'], + * data: [ + * {'time':new Date('Jan 1 2010').getTime(), 'open':600, 'high':614, 'low':578, 'close':590}, + * {'time':new Date('Jan 2 2010').getTime(), 'open':590, 'high':609, 'low':580, 'close':580}, + * {'time':new Date('Jan 3 2010').getTime(), 'open':580, 'high':602, 'low':578, 'close':602}, + * {'time':new Date('Jan 4 2010').getTime(), 'open':602, 'high':614, 'low':586, 'close':586}, + * {'time':new Date('Jan 5 2010').getTime(), 'open':586, 'high':602, 'low':565, 'close':565} + * ] + * }, + * axes: [{ + * type: 'numeric', + * position: 'left', + * fields: ['open', 'high', 'low', 'close'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * grid: true, + * minimum: 560, + * maximum: 640 + * }, { + * type: 'time', + * position: 'bottom', + * fields: ['time'], + * fromDate: new Date('Dec 31 2009'), + * toDate: new Date('Jan 6 2010'), + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * style: { + * axisLine: false + * } + * }], + * series: [{ + * type: 'candlestick', + * xField: 'time', + * openField: 'open', + * highField: 'high', + * lowField: 'low', + * closeField: 'close', + * style: { + * ohlcType: 'ohlc', + * dropStyle: { + * fill: 'rgb(237, 123, 43)', + * stroke: 'rgb(237, 123, 43)' + * }, + * raiseStyle: { + * fill: 'rgb(55, 153, 19)', + * stroke: 'rgb(55, 153, 19)' + * } + * }, + * aggregator: { + * strategy: 'time' + * } + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + */ +Ext.define('Ext.chart.axis.Time', { + extend: Ext.chart.axis.Numeric , + alias: 'axis.time', + type: 'time', + + config: { + /** + * @cfg {Boolean} calculateByLabelSize + * The minimum value drawn by the axis. If not set explicitly, the axis + * minimum will be calculated automatically. + */ + calculateByLabelSize: true, + + /** + * @cfg {String/Boolean} dateFormat + * Indicates the format the date will be rendered on. + * For example: 'M d' will render the dates as 'Jan 30', etc. + */ + dateFormat: null, + + /** + * @cfg {Date} fromDate The starting date for the time axis. + */ + fromDate: null, + + /** + * @cfg {Date} toDate The ending date for the time axis. + */ + toDate: null, + + /** + * @cfg {Array} [step=[Ext.Date.DAY, 1]] An array with two components: + * + * - The unit of the step (Ext.Date.DAY, Ext.Date.MONTH, etc). + * - The number of units for the step (1, 2, etc). + * + */ + step: [Ext.Date.DAY, 1], + + layout: 'continuous', + + segmenter: 'time', + + aggregator: 'time' + }, + + updateDateFormat: function (format) { + this.setRenderer(function (date) { + return Ext.Date.format(new Date(date), format); + }); + }, + + updateFromDate: function (date) { + this.setMinimum(+date); + }, + + updateToDate: function (date) { + this.setMaximum(+date); + }, + + getCoordFor: function (value) { + if (Ext.isString(value)) { + value = new Date(value); + } + return +value; + } +}); + +/** + * @class Ext.chart.interactions.CrossZoom + * @extends Ext.chart.interactions.Abstract + * + * The CrossZoom interaction allows the user to zoom in on a selected area of the chart. + * + * @example preview + * var lineChart = new Ext.chart.CartesianChart({ + * interactions: [{ + * type: 'crosszoom' + * }], + * animate: true, + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':'metric one', 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':'metric two', 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':'metric three', 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':'metric four', 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':'metric five', 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * axes: [{ + * type: 'numeric', + * position: 'left', + * fields: ['data1'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * grid: true, + * minimum: 0 + * }, { + * type: 'category', + * position: 'bottom', + * fields: ['name'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * } + * }], + * series: [{ + * type: 'line', + * highlight: { + * size: 7, + * radius: 7 + * }, + * style: { + * stroke: 'rgb(143,203,203)' + * }, + * xField: 'name', + * yField: 'data1', + * marker: { + * type: 'path', + * path: ['M', -2, 0, 0, 2, 2, 0, 0, -2, 'Z'], + * stroke: 'blue', + * lineWidth: 0 + * } + * }, { + * type: 'line', + * highlight: { + * size: 7, + * radius: 7 + * }, + * fill: true, + * xField: 'name', + * yField: 'data3', + * marker: { + * type: 'circle', + * radius: 4, + * lineWidth: 0 + * } + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(lineChart); + */ +Ext.define('Ext.chart.interactions.CrossZoom', { + + extend: Ext.chart.interactions.Abstract , + + type: 'crosszoom', + alias: 'interaction.crosszoom', + + config: { + /** + * @cfg {Object/Array} axes + * Specifies which axes should be made navigable. The config value can take the following formats: + * + * - An Object whose keys correspond to the {@link Ext.chart.axis.Axis#position position} of each + * axis that should be made navigable. Each key's value can either be an Object with further + * configuration options for each axis or simply `true` for a default set of options. + * { + * type: 'crosszoom', + * axes: { + * left: { + * maxZoom: 5, + * allowPan: false + * }, + * bottom: true + * } + * } + * + * If using the full Object form, the following options can be specified for each axis: + * + * - minZoom (Number) A minimum zoom level for the axis. Defaults to `1` which is its natural size. + * - maxZoom (Number) A maximum zoom level for the axis. Defaults to `10`. + * - startZoom (Number) A starting zoom level for the axis. Defaults to `1`. + * - allowZoom (Boolean) Whether zooming is allowed for the axis. Defaults to `true`. + * - allowPan (Boolean) Whether panning is allowed for the axis. Defaults to `true`. + * - startPan (Boolean) A starting panning offset for the axis. Defaults to `0`. + * + * - An Array of strings, each one corresponding to the {@link Ext.chart.axis.Axis#position position} + * of an axis that should be made navigable. The default options will be used for each named axis. + * + * { + * type: 'crosszoom', + * axes: ['left', 'bottom'] + * } + * + * If the `axes` config is not specified, it will default to making all axes navigable with the + * default axis options. + */ + axes: true, + + gesture: 'drag', + + undoButton: {} + }, + + stopAnimationBeforeSync: false, + + zoomAnimationInProgress: false, + + constructor: function () { + this.callSuper(arguments); + this.zoomHistory = []; + }, + + applyAxes: function (axesConfig) { + var result = {}; + if (axesConfig === true) { + return { + top: {}, + right: {}, + bottom: {}, + left: {} + }; + } else if (Ext.isArray(axesConfig)) { + // array of axis names - translate to full object form + result = {}; + Ext.each(axesConfig, function (axis) { + result[axis] = {}; + }); + } else if (Ext.isObject(axesConfig)) { + Ext.iterate(axesConfig, function (key, val) { + // axis name with `true` value -> translate to object + if (val === true) { + result[key] = {}; + } else if (val !== false) { + result[key] = val; + } + }); + } + return result; + }, + + applyUndoButton: function (button, oldButton) { + var me = this; + if (button) { + if (oldButton) { + oldButton.destroy(); + } + return Ext.create('Ext.Button', Ext.apply({ + cls: [], + iconCls: 'refresh', + text: 'Undo Zoom', + disabled: true, + handler: function () { + me.undoZoom(); + } + }, button)); + } else if (oldButton) { + oldButton.destroy(); + } + }, + + getGestures: function () { + var me = this, + gestures = {}; + gestures[me.getGesture()] = 'onGesture'; + gestures[me.getGesture() + 'start'] = 'onGestureStart'; + gestures[me.getGesture() + 'end'] = 'onGestureEnd'; + gestures.doubletap = 'onDoubleTap'; + return gestures; + }, + + getSurface: function () { + return this.getChart() && this.getChart().getSurface('main'); + }, + + setSeriesOpacity: function (opacity) { + var surface = this.getChart() && this.getChart().getSurface('series-surface', 'series'); + if (surface) { + surface.element.setStyle('opacity', opacity); + } + }, + + onGestureStart: function (e) { + var me = this, + chart = me.getChart(), + surface = me.getSurface(), + region = chart.getInnerRegion(), + chartWidth = region[2], + chartHeight = region[3], + xy = chart.element.getXY(), + x = e.pageX - xy[0] - region[0], + y = e.pageY - xy[1] - region[1]; + + if (me.zoomAnimationInProgress) { + return; + } + if (x > 0 && x < chartWidth && y > 0 && y < chartHeight) { + me.lockEvents(me.getGesture()); + me.startX = x; + me.startY = y; + me.selectionRect = surface.add({ + type: 'rect', + globalAlpha: 0.5, + fillStyle: 'rgba(80,80,140,0.5)', + strokeStyle: 'rgba(80,80,140,1)', + lineWidth: 2, + x: x, + y: y, + width: 0, + height: 0, + zIndex: 10000 + }); + me.setSeriesOpacity(0.8); + return false; + } + }, + + onGesture: function (e) { + var me = this; + if (me.zoomAnimationInProgress) { + return; + } + if (me.getLocks()[me.getGesture()] === me) { + var chart = me.getChart(), + surface = me.getSurface(), + region = chart.getInnerRegion(), + chartWidth = region[2], + chartHeight = region[3], + xy = chart.element.getXY(), + x = e.pageX - xy[0] - region[0], + y = e.pageY - xy[1] - region[1]; + + if (x < 0) { + x = 0; + } else if (x > chartWidth) { + x = chartWidth; + } + if (y < 0) { + y = 0; + } else if (y > chartHeight) { + y = chartHeight; + } + me.selectionRect.setAttributes({ + width: x - me.startX, + height: y - me.startY + }); + if (Math.abs(me.startX - x) < 11 || Math.abs(me.startY - y) < 11) { + me.selectionRect.setAttributes({globalAlpha: 0.5}); + } else { + me.selectionRect.setAttributes({globalAlpha: 1}); + } + surface.renderFrame(); + return false; + } + }, + + onGestureEnd: function (e) { + var me = this; + if (me.zoomAnimationInProgress) { + return; + } + if (me.getLocks()[me.getGesture()] === me) { + var chart = me.getChart(), + surface = me.getSurface(), + region = chart.getInnerRegion(), + chartWidth = region[2], + chartHeight = region[3], + xy = chart.element.getXY(), + x = e.pageX - xy[0] - region[0], + y = e.pageY - xy[1] - region[1]; + + if (x < 0) { + x = 0; + } else if (x > chartWidth) { + x = chartWidth; + } + if (y < 0) { + y = 0; + } else if (y > chartHeight) { + y = chartHeight; + } + if (Math.abs(me.startX - x) < 11 || Math.abs(me.startY - y) < 11) { + surface.remove(me.selectionRect); + } else { + me.zoomBy([ + Math.min(me.startX, x) / chartWidth, + 1 - Math.max(me.startY, y) / chartHeight, + Math.max(me.startX, x) / chartWidth, + 1 - Math.min(me.startY, y) / chartHeight + ]); + + me.selectionRect.setAttributes({ + x: Math.min(me.startX, x), + y: Math.min(me.startY, y), + width: Math.abs(me.startX - x), + height: Math.abs(me.startY - y) + }); + + me.selectionRect.fx.setConfig(chart.getAnimate() || {duration: 0}); + me.selectionRect.setAttributes({ + globalAlpha: 0, + x: 0, + y: 0, + width: chartWidth, + height: chartHeight + }); + + me.zoomAnimationInProgress = true; + + chart.suspendThicknessChanged(); + me.selectionRect.fx.on('animationend', function () { + chart.resumeThicknessChanged(); + + surface.remove(me.selectionRect); + me.selectionRect = null; + + me.zoomAnimationInProgress = false; + }); + } + + surface.renderFrame(); + me.sync(); + me.unlockEvents(me.getGesture()); + me.setSeriesOpacity(1.0); + + if (!me.zoomAnimationInProgress) { + surface.remove(me.selectionRect); + me.selectionRect = null; + } + } + }, + + zoomBy: function (region) { + var me = this, + axisConfigs = me.getAxes(), + axes = me.getChart().getAxes(), + config, + zoomMap = {}; + + for (var i = 0; i < axes.length; i++) { + var axis = axes[i]; + config = axisConfigs[axis.getPosition()]; + if (config && config.allowZoom !== false) { + var isSide = axis.isSide(), + oldRange = axis.getVisibleRange(); + zoomMap[axis.getId()] = oldRange.slice(0); + if (!isSide) { + axis.setVisibleRange([ + (oldRange[1] - oldRange[0]) * region[0] + oldRange[0], + (oldRange[1] - oldRange[0]) * region[2] + oldRange[0] + ]); + } else { + axis.setVisibleRange([ + (oldRange[1] - oldRange[0]) * region[1] + oldRange[0], + (oldRange[1] - oldRange[0]) * region[3] + oldRange[0] + ]); + } + } + } + + me.zoomHistory.push(zoomMap); + me.getUndoButton().setDisabled(false); + }, + + undoZoom: function () { + var zoomMap = this.zoomHistory.pop(), + axes = this.getChart().getAxes(); + if (zoomMap) { + for (var i = 0; i < axes.length; i++) { + var axis = axes[i]; + if (zoomMap[axis.getId()]) { + axis.setVisibleRange(zoomMap[axis.getId()]); + } + } + } + this.getUndoButton().setDisabled(this.zoomHistory.length === 0); + this.sync(); + }, + + onDoubleTap: function (e) { + this.undoZoom(); + } +}); + +/** + * The Crosshair interaction allows the user to get precise values for a specific point on the chart. + * The values are obtained by single-touch dragging on the chart. + * + * @example preview + * var lineChart = Ext.create('Ext.chart.CartesianChart', { + * innerPadding: 20, + * interactions: [{ + * type: 'crosshair', + * axes: { + * left: { + * label: { + * fillStyle: 'white' + * }, + * rect: { + * fillStyle: 'brown', + * radius: 6 + * } + * }, + * bottom: { + * label: { + * fontSize: '14px', + * fontWeight: 'bold' + * } + * } + * }, + * lines: { + * horizontal: { + * strokeStyle: 'brown', + * lineWidth: 2, + * lineDash: [20, 2, 2, 2, 2, 2, 2, 2] + * } + * } + * }], + * store: { + * fields: ['name', 'data'], + * data: [ + * {name: 'apple', data: 300}, + * {name: 'orange', data: 900}, + * {name: 'banana', data: 800}, + * {name: 'pear', data: 400}, + * {name: 'grape', data: 500} + * ] + * }, + * axes: [{ + * type: 'numeric', + * position: 'left', + * fields: ['data'], + * title: { + * text: 'Value', + * fontSize: 15 + * }, + * grid: true, + * label: { + * rotationRads: -Math.PI / 4 + * } + * }, { + * type: 'category', + * position: 'bottom', + * fields: ['name'], + * title: { + * text: 'Category', + * fontSize: 15 + * } + * }], + * series: [{ + * type: 'line', + * style: { + * strokeStyle: 'black' + * }, + * xField: 'name', + * yField: 'data', + * marker: { + * type: 'circle', + * radius: 5, + * fillStyle: 'lightblue' + * } + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(lineChart); + */ + +Ext.define('Ext.chart.interactions.Crosshair', { + + extend: Ext.chart.interactions.Abstract , + + + + + + + + type: 'crosshair', + alias: 'interaction.crosshair', + + config: { + /** + * @cfg {Object} axes + * Specifies label text and label rect configs on per axis basis or as a single config for all axes. + * + * { + * type: 'crosshair', + * axes: { + * label: { fillStyle: 'white' }, + * rect: { fillStyle: 'maroon'} + * } + * } + * + * In case per axis configuration is used, an object with keys corresponding + * to the {@link Ext.chart.axis.Axis#position position} must be provided. + * + * { + * type: 'crosshair', + * axes: { + * left: { + * label: { fillStyle: 'white' }, + * rect: { + * fillStyle: 'maroon', + * radius: 4 + * } + * }, + * bottom: { + * label: { + * fontSize: '14px', + * fontWeight: 'bold' + * }, + * rect: { fillStyle: 'white' } + * } + * } + * + * If the `axes` config is not specified, the following defaults will be used: + * - `label` will use values from the {@link Ext.chart.axis.Axis#label label} config. + * - `rect` will use the 'white' fillStyle. + */ + axes: { + top: {label: {}, rect: {}}, + right: {label: {}, rect: {}}, + bottom: {label: {}, rect: {}}, + left: {label: {}, rect: {}} + }, + + /** + * @cfg {Object} lines + * Specifies attributes of horizontal and vertical lines that make up the crosshair. + * If this config is missing, black dashed lines will be used. + * + * { + * horizontal: { + * strokeStyle: 'red', + * lineDash: [] // solid line + * }, + * vertical: { + * lineWidth: 2, + * lineDash: [15, 5, 5, 5] + * } + * } + */ + lines: { + horizontal: { + strokeStyle: 'black', + lineDash: [5, 5] + }, + vertical: { + strokeStyle: 'black', + lineDash: [5, 5] + } + }, + gesture: 'drag' + }, + + applyAxes: function (axesConfig, oldAxesConfig) { + return Ext.merge(oldAxesConfig || {}, axesConfig); + }, + + applyLines: function (linesConfig, oldLinesConfig) { + return Ext.merge(oldLinesConfig || {}, linesConfig); + }, + + updateChart: function (chart) { + if (!(chart instanceof Ext.chart.CartesianChart)) { + throw 'Crosshair interaction can only be used on cartesian charts.'; + } + this.callParent(arguments); + }, + + getGestures: function () { + var me = this, + gestures = {}; + gestures[me.getGesture()] = 'onGesture'; + gestures[me.getGesture() + 'start'] = 'onGestureStart'; + gestures[me.getGesture() + 'end'] = 'onGestureEnd'; + return gestures; + }, + + onGestureStart: function (e) { + var me = this, + chart = me.getChart(), + surface = chart.getSurface('overlay-surface'), + region = chart.getInnerRegion(), + chartWidth = region[2], + chartHeight = region[3], + xy = chart.element.getXY(), + x = e.pageX - xy[0] - region[0], + y = e.pageY - xy[1] - region[1], + axes = chart.getAxes(), + axesConfig = me.getAxes(), + linesConfig = me.getLines(), + axis, axisSurface, axisRegion, axisWidth, axisHeight, axisPosition, + axisLabel, labelPadding, + axisSprite, attr, axisThickness, lineWidth, halfLineWidth, + i; + + if (x > 0 && x < chartWidth && y > 0 && y < chartHeight) { + me.lockEvents(me.getGesture()); + me.horizontalLine = surface.add(Ext.apply({ + xclass: 'Ext.chart.grid.HorizontalGrid', + x: 0, + y: y, + width: chartWidth + }, linesConfig.horizontal)); + me.verticalLine = surface.add(Ext.apply({ + xclass: 'Ext.chart.grid.VerticalGrid', + x: x, + y: 0, + height: chartHeight + }, linesConfig.vertical)); + me.axesLabels = me.axesLabels || {}; + for (i = 0; i < axes.length; i++) { + axis = axes[i]; + axisSurface = axis.getSurface(); + axisRegion = axisSurface.getRegion(); + axisSprite = axis.getSprites()[0]; + axisWidth = axisRegion[2]; + axisHeight = axisRegion[3]; + axisPosition = axis.getPosition(); + attr = axisSprite.attr; + axisThickness = axisSprite.thickness; + lineWidth = attr.axisLine ? attr.lineWidth : 0; + halfLineWidth = lineWidth / 2; + labelPadding = Math.max(attr.majorTickSize, attr.minorTickSize) + lineWidth; + + axisLabel = me.axesLabels[axisPosition] = axisSurface.add({type: 'composite'}); + axisLabel.labelRect = axisLabel.add(Ext.apply({ + type: 'rect', + fillStyle: 'white', + x: axisPosition === 'right' ? lineWidth : axisSurface.roundPixel(axisWidth - axisThickness - labelPadding) - halfLineWidth, + y: axisPosition === 'bottom' ? lineWidth : axisSurface.roundPixel(axisHeight - axisThickness - labelPadding) - lineWidth, + width: axisPosition === 'left' ? axisThickness - halfLineWidth + labelPadding : axisThickness + labelPadding, + height: axisPosition === 'top' ? axisThickness + labelPadding : axisThickness + labelPadding + }, axesConfig.rect || axesConfig[axisPosition].rect)); + axisLabel.labelText = axisLabel.add(Ext.apply(Ext.Object.chain(axis.config.label), axesConfig.label || axesConfig[axisPosition].label, { + type: 'text', + x: (function () { + switch (axisPosition) { + case 'left': + return axisWidth - labelPadding - halfLineWidth - axisThickness / 2; + case 'right': + return axisThickness / 2 + labelPadding - halfLineWidth; + default: + return 0; + } + })(), + y: (function () { + switch (axisPosition) { + case 'top': + return axisHeight - labelPadding - halfLineWidth - axisThickness / 2; + case 'bottom': + return axisThickness / 2 + labelPadding; + default: + return 0; + } + })() + })); + } + return false; + } + + }, + + onGesture: function (e) { + var me = this; + if (me.getLocks()[me.getGesture()] !== me) { + return; + } + var chart = me.getChart(), + surface = chart.getSurface('overlay-surface'), + region = Ext.Array.slice(chart.getInnerRegion()), + padding = chart.getInnerPadding(), + px = padding.left, + py = padding.top, + chartWidth = region[2], + chartHeight = region[3], + xy = chart.element.getXY(), + x = e.pageX - xy[0] - region[0], + y = e.pageY - xy[1] - region[1], + axes = chart.getAxes(), + axis, axisPosition, axisAlignment, axisSurface, axisSprite, axisMatrix, + axisLayoutContext, axisSegmenter, + axisLabel, labelBBox, textPadding, + xx, yy, dx, dy, + xValue, yValue, + text, + i; + + if (x < 0) { + x = 0; + } else if (x > chartWidth) { + x = chartWidth; + } + if (y < 0) { + y = 0; + } else if (y > chartHeight) { + y = chartHeight; + } + x += px; + y += py; + + for (i = 0; i < axes.length; i++) { + axis = axes[i]; + axisPosition = axis.getPosition(); + axisAlignment = axis.getAlignment(); + axisSurface = axis.getSurface(); + axisSprite = axis.getSprites()[0]; + axisMatrix = axisSprite.attr.matrix; + textPadding = axisSprite.attr.textPadding * 2; + axisLabel = me.axesLabels[axisPosition]; + axisLayoutContext = axisSprite.getLayoutContext(); + axisSegmenter = axis.getSegmenter(); + + if (axisLabel) { + if (axisAlignment === 'vertical') { + yy = axisMatrix.getYY(); + dy = axisMatrix.getDY(); + yValue = (y - dy - py) / yy; + if (axis.getLayout() instanceof Ext.chart.axis.layout.Discrete) { + y = Math.round(yValue) * yy + dy + py; + yValue = axisSegmenter.from(Math.round(yValue)); + yValue = axisSprite.attr.data[yValue]; + } else { + yValue = axisSegmenter.from(yValue); + } + text = axisSegmenter.renderer(yValue, axisLayoutContext); + + axisLabel.setAttributes({translationY: y - py}); + axisLabel.labelText.setAttributes({text: text}); + labelBBox = axisLabel.labelText.getBBox(); + axisLabel.labelRect.setAttributes({ + height: labelBBox.height + textPadding, + y: -(labelBBox.height + textPadding) / 2 + }); + axisSurface.renderFrame(); + } else { + xx = axisMatrix.getXX(); + dx = axisMatrix.getDX(); + xValue = (x - dx - px) / xx; + if (axis.getLayout() instanceof Ext.chart.axis.layout.Discrete) { + x = Math.round(xValue) * xx + dx + px; + xValue = axisSegmenter.from(Math.round(xValue)); + xValue = axisSprite.attr.data[xValue]; + } else { + xValue = axisSegmenter.from(xValue); + } + text = axisSegmenter.renderer(xValue, axisLayoutContext); + + axisLabel.setAttributes({translationX: x - px}); + axisLabel.labelText.setAttributes({text: text}); + labelBBox = axisLabel.labelText.getBBox(); + axisLabel.labelRect.setAttributes({ + width: labelBBox.width + textPadding, + x: -(labelBBox.width + textPadding) / 2 + }); + axisSurface.renderFrame(); + } + } + } + me.horizontalLine.setAttributes({y: y}); + me.verticalLine.setAttributes({x: x}); + surface.renderFrame(); + return false; + }, + + onGestureEnd: function (e) { + var me = this, + chart = me.getChart(), + surface = chart.getSurface('overlay-surface'), + axes = chart.getAxes(), + axis, axisPosition, axisSurface, axisLabel, + i; + + surface.remove(me.verticalLine); + surface.remove(me.horizontalLine); + + for (i = 0; i < axes.length; i++) { + axis = axes[i]; + axisPosition = axis.getPosition(); + axisSurface = axis.getSurface(); + axisLabel = me.axesLabels[axisPosition]; + if (axisLabel) { + delete me.axesLabels[axisPosition]; + axisSurface.remove(axisLabel); + } + axisSurface.renderFrame(); + } + + surface.renderFrame(); + me.unlockEvents(me.getGesture()); + } + +}); + +/** + * @class Ext.chart.interactions.ItemHighlight + * @extends Ext.chart.interactions.Abstract + * + * The ItemHighlight interaction allows the user to highlight series items in the chart. + */ +Ext.define('Ext.chart.interactions.ItemHighlight', { + + extend: Ext.chart.interactions.Abstract , + + type: 'itemhighlight', + alias: 'interaction.itemhighlight', + + config: { + /** + * @cfg {String} gesture + * Defines the gesture type that should trigger item highlighting. + */ + gesture: 'tap' + }, + + getGestures: function () { + var gestures = {}; + gestures['item' + this.getGesture()] = 'onGesture'; + gestures[this.getGesture()] = 'onFailedGesture'; + return gestures; + }, + + onGesture: function (series, item, e) { + e.highlightItem = item; + return false; + }, + + onFailedGesture: function (e) { + this.getChart().setHighlightItem(e.highlightItem || null); + this.sync(); + } +}); + +/** + * The ItemInfo interaction allows displaying detailed information about a series data + * point in a popup panel. + * + * To attach this interaction to a chart, include an entry in the chart's + * {@link Ext.chart.AbstractChart#interactions interactions} config with the `iteminfo` type: + * + * new Ext.chart.AbstractChart({ + * renderTo: Ext.getBody(), + * width: 800, + * height: 600, + * store: store1, + * axes: [ ...some axes options... ], + * series: [ ...some series options... ], + * interactions: [{ + * type: 'iteminfo', + * listeners: { + * show: function(me, item, panel) { + * panel.setHtml('Stock Price: $' + item.record.get('price')); + * } + * } + * }] + * }); + */ +Ext.define('Ext.chart.interactions.ItemInfo', { + + extend: Ext.chart.interactions.Abstract , + + type: 'iteminfo', + alias: 'interaction.iteminfo', + + /** + * @event show + * Fires when the info panel is shown. + * @param {Ext.chart.interactions.ItemInfo} this The interaction instance + * @param {Object} item The item whose info is being displayed + * @param {Ext.Panel} panel The panel for displaying the info + */ + + config: { + /** + * @cfg {String} gesture + * Defines the gesture type that should trigger the item info panel to be displayed. + */ + gesture: 'itemtap', + + /** + * @cfg {Object} panel + * An optional set of configuration overrides for the {@link Ext.Panel} that gets + * displayed. This object will be merged with the default panel configuration. + */ + panel: { + modal: true, + centered: true, + width: 250, + height: 300, + styleHtmlContent: true, + scrollable: 'vertical', + hideOnMaskTap: true, + fullscreen: false, + hidden: true, + zIndex: 30, + items: [ + { + docked: 'top', + xtype: 'toolbar', + title: 'Item Detail' + } + ] + } + }, + + applyPanel: function (panel, oldPanel) { + return Ext.factory(panel, 'Ext.Panel', oldPanel); + }, + + updatePanel: function (panel, oldPanel) { + if (panel) { + panel.on('hide', "reset", this); + } + if (oldPanel) { + oldPanel.un('hide', "reset", this); + } + }, + + onGesture: function (series, item) { + var me = this, + panel = me.getPanel(); + me.item = item; + me.fireEvent('show', me, item, panel); + Ext.Viewport.add(panel); + panel.show('pop'); + series.setAttributesForItem(item, { highlighted: true }); + me.sync(); + return false; + }, + + reset: function () { + var me = this, + item = me.item; + if (item) { + item.series.setAttributesForItem(item, { highlighted: false }); + delete me.item; + me.sync(); + } + } +}); + /** * @private */ @@ -64536,6 +81962,3240 @@ Ext.define('Ext.util.Region', { } }); +/** + * The PanZoom interaction allows the user to navigate the data for one or more chart + * axes by panning and/or zooming. Navigation can be limited to particular axes. Zooming is + * performed by pinching on the chart or axis area; panning is performed by single-touch dragging. + * + * For devices which do not support multiple-touch events, zooming can not be done via pinch gestures; in this case the + * interaction will allow the user to perform both zooming and panning using the same single-touch drag gesture. + * {@link #modeToggleButton} provides a button to indicate and toggle between two modes. + * + * @example preview + * var lineChart = new Ext.chart.CartesianChart({ + * interactions: [{ + * type: 'panzoom', + * zoomOnPanGesture: true + * }], + * animate: true, + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':'metric one', 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':'metric two', 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':'metric three', 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':'metric four', 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':'metric five', 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * axes: [{ + * type: 'numeric', + * position: 'left', + * fields: ['data1'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * grid: true, + * minimum: 0 + * }, { + * type: 'category', + * position: 'bottom', + * fields: ['name'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * } + * }], + * series: [{ + * type: 'line', + * highlight: { + * size: 7, + * radius: 7 + * }, + * style: { + * stroke: 'rgb(143,203,203)' + * }, + * xField: 'name', + * yField: 'data1', + * marker: { + * type: 'path', + * path: ['M', -2, 0, 0, 2, 2, 0, 0, -2, 'Z'], + * stroke: 'blue', + * lineWidth: 0 + * } + * }, { + * type: 'line', + * highlight: { + * size: 7, + * radius: 7 + * }, + * fill: true, + * xField: 'name', + * yField: 'data3', + * marker: { + * type: 'circle', + * radius: 4, + * lineWidth: 0 + * } + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(lineChart); + * + * The configuration object for the `panzoom` interaction type should specify which axes + * will be made navigable via the `axes` config. See the {@link #axes} config documentation + * for details on the allowed formats. If the `axes` config is not specified, it will default + * to making all axes navigable with the default axis options. + * + */ +Ext.define('Ext.chart.interactions.PanZoom', { + + extend: Ext.chart.interactions.Abstract , + + type: 'panzoom', + alias: 'interaction.panzoom', + + + + + + config: { + + /** + * @cfg {Object/Array} axes + * Specifies which axes should be made navigable. The config value can take the following formats: + * + * - An Object with keys corresponding to the {@link Ext.chart.axis.Axis#position position} of each + * axis that should be made navigable. Each key's value can either be an Object with further + * configuration options for each axis or simply `true` for a default set of options. + * + * { + * type: 'panzoom', + * axes: { + * left: { + * maxZoom: 5, + * allowPan: false + * }, + * bottom: true + * } + * } + * + * If using the full Object form, the following options can be specified for each axis: + * + * - minZoom (Number) A minimum zoom level for the axis. Defaults to `1` which is its natural size. + * - maxZoom (Number) A maximum zoom level for the axis. Defaults to `10`. + * - startZoom (Number) A starting zoom level for the axis. Defaults to `1`. + * - allowZoom (Boolean) Whether zooming is allowed for the axis. Defaults to `true`. + * - allowPan (Boolean) Whether panning is allowed for the axis. Defaults to `true`. + * - startPan (Boolean) A starting panning offset for the axis. Defaults to `0`. + * + * - An Array of strings, each one corresponding to the {@link Ext.chart.axis.Axis#position position} + * of an axis that should be made navigable. The default options will be used for each named axis. + * + * { + * type: 'panzoom', + * axes: ['left', 'bottom'] + * } + * + * If the `axes` config is not specified, it will default to making all axes navigable with the + * default axis options. + */ + axes: { + top: {}, + right: {}, + bottom: {}, + left: {} + }, + + minZoom: null, + + maxZoom: null, + + /** + * @cfg {Boolean} showOverflowArrows + * If `true`, arrows will be conditionally shown at either end of each axis to indicate that the + * axis is overflowing and can therefore be panned in that direction. Set this to `false` to + * prevent the arrows from being displayed. + */ + showOverflowArrows: true, + + /** + * @cfg {Object} overflowArrowOptions + * A set of optional overrides for the overflow arrow sprites' options. Only relevant when + * {@link #showOverflowArrows} is `true`. + */ + + gesture: 'pinch', + + panGesture: 'drag', + + zoomOnPanGesture: false, + + modeToggleButton: { + cls: ['x-panzoom-toggle', 'x-zooming'], + iconCls: 'expand' + }, + + hideLabelInGesture: false //Ext.os.is.Android + }, + + stopAnimationBeforeSync: true, + + applyAxes: function (axesConfig, oldAxesConfig) { + return Ext.merge(oldAxesConfig || {}, axesConfig); + }, + + applyZoomOnPanGesture: function (zoomOnPanGesture) { + this.getChart(); + if (this.isMultiTouch()) { + return false; + } + return zoomOnPanGesture; + }, + + updateZoomOnPanGesture: function (zoomOnPanGesture) { + if (!this.isMultiTouch()) { + var button = this.getModeToggleButton(), + zoomModeCls = Ext.baseCSSPrefix + 'zooming'; + if (zoomOnPanGesture) { + button.addCls(zoomModeCls); + if (!button.config.hideText) { + button.setText('Zoom'); + } + } else { + button.removeCls(zoomModeCls); + if (!button.config.hideText) { + button.setText('Pan'); + } + } + } + }, + + toggleMode: function () { + var me = this; + if (!me.isMultiTouch()) { + me.setZoomOnPanGesture(!me.getZoomOnPanGesture()); + } + }, + + applyModeToggleButton: function (button, oldButton) { + var me = this, + result = Ext.factory(button, "Ext.Button", oldButton); + if (result && !oldButton) { + result.setHandler(function () { + me.toggleMode(); + }); + } + return result; + }, + + getGestures: function () { + var me = this, + gestures = {}; + gestures[me.getGesture()] = 'onGesture'; + gestures[me.getGesture() + 'start'] = 'onGestureStart'; + gestures[me.getGesture() + 'end'] = 'onGestureEnd'; + gestures[me.getPanGesture()] = 'onPanGesture'; + gestures[me.getPanGesture() + 'start'] = 'onPanGestureStart'; + gestures[me.getPanGesture() + 'end'] = 'onPanGestureEnd'; + gestures.doubletap = 'onDoubleTap'; + return gestures; + }, + + onDoubleTap: function (e) { + + }, + + onPanGestureStart: function (e) { + if (!e || !e.touches || e.touches.length < 2) { //Limit drags to single touch + var me = this, + region = me.getChart().getInnerRegion(), + xy = me.getChart().element.getXY(); + me.startX = e.pageX - xy[0] - region[0]; + me.startY = e.pageY - xy[1] - region[1]; + me.oldVisibleRanges = null; + me.hideLabels(); + me.getChart().suspendThicknessChanged(); + me.lockEvents(me.getPanGesture()); + return false; + } + }, + + onPanGesture: function (e) { + if (this.getLocks()[this.getPanGesture()] === this) { //Limit drags to single touch + var me = this, + region = me.getChart().getInnerRegion(), + xy = me.getChart().element.getXY(); + if (me.getZoomOnPanGesture()) { + me.transformAxesBy(me.getZoomableAxes(e), 0, 0, (e.pageX - xy[0] - region[0]) / me.startX, me.startY / (e.pageY - xy[1] - region[1])); + } else { + me.transformAxesBy(me.getPannableAxes(e), e.pageX - xy[0] - region[0] - me.startX, e.pageY - xy[1] - region[1] - me.startY, 1, 1); + } + me.sync(); + return false; + } + }, + + onPanGestureEnd: function (e) { + var me = this; + if (this.getLocks()[this.getPanGesture()] === this) { + me.getChart().resumeThicknessChanged(); + me.showLabels(); + me.sync(); + me.unlockEvents(me.getGestures()); + return false; + } + }, + + onGestureStart: function (e) { + if (e.touches && e.touches.length === 2) { + var me = this, + xy = me.getChart().element.getXY(), + region = me.getChart().getInnerRegion(), + x = xy[0] + region[0], + y = xy[1] + region[1], + newPoints = [e.touches[0].point.x - x, e.touches[0].point.y - y, e.touches[1].point.x - x, e.touches[1].point.y - y], + xDistance = Math.max(44, Math.abs(newPoints[2] - newPoints[0])), + yDistance = Math.max(44, Math.abs(newPoints[3] - newPoints[1])); + me.getChart().suspendThicknessChanged(); + me.lastZoomDistances = [xDistance, yDistance]; + me.lastPoints = newPoints; + me.oldVisibleRanges = null; + me.hideLabels(); + me.lockEvents(me.getGesture()); + return false; + } + }, + + onGesture: function (e) { + if (this.getLocks()[this.getGesture()] === this) { + var me = this, + region = me.getChart().getInnerRegion(), + xy = me.getChart().element.getXY(), + x = xy[0] + region[0], + y = xy[1] + region[1], + abs = Math.abs, + lastPoints = me.lastPoints, + newPoints = [e.touches[0].point.x - x, e.touches[0].point.y - y, e.touches[1].point.x - x, e.touches[1].point.y - y], + xDistance = Math.max(44, abs(newPoints[2] - newPoints[0])), + yDistance = Math.max(44, abs(newPoints[3] - newPoints[1])), + lastDistances = this.lastZoomDistances || [xDistance, yDistance], + zoomX = xDistance / lastDistances[0], + zoomY = yDistance / lastDistances[1]; + + me.transformAxesBy(me.getZoomableAxes(e), + region[2] * (zoomX - 1) / 2 + newPoints[2] - lastPoints[2] * zoomX, + region[3] * (zoomY - 1) / 2 + newPoints[3] - lastPoints[3] * zoomY, + zoomX, + zoomY); + me.sync(); + return false; + } + }, + + onGestureEnd: function (e) { + var me = this; + if (me.getLocks()[me.getGesture()] === me) { + me.getChart().resumeThicknessChanged(); + me.showLabels(); + me.sync(); + me.unlockEvents(me.getGestures()); + return false; + } + }, + + hideLabels: function () { + if (this.getHideLabelInGesture()) { + this.eachInteractiveAxes(function (axis) { + axis.hideLabels(); + }); + } + }, + + showLabels: function () { + if (this.getHideLabelInGesture()) { + this.eachInteractiveAxes(function (axis) { + axis.showLabels(); + }); + } + }, + + isEventOnAxis: function (e, axis) { + // TODO: right now this uses the current event position but really we want to only + // use the gesture's start event. Pinch does not give that to us though. + var region = axis.getSurface().getRegion(); + return region[0] <= e.pageX && e.pageX <= region[0] + region[2] && region[1] <= e.pageY && e.pageY <= region[1] + region[3]; + }, + + getPannableAxes: function (e) { + var me = this, + axisConfigs = me.getAxes(), + axes = me.getChart().getAxes(), + i, ln = axes.length, + result = [], isEventOnAxis = false, + config; + + if (e) { + for (i = 0; i < ln; i++) { + if (this.isEventOnAxis(e, axes[i])) { + isEventOnAxis = true; + break; + } + } + } + + for (i = 0; i < ln; i++) { + config = axisConfigs[axes[i].getPosition()]; + if (config && config.allowPan !== false && (!isEventOnAxis || this.isEventOnAxis(e, axes[i]))) { + result.push(axes[i]); + } + } + return result; + }, + + getZoomableAxes: function (e) { + var me = this, + axisConfigs = me.getAxes(), + axes = me.getChart().getAxes(), + result = [], + i, ln = axes.length, axis, + isEventOnAxis = false, config; + + if (e) { + for (i = 0; i < ln; i++) { + if (this.isEventOnAxis(e, axes[i])) { + isEventOnAxis = true; + break; + } + } + } + + for (i = 0; i < ln; i++) { + axis = axes[i]; + config = axisConfigs[axis.getPosition()]; + if (config && config.allowZoom !== false && (!isEventOnAxis || this.isEventOnAxis(e, axis))) { + result.push(axis); + } + } + return result; + }, + + eachInteractiveAxes: function (fn) { + var me = this, + axisConfigs = me.getAxes(), + axes = me.getChart().getAxes(); + for (var i = 0; i < axes.length; i++) { + if (axisConfigs[axes[i].getPosition()]) { + if (false === fn.call(this, axes[i])) { + return; + } + } + } + }, + + transformAxesBy: function (axes, panX, panY, sx, sy) { + var region = this.getChart().getInnerRegion(), + axesCfg = this.getAxes(), axisCfg, + oldVisibleRanges = this.oldVisibleRanges, + result = false; + + if (!oldVisibleRanges) { + this.oldVisibleRanges = oldVisibleRanges = {}; + this.eachInteractiveAxes(function (axis) { + oldVisibleRanges[axis.getId()] = axis.getVisibleRange(); + }); + } + + if (!region) { + return; + } + + for (var i = 0; i < axes.length; i++) { + axisCfg = axesCfg[axes[i].getPosition()]; + result = this.transformAxisBy(axes[i], oldVisibleRanges[axes[i].getId()], panX, panY, sx, sy, this.minZoom || axisCfg.minZoom, this.maxZoom || axisCfg.maxZoom) || result; + } + return result; + }, + + transformAxisBy: function (axis, oldVisibleRange, panX, panY, sx, sy, minZoom, maxZoom) { + var me = this, + visibleLength = oldVisibleRange[1] - oldVisibleRange[0], + visibleRange = axis.getVisibleRange(), + actualMinZoom = minZoom || me.getMinZoom() || axis.config.minZoom, + actualMaxZoom = maxZoom || me.getMaxZoom() || axis.config.maxZoom, + region = me.getChart().getInnerRegion(), + left, right; + if (!region) { + return; + } + + var isSide = axis.isSide(), + length = isSide ? region[3] : region[2], + pan = isSide ? -panY : panX; + visibleLength /= isSide ? sy : sx; + if (visibleLength < 0) { + visibleLength = -visibleLength; + } + + if (visibleLength * actualMinZoom > 1) { + visibleLength = 1; + } + + if (visibleLength * actualMaxZoom < 1) { + visibleLength = 1 / actualMaxZoom; + } + left = oldVisibleRange[0]; + right = oldVisibleRange[1]; + + visibleRange = visibleRange[1] - visibleRange[0]; + if (visibleLength === visibleRange && visibleRange === 1) { + return; + } + axis.setVisibleRange([ + (oldVisibleRange[0] + oldVisibleRange[1] - visibleLength) * 0.5 - pan / length * visibleLength, + (oldVisibleRange[0] + oldVisibleRange[1] + visibleLength) * 0.5 - pan / length * visibleLength + ]); + return (Math.abs(left - axis.getVisibleRange()[0]) > 1e-10 || Math.abs(right - axis.getVisibleRange()[1]) > 1e-10); + }, + + destroy: function () { + this.setModeToggleButton(null); + this.callSuper(); + } +}); + +/** + * @class Ext.chart.interactions.Rotate + * @extends Ext.chart.interactions.Abstract + * + * The Rotate interaction allows the user to rotate a polar chart about its central point. + * + * @example preview + * var chart = new Ext.chart.PolarChart({ + * animate: true, + * interactions: ['rotate'], + * colors: ["#115fa6", "#94ae0a", "#a61120", "#ff8809", "#ffd13e"], + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':'metric one', 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':'metric two', 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':'metric three', 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':'metric four', 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':'metric five', 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * series: [{ + * type: 'pie', + * label: { + * field: 'name', + * display: 'rotate' + * }, + * xField: 'data3', + * donut: 30 + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + */ +Ext.define('Ext.chart.interactions.Rotate', { + extend: Ext.chart.interactions.Abstract , + + type: 'rotate', + + alias: 'interaction.rotate', + + /** + * @event rotate + * Fires on every tick of the rotation + * @param {Ext.chart.interactions.Rotate} this This interaction. + * @param {Number} angle The new current rotation angle. + */ + + /** + * @event rotationEnd + * Fires after a user finishes the rotation + * @param {Ext.chart.interactions.Rotate} this This interaction. + * @param {Number} angle The new current rotation angle. + */ + + config: { + /** + * @cfg {String} gesture + * Defines the gesture type that will be used to rotate the chart. Currently only + * supports `pinch` for two-finger rotation and `drag` for single-finger rotation. + */ + gesture: 'rotate', + + /** + * @cfg {Number} currentRotation + * Saves the current rotation of the series. Accepts negative values and values > 360 ( / 180 * Math.PI) + * @private + */ + currentRotation: 0 + }, + + oldRotations: null, + + getGestures: function() { + return { + rotate: 'onRotate', + rotateend: 'onRotate', + dragstart: 'onGestureStart', + drag: 'onGesture', + dragend: 'onGestureEnd' + }; + }, + + getAngle: function(e) { + var me = this, + chart = me.getChart(), + xy = chart.getEventXY(e), + center = chart.getCenter(); + + return Math.atan2( + xy[1] - center[1], + xy[0] - center[0] + ); + }, + + getEventRadius: function(e) { + var me = this, + chart = me.getChart(), + xy = chart.getEventXY(e), + center = chart.getCenter(), + dx = xy[0] - center[0], + dy = xy[1] - center[1]; + + return Math.sqrt(dx * dx + dy * dy); + }, + + onGestureStart: function(e) { + var me = this, + chart = me.getChart(), + radius = chart.getRadius(), + eventRadius = me.getEventRadius(e); + + if (radius >= eventRadius) { + me.lockEvents('drag'); + me.angle = me.getAngle(e); + me.oldRotations = {}; + return false; + } + }, + + onGesture: function(e) { + var me = this, + chart = me.getChart(), + angle = me.getAngle(e) - me.angle, + axes = chart.getAxes(), + series = chart.getSeries(), seriesItem, + oldRotations = me.oldRotations, + axis, oldRotation, i, ln; + + if (me.getLocks().drag === me) { + chart.suspendAnimation(); + + for (i = 0, ln = axes.length; i < ln; i++) { + axis = axes[i]; + oldRotation = oldRotations[axis.getId()] || (oldRotations[axis.getId()] = axis.getRotation()); + axis.setRotation(angle + oldRotation); + } + + for (i = 0, ln = series.length; i < ln; i++) { + seriesItem = series[i]; + oldRotation = oldRotations[seriesItem.getId()] || (oldRotations[seriesItem.getId()] = seriesItem.getRotation()); + + seriesItem.setRotation(angle + oldRotation); + } + + me.setCurrentRotation(angle + oldRotation); + + me.fireEvent('rotate', me, me.getCurrentRotation()); + + me.sync(); + chart.resumeAnimation(); + return false; + } + }, + + rotateTo: function(angle) { + var me = this, + chart = me.getChart(), + axes = chart.getAxes(), + series = chart.getSeries(), + i, ln; + + chart.suspendAnimation(); + + for (i = 0, ln = axes.length; i < ln; i++) { + axes[i].setRotation(angle); + } + + for (i = 0, ln = series.length; i < ln; i++) { + series[i].setRotation(angle); + } + + me.setCurrentRotation(angle); + + me.fireEvent('rotate', me, me.getCurrentRotation()); + + me.sync(); + chart.resumeAnimation(); + }, + + onGestureEnd: function(e) { + var me = this; + + if (me.getLocks().drag === me) { + me.onGesture(e); + me.unlockEvents('drag'); + + me.fireEvent('rotationEnd', me, me.getCurrentRotation()); + + return false; + } + }, + + onRotate: function(e) { + + } +}); + +/** + * @class Ext.chart.interactions.RotatePie3D + * @extends Ext.chart.interactions.Rotate + * + * A special version of the Rotate interaction used by Pie3D Chart. + */ +Ext.define('Ext.chart.interactions.RotatePie3D', { + + extend: Ext.chart.interactions.Rotate , + + type: 'rotatePie3d', + + alias: 'interaction.rotatePie3d', + + getAngle: function (e) { + var me = this, + chart = me.getChart(), + xy = chart.element.getXY(), + region = chart.getMainRegion(); + return Math.atan2(e.pageY - xy[1] - region[3] * 0.5, e.pageX - xy[0] - region[2] * 0.5); + } +}); + +/** + * @abstract + * @class Ext.chart.series.Cartesian + * @extends Ext.chart.series.Series + * + * Common base class for series implementations which plot values using x/y coordinates. + * + * @constructor + */ +Ext.define('Ext.chart.series.Cartesian', { + extend: Ext.chart.series.Series , + config: { + /** + * The field used to access the x axis value from the items from the data source. + * + * @cfg {String} xField + */ + xField: null, + + /** + * The field(s) used to access the y-axis value(s) of the items from the data source. + * + * @cfg {String|String[]} yField + */ + yField: null, + + /** + * @cfg {Ext.chart.axis.Axis} xAxis The chart axis bound to the series on the x-axis. + */ + xAxis: null, + + /** + * @cfg {Ext.chart.axis.Axis} yAxis The chart axis bound to the series on the y-axis. + */ + yAxis: null + }, + + directions: ['X', 'Y'], + fieldCategoryX: ['X'], + fieldCategoryY: ['Y'], + + updateXAxis: function (axis) { + axis.processData(this); + }, + + updateYAxis: function (axis) { + axis.processData(this); + }, + + coordinateX: function () { + return this.coordinate('X', 0, 2); + }, + + coordinateY: function () { + return this.coordinate('Y', 1, 2); + }, + + getItemForPoint: function (x, y) { + if (this.getSprites()) { + var me = this, + sprite = me.getSprites()[0], + store = me.getStore(), + item; + + if(me.getHidden()) { + return null; + } + if (sprite) { + var index = sprite.getIndexNearPoint(x, y); + if (index !== -1) { + item = { + series: this, + category: this.getItemInstancing() ? 'items' : 'markers', + index: index, + record: store.getData().items[index], + field: this.getYField(), + sprite: sprite + }; + return item; + } + } + } + }, + + createSprite: function () { + var sprite = this.callSuper(), + xAxis = this.getXAxis(); + sprite.setAttributes({flipXY: this.getChart().getFlipXY()}); + if (sprite.setAggregator && xAxis && xAxis.getAggregator) { + if (xAxis.getAggregator) { + sprite.setAggregator({strategy: xAxis.getAggregator()}); + } else { + sprite.setAggregator({}); + } + } + return sprite; + }, + + getSprites: function () { + var me = this, + chart = this.getChart(), + animation = chart && chart.getAnimate(), + itemInstancing = me.getItemInstancing(), + sprites = me.sprites, sprite; + + if (!chart) { + return []; + } + + if (!sprites.length) { + sprite = me.createSprite(); + } else { + sprite = sprites[0]; + } + + if (animation) { + me.getLabel().getTemplate().fx.setConfig(animation); + if (itemInstancing) { + sprite.itemsMarker.getTemplate().fx.setConfig(animation); + } + sprite.fx.setConfig(animation); + } + return sprites; + }, + + provideLegendInfo: function (target) { + var style = this.getStyle(); + target.push({ + name: this.getTitle() || this.getYField() || this.getId(), + mark: style.fillStyle || style.strokeStyle || 'black', + disabled: false, + series: this.getId(), + index: 0 + }); + }, + + getXRange: function () { + return [this.dataRange[0], this.dataRange[2]]; + }, + + getYRange: function () { + return [this.dataRange[1], this.dataRange[3]]; + } +}) +; + +/** + * @abstract + * @extends Ext.chart.series.Cartesian + * Abstract class for all the stacked cartesian series including area series + * and bar series. + */ +Ext.define('Ext.chart.series.StackedCartesian', { + + extend: Ext.chart.series.Cartesian , + + config: { + /** + * @cfg {Boolean} + * 'true' to display the series in its stacked configuration. + */ + stacked: true, + + /** + * @cfg {Array} hidden + */ + hidden: [] + }, + + animatingSprites: 0, + + updateStacked: function () { + this.processData(); + }, + + coordinateY: function () { + return this.coordinateStacked('Y', 1, 2); + }, + + getFields: function (fieldCategory) { + var me = this, + fields = [], fieldsItem, + i, ln; + for (i = 0, ln = fieldCategory.length; i < ln; i++) { + fieldsItem = me['get' + fieldCategory[i] + 'Field'](); + if (Ext.isArray(fieldsItem)) { + fields.push.apply(fields, fieldsItem); + } else { + fields.push(fieldsItem); + } + } + return fields; + }, + + updateLabelOverflowPadding: function (labelOverflowPadding) { + this.getLabel().setAttributes({labelOverflowPadding: labelOverflowPadding}); + }, + + getSprites: function () { + var me = this, + chart = this.getChart(), + animation = chart && chart.getAnimate(), + fields = me.getFields(me.fieldCategoryY), + itemInstancing = me.getItemInstancing(), + sprites = me.sprites, sprite, + hidden = me.getHidden(), + spritesCreated = false, + i, length = fields.length; + + if (!chart) { + return []; + } + + for (i = 0; i < length; i++) { + sprite = sprites[i]; + if (!sprite) { + sprite = me.createSprite(); + if (chart.getFlipXY()) { + sprite.setAttributes({zIndex: i}); + } else { + sprite.setAttributes({zIndex: -i}); + } + sprite.setField(fields[i]); + spritesCreated = true; + hidden.push(false); + if (itemInstancing) { + sprite.itemsMarker.getTemplate().setAttributes(me.getOverriddenStyleByIndex(i)); + } else { + sprite.setAttributes(me.getStyleByIndex(i)); + } + } + if (animation) { + if (itemInstancing) { + sprite.itemsMarker.getTemplate().fx.setConfig(animation); + } + sprite.fx.setConfig(animation); + } + } + + if (spritesCreated) { + me.updateHidden(hidden); + } + return sprites; + }, + + getItemForPoint: function (x, y) { + if (this.getSprites()) { + var me = this, + i, ln, sprite, + itemInstancing = me.getItemInstancing(), + sprites = me.getSprites(), + store = me.getStore(), + hidden = me.getHidden(), + item; + + for (i = 0, ln = sprites.length; i < ln; i++) { + if(!hidden[i]) { + sprite = sprites[i]; + var index = sprite.getIndexNearPoint(x, y); + if (index !== -1) { + item = { + series: me, + index: index, + category: itemInstancing ? 'items' : 'markers', + record: store.getData().items[index], + field: this.getYField()[i], + sprite: sprite + }; + return item; + } + } + } + return null; + } + }, + + provideLegendInfo: function (target) { + var sprites = this.getSprites(), + title = this.getTitle(), + field = this.getYField(), + hidden = this.getHidden(); + for (var i = 0; i < sprites.length; i++) { + target.push({ + name: Ext.isArray(this.getTitle()) ? this.getTitle()[i] : (field && field[i]) || this.getId(), + mark: this.getStyleByIndex(i).fillStyle || this.getStyleByIndex(i).strokeStyle || 'black', + disabled: hidden[i], + series: this.getId(), + index: i + }); + } + }, + + onSpriteAnimationStart: function (sprite) { + this.animatingSprites++; + if (this.animatingSprites === 1) { + this.fireEvent('animationstart'); + } + }, + + onSpriteAnimationEnd: function (sprite) { + this.animatingSprites--; + if (this.animatingSprites === 0) { + this.fireEvent('animationend'); + } + } +}); + +/** + * @class Ext.chart.series.sprite.Cartesian + * @extends Ext.draw.sprite.Sprite + * + * Cartesian sprite. + */ +Ext.define('Ext.chart.series.sprite.Cartesian', { + extend: Ext.draw.sprite.Sprite , + mixins: { + markerHolder: Ext.chart.MarkerHolder + }, + homogeneous: true, + ascending: true, + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Number} [dataMinX=0] Data minimum on the x-axis. + */ + dataMinX: 'number', + + /** + * @cfg {Number} [dataMaxX=1] Data maximum on the x-axis. + */ + dataMaxX: 'number', + + /** + * @cfg {Number} [dataMinY=0] Data minimum on the y-axis. + */ + dataMinY: 'number', + + /** + * @cfg {Number} [dataMaxY=2] Data maximum on the y-axis. + */ + dataMaxY: 'number', + + /** + * @cfg {Array} Data range derived from all the series bound to the x-axis. + */ + rangeX: 'data', + /** + * @cfg {Array} Data range derived from all the series bound to the y-axis. + */ + rangeY: 'data', + + /** + * @cfg {Object} [dataY=null] Data items on the y-axis. + */ + dataY: 'data', + + /** + * @cfg {Object} [dataX=null] Data items on the x-axis. + */ + dataX: 'data', + + /** + * @cfg {Object} [labels=null] Labels used in the series. + */ + labels: 'default', + + /** + * @cfg {Number} [labelOverflowPadding=10] Padding around labels to determine overlap. + */ + labelOverflowPadding: 'number', + + /** + * @cfg {Number} [selectionTolerance=20] + * The distance from the event position to the sprite's data points to trigger interactions (used for 'iteminfo', etc). + */ + selectionTolerance: 'number', + + /** + * @cfg {Boolean} If flipXY is 'true', the series is flipped. + */ + flipXY: 'bool', + + renderer: 'default', + + // PanZoom information + visibleMinX: 'number', + visibleMinY: 'number', + visibleMaxX: 'number', + visibleMaxY: 'number', + innerWidth: 'number', + innerHeight: 'number' + }, + defaults: { + dataY: null, + dataX: null, + dataMinX: 0, + dataMaxX: 1, + dataMinY: 0, + dataMaxY: 1, + labels: null, + labelOverflowPadding: 10, + selectionTolerance: 20, + flipXY: false, + renderer: null, + transformFillStroke: false, + + visibleMinX: 0, + visibleMinY: 0, + visibleMaxX: 1, + visibleMaxY: 1, + innerWidth: 1, + innerHeight: 1 + }, + dirtyTriggers: { + dataX: 'dataX,bbox', + dataY: 'dataY,bbox', + dataMinX: 'bbox', + dataMaxX: 'bbox', + dataMinY: 'bbox', + dataMaxY: 'bbox', + visibleMinX: 'panzoom', + visibleMinY: 'panzoom', + visibleMaxX: 'panzoom', + visibleMaxY: 'panzoom', + innerWidth: 'panzoom', + innerHeight: 'panzoom' + }, + updaters: { + dataX: function (attrs) { + this.processDataX(); + if (!attrs.dirtyFlags.dataY) { + attrs.dirtyFlags.dataY = []; + } + attrs.dirtyFlags.dataY.push('dataY'); + }, + + dataY: function () { + this.processDataY(); + }, + + panzoom: function (attrs) { + var dx = attrs.visibleMaxX - attrs.visibleMinX, + dy = attrs.visibleMaxY - attrs.visibleMinY, + innerWidth = attrs.flipXY ? attrs.innerHeight : attrs.innerWidth, + innerHeight = !attrs.flipXY ? attrs.innerHeight : attrs.innerWidth; + attrs.translationX = -attrs.visibleMinX * innerWidth / dx; + attrs.translationY = -attrs.visibleMinY * innerHeight / dy; + attrs.scalingX = innerWidth / dx; + attrs.scalingY = innerHeight / dy; + attrs.scalingCenterX = 0; + attrs.scalingCenterY = 0; + this.applyTransformations(true); + } + } + } + }, + + config: { + /** + * @private + * @cfg {Object} store The store that is passed to the renderer. + */ + store: null, + + /** + * @cfg {String} field The store field used by the series. + */ + field: null + }, + + processDataY: Ext.emptyFn, + + processDataX: Ext.emptyFn, + + updatePlainBBox: function (plain) { + var attr = this.attr; + plain.x = attr.dataMinX; + plain.y = attr.dataMinY; + plain.width = attr.dataMaxX - attr.dataMinX; + plain.height = attr.dataMaxY - attr.dataMinY; + }, + + /** + * Does a binary search of the data on the x-axis using the given key. + * @param {String} key + * @return {*} + */ + binarySearch: function (key) { + var dx = this.attr.dataX, + start = 0, + end = dx.length; + if (key <= dx[0]) { + return start; + } + if (key >= dx[end - 1]) { + return end - 1; + } + while (start + 1 < end) { + var mid = (start + end) >> 1, + val = dx[mid]; + if (val === key) { + return mid; + } else if (val < key) { + start = mid; + } else { + end = mid; + } + } + return start; + }, + + render: function (surface, ctx, region) { + var me = this, + attr = me.attr, + flipXY = attr.flipXY, + inverseMatrix = attr.inverseMatrix.clone(); + + inverseMatrix.appendMatrix(surface.inverseMatrix); + + if (attr.dataX === null) { + return; + } + if (attr.dataY === null) { + return; + } + + if (inverseMatrix.getXX() * inverseMatrix.getYX() || inverseMatrix.getXY() * inverseMatrix.getYY()) { + console.log('Cartesian Series sprite does not support rotation/sheering'); + return; + } + + var clip = inverseMatrix.transformList([ + [region[0] - 1, region[3] + 1], + [region[0] + region[2] + 1, -1] + ]); + + clip = clip[0].concat(clip[1]); + + if (clip[2] < clip[0]) { + console.log('Cartesian Series sprite does not supports flipped X.'); + // TODO: support it + return; + } + me.renderClipped(surface, ctx, clip, region); + }, + + /** + * Render the given visible clip range. + * @param {Ext.draw.Surface} surface + * @param {Ext.draw.engine.Canvas/Ext.draw.engine.SvgContext} ctx + * @param {Array} clip + * @param {Arrary} region + */ + renderClipped: Ext.emptyFn, + + /** + * Get the nearest item index from point (x, y). -1 as not found. + * @param {Number} x + * @param {Number} y + * @return {Number} The index + */ + getIndexNearPoint: function (x, y) { + var sprite = this, + mat = sprite.attr.matrix, + dataX = sprite.attr.dataX, + dataY = sprite.attr.dataY, + selectionTolerance = sprite.attr.selectionTolerance, + minX, minY, index = -1, + imat = mat.clone().prependMatrix(this.surfaceMatrix).inverse(), + center = imat.transformPoint([x, y]), + positionLB = imat.transformPoint([x - selectionTolerance, y - selectionTolerance]), + positionTR = imat.transformPoint([x + selectionTolerance, y + selectionTolerance]), + left = Math.min(positionLB[0], positionTR[0]), + right = Math.max(positionLB[0], positionTR[0]), + top = Math.min(positionLB[1], positionTR[1]), + bottom = Math.max(positionLB[1], positionTR[1]); + + for (var i = 0; i < dataX.length; i++) { + if (left < dataX[i] && dataX[i] < right && top < dataY[i] && dataY[i] < bottom) { + if (index === -1 || (Math.abs(dataX[i] - center[0]) < minX) && (Math.abs(dataY[i] - center[1]) < minY)) { + minX = Math.abs(dataX[i] - center[0]); + minY = Math.abs(dataY[i] - center[1]); + index = i; + } + } + } + + return index; + } +}); + +/** + * @class Ext.chart.series.sprite.StackedCartesian + * @extends Ext.chart.series.sprite.Cartesian + * + * Stacked cartesian sprite. + */ +Ext.define("Ext.chart.series.sprite.StackedCartesian", { + extend: Ext.chart.series.sprite.Cartesian , + inheritableStatics: { + def: { + processors: { + /** + * @private + * @cfg {Number} [groupCount=1] The number of groups in the series. + */ + groupCount: 'number', + + /** + * @private + * @cfg {Number} [groupOffset=0] The group index of the series sprite. + */ + groupOffset: 'number', + + /** + * @private + * @cfg {Object} [dataStartY=null] The starting point of the data used in the series. + */ + dataStartY: 'data' + }, + defaults: { + selectionTolerance: 20, + groupCount: 1, + groupOffset: 0, + dataStartY: null + }, + dirtyTriggers: { + dataStartY: 'dataY,bbox' + } + } + }, + + //@inheritdoc + getIndexNearPoint: function (x, y) { + var sprite = this, + mat = sprite.attr.matrix, + dataX = sprite.attr.dataX, + dataY = sprite.attr.dataY, + dataStartY = sprite.attr.dataStartY, + selectionTolerance = sprite.attr.selectionTolerance, + minX = 0.5, minY = Infinity, index = -1, + imat = mat.clone().prependMatrix(this.surfaceMatrix).inverse(), + center = imat.transformPoint([x, y]), + positionLB = imat.transformPoint([x - selectionTolerance, y - selectionTolerance]), + positionTR = imat.transformPoint([x + selectionTolerance, y + selectionTolerance]), + dx, dy, + top = Math.min(positionLB[1], positionTR[1]), + bottom = Math.max(positionLB[1], positionTR[1]); + + for (var i = 0; i < dataX.length; i++) { + if (Math.min(dataStartY[i], dataY[i]) <= bottom && top <= Math.max(dataStartY[i], dataY[i])) { + dx = Math.abs(dataX[i] - center[0]); + dy = Math.max(-Math.min(dataY[i] - center[1], center[1] - dataStartY[i]), 0); + if (dx < minX && dy <= minY) { + minX = dx; + minY = dy; + index = i; + } + } + } + + return index; + } +}); + +/** + * @class Ext.chart.series.sprite.Area + * @extends Ext.chart.series.sprite.StackedCartesian + * + * Area series sprite. + */ +Ext.define("Ext.chart.series.sprite.Area", { + alias: 'sprite.areaSeries', + extend: Ext.chart.series.sprite.StackedCartesian , + + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Boolean} [step=false] 'true' if the area is represented with steps instead of lines. + */ + step: 'bool' + }, + defaults: { + step: false + } + } + }, + + renderClipped: function (surface, ctx, clip, clipRegion) { + var me = this, + attr = me.attr, + dataX = attr.dataX, + dataY = attr.dataY, + dataStartY = attr.dataStartY, + matrix = attr.matrix, + x, y, i, lastX, lastY, + xx = matrix.elements[0], + dx = matrix.elements[4], + yy = matrix.elements[3], + dy = matrix.elements[5], + surfaceMatrix = me.surfaceMatrix, + markerCfg = {}, + start = Math.max(0, this.binarySearch(clip[0])), + end = Math.min(dataX.length - 1, this.binarySearch(clip[2]) + 1); + ctx.beginPath(); + + if (attr.step) { + lastY = dataY[start] * yy + dy; + for (i = start; i <= end; i++) { + x = dataX[i] * xx + dx; + y = dataY[i] * yy + dy; + ctx.lineTo(x, lastY); + ctx.lineTo(x, lastY = y); + } + } else { + for (i = start; i <= end; i++) { + x = dataX[i] * xx + dx; + y = dataY[i] * yy + dy; + ctx.lineTo(x, y); + } + } + + if (dataStartY) { + if (attr.step) { + lastX = dataX[end] * xx + dx; + for (i = end; i >= start; i--) { + x = dataX[i] * xx + dx; + y = dataStartY[i] * yy + dy; + ctx.lineTo(lastX, y); + ctx.lineTo(lastX = x, y); + } + } else { + for (i = end; i >= start; i--) { + x = dataX[i] * xx + dx; + y = dataStartY[i] * yy + dy; + ctx.lineTo(x, y); + } + } + } else { + // dataStartY[i] == 0; + ctx.lineTo(dataX[end] * xx + dx, y); + ctx.lineTo(dataX[end] * xx + dx, dy); + ctx.lineTo(dataX[start] * xx + dx, dy); + ctx.lineTo(dataX[start] * xx + dx, dataY[i] * yy + dy); + } + if (attr.transformFillStroke) { + attr.matrix.toContext(ctx); + } + ctx.fill(); + if (attr.transformFillStroke) { + attr.inverseMatrix.toContext(ctx); + } + ctx.beginPath(); + if (attr.step) { + for (i = start; i <= end; i++) { + x = dataX[i] * xx + dx; + y = dataY[i] * yy + dy; + ctx.lineTo(x, lastY); + ctx.lineTo(x, lastY = y); + markerCfg.translationX = surfaceMatrix.x(x, y); + markerCfg.translationY = surfaceMatrix.y(x, y); + me.putMarker("markers", markerCfg, i, !attr.renderer); + } + } else { + for (i = start; i <= end; i++) { + x = dataX[i] * xx + dx; + y = dataY[i] * yy + dy; + ctx.lineTo(x, y); + markerCfg.translationX = surfaceMatrix.x(x, y); + markerCfg.translationY = surfaceMatrix.y(x, y); + me.putMarker("markers", markerCfg, i, !attr.renderer); + } + } + + if (attr.transformFillStroke) { + attr.matrix.toContext(ctx); + } + ctx.stroke(); + } +}); + +/** + * @class Ext.chart.series.Area + * @extends Ext.chart.series.StackedCartesian + * + * Creates an Area Chart. + * + * @example preview + * var chart = new Ext.chart.CartesianChart({ + * animate: true, + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':'metric one', 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':'metric two', 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':'metric three', 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':'metric four', 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':'metric five', 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * axes: [{ + * type: 'numeric', + * position: 'left', + * fields: ['data1'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * grid: true, + * minimum: 0 + * }, { + * type: 'category', + * position: 'bottom', + * fields: ['name'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * } + * }], + * series: [{ + * type: 'area', + * subStyle: { + * fill: ['blue', 'green', 'red'] + * }, + * xField: 'name', + * yField: ['data1', 'data2', 'data3'] + * + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + */ +Ext.define('Ext.chart.series.Area', { + + extend: Ext.chart.series.StackedCartesian , + + alias: 'series.area', + type: 'area', + seriesType: 'areaSeries' + + +}); + +/** + * @class Ext.chart.series.sprite.Bar + * @extends Ext.chart.series.sprite.StackedCartesian + * + * Draws a sprite used in the bar series. + */ +Ext.define('Ext.chart.series.sprite.Bar', { + alias: 'sprite.barSeries', + extend: Ext.chart.series.sprite.StackedCartesian , + + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Number} [minBarWidth=2] The minimum bar width. + */ + minBarWidth: 'number', + + /** + * @cfg {Number} [maxBarWidth=100] The maximum bar width. + */ + maxBarWidth: 'number', + + /** + * @cfg {Number} [minGapWidth=5] The minimum gap between bars. + */ + minGapWidth: 'number', + + /** + * @cfg {Number} [radius=0] The degree of rounding for rounded bars. + */ + radius: 'number', + + /** + * @cfg {Number} [inGroupGapWidth=3] The gap between grouped bars. + */ + inGroupGapWidth: 'number' + }, + defaults: { + minBarWidth: 2, + maxBarWidth: 100, + minGapWidth: 5, + inGroupGapWidth: 3, + radius: 0 + } + } + }, + + // TODO: design this more carefully + drawLabel: function (text, dataX, dataStartY, dataY, labelId) { + var me = this, + attr = me.attr, + label = me.getBoundMarker('labels')[0], + labelTpl = label.getTemplate(), + labelCfg = me.labelCfg || (me.labelCfg = {}), + surfaceMatrix = me.surfaceMatrix, + labelOverflowPadding = attr.labelOverflowPadding, + labelDisplay = labelTpl.attr.display, + labelOrientation = labelTpl.attr.orientation, + labelY, halfWidth, labelBox, + changes; + + labelBox = me.getMarkerBBox('labels', labelId, true); + labelCfg.text = text; + if (!labelBox) { + me.putMarker('labels', labelCfg, labelId); + labelBox = me.getMarkerBBox('labels', labelId, true); + } + if (!attr.flipXY) { + labelCfg.rotationRads = -Math.PI * 0.5; + } else { + labelCfg.rotationRads = 0; + } + labelCfg.calloutVertical = !attr.flipXY; + + switch (labelOrientation) { + case 'horizontal': labelCfg.rotationRads = 0; break; + case 'vertical': labelCfg.rotationRads = -Math.PI * 0.5; break; + } + + halfWidth = (labelBox.width / 2 + labelOverflowPadding); + if (dataStartY > dataY) { + halfWidth = -halfWidth; + } + + if ((labelOrientation === 'horizontal' && attr.flipXY) || (labelOrientation === 'vertical' && !attr.flipXY) || !labelOrientation) { + labelY = (labelDisplay === 'insideStart') ? dataStartY + halfWidth : dataY - halfWidth; + } else { + labelY = (labelDisplay === 'insideStart') ? dataStartY + labelOverflowPadding * 2 : dataY - labelOverflowPadding * 2; + } + labelCfg.x = surfaceMatrix.x(dataX, labelY); + labelCfg.y = surfaceMatrix.y(dataX, labelY); + + labelY = (labelDisplay === 'insideStart') ? dataStartY - halfWidth : dataY + halfWidth; + labelCfg.calloutPlaceX = surfaceMatrix.x(dataX, labelY); + labelCfg.calloutPlaceY = surfaceMatrix.y(dataX, labelY); + + labelY = (labelDisplay === 'insideStart') ? dataStartY : dataY; + labelCfg.calloutStartX = surfaceMatrix.x(dataX, labelY); + labelCfg.calloutStartY = surfaceMatrix.y(dataX, labelY); + if (dataStartY > dataY) { + halfWidth = -halfWidth; + } + if (Math.abs(dataY - dataStartY) <= halfWidth * 2 || labelDisplay === 'outside') { + labelCfg.callout = 1; + } else { + labelCfg.callout = 0; + } + + if (labelTpl.attr.renderer) { + changes = labelTpl.attr.renderer.call(this, text, label, labelCfg, {store: this.getStore()}, labelId); + if (typeof changes === 'string') { + labelCfg.text = changes; + } else { + Ext.apply(labelCfg, changes); + } + } + + me.putMarker('labels', labelCfg, labelId); + }, + + drawBar: function (ctx, surface, clip, left, top, right, bottom, index) { + var itemCfg = this.itemCfg || (this.itemCfg = {}), + changes; + + itemCfg.x = left; + itemCfg.y = top; + itemCfg.width = right - left; + itemCfg.height = bottom - top; + itemCfg.radius = this.attr.radius; + + if (this.attr.renderer) { + changes = this.attr.renderer.call(this, this, itemCfg, {store:this.getStore()}, index); + Ext.apply(itemCfg, changes); + } + this.putMarker('items', itemCfg, index, !this.attr.renderer); + }, + + //@inheritdoc + renderClipped: function (surface, ctx, clip) { + if (this.cleanRedraw) { + return; + } + var me = this, + attr = me.attr, + dataX = attr.dataX, + dataY = attr.dataY, + dataText = attr.labels, + dataStartY = attr.dataStartY, + groupCount = attr.groupCount, + groupOffset = attr.groupOffset - (groupCount - 1) * 0.5, + inGroupGapWidth = attr.inGroupGapWidth, + yLow, yHi, + lineWidth = ctx.lineWidth, + matrix = attr.matrix, + xx = matrix.elements[0], + yy = matrix.elements[3], + dx = matrix.elements[4], + dy = surface.roundPixel(matrix.elements[5]) - 1, + maxBarWidth = xx - attr.minGapWidth, + barWidth = surface.roundPixel(Math.max(attr.minBarWidth, (Math.min(maxBarWidth, attr.maxBarWidth) - inGroupGapWidth * (groupCount - 1)) / groupCount)), + surfaceMatrix = this.surfaceMatrix, + left, right, bottom, top, i, center, + halfLineWidth = 0.5 * attr.lineWidth, + start = Math.max(0, Math.floor(clip[0])), + end = Math.min(dataX.length - 1, Math.ceil(clip[2])), + drawMarkers = dataText && !!this.getBoundMarker('labels'); + + for (i = start; i <= end; i++) { + yLow = dataStartY ? dataStartY[i] : 0; + yHi = dataY[i]; + + center = dataX[i] * xx + dx + groupOffset * (barWidth + inGroupGapWidth); + left = surface.roundPixel(center - barWidth / 2) + halfLineWidth; + top = surface.roundPixel(yHi * yy + lineWidth + dy); + right = surface.roundPixel(center + barWidth / 2) - halfLineWidth; + bottom = surface.roundPixel(yLow * yy + lineWidth + dy); + + me.drawBar(ctx, surface, clip, left, top - halfLineWidth, right, bottom - halfLineWidth, i); + + if (drawMarkers && dataText[i]) { + me.drawLabel(dataText[i], center, bottom, top, i); + } + me.putMarker('markers', { + translationX: surfaceMatrix.x(center, top), + translationY: surfaceMatrix.y(center, top) + }, i, true); + } + }, + + //@inheritdoc + getIndexNearPoint: function (x, y) { + var sprite = this, + attr = sprite.attr, + dataX = attr.dataX, + surface = sprite.getParent(), + surfaceRegion = surface.getRegion(), + surfaceHeight = surfaceRegion[3], + hitX, hitY, index = -1; + + // The "items" sprites that draw the bars work in a reverse vertical coordinate system + // starting with 0 at the bottom and increasing the Y coordinate toward the top. + // See also Ext.chart.series.Bar.getItemForPoint(x,y) regarding the chart's InnerPadding. + // + // TODO: Cleanup the bar sprites. + if (attr.flipXY) { + hitX = surfaceHeight - y; + hitY = x; + } else { + hitX = x; + hitY = surfaceHeight - y; + } + + for (var i = 0; i < dataX.length; i++) { + var bbox = sprite.getMarkerBBox('items', i); + if (bbox && hitX >= bbox.x && hitX <= (bbox.x + bbox.width) && hitY >= bbox.y && hitY <= (bbox.y + bbox.height)) { + index = i; + } + } + return index; + } + +}); + +/** + * @class Ext.chart.series.Bar + * @extends Ext.chart.series.StackedCartesian + * + * Creates a Bar Chart. + * + * @example preview + * var chart = new Ext.chart.Chart({ + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':'metric one', 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':'metric two', 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':'metric three', 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':'metric four', 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':'metric five', 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * axes: [{ + * type: 'numeric', + * position: 'left', + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * fields: 'data1' + * }, { + * type: 'category', + * position: 'bottom', + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * fields: 'name' + * }], + * series: [{ + * type: 'bar', + * xField: 'name', + * yField: 'data1', + * style: { + * fill: 'blue' + * } + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + */ +Ext.define('Ext.chart.series.Bar', { + + extend: Ext.chart.series.StackedCartesian , + + alias: 'series.bar', + type: 'bar', + seriesType: 'barSeries', + + + + + + + config: { + /** + * @private + * @cfg {Object} itemInstancing Sprite template used for series. + */ + itemInstancing: { + type: 'rect', + fx: { + customDuration: { + x: 0, + y: 0, + width: 0, + height: 0, + radius: 0 + } + } + } + }, + + getItemForPoint: function (x, y) { + if (this.getSprites()) { + var me = this, + chart = me.getChart(), + padding = chart.getInnerPadding(); + + // Convert the coordinates because the "items" sprites that draw the bars ignore the chart's InnerPadding. + // See also Ext.chart.series.sprite.Bar.getItemForPoint(x,y) regarding the series's vertical coordinate system. + // + // TODO: Cleanup the bar sprites. + arguments[0] = x - padding.left; + arguments[1] = y + padding.bottom; + return me.callParent(arguments); + } + }, + + updateXAxis: function (axis) { + axis.setLabelInSpan(true); + this.callSuper(arguments); + }, + + updateHidden: function (hidden) { + this.callParent(arguments); + this.updateStacked(); + }, + + updateStacked: function (stacked) { + var sprites = this.getSprites(), + ln = sprites.length, + visible = [], + attrs = {}, i; + + for (i = 0; i < ln; i++) { + if (!sprites[i].attr.hidden) { + visible.push(sprites[i]); + } + } + ln = visible.length; + + if (this.getStacked()) { + attrs.groupCount = 1; + attrs.groupOffset = 0; + for (i = 0; i < ln; i++) { + visible[i].setAttributes(attrs); + } + } else { + attrs.groupCount = visible.length; + for (i = 0; i < ln; i++) { + attrs.groupOffset = i; + visible[i].setAttributes(attrs); + } + } + this.callSuper(arguments); + } +}); + +/** + * Limited cache is a size limited cache container that stores limited number of objects. + * + * When {@link #get} is called, the container will try to find the object in the list. + * If failed it will call the {@link #feeder} to create that object. If there are too many + * objects in the container, the old ones are removed. + * + * __Note:__ This is not using a Least Recently Used policy due to simplicity and performance consideration. + */ +Ext.define("Ext.draw.LimitedCache", { + config: { + /** + * @cfg {Number} + * The amount limit of the cache. + */ + limit: 40, + + /** + * @cfg {Function} + * Function that generates the object when look-up failed. + * @return {Number} + */ + feeder: function () { + return 0; + }, + + /** + * @cfg {Object} + * The scope for {@link #feeder} + */ + scope: null + }, + cache: null, + + constructor: function (config) { + this.cache = {}; + this.cache.list = []; + this.cache.tail = 0; + this.initConfig(config); + }, + + /** + * Get a cached object. + * @param {String} id + * @param {Mixed...} args Arguments appended to feeder. + * @return {Object} + */ + get: function (id) { + // TODO: Implement cache hit optimization + var cache = this.cache, + limit = this.getLimit(), + feeder = this.getFeeder(), + scope = this.getScope() || this; + + if (cache[id]) { + return cache[id].value; + } + if (cache.list[cache.tail]) { + delete cache[cache.list[cache.tail].cacheId]; + } + cache[id] = cache.list[cache.tail] = { + value: feeder.apply(scope, Array.prototype.slice.call(arguments, 1)), + cacheId: id + }; + cache.tail++; + if (cache.tail === limit) { + cache.tail = 0; + } + return cache[id].value; + }, + + /** + * Clear all the objects. + */ + clear: function () { + this.cache = {}; + this.cache.list = []; + this.cache.tail = 0; + } +}); + +/** + * This class we summarize the data and returns it when required. + */ +Ext.define("Ext.draw.SegmentTree", { + + config: { + strategy: "double" + }, + + /** + * @private + * @param {Object} result + * @param {Number} last + * @param {Number} dataX + * @param {Number} dataOpen + * @param {Number} dataHigh + * @param {Number} dataLow + * @param {Number} dataClose + */ + time: function (result, last, dataX, dataOpen, dataHigh, dataLow, dataClose) { + var start = 0, lastOffset, lastOffsetEnd, + minimum = new Date(dataX[result.startIdx[0]]), + maximum = new Date(dataX[result.endIdx[last - 1]]), + extDate = Ext.Date, + units = [ + [extDate.MILLI, 1, 'ms1', null], + [extDate.MILLI, 2, 'ms2', 'ms1'], + [extDate.MILLI, 5, 'ms5', 'ms1'], + [extDate.MILLI, 10, 'ms10', 'ms5'], + [extDate.MILLI, 50, 'ms50', 'ms10'], + [extDate.MILLI, 100, 'ms100', 'ms50'], + [extDate.MILLI, 500, 'ms500', 'ms100'], + [extDate.SECOND, 1, 's1', 'ms500'], + [extDate.SECOND, 10, 's10', 's1'], + [extDate.SECOND, 30, 's30', 's10'], + [extDate.MINUTE, 1, 'mi1', 's10'], + [extDate.MINUTE, 5, 'mi5', 'mi1'], + [extDate.MINUTE, 10, 'mi10', 'mi5'], + [extDate.MINUTE, 30, 'mi30', 'mi10'], + [extDate.HOUR, 1, 'h1', 'mi30'], + [extDate.HOUR, 6, 'h6', 'h1'], + [extDate.HOUR, 12, 'h12', 'h6'], + [extDate.DAY, 1, 'd1', 'h12'], + [extDate.DAY, 7, 'd7', 'd1'], + [extDate.MONTH, 1, 'mo1', 'd1'], + [extDate.MONTH, 3, 'mo3', 'mo1'], + [extDate.MONTH, 6, 'mo6', 'mo3'], + [extDate.YEAR, 1, 'y1', 'mo3'], + [extDate.YEAR, 5, 'y5', 'y1'], + [extDate.YEAR, 10, 'y10', 'y5'], + [extDate.YEAR, 100, 'y100', 'y10'] + ], unitIdx, currentUnit, + plainStart = start, + plainEnd = last, + first = false, + startIdxs = result.startIdx, + endIdxs = result.endIdx, + minIdxs = result.minIdx, + maxIdxs = result.maxIdx, + opens = result.open, + closes = result.close, + minXs = result.minX, + minYs = result.minY, + maxXs = result.maxX, + maxYs = result.maxY, + i, current; + + for (unitIdx = 0; last > start + 1 && unitIdx < units.length; unitIdx++) { + minimum = new Date(dataX[startIdxs[0]]); + currentUnit = units[unitIdx]; + minimum = extDate.align(minimum, currentUnit[0], currentUnit[1]); + if (extDate.diff(minimum, maximum, currentUnit[0]) > dataX.length * 2 * currentUnit[1]) { + continue; + } + if (currentUnit[3] && result.map['time_' + currentUnit[3]]) { + lastOffset = result.map['time_' + currentUnit[3]][0]; + lastOffsetEnd = result.map['time_' + currentUnit[3]][1]; + } else { + lastOffset = plainStart; + lastOffsetEnd = plainEnd; + } + + start = last; + current = minimum; + first = true; + + startIdxs[last] = startIdxs[lastOffset]; + endIdxs[last] = endIdxs[lastOffset]; + minIdxs[last] = minIdxs[lastOffset]; + maxIdxs[last] = maxIdxs[lastOffset]; + opens[last] = opens[lastOffset]; + closes[last] = closes[lastOffset]; + minXs[last] = minXs[lastOffset]; + minYs[last] = minYs[lastOffset]; + maxXs[last] = maxXs[lastOffset]; + maxYs[last] = maxYs[lastOffset]; + current = Ext.Date.add(current, currentUnit[0], currentUnit[1]); + + for (i = lastOffset + 1; i < lastOffsetEnd; i++) { + if (dataX[endIdxs[i]] < +current) { + endIdxs[last] = endIdxs[i]; + closes[last] = closes[i]; + if (maxYs[i] > maxYs[last]) { + maxYs[last] = maxYs[i]; + maxXs[last] = maxXs[i]; + maxIdxs[last] = maxIdxs[i]; + } + if (minYs[i] < minYs[last]) { + minYs[last] = minYs[i]; + minXs[last] = minXs[i]; + minIdxs[last] = minIdxs[i]; + } + } else { + last++; + startIdxs[last] = startIdxs[i]; + endIdxs[last] = endIdxs[i]; + minIdxs[last] = minIdxs[i]; + maxIdxs[last] = maxIdxs[i]; + opens[last] = opens[i]; + closes[last] = closes[i]; + minXs[last] = minXs[i]; + minYs[last] = minYs[i]; + maxXs[last] = maxXs[i]; + maxYs[last] = maxYs[i]; + current = Ext.Date.add(current, currentUnit[0], currentUnit[1]); + } + } + if (last > start) { + result.map['time_' + currentUnit[2]] = [start, last]; + } + } + }, + + /** + * @private + * @param {Object} result + * @param {Number} position + * @param {Number} dataX + * @param {Number} dataOpen + * @param {Number} dataHigh + * @param {Number} dataLow + * @param {Number} dataClose + */ + "double": function (result, position, dataX, dataOpen, dataHigh, dataLow, dataClose) { + var offset = 0, lastOffset, step = 1, + i, + startIdx, + endIdx, + minIdx, + maxIdx, + open, + close, + minX, + minY, + maxX, + maxY; + while (position > offset + 1) { + lastOffset = offset; + offset = position; + step += step; + for (i = lastOffset; i < offset; i += 2) { + if (i === offset - 1) { + startIdx = result.startIdx[i]; + endIdx = result.endIdx[i]; + minIdx = result.minIdx[i]; + maxIdx = result.maxIdx[i]; + open = result.open[i]; + close = result.close[i]; + minX = result.minX[i]; + minY = result.minY[i]; + maxX = result.maxX[i]; + maxY = result.maxY[i]; + } else { + + startIdx = result.startIdx[i]; + endIdx = result.endIdx[i + 1]; + open = result.open[i]; + close = result.close[i]; + if (result.minY[i] <= result.minY[i + 1]) { + minIdx = result.minIdx[i]; + minX = result.minX[i]; + minY = result.minY[i]; + } else { + minIdx = result.minIdx[i + 1]; + minX = result.minX[i + 1]; + minY = result.minY[i + 1]; + } + if (result.maxY[i] >= result.maxY[i + 1]) { + maxIdx = result.maxIdx[i]; + maxX = result.maxX[i]; + maxY = result.maxY[i]; + } else { + maxIdx = result.maxIdx[i + 1]; + maxX = result.maxX[i + 1]; + maxY = result.maxY[i + 1]; + } + } + result.startIdx[position] = startIdx; + result.endIdx[position] = endIdx; + result.minIdx[position] = minIdx; + result.maxIdx[position] = maxIdx; + result.open[position] = open; + result.close[position] = close; + result.minX[position] = minX; + result.minY[position] = minY; + result.maxX[position] = maxX; + result.maxY[position] = maxY; + position++; + } + result.map['double_' + step] = [offset, position]; + } + }, + + /** + * @private + */ + none: Ext.emptyFn, + + /** + * @private + * + * @param {Number} dataX + * @param {Number} dataOpen + * @param {Number} dataHigh + * @param {Number} dataLow + * @param {Number} dataClose + * @return {Object} + */ + aggregateData: function (dataX, dataOpen, dataHigh, dataLow, dataClose) { + var length = dataX.length, + startIdx = [], + endIdx = [], + minIdx = [], + maxIdx = [], + open = [], + minX = [], + minY = [], + maxX = [], + maxY = [], + close = [], + result = { + startIdx: startIdx, + endIdx: endIdx, + minIdx: minIdx, + maxIdx: maxIdx, + open: open, + minX: minX, + minY: minY, + maxX: maxX, + maxY: maxY, + close: close + }, + i; + + for (i = 0; i < length; i++) { + startIdx[i] = i; + endIdx[i] = i; + minIdx[i] = i; + maxIdx[i] = i; + open[i] = dataOpen[i]; + minX[i] = dataX[i]; + minY[i] = dataLow[i]; + maxX[i] = dataX[i]; + maxY[i] = dataHigh[i]; + close[i] = dataClose[i]; + } + + result.map = { + original: [0, length] + }; + if (length) { + this[this.getStrategy()](result, length, dataX, dataOpen, dataHigh, dataLow, dataClose); + } + return result; + }, + + /** + * @private + * @param {Object} items + * @param {Number} start + * @param {Number} end + * @param {Number} key + * @return {*} + */ + binarySearchMin: function (items, start, end, key) { + var dx = this.dataX; + if (key <= dx[items.startIdx[0]]) { + return start; + } + if (key >= dx[items.startIdx[end - 1]]) { + return end - 1; + } + while (start + 1 < end) { + var mid = (start + end) >> 1, + val = dx[items.startIdx[mid]]; + if (val === key) { + return mid; + } else if (val < key) { + start = mid; + } else { + end = mid; + } + } + return start; + }, + + /** + * @private + * @param {Object} items + * @param {Number} start + * @param {Number} end + * @param {Number} key + * @return {*} + */ + binarySearchMax: function (items, start, end, key) { + var dx = this.dataX; + if (key <= dx[items.endIdx[0]]) { + return start; + } + if (key >= dx[items.endIdx[end - 1]]) { + return end - 1; + } + while (start + 1 < end) { + var mid = (start + end) >> 1, + val = dx[items.endIdx[mid]]; + if (val === key) { + return mid; + } else if (val < key) { + start = mid; + } else { + end = mid; + } + } + return end; + }, + + constructor: function (config) { + this.initConfig(config); + }, + + /** + * Sets the data of the segment tree. + * @param {Number} dataX + * @param {Number} dataOpen + * @param {Number} dataHigh + * @param {Number} dataLow + * @param {Number} dataClose + */ + setData: function (dataX, dataOpen, dataHigh, dataLow, dataClose) { + if (!dataHigh) { + dataClose = dataLow = dataHigh = dataOpen; + } + this.dataX = dataX; + this.dataOpen = dataOpen; + this.dataHigh = dataHigh; + this.dataLow = dataLow; + this.dataClose = dataClose; + if (dataX.length === dataHigh.length && + dataX.length === dataLow.length) { + this.cache = this.aggregateData(dataX, dataOpen, dataHigh, dataLow, dataClose); + } + }, + + /** + * Returns the minimum range of data that fits the given range and step size. + * + * @param {Number} min + * @param {Number} max + * @param {Number} estStep + * @return {Object} The aggregation information. + * @return {Number} return.start + * @return {Number} return.end + * @return {Object} return.data The aggregated data + */ + getAggregation: function (min, max, estStep) { + if (!this.cache) { + return null; + } + var minStep = Infinity, + range = this.dataX[this.dataX.length - 1] - this.dataX[0], + cacheMap = this.cache.map, + result = cacheMap.original, + name, positions, ln, step, minIdx, maxIdx; + + for (name in cacheMap) { + positions = cacheMap[name]; + ln = positions[1] - positions[0] - 1; + step = range / ln; + if (estStep <= step && step < minStep) { + result = positions; + minStep = step; + } + } + minIdx = Math.max(this.binarySearchMin(this.cache, result[0], result[1], min), result[0]); + maxIdx = Math.min(this.binarySearchMax(this.cache, result[0], result[1], max) + 1, result[1]); + return { + data: this.cache, + start: minIdx, + end: maxIdx + }; + } +}); + +/** + * + */ +Ext.define('Ext.chart.series.sprite.Aggregative', { + extend: Ext.chart.series.sprite.Cartesian , + + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Object} [dataHigh=null] Data items representing the high values of the aggregated data. + */ + dataHigh: 'data', + + /** + * @cfg {Object} [dataLow=null] Data items representing the low values of the aggregated data. + */ + dataLow: 'data', + + /** + * @cfg {Object} [dataClose=null] Data items representing the closing values of the aggregated data. + */ + dataClose: 'data' + }, + aliases: { + /** + * @cfg {Object} [dataOpen=null] Data items representing the opening values of the aggregated data. + */ + dataOpen: 'dataY' + }, + defaults: { + dataHigh: null, + dataLow: null, + dataClose: null + } + } + }, + + config: { + aggregator: {} + }, + + applyAggregator: function (aggregator, oldAggr) { + return Ext.factory(aggregator, Ext.draw.SegmentTree, oldAggr); + }, + + constructor: function () { + this.callSuper(arguments); + }, + + processDataY: function () { + var me = this, + attr = me.attr, + high = attr.dataHigh, + low = attr.dataLow, + close = attr.dataClose, + open = attr.dataY; + me.callSuper(arguments); + if (attr.dataX && open && open.length > 0) { + if (high) { + me.getAggregator().setData(attr.dataX, attr.dataY, high, low, close); + } else { + me.getAggregator().setData(attr.dataX, attr.dataY); + } + } + }, + + getGapWidth: function () { + return 1; + }, + + renderClipped: function (surface, ctx, clip, region) { + var me = this, + aggregates = me.getAggregator() && me.getAggregator().getAggregation( + clip[0], + clip[2], + (clip[2] - clip[0]) / region[2] * me.getGapWidth() + ); + if (aggregates) { + me.dataStart = aggregates.data.startIdx[aggregates.start]; + me.dataEnd = aggregates.data.endIdx[aggregates.end - 1]; + + me.renderAggregates(aggregates.data, aggregates.start, aggregates.end, surface, ctx, clip, region); + } + } +}); + +/** + * @class Ext.chart.series.sprite.CandleStick + * @extends Ext.chart.series.sprite.Aggregative + * + * CandleStick series sprite. + */ +Ext.define('Ext.chart.series.sprite.CandleStick', { + alias: 'sprite.candlestickSeries', + extend: Ext.chart.series.sprite.Aggregative , + inheritableStatics: { + def: { + processors: { + raiseStyle: function (n, o) { + return Ext.merge({}, o || {}, n); + }, + dropStyle: function (n, o) { + return Ext.merge({}, o || {}, n); + }, + + /** + * @cfg {Number} [barWidth=15] The bar width of the candles. + */ + barWidth: 'number', + + /** + * @cfg {Number} [padding=3] The amount of padding between candles. + */ + padding: 'number', + + /** + * @cfg {String} [ohlcType='candlestick'] Determines whether candlestick or ohlc is used. + */ + ohlcType: 'enums(candlestick,ohlc)' + }, + defaults: { + raiseStyle: { + strokeStyle: 'green', + fillStyle: 'green' + }, + dropStyle: { + strokeStyle: 'red', + fillStyle: 'red' + }, + planar: false, + barWidth: 15, + padding: 3, + lineJoin: 'miter', + miterLimit: 5, + ohlcType: 'candlestick' + }, + + dirtyTriggers: { + raiseStyle: 'raiseStyle', + dropStyle: 'dropStyle' + }, + + updaters: { + raiseStyle: function () { + this.raiseTemplate && this.raiseTemplate.setAttributes(this.attr.raiseStyle); + }, + dropStyle: function () { + this.dropTemplate && this.dropTemplate.setAttributes(this.attr.dropStyle); + } + } + } + }, + + candlestick: function (ctx, open, high, low, close, mid, halfWidth) { + var minOC = Math.min(open, close), + maxOC = Math.max(open, close); + ctx.moveTo(mid, low); + ctx.lineTo(mid, maxOC); + + ctx.moveTo(mid + halfWidth, maxOC); + ctx.lineTo(mid + halfWidth, minOC); + ctx.lineTo(mid - halfWidth, minOC); + ctx.lineTo(mid - halfWidth, maxOC); + ctx.closePath(); + + ctx.moveTo(mid, high); + ctx.lineTo(mid, minOC); + }, + + ohlc: function (ctx, open, high, low, close, mid, halfWidth) { + ctx.moveTo(mid, high); + ctx.lineTo(mid, low); + ctx.moveTo(mid, open); + ctx.lineTo(mid - halfWidth, open); + ctx.moveTo(mid, close); + ctx.lineTo(mid + halfWidth, close); + }, + + constructor: function () { + this.callSuper(arguments); + this.raiseTemplate = new Ext.draw.sprite.Rect({parent: this}); + this.dropTemplate = new Ext.draw.sprite.Rect({parent: this}); + }, + + getGapWidth: function () { + var attr = this.attr, + barWidth = attr.barWidth, + padding = attr.padding; + return barWidth + padding; + }, + + renderAggregates: function (aggregates, start, end, surface, ctx, clip, region) { + var me = this, + attr = this.attr, + dataX = attr.dataX, + matrix = attr.matrix, + xx = matrix.getXX(), + yy = matrix.getYY(), + dx = matrix.getDX(), + dy = matrix.getDY(), + barWidth = attr.barWidth / xx, + template, + ohlcType = attr.ohlcType, + halfWidth = Math.round(barWidth * 0.5 * xx), + opens = aggregates.open, + highs = aggregates.high, + lows = aggregates.low, + closes = aggregates.close, + maxYs = aggregates.maxY, + minYs = aggregates.minY, + startIdxs = aggregates.startIdx, + open, high, low, close, mid, + i, + pixelAdjust = attr.lineWidth * surface.devicePixelRatio / 2; + + pixelAdjust -= Math.floor(pixelAdjust); + ctx.save(); + template = this.raiseTemplate; + template.useAttributes(ctx); + ctx.beginPath(); + for (i = start; i < end; i++) { + if (opens[i] <= closes[i]) { + open = Math.round(opens[i] * yy + dy) + pixelAdjust; + high = Math.round(maxYs[i] * yy + dy) + pixelAdjust; + low = Math.round(minYs[i] * yy + dy) + pixelAdjust; + close = Math.round(closes[i] * yy + dy) + pixelAdjust; + mid = Math.round(dataX[startIdxs[i]] * xx + dx) + pixelAdjust; + me[ohlcType](ctx, open, high, low, close, mid, halfWidth); + } + } + ctx.fillStroke(template.attr); + ctx.restore(); + + ctx.save(); + template = this.dropTemplate; + template.useAttributes(ctx); + ctx.beginPath(); + for (i = start; i < end; i++) { + if (opens[i] > closes[i]) { + open = Math.round(opens[i] * yy + dy) + pixelAdjust; + high = Math.round(maxYs[i] * yy + dy) + pixelAdjust; + low = Math.round(minYs[i] * yy + dy) + pixelAdjust; + close = Math.round(closes[i] * yy + dy) + pixelAdjust; + mid = Math.round(dataX[startIdxs[i]] * xx + dx) + pixelAdjust; + me[ohlcType](ctx, open, high, low, close, mid, halfWidth); + } + } + ctx.fillStroke(template.attr); + ctx.restore(); + } +}); + +/** + * @class Ext.chart.series.CandleStick + * @extends Ext.chart.series.Cartesian + * + * Creates a candlestick or OHLC Chart. + * + * @example preview + * var chart = new Ext.chart.CartesianChart({ + * animate: true, + * store: { + * fields: ['time', 'open', 'high', 'low', 'close'], + * data: [ + * {'time':new Date('Jan 1 2010').getTime(), 'open':600, 'high':614, 'low':578, 'close':590}, + * {'time':new Date('Jan 2 2010').getTime(), 'open':590, 'high':609, 'low':580, 'close':580}, + * {'time':new Date('Jan 3 2010').getTime(), 'open':580, 'high':602, 'low':578, 'close':602}, + * {'time':new Date('Jan 4 2010').getTime(), 'open':602, 'high':614, 'low':586, 'close':586}, + * {'time':new Date('Jan 5 2010').getTime(), 'open':586, 'high':602, 'low':565, 'close':565} + * ] + * }, + * axes: [{ + * type: 'numeric', + * position: 'left', + * fields: ['open', 'high', 'low', 'close'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * grid: true, + * minimum: 560, + * maximum: 640 + * }, { + * type: 'time', + * position: 'bottom', + * fields: ['time'], + * fromDate: new Date('Dec 31 2009'), + * toDate: new Date('Jan 6 2010'), + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * style: { + * axisLine: false + * } + * }], + * series: [{ + * type: 'candlestick', + * xField: 'time', + * openField: 'open', + * highField: 'high', + * lowField: 'low', + * closeField: 'close', + * style: { + * dropStyle: { + * fill: 'rgb(237, 123, 43)', + * stroke: 'rgb(237, 123, 43)' + * }, + * raiseStyle: { + * fill: 'rgb(55, 153, 19)', + * stroke: 'rgb(55, 153, 19)' + * } + * }, + * aggregator: { + * strategy: 'time' + * } + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + */ +Ext.define('Ext.chart.series.CandleStick', { + extend: Ext.chart.series.Cartesian , + + alias: 'series.candlestick', + type: 'candlestick', + seriesType: 'candlestickSeries', + config: { + /** + * @cfg {String} openField + * The store record field name that represents the opening value of the given period. + */ + openField: null, + /** + * @cfg {String} highField + * The store record field name that represents the highest value of the time interval represented. + */ + highField: null, + /** + * @cfg {String} lowField + * The store record field name that represents the lowest value of the time interval represented. + */ + lowField: null, + /** + * @cfg {String} closeField + * The store record field name that represents the closing value of the given period. + */ + closeField: null + }, + + fieldCategoryY: ['Open', 'High', 'Low', 'Close'] +}); + +/** + * @class Ext.chart.series.Gauge + * @extends Ext.chart.series.Series + * + * Creates a Gauge Chart. + * + * @example preview + * var chart = new Ext.chart.SpaceFillingChart({ + * series: [{ + * type: 'gauge', + * minimum: 100, + * maximum: 800, + * value: 400, + * donut: 30, + * colors: ["#115fa6", "lightgrey"] + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + */ +Ext.define('Ext.chart.series.Gauge', { + alias: 'series.gauge', + extend: Ext.chart.series.Series , + type: "gauge", + seriesType: 'pieslice', + + + + + + config: { + /** + * @cfg {String} angleField + * @deprecated Use `field` directly + * The store record field name to be used for the gauge angles. + * The values bound to this field name must be positive real numbers. + */ + angleField: null, + + /** + * @cfg {String} field + * The store record field name to be used for the gauge value. + * The values bound to this field name must be positive real numbers. + */ + field: null, + + /** + * @cfg {Boolean} needle + * If true, display the gauge as a needle, otherwise as a sector. + */ + needle: false, + + /** + * @cfg {Number} needleLengthRatio + * @deprecated Use `needleLength` directly + * Ratio of the length of needle compared to the radius of the entire disk. + */ + needleLengthRatio: undefined, + + /** + * @cfg {Number} needleLength + * Percentage of the length of needle compared to the radius of the entire disk. + */ + needleLength: 90, + + /** + * @cfg {Number} needleWidth + * Width of the needle in pixels. + */ + needleWidth: 4, + + /** + * @cfg {Number} donut + * Percentage of the radius of the donut hole compared to the entire disk. + */ + donut: 30, + + /** + * @cfg {Boolean} showInLegend + * Whether to add the gauge chart elements as legend items. + */ + showInLegend: false, + + /** + * @cfg {Number} value + * Directly sets the displayed value of the gauge. + * It is ignored if {@link #field} is provided. + */ + value: null, + + /** + * @cfg {Array} colors (required) + * An array of color values which is used for the needle and the `sectors`. + */ + colors: null, + + /** + * @cfg {Array} sectors + * Allows to paint sectors of different colors in the background of the gauge, + * with optional labels. + * + * It can be an array of numbers (each between `minimum` and `maximum`) that + * define the highest value of each sector. For N sectors, only (N-1) values are + * needed because it is assumed that the first sector starts at `minimum` and the + * last sector ends at `maximum`. Example: a water temperature gauge that is blue + * below 20C, red above 80C, gray in-between, and with an orange needle... + * + * minimum: 0, + * maximum: 100, + * sectors: [20, 80], + * colors: ['orange', 'blue', 'lightgray', 'red'] + * + * It can be also an array of objects, each with the following properties: + * + * @cfg {Number} sectors.start The starting value of the sector. If omitted, it + * uses the previous sector's `end` value or the chart's `minimum`. + * @cfg {Number} sectors.end The ending value of the sector. If omitted, it uses + * the `maximum` defined for the chart. + * @cfg {String} sectors.label The label for this sector. Labels are styled using + * the series' {@link Ext.chart.series.Series#label label} config. + * @cfg {String} sectors.color The color of the sector. If omitted, it uses one + * of the `colors` defined for the series or for the chart. + * @cfg {Object} sectors.style An additional style object for the sector (for + * instance to set the opacity or to draw a line of a different color around the + * sector). + * + * minimum: 0, + * maximum: 100, + * sectors: [{ + * end: 20, + * label: 'Cold', + * color: 'aqua' + * }, + * { + * end: 80, + * label: 'Temp.', + * color: 'lightgray', + * style: { strokeStyle:'black', strokeOpacity:1, lineWidth:1 } + * }, + * { + * label: 'Hot', + * color: 'tomato' + * }] + */ + sectors: null, + + /** + * @cfg {Number} minimum + * The minimum value of the gauge. + */ + minimum: 0, + + /** + * @cfg {Number} maximum + * The maximum value of the gauge. + */ + maximum: 100, + + rotation: 0, + + /** + * @cfg {Number} totalAngle + * The size of the sector that the series will occupy. + */ + totalAngle: Math.PI / 2, + + region: [0, 0, 1, 1], + + center: [0.5, 0.75], + + radius: 0.5, + + /** + * @cfg {Boolean} wholeDisk Indicates whether to show the whole disk or only the marked part. + */ + wholeDisk: false + }, + + updateNeedle: function(needle) { + var me = this, + sprites = me.getSprites(), + angle = me.valueToAngle(me.getValue()); + + if (sprites && sprites.length) { + sprites[0].setAttributes({ + startAngle: (needle ? angle : 0), + endAngle: angle, + strokeOpacity: (needle ? 1 : 0), + lineWidth: (needle ? me.getNeedleWidth() : 0) + + }); + me.doUpdateStyles(); + } + }, + + updateColors: function (colors, oldColors) { + var me = this, + sectors = me.getSectors(), + sectorCount = sectors && sectors.length, + sprites = me.getSprites(), + spriteCount = sprites && sprites.length, + newColors = Ext.Array.clone(colors), + colorCount = colors && colors.length, + needle = me.getNeedle(), + i; + + if (!colorCount || !colors[0]) { + return; + } + + // Make sure the 'sectors' colors are not overridden. + for (i = 0; i < sectorCount; i++) { + newColors[i+1] = sectors[i].color || newColors[i+1] || colors[i%colorCount]; + } + + sprites[0].setAttributes({stroke:newColors[0]}); + this.setSubStyle({color:newColors}); + this.doUpdateStyles(); + }, + + updateAngleField: function (angleField) { + this.setField(angleField); + }, + + updateNeedleLengthRatio: function (needleLengthRatio) { + this.setNeedleLength(needleLengthRatio * 100); + }, + + updateRegion: function (region) { + var wholeDisk = this.getWholeDisk(), + halfTotalAngle = wholeDisk ? Math.PI : this.getTotalAngle() / 2, + donut = this.getDonut() / 100, + width, height, radius; + if (halfTotalAngle <= Math.PI / 2) { + width = 2 * Math.sin(halfTotalAngle); + height = 1 - donut * Math.cos(halfTotalAngle); + } else { + width = 2; + height = 1 - Math.cos(halfTotalAngle); + } + + radius = Math.min(region[2] / width, region[3] / height); + this.setRadius(radius); + this.setCenter([region[2] / 2, radius + (region[3] - height * radius) / 2]); + }, + + updateCenter: function (center) { + this.setStyle({ + centerX: center[0], + centerY: center[1], + rotationCenterX: center[0], + rotationCenterY: center[1] + }); + this.doUpdateStyles(); + }, + + updateRotation: function (rotation) { + this.setStyle({ + rotationRads: rotation - (this.getTotalAngle() + Math.PI) / 2 + }); + this.doUpdateStyles(); + }, + + doUpdateShape: function (radius, donut) { + var endRhoArray, + sectors = this.getSectors(), + sectorCount = (sectors && sectors.length) || 0, + needleLength = this.getNeedleLength() / 100; + + // Initialize an array that contains the endRho for each sprite. + // The first sprite is for the needle, the others for the gauge background sectors. + // Note: SubStyle arrays are handled in series.getOverriddenStyleByIndex(). + endRhoArray = [radius * needleLength, radius]; + while (sectorCount --) { + endRhoArray.push(radius); + } + + this.setSubStyle({ + endRho: endRhoArray, + startRho: radius / 100 * donut + }); + this.doUpdateStyles(); + }, + + updateRadius: function (radius) { + var donut = this.getDonut(); + this.doUpdateShape(radius, donut); + }, + + updateDonut: function (donut) { + var radius = this.getRadius(); + this.doUpdateShape(radius, donut); + }, + + valueToAngle: function(value) { + value = this.applyValue(value); + return this.getTotalAngle() * (value - this.getMinimum()) / (this.getMaximum() - this.getMinimum()); + }, + + applyValue: function (value) { + return Math.min(this.getMaximum(), Math.max(value, this.getMinimum())); + }, + + updateValue: function (value) { + var me = this, + needle = me.getNeedle(), + angle = me.valueToAngle(value), + sprites = me.getSprites(); + + sprites[0].rendererData.value = value; + sprites[0].setAttributes({ + startAngle: (needle ? angle : 0), + endAngle: angle + }); + me.doUpdateStyles(); + }, + + processData: function () { + var store = this.getStore(); + if (!store) { + return; + } + var field = this.getField(); + if (!field) { + return; + } + if (!store.getData().items.length) { + return; + } + this.setValue(store.getData().items[0].get(field)); + }, + + getDefaultSpriteConfig: function () { + return { + type: this.seriesType, + renderer: this.getRenderer(), + fx: { + customDuration: { + translationX: 0, + translationY: 0, + rotationCenterX: 0, + rotationCenterY: 0, + centerX: 0, + centerY: 0, + startRho: 0, + endRho: 0, + baseRotation: 0 + } + } + }; + }, + + normalizeSectors: function(sectors) { + // Make sure all the sectors in the array have a legit start and end. + // Note: the array is modified in-place. + var me = this, + sectorCount = (sectors && sectors.length) || 0, + i, value, start, end; + + if (sectorCount) { + for (i = 0; i < sectorCount; i++) { + value = sectors[i]; + if (typeof value == "number") { + sectors[i] = { + start: (i > 0 ? sectors[i-1].end : me.getMinimum()), + end: Math.min(value, me.getMaximum()) + }; + if (i == (sectorCount - 1) && sectors[i].end < me.getMaximum()) { + sectors[i+1] = { + start: sectors[i].end, + end: me.getMaximum() + }; + } + } else { + if (typeof value.start == "number") { + start = Math.max(value.start, me.getMinimum()); + } else { + start = (i > 0 ? sectors[i-1].end : me.getMinimum()); + } + if (typeof value.end == "number") { + end = Math.min(value.end, me.getMaximum()); + } else { + end = me.getMaximum(); + } + sectors[i].start = start; + sectors[i].end = end; + } + } + } else { + sectors = [{ + start: me.getMinimum(), + end: me.getMaximum() + }]; + } + return sectors; + }, + + getSprites: function () { + var me = this, + store = me.getStore(), + value = me.getValue(), + i, ln; + + // The store must be initialized, or the value must be set + if (!store && !Ext.isNumber(value)) { + return []; + } + + // Return cached sprites + var chart = me.getChart(), + animate = chart.getAnimate(), + sprites = me.sprites, + spriteIndex = 0, + sprite, sectors, attr, rendererData; + + if (sprites && sprites.length) { + sprites[0].fx.setConfig(animate); + return sprites; + } + + rendererData = { + store: store, + field: me.getField(), + value: value, + series: me + }; + + // Create needle sprite + sprite = me.createSprite(); + sprite.setAttributes({ + zIndex: 10 + }, true); + sprite.rendererData = rendererData; + sprite.rendererIndex = spriteIndex++; + + // Create background sprite(s) + me.getLabel().getTemplate().setField(true); // Enable labels + sectors = me.normalizeSectors(me.getSectors()); + for (i = 0, ln = sectors.length; i < ln; i++) { + attr = { + startAngle: me.valueToAngle(sectors[i].start), + endAngle: me.valueToAngle(sectors[i].end), + label: sectors[i].label, + fillStyle: sectors[i].color, + strokeOpacity: 0, + rotateLabels: false, + doCallout: false, // Show labels inside sectors. + labelOverflowPadding: -1 // Allow labels to overlap. + }; + Ext.apply(attr, sectors[i].style); + sprite = me.createSprite(); + sprite.rendererData = rendererData; + sprite.rendererIndex = spriteIndex++; + sprite.setAttributes(attr, true); + } + + // Make sure we have some default colors + var colors = me.getColors() || (chart && chart.config.colors); + if (!colors) { + me.setColors(['blue','lightgray']); + } + + me.doUpdateStyles(); + return sprites; + } +}); + + /** * @private */ @@ -64604,6 +85264,2748 @@ Ext.define('Ext.event.publisher.Publisher', { } }); +/** + * @private + */ +Ext.define('Ext.chart.series.ItemPublisher', { + extend: Ext.event.publisher.Publisher , + + targetType: 'series', + + handledEvents: [ + /** + * @event itemmousemove + * Fires when the mouse is moved on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemmousemove', + /** + * @event itemmouseup + * Fires when a mouseup event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemmouseup', + /** + * @event itemmousedown + * Fires when a mousedown event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemmousedown', + /** + * @event itemmouseover + * Fires when the mouse enters a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemmouseover', + /** + * @event itemmouseout + * Fires when the mouse exits a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemmouseout', + /** + * @event itemclick + * Fires when a click event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemclick', + /** + * @event itemdoubleclick + * Fires when a doubleclick event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemdoubleclick', + /** + * @event itemtap + * Fires when a tap event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemtap', + /** + * @event itemtapstart + * Fires when a tapstart event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemtapstart', + /** + * @event itemtapend + * Fires when a tapend event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemtapend', + /** + * @event itemtapcancel + * Fires when a tapcancel event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemtapcancel', + /** + * @event itemtaphold + * Fires when a taphold event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemtaphold', + /** + * @event itemdoubletap + * Fires when a doubletap event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemdoubletap', + /** + * @event itemsingletap + * Fires when a singletap event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemsingletap', + /** + * @event itemtouchstart + * Fires when a touchstart event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemtouchstart', + /** + * @event itemtouchmove + * Fires when a touchmove event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemtouchmove', + /** + * @event itemtouchend + * Fires when a touchend event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemtouchend', + /** + * @event itemdragstart + * Fires when a dragstart event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemdragstart', + /** + * @event itemdrag + * Fires when a drag event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemdrag', + /** + * @event itemdragend + * Fires when a dragend event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemdragend', + /** + * @event itempinchstart + * Fires when a pinchstart event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itempinchstart', + /** + * @event itempinch + * Fires when a pinch event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itempinch', + /** + * @event itempinchend + * Fires when a pinchend event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itempinchend', + /** + * @event itemswipe + * Fires when a swipe event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemswipe' + ], + + delegationRegex: /^item([a-z]+)$/i, + + getSubscribers: function (chartId) { + var subscribers = this.subscribers; + + if (!subscribers.hasOwnProperty(chartId)) { + subscribers[chartId] = {}; + } + + return subscribers[chartId]; + }, + + subscribe: function (target, eventName) { + var match = target.match(this.idSelectorRegex), + dispatcher = this.dispatcher, + targetType = this.targetType, + series, id; + + if (!match) { + return false; + } + + id = match[1]; + series = Ext.ComponentManager.get(id); + if (!series) { + return false; + } + + if (!series.getChart()) { + dispatcher.addListener(targetType, target, 'chartattached', 'attachChart', this, [series, eventName], 'before'); + } else { + this.attachChart(series.getChart(), [series, eventName]); + } + + return true; + }, + + attachChart: function (chart, args) { + var dispatcher = this.dispatcher, + targetType = this.targetType, + series = args[0], + eventName = args[1], + subscribers = this.getSubscribers(chart.getId()), + match = eventName.match(this.delegationRegex); + if (match) { + var chartEventName = match[1]; + if (!subscribers.hasOwnProperty(eventName)) { + subscribers[eventName] = []; + dispatcher.addListener(targetType, '#' + series.getId(), 'chartdetached', 'detachChart', this, [series, eventName, subscribers], 'after'); + chart.element.on(chartEventName, "relayMethod", this, [chart, eventName]); + } + subscribers[eventName].push(series); + return true; + } else { + return false; + } + }, + + unsubscribe: function (target, eventName) { + var match = target.match(this.idSelectorRegex), + dispatcher = this.dispatcher, + targetType = this.targetType, + series, id; + + if (!match) { + return false; + } + + id = match[1]; + series = Ext.ComponentManager.get(id); + if (!series) { + return false; + } + + dispatcher.removeListener(targetType, target, 'chartattached', 'attachChart', this, 'before'); + if (series.getChart()) { + this.detachChart(series.getChart(), [series, eventName]); + } + return true; + }, + + detachChart: function (chart, args) { + var dispatcher = this.dispatcher, + targetType = this.targetType, + series = args[0], + eventName = args[1], + subscribers = this.getSubscribers(chart.getId()), + match = eventName.match(this.delegationRegex), + index, seriesArray; + if (match) { + var chartEventName = match[1]; + if (subscribers.hasOwnProperty(eventName)) { + seriesArray = subscribers[eventName]; + index = seriesArray.indexOf(series); + if (index > -1) { + seriesArray.splice(index, 1); + } + if (seriesArray.length === 0) { + chart.element.un(chartEventName, "relayMethod", this, [chart, eventName]); + dispatcher.removeListener(targetType, '#' + series.getId(), 'chartdetached', 'detachChart', this, 'after'); + delete subscribers[eventName]; + } + } + } + }, + + relayMethod: function (e, sender, args) { + var chart = args[0], + eventName = args[1], + dispatcher = this.dispatcher, + targetType = this.targetType, + chartXY = chart.getEventXY(e), + x = chartXY[0], + y = chartXY[1], + subscriber = this.getSubscribers(chart.getId())[eventName], + i, ln; + if (subscriber) { + for (i = 0, ln = subscriber.length; i < ln; i++) { + var series = subscriber[i], + item = series.getItemForPoint(x, y); + if (item) { + // TODO: Don't stop at the first item. + // Depending on the selectionTolerance, there might be an item in another + // series that's closer to the event location. See test case 3943c. + dispatcher.doDispatchEvent(targetType, '#' + series.getId(), eventName, [series, item, e]); + return; + } + } + } + } + +}, function () { + +}); + +/** + * @class Ext.chart.series.sprite.Line + * @extends Ext.chart.series.sprite.Aggregative + * + * Line series sprite. + */ +Ext.define('Ext.chart.series.sprite.Line', { + alias: 'sprite.lineSeries', + extend: Ext.chart.series.sprite.Aggregative , + + inheritableStatics: { + def: { + processors: { + smooth: 'bool', + fillArea: 'bool', + step: 'bool', + preciseStroke: 'bool' + }, + + defaults: { + /** + * @cfg {Boolean} smooth 'true' if the sprite uses line smoothing. + */ + smooth: false, + + /** + * @cfg {Boolean} fillArea 'true' if the sprite paints the area underneath the line. + */ + fillArea: false, + + /** + * @cfg {Boolean} step 'true' if the line uses steps instead of straight lines to connect the dots. + * It is ignored if `smooth` is true. + */ + step: false, + + /** + * @cfg {Boolean} preciseStroke 'true' if the line uses precise stroke. + */ + preciseStroke: true + }, + + dirtyTriggers: { + dataX: 'dataX,bbox,smooth', + dataY: 'dataY,bbox,smooth', + smooth: 'smooth' + }, + + updaters: { + smooth: function (attr) { + if (attr.smooth && attr.dataX && attr.dataY && attr.dataX.length > 2 && attr.dataY.length > 2) { + this.smoothX = Ext.draw.Draw.spline(attr.dataX); + this.smoothY = Ext.draw.Draw.spline(attr.dataY); + } else { + delete this.smoothX; + delete this.smoothY; + } + } + } + } + }, + + list: null, + + updatePlainBBox: function (plain) { + var attr = this.attr, + ymin = Math.min(0, attr.dataMinY), + ymax = Math.max(0, attr.dataMaxY); + plain.x = attr.dataMinX; + plain.y = ymin; + plain.width = attr.dataMaxX - attr.dataMinX; + plain.height = ymax - ymin; + }, + + drawStroke: function (surface, ctx, start, end, list, xAxis) { + var attr = this.attr, + matrix = attr.matrix, + xx = matrix.getXX(), + yy = matrix.getYY(), + dx = matrix.getDX(), + dy = matrix.getDY(), + smooth = attr.smooth, + step = attr.step, + scale = Math.pow(2, power(attr.dataX.length, end)), + smoothX = this.smoothX, + smoothY = this.smoothY, + i, j, lineConfig, changes, + cx1, cy1, cx2, cy2, x, y, x0, y0, saveOpacity; + + function power(count, end) { + var power = 0, + n = count; + while (n > 0 && n < end) { + power++; + n += count >> power; + } + return power > 0 ? power - 1 : power; + } + + ctx.beginPath(); + if (smooth && smoothX && smoothY) { + ctx.moveTo(smoothX[start * 3] * xx + dx, smoothY[start * 3] * yy + dy); + for (i = 0, j = start * 3 + 1; i < list.length - 3; i += 3, j += 3 * scale) { + cx1 = smoothX[j] * xx + dx; + cy1 = smoothY[j] * yy + dy; + cx2 = smoothX[j + 1] * xx + dx; + cy2 = smoothY[j + 1] * yy + dy; + x = list[i + 3]; + y = list[i + 4]; + x0 = list[i]; + y0 = list[i + 1]; + if (attr.renderer) { + lineConfig = { + type: 'line', + smooth: true, + step: step, + cx1: cx1, + cy1: cy1, + cx2: cx2, + cy2: cy2, + x: x, + y: y, + x0: x0, + y0: y0 + }; + changes = attr.renderer.call(this, this, lineConfig, {store:this.getStore()}, (i/3 + 1)); + ctx.save(); + Ext.apply(ctx, changes); + // Fill the area if we need to, using the fill color and transparent strokes. + if (attr.fillArea) { + saveOpacity = ctx.strokeOpacity; + ctx.save(); + ctx.strokeOpacity = 0; + ctx.moveTo(x0, y0); + ctx.bezierCurveTo(cx1, cy1, cx2, cy2, x, y); + ctx.lineTo(x, xAxis); + ctx.lineTo(x0, xAxis); + ctx.lineTo(x0, y0); + ctx.closePath(); + ctx.fillStroke(attr, true); + ctx.restore(); + ctx.strokeOpacity = saveOpacity; + ctx.beginPath(); + } + // Draw the line on top of the filled area. + ctx.moveTo(x0, y0); + ctx.bezierCurveTo(cx1, cy1, cx2, cy2, x, y); + ctx.moveTo(x0, y0); + ctx.closePath(); + ctx.stroke(); + ctx.restore(); + ctx.beginPath(); + ctx.moveTo(x, y); + } else { + ctx.bezierCurveTo(cx1, cy1, cx2, cy2, x, y); + } + } + } else { + ctx.moveTo(list[0], list[1]); + for (i = 3; i < list.length; i += 3) { + x = list[i]; + y = list[i + 1]; + x0 = list[i - 3]; + y0 = list[i - 2]; + if (attr.renderer) { + lineConfig = { + type: 'line', + smooth: false, + step: step, + x: x, + y: y, + x0: x0, + y0: y0 + }; + changes = attr.renderer.call(this, this, lineConfig, {store:this.getStore()}, i/3); + ctx.save(); + Ext.apply(ctx, changes); + // Fill the area if we need to, using the fill color and transparent strokes. + if (attr.fillArea) { + saveOpacity = ctx.strokeOpacity; + ctx.save(); + ctx.strokeOpacity = 0; + if (step) { + ctx.lineTo(x, y0); + } else { + ctx.lineTo(x, y); + } + ctx.lineTo(x, xAxis); + ctx.lineTo(x0, xAxis); + ctx.lineTo(x0, y0); + ctx.closePath(); + ctx.fillStroke(attr, true); + ctx.restore(); + ctx.strokeOpacity = saveOpacity; + ctx.beginPath(); + } + // Draw the line (or the 2 lines if 'step') on top of the filled area. + ctx.moveTo(x0, y0); + if (step) { + ctx.lineTo(x, y0); + ctx.closePath(); + ctx.stroke(); + ctx.beginPath(); + ctx.moveTo(x, y0); + } + ctx.lineTo(x, y); + ctx.closePath(); + ctx.stroke(); + ctx.restore(); + ctx.beginPath(); + ctx.moveTo(x, y); + } else { + if (step) { + ctx.lineTo(x, y0); + } + ctx.lineTo(x, y); + } + } + } + }, + + drawLabel: function (text, dataX, dataY, labelId, region) { + var me = this, + attr = me.attr, + label = me.getBoundMarker('labels')[0], + labelTpl = label.getTemplate(), + labelCfg = me.labelCfg || (me.labelCfg = {}), + surfaceMatrix = me.surfaceMatrix, + labelX, labelY, + labelOverflowPadding = attr.labelOverflowPadding, + halfWidth, halfHeight, + labelBox, + changes; + + labelCfg.text = text; + + labelBox = this.getMarkerBBox('labels', labelId, true); + if (!labelBox) { + me.putMarker('labels', labelCfg, labelId); + labelBox = this.getMarkerBBox('labels', labelId, true); + } + + if (attr.flipXY) { + labelCfg.rotationRads = Math.PI * 0.5; + } else { + labelCfg.rotationRads = 0; + } + + halfWidth = labelBox.width / 2; + halfHeight = labelBox.height / 2; + + labelX = dataX; + if (labelTpl.attr.display === 'over') { + labelY = dataY + halfHeight + labelOverflowPadding; + } else { + labelY = dataY - halfHeight - labelOverflowPadding; + } + + if (labelX <= region[0] + halfWidth) { + labelX = region[0] + halfWidth; + } else if (labelX >= region[2] - halfWidth) { + labelX = region[2] - halfWidth; + } + + if (labelY <= region[1] + halfHeight) { + labelY = region[1] + halfHeight; + } else if (labelY >= region[3] - halfHeight) { + labelY = region[3] - halfHeight; + } + + labelCfg.x = surfaceMatrix.x(labelX, labelY); + labelCfg.y = surfaceMatrix.y(labelX, labelY); + + if (labelTpl.attr.renderer) { + changes = labelTpl.attr.renderer.call(this, text, label, labelCfg, {store: this.getStore()}, labelId); + if (typeof changes === 'string') { + labelCfg.text = changes; + } else { + Ext.apply(labelCfg, changes); + } + } + + me.putMarker('labels', labelCfg, labelId); + }, + + renderAggregates: function (aggregates, start, end, surface, ctx, clip, region) { + var me = this, + attr = me.attr, + dataX = attr.dataX, + dataY = attr.dataY, + labels = attr.labels, + drawLabels = labels && !!me.getBoundMarker('labels'), + matrix = attr.matrix, + surfaceMatrix = surface.matrix, + pixel = surface.devicePixelRatio, + xx = matrix.getXX(), + yy = matrix.getYY(), + dx = matrix.getDX(), + dy = matrix.getDY(), + markerCfg = {}, + list = this.list || (this.list = []), + x, y, i, index, + minXs = aggregates.minX, + maxXs = aggregates.maxX, + minYs = aggregates.minY, + maxYs = aggregates.maxY, + idx = aggregates.startIdx; + + list.length = 0; + for (i = start; i < end; i++) { + var minX = minXs[i], + maxX = maxXs[i], + minY = minYs[i], + maxY = maxYs[i]; + + if (minX < maxX) { + list.push(minX * xx + dx, minY * yy + dy, idx[i]); + list.push(maxX * xx + dx, maxY * yy + dy, idx[i]); + } else if (minX > maxX) { + list.push(maxX * xx + dx, maxY * yy + dy, idx[i]); + list.push(minX * xx + dx, minY * yy + dy, idx[i]); + } else { + list.push(maxX * xx + dx, maxY * yy + dy, idx[i]); + } + } + + if (list.length) { + for (i = 0; i < list.length; i += 3) { + x = list[i]; + y = list[i + 1]; + index = list[i + 2]; + if (attr.renderer) { + markerCfg = { + type: 'marker', + x: x, + y: y + }; + markerCfg = attr.renderer.call(this, this, markerCfg, {store:this.getStore()}, i/3) || {}; + } + markerCfg.translationX = surfaceMatrix.x(x, y); + markerCfg.translationY = surfaceMatrix.y(x, y); + me.putMarker('markers', markerCfg, index, !attr.renderer); + + if (drawLabels && labels[index]) { + me.drawLabel(labels[index], x, y, index, region); + } + } + me.drawStroke(surface, ctx, start, end, list, region[1] - pixel); + if (!attr.renderer) { + var lastPointX = dataX[dataX.length - 1] * xx + dx + pixel, + lastPointY = dataY[dataY.length - 1] * yy + dy, + bottomY = region[1] - pixel, + firstPointX = dataX[0] * xx + dx - pixel, + firstPointY = dataY[0] * yy + dy; + ctx.lineTo(lastPointX, lastPointY); + ctx.lineTo(lastPointX, bottomY); + ctx.lineTo(firstPointX, bottomY); + ctx.lineTo(firstPointX, firstPointY); + } + ctx.closePath(); + + if (attr.transformFillStroke) { + attr.matrix.toContext(ctx); + } + if (attr.preciseStroke) { + if (attr.fillArea) { + ctx.fill(); + } + if (attr.transformFillStroke) { + attr.inverseMatrix.toContext(ctx); + } + me.drawStroke(surface, ctx, start, end, list, region[1] - pixel); + if (attr.transformFillStroke) { + attr.matrix.toContext(ctx); + } + ctx.stroke(); + } else { + // Prevent the reverse transform to fix floating point err. + if (attr.fillArea) { + ctx.fillStroke(attr, true); + } else { + ctx.stroke(true); + } + } + } + } +}); + +/** + * @class Ext.chart.series.Line + * @extends Ext.chart.series.Cartesian + * + * Creates a Line Chart. A Line Chart is a useful visualization technique to display quantitative information for different + * categories or other real values (as opposed to the bar chart), that can show some progression (or regression) in the dataset. + * As with all other series, the Line Series must be appended in the *series* Chart array configuration. See the Chart + * documentation for more information. A typical configuration object for the line series could be: + * + * @example preview + * var lineChart = new Ext.chart.CartesianChart({ + * animate: true, + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':'metric one', 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':'metric two', 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':'metric three', 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':'metric four', 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':'metric five', 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * axes: [{ + * type: 'numeric', + * position: 'left', + * fields: ['data1'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * grid: true, + * minimum: 0 + * }, { + * type: 'category', + * position: 'bottom', + * fields: ['name'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * } + * }], + * series: [{ + * type: 'line', + * highlight: { + * size: 7, + * radius: 7 + * }, + * style: { + * stroke: 'rgb(143,203,203)' + * }, + * xField: 'name', + * yField: 'data1', + * marker: { + * type: 'path', + * path: ['M', -2, 0, 0, 2, 2, 0, 0, -2, 'Z'], + * stroke: 'blue', + * lineWidth: 0 + * } + * }, { + * type: 'line', + * highlight: { + * size: 7, + * radius: 7 + * }, + * fill: true, + * xField: 'name', + * yField: 'data3', + * marker: { + * type: 'circle', + * radius: 4, + * lineWidth: 0 + * } + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(lineChart); + * + * In this configuration we're adding two series (or lines), one bound to the `data1` + * property of the store and the other to `data3`. The type for both configurations is + * `line`. The `xField` for both series is the same, the `name` property of the store. + * Both line series share the same axis, the left axis. You can set particular marker + * configuration by adding properties onto the markerConfig object. Both series have + * an object as highlight so that markers animate smoothly to the properties in highlight + * when hovered. The second series has `fill = true` which means that the line will also + * have an area below it of the same color. + * + * **Note:** In the series definition remember to explicitly set the axis to bind the + * values of the line series to. This can be done by using the `axis` configuration property. + */ +Ext.define('Ext.chart.series.Line', { + extend: Ext.chart.series.Cartesian , + alias: 'series.line', + type: 'line', + seriesType: 'lineSeries', + + + + + + config: { + /** + * @cfg {Number} selectionTolerance + * The offset distance from the cursor position to the line series to trigger events (then used for highlighting series, etc). + */ + selectionTolerance: 20, + + /** + * @cfg {Object} style + * An object containing styles for the visualization lines. These styles will override the theme styles. + * Some options contained within the style object will are described next. + */ + + /** + * @cfg {Boolean/Number} smooth + * If set to `true` or a non-zero number, the line will be smoothed/rounded around its points; otherwise + * straight line segments will be drawn. + * + * A numeric value is interpreted as a divisor of the horizontal distance between consecutive points in + * the line; larger numbers result in sharper curves while smaller numbers result in smoother curves. + * + * If set to `true` then a default numeric value of 3 will be used. + */ + smooth: false, + + /** + * @cfg {Boolean} step + * If set to `true`, the line uses steps instead of straight lines to connect the dots. + * It is ignored if `smooth` is true. + */ + step: false, + + /** + * @cfg {Boolean} fill + * If set to `true`, the area underneath the line is filled with the color defined as follows, listed by priority: + * - The color that is configured for this series ({@link Ext.chart.series.Series#colors}). + * - The color that is configured for this chart ({@link Ext.chart.AbstractChart#colors}). + * - The fill color that is set in the {@link #style} config. + * - The stroke color that is set in the {@link #style} config, or the same color as the line. + * + * Note: Do not confuse `series.config.fill` (which is a boolean) with `series.style.fill' (which is an alias + * for the `fillStyle` property and contains a color). For compatibility with previous versions of the API, + * if `config.fill` is undefined but a `style.fill' color is provided, `config.fill` is considered true. + * So the default value below must be undefined, not false. + */ + fill: undefined, + + aggregator: { strategy: 'double' } + }, + + /** + * @private Default numeric smoothing value to be used when `{@link #smooth} = true`. + */ + defaultSmoothness: 3, + + /** + * @private Size of the buffer area on either side of the viewport to provide seamless zoom/pan + * transforms. Expressed as a multiple of the viewport length, e.g. 1 will make the buffer on + * each side equal to the length of the visible axis viewport. + */ + overflowBuffer: 1, + + /** + * @private Override {@link Ext.chart.series.Series#getDefaultSpriteConfig} + */ + getDefaultSpriteConfig: function () { + var me = this, + parentConfig = me.callSuper(arguments), + style = me.getStyle(), + fillArea = false; + + if (typeof me.config.fill != 'undefined') { + // If config.fill is present but there is no fillStyle, then use the + // strokeStyle to fill (and paint the area the same color as the line). + if (me.config.fill) { + fillArea = true; + if (typeof style.fillStyle == 'undefined') { + style.fillStyle = style.strokeStyle; + } + } + } else { + // For compatibility with previous versions of the API, if config.fill + // is undefined but style.fillStyle is provided, we fill the area. + if (style.fillStyle) { + fillArea = true; + } + } + + // If we don't fill, then delete the fillStyle because that's what is used by + // the Line sprite to fill below the line. + if (!fillArea) { + delete style.fillStyle; + } + + return Ext.apply(parentConfig || {}, { + fillArea: fillArea, + step: me.config.step, + smooth: me.config.smooth, + selectionTolerance: me.config.selectionTolerance + }); + } + +}); + +/** + * Polar series. + */ +Ext.define('Ext.chart.series.Polar', { + + extend: Ext.chart.series.Series , + + config: { + /** + * @cfg {Number} rotation + * The angle in degrees at which the first polar series item should start. + */ + rotation: 0, + + /** + * @cfg {Number} radius + * The radius of the polar series. Set to `null` will fit the polar series to the boundary. + */ + radius: null, + + /** + * @cfg {Array} center for the polar series. + */ + center: [0, 0], + + /** + * @cfg {Number} offsetX + * The x-offset of center of the polar series related to the center of the boundary. + */ + offsetX: 0, + + /** + * @cfg {Number} offsetY + * The y-offset of center of the polar series related to the center of the boundary. + */ + offsetY: 0, + + /** + * @cfg {Boolean} showInLegend + * Whether to add the series elements as legend items. + */ + showInLegend: true, + + /** + * @cfg {String} xField + * The store record field name for the labels used in the radar series. + */ + xField: null, + + /** + * @cfg {String} yField + * The store record field name for the deflection of the graph in the radar series. + */ + yField: null, + + xAxis: null, + + yAxis: null + }, + + directions: ['X', 'Y'], + + fieldCategoryX: ['X'], + fieldCategoryY: ['Y'], + + getDefaultSpriteConfig: function () { + return { + type: this.seriesType, + renderer: this.getRenderer(), + centerX: 0, + centerY: 0, + rotationCenterX: 0, + rotationCenterY: 0 + }; + }, + + applyRotation: function (rotation) { + var twoPie = Math.PI * 2; + return (rotation % twoPie + Math.PI) % twoPie - Math.PI; + }, + + updateRotation: function (rotation) { + var sprites = this.getSprites(); + if (sprites && sprites[0]) { + sprites[0].setAttributes({ + baseRotation: rotation + }); + } + } +}); + +/** + * @class Ext.chart.series.sprite.PieSlice + * + * Pie slice sprite. + */ +Ext.define('Ext.chart.series.sprite.PieSlice', { + alias: 'sprite.pieslice', + mixins: { + markerHolder: Ext.chart.MarkerHolder + }, + extend: Ext.draw.sprite.Sector , + + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Boolean} [doCallout=true] 'true' if the pie series uses label callouts. + */ + doCallout: 'bool', + + /** + * @cfg {Boolean} [rotateLabels=true] 'true' if the labels are rotated for easier reading. + */ + rotateLabels: 'bool', + + /** + * @cfg {String} [label=''] Label associated with the Pie sprite. + */ + label: 'string', + + /** + * @cfg {Number} [labelOverflowPadding=10] Padding around labels to determine overlap. + * Any negative number allows the labels to overlap. + */ + labelOverflowPadding: 'number', + + renderer: 'default' + }, + defaults: { + doCallout: true, + rotateLabels: true, + label: '', + labelOverflowPadding: 10, + renderer: null + } + } + }, + + config: { + /** + * @private + * @cfg {Object} rendererData The object that is passed to the renderer. + * + * For instance when the PieSlice sprite is used in a Gauge chart, the object + * contains the 'store' and 'field' properties, and the 'value' as well + * for that one PieSlice that is used to draw the needle of the Gauge. + */ + rendererData: null, + rendererIndex: 0 + }, + + render: function (ctx, surface, clipRegion) { + var me = this, + attr = me.attr, + itemCfg = {}, + changes; + + if (attr.renderer) { + itemCfg = { + type: 'sector', + text: attr.text, + centerX: attr.centerX, + centerY: attr.centerY, + margin: attr.margin, + startAngle: Math.min(attr.startAngle, attr.endAngle), + endAngle: Math.max(attr.startAngle, attr.endAngle), + startRho: Math.min(attr.startRho, attr.endRho), + endRho: Math.max(attr.startRho, attr.endRho) + }; + changes = attr.renderer.call(me, me, itemCfg, me.rendererData, me.rendererIndex); + Ext.apply(me.attr, changes); + } + + // Draw the sector + me.callSuper(arguments); + + // Draw the labels + if (attr.label && me.getBoundMarker('labels')) { + me.placeLabel(); + } + }, + + placeLabel: function () { + var me = this, + attr = me.attr, + startAngle = Math.min(attr.startAngle, attr.endAngle), + endAngle = Math.max(attr.startAngle, attr.endAngle), + midAngle = (startAngle + endAngle) * 0.5, + margin = attr.margin, + centerX = attr.centerX, + centerY = attr.centerY, + startRho = Math.min(attr.startRho, attr.endRho) + margin, + endRho = Math.max(attr.startRho, attr.endRho) + margin, + midRho = (startRho + endRho) * 0.5, + surfaceMatrix = me.surfaceMatrix, + labelCfg = me.labelCfg || (me.labelCfg = {}), + labelTpl = me.getBoundMarker('labels')[0].getTemplate(), + labelBox, x, y, changes; + + surfaceMatrix.appendMatrix(attr.matrix); + + labelCfg.text = attr.label; + + x = centerX + Math.cos(midAngle) * midRho; + y = centerY + Math.sin(midAngle) * midRho; + labelCfg.x = surfaceMatrix.x(x, y); + labelCfg.y = surfaceMatrix.y(x, y); + + x = centerX + Math.cos(midAngle) * endRho; + y = centerY + Math.sin(midAngle) * endRho; + labelCfg.calloutStartX = surfaceMatrix.x(x, y); + labelCfg.calloutStartY = surfaceMatrix.y(x, y); + + x = centerX + Math.cos(midAngle) * (endRho + 40); + y = centerY + Math.sin(midAngle) * (endRho + 40); + labelCfg.calloutPlaceX = surfaceMatrix.x(x, y); + labelCfg.calloutPlaceY = surfaceMatrix.y(x, y); + + labelCfg.rotationRads = (attr.rotateLabels ? midAngle + Math.atan2(surfaceMatrix.y(1, 0) - surfaceMatrix.y(0, 0), surfaceMatrix.x(1, 0) - surfaceMatrix.x(0, 0)) : 0); + labelCfg.calloutColor = me.attr.fillStyle; + labelCfg.globalAlpha = attr.globalAlpha * attr.fillOpacity; + + // If a slice is empty, don't display the label. + // This behavior can be overridden by a renderer. + labelCfg.hidden = (attr.startAngle == attr.endAngle); + + if (attr.renderer) { + labelCfg.type = 'label'; + changes = attr.renderer.call(me, me, labelCfg, me.rendererData, me.rendererIndex); + Ext.apply(labelCfg, changes); + } + me.putMarker('labels', labelCfg, me.attr.attributeId); + + labelBox = me.getMarkerBBox('labels', me.attr.attributeId, true); + if (labelBox) { + if (attr.doCallout) { + if (labelTpl.attr.display === 'outside') { + me.putMarker('labels', {callout: 1}, me.attr.attributeId); + } else { + me.putMarker('labels', {callout: 1 - +me.sliceContainsLabel(attr, labelBox)}, me.attr.attributeId); + } + } else { + me.putMarker('labels', {globalAlpha: +me.sliceContainsLabel(attr, labelBox)}, me.attr.attributeId); + } + } + }, + + sliceContainsLabel: function (attr, bbox) { + var padding = attr.labelOverflowPadding, + middle = (attr.endRho + attr.startRho) / 2, + outer = middle + (bbox.width + padding) / 2, + inner = middle - (bbox.width + padding) / 2, + sliceAngle, l1, l2, l3; + + if (padding < 0) { + return 1; + } + if (bbox.width + padding * 2 > (attr.endRho - attr.startRho)) { + return 0; + } + l1 = Math.sqrt(attr.endRho * attr.endRho - outer * outer); + l2 = Math.sqrt(attr.endRho * attr.endRho - inner * inner); + sliceAngle = Math.abs(attr.endAngle - attr.startAngle); + l3 = (sliceAngle > Math.PI/2 ? inner : Math.abs(Math.tan(sliceAngle / 2)) * inner); + if (bbox.height + padding * 2 > Math.min(l1, l2, l3) * 2) { + return 0; + } + return 1; + } +}); + +/** + * @class Ext.chart.series.Pie + * @extends Ext.chart.series.Polar + * + * Creates a Pie Chart. A Pie Chart is a useful visualization technique to display quantitative information for different + * categories that also have a meaning as a whole. + * As with all other series, the Pie Series must be appended in the *series* Chart array configuration. See the Chart + * documentation for more information. A typical configuration object for the pie series could be: + * + * @example preview + * var chart = new Ext.chart.PolarChart({ + * animate: true, + * interactions: ['rotate'], + * colors: ['#115fa6', '#94ae0a', '#a61120', '#ff8809', '#ffd13e'], + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {name: 'metric one', data1: 10, data2: 12, data3: 14, data4: 8, data5: 13}, + * {name: 'metric two', data1: 7, data2: 8, data3: 16, data4: 10, data5: 3}, + * {name: 'metric three', data1: 5, data2: 2, data3: 14, data4: 12, data5: 7}, + * {name: 'metric four', data1: 2, data2: 14, data3: 6, data4: 1, data5: 23}, + * {name: 'metric five', data1: 27, data2: 38, data3: 36, data4: 13, data5: 33} + * ] + * }, + * series: [{ + * type: 'pie', + * label: { + * field: 'name', + * display: 'rotate' + * }, + * xField: 'data3', + * donut: 30 + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + * + * In this configuration we set `pie` as the type for the series, set an object with specific style properties for highlighting options + * (triggered when hovering elements). We also set true to `showInLegend` so all the pie slices can be represented by a legend item. + * We set `data1` as the value of the field to determine the angle span for each pie slice. We also set a label configuration object + * where we set the field name of the store field to be rendered as text for the label. The labels will also be displayed rotated. + * We set `contrast` to `true` to flip the color of the label if it is to similar to the background color. Finally, we set the font family + * and size through the `font` parameter. + * + */ +Ext.define('Ext.chart.series.Pie', { + extend: Ext.chart.series.Polar , + + + + type: 'pie', + alias: 'series.pie', + seriesType: 'pieslice', + + config: { + /** + * @cfg {String} labelField + * @deprecated Use {@link Ext.chart.series.Pie#label} instead. + * The store record field name to be used for the pie slice labels. + */ + labelField: false, + + /** + * @cfg {Number} donut Specifies the radius of the donut hole, as a percentage of the chart's radius. + * Defaults to 0 (no donut hole). + */ + donut: 0, + + /** + * @cfg {String} field + * @deprecated Use xField directly + */ + field: null, + + /** + * @cfg {Number} rotation The starting angle of the pie slices. + */ + rotation: 0, + + /** + * @cfg {Number} [totalAngle=2*PI] The total angle of the pie series. + */ + totalAngle: Math.PI * 2, + + /** + * @cfg {Array} hidden Determines which pie slices are hidden. + */ + hidden: [], + + /** + * @cfg {Number} Allows adjustment of the radius by a spefic perfentage. + */ + radiusFactor: 100, + + style: { + + } + }, + + directions: ['X'], + + setField: function (f) { + return this.setXField(f); + }, + + getField: function () { + return this.getXField(); + }, + + applyRadius : function (radius) { + return radius * this.getRadiusFactor() * 0.01; + }, + + updateLabelData: function () { + var me = this, + store = me.getStore(), + items = store.getData().items, + sprites = me.getSprites(), + labelField = me.getLabel().getTemplate().getField(), + hidden = me.getHidden(), + i, ln, labels, sprite; + if (sprites.length > 0 && labelField) { + labels = []; + for (i = 0, ln = items.length; i < ln; i++) { + labels.push(items[i].get(labelField)); + } + for (i = 0, ln = sprites.length; i < ln; i++) { + sprite = sprites[i]; + sprite.setAttributes({label: labels[i]}); + sprite.putMarker('labels', {hidden: hidden[i]}, sprite.attr.attributeId); + } + } + }, + + coordinateX: function () { + var me = this, + store = me.getStore(), + items = store.getData().items, + length = items.length, + field = me.getXField(), + value, sum = 0, + hidden = me.getHidden(), + summation = [], i, + lastAngle = 0, + totalAngle = me.getTotalAngle(), + sprites = me.getSprites(); + + if (!sprites) { + return; + } + + for (i = 0; i < length; i++) { + value = Math.abs(Number(items[i].get(field))) || 0; + if (!hidden[i]) { + sum += value; + } + summation[i] = sum; + if (i >= hidden.length) { + hidden[i] = false; + } + } + + if (sum !== 0) { + sum = totalAngle / sum; + } + for (i = 0; i < length; i++) { + sprites[i].setAttributes({ + startAngle: lastAngle, + endAngle: lastAngle = (sum ? summation[i] * sum : 0), + globalAlpha: 1 + }); + } + for (; i < me.sprites.length; i++) { + sprites[i].setAttributes({ + startAngle: totalAngle, + endAngle: totalAngle, + globalAlpha: 0 + }); + } + me.getChart().refreshLegendStore(); + }, + + updateCenter: function (center) { + this.setStyle({ + translationX: center[0] + this.getOffsetX(), + translationY: center[1] + this.getOffsetY() + }); + this.doUpdateStyles(); + }, + + updateRadius: function (radius) { + this.setStyle({ + startRho: radius * this.getDonut() * 0.01, // Percentage + endRho: radius + }); + this.doUpdateStyles(); + }, + + updateDonut: function (donut) { + var radius = this.getRadius(); + this.setStyle({ + startRho: radius * donut * 0.01, // Percentage + endRho: radius + }); + this.doUpdateStyles(); + }, + + updateRotation: function (rotation) { + this.setStyle({ + rotationRads: rotation + }); + this.doUpdateStyles(); + }, + + updateTotalAngle: function (totalAngle) { + this.processData(); + }, + + getSprites: function () { + var me = this, + chart = me.getChart(), + store = me.getStore(); + if (!chart || !store) { + return []; + } + me.getColors(); + me.getSubStyle(); + var items = store.getData().items, + length = items.length, + animation = chart && chart.getAnimate(), + sprites = me.sprites, sprite, + spriteIndex = 0, rendererData, + i, spriteCreated = false, + label = me.getLabel(), + labelTpl = label.getTemplate(); + + rendererData = { + store: store, + field: me.getField(), + series: me + }; + + for (i = 0; i < length; i++) { + sprite = sprites[i]; + if (!sprite) { + sprite = me.createSprite(); + if (me.getHighlightCfg()) { + sprite.config.highlightCfg = me.getHighlightCfg(); + sprite.addModifier('highlight', true); + } + if (labelTpl.getField()) { + labelTpl.setAttributes({ + labelOverflowPadding: me.getLabelOverflowPadding() + }); + labelTpl.fx.setCustomDuration({'callout': 200}); + sprite.bindMarker('labels', label); + } + sprite.setAttributes(me.getStyleByIndex(i)); + sprite.rendererData = rendererData; + sprite.rendererIndex = spriteIndex++; + spriteCreated = true; + } + sprite.fx.setConfig(animation); + } + if (spriteCreated) { + me.doUpdateStyles(); + } + return me.sprites; + }, + + normalizeAngle: function (angle) { + var pi2 = Math.PI * 2; + if (angle >= 0) { + return angle % pi2; + } + return (angle % pi2 + pi2) % pi2; + }, + + betweenAngle: function (x, a, b) { + var normalize = this.normalizeAngle; + a = normalize(a); + b = normalize(b); + x = normalize(x); + if (b === 0) { + b = Math.PI * 2; + } + return x >= a && x < b; + }, + + /** + * Returns the pie slice for a given angle + * @param {Number} angle The angle to search for the slice + * @return {Object} An object containing the reocord, sprite, scope etc. + */ + getItemForAngle: function (angle) { + var me = this, + sprites = me.getSprites(), + attr; + + angle %= Math.PI * 2; + + while (angle < 0) { + angle += Math.PI * 2; + } + + if (sprites) { + var store = me.getStore(), + items = store.getData().items, + hidden = me.getHidden(), + i = 0, + ln = store.getCount(); + + for (; i < ln; i++) { + if(!hidden[i]) { + // Fortunately, the id of items equals the index of it in instances list. + attr = sprites[i].attr; + + if (attr.startAngle <= angle && attr.endAngle >= angle) { + return { + series: me, + sprite: sprites[i], + index: i, + record: items[i], + field: me.getXField() + }; + } + } + } + } + + return null; + }, + + getItemForPoint: function (x, y) { + var me = this, + sprites = me.getSprites(); + if (sprites) { + var center = me.getCenter(), + offsetX = me.getOffsetX(), + offsetY = me.getOffsetY(), + originalX = x - center[0] + offsetX, + originalY = y - center[1] + offsetY, + store = me.getStore(), + donut = me.getDonut(), + items = store.getData().items, + direction = Math.atan2(originalY, originalX) - me.getRotation(), + donutLimit = Math.sqrt(originalX * originalX + originalY * originalY), + endRadius = me.getRadius(), + startRadius = donut / 100 * endRadius, + hidden = me.getHidden(), + i, ln, attr; + + for (i = 0, ln = items.length; i < ln; i++) { + if(!hidden[i]) { + // Fortunately, the id of items equals the index of it in instances list. + attr = sprites[i].attr; + if (startRadius + attr.margin <= donutLimit && donutLimit + attr.margin <= endRadius) { + if (this.betweenAngle(direction, attr.startAngle, attr.endAngle)) { + return { + series: this, + sprite: sprites[i], + index: i, + record: items[i], + field: this.getXField() + }; + } + } + } + } + return null; + } + }, + + provideLegendInfo: function (target) { + var store = this.getStore(); + if (store) { + var items = store.getData().items, + labelField = this.getLabel().getTemplate().getField(), + field = this.getField(), + hidden = this.getHidden(); + for (var i = 0; i < items.length; i++) { + target.push({ + name: labelField ? String(items[i].get(labelField)) : field + ' ' + i, + mark: this.getStyleByIndex(i).fillStyle || this.getStyleByIndex(i).strokeStyle || 'black', + disabled: hidden[i], + series: this.getId(), + index: i + }); + } + } + } +}); + + +/** + * @class Ext.chart.series.sprite.Pie3DPart + * @extends Ext.draw.sprite.Path + * + * Pie3D series sprite. + */ +Ext.define("Ext.chart.series.sprite.Pie3DPart", { + extend: Ext.draw.sprite.Path , + mixins: { + markerHolder: Ext.chart.MarkerHolder + }, + alias: 'sprite.pie3dPart', + type: 'pie3dPart', + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Number} [centerX=0] The central point of the series on the x-axis. + */ + centerX: "number", + + /** + * @cfg {Number} [centerY=0] The central point of the series on the x-axis. + */ + centerY: "number", + + /** + * @cfg {Number} [startAngle=0] The starting angle of the polar series. + */ + startAngle: "number", + + /** + * @cfg {Number} [endAngle=Math.PI] The ending angle of the polar series. + */ + endAngle: "number", + + /** + * @cfg {Number} [startRho=0] The starting radius of the polar series. + */ + startRho: "number", + + /** + * @cfg {Number} [endRho=150] The ending radius of the polar series. + */ + endRho: "number", + + /** + * @cfg {Number} [margin=0] Margin from the center of the pie. Used for donut. + */ + margin: "number", + + /** + * @cfg {Number} [thickness=0] The thickness of the 3D pie part. + */ + thickness: "number", + + /** + * @cfg {Number} [distortion=0] The distortion of the 3D pie part. + */ + distortion: "number", + + /** + * @cfg {Object} [baseColor='white'] The color of the 3D pie part before adding the 3D effect. + */ + baseColor: "color", + + /** + * @cfg {Number} [baseRotation=0] The starting rotation of the polar series. + */ + baseRotation: "number", + + /** + * @cfg {String} [part=0] The part of the 3D Pie represented by the sprite. + */ + part: "enums(top,start,end,inner,outer)" + }, + aliases: { + rho: 'endRho' + }, + dirtyTriggers: { + centerX: "path,bbox", + centerY: "path,bbox", + startAngle: "path,partZIndex", + endAngle: "path,partZIndex", + startRho: "path", + endRho: "path,bbox", + margin: "path,bbox", + thickness: "path", + baseRotation: "path,partZIndex,partColor", + baseColor: 'partZIndex,partColor', + part: "path,partZIndex" + }, + defaults: { + centerX: 0, + centerY: 0, + startAngle: 0, + endAngle: 0, + startRho: 0, + endRho: 150, + margin: 0, + distortion: 1, + baseRotation: 0, + baseColor: 'white', + part: "top" + }, + updaters: { + "partColor": function (attrs) { + var color = Ext.draw.Color.fly(attrs.baseColor), + fillStyle; + switch (attrs.part) { + case 'top': + fillStyle = color.toString(); + break; + case 'outer': + fillStyle = Ext.create("Ext.draw.gradient.Linear", { + type: 'linear', + stops: [ + { + offset: 0, + color: color.createDarker(0.3).toString() + }, + { + offset: 0.3, + color: color.toString() + }, + { + offset: 0.8, + color: color.createLighter(0.2).toString() + }, + { + offset: 1, + color: color.createDarker(0.4).toString() + } + ] + }); + break; + case 'start': + fillStyle = color.createDarker(0.3).toString(); + break; + case 'end': + fillStyle = color.createDarker(0.3).toString(); + break; + case 'inner': + fillStyle = Ext.create("Ext.draw.gradient.Linear", { + type: 'linear', + stops: [ + { + offset: 0, + color: color.createDarker(0.4).toString() + }, + { + offset: 0.2, + color: color.createLighter(0.2).toString() + }, + { + offset: 0.7, + color: color.toString() + }, + { + offset: 1, + color: color.createDarker(0.3).toString() + } + ] + }); + break; + } + + attrs.fillStyle = fillStyle; + attrs.canvasAttributes.fillStyle = fillStyle; + }, + "partZIndex": function (attrs) { + var rotation = attrs.baseRotation; + switch (attrs.part) { + case 'top': + attrs.zIndex = 5; + break; + case 'outer': + attrs.zIndex = 4; + break; + case 'start': + attrs.zIndex = 1 + Math.sin(attrs.startAngle + rotation); + break; + case 'end': + attrs.zIndex = 1 + Math.sin(attrs.endAngle + rotation); + break; + case 'inner': + attrs.zIndex = 1; + break; + } + attrs.dirtyZIndex = true; + } + } + } + }, + + updatePlainBBox: function (plain) { + var attr = this.attr, + rho = attr.part === 'inner' ? attr.startRho : attr.endRho; + plain.width = rho * 2; + plain.height = rho * attr.distortion * 2 + attr.thickness; + plain.x = attr.centerX - rho; + plain.y = attr.centerY - rho * attr.distortion; + }, + + updateTransformedBBox: function (transform) { + return this.updatePlainBBox(transform); + }, + + updatePath: function (path) { + if (this.attr.endAngle < this.attr.startAngle) { + return; + } + this[this.attr.part + 'Renderer'](path); + }, + + topRenderer: function (path) { + var attr = this.attr, + margin = attr.margin, + distortion = attr.distortion, + centerX = attr.centerX, + centerY = attr.centerY, + baseRotation = attr.baseRotation, + startAngle = attr.startAngle + baseRotation , + endAngle = attr.endAngle + baseRotation , + startRho = attr.startRho, + endRho = attr.endRho, + midAngle, + sinEnd = Math.sin(endAngle), + cosEnd = Math.cos(endAngle); + midAngle = (startAngle + endAngle) * 0.5; + centerX += Math.cos(midAngle) * margin; + centerY += Math.sin(midAngle) * margin * distortion; + path.ellipse(centerX, centerY, startRho, startRho * distortion, 0, startAngle, endAngle, false); + path.lineTo(centerX + cosEnd * endRho, centerY + sinEnd * endRho * distortion); + path.ellipse(centerX, centerY, endRho, endRho * distortion, 0, endAngle, startAngle, true); + path.closePath(); + }, + + startRenderer: function (path) { + var attr = this.attr, + margin = attr.margin, + centerX = attr.centerX, + centerY = attr.centerY, + distortion = attr.distortion, + baseRotation = attr.baseRotation, + startAngle = attr.startAngle + baseRotation , + endAngle = attr.endAngle + baseRotation, + thickness = attr.thickness, + startRho = attr.startRho, + endRho = attr.endRho, + sinStart = Math.sin(startAngle), + cosStart = Math.cos(startAngle), + midAngle; + if (cosStart < 0) { + midAngle = (startAngle + endAngle) * 0.5; + centerX += Math.cos(midAngle) * margin; + centerY += Math.sin(midAngle) * margin * distortion; + path.moveTo(centerX + cosStart * startRho, centerY + sinStart * startRho * distortion); + path.lineTo(centerX + cosStart * endRho, centerY + sinStart * endRho * distortion); + path.lineTo(centerX + cosStart * endRho, centerY + sinStart * endRho * distortion + thickness); + path.lineTo(centerX + cosStart * startRho, centerY + sinStart * startRho * distortion + thickness); + path.closePath(); + } + }, + + endRenderer: function (path) { + var attr = this.attr, + margin = attr.margin, + centerX = attr.centerX, + centerY = attr.centerY, + distortion = attr.distortion, + baseRotation = attr.baseRotation, + startAngle = attr.startAngle + baseRotation , + endAngle = attr.endAngle + baseRotation, + thickness = attr.thickness, + startRho = attr.startRho, + endRho = attr.endRho, + sin = Math.sin(endAngle), + cos = Math.cos(endAngle), midAngle; + if (cos > 0) { + midAngle = (startAngle + endAngle) * 0.5; + centerX += Math.cos(midAngle) * margin; + centerY += Math.sin(midAngle) * margin * distortion; + path.moveTo(centerX + cos * startRho, centerY + sin * startRho * distortion); + path.lineTo(centerX + cos * endRho, centerY + sin * endRho * distortion); + path.lineTo(centerX + cos * endRho, centerY + sin * endRho * distortion + thickness); + path.lineTo(centerX + cos * startRho, centerY + sin * startRho * distortion + thickness); + path.closePath(); + } + }, + + innerRenderer: function (path) { + var attr = this.attr, + margin = attr.margin, + centerX = attr.centerX, + centerY = attr.centerY, + distortion = attr.distortion, + baseRotation = attr.baseRotation, + startAngle = attr.startAngle + baseRotation , + endAngle = attr.endAngle + baseRotation, + thickness = attr.thickness, + startRho = attr.startRho, + sinEnd, cosEnd, + tempStart, tempEnd, midAngle; + midAngle = (startAngle + endAngle) * 0.5; + centerX += Math.cos(midAngle) * margin; + centerY += Math.sin(midAngle) * margin * distortion; + if (startAngle >= Math.PI * 2) { + startAngle -= Math.PI * 2; + endAngle -= Math.PI * 2; + } + if (endAngle > Math.PI && endAngle < Math.PI * 3) { + tempStart = startAngle; + tempEnd = Math.min(endAngle, Math.PI * 2); + sinEnd = Math.sin(tempEnd); + cosEnd = Math.cos(tempEnd); + path.ellipse(centerX, centerY, startRho, startRho * distortion, 0, tempStart, tempEnd, false); + path.lineTo(centerX + cosEnd * startRho, centerY + sinEnd * startRho * distortion + thickness); + path.ellipse(centerX, centerY + thickness, startRho, startRho * distortion, 0, tempEnd, tempStart, true); + path.closePath(); + } + if (endAngle > Math.PI * 3) { + tempStart = Math.PI; + tempEnd = endAngle; + sinEnd = Math.sin(tempEnd); + cosEnd = Math.cos(tempEnd); + path.ellipse(centerX, centerY, startRho, startRho * distortion, 0, tempStart, tempEnd, false); + path.lineTo(centerX + cosEnd * startRho, centerY + sinEnd * startRho * distortion + thickness); + path.ellipse(centerX, centerY + thickness, startRho, startRho * distortion, 0, tempEnd, tempStart, true); + path.closePath(); + } + }, + + outerRenderer: function (path) { + var attr = this.attr, + margin = attr.margin, + centerX = attr.centerX, + centerY = attr.centerY, + distortion = attr.distortion, + baseRotation = attr.baseRotation, + startAngle = attr.startAngle + baseRotation , + endAngle = attr.endAngle + baseRotation, + thickness = attr.thickness, + endRho = attr.endRho, + sinEnd, cosEnd, + tempStart, tempEnd, midAngle; + midAngle = (startAngle + endAngle) * 0.5; + centerX += Math.cos(midAngle) * margin; + centerY += Math.sin(midAngle) * margin * distortion; + + if (startAngle >= Math.PI * 2) { + startAngle -= Math.PI * 2; + endAngle -= Math.PI * 2; + } + + if (startAngle < Math.PI) { + tempStart = startAngle; + tempEnd = Math.min(endAngle, Math.PI); + sinEnd = Math.sin(tempEnd); + cosEnd = Math.cos(tempEnd); + path.ellipse(centerX, centerY, endRho, endRho * distortion, 0, tempStart, tempEnd, false); + path.lineTo(centerX + cosEnd * endRho, centerY + sinEnd * endRho * distortion + thickness); + path.ellipse(centerX, centerY + thickness, endRho, endRho * distortion, 0, tempEnd, tempStart, true); + path.closePath(); + } + if (endAngle > Math.PI * 2) { + tempStart = Math.max(startAngle, Math.PI * 2); + tempEnd = endAngle; + sinEnd = Math.sin(tempEnd); + cosEnd = Math.cos(tempEnd); + path.ellipse(centerX, centerY, endRho, endRho * distortion, 0, tempStart, tempEnd, false); + path.lineTo(centerX + cosEnd * endRho, centerY + sinEnd * endRho * distortion + thickness); + path.ellipse(centerX, centerY + thickness, endRho, endRho * distortion, 0, tempEnd, tempStart, true); + path.closePath(); + } + } +}); + +/** + * @class Ext.chart.series.Pie3D + * @extends Ext.chart.series.Polar + * + * Creates a 3D Pie Chart. + * + * @example preview + * var chart = new Ext.chart.PolarChart({ + * animate: true, + * interactions: ['rotate'], + * colors: ["#115fa6", "#94ae0a", "#a61120", "#ff8809", "#ffd13e"], + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':'metric one', 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':'metric two', 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':'metric three', 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':'metric four', 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':'metric five', 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * series: [{ + * type: 'pie3d', + * field: 'data3', + * donut: 30 + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + */ +Ext.define('Ext.chart.series.Pie3D', { + + extend: Ext.chart.series.Polar , + type: 'pie3d', + seriesType: 'pie3d', + alias: 'series.pie3d', + config: { + region: [0, 0, 0, 0], + thickness: 35, + distortion: 0.5, + + /** + * @cfg {String} field (required) + * The store record field name to be used for the pie angles. + * The values bound to this field name must be positive real numbers. + */ + field: false, + + /** + * @private + * @cfg {String} lengthField + * Not supported. + */ + lengthField: false, + + /** + * @cfg {Boolean/Number} donut + * Whether to set the pie chart as donut chart. + * Can be set to a particular percentage to set the radius + * of the donut chart. + */ + donut: false, + + rotation: 0 + }, + + applyRotation: function (rotation) { + var twoPie = Math.PI * 2; + return (rotation % twoPie + twoPie) % twoPie; + }, + + updateRotation: function (rotation) { + var sprites = this.getSprites(), + i, ln; + for (i = 0, ln = sprites.length; i < ln; i++) { + sprites[i].setAttributes({ + baseRotation: rotation + }); + } + }, + + updateColors: function (colorSet) { + this.setSubStyle({baseColor: colorSet}); + }, + + doUpdateStyles: function () { + var sprites = this.getSprites(), + i = 0, j = 0, ln = sprites && sprites.length; + for (; i < ln; i += 5, j++) { + sprites[i].setAttributes(this.getStyleByIndex(j)); + sprites[i + 1].setAttributes(this.getStyleByIndex(j)); + sprites[i + 2].setAttributes(this.getStyleByIndex(j)); + sprites[i + 3].setAttributes(this.getStyleByIndex(j)); + sprites[i + 4].setAttributes(this.getStyleByIndex(j)); + } + }, + + processData: function () { + var me = this, + chart = me.getChart(), + animation = chart && chart.getAnimate(), + store = me.getStore(), + items = store.getData().items, + length = items.length, + field = me.getField(), + value, sum = 0, ratio, + summation = [], + i, + sprites = this.getSprites(), + lastAngle; + + for (i = 0; i < length; i++) { + value = items[i].get(field); + sum += value; + summation[i] = sum; + } + if (sum === 0) { + return; + } + ratio = 2 * Math.PI / sum; + for (i = 0; i < length; i++) { + summation[i] *= ratio; + } + + for (i = 0; i < sprites.length; i++) { + sprites[i].fx.setConfig(animation); + } + + for (i = 0, lastAngle = 0; i < length; i++) { + var commonAttributes = {opacity: 1, startAngle: lastAngle, endAngle: summation[i]}; + sprites[i * 5].setAttributes(commonAttributes); + sprites[i * 5 + 1].setAttributes(commonAttributes); + sprites[i * 5 + 2].setAttributes(commonAttributes); + sprites[i * 5 + 3].setAttributes(commonAttributes); + sprites[i * 5 + 4].setAttributes(commonAttributes); + lastAngle = summation[i]; + } + }, + + getSprites: function () { + var me = this, + chart = this.getChart(), + surface = me.getSurface(), + store = me.getStore(); + if (!store) { + return []; + } + var items = store.getData().items, + length = items.length, + animation = chart && chart.getAnimate(), + region = chart.getMainRegion() || [0, 0, 1, 1], + rotation = me.getRotation(), + center = me.getCenter(), + offsetX = me.getOffsetX(), + offsetY = me.getOffsetY(), + radius = Math.min((region[3] - me.getThickness() * 2) / me.getDistortion(), region[2]) / 2, + commonAttributes = { + centerX: center[0] + offsetX, + centerY: center[1] + offsetY - me.getThickness() / 2, + endRho: radius, + startRho: radius * me.getDonut() / 100, + thickness: me.getThickness(), + distortion: me.getDistortion() + }, sliceAttributes, twoPie = Math.PI * 2, + topSprite, startSprite, endSprite, innerSideSprite, outerSideSprite, + i; + + for (i = 0; i < length; i++) { + sliceAttributes = Ext.apply({}, this.getStyleByIndex(i), commonAttributes); + topSprite = me.sprites[i * 5]; + if (!topSprite) { + topSprite = surface.add({ + type: 'pie3dPart', + part: 'top', + startAngle: twoPie, + endAngle: twoPie + }); + startSprite = surface.add({ + type: 'pie3dPart', + part: 'start', + startAngle: twoPie, + endAngle: twoPie + }); + endSprite = surface.add({ + type: 'pie3dPart', + part: 'end', + startAngle: twoPie, + endAngle: twoPie + }); + innerSideSprite = surface.add({ + type: 'pie3dPart', + part: 'inner', + startAngle: twoPie, + endAngle: twoPie, + thickness: 0 + }); + outerSideSprite = surface.add({ + type: 'pie3dPart', + part: 'outer', + startAngle: twoPie, + endAngle: twoPie, + thickness: 0 + }); + topSprite.fx.setDurationOn('baseRotation', 0); + startSprite.fx.setDurationOn('baseRotation', 0); + endSprite.fx.setDurationOn('baseRotation', 0); + innerSideSprite.fx.setDurationOn('baseRotation', 0); + outerSideSprite.fx.setDurationOn('baseRotation', 0); + topSprite.setAttributes(sliceAttributes); + startSprite.setAttributes(sliceAttributes); + endSprite.setAttributes(sliceAttributes); + innerSideSprite.setAttributes(sliceAttributes); + outerSideSprite.setAttributes(sliceAttributes); + me.sprites.push(topSprite, startSprite, endSprite, innerSideSprite, outerSideSprite); + } else { + startSprite = me.sprites[i * 5 + 1]; + endSprite = me.sprites[i * 5 + 2]; + innerSideSprite = me.sprites[i * 5 + 3]; + outerSideSprite = me.sprites[i * 5 + 4]; + if (animation) { + topSprite.fx.setConfig(animation); + startSprite.fx.setConfig(animation); + endSprite.fx.setConfig(animation); + innerSideSprite.fx.setConfig(animation); + outerSideSprite.fx.setConfig(animation); + } + topSprite.setAttributes(sliceAttributes); + startSprite.setAttributes(sliceAttributes); + endSprite.setAttributes(sliceAttributes); + innerSideSprite.setAttributes(sliceAttributes); + outerSideSprite.setAttributes(sliceAttributes); + } + } + + for (i *= 5; i < me.sprites.length; i++) { + me.sprites[i].fx.setConfig(animation); + me.sprites[i].setAttributes({ + opacity: 0, + startAngle: twoPie, + endAngle: twoPie, + baseRotation: rotation + }); + } + + return me.sprites; + } +}); + +/** + * @class Ext.chart.series.sprite.Polar + * @extends Ext.draw.sprite.Sprite + * + * Polar sprite. + */ +Ext.define('Ext.chart.series.sprite.Polar', { + mixins: { + markerHolder: Ext.chart.MarkerHolder + }, + extend: Ext.draw.sprite.Sprite , + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Number} [dataMinX=0] Data minimum on the x-axis. + */ + dataMinX: 'number', + + /** + * @cfg {Number} [dataMaxX=1] Data maximum on the x-axis. + */ + dataMaxX: 'number', + + /** + * @cfg {Number} [dataMinY=0] Data minimum on the y-axis. + */ + dataMinY: 'number', + + /** + * @cfg {Number} [dataMaxY=2] Data maximum on the y-axis. + */ + dataMaxY: 'number', + + /** + * @cfg {Array} Data range derived from all the series bound to the x-axis. + */ + rangeX: 'data', + /** + * @cfg {Array} Data range derived from all the series bound to the y-axis. + */ + rangeY: 'data', + + /** + * @cfg {Object} [dataY=null] Data items on the y-axis. + */ + dataY: 'data', + + /** + * @cfg {Object} [dataX=null] Data items on the x-axis. + */ + dataX: 'data', + + /** + * @cfg {Number} [centerX=0] The central point of the series on the x-axis. + */ + centerX: 'number', + + /** + * @cfg {Number} [centerY=0] The central point of the series on the y-axis. + */ + centerY: 'number', + + /** + * @cfg {Number} [startAngle=0] The starting angle of the polar series. + */ + startAngle: "number", + + /** + * @cfg {Number} [endAngle=Math.PI] The ending angle of the polar series. + */ + endAngle: "number", + + /** + * @cfg {Number} [startRho=0] The starting radius of the polar series. + */ + startRho: "number", + + /** + * @cfg {Number} [endRho=150] The ending radius of the polar series. + */ + endRho: "number", + + /** + * @cfg {Number} [baseRotation=0] The starting rotation of the polar series. + */ + baseRotation: "number", + + /** + * @cfg {Object} [labels=null] Labels used in the series. + */ + labels: 'default', + + /** + * @cfg {Number} [labelOverflowPadding=10] Padding around labels to determine overlap. + */ + labelOverflowPadding: 'number' + }, + defaults: { + dataY: null, + dataX: null, + dataMinX: 0, + dataMaxX: 1, + dataMinY: 0, + dataMaxY: 1, + centerX: 0, + centerY: 0, + startAngle: 0, + endAngle: Math.PI, + startRho: 0, + endRho: 150, + baseRotation: 0, + labels: null, + labelOverflowPadding: 10 + }, + dirtyTriggers: { + dataX: 'bbox', + dataY: 'bbox', + dataMinX: 'bbox', + dataMaxX: 'bbox', + dataMinY: 'bbox', + dataMaxY: 'bbox', + centerX: "bbox", + centerY: "bbox", + startAngle: "bbox", + endAngle: "bbox", + startRho: "bbox", + endRho: "bbox", + baseRotation: "bbox" + } + } + }, + + config: { + /** + * @private + * @cfg {Object} store The store that is passed to the renderer. + */ + store: null, + field: null + }, + + updatePlainBBox: function (plain) { + var attr = this.attr; + plain.x = attr.centerX - attr.endRho; + plain.y = attr.centerY + attr.endRho; + plain.width = attr.endRho * 2; + plain.height = attr.endRho * 2; + } +}); + +/** + * @class Ext.chart.series.sprite.Radar + * @extends Ext.chart.series.sprite.Polar + * + * Radar series sprite. + */ +Ext.define('Ext.chart.series.sprite.Radar', { + alias: 'sprite.radar', + extend: Ext.chart.series.sprite.Polar , + + render: function (surface, ctx) { + var me = this, + attr = me.attr, + centerX = attr.centerX, + centerY = attr.centerY, + matrix = attr.matrix, + minX = attr.dataMinX, + maxX = attr.dataMaxX, + maxY = attr.dataMaxY, + dataX = attr.dataX, + dataY = attr.dataY, + rangeY = attr.rangeY, + endRho = attr.endRho, + startRho = attr.startRho, + baseRotation = attr.baseRotation, + i, length = dataX.length, + markerCfg = {}, + surfaceMatrix = me.surfaceMatrix, + x, y, r, th; + ctx.beginPath(); + for (i = 0; i < length; i++) { + th = (dataX[i] - minX) / (maxX - minX + 1) * 2 * Math.PI + baseRotation; + r = dataY[i] / (rangeY ? rangeY[1] : maxY) * (endRho - startRho) + startRho; + x = matrix.x(centerX + Math.cos(th) * r, centerY + Math.sin(th) * r); + y = matrix.y(centerX + Math.cos(th) * r, centerY + Math.sin(th) * r); + ctx.lineTo(x, y); + markerCfg.translationX = surfaceMatrix.x(x, y); + markerCfg.translationY = surfaceMatrix.y(x, y); + me.putMarker('markers', markerCfg, i, true); + } + ctx.closePath(); + ctx.fillStroke(attr); + } +}); + +/** + * @class Ext.chart.series.Radar + * @extends Ext.chart.series.Polar + * + * Creates a Radar Chart. A Radar Chart is a useful visualization technique for comparing different quantitative values for + * a constrained number of categories. + * As with all other series, the Radar series must be appended in the *series* Chart array configuration. See the Chart + * documentation for more information. A typical configuration object for the radar series could be: + * + * @example preview + * var chart = new Ext.chart.PolarChart({ + * animate: true, + * interactions: ['rotate'], + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':'metric one', 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':'metric two', 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':'metric three', 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':'metric four', 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':'metric five', 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * series: [{ + * type: 'radar', + * xField: 'name', + * yField: 'data4', + * style: { + * fillStyle: 'rgba(0, 0, 255, 0.1)', + * strokeStyle: 'rgba(0, 0, 0, 0.8)', + * lineWidth: 1 + * } + * }], + * axes: [ + * { + * type: 'numeric', + * position: 'radial', + * fields: 'data4', + * style: { + * estStepSize: 10 + * }, + * grid: true + * }, + * { + * type: 'category', + * position: 'angular', + * fields: 'name', + * style: { + * estStepSize: 1 + * }, + * grid: true + * } + * ] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + * + * + */ +Ext.define('Ext.chart.series.Radar', { + extend: Ext.chart.series.Polar , + type: "radar", + seriesType: 'radar', + alias: 'series.radar', + + /** + * @cfg {Object} style + * An object containing styles for overriding series styles from theming. + */ + + config: { + + }, + + updateAngularAxis: function (axis) { + axis.processData(this); + }, + + updateRadialAxis: function (axis) { + axis.processData(this); + }, + + coordinateX: function () { + return this.coordinate('X', 0, 2); + }, + + coordinateY: function () { + return this.coordinate('Y', 1, 2); + }, + + updateCenter: function (center) { + this.setStyle({ + translationX: center[0] + this.getOffsetX(), + translationY: center[1] + this.getOffsetY() + }); + this.doUpdateStyles(); + }, + + updateRadius: function (radius) { + this.setStyle({ + endRho: radius + }); + this.doUpdateStyles(); + }, + + updateRotation: function (rotation) { + this.setStyle({ + rotationRads: rotation + }); + this.doUpdateStyles(); + }, + + updateTotalAngle: function (totalAngle) { + this.processData(); + }, + + getItemForPoint: function (x, y) { + var me = this, + sprite = me.sprites && me.sprites[0], + attr = sprite.attr, + dataX = attr.dataX, + dataY = attr.dataY, + centerX = attr.centerX, + centerY = attr.centerY, + minX = attr.dataMinX, + maxX = attr.dataMaxX, + maxY = attr.dataMaxY, + endRho = attr.endRho, + startRho = attr.startRho, + baseRotation = attr.baseRotation, + i, length = dataX.length, + store = me.getStore(), + marker = me.getMarker(), + item, th, r; + + if(me.getHidden()) { + return null; + } + if (sprite && marker) { + for (i = 0; i < length; i++) { + th = (dataX[i] - minX) / (maxX - minX + 1) * 2 * Math.PI + baseRotation; + r = dataY[i] / maxY * (endRho - startRho) + startRho; + if (Math.abs(centerX + Math.cos(th) * r - x) < 22 && Math.abs(centerY + Math.sin(th) * r - y) < 22) { + item = { + series: this, + sprite: sprite, + index: i, + record: store.getData().items[i], + field: store.getFields().items[i] + }; + return item; + } + } + } + return this.callSuper(arguments); + }, + + getXRange: function () { + return [this.dataRange[0], this.dataRange[2]]; + }, + + getYRange: function () { + return [this.dataRange[1], this.dataRange[3]]; + } +}, function () { + var klass = this; + // TODO: [HACK] Steal from cartesian series. + klass.prototype.onAxesChanged = Ext.chart.series.Cartesian.prototype.onAxesChanged; + klass.prototype.getSprites = Ext.chart.series.Cartesian.prototype.getSprites; +}); + + +/** + * @class Ext.chart.series.sprite.Scatter + * @extends Ext.chart.series.sprite.Cartesian + * + * Scatter series sprite. + */ +Ext.define("Ext.chart.series.sprite.Scatter", { + alias: 'sprite.scatterSeries', + extend: Ext.chart.series.sprite.Cartesian , + renderClipped: function (surface, ctx, clip, clipRegion) { + if (this.cleanRedraw) { + return; + } + var attr = this.attr, + dataX = attr.dataX, + dataY = attr.dataY, + matrix = this.attr.matrix, + xx = matrix.getXX(), + yy = matrix.getYY(), + dx = matrix.getDX(), + dy = matrix.getDY(), + markerCfg = {}, + left = clipRegion[0] - xx, + right = clipRegion[0] + clipRegion[2] + xx, + top = clipRegion[1] - yy, + bottom = clipRegion[1] + clipRegion[3] + yy, + x, y; + for (var i = 0; i < dataX.length; i++) { + x = dataX[i]; + y = dataY[i]; + x = x * xx + dx; + y = y * yy + dy; + if (left <= x && x <= right && top <= y && y <= bottom) { + if (attr.renderer) { + attr.renderer.call(this, this, markerCfg, {store:this.getStore()}, i); + } + markerCfg.translationX = x; + markerCfg.translationY = y; + this.putMarker("items", markerCfg, i, !attr.renderer); + } + } + } +}); + +/** + * @class Ext.chart.series.Scatter + * @extends Ext.chart.series.Cartesian + * + * Creates a Scatter Chart. The scatter plot is useful when trying to display more than two variables in the same visualization. + * These variables can be mapped into x, y coordinates and also to an element's radius/size, color, etc. + * As with all other series, the Scatter Series must be appended in the *series* Chart array configuration. See the Chart + * documentation for more information on creating charts. A typical configuration object for the scatter could be: + * + * @example preview + * var chart = new Ext.chart.CartesianChart({ + * animate: true, + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':'metric one', 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':'metric two', 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':'metric three', 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':'metric four', 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':'metric five', 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * axes: [{ + * type: 'numeric', + * position: 'left', + * fields: ['data1'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * grid: true, + * minimum: 0 + * }, { + * type: 'category', + * position: 'bottom', + * fields: ['name'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * } + * }], + * series: [{ + * type: 'scatter', + * highlight: { + * size: 7, + * radius: 7 + * }, + * fill: true, + * xField: 'name', + * yField: 'data3', + * marker: { + * type: 'circle', + * fillStyle: 'blue', + * radius: 10, + * lineWidth: 0 + * } + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + * + * In this configuration we add three different categories of scatter series. Each of them is bound to a different field of the same data store, + * `data1`, `data2` and `data3` respectively. All x-fields for the series must be the same field, in this case `name`. + * Each scatter series has a different styling configuration for markers, specified by the `marker` object. Finally we set the left axis as + * axis to show the current values of the elements. + * + */ +Ext.define('Ext.chart.series.Scatter', { + + extend: Ext.chart.series.Cartesian , + + alias: 'series.scatter', + + type: 'scatter', + seriesType: 'scatterSeries', + + + + + + config: { + itemInstancing: { + fx: { + customDuration: { + translationX: 0, + translationY: 0 + } + } + } + }, + + applyMarker: function (marker) { + this.getItemInstancing(); + this.setItemInstancing(marker); + }, + + provideLegendInfo: function (target) { + var style = this.config.marker; + target.push({ + name: this.getTitle() || this.getYField() || this.getId(), + mark: style.fill || style.stroke || 'black', + disabled: false, + series: this.getId(), + index: 0 + }); + } +}); + + /** * @author Ed Spencer * diff --git a/vendor/touch/sencha-touch-all.js b/vendor/touch/sencha-touch-all.js index dfd77a6ab..0dc86cfc9 100644 --- a/vendor/touch/sencha-touch-all.js +++ b/vendor/touch/sencha-touch-all.js @@ -5,14 +5,17 @@ Copyright (c) 2011-2015 Sencha Inc Contact: http://www.sencha.com/contact -Commercial Usage -Licensees holding valid commercial licenses may use this file in accordance with the Commercial -Software License Agreement provided with the Software or, alternatively, in accordance with the -terms contained in a written agreement between you and Sencha. +GNU General Public License Usage +This file may be used under the terms of the GNU General Public License version 3.0 as +published by the Free Software Foundation and appearing in the file LICENSE included in the +packaging of this file. + +Please review the following information to ensure the GNU General Public License version 3.0 +requirements will be met: http://www.gnu.org/copyleft/gpl.html. If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact. Build date: 2015-06-10 14:41:48 (dd5f81fb46d0676281fdd021ada1da3ef06abd27) */ -(function(){var global=this,objectPrototype=Object.prototype,toString=objectPrototype.toString,enumerables=true,enumerablesTest={toString:1},emptyFn=function(){},i;if(typeof Ext==="undefined"){global.Ext={}}Ext.global=global;for(i in enumerablesTest){enumerables=null}if(enumerables){enumerables=["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","constructor"]}Ext.enumerables=enumerables;Ext.apply=function(object,config,defaults){if(defaults){Ext.apply(object,defaults)}if(object&&config&&typeof config==="object"){var i,j,k;for(i in config){object[i]=config[i]}if(enumerables){for(j=enumerables.length;j--;){k=enumerables[j];if(config.hasOwnProperty(k)){object[k]=config[k]}}}}return object};Ext.buildSettings=Ext.apply({baseCSSPrefix:"x-",scopeResetCSS:false},Ext.buildSettings||{});Ext.apply(Ext,{emptyFn:emptyFn,baseCSSPrefix:Ext.buildSettings.baseCSSPrefix,applyIf:function(object,config){var property;if(object){for(property in config){if(object[property]===undefined){object[property]=config[property]}}}return object},iterate:function(object,fn,scope){if(Ext.isEmpty(object)){return}if(scope===undefined){scope=object}if(Ext.isIterable(object)){Ext.Array.each.call(Ext.Array,object,fn,scope)}else{Ext.Object.each.call(Ext.Object,object,fn,scope)}}});Ext.apply(Ext,{extend:function(){var objectConstructor=objectPrototype.constructor,inlineOverrides=function(o){for(var m in o){if(!o.hasOwnProperty(m)){continue}this[m]=o[m]}};return function(subclass,superclass,overrides){if(Ext.isObject(superclass)){overrides=superclass;superclass=subclass;subclass=overrides.constructor!==objectConstructor?overrides.constructor:function(){superclass.apply(this,arguments)}}var F=function(){},subclassProto,superclassProto=superclass.prototype;F.prototype=superclassProto;subclassProto=subclass.prototype=new F();subclassProto.constructor=subclass;subclass.superclass=superclassProto;if(superclassProto.constructor===objectConstructor){superclassProto.constructor=superclass}subclass.override=function(overrides){Ext.override(subclass,overrides)};subclassProto.override=inlineOverrides;subclassProto.proto=subclassProto;subclass.override(overrides);subclass.extend=function(o){return Ext.extend(subclass,o)};return subclass}}(),override:function(cls,overrides){if(cls.$isClass){return cls.override(overrides)}else{Ext.apply(cls.prototype,overrides)}}});Ext.apply(Ext,{valueFrom:function(value,defaultValue,allowBlank){return Ext.isEmpty(value,allowBlank)?defaultValue:value},typeOf:function(value){if(value===null){return"null"}var type=typeof value;if(type==="undefined"||type==="string"||type==="number"||type==="boolean"){return type}var typeToString=toString.call(value);switch(typeToString){case"[object Array]":return"array";case"[object Date]":return"date";case"[object Boolean]":return"boolean";case"[object Number]":return"number";case"[object RegExp]":return"regexp"}if(type==="function"){return"function"}if(type==="object"){if(value.nodeType!==undefined){if(value.nodeType===3){return(/\S/).test(value.nodeValue)?"textnode":"whitespace"}else{return"element"}}return"object"}},isEmpty:function(value,allowEmptyString){return(value===null)||(value===undefined)||(!allowEmptyString?value==="":false)||(Ext.isArray(value)&&value.length===0)},isArray:("isArray" in Array)?Array.isArray:function(value){return toString.call(value)==="[object Array]"},isDate:function(value){return toString.call(value)==="[object Date]"},isMSDate:function(value){if(!Ext.isString(value)){return false}else{return value.match("\\\\?/Date\\(([-+])?(\\d+)(?:[+-]\\d{4})?\\)\\\\?/")!==null}},isObject:(toString.call(null)==="[object Object]")?function(value){return value!==null&&value!==undefined&&toString.call(value)==="[object Object]"&&value.ownerDocument===undefined}:function(value){return toString.call(value)==="[object Object]"},isSimpleObject:function(value){return value instanceof Object&&value.constructor===Object},isPrimitive:function(value){var type=typeof value;return type==="string"||type==="number"||type==="boolean"},isFunction:(typeof document!=="undefined"&&typeof document.getElementsByTagName("body")==="function")?function(value){return toString.call(value)==="[object Function]"}:function(value){return typeof value==="function"},isNumber:function(value){return typeof value==="number"&&isFinite(value)},isNumeric:function(value){return !isNaN(parseFloat(value))&&isFinite(value)},isString:function(value){return typeof value==="string"},isBoolean:function(value){return typeof value==="boolean"},isElement:function(value){return value?value.nodeType===1:false},isTextNode:function(value){return value?value.nodeName==="#text":false},isDefined:function(value){return typeof value!=="undefined"},isIterable:function(value){return(value&&typeof value!=="string")?value.length!==undefined:false}});Ext.apply(Ext,{clone:function(item){if(item===null||item===undefined){return item}if(item.nodeType&&item.cloneNode){return item.cloneNode(true)}var type=toString.call(item);if(type==="[object Date]"){return new Date(item.getTime())}var i,j,k,clone,key;if(type==="[object Array]"){i=item.length;clone=[];while(i--){clone[i]=Ext.clone(item[i])}}else{if(type==="[object Object]"&&item.constructor===Object){clone={};for(key in item){clone[key]=Ext.clone(item[key])}if(enumerables){for(j=enumerables.length;j--;){k=enumerables[j];clone[k]=item[k]}}}}return clone||item},getUniqueGlobalNamespace:function(){var uniqueGlobalNamespace=this.uniqueGlobalNamespace;if(uniqueGlobalNamespace===undefined){var i=0;do{uniqueGlobalNamespace="ExtBox"+(++i)}while(Ext.global[uniqueGlobalNamespace]!==undefined);Ext.global[uniqueGlobalNamespace]=Ext;this.uniqueGlobalNamespace=uniqueGlobalNamespace}return uniqueGlobalNamespace},functionFactory:function(){var args=Array.prototype.slice.call(arguments),ln=args.length;if(ln>0){args[ln-1]="var Ext=window."+this.getUniqueGlobalNamespace()+";"+args[ln-1]}return Function.prototype.constructor.apply(Function.prototype,args)},globalEval:("execScript" in global)?function(code){global.execScript(code)}:function(code){(function(){eval(code)})()}});Ext.type=Ext.typeOf})();(function(){var a="2.4.2.571",b;Ext.Version=b=Ext.extend(Object,{constructor:function(d){var c=this.toNumber,f,e;if(d instanceof b){return d}this.version=this.shortVersion=String(d).toLowerCase().replace(/_/g,".").replace(/[\-+]/g,"");e=this.version.search(/([^\d\.])/);if(e!==-1){this.release=this.version.substr(e,d.length);this.shortVersion=this.version.substr(0,e)}this.shortVersion=this.shortVersion.replace(/[^\d]/g,"");f=this.version.split(".");this.major=c(f.shift());this.minor=c(f.shift());this.patch=c(f.shift());this.build=c(f.shift());return this},toNumber:function(c){c=parseInt(c||0,10);if(isNaN(c)){c=0}return c},toString:function(){return this.version},valueOf:function(){return this.version},getMajor:function(){return this.major||0},getMinor:function(){return this.minor||0},getPatch:function(){return this.patch||0},getBuild:function(){return this.build||0},getRelease:function(){return this.release||""},isGreaterThan:function(c){return b.compare(this.version,c)===1},isGreaterThanOrEqual:function(c){return b.compare(this.version,c)>=0},isLessThan:function(c){return b.compare(this.version,c)===-1},isLessThanOrEqual:function(c){return b.compare(this.version,c)<=0},equals:function(c){return b.compare(this.version,c)===0},match:function(c){c=String(c);return this.version.substr(0,c.length)===c},toArray:function(){return[this.getMajor(),this.getMinor(),this.getPatch(),this.getBuild(),this.getRelease()]},getShortVersion:function(){return this.shortVersion},gt:function(){return this.isGreaterThan.apply(this,arguments)},lt:function(){return this.isLessThan.apply(this,arguments)},gtEq:function(){return this.isGreaterThanOrEqual.apply(this,arguments)},ltEq:function(){return this.isLessThanOrEqual.apply(this,arguments)}});Ext.apply(b,{releaseValueMap:{dev:-6,alpha:-5,a:-5,beta:-4,b:-4,rc:-3,"#":-2,p:-1,pl:-1},getComponentValue:function(c){return !c?0:(isNaN(c)?this.releaseValueMap[c]||c:parseInt(c,10))},compare:function(g,f){var d,e,c;g=new b(g).toArray();f=new b(f).toArray();for(c=0;ce){return 1}}}return 0}});Ext.apply(Ext,{versions:{},lastRegisteredVersion:null,setVersion:function(d,c){Ext.versions[d]=new b(c);Ext.lastRegisteredVersion=Ext.versions[d];return this},getVersion:function(c){if(c===undefined){return Ext.lastRegisteredVersion}return Ext.versions[c]},deprecate:function(c,e,f,d){if(b.compare(Ext.getVersion(c),e)<1){f.call(d)}}});Ext.setVersion("core",a)})();Ext.String={trimRegex:/^[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+|[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+$/g,escapeRe:/('|\\)/g,formatRe:/\{(\d+)\}/g,escapeRegexRe:/([-.*+?^${}()|[\]\/\\])/g,htmlEncode:(function(){var d={"&":"&",">":">","<":"<",'"':"""},b=[],c,a;for(c in d){b.push(c)}a=new RegExp("("+b.join("|")+")","g");return function(e){return(!e)?e:String(e).replace(a,function(g,f){return d[f]})}})(),htmlDecode:(function(){var d={"&":"&",">":">","<":"<",""":'"'},b=[],c,a;for(c in d){b.push(c)}a=new RegExp("("+b.join("|")+"|&#[0-9]{1,5};)","g");return function(e){return(!e)?e:String(e).replace(a,function(g,f){if(f in d){return d[f]}else{return String.fromCharCode(parseInt(f.substr(2),10))}})}})(),urlAppend:function(b,a){if(!Ext.isEmpty(a)){return b+(b.indexOf("?")===-1?"?":"&")+a}return b},trim:function(a){return a.replace(Ext.String.trimRegex,"")},capitalize:function(a){return a.charAt(0).toUpperCase()+a.substr(1)},ellipsis:function(c,a,d){if(c&&c.length>a){if(d){var e=c.substr(0,a-2),b=Math.max(e.lastIndexOf(" "),e.lastIndexOf("."),e.lastIndexOf("!"),e.lastIndexOf("?"));if(b!==-1&&b>=(a-15)){return e.substr(0,b)+"..."}}return c.substr(0,a-3)+"..."}return c},escapeRegex:function(a){return a.replace(Ext.String.escapeRegexRe,"\\$1")},escape:function(a){return a.replace(Ext.String.escapeRe,"\\$1")},toggle:function(b,c,a){return b===c?a:c},leftPad:function(b,c,d){var a=String(b);d=d||" ";while(a.lengthH){for(C=e;C--;){F[z+C]=F[H+C]}}}if(J&&G===B){F.length=B;F.push.apply(F,I)}else{F.length=B+J;for(C=0;C-1;y--){if(A.call(z||C[y],C[y],y,C)===false){return y}}}return true},forEach:i?function(z,y,e){return z.forEach(y,e)}:function(B,z,y){var e=0,A=B.length;for(;eD.length){return 1}else{if(E.lengthe){e=z}}}return e},mean:function(e){return e.length>0?a.sum(e)/e.length:undefined},sum:function(B){var y=0,e,A,z;for(e=0,A=B.length;e=c){f+=c}else{if(b*2<-c){f-=c}}}return Ext.Number.constrain(f,d,g)},toFixed:function(d,b){if(a){b=b||0;var c=Math.pow(10,b);return(Math.round(d*c)/c).toFixed(b)}return d.toFixed(b)},from:function(c,b){if(isFinite(c)){c=parseFloat(c)}return !isNaN(c)?c:b}}})();Ext.num=function(){return Ext.Number.from.apply(this,arguments)};(function(){var a=function(){};var b=Ext.Object={chain:("create" in Object)?function(c){return Object.create(c)}:function(d){a.prototype=d;var c=new a();a.prototype=null;return c},toQueryObjects:function(e,j,d){var c=b.toQueryObjects,h=[],f,g;if(Ext.isArray(j)){for(f=0,g=j.length;f0){h=n.split("=");v=decodeURIComponent(h[0]);m=(h[1]!==undefined)?decodeURIComponent(h[1]):"";if(!q){if(t.hasOwnProperty(v)){if(!Ext.isArray(t[v])){t[v]=[t[v]]}t[v].push(m)}else{t[v]=m}}else{g=v.match(/(\[):?([^\]]*)\]/g);s=v.match(/^([^\[]+)/);v=s[0];k=[];if(g===null){t[v]=m;continue}for(o=0,c=g.length;o0){return setTimeout(e,c)}e();return 0},createSequence:function(b,c,a){if(!c){return b}else{return function(){var d=b.apply(this,arguments);c.apply(a||this,arguments);return d}}},createBuffered:function(e,b,d,c){var a;return function(){var g=c||Array.prototype.slice.call(arguments,0),f=d||this;if(a){clearTimeout(a)}a=setTimeout(function(){e.apply(f,g)},b)}},createThrottled:function(e,b,d){var f,a,c,h,g=function(){e.apply(d||this,c);f=new Date().getTime()};return function(){a=new Date().getTime()-f;c=arguments;clearTimeout(h);if(!f||(a>=b)){g()}else{h=setTimeout(g,b-a)}}},interceptBefore:function(b,a,d,c){var e=b[a]||Ext.emptyFn;return(b[a]=function(){var f=d.apply(c||this,arguments);e.apply(this,arguments);return f})},interceptAfter:function(b,a,d,c){var e=b[a]||Ext.emptyFn;return(b[a]=function(){e.apply(this,arguments);return d.apply(c||this,arguments)})}};Ext.defer=Ext.Function.alias(Ext.Function,"defer");Ext.pass=Ext.Function.alias(Ext.Function,"pass");Ext.bind=Ext.Function.alias(Ext.Function,"bind");Ext.JSON=new (function(){var useHasOwn=!!{}.hasOwnProperty,isNative=function(){var useNative=null;return function(){if(useNative===null){useNative=Ext.USE_NATIVE_JSON&&window.JSON&&JSON.toString()=="[object JSON]"}return useNative}}(),pad=function(n){return n<10?"0"+n:n},doDecode=function(json){return eval("("+json+")")},doEncode=function(o){if(!Ext.isDefined(o)||o===null){return"null"}else{if(Ext.isArray(o)){return encodeArray(o)}else{if(Ext.isDate(o)){return Ext.JSON.encodeDate(o)}else{if(Ext.isString(o)){if(Ext.isMSDate(o)){return encodeMSDate(o)}else{return encodeString(o)}}else{if(typeof o=="number"){return isFinite(o)?String(o):"null"}else{if(Ext.isBoolean(o)){return String(o)}else{if(Ext.isObject(o)){return encodeObject(o)}else{if(typeof o==="function"){return"null"}}}}}}}}return"undefined"},m={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\","\x0b":"\\u000b"},charToReplace=/[\\\"\x00-\x1f\x7f-\uffff]/g,encodeString=function(s){return'"'+s.replace(charToReplace,function(a){var c=m[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"'},encodeArray=function(o){var a=["[",""],len=o.length,i;for(i=0;i0){for(d=0;d0){if(m===l){return o[m]}n=o[m];l=l.substring(m.length+1)}if(n.length>0){n+="/"}return n.replace(/\/\.\//g,"/")+l.replace(/\./g,"/")+".js"},getPrefix:function(m){var o=this.config.paths,n,l="";if(o.hasOwnProperty(m)){return m}for(n in o){if(o.hasOwnProperty(n)&&n+"."===m.substring(0,n.length+1)){if(n.length>l.length){l=n}}}return l},require:function(n,m,l,o){if(m){m.call(l)}},syncRequire:function(){},exclude:function(m){var l=this;return{require:function(p,o,n){return l.require(p,o,n,m)},syncRequire:function(p,o,n){return l.syncRequire(p,o,n,m)}}},onReady:function(o,n,p,l){var m;if(p!==false&&Ext.onDocumentReady){m=o;o=function(){Ext.onDocumentReady(m,n,l)}}o.call(n)}};Ext.apply(b,{documentHead:typeof document!="undefined"&&(document.head||document.getElementsByTagName("head")[0]),isLoading:false,queue:[],isClassFileLoaded:{},isFileLoaded:{},readyListeners:[],optionalRequires:[],requiresMap:{},numPendingFiles:0,numLoadedFiles:0,hasFileLoadError:false,classNameToFilePathMap:{},syncModeEnabled:false,scriptElements:{},refreshQueue:function(){var l=this.queue,r=l.length,o,q,m,p,n;if(r===0){this.triggerReady();return}for(o=0;othis.numLoadedFiles){continue}m=0;do{if(a.isCreated(p[m])){g(p,m,1)}else{m++}}while(m=200&&o<300)||o==304||(o==0&&r.length>0)){Ext.globalEval(r+"\n//@ sourceURL="+m);t.call(x)}else{}v=null}},syncRequire:function(){var l=this.syncModeEnabled;if(!l){this.syncModeEnabled=true}this.require.apply(this,arguments);if(!l){this.syncModeEnabled=false}this.refreshQueue()},require:function(G,u,o,r){var w={},n={},z=this.queue,D=this.classNameToFilePathMap,B=this.isClassFileLoaded,t=[],I=[],F=[],m=[],s,H,y,x,l,q,E,C,A,v,p;if(r){r=i(r);for(C=0,v=r.length;C0){t=a.getNamesByExpression(l);for(A=0,p=t.length;A0){s=function(){var L=[],K,M,J;for(K=0,M=m.length;K0){I=a.getNamesByExpression(x);p=I.length;for(A=0;A0){if(!this.config.enabled){throw new Error("Ext.Loader is not enabled, so dependencies cannot be resolved dynamically. Missing required class"+((F.length>1)?"es":"")+": "+F.join(", "))}}else{s.call(o);return this}H=this.syncModeEnabled;if(!H){z.push({requires:F.slice(),callback:s,scope:o})}v=F.length;for(C=0;C=2){if("1496x2048" in r){e(r["1496x2048"],"(orientation: landscape)")}if("1536x2008" in r){e(r["1536x2008"],"(orientation: portrait)")}if("144" in p){n(p["144"],"144x144",t)}}else{if("748x1024" in r){e(r["748x1024"],"(orientation: landscape)")}if("768x1004" in r){e(r["768x1004"],"(orientation: portrait)")}if("72" in p){n(p["72"],"72x72",t)}}}else{if(o>=2&&Ext.os.version.gtEq("4.3")){if(Ext.os.is.iPhone5){e(r["640x1096"])}else{e(r["640x920"])}if("114" in p){n(p["114"],"114x114",t)}}else{e(r["320x460"]);if("57" in p){n(p["57"],null,t)}}}},application:function(b){var a=b.name,e,d,c;if(!b){b={}}if(!Ext.Loader.config.paths[a]){Ext.Loader.setPath(a,b.appFolder||"app")}c=Ext.Array.from(b.requires);b.requires=["Ext.app.Application"];e=b.onReady;d=b.scope;b.onReady=function(){b.requires=c;new Ext.app.Application(b);if(e){e.call(d)}};Ext.setup(b)},factoryConfig:function(a,l){var g=Ext.isSimpleObject(a);if(g&&a.xclass){var f=a.xclass;delete a.xclass;Ext.require(f,function(){Ext.factoryConfig(a,function(i){l(Ext.create(f,i))})});return}var d=Ext.isArray(a),m=[],k,j,c,e;if(g||d){if(g){for(k in a){if(a.hasOwnProperty(k)){j=a[k];if(Ext.isSimpleObject(j)||Ext.isArray(j)){m.push(k)}}}}else{for(c=0,e=a.length;c=e){l(a);return}k=m[c];j=a[k];Ext.factoryConfig(j,h)}b();return}l(a)},factory:function(b,e,a,f){var d=Ext.ClassManager,c;if(!b||b.isInstance){if(a&&a!==b){a.destroy()}return b}if(f){if(typeof b=="string"){return d.instantiateByAlias(f+"."+b)}else{if(Ext.isObject(b)&&"type" in b){return d.instantiateByAlias(f+"."+b.type,b)}}}if(b===true){return a||d.instantiate(e)}if("xtype" in b){c=d.instantiateByAlias("widget."+b.xtype,b)}else{if("xclass" in b){c=d.instantiate(b.xclass,b)}}if(c){if(a){a.destroy()}return c}if(a){return a.setConfig(b)}return d.instantiate(e,b)},deprecateClassMember:function(b,c,a,d){return this.deprecateProperty(b.prototype,c,a,d)},deprecateClassMembers:function(b,c){var d=b.prototype,e,a;for(e in c){if(c.hasOwnProperty(e)){a=c[e];this.deprecateProperty(d,e,a)}}},deprecateProperty:function(b,c,a,d){if(!d){d="'"+c+"' is deprecated"}if(a){d+=", please use '"+a+"' instead"}if(a){Ext.Object.defineProperty(b,c,{get:function(){return this[a]},set:function(e){this[a]=e},configurable:true})}},deprecatePropertyValue:function(b,a,d,c){Ext.Object.defineProperty(b,a,{get:function(){return d},configurable:true})},deprecateMethod:function(b,a,d,c){b[a]=function(){if(d){return d.apply(this,arguments)}}},deprecateClassMethod:function(a,b,h,d){if(typeof b!="string"){var g,f;for(g in b){if(b.hasOwnProperty(g)){f=b[g];Ext.deprecateClassMethod(a,g,f)}}return}var c=typeof h=="string",e;if(!d){d="'"+b+"()' is deprecated, please use '"+(c?h:h.name)+"()' instead"}if(c){e=function(){return this[h].apply(this,arguments)}}else{e=function(){return h.apply(this,arguments)}}if(b in a.prototype){Ext.Object.defineProperty(a.prototype,b,{value:null,writable:true,configurable:true})}a.addMember(b,e)},isReady:false,readyListeners:[],triggerReady:function(){var b=Ext.readyListeners,a,c,d;if(!Ext.isReady){Ext.isReady=true;for(a=0,c=b.length;a0){return b+Ext.String.capitalize(a)}return a},getPreferredTranslationMethod:function(a){if(typeof a=="object"&&"translationMethod" in a&&a.translationMethod!=="auto"){return a.translationMethod}else{if(this.is.AndroidStock2||this.is.IE){return"scrollposition"}else{return"csstransform"}}}},function(){var a=Ext.browser=new this(Ext.global.navigator.userAgent)});Ext.define("Ext.env.OS",{statics:{names:{ios:"iOS",android:"Android",windowsPhone:"WindowsPhone",webos:"webOS",blackberry:"BlackBerry",rimTablet:"RIMTablet",mac:"MacOS",win:"Windows",tizen:"Tizen",linux:"Linux",bada:"Bada",chrome:"ChromeOS",other:"Other"},prefixes:{tizen:"(Tizen )",ios:"i(?:Pad|Phone|Pod)(?:.*)CPU(?: iPhone)? OS ",android:"(Android |HTC_|Silk/)",windowsPhone:"Windows Phone ",blackberry:"(?:BlackBerry|BB)(?:.*)Version/",rimTablet:"RIM Tablet OS ",webos:"(?:webOS|hpwOS)/",bada:"Bada/",chrome:"CrOS "}},is:Ext.emptyFn,name:null,version:null,setFlag:function(a,b){if(typeof b=="undefined"){b=true}this.is[a]=b;this.is[a.toLowerCase()]=b;return this},constructor:function(o,b,k){var l=this.statics(),j=l.names,d=l.prefixes,a,h="",c,g,f,n,e,m;k=k||Ext.browser;e=this.is=function(i){return this.is[i]===true};for(c in d){if(d.hasOwnProperty(c)){g=d[c];f=o.match(new RegExp("(?:"+g+")([^\\s;]+)"));if(f){a=j[c];m=f[1];if(m&&m=="HTC_"){h=new Ext.Version("2.3")}else{if(m&&m=="Silk/"){h=new Ext.Version("2.3")}else{h=new Ext.Version(f[f.length-1])}}break}}}if(!a){a=j[(o.toLowerCase().match(/mac|win|linux/)||["other"])[0]];h=new Ext.Version("")}this.name=a;this.version=h;if(b){this.setFlag(b.replace(/ simulator$/i,""))}this.setFlag(a);if(h){this.setFlag(a+(h.getMajor()||""));this.setFlag(a+h.getShortVersion())}for(c in j){if(j.hasOwnProperty(c)){n=j[c];if(!e.hasOwnProperty(a)){this.setFlag(n,(a===n))}}}if(this.name=="iOS"&&window.screen.height==568){this.setFlag("iPhone5")}if(k.is.Safari||k.is.Silk){if(this.is.Android2||this.is.Android3||k.version.shortVersion==501){k.setFlag("AndroidStock");k.setFlag("AndroidStock2")}if(this.is.Android4){k.setFlag("AndroidStock");k.setFlag("AndroidStock4")}}return this}},function(){var a=Ext.global.navigator,e=a.userAgent,b,g,d;Ext.os=b=new this(e,a.platform);g=b.name;var c=window.location.search.match(/deviceType=(Tablet|Phone)/),f=window.deviceType;if(c&&c[1]){d=c[1]}else{if(f==="iPhone"){d="Phone"}else{if(f==="iPad"){d="Tablet"}else{if(!b.is.Android&&!b.is.iOS&&!b.is.WindowsPhone&&/Windows|Linux|MacOS/.test(g)){d="Desktop";Ext.browser.is.WebView=Ext.browser.is.Ripple?true:false}else{if(b.is.iPad||b.is.RIMTablet||b.is.Android3||Ext.browser.is.Silk||(b.is.Android&&e.search(/mobile/i)==-1)){d="Tablet"}else{d="Phone"}}}}}b.setFlag(d,true);b.deviceType=d});Ext.define("Ext.env.Feature",{constructor:function(){this.testElements={};this.has=function(a){return !!this.has[a]};if(!Ext.theme){Ext.theme={name:"Default"}}Ext.theme.is={};Ext.theme.is[Ext.theme.name]=true;Ext.onDocumentReady(function(){this.registerTest({ProperHBoxStretching:function(){var b=document.createElement("div"),c=b.appendChild(document.createElement("div")),d=c.appendChild(document.createElement("div")),a;b.setAttribute("style","width: 100px; height: 100px; position: relative;");c.setAttribute("style","position: absolute; display: -ms-flexbox; display: -webkit-flex; display: -moz-flexbox; display: flex; -ms-flex-direction: row; -webkit-flex-direction: row; -moz-flex-direction: row; flex-direction: row; min-width: 100%;");d.setAttribute("style","width: 200px; height: 50px;");document.body.appendChild(b);a=c.offsetWidth;document.body.removeChild(b);return(a>100)}})},this)},getTestElement:function(a,b){if(a===undefined){a="div"}else{if(typeof a!=="string"){return a}}if(b){return document.createElement(a)}if(!this.testElements[a]){this.testElements[a]=document.createElement(a)}return this.testElements[a]},isStyleSupported:function(c,b){var d=this.getTestElement(b).style,a=Ext.String.capitalize(c);if(typeof d[c]!=="undefined"||typeof d[Ext.browser.getStylePrefix(c)+a]!=="undefined"){return true}return false},isStyleSupportedWithoutPrefix:function(b,a){var c=this.getTestElement(a).style;if(typeof c[b]!=="undefined"){return true}return false},isEventSupported:function(c,a){if(a===undefined){a=window}var e=this.getTestElement(a),b="on"+c.toLowerCase(),d=(b in e);if(!d){if(e.setAttribute&&e.removeAttribute){e.setAttribute(b,"");d=typeof e[b]==="function";if(typeof e[b]!=="undefined"){e[b]=undefined}e.removeAttribute(b)}}return d},getSupportedPropertyName:function(b,a){var c=Ext.browser.getVendorProperyName(a);if(c in b){return c}else{if(a in b){return a}}return null},registerTest:Ext.Function.flexSetter(function(a,b){this.has[a]=b.call(this);return this})},function(){Ext.feature=new this;var a=Ext.feature.has;Ext.feature.registerTest({Canvas:function(){var b=this.getTestElement("canvas");return !!(b&&b.getContext&&b.getContext("2d"))},Svg:function(){var b=document;return !!(b.createElementNS&&!!b.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect)},Vml:function(){var c=this.getTestElement(),b=false;c.innerHTML="";b=(c.childNodes.length===1);c.innerHTML="";return b},Touch:function(){return Ext.browser.is.Ripple||(this.isEventSupported("touchstart")&&!(Ext.os&&Ext.os.name.match(/Windows|MacOS|Linux/)&&!Ext.os.is.BlackBerry6))},Pointer:function(){return !!window.navigator.msPointerEnabled},Orientation:function(){return"orientation" in window},OrientationChange:function(){return this.isEventSupported("orientationchange")},DeviceMotion:function(){return this.isEventSupported("devicemotion")},Geolocation:function(){return"geolocation" in window.navigator},SqlDatabase:function(){return"openDatabase" in window},WebSockets:function(){return"WebSocket" in window},Range:function(){return !!document.createRange},CreateContextualFragment:function(){var b=!!document.createRange?document.createRange():false;return b&&!!b.createContextualFragment},History:function(){return("history" in window&&"pushState" in window.history)},CssTransforms:function(){return this.isStyleSupported("transform")},CssTransformNoPrefix:function(){if(!Ext.browser.is.AndroidStock){return this.isStyleSupportedWithoutPrefix("transform")}else{return this.isStyleSupportedWithoutPrefix("transform")&&!this.isStyleSupportedWithoutPrefix("-webkit-transform")}},Css3dTransforms:function(){return this.has("CssTransforms")&&this.isStyleSupported("perspective")&&!Ext.browser.is.AndroidStock2},CssAnimations:function(){return this.isStyleSupported("animationName")},CssTransitions:function(){return this.isStyleSupported("transitionProperty")},Audio:function(){return !!this.getTestElement("audio").canPlayType},Video:function(){return !!this.getTestElement("video").canPlayType},ClassList:function(){return"classList" in this.getTestElement()},LocalStorage:function(){var b=false;try{if("localStorage" in window&&window.localStorage!==null){localStorage.setItem("sencha-localstorage-test","test success");localStorage.removeItem("sencha-localstorage-test");b=true}}catch(c){}return b},MatchMedia:function(){return"matchMedia" in window},XHR2:function(){return window.ProgressEvent&&window.FormData&&window.XMLHttpRequest&&("withCredentials" in new XMLHttpRequest)},XHRUploadProgress:function(){if(window.XMLHttpRequest&&!Ext.browser.is.AndroidStock){var b=new XMLHttpRequest();return b&&("upload" in b)&&("onprogress" in b.upload)}return false},NumericInputPlaceHolder:function(){return !(Ext.browser.is.AndroidStock4&&Ext.os.version.getMinor()<2)}})});Ext.define("Ext.dom.Query",{select:function(h,b){var g=[],d,f,e,c,a;b=b||document;if(typeof b=="string"){b=document.getElementById(b)}h=h.split(",");for(f=0,c=h.length;f")}else{c.push(">");if((h=d.tpl)){h.applyOut(d.tplData,c)}if((h=d.html)){c.push(h)}if((h=d.cn||d.children)){g.generateMarkup(h,c)}f=g.closeTags;c.push(f[a]||(f[a]=""))}}}return c},generateStyles:function(e,c){var b=c||[],d;for(d in e){if(e.hasOwnProperty(d)){b.push(this.decamelizeName(d),":",e[d],";")}}return c||b.join("")},markup:function(a){if(typeof a=="string"){return a}var b=this.generateMarkup(a,[]);return b.join("")},applyStyles:function(a,b){Ext.fly(a).applyStyles(b)},createContextualFragment:function(c){var f=document.createElement("div"),a=document.createDocumentFragment(),b=0,d,e;f.innerHTML=c;e=f.childNodes;d=e.length;for(;b";return b}},isElement:true,constructor:function(a){if(typeof a=="string"){a=document.getElementById(a)}if(!a){throw new Error("Invalid domNode reference or an id of an existing domNode: "+a)}this.dom=a;this.getUniqueId()},attach:function(a){this.dom=a;this.id=a.id;return this},getUniqueId:function(){var b=this.id,a;if(!b){a=this.dom;if(a.id.length>0){this.id=b=a.id}else{a.id=b=this.mixins.identifiable.getUniqueId.call(this)}Ext.Element.cache[b]=this}return b},setId:function(c){var a=this.id,b=Ext.Element.cache;if(a){delete b[a]}this.dom.id=c;this.id=c;b[c]=this;return this},setHtml:function(a){this.dom.innerHTML=a},getHtml:function(){return this.dom.innerHTML},setText:function(a){this.dom.textContent=a},redraw:function(){var b=this.dom,a=b.style;a.display="none";b.offsetHeight;a.display=""},isPainted:(function(){return !Ext.browser.is.IE?function(){var a=this.dom;return Boolean(a&&a.offsetParent)}:function(){var a=this.dom;return Boolean(a&&(a.offsetHeight!==0&&a.offsetWidth!==0))}})(),set:function(a,b){var e=this.dom,c,d;for(c in a){if(a.hasOwnProperty(c)){d=a[c];if(c=="style"){this.applyStyles(d)}else{if(c=="cls"){e.className=d}else{if(b!==false){if(d===undefined){e.removeAttribute(c)}else{e.setAttribute(c,d)}}else{e[c]=d}}}}}return this},is:function(a){return Ext.DomQuery.is(this.dom,a)},getValue:function(b){var a=this.dom.value;return b?parseInt(a,10):a},getAttribute:function(a,b){var c=this.dom;return c.getAttributeNS(b,a)||c.getAttribute(b+":"+a)||c.getAttribute(a)||c[a]},setSizeState:function(d){var c=["x-sized","x-unsized","x-stretched"],a=[true,false,null],b=a.indexOf(d),e;if(b!==-1){e=c[b];c.splice(b,1);this.addCls(e)}this.removeCls(c);return this},destroy:function(){this.isDestroyed=true;var a=Ext.Element.cache,b=this.dom;if(b&&b.parentNode&&b.tagName!="BODY"){b.parentNode.removeChild(b)}delete a[this.id];delete this.dom}},function(a){Ext.elements=Ext.cache=a.cache;this.addStatics({Fly:new Ext.Class({extend:a,constructor:function(b){this.dom=b}}),_flyweights:{},fly:function(e,c){var f=null,d=a._flyweights,b;c=c||"_global";e=Ext.getDom(e);if(e){f=d[c]||(d[c]=new a.Fly());f.dom=e;f.isSynchronized=false;b=Ext.cache[e.id];if(b&&b.isElement){b.isSynchronized=false}}return f}});Ext.get=function(b){return a.get(b)};Ext.fly=function(){return a.fly.apply(a,arguments)};Ext.ClassManager.onCreated(function(){a.mixin("observable",Ext.mixin.Observable)},null,"Ext.mixin.Observable")});Ext.dom.Element.addStatics({numberRe:/\d+$/,unitRe:/\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i,camelRe:/(-[a-z])/gi,cssRe:/([a-z0-9-]+)\s*:\s*([^;\s]+(?:\s*[^;\s]+)*);?/gi,opacityRe:/alpha\(opacity=(.*)\)/i,propertyCache:{},defaultUnit:"px",borders:{l:"border-left-width",r:"border-right-width",t:"border-top-width",b:"border-bottom-width"},paddings:{l:"padding-left",r:"padding-right",t:"padding-top",b:"padding-bottom"},margins:{l:"margin-left",r:"margin-right",t:"margin-top",b:"margin-bottom"},addUnits:function(b,a){if(b===""||b=="auto"||b===undefined||b===null){return b||""}if(Ext.isNumber(b)||this.numberRe.test(b)){return b+(a||this.defaultUnit||"px")}else{if(!this.unitRe.test(b)){return b||""}}return b},isAncestor:function(b,d){var a=false;b=Ext.getDom(b);d=Ext.getDom(d);if(b&&d){if(b.contains){return b.contains(d)}else{if(b.compareDocumentPosition){return !!(b.compareDocumentPosition(d)&16)}else{while((d=d.parentNode)){a=d==b||a}}}}return a},parseBox:function(b){if(typeof b!="string"){b=b.toString()}var c=b.split(" "),a=c.length;if(a==1){c[1]=c[2]=c[3]=c[0]}else{if(a==2){c[2]=c[0];c[3]=c[1]}else{if(a==3){c[3]=c[1]}}}return{top:c[0]||0,right:c[1]||0,bottom:c[2]||0,left:c[3]||0}},unitizeBox:function(c,a){var b=this;c=b.parseBox(c);return b.addUnits(c.top,a)+" "+b.addUnits(c.right,a)+" "+b.addUnits(c.bottom,a)+" "+b.addUnits(c.left,a)},camelReplaceFn:function(b,c){return c.charAt(1).toUpperCase()},normalize:function(a){return this.propertyCache[a]||(this.propertyCache[a]=a.replace(this.camelRe,this.camelReplaceFn))},fromPoint:function(a,b){return Ext.get(document.elementFromPoint(a,b))},parseStyles:function(c){var a={},b=this.cssRe,d;if(c){b.lastIndex=0;while((d=b.exec(c))){a[d[1]]=d[2]}}return a}});Ext.dom.Element.addMembers({appendChild:function(a){this.dom.appendChild(Ext.getDom(a));return this},removeChild:function(a){this.dom.removeChild(Ext.getDom(a));return this},append:function(){this.appendChild.apply(this,arguments)},appendTo:function(a){Ext.getDom(a).appendChild(this.dom);return this},insertBefore:function(a){a=Ext.getDom(a);a.parentNode.insertBefore(this.dom,a);return this},insertAfter:function(a){a=Ext.getDom(a);a.parentNode.insertBefore(this.dom,a.nextSibling);return this},insertFirst:function(b){var a=Ext.getDom(b),d=this.dom,c=d.firstChild;if(!c){d.appendChild(a)}else{d.insertBefore(a,c)}return this},insertSibling:function(e,c,d){var f=this,b,a=(c||"before").toLowerCase()=="after",g;if(Ext.isArray(e)){g=f;Ext.each(e,function(h){b=Ext.fly(g,"_internal").insertSibling(h,c,d);if(a){g=b}});return b}e=e||{};if(e.nodeType||e.dom){b=f.dom.parentNode.insertBefore(Ext.getDom(e),a?f.dom.nextSibling:f.dom);if(!d){b=Ext.get(b)}}else{if(a&&!f.dom.nextSibling){b=Ext.core.DomHelper.append(f.dom.parentNode,e,!d)}else{b=Ext.core.DomHelper[a?"insertAfter":"insertBefore"](f.dom,e,!d)}}return b},replace:function(a){a=Ext.getDom(a);a.parentNode.replaceChild(this.dom,a);return this},replaceWith:function(a){var b=this;if(a.nodeType||a.dom||typeof a=="string"){a=Ext.get(a);b.dom.parentNode.insertBefore(a.dom,b.dom)}else{a=Ext.core.DomHelper.insertBefore(b.dom,a)}delete Ext.cache[b.id];Ext.removeNode(b.dom);b.id=Ext.id(b.dom=a);return b},doReplaceWith:function(a){var b=this.dom;b.parentNode.replaceChild(Ext.getDom(a),b)},createChild:function(b,a,c){b=b||{tag:"div"};if(a){return Ext.core.DomHelper.insertBefore(a,b,c!==true)}else{return Ext.core.DomHelper[!this.dom.firstChild?"insertFirst":"append"](this.dom,b,c!==true)}},wrap:function(b,c){var e=this.dom,f=this.self.create(b,c),d=(c)?f:f.dom,a=e.parentNode;if(a){a.insertBefore(d,e)}d.appendChild(e);return f},wrapAllChildren:function(a){var d=this.dom,b=d.childNodes,e=this.self.create(a),c=e.dom;while(b.length>0){c.appendChild(d.firstChild)}d.appendChild(c);return e},unwrapAllChildren:function(){var c=this.dom,b=c.childNodes,a=c.parentNode;if(a){while(b.length>0){a.insertBefore(c,c.firstChild)}this.destroy()}},unwrap:function(){var c=this.dom,a=c.parentNode,b;if(a){b=a.parentNode;b.insertBefore(c,a);b.removeChild(a)}else{b=document.createDocumentFragment();b.appendChild(c)}return this},detach:function(){var a=this.dom;if(a&&a.parentNode&&a.tagName!=="BODY"){a.parentNode.removeChild(a)}return this},insertHtml:function(b,c,a){var d=Ext.core.DomHelper.insertHtml(b,this.dom,c);return a?Ext.get(d):d}});Ext.dom.Element.override({getX:function(){return this.getXY()[0]},getY:function(){return this.getXY()[1]},getXY:function(){var b=this.dom.getBoundingClientRect(),a=Math.round;return[a(b.left+window.pageXOffset),a(b.top+window.pageYOffset)]},getOffsetsTo:function(a){var c=this.getXY(),b=Ext.fly(a,"_internal").getXY();return[c[0]-b[0],c[1]-b[1]]},setX:function(a){return this.setXY([a,this.getY()])},setY:function(a){return this.setXY([this.getX(),a])},setXY:function(d){var b=this;if(arguments.length>1){d=[d,arguments[1]]}var c=b.translatePoints(d),a=b.dom.style;for(d in c){if(!c.hasOwnProperty(d)){continue}if(!isNaN(c[d])){a[d]=c[d]+"px"}}return b},getLeft:function(){return parseInt(this.getStyle("left"),10)||0},getRight:function(){return parseInt(this.getStyle("right"),10)||0},getTop:function(){return parseInt(this.getStyle("top"),10)||0},getBottom:function(){return parseInt(this.getStyle("bottom"),10)||0},translatePoints:function(a,g){g=isNaN(a[1])?g:a[1];a=isNaN(a[0])?a:a[0];var d=this,e=d.isStyle("position","relative"),f=d.getXY(),b=parseInt(d.getStyle("left"),10),c=parseInt(d.getStyle("top"),10);b=!isNaN(b)?b:(e?0:d.dom.offsetLeft);c=!isNaN(c)?c:(e?0:d.dom.offsetTop);return{left:(a-f[0]+b),top:(g-f[1]+c)}},setBox:function(d){var c=this,b=d.width,a=d.height,f=d.top,e=d.left;if(e!==undefined){c.setLeft(e)}if(f!==undefined){c.setTop(f)}if(b!==undefined){c.setWidth(b)}if(a!==undefined){c.setHeight(a)}return this},getBox:function(g,j){var h=this,e=h.dom,c=e.offsetWidth,k=e.offsetHeight,n,f,d,a,m,i;if(!j){n=h.getXY()}else{if(g){n=[0,0]}else{n=[parseInt(h.getStyle("left"),10)||0,parseInt(h.getStyle("top"),10)||0]}}if(!g){f={x:n[0],y:n[1],0:n[0],1:n[1],width:c,height:k}}else{d=h.getBorderWidth.call(h,"l")+h.getPadding.call(h,"l");a=h.getBorderWidth.call(h,"r")+h.getPadding.call(h,"r");m=h.getBorderWidth.call(h,"t")+h.getPadding.call(h,"t");i=h.getBorderWidth.call(h,"b")+h.getPadding.call(h,"b");f={x:n[0]+d,y:n[1]+m,0:n[0]+d,1:n[1]+m,width:c-(d+a),height:k-(m+i)}}f.left=f.x;f.top=f.y;f.right=f.x+f.width;f.bottom=f.y+f.height;return f},getPageBox:function(e){var g=this,c=g.dom;if(!c){return new Ext.util.Region()}var j=c.offsetWidth,f=c.offsetHeight,m=g.getXY(),k=m[1],a=m[0]+j,i=m[1]+f,d=m[0];if(e){return new Ext.util.Region(k,a,i,d)}else{return{left:d,top:k,width:j,height:f,right:a,bottom:i}}}});Ext.dom.Element.addMembers({WIDTH:"width",HEIGHT:"height",MIN_WIDTH:"min-width",MIN_HEIGHT:"min-height",MAX_WIDTH:"max-width",MAX_HEIGHT:"max-height",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left",VISIBILITY:1,DISPLAY:2,OFFSETS:3,SEPARATOR:"-",trimRe:/^\s+|\s+$/g,wordsRe:/\w/g,spacesRe:/\s+/,styleSplitRe:/\s*(?::|;)\s*/,transparentRe:/^(?:transparent|(?:rgba[(](?:\s*\d+\s*[,]){3}\s*0\s*[)]))$/i,classNameSplitRegex:/[\s]+/,borders:{t:"border-top-width",r:"border-right-width",b:"border-bottom-width",l:"border-left-width"},paddings:{t:"padding-top",r:"padding-right",b:"padding-bottom",l:"padding-left"},margins:{t:"margin-top",r:"margin-right",b:"margin-bottom",l:"margin-left"},defaultUnit:"px",isSynchronized:false,synchronize:function(){var g=this.dom,a={},d=g.className,f,c,e,b;if(d.length>0){f=g.className.split(this.classNameSplitRegex);for(c=0,e=f.length;c0?a:0},getWidth:function(a){var c=this.dom,b=a?(c.clientWidth-this.getPadding("lr")):c.offsetWidth;return b>0?b:0},getBorderWidth:function(a){return this.addStyles(a,this.borders)},getPadding:function(a){return this.addStyles(a,this.paddings)},applyStyles:function(d){if(d){var e=this.dom,c,b,a;if(typeof d=="function"){d=d.call()}c=typeof d;if(c=="string"){d=Ext.util.Format.trim(d).split(this.styleSplitRe);for(b=0,a=d.length;b "+a,c.dom);return b?d:Ext.get(d)},parent:function(a,b){return this.matchNode("parentNode","parentNode",a,b)},next:function(a,b){return this.matchNode("nextSibling","nextSibling",a,b)},prev:function(a,b){return this.matchNode("previousSibling","previousSibling",a,b)},first:function(a,b){return this.matchNode("nextSibling","firstChild",a,b)},last:function(a,b){return this.matchNode("previousSibling","lastChild",a,b)},matchNode:function(b,e,a,c){if(!this.dom){return null}var d=this.dom[e];while(d){if(d.nodeType==1&&(!a||Ext.DomQuery.is(d,a))){return !c?Ext.get(d):d}d=d[b]}return null},isAncestor:function(a){return this.self.isAncestor.call(this.self,this.dom,a)}});Ext.define("Ext.dom.CompositeElementLite",{alternateClassName:["Ext.CompositeElementLite","Ext.CompositeElement"],statics:{importElementMethods:function(){}},constructor:function(b,a){this.elements=[];this.add(b,a);this.el=new Ext.dom.Element.Fly()},isComposite:true,getElement:function(a){return this.el.attach(a).synchronize()},transformElement:function(a){return Ext.getDom(a)},getCount:function(){return this.elements.length},add:function(c,a){var e=this.elements,b,d;if(!c){return this}if(typeof c=="string"){c=Ext.dom.Element.selectorFunction(c,a)}else{if(c.isComposite){c=c.elements}else{if(!Ext.isIterable(c)){c=[c]}}}for(b=0,d=c.length;b-1){c=Ext.getDom(c);if(a){f=this.elements[b];f.parentNode.insertBefore(c,f);Ext.removeNode(f)}Ext.Array.splice(this.elements,b,1,c)}return this},clear:function(){this.elements=[]},addElements:function(c,a){if(!c){return this}if(typeof c=="string"){c=Ext.dom.Element.selectorFunction(c,a)}var b=this.elements;Ext.each(c,function(d){b.push(Ext.get(d))});return this},first:function(){return this.item(0)},last:function(){return this.item(this.getCount()-1)},contains:function(a){return this.indexOf(a)!=-1},removeElement:function(c,e){var b=this,d=this.elements,a;Ext.each(c,function(f){if((a=(d[f]||d[f=b.indexOf(f)]))){if(e){if(a.dom){a.remove()}else{Ext.removeNode(a)}}Ext.Array.erase(d,f,1)}});return this}},function(){var a=Ext.dom.Element,d=a.prototype,c=this.prototype,b;for(b in d){if(typeof d[b]=="function"){(function(e){if(e==="destroy"){c[e]=function(){return this.invoke(e,arguments)}}else{c[e]=c[e]||function(){return this.invoke(e,arguments)}}}).call(c,b)}}c.on=c.addListener;a.selectorFunction=Ext.DomQuery.select;Ext.dom.Element.select=function(e,h,f){var g;if(typeof e=="string"){g=Ext.dom.Element.selectorFunction(e,f)}else{if(e.length!==undefined){g=e}else{}}return(h===true)?new Ext.dom.CompositeElement(g):new Ext.dom.CompositeElementLite(g)};Ext.select=function(){return a.select.apply(a,arguments)}});Ext.define("Ext.event.ListenerStack",{currentOrder:"current",length:0,constructor:function(){this.listeners={before:[],current:[],after:[]};this.lateBindingMap={};return this},add:function(h,j,k,e){var a=this.lateBindingMap,g=this.getAll(e),f=g.length,b,d,c;if(typeof h=="string"&&j.isIdentifiable){c=j.getId();b=a[c];if(b){if(b[h]){return false}else{b[h]=true}}else{a[c]=b={};b[h]=true}}else{if(f>0){while(f--){d=g[f];if(d.fn===h&&d.scope===j){d.options=k;return false}}}}d=this.create(h,j,k,e);if(k&&k.prepend){delete k.prepend;g.unshift(d)}else{g.push(d)}this.length++;return true},getAt:function(b,a){return this.getAll(a)[b]},getAll:function(a){if(!a){a=this.currentOrder}return this.listeners[a]},count:function(a){return this.getAll(a).length},create:function(d,c,b,a){return{stack:this,fn:d,firingFn:false,boundFn:false,isLateBinding:typeof d=="string",scope:c,options:b||{},order:a}},remove:function(h,j,e){var g=this.getAll(e),f=g.length,b=false,a=this.lateBindingMap,d,c;if(f>0){while(f--){d=g[f];if(d.fn===h&&d.scope===j){g.splice(f,1);b=true;this.length--;if(typeof h=="string"&&j.isIdentifiable){c=j.getId();if(a[c]&&a[c][h]){delete a[c][h]}}break}}}return b}});Ext.define("Ext.event.Controller",{isFiring:false,listenerStack:null,constructor:function(a){this.firingListeners=[];this.firingArguments=[];this.setInfo(a);return this},setInfo:function(a){this.info=a},getInfo:function(){return this.info},setListenerStacks:function(a){this.listenerStacks=a},fire:function(h,e){var n=this.listenerStacks,m=this.firingListeners,d=this.firingArguments,k=m.push,g=n.length,j,l,c,o,a=false,b=false,f;m.length=0;if(e){if(e.order!=="after"){a=true}else{b=true}}if(g===1){j=n[0].listeners;l=j.before;c=j.current;o=j.after;if(l.length>0){k.apply(m,l)}if(a){k.call(m,e)}if(c.length>0){k.apply(m,c)}if(b){k.call(m,e)}if(o.length>0){k.apply(m,o)}}else{for(f=0;f0){k.apply(m,l)}}if(a){k.call(m,e)}for(f=0;f0){k.apply(m,c)}}if(b){k.call(m,e)}for(f=0;f0){k.apply(m,o)}}}if(m.length===0){return this}if(!h){h=[]}d.length=0;d.push.apply(d,h);d.push(null,this);this.doFire();return this},doFire:function(){var k=this.firingListeners,c=this.firingArguments,g=c.length-2,d,f,b,o,h,n,a,j,l,e,m;this.isPausing=false;this.isPaused=false;this.isStopped=false;this.isFiring=true;for(d=0,f=k.length;d0){this.isPaused=false;this.doFire()}if(a){a.resume()}return this},isInterrupted:function(){return this.isStopped||this.isPaused},stop:function(){var a=this.connectingController;this.isStopped=true;if(a){this.connectingController=null;a.stop()}this.isFiring=false;this.listenerStacks=null;return this},pause:function(){var a=this.connectingController;this.isPausing=true;if(a){a.pause()}return this}});Ext.define("Ext.event.Dispatcher",{statics:{getInstance:function(){if(!this.instance){this.instance=new this()}return this.instance},setInstance:function(a){this.instance=a;return this}},config:{publishers:{}},wildcard:"*",constructor:function(a){this.listenerStacks={};this.activePublishers={};this.publishersCache={};this.noActivePublishers=[];this.controller=null;this.initConfig(a);return this},getListenerStack:function(e,g,c,b){var d=this.listenerStacks,f=d[e],a;b=Boolean(b);if(!f){if(b){d[e]=f={}}else{return null}}f=f[g];if(!f){if(b){d[e][g]=f={}}else{return null}}a=f[c];if(!a){if(b){f[c]=a=new Ext.event.ListenerStack()}else{return null}}return a},getController:function(d,f,c,b){var a=this.controller,e={targetType:d,target:f,eventName:c};if(!a){this.controller=a=new Ext.event.Controller()}if(a.isFiring){a=new Ext.event.Controller()}a.setInfo(e);if(b&&a!==b){a.connect(b)}return a},applyPublishers:function(c){var a,b;this.publishersCache={};for(a in c){if(c.hasOwnProperty(a)){b=c[a];this.registerPublisher(b)}}return c},registerPublisher:function(b){var a=this.activePublishers,c=b.getTargetType(),d=a[c];if(!d){a[c]=d=[]}d.push(b);b.setDispatcher(this);return this},getCachedActivePublishers:function(c,b){var a=this.publishersCache,d;if((d=a[c])&&(d=d[b])){return d}return null},cacheActivePublishers:function(c,b,d){var a=this.publishersCache;if(!a[c]){a[c]={}}a[c][b]=d;return d},getActivePublishers:function(f,b){var g,a,c,e,d;if((g=this.getCachedActivePublishers(f,b))){return g}a=this.activePublishers[f];if(a){g=[];for(c=0,e=a.length;c0}return false},addListener:function(e,f,b){var g=this.getActivePublishers(e,b),d=g.length,c,a;a=this.doAddListener.apply(this,arguments);if(a&&d>0){for(c=0;c0){for(c=0;c0){for(b=0;b 0 ? +1 : (Ext.Date.getWeekOfYear(this) >= 52 && this.getMonth() < 11 ? -1 : 0)))",Y:"Ext.String.leftPad(this.getFullYear(), 4, '0')",y:"('' + this.getFullYear()).substring(2, 4)",a:"(this.getHours() < 12 ? 'am' : 'pm')",A:"(this.getHours() < 12 ? 'AM' : 'PM')",g:"((this.getHours() % 12) ? this.getHours() % 12 : 12)",G:"this.getHours()",h:"Ext.String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0')",H:"Ext.String.leftPad(this.getHours(), 2, '0')",i:"Ext.String.leftPad(this.getMinutes(), 2, '0')",s:"Ext.String.leftPad(this.getSeconds(), 2, '0')",u:"Ext.String.leftPad(this.getMilliseconds(), 3, '0')",O:"Ext.Date.getGMTOffset(this)",P:"Ext.Date.getGMTOffset(this, true)",T:"Ext.Date.getTimezone(this)",Z:"(this.getTimezoneOffset() * -60)",c:function(){for(var j="Y-m-dTH:i:sP",g=[],f=0,d=j.length;f= 0 && y >= 0){","v = Ext.Date.add(new Date(y < 100 ? 100 : y, 0, 1, h, i, s, ms), Ext.Date.YEAR, y < 100 ? y - 100 : 0);","v = !strict? v : (strict === true && (z <= 364 || (Ext.Date.isLeapYear(v) && z <= 365))? Ext.Date.add(v, Ext.Date.DAY, z) : null);","}else if(strict === true && !Ext.Date.isValid(y, m + 1, d, h, i, s, ms)){","v = null;","}else{","v = Ext.Date.add(new Date(y < 100 ? 100 : y, m, d, h, i, s, ms), Ext.Date.YEAR, y < 100 ? y - 100 : 0);","}","}","}","if(v){","if(zz != null){","v = Ext.Date.add(v, Ext.Date.SECOND, -v.getTimezoneOffset() * 60 - zz);","}else if(o){","v = Ext.Date.add(v, Ext.Date.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn));","}","}","return v;"].join("\n");return function(l){var e=a.parseRegexes.length,m=1,f=[],k=[],j=false,d="";for(var h=0;h Ext.Date.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"},a:{g:1,c:"if (/(am)/i.test(results[{0}])) {\nif (!h || h == 12) { h = 0; }\n} else { if (!h || h < 12) { h = (h || 0) + 12; }}",s:"(am|pm|AM|PM)"},A:{g:1,c:"if (/(am)/i.test(results[{0}])) {\nif (!h || h == 12) { h = 0; }\n} else { if (!h || h < 12) { h = (h || 0) + 12; }}",s:"(AM|PM|am|pm)"},g:function(){return a.formatCodeToRegex("G")},G:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{1,2})"},h:function(){return a.formatCodeToRegex("H")},H:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},i:{g:1,c:"i = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},s:{g:1,c:"s = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},u:{g:1,c:"ms = results[{0}]; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n",s:"(\\d+)"},O:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1),","hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60),","mn = o.substring(3,5) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + Ext.String.leftPad(hr, 2, '0') + Ext.String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{4})"},P:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1),","hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60),","mn = o.substring(4,6) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + Ext.String.leftPad(hr, 2, '0') + Ext.String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{2}:\\d{2})"},T:{g:0,c:null,s:"[A-Z]{1,4}"},Z:{g:1,c:"zz = results[{0}] * 1;\nzz = (-43200 <= zz && zz <= 50400)? zz : null;\n",s:"([+-]?\\d{1,5})"},c:function(){var e=[],c=[a.formatCodeToRegex("Y",1),a.formatCodeToRegex("m",2),a.formatCodeToRegex("d",3),a.formatCodeToRegex("h",4),a.formatCodeToRegex("i",5),a.formatCodeToRegex("s",6),{c:"ms = results[7] || '0'; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n"},{c:["if(results[8]) {","if(results[8] == 'Z'){","zz = 0;","}else if (results[8].indexOf(':') > -1){",a.formatCodeToRegex("P",8).c,"}else{",a.formatCodeToRegex("O",8).c,"}","}"].join("\n")}];for(var f=0,d=c.length;f0?"-":"+")+Ext.String.leftPad(Math.floor(Math.abs(e)/60),2,"0")+(d?":":"")+Ext.String.leftPad(Math.abs(e%60),2,"0")},getDayOfYear:function(f){var e=0,h=Ext.Date.clone(f),c=f.getMonth(),g;for(g=0,h.setDate(1),h.setMonth(0);g28){c=Math.min(c,Ext.Date.getLastDateOfMonth(Ext.Date.add(Ext.Date.getFirstDateOfMonth(f),"mo",g)).getDate())}h.setDate(c);h.setMonth(f.getMonth()+g);break;case Ext.Date.YEAR:h.setFullYear(f.getFullYear()+g);break}return h},between:function(d,f,c){var e=d.getTime();return f.getTime()<=e&&e<=c.getTime()},diff:function(e,c,g){var d=Ext.Date,f,h=+c-e;switch(g){case d.MILLI:return h;case d.SECOND:return Math.floor(h/1000);case d.MINUTE:return Math.floor(h/60000);case d.HOUR:return Math.floor(h/3600000);case d.DAY:return Math.floor(h/86400000);case"w":return Math.floor(h/604800000);case d.MONTH:f=(c.getFullYear()*12+c.getMonth())-(e.getFullYear()*12+e.getMonth());if(Ext.Date.add(e,g,f)>c){return f-1}else{return f}case d.YEAR:f=c.getFullYear()-e.getFullYear();if(Ext.Date.add(e,g,f)>c){return f-1}else{return f}}},align:function(d,f,e){var c=new Date(+d);switch(f.toLowerCase()){case Ext.Date.MILLI:return c;break;case Ext.Date.SECOND:c.setUTCSeconds(c.getUTCSeconds()-c.getUTCSeconds()%e);c.setUTCMilliseconds(0);return c;break;case Ext.Date.MINUTE:c.setUTCMinutes(c.getUTCMinutes()-c.getUTCMinutes()%e);c.setUTCSeconds(0);c.setUTCMilliseconds(0);return c;break;case Ext.Date.HOUR:c.setUTCHours(c.getUTCHours()-c.getUTCHours()%e);c.setUTCMinutes(0);c.setUTCSeconds(0);c.setUTCMilliseconds(0);return c;break;case Ext.Date.DAY:if(e==7||e==14){c.setUTCDate(c.getUTCDate()-c.getUTCDay()+1)}c.setUTCHours(0);c.setUTCMinutes(0);c.setUTCSeconds(0);c.setUTCMilliseconds(0);return c;break;case Ext.Date.MONTH:c.setUTCMonth(c.getUTCMonth()-(c.getUTCMonth()-1)%e,1);c.setUTCHours(0);c.setUTCMinutes(0);c.setUTCSeconds(0);c.setUTCMilliseconds(0);return c;break;case Ext.Date.YEAR:c.setUTCFullYear(c.getUTCFullYear()-c.getUTCFullYear()%e,1,1);c.setUTCHours(0);c.setUTCMinutes(0);c.setUTCSeconds(0);c.setUTCMilliseconds(0);return d;break}}};var a=Ext.DateExtras;Ext.apply(Ext.Date,a)})();Ext.define("Ext.util.Format",{singleton:true,defaultDateFormat:"m/d/Y",escapeRe:/('|\\)/g,trimRe:/^[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+|[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+$/g,formatRe:/\{(\d+)\}/g,escapeRegexRe:/([-.*+?^${}()|[\]\/\\])/g,dashesRe:/-/g,iso8601TestRe:/\d\dT\d\d/,iso8601SplitRe:/[- :T\.Z\+]/,ellipsis:function(c,a,d){if(c&&c.length>a){if(d){var e=c.substr(0,a-2),b=Math.max(e.lastIndexOf(" "),e.lastIndexOf("."),e.lastIndexOf("!"),e.lastIndexOf("?"));if(b!=-1&&b>=(a-15)){return e.substr(0,b)+"..."}}return c.substr(0,a-3)+"..."}return c},escapeRegex:function(a){return a.replace(Ext.util.Format.escapeRegexRe,"\\$1")},escape:function(a){return a.replace(Ext.util.Format.escapeRe,"\\$1")},toggle:function(b,c,a){return b==c?a:c},trim:function(a){return a.replace(Ext.util.Format.trimRe,"")},leftPad:function(d,b,c){var a=String(d);c=c||" ";while(a.length/g,">").replace(/").replace(/</g,"<").replace(/"/g,'"').replace(/&/g,"&")},date:function(f,g){var b=f;if(!f){return""}if(!Ext.isDate(f)){b=new Date(Date.parse(f));if(isNaN(b)){if(this.iso8601TestRe.test(f)){if(Ext.os.is.Android&&Ext.os.version.isLessThan("3.0")){var h=[1,4,5,6,7,10,11];var e,d=0;if((e=/^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec(f))){for(var c=0,a;(a=h[c]);++c){e[a]=+e[a]||0}e[2]=(+e[2]||1)-1;e[3]=+e[3]||1;if(e[8]!=="Z"&&e[9]!==undefined){d=e[10]*60+e[11];if(e[9]==="+"){d=0-d}}b=new Date(Date.UTC(e[1],e[2],e[3],e[4],e[5]+d,e[6],e[7]))}}else{b=f.split(this.iso8601SplitRe);b=new Date(b[0],b[1]-1,b[2],b[3],b[4],b[5])}}}if(isNaN(b)){b=new Date(Date.parse(f.replace(this.dashesRe,"/")))}f=b}return Ext.Date.format(f,g||Ext.util.Format.defaultDateFormat)}});Ext.define("Ext.Template",{inheritableStatics:{from:function(b,a){b=Ext.getDom(b);return new this(b.value||b.innerHTML,a||"")}},constructor:function(d){var f=this,b=arguments,a=[],c=0,e=b.length,g;f.initialConfig={};if(e===1&&Ext.isArray(d)){b=d;e=b.length}if(e>1){for(;c]*)\>)|(?:<\/tpl>)/g,actionsRe:/\s*(elif|elseif|if|for|exec|switch|case|eval)\s*\=\s*(?:(?:"([^"]*)")|(?:'([^']*)'))\s*/g,propRe:/prop=(?:(?:"([^"]*)")|(?:'([^']*)'))/,defaultRe:/^\s*default\s*$/,elseRe:/^\s*else\s*$/});Ext.define("Ext.XTemplateCompiler",{extend:Ext.XTemplateParser,useEval:Ext.isGecko,useIndex:Ext.isIE6||Ext.isIE7,useFormat:true,propNameRe:/^[\w\d\$]*$/,compile:function(a){var c=this,b=c.generate(a);return c.useEval?c.evalTpl(b):(new Function("Ext",b))(Ext)},generate:function(a){var d=this,b="var fm=Ext.util.Format,ts=Object.prototype.toString;",c;d.maxLevel=0;d.body=["var c0=values, a0="+d.createArrayTest(0)+", p0=parent, n0=xcount, i0=xindex, v;\n"];if(d.definitions){if(typeof d.definitions==="string"){d.definitions=[d.definitions,b]}else{d.definitions.push(b)}}else{d.definitions=[b]}d.switches=[];d.parse(a);d.definitions.push((d.useEval?"$=":"return")+" function ("+d.fnArgs+") {",d.body.join(""),"}");c=d.definitions.join("\n");d.definitions.length=d.body.length=d.switches.length=0;delete d.definitions;delete d.body;delete d.switches;return c},doText:function(c){var b=this,a=b.body;c=c.replace(b.aposRe,"\\'").replace(b.newLineRe,"\\n");if(b.useIndex){a.push("out[out.length]='",c,"'\n")}else{a.push("out.push('",c,"')\n")}},doExpr:function(b){var a=this.body;a.push("v="+b+"; if (v !== undefined && v !== null) out");if(this.useIndex){a.push("[out.length]=v+''\n")}else{a.push(".push(v+'')\n")}},doTag:function(a){this.doExpr(this.parseTag(a))},doElse:function(){this.body.push("} else {\n")},doEval:function(a){this.body.push(a,"\n")},doIf:function(b,c){var a=this;if(b==="."){a.body.push("if (values) {\n")}else{if(a.propNameRe.test(b)){a.body.push("if (",a.parseTag(b),") {\n")}else{a.body.push("if (",a.addFn(b),a.callFn,") {\n")}}if(c.exec){a.doExec(c.exec)}},doElseIf:function(b,c){var a=this;if(b==="."){a.body.push("else if (values) {\n")}else{if(a.propNameRe.test(b)){a.body.push("} else if (",a.parseTag(b),") {\n")}else{a.body.push("} else if (",a.addFn(b),a.callFn,") {\n")}}if(c.exec){a.doExec(c.exec)}},doSwitch:function(b){var a=this;if(b==="."){a.body.push("switch (values) {\n")}else{if(a.propNameRe.test(b)){a.body.push("switch (",a.parseTag(b),") {\n")}else{a.body.push("switch (",a.addFn(b),a.callFn,") {\n")}}a.switches.push(0)},doCase:function(e){var d=this,c=Ext.isArray(e)?e:[e],f=d.switches.length-1,a,b;if(d.switches[f]){d.body.push("break;\n")}else{d.switches[f]++}for(b=0,f=c.length;bb){this.isEnded=true;return this.getEndValue()}else{return this.getStartValue()+((a/b)*this.distance)}}});Ext.define("Ext.util.translatable.Abstract",{extend:Ext.Evented,config:{useWrapper:null,easing:null,easingX:null,easingY:null},x:0,y:0,activeEasingX:null,activeEasingY:null,isAnimating:false,isTranslatable:true,constructor:function(a){this.initConfig(a)},factoryEasing:function(a){return Ext.factory(a,Ext.fx.easing.Linear,null,"easing")},applyEasing:function(a){if(!this.getEasingX()){this.setEasingX(this.factoryEasing(a))}if(!this.getEasingY()){this.setEasingY(this.factoryEasing(a))}},applyEasingX:function(a){return this.factoryEasing(a)},applyEasingY:function(a){return this.factoryEasing(a)},doTranslate:Ext.emptyFn,translate:function(a,c,b){if(b){return this.translateAnimated(a,c,b)}if(this.isAnimating){this.stopAnimation()}if(!isNaN(a)&&typeof a=="number"){this.x=a}if(!isNaN(c)&&typeof c=="number"){this.y=c}this.doTranslate(a,c)},translateAxis:function(b,d,c){var a,e;if(b=="x"){a=d}else{e=d}return this.translate(a,e,c)},animate:function(b,a){this.activeEasingX=b;this.activeEasingY=a;this.isAnimating=true;this.lastX=null;this.lastY=null;Ext.AnimationQueue.start(this.doAnimationFrame,this);this.fireEvent("animationstart",this,this.x,this.y);return this},translateAnimated:function(b,g,e){if(!Ext.isObject(e)){e={}}if(this.isAnimating){this.stopAnimation()}var d=Ext.Date.now(),f=e.easing,c=(typeof b=="number")?(e.easingX||f||this.getEasingX()||true):null,a=(typeof g=="number")?(e.easingY||f||this.getEasingY()||true):null;if(c){c=this.factoryEasing(c);c.setStartTime(d);c.setStartValue(this.x);c.setEndValue(b);if("duration" in e){c.setDuration(e.duration)}}if(a){a=this.factoryEasing(a);a.setStartTime(d);a.setStartValue(this.y);a.setEndValue(g);if("duration" in e){a.setDuration(e.duration)}}return this.animate(c,a)},doAnimationFrame:function(){var e=this,c=e.activeEasingX,b=e.activeEasingY,d=Date.now(),a,f;if(!e.isAnimating){return}e.lastRun=d;if(c===null&&b===null){e.stopAnimation();return}if(c!==null){e.x=a=Math.round(c.getValue());if(c.isEnded){e.activeEasingX=null;e.fireEvent("axisanimationend",e,"x",a)}}else{a=e.x}if(b!==null){e.y=f=Math.round(b.getValue());if(b.isEnded){e.activeEasingY=null;e.fireEvent("axisanimationend",e,"y",f)}}else{f=e.y}if(e.lastX!==a||e.lastY!==f){e.doTranslate(a,f);e.lastX=a;e.lastY=f}e.fireEvent("animationframe",e,a,f)},stopAnimation:function(){if(!this.isAnimating){return}this.activeEasingX=null;this.activeEasingY=null;this.isAnimating=false;Ext.AnimationQueue.stop(this.doAnimationFrame,this);this.fireEvent("animationend",this,this.x,this.y)},refresh:function(){this.translate(this.x,this.y)},destroy:function(){if(this.isAnimating){this.stopAnimation()}this.callParent(arguments)}});Ext.define("Ext.util.translatable.Dom",{extend:Ext.util.translatable.Abstract,config:{element:null},applyElement:function(a){if(!a){return}return Ext.get(a)},updateElement:function(){this.refresh()}});Ext.define("Ext.util.translatable.CssTransform",{extend:Ext.util.translatable.Dom,doTranslate:function(a,c){var b=this.getElement();if(!this.isDestroyed&&!b.isDestroyed){b.translate(a,c)}},destroy:function(){var a=this.getElement();if(a&&!a.isDestroyed){a.dom.style.webkitTransform=null}this.callSuper()}});Ext.define("Ext.util.translatable.ScrollPosition",{extend:Ext.util.translatable.Dom,type:"scrollposition",config:{useWrapper:true},getWrapper:function(){var c=this.wrapper,b=this.getElement(),a;if(!c){a=b.getParent();if(!a){return null}if(a.hasCls(Ext.baseCSSPrefix+"translatable-hboxfix")){a=a.getParent()}if(this.getUseWrapper()){c=b.wrap()}else{c=a}b.addCls("x-translatable");c.addCls("x-translatable-container");this.wrapper=c;c.on("painted",function(){if(!this.isAnimating){this.refresh()}},this);this.refresh()}return c},doTranslate:function(a,d){var c=this.getWrapper(),b;if(c){b=c.dom;if(typeof a=="number"){b.scrollLeft=500000-a}if(typeof d=="number"){b.scrollTop=500000-d}}},destroy:function(){var a=this.getElement(),b=this.wrapper;if(b){if(!a.isDestroyed){if(this.getUseWrapper()){b.doReplaceWith(a)}a.removeCls("x-translatable")}if(!b.isDestroyed){b.removeCls("x-translatable-container");b.un("painted","refresh",this)}delete this.wrapper;delete this._element}this.callSuper()}});Ext.define("Ext.util.translatable.CssPosition",{extend:Ext.util.translatable.Dom,doTranslate:function(a,c){var b=this.getElement().dom.style;if(typeof a=="number"){b.left=a+"px"}if(typeof c=="number"){b.top=c+"px"}},destroy:function(){var a=this.getElement().dom.style;a.left=null;a.top=null;this.callParent(arguments)}});Ext.define("Ext.util.Translatable",{constructor:function(a){var b=Ext.util.translatable;switch(Ext.browser.getPreferredTranslationMethod(a)){case"scrollposition":return new b.ScrollPosition(a);case"csstransform":return new b.CssTransform(a);case"cssposition":return new b.CssPosition(a)}}});Ext.define("Ext.behavior.Translatable",{extend:Ext.behavior.Behavior,setConfig:function(c){var a=this.translatable,b=this.component;if(c){if(!a){this.translatable=a=new Ext.util.Translatable(c);a.setElement(b.renderElement);a.on("destroy","onTranslatableDestroy",this)}else{if(Ext.isObject(c)){a.setConfig(c)}}}else{if(a){a.destroy()}}return this},getTranslatable:function(){return this.translatable},onTranslatableDestroy:function(){delete this.translatable},onComponentDestroy:function(){var a=this.translatable;if(a){a.destroy()}}});Ext.define("Ext.util.Draggable",{isDraggable:true,mixins:[Ext.mixin.Observable],config:{cls:Ext.baseCSSPrefix+"draggable",draggingCls:Ext.baseCSSPrefix+"dragging",element:null,constraint:"container",disabled:null,direction:"both",initialOffset:{x:0,y:0},translatable:{}},DIRECTION_BOTH:"both",DIRECTION_VERTICAL:"vertical",DIRECTION_HORIZONTAL:"horizontal",defaultConstraint:{min:{x:-Infinity,y:-Infinity},max:{x:Infinity,y:Infinity}},containerWidth:0,containerHeight:0,width:0,height:0,constructor:function(a){var b;this.extraConstraint={};this.initialConfig=a;this.offset={x:0,y:0};this.listeners={dragstart:"onDragStart",drag:"onDrag",dragend:"onDragEnd",resize:"onElementResize",touchstart:"onPress",touchend:"onRelease",scope:this};if(a&&a.element){b=a.element;delete a.element;this.setElement(b)}return this},applyElement:function(a){if(!a){return}return Ext.get(a)},updateElement:function(a){a.on(this.listeners);this.initConfig(this.initialConfig)},updateInitialOffset:function(b){if(typeof b=="number"){b={x:b,y:b}}var c=this.offset,a,d;c.x=a=b.x;c.y=d=b.y;this.getTranslatable().translate(a,d)},updateCls:function(a){this.getElement().addCls(a)},applyTranslatable:function(a,b){a=Ext.factory(a,Ext.util.Translatable,b);if(a){a.setElement(this.getElement())}return a},setExtraConstraint:function(a){this.extraConstraint=a||{};this.refreshConstraint();return this},addExtraConstraint:function(a){Ext.merge(this.extraConstraint,a);this.refreshConstraint();return this},applyConstraint:function(a){this.currentConstraint=a;if(!a){a=this.defaultConstraint}if(a==="container"){return Ext.merge(this.getContainerConstraint(),this.extraConstraint)}return Ext.merge({},this.extraConstraint,a)},updateConstraint:function(){this.refreshOffset()},getContainerConstraint:function(){var a=this.getContainer(),b=this.getElement();if(!a||!b.dom){return this.defaultConstraint}return{min:{x:0,y:0},max:{x:this.containerWidth-this.width,y:this.containerHeight-this.height}}},getContainer:function(){var a=this.container;if(!a){a=this.getElement().getParent();if(a){this.container=a;a.on({resize:"onContainerResize",destroy:"onContainerDestroy",scope:this})}}return a},onElementResize:function(a,b){this.width=b.width;this.height=b.height;this.refresh()},onContainerResize:function(a,b){this.containerWidth=b.width;this.containerHeight=b.height;this.refresh()},onContainerDestroy:function(){delete this.container;delete this.containerSizeMonitor},detachListeners:function(){this.getElement().un(this.listeners)},isAxisEnabled:function(a){var b=this.getDirection();if(a==="x"){return(b===this.DIRECTION_BOTH||b===this.DIRECTION_HORIZONTAL)}return(b===this.DIRECTION_BOTH||b===this.DIRECTION_VERTICAL)},onPress:function(a){this.fireAction("touchstart",[this,a])},onRelease:function(a){this.fireAction("touchend",[this,a])},onDragStart:function(a){if(this.getDisabled()){return false}var b=this.offset;this.fireAction("dragstart",[this,a,b.x,b.y],this.initDragStart)},initDragStart:function(b,c,a,d){this.dragStartOffset={x:a,y:d};this.isDragging=true;this.getElement().addCls(this.getDraggingCls())},onDrag:function(b){if(!this.isDragging){return}var a=this.dragStartOffset;this.fireAction("drag",[this,b,a.x+b.deltaX,a.y+b.deltaY],this.doDrag)},doDrag:function(b,c,a,d){b.setOffset(a,d)},onDragEnd:function(a){if(!this.isDragging){return}this.onDrag(a);this.isDragging=false;this.getElement().removeCls(this.getDraggingCls());this.fireEvent("dragend",this,a,this.offset.x,this.offset.y)},setOffset:function(i,h,b){var f=this.offset,a=this.getConstraint(),e=a.min,c=a.max,d=Math.min,g=Math.max;if(this.isAxisEnabled("x")&&typeof i=="number"){i=d(g(i,e.x),c.x)}else{i=f.x}if(this.isAxisEnabled("y")&&typeof h=="number"){h=d(g(h,e.y),c.y)}else{h=f.y}f.x=i;f.y=h;this.getTranslatable().translate(i,h,b)},getOffset:function(){return this.offset},refreshConstraint:function(){this.setConstraint(this.currentConstraint)},refreshOffset:function(){var a=this.offset;this.setOffset(a.x,a.y)},refresh:function(){this.refreshConstraint();this.getTranslatable().refresh();this.refreshOffset()},enable:function(){return this.setDisabled(false)},disable:function(){return this.setDisabled(true)},destroy:function(){var a=this.getTranslatable();var b=this.getElement();if(b&&!b.isDestroyed){b.removeCls(this.getCls())}this.detachListeners();if(a){a.destroy()}}},function(){});Ext.define("Ext.behavior.Draggable",{extend:Ext.behavior.Behavior,setConfig:function(c){var a=this.draggable,b=this.component;if(c){if(!a){b.setTranslatable(c.translatable);this.draggable=a=new Ext.util.Draggable(c);a.setTranslatable(b.getTranslatable());a.setElement(b.renderElement);a.on("destroy","onDraggableDestroy",this);b.on(this.listeners)}else{if(Ext.isObject(c)){a.setConfig(c)}}}else{if(a){a.destroy()}}return this},getDraggable:function(){return this.draggable},onDraggableDestroy:function(){delete this.draggable},onComponentDestroy:function(){var a=this.draggable;if(a){a.destroy()}}});(function(a){Ext.define("Ext.Component",{extend:Ext.AbstractComponent,alternateClassName:"Ext.lib.Component",mixins:[Ext.mixin.Traversable],xtype:"component",observableType:"component",cachedConfig:{baseCls:null,cls:null,floatingCls:a+"floating",hiddenCls:a+"item-hidden",ui:null,margin:null,padding:null,border:null,styleHtmlCls:a+"html",styleHtmlContent:null},eventedConfig:{flex:null,left:null,top:null,right:null,bottom:null,width:null,height:null,minWidth:null,minHeight:null,maxWidth:null,maxHeight:null,docked:null,centered:null,hidden:null,disabled:null},config:{style:null,html:null,draggable:null,translatable:null,renderTo:null,zIndex:null,tpl:null,enterAnimation:null,exitAnimation:null,showAnimation:null,hideAnimation:null,tplWriteMode:"overwrite",data:null,disabledCls:a+"item-disabled",contentEl:null,itemId:undefined,record:null,plugins:null},listenerOptionsRegex:/^(?:delegate|single|delay|buffer|args|prepend|element)$/,alignmentRegex:/^([a-z]+)-([a-z]+)(\?)?$/,isComponent:true,floating:false,rendered:false,isInner:true,activeAnimation:null,dockPositions:{top:true,right:true,bottom:true,left:true},innerElement:null,element:null,template:[],widthLayoutSized:false,heightLayoutSized:false,layoutStretched:false,sizeState:false,sizeFlags:0,LAYOUT_WIDTH:1,LAYOUT_HEIGHT:2,LAYOUT_BOTH:3,LAYOUT_STRETCHED:4,constructor:function(c){var d=this,b=d.config,e;d.onInitializedListeners=[];d.initialConfig=c;if(c!==undefined&&"id" in c){e=c.id}else{if("id" in b){e=b.id}else{e=d.getId()}}d.id=e;d.setId(e);Ext.ComponentManager.register(d);d.initElement();d.initConfig(d.initialConfig);d.refreshSizeState=d.doRefreshSizeState;d.refreshFloating=d.doRefreshFloating;if(d.refreshSizeStateOnInitialized){d.refreshSizeState()}if(d.refreshFloatingOnInitialized){d.refreshFloating()}d.initialize();d.triggerInitialized();if(d.config.fullscreen){d.fireEvent("fullscreen",d)}d.fireEvent("initialize",d)},beforeInitConfig:function(b){this.beforeInitialize.apply(this,arguments)},beforeInitialize:Ext.emptyFn,initialize:Ext.emptyFn,getTemplate:function(){return this.template},getElementConfig:function(){return{reference:"element",classList:["x-unsized"],children:this.getTemplate()}},triggerInitialized:function(){var f=this.onInitializedListeners,g=f.length,h,e,d,b,c;if(!this.initialized){this.initialized=true;if(g>0){for(c=0;c0)){this.element.replaceCls(b,c)}},updateStyleHtmlCls:function(d,b){var e=this.innerHtmlElement,c=this.innerElement;if(this.getStyleHtmlContent()&&b){if(e){e.replaceCls(b,d)}else{c.replaceCls(b,d)}}},applyStyleHtmlContent:function(b){return Boolean(b)},updateStyleHtmlContent:function(d){var b=this.getStyleHtmlCls(),c=this.innerElement,e=this.innerHtmlElement;if(d){if(e){e.addCls(b)}else{c.addCls(b)}}else{if(e){e.removeCls(b)}else{c.addCls(b)}}},applyContentEl:function(b){if(b){return Ext.get(b)}},updateContentEl:function(b,c){if(c){c.hide();Ext.getBody().append(c)}if(b){this.setHtml(b.dom);b.show()}},getSize:function(){return{width:this.getWidth(),height:this.getHeight()}},isCentered:function(){return Boolean(this.getCentered())},isFloating:function(){return this.floating},isDocked:function(){return Boolean(this.getDocked())},isInnerItem:function(){return this.isInner},setIsInner:function(b){if(b!==this.isInner){this.isInner=b;if(this.initialized){this.fireEvent("innerstatechange",this,b)}}},filterLengthValue:function(b){if(b==="auto"||(!b&&b!==0)){return null}return b},applyTop:function(b){return this.filterLengthValue(b)},applyRight:function(b){return this.filterLengthValue(b)},applyBottom:function(b){return this.filterLengthValue(b)},applyLeft:function(b){return this.filterLengthValue(b)},applyWidth:function(b){return this.filterLengthValue(b)},applyHeight:function(b){return this.filterLengthValue(b)},applyMinWidth:function(b){return this.filterLengthValue(b)},applyMinHeight:function(b){return this.filterLengthValue(b)},applyMaxWidth:function(b){return this.filterLengthValue(b)},applyMaxHeight:function(b){return this.filterLengthValue(b)},doSetTop:function(b){this.element.setTop(b);this.refreshFloating()},doSetRight:function(b){this.element.setRight(b);this.refreshFloating()},doSetBottom:function(b){this.element.setBottom(b);this.refreshFloating()},doSetLeft:function(b){this.element.setLeft(b);this.refreshFloating()},doSetWidth:function(b){this.element.setWidth(b);this.refreshSizeState()},doSetHeight:function(b){this.element.setHeight(b);this.refreshSizeState()},applyFlex:function(b){if(b){b=Number(b);if(isNaN(b)){b=null}}else{b=null}return b},doSetFlex:Ext.emptyFn,refreshSizeState:function(){this.refreshSizeStateOnInitialized=true},doRefreshSizeState:function(){var c=this.getWidth()!==null||this.widthLayoutSized||(this.getLeft()!==null&&this.getRight()!==null),d=this.getHeight()!==null||this.heightLayoutSized||(this.getTop()!==null&&this.getBottom()!==null),f=this.layoutStretched||this.hasCSSMinHeight||(!d&&this.getMinHeight()!==null),e=c&&d,b=(c&&this.LAYOUT_WIDTH)|(d&&this.LAYOUT_HEIGHT)|(f&&this.LAYOUT_STRETCHED);if(!e&&f){e=null}this.setSizeState(e);this.setSizeFlags(b)},setLayoutSizeFlags:function(b){this.layoutStretched=!!(b&this.LAYOUT_STRETCHED);this.widthLayoutSized=!!(b&this.LAYOUT_WIDTH);this.heightLayoutSized=!!(b&this.LAYOUT_HEIGHT);this.refreshSizeState()},setSizeFlags:function(b){if(b!==this.sizeFlags){this.sizeFlags=b;var c=!!(b&this.LAYOUT_WIDTH),d=!!(b&this.LAYOUT_HEIGHT),e=!!(b&this.LAYOUT_STRETCHED);if(c&&!e&&!d){this.element.addCls("x-has-width")}else{this.element.removeCls("x-has-width")}if(d&&!e&&!c){this.element.addCls("x-has-height")}else{this.element.removeCls("x-has-height")}if(this.initialized){this.fireEvent("sizeflagschange",this,b)}}},getSizeFlags:function(){if(!this.initialized){this.doRefreshSizeState()}return this.sizeFlags},setSizeState:function(b){if(b!==this.sizeState){this.sizeState=b;this.element.setSizeState(b);if(this.initialized){this.fireEvent("sizestatechange",this,b)}}},getSizeState:function(){if(!this.initialized){this.doRefreshSizeState()}return this.sizeState},doSetMinWidth:function(b){this.element.setMinWidth(b)},doSetMinHeight:function(b){this.element.setMinHeight(b);this.refreshSizeState()},doSetMaxWidth:function(b){this.element.setMaxWidth(b)},doSetMaxHeight:function(b){this.element.setMaxHeight(b)},applyCentered:function(b){b=Boolean(b);if(b){this.refreshInnerState=Ext.emptyFn;if(this.isFloating()){this.resetFloating()}if(this.isDocked()){this.setDocked(false)}this.setIsInner(false);delete this.refreshInnerState}return b},doSetCentered:function(b){this.toggleCls(this.getFloatingCls(),b);if(!b){this.refreshInnerState()}},applyDocked:function(b){if(!b){return null}this.refreshInnerState=Ext.emptyFn;if(this.isFloating()){this.resetFloating()}if(this.isCentered()){this.setCentered(false)}this.setIsInner(false);delete this.refreshInnerState;return b},doSetDocked:function(c,b){this.fireEvent("afterdockedchange",this,c,b);if(!c){this.refreshInnerState()}},resetFloating:function(){this.setTop(null);this.setRight(null);this.setBottom(null);this.setLeft(null)},refreshInnerState:function(){this.setIsInner(!this.isCentered()&&!this.isFloating()&&!this.isDocked())},refreshFloating:function(){this.refreshFloatingOnInitialized=true},doRefreshFloating:function(){var c=true,b=this.getFloatingCls();if(this.getTop()===null&&this.getBottom()===null&&this.getRight()===null&&this.getLeft()===null){c=false}else{this.refreshSizeState()}if(c!==this.floating){this.floating=c;if(c){this.refreshInnerState=Ext.emptyFn;if(this.isCentered()){this.setCentered(false)}if(this.isDocked()){this.setDocked(false)}this.setIsInner(false);delete this.refreshInnerState}this.element.toggleCls(b,c);if(this.initialized){this.fireEvent("floatingchange",this,c)}if(!c){this.refreshInnerState()}}},updateFloatingCls:function(b,c){if(this.isFloating()){this.replaceCls(c,b)}},applyDisabled:function(b){return Boolean(b)},doSetDisabled:function(b){this.element[b?"addCls":"removeCls"](this.getDisabledCls())},updateDisabledCls:function(b,c){if(this.isDisabled()){this.element.replaceCls(c,b)}},disable:function(){this.setDisabled(true)},enable:function(){this.setDisabled(false)},isDisabled:function(){return this.getDisabled()},applyZIndex:function(b){if(!b&&b!==0){b=null}if(b!==null){b=Number(b);if(isNaN(b)){b=null}}return b},updateZIndex:function(d){var c=this.element,b;if(c&&!c.isDestroyed){b=c.dom.style;if(d!==null){b.setProperty("z-index",d,"important")}else{b.removeProperty("z-index")}}},getInnerHtmlElement:function(){var b=this.innerHtmlElement,c;if(!b||!b.dom||!b.dom.parentNode){this.innerHtmlElement=b=Ext.Element.create({cls:"x-innerhtml"});if(this.getStyleHtmlContent()){c=this.getStyleHtmlCls();this.innerHtmlElement.addCls(c);this.innerElement.removeCls(c)}this.innerElement.appendChild(b)}return b},updateHtml:function(b){if(!this.isDestroyed){var c=this.getInnerHtmlElement();if(Ext.isElement(b)){c.setHtml("");c.append(b)}else{c.setHtml(b)}}},applyHidden:function(b){return Boolean(b)},doSetHidden:function(c){var b=this.renderElement;if(b.isDestroyed){return}if(c){b.hide()}else{b.show()}if(this.element){this.element[c?"addCls":"removeCls"](this.getHiddenCls())}this.fireEvent(c?"hide":"show",this)},updateHiddenCls:function(b,c){if(this.isHidden()){this.element.replaceCls(c,b)}},isHidden:function(){return this.getHidden()},hide:function(b){this.setCurrentAlignmentInfo(null);if(this.activeAnimation){this.activeAnimation.on({animationend:function(){this.hide(b)},scope:this,single:true});return this}if(!this.getHidden()){if(b===undefined||(b&&b.isComponent)){b=this.getHideAnimation()}if(b){if(b===true){b="fadeOut"}this.onBefore({hiddenchange:"animateFn",scope:this,single:true,args:[b]})}this.setHidden(true)}return this},show:function(c){if(this.activeAnimation){this.activeAnimation.on({animationend:function(){this.show(c)},scope:this,single:true});return this}var b=this.getHidden();if(b||b===null){if(c===true){c="fadeIn"}else{if(c===undefined||(c&&c.isComponent)){c=this.getShowAnimation()}}if(c){this.beforeShowAnimation();this.onBefore({hiddenchange:"animateFn",scope:this,single:true,args:[c]})}this.setHidden(false)}return this},beforeShowAnimation:function(){if(this.element){this.renderElement.show();this.element.removeCls(this.getHiddenCls())}},animateFn:function(g,e,h,d,c,b){var f=this;if(g&&(!h||(h&&this.isPainted()))){this.activeAnimation=new Ext.fx.Animation(g);this.activeAnimation.setElement(e.element);if(!Ext.isEmpty(h)){this.activeAnimation.setOnEnd(function(){f.activeAnimation=null;b.resume()});b.pause()}Ext.Animator.run(f.activeAnimation)}},setVisibility:function(b){this.renderElement.setVisibility(b)},isRendered:function(){return this.rendered},isPainted:function(){return this.renderElement.isPainted()},applyTpl:function(b){return(Ext.isObject(b)&&b.isTemplate)?b:new Ext.XTemplate(b)},applyData:function(b){if(Ext.isObject(b)){return Ext.apply({},b)}else{if(!b){b={}}}return b},updateData:function(d){var e=this;if(d){var c=e.getTpl(),b=e.getTplWriteMode();if(c){c[b](e.getInnerHtmlElement(),d)}this.fireEvent("updatedata",e,d)}},applyRecord:function(b){if(b&&Ext.isObject(b)&&b.isModel){return b}return null},updateRecord:function(c,b){var d=this;if(b){b.unjoin(d)}if(!c){d.updateData("")}else{c.join(d);d.updateData(c.getData(true))}},afterEdit:function(){this.updateRecord(this.getRecord())},afterErase:function(){this.setRecord(null)},applyItemId:function(b){return b||this.getId()},isXType:function(c,b){if(b){return this.xtypes.indexOf(c)!=-1}return Boolean(this.xtypesMap[c])},getXTypes:function(){return this.xtypesChain.join("/")},getDraggableBehavior:function(){var b=this.draggableBehavior;if(!b){b=this.draggableBehavior=new Ext.behavior.Draggable(this)}return b},applyDraggable:function(b){this.getDraggableBehavior().setConfig(b)},getDraggable:function(){return this.getDraggableBehavior().getDraggable()},getTranslatableBehavior:function(){var b=this.translatableBehavior;if(!b){b=this.translatableBehavior=new Ext.behavior.Translatable(this)}return b},applyTranslatable:function(b){this.getTranslatableBehavior().setConfig(b)},getTranslatable:function(){return this.getTranslatableBehavior().getTranslatable()},translateAxis:function(c,e,d){var b,f;if(c==="x"){b=e}else{f=e}return this.translate(b,f,d)},translate:function(){var b=this.getTranslatable();if(!b){this.setTranslatable(true);b=this.getTranslatable()}b.translate.apply(b,arguments)},setRendered:function(c){var b=this.rendered;if(c!==b){this.rendered=c;return true}return false},setSize:function(c,b){if(c!=undefined){this.setWidth(c)}if(b!=undefined){this.setHeight(b)}},doAddListener:function(d,f,e,c,b){if(c&&"element" in c){return this[c.element].doAddListener(d,f,e||this,c,b)}if(d=="painted"||d=="resize"){return this.element.doAddListener(d,f,e||this,c,b)}return this.callParent(arguments)},doRemoveListener:function(d,f,e,c,b){if(c&&"element" in c){this[c.element].doRemoveListener(d,f,e||this,c,b)}return this.callParent(arguments)},showBy:function(c,f){var e=this,b=Ext.Viewport,d=e.getParent();e.setVisibility(false);if(d!==b){b.add(e)}e.show();e.on({hide:"onShowByErased",destroy:"onShowByErased",single:true,scope:e});b.on("resize","alignTo",e,{args:[c,f]});e.alignTo(c,f);e.setVisibility(true)},onShowByErased:function(){Ext.Viewport.un("resize","alignTo",this)},getAlignmentInfo:function(j,i){var c=j.isComponent?j.renderElement:j,g=c.getPageBox(),d=this.renderElement,e=d.getPageBox(),f={alignToBox:g,alignment:i,top:g.top,left:g.left,alignToWidth:g.width,alignToHeight:g.height,width:e.width,height:e.height},b=this.getCurrentAlignmentInfo(),h=true;if(!Ext.isEmpty(b)){Ext.Object.each(f,function(k,l){if(!Ext.isObject(l)&&b[k]!=l){h=false;return false}return true})}else{h=false}return{isAligned:h,stats:f}},getCurrentAlignmentInfo:function(){return this.$currentAlignmentInfo},setCurrentAlignmentInfo:function(b){this.$currentAlignmentInfo=Ext.isEmpty(b)?null:Ext.merge({},b.stats?b.stats:b)},alignTo:function(l,h){var o=this.getAlignmentInfo(l,h);if(o.isAligned){return}var n=o.stats.alignToBox,z=this.getParent().element.getPageBox(),w=o.stats.alignToHeight,m=o.stats.alignToWidth,r=o.stats.height,t=o.stats.width;z.bottom-=5;z.height-=10;z.left+=5;z.right-=5;z.top+=5;z.width-=10;if(!h||h==="auto"){if(z.bottom-n.bottomh){d=m.element;k.splice(e,0,n);break}}if(!d){k.push(n);d=this.getBodyElement()}this.itemsCount++;if(g==="start"){f.insertBefore(d)}else{f.insertAfter(d)}},removeItem:function(c){var a=c.getDocked(),b=this.items[this.positionMap[a]];Ext.Array.remove(b,c);c.element.detach();delete c.$dockWrapper;c.removeCls("x-dock-item");c.removeCls("x-docked-"+a);if(--this.itemsCount===0){this.destroy()}},getItemsSlice:function(c){var a=this.getContainer(),b=this.items,h=[],g,d,f,e;for(g=b.start,d=0,f=g.length;dc){h.push(e)}}for(g=b.end,d=0,f=g.length;dc){h.push(e)}}return h},applyElement:function(a){return Ext.Element.create(a)},updateElement:function(a){a.addCls("x-dock-"+this.getDirection())},applyBodyElement:function(a){return Ext.Element.create(a)},updateBodyElement:function(a){this.getElement().append(a)},updateInnerWrapper:function(a,c){var b=this.getBodyElement();if(c&&c.$outerWrapper===this){c.getElement().detach();delete c.$outerWrapper}if(a){a.setSizeState(this.getSizeState());a.$outerWrapper=this;b.append(a.getElement())}},updateSizeState:function(b){var a=this.getInnerWrapper();this.getElement().setSizeState(b);if(a){a.setSizeState(b)}},destroy:function(){var c=this.getInnerWrapper(),b=this.$outerWrapper,a;if(c){if(b){b.setInnerWrapper(c)}else{a=c.getElement();if(!a.isDestroyed){a.replace(this.getElement())}delete c.$outerWrapper}}delete this.$outerWrapper;this.setInnerWrapper(null);this.unlink("_bodyElement","_element");this.callSuper()}});Ext.define("Ext.layout.Default",{extend:Ext.layout.Abstract,isAuto:true,alias:["layout.default","layout.auto"],config:{animation:null},centerWrapperClass:"x-center",dockWrapperClass:"x-dock",positionMap:{top:"start",left:"start",middle:"center",bottom:"end",right:"end"},positionDirectionMap:{top:"vertical",bottom:"vertical",left:"horizontal",right:"horizontal"},setContainer:function(a){var b={delegate:"> component"};this.dockedItems=[];this.callSuper(arguments);a.on("centeredchange","onItemCenteredChange",this,b,"before").on("floatingchange","onItemFloatingChange",this,b,"before").on("dockedchange","onBeforeItemDockedChange",this,b,"before").on("afterdockedchange","onAfterItemDockedChange",this,b)},monitorSizeStateChange:function(){this.monitorSizeStateChange=Ext.emptyFn;this.container.on("sizestatechange","onContainerSizeStateChange",this)},monitorSizeFlagsChange:function(){this.monitorSizeFlagsChange=Ext.emptyFn;this.container.on("sizeflagschange","onContainerSizeFlagsChange",this)},onItemAdd:function(a){var b=a.getDocked();if(b!==null){this.dockItem(a)}else{if(a.isCentered()){this.onItemCenteredChange(a,true)}else{if(a.isFloating()){this.onItemFloatingChange(a,true)}else{this.onItemInnerStateChange(a,true)}}}},onItemInnerStateChange:function(b,a,c){if(a){this.insertInnerItem(b,this.container.innerIndexOf(b))}else{this.removeInnerItem(b)}},insertInnerItem:function(f,d){var b=this.container,h=b.innerElement.dom,e=f.element.dom,g=d!==-1?b.getInnerAt(d+1):null,c=null,a;if(g){a=g.getTranslatable();if(a&&a.getUseWrapper()){c=a.getWrapper().dom}else{c=g?g.element.dom:null}}h.insertBefore(e,c);return this},insertBodyItem:function(c){var a=this.container.setUseBodyElement(true),b=a.bodyElement.dom;if(c.getZIndex()===null){c.setZIndex((a.indexOf(c)+1)*2)}b.insertBefore(c.element.dom,b.firstChild);return this},removeInnerItem:function(a){a.element.detach()},removeBodyItem:function(a){a.setZIndex(null);a.element.detach()},onItemRemove:function(b,a,c){var d=b.getDocked();if(d){this.undockItem(b)}else{if(b.isCentered()){this.onItemCenteredChange(b,false)}else{if(b.isFloating()){this.onItemFloatingChange(b,false)}else{this.onItemInnerStateChange(b,false,c)}}}},onItemMove:function(b,c,a){if(b.isCentered()||b.isFloating()){b.setZIndex((c+1)*2)}else{if(b.isInnerItem()){this.insertInnerItem(b,this.container.innerIndexOf(b))}else{this.undockItem(b);this.dockItem(b)}}},onItemCenteredChange:function(c,a){var b="$centerWrapper";if(a){this.insertBodyItem(c);c.link(b,new Ext.util.Wrapper({className:this.centerWrapperClass},c.element))}else{c.unlink(b);this.removeBodyItem(c)}},onItemFloatingChange:function(a,b){if(b){this.insertBodyItem(a)}else{this.removeBodyItem(a)}},onBeforeItemDockedChange:function(a,c,b){if(b){this.undockItem(a)}},onAfterItemDockedChange:function(a,c,b){if(c){this.dockItem(a)}},onContainerSizeStateChange:function(){var a=this.getDockWrapper();if(a){a.setSizeState(this.container.getSizeState())}},onContainerSizeFlagsChange:function(){var a=this.dockedItems,b,d,c;for(b=0,d=a.length;bt){n=q||p[0];p.splice(m,0,s);break}q=v}if(!n){n=p[g-1];p.push(s)}a=n.getDocked();d=n.$dockWrapper;l=f[a];if(u===l){d.addItem(s)}else{k=d.getItemsSlice(t);o=new b({container:this.container,direction:u});if(k.length>0){if(k.length===d.itemsCount){c=d;o.setSizeState(c.getSizeState());o.getElement().replace(c.getElement())}else{c=new b({container:this.container,direction:l});c.setInnerWrapper(d.getInnerWrapper());c.addItems(k);d.setInnerWrapper(o)}o.setInnerWrapper(c)}else{j=d.getInnerWrapper();d.setInnerWrapper(null);o.setInnerWrapper(j);d.setInnerWrapper(o)}o.addItem(s)}}h.onInitialized("refreshDockedItemLayoutSizeFlags",this,[s])},getDockWrapper:function(){var a=this.dockedItems;if(a.length>0){return a[0].$dockWrapper}return null},undockItem:function(b){var a=this.dockedItems;if(b.$dockWrapper){b.$dockWrapper.removeItem(b)}Ext.Array.remove(a,b);b.setLayoutSizeFlags(0)},destroy:function(){this.dockedItems.length=0;delete this.dockedItems;this.callSuper()}});Ext.define("Ext.layout.Box",{extend:Ext.layout.Default,config:{orient:"horizontal",align:"start",pack:"start"},alias:"layout.tablebox",layoutBaseClass:"x-layout-tablebox",itemClass:"x-layout-tablebox-item",setContainer:function(a){this.callSuper(arguments);a.innerElement.addCls(this.layoutBaseClass);a.on("flexchange","onItemFlexChange",this,{delegate:"> component"})},onItemInnerStateChange:function(b,a){this.callSuper(arguments);b.toggleCls(this.itemClass,a)},onItemFlexChange:function(){}});Ext.define("Ext.layout.FlexBox",{extend:Ext.layout.Box,alias:"layout.box",config:{align:"stretch"},layoutBaseClass:"x-layout-box",itemClass:"x-layout-box-item",setContainer:function(a){this.callSuper(arguments);this.monitorSizeFlagsChange()},applyOrient:function(a){return a},updateOrient:function(c,b){var a=this.container,d={delegate:"> component"};if(c==="horizontal"){this.sizePropertyName="width"}else{this.sizePropertyName="height"}a.innerElement.swapCls("x-"+c,"x-"+b);if(b){a.un(b==="horizontal"?"widthchange":"heightchange","onItemSizeChange",this,d);this.redrawContainer()}a.on(c==="horizontal"?"widthchange":"heightchange","onItemSizeChange",this,d)},onItemInnerStateChange:function(d,c){this.callSuper(arguments);var a,b;d.toggleCls(this.itemClass,c);if(c){a=d.getFlex();b=d.get(this.sizePropertyName);if(a){this.doItemFlexChange(d,a)}else{if(b){this.doItemSizeChange(d,b)}}}this.refreshItemSizeState(d)},refreshItemSizeState:function(e){var c=e.isInnerItem(),a=this.container,f=a.LAYOUT_HEIGHT,d=a.LAYOUT_WIDTH,g=this.sizePropertyName,b=0,h=a.getSizeFlags();if(c){b|=a.LAYOUT_STRETCHED;if(this.getAlign()==="stretch"){b|=h&(g==="width"?f:d)}if(e.getFlex()){b|=h&(g==="width"?d:f)}}e.setLayoutSizeFlags(b)},refreshAllItemSizedStates:function(){var d=this.container.innerItems,a,c,b;for(a=0,c=d.length;aj){e=n.element;l.splice(f,0,o);break}}if(!e){l.push(o);e=this.getBodyElement()}this.itemsCount++;if(h==="start"){g.insertBefore(e)}else{g.insertAfter(e)}a.wrap(o.element);a.bindSize(this.getDirection()==="horizontal"?"width":"height")},removeItem:function(c){var a=c.getDocked(),b=this.items[this.positionMap[a]];c.removeCls("x-docked-"+a);Ext.Array.remove(b,c);c.unlink("$dockItemWrapper");c.element.detach();delete c.$dockWrapper;if(--this.itemsCount===0){this.destroy()}},getItemsSlice:function(c){var a=this.getContainer(),b=this.items,h=[],g,d,f,e;for(g=b.start,d=0,f=g.length;dc){h.push(e)}}for(g=b.end,d=0,f=g.length;dc){h.push(e)}}return h},applyElement:function(a){return Ext.Element.create(a)},updateElement:function(a){a.addCls("x-dock-"+this.getDirection())},applyBodyElement:function(a){return Ext.Element.create(a)},updateBodyElement:function(a){this.getElement().append(a)},updateInnerWrapper:function(a,c){var b=this.getBodyElement();if(c&&c.$outerWrapper===this){b.remove(c.getElement());delete c.$outerWrapper}if(a){a.setSizeState(this.getSizeState());a.$outerWrapper=this;b.append(a.getElement())}},updateSizeState:function(b){var a=this.getInnerWrapper();this.getElement().setSizeState(b);if(a){a.setSizeState(b)}},destroy:function(){var b=this.getInnerWrapper(),a=this.$outerWrapper;if(b){if(a){a.setInnerWrapper(b)}else{b.getElement().replace(this.getElement());delete b.$outerWrapper}}delete this.$outerWrapper;this.setInnerWrapper(null);this.unlink("_bodyElement","_element");this.callSuper()}});Ext.define("Ext.layout.VBox",{extend:Ext.layout.FlexBox,alias:"layout.vbox",config:{orient:"vertical"}});Ext.define("Ext.fx.layout.card.Abstract",{extend:Ext.Evented,isAnimation:true,config:{direction:"left",duration:null,reverse:null,layout:null},updateLayout:function(){this.enable()},enable:function(){var a=this.getLayout();if(a){a.onBefore("activeitemchange","onActiveItemChange",this)}},disable:function(){var a=this.getLayout();if(this.isAnimating){this.stopAnimation()}if(a){a.unBefore("activeitemchange","onActiveItemChange",this)}},onActiveItemChange:Ext.emptyFn,destroy:function(){var a=this.getLayout();if(this.isAnimating){this.stopAnimation()}if(a){a.unBefore("activeitemchange","onActiveItemChange",this)}this.setLayout(null);if(this.observableId){this.fireEvent("destroy",this);this.clearListeners();this.clearManagedListeners()}}});Ext.define("Ext.fx.State",{isAnimatable:{"background-color":true,"background-image":true,"background-position":true,"border-bottom-color":true,"border-bottom-width":true,"border-color":true,"border-left-color":true,"border-left-width":true,"border-right-color":true,"border-right-width":true,"border-spacing":true,"border-top-color":true,"border-top-width":true,"border-width":true,bottom:true,color:true,crop:true,"font-size":true,"font-weight":true,height:true,left:true,"letter-spacing":true,"line-height":true,"margin-bottom":true,"margin-left":true,"margin-right":true,"margin-top":true,"max-height":true,"max-width":true,"min-height":true,"min-width":true,opacity:true,"outline-color":true,"outline-offset":true,"outline-width":true,"padding-bottom":true,"padding-left":true,"padding-right":true,"padding-top":true,right:true,"text-indent":true,"text-shadow":true,top:true,"vertical-align":true,visibility:true,width:true,"word-spacing":true,"z-index":true,zoom:true,transform:true},constructor:function(a){this.data={};this.set(a)},setConfig:function(a){this.set(a);return this},setRaw:function(a){this.data=a;return this},clear:function(){return this.setRaw({})},setTransform:function(c,g){var f=this.data,a=Ext.isArray(g),b=f.transform,e,d;if(!b){b=f.transform={translateX:0,translateY:0,translateZ:0,scaleX:1,scaleY:1,scaleZ:1,rotate:0,rotateX:0,rotateY:0,rotateZ:0,skewX:0,skewY:0}}if(typeof c=="string"){switch(c){case"translate":if(a){e=g.length;if(e==0){break}b.translateX=g[0];if(e==1){break}b.translateY=g[1];if(e==2){break}b.translateZ=g[2]}else{b.translateX=g}break;case"rotate":if(a){e=g.length;if(e==0){break}b.rotateX=g[0];if(e==1){break}b.rotateY=g[1];if(e==2){break}b.rotateZ=g[2]}else{b.rotate=g}break;case"scale":if(a){e=g.length;if(e==0){break}b.scaleX=g[0];if(e==1){break}b.scaleY=g[1];if(e==2){break}b.scaleZ=g[2]}else{b.scaleX=g;b.scaleY=g}break;case"skew":if(a){e=g.length;if(e==0){break}b.skewX=g[0];if(e==1){break}b.skewY=g[1]}else{b.skewX=g}break;default:b[c]=g}}else{for(d in c){if(c.hasOwnProperty(d)){g=c[d];this.setTransform(d,g)}}}},set:function(a,d){var c=this.data,b;if(typeof a!="string"){for(b in a){d=a[b];if(b==="transform"){this.setTransform(d)}else{c[b]=d}}}else{if(a==="transform"){this.setTransform(d)}else{c[a]=d}}return this},unset:function(a){var b=this.data;if(b.hasOwnProperty(a)){delete b[a]}return this},getData:function(){return this.data}});Ext.define("Ext.fx.animation.Abstract",{extend:Ext.Evented,isAnimation:true,config:{name:"",element:null,before:null,from:{},to:{},after:null,states:{},duration:300,easing:"linear",iteration:1,direction:"normal",delay:0,onBeforeStart:null,onEnd:null,onBeforeEnd:null,scope:null,reverse:null,preserveEndState:false,replacePrevious:true},STATE_FROM:"0%",STATE_TO:"100%",DIRECTION_UP:"up",DIRECTION_DOWN:"down",DIRECTION_LEFT:"left",DIRECTION_RIGHT:"right",stateNameRegex:/^(?:[\d\.]+)%$/,constructor:function(){this.states={};this.callParent(arguments);return this},applyElement:function(a){return Ext.get(a)},applyBefore:function(a,b){if(a){return Ext.factory(a,Ext.fx.State,b)}},applyAfter:function(b,a){if(b){return Ext.factory(b,Ext.fx.State,a)}},setFrom:function(a){return this.setState(this.STATE_FROM,a)},setTo:function(a){return this.setState(this.STATE_TO,a)},getFrom:function(){return this.getState(this.STATE_FROM)},getTo:function(){return this.getState(this.STATE_TO)},setStates:function(a){var c=this.stateNameRegex,b;for(b in a){if(c.test(b)){this.setState(b,a[b])}}return this},getStates:function(){return this.states},stop:function(){this.fireEvent("stop",this)},destroy:function(){this.stop();this.callParent()},setState:function(b,d){var a=this.getStates(),c;c=Ext.factory(d,Ext.fx.State,a[b]);if(c){a[b]=c}return this},getState:function(a){return this.getStates()[a]},getData:function(){var k=this.getStates(),e={},g=this.getBefore(),c=this.getAfter(),h=k[this.STATE_FROM],i=k[this.STATE_TO],j=h.getData(),f=i.getData(),d,b,a;for(b in k){if(k.hasOwnProperty(b)){a=k[b];d=a.getData();e[b]=d}}if(Ext.browser.is.AndroidStock2){e["0.0001%"]=j}return{before:g?g.getData():{},after:c?c.getData():{},states:e,from:j,to:f,duration:this.getDuration(),iteration:this.getIteration(),direction:this.getDirection(),easing:this.getEasing(),delay:this.getDelay(),onEnd:this.getOnEnd(),onBeforeEnd:this.getOnBeforeEnd(),onBeforeStart:this.getOnBeforeStart(),scope:this.getScope(),preserveEndState:this.getPreserveEndState(),replacePrevious:this.getReplacePrevious()}}});Ext.define("Ext.fx.animation.Slide",{extend:Ext.fx.animation.Abstract,alternateClassName:"Ext.fx.animation.SlideIn",alias:["animation.slide","animation.slideIn"],config:{direction:"left",out:false,offset:0,easing:"auto",containerBox:"auto",elementBox:"auto",isElementBoxFit:true,useCssTransform:true},reverseDirectionMap:{up:"down",down:"up",left:"right",right:"left"},applyEasing:function(a){if(a==="auto"){return"ease-"+((this.getOut())?"in":"out")}return a},getContainerBox:function(){var a=this._containerBox;if(a==="auto"){a=this.getElement().getParent().getPageBox()}return a},getElementBox:function(){var a=this._elementBox;if(this.getIsElementBoxFit()){return this.getContainerBox()}if(a==="auto"){a=this.getElement().getPageBox()}return a},getData:function(){var p=this.getElementBox(),c=this.getContainerBox(),g=p?p:c,n=this.getFrom(),o=this.getTo(),f=this.getOut(),e=this.getOffset(),m=this.getDirection(),b=this.getUseCssTransform(),h=this.getReverse(),d=0,a=0,l,j,k,i;if(h){m=this.reverseDirectionMap[m]}switch(m){case this.DIRECTION_UP:if(f){a=c.top-g.top-g.height-e}else{a=c.bottom-g.bottom+g.height+e}break;case this.DIRECTION_DOWN:if(f){a=c.bottom-g.bottom+g.height+e}else{a=c.top-g.height-g.top-e}break;case this.DIRECTION_RIGHT:if(f){d=c.right-g.right+g.width+e}else{d=c.left-g.left-g.width-e}break;case this.DIRECTION_LEFT:if(f){d=c.left-g.left-g.width-e}else{d=c.right-g.right+g.width+e}break}l=(f)?0:d;j=(f)?0:a;if(b){n.setTransform({translateX:l,translateY:j})}else{n.set("left",l);n.set("top",j)}k=(f)?d:0;i=(f)?a:0;if(b){o.setTransform({translateX:k,translateY:i})}else{o.set("left",k);o.set("top",i)}return this.callParent(arguments)}});Ext.define("Ext.fx.animation.SlideOut",{extend:Ext.fx.animation.Slide,alias:["animation.slideOut"],config:{out:true}});Ext.define("Ext.fx.animation.Fade",{extend:Ext.fx.animation.Abstract,alternateClassName:"Ext.fx.animation.FadeIn",alias:["animation.fade","animation.fadeIn"],config:{out:false,before:{display:null,opacity:0},after:{opacity:null},reverse:null},updateOut:function(a){var c=this.getTo(),b=this.getFrom();if(a){b.set("opacity",1);c.set("opacity",0)}else{b.set("opacity",0);c.set("opacity",1)}}});Ext.define("Ext.fx.animation.FadeOut",{extend:Ext.fx.animation.Fade,alias:"animation.fadeOut",config:{out:true,before:{}}});Ext.define("Ext.fx.animation.Flip",{extend:Ext.fx.animation.Abstract,alias:"animation.flip",config:{easing:"ease-in",direction:"right",half:false,out:null},getData:function(){var h=this.getFrom(),i=this.getTo(),g=this.getDirection(),b=this.getOut(),l=this.getHalf(),c=(l)?90:180,e=1,a=1,k=0,j=0,f=0,d=0;if(b){a=0.8}else{e=0.8}switch(g){case this.DIRECTION_UP:if(b){f=c}else{k=-c}break;case this.DIRECTION_DOWN:if(b){f=-c}else{k=c}break;case this.DIRECTION_RIGHT:if(b){d=c}else{j=-c}break;case this.DIRECTION_LEFT:if(b){d=-c}else{j=c}break}h.setTransform({rotateX:k,rotateY:j,scale:e});i.setTransform({rotateX:f,rotateY:d,scale:a});return this.callParent(arguments)}});Ext.define("Ext.fx.animation.Pop",{extend:Ext.fx.animation.Abstract,alias:["animation.pop","animation.popIn"],alternateClassName:"Ext.fx.animation.PopIn",config:{out:false,before:{display:null,opacity:0},after:{opacity:null}},getData:function(){var c=this.getTo(),b=this.getFrom(),a=this.getOut();if(a){b.set("opacity",1);b.setTransform({scale:1});c.set("opacity",0);c.setTransform({scale:0})}else{b.set("opacity",0);b.setTransform({scale:0});c.set("opacity",1);c.setTransform({scale:1})}return this.callParent(arguments)}});Ext.define("Ext.fx.animation.PopOut",{extend:Ext.fx.animation.Pop,alias:"animation.popOut",config:{out:true,before:{}}});Ext.define("Ext.fx.Animation",{constructor:function(b){var a=Ext.fx.animation.Abstract,c;if(typeof b=="string"){c=b;b={}}else{if(b&&b.type){c=b.type}}if(c){if(Ext.browser.is.AndroidStock2){if(c=="pop"){c="fade"}if(c=="popIn"){c="fadeIn"}if(c=="popOut"){c="fadeOut"}}a=Ext.ClassManager.getByAlias("animation."+c)}return Ext.factory(b,a)}});Ext.define("Ext.fx.layout.card.Style",{extend:Ext.fx.layout.card.Abstract,config:{inAnimation:{before:{visibility:null},preserveEndState:false,replacePrevious:true},outAnimation:{preserveEndState:false,replacePrevious:true}},constructor:function(b){var c,a;this.initConfig(b);this.endAnimationCounter=0;c=this.getInAnimation();a=this.getOutAnimation();c.on("animationend","incrementEnd",this);a.on("animationend","incrementEnd",this)},updateDirection:function(a){this.getInAnimation().setDirection(a);this.getOutAnimation().setDirection(a)},updateDuration:function(a){this.getInAnimation().setDuration(a);this.getOutAnimation().setDuration(a)},updateReverse:function(a){this.getInAnimation().setReverse(a);this.getOutAnimation().setReverse(a)},incrementEnd:function(){this.endAnimationCounter++;if(this.endAnimationCounter>1){this.endAnimationCounter=0;this.fireEvent("animationend",this)}},applyInAnimation:function(b,a){return Ext.factory(b,Ext.fx.Animation,a)},applyOutAnimation:function(b,a){return Ext.factory(b,Ext.fx.Animation,a)},updateInAnimation:function(a){a.setScope(this)},updateOutAnimation:function(a){a.setScope(this)},onActiveItemChange:function(a,e,h,i,d){var b=this.getInAnimation(),g=this.getOutAnimation(),f,c;if(e&&h&&h.isPainted()){f=e.renderElement;c=h.renderElement;b.setElement(f);g.setElement(c);g.setOnBeforeEnd(function(j,k){if(k||Ext.Animator.hasRunningAnimations(j)){d.firingArguments[1]=null;d.firingArguments[2]=null}});g.setOnEnd(function(){d.resume()});f.dom.style.setProperty("visibility","hidden","important");e.show();Ext.Animator.run([g,b]);d.pause()}},destroy:function(){Ext.destroy(this.getInAnimation(),this.getOutAnimation());this.callParent(arguments)}});Ext.define("Ext.fx.layout.card.Slide",{extend:Ext.fx.layout.card.Style,alias:"fx.layout.card.slide",config:{inAnimation:{type:"slide",easing:"ease-out"},outAnimation:{type:"slide",easing:"ease-out",out:true}},updateReverse:function(a){this.getInAnimation().setReverse(a);this.getOutAnimation().setReverse(a)}});Ext.define("Ext.fx.layout.card.Cover",{extend:Ext.fx.layout.card.Style,alias:"fx.layout.card.cover",config:{reverse:null,inAnimation:{before:{"z-index":100},after:{"z-index":0},type:"slide",easing:"ease-out"},outAnimation:{easing:"ease-out",from:{opacity:0.99},to:{opacity:1},out:true}},updateReverse:function(a){this.getInAnimation().setReverse(a);this.getOutAnimation().setReverse(a)}});Ext.define("Ext.fx.layout.card.Reveal",{extend:Ext.fx.layout.card.Style,alias:"fx.layout.card.reveal",config:{inAnimation:{easing:"ease-out",from:{opacity:0.99},to:{opacity:1}},outAnimation:{before:{"z-index":100},after:{"z-index":0},type:"slide",easing:"ease-out",out:true}},updateReverse:function(a){this.getInAnimation().setReverse(a);this.getOutAnimation().setReverse(a)}});Ext.define("Ext.fx.layout.card.Fade",{extend:Ext.fx.layout.card.Style,alias:"fx.layout.card.fade",config:{reverse:null,inAnimation:{type:"fade",easing:"ease-out"},outAnimation:{type:"fade",easing:"ease-out",out:true}}});Ext.define("Ext.fx.layout.card.Flip",{extend:Ext.fx.layout.card.Style,alias:"fx.layout.card.flip",config:{duration:500,inAnimation:{type:"flip",half:true,easing:"ease-out",before:{"backface-visibility":"hidden"},after:{"backface-visibility":null}},outAnimation:{type:"flip",half:true,easing:"ease-in",before:{"backface-visibility":"hidden"},after:{"backface-visibility":null},out:true}},onActiveItemChange:function(e,c,f,b,a){var d=c.element.getParent();d.addCls("x-layout-card-perspective");this.on("animationend",function(){d.removeCls("x-layout-card-perspective")},this,{single:true});this.callParent(arguments)},updateDuration:function(d){var c=d/2,b=this.getInAnimation(),a=this.getOutAnimation();b.setDelay(c);b.setDuration(c);a.setDuration(c)}});Ext.define("Ext.fx.layout.card.Pop",{extend:Ext.fx.layout.card.Style,alias:"fx.layout.card.pop",config:{duration:500,inAnimation:{type:"pop",easing:"ease-out"},outAnimation:{type:"pop",easing:"ease-in",out:true}},updateDuration:function(d){var c=d/2,b=this.getInAnimation(),a=this.getOutAnimation();b.setDelay(c);b.setDuration(c);a.setDuration(c)}});Ext.define("Ext.fx.layout.card.Scroll",{extend:Ext.fx.layout.card.Abstract,alias:"fx.layout.card.scroll",config:{duration:150},constructor:function(a){this.initConfig(a)},getEasing:function(){var a=this.easing;if(!a){this.easing=a=new Ext.fx.easing.Linear()}return a},updateDuration:function(a){this.getEasing().setDuration(a)},onActiveItemChange:function(a,d,l,m,c){var i=this.getDirection(),g=this.getEasing(),k,e,b,h,j,f;if(d&&l){if(this.isAnimating){this.stopAnimation()}d.setWidth("100%");d.setHeight("100%");k=this.getLayout().container.innerElement;h=k.getWidth();j=k.getHeight();e=d.renderElement;b=l.renderElement;this.oldItem=l;this.newItem=d;this.currentEventController=c;this.containerElement=k;this.isReverse=f=this.getReverse();d.show();if(i=="right"){i="left";this.isReverse=f=!f}else{if(i=="down"){i="up";this.isReverse=f=!f}}if(i=="left"){if(f){g.setConfig({startValue:h,endValue:0});k.dom.scrollLeft=h;b.setLeft(h)}else{g.setConfig({startValue:0,endValue:h});e.setLeft(h)}}else{if(f){g.setConfig({startValue:j,endValue:0});k.dom.scrollTop=j;b.setTop(j)}else{g.setConfig({startValue:0,endValue:j});e.setTop(j)}}this.startAnimation();c.pause()}},startAnimation:function(){this.isAnimating=true;this.getEasing().setStartTime(Date.now());Ext.AnimationQueue.start(this.doAnimationFrame,this)},doAnimationFrame:function(){var d=this.getEasing(),c=this.getDirection(),a="scrollTop",b;if(c=="left"||c=="right"){a="scrollLeft"}if(d.isEnded){this.stopAnimation()}else{b=d.getValue();this.containerElement.dom[a]=b}},stopAnimation:function(){var c=this,e=c.getDirection(),a="setTop",d=c.oldItem,b=c.newItem;if(e=="left"||e=="right"){a="setLeft"}c.currentEventController.resume();if(c.isReverse&&d&&d.renderElement&&d.renderElement.dom){d.renderElement[a](null)}else{if(b&&b.renderElement&&b.renderElement.dom){b.renderElement[a](null)}}Ext.AnimationQueue.stop(this.doAnimationFrame,this);c.isAnimating=false;c.fireEvent("animationend",c)}});Ext.define("Ext.fx.layout.Card",{constructor:function(b){var a=Ext.fx.layout.card.Abstract,c;if(!b){return null}if(typeof b=="string"){c=b;b={}}else{if(b.type){c=b.type}}b.elementBox=false;if(c){if(Ext.browser.is.AndroidStock2){if(c!="fade"){c="scroll"}}a=Ext.ClassManager.getByAlias("fx.layout.card."+c)}return Ext.factory(b,a)}});Ext.define("Ext.layout.Card",{extend:Ext.layout.Default,alias:"layout.card",isCard:true,layoutClass:"x-layout-card",itemClass:"x-layout-card-item",applyAnimation:function(a){return new Ext.fx.layout.Card(a)},updateAnimation:function(b,a){if(b&&b.isAnimation){b.setLayout(this)}if(a){a.destroy()}},setContainer:function(a){this.callSuper(arguments);a.innerElement.addCls(this.layoutClass);a.onInitialized("onContainerInitialized",this)},onContainerInitialized:function(){var a=this.container,b=a.getInnerAt(0),c=a.getActiveItem();if(c){c.show();if(b&&b!==c){b.hide()}}a.on("activeitemchange","onContainerActiveItemChange",this)},onContainerActiveItemChange:function(a){this.relayEvent(arguments,"doActiveItemChange")},onItemInnerStateChange:function(c,b,d){this.callSuper(arguments);var a=this.container,e=a.getActiveItem();c.toggleCls(this.itemClass,b);c.setLayoutSizeFlags(b?a.LAYOUT_BOTH:0);if(b){if(e!==a.innerIndexOf(c)&&e!==c&&c!==a.pendingActiveItem){c.hide()}}else{if(!d&&!c.isDestroyed&&c.isDestroying!==true){c.show()}}},doActiveItemChange:function(b,c,a){if(a){a.hide()}if(c){c.show()}},destroy:function(){this.callParent(arguments);Ext.destroy(this.getAnimation())}});Ext.define("Ext.util.Filter",{isFilter:true,config:{property:null,value:null,filterFn:Ext.emptyFn,anyMatch:false,exactMatch:false,caseSensitive:false,root:null,id:undefined,scope:null},applyId:function(a){if(!a){if(this.getProperty()){a=this.getProperty()+"-"+String(this.getValue())}if(!a){a=Ext.id(null,"ext-filter-")}}return a},constructor:function(a){this.initConfig(a)},applyFilterFn:function(b){if(b===Ext.emptyFn){b=this.getInitialConfig("filter");if(b){return b}var a=this.getValue();if(!this.getProperty()&&!a&&a!==0){return Ext.emptyFn}else{return this.createFilterFn()}}return b},createFilterFn:function(){var a=this,b=a.createValueMatcher();return function(d){var c=a.getRoot(),e=a.getProperty();if(c){d=d[c]}return b.test(d[e])}},createValueMatcher:function(){var d=this,e=d.getValue(),f=d.getAnyMatch(),c=d.getExactMatch(),a=d.getCaseSensitive(),b=Ext.String.escapeRegex;if(e===null||e===undefined||!e.exec){e=String(e);if(f===true){e=b(e)}else{e="^"+b(e);if(c===true){e+="$"}}e=new RegExp(e,a?"":"i")}return e}});Ext.define("Ext.util.AbstractMixedCollection",{mixins:{observable:Ext.mixin.Observable},constructor:function(b,a){var c=this;c.items=[];c.map={};c.keys=[];c.length=0;c.allowFunctions=b===true;if(a){c.getKey=a}c.mixins.observable.constructor.call(c)},allowFunctions:false,add:function(b,e){var d=this,f=e,c=b,a;if(arguments.length==1){f=c;c=d.getKey(f)}if(typeof c!="undefined"&&c!==null){a=d.map[c];if(typeof a!="undefined"){return d.replace(c,f)}d.map[c]=f}d.length++;d.items.push(f);d.keys.push(c);d.fireEvent("add",d.length-1,f,c);return f},getKey:function(a){return a.id},replace:function(c,e){var d=this,a,b;if(arguments.length==1){e=arguments[0];c=d.getKey(e)}a=d.map[c];if(typeof c=="undefined"||c===null||typeof a=="undefined"){return d.add(c,e)}b=d.indexOfKey(c);d.items[b]=e;d.map[c]=e;d.fireEvent("replace",c,a,e);return e},addAll:function(f){var e=this,d=0,b,a,c;if(arguments.length>1||Ext.isArray(f)){b=arguments.length>1?arguments:f;for(a=b.length;d=d.length){return d.add(c,f)}d.length++;Ext.Array.splice(d.items,a,0,f);if(typeof c!="undefined"&&c!==null){d.map[c]=f}Ext.Array.splice(d.keys,a,0,c);d.fireEvent("add",a,f,c);return f},remove:function(a){return this.removeAt(this.indexOf(a))},removeAll:function(a){Ext.each(a||[],function(b){this.remove(b)},this);return this},removeAt:function(a){var c=this,d,b;if(a=0){c.length--;d=c.items[a];Ext.Array.erase(c.items,a,1);b=c.keys[a];if(typeof b!="undefined"){delete c.map[b]}Ext.Array.erase(c.keys,a,1);c.fireEvent("remove",d,b);return d}return false},removeAtKey:function(a){return this.removeAt(this.indexOfKey(a))},getCount:function(){return this.length},indexOf:function(a){return Ext.Array.indexOf(this.items,a)},indexOfKey:function(a){return Ext.Array.indexOf(this.keys,a)},get:function(b){var d=this,a=d.map[b],c=a!==undefined?a:(typeof b=="number")?d.items[b]:undefined;return typeof c!="function"||d.allowFunctions?c:null},getAt:function(a){return this.items[a]},getByKey:function(a){return this.map[a]},contains:function(a){return Ext.Array.contains(this.items,a)},containsKey:function(a){return typeof this.map[a]!="undefined"},clear:function(){var a=this;a.length=0;a.items=[];a.keys=[];a.map={};a.fireEvent("clear")},first:function(){return this.items[0]},last:function(){return this.items[this.length-1]},sum:function(g,b,h,a){var c=this.extractValues(g,b),f=c.length,e=0,d;h=h||0;a=(a||a===0)?a:f-1;for(d=h;d<=a;d++){e+=c[d]}return e},collect:function(j,e,g){var k=this.extractValues(j,e),a=k.length,b={},c=[],h,f,d;for(d=0;d=a;d--){b[b.length]=c[d]}}return b},filter:function(d,c,f,a){var b=[],e;if(Ext.isString(d)){b.push(Ext.create("Ext.util.Filter",{property:d,value:c,anyMatch:f,caseSensitive:a}))}else{if(Ext.isArray(d)||d instanceof Ext.util.Filter){b=b.concat(d)}}e=function(g){var m=true,n=b.length,h;for(h=0;ha?1:(de?1:(f0?1:-1,g=this.getMinMomentumValue(),d=this.getMaxMomentumValue(),c=(f==1)?d:g,h=this.lastValue,i,b;if(e===0){return this.getStartValue()}if(!this.isOutOfBound){i=a.getValue();b=a.getVelocity();if(Math.abs(b)=g&&i<=d){return i}this.isOutOfBound=true;j.setStartTime(Ext.Date.now()).setStartVelocity(b).setStartValue(c)}i=j.getValue();if(!this.isEnded){if(!this.isBouncingBack){if(h!==null){if((f==1&&ih)){this.isBouncingBack=true}}}else{if(Math.round(i)==c){this.isEnded=true}}}this.lastValue=i;return i}});Ext.define("Ext.fx.easing.EaseOut",{extend:Ext.fx.easing.Linear,alias:"easing.ease-out",config:{exponent:4,duration:1500},getValue:function(){var f=Ext.Date.now()-this.getStartTime(),d=this.getDuration(),b=this.getStartValue(),h=this.getEndValue(),a=this.distance,c=f/d,g=1-c,e=1-Math.pow(g,this.getExponent()),i=b+(e*a);if(f>=d){this.isEnded=true;return h}return i}});Ext.define("Ext.scroll.Scroller",{extend:Ext.Evented,config:{element:null,direction:"auto",fps:"auto",disabled:null,directionLock:false,momentumEasing:{momentum:{acceleration:30,friction:0.5},bounce:{acceleration:30,springTension:0.3},minVelocity:1},bounceEasing:{duration:400},outOfBoundRestrictFactor:0.5,startMomentumResetTime:300,maxAbsoluteVelocity:6,containerSize:"auto",size:"auto",autoRefresh:true,initialOffset:{x:0,y:0},slotSnapSize:{x:0,y:0},slotSnapOffset:{x:0,y:0},slotSnapEasing:{duration:150},translatable:{translationMethod:"auto",useWrapper:false}},cls:Ext.baseCSSPrefix+"scroll-scroller",containerCls:Ext.baseCSSPrefix+"scroll-container",dragStartTime:0,dragEndTime:0,isDragging:false,isAnimating:false,constructor:function(a){var b=a&&a.element;this.listeners={scope:this,touchstart:"onTouchStart",touchend:"onTouchEnd",dragstart:"onDragStart",drag:"onDrag",dragend:"onDragEnd"};this.minPosition={x:0,y:0};this.startPosition={x:0,y:0};this.position={x:0,y:0};this.velocity={x:0,y:0};this.isAxisEnabledFlags={x:false,y:false};this.flickStartPosition={x:0,y:0};this.flickStartTime={x:0,y:0};this.lastDragPosition={x:0,y:0};this.dragDirection={x:0,y:0};this.initialConfig=a;if(b){this.setElement(b)}return this},applyElement:function(a){if(!a){return}return Ext.get(a)},updateElement:function(a){this.initialize();if(!this.FixedHBoxStretching){a.addCls(this.cls)}if(!this.getDisabled()){this.attachListeneners()}this.onConfigUpdate(["containerSize","size"],"refreshMaxPosition");this.on("maxpositionchange","snapToBoundary");this.on("minpositionchange","snapToBoundary");return this},applyTranslatable:function(b,a){return Ext.factory(b,Ext.util.Translatable,a)},updateTranslatable:function(a){a.setConfig({element:this.getElement(),listeners:{animationframe:"onAnimationFrame",animationend:"onAnimationEnd",scope:this}})},updateFps:function(a){if(a!=="auto"){this.getTranslatable().setFps(a)}},attachListeneners:function(){this.getContainer().on(this.listeners)},detachListeners:function(){this.getContainer().un(this.listeners)},updateDisabled:function(a){if(a){this.detachListeners()}else{this.attachListeneners()}},updateInitialOffset:function(c){if(typeof c=="number"){c={x:c,y:c}}var b=this.position,a,d;b.x=a=c.x;b.y=d=c.y;this.getTranslatable().translate(-a,-d)},applyDirection:function(a){var e=this.getMinPosition(),d=this.getMaxPosition(),c,b;this.givenDirection=a;if(a==="auto"){c=d.x>e.x;b=d.y>e.y;if(c&&b){a="both"}else{if(c){a="horizontal"}else{a="vertical"}}}return a},updateDirection:function(f,e){var b=this.isAxisEnabledFlags,d=this.cls+"-vertical",a=this.cls+"-horizontal",c=this.getElement();if(e==="both"||e==="horizontal"){c.removeCls(a)}if(e==="both"||e==="vertical"){c.removeCls(d)}b.x=b.y=false;if(f==="both"||f==="horizontal"){b.x=true;c.addCls(a)}if(f==="both"||f==="vertical"){b.y=true;c.addCls(d)}},isAxisEnabled:function(a){this.getDirection();return this.isAxisEnabledFlags[a]},applyMomentumEasing:function(b){var a=Ext.fx.easing.BoundMomentum;return{x:Ext.factory(b,a),y:Ext.factory(b,a)}},applyBounceEasing:function(b){var a=Ext.fx.easing.EaseOut;return{x:Ext.factory(b,a),y:Ext.factory(b,a)}},updateBounceEasing:function(a){this.getTranslatable().setEasingX(a.x).setEasingY(a.y)},applySlotSnapEasing:function(b){var a=Ext.fx.easing.EaseOut;return{x:Ext.factory(b,a),y:Ext.factory(b,a)}},getMinPosition:function(){var a=this.minPosition;if(!a){this.minPosition=a={x:0,y:0};this.fireEvent("minpositionchange",this,a)}return a},getMaxPosition:function(){var c=this.maxPosition,a,b;if(!c){a=this.getSize();b=this.getContainerSize();this.maxPosition=c={x:Math.max(0,a.x-b.x),y:Math.max(0,a.y-b.y)};this.fireEvent("maxpositionchange",this,c)}return c},refreshMaxPosition:function(){this.maxPosition=null;this.getMaxPosition()},applyContainerSize:function(b){var c=this.getContainer().dom,a,d;if(!c){return}this.givenContainerSize=b;if(b==="auto"){a=c.offsetWidth;d=c.offsetHeight}else{a=b.x;d=b.y}return{x:a,y:d}},applySize:function(b){var c=this.getElement().dom,a,d;if(!c){return}this.givenSize=b;if(b==="auto"){a=c.offsetWidth;d=c.offsetHeight}else{if(typeof b=="number"){a=b;d=b}else{a=b.x;d=b.y}}return{x:a,y:d}},updateAutoRefresh:function(a){this.getElement().toggleListener(a,"resize","onElementResize",this);this.getContainer().toggleListener(a,"resize","onContainerResize",this)},applySlotSnapSize:function(a){if(typeof a=="number"){return{x:a,y:a}}return a},applySlotSnapOffset:function(a){if(typeof a=="number"){return{x:a,y:a}}return a},getContainer:function(){var a=this.container,b;if(!a){b=this.getElement().getParent();this.container=a=this.FixedHBoxStretching?b.getParent():b;a.addCls(this.containerCls)}return a},refresh:function(){this.stopAnimation();this.getTranslatable().refresh();this.setSize(this.givenSize);this.setContainerSize(this.givenContainerSize);this.setDirection(this.givenDirection);this.fireEvent("refresh",this);return this},onElementResize:function(a,b){this.setSize({x:b.width,y:b.height});this.refresh()},onContainerResize:function(a,b){this.setContainerSize({x:b.width,y:b.height});this.refresh()},scrollTo:function(c,h,g){if(this.isDestroyed){return this}var b=this.getTranslatable(),a=this.position,d=false,f,e;if(this.isAxisEnabled("x")){if(isNaN(c)||typeof c!="number"){c=a.x}else{if(a.x!==c){a.x=c;d=true}}f=-c}if(this.isAxisEnabled("y")){if(isNaN(h)||typeof h!="number"){h=a.y}else{if(a.y!==h){a.y=h;d=true}}e=-h}if(d){if(g!==undefined&&g!==false){b.translateAnimated(f,e,g)}else{this.fireEvent("scroll",this,a.x,a.y);b.translate(f,e)}}return this},scrollToTop:function(b){var a=this.getInitialOffset();return this.scrollTo(a.x,a.y,b)},scrollToEnd:function(c){var b=this.getSize(),a=this.getContainerSize();return this.scrollTo(b.x-a.x,b.y-a.y,c)},scrollBy:function(b,d,c){var a=this.position;b=(typeof b=="number")?b+a.x:null;d=(typeof d=="number")?d+a.y:null;return this.scrollTo(b,d,c)},onTouchStart:function(){this.isTouching=true;this.stopAnimation()},onTouchEnd:function(){var a=this.position;this.isTouching=false;if(!this.isDragging&&this.snapToSlot()){this.fireEvent("scrollstart",this,a.x,a.y)}},onDragStart:function(l){var o=this.getDirection(),g=l.absDeltaX,f=l.absDeltaY,j=this.getDirectionLock(),i=this.startPosition,d=this.flickStartPosition,k=this.flickStartTime,h=this.lastDragPosition,c=this.position,b=this.dragDirection,n=c.x,m=c.y,a=Ext.Date.now();this.isDragging=true;if(j&&o!=="both"){if((o==="horizontal"&&g>f)||(o==="vertical"&&f>g)){l.stopPropagation()}else{this.isDragging=false;return}}h.x=n;h.y=m;d.x=n;d.y=m;i.x=n;i.y=m;k.x=a;k.y=a;b.x=0;b.y=0;this.dragStartTime=a;this.isDragging=true;this.fireEvent("scrollstart",this,n,m)},onAxisDrag:function(i,q){if(!this.isAxisEnabled(i)){return}var h=this.flickStartPosition,l=this.flickStartTime,j=this.lastDragPosition,e=this.dragDirection,g=this.position[i],k=this.getMinPosition()[i],o=this.getMaxPosition()[i],d=this.startPosition[i],p=j[i],n=d-q,c=e[i],m=this.getOutOfBoundRestrictFactor(),f=this.getStartMomentumResetTime(),b=Ext.Date.now(),a;if(no){a=n-o;n=o+a*m}}if(n>p){e[i]=1}else{if(nf){h[i]=g;l[i]=b}j[i]=n},onDrag:function(b){if(!this.isDragging){return}var a=this.lastDragPosition;this.onAxisDrag("x",b.deltaX);this.onAxisDrag("y",b.deltaY);this.scrollTo(a.x,a.y)},onDragEnd:function(c){var b,a;if(!this.isDragging){return}this.dragEndTime=Ext.Date.now();this.onDrag(c);this.isDragging=false;b=this.getAnimationEasing("x",c);a=this.getAnimationEasing("y",c);if(b||a){this.getTranslatable().animate(b,a)}else{this.onScrollEnd()}},getAnimationEasing:function(g,j){if(!this.isAxisEnabled(g)){return null}var f=this.position[g],c=this.getMinPosition()[g],i=this.getMaxPosition()[g],a=this.getMaxAbsoluteVelocity(),d=null,b=this.dragEndTime,h=j.flick.velocity[g],k;if(fi){d=i}}if(d!==null){k=this.getBounceEasing()[g];k.setConfig({startTime:b,startValue:-f,endValue:-d});return k}if(h===0){return null}if(h<-a){h=-a}else{if(h>a){h=a}}if(Ext.browser.is.IE){h*=2}k=this.getMomentumEasing()[g];k.setConfig({startTime:b,startValue:-f,startVelocity:h*1.5,minMomentumValue:-i,maxMomentumValue:0});return k},onAnimationFrame:function(c,b,d){var a=this.position;a.x=-b;a.y=-d;this.fireEvent("scroll",this,a.x,a.y)},onAnimationEnd:function(){this.snapToBoundary();this.onScrollEnd()},stopAnimation:function(){this.getTranslatable().stopAnimation()},onScrollEnd:function(){var a=this.position;if(this.isTouching||!this.snapToSlot()){this.fireEvent("scrollend",this,a.x,a.y)}},snapToSlot:function(){var b=this.getSnapPosition("x"),a=this.getSnapPosition("y"),c=this.getSlotSnapEasing();if(b!==null||a!==null){this.scrollTo(b,a,{easingX:c.x,easingY:c.y});return true}return false},getSnapPosition:function(c){var g=this.getSlotSnapSize()[c],d=null,a,f,e,b;if(g!==0&&this.isAxisEnabled(c)){a=this.position[c];f=this.getSlotSnapOffset()[c];e=this.getMaxPosition()[c];b=Math.floor((a-f)%g);if(b!==0){if(a!==e){if(Math.abs(b)>g/2){d=Math.min(e,a+((b>0)?g-b:b-g))}else{d=a-b}}else{d=a-b}}}return d},snapToBoundary:function(){var g=this.position,c=this.getMinPosition(),f=this.getMaxPosition(),e=c.x,d=c.y,b=f.x,a=f.y,i=Math.round(g.x),h=Math.round(g.y);if(ib){i=b}}if(ha){h=a}}this.scrollTo(i,h)},destroy:function(){var c=this.getElement(),b=this.sizeMonitors,a;if(b){b.element.destroy();b.container.destroy()}if(c&&!c.isDestroyed){c.removeCls(this.cls);a=this.getContainer();if(a&&!a.isDestroyed){a.removeCls(this.containerCls)}}Ext.destroy(this.getTranslatable());this.callParent(arguments)}},function(){});(function(){var c=0,e=["ms","moz","webkit","o"],b=e.length,a,d;for(a=0;a=500){this.run()}},run:function(){if(!this.isRunning){return}var b=this.runningQueue,c,d;this.lastRunTime=Date.now();this.frameStartTime=Ext.performance.now();b.push.apply(b,this.queue);for(c=0,d=b.length;c0){c=b.shift();this.invoke(c);this.processIdleQueue()}},processTaskQueue:function(){if(!this.hasOwnProperty("taskQueueTimer")){this.taskQueueTimer=setTimeout(this.processTaskQueueItem,15)}},processTaskQueueItem:function(){delete this.taskQueueTimer;var b=this.taskQueue,c;if(b.length>0){c=b.shift();this.invoke(c);this.processTaskQueue()}},showFps:function(){if(!Ext.trueRequestAnimationFrames){alert("This browser does not support requestAnimationFrame. The FPS listed will not be accurate")}Ext.onReady(function(){Ext.Viewport.add([{xtype:"component",bottom:50,left:0,width:50,height:20,html:"Average",style:"background-color: black; color: white; text-align: center; line-height: 20px; font-size: 8px;"},{id:"__averageFps",xtype:"component",bottom:0,left:0,width:50,height:50,html:"0",style:"background-color: red; color: white; text-align: center; line-height: 50px;"},{xtype:"component",bottom:50,left:50,width:50,height:20,html:"Min (Last 1k)",style:"background-color: black; color: white; text-align: center; line-height: 20px; font-size: 8px;"},{id:"__minFps",xtype:"component",bottom:0,left:50,width:50,height:50,html:"0",style:"background-color: orange; color: white; text-align: center; line-height: 50px;"},{xtype:"component",bottom:50,left:100,width:50,height:20,html:"Max (Last 1k)",style:"background-color: black; color: white; text-align: center; line-height: 20px; font-size: 8px;"},{id:"__maxFps",xtype:"component",bottom:0,left:100,width:50,height:50,html:"0",style:"background-color: yellow; color: black; text-align: center; line-height: 50px;"},{xtype:"component",bottom:50,left:150,width:50,height:20,html:"Current",style:"background-color: black; color: white; text-align: center; line-height: 20px; font-size: 8px;"},{id:"__currentFps",xtype:"component",bottom:0,left:150,width:50,height:50,html:"0",style:"background-color: green; color: white; text-align: center; line-height: 50px;"}]);Ext.AnimationQueue.resetFps()})},resetFps:function(){var d=Ext.getCmp("__currentFps"),c=Ext.getCmp("__averageFps"),i=Ext.getCmp("__minFps"),h=Ext.getCmp("__maxFps"),e=1000,b=0,g=0,f=0;Ext.AnimationQueue.onFpsChanged=function(j){g++;if(!(g%10)){e=1000;b=0}f+=j;e=Math.min(e,j);b=Math.max(b,j);d.setHtml(Math.round(j));c.setHtml(Math.round(f/g));i.setHtml(Math.round(e));h.setHtml(Math.round(b))}}},function(){})})(this);Ext.define("Ext.TaskQueue",{singleton:true,pending:false,mode:true,constructor:function(){this.readQueue=[];this.writeQueue=[];this.run=Ext.Function.bind(this.run,this);this.watch=Ext.Function.bind(this.watch,this);if(Ext.os.is.iOS){setInterval(this.watch,500)}},requestRead:function(c,b,a){this.request(true);this.readQueue.push(arguments)},requestWrite:function(c,b,a){this.request(false);this.writeQueue.push(arguments)},request:function(a){if(!this.pending){this.pendingTime=Date.now();this.pending=true;this.mode=a;if(a){setTimeout(this.run,1)}else{requestAnimationFrame(this.run)}}},watch:function(){if(this.pending&&Date.now()-this.pendingTime>=500){this.run()}},run:function(){this.pending=false;var j=this.readQueue,e=this.writeQueue,c=null,f;if(this.mode){f=j;if(e.length>0){c=false}}else{f=e;if(j.length>0){c=true}}var b=f.slice(),d,g,a,h,k;f.length=0;for(d=0,g=b.length;d2){h.apply(k,a[2])}else{h.call(k)}}b.length=0;if(c!==null){this.request(c)}}});Ext.define("Ext.scroll.indicator.Abstract",{extend:Ext.Component,config:{baseCls:"x-scroll-indicator",axis:"x",value:null,length:null,minLength:6,hidden:true,ui:"dark",autoHide:true},cachedConfig:{ratio:1,barCls:"x-scroll-bar",active:true},barElement:null,barLength:0,gapLength:0,getElementConfig:function(){return{reference:"barElement",children:[this.callParent()]}},applyRatio:function(a){if(isNaN(a)||a>1){a=1}return a},refresh:function(){var f=this.barElement,e=f.dom,c=this.getRatio(),b=this.getAxis(),a=(b==="x")?e.offsetWidth:e.offsetHeight,d=a*c;this.barLength=a;this.gapLength=a-d;this.setLength(d);this.updateValue(this.getValue())},updateBarCls:function(a){this.barElement.addCls(a)},updateAxis:function(a){this.element.addCls(this.getBaseCls(),null,a);this.barElement.addCls(this.getBarCls(),null,a)},updateValue:function(f){var b=this.barLength,c=this.gapLength,d=this.getLength(),e,g,a;if(f<=0){g=0;this.updateLength(this.applyLength(d+f*b))}else{if(f>=1){a=Math.round((f-1)*b);e=this.applyLength(d-a);a=d-e;this.updateLength(e);g=c+a}else{g=c*f}}this.setOffset(g)},updateActive:function(a){this.barElement[a?"addCls":"removeCls"]("active")},doSetHidden:function(b){var a=this;if(b){a.getAutoHide()&&a.setOffset(-10000)}else{delete a.lastLength;delete a.lastOffset;a.updateValue(a.getValue())}},applyLength:function(a){return Math.max(this.getMinLength(),a)},updateLength:function(a){a=Math.round(a);if(this.lastLength===a){return}this.lastLength=a;Ext.TaskQueue.requestWrite("doUpdateLength",this,[a])},doUpdateLength:function(c){if(!this.isDestroyed){var b=this.getAxis(),a=this.element;if(b==="x"){a.setWidth(c)}else{a.setHeight(c)}}},setOffset:function(a){a=Math.round(a);if(this.lastOffset===a||this.lastOffset===-10000){return}this.lastOffset=a;Ext.TaskQueue.requestWrite("doSetOffset",this,[a])},doSetOffset:function(c){if(!this.isDestroyed){var b=this.getAxis(),a=this.element;if(b==="x"){a.translate(c,0)}else{a.translate(0,c)}}}});Ext.define("Ext.scroll.indicator.CssTransform",{extend:Ext.scroll.indicator.Abstract,config:{cls:"csstransform"}});Ext.define("Ext.scroll.indicator.ScrollPosition",{extend:Ext.scroll.indicator.Abstract,config:{cls:"scrollposition"},getElementConfig:function(){var a=this.callParent(arguments);a.children.unshift({className:"x-scroll-bar-stretcher"});return a},updateValue:function(a){if(this.gapLength===0){if(a>=1){a--}this.setOffset(this.barLength*a)}else{this.setOffset(this.gapLength*a)}},doUpdateLength:function(){if(!this.isDestroyed){var a=this.barLength,b=this.element;this.callParent(arguments);if(this.getAxis()==="x"){b.setLeft(a)}else{b.setTop(a)}}},doSetOffset:function(d){if(!this.isDestroyed){var b=this.barLength,a=this.getMinLength(),c=this.barElement.dom;if(d!==-10000){d=Math.min(b-a,Math.max(d,a-this.getLength()));d=b-d}if(this.getAxis()==="x"){c.scrollLeft=d}else{c.scrollTop=d}}}});Ext.define("Ext.scroll.indicator.Rounded",{extend:Ext.scroll.indicator.Abstract,config:{cls:"rounded"},constructor:function(){this.callParent(arguments);this.transformPropertyName=Ext.browser.getVendorProperyName("transform")},getElementConfig:function(){var a=this.callParent();a.children[0].children=[{reference:"startElement"},{reference:"middleElement"},{reference:"endElement"}];return a},refresh:function(){var d=this.getAxis(),c=this.startElement.dom,a=this.endElement.dom,e=this.middleElement,b,f;if(d==="x"){b=c.offsetWidth;f=a.offsetWidth;e.setLeft(b)}else{b=c.offsetHeight;f=a.offsetHeight;e.setTop(b)}this.startElementLength=b;this.endElementLength=f;this.callParent()},doUpdateLength:function(c){if(!this.isDestroyed){var b=this.getAxis(),a=this.endElement,e=this.middleElement.dom.style,d=this.endElementLength,h=c-d,g=h-this.startElementLength,f=this.transformPropertyName;if(b==="x"){a.translate(h,0);e[f]="translate3d(0, 0, 0) scaleX("+g+")"}else{a.translate(0,h);e[f]="translate3d(0, 0, 0) scaleY("+g+")"}}}});Ext.define("Ext.scroll.Indicator",{alternateClassName:"Ext.util.Indicator",constructor:function(a){var b=Ext.scroll.indicator;switch(Ext.browser.getPreferredTranslationMethod(a)){case"scrollposition":return new b.ScrollPosition(a);case"csstransform":if(Ext.browser.is.AndroidStock4){return new b.CssTransform(a)}else{return new b.Rounded(a)}}}});Ext.define("Ext.scroll.View",{extend:Ext.Evented,alternateClassName:"Ext.util.ScrollView",config:{indicatorsUi:"dark",element:null,scroller:{},indicators:{x:{axis:"x"},y:{axis:"y"}},indicatorsHidingDelay:100,cls:Ext.baseCSSPrefix+"scroll-view"},processConfig:function(c){if(!c){return null}if(typeof c=="string"){c={direction:c}}c=Ext.merge({},c);var a=c.scroller,b;if(!a){c.scroller=a={}}for(b in c){if(c.hasOwnProperty(b)){if(!this.hasConfig(b)){a[b]=c[b];delete c[b]}}}return c},constructor:function(a){a=this.processConfig(a);this.useIndicators={x:true,y:true};this.doHideIndicators=Ext.Function.bind(this.doHideIndicators,this);this.initConfig(a)},setConfig:function(a){return this.callParent([this.processConfig(a)])},updateIndicatorsUi:function(a){var b=this.getIndicators();b.x.setUi(a);b.y.setUi(a)},applyScroller:function(a,b){return Ext.factory(a,Ext.scroll.Scroller,b)},applyIndicators:function(b,d){var a=Ext.scroll.Indicator,c=this.useIndicators;if(!b){b={}}if(!b.x){c.x=false;b.x={}}if(!b.y){c.y=false;b.y={}}return{x:Ext.factory(b.x,a,d&&d.x),y:Ext.factory(b.y,a,d&&d.y)}},updateIndicators:function(a){this.indicatorsGrid=Ext.Element.create({className:"x-scroll-bar-grid-wrapper",children:[{className:"x-scroll-bar-grid",children:[{children:[{},{children:[a.y.barElement]}]},{children:[{children:[a.x.barElement]},{}]}]}]})},updateScroller:function(a){a.on({scope:this,scrollstart:"onScrollStart",scroll:"onScroll",scrollend:"onScrollEnd",refresh:"refreshIndicators"})},isAxisEnabled:function(a){return this.getScroller().isAxisEnabled(a)&&this.useIndicators[a]},applyElement:function(a){if(a){return Ext.get(a)}},updateElement:function(c){var b=this.getScroller(),a;a=c.getFirstChild().getFirstChild();if(this.FixedHBoxStretching){a=a.getFirstChild()}c.addCls(this.getCls());c.insertFirst(this.indicatorsGrid);b.setElement(a);this.refreshIndicators();return this},showIndicators:function(){var a=this.getIndicators();if(this.hasOwnProperty("indicatorsHidingTimer")){clearTimeout(this.indicatorsHidingTimer);delete this.indicatorsHidingTimer}if(this.isAxisEnabled("x")){a.x.show()}if(this.isAxisEnabled("y")){a.y.show()}},hideIndicators:function(){var a=this.getIndicatorsHidingDelay();if(a>0){this.indicatorsHidingTimer=setTimeout(this.doHideIndicators,a)}else{this.doHideIndicators()}},doHideIndicators:function(){var a=this.getIndicators();if(this.isAxisEnabled("x")){a.x.hide()}if(this.isAxisEnabled("y")){a.y.hide()}},onScrollStart:function(){this.onScroll.apply(this,arguments);this.showIndicators()},onScrollEnd:function(){this.hideIndicators()},onScroll:function(b,a,c){this.setIndicatorValue("x",a);this.setIndicatorValue("y",c)},setIndicatorValue:function(b,f){if(!this.isAxisEnabled(b)){return this}var a=this.getScroller(),c=a.getMaxPosition()[b],e=a.getContainerSize()[b],d;if(c===0){d=f/e;if(f>=0){d+=1}}else{if(f>c){d=1+((f-c)/e)}else{if(f<0){d=f/e}else{d=f/c}}}this.getIndicators()[b].setValue(d)},refreshIndicator:function(d){if(!this.isAxisEnabled(d)){return this}var a=this.getScroller(),b=this.getIndicators()[d],e=a.getContainerSize()[d],f=a.getSize()[d],c=e/f;b.setRatio(c);b.refresh()},refresh:function(){return this.getScroller().refresh()},refreshIndicators:function(){var a=this.getIndicators();a.x.setActive(this.isAxisEnabled("x"));a.y.setActive(this.isAxisEnabled("y"));this.refreshIndicator("x");this.refreshIndicator("y")},destroy:function(){var a=this.getElement(),b=this.getIndicators();Ext.destroy(this.getScroller(),this.indicatorsGrid);if(this.hasOwnProperty("indicatorsHidingTimer")){clearTimeout(this.indicatorsHidingTimer);delete this.indicatorsHidingTimer}if(a&&!a.isDestroyed){a.removeCls(this.getCls())}b.x.destroy();b.y.destroy();delete this.indicatorsGrid;this.callParent(arguments)}});Ext.define("Ext.behavior.Scrollable",{extend:Ext.behavior.Behavior,constructor:function(){this.listeners={painted:"onComponentPainted",scope:this};this.callParent(arguments)},onComponentPainted:function(){this.scrollView.refresh()},setConfig:function(f){var c=this.scrollView,e=this.component,b,d,a,g;if(f){if(!c){this.scrollView=c=new Ext.scroll.View(f);c.on("destroy","onScrollViewDestroy",this);e.setUseBodyElement(true);this.scrollerElement=b=e.innerElement;if(!Ext.feature.has.ProperHBoxStretching){a=c.getScroller();g=(Ext.isObject(f)?f.direction:f)||"auto";if(g!=="vertical"){d=b.wrap();d.addCls(Ext.baseCSSPrefix+"translatable-hboxfix");if(g=="horizontal"){d.setStyle({height:"100%"})}this.scrollContainer=d.wrap();c.FixedHBoxStretching=a.FixedHBoxStretching=true}else{this.scrollContainer=b.wrap()}}else{this.scrollContainer=b.wrap()}c.setElement(e.bodyElement);if(e.isPainted()){this.onComponentPainted()}e.on(this.listeners)}else{if(Ext.isString(f)||Ext.isObject(f)){c.setConfig(f)}}}else{if(c){c.destroy()}}return this},getScrollView:function(){return this.scrollView},onScrollViewDestroy:function(){var b=this.component,a=this.scrollerElement;if(!a.isDestroyed){this.scrollerElement.unwrap()}this.scrollContainer.destroy();if(!b.isDestroyed){b.un(this.listeners)}delete this.scrollerElement;delete this.scrollView;delete this.scrollContainer},onComponentDestroy:function(){var a=this.scrollView;if(a){a.destroy()}}});Ext.define("Ext.util.InputBlocker",{singleton:true,blockInputs:function(){if(Ext.browser.is.ie){Ext.select(".x-field-text .x-field-input:not(.x-item-disabled) .x-input-el, .x-field-textarea .x-field-input:not(.x-item-disabled) .x-input-el, .x-field-search .x-field-input:not(.x-item-disabled) .x-input-el").each(function(a){if(a.dom.offsetWidth>0){a.dom.setAttribute("disabled",true);a.dom.setAttribute("overlayfix",true)}})}},unblockInputs:function(){if(Ext.browser.is.ie){Ext.select("[overlayfix]").each(function(a){a.dom.removeAttribute("disabled");a.dom.removeAttribute("overlayfix")})}}});Ext.define("Ext.Mask",{extend:Ext.Component,xtype:"mask",config:{baseCls:Ext.baseCSSPrefix+"mask",transparent:false,top:0,left:0,right:0,bottom:0},initialize:function(){this.callSuper();this.element.on("*","onEvent",this);this.on({hide:"onHide"})},onHide:function(){Ext.util.InputBlocker.unblockInputs();if(Ext.browser.is.AndroidStock4&&Ext.os.version.getMinor()===0){var a=this.element.getFirstChild();if(a){a.redraw()}}},onEvent:function(b){var a=arguments[arguments.length-1];if(a.info.eventName==="tap"){this.fireEvent("tap",this,b);return false}if(b&&b.stopEvent){b.stopEvent()}return false},updateTransparent:function(a){this[a?"addCls":"removeCls"](this.getBaseCls()+"-transparent")}});Ext.define("Ext.Container",{extend:Ext.Component,alternateClassName:"Ext.lib.Container",xtype:"container",eventedConfig:{activeItem:0,scrollable:null},config:{layout:null,control:{},defaults:null,items:null,autoDestroy:true,defaultType:null,useBodyElement:null,masked:null,modal:null,hideOnMaskTap:null},isContainer:true,constructor:function(a){var b=this;b._items=b.items=new Ext.ItemCollection();b.innerItems=[];b.onItemAdd=b.onFirstItemAdd;b.callParent(arguments)},getElementConfig:function(){return{reference:"element",classList:["x-container","x-unsized"],children:[{reference:"innerElement",className:"x-inner"}]}},applyMasked:function(b){var a=true,c;if(b===false){b=true;a=false}c=Ext.factory(b,Ext.Mask,this.getMasked());if(c){this.add(c);c.setHidden(!a)}return c},mask:function(a){this.setMasked(a||true)},unmask:function(){this.setMasked(false)},setParent:function(a){this.callSuper(arguments);if(a){var b=this.getModal();if(b){a.insertBefore(b,this);b.setZIndex(this.getZIndex()-1)}}},applyModal:function(c,b){var a=true;if(c===false){c=true;a=false}b=Ext.factory(c,Ext.Mask,b);if(b){b.setVisibility(a)}return b},updateModal:function(b){var a=this.getParent();if(a){if(b){a.insertBefore(b,this);b.setZIndex(this.getZIndex()-1)}else{a.remove(b)}}},updateHideOnMaskTap:function(b){var a=this.getModal();if(a){a[b?"on":"un"].call(a,"tap","hide",this)}},updateZIndex:function(b){var a=this.getModal();this.callParent(arguments);if(a){a.setZIndex(b-1)}},updateBaseCls:function(a,b){var c=this,d=c.getUi();if(b){this.element.removeCls(b);this.innerElement.removeCls(a,null,"inner");if(d){this.element.removeCls(this.currentUi)}}if(a){this.element.addCls(a);this.innerElement.addCls(a,null,"inner");if(d){this.element.addCls(a,null,d);this.currentUi=a+"-"+d}}},updateUseBodyElement:function(a){if(a){this.link("bodyElement",this.innerElement.wrap({cls:"x-body"}))}},applyItems:function(a,d){if(a){var b=this;b.getDefaultType();b.getDefaults();if(b.initialized&&d.length>0){b.removeAll()}b.add(a);if(b.initialized){var c=b.initialConfig.activeItem||b.config.activeItem||0;b.setActiveItem(c)}}},applyControl:function(c){var a,b,e,d;for(a in c){d=c[a];for(b in d){e=d[b];if(Ext.isObject(e)){e.delegate=a}}d.delegate=a;this.addListener(d)}return c},onFirstItemAdd:function(){delete this.onItemAdd;if(this.innerHtmlElement&&!this.getHtml()){this.innerHtmlElement.destroy();delete this.innerHtmlElement}this.on("innerstatechange","onItemInnerStateChange",this,{delegate:"> component"});return this.onItemAdd.apply(this,arguments)},getLayout:function(){var a=this.layout;if(!a){a=this.link("_layout",this.link("layout",Ext.factory(this._layout||"default",Ext.layout.Default,null,"layout")));a.setContainer(this)}return a},updateDefaultType:function(a){this.defaultItemClass=Ext.ClassManager.getByAlias("widget."+a)},applyDefaults:function(a){if(a){this.factoryItem=this.factoryItemWithDefaults;return a}},factoryItem:function(a){return Ext.factory(a,this.defaultItemClass)},factoryItemWithDefaults:function(c){var b=this,d=b.getDefaults(),a;if(!d){return Ext.factory(c,b.defaultItemClass)}if(c.isComponent){a=c;if(d&&c.isInnerItem()&&!b.has(a)){a.setConfig(d,true)}}else{if(d&&!c.ignoreDefaults){if(!(c.hasOwnProperty("left")&&c.hasOwnProperty("right")&&c.hasOwnProperty("top")&&c.hasOwnProperty("bottom")&&c.hasOwnProperty("docked")&&c.hasOwnProperty("centered"))){c=Ext.mergeIf({},c,d)}}a=Ext.factory(c,b.defaultItemClass)}return a},add:function(a){var e=this,b,d,c,f;if(Ext.isArray(a)){for(b=0,d=a.length;b0&&c.isInnerItem()){f=c}}}else{c=e.factoryItem(a);this.doAdd(c);if(!f&&!this.getActiveItem()&&this.innerItems.length>0&&c.isInnerItem()){f=c}}if(f){this.setActiveItem(f)}return c},doAdd:function(d){var c=this,a=c.getItems(),b;if(!a.has(d)){b=a.length;a.add(d);if(d.isInnerItem()){c.insertInner(d)}d.setParent(c);c.onItemAdd(d,b)}},remove:function(d,b){var c=this,a=c.indexOf(d),e=c.getInnerItems();if(b===undefined){b=c.getAutoDestroy()}if(a!==-1){if(!c.removingAll&&e.length>1&&d===c.getActiveItem()){c.on({activeitemchange:"doRemove",scope:c,single:true,order:"after",args:[d,a,b]});c.doResetActiveItem(e.indexOf(d))}else{c.doRemove(d,a,b);if(e.length===0){c.setActiveItem(null)}}}return c},doResetActiveItem:function(a){if(a===0){this.setActiveItem(1)}else{this.setActiveItem(0)}},doRemove:function(d,a,b){var c=this;c.items.remove(d);if(d.isInnerItem()){c.removeInner(d)}c.onItemRemove(d,a,b);d.setParent(null);if(b){d.destroy()}},removeAll:function(c,f){var a=this.items,e=a.length,b=0,d;if(typeof c!="boolean"){c=this.getAutoDestroy()}f=Boolean(f);this.removingAll=true;for(;b=0;b--){c.insert(a,d[b])}return c}d=this.factoryItem(d);this.doInsert(a,d);return d},doInsert:function(d,f){var e=this,b=e.items,c=b.length,a,g;g=f.isInnerItem();if(d>c){d=c}if(b[d-1]===f){return e}a=e.indexOf(f);if(a!==-1){if(a "+a)[0]||null},down:function(a){return this.query(a)[0]||null},destroy:function(){var b=this,a=b.getModal();if(a){a.destroy()}b.removeAll(true,true);b.unlink("_scrollable");Ext.destroy(b.items);b.callSuper()}},function(){this.addMember("defaultItemClass",this)});Ext.define("Ext.util.Point",{radianToDegreeConstant:180/Math.PI,statics:{fromEvent:function(b){var a=b.changedTouches,c=(a&&a.length>0)?a[0]:b;return this.fromTouch(c)},fromTouch:function(a){return new this(a.pageX,a.pageY)},from:function(a){if(!a){return new this(0,0)}if(!(a instanceof this)){return new this(a.x,a.y)}return a}},constructor:function(a,b){if(typeof a=="undefined"){a=0}if(typeof b=="undefined"){b=0}this.x=a;this.y=b;return this},clone:function(){return new this.self(this.x,this.y)},copy:function(){return this.clone.apply(this,arguments)},copyFrom:function(a){this.x=a.x;this.y=a.y;return this},toString:function(){return"Point["+this.x+","+this.y+"]"},equals:function(a){return(this.x===a.x&&this.y===a.y)},isCloseTo:function(c,b){if(typeof b=="number"){b={x:b};b.y=b.x}var a=c.x,f=c.y,e=b.x,d=b.y;return(this.x<=a+e&&this.x>=a-e&&this.y<=f+d&&this.y>=f-d)},isWithin:function(){return this.isCloseTo.apply(this,arguments)},translate:function(a,b){this.x+=a;this.y+=b;return this},roundedEquals:function(a){if(typeof a!="object"){a={x:0,y:0}}return(Math.round(this.x)===Math.round(a.x)&&Math.round(this.y)===Math.round(a.y))},getDistanceTo:function(b){if(typeof b!="object"){b={x:0,y:0}}var c=this.x-b.x,a=this.y-b.y;return Math.sqrt(c*c+a*a)},getAngleTo:function(b){if(typeof b!="object"){b={x:0,y:0}}var c=this.x-b.x,a=this.y-b.y;return Math.atan2(a,c)*this.radianToDegreeConstant}});Ext.define("Ext.util.LineSegment",{constructor:function(b,a){var c=Ext.util.Point;this.point1=c.from(b);this.point2=c.from(a)},intersects:function(l){var o=this.point1,m=this.point2,i=l.point1,f=l.point2,c=o.x,b=m.x,a=i.x,q=f.x,p=o.y,n=m.y,k=i.y,h=f.y,g=(c-b)*(k-h)-(p-n)*(a-q),j,e;if(g==0){return null}j=((a-q)*(c*n-p*b)-(c-b)*(a*h-k*q))/g;e=((k-h)*(c*n-p*b)-(p-n)*(a*h-k*q))/g;if(jMath.max(c,b)||jMath.max(a,q)||eMath.max(p,n)||eMath.max(k,h)){return null}return new Ext.util.Point(j,e)},getLength:function(){return Math.abs(this.point1.getDistanceTo(this.point2))},getAngleToX:function(){var d=this.point1,c=this.point2,a=c.y-d.y,b=c.x-d.x;return Math.atan2(a,b)},getInBetweenPoint:function(e){var b=this.point1,c=this.getAngleToX(),a=b.x+Math.cos(c)*e,d=b.y+Math.sin(c)*e;return new Ext.util.Point(a,d)},toString:function(){return this.point1.toString()+" "+this.point2.toString()}});Ext.define("Ext.Panel",{extend:Ext.Container,alternateClassName:"Ext.lib.Panel",xtype:"panel",isPanel:true,config:{baseCls:Ext.baseCSSPrefix+"panel",bodyPadding:null,bodyMargin:null,bodyBorder:null},getElementConfig:function(){return{reference:"element",classList:["x-container","x-unsized"],children:[{reference:"innerElement",className:"x-inner"},{reference:"tipElement",className:"x-anchor",hidden:true}]}},applyBodyPadding:function(a){if(a===true){a=5}if(a){a=Ext.dom.Element.unitizeBox(a)}return a},updateBodyPadding:function(a){this.element.setStyle("padding",a)},applyBodyMargin:function(a){if(a===true){a=5}if(a){a=Ext.dom.Element.unitizeBox(a)}return a},updateBodyMargin:function(a){this.element.setStyle("margin",a)},applyBodyBorder:function(a){if(a===true){a=1}if(a){a=Ext.dom.Element.unitizeBox(a)}return a},updateBodyBorder:function(a){this.element.setStyle("border-width",a)},alignTo:function(n,i){var s=this.getAlignmentInfo(n,i);if(s.isAligned){return}var y=this.tipElement;y.hide();if(this.currentTipPosition){y.removeCls("x-anchor-"+this.currentTipPosition)}this.callParent(arguments);var f=Ext.util.LineSegment,d=n.isComponent?n.renderElement:n,a=this.renderElement,o=d.getPageBox(),l=a.getPageBox(),b=l.left,v=l.top,E=l.right,h=l.bottom,k=b+(l.width/2),j=v+(l.height/2),p={x:b,y:v},m={x:E,y:v},D={x:b,y:h},F={x:E,y:h},A={x:k,y:j},u=o.left+(o.width/2),r=o.top+(o.height/2),x={x:u,y:r},c=new f(A,x),g=0,C=0,e,B,t,q,z,w;y.setVisibility(false);y.show();e=y.getSize();B=e.width;t=e.height;if(c.intersects(new f(p,m))){z=Math.min(Math.max(u,b+B),E-(B));w=v;C=t+10;q="top"}else{if(c.intersects(new f(p,D))){z=b;w=Math.min(Math.max(r+(B/2),B*1.6),h-(B/2.2));g=t+10;q="left"}else{if(c.intersects(new f(D,F))){z=Math.min(Math.max(u,b+B),E-B);w=h;C=-t-10;q="bottom"}else{if(c.intersects(new f(m,F))){z=E;w=Math.max(Math.min(r-t,h-B*1.3),B/2);g=-t-10;q="right"}}}}if(z||w){this.currentTipPosition=q;y.addCls("x-anchor-"+q);y.setLeft(z-b);y.setTop(w-v);y.setVisibility(true);this.setLeft(this.getLeft()+g);this.setTop(this.getTop()+C)}}});Ext.define("Ext.Button",{extend:Ext.Component,xtype:"button",cachedConfig:{pressedCls:Ext.baseCSSPrefix+"button-pressing",badgeCls:Ext.baseCSSPrefix+"badge",hasBadgeCls:Ext.baseCSSPrefix+"hasbadge",labelCls:Ext.baseCSSPrefix+"button-label",iconCls:null},config:{badgeText:null,text:null,icon:false,iconAlign:"left",pressedDelay:0,handler:null,scope:null,autoEvent:null,ui:"normal",baseCls:Ext.baseCSSPrefix+"button"},template:[{tag:"span",reference:"badgeElement",hidden:true},{tag:"span",className:Ext.baseCSSPrefix+"button-icon",reference:"iconElement"},{tag:"span",reference:"textElement",hidden:true}],initialize:function(){this.callParent();this.element.on({scope:this,tap:"onTap",touchstart:"onPress",touchend:"onRelease"})},updateBadgeText:function(c){var a=this.element,b=this.badgeElement;if(c){b.show();b.setText(c)}else{b.hide()}a[(c)?"addCls":"removeCls"](this.getHasBadgeCls())},updateText:function(b){var a=this.textElement;if(a){if(b){a.show();a.setHtml(b)}else{a.hide()}this.refreshIconAlign()}},updateHtml:function(b){var a=this.textElement;if(b){a.show();a.setHtml(b)}else{a.hide()}},updateBadgeCls:function(b,a){this.badgeElement.replaceCls(a,b)},updateHasBadgeCls:function(b,c){var a=this.element;if(a.hasCls(c)){a.replaceCls(c,b)}},updateLabelCls:function(b,a){this.textElement.replaceCls(a,b)},updatePressedCls:function(b,c){var a=this.element;if(a.hasCls(c)){a.replaceCls(c,b)}},updateIcon:function(b){var c=this,a=c.iconElement;if(b){c.showIconElement();a.setStyle("background-image","url("+b+")");c.refreshIconAlign()}else{a.setStyle("background-image","");c.hideIconElement()}},updateIconCls:function(c,a){var d=this,b=d.iconElement;if(c){d.showIconElement();b.replaceCls(a,c);d.refreshIconAlign()}else{b.removeCls(a);d.hideIconElement()}},updateIconAlign:function(d,c){var b=this.element,a=Ext.baseCSSPrefix+"iconalign-";if(!this.getText()){d="center"}b.removeCls(a+"center");b.removeCls(a+c);if(this.getIcon()||this.getIconCls()){b.addCls(a+d)}},refreshIconAlign:function(){this.updateIconAlign(this.getIconAlign())},applyAutoEvent:function(b){var a=this;if(typeof b=="string"){b={name:b,scope:a.scope||a}}return b},updateAutoEvent:function(c){var a=c.name,b=c.scope;this.setHandler(function(){b.fireEvent(a,b,this)});this.setScope(b)},hideIconElement:function(){this.iconElement.removeCls(Ext.baseCSSPrefix+"shown");this.iconElement.addCls(Ext.baseCSSPrefix+"hidden")},showIconElement:function(){this.iconElement.removeCls(Ext.baseCSSPrefix+"hidden");this.iconElement.addCls(Ext.baseCSSPrefix+"shown")},applyUi:function(a){if(a&&Ext.isString(a)){var b=a.split("-");if(b&&(b[1]=="back"||b[1]=="forward")){return b}}return a},getUi:function(){var a=this._ui;if(Ext.isArray(a)){return a.join("-")}return a},applyPressedDelay:function(a){if(Ext.isNumber(a)){return a}return(a)?100:0},onPress:function(){var c=this,a=c.element,d=c.getPressedDelay(),b=c.getPressedCls();if(!c.getDisabled()){if(d>0){c.pressedTimeout=setTimeout(function(){delete c.pressedTimeout;if(a){a.addCls(b)}},d)}else{a.addCls(b)}}},onRelease:function(a){this.fireAction("release",[this,a],"doRelease")},doRelease:function(a,b){if(!a.getDisabled()){if(a.hasOwnProperty("pressedTimeout")){clearTimeout(a.pressedTimeout);delete a.pressedTimeout}else{a.element.removeCls(a.getPressedCls())}}},onTap:function(a){if(this.getDisabled()){return false}this.fireAction("tap",[this,a],"doTap")},doTap:function(c,d){var b=c.getHandler(),a=c.getScope()||c;if(!b){return}if(typeof b=="string"){b=a[b]}if(d&&d.preventDefault){d.preventDefault()}b.apply(a,arguments)}},function(){});Ext.define("Ext.Sheet",{extend:Ext.Panel,xtype:"sheet",config:{baseCls:Ext.baseCSSPrefix+"sheet",modal:true,centered:true,stretchX:null,stretchY:null,enter:"bottom",exit:"bottom",showAnimation:!Ext.browser.is.AndroidStock2?{type:"slideIn",duration:250,easing:"ease-out"}:null,hideAnimation:!Ext.browser.is.AndroidStock2?{type:"slideOut",duration:250,easing:"ease-in"}:null},isInputRegex:/^(input|textarea|select|a)$/i,beforeInitialize:function(){var a=this;Ext.os.is.iOS&&this.element.dom.addEventListener("touchstart",function(b){if(!a.isInputRegex.test(b.target.tagName)){b.preventDefault()}},true)},platformConfig:[{theme:["Windows"],enter:"top",exit:"top"}],applyHideAnimation:function(b){var a=this.getExit(),d=a;if(a===null){return null}if(b===true){b={type:"slideOut"}}if(Ext.isString(b)){b={type:b}}var c=Ext.factory(b,Ext.fx.Animation);if(c){if(a=="bottom"){d="down"}if(a=="top"){d="up"}c.setDirection(d)}return c},applyShowAnimation:function(a){var d=this.getEnter(),c=d;if(d===null){return null}if(a===true){a={type:"slideIn"}}if(Ext.isString(a)){a={type:a}}var b=Ext.factory(a,Ext.fx.Animation);if(b){if(d=="bottom"){c="down"}if(d=="top"){c="up"}b.setBefore({display:null});b.setReverse(true);b.setDirection(c)}return b},updateStretchX:function(a){this.getLeft();this.getRight();if(a){this.setLeft(0);this.setRight(0)}},updateStretchY:function(a){this.getTop();this.getBottom();if(a){this.setTop(0);this.setBottom(0)}}});Ext.define("Ext.ActionSheet",{extend:Ext.Sheet,alias:"widget.actionsheet",config:{baseCls:Ext.baseCSSPrefix+"sheet-action",left:0,right:0,bottom:0,centered:false,height:"auto",defaultType:"button"},platformConfig:[{theme:["Windows"],top:0,bottom:null}]});Ext.define("Ext.data.Connection",{mixins:{observable:Ext.mixin.Observable},statics:{requestId:0},config:{url:null,async:true,method:null,username:"",password:"",disableCaching:true,disableCachingParam:"_dc",timeout:30000,extraParams:null,defaultHeaders:null,useDefaultHeader:true,defaultPostHeader:"application/x-www-form-urlencoded; charset=UTF-8",useDefaultXhrHeader:true,defaultXhrHeader:"XMLHttpRequest",autoAbort:false},textAreaRe:/textarea/i,multiPartRe:/multipart\/form-data/i,lineBreakRe:/\r\n/g,constructor:function(a){this.initConfig(a);this.requests={}},request:function(k){k=k||{};var f=this,j=k.scope||window,e=k.username||f.getUsername(),h=k.password||f.getPassword()||"",g=k.xhr2===true&&Ext.feature.has.XHR2,b,c,d,a,i;if(!Ext.isEmpty(e)&&!Ext.isEmpty(h,true)&&Ext.isEmpty(k.withCredentials)){k.withCredentials=true}if(f.fireEvent("beforerequest",f,k)!==false){c=f.setOptions(k,j);if(this.isFormUpload(k)===true){this.upload(k.form,c.url,c.data,k);return null}if(k.autoAbort===true||f.getAutoAbort()){f.abort()}i=this.getXhrInstance();b=k.async!==false?(k.async||f.getAsync()):false;if(e){i.open(c.method,c.url,b,e,h)}else{i.open(c.method,c.url,b)}a=f.setupHeaders(i,k,c.data,c.params);d={id:++Ext.data.Connection.requestId,xhr:i,headers:a,options:k,async:b,timeout:setTimeout(function(){d.timedout=true;f.abort(d)},k.timeout||f.getTimeout())};f.requests[d.id]=d;if(b){i[g?"onload":"onreadystatechange"]=Ext.Function.bind(f.onStateChange,f,[d])}if(g){i.onerror=Ext.Function.bind(f.onStateChange,f,[d])}if(k.progress){i.onprogress=function(l){if(k.progress.isProgressable){if(l.total===0&&k.progress.getDynamic()){Ext.Logger.warn("Server is not configured to properly return Content-Length. Dynamic progress will be disabled");k.progress.setState.call(k.progress,"download");k.progress.setDynamic(false);i.onprogress=null;return}Ext.callback(k.progress.updateProgress,k.progress,[(l.loaded/l.total),"download"]);if(l.total>0&&!k.progress.getDynamic()&&k.progress.getInitialConfig().dynamic){k.progress.setDynamic(true)}}else{if(Ext.isFunction(k.progress)){Ext.callback(k.progress,k.progressScope||d,[l,"download"])}}};if(Ext.feature.has.XHRUploadProgress){i.upload.onprogress=function(l){f.fireEvent("requestuploadprogress",f,d,l);if(k.progress.isProgressable){Ext.callback(k.progress.updateProgress,k.progress,[(l.loaded/l.total),"upload"])}else{if(Ext.isFunction(k.progress)){Ext.callback(k.progress,k.progressScope||d,[l,"upload"])}}}}if(k.progress.isProgressable){if(!Ext.feature.has.XHRUploadProgress){k.progress.setDynamic(false)}Ext.callback(k.progress.startProgress,k.progress)}}i.send(c.data);if(!b){return this.onComplete(d)}return d}else{Ext.callback(k.callback,k.scope,[k,undefined,undefined]);return null}},upload:function(e,c,i,l){e=Ext.getDom(e);l=l||{};var d=Ext.id(),k=this,h=document.createElement("iframe"),j=[],g="multipart/form-data",f={target:e.target,method:e.method,encoding:e.encoding,enctype:e.enctype,action:e.action},b=function(m,n){a=document.createElement("input");Ext.fly(a).set({type:"hidden",value:n,name:m});e.appendChild(a);j.push(a)},a;Ext.fly(h).set({id:d,name:d,cls:Ext.baseCSSPrefix+"hide-display",src:Ext.SSL_SECURE_URL});document.body.appendChild(h);if(document.frames){document.frames[d].name=d}Ext.fly(e).set({target:d,method:"POST",enctype:g,encoding:g,action:c||f.action});if(i){Ext.iterate(Ext.Object.fromQueryString(i),function(m,n){if(Ext.isArray(n)){Ext.each(n,function(o){b(m,o)})}else{b(m,n)}})}h.addEventListener("load",function(){Ext.callback(k.onUploadComplete,k,[h,l,d]);h.removeEventListener("load",arguments.callee)});e.submit();Ext.fly(e).set(f);Ext.each(j,function(m){Ext.removeNode(m)})},onUploadComplete:function(h,c,i){var b={responseText:"",responseXML:null,request:{options:c}},g,a,f;try{g=(h.contentWindow&&h.contentWindow.document)||h.contentDocument||window.frames[i].document;if(g){if(g.hasOwnProperty("body")&&g.body){a=g.body}if(a){f=a.firstChild||{};if(this.textAreaRe.test(f.tagName)){b.responseText=f.value}else{b.responseText=f.innerHTML}b.responseXML=a.XMLDocument}}}catch(d){b.success=false;b.message="Cross-Domain access is not permitted between frames. XHR2 is recommended for this type of request.";b.error=d}this.onAfterUploadComplete(b,h,c)},onAfterUploadComplete:function(a,d,b){var c=this;c.fireEvent("requestcomplete",c,a,b);Ext.callback(b.callback,b.scope,[b,true,a]);setTimeout(function(){Ext.removeNode(d)},100)},isFormUpload:function(a){var b=this.getForm(a);if(b){return(a.isUpload||(this.multiPartRe).test(b.getAttribute("enctype")))}return false},getForm:function(a){return Ext.getDom(a.form)||null},setOptions:function(k,j){var h=this,e=k.params||{},g=h.getExtraParams(),d=k.urlParams,c=k.url||h.getUrl(),i=k.jsonData,b,a,f;if(Ext.isFunction(e)){e=e.call(j,k)}if(Ext.isFunction(c)){c=c.call(j,k)}c=this.setupUrl(k,c);f=k.data||k.rawData||k.binaryData||k.xmlData||i||null;if(i&&!Ext.isPrimitive(i)){f=Ext.encode(f)}if(k.binaryData){if(f instanceof Array){f=(new Uint8Array(k.binaryData))}if(f instanceof Uint8Array){f=f.buffer}}if(Ext.isObject(e)){e=Ext.Object.toQueryString(e)}if(Ext.isObject(g)){g=Ext.Object.toQueryString(g)}e=e+((g)?((e)?"&":"")+g:"");d=Ext.isObject(d)?Ext.Object.toQueryString(d):d;e=this.setupParams(k,e);b=(k.method||h.getMethod()||((e||f)?"POST":"GET")).toUpperCase();this.setupMethod(k,b);a=k.disableCaching!==false?(k.disableCaching||h.getDisableCaching()):false;if(a){c=Ext.urlAppend(c,(k.disableCachingParam||h.getDisableCachingParam())+"="+(new Date().getTime()))}if((b=="GET"||f)&&e){c=Ext.urlAppend(c,e);e=null}if(d){c=Ext.urlAppend(c,d)}return{url:c,method:b,data:f||e||null}},setupUrl:function(b,a){var c=this.getForm(b);if(c){a=a||c.action}return a},setupParams:function(a,d){var c=this.getForm(a),b;if(c&&!this.isFormUpload(a)){b=Ext.Element.serializeForm(c);d=d?(d+"&"+b):b}return d},setupMethod:function(a,b){if(this.isFormUpload(a)){return"POST"}return b},setupHeaders:function(l,m,d,c){var h=this,b=Ext.apply({},m.headers||{},h.getDefaultHeaders()||{}),k=h.getDefaultPostHeader(),i=m.jsonData,a=m.xmlData,j,f;if(!b["Content-Type"]&&(d||c)){if(d){if(m.rawData){k="text/plain"}else{if(a&&Ext.isDefined(a)){k="text/xml"}else{if(i&&Ext.isDefined(i)){k="application/json"}}}}if(!(Ext.feature.has.XHR2&&d instanceof FormData)){b["Content-Type"]=k}}if(((h.getUseDefaultXhrHeader()&&m.useDefaultXhrHeader!==false)||m.useDefaultXhrHeader)&&!b["X-Requested-With"]){b["X-Requested-With"]=h.getDefaultXhrHeader()}if(!Ext.isEmpty(m.username)&&!Ext.isEmpty(m.password)){b.Authorization="Basic "+btoa(m.username+":"+m.password)}try{for(j in b){if(b.hasOwnProperty(j)){f=b[j];l.setRequestHeader(j,f)}}}catch(g){h.fireEvent("exception",j,f)}if(m.responseType){try{l.responseType=m.responseType==="blob"&&Ext.browser.is.Safari?"arraybuffer":m.responseType}catch(g){}}if(m.withCredentials){l.withCredentials=m.withCredentials}return b},getXhrInstance:(function(){var b=[function(){return new XMLHttpRequest()},function(){return new ActiveXObject("MSXML2.XMLHTTP.3.0")},function(){return new ActiveXObject("MSXML2.XMLHTTP")},function(){return new ActiveXObject("Microsoft.XMLHTTP")}],c=0,a=b.length,f;for(;c=200&&a<300)||a==304||(a==0&&d.responseText&&d.responseText.length>0),b=false;if(!c){switch(a){case 12002:case 12029:case 12030:case 12031:case 12152:case 13030:b=true;break}}return{success:c,isException:b}},createResponse:function(d){var j=d.xhr,a={},k,f,l,g,i,b,e=j.responseType==="blob"||j.responseType==="arraybuffer",h=j.responseType==="text",c=j.responseType==="document";if(d.timedout||d.aborted){d.success=false;k=[]}else{k=j.getAllResponseHeaders().replace(this.lineBreakRe,"\n").split("\n")}f=k.length;while(f--){l=k[f];g=l.indexOf(":");if(g>=0){i=l.substr(0,g).toLowerCase();if(l.charAt(g+1)==" "){++g}a[i]=l.substr(g+1)}}d.xhr=null;delete d.xhr;b={request:d,requestId:d.id,status:j.status,statusText:j.statusText,getResponseHeader:function(m){return a[m.toLowerCase()]},getAllResponseHeaders:function(){return a},responseText:e?null:c?null:j.responseText,responseXML:e?null:h?null:j.responseXML,responseBytes:e?j.response:null};if(d.options.responseType==="blob"&&j.responseType==="arraybuffer"){b.responseBytes=new Blob([b.responseBytes],{type:j.getResponseHeader("Content-Type")})}j=null;return b},createException:function(a){return{request:a,requestId:a.id,status:a.aborted?-1:0,statusText:a.aborted?"transaction aborted":"communication failure",aborted:a.aborted,timedout:a.timedout}}});Ext.define("Ext.Ajax",{extend:Ext.data.Connection,singleton:true,autoAbort:false});Ext.define("Ext.Anim",{isAnim:true,disableAnimations:false,defaultConfig:{from:{},to:{},duration:250,delay:0,easing:"ease-in-out",autoClear:true,out:true,direction:null,reverse:false},opposites:{left:"right",right:"left",up:"down",down:"up"},constructor:function(a){a=Ext.apply({},a||{},this.defaultConfig);this.config=a;this.callSuper([a]);this.running=[]},initConfig:function(c,b){var d=this,a=Ext.apply({},b||{},d.config);a.el=c=Ext.get(c);if(a.reverse&&d.opposites[a.direction]){a.direction=d.opposites[a.direction]}if(d.config.before){d.config.before.call(a,c,a)}if(b.before){b.before.call(a.scope||a,c,a)}return a},run:function(c,a){c=Ext.get(c);a=a||{};var d=this,b=c.dom.style,e,f=a.after;if(d.running[c.id]){d.onTransitionEnd(null,c,{config:a,after:f})}a=this.initConfig(c,a);if(this.disableAnimations){for(e in a.to){if(!a.to.hasOwnProperty(e)){continue}b[e]=a.to[e]}this.onTransitionEnd(null,c,{config:a,after:f});return d}c.un("transitionend",d.onTransitionEnd,d);b.webkitTransitionDuration="0ms";for(e in a.from){if(!a.from.hasOwnProperty(e)){continue}b[e]=a.from[e]}setTimeout(function(){if(!c.dom){return}if(a.is3d===true){c.parent().setStyle({"-webkit-perspective":"1200","-webkit-transform-style":"preserve-3d"})}b.webkitTransitionDuration=a.duration+"ms";b.webkitTransitionProperty="all";b.webkitTransitionTimingFunction=a.easing;c.on("transitionend",d.onTransitionEnd,d,{single:true,config:a,after:f});for(e in a.to){if(!a.to.hasOwnProperty(e)){continue}b[e]=a.to[e]}},a.delay||5);d.running[c.id]=a;return d},onTransitionEnd:function(e,c,g){c=Ext.get(c);if(this.running[c.id]===undefined){return}var b=c.dom.style,a=g.config,d=this,f;if(a.autoClear){for(f in a.to){if(!a.to.hasOwnProperty(f)||a[f]===false){continue}b[f]=""}}b.webkitTransitionDuration=null;b.webkitTransitionProperty=null;b.webkitTransitionTimingFunction=null;if(a.is3d){c.parent().setStyle({"-webkit-perspective":"","-webkit-transform-style":""})}if(d.config.after){d.config.after.call(a,c,a)}if(g.after){g.after.call(a.scope||d,c,a)}delete d.running[c.id]}},function(){Ext.Anim.seed=1000;Ext.Anim.run=function(b,c,a){if(b.isComponent){b=b.element}else{b=Ext.get(b)}a=a||{};if(c.isAnim){c.run(b,a)}else{if(Ext.isObject(c)){if(a.before&&c.before){a.before=Ext.createInterceptor(a.before,c.before,c.scope)}if(a.after&&c.after){a.after=Ext.createInterceptor(a.after,c.after,c.scope)}a=Ext.apply({},a,c);c=c.type}if(!Ext.anims[c]){throw c+" is not a valid animation type."}else{if(b&&b.dom){Ext.anims[c].run(b,a)}}}};Ext.anims={fade:new Ext.Anim({type:"fade",before:function(b){var c=1,a=1,e=b.getStyle("z-index")=="auto"?0:b.getStyle("z-index"),d=e;if(this.out){a=0}else{d=Math.abs(e)+1;c=0}this.from={opacity:c,"z-index":d};this.to={opacity:a,"z-index":d}}}),slide:new Ext.Anim({direction:"left",cover:false,reveal:false,opacity:false,"z-index":false,before:function(a){var c=a.getStyle("z-index")=="auto"?0:a.getStyle("z-index"),f=a.getStyle("opacity"),h=c+1,d=this.out,l=this.direction,k=0,i=0,j=0,g=0,b=a.getHeight(),e=a.getWidth();if(l=="left"||l=="right"){if(d){k=-e}else{j=e}}else{if(l=="up"||l=="down"){if(d){i=-b}else{g=b}}}if(l=="right"||l=="down"){i*=-1;k*=-1;g*=-1;j*=-1}if(this.cover&&d){k=0;i=0;h=c}else{if(this.reveal&&!d){j=0;g=0;h=c}}this.from={"-webkit-transform":"translate3d("+j+"px, "+g+"px, 0)","z-index":h,opacity:f-0.01};this.to={"-webkit-transform":"translate3d("+k+"px, "+i+"px, 0)","z-index":h,opacity:f}}}),pop:new Ext.Anim({scaleOnExit:true,before:function(d){var b=1,c=1,g=1,a=1,h=d.getStyle("z-index")=="auto"?0:d.getStyle("z-index"),f=h,e=h;if(!this.out){b=0.01;f=h+1;e=h+1;g=0}else{if(this.scaleOnExit){c=0.01;a=0}else{a=0.8}}this.from={"-webkit-transform":"scale("+b+")","-webkit-transform-origin":"50% 50%",opacity:g,"z-index":f};this.to={"-webkit-transform":"scale("+c+")","-webkit-transform-origin":"50% 50%",opacity:a,"z-index":e}}}),flip:new Ext.Anim({is3d:true,direction:"left",before:function(c){var f="Y",a=1,b=1,e=0,d=0;if(this.out){d=-180;b=0.8}else{e=180;a=0.8}if(this.direction=="up"||this.direction=="down"){f="X"}if(this.direction=="right"||this.direction=="left"){d*=-1;e*=-1}this.from={"-webkit-transform":"rotate"+f+"("+e+"deg) scale("+a+")","-webkit-backface-visibility":"hidden"};this.to={"-webkit-transform":"rotate"+f+"("+d+"deg) scale("+b+")","-webkit-backface-visibility":"hidden"}}}),cube:new Ext.Anim({is3d:true,direction:"left",style:"outer",before:function(b){var k="0% 0%",l=0,a=0,i="Y",f=0,g=0,e=b.getWidth(),d=b.getHeight(),j=true,c=" translateX(0)",h="";if(this.direction=="left"||this.direction=="right"){if(this.out){k="100% 100%";g=e;a=-90}else{k="0% 0%";f=e;l=90}}else{if(this.direction=="up"||this.direction=="down"){i="X";if(this.out){k="100% 100%";g=d;a=90}else{k="0% 0%";f=d;l=-90}}}if(this.direction=="down"||this.direction=="right"){l*=-1;a*=-1;k=(k=="0% 0%")?"100% 100%":"0% 0%"}if(this.style=="inner"){f*=-1;g*=-1;l*=-1;a*=-1;if(!this.out){h=" translateX(0px)";k="0% 50%"}else{h=c;k="100% 50%"}}this.from={"-webkit-transform":"rotate"+i+"("+l+"deg)"+(j?" translateZ("+f+"px)":"")+c,"-webkit-transform-origin":k};this.to={"-webkit-transform":"rotate"+i+"("+a+"deg) translateZ("+g+"px)"+h,"-webkit-transform-origin":k}},duration:250}),wipe:new Ext.Anim({before:function(b){var d=b.getStyle("z-index"),c,a="";if(!this.out){c=d+1;a="-webkit-gradient(linear, left bottom, right bottom, from(transparent), to(#000), color-stop(66%, #000), color-stop(33%, transparent))";this.from={"-webkit-mask-image":a,"-webkit-mask-size":b.getWidth()*3+"px "+b.getHeight()+"px","z-index":c,"-webkit-mask-position-x":0};this.to={"-webkit-mask-image":a,"-webkit-mask-size":b.getWidth()*3+"px "+b.getHeight()+"px","z-index":c,"-webkit-mask-position-x":-b.getWidth()*2+"px"}}},duration:500})}});Ext.define("Ext.Media",{extend:Ext.Component,xtype:"media",config:{url:"",enableControls:Ext.os.is.Android?false:true,autoResume:false,autoPause:true,preload:true,loop:false,media:null,volume:1,muted:false},constructor:function(){this.mediaEvents={};this.callSuper(arguments)},initialize:function(){var a=this;a.callParent();a.on({scope:a,activate:a.onActivate,deactivate:a.onDeactivate});a.addMediaListener({canplay:"onCanPlay",play:"onPlay",pause:"onPause",ended:"onEnd",volumechange:"onVolumeChange",timeupdate:"onTimeUpdate"})},addMediaListener:function(c,a){var b=this,d=b.media.dom,e=Ext.Function.bind;Ext.Object.each(c,function(g,f){f=e(b[f],b);b.mediaEvents[g]=f;d.addEventListener(g,f)})},onPlay:function(){this.fireEvent("play",this)},onCanPlay:function(){this.fireEvent("canplay",this)},onPause:function(){this.fireEvent("pause",this,this.getCurrentTime())},onEnd:function(){this.fireEvent("ended",this,this.getCurrentTime())},onVolumeChange:function(){this.fireEvent("volumechange",this,this.media.dom.volume)},onTimeUpdate:function(){this.fireEvent("timeupdate",this,this.getCurrentTime())},isPlaying:function(){return !Boolean(this.media.dom.paused)},onActivate:function(){var a=this;if(a.getAutoResume()&&!a.isPlaying()){a.play()}},onDeactivate:function(){var a=this;if(a.getAutoPause()&&a.isPlaying()){a.pause()}},updateUrl:function(a){var b=this.media.dom;b.src=a;if("load" in b){b.load()}if(this.isPlaying()){this.play()}},updateEnableControls:function(a){this.media.dom.controls=a?"controls":false},updateLoop:function(a){this.media.dom.loop=a?"loop":false},play:function(){var a=this.media.dom;if("play" in a){a.play();setTimeout(function(){a.play()},10)}},pause:function(){var a=this.media.dom;if("pause" in a){a.pause()}},toggle:function(){if(this.isPlaying()){this.pause()}else{this.play()}},stop:function(){var a=this;a.setCurrentTime(0);a.fireEvent("stop",a);a.pause()},updateVolume:function(a){this.media.dom.volume=a},updateMuted:function(a){this.fireEvent("mutedchange",this,a);this.media.dom.muted=a},getCurrentTime:function(){return this.media.dom.currentTime},setCurrentTime:function(a){this.media.dom.currentTime=a;return a},getDuration:function(){return this.media.dom.duration},destroy:function(){var a=this,c=a.media.dom,b=a.mediaEvents;Ext.Object.each(b,function(e,d){c.removeEventListener(e,d)});this.callSuper()}});Ext.define("Ext.Audio",{extend:Ext.Media,xtype:"audio",config:{cls:Ext.baseCSSPrefix+"audio"},onActivate:function(){var a=this;a.callParent();if(Ext.os.is.Phone){a.element.show()}},onDeactivate:function(){var a=this;a.callParent();if(Ext.os.is.Phone){a.element.hide()}},template:[{reference:"media",preload:"auto",tag:"audio",cls:Ext.baseCSSPrefix+"component"}]});Ext.define("Ext.util.Geolocation",{extend:Ext.Evented,alternateClassName:["Ext.util.GeoLocation"],config:{autoUpdate:true,frequency:10000,latitude:null,longitude:null,accuracy:null,altitude:null,altitudeAccuracy:null,heading:null,speed:null,timestamp:null,allowHighAccuracy:false,timeout:Infinity,maximumAge:0,provider:undefined},updateMaximumAge:function(){if(this.watchOperation){this.updateWatchOperation()}},updateTimeout:function(){if(this.watchOperation){this.updateWatchOperation()}},updateAllowHighAccuracy:function(){if(this.watchOperation){this.updateWatchOperation()}},applyProvider:function(a){if(Ext.feature.has.Geolocation){if(!a){if(navigator&&navigator.geolocation){a=navigator.geolocation}else{if(window.google){a=google.gears.factory.create("beta.geolocation")}}}}else{this.fireEvent("locationerror",this,false,false,true,"This device does not support Geolocation.")}return a},updateAutoUpdate:function(a,b){var c=this,f=c.getProvider();if(b&&f){clearInterval(c.watchOperationId);c.watchOperationId=null}if(a){if(!f){c.fireEvent("locationerror",c,false,false,true,null);return}try{c.updateWatchOperation()}catch(d){c.fireEvent("locationerror",c,false,false,true,d.message)}}},updateWatchOperation:function(){var a=this,b=a.getProvider();if(a.watchOperationId){clearInterval(a.watchOperationId)}function c(){b.getCurrentPosition(Ext.bind(a.fireUpdate,a),Ext.bind(a.fireError,a),a.parseOptions())}c();a.watchOperationId=setInterval(c,this.getFrequency())},updateLocation:function(h,a,c){var b=this,g=b.getProvider();var f=function(i,e){if(e){b.fireError(e)}else{b.fireEvent("locationerror",b,false,false,true,i)}if(h){h.call(a||b,null,b)}};if(!g){f(null);return}try{g.getCurrentPosition(function(e){b.fireUpdate(e);if(h){h.call(a||b,b,b)}},function(e){f(null,e)},c||b.parseOptions())}catch(d){f(d.message)}},fireUpdate:function(a){var b=this,c=a.coords;this.position=a;b.setConfig({timestamp:a.timestamp,latitude:c.latitude,longitude:c.longitude,accuracy:c.accuracy,altitude:c.altitude,altitudeAccuracy:c.altitudeAccuracy,heading:c.heading,speed:c.speed});b.fireEvent("locationupdate",b)},fireError:function(a){var b=a.code;this.fireEvent("locationerror",this,b==a.TIMEOUT,b==a.PERMISSION_DENIED,b==a.POSITION_UNAVAILABLE,a.message==undefined?null:a.message)},parseOptions:function(){var b=this.getTimeout(),a={maximumAge:this.getMaximumAge(),enableHighAccuracy:this.getAllowHighAccuracy()};if(b!==Infinity){a.timeout=b}return a},destroy:function(){this.setAutoUpdate(false)}});Ext.define("Ext.Map",{extend:Ext.Container,xtype:"map",isMap:true,config:{baseCls:Ext.baseCSSPrefix+"map",useCurrentLocation:false,map:null,geo:null,mapOptions:{},mapListeners:null},constructor:function(){this.callParent(arguments);if(!(window.google||{}).maps){this.setHtml("Google Maps API is required")}},initialize:function(){this.callParent();this.initMap();this.on({painted:"doResize",scope:this});this.innerElement.on("touchstart","onTouchStart",this)},initMap:function(){var f=this.getMap();if(!f){var e=(window.google||{}).maps;if(!e){return null}var b=this.mapContainer,a=this.getMapOptions(),d=e.event,c=this;if(b.dom.firstChild){Ext.fly(b.dom.firstChild).destroy()}if(Ext.os.is.iPad){Ext.merge({navigationControlOptions:{style:e.NavigationControlStyle.ZOOM_PAN}},a)}a.mapTypeId=a.mapTypeId||e.MapTypeId.ROADMAP;a.center=a.center||new e.LatLng(37.381592,-122.135672);if(a.center&&a.center.latitude&&!Ext.isFunction(a.center.lat)){a.center=new e.LatLng(a.center.latitude,a.center.longitude)}a.zoom=a.zoom||12;f=new e.Map(b.dom,a);this.setMap(f);d.addListener(f,"zoom_changed",Ext.bind(c.onZoomChange,c));d.addListener(f,"maptypeid_changed",Ext.bind(c.onTypeChange,c));d.addListener(f,"center_changed",Ext.bind(c.onCenterChange,c));d.addListenerOnce(f,"tilesloaded",Ext.bind(c.onTilesLoaded,c));this.addMapListeners()}return this.getMap()},renderMap:function(){this.initMap()},getElementConfig:function(){return{reference:"element",className:"x-container",children:[{reference:"innerElement",className:"x-inner",children:[{reference:"mapContainer",className:Ext.baseCSSPrefix+"map-container"}]}]}},onTouchStart:function(a){a.makeUnpreventable()},applyMapOptions:function(a){return Ext.merge({},this.options,a)},updateMapOptions:function(c){var b=(window.google||{}).maps,a=this.getMap();if(b&&a){a.setOptions(c)}},doMapCenter:function(){this.setMapCenter(this.getMapOptions().center)},getMapOptions:function(){return Ext.merge({},this.options||this.getInitialConfig("mapOptions"))},updateUseCurrentLocation:function(a){this.setGeo(a);if(!a){this.setMapCenter()}},applyGeo:function(a){return Ext.factory(a,Ext.util.Geolocation,this.getGeo())},updateGeo:function(b,a){var c={locationupdate:"onGeoUpdate",locationerror:"onGeoError",scope:this};if(a){a.un(c)}if(b){b.on(c);b.updateLocation()}},doResize:function(){var b=(window.google||{}).maps,a=this.getMap();if(b&&a){b.event.trigger(a,"resize")}},onTilesLoaded:function(){this.fireEvent("maprender",this,this.getMap())},addMapListeners:function(){var e=(window.google||{}).maps,a=this.getMap(),j=this.getMapListeners();if(e){var b=e.event,h=this,d,k,i,g,f;if(Ext.isSimpleObject(j)){for(var c in j){d=j[c];if(Ext.isSimpleObject(d)){k=d.scope;i=d.fn}else{if(Ext.isFunction(d)){k=null;i=d}}if(i){g=function(){this.fn.apply(this.scope,[h]);if(this.handle){b.removeListener(this.handle);delete this.handle;delete this.fn;delete this.scope}};f=b.addListener(a,c,Ext.bind(g,g));g.fn=i;g.scope=k;if(d.single===true){g.handle=f}}}}}},onGeoUpdate:function(a){if(a){this.setMapCenter(new google.maps.LatLng(a.getLatitude(),a.getLongitude()))}},onGeoError:Ext.emptyFn,setMapCenter:function(e){var b=this,d=b.getMap(),a=b.getMapOptions(),c=(window.google||{}).maps;if(c){if(!e){if(d&&d.getCenter){e=d.getCenter()}else{if(a.hasOwnProperty("center")){e=a.center}else{e=new c.LatLng(37.381592,-122.135672)}}}if(e&&!(e instanceof c.LatLng)&&"longitude" in e){e=new c.LatLng(e.latitude,e.longitude)}if(!d){a.center=a.center||e;b.renderMap();d=b.getMap()}if(d&&e instanceof c.LatLng){d.panTo(e)}else{this.options=Ext.apply(this.getMapOptions(),{center:e})}}},onZoomChange:function(){var a=this.getMapOptions(),c=this.getMap(),b;b=(c&&c.getZoom)?c.getZoom():a.zoom||10;this.options=Ext.apply(a,{zoom:b});this.fireEvent("zoomchange",this,c,b)},onTypeChange:function(){var b=this.getMapOptions(),c=this.getMap(),a;a=(c&&c.getMapTypeId)?c.getMapTypeId():b.mapTypeId;this.options=Ext.apply(b,{mapTypeId:a});this.fireEvent("typechange",this,c,a)},onCenterChange:function(){var b=this.getMapOptions(),c=this.getMap(),a;a=(c&&c.getCenter)?c.getCenter():b.center;this.options=Ext.apply(b,{center:a});this.fireEvent("centerchange",this,c,a)},destroy:function(){Ext.destroy(this.getGeo());var a=this.getMap();if(a&&(window.google||{}).maps){google.maps.event.clearInstanceListeners(a)}this.callParent()}},function(){});Ext.define("Ext.BingMap",{extend:Ext.Map,xtype:"bingmap",initMap:function(){var f=this.getMap();if(!f){var e=this,c=e.mapContainer,a=e.getMapOptions(),d;var g=Microsoft.Maps;var b="AokX-S2lieXTaXG8pvEw3i2AKYuStBMK8RsUu6BDJ6hrL5AYv0IfQqM9zc-BAA-v";a=Ext.merge({credentials:b,mapTypeId:"r",zoom:12},a);if(!a.center){a.center=new g.Location(37.381592,-122.135672)}if(c.dom.firstChild){Ext.fly(c.dom.firstChild).destroy()}g.loadModule("Microsoft.Maps.Overlays.Style",{callback:function(){e.setMap(new g.Map(c.dom,a));if(a.callback){a.callback()}}});f=e.getMap()}e.fireEvent("maprender",e,f)},setMapCenter:function(c){var a=this,b=a.getMap(),d=Microsoft.Maps;if(!a.isPainted()){a.un("painted","setMapCenter",this);a.on("painted","setMapCenter",this,{delay:150,single:true,args:[c]});return}c=c||new d.Location(37.381592,-122.135672);if(c&&!(c instanceof d.Location)&&"longitude" in c){c=new d.Location(c.latitude,c.longitude)}if(!b){a.initMap();b=a.getMap()}if(b&&c instanceof d.Location){b.updateMapPosition(c)}else{this.options=Ext.apply(this.getMapOptions(),{center:c})}}},function(){});Ext.define("Ext.ComponentQuery",{singleton:true},function(){var g=this,j=["var r = [],","i = 0,","it = items,","l = it.length,","c;","for (; i < l; i++) {","c = it[i];","if (c.{0}) {","r.push(c);","}","}","return r;"].join(""),e=function(o,n){return n.method.apply(this,[o].concat(n.args))},a=function(p,t){var n=[],q=0,s=p.length,r,o=t!==">";for(;q\^])\s?|\s|$)/,c=/^(#)?([\w\-]+|\*)(?:\((true|false)\))?/,b=[{re:/^\.([\w\-]+)(?:\((true|false)\))?/,method:l},{re:/^(?:[\[](?:@)?([\w\-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]])/,method:m},{re:/^#([\w\-]+)/,method:d},{re:/^\:([\w\-]+)(?:\(((?:\{[^\}]+\})|(?:(?!\{)[^\s>\/]*?(?!\})))\))?/,method:k},{re:/^(?:\{([^\}]+)\})/,method:j}];g.Query=Ext.extend(Object,{constructor:function(n){n=n||{};Ext.apply(this,n)},execute:function(o){var q=this.operations,r=0,s=q.length,p,n;if(!o){n=Ext.ComponentManager.all.getArray()}else{if(Ext.isArray(o)){n=o}}for(;r1){for(q=0,r=s.length;q1){r=q.length;for(p=0;p=10){a.input.on({scope:a,keypress:"onKeyPress"})}},updateFastFocus:function(a){if(a){if(this.getFastFocus()&&Ext.os.is.iOS){this.input.on({scope:this,touchstart:"onTouchStart"})}}else{this.input.un({scope:this,touchstart:"onTouchStart"})}},useManualMaxLength:function(){return Boolean((Ext.os.is.Android&&!Ext.browser.is.Chrome))},applyUseMask:function(a){if(a==="auto"){a=Ext.os.is.iOS&&Ext.os.version.lt("5")}return Boolean(a)},updateUseMask:function(a){this.mask[a?"show":"hide"]()},updatePattern:function(a){this.updateFieldAttribute("pattern",a)},updateFieldAttribute:function(b,c){var a=this.input;if(!Ext.isEmpty(c,true)){a.dom.setAttribute(b,c)}else{a.dom.removeAttribute(b)}},updateCls:function(b,a){this.input.addCls(Ext.baseCSSPrefix+"input-el");this.input.replaceCls(a,b)},updateType:function(a,c){var b=Ext.baseCSSPrefix+"input-";this.input.replaceCls(b+c,b+a);this.updateFieldAttribute("type",a)},updateName:function(a){this.updateFieldAttribute("name",a)},getValue:function(){var a=this.input;if(a){this._value=a.dom.value}return this._value},applyValue:function(a){return(Ext.isEmpty(a))?"":a},updateValue:function(b){var a=this.input;if(a){a.dom.value=b}},setValue:function(b){var a=this._value;this.updateValue(this.applyValue(b));b=this.getValue();if(String(b)!=String(a)&&this.initialized){this.onChange(this,b,a)}return this},updateTabIndex:function(a){this.updateFieldAttribute("tabIndex",a)},testAutoFn:function(a){return[true,"on"].indexOf(a)!==-1},updateMaxLength:function(a){if(!this.useManualMaxLength()){this.updateFieldAttribute("maxlength",a)}},updatePlaceHolder:function(a){this.updateFieldAttribute("placeholder",a)},applyAutoComplete:function(a){return this.testAutoFn(a)},updateAutoComplete:function(a){var b=a?"on":"off";this.updateFieldAttribute("autocomplete",b)},applyAutoCapitalize:function(a){return this.testAutoFn(a)},updateAutoCapitalize:function(b){var a=b?"on":"off";this.updateFieldAttribute("autocapitalize",a)},applyAutoCorrect:function(a){return this.testAutoFn(a)},updateAutoCorrect:function(a){var b=a?"on":"off";this.updateFieldAttribute("autocorrect",b)},updateMinValue:function(a){this.updateFieldAttribute("min",a)},updateMaxValue:function(a){this.updateFieldAttribute("max",a)},updateStepValue:function(a){this.updateFieldAttribute("step",a)},checkedRe:/^(true|1|on)/i,getChecked:function(){var a=this.input,b;if(a){b=a.dom.checked;this._checked=b}return b},applyChecked:function(a){return !!this.checkedRe.test(String(a))},setChecked:function(a){this.updateChecked(this.applyChecked(a));this._checked=a},updateChecked:function(a){this.input.dom.checked=a},updateReadOnly:function(a){this.updateFieldAttribute("readonly",a?true:null)},updateMaxRows:function(a){this.updateFieldAttribute("rows",a)},doSetDisabled:function(a){this.callParent(arguments);if(Ext.browser.is.Safari&&!Ext.os.is.BlackBerry){this.input.dom.tabIndex=(a)?-1:0}this.input.dom.disabled=(Ext.browser.is.Safari&&!Ext.os.is.BlackBerry)?false:a;if(!a){this.blur()}},isDirty:function(){if(this.getDisabled()){return false}return String(this.getValue())!==String(this.originalValue)},reset:function(){this.setValue(this.originalValue)},onInputTap:function(a){this.fireAction("inputtap",[this,a],"doInputTap")},doInputTap:function(a,b){if(a.getDisabled()){return false}if(this.getFastFocus()&&Ext.os.is.iOS){a.focus()}},onMaskTap:function(a){this.fireAction("masktap",[this,a],"doMaskTap")},doMaskTap:function(a,b){if(a.getDisabled()){return false}a.focus()},showMask:function(){if(this.getUseMask()){this.mask.setStyle("display","block")}},hideMask:function(){if(this.getUseMask()){this.mask.setStyle("display","none")}},focus:function(){var b=this,a=b.input;if(a&&a.dom.focus){a.dom.focus()}return b},blur:function(){var b=this,a=this.input;if(a&&a.dom.blur){a.dom.blur()}return b},select:function(){var b=this,a=b.input;if(a&&a.dom.setSelectionRange){a.dom.setSelectionRange(0,9999)}return b},onFocus:function(a){this.fireAction("focus",[a],"doFocus")},doFocus:function(b){var a=this;a.hideMask();if(!a.getIsFocused()){a.setStartValue(a.getValue())}a.setIsFocused(true)},onTouchStart:function(a){if(document.activeElement!=a.target){a.preventDefault()}},onBlur:function(a){this.fireAction("blur",[a],"doBlur")},doBlur:function(d){var b=this,c=b.getValue(),a=b.getStartValue();b.showMask();b.setIsFocused(false);if(String(c)!=String(a)){b.onChange(b,c,a)}},onClearIconTap:function(a){this.fireEvent("clearicontap",this,a);if(Ext.os.is.Android){this.focus()}},onClearIconPress:function(){this.clearIcon.addCls(Ext.baseCSSPrefix+"pressing")},onClearIconRelease:function(){this.clearIcon.removeCls(Ext.baseCSSPrefix+"pressing")},onClick:function(a){this.fireEvent("click",a)},onChange:function(b,c,a){if(this.useManualMaxLength()){this.trimValueToMaxLength()}this.fireEvent("change",b,c,a)},onPaste:function(a){if(this.useManualMaxLength()){this.trimValueToMaxLength()}this.fireEvent("paste",a)},onKeyUp:function(a){if(this.useManualMaxLength()){this.trimValueToMaxLength()}this.fireEvent("keyup",a)},onKeyDown:function(){this.ignoreInput=true},onInput:function(b){var a=this;if(a.ignoreInput){a.ignoreInput=false;return}setTimeout(function(){if(!a.ignoreInput){a.fireEvent("keyup",b);a.ignoreInput=false}},10)},onKeyPress:function(a){if(a.browserEvent.keyCode==13){this.fireEvent("keyup",a)}},onMouseDown:function(a){this.fireEvent("mousedown",a)},trimValueToMaxLength:function(){var a=this.getMaxLength();if(a){var b=this.getValue();if(b.length>this.getMaxLength()){this.setValue(b.slice(0,a))}}}});Ext.define("Ext.field.Field",{extend:Ext.Decorator,alternateClassName:"Ext.form.Field",xtype:"field",isField:true,isFormField:true,config:{baseCls:Ext.baseCSSPrefix+"field",label:null,labelAlign:"left",labelWidth:"30%",labelWrap:false,clearIcon:null,required:false,inputType:null,name:null,value:null,tabIndex:null},platformConfig:[{theme:["Windows","MountainView","Blackberry","Blackberry103","Tizen"],labelAlign:"top"}],cachedConfig:{labelCls:null,requiredCls:Ext.baseCSSPrefix+"field-required",inputCls:null},getElementConfig:function(){var a=Ext.baseCSSPrefix;return{reference:"element",className:"x-container",children:[{reference:"label",cls:a+"form-label",children:[{reference:"labelspan",tag:"span"}]},{reference:"innerElement",cls:a+"component-outer"}]}},updateLabel:function(b,d){var a=this.renderElement,c=Ext.baseCSSPrefix;if(b){this.labelspan.setHtml(b);a.addCls(c+"field-labeled")}else{a.removeCls(c+"field-labeled")}},updateLabelAlign:function(b,c){var a=this.renderElement,d=Ext.baseCSSPrefix;if(b){a.addCls(d+"label-align-"+b);if(b=="top"||b=="bottom"){this.label.setWidth("100%")}else{this.updateLabelWidth(this.getLabelWidth())}}if(c){a.removeCls(d+"label-align-"+c)}},updateLabelCls:function(a,b){if(a){this.label.addCls(a)}if(b){this.label.removeCls(b)}},updateLabelWidth:function(b){var a=this.getLabelAlign();if(b){if(a=="top"||a=="bottom"){this.label.setWidth("100%")}else{this.label.setWidth(b)}}},updateLabelWrap:function(b,c){var a=Ext.baseCSSPrefix+"form-label-nowrap";if(!b){this.addCls(a)}else{this.removeCls(a)}},updateRequired:function(a){this.renderElement[a?"addCls":"removeCls"](this.getRequiredCls())},updateRequiredCls:function(a,b){if(this.getRequired()){this.renderElement.replaceCls(b,a)}},initialize:function(){var a=this;a.callParent();a.doInitValue()},doInitValue:function(){this.originalValue=this.getInitialConfig().value},reset:function(){this.setValue(this.originalValue);return this},resetOriginalValue:function(){this.originalValue=this.getValue()},isDirty:function(){return false}},function(){});Ext.define("Ext.field.Text",{extend:Ext.field.Field,xtype:"textfield",alternateClassName:"Ext.form.Text",config:{ui:"text",clearIcon:true,placeHolder:null,maxLength:null,autoComplete:null,autoCapitalize:null,autoCorrect:null,readOnly:null,component:{xtype:"input",type:"text",fastFocus:true},bubbleEvents:["action"]},initialize:function(){var a=this;a.callParent();a.getComponent().on({scope:this,keyup:"onKeyUp",change:"onChange",focus:"onFocus",blur:"onBlur",paste:"onPaste",mousedown:"onMouseDown",clearicontap:"onClearIconTap"});a.originalValue=a.getValue()||"";a.getComponent().originalValue=a.originalValue;a.syncEmptyCls()},syncEmptyCls:function(){var b=(this._value)?this._value.length:false,a=Ext.baseCSSPrefix+"empty";if(b){this.removeCls(a)}else{this.addCls(a)}},updateValue:function(c){var b=this.getComponent(),a=c!==undefined&&c!==null&&c!=="";if(b){b.setValue(c)}this[a&&this.isDirty()?"showClearIcon":"hideClearIcon"]();this.syncEmptyCls()},getValue:function(){var a=this;a._value=a.getComponent().getValue();a.syncEmptyCls();return a._value},updatePlaceHolder:function(a){this.getComponent().setPlaceHolder(a)},updateMaxLength:function(a){this.getComponent().setMaxLength(a)},updateAutoComplete:function(a){this.getComponent().setAutoComplete(a)},updateAutoCapitalize:function(a){this.getComponent().setAutoCapitalize(a)},updateAutoCorrect:function(a){this.getComponent().setAutoCorrect(a)},updateReadOnly:function(a){if(a){this.hideClearIcon()}else{this.showClearIcon()}this.getComponent().setReadOnly(a)},updateInputType:function(a){var b=this.getComponent();if(b){b.setType(a)}},updateName:function(a){var b=this.getComponent();if(b){b.setName(a)}},updateTabIndex:function(b){var a=this.getComponent();if(a){a.setTabIndex(b)}},updateInputCls:function(a,b){var c=this.getComponent();if(c){c.replaceCls(b,a)}},doSetDisabled:function(b){var c=this;c.callParent(arguments);var a=c.getComponent();if(a){a.setDisabled(b)}if(b){c.hideClearIcon()}else{c.showClearIcon()}},showClearIcon:function(){var b=this,c=b.getValue(),a=c!==undefined&&c!==null&&c!=="";if(b.getClearIcon()&&!b.getDisabled()&&!b.getReadOnly()&&a){b.element.addCls(Ext.baseCSSPrefix+"field-clearable")}return b},hideClearIcon:function(){if(this.getClearIcon()){this.element.removeCls(Ext.baseCSSPrefix+"field-clearable")}},onKeyUp:function(a){this.fireAction("keyup",[this,a],"doKeyUp")},doKeyUp:function(b,d){var c=b.getValue(),a=c!==undefined&&c!==null&&c!=="";this[a?"showClearIcon":"hideClearIcon"]();if(d.browserEvent.keyCode===13){b.fireAction("action",[b,d],"doAction")}},doAction:function(){this.blur()},onClearIconTap:function(a,b){this.fireAction("clearicontap",[this,a,b],"doClearIconTap")},doClearIconTap:function(a,b){a.setValue("");a.getValue()},onChange:function(b,c,a){b.fireEvent("change",this,c,a)},onFocus:function(a){this.addCls(Ext.baseCSSPrefix+"field-focused");this.isFocused=true;this.fireEvent("focus",this,a)},onBlur:function(b){var a=this;this.removeCls(Ext.baseCSSPrefix+"field-focused");this.isFocused=false;a.fireEvent("blur",a,b);setTimeout(function(){a.isFocused=false},50)},onPaste:function(a){this.fireEvent("paste",this,a)},onMouseDown:function(a){this.fireEvent("mousedown",this,a)},focus:function(){this.getComponent().focus();return this},blur:function(){this.getComponent().blur();return this},select:function(){this.getComponent().select();return this},resetOriginalValue:function(){this.callParent();var a=this.getComponent();if(a&&a.hasOwnProperty("originalValue")){this.getComponent().originalValue=this.originalValue}this.reset()},reset:function(){this.getComponent().reset();this.getValue();this[this.isDirty()?"showClearIcon":"hideClearIcon"]()},isDirty:function(){var a=this.getComponent();if(a){return a.isDirty()}return false}});Ext.define("Ext.field.TextAreaInput",{extend:Ext.field.Input,xtype:"textareainput",tag:"textarea"});Ext.define("Ext.field.TextArea",{extend:Ext.field.Text,xtype:"textareafield",alternateClassName:"Ext.form.TextArea",config:{ui:"textarea",autoCapitalize:false,component:{xtype:"textareainput"},maxRows:null},updateMaxRows:function(a){this.getComponent().setMaxRows(a)},doSetHeight:function(a){this.callParent(arguments);var b=this.getComponent();b.input.setHeight(a)},doSetWidth:function(b){this.callParent(arguments);var a=this.getComponent();a.input.setWidth(b)},doKeyUp:function(a){var b=a.getValue();a[b?"showClearIcon":"hideClearIcon"]()}});Ext.define("Ext.MessageBox",{extend:Ext.Sheet,config:{ui:"dark",baseCls:Ext.baseCSSPrefix+"msgbox",iconCls:null,showAnimation:{type:"popIn",duration:250,easing:"ease-out"},hideAnimation:{type:"popOut",duration:250,easing:"ease-out"},zIndex:999,defaultTextHeight:75,title:null,buttons:null,message:null,prompt:null,modal:true,layout:{type:"vbox",pack:"center"}},platformConfig:[{theme:["Windows"],ui:"light",showAnimation:{type:"fadeIn"},hideAnimation:{type:"fadeOut"}},{theme:["Blackberry","Blackberry103"],ui:"plain"},{theme:["MoutainView"]}],statics:{OK:{text:"OK",itemId:"ok",ui:"action"},YES:{text:"Yes",itemId:"yes",ui:"action"},NO:{text:"No",itemId:"no"},CANCEL:{text:"Cancel",itemId:"cancel"},INFO:Ext.baseCSSPrefix+"msgbox-info",WARNING:Ext.baseCSSPrefix+"msgbox-warning",QUESTION:Ext.baseCSSPrefix+"msgbox-question",ERROR:Ext.baseCSSPrefix+"msgbox-error",OKCANCEL:[{text:"Cancel",itemId:"cancel"},{text:"OK",itemId:"ok",ui:"action"}],YESNOCANCEL:[{text:"Cancel",itemId:"cancel"},{text:"No",itemId:"no"},{text:"Yes",itemId:"yes",ui:"action"}],YESNO:[{text:"No",itemId:"no"},{text:"Yes",itemId:"yes",ui:"action"}]},constructor:function(a){a=a||{};if(a.hasOwnProperty("promptConfig")){Ext.applyIf(a,{prompt:a.promptConfig});delete a.promptConfig}if(a.hasOwnProperty("multiline")||a.hasOwnProperty("multiLine")){a.prompt=a.prompt||{};Ext.applyIf(a.prompt,{multiLine:a.multiline||a.multiLine});delete a.multiline;delete a.multiLine}this.defaultAllowedConfig={};var e=["ui","showAnimation","hideAnimation","title","message","prompt","iconCls","buttons","defaultTextHeight"],d=e.length,b,c;for(b=0;bthis.getMaxProgressInput()){c=this.getMaxProgressInput()}if(c=0){d[b]=h}b++;if(g){g.then(f,a)}else{c.fulfill.apply(c,d)}}f();return c},whenComplete:function(g){var f=new this,e=-1,h=[],c=[],i;function a(j){i=g.shift();c.push(j);d(i)}function b(j){i=g.shift();h.push(j);d(i)}function d(j){e++;if(j){j.then(b,a)}else{f.fulfill.call(f,{fulfilled:h,rejected:c})}}d(g.shift());return f},from:function(){var a=new this;a.completed=1;a.lastResults=arguments;return a},fail:function(a){var b=new this;b.completed=-1;b.lastReason=a;return b}},completed:0,getListeners:function(b){var a=this.listeners;if(!a&&b){this.listeners=a=[]}return a},then:function(b,c,a){if(typeof b=="function"){a=c;c=b;b=null}if(typeof c=="string"){c=b[c]}if(typeof a=="string"){a=b[a]}return this.doThen(b,c,a)},doThen:function(d,g,b){var e=Ext.Promise,c=this.completed,f,a;if(c===-1){if(b){b.call(d,this.lastReason)}return this}if(c===1&&!this.isFulfilling){if(!g){return this}a=g.apply(d,this.lastResults);if(a instanceof e){f=a}else{f=e.from(a)}}else{f=new e;f.$owner=this;this.getListeners(true).push({scope:d,success:g,error:b,promise:f})}return f},error:function(b,a){if(typeof b=="function"){a=b;b=null}if(typeof a=="string"){a=b[a]}return this.doThen(b,null,a)},fulfill:function(){var b=arguments,d,e,c,g,f,a;this.lastResults=b;this.completed=1;while(d=this.getListeners()){delete this.listeners;this.isFulfilling=true;while(e=d.shift()){g=e.success;c=e.scope;f=e.promise;delete f.$owner;if(g){a=g.apply(c,b);if(a instanceof Ext.Promise){a.connect(f)}else{f.fulfill(a)}}else{f.fulfill(b)}}this.isFulfilling=false}return this},connect:function(b){var a=this;a.then(b,function(c){this.fulfill(c);return c},"reject")},reject:function(d){var b=this.getListeners(),c,a,e;this.lastReason=d;this.completed=-1;if(b){delete this.listeners;while(c=b.shift()){a=c.error;e=c.promise;delete e.$owner;if(a){a.call(c.scope,d)}e.reject(d)}}return this},cancel:function(){var c=this.getListeners(),a=this.$owner,b,d,e;if(c){for(b=0,d=c.length;b button",scope:a,tap:"onButtonRelease"});a.onAfter({delegate:"> button",scope:a,hide:"onButtonHiddenChange",show:"onButtonHiddenChange"})},updateAllowMultiple:function(a){if(!this.initialized&&!this.getInitialConfig().hasOwnProperty("allowDepress")&&a){this.setAllowDepress(true)}},applyItems:function(){var e=this,f=[],d,b,c,a;e.callParent(arguments);a=this.getItems();d=a.length;for(b=0;b=0;c--){d=b.items[c];if(!d.isHidden()){d.addCls(g);break}}},applyPressedButtons:function(a){var e=this,f=[],c,d,b;if(e.getAllowToggle()){if(Ext.isArray(a)){d=a.length;for(b=0;b0)?"taphold":"tapstart";if(!this.disabled){this.enable()}},onStart:function(b,a){if(this.cancelSelector&&b.getTarget(this.cancelSelector)){return}if(this.handleSelector&&!b.getTarget(this.handleSelector)){return}if(!this.sorting){this.onSortStart(b,a)}},onSortStart:function(c,b){this.sorting=true;var a=Ext.create("Ext.util.Draggable",b,{threshold:0,revert:this.revert,direction:this.direction,constrain:this.constrain===true?this.el:this.constrain,animationDuration:100});a.on({drag:this.onDrag,dragend:this.onDragEnd,scope:this});this.dragEl=b;this.calculateBoxes();if(!a.dragging){a.onStart(c)}this.fireEvent("sortstart",this,c)},calculateBoxes:function(){this.items=[];var b=this.el.select(this.itemSelector,false),f=b.length,a,e,c,d;for(a=0;a(h.bottom-h.top)/2){if(h.bottom>k.top&&k.top>h.top){l.el.insertAfter(k.el)}else{l.el.insertBefore(k.el)}d=true}else{if(this.horizontal&&Math.abs(a.left-a.right)>(h.right-h.left)/2){if(h.right>k.left&&k.left>h.left){l.el.insertAfter(k.el)}else{l.el.insertBefore(k.el)}d=true}}if(d){l.reset();l.moveTo(h.left,h.top);this.calculateBoxes();this.fireEvent("sortchange",this,l.el,this.el.select(this.itemSelector,false).indexOf(l.el.dom));return}}}},onDragEnd:function(a,b){a.destroy();this.sorting=false;this.fireEvent("sortend",this,a,b)},enable:function(){this.el.on(this.startEventName,this.onStart,this,{delegate:this.itemSelector,holdThreshold:this.getDelay()});this.disabled=false},disable:function(){this.el.un(this.startEventName,this.onStart,this);this.disabled=true},isDisabled:function(){return this.disabled},isSorting:function(){return this.sorting},isVertical:function(){return this.vertical},isHorizontal:function(){return this.horizontal}});Ext.define("Ext.TitleBar",{extend:Ext.Container,xtype:"titlebar",isToolbar:true,config:{baseCls:Ext.baseCSSPrefix+"toolbar",cls:Ext.baseCSSPrefix+"navigation-bar",ui:"dark",title:null,titleAlign:"center",defaultType:"button",minHeight:null,layout:{type:"hbox"},items:[],maxButtonWidth:"40%"},platformConfig:[{theme:["Blackberry","Blackberry103","Tizen"],titleAlign:"left"},{theme:["Cupertino"],maxButtonWidth:"80%"}],hasCSSMinHeight:true,beforeInitialize:function(){this.applyItems=this.applyInitialItems},initialize:function(){delete this.applyItems;this.add(this.initialItems);delete this.initialItems;this.on({painted:"refreshTitlePosition",single:true})},applyInitialItems:function(a){var c=this,b=c.getTitleAlign(),d=c.getDefaults()||{};c.initialItems=a;c.leftBox=c.add({xtype:"container",style:"position: relative",layout:{type:"hbox",align:"center"},listeners:{resize:"refreshTitlePosition",scope:c}});c.spacer=c.add({xtype:"component",style:"position: relative",flex:1,listeners:{resize:"refreshTitlePosition",scope:c}});c.rightBox=c.add({xtype:"container",style:"position: relative",layout:{type:"hbox",align:"center"},listeners:{resize:"refreshTitlePosition",scope:c}});switch(b){case"left":c.titleComponent=c.leftBox.add({xtype:"title",cls:Ext.baseCSSPrefix+"title-align-left",hidden:d.hidden});c.refreshTitlePosition=Ext.emptyFn;break;case"right":c.titleComponent=c.rightBox.add({xtype:"title",cls:Ext.baseCSSPrefix+"title-align-right",hidden:d.hidden});c.refreshTitlePosition=Ext.emptyFn;break;default:c.titleComponent=c.add({xtype:"title",hidden:d.hidden,centered:true});break}c.doAdd=c.doBoxAdd;c.remove=c.doBoxRemove;c.doInsert=c.doBoxInsert},doBoxAdd:function(a){if(a.config.align=="right"){this.rightBox.add(a)}else{this.leftBox.add(a)}},doBoxRemove:function(b,a){if(b.config.align=="right"){this.rightBox.remove(b,a)}else{this.leftBox.remove(b,a)}},doBoxInsert:function(a,b){if(b.config.align=="right"){this.rightBox.insert(a,b)}else{this.leftBox.insert(a,b)}},calculateMaxButtonWidth:function(){var a=this.getMaxButtonWidth();if(Ext.isString(a)){a=parseInt(a.replace("%",""),10)}a=Math.round((this.element.getWidth()/100)*a);return a},refreshTitlePosition:function(){if(this.isDestroyed){return}var g=this.titleComponent.renderElement;g.setWidth(null);g.setLeft(null);var b=this.leftBox,d=b.down("button"),a=b.getItems().getCount()==1,i,n;if(d&&a){if(d.getWidth()==null){d.renderElement.setWidth("auto")}i=b.renderElement.getWidth();n=this.calculateMaxButtonWidth();if(i>n){d.renderElement.setWidth(n)}}var k=this.spacer.renderElement.getPageBox();if(Ext.browser.is.IE){g.setWidth(k.width)}var l=g.getPageBox(),h=l.width-k.width,e=l.left,j=l.right,c,m,f;if(h>0){c=h/2;e+=c;j-=c;g.setWidth(k.width)}m=k.left-e;f=j-k.right;if(m>0){g.setLeft(m)}else{if(f>0){g.setLeft(-f)}}g.repaint()},updateTitle:function(a){this.titleComponent.setTitle(a);if(this.isPainted()){this.refreshTitlePosition()}}});Ext.define("Ext.Toast",{extend:Ext.Sheet,config:{ui:"dark",baseCls:Ext.baseCSSPrefix+"toast",showAnimation:{type:"popIn",duration:250,easing:"ease-out"},hideAnimation:{type:"popOut",duration:250,easing:"ease-out"},zIndex:999,message:null,timeout:1000,messageAnimation:true,hideOnMaskTap:true,modal:true,layout:{type:"vbox",pack:"center"}},applyMessage:function(a){a={html:a,cls:this.getBaseCls()+"-text"};return Ext.factory(a,Ext.Component,this._message)},updateMessage:function(a){if(a){this.add(a)}},applyTimeout:function(a){if(this._timeoutID){clearTimeout(this._timeoutID);if(!Ext.isEmpty(a)){this._timeoutID=setTimeout(Ext.bind(this.onTimeout,this),a)}}return a},next:Ext.emptyFn,show:function(a){var c=this,d=a.timeout,e=c.getMessageAnimation(),b=c.getMessage();if(c.isRendered()&&c.isHidden()===false){a.timeout=null;b.onAfter({hiddenchange:function(){c.setMessage(a.message);b=c.getMessage();b.onAfter({hiddenchange:function(){this._timeoutID=true;c.setTimeout(d)},scope:c,single:true});b.show(e)},scope:c,single:true});b.hide(e)}else{Ext.util.InputBlocker.blockInputs();c.setConfig(a);if(!c.getParent()&&Ext.Viewport){Ext.Viewport.add(c)}if(!Ext.isEmpty(d)){c._timeoutID=setTimeout(Ext.bind(c.onTimeout,c),d)}c.callParent(arguments)}},hide:function(a){clearTimeout(this._timeoutID);if(!this.next()){this.callParent(arguments)}},onTimeout:function(){this.hide()}},function(d){var c=[],e=false;function a(){var f=c.shift();if(f){e=true;this.show(f)}else{e=false}return e}function b(){if(!Ext.Toast._instance){Ext.Toast._instance=Ext.create("Ext.Toast");Ext.Toast._instance.next=a}return Ext.Toast._instance}Ext.toast=function(h,i){var f=b(),g=h;if(Ext.isString(h)){g={message:h,timeout:i}}if(g.timeout===undefined){g.timeout=Ext.Toast.prototype.config.timeout}c.push(g);if(!e){f.next()}return f}});Ext.define("Ext.Video",{extend:Ext.Media,xtype:"video",config:{posterUrl:null,baseCls:Ext.baseCSSPrefix+"video",controls:true},template:[{reference:"ghost",classList:[Ext.baseCSSPrefix+"video-ghost"]},{tag:"video",reference:"media",classList:[Ext.baseCSSPrefix+"media"]}],initialize:function(){var a=this;a.callParent();a.media.hide();a.onBefore({erased:"onErased",scope:a});a.ghost.on({tap:"onGhostTap",scope:a});a.media.on({pause:"onPause",scope:a});if(Ext.os.is.Android4||Ext.os.is.iPad){this.isInlineVideo=true}},applyUrl:function(a){return[].concat(a)},updateUrl:function(f){var c=this,e=c.media,g=f.length,d=e.query("source"),b=d.length,a;for(a=0;a=1){g+=j.cssText}}a=g.match(/[0-9]+s/g);for(e in a){b=parseInt(a[e]);if(b>c){c=b}}if(this.$themeVariationChangeTimeout){clearTimeout(this.$themeVariationChangeTimeout);this.$themeVariationChangeTimeout=null}this.$themeVariationChangeTimeout=Ext.defer(function(){f.removeCls(k)},b*1000)}f.removeCls(d+l);f.addCls(d+h)}},function(){});Ext.define("Ext.carousel.Item",{extend:Ext.Decorator,config:{baseCls:"x-carousel-item",component:null,translatable:true}});Ext.define("Ext.carousel.Indicator",{extend:Ext.Component,xtype:"carouselindicator",alternateClassName:"Ext.Carousel.Indicator",config:{baseCls:Ext.baseCSSPrefix+"carousel-indicator",direction:"horizontal"},initialize:function(){this.callParent();this.indicators=[];this.element.on({tap:"onTap",scope:this})},updateDirection:function(a,c){var b=this.getBaseCls();this.element.replaceCls(c,a,b);if(a==="horizontal"){this.setBottom(0);this.setRight(null)}else{this.setRight(0);this.setBottom(null)}},addIndicator:function(){this.indicators.push(this.element.createChild({tag:"span"}))},removeIndicator:function(){var a=this.indicators;if(a.length>0){a.pop().destroy()}},setActiveIndex:function(b){var e=this.indicators,d=this.activeIndex,a=e[d],f=e[b],c=this.getBaseCls();if(a){a.removeCls(c,null,"active")}if(f){f.addCls(c,null,"active")}this.activeIndex=b;return this},onTap:function(f){var g=f.touch,a=this.element.getPageBox(),d=a.left+(a.width/2),b=a.top+(a.height/2),c=this.getDirection();if((c==="horizontal"&&g.pageX>=d)||(c==="vertical"&&g.pageY>=b)){this.fireEvent("next",this)}else{this.fireEvent("previous",this)}},destroy:function(){var d=this.indicators,b,c,a;for(b=0,c=d.length;b=a-c&&b<=a+c)},getTranslatable:function(){var a=this.translatable;if(!a){this.translatable=a=new Ext.util.TranslatableGroup;a.setItems(this.orderedCarouselItems);a.on("animationend","onAnimationEnd",this)}return a},onDragStart:function(f){var d=this.getDirection(),b=f.absDeltaX,a=f.absDeltaY,c=this.getDirectionLock();this.isDragging=true;if(c){if((d==="horizontal"&&b>a)||(d==="vertical"&&a>b)){f.stopPropagation()}else{this.isDragging=false;return}}this.getTranslatable().stopAnimation();this.dragStartOffset=this.offset;this.dragDirection=0},onDrag:function(j){if(!this.isDragging){return}var k=this.dragStartOffset,l=this.getDirection(),m=l==="horizontal"?j.deltaX:j.deltaY,a=this.offset,i=this.flickStartTime,c=this.dragDirection,b=Ext.Date.now(),h=this.getActiveIndex(),f=this.getMaxItemIndex(),d=c,g;if((h===0&&m>0)||(h===f&&m<0)){m*=0.5}g=k+m;if(g>a){c=1}else{if(g300){this.flickStartOffset=a;this.flickStartTime=b}this.dragDirection=c;this.setOffset(g)},onDragEnd:function(j){if(!this.isDragging){return}this.onDrag(j);this.isDragging=false;var a=Ext.Date.now(),i=this.itemLength,g=i/2,f=this.offset,m=this.getActiveIndex(),c=this.getMaxItemIndex(),h=0,l=f-this.flickStartOffset,b=a-this.flickStartTime,k=this.getIndicator(),d;if(b>0&&Math.abs(l)>=10){d=l/b;if(Math.abs(d)>=1){if(d<0&&m0&&m>0){h=1}}}}if(h===0){if(m0&&f>g){h=1}}}if(k){k.setActiveIndex(m-h)}this.animationDirection=h;this.setOffsetAnimated(h*i)},applyAnimation:function(a){a.easing=Ext.factory(a.easing,Ext.fx.easing.EaseOut);return a},updateDirection:function(b){var a=this.getIndicator();this.currentAxis=(b==="horizontal")?"x":"y";if(a){a.setDirection(b)}},setOffset:function(a){this.offset=a;if(Ext.isNumber(this.itemOffset)){this.getTranslatable().translateAxis(this.currentAxis,a+this.itemOffset)}return this},setOffsetAnimated:function(b){var a=this.getIndicator();if(a){a.setActiveIndex(this.getActiveIndex()-this.animationDirection)}this.offset=b;this.getTranslatable().translateAxis(this.currentAxis,b+this.itemOffset,this.getAnimation());return this},onAnimationEnd:function(b){var c=this.getActiveIndex(),a=this.animationDirection,e=this.currentAxis,f=b[e],d=this.itemLength,g;if(a===-1){g=d+f}else{if(a===1){g=f-d}else{g=f}}g-=this.itemOffset;this.offset=g;this.setActiveItem(c-a)},refresh:function(){this.refreshSizing();this.refreshActiveItem()},refreshSizing:function(){var a=this.element,b=this.getItemLength(),e={x:0,y:0},c,d;if(this.getDirection()==="horizontal"){d=a.getWidth()}else{d=a.getHeight()}this.hiddenTranslation=-d;if(b===null){b=d;c=0}else{c=(d-b)/2}this.itemLength=b;this.itemOffset=c;e[this.currentAxis]=b;this.getTranslatable().setItemLength(e)},refreshOffset:function(){this.setOffset(this.offset)},refreshActiveItem:function(){this.doSetActiveItem(this.getActiveItem())},getActiveIndex:function(){return this.activeIndex},refreshActiveIndex:function(){this.activeIndex=this.getInnerItemIndex(this.getActiveItem())},refreshCarouselItems:function(){var a=this.carouselItems,b,d,c;for(b=0,d=a.length;b0){for(f=1;f<=c;f++){h=q-f;if(h>=0){a=this.getInnerItemAt(h);b=a.getId();o[b]=a;p[b]=c-f}else{break}}}if(qb){this.setActiveItem(b)}else{this.rebuildInnerIndexes(a);this.refreshActiveItem()}}},rebuildInnerIndexes:function(n){var c=this.innerIndexToItem,g=this.innerIdToIndex,j=this.innerItems.slice(),h=j.length,b=this.getBufferSize(),d=this.getMaxItemIndex(),l=[],e,k,f,a,m;if(n===undefined){this.innerIndexToItem=c={};this.innerIdToIndex=g={};for(e=0;e=0&&e<=d){if(c.hasOwnProperty(e)){Ext.Array.remove(j,c[e]);continue}l.push(e)}}for(e=0,h=l.length;e>1;f=d(e,b[c]);if(f>=0){h=c+1}else{if(f<0){a=c-1}}}return h}});Ext.define("Ext.mixin.Filterable",{extend:Ext.mixin.Mixin,mixinConfig:{id:"filterable"},config:{filters:null,filterRoot:null},dirtyFilterFn:false,filterFn:null,filtered:false,applyFilters:function(a,b){if(!b){b=this.createFiltersCollection()}b.clear();this.filtered=false;this.dirtyFilterFn=true;if(a){this.addFilters(a)}return b},createFiltersCollection:function(){this._filters=Ext.create("Ext.util.Collection",function(a){return a.getId()});return this._filters},addFilter:function(a){this.addFilters([a])},addFilters:function(b){var a=this.getFilters();return this.insertFilters(a?a.length:0,b)},insertFilter:function(a,b){return this.insertFilters(a,[b])},insertFilters:function(h,c){if(!Ext.isArray(c)){c=[c]}var j=c.length,a=this.getFilterRoot(),d=this.getFilters(),e=[],f,g,b;if(!d){d=this.createFiltersCollection()}for(g=0;g=e.length||(a&&e.getAutoSort())){return e.add(d,f)}if(typeof d!="undefined"&&d!==null){if(typeof g[d]!="undefined"){e.replace(d,f);return false}g[d]=f}this.all.push(f);if(b&&this.getAutoFilter()&&this.mixins.filterable.isFiltered.call(e,f)){return null}e.length++;Ext.Array.splice(e.items,c,0,f);Ext.Array.splice(e.keys,c,0,d);e.dirtyIndices=true;return f},insertAll:function(g,d){if(g>=this.items.length||(this.sorted&&this.getAutoSort())){return this.addAll(d)}var s=this,h=this.filtered,a=this.sorted,b=this.all,m=this.items,l=this.keys,r=this.map,n=this.getAutoFilter(),o=this.getAutoSort(),t=[],j=[],f=[],c=this.mixins.filterable,e=false,k,u,p,q;if(a&&this.getAutoSort()){}if(Ext.isObject(d)){for(u in d){if(d.hasOwnProperty(u)){j.push(m[u]);t.push(u)}}}else{j=d;k=d.length;for(p=0;p=0){e=a[b];c=f[b];if(typeof c!="undefined"){delete g.map[c]}Ext.Array.erase(a,b,1);Ext.Array.erase(f,b,1);Ext.Array.remove(d,e);delete g.indices[c];g.length--;this.dirtyIndices=true;return e}return false},removeAtKey:function(a){return this.removeAt(this.indexOfKey(a))},getCount:function(){return this.length},indexOf:function(b){if(this.dirtyIndices){this.updateIndices()}var a=b?this.indices[this.getKey(b)]:-1;return(a===undefined)?-1:a},indexOfKey:function(b){if(this.dirtyIndices){this.updateIndices()}var a=this.indices[b];return(a===undefined)?-1:a},updateIndices:function(){var a=this.items,e=a.length,f=this.indices={},c,d,b;for(c=0;c=a;d--){b[b.length]=c[d]}}return b},findIndexBy:function(d,c,h){var g=this,f=g.keys,a=g.items,b=h||0,e=a.length;for(;b=0){return Ext.functionFactory("obj","return obj"+(b>0?".":"")+a)(d)}return d[a]},onMetaChange:function(f){var a=f.fields,e=this,d,c,b;e.metaData=f;if(f.rootProperty!==undefined){e.setRootProperty(f.rootProperty)}else{if(f.root!==undefined){e.setRootProperty(f.root)}}if(f.idProperty!==undefined){e.setIdProperty(f.idProperty)}if(f.totalProperty!==undefined){e.setTotalProperty(f.totalProperty)}if(f.successProperty!==undefined){e.setSuccessProperty(f.successProperty)}if(f.messageProperty!==undefined){e.setMessageProperty(f.messageProperty)}if(a){if(e.getModel()){e.getModel().setFields(a);e.buildExtractors()}else{b=e.getIdProperty();c={fields:a};if(b){c.idProperty=b}d=Ext.define("Ext.data.reader.MetaModel"+Ext.id(),{extend:"Ext.data.Model",config:c});e.setModel(d)}}else{e.buildExtractors()}}},function(){Ext.apply(this.prototype,{nullResultSet:new Ext.data.ResultSet({total:0,count:0,records:[],success:false})})});Ext.define("Ext.data.reader.Json",{extend:Ext.data.reader.Reader,alternateClassName:"Ext.data.JsonReader",alias:"reader.json",config:{record:null,useSimpleAccessors:false},objectRe:/[\[\.]/,getResponseData:function(a){var d=a;if(a&&a.responseText){d=a.responseText}if(typeof d!=="string"){return d}var c;try{c=Ext.decode(d)}catch(b){this.fireEvent("exception",this,a,"Unable to parse the JSON returned by the server: "+b.toString());Ext.Logger.warn("Unable to parse the JSON returned by the server: "+b.toString())}return c},buildExtractors:function(){var b=this,a=b.getRootProperty();b.callParent(arguments);if(a){b.rootAccessor=b.createAccessor(a)}else{delete b.rootAccessor}},getRoot:function(b){var a=this.getModel().getFields();if(a.isDirty){this.buildExtractors(true);delete a.isDirty}if(this.rootAccessor){return this.rootAccessor.call(this,b)}else{return b}},extractData:function(a){var e=this.getRecord(),d=[],c,b;if(e){c=a.length;if(!c&&Ext.isObject(a)){c=1;a=[a]}for(b=0;b=0){return Ext.functionFactory("obj","var value; try {value = obj"+(b>0?".":"")+c+"} catch(e) {}; return value;")}}return function(d){return d[c]}}}(),createFieldAccessExpression:function(g,b,c){var f=this,h=f.objectRe,e=(g.getMapping()!==null),a=e?g.getMapping():g.getName(),i,d;if(typeof a==="function"){i=b+".getMapping()("+c+", this)"}else{if(f.getUseSimpleAccessors()===true||((d=String(a).search(h))<0)){if(!e||isNaN(a)){a='"'+a+'"'}i=c+"["+a+"]"}else{i=c+(d>0?".":"")+a}}return i}});Ext.define("Ext.data.writer.Writer",{alias:"writer.base",alternateClassName:["Ext.data.DataWriter","Ext.data.Writer"],config:{writeAllFields:true,nameProperty:"name"},constructor:function(a){this.initConfig(a)},write:function(e){var c=e.getOperation(),b=c.getRecords()||[],a=b.length,d=0,f=[];for(;dg){e=g;g=c;c=e}for(d=c;d<=g;d++){a.push(b.getAt(d))}this.doMultiSelect(a,h)},select:function(c,e,b){var d=this,a;if(d.getDisableSelection()){return}if(typeof c==="number"){c=[d.getStore().getAt(c)]}if(!c){return}if(d.getMode()=="SINGLE"&&c){a=c.length?c[0]:c;d.doSingleSelect(a,b)}else{d.doMultiSelect(c,e,b)}},doSingleSelect:function(a,b){var d=this,c=d.selected;if(d.getDisableSelection()){return}if(d.isSelected(a)){return}if(c.getCount()>0){d.deselect(d.getLastSelected(),b)}c.add(a);d.setLastSelected(a);d.onItemSelect(a,b);d.setLastFocused(a);if(!b){d.fireSelectionChange([a])}},doMultiSelect:function(a,j,h){if(a===null||this.getDisableSelection()){return}a=!Ext.isArray(a)?[a]:a;var f=this,b=f.selected,e=a.length,g=false,c=0,d;if(!j&&b.getCount()>0){g=true;f.deselect(f.getSelection(),true)}for(;c0},refreshSelection:function(){var b=this,a=b.getSelection();b.deselectAll(true);if(a.length){b.select(a,false,true)}},onSelectionStoreRemove:function(c,b){var g=this,e=g.selected,f=b.length,a,d;if(g.getDisableSelection()){return}for(d=0;d ."+Ext.baseCSSPrefix+"data-item",scope:this})},initialize:function(){this.callParent();this.doInitialize()},onItemTouchStart:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);a.on({touchmove:"onItemTouchMove",scope:b,single:true});b.fireEvent("itemtouchstart",b,a,b.indexOf(a),d)},onItemTouchMove:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemtouchmove",b,a,b.indexOf(a),d)},onItemTouchEnd:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);a.un({touchmove:"onItemTouchMove",scope:b});b.fireEvent("itemtouchend",b,a,b.indexOf(a),d)},onItemTap:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemtap",b,a,b.indexOf(a),d)},onItemTapHold:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemtaphold",b,a,b.indexOf(a),d)},onItemSingleTap:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemsingletap",b,a,b.indexOf(a),d)},onItemDoubleTap:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemdoubletap",b,a,b.indexOf(a),d)},onItemSwipe:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemswipe",b,a,b.indexOf(a),d)},moveItemsToCache:function(j,k){var h=this,c=h.dataview,a=c.getMaxItemCache(),g=h.getViewItems(),f=h.itemCache,e=f.length,l=c.getPressedCls(),d=c.getSelectedCls(),b=k-j,m;for(;b>=0;b--){m=g[j+b];if(e!==a){h.remove(m,false);m.removeCls([l,d]);f.push(m);e++}else{m.destroy()}}if(h.getViewItems().length==0){this.dataview.showEmptyText()}},moveItemsFromCache:function(b){var l=this,e=l.dataview,m=e.getStore(),k=b.length,a=e.getDefaultType(),h=e.getItemConfig(),g=l.itemCache,f=g.length,j=[],c,n,d;if(k){e.hideEmptyText()}for(c=0;ci._tmpIndex?1:-1});for(c=0;c div",scope:this})},initialize:function(){this.callParent();this.doInitialize()},updateBaseCls:function(a,b){var c=this;c.callParent([a+"-container",b])},onItemTouchStart:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);Ext.get(c).on({touchmove:"onItemTouchMove",scope:b,single:true});b.fireEvent("itemtouchstart",b,Ext.get(c),a,d)},onItemTouchEnd:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);Ext.get(c).un({touchmove:"onItemTouchMove",scope:b});b.fireEvent("itemtouchend",b,Ext.get(c),a,d)},onItemTouchMove:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemtouchmove",b,Ext.get(c),a,d)},onItemTap:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemtap",b,Ext.get(c),a,d)},onItemTapHold:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemtaphold",b,Ext.get(c),a,d)},onItemDoubleTap:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemdoubletap",b,Ext.get(c),a,d)},onItemSingleTap:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemsingletap",b,Ext.get(c),a,d)},onItemSwipe:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemswipe",b,Ext.get(c),a,d)},updateListItem:function(b,f){var e=this,a=e.dataview,c=a.getStore(),d=c.indexOf(b),g=a.prepareData(b.getData(true),d,b);g.xcount=c.getCount();g.xindex=typeof g.xindex==="number"?g.xindex:d;f.innerHTML=a.getItemTpl().apply(g)},addListItem:function(e,c){var h=this,d=h.dataview,i=d.getStore(),a=d.prepareData(c.getData(true),e,c),b=h.element,j=b.dom.childNodes,g=j.length,f;a.xcount=typeof a.xcount==="number"?a.xcount:i.getCount();a.xindex=typeof a.xindex==="number"?a.xindex:e;f=Ext.Element.create(this.getItemElementConfig(e,a));if(!g||e==g){f.appendTo(b)}else{f.insertBefore(j[e])}},getItemElementConfig:function(c,e){var b=this.dataview,d=b.getItemCls(),a=b.getBaseCls()+"-item";if(d){a+=" "+d}return{cls:a,html:b.getItemTpl().apply(e)}},doRemoveItemCls:function(a){var d=this.getViewItems(),c=d.length,b=0;for(;b=0;b--){c=a[f+b];Ext.get(c).destroy()}if(d.getViewItems().length==0){this.dataview.showEmptyText()}},moveItemsFromCache:function(d){var g=this,b=g.dataview,c=b.getStore(),f=d.length,e,a;if(f){b.hideEmptyText()}for(e=0;eh._tmpIndex?1:-1});for(e=0;e{text}",pressedCls:"x-item-pressed",itemCls:null,selectedCls:"x-item-selected",triggerEvent:"itemtap",triggerCtEvent:"tap",deselectOnContainerClick:true,scrollable:true,inline:null,pressedDelay:100,loadingText:"Loading...",useComponents:null,itemConfig:{},maxItemCache:20,defaultType:"dataitem",scrollToTopOnRefresh:true},constructor:function(a){var c=this,b;c.hasLoadedStore=false;c.mixins.selectable.constructor.apply(c,arguments);c.indexOffset=0;c.callParent(arguments)},updateItemCls:function(c,b){var a=this.container;if(a){if(b){a.doRemoveItemCls(b)}if(c){a.doAddItemCls(c)}}},storeEventHooks:{beforeload:"onBeforeLoad",load:"onLoad",refresh:"refresh",addrecords:"onStoreAdd",removerecords:"onStoreRemove",updaterecord:"onStoreUpdate"},initialize:function(){this.callParent();var b=this,a,c=b.getTriggerEvent();b.on(b.getTriggerCtEvent(),b.onContainerTrigger,b);a=b.container=this.add(new Ext.dataview[b.getUseComponents()?"component":"element"].Container({baseCls:this.getBaseCls()}));a.dataview=b;if(c){b.on(c,b.onItemTrigger,b)}a.on({itemtouchstart:"onItemTouchStart",itemtouchend:"onItemTouchEnd",itemtap:"onItemTap",itemtaphold:"onItemTapHold",itemtouchmove:"onItemTouchMove",itemsingletap:"onItemSingleTap",itemdoubletap:"onItemDoubleTap",itemswipe:"onItemSwipe",scope:b});if(b.getStore()){if(b.isPainted()){b.refresh()}else{b.on({painted:"refresh",single:true})}}},applyInline:function(a){if(Ext.isObject(a)){a=Ext.apply({},a)}return a},updateInline:function(c,b){var a=this.getBaseCls();if(b){this.removeCls([a+"-inlineblock",a+"-nowrap"])}if(c){this.addCls(a+"-inlineblock");if(Ext.isObject(c)&&c.wrap===false){this.addCls(a+"-nowrap")}else{this.removeCls(a+"-nowrap")}}},prepareData:function(c,b,a){return c},onContainerTrigger:function(b){var a=this;if(b.target!=a.element.dom){return}if(a.getDeselectOnContainerClick()&&a.getStore()){a.deselectAll()}},onItemTrigger:function(b,a){if(!this.isDestroyed){this.selectWithEvent(this.getStore().getAt(a))}},doAddPressedCls:function(a){var c=this,b=c.getItemAt(c.getStore().indexOf(a));if(Ext.isElement(b)){b=Ext.get(b)}if(b){if(b.isComponent){b.renderElement.addCls(c.getPressedCls())}else{b.addCls(c.getPressedCls())}}},onItemTouchStart:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireAction("itemtouchstart",[f,d,h,a,g],"doItemTouchStart")},doItemTouchStart:function(c,b,e,a){var d=c.getPressedDelay();if(a){if(d>0){c.pressedTimeout=Ext.defer(c.doAddPressedCls,d,c,[a])}else{c.doAddPressedCls(a)}}},onItemTouchEnd:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);if(this.hasOwnProperty("pressedTimeout")){clearTimeout(this.pressedTimeout);delete this.pressedTimeout}if(a&&h){if(h.isComponent){h.renderElement.removeCls(f.getPressedCls())}else{h.removeCls(f.getPressedCls())}}f.fireEvent("itemtouchend",f,d,h,a,g)},onItemTouchMove:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);if(f.hasOwnProperty("pressedTimeout")){clearTimeout(f.pressedTimeout);delete f.pressedTimeout}if(a&&h){if(h.isComponent){h.renderElement.removeCls(f.getPressedCls())}else{h.removeCls(f.getPressedCls())}}f.fireEvent("itemtouchmove",f,d,h,a,g)},onItemTap:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemtap",f,d,h,a,g)},onItemTapHold:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemtaphold",f,d,h,a,g)},onItemSingleTap:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemsingletap",f,d,h,a,g)},onItemDoubleTap:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemdoubletap",f,d,h,a,g)},onItemSwipe:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemswipe",f,d,h,a,g)},onItemSelect:function(a,b){var c=this;if(b){c.doItemSelect(c,a)}else{c.fireAction("select",[c,a],"doItemSelect")}},doItemSelect:function(c,a){if(c.container&&!c.isDestroyed){var b=c.getItemAt(c.getStore().indexOf(a));if(Ext.isElement(b)){b=Ext.get(b)}if(b){if(b.isComponent){b.renderElement.removeCls(c.getPressedCls());b.renderElement.addCls(c.getSelectedCls())}else{b.removeCls(c.getPressedCls());b.addCls(c.getSelectedCls())}}}},onItemDeselect:function(a,b){var c=this;if(c.container&&!c.isDestroyed){if(b){c.doItemDeselect(c,a)}else{c.fireAction("deselect",[c,a,b],"doItemDeselect")}}},doItemDeselect:function(c,a){var b=c.getItemAt(c.getStore().indexOf(a));if(Ext.isElement(b)){b=Ext.get(b)}if(b){if(b.isComponent){b.renderElement.removeCls([c.getPressedCls(),c.getSelectedCls()])}else{b.removeCls([c.getPressedCls(),c.getSelectedCls()])}}},updateData:function(b){var a=this.getStore();if(!a){this.setStore(Ext.create("Ext.data.Store",{data:b,autoDestroy:true}))}else{a.add(b)}},applyStore:function(b){var d=this,e=Ext.apply({},d.storeEventHooks,{scope:d}),c,a;if(b){b=Ext.data.StoreManager.lookup(b);if(b&&Ext.isObject(b)&&b.isStore){b.on(e);c=b.getProxy();if(c){a=c.getReader();if(a){a.on("exception","handleException",this)}}}}return b},handleException:function(){this.setMasked(false)},updateStore:function(b,e){var d=this,f=Ext.apply({},d.storeEventHooks,{scope:d}),c,a;if(e&&Ext.isObject(e)&&e.isStore){e.un(f);if(!d.isDestroyed){d.onStoreClear()}if(e.getAutoDestroy()){e.destroy()}else{c=e.getProxy();if(c){a=c.getReader();if(a){a.un("exception","handleException",this)}}}}if(b){if(b.isLoaded()){this.hasLoadedStore=true}if(b.isLoading()){d.onBeforeLoad()}if(d.container){d.refresh()}}},onBeforeLoad:function(){var a=this.getLoadingText();if(a&&this.isPainted()){this.setMasked({xtype:"loadmask",message:a})}this.hideEmptyText()},updateEmptyText:function(c,d){var b=this,a;if(d&&b.emptyTextCmp){b.remove(b.emptyTextCmp,true);delete b.emptyTextCmp}if(c){b.emptyTextCmp=b.add({xtype:"component",cls:b.getBaseCls()+"-emptytext",html:c,hidden:true});a=b.getStore();if(a&&b.hasLoadedStore&&!a.getCount()){this.showEmptyText()}}},onLoad:function(a){this.hasLoadedStore=true;this.setMasked(false);if(!a.getCount()){this.showEmptyText()}},refresh:function(){var b=this,a=b.container;if(!b.getStore()){if(!b.hasLoadedStore&&!b.getDeferEmptyText()){b.showEmptyText()}return}if(a){b.fireAction("refresh",[b],"doRefresh")}},applyItemTpl:function(a){return(Ext.isObject(a)&&a.isTemplate)?a:new Ext.XTemplate(a)},onAfterRender:function(){var a=this;a.callParent(arguments);a.updateStore(a.getStore())},getItemAt:function(a){return this.getViewItems()[a-this.indexOffset]},getItemIndex:function(b){var a=this.getViewItems().indexOf(b);return(a===-1)?a:this.indexOffset+a},getViewItems:function(){return this.container.getViewItems()},doRefresh:function(g){var a=g.container,l=g.getStore(),b=l.getRange(),f=g.getViewItems(),j=b.length,o=f.length,c=j-o,h=g.getScrollable(),d,m;if(this.getScrollToTopOnRefresh()&&h){h.getScroller().scrollToTop()}if(j<1){g.onStoreClear();return}else{g.hideEmptyText()}if(c<0){a.moveItemsToCache(o+c,o-1);f=g.getViewItems();o=f.length}else{if(c>0){a.moveItemsFromCache(l.getRange(o))}}for(d=0;d]+>/gi,none:function(a){return a},asText:function(a){return String(a).replace(this.stripTagsRE,"")},asUCText:function(a){return String(a).toUpperCase().replace(this.stripTagsRE,"")},asUCString:function(a){return String(a).toUpperCase()},asDate:function(a){if(!a){return 0}if(Ext.isDate(a)){return a.getTime()}return Date.parse(String(a))},asFloat:function(a){a=parseFloat(String(a).replace(/,/g,""));return isNaN(a)?0:a},asInt:function(a){a=parseInt(String(a).replace(/,/g,""),10);return isNaN(a)?0:a}});Ext.define("Ext.data.Types",{singleton:true,stripRe:/[\$,%]/g,dashesRe:/-/g,iso8601TestRe:/\d\dT\d\d/,iso8601SplitRe:/[- :T\.Z\+]/},function(){var b=this,a=Ext.data.SortTypes;Ext.apply(b,{AUTO:{convert:function(c){return c},sortType:a.none,type:"auto"},STRING:{convert:function(c){return(c===undefined||c===null)?(this.getAllowNull()?null:""):String(c)},sortType:a.asUCString,type:"string"},INT:{convert:function(c){return(c!==undefined&&c!==null&&c!=="")?((typeof c==="number")?parseInt(c,10):parseInt(String(c).replace(b.stripRe,""),10)):(this.getAllowNull()?null:0)},sortType:a.none,type:"int"},FLOAT:{convert:function(c){return(c!==undefined&&c!==null&&c!=="")?((typeof c==="number")?c:parseFloat(String(c).replace(b.stripRe,""),10)):(this.getAllowNull()?null:0)},sortType:a.none,type:"float"},BOOL:{convert:function(c){if((c===undefined||c===null||c==="")&&this.getAllowNull()){return null}return c!=="false"&&c!=="0"&&!!c},sortType:a.none,type:"bool"},DATE:{convert:function(e){var c=this.getDateFormat(),d;if(!e){return null}if(Ext.isDate(e)){return e}if(c){if(c=="timestamp"){return new Date(e*1000)}if(c=="time"){return new Date(parseInt(e,10))}return Ext.Date.parse(e,c)}d=new Date(Date.parse(e));if(isNaN(d)){if(b.iso8601TestRe.test(e)){d=e.split(b.iso8601SplitRe);d=new Date(d[0],d[1]-1,d[2],d[3],d[4],d[5])}if(isNaN(d)){d=new Date(Date.parse(e.replace(b.dashesRe,"/")))}}return isNaN(d)?null:d},sortType:a.asDate,type:"date"}});Ext.apply(b,{BOOLEAN:this.BOOL,INTEGER:this.INT,NUMBER:this.FLOAT})});Ext.define("Ext.data.Field",{alias:"data.field",isField:true,config:{name:null,type:"auto",convert:undefined,dateFormat:null,allowNull:true,defaultValue:undefined,mapping:null,sortType:undefined,sortDir:"ASC",allowBlank:true,persist:true,encode:null,decode:null,bubbleEvents:"action"},constructor:function(a){if(Ext.isString(a)){a={name:a}}this.initConfig(a)},applyType:function(c){var b=Ext.data.Types,a=b.AUTO;if(c){if(Ext.isString(c)){return b[c.toUpperCase()]||a}else{return c}}return a},updateType:function(a,b){var c=this.getConvert();if(b&&c===b.convert){this.setConvert(a.convert)}},applySortType:function(d){var c=Ext.data.SortTypes,a=this.getType(),b=a.sortType;if(d){if(Ext.isString(d)){return c[d]||b}else{return d}}return b},applyConvert:function(b){var a=this.getType().convert;if(b&&b!==a){this._hasCustomConvert=true;return b}else{this._hasCustomConvert=false;return a}},hasCustomConvert:function(){return this._hasCustomConvert}});Ext.define("Ext.data.identifier.Simple",{alias:"data.identifier.simple",statics:{AUTO_ID:1},config:{prefix:"ext-record-"},constructor:function(a){this.initConfig(a)},generate:function(a){return this._prefix+this.self.AUTO_ID++}});Ext.define("Ext.data.ModelManager",{extend:Ext.AbstractManager,alternateClassName:["Ext.ModelMgr","Ext.ModelManager"],singleton:true,modelNamespace:null,registerType:function(c,b){var d=b.prototype,a;if(d&&d.isModel){a=b}else{b={extend:b.extend||"Ext.data.Model",config:b};a=Ext.define(c,b)}this.types[c]=a;return a},onModelDefined:Ext.emptyFn,getModel:function(b){var a=b;if(typeof a=="string"){a=this.types[a];if(!a&&this.modelNamespace){a=this.types[this.modelNamespace+"."+a]}}return a},create:function(c,b,d){var a=typeof b=="function"?b:this.types[b||c.name];return new a(c,d)}},function(){Ext.regModel=function(){return this.ModelManager.registerType.apply(this.ModelManager,arguments)}});Ext.define("Ext.data.Request",{config:{action:null,params:null,method:"GET",url:null,operation:null,proxy:null,disableCaching:false,headers:{},callbackKey:null,jsonP:null,jsonData:null,xmlData:null,withCredentials:null,username:null,password:null,callback:null,scope:null,timeout:30000,records:null,directFn:null,args:null,useDefaultXhrHeader:null},constructor:function(a){this.initConfig(a)}});Ext.define("Ext.data.proxy.Server",{extend:Ext.data.proxy.Proxy,alias:"proxy.server",alternateClassName:"Ext.data.ServerProxy",config:{url:null,pageParam:"page",startParam:"start",limitParam:"limit",groupParam:"group",sortParam:"sort",filterParam:"filter",directionParam:"dir",enablePagingParams:true,simpleSortMode:false,noCache:true,cacheString:"_dc",timeout:30000,api:{create:undefined,read:undefined,update:undefined,destroy:undefined},extraParams:{}},constructor:function(a){a=a||{};if(a.nocache!==undefined){a.noCache=a.nocache}this.callParent([a])},create:function(){return this.doRequest.apply(this,arguments)},read:function(){return this.doRequest.apply(this,arguments)},update:function(){return this.doRequest.apply(this,arguments)},destroy:function(){return this.doRequest.apply(this,arguments)},setExtraParam:function(a,b){this.getExtraParams()[a]=b},buildRequest:function(a){var c=this,d=Ext.applyIf(a.getParams()||{},c.getExtraParams()||{}),b;d=Ext.applyIf(d,c.getParams(a));b=Ext.create("Ext.data.Request",{params:d,action:a.getAction(),records:a.getRecords(),url:a.getUrl(),operation:a,proxy:c});b.setUrl(c.buildUrl(b));a.setRequest(b);return b},processResponse:function(k,b,d,c,j,l){var h=this,a=b.getAction(),f,i;if(k===true){f=h.getReader();try{i=f.process(h.getResponseResult(c))}catch(g){b.setException(g.message);h.fireEvent("exception",h,c,b);return}if(!b.getModel()){b.setModel(this.getModel())}if(b.process(a,i,d,c)===false){h.setException(b,c);h.fireEvent("exception",h,c,b)}}else{h.setException(b,c);h.fireEvent("exception",this,c,b)}if(typeof j=="function"){j.call(l||h,b)}h.afterRequest(d,k)},getResponseResult:function(a){return a},setException:function(b,a){if(Ext.isObject(a)){b.setException({status:a.status,statusText:a.statusText})}},applyEncoding:function(a){return Ext.encode(a)},encodeSorters:function(d){var b=[],c=d.length,a=0;for(;a0){if(o){h[e]=m[0].getProperty();h[b]=m[0].getDirection()}else{h[e]=n.encodeSorters(m)}}if(c&&f&&f.length>0){h[c]=n.encodeFilters(f)}return h},buildUrl:function(c){var b=this,a=b.getUrl(c);if(b.getNoCache()){a=Ext.urlAppend(a,Ext.String.format("{0}={1}",b.getCacheString(),Ext.Date.now()))}return a},getUrl:function(a){return a?a.getUrl()||this.getApi()[a.getAction()]||this._url:this._url},doRequest:function(){},afterRequest:Ext.emptyFn});Ext.define("Ext.data.proxy.Ajax",{extend:Ext.data.proxy.Server,alias:"proxy.ajax",alternateClassName:["Ext.data.HttpProxy","Ext.data.AjaxProxy"],config:{withCredentials:false,useDefaultXhrHeader:true,username:null,password:null,actionMethods:{create:"POST",read:"GET",update:"POST",destroy:"POST"},headers:{}},doRequest:function(a,f,b){var d=this,e=d.getWriter(),c=d.buildRequest(a);c.setConfig({headers:d.getHeaders(),timeout:d.getTimeout(),method:d.getMethod(c),callback:d.createRequestCallback(c,a,f,b),scope:d,proxy:d,useDefaultXhrHeader:d.getUseDefaultXhrHeader()});if(a.getWithCredentials()||d.getWithCredentials()){c.setWithCredentials(true);c.setUsername(d.getUsername());c.setPassword(d.getPassword())}c=e.write(c);Ext.Ajax.request(c.getCurrentConfig());return c},getMethod:function(a){return this.getActionMethods()[a.getAction()]},createRequestCallback:function(d,a,e,b){var c=this;return function(g,h,f){c.processResponse(h,a,d,f,e,b)}}});Ext.define("Ext.data.association.Association",{alternateClassName:"Ext.data.Association",config:{ownerModel:null,ownerName:undefined,associatedModel:null,associatedName:undefined,associationKey:undefined,primaryKey:"id",reader:null,type:null,name:undefined},statics:{create:function(a){if(!a.isAssociation){if(Ext.isString(a)){a={type:a}}a.type=a.type.toLowerCase();return Ext.factory(a,Ext.data.association.Association,null,"association")}return a}},constructor:function(a){this.initConfig(a)},applyName:function(a){if(!a){a=this.getAssociatedName()}return a},applyOwnerModel:function(a){var b=Ext.data.ModelManager.getModel(a);if(b===undefined){Ext.Logger.error("The configured ownerModel was not valid (you tried "+a+")")}return b},applyOwnerName:function(a){if(!a){a=this.getOwnerModel().modelName}a=a.slice(a.lastIndexOf(".")+1);return a},updateOwnerModel:function(a,b){if(b){this.setOwnerName(a.modelName)}},applyAssociatedModel:function(a){var b=Ext.data.ModelManager.types[a];if(b===undefined){Ext.Logger.error("The configured associatedModel was not valid (you tried "+a+")")}return b},applyAssociatedName:function(a){if(!a){a=this.getAssociatedModel().modelName}a=a.slice(a.lastIndexOf(".")+1);return a},updateAssociatedModel:function(b,a){if(a){this.setAssociatedName(b.modelName)}},applyReader:function(a){if(a){if(Ext.isString(a)){a={type:a}}if(!a.isReader){Ext.applyIf(a,{type:"json"})}}return Ext.factory(a,Ext.data.Reader,this.getReader(),"reader")},updateReader:function(a){a.setModel(this.getAssociatedModel())}});Ext.define("Ext.util.Inflector",{singleton:true,plurals:[[(/(quiz)$/i),"$1zes"],[(/^(ox)$/i),"$1en"],[(/([m|l])ouse$/i),"$1ice"],[(/(matr|vert|ind)ix|ex$/i),"$1ices"],[(/(x|ch|ss|sh)$/i),"$1es"],[(/([^aeiouy]|qu)y$/i),"$1ies"],[(/(hive)$/i),"$1s"],[(/(?:([^f])fe|([lr])f)$/i),"$1$2ves"],[(/sis$/i),"ses"],[(/([ti])um$/i),"$1a"],[(/(buffal|tomat|potat)o$/i),"$1oes"],[(/(bu)s$/i),"$1ses"],[(/(alias|status|sex)$/i),"$1es"],[(/(octop|vir)us$/i),"$1i"],[(/(ax|test)is$/i),"$1es"],[(/^person$/),"people"],[(/^man$/),"men"],[(/^(child)$/),"$1ren"],[(/s$/i),"s"],[(/$/),"s"]],singulars:[[(/(quiz)zes$/i),"$1"],[(/(matr)ices$/i),"$1ix"],[(/(vert|ind)ices$/i),"$1ex"],[(/^(ox)en/i),"$1"],[(/(alias|status)es$/i),"$1"],[(/(octop|vir)i$/i),"$1us"],[(/(cris|ax|test)es$/i),"$1is"],[(/(shoe)s$/i),"$1"],[(/(o)es$/i),"$1"],[(/(bus)es$/i),"$1"],[(/([m|l])ice$/i),"$1ouse"],[(/(x|ch|ss|sh)es$/i),"$1"],[(/(m)ovies$/i),"$1ovie"],[(/(s)eries$/i),"$1eries"],[(/([^aeiouy]|qu)ies$/i),"$1y"],[(/([lr])ves$/i),"$1f"],[(/(tive)s$/i),"$1"],[(/(hive)s$/i),"$1"],[(/([^f])ves$/i),"$1fe"],[(/(^analy)ses$/i),"$1sis"],[(/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i),"$1$2sis"],[(/([ti])a$/i),"$1um"],[(/(n)ews$/i),"$1ews"],[(/people$/i),"person"],[(/s$/i),""]],uncountable:["sheep","fish","series","species","money","rice","information","equipment","grass","mud","offspring","deer","means"],singular:function(b,a){this.singulars.unshift([b,a])},plural:function(b,a){this.plurals.unshift([b,a])},clearSingulars:function(){this.singulars=[]},clearPlurals:function(){this.plurals=[]},isTransnumeral:function(a){return Ext.Array.indexOf(this.uncountable,a)!=-1},pluralize:function(f){if(this.isTransnumeral(f)){return f}var e=this.plurals,d=e.length,a,c,b;for(b=0;ba)){return false}else{return true}},email:function(b,a){return Ext.data.validations.emailRe.test(a)},format:function(a,b){if(b===undefined||b===null){b=""}return !!(a.matcher&&a.matcher.test(b))},inclusion:function(a,b){return a.list&&Ext.Array.indexOf(a.list,b)!=-1},exclusion:function(a,b){return a.list&&Ext.Array.indexOf(a.list,b)==-1}});Ext.define("Ext.data.Model",{alternateClassName:"Ext.data.Record",mixins:{observable:Ext.mixin.Observable},isModel:true,config:{idProperty:"id",data:null,fields:undefined,validations:null,associations:null,hasMany:null,hasOne:null,belongsTo:null,proxy:null,identifier:{type:"simple"},clientIdProperty:"clientId",isErased:false,useCache:true},staticConfigs:["idProperty","fields","validations","associations","hasMany","hasOne","belongsTo","clientIdProperty","identifier","useCache","proxy"],statics:{EDIT:"edit",REJECT:"reject",COMMIT:"commit",cache:{},generateProxyMethod:function(a){return function(){var b=this.prototype;return b[a].apply(b,arguments)}},generateCacheId:function(b,c){var a;if(b&&b.isModel){a=b.modelName;if(c===undefined){c=b.getId()}}else{a=b}return a.replace(/\./g,"-").toLowerCase()+"-"+c}},inheritableStatics:{load:function(a,b,h){var f=this.getProxy(),i=this.getIdProperty(),e=null,d={},g,c;h=h||(b&&b.scope)||this;if(Ext.isFunction(b)){b={callback:b,scope:h}}d[i]=a;b=Ext.apply({},b);b=Ext.applyIf(b,{action:"read",params:d,model:this});c=Ext.create("Ext.data.Operation",b);if(!f){Ext.Logger.error("You are trying to load a model that doesn't have a Proxy specified")}g=function(j){if(j.wasSuccessful()){e=j.getRecords()[0]||null;Ext.callback(b.success,h,[e,j])}else{Ext.callback(b.failure,h,[e,j])}Ext.callback(b.callback,h,[e,j])};f.read(c,g,this)}},editing:false,dirty:false,phantom:false,constructor:function(f,h,c,g){var e=this,d=null,a=e.getUseCache(),b=e.getIdProperty();f=f||g||{};if(h||h===0){f[b]=e.internalId=h}h=f[b];if(a&&(h||h===0)){d=Ext.data.Model.cache[Ext.data.Model.generateCacheId(this,h)];if(d){d.raw=c||d.raw;return d.mergeData(g||f||{})}}e.modified={};e.raw=c||f||{};e.stores=[];if(g){e.setConvertedData(f)}else{e.setData(f)}e.id=e.getIdentifier().generate(e);h=e.data[b];if(!h&&h!==0){e.data[b]=e.internalId=e.id;e.phantom=true;if(this.associations.length){this.handleInlineAssociationData(f)}}else{this.internalId=h}if(a){Ext.data.Model.cache[Ext.data.Model.generateCacheId(e)]=e}if(this.init&&typeof this.init=="function"){this.init()}},mergeData:function(a){var h=this,f=h.getFields().items,g=f.length,l=h.modified,c=[],d=h.data,e,j,m,k,b;for(e=0;e0&&h.editing){this.endEdit(false,c)}return this},setData:function(a){var k=this,g=k.fields.items,h=g.length,f=Ext.isArray(a),d=k._data=k.data={},e,l,b,m,j,c;if(!a){return k}for(e=0;e0){b=n.data.items;k=b.length;o.length=0;for(p=0;p0){h=o.shift();Ext.apply(s[h.associationName][h.j],this.prepareAssociatedData(h.associatedRecord,h.ids,h.associationType))}}}else{if(t&&(f.toLowerCase()=="belongsto"||f.toLowerCase()=="hasone")){a=d[e.getInstanceName()];if(a!==undefined){l=a.id;if(Ext.Array.indexOf(m,l)===-1){m.push(l);s[u]=a.getData();Ext.apply(s[u],this.prepareAssociatedData(a,m,c))}}}}}return s},join:function(a){Ext.Array.include(this.stores,a)},unjoin:function(a){Ext.Array.remove(this.stores,a)},setDirty:function(){var b=this,a;b.dirty=true;b.fields.each(function(c){if(c.getPersist()){a=c.getName();b.modified[a]=b.get(a)}})},validate:function(){var j=Ext.create("Ext.data.Errors"),c=this.getValidations().items,e=Ext.data.Validations,b,d,h,a,g,f;if(c){b=c.length;for(f=0;ff)?1:((ba?1:(d0){b.create=f;g=true}if(d.length>0){b.update=d;g=true}if(a.length>0){b.destroy=a;g=true}if(g&&e.fireEvent("beforesync",this,b)!==false){e.getProxy().batch(Ext.merge({operations:b,listeners:e.getBatchListeners()},c||{}))}return{added:f,updated:d,removed:a}},first:function(){return this.data.first()},last:function(){return this.data.last()},sum:function(e){var d=0,c=0,b=this.data.items,a=b.length;for(;c0){c=b[0].get(f)}for(;d0){a=c[0].get(f)}for(;da){a=e}}return a},average:function(e){var c=0,b=this.data.items,a=b.length,d=0;if(b.length>0){for(;c=a.left&&b.right<=a.right&&b.top>=a.top&&b.bottom<=a.bottom)},intersect:function(g){var f=this,d=Math.max(f.top,g.top),e=Math.min(f.right,g.right),a=Math.min(f.bottom,g.bottom),c=Math.max(f.left,g.left);if(a>d&&e>c){return new Ext.util.Region(d,e,a,c)}else{return false}},union:function(g){var f=this,d=Math.min(f.top,g.top),e=Math.max(f.right,g.right),a=Math.max(f.bottom,g.bottom),c=Math.min(f.left,g.left);return new Ext.util.Region(d,e,a,c)},constrainTo:function(b){var a=this,c=Ext.util.Numbers.constrain;a.top=c(a.top,b.top,b.bottom);a.bottom=c(a.bottom,b.top,b.bottom);a.left=c(a.left,b.left,b.right);a.right=c(a.right,b.left,b.right);return a},adjust:function(e,b,a,d){var c=this;c.top+=e;c.left+=d;c.right+=b;c.bottom+=a;return c},getOutOfBoundOffset:function(a,b){if(!Ext.isObject(a)){if(a=="x"){return this.getOutOfBoundOffsetX(b)}else{return this.getOutOfBoundOffsetY(b)}}else{var c=new Ext.util.Offset();c.x=this.getOutOfBoundOffsetX(a.x);c.y=this.getOutOfBoundOffsetY(a.y);return c}},getOutOfBoundOffsetX:function(a){if(a<=this.left){return this.left-a}else{if(a>=this.right){return this.right-a}}return 0},getOutOfBoundOffsetY:function(a){if(a<=this.top){return this.top-a}else{if(a>=this.bottom){return this.bottom-a}}return 0},isOutOfBound:function(a,b){if(!Ext.isObject(a)){if(a=="x"){return this.isOutOfBoundX(b)}else{return this.isOutOfBoundY(b)}}else{b=a;return(this.isOutOfBoundX(b.x)||this.isOutOfBoundY(b.y))}},isOutOfBoundX:function(a){return(athis.right)},isOutOfBoundY:function(a){return(athis.bottom)},restrict:function(b,d,a){if(Ext.isObject(b)){var c;a=d;d=b;if(d.copy){c=d.copy()}else{c={x:d.x,y:d.y}}c.x=this.restrictX(d.x,a);c.y=this.restrictY(d.y,a);return c}else{if(b=="x"){return this.restrictX(d,a)}else{return this.restrictY(d,a)}}},restrictX:function(b,a){if(!a){a=1}if(b<=this.left){b-=(b-this.left)*a}else{if(b>=this.right){b-=(b-this.right)*a}}return b},restrictY:function(b,a){if(!a){a=1}if(b<=this.top){b-=(b-this.top)*a}else{if(b>=this.bottom){b-=(b-this.bottom)*a}}return b},getSize:function(){return{width:this.right-this.left,height:this.bottom-this.top}},copy:function(){return new Ext.util.Region(this.top,this.right,this.bottom,this.left)},toString:function(){return"Region["+this.top+","+this.right+","+this.bottom+","+this.left+"]"},translateBy:function(a){this.left+=a.x;this.right+=a.x;this.top+=a.y;this.bottom+=a.y;return this},round:function(){this.top=Math.round(this.top);this.right=Math.round(this.right);this.bottom=Math.round(this.bottom);this.left=Math.round(this.left);return this},equals:function(a){return(this.top==a.top&&this.right==a.right&&this.bottom==a.bottom&&this.left==a.left)}});Ext.define("Ext.event.publisher.Publisher",{targetType:"",idSelectorRegex:/^#([\w\-]+)$/i,constructor:function(){var b=this.handledEvents,a,c,e,d;a=this.handledEventsMap={};for(c=0,e=b.length;c1){for(c=a.length;b0){f.timeout=setTimeout(Ext.bind(i.handleTimeout,i,[f]),l)}i.setupErrorHandling(f);i[k]=Ext.bind(i.handleResponse,i,[f],true);i.loadScript(f);return f},abort:function(b){var c=this.requests,a;if(b){if(!b.id){b=c[b]}this.handleAbort(b)}else{for(a in c){if(c.hasOwnProperty(a)){this.abort(c[a])}}}},setupErrorHandling:function(a){a.script.onerror=Ext.bind(this.handleError,this,[a])},handleAbort:function(a){a.errorType="abort";this.handleResponse(null,a)},handleError:function(a){a.errorType="error";this.handleResponse(null,a)},cleanupErrorHandling:function(a){a.script.onerror=null},handleTimeout:function(a){a.errorType="timeout";this.handleResponse(null,a)},handleResponse:function(a,b){var c=true;if(b.timeout){clearTimeout(b.timeout)}delete this[b.callbackName];delete this.requests[b.id];this.cleanupErrorHandling(b);Ext.fly(b.script).destroy();if(b.errorType){c=false;Ext.callback(b.failure,b.scope,[b.errorType,b])}else{Ext.callback(b.success,b.scope,[a,b])}Ext.callback(b.callback,b.scope,[c,a,b.errorType,b])},createScript:function(c,d,b){var a=document.createElement("script");a.setAttribute("src",Ext.urlAppend(c,Ext.Object.toQueryString(d)));a.setAttribute("async",true);a.setAttribute("type","text/javascript");return a},loadScript:function(a){Ext.getHead().appendChild(a.script)}});Ext.define("Ext.data.JsonStore",{extend:Ext.data.Store,alias:"store.json",config:{proxy:{type:"ajax",reader:"json",writer:"json"}}});Ext.define("Ext.data.NodeInterface",{alternateClassName:"Ext.data.Node",statics:{decorate:function(d){if(!d.isNode){var g=Ext.data.ModelManager,c=d.modelName,e=g.getModel(c),b=[],f,h,a;e.override(this.getPrototypeBody());b=this.applyFields(e,[{name:"parentId",type:"string",defaultValue:null},{name:"index",type:"int",defaultValue:0},{name:"depth",type:"int",defaultValue:0,persist:false},{name:"expanded",type:"bool",defaultValue:false,persist:false},{name:"expandable",type:"bool",defaultValue:true,persist:false},{name:"checked",type:"auto",defaultValue:null},{name:"leaf",type:"bool",defaultValue:false,persist:false},{name:"cls",type:"string",defaultValue:null,persist:false},{name:"iconCls",type:"string",defaultValue:null,persist:false},{name:"root",type:"boolean",defaultValue:false,persist:false},{name:"isLast",type:"boolean",defaultValue:false,persist:false},{name:"isFirst",type:"boolean",defaultValue:false,persist:false},{name:"allowDrop",type:"boolean",defaultValue:true,persist:false},{name:"allowDrag",type:"boolean",defaultValue:true,persist:false},{name:"loaded",type:"boolean",defaultValue:false,persist:false},{name:"loading",type:"boolean",defaultValue:false,persist:false},{name:"href",type:"string",defaultValue:null,persist:false},{name:"hrefTarget",type:"string",defaultValue:null,persist:false},{name:"qtip",type:"string",defaultValue:null,persist:false},{name:"qtitle",type:"string",defaultValue:null,persist:false}]);a=b.length;e.getFields().isDirty=true;for(f=0;f0},isExpandable:function(){var a=this;if(a.get("expandable")){return !(a.isLeaf()||(a.isLoaded()&&!a.hasChildNodes()))}return false},appendChild:function(b,j,h){var f=this,c,e,d,g,a;if(Ext.isArray(b)){for(c=0,e=b.length;c0){Ext.Array.sort(d,f);for(c=0;ce){return 1}else{if(fa.data.index)?1:-1},applyFilters:function(b){var a=this;return function(c){return a.isVisible(c)}},applyProxy:function(a){},applyNode:function(a){if(a){a=Ext.data.NodeInterface.decorate(a)}return a},updateNode:function(a,c){if(c&&!c.isDestroyed){c.un({append:"onNodeAppend",insert:"onNodeInsert",remove:"onNodeRemove",load:"onNodeLoad",scope:this});c.unjoin(this)}if(a){a.on({scope:this,append:"onNodeAppend",insert:"onNodeInsert",remove:"onNodeRemove",load:"onNodeLoad"});a.join(this);var b=[];if(a.childNodes.length){b=b.concat(this.retrieveChildNodes(a))}if(this.getRootVisible()){b.push(a)}else{if(a.isLoaded()||a.isLoading()){a.set("expanded",true)}}this.data.clear();this.fireEvent("clear",this);this.suspendEvents();this.add(b);this.resumeEvents();if(b.length===0){this.loaded=a.loaded=true}this.fireEvent("refresh",this,this.data)}},retrieveChildNodes:function(a){var d=this.getNode(),b=this.getRecursive(),c=[],e=a;if(!a.childNodes.length||(!b&&a!==d)){return c}if(!b){return a.childNodes}while(e){if(e._added){delete e._added;if(e===a){break}else{e=e.nextSibling||e.parentNode}}else{if(e!==a){c.push(e)}if(e.firstChild){e._added=true;e=e.firstChild}else{e=e.nextSibling||e.parentNode}}}return c},isVisible:function(b){var a=b.parentNode;if(!this.getRecursive()&&a!==this.getNode()){return false}while(a){if(!a.isExpanded()){return false}if(a===this.getNode()){break}a=a.parentNode}return true}});Ext.define("Ext.data.TreeStore",{extend:Ext.data.NodeStore,alias:"store.tree",config:{root:undefined,clearOnLoad:true,nodeParam:"node",defaultRootId:"root",defaultRootProperty:"children",recursive:true},applyProxy:function(){return Ext.data.Store.prototype.applyProxy.apply(this,arguments)},applyRoot:function(a){var b=this;a=a||{};a=Ext.apply({},a);if(!a.isModel){Ext.applyIf(a,{id:b.getStoreId()+"-"+b.getDefaultRootId(),text:"Root",allowDrag:false});a=Ext.data.ModelManager.create(a,b.getModel())}Ext.data.NodeInterface.decorate(a);a.set(a.raw);return a},handleTreeInsertionIndex:function(a,b,d,c){if(b.parentNode){b.parentNode.sort(d.getSortFn(),true,true)}return this.callParent(arguments)},handleTreeSort:function(a,b){if(this._sorting){return a}this._sorting=true;this.getNode().sort(b.getSortFn(),true,true);delete this._sorting;return this.callParent(arguments)},updateRoot:function(a,b){if(b){b.unBefore({expand:"onNodeBeforeExpand",scope:this});b.unjoin(this)}a.onBefore({expand:"onNodeBeforeExpand",scope:this});this.onNodeAppend(null,a);this.setNode(a);if(!a.isLoaded()&&!a.isLoading()&&a.isExpanded()){this.load({node:a})}this.fireEvent("rootchange",this,a,b)},getNodeById:function(a){return this.data.getByKey(a)},getById:function(a){return this.data.getByKey(a)},onNodeBeforeExpand:function(b,a,c){if(b.isLoading()){c.pause();this.on("load",function(){c.resume()},this,{single:true})}else{if(!b.isLoaded()){c.pause();this.load({node:b,callback:function(){c.resume()}})}}},onNodeAppend:function(n,c){var l=this.getProxy(),j=l.getReader(),b=this.getModel(),g=c.raw,d=[],a=j.getRootProperty(),m,h,f,k,e;if(!c.isLeaf()){m=j.getRoot(g);if(m){h=j.extractData(m);for(f=0,k=h.length;f>>16)&4095)|(a<<12),4);e[3]=c.toHex(128|((c.clockSeq>>>8)&63),2)+c.toHex(c.clockSeq&255,2);e[4]=c.toHex(b.hi,4)+c.toHex(b.lo,8);if(a==4){c.init()}else{++d.lo;if(d.lo>=c.twoPow32){d.lo=0;++d.hi}}return e.join("-").toLowerCase()},init:function(){var b=this,a=b.getSalt(),c=b.getTimestamp();if(b.getVersion()==4){b.clockSeq=b.rand(0,b.twoPow14-1);if(!a){a={};b.setSalt(a)}if(!c){c={};b.setTimestamp(c)}a.lo=b.rand(0,b.twoPow32-1);a.hi=b.rand(0,b.twoPow16-1);c.lo=b.rand(0,b.twoPow32-1);c.hi=b.rand(0,b.twoPow28-1)}else{b.setSalt(b.split(b.getSalt()));b.setTimestamp(b.split(b.getTimestamp()));b.getSalt().hi|=256}},twoPow14:Math.pow(2,14),twoPow16:Math.pow(2,16),twoPow28:Math.pow(2,28),twoPow32:Math.pow(2,32),toHex:function(c,b){var a=c.toString(16);if(a.length>b){a=a.substring(a.length-b)}else{if(a.length0?n:null)}},function(w,v){f++;n.push({clientId:u,error:v});if(f===l&&typeof o=="function"){o.call(q||m,r,n)}})})},selectRecords:function(p,t,c,b){var u=this,s=u.getTable(),f=u.getModel().getIdProperty(),r="SELECT * FROM "+s,q=[],a=" WHERE ",l=" ORDER BY ",o,g,v,k,e,h,j,n,d,m;k=new Ext.data.ResultSet({records:q,success:true});if(!Ext.isObject(t)){r+=a+f+" = "+t}else{g=t.filters&&t.filters.length;if(g){for(o=0;o0?k:null)}},function(v,u){f++;k.push({clientId:t,error:u});if(f===h&&typeof l=="function"){l.call(o||j,p,k)}})})},destroyRecords:function(b,c,k,m){var h=this,l=h.getTable(),n=h.getModel().getIdProperty(),a=[],j=[],d=[],e,g,o,f;for(e=0,g=c.length;e")}for(;c");for(j in k){if(k.hasOwnProperty(j)){d.push("<",j,">",k[j],"")}}d.push("")}if(h){d.push("")}a.setXmlData(d.join(""));return a}});Ext.define("Ext.dataview.IndexBar",{extend:Ext.Component,alternateClassName:"Ext.IndexBar",config:{baseCls:Ext.baseCSSPrefix+"indexbar",direction:"vertical",letters:["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"],ui:"alphabet",listPrefix:null},platformConfig:[{theme:["Blackberry","Blackberry103"],direction:"vertical",letters:["*","#","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]}],itemCls:Ext.baseCSSPrefix+"",updateDirection:function(a,c){var b=this.getBaseCls();this.element.replaceCls(b+"-"+c,b+"-"+a)},getElementConfig:function(){if(Ext.theme.is.Blackberry||Ext.theme.is.Blackberry103){return{reference:"wrapper",classList:["x-centered","x-indexbar-wrapper"],children:[{reference:"indicator",classList:["x-indexbar-indicator"],hidden:true,children:[{reference:"indicatorInner",classList:["x-indexbar-indicator-inner"]}]},this.callParent()]}}else{return{reference:"wrapper",classList:["x-centered","x-indexbar-wrapper"],children:[this.callParent()]}}},updateLetters:function(c){this.innerElement.setHtml("");if(c){var b=c.length,a;for(a=0;ah.bottom||a.yh.right||a.xb[a-1]){return a-1}while(f+1>1,e=b[c];if(e==d){return c}else{if(em){l=m-j;if(lk){break}q=d.shift();d.push(q);n.updateListItem(q,a,c);n.topRenderedIndex++}}}}}},onAnimationIdle:function(){var m=this,d=m.getListItemInfo(),c=m.getBufferSize(),k=m.topVisibleIndex,h=m.topRenderedIndex,j=m.getStore().getCount()-1,f=m.listItems,o=f.length,b,e,g,l,n,a;b=k-h;e=h+c-k;if(b0){l=e-b;for(g=0;gj){break}n=f.shift();f.push(n);m.updateListItem(n,a,d);m.topRenderedIndex++}}m.handleItemHeights();m.handleItemTransforms();m.onIdleBound=false},handleItemHeights:function(){var n=this,e=n.updatedItems,k=e.length,f=n.getItemMap(),b=n.getUseSimpleItems(),r=f.getMinimumHeight(),q=n.headerIndices,l=n.headerMap,c=n.getVariableHeights(),a,h,g,m,p,o,d;for(h=0;h=0||(b===0&&d+m>=0)||(b===0&&-m<=k[b])){g=-10000}else{if(j<0){g=j}else{g=Math.max(0,m)}}a=n.getGroupString(i);if(c.$currentHeader!=a){c.setHtml(a);c.$currentHeader=a}if(c.$position!=g){c.translate(0,g);c.$position=g}}},createItem:function(c){var h=this,a=h.container,d=h.listItems,f=h.getInfinite(),g=h.scrollElement,i,e,b;i=Ext.factory(c);i.dataview=h;i.$height=c.minHeight;if(!f){b=h.getBaseCls()+"-item-relative";i.addCls(b)}e=i.getHeader();if(!f){e.addCls(b)}else{e.setTranslatable({translationMethod:this.translationMethod});e.translate(0,-10000);g.insertFirst(e.renderElement)}a.doAdd(i);d.push(i);return i},setItemsCount:function(a){var d=this,e=d.listItems,b=d.getListItemConfig(),f=a-e.length,c;for(c=0;c=0){l[b]=true}}l[d-1]=true;return m},onIndex:function(c,f){var h=this,l=f.toLowerCase(),j=h.getStore(),d=j.getGroups(),g=d.length,k,e,b,a;for(e=0;e=l){b=k;break}else{b=k}}if(b){this.scrollToRecord(b.children[0])}},scrollToRecord:function(f,b,c){var i=this,g=i.container.getScrollable().getScroller(),j=i.getStore(),h=j.indexOf(f);g.stopAnimation();var a=g.getContainerSize().y,l=g.getSize().y,d=l-a,e,k;if(i.getInfinite()){e=i.getItemMap().map[h]}else{k=i.listItems[h];if(k.getHeader().isPainted()){e=k.getHeader().renderElement.dom.offsetTop}else{e=k.renderElement.dom.offsetTop}}if(!c){e=Math.min(e,d)}g.scrollTo(0,e,!!b)},onItemAdd:function(c){var b=this,a=c.config;if(a.scrollDock){if(a.scrollDock=="bottom"){b.scrollDockItems.bottom.push(c)}else{b.scrollDockItems.top.push(c)}if(b.getInfinite()){c.on({resize:"onScrollDockItemResize",scope:this});c.addCls(b.getBaseCls()+"-scrolldockitem");c.setTranslatable({translationMethod:this.translationMethod});c.translate(0,-10000);c.$scrollDockHeight=0}b.container.doAdd(c)}else{b.callParent(arguments)}},getScrollDockedItems:function(){return this.scrollDockItems.bottom.slice().concat(this.scrollDockItems.top.slice())},onScrollDockItemResize:function(g,c){var f=this,a=f.listItems,e=a.length,b,d;Ext.getCmp(g.id).$scrollDockHeight=c.height;for(b=0;b class="x-list-item-leaf">'+a.getItemTextTpl(b)+""},this.getListConfig())}},function(){});Ext.define("Ext.dataview.element.List",{extend:Ext.dataview.element.Container,updateBaseCls:function(a){var b=this;b.itemClsShortCache=a+"-item";b.headerClsShortCache=a+"-header";b.headerClsCache="."+b.headerClsShortCache;b.headerItemClsShortCache=a+"-header-item";b.footerClsShortCache=a+"-footer-item";b.footerClsCache="."+b.footerClsShortCache;b.labelClsShortCache=a+"-item-label";b.labelClsCache="."+b.labelClsShortCache;b.disclosureClsShortCache=a+"-disclosure";b.disclosureClsCache="."+b.disclosureClsShortCache;b.iconClsShortCache=a+"-icon";b.iconClsCache="."+b.iconClsShortCache;this.callParent(arguments)},hiddenDisplayCache:Ext.baseCSSPrefix+"hidden-display",getItemElementConfig:function(e,h){var f=this,c=f.dataview,g=c.getItemCls(),b=f.itemClsShortCache,d,a;if(g){b+=" "+g}d={cls:b,children:[{cls:f.labelClsShortCache,html:c.getItemTpl().apply(h)}]};if(c.getIcon()){a=h.iconSrc;d.children.push({cls:f.iconClsShortCache,style:"background-image: "+a?'url("'+newSrc+'")':""})}if(c.getOnItemDisclosure()){d.children.push({cls:f.disclosureClsShortCache+" "+((h[c.getDisclosureProperty()]===false)?f.hiddenDisplayCache:"")})}return d},updateListItem:function(d,k){var h=this,e=h.dataview,j=Ext.fly(k),g=j.down(h.labelClsCache,true),c=e.prepareData(d.getData(true),e.getStore().indexOf(d),d),b=e.getDisclosureProperty(),a=c&&c.hasOwnProperty(b),l=c&&c.hasOwnProperty("iconSrc"),f,i;g.innerHTML=e.getItemTpl().apply(c);if(a){f=j.down(h.disclosureClsCache);f[c[b]===false?"addCls":"removeCls"](h.hiddenDisplayCache)}if(e.getIcon()){i=j.down(h.iconClsCache,true);i.style.backgroundImage=l?'url("'+l+'")':""}},doRemoveHeaders:function(){var e=this,a=e.headerItemClsShortCache,b=e.element.query(e.headerClsCache),f=b.length,c=0,d;for(;c0){if(a){for(c=0,d=a.length;c0){this.sendRequest(b==1?a[0]:a);this.callBuffer=[]}},configureFormRequest:function(e,a,b,h,i){var g=this,c,f,d;c=new Ext.direct.Transaction({provider:g,action:e,method:a.getName(),args:[b,h,i],callback:i&&Ext.isFunction(h)?Ext.Function.bind(h,i):h,isForm:true});if(g.fireEvent("beforecall",g,c,a)!==false){Ext.direct.Manager.addTransaction(c);f=String(b.getAttribute("enctype")).toLowerCase()=="multipart/form-data";d={extTID:c.id,extAction:e,extMethod:a.getName(),extType:"rpc",extUpload:String(f)};Ext.apply(c,{form:Ext.getDom(b),isUpload:f,params:h&&Ext.isObject(h.params)?Ext.apply(d,h.params):d});g.fireEvent("call",g,c,a);g.sendFormRequest(c)}},sendFormRequest:function(b){var a=this;Ext.Ajax.request({url:a.getUrl(),params:b.params,callback:a.onData,scope:a,form:b.form,isUpload:b.isUpload,transaction:b})}});Ext.define("Ext.dom.CompositeElement",{alternateClassName:"Ext.CompositeElement",extend:Ext.dom.CompositeElementLite,getElement:function(a){return a},transformElement:function(a){return Ext.get(a)}});Ext.define("Ext.event.Event",{alternateClassName:"Ext.EventObject",isStopped:false,set:function(a,b){if(arguments.length===1&&typeof a!="string"){var c=a;for(a in c){if(c.hasOwnProperty(a)){this[a]=c[a]}}}else{this[a]=c[a]}},stopEvent:function(){return this.stopPropagation()},stopPropagation:function(){this.isStopped=true;return this}});Ext.define("Ext.event.Dom",{extend:Ext.event.Event,constructor:function(a){var c=a.target,b;if(c&&c.nodeType!==1){c=c.parentNode}b=a.changedTouches;if(b){b=b[0];this.pageX=b.pageX;this.pageY=b.pageY}else{this.pageX=a.pageX;this.pageY=a.pageY}this.browserEvent=this.event=a;this.target=this.delegatedTarget=c;this.type=a.type;this.timeStamp=this.time=+a.timeStamp;return this},stopEvent:function(){this.preventDefault();return this.callParent()},preventDefault:function(){this.browserEvent.preventDefault()},getPageX:function(){return this.pageX||this.browserEvent.pageX},getPageY:function(){return this.pageY||this.browserEvent.pageY},getXY:function(){if(!this.xy){this.xy=[this.getPageX(),this.getPageY()]}return this.xy},getTarget:function(b,c,a){if(arguments.length===0){return this.delegatedTarget}return b?Ext.fly(this.target).findParent(b,c,a):(a?Ext.get(this.target):this.target)},getTime:function(){return this.time},setDelegatedTarget:function(a){this.delegatedTarget=a},makeUnpreventable:function(){this.browserEvent.preventDefault=Ext.emptyFn}});Ext.define("Ext.event.Touch",{extend:Ext.event.Dom,constructor:function(b,c,a,h){var f=[],d,e,j,g;if(c){this.set(c)}this.changedTouches=this.cloneTouches(b.changedTouches,a);for(e=0,j=h.length;e(?:[\s]*)|(?:\s*))([\w\-]+)$/i,handledEvents:["*"],getSubscribers:function(b,a){var d=this.subscribers,c=d[b];if(!c&&a){c=d[b]={type:{$length:0},selector:[],$length:0}}return c},subscribe:function(g,f){if(this.idSelectorRegex.test(g)){return false}var e=g.match(this.optimizedSelectorRegex),a=this.getSubscribers(f,true),k=a.type,c=a.selector,d,i,j,b,h;if(e!==null){d=e[1];i=e[2].indexOf(">")===-1;j=e[3];b=k[j];if(!b){k[j]=b={descendents:{$length:0},children:{$length:0},$length:0}}h=i?b.descendents:b.children;if(h.hasOwnProperty(d)){h[d]++;return true}h[d]=1;h.$length++;b.$length++;k.$length++}else{if(c.hasOwnProperty(g)){c[g]++;return true}c[g]=1;c.push(g)}a.$length++;return true},unsubscribe:function(g,f,k){var a=this.getSubscribers(f);if(!a){return false}var e=g.match(this.optimizedSelectorRegex),l=a.type,c=a.selector,d,i,j,b,h;k=Boolean(k);if(e!==null){d=e[1];i=e[2].indexOf(">")===-1;j=e[3];b=l[j];if(!b){return true}h=i?b.descendents:b.children;if(!h.hasOwnProperty(d)||(!k&&--h[d]>0)){return true}delete h[d];h.$length--;b.$length--;l.$length--}else{if(!c.hasOwnProperty(g)||(!k&&--c[g]>0)){return true}delete c[g];Ext.Array.remove(c,g)}if(--a.$length===0){delete this.subscribers[f]}return true},notify:function(d,a){var c=this.getSubscribers(a),e,b;if(!c||c.$length===0){return false}e=d.substr(1);b=Ext.ComponentManager.get(e);if(b){this.dispatcher.doAddListener(this.targetType,d,a,"publish",this,{args:[a,b]},"before")}},matchesSelector:function(b,a){return Ext.ComponentQuery.is(b,a)},dispatch:function(d,b,c,a){this.dispatcher.doDispatchEvent(this.targetType,d,b,c,null,a)},publish:function(g,k){var e=this.getSubscribers(g);if(!e){return}var p=arguments[arguments.length-1],o=e.type,b=e.selector,d=Array.prototype.slice.call(arguments,2,-2),l=k.xtypesChain,s,n,t,a,m,v,r,u,h,f,q,c;for(u=0,h=l.length;u0){s=e.descendents;if(s.$length>0){if(!a){a=k.getAncestorIds()}for(q=0,c=a.length;q0){if(!t){if(a){t=a[0]}else{v=k.getParent();if(v){t=v.getId()}}}if(t){if(n.hasOwnProperty(t)){this.dispatch("#"+t+" > "+f,g,d,p)}}}}}h=b.length;if(h>0){for(u=0;u0)){return true}delete d[f];if(--d.$length===0){delete this.subscribers[a]}return true},onBeforeComponentRenderedChange:function(b,d,g){var f=this.eventNames,c=g?f.painted:f.erased,e=this.getSubscribers(c),a;if(e&&e.$length>0){this.renderedQueue[d.getId()]=a=[];this.publish(e,d,c,a)}},onBeforeComponentHiddenChange:function(c,d){var f=this.eventNames,b=d?f.erased:f.painted,e=this.getSubscribers(b),a;if(e&&e.$length>0){this.hiddenQueue[c.getId()]=a=[];this.publish(e,c,b,a)}},onComponentRenderedChange:function(b,c){var d=this.renderedQueue,e=c.getId(),a;if(!d.hasOwnProperty(e)){return}a=d[e];delete d[e];if(a.length>0){this.dispatchQueue(a)}},onComponentHiddenChange:function(c){var b=this.hiddenQueue,d=c.getId(),a;if(!b.hasOwnProperty(d)){return}a=b[d];delete b[d];if(a.length>0){this.dispatchQueue(a)}},dispatchQueue:function(g){var l=this.dispatcher,a=this.targetType,b=this.eventNames,e=g.slice(),f=e.length,c,k,h,d,j;g.length=0;if(f>0){for(c=0;c0)){return true}delete a[f];d[g][f].destroy();delete d[g][f];if(--a.$length===0){delete d[g];delete this.subscribers[g];i.removeListener(b,g,"painted","onComponentPainted",this,"before")}return true},onComponentPainted:function(b){var c=b.getObservableId(),a=this.sizeMonitors[c];if(a.resize){a.resize.refresh()}if(a.innerresize){a.innerresize.refresh()}},onComponentSizeChange:function(b,c,a){this.dispatcher.doDispatchEvent(this.targetType,c,a,[b])}});Ext.define("Ext.event.publisher.Dom",{extend:Ext.event.publisher.Publisher,targetType:"element",idOrClassSelectorRegex:/^([#|\.])([\w\-]+)$/,handledEvents:["focus","blur","paste","input","change","keyup","keydown","keypress","submit","transitionend","animationstart","animationend"],classNameSplitRegex:/\s+/,SELECTOR_ALL:"*",constructor:function(){var f=this.getHandledEvents(),e={},b,c,a,d;this.doBubbleEventsMap={click:true,submit:true,mousedown:true,mousemove:true,mouseup:true,mouseover:true,mouseout:true,transitionend:true};this.onEvent=Ext.Function.bind(this.onEvent,this);for(b=0,c=f.length;b0)){return true}delete c[i];c.$length--}else{if(!d.hasOwnProperty(i)||(!j&&--d[i]>0)){return true}delete d[i];d.$length--}}else{if(g===this.SELECTOR_ALL){if(j){a.all=0}else{a.all--}}else{if(!b.hasOwnProperty(g)||(!j&&--b[g]>0)){return true}delete b[g];Ext.Array.remove(b,g)}}a.$length--;return true},getElementTarget:function(a){if(a.nodeType!==1){a=a.parentNode;if(!a||a.nodeType!==1){return null}}return a},getBubblingTargets:function(b){var a=[];if(!b){return a}do{a[a.length]=b;b=b.parentNode}while(b&&b.nodeType===1);return a},dispatch:function(c,a,b){b.push(b[0].target);this.callParent(arguments)},publish:function(b,a,c){var d=this.getSubscribers(b),e;if(d.$length===0||!this.doPublish(d,b,a,c)){e=this.getSubscribers("*");if(e.$length>0){this.doPublish(e,b,a,c)}}return this},doPublish:function(f,h,x,u){var r=f.id,g=f.className,b=f.selector,p=r.$length>0,a=g.$length>0,l=b.length>0,o=f.all>0,y={},e=[u],q=false,m=this.classNameSplitRegex,v,k,t,d,z,n,c,w,s;for(v=0,k=x.length;v0)){return true}delete d[f];this.monitors[f].destroy();delete this.monitors[f];return true},onElementPainted:function(b,a){Ext.TaskQueue.requestRead("dispatch",this,[b,"painted",[a]])}});Ext.define("Ext.mixin.Templatable",{extend:Ext.mixin.Mixin,mixinConfig:{id:"templatable"},referenceAttributeName:"reference",referenceSelector:"[reference]",getElementConfig:function(){return{reference:"element"}},getElementTemplate:function(){var a=document.createDocumentFragment();a.appendChild(Ext.Element.create(this.getElementConfig(),true));return a},initElement:function(){var a=this.self.prototype;a.elementTemplate=this.getElementTemplate();a.initElement=a.doInitElement;this.initElement.apply(this,arguments)},linkElement:function(a,b){this.link(a,b)},doInitElement:function(){var g=this.referenceAttributeName,c,d,e,f,b,a;c=this.elementTemplate.cloneNode(true);d=c.querySelectorAll(this.referenceSelector);for(e=0,f=d.length;e0){c.width=b;c.height=j;c.contentWidth=a;c.contentHeight=i;c.flag=g;e=true;this.getCallback().apply(this.getScope(),this.getArgs())}return e},refresh:function(a){if(this.refreshSize()||a){Ext.TaskQueue.requestWrite("refreshMonitors",this)}},destroy:function(){var a=this.getElement();this.bindListeners(false);if(a&&!a.isDestroyed){a.removeCls("x-size-monitored")}delete this._element;this.callSuper()}});Ext.define("Ext.util.sizemonitor.Default",{extend:Ext.util.sizemonitor.Abstract,updateElement:function(a){},bindListeners:function(b){var a=this.getElement().dom;if(!a){return}if(b){a.onresize=this.refresh}else{delete a.onresize}},getContentBounds:function(){return this.getElement().dom.getBoundingClientRect()},getContentWidth:function(){return this.getElement().getWidth()},getContentHeight:function(){return this.getElement().getHeight()}});Ext.define("Ext.util.sizemonitor.Scroll",{extend:Ext.util.sizemonitor.Abstract,getElementConfig:function(){return{reference:"detectorsContainer",classList:["x-size-monitors","scroll"],children:[{reference:"expandMonitor",className:"expand"},{reference:"shrinkMonitor",className:"shrink"}]}},constructor:function(a){this.onScroll=Ext.Function.bind(this.onScroll,this);this.callSuper(arguments)},bindListeners:function(b){var a=b?"addEventListener":"removeEventListener";this.expandMonitor[a]("scroll",this.onScroll,true);this.shrinkMonitor[a]("scroll",this.onScroll,true)},forceRefresh:function(){Ext.TaskQueue.requestRead("refresh",this,[true])},onScroll:function(){Ext.TaskQueue.requestRead("refresh",this)},refreshMonitors:function(){var b=this.expandMonitor,c=this.shrinkMonitor,a=1000000;if(b&&!b.isDestroyed){b.scrollLeft=a;b.scrollTop=a}if(c&&!c.isDestroyed){c.scrollLeft=a;c.scrollTop=a}}});Ext.define("Ext.util.sizemonitor.OverflowChange",{extend:Ext.util.sizemonitor.Abstract,constructor:function(a){this.onExpand=Ext.Function.bind(this.onExpand,this);this.onShrink=Ext.Function.bind(this.onShrink,this);this.callSuper(arguments)},getElementConfig:function(){return{reference:"detectorsContainer",classList:["x-size-monitors","overflowchanged"],children:[{reference:"expandMonitor",className:"expand",children:[{reference:"expandHelper"}]},{reference:"shrinkMonitor",className:"shrink",children:[{reference:"shrinkHelper"}]}]}},bindListeners:function(b){var a=b?"addEventListener":"removeEventListener";this.expandMonitor[a](Ext.browser.is.Firefox?"underflow":"overflowchanged",this.onExpand,true);this.shrinkMonitor[a](Ext.browser.is.Firefox?"overflow":"overflowchanged",this.onShrink,true)},onExpand:function(a){if(Ext.browser.is.Webkit&&a.horizontalOverflow&&a.verticalOverflow){return}Ext.TaskQueue.requestRead("refresh",this)},onShrink:function(a){if(Ext.browser.is.Webkit&&!a.horizontalOverflow&&!a.verticalOverflow){return}Ext.TaskQueue.requestRead("refresh",this)},refreshMonitors:function(){if(this.isDestroyed){return}var f=this.expandHelper,e=this.shrinkHelper,b=this.getContentBounds(),d=b.width,a=b.height,c;if(f&&!f.isDestroyed){c=f.style;c.width=(d+1)+"px";c.height=(a+1)+"px"}if(e&&!e.isDestroyed){c=e.style;c.width=d+"px";c.height=a+"px"}Ext.TaskQueue.requestRead("refresh",this)}});Ext.define("Ext.util.SizeMonitor",{constructor:function(a){var b=Ext.util.sizemonitor;if(Ext.browser.is.Firefox){return new b.OverflowChange(a)}else{if(Ext.browser.is.WebKit||Ext.browser.is.IE11){return new b.Scroll(a)}else{return new b.Default(a)}}}});Ext.define("Ext.event.publisher.ElementSize",{extend:Ext.event.publisher.Publisher,targetType:"element",handledEvents:["resize"],constructor:function(){this.monitors={};this.callSuper(arguments)},subscribe:function(e){var b=e.match(this.idSelectorRegex),d=this.subscribers,f,c,a;if(!b){return false}f=b[1];if(d.hasOwnProperty(f)){d[f]++;return true}d[f]=1;c=Ext.get(f);this.monitors[f]=a=new Ext.util.SizeMonitor({element:c,callback:this.onElementResize,scope:this,args:[e,c]});this.dispatcher.addListener("element",e,"painted","forceRefresh",a);return true},unsubscribe:function(g,a,e){var c=g.match(this.idSelectorRegex),f=this.subscribers,d=this.monitors,h,b;if(!c){return false}h=c[1];if(!f.hasOwnProperty(h)||(!e&&--f[h]>0)){return true}delete f[h];b=d[h];this.dispatcher.removeListener("element",g,"painted","forceRefresh",b);b.destroy();delete d[h];return true},onElementResize:function(c,a,b){Ext.TaskQueue.requestRead("dispatch",this,[c,"resize",[a,b]])}});Ext.define("Ext.event.publisher.TouchGesture",{extend:Ext.event.publisher.Dom,isNotPreventable:/^(select|a)$/i,handledEvents:["touchstart","touchmove","touchend","touchcancel"],mouseToTouchMap:{mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},lastEventType:null,config:{moveThrottle:0,recognizers:{}},constructor:function(a){var b=this;this.eventProcessors={touchstart:this.onTouchStart,touchmove:this.onTouchMove,touchend:this.onTouchEnd,touchcancel:this.onTouchEnd};this.eventToRecognizerMap={};this.activeRecognizers=[];this.touchesMap={};this.currentIdentifiers=[];if(Ext.browser.is.Chrome&&Ext.os.is.Android){this.screenPositionRatio=Ext.browser.version.gt("18")?1:1/window.devicePixelRatio}else{if(Ext.browser.is.AndroidStock4){this.screenPositionRatio=1}else{if(Ext.os.is.BlackBerry){this.screenPositionRatio=1/window.devicePixelRatio}else{if(Ext.browser.engineName=="WebKit"&&Ext.os.is.Desktop){this.screenPositionRatio=1}else{this.screenPositionRatio=window.innerWidth/window.screen.width}}}}this.initConfig(a);if(Ext.feature.has.Touch){b.onTargetTouchMove=b.onTargetTouchMove.bind(b);b.onTargetTouchEnd=b.onTargetTouchEnd.bind(b)}return this.callSuper()},applyRecognizers:function(b){var c,a;for(c in b){if(b.hasOwnProperty(c)){a=b[c];if(a){this.registerRecognizer(a)}}}return b},handles:function(a){return this.callSuper(arguments)||this.eventToRecognizerMap.hasOwnProperty(a)},doesEventBubble:function(){return true},onEvent:function(f){var d=f.type,b=this.lastEventType,c=[f];if(this.eventProcessors[d]){this.eventProcessors[d].call(this,f);return}if("button" in f&&f.button>0){return}else{if(d==="mousedown"&&b&&b!=="mouseup"){var a=document.createEvent("MouseEvent");a.initMouseEvent("mouseup",f.bubbles,f.cancelable,document.defaultView,f.detail,f.screenX,f.screenY,f.clientX,f.clientY,f.ctrlKey,f.altKey,f.shiftKey,f.metaKey,f.metaKey,f.button,f.relatedTarget);this.onEvent(a)}if(d!=="mousemove"){this.lastEventType=d}f.identifier=1;f.touches=(d!=="mouseup")?c:[];f.targetTouches=(d!=="mouseup")?c:[];f.changedTouches=c;this.eventProcessors[this.mouseToTouchMap[d]].call(this,f)}},registerRecognizer:function(a){var g=this.eventToRecognizerMap,e=this.activeRecognizers,c=a.getHandledEvents(),d,f,b;a.setOnRecognized(this.onRecognized);a.setCallbackScope(this);for(d=0,f=c.length;d=2){g.preventDefault()}if(b){h.addEventListener("touchmove",k.onTargetTouchMove);h.addEventListener("touchend",k.onTargetTouchEnd);h.addEventListener("touchcancel",k.onTargetTouchEnd)}for(d=0;d0){this.invokeRecognizers("onTouchMove",d)}},onTouchEnd:function(h){if(!this.isStarted){return}if(this.lastMoveEvent){this.onAnimationFrame()}var a=this.touchesMap,d=this.currentIdentifiers,f=h.changedTouches,g=f.length,b,c,j;this.updateTouches(f);f=h.changedTouches;for(c=0;c0){return}a=this.pointerToTouchMap[a];b.identifier=b.pointerId;b.changedTouches=[b];this.eventProcessors[a].call(this,b)}})}else{if(!Ext.browser.is.Ripple&&(Ext.os.is.ChromeOS||!Ext.feature.has.Touch)){this.override({handledEvents:["touchstart","touchmove","touchend","touchcancel","mousedown","mousemove","mouseup"]})}}});Ext.define("Ext.event.recognizer.Recognizer",{mixins:[Ext.mixin.Identifiable],handledEvents:[],config:{onRecognized:Ext.emptyFn,onFailed:Ext.emptyFn,callbackScope:null},constructor:function(a){this.initConfig(a);return this},getHandledEvents:function(){return this.handledEvents},onStart:Ext.emptyFn,onEnd:Ext.emptyFn,fail:function(){this.getOnFailed().apply(this.getCallbackScope(),arguments);return false},fire:function(){this.getOnRecognized().apply(this.getCallbackScope(),arguments)}});Ext.define("Ext.event.recognizer.Touch",{extend:Ext.event.recognizer.Recognizer,onTouchStart:Ext.emptyFn,onTouchMove:Ext.emptyFn,onTouchEnd:Ext.emptyFn});Ext.define("Ext.event.recognizer.SingleTouch",{extend:Ext.event.recognizer.Touch,inheritableStatics:{NOT_SINGLE_TOUCH:1,TOUCH_MOVED:2},onTouchStart:function(a){if(a.touches.length>1){return this.fail(this.self.NOT_SINGLE_TOUCH)}}});Ext.define("Ext.event.recognizer.DoubleTap",{extend:Ext.event.recognizer.SingleTouch,inheritableStatics:{DIFFERENT_TARGET:3},config:{maxDuration:300},handledEvents:["singletap","doubletap"],singleTapTimer:null,startTime:0,lastTapTime:0,onTouchStart:function(a){if(this.callParent(arguments)===false){return false}this.startTime=a.time;clearTimeout(this.singleTapTimer)},onTouchMove:function(){return this.fail(this.self.TOUCH_MOVED)},onEnd:function(g){var i=this,d=this.getMaxDuration(),f=g.changedTouches[0],a=g.time,h=g.target,j=this.lastTapTime,b=this.lastTarget,c;this.lastTapTime=a;this.lastTarget=h;if(j){c=a-j;if(c<=d){if(h!==b){return this.fail(this.self.DIFFERENT_TARGET)}this.lastTarget=null;this.lastTapTime=0;this.fire("doubletap",g,[f],{touch:f,duration:c});return}}if(a-this.startTime>d){this.fireSingleTap(g,f)}else{this.singleTapTimer=setTimeout(function(){i.fireSingleTap(g,f)},d)}},fireSingleTap:function(a,b){this.fire("singletap",a,[b],{touch:b})}});Ext.define("Ext.event.recognizer.Drag",{extend:Ext.event.recognizer.SingleTouch,isStarted:false,startPoint:null,previousPoint:null,lastPoint:null,handledEvents:["dragstart","drag","dragend"],config:{minDistance:8},constructor:function(){this.callSuper(arguments);this.info={touch:null,previous:{x:0,y:0},x:0,y:0,delta:{x:0,y:0},absDelta:{x:0,y:0},flick:{velocity:{x:0,y:0}},direction:{x:0,y:0},time:0,previousTime:{x:0,y:0}}},onTouchStart:function(a){if(this.callSuper(arguments)===false){if(this.isStarted&&this.lastMoveEvent!==null){this.lastMoveEvent.isStopped=false;this.onTouchEnd(this.lastMoveEvent)}return false}this.startTime=a.time;this.startPoint=a.changedTouches[0].point},tryDragStart:function(f){var b=this.startPoint,d=f.changedTouches,h=d[0],a=h.point,g=this.getMinDistance(),c=this.info;if(Math.abs(a.getDistanceTo(b))>=g){this.isStarted=true;this.previousPoint=this.lastPoint=a;this.resetInfo("x",f,h);this.resetInfo("y",f,h);c.time=f.time;this.fire("dragstart",f,d,c)}},onTouchMove:function(c){if(!this.isStarted){this.tryDragStart(c)}if(!this.isStarted){return}var b=c.changedTouches,d=b[0],a=d.point;if(this.lastPoint){this.previousPoint=this.lastPoint}this.lastPoint=a;this.lastMoveEvent=c;this.updateInfo("x",c,d,true);this.updateInfo("y",c,d,true);this.info.time=c.time;this.fire("drag",c,b,this.info)},onAxisDragEnd:function(a,c){var b=c.time-c.previousTime[a];if(b>0){c.flick.velocity[a]=(c[a]-c.previous[a])/b}},resetInfo:function(c,g,i){var d=this.lastPoint[c],b=this.startPoint[c],h=d-b,a=c.toUpperCase(),f=this.info;f.touch=i;f.delta[c]=h;f.absDelta[c]=Math.abs(h);f.previousTime[c]=this.startTime;f.previous[c]=b;f[c]=d;f.direction[c]=0;f["start"+a]=this.startPoint[c];f["previous"+a]=f.previous[c];f["page"+a]=f[c];f["delta"+a]=f.delta[c];f["absDelta"+a]=f.absDelta[c];f["previousDelta"+a]=0;f.startTime=this.startTime},updateInfo:function(f,k,j,l){var d=k.time,n=this.lastPoint[f],g=this.previousPoint[f],a=this.startPoint[f],o=n-a,c=this.info,m=c.direction,i=f.toUpperCase(),b=c.previous[f],h;c.touch=j;h=c.delta[f];c.delta[f]=o;c.absDelta[f]=Math.abs(o);if(l&&n!==b&&n!==c[f]&&d-c.previousTime[f]>=50){c.previous[f]=c[f];c.previousTime[f]=c.time}c[f]=n;if(n>g){m[f]=1}else{if(nthis.getMaxDuration()){return this.fail(this.self.MAX_DURATION_EXCEEDED)}if(this.isHorizontal&&c>this.getMaxOffset()){this.isHorizontal=false}if(this.isVertical&&d>this.getMaxOffset()){this.isVertical=false}if(!this.isVertical||!this.isHorizontal){if(this.isHorizontal&&df){this.isVertical=false}if(this.isHorizontal&&b>f){this.isHorizontal=false}if(this.isVertical&&this.isHorizontal){if(b>c){this.isHorizontal=false}else{this.isVertical=false}}if(this.isHorizontal){m=(h<0)?"left":"right";a=h}else{if(this.isVertical){m=(g<0)?"up":"down";a=g}}this.direction=this.direction||m;if(this.direction=="up"){a=g*-1}else{if(this.direction=="left"){a=h*-1}}this.distance=a;if(a==0){return this.fail(this.self.DISTANCE_NOT_ENOUGH)}if(!this.started){if(this.direction=="right"&&this.startX>p){return this.fail(this.self.NOT_NEAR_EDGE)}else{if(this.direction=="down"&&this.startY>p){return this.fail(this.self.NOT_NEAR_EDGE)}else{if(this.direction=="left"&&(n-this.startX)>p){return this.fail(this.self.NOT_NEAR_EDGE)}else{if(this.direction=="up"&&(j-this.startY)>p){return this.fail(this.self.NOT_NEAR_EDGE)}}}}this.started=true;this.startTime=k.time;this.fire("edgeswipestart",k,[i],{touch:i,direction:this.direction,distance:this.distance,duration:d})}else{this.fire("edgeswipe",k,[i],{touch:i,direction:this.direction,distance:this.distance,duration:d})}},onTouchEnd:function(b){if(this.onTouchMove(b)!==false){var c=b.changedTouches[0],a=b.time-this.startTime;this.fire("edgeswipeend",b,[c],{touch:c,direction:this.direction,distance:this.distance,duration:a})}}});Ext.define("Ext.event.recognizer.HorizontalSwipe",{extend:Ext.event.recognizer.Swipe,handledEvents:["swipe"],onTouchStart:function(a){if(this.callParent(arguments)===false){return false}var b=a.changedTouches[0];this.startTime=a.time;this.startX=b.pageX;this.startY=b.pageY},onTouchMove:function(f){var h=f.changedTouches[0],g=h.pageY,a=Math.abs(g-this.startY),d=f.time,c=this.getMaxDuration(),b=this.getMaxOffset();if(d-this.startTime>c){return this.fail(this.self.MAX_DURATION_EXCEEDED)}if(a>b){return this.fail(this.self.MAX_OFFSET_EXCEEDED)}},onTouchEnd:function(f){if(this.onTouchMove(f)!==false){var i=f.changedTouches[0],a=i.pageX,b=a-this.startX,h=Math.abs(b),d=f.time-this.startTime,g=this.getMinDistance(),c;if(ha){this.end(d)}}},onTouchEnd:function(a){this.end(a)},start:function(){if(!this.isTracking){this.isTracking=true;this.isStarted=false}},end:function(a){if(this.isTracking){this.isTracking=false;if(this.isStarted){this.isStarted=false;this.fireEnd(a)}}}});Ext.define("Ext.event.recognizer.Pinch",{extend:Ext.event.recognizer.MultiTouch,requiredTouchesCount:2,handledEvents:["pinchstart","pinch","pinchend"],startDistance:0,lastTouches:null,onTouchMove:function(c){if(!this.isTracking){return}var b=Array.prototype.slice.call(c.touches),d,a,f;d=b[0].point;a=b[1].point;f=d.getDistanceTo(a);if(f===0){return}if(!this.isStarted){this.isStarted=true;this.startDistance=f;this.fire("pinchstart",c,b,{touches:b,distance:f,scale:1})}else{this.fire("pinch",c,b,{touches:b,distance:f,scale:f/this.startDistance})}this.lastTouches=b},fireEnd:function(a){this.fire("pinchend",a,this.lastTouches)},fail:function(){return this.callParent(arguments)}});Ext.define("Ext.event.recognizer.Rotate",{extend:Ext.event.recognizer.MultiTouch,requiredTouchesCount:2,handledEvents:["rotatestart","rotate","rotateend"],startAngle:0,lastTouches:null,lastAngle:null,onTouchMove:function(h){if(!this.isTracking){return}var g=Array.prototype.slice.call(h.touches),b=this.lastAngle,d,f,c,a,i,j;d=g[0].point;f=g[1].point;c=d.getAngleTo(f);if(b!==null){j=Math.abs(b-c);a=c+360;i=c-360;if(Math.abs(a-b)=this.getMoveDistance()){this.fire("tapcancel",b,[c],{touch:c});return this.fail(this.self.TOUCH_MOVED)}},onTouchEnd:function(a){var b=a.changedTouches[0];this.fire("tap",a,[b],{touch:b})}});Ext.define("Ext.event.recognizer.VerticalSwipe",{extend:Ext.event.recognizer.Swipe,onTouchStart:function(a){if(this.callParent(arguments)===false){return false}var b=a.changedTouches[0];this.startTime=a.time;this.startX=b.pageX;this.startY=b.pageY},onTouchMove:function(g){var h=g.changedTouches[0],a=h.pageX,b=Math.abs(a-this.startX),d=this.getMaxDuration(),c=this.getMaxOffset(),f=g.time;if(f-this.startTime>d){return this.fail(this.self.MAX_DURATION_EXCEEDED)}if(b>c){return this.fail(this.self.MAX_OFFSET_EXCEEDED)}},onTouchEnd:function(d){if(this.onTouchMove(d)!==false){var i=d.changedTouches[0],h=i.pageY,a=h-this.startY,g=Math.abs(a),c=d.time-this.startTime,f=this.getMinDistance(),b;if(g'+Ext.baseCSSPrefix+'picker-invalid">{'+a+"}")}},updateAlign:function(a,c){var b=this.element;b.addCls(Ext.baseCSSPrefix+"picker-"+a);b.removeCls(Ext.baseCSSPrefix+"picker-"+c)},applyData:function(d){var f=[],c=d&&d.length,a,b,e;if(d&&Ext.isArray(d)&&c){for(a=0;a0){c[0].addCls(b+"first");c[c.length-1].addCls(b+"last")}this.updateUseTitles(this.getUseTitles())},onDoneButtonTap:function(){var a=this._value,b=this.getValue(true);if(b!=a){this.fireEvent("change",this,b)}this.hide();Ext.util.InputBlocker.unblockInputs()},onCancelButtonTap:function(){this.fireEvent("cancel",this);this.hide();Ext.util.InputBlocker.unblockInputs()},onSlotPick:function(a){this.fireEvent("pick",this,this.getValue(true),a)},show:function(){if(this.getParent()===undefined){Ext.Viewport.add(this)}this.callParent(arguments);if(!this.isHidden()){this.setValue(this._value)}Ext.util.InputBlocker.blockInputs()},setValue:function(k,a){var f=this,d=f.getInnerItems(),e=d.length,j,h,c,b,g;if(!k){k={};for(b=0;b{'+this.getDisplayField()+":htmlEncode}",listeners:{select:this.onListSelect,itemtap:this.onListTap,scope:this}}},a))}return this.listPanel},onMaskTap:function(){this.onFocus();return false},showPicker:function(){var f=this,j=f.getStore(),i=f.getValue();if(!j||j.getCount()===0){return}if(f.getReadOnly()){return}f.isFocused=true;if(f.getUsePicker()){var d=f.getPhonePicker(),a=f.getName(),h={};h[a]=i;d.setValue(h);if(!d.getParent()){Ext.Viewport.add(d)}d.show()}else{var g=f.getTabletPicker(),e=g.down("list"),c,b;if(!g.getParent()){Ext.Viewport.add(g)}g.showBy(f.getComponent(),null);if(i||f.getAutoSelect()){j=e.getStore();c=j.find(f.getValueField(),i,null,null,null,true);b=j.getAt(c);if(b){e.select(b,null,true)}}}},onListSelect:function(c,a){var b=this;if(a){b.setValue(a)}},onListTap:function(){this.listPanel.hide({type:"fade",out:true,scope:this})},onPickerChange:function(d,f){var e=this,g=f[e.getName()],b=e.getStore(),c=b.find(e.getValueField(),g,null,null,null,true),a=b.getAt(c);e.setValue(a)},onChange:function(f,h,e){var g=this,b=g.getStore(),d=(b)?b.find(g.getDisplayField(),e,null,null,null,true):-1,c=g.getValueField(),a=(b)?b.getAt(d):null;e=(a)?a.get(c):null;g.fireEvent("change",g,g.getValue(),e)},updateOptions:function(b){var a=this.getStore();if(!a){this.setStore(true);a=this._store}if(!b){a.clearData()}else{a.setData(b);this.onStoreDataChanged(a)}return this},applyStore:function(a){if(a===true){a=Ext.create("Ext.data.Store",{fields:[this.getValueField(),this.getDisplayField()],autoDestroy:true})}if(a){a=Ext.data.StoreManager.lookup(a);a.on({scope:this,addrecords:"onStoreDataChanged",removerecords:"onStoreDataChanged",updaterecord:"onStoreDataChanged",refresh:"onStoreDataChanged"})}return a},updateStore:function(a){if(a){this.onStoreDataChanged(a)}if(this.getUsePicker()&&this.picker){this.picker.down("pickerslot").setStore(a)}else{if(this.listPanel){this.listPanel.down("dataview").setStore(a)}}},onStoreDataChanged:function(a){var c=this.getInitialConfig(),b=this.getValue();if(b||b==0){this.updateValue(this.applyValue(b))}if(this.getValue()===null){if(c.hasOwnProperty("value")){this.setValue(c.value)}if(this.getValue()===null&&this.getAutoSelect()){if(a.getCount()>0){this.setValue(a.getAt(0))}}}},doSetDisabled:function(b){var a=this.getComponent();if(a){a.setDisabled(b)}Ext.Component.prototype.doSetDisabled.apply(this,arguments)},setDisabled:function(){Ext.Component.prototype.setDisabled.apply(this,arguments)},updateLabelWidth:function(){if(Ext.theme.is.Blackberry||Ext.theme.is.Blackberry103){return}else{this.callParent(arguments)}},updateLabelAlign:function(){if(Ext.theme.is.Blackberry||Ext.theme.is.Blackberry103){return}else{this.callParent(arguments)}},reset:function(){var d=this,a;if(d.getAutoSelect()){var b=d.getStore();a=(d.originalValue)?d.originalValue:b.getAt(0)}else{var e=d.getUsePicker(),c=e?d.picker:d.listPanel;if(c){c=c.child(e?"pickerslot":"dataview");c.deselectAll()}a=null}d.setValue(a);return d},onFocus:function(b){if(this.getDisabled()){return false}var a=this.getComponent();this.fireEvent("focus",this,b);if(Ext.os.is.Android4){a.input.dom.focus()}a.input.dom.blur();this.isFocused=true;this.showPicker()},destroy:function(){this.callParent(arguments);var a=this.getStore();if(a&&a.getAutoDestroy()){Ext.destroy(a)}Ext.destroy(this.listPanel,this.picker)}});Ext.define("Ext.picker.Date",{extend:Ext.picker.Picker,xtype:"datepicker",alternateClassName:"Ext.DatePicker",config:{yearFrom:1980,yearTo:new Date().getFullYear(),monthText:"Month",dayText:"Day",yearText:"Year",slotOrder:["month","day","year"],doneButton:true},platformConfig:[{theme:["Windows"],doneButton:{iconCls:"check2",ui:"round",text:""}}],initialize:function(){this.callParent();this.on({scope:this,delegate:"> slot",slotpick:this.onSlotPick});this.on({scope:this,show:this.onSlotPick})},setValue:function(b,a){if(Ext.isDate(b)){b={day:b.getDate(),month:b.getMonth()+1,year:b.getFullYear()}}this.callParent([b,a]);this.onSlotPick()},getValue:function(k){var h={},e=this.getItems().items,d=e.length,a,g,c,f,j,b;for(b=0;be,j,d,a;while(m){f.push({text:m,value:m});if(m===e){break}if(h){m--}else{m++}}a=k.getDaysInMonth(1,new Date().getFullYear());for(d=0;d thumb",tap:"onTap",dragstart:"onThumbDragStart",drag:"onThumbDrag",dragend:"onThumbDragEnd"});var a=this.getThumb(0);if(a){a.on("resize","onThumbResize",this)}},factoryThumb:function(){return Ext.factory(this.getThumbConfig(),Ext.slider.Thumb)},getThumbs:function(){return this.innerItems},getThumb:function(a){if(typeof a!="number"){a=0}return this.innerItems[a]},refreshOffsetValueRatio:function(){var b=this.getMaxValue()-this.getMinValue(),a=this.elementWidth-this.thumbWidth;this.offsetValueRatio=a/b},onThumbResize:function(){var a=this.getThumb(0);if(a){this.thumbWidth=a.getElementWidth()}this.refresh()},onResize:function(a,b){this.elementWidth=b.width;this.refresh()},refresh:function(){this.refreshValue()},setActiveThumb:function(b){var a=this.activeThumb;if(a&&a!==b){a.setZIndex(null)}this.activeThumb=b;b.setZIndex(2);return this},onThumbDragStart:function(a,b){if(b.absDeltaX<=b.absDeltaY||this.getReadOnly()){return false}else{b.stopPropagation()}if(this.getAllowThumbsOverlapping()){this.setActiveThumb(a)}this.dragStartValue=this.getValue()[this.getThumbIndex(a)];this.fireEvent("dragstart",this,a,this.dragStartValue,b)},onThumbDrag:function(c,g,a){var d=this.getThumbIndex(c),f=this.offsetValueRatio,b=this.constrainValue(this.getMinValue()+a/f);g.stopPropagation();this.setIndexValue(d,b);this.fireEvent("drag",this,c,this.getValue(),g);return false},setIndexValue:function(d,f,b){var a=this.getThumb(d),h=this.getValue(),e=this.getMinValue(),c=this.offsetValueRatio,g=this.getIncrement(),i=a.getDraggable();i.setOffset((f-e)*c,null,b);h[d]=e+Math.round((i.offset.x/c)/g)*g},onThumbDragEnd:function(a,f){this.refreshThumbConstraints(a);var c=this.getThumbIndex(a),d=this.getValue()[c],b=this.dragStartValue;this.fireEvent("dragend",this,a,this.getValue(),f);if(b!==d){this.fireEvent("change",this,a,d,b)}},getThumbIndex:function(a){return this.getThumbs().indexOf(a)},refreshThumbConstraints:function(d){var b=this.getAllowThumbsOverlapping(),a=d.getDraggable().getOffset().x,c=this.getThumbs(),e=this.getThumbIndex(d),g=c[e-1],h=c[e+1],f=this.thumbWidth;if(g){g.getDraggable().addExtraConstraint({max:{x:a-((b)?0:f)}})}if(h){h.getDraggable().addExtraConstraint({min:{x:a+((b)?0:f)}})}},onTap:function(j){if(this.isDisabled()||this.getReadOnly()){return}var k=Ext.get(j.target);if(!k||(Ext.browser.engineName=="WebKit"&&k.hasCls("x-thumb"))){return}var n=j.touch.point.x,h=this.element,c=h.getX(),d=n-c-(this.thumbWidth/2),o=this.constrainValue(this.getMinValue()+d/this.offsetValueRatio),r=this.getValue(),q=Infinity,m=r.length,g,f,l,p,b,a;if(m===1){p=0}else{for(g=0;g=(a/2)){e+=(c>0)?a:-a}e=Math.max(d,e);e=Math.min(f,e);return e},setThumbsCount:function(e){var a=this.getThumbs(),f=a.length,c,d,b;if(f>e){for(c=0,d=f-e;c1){this.addCls(Ext.baseCSSPrefix+"slider-multiple")}}});Ext.define("Ext.util.TapRepeater",{mixins:{observable:Ext.mixin.Observable},config:{el:null,accelerate:true,interval:10,delay:250,preventDefault:true,stopDefault:false,timer:0,pressCls:null},constructor:function(a){var b=this;b.initConfig(a)},updateEl:function(c,b){var a={touchstart:"onTouchStart",touchend:"onTouchEnd",tap:"eventOptions",scope:this};if(b){b.un(a)}c.on(a)},eventOptions:function(a){if(this.getPreventDefault()){a.preventDefault()}if(this.getStopDefault()){a.stopEvent()}},destroy:function(){this.clearListeners();Ext.destroy(this.el)},onTouchStart:function(c){var b=this,a=b.getPressCls();clearTimeout(b.getTimer());if(a){b.getEl().addCls(a)}b.tapStartTime=new Date();b.fireEvent("touchstart",b,c);b.fireEvent("tap",b,c);if(b.getAccelerate()){b.delay=400}b.setTimer(Ext.defer(b.tap,b.getDelay()||b.getInterval(),b,[c]))},tap:function(b){var a=this;a.fireEvent("tap",a,b);a.setTimer(Ext.defer(a.tap,a.getAccelerate()?a.easeOutExpo(Ext.Date.getElapsed(a.tapStartTime),400,-390,12000):a.getInterval(),a,[b]))},easeOutExpo:function(e,a,g,f){return(e==f)?a+g:g*(-Math.pow(2,-10*e/f)+1)+a},onTouchEnd:function(b){var a=this;clearTimeout(a.getTimer());a.getEl().removeCls(a.getPressCls());a.fireEvent("touchend",a,b)}});Ext.define("Ext.field.Spinner",{extend:Ext.field.Number,xtype:"spinnerfield",alternateClassName:"Ext.form.Spinner",config:{cls:Ext.baseCSSPrefix+"spinner",minValue:Number.NEGATIVE_INFINITY,maxValue:Number.MAX_VALUE,stepValue:0.1,accelerateOnTapHold:true,cycle:false,clearIcon:false,defaultValue:0,tabIndex:-1,groupButtons:true,component:{disabled:true}},platformConfig:[{platform:"android",component:{disabled:false,readOnly:true}}],constructor:function(){var a=this;a.callParent(arguments);if(!a.getValue()){a.suspendEvents();a.setValue(a.getDefaultValue());a.resumeEvents()}},syncEmptyCls:Ext.emptyFn,updateComponent:function(b){this.callParent(arguments);var a=this.getCls();if(b){this.spinDownButton=Ext.Element.create({cls:a+"-button "+a+"-button-down",html:"-"});this.spinUpButton=Ext.Element.create({cls:a+"-button "+a+"-button-up",html:"+"});this.downRepeater=this.createRepeater(this.spinDownButton,this.onSpinDown);this.upRepeater=this.createRepeater(this.spinUpButton,this.onSpinUp)}},updateGroupButtons:function(a,e){var c=this,d=c.innerElement,b=c.getBaseCls()+"-grouped-buttons";c.getComponent();if(a!=e){if(a){this.addCls(b);d.appendChild(c.spinDownButton);d.appendChild(c.spinUpButton)}else{this.removeCls(b);d.insertFirst(c.spinDownButton);d.appendChild(c.spinUpButton)}}},applyValue:function(a){a=parseFloat(a);if(isNaN(a)||a===null){a=this.getDefaultValue()}a=Math.round(a*10)/10;return this.callParent([a])},createRepeater:function(c,b){var d=this,a=Ext.create("Ext.util.TapRepeater",{el:c,accelerate:d.getAccelerateOnTapHold()});a.on({tap:b,touchstart:"onTouchStart",touchend:"onTouchEnd",scope:d});return a},onSpinDown:function(){if(!this.getDisabled()&&!this.getReadOnly()){this.spin(true)}},onSpinUp:function(){if(!this.getDisabled()&&!this.getReadOnly()){this.spin(false)}},onTouchStart:function(a){if(!this.getDisabled()&&!this.getReadOnly()){a.getEl().addCls(Ext.baseCSSPrefix+"button-pressed")}},onTouchEnd:function(a){a.getEl().removeCls(Ext.baseCSSPrefix+"button-pressed")},spin:function(h){var c=this,b=c.getValue(),a=c.getStepValue(),g=h?"down":"up",e=c.getMinValue(),f=c.getMaxValue(),d;if(h){d=b-a}else{d=b+a}if(c.getCycle()){if(b==e&&df){d=e}}c.setValue(d);d=c.getValue();c.fireEvent("spin",c,d,g);c.fireEvent("spin"+g,c,d)},doSetDisabled:function(a){Ext.Component.prototype.doSetDisabled.apply(this,arguments)},setDisabled:function(){Ext.Component.prototype.setDisabled.apply(this,arguments)},reset:function(){this.setValue(this.getDefaultValue())},destroy:function(){var a=this;Ext.destroy(a.downRepeater,a.upRepeater,a.spinDownButton,a.spinUpButton);a.callParent(arguments)}},function(){});Ext.define("Ext.slider.Toggle",{extend:Ext.slider.Slider,config:{baseCls:"x-toggle",minValueCls:"x-toggle-off",maxValueCls:"x-toggle-on"},initialize:function(){this.callParent();this.on({change:"onChange"})},applyMinValue:function(){return 0},applyMaxValue:function(){return 1},applyIncrement:function(){return 1},updateMinValueCls:function(c,b){var a=this.element;if(b&&a.hasCls(b)){a.replaceCls(b,c)}},updateMaxValueCls:function(c,b){var a=this.element;if(b&&a.hasCls(b)){a.replaceCls(b,c)}},setValue:function(b,a){this.callParent(arguments);this.onChange(this,this.getThumbs()[0],b,a)},setIndexValue:function(c,e,d){var b=this.getValue()[c];this.callParent(arguments);var a=this.getThumb(c),f=this.getValue()[c];if(b!==f){this.fireEvent("change",this,a,f,b)}},onChange:function(e,a,g,c){var h=g>0,b=e.getMaxValueCls(),f=e.getMinValueCls(),d=this.element;d.addCls(h?b:f);d.removeCls(h?f:b)},toggle:function(){var a=this.getValue();this.setValue((a==1)?0:1);return this},onTap:function(){if(this.isDisabled()||this.getReadOnly()){return}var b=this.getValue(),c=(b==1)?0:1,a=this.getThumb(0);this.setIndexValue(0,c,this.getAnimation());this.refreshThumbConstraints(a)}});Ext.define("Ext.field.Toggle",{extend:Ext.field.Slider,xtype:"togglefield",alternateClassName:"Ext.form.Toggle",config:{cls:"x-toggle-field",labelAlign:"left",activeLabel:null,inactiveLabel:null},platformConfig:[{theme:["Windows"],labelAlign:"left"},{theme:["Blackberry","Blackberry103","MountainView"],activeLabel:"On",inactiveLabel:"Off"}],proxyConfig:{minValueCls:"x-toggle-off",maxValueCls:"x-toggle-on"},applyComponent:function(a){return Ext.factory(a,Ext.slider.Toggle)},updateActiveLabel:function(b,a){if(b!=a){this.getComponent().element.dom.setAttribute("data-activelabel",b)}},updateInactiveLabel:function(b,a){if(b!=a){this.getComponent().element.dom.setAttribute("data-inactivelabel",b)}},setValue:function(b){if(b===true){b=1}var a=this.getValue();if(a!=b){this.getComponent().setValue(b);this.fireEvent("change",this,b,a)}return this},getValue:function(){return(this.getComponent().getValue()==1)?1:0},onSliderChange:function(c,a,d,b){this.fireEvent.call(this,"change",this,d,b)},toggle:function(){var a=this.getValue();this.setValue((a==1)?0:1);return this},onChange:function(){this.setLabel((this.getValue()==1)?this.toggleOnLabel:this.toggleOffLabel)}});Ext.define("Ext.field.Url",{extend:Ext.field.Text,xtype:"urlfield",alternateClassName:"Ext.form.Url",config:{autoCapitalize:false,component:{type:"url"}}});Ext.define("Ext.form.FieldSet",{extend:Ext.Container,alias:"widget.fieldset",config:{baseCls:Ext.baseCSSPrefix+"form-fieldset",title:null,instructions:null},applyTitle:function(a){if(typeof a=="string"){a={title:a}}Ext.applyIf(a,{docked:"top",baseCls:this.getBaseCls()+"-title"});return Ext.factory(a,Ext.Title,this._title)},updateTitle:function(b,a){if(b){this.add(b)}if(a){this.remove(a)}},getTitle:function(){var a=this._title;if(a&&a instanceof Ext.Title){return a.getTitle()}return a},applyInstructions:function(a){if(typeof a=="string"){a={title:a}}Ext.applyIf(a,{docked:"bottom",baseCls:this.getBaseCls()+"-instructions"});return Ext.factory(a,Ext.Title,this._instructions)},updateInstructions:function(b,a){if(b){this.add(b)}if(a){this.remove(a)}},getInstructions:function(){var a=this._instructions;if(a&&a instanceof Ext.Title){return a.getTitle()}return a},doSetDisabled:function(a){this.getFieldsAsArray().forEach(function(b){b.setDisabled(a)});return this},getFieldsAsArray:function(){var a=[],b=function(c){if(c.isField){a.push(c)}if(c.isContainer){c.getItems().each(b)}};this.getItems().each(b);return a}});Ext.define("Ext.form.Panel",{alternateClassName:"Ext.form.FormPanel",extend:Ext.Panel,xtype:"formpanel",config:{baseCls:Ext.baseCSSPrefix+"form",standardSubmit:false,url:null,enctype:null,baseParams:null,submitOnAction:false,record:null,method:"post",scrollable:{translatable:{translationMethod:"scrollposition"}},trackResetOnLoad:false,api:null,paramOrder:null,paramsAsHash:null,timeout:30,multipartDetection:true,enableSubmissionForm:true},getElementConfig:function(){var a=this.callParent();a.tag="form";a.children.push({tag:"input",type:"submit",style:"visibility: hidden; width: 0; height: 0; position: absolute; right: 0; bottom: 0;"});return a},initialize:function(){var a=this;a.callParent();a.element.on({submit:"onSubmit",scope:a})},applyEnctype:function(b){var a=this.element.dom||null;if(a){if(b){a.setAttribute("enctype",b)}else{a.setAttribute("enctype")}}},updateRecord:function(c){var a,b,d;if(c&&(a=c.fields)){b=this.getValues();for(d in b){if(b.hasOwnProperty(d)&&a.containsKey(d)){c.set(d,b[d])}}}return this},setRecord:function(a){var b=this;if(a&&a.data){b.setValues(a.data)}b._record=a;return this},onSubmit:function(b){var a=this;if(b&&!a.getStandardSubmit()){b.stopEvent()}else{if(a.getEnableSubmissionForm()){b.stopEvent()}this.submit(null,b)}},updateSubmitOnAction:function(a){if(a){this.on({action:"onFieldAction",scope:this})}else{this.un({action:"onFieldAction",scope:this})}},onFieldAction:function(a){if(this.getSubmitOnAction()){a.blur();this.submit()}},submit:function(a,f){a=a||{};var c=this,d=c.getValues(c.getStandardSubmit()||!a.submitDisabled),b=c.element.dom||{};if(this.getEnableSubmissionForm()){b=this.createSubmissionForm(b,d)}a=Ext.apply({url:c.getUrl()||b.action,submit:false,form:b,method:c.getMethod()||b.method||"post",autoAbort:false,params:null,waitMsg:null,headers:null,success:null,failure:null},a||{});return c.fireAction("beforesubmit",[c,d,a,f],"doBeforeSubmit")},createSubmissionForm:function(e,c){var a=this.getFields(),d,b,f,g,h;if(e.nodeType===1){e=e.cloneNode(false);for(d in c){b=document.createElement("input");b.setAttribute("type","text");b.setAttribute("name",d);b.setAttribute("value",c[d]);e.appendChild(b)}}for(d in a){if(a.hasOwnProperty(d)){f=a[d];if(f.isFile){if(!e.$fileswap){e.$fileswap=[]}h=f.getComponent().input;g=h.dom;b=g.cloneNode(true);g.parentNode.insertBefore(b,g.nextSibling);e.appendChild(g);e.$fileswap.push({original:g,placeholder:b})}else{if(f.isPassword){if(f.getComponent().getType!=="password"){f.setRevealed(false)}}}}}return e},doBeforeSubmit:function(r,n,d){var c=d.form||{},g=false;if(this.getMultipartDetection()===true){this.getFieldsAsArray().forEach(function(i){if(i.isFile===true){g=true;return false}});if(g){c.setAttribute("enctype","multipart/form-data")}}if(d.enctype){c.setAttribute("enctype",d.enctype)}if(r.getStandardSubmit()){if(d.url&&Ext.isEmpty(c.action)){c.action=d.url}var o=this.query("spinnerfield"),j=o.length,q,b;for(q=0;q0){}else{return j+l}}return j}else{if(g=="number"){if(j==0){return"0"}if(this.lengthProperties[b]){return j+l}if(this.angleProperties[b]){return j+this.DEFAULT_UNIT_ANGLE}if(this.durationProperties[b]){return j+this.DEFAULT_UNIT_DURATION}}else{if(b==="transform"){e=this.transformMethods;c=[];for(d=0,f=e.length;d0)?k.join(", "):"none"}}}}return j}});Ext.define("Ext.fx.runner.CssTransition",{extend:Ext.fx.runner.Css,listenersAttached:false,constructor:function(){this.runningAnimationsData={};return this.callParent(arguments)},attachListeners:function(){this.listenersAttached=true;this.getEventDispatcher().addListener("element","*","transitionend","onTransitionEnd",this)},onTransitionEnd:function(b){var a=b.target,c=a.id;if(c&&this.runningAnimationsData.hasOwnProperty(c)){this.refreshRunningAnimationsData(Ext.get(a),[b.browserEvent.propertyName])}},onAnimationEnd:function(g,f,d,j,n){var c=g.getId(),k=this.runningAnimationsData[c],o={},m={},b,h,e,l,a;d.un("stop","onAnimationStop",this);if(k){b=k.nameMap}o[c]=m;if(f.onBeforeEnd){f.onBeforeEnd.call(f.scope||this,g,j)}d.fireEvent("animationbeforeend",d,g,j);this.fireEvent("animationbeforeend",this,d,g,j);if(n||(!j&&!f.preserveEndState)){h=f.toPropertyNames;for(e=0,l=h.length;e0},refreshRunningAnimationsData:function(d,k,t,p){var g=d.getId(),q=this.runningAnimationsData,a=q[g];if(!a){return}var m=a.nameMap,s=a.nameList,b=a.sessions,f,h,e,u,l,c,r,o,n=false;t=Boolean(t);p=Boolean(p);if(!b){return this}f=b.length;if(f===0){return this}if(p){a.nameMap={};s.length=0;for(l=0;l");d.close();this.testElement=c=d.createElement("div");c.style.setProperty("position","absolute","important");d.body.appendChild(c);this.testElementComputedStyle=window.getComputedStyle(c)}return c},getCssStyleValue:function(b,e){var d=this.getTestElement(),a=this.testElementComputedStyle,c=d.style;c.setProperty(b,e);if(Ext.browser.is.Firefox){d.offsetHeight}e=a.getPropertyValue(b);c.removeProperty(b);return e},run:function(q){var G=this,h=this.lengthProperties,y={},F={},H={},d,t,z,e,v,J,w,r,s,a,n,B,A,p,C,l,u,g,D,I,k,f,x,o,c,E,b,m;if(!this.listenersAttached){this.attachListeners()}q=Ext.Array.from(q);for(B=0,p=q.length;B0){this.refreshRunningAnimationsData(d,Ext.Array.merge(J,w),true,H.replacePrevious)}c=a.nameMap;E=a.nameList;u={};for(A=0;A0){J=Ext.Array.difference(E,J);w=Ext.Array.merge(J,w);n["transition-property"]=J}y[t]=n;F[t]=Ext.apply({},e);F[t]["transition-property"]=w;F[t]["transition-duration"]=H.duration;F[t]["transition-timing-function"]=H.easing;F[t]["transition-delay"]=H.delay;C.startTime=Date.now()}s=this.$className;this.applyStyles(y);r=function(i){if(i.data===s&&i.source===window){window.removeEventListener("message",r,false);G.applyStyles(F)}};if(Ext.browser.is.IE){window.requestAnimationFrame(function(){window.addEventListener("message",r,false);window.postMessage(s,"*")})}else{window.addEventListener("message",r,false);window.postMessage(s,"*")}},onAnimationStop:function(d){var f=this.runningAnimationsData,h,a,g,b,c,e;for(h in f){if(f.hasOwnProperty(h)){a=f[h];g=a.sessions;for(b=0,c=g.length;b=g){this.isEnded=true;return a}return f}});Ext.define("Ext.fx.layout.card.Cube",{extend:Ext.fx.layout.card.Style,alias:"fx.layout.card.cube",config:{reverse:null,inAnimation:{type:"cube"},outAnimation:{type:"cube",out:true}}});Ext.define("Ext.fx.layout.card.ScrollCover",{extend:Ext.fx.layout.card.Scroll,alias:"fx.layout.card.scrollcover",onActiveItemChange:function(c,g,d,k,e){var i,a,j,h,b,f;this.lastController=e;this.inItem=g;if(g&&d){i=this.getLayout().container.innerElement;a=i.getSize();j=this.calculateXY(a);h={easing:this.getEasing(),duration:this.getDuration()};g.renderElement.dom.style.setProperty("visibility","hidden","important");b=g.setTranslatable(true).getTranslatable();f=d.setTranslatable(true).getTranslatable();f.translate({x:0,y:0});b.translate({x:j.left,y:j.top});b.getWrapper().dom.style.setProperty("z-index","100","important");g.show();b.on({animationstart:"onInAnimationStart",animationend:"onInAnimationEnd",scope:this});b.translateAnimated({x:0,y:0},h);e.pause()}},onInAnimationStart:function(){this.inItem.renderElement.dom.style.removeProperty("visibility")},onInAnimationEnd:function(){this.inItem.getTranslatable().getWrapper().dom.style.removeProperty("z-index");this.lastController.resume()}});Ext.define("Ext.fx.layout.card.ScrollReveal",{extend:Ext.fx.layout.card.Scroll,alias:"fx.layout.card.scrollreveal",onActiveItemChange:function(c,g,d,k,e){var i,a,j,h,f,b;this.lastController=e;this.outItem=d;this.inItem=g;if(g&&d){i=this.getLayout().container.innerElement;a=i.getSize();j=this.calculateXY(a);h={easing:this.getEasing(),duration:this.getDuration()};f=d.setTranslatable(true).getTranslatable();b=g.setTranslatable(true).getTranslatable();f.getWrapper().dom.style.setProperty("z-index","100","important");f.translate({x:0,y:0});b.translate({x:0,y:0});g.show();f.on({animationend:"onOutAnimationEnd",scope:this});f.translateAnimated({x:j.x,y:j.y},h);e.pause()}},onOutAnimationEnd:function(){this.outItem.getTranslatable().getWrapper().dom.style.removeProperty("z-index");this.lastController.resume()}});Ext.define("Ext.fx.runner.CssAnimation",{extend:Ext.fx.runner.Css,constructor:function(){this.runningAnimationsMap={};this.elementEndStates={};this.animationElementMap={};this.keyframesRulesCache={};this.uniqueId=0;return this.callParent(arguments)},attachListeners:function(){var a=this.getEventDispatcher();this.listenersAttached=true;a.addListener("element","*","animationstart","onAnimationStart",this);a.addListener("element","*","animationend","onAnimationEnd",this)},onAnimationStart:function(g){var b=g.browserEvent.animationName,a=this.animationElementMap[b],f=this.runningAnimationsMap[a][b],h=this.elementEndStates,c=h[a],d={};console.log("START============= "+b);if(c){delete h[a];d[a]=c;this.applyStyles(d)}if(f.before){d[a]=f.before;this.applyStyles(d)}},onAnimationEnd:function(i){var c=i.target,b=i.browserEvent.animationName,d=this.animationElementMap,a=d[b],f=this.runningAnimationsMap,h=f[a],g=h[b];console.log("END============= "+b);if(g.onBeforeEnd){g.onBeforeEnd.call(g.scope||this,c)}if(g.onEnd){g.onEnd.call(g.scope||this,c)}delete d[b];delete h[b];this.removeKeyframesRule(b)},generateAnimationId:function(){return"animation-"+(++this.uniqueId)},run:function(f){var s={},t=this.elementEndStates,o=this.animationElementMap,r=this.runningAnimationsMap,b,d,h,k,p,g,q,u,m,l,c,e,a,j,n;if(!this.listenersAttached){this.attachListeners()}f=Ext.Array.from(f);for(p=0,g=f.length;p1;d.doChangeView(c,a,false)},onViewRemove:function(c){var d=this,b=d.backButtonStack,a;d.endAnimation();b.pop();a=b.length>1;d.doChangeView(c,a,true)},doChangeView:function(k,c,g){var r=this,o=r.leftBox,e=o.element,f=r.titleComponent,m=f.element,n=r.getBackButton(),l=r.getTitleText(),h=r.getBackButtonText(),q=r.getAnimation()&&k.getLayout().getAnimation(),p=q&&q.isAnimation&&k.isPainted(),d,i,a,j,b;if(p){i=r.createProxy(o.element);e.setStyle("opacity","0");n.setText(h);n[c?"show":"hide"]();a=r.createProxy(f.element.getParent());m.setStyle("opacity","0");r.setTitle(l);d=r.measureView(i,a,g);j=d.left;b=d.title;r.isAnimating=true;r.animate(e,j.element);r.animate(m,b.element,function(){m.setLeft(d.titleLeft);r.isAnimating=false;r.refreshTitlePosition()});if(Ext.browser.is.AndroidStock2&&!this.getAndroid2Transforms()){i.ghost.destroy();a.ghost.destroy()}else{r.animate(i.ghost,j.ghost);r.animate(a.ghost,b.ghost,function(){i.ghost.destroy();a.ghost.destroy()})}}else{if(c){n.setText(h);n.show()}else{n.hide()}r.setTitle(l)}},measureView:function(e,u,k){var w=this,j=w.element,v=w.leftBox.element,p=w.titleComponent.element,l=Math.min(j.getWidth()/3,200),q=v.getWidth(),c=j.getX(),m=j.getWidth(),n=p.getX(),d=p.getLeft(),s=p.getWidth(),r=e.x,t=e.width,a=e.left,h=Ext.browser.is.AndroidStock2&&!this.getAndroid2Transforms(),i,b,f,x,o,g;g=c-r-t;if(k){i=g;b=Math.min(n-t,l)}else{b=g;i=Math.min(n-c,l)}if(h){f={element:{from:{left:i,opacity:1},to:{left:0,opacity:1}}}}else{f={element:{from:{transform:{translateX:i},opacity:0},to:{transform:{translateX:0},opacity:1}},ghost:{to:{transform:{translateX:b},opacity:0}}}}g=c-n+q;if((a+s)>n){o=c-n-s}if(k){p.setLeft(0);b=c+m-n-s;if(o!==undefined){i=o}else{i=g}}else{i=c+m-n-s;if(o!==undefined){b=o}else{b=g}i=Math.max(d,i)}if(h){x={element:{from:{left:i,opacity:1},to:{left:d,opacity:1}}}}else{x={element:{from:{transform:{translateX:i},opacity:0},to:{transform:{translateX:d},opacity:1}},ghost:{to:{transform:{translateX:b},opacity:0}}}}return{left:f,title:x,titleLeft:d}},animate:function(b,a,e){var c=this,d;b.setLeft(0);a=Ext.apply(a,{element:b,easing:"ease-in-out",duration:c.getAnimation().duration||250,preserveEndState:true});d=new Ext.fx.Animation(a);d.on("animationend",function(){if(e){e.call(c)}},c);Ext.Animator.run(d);c.activeAnimations.push(d)},endAnimation:function(){var a=this.activeAnimations,d,b,c;if(a){c=a.length;for(b=0;b=0;a--){if((Ext.isString(f)&&Ext.ComponentQuery.is(g[a],f))||(Ext.isObject(f)&&f==g[a])){f=d-a;break}}if(!Ext.isNumber(f)){return false}}var c=g.length,b;if(!Ext.isNumber(f)||f<1){f=1}f=Math.min(f,c-1);if(f){e.getNavigationBar().beforePop(f);b=g.splice(-f,f-1);for(a=0;a0){if(b&&b.isAnimation){b.setReverse(true)}a.setActiveItem(d-1);a.getNavigationBar().onViewRemove(a,c[d],d)}},doRemove:function(){var a=this.getLayout().getAnimation();if(a&&a.isAnimation){a.setReverse(false)}this.callParent(arguments)},onItemAdd:function(b,a){if(b&&b.getDocked()&&b.config.title===true){this.$titleContainer=b}this.doItemLayoutAdd(b,a);var c=this.getInitialConfig().navigationBar;if(!this.isItemsInitializing&&b.isInnerItem()){this.setActiveItem(b);if(c){this.getNavigationBar().onViewAdd(this,b,a)}if(this.$backButtonContainer){this.$backButton.show()}}if(b&&b.isInnerItem()){this.updateTitleContainerTitle((b.getTitle)?b.getTitle():b.config.title)}if(this.initialized){this.fireEvent("add",this,b,a)}},updateTitleContainerTitle:function(a){if(this.$titleContainer){this.$titleContainer.setTitle(a)}else{this.$currentTitle=a}},reset:function(){return this.pop(this.getInnerItems().length)}});Ext.define("Ext.plugin.ListPaging",{extend:Ext.Component,alias:"plugin.listpaging",config:{autoPaging:false,loadMoreText:"Load More...",noMoreRecordsText:"No More Records",loadTpl:['
','','','','',"
",'
{message}
'].join(""),loadMoreCmp:{xtype:"component",baseCls:Ext.baseCSSPrefix+"list-paging",scrollDock:"bottom",hidden:true},loadMoreCmpAdded:false,loadingCls:Ext.baseCSSPrefix+"loading",list:null,scroller:null,loading:false},init:function(c){var a=c.getScrollable().getScroller(),b=c.getStore();this.setList(c);this.setScroller(a);this.bindStore(c.getStore());this.addLoadMoreCmp();c.updateStore=Ext.Function.createInterceptor(c.updateStore,this.bindStore,this);if(this.getAutoPaging()){a.on({scrollend:this.onScrollEnd,scope:this})}},bindStore:function(a,b){if(b){b.un({beforeload:this.onStoreBeforeLoad,load:this.onStoreLoad,filter:this.onFilter,scope:this})}if(a){a.on({beforeload:this.onStoreBeforeLoad,load:this.onStoreLoad,filter:this.onFilter,scope:this})}},disableDataViewMask:function(){var a=this.getList();this._listMask=a.getLoadingText();a.setLoadingText(null)},enableDataViewMask:function(){if(this._listMask){var a=this.getList();a.setLoadingText(this._listMask);delete this._listMask}},applyLoadTpl:function(a){return(Ext.isObject(a)&&a.isTemplate)?a:new Ext.XTemplate(a)},applyLoadMoreCmp:function(a){a=Ext.merge(a,{html:this.getLoadTpl().apply({cssPrefix:Ext.baseCSSPrefix,message:this.getLoadMoreText()}),scrollDock:"bottom",listeners:{tap:{fn:this.loadNextPage,scope:this,element:"element"}}});return Ext.factory(a,Ext.Component,this.getLoadMoreCmp())},onScrollEnd:function(b,a,d){var c=this.getList();if(!this.getLoading()&&d>=b.maxPosition.y){this.currentScrollToTopOnRefresh=c.getScrollToTopOnRefresh();c.setScrollToTopOnRefresh(false);this.loadNextPage()}},updateLoading:function(a){var b=this.getLoadMoreCmp(),c=this.getLoadingCls();if(a){b.addCls(c)}else{b.removeCls(c)}},onStoreBeforeLoad:function(a){if(a.getCount()===0){this.getLoadMoreCmp().hide()}},onStoreLoad:function(a){var d=this.getLoadMoreCmp(),b=this.getLoadTpl(),c=this.storeFullyLoaded()?this.getNoMoreRecordsText():this.getLoadMoreText();if(a.getCount()){d.show()}this.setLoading(false);d.setHtml(b.apply({cssPrefix:Ext.baseCSSPrefix,message:c}));if(this.currentScrollToTopOnRefresh!==undefined){this.getList().setScrollToTopOnRefresh(this.currentScrollToTopOnRefresh);delete this.currentScrollToTopOnRefresh}this.enableDataViewMask()},onFilter:function(a){if(a.getCount()===0){this.getLoadMoreCmp().hide()}else{this.getLoadMoreCmp().show()}},addLoadMoreCmp:function(){var b=this.getList(),a=this.getLoadMoreCmp();if(!this.getLoadMoreCmpAdded()){b.add(a);b.fireEvent("loadmorecmpadded",this,b);this.setLoadMoreCmpAdded(true)}return a},storeFullyLoaded:function(){var a=this.getList().getStore(),b=a.getTotalCount();return b!==null?a.getTotalCount()<=(a.currentPage*a.getPageSize()):false},loadNextPage:function(){var a=this;if(!a.storeFullyLoaded()){a.disableDataViewMask();a.setLoading(true);a.getList().getStore().nextPage({addRecords:true})}}});Ext.define("Ext.plugin.PullRefresh",{extend:Ext.Component,alias:"plugin.pullrefresh",config:{width:"100%",list:null,pullText:"Pull down to refresh...",releaseText:"Release to refresh...",loadingText:"Loading...",loadedText:"Loaded.",lastUpdatedText:"Last Updated: ",scrollerAutoRefresh:false,autoSnapBack:true,snappingAnimationDuration:300,lastUpdatedDateFormat:"m/d/Y h:iA",overpullSnapBackDuration:300,pullTpl:['
','
','','','','',"
",'
','

{message}

','
{updated}
',"
"].join(""),translatable:true},$state:"pull",getState:function(){return this.$state},setState:function(a){this.$state=a;this.updateView()},$isSnappingBack:false,getIsSnappingBack:function(){return this.$isSnappingBack},setIsSnappingBack:function(a){this.$isSnappingBack=a},init:function(b){var a=this;a.setList(b);a.initScrollable()},getElementConfig:function(){return{reference:"element",classList:["x-unsized"],children:[{reference:"innerElement",className:Ext.baseCSSPrefix+"list-pullrefresh"}]}},initScrollable:function(){var b=this,d=b.getList(),c=d.getScrollable(),a;if(!c){return}a=c.getScroller();a.setAutoRefresh(this.getScrollerAutoRefresh());b.lastUpdated=new Date();d.insert(0,b);a.on({scroll:b.onScrollChange,scope:b});this.updateView()},applyPullTpl:function(a){if(a instanceof Ext.XTemplate){return a}else{return new Ext.XTemplate(a)}},updateList:function(a,c){var b=this;if(a&&a!=c){a.on({order:"after",scrollablechange:b.initScrollable,scope:b})}else{if(c){c.un({order:"after",scrollablechange:b.initScrollable,scope:b})}}},getPullHeight:function(){return this.innerElement.getHeight()},fetchLatest:function(){var b=this.getList().getStore(),c=b.getProxy(),a;a=Ext.create("Ext.data.Operation",{page:1,start:0,model:b.getModel(),limit:b.getPageSize(),action:"read",sorters:b.getSorters(),filters:b.getRemoteFilter()?b.getFilters():[]});c.read(a,this.onLatestFetched,this)},onLatestFetched:function(d){var j=this.getList().getStore(),b=j.getData(),c=d.getRecords(),a=c.length,g=[],h,f,e;for(e=0;e=d+10){this.setState("release");b.getContainer().onBefore({dragend:"onScrollerDragEnd",single:true,scope:this})}else{if((this.getState()==="release")&&(-e tab",scope:a})},onTabTap:function(a){this.setActiveTab(a)},applyActiveTab:function(b,c){if(!b&&b!==0){return}var a=this.parseActiveTab(b);if(!a){return}return a},doSetDocked:function(a){var c=this.getLayout(),d=this.getInitialConfig(),b;if(!d.layout||!d.layout.pack){b=(a=="bottom")?"center":"left";if(c.isLayout){c.setPack(b)}else{c.pack=(c&&c.pack)?c.pack:b}}this.callParent(arguments)},doSetActiveTab:function(b,a){if(b){b.setActive(true)}if(a&&a.parent){a.setActive(false)}},parseActiveTab:function(a){if(typeof a=="number"){return this.getItems().items[a]}else{if(typeof a=="string"){a=Ext.getCmp(a)}}return a}});Ext.define("Ext.tab.Panel",{extend:Ext.Container,xtype:"tabpanel",alternateClassName:"Ext.TabPanel",config:{ui:"dark",tabBar:true,tabBarPosition:"top",layout:{type:"card",animation:{type:"slide",direction:"left"}},cls:Ext.baseCSSPrefix+"tabpanel"},initialize:function(){this.callParent();this.on({order:"before",activetabchange:"doTabChange",delegate:"> tabbar",scope:this});this.on({disabledchange:"onItemDisabledChange",delegate:"> component",scope:this})},platformConfig:[{theme:["Blackberry","Blackberry103"],tabBarPosition:"bottom"}],applyScrollable:function(){return false},updateUi:function(a,b){this.callParent(arguments);if(this.initialized){this.getTabBar().setUi(a)}},doSetActiveItem:function(d,j){if(d){var f=this.getInnerItems(),g=f.indexOf(j),i=f.indexOf(d),e=g>i,c=this.getLayout().getAnimation(),b=this.getTabBar(),h=b.parseActiveTab(g),a=b.parseActiveTab(i);if(c&&c.setReverse){c.setReverse(e)}this.callParent(arguments);if(i!=-1){this.forcedChange=true;b.setActiveTab(i);this.forcedChange=false;if(h){h.setActive(false)}if(a){a.setActive(true)}}}},doTabChange:function(a,d){var b=this.getActiveItem(),c;this.setActiveItem(a.indexOf(d));c=this.getActiveItem();return this.forcedChange||b!==c},applyTabBar:function(a){if(a===true){a={}}if(a){Ext.applyIf(a,{ui:this.getUi(),docked:this.getTabBarPosition()})}return Ext.factory(a,Ext.tab.Bar,this.getTabBar())},updateTabBar:function(a){if(a){this.add(a);this.setTabBarPosition(a.getDocked())}},updateTabBarPosition:function(b){var a=this.getTabBar();if(a){a.setDocked(b)}},onItemAdd:function(e){var k=this;if(!e.isInnerItem()){return k.callParent(arguments)}var c=k.getTabBar(),o=e.getInitialConfig(),d=o.tab||{},g=(e.getTitle)?e.getTitle():o.title,i=(e.getIconCls)?e.getIconCls():o.iconCls,j=(e.getHidden)?e.getHidden():o.hidden,n=(e.getDisabled)?e.getDisabled():o.disabled,p=(e.getBadgeText)?e.getBadgeText():o.badgeText,b=k.getInnerItems(),h=b.indexOf(e),l=c.getItems(),a=c.getActiveTab(),m=(l.length>=b.length)&&l.getAt(h),f;if(g&&!d.title){d.title=g}if(i&&!d.iconCls){d.iconCls=i}if(j&&!d.hidden){d.hidden=j}if(n&&!d.disabled){d.disabled=n}if(p&&!d.badgeText){d.badgeText=p}f=Ext.factory(d,Ext.tab.Tab,m);if(!m){c.insert(h,f)}e.tab=f;k.callParent(arguments);if(!a&&a!==0){c.setActiveTab(c.getActiveItem())}},onItemDisabledChange:function(a,b){if(a&&a.tab){a.tab.setDisabled(b)}},onItemRemove:function(b,a){this.getTabBar().remove(b.tab,this.getAutoDestroy());this.callParent(arguments)}},function(){});Ext.define("Ext.table.Cell",{extend:Ext.Container,xtype:"tablecell",config:{baseCls:"x-table-cell"},getElementConfig:function(){var a=this.callParent();a.children.length=0;return a}});Ext.define("Ext.table.Row",{extend:Ext.table.Cell,xtype:"tablerow",config:{baseCls:"x-table-row",defaultType:"tablecell"}});Ext.define("Ext.table.Table",{extend:Ext.Container,xtype:"table",config:{baseCls:"x-table",defaultType:"tablerow"},cachedConfig:{fixedLayout:false},fixedLayoutCls:"x-table-fixed",updateFixedLayout:function(a){this.innerElement[a?"addCls":"removeCls"](this.fixedLayoutCls)}});Ext.define("Ext.util.Droppable",{mixins:{observable:Ext.mixin.Observable},config:{baseCls:Ext.baseCSSPrefix+"droppable"},activeCls:Ext.baseCSSPrefix+"drop-active",invalidCls:Ext.baseCSSPrefix+"drop-invalid",hoverCls:Ext.baseCSSPrefix+"drop-hover",validDropMode:"intersect",disabled:false,group:"base",tolerance:null,monitoring:false,constructor:function(b,a){var c=this;a=a||{};Ext.apply(c,a);c.el=Ext.get(b);c.callParent();c.mixins.observable.constructor.call(c);if(!c.disabled){c.enable()}c.el.addCls(c.baseCls)},onDragStart:function(a,b){if(a.group===this.group){this.monitoring=true;this.el.addCls(this.activeCls);this.region=this.el.getPageBox(true);a.on({drag:this.onDrag,beforedragend:this.onBeforeDragEnd,dragend:this.onDragEnd,scope:this});if(this.isDragOver(a)){this.setCanDrop(true,a,b)}this.fireEvent("dropactivate",this,a,b)}else{a.on({dragend:function(){this.el.removeCls(this.invalidCls)},scope:this,single:true});this.el.addCls(this.invalidCls)}},isDragOver:function(a,b){return this.region[this.validDropMode](a.region)},onDrag:function(a,b){this.setCanDrop(this.isDragOver(a),a,b)},setCanDrop:function(c,a,b){if(c&&!this.canDrop){this.canDrop=true;this.el.addCls(this.hoverCls);this.fireEvent("dropenter",this,a,b)}else{if(!c&&this.canDrop){this.canDrop=false;this.el.removeCls(this.hoverCls);this.fireEvent("dropleave",this,a,b)}}},onBeforeDragEnd:function(a,b){a.cancelRevert=this.canDrop},onDragEnd:function(a,b){this.monitoring=false;this.el.removeCls(this.activeCls);a.un({drag:this.onDrag,beforedragend:this.onBeforeDragEnd,dragend:this.onDragEnd,scope:this});if(this.canDrop){this.canDrop=false;this.el.removeCls(this.hoverCls);this.fireEvent("drop",this,a,b)}this.fireEvent("dropdeactivate",this,a,b)},enable:function(){if(!this.mgr){this.mgr=Ext.util.Observable.observe(Ext.util.Draggable)}this.mgr.on({dragstart:this.onDragStart,scope:this});this.disabled=false},disable:function(){this.mgr.un({dragstart:this.onDragStart,scope:this});this.disabled=true},isDisabled:function(){return this.disabled},isMonitoring:function(){return this.monitoring}});Ext.define("Ext.util.TranslatableList",{extend:Ext.util.translatable.Abstract,config:{items:[]},applyItems:function(a){return Ext.Array.from(a)},doTranslate:function(a,h){var b=this.getItems(),g=0,c,e,d,f;for(c=0,e=b.length;c0){c=b.touches[0];if(c&&c.target&&this.isInputRegex.test(c.target.tagName)){return}}if(a&&a.nodeType===1&&!this.isInputRegex.test(a.tagName)){b.preventDefault()}},doPreventZooming:function(b){if("button" in b&&b.button!==0){return}var a=b.target,c;if(this.isInteractiveWebComponentRegEx.test(a.tagName)&&b.touches&&b.touches.length>0){c=b.touches[0];if(c&&c.target&&this.isInputRegex.test(c.target.tagName)){return}}if(a&&a.nodeType===1&&!this.isInputRegex.test(a.tagName)){b.preventDefault()}},addWindowListener:function(b,c,a){window.addEventListener(b,c,Boolean(a))},removeWindowListener:function(b,c,a){window.removeEventListener(b,c,Boolean(a))},doAddListener:function(a,d,c,b){if(a==="ready"&&this.isReady&&!this.isMaximizing){d.call(c);return this}return this.callSuper(arguments)},determineOrientation:function(){if(Ext.feature.has.Orientation){var a=this.getWindowOrientation();if(Math.abs(a)===90||a===270){return this.LANDSCAPE}else{return this.PORTRAIT}}else{if(Ext.feature.has.MatchMedia){return window.matchMedia("(orientation : landscape)").matches?this.LANDSCAPE:this.PORTRAIT}else{if(this.orientationElement){return this.orientationElement.getStyle("content")}}}},updateOrientation:function(b,a){if(a){this.fireOrientationChangeEvent(b,a)}},onOrientationChange:function(){this.setOrientation(this.determineOrientation())},onResize:function(){this.updateSize();this.setOrientation(this.determineOrientation())},fireOrientationChangeEvent:function(b,c){var a=Ext.baseCSSPrefix;Ext.getBody().replaceCls(a+c,a+b);this.updateSize();this.fireEvent("orientationchange",this,b,this.windowWidth,this.windowHeight)},updateSize:function(b,a){this.windowWidth=b!==undefined?b:this.getWindowWidth();this.windowHeight=a!==undefined?a:this.getWindowHeight();return this},maximize:function(){this.fireMaximizeEvent()},fireMaximizeEvent:function(){this.updateSize();this.fireEvent("maximize",this)},doSetHeight:function(a){Ext.getBody().setHeight(a);this.callParent(arguments)},doSetWidth:function(a){Ext.getBody().setWidth(a);this.callParent(arguments)},scrollToTop:function(){window.scrollTo(0,-1)},getWindowWidth:function(){return window.innerWidth},getWindowHeight:function(){return window.innerHeight},getWindowOuterHeight:function(){return window.outerHeight},getWindowOrientation:function(){return window.orientation},getSize:function(){return{width:this.windowWidth,height:this.windowHeight}},onItemFullscreenChange:function(a){a.addCls(this.fullscreenItemCls);this.add(a)},waitUntil:function(h,e,g,a,f){if(!a){a=50}if(!f){f=2000}var c=this,b=0;setTimeout(function d(){b+=a;if(h.call(c)===true){if(e){e.call(c)}}else{if(b>=f){if(g){g.call(c)}}else{setTimeout(d,a)}}},a)},setMenu:function(e,a){var b=this;a=a||{};if(Ext.os.is.iOS&&!this.hasiOSOrientationFix){this.hasiOSOrientationFix=true;this.on("orientationchange",function(){window.scrollTo(0,0)},this)}if(!e){return}if(!a.side){return}if(["left","right","top","bottom"].indexOf(a.side)==-1){return}var d=b.getMenus();if(!d){d={}}if(!b.addedSwipeListener){b.addedSwipeListener=true;b.element.on({tap:b.onTap,swipestart:b.onSwipeStart,edgeswipestart:b.onEdgeSwipeStart,edgeswipe:b.onEdgeSwipe,edgeswipeend:b.onEdgeSwipeEnd,scope:b});if(window.blackberry){var c=function(){var f=b.getMenus(),g=f.top;if(!g){return}if(g.isHidden()){b.showMenu("top")}else{b.hideMenu("top")}};if(blackberry.app&&blackberry.app.event&&blackberry.app.event.onSwipeDown){blackberry.app.event.onSwipeDown(c)}else{if(blackberry.event&&blackberry.event.addEventListener){blackberry.event.addEventListener("swipedown",c)}}}}d[a.side]=e;e.$reveal=Boolean(a.reveal);e.$cover=a.cover!==false&&!e.$reveal;e.$side=a.side;b.fixMenuSize(e,a.side);if(a.side=="left"){e.setLeft(0);e.setRight(null);e.setTop(0);e.setBottom(0)}else{if(a.side=="right"){e.setLeft(null);e.setRight(0);e.setTop(0);e.setBottom(0)}else{if(a.side=="top"){e.setLeft(0);e.setRight(0);e.setTop(0);e.setBottom(null)}else{if(a.side=="bottom"){e.setLeft(0);e.setRight(0);e.setTop(null);e.setBottom(0)}}}}b.setMenus(d)},removeMenu:function(a){var b=this.getMenus()||{},c=b[a];if(c){this.hideMenu(a)}delete b[a];this.setMenus(b)},fixMenuSize:function(b,a){if(a=="top"||a=="bottom"){b.setWidth("100%")}else{if(a=="left"||a=="right"){b.setHeight("100%")}}},showMenu:function(b){var e=this.getMenus(),h=e[b],d,g,f,c;if(!h||h.isAnimating){return}this.hideOtherMenus(b);d={translateX:0,translateY:0};g={translateX:0,translateY:0};f={translateX:0,translateY:0};c={translateX:0,translateY:0};if(h.$reveal){Ext.getBody().insertFirst(h.element)}else{Ext.Viewport.add(h)}h.show();h.addCls("x-"+b);var a=(b=="left"||b=="right")?h.element.getWidth():h.element.getHeight();if(b=="left"){d.translateX=-a;c.translateX=a}else{if(b=="right"){d.translateX=a;c.translateX=-a}else{if(b=="top"){d.translateY=-a;c.translateY=a}else{if(b=="bottom"){d.translateY=a;c.translateY=-a}}}}if(h.$reveal){if(Ext.browser.getPreferredTranslationMethod()!="scrollposition"){h.translate(0,0)}}else{h.translate(d.translateX,d.translateY)}if(h.$cover){h.getTranslatable().on("animationend",function(){h.isAnimating=false},this,{single:true});h.translate(g.translateX,g.translateY,{preserveEndState:true,duration:200})}else{this.translate(f.translateX,f.translateY);this.getTranslatable().on("animationend",function(){h.isAnimating=false},this,{single:true});this.translate(c.translateX,c.translateY,{preserveEndState:true,duration:200})}h.isAnimating=true},hideMenu:function(c,a){var e=this.getMenus(),g=e[c],f,d,b;a=(a===false)?false:true;if(!g||(g.isHidden()||g.isAnimating)){return}f={translateX:0,translateY:0};d={translateX:0,translateY:0};b=(c=="left"||c=="right")?g.element.getWidth():g.element.getHeight();if(c=="left"){f.translateX=-b}else{if(c=="right"){f.translateX=b}else{if(c=="top"){f.translateY=-b}else{if(c=="bottom"){f.translateY=b}}}}if(g.$cover){if(a){g.getTranslatable().on("animationend",function(){g.isAnimating=false;g.hide()},this,{single:true});g.translate(f.translateX,f.translateY,{preserveEndState:true,duration:200})}else{g.translate(f.translateX,f.translateY);g.hide()}}else{if(a){this.getTranslatable().on("animationend",function(){g.isAnimating=false;g.hide()},this,{single:true});this.translate(d.translateX,d.translateY,{preserveEndState:true,duration:200})}else{this.translate(d.translateX,d.translateY);g.hide()}}},hideAllMenus:function(c){var b=this.getMenus();for(var a in b){this.hideMenu(a,c)}},hideOtherMenus:function(a,c){var b=this.getMenus();for(var d in b){if(a!=d){this.hideMenu(d,c)}}},toggleMenu:function(a){var b=this.getMenus(),c;if(b[a]){c=b[a];if(c.isHidden()){this.showMenu(a)}else{this.hideMenu(a)}}},sideForDirection:function(a){if(a=="left"){return"right"}else{if(a=="right"){return"left"}else{if(a=="up"){return"bottom"}else{if(a=="down"){return"top"}}}}},sideForSwipeDirection:function(a){if(a=="up"){return"top"}else{if(a=="down"){return"bottom"}}return a},onTap:function(a){},onSwipeStart:function(b){var a=this.sideForSwipeDirection(b.direction);this.hideMenu(a)},onEdgeSwipeStart:function(h){var j=this.sideForDirection(h.direction),d=this.getMenus(),b=d[j],k,i;if(!b||!b.isHidden()){return}for(k in d){i=d[k];if(i.isHidden()!==false){return}}this.$swiping=true;this.hideAllMenus(false);if(b.$reveal){Ext.getBody().insertFirst(b.element)}else{Ext.Viewport.add(b)}b.show();var l=(j=="left"||j=="right")?b.element.getWidth():b.element.getHeight(),a,g;a={translateX:0,translateY:0};g={translateX:0,translateY:0};if(j=="left"){a.translateX=-l}else{if(j=="right"){a.translateX=l}else{if(j=="top"){a.translateY=-l}else{if(j=="bottom"){a.translateY=l}}}}var c="webkitTransform" in document.createElement("div").style?"webkitTransform":"transform",f=b.element.dom.style[c];if(f){b.element.dom.style[c]=""}if(b.$reveal){if(Ext.browser.getPreferredTranslationMethod()!="scrollposition"){b.translate(0,0)}}else{b.translate(a.translateX,a.translateY)}if(!b.$cover){if(f){this.innerElement.dom.style[c]=""}this.translate(g.translateX,g.translateY)}},onEdgeSwipe:function(g){var c=this.sideForDirection(g.direction),i=this.getMenus()[c];if(!i||!this.$swiping){return}var b=(c=="left"||c=="right")?i.element.getWidth():i.element.getHeight(),h,f,a=Math.min(g.distance-b,0),d=Math.min(g.distance,b);h={translateX:0,translateY:0};f={translateX:0,translateY:0};if(c=="left"){h.translateX=a;f.translateX=d}else{if(c=="right"){h.translateX=-a;f.translateX=-d}else{if(c=="top"){h.translateY=a;f.translateY=d}else{if(c=="bottom"){h.translateY=-a;f.translateY=-d}}}}if(i.$cover){i.translate(h.translateX,h.translateY)}else{this.translate(f.translateX,f.translateY)}},onEdgeSwipeEnd:function(i){var j=this.sideForDirection(i.direction),b=this.getMenus()[j],h=false;if(!b){return}var k=(j=="left"||j=="right")?b.element.getWidth():b.element.getHeight(),f=(i.flick)?i.flick.velocity:0;if(j=="right"){if(f.x>0){h=true}}else{if(j=="left"){if(f.x<0){h=true}}else{if(j=="top"){if(f.y<0){h=true}}else{if(j=="bottom"){if(f.y>0){h=true}}}}}var c=(h)?k:0,d=(h)?0:-k,a,g;a={translateX:0,translateY:0};g={translateX:0,translateY:0};if(j=="left"){a.translateX=-c;g.translateX=-d}else{if(j=="right"){a.translateX=c;g.translateX=d}else{if(j=="top"){a.translateY=-c;g.translateY=-d}else{if(j=="bottom"){a.translateY=c;g.translateY=d}}}}if(b.$cover){b.getTranslatable().on("animationend",function(){if(h){b.hide()}},this,{single:true});b.translate(a.translateX,a.translateY,{preserveEndState:true,duration:200})}else{this.getTranslatable().on("animationend",function(){if(h){b.hide()}},this,{single:true});this.translate(g.translateX,g.translateY,{preserveEndState:true,duration:200})}this.$swiping=false}});Ext.define("Ext.viewport.AndroidStock",{extend:Ext.viewport.Default,alternateClassName:["Ext.viewport.Android"],config:{translatable:{translationMethod:"csstransform"}},constructor:function(){this.on("orientationchange","hideKeyboardIfNeeded",this,{prepend:true});this.callSuper(arguments)},getWindowWidth:function(){return this.element.getWidth()},getWindowHeight:function(){return this.element.getHeight()},getDummyInput:function(){var a=this.dummyInput,c=this.focusedElement,b=Ext.fly(c).getPageBox();if(!a){this.dummyInput=a=document.createElement("input");a.style.position="absolute";a.style.opacity="0";a.style.pointerEvents="none";document.body.appendChild(a)}a.style.left=b.left+"px";a.style.top=b.top+"px";a.style.display="";return a},doBlurInput:function(c){var b=c.target,d=this.focusedElement,a;if(d&&!this.isInputRegex.test(b.tagName)){a=this.getDummyInput();delete this.focusedElement;a.focus();setTimeout(function(){a.style.display="none"},100)}},hideKeyboardIfNeeded:function(){var a=arguments[arguments.length-1],b=this.focusedElement;if(b){delete this.focusedElement;a.pause();if(Ext.os.version.lt("4")){b.style.display="none"}else{b.blur()}setTimeout(function(){b.style.display="";a.resume()},1000)}},getActualWindowOuterHeight:function(){return Math.round(this.getWindowOuterHeight()/window.devicePixelRatio)},maximize:function(){var c=this.stretchHeights,b=this.getOrientation(),a;a=c[b];if(!a){c[b]=a=this.getActualWindowOuterHeight()}if(!this.addressBarHeight){this.addressBarHeight=a-this.getWindowHeight()}this.setHeight(a);var d=Ext.Function.bind(this.isHeightMaximized,this,[a]);this.scrollToTop();this.waitUntil(d,this.fireMaximizeEvent,this.fireMaximizeEvent)},isHeightMaximized:function(a){this.scrollToTop();return this.getWindowHeight()===a},doPreventZooming:function(b){if("button" in b&&b.button!==0){return}var a=b.target;if(a&&a.nodeType===1&&!this.isInputRegex.test(a.tagName)&&!this.focusedElement){b.preventDefault()}}},function(){if(!Ext.os.is.Android){return}var a=Ext.os.version,b=Ext.browser.userAgent,c=/(htc|desire|incredible|ADR6300)/i.test(b)&&a.lt("2.3");if(c){this.override({constructor:function(d){if(!d){d={}}d.autoMaximize=false;this.watchDogTick=Ext.Function.bind(this.watchDogTick,this);setInterval(this.watchDogTick,1000);return this.callParent([d])},watchDogTick:function(){this.watchDogLastTick=Ext.Date.now()},doPreventPanning:function(){var e=Ext.Date.now(),f=this.watchDogLastTick,d=e-f;if(d>=2000){return}return this.callParent(arguments)},doPreventZooming:function(){var e=Ext.Date.now(),f=this.watchDogLastTick,d=e-f;if(d>=2000){return}return this.callParent(arguments)}})}if(a.match("2")){this.override({onReady:function(){this.addWindowListener("resize",Ext.Function.bind(this.onWindowResize,this));this.callParent(arguments)},scrollToTop:function(){document.body.scrollTop=100},onWindowResize:function(){var e=this.windowWidth,g=this.windowHeight,f=this.getWindowWidth(),d=this.getWindowHeight();if(this.getAutoMaximize()&&!this.isMaximizing&&!this.orientationChanging&&window.scrollY===0&&e===f&&d=g-this.addressBarHeight)||!this.focusedElement)){this.scrollToTop()}}})}else{if(a.gtEq("3.1")){this.override({isHeightMaximized:function(d){this.scrollToTop();return this.getWindowHeight()===d-1}})}else{if(a.match("3")){this.override({isHeightMaximized:function(){this.scrollToTop();return true}})}}}if(a.gtEq("4")){this.override({doBlurInput:Ext.emptyFn})}});Ext.define("Ext.viewport.Ios",{extend:Ext.viewport.Default,isFullscreen:function(){return this.isHomeScreen()},isHomeScreen:function(){return window.navigator.standalone===true},constructor:function(){this.callParent(arguments);if(this.getAutoMaximize()&&!this.isFullscreen()){this.addWindowListener("touchstart",Ext.Function.bind(this.onTouchStart,this))}},maximize:function(){if(this.isFullscreen()){return this.callParent()}var c=this.stretchHeights,b=this.getOrientation(),d=this.getWindowHeight(),a=c[b];if(window.scrollY>0){this.scrollToTop();if(!a){c[b]=a=this.getWindowHeight()}this.setHeight(a);this.fireMaximizeEvent()}else{if(!a){a=this.getScreenHeight()}this.setHeight(a);this.waitUntil(function(){this.scrollToTop();return d!==this.getWindowHeight()},function(){if(!c[b]){a=c[b]=this.getWindowHeight();this.setHeight(a)}this.fireMaximizeEvent()},function(){a=c[b]=this.getWindowHeight();this.setHeight(a);this.fireMaximizeEvent()},50,1000)}},getScreenHeight:function(){var a=this.getOrientation();return window.screen[a===this.PORTRAIT?"height":"width"]},onElementFocus:function(){if(this.getAutoMaximize()&&!this.isFullscreen()){clearTimeout(this.scrollToTopTimer)}this.callParent(arguments)},onElementBlur:function(){if(this.getAutoMaximize()&&!this.isFullscreen()){this.scrollToTopTimer=setTimeout(this.scrollToTop,500)}this.callParent(arguments)},onTouchStart:function(){if(this.focusedElement===null){this.scrollToTop()}},scrollToTop:function(){window.scrollTo(0,0)}},function(){if(!Ext.os.is.iOS){return}if(Ext.os.version.lt("3.2")){this.override({constructor:function(){var a=this.stretchHeights={};a[this.PORTRAIT]=416;a[this.LANDSCAPE]=268;return this.callOverridden(arguments)}})}if(Ext.os.version.lt("5")){this.override({fieldMaskClsTest:"-field-mask",doPreventZooming:function(b){var a=b.target;if(a&&a.nodeType===1&&!this.isInputRegex.test(a.tagName)&&a.className.indexOf(this.fieldMaskClsTest)==-1){b.preventDefault()}}})}if(Ext.os.is.iPad){this.override({isFullscreen:function(){return true}})}if(Ext.os.version.gtEq("7")){if(Ext.os.deviceType==="Tablet"||!Ext.browser.is.Safari||window.navigator.standalone){this.override({constructor:function(){var d={},b={},a=this.determineOrientation(),f=window.screen.height,c=window.screen.width,e=a===this.PORTRAIT?f-window.innerHeight:c-window.innerHeight;d[this.PORTRAIT]=f-e;d[this.LANDSCAPE]=c-e;b[this.PORTRAIT]=c;b[this.LANDSCAPE]=f;this.stretchHeights=d;this.stretchWidths=b;this.callOverridden(arguments);this.on("ready",this.setViewportSizeToAbsolute,this);this.on("orientationchange",this.setViewportSizeToAbsolute,this)},getWindowHeight:function(){var a=this.getOrientation();return this.stretchHeights[a]},getWindowWidth:function(){var a=this.getOrientation();return this.stretchWidths[a]},setViewportSizeToAbsolute:function(){this.setWidth(this.getWindowWidth());this.setHeight(this.getWindowHeight())}})}if(Ext.os.deviceType==="Tablet"){this.override({constructor:function(){this.callOverridden(arguments);window.addEventListener("scroll",function(){if(window.scrollX!==0){window.scrollTo(0,window.scrollY)}},false)},setViewportSizeToAbsolute:function(){window.scrollTo(0,0);this.callOverridden(arguments)},onElementBlur:function(){this.callOverridden(arguments);if(window.scrollY!==0){window.scrollTo(0,0)}}})}}});Ext.define("Ext.viewport.WindowsPhone",{requires:[],alternateClassName:"Ext.viewport.WP",extend:Ext.viewport.Default,config:{translatable:{translationMethod:"csstransform"}},initialize:function(){var a=function(d){var c=d.srcElement.nodeName.toUpperCase(),b=["INPUT","TEXTAREA"];if(b.indexOf(c)==-1){return false}};document.body.addEventListener("onselectstart",a);this.callParent(arguments)}});Ext.define("Ext.viewport.Viewport",{constructor:function(b){var c=Ext.os.name,d,a;switch(c){case"Android":d=(Ext.browser.name=="ChromeMobile")?"Default":"AndroidStock";break;case"iOS":d="Ios";break;case"Windows":d=(Ext.browser.name=="IE")?"WindowsPhone":"Default";break;case"WindowsPhone":d="WindowsPhone";break;default:d="Default";break}a=Ext.create("Ext.viewport."+d,b);return a}}); \ No newline at end of file +(function(){var global=this,objectPrototype=Object.prototype,toString=objectPrototype.toString,enumerables=true,enumerablesTest={toString:1},emptyFn=function(){},i;if(typeof Ext==="undefined"){global.Ext={}}Ext.global=global;for(i in enumerablesTest){enumerables=null}if(enumerables){enumerables=["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","constructor"]}Ext.enumerables=enumerables;Ext.apply=function(object,config,defaults){if(defaults){Ext.apply(object,defaults)}if(object&&config&&typeof config==="object"){var i,j,k;for(i in config){object[i]=config[i]}if(enumerables){for(j=enumerables.length;j--;){k=enumerables[j];if(config.hasOwnProperty(k)){object[k]=config[k]}}}}return object};Ext.buildSettings=Ext.apply({baseCSSPrefix:"x-",scopeResetCSS:false},Ext.buildSettings||{});Ext.apply(Ext,{emptyFn:emptyFn,baseCSSPrefix:Ext.buildSettings.baseCSSPrefix,applyIf:function(object,config){var property;if(object){for(property in config){if(object[property]===undefined){object[property]=config[property]}}}return object},iterate:function(object,fn,scope){if(Ext.isEmpty(object)){return}if(scope===undefined){scope=object}if(Ext.isIterable(object)){Ext.Array.each.call(Ext.Array,object,fn,scope)}else{Ext.Object.each.call(Ext.Object,object,fn,scope)}}});Ext.apply(Ext,{extend:function(){var objectConstructor=objectPrototype.constructor,inlineOverrides=function(o){for(var m in o){if(!o.hasOwnProperty(m)){continue}this[m]=o[m]}};return function(subclass,superclass,overrides){if(Ext.isObject(superclass)){overrides=superclass;superclass=subclass;subclass=overrides.constructor!==objectConstructor?overrides.constructor:function(){superclass.apply(this,arguments)}}var F=function(){},subclassProto,superclassProto=superclass.prototype;F.prototype=superclassProto;subclassProto=subclass.prototype=new F();subclassProto.constructor=subclass;subclass.superclass=superclassProto;if(superclassProto.constructor===objectConstructor){superclassProto.constructor=superclass}subclass.override=function(overrides){Ext.override(subclass,overrides)};subclassProto.override=inlineOverrides;subclassProto.proto=subclassProto;subclass.override(overrides);subclass.extend=function(o){return Ext.extend(subclass,o)};return subclass}}(),override:function(cls,overrides){if(cls.$isClass){return cls.override(overrides)}else{Ext.apply(cls.prototype,overrides)}}});Ext.apply(Ext,{valueFrom:function(value,defaultValue,allowBlank){return Ext.isEmpty(value,allowBlank)?defaultValue:value},typeOf:function(value){if(value===null){return"null"}var type=typeof value;if(type==="undefined"||type==="string"||type==="number"||type==="boolean"){return type}var typeToString=toString.call(value);switch(typeToString){case"[object Array]":return"array";case"[object Date]":return"date";case"[object Boolean]":return"boolean";case"[object Number]":return"number";case"[object RegExp]":return"regexp"}if(type==="function"){return"function"}if(type==="object"){if(value.nodeType!==undefined){if(value.nodeType===3){return(/\S/).test(value.nodeValue)?"textnode":"whitespace"}else{return"element"}}return"object"}},isEmpty:function(value,allowEmptyString){return(value===null)||(value===undefined)||(!allowEmptyString?value==="":false)||(Ext.isArray(value)&&value.length===0)},isArray:("isArray" in Array)?Array.isArray:function(value){return toString.call(value)==="[object Array]"},isDate:function(value){return toString.call(value)==="[object Date]"},isMSDate:function(value){if(!Ext.isString(value)){return false}else{return value.match("\\\\?/Date\\(([-+])?(\\d+)(?:[+-]\\d{4})?\\)\\\\?/")!==null}},isObject:(toString.call(null)==="[object Object]")?function(value){return value!==null&&value!==undefined&&toString.call(value)==="[object Object]"&&value.ownerDocument===undefined}:function(value){return toString.call(value)==="[object Object]"},isSimpleObject:function(value){return value instanceof Object&&value.constructor===Object},isPrimitive:function(value){var type=typeof value;return type==="string"||type==="number"||type==="boolean"},isFunction:(typeof document!=="undefined"&&typeof document.getElementsByTagName("body")==="function")?function(value){return toString.call(value)==="[object Function]"}:function(value){return typeof value==="function"},isNumber:function(value){return typeof value==="number"&&isFinite(value)},isNumeric:function(value){return !isNaN(parseFloat(value))&&isFinite(value)},isString:function(value){return typeof value==="string"},isBoolean:function(value){return typeof value==="boolean"},isElement:function(value){return value?value.nodeType===1:false},isTextNode:function(value){return value?value.nodeName==="#text":false},isDefined:function(value){return typeof value!=="undefined"},isIterable:function(value){return(value&&typeof value!=="string")?value.length!==undefined:false}});Ext.apply(Ext,{clone:function(item){if(item===null||item===undefined){return item}if(item.nodeType&&item.cloneNode){return item.cloneNode(true)}var type=toString.call(item);if(type==="[object Date]"){return new Date(item.getTime())}var i,j,k,clone,key;if(type==="[object Array]"){i=item.length;clone=[];while(i--){clone[i]=Ext.clone(item[i])}}else{if(type==="[object Object]"&&item.constructor===Object){clone={};for(key in item){clone[key]=Ext.clone(item[key])}if(enumerables){for(j=enumerables.length;j--;){k=enumerables[j];clone[k]=item[k]}}}}return clone||item},getUniqueGlobalNamespace:function(){var uniqueGlobalNamespace=this.uniqueGlobalNamespace;if(uniqueGlobalNamespace===undefined){var i=0;do{uniqueGlobalNamespace="ExtBox"+(++i)}while(Ext.global[uniqueGlobalNamespace]!==undefined);Ext.global[uniqueGlobalNamespace]=Ext;this.uniqueGlobalNamespace=uniqueGlobalNamespace}return uniqueGlobalNamespace},functionFactory:function(){var args=Array.prototype.slice.call(arguments),ln=args.length;if(ln>0){args[ln-1]="var Ext=window."+this.getUniqueGlobalNamespace()+";"+args[ln-1]}return Function.prototype.constructor.apply(Function.prototype,args)},globalEval:("execScript" in global)?function(code){global.execScript(code)}:function(code){(function(){eval(code)})()}});Ext.type=Ext.typeOf})();(function(){var a="2.4.2.571",b;Ext.Version=b=Ext.extend(Object,{constructor:function(d){var c=this.toNumber,f,e;if(d instanceof b){return d}this.version=this.shortVersion=String(d).toLowerCase().replace(/_/g,".").replace(/[\-+]/g,"");e=this.version.search(/([^\d\.])/);if(e!==-1){this.release=this.version.substr(e,d.length);this.shortVersion=this.version.substr(0,e)}this.shortVersion=this.shortVersion.replace(/[^\d]/g,"");f=this.version.split(".");this.major=c(f.shift());this.minor=c(f.shift());this.patch=c(f.shift());this.build=c(f.shift());return this},toNumber:function(c){c=parseInt(c||0,10);if(isNaN(c)){c=0}return c},toString:function(){return this.version},valueOf:function(){return this.version},getMajor:function(){return this.major||0},getMinor:function(){return this.minor||0},getPatch:function(){return this.patch||0},getBuild:function(){return this.build||0},getRelease:function(){return this.release||""},isGreaterThan:function(c){return b.compare(this.version,c)===1},isGreaterThanOrEqual:function(c){return b.compare(this.version,c)>=0},isLessThan:function(c){return b.compare(this.version,c)===-1},isLessThanOrEqual:function(c){return b.compare(this.version,c)<=0},equals:function(c){return b.compare(this.version,c)===0},match:function(c){c=String(c);return this.version.substr(0,c.length)===c},toArray:function(){return[this.getMajor(),this.getMinor(),this.getPatch(),this.getBuild(),this.getRelease()]},getShortVersion:function(){return this.shortVersion},gt:function(){return this.isGreaterThan.apply(this,arguments)},lt:function(){return this.isLessThan.apply(this,arguments)},gtEq:function(){return this.isGreaterThanOrEqual.apply(this,arguments)},ltEq:function(){return this.isLessThanOrEqual.apply(this,arguments)}});Ext.apply(b,{releaseValueMap:{dev:-6,alpha:-5,a:-5,beta:-4,b:-4,rc:-3,"#":-2,p:-1,pl:-1},getComponentValue:function(c){return !c?0:(isNaN(c)?this.releaseValueMap[c]||c:parseInt(c,10))},compare:function(g,f){var d,e,c;g=new b(g).toArray();f=new b(f).toArray();for(c=0;ce){return 1}}}return 0}});Ext.apply(Ext,{versions:{},lastRegisteredVersion:null,setVersion:function(d,c){Ext.versions[d]=new b(c);Ext.lastRegisteredVersion=Ext.versions[d];return this},getVersion:function(c){if(c===undefined){return Ext.lastRegisteredVersion}return Ext.versions[c]},deprecate:function(c,e,f,d){if(b.compare(Ext.getVersion(c),e)<1){f.call(d)}}});Ext.setVersion("core",a)})();Ext.String={trimRegex:/^[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+|[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+$/g,escapeRe:/('|\\)/g,formatRe:/\{(\d+)\}/g,escapeRegexRe:/([-.*+?^${}()|[\]\/\\])/g,htmlEncode:(function(){var d={"&":"&",">":">","<":"<",'"':"""},b=[],c,a;for(c in d){b.push(c)}a=new RegExp("("+b.join("|")+")","g");return function(e){return(!e)?e:String(e).replace(a,function(g,f){return d[f]})}})(),htmlDecode:(function(){var d={"&":"&",">":">","<":"<",""":'"'},b=[],c,a;for(c in d){b.push(c)}a=new RegExp("("+b.join("|")+"|&#[0-9]{1,5};)","g");return function(e){return(!e)?e:String(e).replace(a,function(g,f){if(f in d){return d[f]}else{return String.fromCharCode(parseInt(f.substr(2),10))}})}})(),urlAppend:function(b,a){if(!Ext.isEmpty(a)){return b+(b.indexOf("?")===-1?"?":"&")+a}return b},trim:function(a){return a.replace(Ext.String.trimRegex,"")},capitalize:function(a){return a.charAt(0).toUpperCase()+a.substr(1)},ellipsis:function(c,a,d){if(c&&c.length>a){if(d){var e=c.substr(0,a-2),b=Math.max(e.lastIndexOf(" "),e.lastIndexOf("."),e.lastIndexOf("!"),e.lastIndexOf("?"));if(b!==-1&&b>=(a-15)){return e.substr(0,b)+"..."}}return c.substr(0,a-3)+"..."}return c},escapeRegex:function(a){return a.replace(Ext.String.escapeRegexRe,"\\$1")},escape:function(a){return a.replace(Ext.String.escapeRe,"\\$1")},toggle:function(b,c,a){return b===c?a:c},leftPad:function(b,c,d){var a=String(b);d=d||" ";while(a.lengthH){for(C=e;C--;){F[z+C]=F[H+C]}}}if(J&&G===B){F.length=B;F.push.apply(F,I)}else{F.length=B+J;for(C=0;C-1;y--){if(A.call(z||C[y],C[y],y,C)===false){return y}}}return true},forEach:i?function(z,y,e){return z.forEach(y,e)}:function(B,z,y){var e=0,A=B.length;for(;eD.length){return 1}else{if(E.lengthe){e=z}}}return e},mean:function(e){return e.length>0?a.sum(e)/e.length:undefined},sum:function(B){var y=0,e,A,z;for(e=0,A=B.length;e=c){f+=c}else{if(b*2<-c){f-=c}}}return Ext.Number.constrain(f,d,g)},toFixed:function(d,b){if(a){b=b||0;var c=Math.pow(10,b);return(Math.round(d*c)/c).toFixed(b)}return d.toFixed(b)},from:function(c,b){if(isFinite(c)){c=parseFloat(c)}return !isNaN(c)?c:b}}})();Ext.num=function(){return Ext.Number.from.apply(this,arguments)};(function(){var a=function(){};var b=Ext.Object={chain:("create" in Object)?function(c){return Object.create(c)}:function(d){a.prototype=d;var c=new a();a.prototype=null;return c},toQueryObjects:function(e,j,d){var c=b.toQueryObjects,h=[],f,g;if(Ext.isArray(j)){for(f=0,g=j.length;f0){h=n.split("=");v=decodeURIComponent(h[0]);m=(h[1]!==undefined)?decodeURIComponent(h[1]):"";if(!q){if(t.hasOwnProperty(v)){if(!Ext.isArray(t[v])){t[v]=[t[v]]}t[v].push(m)}else{t[v]=m}}else{g=v.match(/(\[):?([^\]]*)\]/g);s=v.match(/^([^\[]+)/);v=s[0];k=[];if(g===null){t[v]=m;continue}for(o=0,c=g.length;o0){return setTimeout(e,c)}e();return 0},createSequence:function(b,c,a){if(!c){return b}else{return function(){var d=b.apply(this,arguments);c.apply(a||this,arguments);return d}}},createBuffered:function(e,b,d,c){var a;return function(){var g=c||Array.prototype.slice.call(arguments,0),f=d||this;if(a){clearTimeout(a)}a=setTimeout(function(){e.apply(f,g)},b)}},createThrottled:function(e,b,d){var f,a,c,h,g=function(){e.apply(d||this,c);f=new Date().getTime()};return function(){a=new Date().getTime()-f;c=arguments;clearTimeout(h);if(!f||(a>=b)){g()}else{h=setTimeout(g,b-a)}}},interceptBefore:function(b,a,d,c){var e=b[a]||Ext.emptyFn;return(b[a]=function(){var f=d.apply(c||this,arguments);e.apply(this,arguments);return f})},interceptAfter:function(b,a,d,c){var e=b[a]||Ext.emptyFn;return(b[a]=function(){e.apply(this,arguments);return d.apply(c||this,arguments)})}};Ext.defer=Ext.Function.alias(Ext.Function,"defer");Ext.pass=Ext.Function.alias(Ext.Function,"pass");Ext.bind=Ext.Function.alias(Ext.Function,"bind");Ext.JSON=new (function(){var useHasOwn=!!{}.hasOwnProperty,isNative=function(){var useNative=null;return function(){if(useNative===null){useNative=Ext.USE_NATIVE_JSON&&window.JSON&&JSON.toString()=="[object JSON]"}return useNative}}(),pad=function(n){return n<10?"0"+n:n},doDecode=function(json){return eval("("+json+")")},doEncode=function(o){if(!Ext.isDefined(o)||o===null){return"null"}else{if(Ext.isArray(o)){return encodeArray(o)}else{if(Ext.isDate(o)){return Ext.JSON.encodeDate(o)}else{if(Ext.isString(o)){if(Ext.isMSDate(o)){return encodeMSDate(o)}else{return encodeString(o)}}else{if(typeof o=="number"){return isFinite(o)?String(o):"null"}else{if(Ext.isBoolean(o)){return String(o)}else{if(Ext.isObject(o)){return encodeObject(o)}else{if(typeof o==="function"){return"null"}}}}}}}}return"undefined"},m={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\","\x0b":"\\u000b"},charToReplace=/[\\\"\x00-\x1f\x7f-\uffff]/g,encodeString=function(s){return'"'+s.replace(charToReplace,function(a){var c=m[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"'},encodeArray=function(o){var a=["[",""],len=o.length,i;for(i=0;i0){for(d=0;d0){if(m===l){return o[m]}n=o[m];l=l.substring(m.length+1)}if(n.length>0){n+="/"}return n.replace(/\/\.\//g,"/")+l.replace(/\./g,"/")+".js"},getPrefix:function(m){var o=this.config.paths,n,l="";if(o.hasOwnProperty(m)){return m}for(n in o){if(o.hasOwnProperty(n)&&n+"."===m.substring(0,n.length+1)){if(n.length>l.length){l=n}}}return l},require:function(n,m,l,o){if(m){m.call(l)}},syncRequire:function(){},exclude:function(m){var l=this;return{require:function(p,o,n){return l.require(p,o,n,m)},syncRequire:function(p,o,n){return l.syncRequire(p,o,n,m)}}},onReady:function(o,n,p,l){var m;if(p!==false&&Ext.onDocumentReady){m=o;o=function(){Ext.onDocumentReady(m,n,l)}}o.call(n)}};Ext.apply(b,{documentHead:typeof document!="undefined"&&(document.head||document.getElementsByTagName("head")[0]),isLoading:false,queue:[],isClassFileLoaded:{},isFileLoaded:{},readyListeners:[],optionalRequires:[],requiresMap:{},numPendingFiles:0,numLoadedFiles:0,hasFileLoadError:false,classNameToFilePathMap:{},syncModeEnabled:false,scriptElements:{},refreshQueue:function(){var l=this.queue,r=l.length,o,q,m,p,n;if(r===0){this.triggerReady();return}for(o=0;othis.numLoadedFiles){continue}m=0;do{if(a.isCreated(p[m])){g(p,m,1)}else{m++}}while(m=200&&o<300)||o==304||(o==0&&r.length>0)){Ext.globalEval(r+"\n//@ sourceURL="+m);t.call(x)}else{}v=null}},syncRequire:function(){var l=this.syncModeEnabled;if(!l){this.syncModeEnabled=true}this.require.apply(this,arguments);if(!l){this.syncModeEnabled=false}this.refreshQueue()},require:function(G,u,o,r){var w={},n={},z=this.queue,D=this.classNameToFilePathMap,B=this.isClassFileLoaded,t=[],I=[],F=[],m=[],s,H,y,x,l,q,E,C,A,v,p;if(r){r=i(r);for(C=0,v=r.length;C0){t=a.getNamesByExpression(l);for(A=0,p=t.length;A0){s=function(){var L=[],K,M,J;for(K=0,M=m.length;K0){I=a.getNamesByExpression(x);p=I.length;for(A=0;A0){if(!this.config.enabled){throw new Error("Ext.Loader is not enabled, so dependencies cannot be resolved dynamically. Missing required class"+((F.length>1)?"es":"")+": "+F.join(", "))}}else{s.call(o);return this}H=this.syncModeEnabled;if(!H){z.push({requires:F.slice(),callback:s,scope:o})}v=F.length;for(C=0;C=2){if("1496x2048" in r){e(r["1496x2048"],"(orientation: landscape)")}if("1536x2008" in r){e(r["1536x2008"],"(orientation: portrait)")}if("144" in p){n(p["144"],"144x144",t)}}else{if("748x1024" in r){e(r["748x1024"],"(orientation: landscape)")}if("768x1004" in r){e(r["768x1004"],"(orientation: portrait)")}if("72" in p){n(p["72"],"72x72",t)}}}else{if(o>=2&&Ext.os.version.gtEq("4.3")){if(Ext.os.is.iPhone5){e(r["640x1096"])}else{e(r["640x920"])}if("114" in p){n(p["114"],"114x114",t)}}else{e(r["320x460"]);if("57" in p){n(p["57"],null,t)}}}},application:function(b){var a=b.name,e,d,c;if(!b){b={}}if(!Ext.Loader.config.paths[a]){Ext.Loader.setPath(a,b.appFolder||"app")}c=Ext.Array.from(b.requires);b.requires=["Ext.app.Application"];e=b.onReady;d=b.scope;b.onReady=function(){b.requires=c;new Ext.app.Application(b);if(e){e.call(d)}};Ext.setup(b)},factoryConfig:function(a,l){var g=Ext.isSimpleObject(a);if(g&&a.xclass){var f=a.xclass;delete a.xclass;Ext.require(f,function(){Ext.factoryConfig(a,function(i){l(Ext.create(f,i))})});return}var d=Ext.isArray(a),m=[],k,j,c,e;if(g||d){if(g){for(k in a){if(a.hasOwnProperty(k)){j=a[k];if(Ext.isSimpleObject(j)||Ext.isArray(j)){m.push(k)}}}}else{for(c=0,e=a.length;c=e){l(a);return}k=m[c];j=a[k];Ext.factoryConfig(j,h)}b();return}l(a)},factory:function(b,e,a,f){var d=Ext.ClassManager,c;if(!b||b.isInstance){if(a&&a!==b){a.destroy()}return b}if(f){if(typeof b=="string"){return d.instantiateByAlias(f+"."+b)}else{if(Ext.isObject(b)&&"type" in b){return d.instantiateByAlias(f+"."+b.type,b)}}}if(b===true){return a||d.instantiate(e)}if("xtype" in b){c=d.instantiateByAlias("widget."+b.xtype,b)}else{if("xclass" in b){c=d.instantiate(b.xclass,b)}}if(c){if(a){a.destroy()}return c}if(a){return a.setConfig(b)}return d.instantiate(e,b)},deprecateClassMember:function(b,c,a,d){return this.deprecateProperty(b.prototype,c,a,d)},deprecateClassMembers:function(b,c){var d=b.prototype,e,a;for(e in c){if(c.hasOwnProperty(e)){a=c[e];this.deprecateProperty(d,e,a)}}},deprecateProperty:function(b,c,a,d){if(!d){d="'"+c+"' is deprecated"}if(a){d+=", please use '"+a+"' instead"}if(a){Ext.Object.defineProperty(b,c,{get:function(){return this[a]},set:function(e){this[a]=e},configurable:true})}},deprecatePropertyValue:function(b,a,d,c){Ext.Object.defineProperty(b,a,{get:function(){return d},configurable:true})},deprecateMethod:function(b,a,d,c){b[a]=function(){if(d){return d.apply(this,arguments)}}},deprecateClassMethod:function(a,b,h,d){if(typeof b!="string"){var g,f;for(g in b){if(b.hasOwnProperty(g)){f=b[g];Ext.deprecateClassMethod(a,g,f)}}return}var c=typeof h=="string",e;if(!d){d="'"+b+"()' is deprecated, please use '"+(c?h:h.name)+"()' instead"}if(c){e=function(){return this[h].apply(this,arguments)}}else{e=function(){return h.apply(this,arguments)}}if(b in a.prototype){Ext.Object.defineProperty(a.prototype,b,{value:null,writable:true,configurable:true})}a.addMember(b,e)},isReady:false,readyListeners:[],triggerReady:function(){var b=Ext.readyListeners,a,c,d;if(!Ext.isReady){Ext.isReady=true;for(a=0,c=b.length;a0){return b+Ext.String.capitalize(a)}return a},getPreferredTranslationMethod:function(a){if(typeof a=="object"&&"translationMethod" in a&&a.translationMethod!=="auto"){return a.translationMethod}else{if(this.is.AndroidStock2||this.is.IE){return"scrollposition"}else{return"csstransform"}}}},function(){var a=Ext.browser=new this(Ext.global.navigator.userAgent)});Ext.define("Ext.env.OS",{statics:{names:{ios:"iOS",android:"Android",windowsPhone:"WindowsPhone",webos:"webOS",blackberry:"BlackBerry",rimTablet:"RIMTablet",mac:"MacOS",win:"Windows",tizen:"Tizen",linux:"Linux",bada:"Bada",chrome:"ChromeOS",other:"Other"},prefixes:{tizen:"(Tizen )",ios:"i(?:Pad|Phone|Pod)(?:.*)CPU(?: iPhone)? OS ",android:"(Android |HTC_|Silk/)",windowsPhone:"Windows Phone ",blackberry:"(?:BlackBerry|BB)(?:.*)Version/",rimTablet:"RIM Tablet OS ",webos:"(?:webOS|hpwOS)/",bada:"Bada/",chrome:"CrOS "}},is:Ext.emptyFn,name:null,version:null,setFlag:function(a,b){if(typeof b=="undefined"){b=true}this.is[a]=b;this.is[a.toLowerCase()]=b;return this},constructor:function(o,b,k){var l=this.statics(),j=l.names,d=l.prefixes,a,h="",c,g,f,n,e,m;k=k||Ext.browser;e=this.is=function(i){return this.is[i]===true};for(c in d){if(d.hasOwnProperty(c)){g=d[c];f=o.match(new RegExp("(?:"+g+")([^\\s;]+)"));if(f){a=j[c];m=f[1];if(m&&m=="HTC_"){h=new Ext.Version("2.3")}else{if(m&&m=="Silk/"){h=new Ext.Version("2.3")}else{h=new Ext.Version(f[f.length-1])}}break}}}if(!a){a=j[(o.toLowerCase().match(/mac|win|linux/)||["other"])[0]];h=new Ext.Version("")}this.name=a;this.version=h;if(b){this.setFlag(b.replace(/ simulator$/i,""))}this.setFlag(a);if(h){this.setFlag(a+(h.getMajor()||""));this.setFlag(a+h.getShortVersion())}for(c in j){if(j.hasOwnProperty(c)){n=j[c];if(!e.hasOwnProperty(a)){this.setFlag(n,(a===n))}}}if(this.name=="iOS"&&window.screen.height==568){this.setFlag("iPhone5")}if(k.is.Safari||k.is.Silk){if(this.is.Android2||this.is.Android3||k.version.shortVersion==501){k.setFlag("AndroidStock");k.setFlag("AndroidStock2")}if(this.is.Android4){k.setFlag("AndroidStock");k.setFlag("AndroidStock4")}}return this}},function(){var a=Ext.global.navigator,e=a.userAgent,b,g,d;Ext.os=b=new this(e,a.platform);g=b.name;var c=window.location.search.match(/deviceType=(Tablet|Phone)/),f=window.deviceType;if(c&&c[1]){d=c[1]}else{if(f==="iPhone"){d="Phone"}else{if(f==="iPad"){d="Tablet"}else{if(!b.is.Android&&!b.is.iOS&&!b.is.WindowsPhone&&/Windows|Linux|MacOS/.test(g)){d="Desktop";Ext.browser.is.WebView=Ext.browser.is.Ripple?true:false}else{if(b.is.iPad||b.is.RIMTablet||b.is.Android3||Ext.browser.is.Silk||(b.is.Android&&e.search(/mobile/i)==-1)){d="Tablet"}else{d="Phone"}}}}}b.setFlag(d,true);b.deviceType=d});Ext.define("Ext.env.Feature",{constructor:function(){this.testElements={};this.has=function(a){return !!this.has[a]};if(!Ext.theme){Ext.theme={name:"Default"}}Ext.theme.is={};Ext.theme.is[Ext.theme.name]=true;Ext.onDocumentReady(function(){this.registerTest({ProperHBoxStretching:function(){var b=document.createElement("div"),c=b.appendChild(document.createElement("div")),d=c.appendChild(document.createElement("div")),a;b.setAttribute("style","width: 100px; height: 100px; position: relative;");c.setAttribute("style","position: absolute; display: -ms-flexbox; display: -webkit-flex; display: -moz-flexbox; display: flex; -ms-flex-direction: row; -webkit-flex-direction: row; -moz-flex-direction: row; flex-direction: row; min-width: 100%;");d.setAttribute("style","width: 200px; height: 50px;");document.body.appendChild(b);a=c.offsetWidth;document.body.removeChild(b);return(a>100)}})},this)},getTestElement:function(a,b){if(a===undefined){a="div"}else{if(typeof a!=="string"){return a}}if(b){return document.createElement(a)}if(!this.testElements[a]){this.testElements[a]=document.createElement(a)}return this.testElements[a]},isStyleSupported:function(c,b){var d=this.getTestElement(b).style,a=Ext.String.capitalize(c);if(typeof d[c]!=="undefined"||typeof d[Ext.browser.getStylePrefix(c)+a]!=="undefined"){return true}return false},isStyleSupportedWithoutPrefix:function(b,a){var c=this.getTestElement(a).style;if(typeof c[b]!=="undefined"){return true}return false},isEventSupported:function(c,a){if(a===undefined){a=window}var e=this.getTestElement(a),b="on"+c.toLowerCase(),d=(b in e);if(!d){if(e.setAttribute&&e.removeAttribute){e.setAttribute(b,"");d=typeof e[b]==="function";if(typeof e[b]!=="undefined"){e[b]=undefined}e.removeAttribute(b)}}return d},getSupportedPropertyName:function(b,a){var c=Ext.browser.getVendorProperyName(a);if(c in b){return c}else{if(a in b){return a}}return null},registerTest:Ext.Function.flexSetter(function(a,b){this.has[a]=b.call(this);return this})},function(){Ext.feature=new this;var a=Ext.feature.has;Ext.feature.registerTest({Canvas:function(){var b=this.getTestElement("canvas");return !!(b&&b.getContext&&b.getContext("2d"))},Svg:function(){var b=document;return !!(b.createElementNS&&!!b.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect)},Vml:function(){var c=this.getTestElement(),b=false;c.innerHTML="";b=(c.childNodes.length===1);c.innerHTML="";return b},Touch:function(){return Ext.browser.is.Ripple||(this.isEventSupported("touchstart")&&!(Ext.os&&Ext.os.name.match(/Windows|MacOS|Linux/)&&!Ext.os.is.BlackBerry6))},Pointer:function(){return !!window.navigator.msPointerEnabled},Orientation:function(){return"orientation" in window},OrientationChange:function(){return this.isEventSupported("orientationchange")},DeviceMotion:function(){return this.isEventSupported("devicemotion")},Geolocation:function(){return"geolocation" in window.navigator},SqlDatabase:function(){return"openDatabase" in window},WebSockets:function(){return"WebSocket" in window},Range:function(){return !!document.createRange},CreateContextualFragment:function(){var b=!!document.createRange?document.createRange():false;return b&&!!b.createContextualFragment},History:function(){return("history" in window&&"pushState" in window.history)},CssTransforms:function(){return this.isStyleSupported("transform")},CssTransformNoPrefix:function(){if(!Ext.browser.is.AndroidStock){return this.isStyleSupportedWithoutPrefix("transform")}else{return this.isStyleSupportedWithoutPrefix("transform")&&!this.isStyleSupportedWithoutPrefix("-webkit-transform")}},Css3dTransforms:function(){return this.has("CssTransforms")&&this.isStyleSupported("perspective")&&!Ext.browser.is.AndroidStock2},CssAnimations:function(){return this.isStyleSupported("animationName")},CssTransitions:function(){return this.isStyleSupported("transitionProperty")},Audio:function(){return !!this.getTestElement("audio").canPlayType},Video:function(){return !!this.getTestElement("video").canPlayType},ClassList:function(){return"classList" in this.getTestElement()},LocalStorage:function(){var b=false;try{if("localStorage" in window&&window.localStorage!==null){localStorage.setItem("sencha-localstorage-test","test success");localStorage.removeItem("sencha-localstorage-test");b=true}}catch(c){}return b},MatchMedia:function(){return"matchMedia" in window},XHR2:function(){return window.ProgressEvent&&window.FormData&&window.XMLHttpRequest&&("withCredentials" in new XMLHttpRequest)},XHRUploadProgress:function(){if(window.XMLHttpRequest&&!Ext.browser.is.AndroidStock){var b=new XMLHttpRequest();return b&&("upload" in b)&&("onprogress" in b.upload)}return false},NumericInputPlaceHolder:function(){return !(Ext.browser.is.AndroidStock4&&Ext.os.version.getMinor()<2)}})});Ext.define("Ext.dom.Query",{select:function(h,b){var g=[],d,f,e,c,a;b=b||document;if(typeof b=="string"){b=document.getElementById(b)}h=h.split(",");for(f=0,c=h.length;f")}else{c.push(">");if((h=d.tpl)){h.applyOut(d.tplData,c)}if((h=d.html)){c.push(h)}if((h=d.cn||d.children)){g.generateMarkup(h,c)}f=g.closeTags;c.push(f[a]||(f[a]=""))}}}return c},generateStyles:function(e,c){var b=c||[],d;for(d in e){if(e.hasOwnProperty(d)){b.push(this.decamelizeName(d),":",e[d],";")}}return c||b.join("")},markup:function(a){if(typeof a=="string"){return a}var b=this.generateMarkup(a,[]);return b.join("")},applyStyles:function(a,b){Ext.fly(a).applyStyles(b)},createContextualFragment:function(c){var f=document.createElement("div"),a=document.createDocumentFragment(),b=0,d,e;f.innerHTML=c;e=f.childNodes;d=e.length;for(;b";return b}},isElement:true,constructor:function(a){if(typeof a=="string"){a=document.getElementById(a)}if(!a){throw new Error("Invalid domNode reference or an id of an existing domNode: "+a)}this.dom=a;this.getUniqueId()},attach:function(a){this.dom=a;this.id=a.id;return this},getUniqueId:function(){var b=this.id,a;if(!b){a=this.dom;if(a.id.length>0){this.id=b=a.id}else{a.id=b=this.mixins.identifiable.getUniqueId.call(this)}Ext.Element.cache[b]=this}return b},setId:function(c){var a=this.id,b=Ext.Element.cache;if(a){delete b[a]}this.dom.id=c;this.id=c;b[c]=this;return this},setHtml:function(a){this.dom.innerHTML=a},getHtml:function(){return this.dom.innerHTML},setText:function(a){this.dom.textContent=a},redraw:function(){var b=this.dom,a=b.style;a.display="none";b.offsetHeight;a.display=""},isPainted:(function(){return !Ext.browser.is.IE?function(){var a=this.dom;return Boolean(a&&a.offsetParent)}:function(){var a=this.dom;return Boolean(a&&(a.offsetHeight!==0&&a.offsetWidth!==0))}})(),set:function(a,b){var e=this.dom,c,d;for(c in a){if(a.hasOwnProperty(c)){d=a[c];if(c=="style"){this.applyStyles(d)}else{if(c=="cls"){e.className=d}else{if(b!==false){if(d===undefined){e.removeAttribute(c)}else{e.setAttribute(c,d)}}else{e[c]=d}}}}}return this},is:function(a){return Ext.DomQuery.is(this.dom,a)},getValue:function(b){var a=this.dom.value;return b?parseInt(a,10):a},getAttribute:function(a,b){var c=this.dom;return c.getAttributeNS(b,a)||c.getAttribute(b+":"+a)||c.getAttribute(a)||c[a]},setSizeState:function(d){var c=["x-sized","x-unsized","x-stretched"],a=[true,false,null],b=a.indexOf(d),e;if(b!==-1){e=c[b];c.splice(b,1);this.addCls(e)}this.removeCls(c);return this},destroy:function(){this.isDestroyed=true;var a=Ext.Element.cache,b=this.dom;if(b&&b.parentNode&&b.tagName!="BODY"){b.parentNode.removeChild(b)}delete a[this.id];delete this.dom}},function(a){Ext.elements=Ext.cache=a.cache;this.addStatics({Fly:new Ext.Class({extend:a,constructor:function(b){this.dom=b}}),_flyweights:{},fly:function(e,c){var f=null,d=a._flyweights,b;c=c||"_global";e=Ext.getDom(e);if(e){f=d[c]||(d[c]=new a.Fly());f.dom=e;f.isSynchronized=false;b=Ext.cache[e.id];if(b&&b.isElement){b.isSynchronized=false}}return f}});Ext.get=function(b){return a.get(b)};Ext.fly=function(){return a.fly.apply(a,arguments)};Ext.ClassManager.onCreated(function(){a.mixin("observable",Ext.mixin.Observable)},null,"Ext.mixin.Observable")});Ext.dom.Element.addStatics({numberRe:/\d+$/,unitRe:/\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i,camelRe:/(-[a-z])/gi,cssRe:/([a-z0-9-]+)\s*:\s*([^;\s]+(?:\s*[^;\s]+)*);?/gi,opacityRe:/alpha\(opacity=(.*)\)/i,propertyCache:{},defaultUnit:"px",borders:{l:"border-left-width",r:"border-right-width",t:"border-top-width",b:"border-bottom-width"},paddings:{l:"padding-left",r:"padding-right",t:"padding-top",b:"padding-bottom"},margins:{l:"margin-left",r:"margin-right",t:"margin-top",b:"margin-bottom"},addUnits:function(b,a){if(b===""||b=="auto"||b===undefined||b===null){return b||""}if(Ext.isNumber(b)||this.numberRe.test(b)){return b+(a||this.defaultUnit||"px")}else{if(!this.unitRe.test(b)){return b||""}}return b},isAncestor:function(b,d){var a=false;b=Ext.getDom(b);d=Ext.getDom(d);if(b&&d){if(b.contains){return b.contains(d)}else{if(b.compareDocumentPosition){return !!(b.compareDocumentPosition(d)&16)}else{while((d=d.parentNode)){a=d==b||a}}}}return a},parseBox:function(b){if(typeof b!="string"){b=b.toString()}var c=b.split(" "),a=c.length;if(a==1){c[1]=c[2]=c[3]=c[0]}else{if(a==2){c[2]=c[0];c[3]=c[1]}else{if(a==3){c[3]=c[1]}}}return{top:c[0]||0,right:c[1]||0,bottom:c[2]||0,left:c[3]||0}},unitizeBox:function(c,a){var b=this;c=b.parseBox(c);return b.addUnits(c.top,a)+" "+b.addUnits(c.right,a)+" "+b.addUnits(c.bottom,a)+" "+b.addUnits(c.left,a)},camelReplaceFn:function(b,c){return c.charAt(1).toUpperCase()},normalize:function(a){return this.propertyCache[a]||(this.propertyCache[a]=a.replace(this.camelRe,this.camelReplaceFn))},fromPoint:function(a,b){return Ext.get(document.elementFromPoint(a,b))},parseStyles:function(c){var a={},b=this.cssRe,d;if(c){b.lastIndex=0;while((d=b.exec(c))){a[d[1]]=d[2]}}return a}});Ext.dom.Element.addMembers({appendChild:function(a){this.dom.appendChild(Ext.getDom(a));return this},removeChild:function(a){this.dom.removeChild(Ext.getDom(a));return this},append:function(){this.appendChild.apply(this,arguments)},appendTo:function(a){Ext.getDom(a).appendChild(this.dom);return this},insertBefore:function(a){a=Ext.getDom(a);a.parentNode.insertBefore(this.dom,a);return this},insertAfter:function(a){a=Ext.getDom(a);a.parentNode.insertBefore(this.dom,a.nextSibling);return this},insertFirst:function(b){var a=Ext.getDom(b),d=this.dom,c=d.firstChild;if(!c){d.appendChild(a)}else{d.insertBefore(a,c)}return this},insertSibling:function(e,c,d){var f=this,b,a=(c||"before").toLowerCase()=="after",g;if(Ext.isArray(e)){g=f;Ext.each(e,function(h){b=Ext.fly(g,"_internal").insertSibling(h,c,d);if(a){g=b}});return b}e=e||{};if(e.nodeType||e.dom){b=f.dom.parentNode.insertBefore(Ext.getDom(e),a?f.dom.nextSibling:f.dom);if(!d){b=Ext.get(b)}}else{if(a&&!f.dom.nextSibling){b=Ext.core.DomHelper.append(f.dom.parentNode,e,!d)}else{b=Ext.core.DomHelper[a?"insertAfter":"insertBefore"](f.dom,e,!d)}}return b},replace:function(a){a=Ext.getDom(a);a.parentNode.replaceChild(this.dom,a);return this},replaceWith:function(a){var b=this;if(a.nodeType||a.dom||typeof a=="string"){a=Ext.get(a);b.dom.parentNode.insertBefore(a.dom,b.dom)}else{a=Ext.core.DomHelper.insertBefore(b.dom,a)}delete Ext.cache[b.id];Ext.removeNode(b.dom);b.id=Ext.id(b.dom=a);return b},doReplaceWith:function(a){var b=this.dom;b.parentNode.replaceChild(Ext.getDom(a),b)},createChild:function(b,a,c){b=b||{tag:"div"};if(a){return Ext.core.DomHelper.insertBefore(a,b,c!==true)}else{return Ext.core.DomHelper[!this.dom.firstChild?"insertFirst":"append"](this.dom,b,c!==true)}},wrap:function(b,c){var e=this.dom,f=this.self.create(b,c),d=(c)?f:f.dom,a=e.parentNode;if(a){a.insertBefore(d,e)}d.appendChild(e);return f},wrapAllChildren:function(a){var d=this.dom,b=d.childNodes,e=this.self.create(a),c=e.dom;while(b.length>0){c.appendChild(d.firstChild)}d.appendChild(c);return e},unwrapAllChildren:function(){var c=this.dom,b=c.childNodes,a=c.parentNode;if(a){while(b.length>0){a.insertBefore(c,c.firstChild)}this.destroy()}},unwrap:function(){var c=this.dom,a=c.parentNode,b;if(a){b=a.parentNode;b.insertBefore(c,a);b.removeChild(a)}else{b=document.createDocumentFragment();b.appendChild(c)}return this},detach:function(){var a=this.dom;if(a&&a.parentNode&&a.tagName!=="BODY"){a.parentNode.removeChild(a)}return this},insertHtml:function(b,c,a){var d=Ext.core.DomHelper.insertHtml(b,this.dom,c);return a?Ext.get(d):d}});Ext.dom.Element.override({getX:function(){return this.getXY()[0]},getY:function(){return this.getXY()[1]},getXY:function(){var b=this.dom.getBoundingClientRect(),a=Math.round;return[a(b.left+window.pageXOffset),a(b.top+window.pageYOffset)]},getOffsetsTo:function(a){var c=this.getXY(),b=Ext.fly(a,"_internal").getXY();return[c[0]-b[0],c[1]-b[1]]},setX:function(a){return this.setXY([a,this.getY()])},setY:function(a){return this.setXY([this.getX(),a])},setXY:function(d){var b=this;if(arguments.length>1){d=[d,arguments[1]]}var c=b.translatePoints(d),a=b.dom.style;for(d in c){if(!c.hasOwnProperty(d)){continue}if(!isNaN(c[d])){a[d]=c[d]+"px"}}return b},getLeft:function(){return parseInt(this.getStyle("left"),10)||0},getRight:function(){return parseInt(this.getStyle("right"),10)||0},getTop:function(){return parseInt(this.getStyle("top"),10)||0},getBottom:function(){return parseInt(this.getStyle("bottom"),10)||0},translatePoints:function(a,g){g=isNaN(a[1])?g:a[1];a=isNaN(a[0])?a:a[0];var d=this,e=d.isStyle("position","relative"),f=d.getXY(),b=parseInt(d.getStyle("left"),10),c=parseInt(d.getStyle("top"),10);b=!isNaN(b)?b:(e?0:d.dom.offsetLeft);c=!isNaN(c)?c:(e?0:d.dom.offsetTop);return{left:(a-f[0]+b),top:(g-f[1]+c)}},setBox:function(d){var c=this,b=d.width,a=d.height,f=d.top,e=d.left;if(e!==undefined){c.setLeft(e)}if(f!==undefined){c.setTop(f)}if(b!==undefined){c.setWidth(b)}if(a!==undefined){c.setHeight(a)}return this},getBox:function(g,j){var h=this,e=h.dom,c=e.offsetWidth,k=e.offsetHeight,n,f,d,a,m,i;if(!j){n=h.getXY()}else{if(g){n=[0,0]}else{n=[parseInt(h.getStyle("left"),10)||0,parseInt(h.getStyle("top"),10)||0]}}if(!g){f={x:n[0],y:n[1],0:n[0],1:n[1],width:c,height:k}}else{d=h.getBorderWidth.call(h,"l")+h.getPadding.call(h,"l");a=h.getBorderWidth.call(h,"r")+h.getPadding.call(h,"r");m=h.getBorderWidth.call(h,"t")+h.getPadding.call(h,"t");i=h.getBorderWidth.call(h,"b")+h.getPadding.call(h,"b");f={x:n[0]+d,y:n[1]+m,0:n[0]+d,1:n[1]+m,width:c-(d+a),height:k-(m+i)}}f.left=f.x;f.top=f.y;f.right=f.x+f.width;f.bottom=f.y+f.height;return f},getPageBox:function(e){var g=this,c=g.dom;if(!c){return new Ext.util.Region()}var j=c.offsetWidth,f=c.offsetHeight,m=g.getXY(),k=m[1],a=m[0]+j,i=m[1]+f,d=m[0];if(e){return new Ext.util.Region(k,a,i,d)}else{return{left:d,top:k,width:j,height:f,right:a,bottom:i}}}});Ext.dom.Element.addMembers({WIDTH:"width",HEIGHT:"height",MIN_WIDTH:"min-width",MIN_HEIGHT:"min-height",MAX_WIDTH:"max-width",MAX_HEIGHT:"max-height",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left",VISIBILITY:1,DISPLAY:2,OFFSETS:3,SEPARATOR:"-",trimRe:/^\s+|\s+$/g,wordsRe:/\w/g,spacesRe:/\s+/,styleSplitRe:/\s*(?::|;)\s*/,transparentRe:/^(?:transparent|(?:rgba[(](?:\s*\d+\s*[,]){3}\s*0\s*[)]))$/i,classNameSplitRegex:/[\s]+/,borders:{t:"border-top-width",r:"border-right-width",b:"border-bottom-width",l:"border-left-width"},paddings:{t:"padding-top",r:"padding-right",b:"padding-bottom",l:"padding-left"},margins:{t:"margin-top",r:"margin-right",b:"margin-bottom",l:"margin-left"},defaultUnit:"px",isSynchronized:false,synchronize:function(){var g=this.dom,a={},d=g.className,f,c,e,b;if(d.length>0){f=g.className.split(this.classNameSplitRegex);for(c=0,e=f.length;c0?a:0},getWidth:function(a){var c=this.dom,b=a?(c.clientWidth-this.getPadding("lr")):c.offsetWidth;return b>0?b:0},getBorderWidth:function(a){return this.addStyles(a,this.borders)},getPadding:function(a){return this.addStyles(a,this.paddings)},applyStyles:function(d){if(d){var e=this.dom,c,b,a;if(typeof d=="function"){d=d.call()}c=typeof d;if(c=="string"){d=Ext.util.Format.trim(d).split(this.styleSplitRe);for(b=0,a=d.length;b "+a,c.dom);return b?d:Ext.get(d)},parent:function(a,b){return this.matchNode("parentNode","parentNode",a,b)},next:function(a,b){return this.matchNode("nextSibling","nextSibling",a,b)},prev:function(a,b){return this.matchNode("previousSibling","previousSibling",a,b)},first:function(a,b){return this.matchNode("nextSibling","firstChild",a,b)},last:function(a,b){return this.matchNode("previousSibling","lastChild",a,b)},matchNode:function(b,e,a,c){if(!this.dom){return null}var d=this.dom[e];while(d){if(d.nodeType==1&&(!a||Ext.DomQuery.is(d,a))){return !c?Ext.get(d):d}d=d[b]}return null},isAncestor:function(a){return this.self.isAncestor.call(this.self,this.dom,a)}});Ext.define("Ext.dom.CompositeElementLite",{alternateClassName:["Ext.CompositeElementLite","Ext.CompositeElement"],statics:{importElementMethods:function(){}},constructor:function(b,a){this.elements=[];this.add(b,a);this.el=new Ext.dom.Element.Fly()},isComposite:true,getElement:function(a){return this.el.attach(a).synchronize()},transformElement:function(a){return Ext.getDom(a)},getCount:function(){return this.elements.length},add:function(c,a){var e=this.elements,b,d;if(!c){return this}if(typeof c=="string"){c=Ext.dom.Element.selectorFunction(c,a)}else{if(c.isComposite){c=c.elements}else{if(!Ext.isIterable(c)){c=[c]}}}for(b=0,d=c.length;b-1){c=Ext.getDom(c);if(a){f=this.elements[b];f.parentNode.insertBefore(c,f);Ext.removeNode(f)}Ext.Array.splice(this.elements,b,1,c)}return this},clear:function(){this.elements=[]},addElements:function(c,a){if(!c){return this}if(typeof c=="string"){c=Ext.dom.Element.selectorFunction(c,a)}var b=this.elements;Ext.each(c,function(d){b.push(Ext.get(d))});return this},first:function(){return this.item(0)},last:function(){return this.item(this.getCount()-1)},contains:function(a){return this.indexOf(a)!=-1},removeElement:function(c,e){var b=this,d=this.elements,a;Ext.each(c,function(f){if((a=(d[f]||d[f=b.indexOf(f)]))){if(e){if(a.dom){a.remove()}else{Ext.removeNode(a)}}Ext.Array.erase(d,f,1)}});return this}},function(){var a=Ext.dom.Element,d=a.prototype,c=this.prototype,b;for(b in d){if(typeof d[b]=="function"){(function(e){if(e==="destroy"){c[e]=function(){return this.invoke(e,arguments)}}else{c[e]=c[e]||function(){return this.invoke(e,arguments)}}}).call(c,b)}}c.on=c.addListener;a.selectorFunction=Ext.DomQuery.select;Ext.dom.Element.select=function(e,h,f){var g;if(typeof e=="string"){g=Ext.dom.Element.selectorFunction(e,f)}else{if(e.length!==undefined){g=e}else{}}return(h===true)?new Ext.dom.CompositeElement(g):new Ext.dom.CompositeElementLite(g)};Ext.select=function(){return a.select.apply(a,arguments)}});Ext.define("Ext.event.ListenerStack",{currentOrder:"current",length:0,constructor:function(){this.listeners={before:[],current:[],after:[]};this.lateBindingMap={};return this},add:function(h,j,k,e){var a=this.lateBindingMap,g=this.getAll(e),f=g.length,b,d,c;if(typeof h=="string"&&j.isIdentifiable){c=j.getId();b=a[c];if(b){if(b[h]){return false}else{b[h]=true}}else{a[c]=b={};b[h]=true}}else{if(f>0){while(f--){d=g[f];if(d.fn===h&&d.scope===j){d.options=k;return false}}}}d=this.create(h,j,k,e);if(k&&k.prepend){delete k.prepend;g.unshift(d)}else{g.push(d)}this.length++;return true},getAt:function(b,a){return this.getAll(a)[b]},getAll:function(a){if(!a){a=this.currentOrder}return this.listeners[a]},count:function(a){return this.getAll(a).length},create:function(d,c,b,a){return{stack:this,fn:d,firingFn:false,boundFn:false,isLateBinding:typeof d=="string",scope:c,options:b||{},order:a}},remove:function(h,j,e){var g=this.getAll(e),f=g.length,b=false,a=this.lateBindingMap,d,c;if(f>0){while(f--){d=g[f];if(d.fn===h&&d.scope===j){g.splice(f,1);b=true;this.length--;if(typeof h=="string"&&j.isIdentifiable){c=j.getId();if(a[c]&&a[c][h]){delete a[c][h]}}break}}}return b}});Ext.define("Ext.event.Controller",{isFiring:false,listenerStack:null,constructor:function(a){this.firingListeners=[];this.firingArguments=[];this.setInfo(a);return this},setInfo:function(a){this.info=a},getInfo:function(){return this.info},setListenerStacks:function(a){this.listenerStacks=a},fire:function(h,e){var n=this.listenerStacks,m=this.firingListeners,d=this.firingArguments,k=m.push,g=n.length,j,l,c,o,a=false,b=false,f;m.length=0;if(e){if(e.order!=="after"){a=true}else{b=true}}if(g===1){j=n[0].listeners;l=j.before;c=j.current;o=j.after;if(l.length>0){k.apply(m,l)}if(a){k.call(m,e)}if(c.length>0){k.apply(m,c)}if(b){k.call(m,e)}if(o.length>0){k.apply(m,o)}}else{for(f=0;f0){k.apply(m,l)}}if(a){k.call(m,e)}for(f=0;f0){k.apply(m,c)}}if(b){k.call(m,e)}for(f=0;f0){k.apply(m,o)}}}if(m.length===0){return this}if(!h){h=[]}d.length=0;d.push.apply(d,h);d.push(null,this);this.doFire();return this},doFire:function(){var k=this.firingListeners,c=this.firingArguments,g=c.length-2,d,f,b,o,h,n,a,j,l,e,m;this.isPausing=false;this.isPaused=false;this.isStopped=false;this.isFiring=true;for(d=0,f=k.length;d0){this.isPaused=false;this.doFire()}if(a){a.resume()}return this},isInterrupted:function(){return this.isStopped||this.isPaused},stop:function(){var a=this.connectingController;this.isStopped=true;if(a){this.connectingController=null;a.stop()}this.isFiring=false;this.listenerStacks=null;return this},pause:function(){var a=this.connectingController;this.isPausing=true;if(a){a.pause()}return this}});Ext.define("Ext.event.Dispatcher",{statics:{getInstance:function(){if(!this.instance){this.instance=new this()}return this.instance},setInstance:function(a){this.instance=a;return this}},config:{publishers:{}},wildcard:"*",constructor:function(a){this.listenerStacks={};this.activePublishers={};this.publishersCache={};this.noActivePublishers=[];this.controller=null;this.initConfig(a);return this},getListenerStack:function(e,g,c,b){var d=this.listenerStacks,f=d[e],a;b=Boolean(b);if(!f){if(b){d[e]=f={}}else{return null}}f=f[g];if(!f){if(b){d[e][g]=f={}}else{return null}}a=f[c];if(!a){if(b){f[c]=a=new Ext.event.ListenerStack()}else{return null}}return a},getController:function(d,f,c,b){var a=this.controller,e={targetType:d,target:f,eventName:c};if(!a){this.controller=a=new Ext.event.Controller()}if(a.isFiring){a=new Ext.event.Controller()}a.setInfo(e);if(b&&a!==b){a.connect(b)}return a},applyPublishers:function(c){var a,b;this.publishersCache={};for(a in c){if(c.hasOwnProperty(a)){b=c[a];this.registerPublisher(b)}}return c},registerPublisher:function(b){var a=this.activePublishers,c=b.getTargetType(),d=a[c];if(!d){a[c]=d=[]}d.push(b);b.setDispatcher(this);return this},getCachedActivePublishers:function(c,b){var a=this.publishersCache,d;if((d=a[c])&&(d=d[b])){return d}return null},cacheActivePublishers:function(c,b,d){var a=this.publishersCache;if(!a[c]){a[c]={}}a[c][b]=d;return d},getActivePublishers:function(f,b){var g,a,c,e,d;if((g=this.getCachedActivePublishers(f,b))){return g}a=this.activePublishers[f];if(a){g=[];for(c=0,e=a.length;c0}return false},addListener:function(e,f,b){var g=this.getActivePublishers(e,b),d=g.length,c,a;a=this.doAddListener.apply(this,arguments);if(a&&d>0){for(c=0;c0){for(c=0;c0){for(b=0;b 0 ? +1 : (Ext.Date.getWeekOfYear(this) >= 52 && this.getMonth() < 11 ? -1 : 0)))",Y:"Ext.String.leftPad(this.getFullYear(), 4, '0')",y:"('' + this.getFullYear()).substring(2, 4)",a:"(this.getHours() < 12 ? 'am' : 'pm')",A:"(this.getHours() < 12 ? 'AM' : 'PM')",g:"((this.getHours() % 12) ? this.getHours() % 12 : 12)",G:"this.getHours()",h:"Ext.String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0')",H:"Ext.String.leftPad(this.getHours(), 2, '0')",i:"Ext.String.leftPad(this.getMinutes(), 2, '0')",s:"Ext.String.leftPad(this.getSeconds(), 2, '0')",u:"Ext.String.leftPad(this.getMilliseconds(), 3, '0')",O:"Ext.Date.getGMTOffset(this)",P:"Ext.Date.getGMTOffset(this, true)",T:"Ext.Date.getTimezone(this)",Z:"(this.getTimezoneOffset() * -60)",c:function(){for(var j="Y-m-dTH:i:sP",g=[],f=0,d=j.length;f= 0 && y >= 0){","v = Ext.Date.add(new Date(y < 100 ? 100 : y, 0, 1, h, i, s, ms), Ext.Date.YEAR, y < 100 ? y - 100 : 0);","v = !strict? v : (strict === true && (z <= 364 || (Ext.Date.isLeapYear(v) && z <= 365))? Ext.Date.add(v, Ext.Date.DAY, z) : null);","}else if(strict === true && !Ext.Date.isValid(y, m + 1, d, h, i, s, ms)){","v = null;","}else{","v = Ext.Date.add(new Date(y < 100 ? 100 : y, m, d, h, i, s, ms), Ext.Date.YEAR, y < 100 ? y - 100 : 0);","}","}","}","if(v){","if(zz != null){","v = Ext.Date.add(v, Ext.Date.SECOND, -v.getTimezoneOffset() * 60 - zz);","}else if(o){","v = Ext.Date.add(v, Ext.Date.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn));","}","}","return v;"].join("\n");return function(l){var e=a.parseRegexes.length,m=1,f=[],k=[],j=false,d="";for(var h=0;h Ext.Date.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"},a:{g:1,c:"if (/(am)/i.test(results[{0}])) {\nif (!h || h == 12) { h = 0; }\n} else { if (!h || h < 12) { h = (h || 0) + 12; }}",s:"(am|pm|AM|PM)"},A:{g:1,c:"if (/(am)/i.test(results[{0}])) {\nif (!h || h == 12) { h = 0; }\n} else { if (!h || h < 12) { h = (h || 0) + 12; }}",s:"(AM|PM|am|pm)"},g:function(){return a.formatCodeToRegex("G")},G:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{1,2})"},h:function(){return a.formatCodeToRegex("H")},H:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},i:{g:1,c:"i = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},s:{g:1,c:"s = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},u:{g:1,c:"ms = results[{0}]; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n",s:"(\\d+)"},O:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1),","hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60),","mn = o.substring(3,5) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + Ext.String.leftPad(hr, 2, '0') + Ext.String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{4})"},P:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1),","hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60),","mn = o.substring(4,6) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + Ext.String.leftPad(hr, 2, '0') + Ext.String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{2}:\\d{2})"},T:{g:0,c:null,s:"[A-Z]{1,4}"},Z:{g:1,c:"zz = results[{0}] * 1;\nzz = (-43200 <= zz && zz <= 50400)? zz : null;\n",s:"([+-]?\\d{1,5})"},c:function(){var e=[],c=[a.formatCodeToRegex("Y",1),a.formatCodeToRegex("m",2),a.formatCodeToRegex("d",3),a.formatCodeToRegex("h",4),a.formatCodeToRegex("i",5),a.formatCodeToRegex("s",6),{c:"ms = results[7] || '0'; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n"},{c:["if(results[8]) {","if(results[8] == 'Z'){","zz = 0;","}else if (results[8].indexOf(':') > -1){",a.formatCodeToRegex("P",8).c,"}else{",a.formatCodeToRegex("O",8).c,"}","}"].join("\n")}];for(var f=0,d=c.length;f0?"-":"+")+Ext.String.leftPad(Math.floor(Math.abs(e)/60),2,"0")+(d?":":"")+Ext.String.leftPad(Math.abs(e%60),2,"0")},getDayOfYear:function(f){var e=0,h=Ext.Date.clone(f),c=f.getMonth(),g;for(g=0,h.setDate(1),h.setMonth(0);g28){c=Math.min(c,Ext.Date.getLastDateOfMonth(Ext.Date.add(Ext.Date.getFirstDateOfMonth(f),"mo",g)).getDate())}h.setDate(c);h.setMonth(f.getMonth()+g);break;case Ext.Date.YEAR:h.setFullYear(f.getFullYear()+g);break}return h},between:function(d,f,c){var e=d.getTime();return f.getTime()<=e&&e<=c.getTime()},diff:function(e,c,g){var d=Ext.Date,f,h=+c-e;switch(g){case d.MILLI:return h;case d.SECOND:return Math.floor(h/1000);case d.MINUTE:return Math.floor(h/60000);case d.HOUR:return Math.floor(h/3600000);case d.DAY:return Math.floor(h/86400000);case"w":return Math.floor(h/604800000);case d.MONTH:f=(c.getFullYear()*12+c.getMonth())-(e.getFullYear()*12+e.getMonth());if(Ext.Date.add(e,g,f)>c){return f-1}else{return f}case d.YEAR:f=c.getFullYear()-e.getFullYear();if(Ext.Date.add(e,g,f)>c){return f-1}else{return f}}},align:function(d,f,e){var c=new Date(+d);switch(f.toLowerCase()){case Ext.Date.MILLI:return c;break;case Ext.Date.SECOND:c.setUTCSeconds(c.getUTCSeconds()-c.getUTCSeconds()%e);c.setUTCMilliseconds(0);return c;break;case Ext.Date.MINUTE:c.setUTCMinutes(c.getUTCMinutes()-c.getUTCMinutes()%e);c.setUTCSeconds(0);c.setUTCMilliseconds(0);return c;break;case Ext.Date.HOUR:c.setUTCHours(c.getUTCHours()-c.getUTCHours()%e);c.setUTCMinutes(0);c.setUTCSeconds(0);c.setUTCMilliseconds(0);return c;break;case Ext.Date.DAY:if(e==7||e==14){c.setUTCDate(c.getUTCDate()-c.getUTCDay()+1)}c.setUTCHours(0);c.setUTCMinutes(0);c.setUTCSeconds(0);c.setUTCMilliseconds(0);return c;break;case Ext.Date.MONTH:c.setUTCMonth(c.getUTCMonth()-(c.getUTCMonth()-1)%e,1);c.setUTCHours(0);c.setUTCMinutes(0);c.setUTCSeconds(0);c.setUTCMilliseconds(0);return c;break;case Ext.Date.YEAR:c.setUTCFullYear(c.getUTCFullYear()-c.getUTCFullYear()%e,1,1);c.setUTCHours(0);c.setUTCMinutes(0);c.setUTCSeconds(0);c.setUTCMilliseconds(0);return d;break}}};var a=Ext.DateExtras;Ext.apply(Ext.Date,a)})();Ext.define("Ext.util.Format",{singleton:true,defaultDateFormat:"m/d/Y",escapeRe:/('|\\)/g,trimRe:/^[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+|[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+$/g,formatRe:/\{(\d+)\}/g,escapeRegexRe:/([-.*+?^${}()|[\]\/\\])/g,dashesRe:/-/g,iso8601TestRe:/\d\dT\d\d/,iso8601SplitRe:/[- :T\.Z\+]/,ellipsis:function(c,a,d){if(c&&c.length>a){if(d){var e=c.substr(0,a-2),b=Math.max(e.lastIndexOf(" "),e.lastIndexOf("."),e.lastIndexOf("!"),e.lastIndexOf("?"));if(b!=-1&&b>=(a-15)){return e.substr(0,b)+"..."}}return c.substr(0,a-3)+"..."}return c},escapeRegex:function(a){return a.replace(Ext.util.Format.escapeRegexRe,"\\$1")},escape:function(a){return a.replace(Ext.util.Format.escapeRe,"\\$1")},toggle:function(b,c,a){return b==c?a:c},trim:function(a){return a.replace(Ext.util.Format.trimRe,"")},leftPad:function(d,b,c){var a=String(d);c=c||" ";while(a.length/g,">").replace(/").replace(/</g,"<").replace(/"/g,'"').replace(/&/g,"&")},date:function(f,g){var b=f;if(!f){return""}if(!Ext.isDate(f)){b=new Date(Date.parse(f));if(isNaN(b)){if(this.iso8601TestRe.test(f)){if(Ext.os.is.Android&&Ext.os.version.isLessThan("3.0")){var h=[1,4,5,6,7,10,11];var e,d=0;if((e=/^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec(f))){for(var c=0,a;(a=h[c]);++c){e[a]=+e[a]||0}e[2]=(+e[2]||1)-1;e[3]=+e[3]||1;if(e[8]!=="Z"&&e[9]!==undefined){d=e[10]*60+e[11];if(e[9]==="+"){d=0-d}}b=new Date(Date.UTC(e[1],e[2],e[3],e[4],e[5]+d,e[6],e[7]))}}else{b=f.split(this.iso8601SplitRe);b=new Date(b[0],b[1]-1,b[2],b[3],b[4],b[5])}}}if(isNaN(b)){b=new Date(Date.parse(f.replace(this.dashesRe,"/")))}f=b}return Ext.Date.format(f,g||Ext.util.Format.defaultDateFormat)}});Ext.define("Ext.Template",{inheritableStatics:{from:function(b,a){b=Ext.getDom(b);return new this(b.value||b.innerHTML,a||"")}},constructor:function(d){var f=this,b=arguments,a=[],c=0,e=b.length,g;f.initialConfig={};if(e===1&&Ext.isArray(d)){b=d;e=b.length}if(e>1){for(;c]*)\>)|(?:<\/tpl>)/g,actionsRe:/\s*(elif|elseif|if|for|exec|switch|case|eval)\s*\=\s*(?:(?:"([^"]*)")|(?:'([^']*)'))\s*/g,propRe:/prop=(?:(?:"([^"]*)")|(?:'([^']*)'))/,defaultRe:/^\s*default\s*$/,elseRe:/^\s*else\s*$/});Ext.define("Ext.XTemplateCompiler",{extend:Ext.XTemplateParser,useEval:Ext.isGecko,useIndex:Ext.isIE6||Ext.isIE7,useFormat:true,propNameRe:/^[\w\d\$]*$/,compile:function(a){var c=this,b=c.generate(a);return c.useEval?c.evalTpl(b):(new Function("Ext",b))(Ext)},generate:function(a){var d=this,b="var fm=Ext.util.Format,ts=Object.prototype.toString;",c;d.maxLevel=0;d.body=["var c0=values, a0="+d.createArrayTest(0)+", p0=parent, n0=xcount, i0=xindex, v;\n"];if(d.definitions){if(typeof d.definitions==="string"){d.definitions=[d.definitions,b]}else{d.definitions.push(b)}}else{d.definitions=[b]}d.switches=[];d.parse(a);d.definitions.push((d.useEval?"$=":"return")+" function ("+d.fnArgs+") {",d.body.join(""),"}");c=d.definitions.join("\n");d.definitions.length=d.body.length=d.switches.length=0;delete d.definitions;delete d.body;delete d.switches;return c},doText:function(c){var b=this,a=b.body;c=c.replace(b.aposRe,"\\'").replace(b.newLineRe,"\\n");if(b.useIndex){a.push("out[out.length]='",c,"'\n")}else{a.push("out.push('",c,"')\n")}},doExpr:function(b){var a=this.body;a.push("v="+b+"; if (v !== undefined && v !== null) out");if(this.useIndex){a.push("[out.length]=v+''\n")}else{a.push(".push(v+'')\n")}},doTag:function(a){this.doExpr(this.parseTag(a))},doElse:function(){this.body.push("} else {\n")},doEval:function(a){this.body.push(a,"\n")},doIf:function(b,c){var a=this;if(b==="."){a.body.push("if (values) {\n")}else{if(a.propNameRe.test(b)){a.body.push("if (",a.parseTag(b),") {\n")}else{a.body.push("if (",a.addFn(b),a.callFn,") {\n")}}if(c.exec){a.doExec(c.exec)}},doElseIf:function(b,c){var a=this;if(b==="."){a.body.push("else if (values) {\n")}else{if(a.propNameRe.test(b)){a.body.push("} else if (",a.parseTag(b),") {\n")}else{a.body.push("} else if (",a.addFn(b),a.callFn,") {\n")}}if(c.exec){a.doExec(c.exec)}},doSwitch:function(b){var a=this;if(b==="."){a.body.push("switch (values) {\n")}else{if(a.propNameRe.test(b)){a.body.push("switch (",a.parseTag(b),") {\n")}else{a.body.push("switch (",a.addFn(b),a.callFn,") {\n")}}a.switches.push(0)},doCase:function(e){var d=this,c=Ext.isArray(e)?e:[e],f=d.switches.length-1,a,b;if(d.switches[f]){d.body.push("break;\n")}else{d.switches[f]++}for(b=0,f=c.length;bb){this.isEnded=true;return this.getEndValue()}else{return this.getStartValue()+((a/b)*this.distance)}}});Ext.define("Ext.util.translatable.Abstract",{extend:Ext.Evented,config:{useWrapper:null,easing:null,easingX:null,easingY:null},x:0,y:0,activeEasingX:null,activeEasingY:null,isAnimating:false,isTranslatable:true,constructor:function(a){this.initConfig(a)},factoryEasing:function(a){return Ext.factory(a,Ext.fx.easing.Linear,null,"easing")},applyEasing:function(a){if(!this.getEasingX()){this.setEasingX(this.factoryEasing(a))}if(!this.getEasingY()){this.setEasingY(this.factoryEasing(a))}},applyEasingX:function(a){return this.factoryEasing(a)},applyEasingY:function(a){return this.factoryEasing(a)},doTranslate:Ext.emptyFn,translate:function(a,c,b){if(b){return this.translateAnimated(a,c,b)}if(this.isAnimating){this.stopAnimation()}if(!isNaN(a)&&typeof a=="number"){this.x=a}if(!isNaN(c)&&typeof c=="number"){this.y=c}this.doTranslate(a,c)},translateAxis:function(b,d,c){var a,e;if(b=="x"){a=d}else{e=d}return this.translate(a,e,c)},animate:function(b,a){this.activeEasingX=b;this.activeEasingY=a;this.isAnimating=true;this.lastX=null;this.lastY=null;Ext.AnimationQueue.start(this.doAnimationFrame,this);this.fireEvent("animationstart",this,this.x,this.y);return this},translateAnimated:function(b,g,e){if(!Ext.isObject(e)){e={}}if(this.isAnimating){this.stopAnimation()}var d=Ext.Date.now(),f=e.easing,c=(typeof b=="number")?(e.easingX||f||this.getEasingX()||true):null,a=(typeof g=="number")?(e.easingY||f||this.getEasingY()||true):null;if(c){c=this.factoryEasing(c);c.setStartTime(d);c.setStartValue(this.x);c.setEndValue(b);if("duration" in e){c.setDuration(e.duration)}}if(a){a=this.factoryEasing(a);a.setStartTime(d);a.setStartValue(this.y);a.setEndValue(g);if("duration" in e){a.setDuration(e.duration)}}return this.animate(c,a)},doAnimationFrame:function(){var e=this,c=e.activeEasingX,b=e.activeEasingY,d=Date.now(),a,f;if(!e.isAnimating){return}e.lastRun=d;if(c===null&&b===null){e.stopAnimation();return}if(c!==null){e.x=a=Math.round(c.getValue());if(c.isEnded){e.activeEasingX=null;e.fireEvent("axisanimationend",e,"x",a)}}else{a=e.x}if(b!==null){e.y=f=Math.round(b.getValue());if(b.isEnded){e.activeEasingY=null;e.fireEvent("axisanimationend",e,"y",f)}}else{f=e.y}if(e.lastX!==a||e.lastY!==f){e.doTranslate(a,f);e.lastX=a;e.lastY=f}e.fireEvent("animationframe",e,a,f)},stopAnimation:function(){if(!this.isAnimating){return}this.activeEasingX=null;this.activeEasingY=null;this.isAnimating=false;Ext.AnimationQueue.stop(this.doAnimationFrame,this);this.fireEvent("animationend",this,this.x,this.y)},refresh:function(){this.translate(this.x,this.y)},destroy:function(){if(this.isAnimating){this.stopAnimation()}this.callParent(arguments)}});Ext.define("Ext.util.translatable.Dom",{extend:Ext.util.translatable.Abstract,config:{element:null},applyElement:function(a){if(!a){return}return Ext.get(a)},updateElement:function(){this.refresh()}});Ext.define("Ext.util.translatable.CssTransform",{extend:Ext.util.translatable.Dom,doTranslate:function(a,c){var b=this.getElement();if(!this.isDestroyed&&!b.isDestroyed){b.translate(a,c)}},destroy:function(){var a=this.getElement();if(a&&!a.isDestroyed){a.dom.style.webkitTransform=null}this.callSuper()}});Ext.define("Ext.util.translatable.ScrollPosition",{extend:Ext.util.translatable.Dom,type:"scrollposition",config:{useWrapper:true},getWrapper:function(){var c=this.wrapper,b=this.getElement(),a;if(!c){a=b.getParent();if(!a){return null}if(a.hasCls(Ext.baseCSSPrefix+"translatable-hboxfix")){a=a.getParent()}if(this.getUseWrapper()){c=b.wrap()}else{c=a}b.addCls("x-translatable");c.addCls("x-translatable-container");this.wrapper=c;c.on("painted",function(){if(!this.isAnimating){this.refresh()}},this);this.refresh()}return c},doTranslate:function(a,d){var c=this.getWrapper(),b;if(c){b=c.dom;if(typeof a=="number"){b.scrollLeft=500000-a}if(typeof d=="number"){b.scrollTop=500000-d}}},destroy:function(){var a=this.getElement(),b=this.wrapper;if(b){if(!a.isDestroyed){if(this.getUseWrapper()){b.doReplaceWith(a)}a.removeCls("x-translatable")}if(!b.isDestroyed){b.removeCls("x-translatable-container");b.un("painted","refresh",this)}delete this.wrapper;delete this._element}this.callSuper()}});Ext.define("Ext.util.translatable.CssPosition",{extend:Ext.util.translatable.Dom,doTranslate:function(a,c){var b=this.getElement().dom.style;if(typeof a=="number"){b.left=a+"px"}if(typeof c=="number"){b.top=c+"px"}},destroy:function(){var a=this.getElement().dom.style;a.left=null;a.top=null;this.callParent(arguments)}});Ext.define("Ext.util.Translatable",{constructor:function(a){var b=Ext.util.translatable;switch(Ext.browser.getPreferredTranslationMethod(a)){case"scrollposition":return new b.ScrollPosition(a);case"csstransform":return new b.CssTransform(a);case"cssposition":return new b.CssPosition(a)}}});Ext.define("Ext.behavior.Translatable",{extend:Ext.behavior.Behavior,setConfig:function(c){var a=this.translatable,b=this.component;if(c){if(!a){this.translatable=a=new Ext.util.Translatable(c);a.setElement(b.renderElement);a.on("destroy","onTranslatableDestroy",this)}else{if(Ext.isObject(c)){a.setConfig(c)}}}else{if(a){a.destroy()}}return this},getTranslatable:function(){return this.translatable},onTranslatableDestroy:function(){delete this.translatable},onComponentDestroy:function(){var a=this.translatable;if(a){a.destroy()}}});Ext.define("Ext.util.Draggable",{isDraggable:true,mixins:[Ext.mixin.Observable],config:{cls:Ext.baseCSSPrefix+"draggable",draggingCls:Ext.baseCSSPrefix+"dragging",element:null,constraint:"container",disabled:null,direction:"both",initialOffset:{x:0,y:0},translatable:{}},DIRECTION_BOTH:"both",DIRECTION_VERTICAL:"vertical",DIRECTION_HORIZONTAL:"horizontal",defaultConstraint:{min:{x:-Infinity,y:-Infinity},max:{x:Infinity,y:Infinity}},containerWidth:0,containerHeight:0,width:0,height:0,constructor:function(a){var b;this.extraConstraint={};this.initialConfig=a;this.offset={x:0,y:0};this.listeners={dragstart:"onDragStart",drag:"onDrag",dragend:"onDragEnd",resize:"onElementResize",touchstart:"onPress",touchend:"onRelease",scope:this};if(a&&a.element){b=a.element;delete a.element;this.setElement(b)}return this},applyElement:function(a){if(!a){return}return Ext.get(a)},updateElement:function(a){a.on(this.listeners);this.initConfig(this.initialConfig)},updateInitialOffset:function(b){if(typeof b=="number"){b={x:b,y:b}}var c=this.offset,a,d;c.x=a=b.x;c.y=d=b.y;this.getTranslatable().translate(a,d)},updateCls:function(a){this.getElement().addCls(a)},applyTranslatable:function(a,b){a=Ext.factory(a,Ext.util.Translatable,b);if(a){a.setElement(this.getElement())}return a},setExtraConstraint:function(a){this.extraConstraint=a||{};this.refreshConstraint();return this},addExtraConstraint:function(a){Ext.merge(this.extraConstraint,a);this.refreshConstraint();return this},applyConstraint:function(a){this.currentConstraint=a;if(!a){a=this.defaultConstraint}if(a==="container"){return Ext.merge(this.getContainerConstraint(),this.extraConstraint)}return Ext.merge({},this.extraConstraint,a)},updateConstraint:function(){this.refreshOffset()},getContainerConstraint:function(){var a=this.getContainer(),b=this.getElement();if(!a||!b.dom){return this.defaultConstraint}return{min:{x:0,y:0},max:{x:this.containerWidth-this.width,y:this.containerHeight-this.height}}},getContainer:function(){var a=this.container;if(!a){a=this.getElement().getParent();if(a){this.container=a;a.on({resize:"onContainerResize",destroy:"onContainerDestroy",scope:this})}}return a},onElementResize:function(a,b){this.width=b.width;this.height=b.height;this.refresh()},onContainerResize:function(a,b){this.containerWidth=b.width;this.containerHeight=b.height;this.refresh()},onContainerDestroy:function(){delete this.container;delete this.containerSizeMonitor},detachListeners:function(){this.getElement().un(this.listeners)},isAxisEnabled:function(a){var b=this.getDirection();if(a==="x"){return(b===this.DIRECTION_BOTH||b===this.DIRECTION_HORIZONTAL)}return(b===this.DIRECTION_BOTH||b===this.DIRECTION_VERTICAL)},onPress:function(a){this.fireAction("touchstart",[this,a])},onRelease:function(a){this.fireAction("touchend",[this,a])},onDragStart:function(a){if(this.getDisabled()){return false}var b=this.offset;this.fireAction("dragstart",[this,a,b.x,b.y],this.initDragStart)},initDragStart:function(b,c,a,d){this.dragStartOffset={x:a,y:d};this.isDragging=true;this.getElement().addCls(this.getDraggingCls())},onDrag:function(b){if(!this.isDragging){return}var a=this.dragStartOffset;this.fireAction("drag",[this,b,a.x+b.deltaX,a.y+b.deltaY],this.doDrag)},doDrag:function(b,c,a,d){b.setOffset(a,d)},onDragEnd:function(a){if(!this.isDragging){return}this.onDrag(a);this.isDragging=false;this.getElement().removeCls(this.getDraggingCls());this.fireEvent("dragend",this,a,this.offset.x,this.offset.y)},setOffset:function(i,h,b){var f=this.offset,a=this.getConstraint(),e=a.min,c=a.max,d=Math.min,g=Math.max;if(this.isAxisEnabled("x")&&typeof i=="number"){i=d(g(i,e.x),c.x)}else{i=f.x}if(this.isAxisEnabled("y")&&typeof h=="number"){h=d(g(h,e.y),c.y)}else{h=f.y}f.x=i;f.y=h;this.getTranslatable().translate(i,h,b)},getOffset:function(){return this.offset},refreshConstraint:function(){this.setConstraint(this.currentConstraint)},refreshOffset:function(){var a=this.offset;this.setOffset(a.x,a.y)},refresh:function(){this.refreshConstraint();this.getTranslatable().refresh();this.refreshOffset()},enable:function(){return this.setDisabled(false)},disable:function(){return this.setDisabled(true)},destroy:function(){var a=this.getTranslatable();var b=this.getElement();if(b&&!b.isDestroyed){b.removeCls(this.getCls())}this.detachListeners();if(a){a.destroy()}}},function(){});Ext.define("Ext.behavior.Draggable",{extend:Ext.behavior.Behavior,setConfig:function(c){var a=this.draggable,b=this.component;if(c){if(!a){b.setTranslatable(c.translatable);this.draggable=a=new Ext.util.Draggable(c);a.setTranslatable(b.getTranslatable());a.setElement(b.renderElement);a.on("destroy","onDraggableDestroy",this);b.on(this.listeners)}else{if(Ext.isObject(c)){a.setConfig(c)}}}else{if(a){a.destroy()}}return this},getDraggable:function(){return this.draggable},onDraggableDestroy:function(){delete this.draggable},onComponentDestroy:function(){var a=this.draggable;if(a){a.destroy()}}});(function(a){Ext.define("Ext.Component",{extend:Ext.AbstractComponent,alternateClassName:"Ext.lib.Component",mixins:[Ext.mixin.Traversable],xtype:"component",observableType:"component",cachedConfig:{baseCls:null,cls:null,floatingCls:a+"floating",hiddenCls:a+"item-hidden",ui:null,margin:null,padding:null,border:null,styleHtmlCls:a+"html",styleHtmlContent:null},eventedConfig:{flex:null,left:null,top:null,right:null,bottom:null,width:null,height:null,minWidth:null,minHeight:null,maxWidth:null,maxHeight:null,docked:null,centered:null,hidden:null,disabled:null},config:{style:null,html:null,draggable:null,translatable:null,renderTo:null,zIndex:null,tpl:null,enterAnimation:null,exitAnimation:null,showAnimation:null,hideAnimation:null,tplWriteMode:"overwrite",data:null,disabledCls:a+"item-disabled",contentEl:null,itemId:undefined,record:null,plugins:null},listenerOptionsRegex:/^(?:delegate|single|delay|buffer|args|prepend|element)$/,alignmentRegex:/^([a-z]+)-([a-z]+)(\?)?$/,isComponent:true,floating:false,rendered:false,isInner:true,activeAnimation:null,dockPositions:{top:true,right:true,bottom:true,left:true},innerElement:null,element:null,template:[],widthLayoutSized:false,heightLayoutSized:false,layoutStretched:false,sizeState:false,sizeFlags:0,LAYOUT_WIDTH:1,LAYOUT_HEIGHT:2,LAYOUT_BOTH:3,LAYOUT_STRETCHED:4,constructor:function(c){var d=this,b=d.config,e;d.onInitializedListeners=[];d.initialConfig=c;if(c!==undefined&&"id" in c){e=c.id}else{if("id" in b){e=b.id}else{e=d.getId()}}d.id=e;d.setId(e);Ext.ComponentManager.register(d);d.initElement();d.initConfig(d.initialConfig);d.refreshSizeState=d.doRefreshSizeState;d.refreshFloating=d.doRefreshFloating;if(d.refreshSizeStateOnInitialized){d.refreshSizeState()}if(d.refreshFloatingOnInitialized){d.refreshFloating()}d.initialize();d.triggerInitialized();if(d.config.fullscreen){d.fireEvent("fullscreen",d)}d.fireEvent("initialize",d)},beforeInitConfig:function(b){this.beforeInitialize.apply(this,arguments)},beforeInitialize:Ext.emptyFn,initialize:Ext.emptyFn,getTemplate:function(){return this.template},getElementConfig:function(){return{reference:"element",classList:["x-unsized"],children:this.getTemplate()}},triggerInitialized:function(){var f=this.onInitializedListeners,g=f.length,h,e,d,b,c;if(!this.initialized){this.initialized=true;if(g>0){for(c=0;c0)){this.element.replaceCls(b,c)}},updateStyleHtmlCls:function(d,b){var e=this.innerHtmlElement,c=this.innerElement;if(this.getStyleHtmlContent()&&b){if(e){e.replaceCls(b,d)}else{c.replaceCls(b,d)}}},applyStyleHtmlContent:function(b){return Boolean(b)},updateStyleHtmlContent:function(d){var b=this.getStyleHtmlCls(),c=this.innerElement,e=this.innerHtmlElement;if(d){if(e){e.addCls(b)}else{c.addCls(b)}}else{if(e){e.removeCls(b)}else{c.addCls(b)}}},applyContentEl:function(b){if(b){return Ext.get(b)}},updateContentEl:function(b,c){if(c){c.hide();Ext.getBody().append(c)}if(b){this.setHtml(b.dom);b.show()}},getSize:function(){return{width:this.getWidth(),height:this.getHeight()}},isCentered:function(){return Boolean(this.getCentered())},isFloating:function(){return this.floating},isDocked:function(){return Boolean(this.getDocked())},isInnerItem:function(){return this.isInner},setIsInner:function(b){if(b!==this.isInner){this.isInner=b;if(this.initialized){this.fireEvent("innerstatechange",this,b)}}},filterLengthValue:function(b){if(b==="auto"||(!b&&b!==0)){return null}return b},applyTop:function(b){return this.filterLengthValue(b)},applyRight:function(b){return this.filterLengthValue(b)},applyBottom:function(b){return this.filterLengthValue(b)},applyLeft:function(b){return this.filterLengthValue(b)},applyWidth:function(b){return this.filterLengthValue(b)},applyHeight:function(b){return this.filterLengthValue(b)},applyMinWidth:function(b){return this.filterLengthValue(b)},applyMinHeight:function(b){return this.filterLengthValue(b)},applyMaxWidth:function(b){return this.filterLengthValue(b)},applyMaxHeight:function(b){return this.filterLengthValue(b)},doSetTop:function(b){this.element.setTop(b);this.refreshFloating()},doSetRight:function(b){this.element.setRight(b);this.refreshFloating()},doSetBottom:function(b){this.element.setBottom(b);this.refreshFloating()},doSetLeft:function(b){this.element.setLeft(b);this.refreshFloating()},doSetWidth:function(b){this.element.setWidth(b);this.refreshSizeState()},doSetHeight:function(b){this.element.setHeight(b);this.refreshSizeState()},applyFlex:function(b){if(b){b=Number(b);if(isNaN(b)){b=null}}else{b=null}return b},doSetFlex:Ext.emptyFn,refreshSizeState:function(){this.refreshSizeStateOnInitialized=true},doRefreshSizeState:function(){var c=this.getWidth()!==null||this.widthLayoutSized||(this.getLeft()!==null&&this.getRight()!==null),d=this.getHeight()!==null||this.heightLayoutSized||(this.getTop()!==null&&this.getBottom()!==null),f=this.layoutStretched||this.hasCSSMinHeight||(!d&&this.getMinHeight()!==null),e=c&&d,b=(c&&this.LAYOUT_WIDTH)|(d&&this.LAYOUT_HEIGHT)|(f&&this.LAYOUT_STRETCHED);if(!e&&f){e=null}this.setSizeState(e);this.setSizeFlags(b)},setLayoutSizeFlags:function(b){this.layoutStretched=!!(b&this.LAYOUT_STRETCHED);this.widthLayoutSized=!!(b&this.LAYOUT_WIDTH);this.heightLayoutSized=!!(b&this.LAYOUT_HEIGHT);this.refreshSizeState()},setSizeFlags:function(b){if(b!==this.sizeFlags){this.sizeFlags=b;var c=!!(b&this.LAYOUT_WIDTH),d=!!(b&this.LAYOUT_HEIGHT),e=!!(b&this.LAYOUT_STRETCHED);if(c&&!e&&!d){this.element.addCls("x-has-width")}else{this.element.removeCls("x-has-width")}if(d&&!e&&!c){this.element.addCls("x-has-height")}else{this.element.removeCls("x-has-height")}if(this.initialized){this.fireEvent("sizeflagschange",this,b)}}},getSizeFlags:function(){if(!this.initialized){this.doRefreshSizeState()}return this.sizeFlags},setSizeState:function(b){if(b!==this.sizeState){this.sizeState=b;this.element.setSizeState(b);if(this.initialized){this.fireEvent("sizestatechange",this,b)}}},getSizeState:function(){if(!this.initialized){this.doRefreshSizeState()}return this.sizeState},doSetMinWidth:function(b){this.element.setMinWidth(b)},doSetMinHeight:function(b){this.element.setMinHeight(b);this.refreshSizeState()},doSetMaxWidth:function(b){this.element.setMaxWidth(b)},doSetMaxHeight:function(b){this.element.setMaxHeight(b)},applyCentered:function(b){b=Boolean(b);if(b){this.refreshInnerState=Ext.emptyFn;if(this.isFloating()){this.resetFloating()}if(this.isDocked()){this.setDocked(false)}this.setIsInner(false);delete this.refreshInnerState}return b},doSetCentered:function(b){this.toggleCls(this.getFloatingCls(),b);if(!b){this.refreshInnerState()}},applyDocked:function(b){if(!b){return null}this.refreshInnerState=Ext.emptyFn;if(this.isFloating()){this.resetFloating()}if(this.isCentered()){this.setCentered(false)}this.setIsInner(false);delete this.refreshInnerState;return b},doSetDocked:function(c,b){this.fireEvent("afterdockedchange",this,c,b);if(!c){this.refreshInnerState()}},resetFloating:function(){this.setTop(null);this.setRight(null);this.setBottom(null);this.setLeft(null)},refreshInnerState:function(){this.setIsInner(!this.isCentered()&&!this.isFloating()&&!this.isDocked())},refreshFloating:function(){this.refreshFloatingOnInitialized=true},doRefreshFloating:function(){var c=true,b=this.getFloatingCls();if(this.getTop()===null&&this.getBottom()===null&&this.getRight()===null&&this.getLeft()===null){c=false}else{this.refreshSizeState()}if(c!==this.floating){this.floating=c;if(c){this.refreshInnerState=Ext.emptyFn;if(this.isCentered()){this.setCentered(false)}if(this.isDocked()){this.setDocked(false)}this.setIsInner(false);delete this.refreshInnerState}this.element.toggleCls(b,c);if(this.initialized){this.fireEvent("floatingchange",this,c)}if(!c){this.refreshInnerState()}}},updateFloatingCls:function(b,c){if(this.isFloating()){this.replaceCls(c,b)}},applyDisabled:function(b){return Boolean(b)},doSetDisabled:function(b){this.element[b?"addCls":"removeCls"](this.getDisabledCls())},updateDisabledCls:function(b,c){if(this.isDisabled()){this.element.replaceCls(c,b)}},disable:function(){this.setDisabled(true)},enable:function(){this.setDisabled(false)},isDisabled:function(){return this.getDisabled()},applyZIndex:function(b){if(!b&&b!==0){b=null}if(b!==null){b=Number(b);if(isNaN(b)){b=null}}return b},updateZIndex:function(d){var c=this.element,b;if(c&&!c.isDestroyed){b=c.dom.style;if(d!==null){b.setProperty("z-index",d,"important")}else{b.removeProperty("z-index")}}},getInnerHtmlElement:function(){var b=this.innerHtmlElement,c;if(!b||!b.dom||!b.dom.parentNode){this.innerHtmlElement=b=Ext.Element.create({cls:"x-innerhtml"});if(this.getStyleHtmlContent()){c=this.getStyleHtmlCls();this.innerHtmlElement.addCls(c);this.innerElement.removeCls(c)}this.innerElement.appendChild(b)}return b},updateHtml:function(b){if(!this.isDestroyed){var c=this.getInnerHtmlElement();if(Ext.isElement(b)){c.setHtml("");c.append(b)}else{c.setHtml(b)}}},applyHidden:function(b){return Boolean(b)},doSetHidden:function(c){var b=this.renderElement;if(b.isDestroyed){return}if(c){b.hide()}else{b.show()}if(this.element){this.element[c?"addCls":"removeCls"](this.getHiddenCls())}this.fireEvent(c?"hide":"show",this)},updateHiddenCls:function(b,c){if(this.isHidden()){this.element.replaceCls(c,b)}},isHidden:function(){return this.getHidden()},hide:function(b){this.setCurrentAlignmentInfo(null);if(this.activeAnimation){this.activeAnimation.on({animationend:function(){this.hide(b)},scope:this,single:true});return this}if(!this.getHidden()){if(b===undefined||(b&&b.isComponent)){b=this.getHideAnimation()}if(b){if(b===true){b="fadeOut"}this.onBefore({hiddenchange:"animateFn",scope:this,single:true,args:[b]})}this.setHidden(true)}return this},show:function(c){if(this.activeAnimation){this.activeAnimation.on({animationend:function(){this.show(c)},scope:this,single:true});return this}var b=this.getHidden();if(b||b===null){if(c===true){c="fadeIn"}else{if(c===undefined||(c&&c.isComponent)){c=this.getShowAnimation()}}if(c){this.beforeShowAnimation();this.onBefore({hiddenchange:"animateFn",scope:this,single:true,args:[c]})}this.setHidden(false)}return this},beforeShowAnimation:function(){if(this.element){this.renderElement.show();this.element.removeCls(this.getHiddenCls())}},animateFn:function(g,e,h,d,c,b){var f=this;if(g&&(!h||(h&&this.isPainted()))){this.activeAnimation=new Ext.fx.Animation(g);this.activeAnimation.setElement(e.element);if(!Ext.isEmpty(h)){this.activeAnimation.setOnEnd(function(){f.activeAnimation=null;b.resume()});b.pause()}Ext.Animator.run(f.activeAnimation)}},setVisibility:function(b){this.renderElement.setVisibility(b)},isRendered:function(){return this.rendered},isPainted:function(){return this.renderElement.isPainted()},applyTpl:function(b){return(Ext.isObject(b)&&b.isTemplate)?b:new Ext.XTemplate(b)},applyData:function(b){if(Ext.isObject(b)){return Ext.apply({},b)}else{if(!b){b={}}}return b},updateData:function(d){var e=this;if(d){var c=e.getTpl(),b=e.getTplWriteMode();if(c){c[b](e.getInnerHtmlElement(),d)}this.fireEvent("updatedata",e,d)}},applyRecord:function(b){if(b&&Ext.isObject(b)&&b.isModel){return b}return null},updateRecord:function(c,b){var d=this;if(b){b.unjoin(d)}if(!c){d.updateData("")}else{c.join(d);d.updateData(c.getData(true))}},afterEdit:function(){this.updateRecord(this.getRecord())},afterErase:function(){this.setRecord(null)},applyItemId:function(b){return b||this.getId()},isXType:function(c,b){if(b){return this.xtypes.indexOf(c)!=-1}return Boolean(this.xtypesMap[c])},getXTypes:function(){return this.xtypesChain.join("/")},getDraggableBehavior:function(){var b=this.draggableBehavior;if(!b){b=this.draggableBehavior=new Ext.behavior.Draggable(this)}return b},applyDraggable:function(b){this.getDraggableBehavior().setConfig(b)},getDraggable:function(){return this.getDraggableBehavior().getDraggable()},getTranslatableBehavior:function(){var b=this.translatableBehavior;if(!b){b=this.translatableBehavior=new Ext.behavior.Translatable(this)}return b},applyTranslatable:function(b){this.getTranslatableBehavior().setConfig(b)},getTranslatable:function(){return this.getTranslatableBehavior().getTranslatable()},translateAxis:function(c,e,d){var b,f;if(c==="x"){b=e}else{f=e}return this.translate(b,f,d)},translate:function(){var b=this.getTranslatable();if(!b){this.setTranslatable(true);b=this.getTranslatable()}b.translate.apply(b,arguments)},setRendered:function(c){var b=this.rendered;if(c!==b){this.rendered=c;return true}return false},setSize:function(c,b){if(c!=undefined){this.setWidth(c)}if(b!=undefined){this.setHeight(b)}},doAddListener:function(d,f,e,c,b){if(c&&"element" in c){return this[c.element].doAddListener(d,f,e||this,c,b)}if(d=="painted"||d=="resize"){return this.element.doAddListener(d,f,e||this,c,b)}return this.callParent(arguments)},doRemoveListener:function(d,f,e,c,b){if(c&&"element" in c){this[c.element].doRemoveListener(d,f,e||this,c,b)}return this.callParent(arguments)},showBy:function(c,f){var e=this,b=Ext.Viewport,d=e.getParent();e.setVisibility(false);if(d!==b){b.add(e)}e.show();e.on({hide:"onShowByErased",destroy:"onShowByErased",single:true,scope:e});b.on("resize","alignTo",e,{args:[c,f]});e.alignTo(c,f);e.setVisibility(true)},onShowByErased:function(){Ext.Viewport.un("resize","alignTo",this)},getAlignmentInfo:function(j,i){var c=j.isComponent?j.renderElement:j,g=c.getPageBox(),d=this.renderElement,e=d.getPageBox(),f={alignToBox:g,alignment:i,top:g.top,left:g.left,alignToWidth:g.width,alignToHeight:g.height,width:e.width,height:e.height},b=this.getCurrentAlignmentInfo(),h=true;if(!Ext.isEmpty(b)){Ext.Object.each(f,function(k,l){if(!Ext.isObject(l)&&b[k]!=l){h=false;return false}return true})}else{h=false}return{isAligned:h,stats:f}},getCurrentAlignmentInfo:function(){return this.$currentAlignmentInfo},setCurrentAlignmentInfo:function(b){this.$currentAlignmentInfo=Ext.isEmpty(b)?null:Ext.merge({},b.stats?b.stats:b)},alignTo:function(l,h){var o=this.getAlignmentInfo(l,h);if(o.isAligned){return}var n=o.stats.alignToBox,z=this.getParent().element.getPageBox(),w=o.stats.alignToHeight,m=o.stats.alignToWidth,r=o.stats.height,t=o.stats.width;z.bottom-=5;z.height-=10;z.left+=5;z.right-=5;z.top+=5;z.width-=10;if(!h||h==="auto"){if(z.bottom-n.bottomh){d=m.element;k.splice(e,0,n);break}}if(!d){k.push(n);d=this.getBodyElement()}this.itemsCount++;if(g==="start"){f.insertBefore(d)}else{f.insertAfter(d)}},removeItem:function(c){var a=c.getDocked(),b=this.items[this.positionMap[a]];Ext.Array.remove(b,c);c.element.detach();delete c.$dockWrapper;c.removeCls("x-dock-item");c.removeCls("x-docked-"+a);if(--this.itemsCount===0){this.destroy()}},getItemsSlice:function(c){var a=this.getContainer(),b=this.items,h=[],g,d,f,e;for(g=b.start,d=0,f=g.length;dc){h.push(e)}}for(g=b.end,d=0,f=g.length;dc){h.push(e)}}return h},applyElement:function(a){return Ext.Element.create(a)},updateElement:function(a){a.addCls("x-dock-"+this.getDirection())},applyBodyElement:function(a){return Ext.Element.create(a)},updateBodyElement:function(a){this.getElement().append(a)},updateInnerWrapper:function(a,c){var b=this.getBodyElement();if(c&&c.$outerWrapper===this){c.getElement().detach();delete c.$outerWrapper}if(a){a.setSizeState(this.getSizeState());a.$outerWrapper=this;b.append(a.getElement())}},updateSizeState:function(b){var a=this.getInnerWrapper();this.getElement().setSizeState(b);if(a){a.setSizeState(b)}},destroy:function(){var c=this.getInnerWrapper(),b=this.$outerWrapper,a;if(c){if(b){b.setInnerWrapper(c)}else{a=c.getElement();if(!a.isDestroyed){a.replace(this.getElement())}delete c.$outerWrapper}}delete this.$outerWrapper;this.setInnerWrapper(null);this.unlink("_bodyElement","_element");this.callSuper()}});Ext.define("Ext.layout.Default",{extend:Ext.layout.Abstract,isAuto:true,alias:["layout.default","layout.auto"],config:{animation:null},centerWrapperClass:"x-center",dockWrapperClass:"x-dock",positionMap:{top:"start",left:"start",middle:"center",bottom:"end",right:"end"},positionDirectionMap:{top:"vertical",bottom:"vertical",left:"horizontal",right:"horizontal"},setContainer:function(a){var b={delegate:"> component"};this.dockedItems=[];this.callSuper(arguments);a.on("centeredchange","onItemCenteredChange",this,b,"before").on("floatingchange","onItemFloatingChange",this,b,"before").on("dockedchange","onBeforeItemDockedChange",this,b,"before").on("afterdockedchange","onAfterItemDockedChange",this,b)},monitorSizeStateChange:function(){this.monitorSizeStateChange=Ext.emptyFn;this.container.on("sizestatechange","onContainerSizeStateChange",this)},monitorSizeFlagsChange:function(){this.monitorSizeFlagsChange=Ext.emptyFn;this.container.on("sizeflagschange","onContainerSizeFlagsChange",this)},onItemAdd:function(a){var b=a.getDocked();if(b!==null){this.dockItem(a)}else{if(a.isCentered()){this.onItemCenteredChange(a,true)}else{if(a.isFloating()){this.onItemFloatingChange(a,true)}else{this.onItemInnerStateChange(a,true)}}}},onItemInnerStateChange:function(b,a,c){if(a){this.insertInnerItem(b,this.container.innerIndexOf(b))}else{this.removeInnerItem(b)}},insertInnerItem:function(f,d){var b=this.container,h=b.innerElement.dom,e=f.element.dom,g=d!==-1?b.getInnerAt(d+1):null,c=null,a;if(g){a=g.getTranslatable();if(a&&a.getUseWrapper()){c=a.getWrapper().dom}else{c=g?g.element.dom:null}}h.insertBefore(e,c);return this},insertBodyItem:function(c){var a=this.container.setUseBodyElement(true),b=a.bodyElement.dom;if(c.getZIndex()===null){c.setZIndex((a.indexOf(c)+1)*2)}b.insertBefore(c.element.dom,b.firstChild);return this},removeInnerItem:function(a){a.element.detach()},removeBodyItem:function(a){a.setZIndex(null);a.element.detach()},onItemRemove:function(b,a,c){var d=b.getDocked();if(d){this.undockItem(b)}else{if(b.isCentered()){this.onItemCenteredChange(b,false)}else{if(b.isFloating()){this.onItemFloatingChange(b,false)}else{this.onItemInnerStateChange(b,false,c)}}}},onItemMove:function(b,c,a){if(b.isCentered()||b.isFloating()){b.setZIndex((c+1)*2)}else{if(b.isInnerItem()){this.insertInnerItem(b,this.container.innerIndexOf(b))}else{this.undockItem(b);this.dockItem(b)}}},onItemCenteredChange:function(c,a){var b="$centerWrapper";if(a){this.insertBodyItem(c);c.link(b,new Ext.util.Wrapper({className:this.centerWrapperClass},c.element))}else{c.unlink(b);this.removeBodyItem(c)}},onItemFloatingChange:function(a,b){if(b){this.insertBodyItem(a)}else{this.removeBodyItem(a)}},onBeforeItemDockedChange:function(a,c,b){if(b){this.undockItem(a)}},onAfterItemDockedChange:function(a,c,b){if(c){this.dockItem(a)}},onContainerSizeStateChange:function(){var a=this.getDockWrapper();if(a){a.setSizeState(this.container.getSizeState())}},onContainerSizeFlagsChange:function(){var a=this.dockedItems,b,d,c;for(b=0,d=a.length;bt){n=q||p[0];p.splice(m,0,s);break}q=v}if(!n){n=p[g-1];p.push(s)}a=n.getDocked();d=n.$dockWrapper;l=f[a];if(u===l){d.addItem(s)}else{k=d.getItemsSlice(t);o=new b({container:this.container,direction:u});if(k.length>0){if(k.length===d.itemsCount){c=d;o.setSizeState(c.getSizeState());o.getElement().replace(c.getElement())}else{c=new b({container:this.container,direction:l});c.setInnerWrapper(d.getInnerWrapper());c.addItems(k);d.setInnerWrapper(o)}o.setInnerWrapper(c)}else{j=d.getInnerWrapper();d.setInnerWrapper(null);o.setInnerWrapper(j);d.setInnerWrapper(o)}o.addItem(s)}}h.onInitialized("refreshDockedItemLayoutSizeFlags",this,[s])},getDockWrapper:function(){var a=this.dockedItems;if(a.length>0){return a[0].$dockWrapper}return null},undockItem:function(b){var a=this.dockedItems;if(b.$dockWrapper){b.$dockWrapper.removeItem(b)}Ext.Array.remove(a,b);b.setLayoutSizeFlags(0)},destroy:function(){this.dockedItems.length=0;delete this.dockedItems;this.callSuper()}});Ext.define("Ext.layout.Box",{extend:Ext.layout.Default,config:{orient:"horizontal",align:"start",pack:"start"},alias:"layout.tablebox",layoutBaseClass:"x-layout-tablebox",itemClass:"x-layout-tablebox-item",setContainer:function(a){this.callSuper(arguments);a.innerElement.addCls(this.layoutBaseClass);a.on("flexchange","onItemFlexChange",this,{delegate:"> component"})},onItemInnerStateChange:function(b,a){this.callSuper(arguments);b.toggleCls(this.itemClass,a)},onItemFlexChange:function(){}});Ext.define("Ext.layout.FlexBox",{extend:Ext.layout.Box,alias:"layout.box",config:{align:"stretch"},layoutBaseClass:"x-layout-box",itemClass:"x-layout-box-item",setContainer:function(a){this.callSuper(arguments);this.monitorSizeFlagsChange()},applyOrient:function(a){return a},updateOrient:function(c,b){var a=this.container,d={delegate:"> component"};if(c==="horizontal"){this.sizePropertyName="width"}else{this.sizePropertyName="height"}a.innerElement.swapCls("x-"+c,"x-"+b);if(b){a.un(b==="horizontal"?"widthchange":"heightchange","onItemSizeChange",this,d);this.redrawContainer()}a.on(c==="horizontal"?"widthchange":"heightchange","onItemSizeChange",this,d)},onItemInnerStateChange:function(d,c){this.callSuper(arguments);var a,b;d.toggleCls(this.itemClass,c);if(c){a=d.getFlex();b=d.get(this.sizePropertyName);if(a){this.doItemFlexChange(d,a)}else{if(b){this.doItemSizeChange(d,b)}}}this.refreshItemSizeState(d)},refreshItemSizeState:function(e){var c=e.isInnerItem(),a=this.container,f=a.LAYOUT_HEIGHT,d=a.LAYOUT_WIDTH,g=this.sizePropertyName,b=0,h=a.getSizeFlags();if(c){b|=a.LAYOUT_STRETCHED;if(this.getAlign()==="stretch"){b|=h&(g==="width"?f:d)}if(e.getFlex()){b|=h&(g==="width"?d:f)}}e.setLayoutSizeFlags(b)},refreshAllItemSizedStates:function(){var d=this.container.innerItems,a,c,b;for(a=0,c=d.length;aj){e=n.element;l.splice(f,0,o);break}}if(!e){l.push(o);e=this.getBodyElement()}this.itemsCount++;if(h==="start"){g.insertBefore(e)}else{g.insertAfter(e)}a.wrap(o.element);a.bindSize(this.getDirection()==="horizontal"?"width":"height")},removeItem:function(c){var a=c.getDocked(),b=this.items[this.positionMap[a]];c.removeCls("x-docked-"+a);Ext.Array.remove(b,c);c.unlink("$dockItemWrapper");c.element.detach();delete c.$dockWrapper;if(--this.itemsCount===0){this.destroy()}},getItemsSlice:function(c){var a=this.getContainer(),b=this.items,h=[],g,d,f,e;for(g=b.start,d=0,f=g.length;dc){h.push(e)}}for(g=b.end,d=0,f=g.length;dc){h.push(e)}}return h},applyElement:function(a){return Ext.Element.create(a)},updateElement:function(a){a.addCls("x-dock-"+this.getDirection())},applyBodyElement:function(a){return Ext.Element.create(a)},updateBodyElement:function(a){this.getElement().append(a)},updateInnerWrapper:function(a,c){var b=this.getBodyElement();if(c&&c.$outerWrapper===this){b.remove(c.getElement());delete c.$outerWrapper}if(a){a.setSizeState(this.getSizeState());a.$outerWrapper=this;b.append(a.getElement())}},updateSizeState:function(b){var a=this.getInnerWrapper();this.getElement().setSizeState(b);if(a){a.setSizeState(b)}},destroy:function(){var b=this.getInnerWrapper(),a=this.$outerWrapper;if(b){if(a){a.setInnerWrapper(b)}else{b.getElement().replace(this.getElement());delete b.$outerWrapper}}delete this.$outerWrapper;this.setInnerWrapper(null);this.unlink("_bodyElement","_element");this.callSuper()}});Ext.define("Ext.layout.VBox",{extend:Ext.layout.FlexBox,alias:"layout.vbox",config:{orient:"vertical"}});Ext.define("Ext.fx.layout.card.Abstract",{extend:Ext.Evented,isAnimation:true,config:{direction:"left",duration:null,reverse:null,layout:null},updateLayout:function(){this.enable()},enable:function(){var a=this.getLayout();if(a){a.onBefore("activeitemchange","onActiveItemChange",this)}},disable:function(){var a=this.getLayout();if(this.isAnimating){this.stopAnimation()}if(a){a.unBefore("activeitemchange","onActiveItemChange",this)}},onActiveItemChange:Ext.emptyFn,destroy:function(){var a=this.getLayout();if(this.isAnimating){this.stopAnimation()}if(a){a.unBefore("activeitemchange","onActiveItemChange",this)}this.setLayout(null);if(this.observableId){this.fireEvent("destroy",this);this.clearListeners();this.clearManagedListeners()}}});Ext.define("Ext.fx.State",{isAnimatable:{"background-color":true,"background-image":true,"background-position":true,"border-bottom-color":true,"border-bottom-width":true,"border-color":true,"border-left-color":true,"border-left-width":true,"border-right-color":true,"border-right-width":true,"border-spacing":true,"border-top-color":true,"border-top-width":true,"border-width":true,bottom:true,color:true,crop:true,"font-size":true,"font-weight":true,height:true,left:true,"letter-spacing":true,"line-height":true,"margin-bottom":true,"margin-left":true,"margin-right":true,"margin-top":true,"max-height":true,"max-width":true,"min-height":true,"min-width":true,opacity:true,"outline-color":true,"outline-offset":true,"outline-width":true,"padding-bottom":true,"padding-left":true,"padding-right":true,"padding-top":true,right:true,"text-indent":true,"text-shadow":true,top:true,"vertical-align":true,visibility:true,width:true,"word-spacing":true,"z-index":true,zoom:true,transform:true},constructor:function(a){this.data={};this.set(a)},setConfig:function(a){this.set(a);return this},setRaw:function(a){this.data=a;return this},clear:function(){return this.setRaw({})},setTransform:function(c,g){var f=this.data,a=Ext.isArray(g),b=f.transform,e,d;if(!b){b=f.transform={translateX:0,translateY:0,translateZ:0,scaleX:1,scaleY:1,scaleZ:1,rotate:0,rotateX:0,rotateY:0,rotateZ:0,skewX:0,skewY:0}}if(typeof c=="string"){switch(c){case"translate":if(a){e=g.length;if(e==0){break}b.translateX=g[0];if(e==1){break}b.translateY=g[1];if(e==2){break}b.translateZ=g[2]}else{b.translateX=g}break;case"rotate":if(a){e=g.length;if(e==0){break}b.rotateX=g[0];if(e==1){break}b.rotateY=g[1];if(e==2){break}b.rotateZ=g[2]}else{b.rotate=g}break;case"scale":if(a){e=g.length;if(e==0){break}b.scaleX=g[0];if(e==1){break}b.scaleY=g[1];if(e==2){break}b.scaleZ=g[2]}else{b.scaleX=g;b.scaleY=g}break;case"skew":if(a){e=g.length;if(e==0){break}b.skewX=g[0];if(e==1){break}b.skewY=g[1]}else{b.skewX=g}break;default:b[c]=g}}else{for(d in c){if(c.hasOwnProperty(d)){g=c[d];this.setTransform(d,g)}}}},set:function(a,d){var c=this.data,b;if(typeof a!="string"){for(b in a){d=a[b];if(b==="transform"){this.setTransform(d)}else{c[b]=d}}}else{if(a==="transform"){this.setTransform(d)}else{c[a]=d}}return this},unset:function(a){var b=this.data;if(b.hasOwnProperty(a)){delete b[a]}return this},getData:function(){return this.data}});Ext.define("Ext.fx.animation.Abstract",{extend:Ext.Evented,isAnimation:true,config:{name:"",element:null,before:null,from:{},to:{},after:null,states:{},duration:300,easing:"linear",iteration:1,direction:"normal",delay:0,onBeforeStart:null,onEnd:null,onBeforeEnd:null,scope:null,reverse:null,preserveEndState:false,replacePrevious:true},STATE_FROM:"0%",STATE_TO:"100%",DIRECTION_UP:"up",DIRECTION_DOWN:"down",DIRECTION_LEFT:"left",DIRECTION_RIGHT:"right",stateNameRegex:/^(?:[\d\.]+)%$/,constructor:function(){this.states={};this.callParent(arguments);return this},applyElement:function(a){return Ext.get(a)},applyBefore:function(a,b){if(a){return Ext.factory(a,Ext.fx.State,b)}},applyAfter:function(b,a){if(b){return Ext.factory(b,Ext.fx.State,a)}},setFrom:function(a){return this.setState(this.STATE_FROM,a)},setTo:function(a){return this.setState(this.STATE_TO,a)},getFrom:function(){return this.getState(this.STATE_FROM)},getTo:function(){return this.getState(this.STATE_TO)},setStates:function(a){var c=this.stateNameRegex,b;for(b in a){if(c.test(b)){this.setState(b,a[b])}}return this},getStates:function(){return this.states},stop:function(){this.fireEvent("stop",this)},destroy:function(){this.stop();this.callParent()},setState:function(b,d){var a=this.getStates(),c;c=Ext.factory(d,Ext.fx.State,a[b]);if(c){a[b]=c}return this},getState:function(a){return this.getStates()[a]},getData:function(){var k=this.getStates(),e={},g=this.getBefore(),c=this.getAfter(),h=k[this.STATE_FROM],i=k[this.STATE_TO],j=h.getData(),f=i.getData(),d,b,a;for(b in k){if(k.hasOwnProperty(b)){a=k[b];d=a.getData();e[b]=d}}if(Ext.browser.is.AndroidStock2){e["0.0001%"]=j}return{before:g?g.getData():{},after:c?c.getData():{},states:e,from:j,to:f,duration:this.getDuration(),iteration:this.getIteration(),direction:this.getDirection(),easing:this.getEasing(),delay:this.getDelay(),onEnd:this.getOnEnd(),onBeforeEnd:this.getOnBeforeEnd(),onBeforeStart:this.getOnBeforeStart(),scope:this.getScope(),preserveEndState:this.getPreserveEndState(),replacePrevious:this.getReplacePrevious()}}});Ext.define("Ext.fx.animation.Slide",{extend:Ext.fx.animation.Abstract,alternateClassName:"Ext.fx.animation.SlideIn",alias:["animation.slide","animation.slideIn"],config:{direction:"left",out:false,offset:0,easing:"auto",containerBox:"auto",elementBox:"auto",isElementBoxFit:true,useCssTransform:true},reverseDirectionMap:{up:"down",down:"up",left:"right",right:"left"},applyEasing:function(a){if(a==="auto"){return"ease-"+((this.getOut())?"in":"out")}return a},getContainerBox:function(){var a=this._containerBox;if(a==="auto"){a=this.getElement().getParent().getPageBox()}return a},getElementBox:function(){var a=this._elementBox;if(this.getIsElementBoxFit()){return this.getContainerBox()}if(a==="auto"){a=this.getElement().getPageBox()}return a},getData:function(){var p=this.getElementBox(),c=this.getContainerBox(),g=p?p:c,n=this.getFrom(),o=this.getTo(),f=this.getOut(),e=this.getOffset(),m=this.getDirection(),b=this.getUseCssTransform(),h=this.getReverse(),d=0,a=0,l,j,k,i;if(h){m=this.reverseDirectionMap[m]}switch(m){case this.DIRECTION_UP:if(f){a=c.top-g.top-g.height-e}else{a=c.bottom-g.bottom+g.height+e}break;case this.DIRECTION_DOWN:if(f){a=c.bottom-g.bottom+g.height+e}else{a=c.top-g.height-g.top-e}break;case this.DIRECTION_RIGHT:if(f){d=c.right-g.right+g.width+e}else{d=c.left-g.left-g.width-e}break;case this.DIRECTION_LEFT:if(f){d=c.left-g.left-g.width-e}else{d=c.right-g.right+g.width+e}break}l=(f)?0:d;j=(f)?0:a;if(b){n.setTransform({translateX:l,translateY:j})}else{n.set("left",l);n.set("top",j)}k=(f)?d:0;i=(f)?a:0;if(b){o.setTransform({translateX:k,translateY:i})}else{o.set("left",k);o.set("top",i)}return this.callParent(arguments)}});Ext.define("Ext.fx.animation.SlideOut",{extend:Ext.fx.animation.Slide,alias:["animation.slideOut"],config:{out:true}});Ext.define("Ext.fx.animation.Fade",{extend:Ext.fx.animation.Abstract,alternateClassName:"Ext.fx.animation.FadeIn",alias:["animation.fade","animation.fadeIn"],config:{out:false,before:{display:null,opacity:0},after:{opacity:null},reverse:null},updateOut:function(a){var c=this.getTo(),b=this.getFrom();if(a){b.set("opacity",1);c.set("opacity",0)}else{b.set("opacity",0);c.set("opacity",1)}}});Ext.define("Ext.fx.animation.FadeOut",{extend:Ext.fx.animation.Fade,alias:"animation.fadeOut",config:{out:true,before:{}}});Ext.define("Ext.fx.animation.Flip",{extend:Ext.fx.animation.Abstract,alias:"animation.flip",config:{easing:"ease-in",direction:"right",half:false,out:null},getData:function(){var h=this.getFrom(),i=this.getTo(),g=this.getDirection(),b=this.getOut(),l=this.getHalf(),c=(l)?90:180,e=1,a=1,k=0,j=0,f=0,d=0;if(b){a=0.8}else{e=0.8}switch(g){case this.DIRECTION_UP:if(b){f=c}else{k=-c}break;case this.DIRECTION_DOWN:if(b){f=-c}else{k=c}break;case this.DIRECTION_RIGHT:if(b){d=c}else{j=-c}break;case this.DIRECTION_LEFT:if(b){d=-c}else{j=c}break}h.setTransform({rotateX:k,rotateY:j,scale:e});i.setTransform({rotateX:f,rotateY:d,scale:a});return this.callParent(arguments)}});Ext.define("Ext.fx.animation.Pop",{extend:Ext.fx.animation.Abstract,alias:["animation.pop","animation.popIn"],alternateClassName:"Ext.fx.animation.PopIn",config:{out:false,before:{display:null,opacity:0},after:{opacity:null}},getData:function(){var c=this.getTo(),b=this.getFrom(),a=this.getOut();if(a){b.set("opacity",1);b.setTransform({scale:1});c.set("opacity",0);c.setTransform({scale:0})}else{b.set("opacity",0);b.setTransform({scale:0});c.set("opacity",1);c.setTransform({scale:1})}return this.callParent(arguments)}});Ext.define("Ext.fx.animation.PopOut",{extend:Ext.fx.animation.Pop,alias:"animation.popOut",config:{out:true,before:{}}});Ext.define("Ext.fx.Animation",{constructor:function(b){var a=Ext.fx.animation.Abstract,c;if(typeof b=="string"){c=b;b={}}else{if(b&&b.type){c=b.type}}if(c){if(Ext.browser.is.AndroidStock2){if(c=="pop"){c="fade"}if(c=="popIn"){c="fadeIn"}if(c=="popOut"){c="fadeOut"}}a=Ext.ClassManager.getByAlias("animation."+c)}return Ext.factory(b,a)}});Ext.define("Ext.fx.layout.card.Style",{extend:Ext.fx.layout.card.Abstract,config:{inAnimation:{before:{visibility:null},preserveEndState:false,replacePrevious:true},outAnimation:{preserveEndState:false,replacePrevious:true}},constructor:function(b){var c,a;this.initConfig(b);this.endAnimationCounter=0;c=this.getInAnimation();a=this.getOutAnimation();c.on("animationend","incrementEnd",this);a.on("animationend","incrementEnd",this)},updateDirection:function(a){this.getInAnimation().setDirection(a);this.getOutAnimation().setDirection(a)},updateDuration:function(a){this.getInAnimation().setDuration(a);this.getOutAnimation().setDuration(a)},updateReverse:function(a){this.getInAnimation().setReverse(a);this.getOutAnimation().setReverse(a)},incrementEnd:function(){this.endAnimationCounter++;if(this.endAnimationCounter>1){this.endAnimationCounter=0;this.fireEvent("animationend",this)}},applyInAnimation:function(b,a){return Ext.factory(b,Ext.fx.Animation,a)},applyOutAnimation:function(b,a){return Ext.factory(b,Ext.fx.Animation,a)},updateInAnimation:function(a){a.setScope(this)},updateOutAnimation:function(a){a.setScope(this)},onActiveItemChange:function(a,e,h,i,d){var b=this.getInAnimation(),g=this.getOutAnimation(),f,c;if(e&&h&&h.isPainted()){f=e.renderElement;c=h.renderElement;b.setElement(f);g.setElement(c);g.setOnBeforeEnd(function(j,k){if(k||Ext.Animator.hasRunningAnimations(j)){d.firingArguments[1]=null;d.firingArguments[2]=null}});g.setOnEnd(function(){d.resume()});f.dom.style.setProperty("visibility","hidden","important");e.show();Ext.Animator.run([g,b]);d.pause()}},destroy:function(){Ext.destroy(this.getInAnimation(),this.getOutAnimation());this.callParent(arguments)}});Ext.define("Ext.fx.layout.card.Slide",{extend:Ext.fx.layout.card.Style,alias:"fx.layout.card.slide",config:{inAnimation:{type:"slide",easing:"ease-out"},outAnimation:{type:"slide",easing:"ease-out",out:true}},updateReverse:function(a){this.getInAnimation().setReverse(a);this.getOutAnimation().setReverse(a)}});Ext.define("Ext.fx.layout.card.Cover",{extend:Ext.fx.layout.card.Style,alias:"fx.layout.card.cover",config:{reverse:null,inAnimation:{before:{"z-index":100},after:{"z-index":0},type:"slide",easing:"ease-out"},outAnimation:{easing:"ease-out",from:{opacity:0.99},to:{opacity:1},out:true}},updateReverse:function(a){this.getInAnimation().setReverse(a);this.getOutAnimation().setReverse(a)}});Ext.define("Ext.fx.layout.card.Reveal",{extend:Ext.fx.layout.card.Style,alias:"fx.layout.card.reveal",config:{inAnimation:{easing:"ease-out",from:{opacity:0.99},to:{opacity:1}},outAnimation:{before:{"z-index":100},after:{"z-index":0},type:"slide",easing:"ease-out",out:true}},updateReverse:function(a){this.getInAnimation().setReverse(a);this.getOutAnimation().setReverse(a)}});Ext.define("Ext.fx.layout.card.Fade",{extend:Ext.fx.layout.card.Style,alias:"fx.layout.card.fade",config:{reverse:null,inAnimation:{type:"fade",easing:"ease-out"},outAnimation:{type:"fade",easing:"ease-out",out:true}}});Ext.define("Ext.fx.layout.card.Flip",{extend:Ext.fx.layout.card.Style,alias:"fx.layout.card.flip",config:{duration:500,inAnimation:{type:"flip",half:true,easing:"ease-out",before:{"backface-visibility":"hidden"},after:{"backface-visibility":null}},outAnimation:{type:"flip",half:true,easing:"ease-in",before:{"backface-visibility":"hidden"},after:{"backface-visibility":null},out:true}},onActiveItemChange:function(e,c,f,b,a){var d=c.element.getParent();d.addCls("x-layout-card-perspective");this.on("animationend",function(){d.removeCls("x-layout-card-perspective")},this,{single:true});this.callParent(arguments)},updateDuration:function(d){var c=d/2,b=this.getInAnimation(),a=this.getOutAnimation();b.setDelay(c);b.setDuration(c);a.setDuration(c)}});Ext.define("Ext.fx.layout.card.Pop",{extend:Ext.fx.layout.card.Style,alias:"fx.layout.card.pop",config:{duration:500,inAnimation:{type:"pop",easing:"ease-out"},outAnimation:{type:"pop",easing:"ease-in",out:true}},updateDuration:function(d){var c=d/2,b=this.getInAnimation(),a=this.getOutAnimation();b.setDelay(c);b.setDuration(c);a.setDuration(c)}});Ext.define("Ext.fx.layout.card.Scroll",{extend:Ext.fx.layout.card.Abstract,alias:"fx.layout.card.scroll",config:{duration:150},constructor:function(a){this.initConfig(a)},getEasing:function(){var a=this.easing;if(!a){this.easing=a=new Ext.fx.easing.Linear()}return a},updateDuration:function(a){this.getEasing().setDuration(a)},onActiveItemChange:function(a,d,l,m,c){var i=this.getDirection(),g=this.getEasing(),k,e,b,h,j,f;if(d&&l){if(this.isAnimating){this.stopAnimation()}d.setWidth("100%");d.setHeight("100%");k=this.getLayout().container.innerElement;h=k.getWidth();j=k.getHeight();e=d.renderElement;b=l.renderElement;this.oldItem=l;this.newItem=d;this.currentEventController=c;this.containerElement=k;this.isReverse=f=this.getReverse();d.show();if(i=="right"){i="left";this.isReverse=f=!f}else{if(i=="down"){i="up";this.isReverse=f=!f}}if(i=="left"){if(f){g.setConfig({startValue:h,endValue:0});k.dom.scrollLeft=h;b.setLeft(h)}else{g.setConfig({startValue:0,endValue:h});e.setLeft(h)}}else{if(f){g.setConfig({startValue:j,endValue:0});k.dom.scrollTop=j;b.setTop(j)}else{g.setConfig({startValue:0,endValue:j});e.setTop(j)}}this.startAnimation();c.pause()}},startAnimation:function(){this.isAnimating=true;this.getEasing().setStartTime(Date.now());Ext.AnimationQueue.start(this.doAnimationFrame,this)},doAnimationFrame:function(){var d=this.getEasing(),c=this.getDirection(),a="scrollTop",b;if(c=="left"||c=="right"){a="scrollLeft"}if(d.isEnded){this.stopAnimation()}else{b=d.getValue();this.containerElement.dom[a]=b}},stopAnimation:function(){var c=this,e=c.getDirection(),a="setTop",d=c.oldItem,b=c.newItem;if(e=="left"||e=="right"){a="setLeft"}c.currentEventController.resume();if(c.isReverse&&d&&d.renderElement&&d.renderElement.dom){d.renderElement[a](null)}else{if(b&&b.renderElement&&b.renderElement.dom){b.renderElement[a](null)}}Ext.AnimationQueue.stop(this.doAnimationFrame,this);c.isAnimating=false;c.fireEvent("animationend",c)}});Ext.define("Ext.fx.layout.Card",{constructor:function(b){var a=Ext.fx.layout.card.Abstract,c;if(!b){return null}if(typeof b=="string"){c=b;b={}}else{if(b.type){c=b.type}}b.elementBox=false;if(c){if(Ext.browser.is.AndroidStock2){if(c!="fade"){c="scroll"}}a=Ext.ClassManager.getByAlias("fx.layout.card."+c)}return Ext.factory(b,a)}});Ext.define("Ext.layout.Card",{extend:Ext.layout.Default,alias:"layout.card",isCard:true,layoutClass:"x-layout-card",itemClass:"x-layout-card-item",applyAnimation:function(a){return new Ext.fx.layout.Card(a)},updateAnimation:function(b,a){if(b&&b.isAnimation){b.setLayout(this)}if(a){a.destroy()}},setContainer:function(a){this.callSuper(arguments);a.innerElement.addCls(this.layoutClass);a.onInitialized("onContainerInitialized",this)},onContainerInitialized:function(){var a=this.container,b=a.getInnerAt(0),c=a.getActiveItem();if(c){c.show();if(b&&b!==c){b.hide()}}a.on("activeitemchange","onContainerActiveItemChange",this)},onContainerActiveItemChange:function(a){this.relayEvent(arguments,"doActiveItemChange")},onItemInnerStateChange:function(c,b,d){this.callSuper(arguments);var a=this.container,e=a.getActiveItem();c.toggleCls(this.itemClass,b);c.setLayoutSizeFlags(b?a.LAYOUT_BOTH:0);if(b){if(e!==a.innerIndexOf(c)&&e!==c&&c!==a.pendingActiveItem){c.hide()}}else{if(!d&&!c.isDestroyed&&c.isDestroying!==true){c.show()}}},doActiveItemChange:function(b,c,a){if(a){a.hide()}if(c){c.show()}},destroy:function(){this.callParent(arguments);Ext.destroy(this.getAnimation())}});Ext.define("Ext.util.Filter",{isFilter:true,config:{property:null,value:null,filterFn:Ext.emptyFn,anyMatch:false,exactMatch:false,caseSensitive:false,root:null,id:undefined,scope:null},applyId:function(a){if(!a){if(this.getProperty()){a=this.getProperty()+"-"+String(this.getValue())}if(!a){a=Ext.id(null,"ext-filter-")}}return a},constructor:function(a){this.initConfig(a)},applyFilterFn:function(b){if(b===Ext.emptyFn){b=this.getInitialConfig("filter");if(b){return b}var a=this.getValue();if(!this.getProperty()&&!a&&a!==0){return Ext.emptyFn}else{return this.createFilterFn()}}return b},createFilterFn:function(){var a=this,b=a.createValueMatcher();return function(d){var c=a.getRoot(),e=a.getProperty();if(c){d=d[c]}return b.test(d[e])}},createValueMatcher:function(){var d=this,e=d.getValue(),f=d.getAnyMatch(),c=d.getExactMatch(),a=d.getCaseSensitive(),b=Ext.String.escapeRegex;if(e===null||e===undefined||!e.exec){e=String(e);if(f===true){e=b(e)}else{e="^"+b(e);if(c===true){e+="$"}}e=new RegExp(e,a?"":"i")}return e}});Ext.define("Ext.util.AbstractMixedCollection",{mixins:{observable:Ext.mixin.Observable},constructor:function(b,a){var c=this;c.items=[];c.map={};c.keys=[];c.length=0;c.allowFunctions=b===true;if(a){c.getKey=a}c.mixins.observable.constructor.call(c)},allowFunctions:false,add:function(b,e){var d=this,f=e,c=b,a;if(arguments.length==1){f=c;c=d.getKey(f)}if(typeof c!="undefined"&&c!==null){a=d.map[c];if(typeof a!="undefined"){return d.replace(c,f)}d.map[c]=f}d.length++;d.items.push(f);d.keys.push(c);d.fireEvent("add",d.length-1,f,c);return f},getKey:function(a){return a.id},replace:function(c,e){var d=this,a,b;if(arguments.length==1){e=arguments[0];c=d.getKey(e)}a=d.map[c];if(typeof c=="undefined"||c===null||typeof a=="undefined"){return d.add(c,e)}b=d.indexOfKey(c);d.items[b]=e;d.map[c]=e;d.fireEvent("replace",c,a,e);return e},addAll:function(f){var e=this,d=0,b,a,c;if(arguments.length>1||Ext.isArray(f)){b=arguments.length>1?arguments:f;for(a=b.length;d=d.length){return d.add(c,f)}d.length++;Ext.Array.splice(d.items,a,0,f);if(typeof c!="undefined"&&c!==null){d.map[c]=f}Ext.Array.splice(d.keys,a,0,c);d.fireEvent("add",a,f,c);return f},remove:function(a){return this.removeAt(this.indexOf(a))},removeAll:function(a){Ext.each(a||[],function(b){this.remove(b)},this);return this},removeAt:function(a){var c=this,d,b;if(a=0){c.length--;d=c.items[a];Ext.Array.erase(c.items,a,1);b=c.keys[a];if(typeof b!="undefined"){delete c.map[b]}Ext.Array.erase(c.keys,a,1);c.fireEvent("remove",d,b);return d}return false},removeAtKey:function(a){return this.removeAt(this.indexOfKey(a))},getCount:function(){return this.length},indexOf:function(a){return Ext.Array.indexOf(this.items,a)},indexOfKey:function(a){return Ext.Array.indexOf(this.keys,a)},get:function(b){var d=this,a=d.map[b],c=a!==undefined?a:(typeof b=="number")?d.items[b]:undefined;return typeof c!="function"||d.allowFunctions?c:null},getAt:function(a){return this.items[a]},getByKey:function(a){return this.map[a]},contains:function(a){return Ext.Array.contains(this.items,a)},containsKey:function(a){return typeof this.map[a]!="undefined"},clear:function(){var a=this;a.length=0;a.items=[];a.keys=[];a.map={};a.fireEvent("clear")},first:function(){return this.items[0]},last:function(){return this.items[this.length-1]},sum:function(g,b,h,a){var c=this.extractValues(g,b),f=c.length,e=0,d;h=h||0;a=(a||a===0)?a:f-1;for(d=h;d<=a;d++){e+=c[d]}return e},collect:function(j,e,g){var k=this.extractValues(j,e),a=k.length,b={},c=[],h,f,d;for(d=0;d=a;d--){b[b.length]=c[d]}}return b},filter:function(d,c,f,a){var b=[],e;if(Ext.isString(d)){b.push(Ext.create("Ext.util.Filter",{property:d,value:c,anyMatch:f,caseSensitive:a}))}else{if(Ext.isArray(d)||d instanceof Ext.util.Filter){b=b.concat(d)}}e=function(g){var m=true,n=b.length,h;for(h=0;ha?1:(de?1:(f0?1:-1,g=this.getMinMomentumValue(),d=this.getMaxMomentumValue(),c=(f==1)?d:g,h=this.lastValue,i,b;if(e===0){return this.getStartValue()}if(!this.isOutOfBound){i=a.getValue();b=a.getVelocity();if(Math.abs(b)=g&&i<=d){return i}this.isOutOfBound=true;j.setStartTime(Ext.Date.now()).setStartVelocity(b).setStartValue(c)}i=j.getValue();if(!this.isEnded){if(!this.isBouncingBack){if(h!==null){if((f==1&&ih)){this.isBouncingBack=true}}}else{if(Math.round(i)==c){this.isEnded=true}}}this.lastValue=i;return i}});Ext.define("Ext.fx.easing.EaseOut",{extend:Ext.fx.easing.Linear,alias:"easing.ease-out",config:{exponent:4,duration:1500},getValue:function(){var f=Ext.Date.now()-this.getStartTime(),d=this.getDuration(),b=this.getStartValue(),h=this.getEndValue(),a=this.distance,c=f/d,g=1-c,e=1-Math.pow(g,this.getExponent()),i=b+(e*a);if(f>=d){this.isEnded=true;return h}return i}});Ext.define("Ext.scroll.Scroller",{extend:Ext.Evented,config:{element:null,direction:"auto",fps:"auto",disabled:null,directionLock:false,momentumEasing:{momentum:{acceleration:30,friction:0.5},bounce:{acceleration:30,springTension:0.3},minVelocity:1},bounceEasing:{duration:400},outOfBoundRestrictFactor:0.5,startMomentumResetTime:300,maxAbsoluteVelocity:6,containerSize:"auto",size:"auto",autoRefresh:true,initialOffset:{x:0,y:0},slotSnapSize:{x:0,y:0},slotSnapOffset:{x:0,y:0},slotSnapEasing:{duration:150},translatable:{translationMethod:"auto",useWrapper:false}},cls:Ext.baseCSSPrefix+"scroll-scroller",containerCls:Ext.baseCSSPrefix+"scroll-container",dragStartTime:0,dragEndTime:0,isDragging:false,isAnimating:false,constructor:function(a){var b=a&&a.element;this.listeners={scope:this,touchstart:"onTouchStart",touchend:"onTouchEnd",dragstart:"onDragStart",drag:"onDrag",dragend:"onDragEnd"};this.minPosition={x:0,y:0};this.startPosition={x:0,y:0};this.position={x:0,y:0};this.velocity={x:0,y:0};this.isAxisEnabledFlags={x:false,y:false};this.flickStartPosition={x:0,y:0};this.flickStartTime={x:0,y:0};this.lastDragPosition={x:0,y:0};this.dragDirection={x:0,y:0};this.initialConfig=a;if(b){this.setElement(b)}return this},applyElement:function(a){if(!a){return}return Ext.get(a)},updateElement:function(a){this.initialize();if(!this.FixedHBoxStretching){a.addCls(this.cls)}if(!this.getDisabled()){this.attachListeneners()}this.onConfigUpdate(["containerSize","size"],"refreshMaxPosition");this.on("maxpositionchange","snapToBoundary");this.on("minpositionchange","snapToBoundary");return this},applyTranslatable:function(b,a){return Ext.factory(b,Ext.util.Translatable,a)},updateTranslatable:function(a){a.setConfig({element:this.getElement(),listeners:{animationframe:"onAnimationFrame",animationend:"onAnimationEnd",scope:this}})},updateFps:function(a){if(a!=="auto"){this.getTranslatable().setFps(a)}},attachListeneners:function(){this.getContainer().on(this.listeners)},detachListeners:function(){this.getContainer().un(this.listeners)},updateDisabled:function(a){if(a){this.detachListeners()}else{this.attachListeneners()}},updateInitialOffset:function(c){if(typeof c=="number"){c={x:c,y:c}}var b=this.position,a,d;b.x=a=c.x;b.y=d=c.y;this.getTranslatable().translate(-a,-d)},applyDirection:function(a){var e=this.getMinPosition(),d=this.getMaxPosition(),c,b;this.givenDirection=a;if(a==="auto"){c=d.x>e.x;b=d.y>e.y;if(c&&b){a="both"}else{if(c){a="horizontal"}else{a="vertical"}}}return a},updateDirection:function(f,e){var b=this.isAxisEnabledFlags,d=this.cls+"-vertical",a=this.cls+"-horizontal",c=this.getElement();if(e==="both"||e==="horizontal"){c.removeCls(a)}if(e==="both"||e==="vertical"){c.removeCls(d)}b.x=b.y=false;if(f==="both"||f==="horizontal"){b.x=true;c.addCls(a)}if(f==="both"||f==="vertical"){b.y=true;c.addCls(d)}},isAxisEnabled:function(a){this.getDirection();return this.isAxisEnabledFlags[a]},applyMomentumEasing:function(b){var a=Ext.fx.easing.BoundMomentum;return{x:Ext.factory(b,a),y:Ext.factory(b,a)}},applyBounceEasing:function(b){var a=Ext.fx.easing.EaseOut;return{x:Ext.factory(b,a),y:Ext.factory(b,a)}},updateBounceEasing:function(a){this.getTranslatable().setEasingX(a.x).setEasingY(a.y)},applySlotSnapEasing:function(b){var a=Ext.fx.easing.EaseOut;return{x:Ext.factory(b,a),y:Ext.factory(b,a)}},getMinPosition:function(){var a=this.minPosition;if(!a){this.minPosition=a={x:0,y:0};this.fireEvent("minpositionchange",this,a)}return a},getMaxPosition:function(){var c=this.maxPosition,a,b;if(!c){a=this.getSize();b=this.getContainerSize();this.maxPosition=c={x:Math.max(0,a.x-b.x),y:Math.max(0,a.y-b.y)};this.fireEvent("maxpositionchange",this,c)}return c},refreshMaxPosition:function(){this.maxPosition=null;this.getMaxPosition()},applyContainerSize:function(b){var c=this.getContainer().dom,a,d;if(!c){return}this.givenContainerSize=b;if(b==="auto"){a=c.offsetWidth;d=c.offsetHeight}else{a=b.x;d=b.y}return{x:a,y:d}},applySize:function(b){var c=this.getElement().dom,a,d;if(!c){return}this.givenSize=b;if(b==="auto"){a=c.offsetWidth;d=c.offsetHeight}else{if(typeof b=="number"){a=b;d=b}else{a=b.x;d=b.y}}return{x:a,y:d}},updateAutoRefresh:function(a){this.getElement().toggleListener(a,"resize","onElementResize",this);this.getContainer().toggleListener(a,"resize","onContainerResize",this)},applySlotSnapSize:function(a){if(typeof a=="number"){return{x:a,y:a}}return a},applySlotSnapOffset:function(a){if(typeof a=="number"){return{x:a,y:a}}return a},getContainer:function(){var a=this.container,b;if(!a){b=this.getElement().getParent();this.container=a=this.FixedHBoxStretching?b.getParent():b;a.addCls(this.containerCls)}return a},refresh:function(){this.stopAnimation();this.getTranslatable().refresh();this.setSize(this.givenSize);this.setContainerSize(this.givenContainerSize);this.setDirection(this.givenDirection);this.fireEvent("refresh",this);return this},onElementResize:function(a,b){this.setSize({x:b.width,y:b.height});this.refresh()},onContainerResize:function(a,b){this.setContainerSize({x:b.width,y:b.height});this.refresh()},scrollTo:function(c,h,g){if(this.isDestroyed){return this}var b=this.getTranslatable(),a=this.position,d=false,f,e;if(this.isAxisEnabled("x")){if(isNaN(c)||typeof c!="number"){c=a.x}else{if(a.x!==c){a.x=c;d=true}}f=-c}if(this.isAxisEnabled("y")){if(isNaN(h)||typeof h!="number"){h=a.y}else{if(a.y!==h){a.y=h;d=true}}e=-h}if(d){if(g!==undefined&&g!==false){b.translateAnimated(f,e,g)}else{this.fireEvent("scroll",this,a.x,a.y);b.translate(f,e)}}return this},scrollToTop:function(b){var a=this.getInitialOffset();return this.scrollTo(a.x,a.y,b)},scrollToEnd:function(c){var b=this.getSize(),a=this.getContainerSize();return this.scrollTo(b.x-a.x,b.y-a.y,c)},scrollBy:function(b,d,c){var a=this.position;b=(typeof b=="number")?b+a.x:null;d=(typeof d=="number")?d+a.y:null;return this.scrollTo(b,d,c)},onTouchStart:function(){this.isTouching=true;this.stopAnimation()},onTouchEnd:function(){var a=this.position;this.isTouching=false;if(!this.isDragging&&this.snapToSlot()){this.fireEvent("scrollstart",this,a.x,a.y)}},onDragStart:function(l){var o=this.getDirection(),g=l.absDeltaX,f=l.absDeltaY,j=this.getDirectionLock(),i=this.startPosition,d=this.flickStartPosition,k=this.flickStartTime,h=this.lastDragPosition,c=this.position,b=this.dragDirection,n=c.x,m=c.y,a=Ext.Date.now();this.isDragging=true;if(j&&o!=="both"){if((o==="horizontal"&&g>f)||(o==="vertical"&&f>g)){l.stopPropagation()}else{this.isDragging=false;return}}h.x=n;h.y=m;d.x=n;d.y=m;i.x=n;i.y=m;k.x=a;k.y=a;b.x=0;b.y=0;this.dragStartTime=a;this.isDragging=true;this.fireEvent("scrollstart",this,n,m)},onAxisDrag:function(i,q){if(!this.isAxisEnabled(i)){return}var h=this.flickStartPosition,l=this.flickStartTime,j=this.lastDragPosition,e=this.dragDirection,g=this.position[i],k=this.getMinPosition()[i],o=this.getMaxPosition()[i],d=this.startPosition[i],p=j[i],n=d-q,c=e[i],m=this.getOutOfBoundRestrictFactor(),f=this.getStartMomentumResetTime(),b=Ext.Date.now(),a;if(no){a=n-o;n=o+a*m}}if(n>p){e[i]=1}else{if(nf){h[i]=g;l[i]=b}j[i]=n},onDrag:function(b){if(!this.isDragging){return}var a=this.lastDragPosition;this.onAxisDrag("x",b.deltaX);this.onAxisDrag("y",b.deltaY);this.scrollTo(a.x,a.y)},onDragEnd:function(c){var b,a;if(!this.isDragging){return}this.dragEndTime=Ext.Date.now();this.onDrag(c);this.isDragging=false;b=this.getAnimationEasing("x",c);a=this.getAnimationEasing("y",c);if(b||a){this.getTranslatable().animate(b,a)}else{this.onScrollEnd()}},getAnimationEasing:function(g,j){if(!this.isAxisEnabled(g)){return null}var f=this.position[g],c=this.getMinPosition()[g],i=this.getMaxPosition()[g],a=this.getMaxAbsoluteVelocity(),d=null,b=this.dragEndTime,h=j.flick.velocity[g],k;if(fi){d=i}}if(d!==null){k=this.getBounceEasing()[g];k.setConfig({startTime:b,startValue:-f,endValue:-d});return k}if(h===0){return null}if(h<-a){h=-a}else{if(h>a){h=a}}if(Ext.browser.is.IE){h*=2}k=this.getMomentumEasing()[g];k.setConfig({startTime:b,startValue:-f,startVelocity:h*1.5,minMomentumValue:-i,maxMomentumValue:0});return k},onAnimationFrame:function(c,b,d){var a=this.position;a.x=-b;a.y=-d;this.fireEvent("scroll",this,a.x,a.y)},onAnimationEnd:function(){this.snapToBoundary();this.onScrollEnd()},stopAnimation:function(){this.getTranslatable().stopAnimation()},onScrollEnd:function(){var a=this.position;if(this.isTouching||!this.snapToSlot()){this.fireEvent("scrollend",this,a.x,a.y)}},snapToSlot:function(){var b=this.getSnapPosition("x"),a=this.getSnapPosition("y"),c=this.getSlotSnapEasing();if(b!==null||a!==null){this.scrollTo(b,a,{easingX:c.x,easingY:c.y});return true}return false},getSnapPosition:function(c){var g=this.getSlotSnapSize()[c],d=null,a,f,e,b;if(g!==0&&this.isAxisEnabled(c)){a=this.position[c];f=this.getSlotSnapOffset()[c];e=this.getMaxPosition()[c];b=Math.floor((a-f)%g);if(b!==0){if(a!==e){if(Math.abs(b)>g/2){d=Math.min(e,a+((b>0)?g-b:b-g))}else{d=a-b}}else{d=a-b}}}return d},snapToBoundary:function(){var g=this.position,c=this.getMinPosition(),f=this.getMaxPosition(),e=c.x,d=c.y,b=f.x,a=f.y,i=Math.round(g.x),h=Math.round(g.y);if(ib){i=b}}if(ha){h=a}}this.scrollTo(i,h)},destroy:function(){var c=this.getElement(),b=this.sizeMonitors,a;if(b){b.element.destroy();b.container.destroy()}if(c&&!c.isDestroyed){c.removeCls(this.cls);a=this.getContainer();if(a&&!a.isDestroyed){a.removeCls(this.containerCls)}}Ext.destroy(this.getTranslatable());this.callParent(arguments)}},function(){});(function(){var c=0,e=["ms","moz","webkit","o"],b=e.length,a,d;for(a=0;a=500){this.run()}},run:function(){if(!this.isRunning){return}var b=this.runningQueue,c,d;this.lastRunTime=Date.now();this.frameStartTime=Ext.performance.now();b.push.apply(b,this.queue);for(c=0,d=b.length;c0){c=b.shift();this.invoke(c);this.processIdleQueue()}},processTaskQueue:function(){if(!this.hasOwnProperty("taskQueueTimer")){this.taskQueueTimer=setTimeout(this.processTaskQueueItem,15)}},processTaskQueueItem:function(){delete this.taskQueueTimer;var b=this.taskQueue,c;if(b.length>0){c=b.shift();this.invoke(c);this.processTaskQueue()}},showFps:function(){if(!Ext.trueRequestAnimationFrames){alert("This browser does not support requestAnimationFrame. The FPS listed will not be accurate")}Ext.onReady(function(){Ext.Viewport.add([{xtype:"component",bottom:50,left:0,width:50,height:20,html:"Average",style:"background-color: black; color: white; text-align: center; line-height: 20px; font-size: 8px;"},{id:"__averageFps",xtype:"component",bottom:0,left:0,width:50,height:50,html:"0",style:"background-color: red; color: white; text-align: center; line-height: 50px;"},{xtype:"component",bottom:50,left:50,width:50,height:20,html:"Min (Last 1k)",style:"background-color: black; color: white; text-align: center; line-height: 20px; font-size: 8px;"},{id:"__minFps",xtype:"component",bottom:0,left:50,width:50,height:50,html:"0",style:"background-color: orange; color: white; text-align: center; line-height: 50px;"},{xtype:"component",bottom:50,left:100,width:50,height:20,html:"Max (Last 1k)",style:"background-color: black; color: white; text-align: center; line-height: 20px; font-size: 8px;"},{id:"__maxFps",xtype:"component",bottom:0,left:100,width:50,height:50,html:"0",style:"background-color: yellow; color: black; text-align: center; line-height: 50px;"},{xtype:"component",bottom:50,left:150,width:50,height:20,html:"Current",style:"background-color: black; color: white; text-align: center; line-height: 20px; font-size: 8px;"},{id:"__currentFps",xtype:"component",bottom:0,left:150,width:50,height:50,html:"0",style:"background-color: green; color: white; text-align: center; line-height: 50px;"}]);Ext.AnimationQueue.resetFps()})},resetFps:function(){var d=Ext.getCmp("__currentFps"),c=Ext.getCmp("__averageFps"),i=Ext.getCmp("__minFps"),h=Ext.getCmp("__maxFps"),e=1000,b=0,g=0,f=0;Ext.AnimationQueue.onFpsChanged=function(j){g++;if(!(g%10)){e=1000;b=0}f+=j;e=Math.min(e,j);b=Math.max(b,j);d.setHtml(Math.round(j));c.setHtml(Math.round(f/g));i.setHtml(Math.round(e));h.setHtml(Math.round(b))}}},function(){})})(this);Ext.define("Ext.TaskQueue",{singleton:true,pending:false,mode:true,constructor:function(){this.readQueue=[];this.writeQueue=[];this.run=Ext.Function.bind(this.run,this);this.watch=Ext.Function.bind(this.watch,this);if(Ext.os.is.iOS){setInterval(this.watch,500)}},requestRead:function(c,b,a){this.request(true);this.readQueue.push(arguments)},requestWrite:function(c,b,a){this.request(false);this.writeQueue.push(arguments)},request:function(a){if(!this.pending){this.pendingTime=Date.now();this.pending=true;this.mode=a;if(a){setTimeout(this.run,1)}else{requestAnimationFrame(this.run)}}},watch:function(){if(this.pending&&Date.now()-this.pendingTime>=500){this.run()}},run:function(){this.pending=false;var j=this.readQueue,e=this.writeQueue,c=null,f;if(this.mode){f=j;if(e.length>0){c=false}}else{f=e;if(j.length>0){c=true}}var b=f.slice(),d,g,a,h,k;f.length=0;for(d=0,g=b.length;d2){h.apply(k,a[2])}else{h.call(k)}}b.length=0;if(c!==null){this.request(c)}}});Ext.define("Ext.scroll.indicator.Abstract",{extend:Ext.Component,config:{baseCls:"x-scroll-indicator",axis:"x",value:null,length:null,minLength:6,hidden:true,ui:"dark",autoHide:true},cachedConfig:{ratio:1,barCls:"x-scroll-bar",active:true},barElement:null,barLength:0,gapLength:0,getElementConfig:function(){return{reference:"barElement",children:[this.callParent()]}},applyRatio:function(a){if(isNaN(a)||a>1){a=1}return a},refresh:function(){var f=this.barElement,e=f.dom,c=this.getRatio(),b=this.getAxis(),a=(b==="x")?e.offsetWidth:e.offsetHeight,d=a*c;this.barLength=a;this.gapLength=a-d;this.setLength(d);this.updateValue(this.getValue())},updateBarCls:function(a){this.barElement.addCls(a)},updateAxis:function(a){this.element.addCls(this.getBaseCls(),null,a);this.barElement.addCls(this.getBarCls(),null,a)},updateValue:function(f){var b=this.barLength,c=this.gapLength,d=this.getLength(),e,g,a;if(f<=0){g=0;this.updateLength(this.applyLength(d+f*b))}else{if(f>=1){a=Math.round((f-1)*b);e=this.applyLength(d-a);a=d-e;this.updateLength(e);g=c+a}else{g=c*f}}this.setOffset(g)},updateActive:function(a){this.barElement[a?"addCls":"removeCls"]("active")},doSetHidden:function(b){var a=this;if(b){a.getAutoHide()&&a.setOffset(-10000)}else{delete a.lastLength;delete a.lastOffset;a.updateValue(a.getValue())}},applyLength:function(a){return Math.max(this.getMinLength(),a)},updateLength:function(a){a=Math.round(a);if(this.lastLength===a){return}this.lastLength=a;Ext.TaskQueue.requestWrite("doUpdateLength",this,[a])},doUpdateLength:function(c){if(!this.isDestroyed){var b=this.getAxis(),a=this.element;if(b==="x"){a.setWidth(c)}else{a.setHeight(c)}}},setOffset:function(a){a=Math.round(a);if(this.lastOffset===a||this.lastOffset===-10000){return}this.lastOffset=a;Ext.TaskQueue.requestWrite("doSetOffset",this,[a])},doSetOffset:function(c){if(!this.isDestroyed){var b=this.getAxis(),a=this.element;if(b==="x"){a.translate(c,0)}else{a.translate(0,c)}}}});Ext.define("Ext.scroll.indicator.CssTransform",{extend:Ext.scroll.indicator.Abstract,config:{cls:"csstransform"}});Ext.define("Ext.scroll.indicator.ScrollPosition",{extend:Ext.scroll.indicator.Abstract,config:{cls:"scrollposition"},getElementConfig:function(){var a=this.callParent(arguments);a.children.unshift({className:"x-scroll-bar-stretcher"});return a},updateValue:function(a){if(this.gapLength===0){if(a>=1){a--}this.setOffset(this.barLength*a)}else{this.setOffset(this.gapLength*a)}},doUpdateLength:function(){if(!this.isDestroyed){var a=this.barLength,b=this.element;this.callParent(arguments);if(this.getAxis()==="x"){b.setLeft(a)}else{b.setTop(a)}}},doSetOffset:function(d){if(!this.isDestroyed){var b=this.barLength,a=this.getMinLength(),c=this.barElement.dom;if(d!==-10000){d=Math.min(b-a,Math.max(d,a-this.getLength()));d=b-d}if(this.getAxis()==="x"){c.scrollLeft=d}else{c.scrollTop=d}}}});Ext.define("Ext.scroll.indicator.Rounded",{extend:Ext.scroll.indicator.Abstract,config:{cls:"rounded"},constructor:function(){this.callParent(arguments);this.transformPropertyName=Ext.browser.getVendorProperyName("transform")},getElementConfig:function(){var a=this.callParent();a.children[0].children=[{reference:"startElement"},{reference:"middleElement"},{reference:"endElement"}];return a},refresh:function(){var d=this.getAxis(),c=this.startElement.dom,a=this.endElement.dom,e=this.middleElement,b,f;if(d==="x"){b=c.offsetWidth;f=a.offsetWidth;e.setLeft(b)}else{b=c.offsetHeight;f=a.offsetHeight;e.setTop(b)}this.startElementLength=b;this.endElementLength=f;this.callParent()},doUpdateLength:function(c){if(!this.isDestroyed){var b=this.getAxis(),a=this.endElement,e=this.middleElement.dom.style,d=this.endElementLength,h=c-d,g=h-this.startElementLength,f=this.transformPropertyName;if(b==="x"){a.translate(h,0);e[f]="translate3d(0, 0, 0) scaleX("+g+")"}else{a.translate(0,h);e[f]="translate3d(0, 0, 0) scaleY("+g+")"}}}});Ext.define("Ext.scroll.Indicator",{alternateClassName:"Ext.util.Indicator",constructor:function(a){var b=Ext.scroll.indicator;switch(Ext.browser.getPreferredTranslationMethod(a)){case"scrollposition":return new b.ScrollPosition(a);case"csstransform":if(Ext.browser.is.AndroidStock4){return new b.CssTransform(a)}else{return new b.Rounded(a)}}}});Ext.define("Ext.scroll.View",{extend:Ext.Evented,alternateClassName:"Ext.util.ScrollView",config:{indicatorsUi:"dark",element:null,scroller:{},indicators:{x:{axis:"x"},y:{axis:"y"}},indicatorsHidingDelay:100,cls:Ext.baseCSSPrefix+"scroll-view"},processConfig:function(c){if(!c){return null}if(typeof c=="string"){c={direction:c}}c=Ext.merge({},c);var a=c.scroller,b;if(!a){c.scroller=a={}}for(b in c){if(c.hasOwnProperty(b)){if(!this.hasConfig(b)){a[b]=c[b];delete c[b]}}}return c},constructor:function(a){a=this.processConfig(a);this.useIndicators={x:true,y:true};this.doHideIndicators=Ext.Function.bind(this.doHideIndicators,this);this.initConfig(a)},setConfig:function(a){return this.callParent([this.processConfig(a)])},updateIndicatorsUi:function(a){var b=this.getIndicators();b.x.setUi(a);b.y.setUi(a)},applyScroller:function(a,b){return Ext.factory(a,Ext.scroll.Scroller,b)},applyIndicators:function(b,d){var a=Ext.scroll.Indicator,c=this.useIndicators;if(!b){b={}}if(!b.x){c.x=false;b.x={}}if(!b.y){c.y=false;b.y={}}return{x:Ext.factory(b.x,a,d&&d.x),y:Ext.factory(b.y,a,d&&d.y)}},updateIndicators:function(a){this.indicatorsGrid=Ext.Element.create({className:"x-scroll-bar-grid-wrapper",children:[{className:"x-scroll-bar-grid",children:[{children:[{},{children:[a.y.barElement]}]},{children:[{children:[a.x.barElement]},{}]}]}]})},updateScroller:function(a){a.on({scope:this,scrollstart:"onScrollStart",scroll:"onScroll",scrollend:"onScrollEnd",refresh:"refreshIndicators"})},isAxisEnabled:function(a){return this.getScroller().isAxisEnabled(a)&&this.useIndicators[a]},applyElement:function(a){if(a){return Ext.get(a)}},updateElement:function(c){var b=this.getScroller(),a;a=c.getFirstChild().getFirstChild();if(this.FixedHBoxStretching){a=a.getFirstChild()}c.addCls(this.getCls());c.insertFirst(this.indicatorsGrid);b.setElement(a);this.refreshIndicators();return this},showIndicators:function(){var a=this.getIndicators();if(this.hasOwnProperty("indicatorsHidingTimer")){clearTimeout(this.indicatorsHidingTimer);delete this.indicatorsHidingTimer}if(this.isAxisEnabled("x")){a.x.show()}if(this.isAxisEnabled("y")){a.y.show()}},hideIndicators:function(){var a=this.getIndicatorsHidingDelay();if(a>0){this.indicatorsHidingTimer=setTimeout(this.doHideIndicators,a)}else{this.doHideIndicators()}},doHideIndicators:function(){var a=this.getIndicators();if(this.isAxisEnabled("x")){a.x.hide()}if(this.isAxisEnabled("y")){a.y.hide()}},onScrollStart:function(){this.onScroll.apply(this,arguments);this.showIndicators()},onScrollEnd:function(){this.hideIndicators()},onScroll:function(b,a,c){this.setIndicatorValue("x",a);this.setIndicatorValue("y",c)},setIndicatorValue:function(b,f){if(!this.isAxisEnabled(b)){return this}var a=this.getScroller(),c=a.getMaxPosition()[b],e=a.getContainerSize()[b],d;if(c===0){d=f/e;if(f>=0){d+=1}}else{if(f>c){d=1+((f-c)/e)}else{if(f<0){d=f/e}else{d=f/c}}}this.getIndicators()[b].setValue(d)},refreshIndicator:function(d){if(!this.isAxisEnabled(d)){return this}var a=this.getScroller(),b=this.getIndicators()[d],e=a.getContainerSize()[d],f=a.getSize()[d],c=e/f;b.setRatio(c);b.refresh()},refresh:function(){return this.getScroller().refresh()},refreshIndicators:function(){var a=this.getIndicators();a.x.setActive(this.isAxisEnabled("x"));a.y.setActive(this.isAxisEnabled("y"));this.refreshIndicator("x");this.refreshIndicator("y")},destroy:function(){var a=this.getElement(),b=this.getIndicators();Ext.destroy(this.getScroller(),this.indicatorsGrid);if(this.hasOwnProperty("indicatorsHidingTimer")){clearTimeout(this.indicatorsHidingTimer);delete this.indicatorsHidingTimer}if(a&&!a.isDestroyed){a.removeCls(this.getCls())}b.x.destroy();b.y.destroy();delete this.indicatorsGrid;this.callParent(arguments)}});Ext.define("Ext.behavior.Scrollable",{extend:Ext.behavior.Behavior,constructor:function(){this.listeners={painted:"onComponentPainted",scope:this};this.callParent(arguments)},onComponentPainted:function(){this.scrollView.refresh()},setConfig:function(f){var c=this.scrollView,e=this.component,b,d,a,g;if(f){if(!c){this.scrollView=c=new Ext.scroll.View(f);c.on("destroy","onScrollViewDestroy",this);e.setUseBodyElement(true);this.scrollerElement=b=e.innerElement;if(!Ext.feature.has.ProperHBoxStretching){a=c.getScroller();g=(Ext.isObject(f)?f.direction:f)||"auto";if(g!=="vertical"){d=b.wrap();d.addCls(Ext.baseCSSPrefix+"translatable-hboxfix");if(g=="horizontal"){d.setStyle({height:"100%"})}this.scrollContainer=d.wrap();c.FixedHBoxStretching=a.FixedHBoxStretching=true}else{this.scrollContainer=b.wrap()}}else{this.scrollContainer=b.wrap()}c.setElement(e.bodyElement);if(e.isPainted()){this.onComponentPainted()}e.on(this.listeners)}else{if(Ext.isString(f)||Ext.isObject(f)){c.setConfig(f)}}}else{if(c){c.destroy()}}return this},getScrollView:function(){return this.scrollView},onScrollViewDestroy:function(){var b=this.component,a=this.scrollerElement;if(!a.isDestroyed){this.scrollerElement.unwrap()}this.scrollContainer.destroy();if(!b.isDestroyed){b.un(this.listeners)}delete this.scrollerElement;delete this.scrollView;delete this.scrollContainer},onComponentDestroy:function(){var a=this.scrollView;if(a){a.destroy()}}});Ext.define("Ext.util.InputBlocker",{singleton:true,blockInputs:function(){if(Ext.browser.is.ie){Ext.select(".x-field-text .x-field-input:not(.x-item-disabled) .x-input-el, .x-field-textarea .x-field-input:not(.x-item-disabled) .x-input-el, .x-field-search .x-field-input:not(.x-item-disabled) .x-input-el").each(function(a){if(a.dom.offsetWidth>0){a.dom.setAttribute("disabled",true);a.dom.setAttribute("overlayfix",true)}})}},unblockInputs:function(){if(Ext.browser.is.ie){Ext.select("[overlayfix]").each(function(a){a.dom.removeAttribute("disabled");a.dom.removeAttribute("overlayfix")})}}});Ext.define("Ext.Mask",{extend:Ext.Component,xtype:"mask",config:{baseCls:Ext.baseCSSPrefix+"mask",transparent:false,top:0,left:0,right:0,bottom:0},initialize:function(){this.callSuper();this.element.on("*","onEvent",this);this.on({hide:"onHide"})},onHide:function(){Ext.util.InputBlocker.unblockInputs();if(Ext.browser.is.AndroidStock4&&Ext.os.version.getMinor()===0){var a=this.element.getFirstChild();if(a){a.redraw()}}},onEvent:function(b){var a=arguments[arguments.length-1];if(a.info.eventName==="tap"){this.fireEvent("tap",this,b);return false}if(b&&b.stopEvent){b.stopEvent()}return false},updateTransparent:function(a){this[a?"addCls":"removeCls"](this.getBaseCls()+"-transparent")}});Ext.define("Ext.Container",{extend:Ext.Component,alternateClassName:"Ext.lib.Container",xtype:"container",eventedConfig:{activeItem:0,scrollable:null},config:{layout:null,control:{},defaults:null,items:null,autoDestroy:true,defaultType:null,useBodyElement:null,masked:null,modal:null,hideOnMaskTap:null},isContainer:true,constructor:function(a){var b=this;b._items=b.items=new Ext.ItemCollection();b.innerItems=[];b.onItemAdd=b.onFirstItemAdd;b.callParent(arguments)},getElementConfig:function(){return{reference:"element",classList:["x-container","x-unsized"],children:[{reference:"innerElement",className:"x-inner"}]}},applyMasked:function(b){var a=true,c;if(b===false){b=true;a=false}c=Ext.factory(b,Ext.Mask,this.getMasked());if(c){this.add(c);c.setHidden(!a)}return c},mask:function(a){this.setMasked(a||true)},unmask:function(){this.setMasked(false)},setParent:function(a){this.callSuper(arguments);if(a){var b=this.getModal();if(b){a.insertBefore(b,this);b.setZIndex(this.getZIndex()-1)}}},applyModal:function(c,b){var a=true;if(c===false){c=true;a=false}b=Ext.factory(c,Ext.Mask,b);if(b){b.setVisibility(a)}return b},updateModal:function(b){var a=this.getParent();if(a){if(b){a.insertBefore(b,this);b.setZIndex(this.getZIndex()-1)}else{a.remove(b)}}},updateHideOnMaskTap:function(b){var a=this.getModal();if(a){a[b?"on":"un"].call(a,"tap","hide",this)}},updateZIndex:function(b){var a=this.getModal();this.callParent(arguments);if(a){a.setZIndex(b-1)}},updateBaseCls:function(a,b){var c=this,d=c.getUi();if(b){this.element.removeCls(b);this.innerElement.removeCls(a,null,"inner");if(d){this.element.removeCls(this.currentUi)}}if(a){this.element.addCls(a);this.innerElement.addCls(a,null,"inner");if(d){this.element.addCls(a,null,d);this.currentUi=a+"-"+d}}},updateUseBodyElement:function(a){if(a){this.link("bodyElement",this.innerElement.wrap({cls:"x-body"}))}},applyItems:function(a,d){if(a){var b=this;b.getDefaultType();b.getDefaults();if(b.initialized&&d.length>0){b.removeAll()}b.add(a);if(b.initialized){var c=b.initialConfig.activeItem||b.config.activeItem||0;b.setActiveItem(c)}}},applyControl:function(c){var a,b,e,d;for(a in c){d=c[a];for(b in d){e=d[b];if(Ext.isObject(e)){e.delegate=a}}d.delegate=a;this.addListener(d)}return c},onFirstItemAdd:function(){delete this.onItemAdd;if(this.innerHtmlElement&&!this.getHtml()){this.innerHtmlElement.destroy();delete this.innerHtmlElement}this.on("innerstatechange","onItemInnerStateChange",this,{delegate:"> component"});return this.onItemAdd.apply(this,arguments)},getLayout:function(){var a=this.layout;if(!a){a=this.link("_layout",this.link("layout",Ext.factory(this._layout||"default",Ext.layout.Default,null,"layout")));a.setContainer(this)}return a},updateDefaultType:function(a){this.defaultItemClass=Ext.ClassManager.getByAlias("widget."+a)},applyDefaults:function(a){if(a){this.factoryItem=this.factoryItemWithDefaults;return a}},factoryItem:function(a){return Ext.factory(a,this.defaultItemClass)},factoryItemWithDefaults:function(c){var b=this,d=b.getDefaults(),a;if(!d){return Ext.factory(c,b.defaultItemClass)}if(c.isComponent){a=c;if(d&&c.isInnerItem()&&!b.has(a)){a.setConfig(d,true)}}else{if(d&&!c.ignoreDefaults){if(!(c.hasOwnProperty("left")&&c.hasOwnProperty("right")&&c.hasOwnProperty("top")&&c.hasOwnProperty("bottom")&&c.hasOwnProperty("docked")&&c.hasOwnProperty("centered"))){c=Ext.mergeIf({},c,d)}}a=Ext.factory(c,b.defaultItemClass)}return a},add:function(a){var e=this,b,d,c,f;if(Ext.isArray(a)){for(b=0,d=a.length;b0&&c.isInnerItem()){f=c}}}else{c=e.factoryItem(a);this.doAdd(c);if(!f&&!this.getActiveItem()&&this.innerItems.length>0&&c.isInnerItem()){f=c}}if(f){this.setActiveItem(f)}return c},doAdd:function(d){var c=this,a=c.getItems(),b;if(!a.has(d)){b=a.length;a.add(d);if(d.isInnerItem()){c.insertInner(d)}d.setParent(c);c.onItemAdd(d,b)}},remove:function(d,b){var c=this,a=c.indexOf(d),e=c.getInnerItems();if(b===undefined){b=c.getAutoDestroy()}if(a!==-1){if(!c.removingAll&&e.length>1&&d===c.getActiveItem()){c.on({activeitemchange:"doRemove",scope:c,single:true,order:"after",args:[d,a,b]});c.doResetActiveItem(e.indexOf(d))}else{c.doRemove(d,a,b);if(e.length===0){c.setActiveItem(null)}}}return c},doResetActiveItem:function(a){if(a===0){this.setActiveItem(1)}else{this.setActiveItem(0)}},doRemove:function(d,a,b){var c=this;c.items.remove(d);if(d.isInnerItem()){c.removeInner(d)}c.onItemRemove(d,a,b);d.setParent(null);if(b){d.destroy()}},removeAll:function(c,f){var a=this.items,e=a.length,b=0,d;if(typeof c!="boolean"){c=this.getAutoDestroy()}f=Boolean(f);this.removingAll=true;for(;b=0;b--){c.insert(a,d[b])}return c}d=this.factoryItem(d);this.doInsert(a,d);return d},doInsert:function(d,f){var e=this,b=e.items,c=b.length,a,g;g=f.isInnerItem();if(d>c){d=c}if(b[d-1]===f){return e}a=e.indexOf(f);if(a!==-1){if(a "+a)[0]||null},down:function(a){return this.query(a)[0]||null},destroy:function(){var b=this,a=b.getModal();if(a){a.destroy()}b.removeAll(true,true);b.unlink("_scrollable");Ext.destroy(b.items);b.callSuper()}},function(){this.addMember("defaultItemClass",this)});Ext.define("Ext.util.Point",{radianToDegreeConstant:180/Math.PI,statics:{fromEvent:function(b){var a=b.changedTouches,c=(a&&a.length>0)?a[0]:b;return this.fromTouch(c)},fromTouch:function(a){return new this(a.pageX,a.pageY)},from:function(a){if(!a){return new this(0,0)}if(!(a instanceof this)){return new this(a.x,a.y)}return a}},constructor:function(a,b){if(typeof a=="undefined"){a=0}if(typeof b=="undefined"){b=0}this.x=a;this.y=b;return this},clone:function(){return new this.self(this.x,this.y)},copy:function(){return this.clone.apply(this,arguments)},copyFrom:function(a){this.x=a.x;this.y=a.y;return this},toString:function(){return"Point["+this.x+","+this.y+"]"},equals:function(a){return(this.x===a.x&&this.y===a.y)},isCloseTo:function(c,b){if(typeof b=="number"){b={x:b};b.y=b.x}var a=c.x,f=c.y,e=b.x,d=b.y;return(this.x<=a+e&&this.x>=a-e&&this.y<=f+d&&this.y>=f-d)},isWithin:function(){return this.isCloseTo.apply(this,arguments)},translate:function(a,b){this.x+=a;this.y+=b;return this},roundedEquals:function(a){if(typeof a!="object"){a={x:0,y:0}}return(Math.round(this.x)===Math.round(a.x)&&Math.round(this.y)===Math.round(a.y))},getDistanceTo:function(b){if(typeof b!="object"){b={x:0,y:0}}var c=this.x-b.x,a=this.y-b.y;return Math.sqrt(c*c+a*a)},getAngleTo:function(b){if(typeof b!="object"){b={x:0,y:0}}var c=this.x-b.x,a=this.y-b.y;return Math.atan2(a,c)*this.radianToDegreeConstant}});Ext.define("Ext.util.LineSegment",{constructor:function(b,a){var c=Ext.util.Point;this.point1=c.from(b);this.point2=c.from(a)},intersects:function(l){var o=this.point1,m=this.point2,i=l.point1,f=l.point2,c=o.x,b=m.x,a=i.x,q=f.x,p=o.y,n=m.y,k=i.y,h=f.y,g=(c-b)*(k-h)-(p-n)*(a-q),j,e;if(g==0){return null}j=((a-q)*(c*n-p*b)-(c-b)*(a*h-k*q))/g;e=((k-h)*(c*n-p*b)-(p-n)*(a*h-k*q))/g;if(jMath.max(c,b)||jMath.max(a,q)||eMath.max(p,n)||eMath.max(k,h)){return null}return new Ext.util.Point(j,e)},getLength:function(){return Math.abs(this.point1.getDistanceTo(this.point2))},getAngleToX:function(){var d=this.point1,c=this.point2,a=c.y-d.y,b=c.x-d.x;return Math.atan2(a,b)},getInBetweenPoint:function(e){var b=this.point1,c=this.getAngleToX(),a=b.x+Math.cos(c)*e,d=b.y+Math.sin(c)*e;return new Ext.util.Point(a,d)},toString:function(){return this.point1.toString()+" "+this.point2.toString()}});Ext.define("Ext.Panel",{extend:Ext.Container,alternateClassName:"Ext.lib.Panel",xtype:"panel",isPanel:true,config:{baseCls:Ext.baseCSSPrefix+"panel",bodyPadding:null,bodyMargin:null,bodyBorder:null},getElementConfig:function(){return{reference:"element",classList:["x-container","x-unsized"],children:[{reference:"innerElement",className:"x-inner"},{reference:"tipElement",className:"x-anchor",hidden:true}]}},applyBodyPadding:function(a){if(a===true){a=5}if(a){a=Ext.dom.Element.unitizeBox(a)}return a},updateBodyPadding:function(a){this.element.setStyle("padding",a)},applyBodyMargin:function(a){if(a===true){a=5}if(a){a=Ext.dom.Element.unitizeBox(a)}return a},updateBodyMargin:function(a){this.element.setStyle("margin",a)},applyBodyBorder:function(a){if(a===true){a=1}if(a){a=Ext.dom.Element.unitizeBox(a)}return a},updateBodyBorder:function(a){this.element.setStyle("border-width",a)},alignTo:function(n,i){var s=this.getAlignmentInfo(n,i);if(s.isAligned){return}var y=this.tipElement;y.hide();if(this.currentTipPosition){y.removeCls("x-anchor-"+this.currentTipPosition)}this.callParent(arguments);var f=Ext.util.LineSegment,d=n.isComponent?n.renderElement:n,a=this.renderElement,o=d.getPageBox(),l=a.getPageBox(),b=l.left,v=l.top,E=l.right,h=l.bottom,k=b+(l.width/2),j=v+(l.height/2),p={x:b,y:v},m={x:E,y:v},D={x:b,y:h},F={x:E,y:h},A={x:k,y:j},u=o.left+(o.width/2),r=o.top+(o.height/2),x={x:u,y:r},c=new f(A,x),g=0,C=0,e,B,t,q,z,w;y.setVisibility(false);y.show();e=y.getSize();B=e.width;t=e.height;if(c.intersects(new f(p,m))){z=Math.min(Math.max(u,b+B),E-(B));w=v;C=t+10;q="top"}else{if(c.intersects(new f(p,D))){z=b;w=Math.min(Math.max(r+(B/2),B*1.6),h-(B/2.2));g=t+10;q="left"}else{if(c.intersects(new f(D,F))){z=Math.min(Math.max(u,b+B),E-B);w=h;C=-t-10;q="bottom"}else{if(c.intersects(new f(m,F))){z=E;w=Math.max(Math.min(r-t,h-B*1.3),B/2);g=-t-10;q="right"}}}}if(z||w){this.currentTipPosition=q;y.addCls("x-anchor-"+q);y.setLeft(z-b);y.setTop(w-v);y.setVisibility(true);this.setLeft(this.getLeft()+g);this.setTop(this.getTop()+C)}}});Ext.define("Ext.Button",{extend:Ext.Component,xtype:"button",cachedConfig:{pressedCls:Ext.baseCSSPrefix+"button-pressing",badgeCls:Ext.baseCSSPrefix+"badge",hasBadgeCls:Ext.baseCSSPrefix+"hasbadge",labelCls:Ext.baseCSSPrefix+"button-label",iconCls:null},config:{badgeText:null,text:null,icon:false,iconAlign:"left",pressedDelay:0,handler:null,scope:null,autoEvent:null,ui:"normal",baseCls:Ext.baseCSSPrefix+"button"},template:[{tag:"span",reference:"badgeElement",hidden:true},{tag:"span",className:Ext.baseCSSPrefix+"button-icon",reference:"iconElement"},{tag:"span",reference:"textElement",hidden:true}],initialize:function(){this.callParent();this.element.on({scope:this,tap:"onTap",touchstart:"onPress",touchend:"onRelease"})},updateBadgeText:function(c){var a=this.element,b=this.badgeElement;if(c){b.show();b.setText(c)}else{b.hide()}a[(c)?"addCls":"removeCls"](this.getHasBadgeCls())},updateText:function(b){var a=this.textElement;if(a){if(b){a.show();a.setHtml(b)}else{a.hide()}this.refreshIconAlign()}},updateHtml:function(b){var a=this.textElement;if(b){a.show();a.setHtml(b)}else{a.hide()}},updateBadgeCls:function(b,a){this.badgeElement.replaceCls(a,b)},updateHasBadgeCls:function(b,c){var a=this.element;if(a.hasCls(c)){a.replaceCls(c,b)}},updateLabelCls:function(b,a){this.textElement.replaceCls(a,b)},updatePressedCls:function(b,c){var a=this.element;if(a.hasCls(c)){a.replaceCls(c,b)}},updateIcon:function(b){var c=this,a=c.iconElement;if(b){c.showIconElement();a.setStyle("background-image","url("+b+")");c.refreshIconAlign()}else{a.setStyle("background-image","");c.hideIconElement()}},updateIconCls:function(c,a){var d=this,b=d.iconElement;if(c){d.showIconElement();b.replaceCls(a,c);d.refreshIconAlign()}else{b.removeCls(a);d.hideIconElement()}},updateIconAlign:function(d,c){var b=this.element,a=Ext.baseCSSPrefix+"iconalign-";if(!this.getText()){d="center"}b.removeCls(a+"center");b.removeCls(a+c);if(this.getIcon()||this.getIconCls()){b.addCls(a+d)}},refreshIconAlign:function(){this.updateIconAlign(this.getIconAlign())},applyAutoEvent:function(b){var a=this;if(typeof b=="string"){b={name:b,scope:a.scope||a}}return b},updateAutoEvent:function(c){var a=c.name,b=c.scope;this.setHandler(function(){b.fireEvent(a,b,this)});this.setScope(b)},hideIconElement:function(){this.iconElement.removeCls(Ext.baseCSSPrefix+"shown");this.iconElement.addCls(Ext.baseCSSPrefix+"hidden")},showIconElement:function(){this.iconElement.removeCls(Ext.baseCSSPrefix+"hidden");this.iconElement.addCls(Ext.baseCSSPrefix+"shown")},applyUi:function(a){if(a&&Ext.isString(a)){var b=a.split("-");if(b&&(b[1]=="back"||b[1]=="forward")){return b}}return a},getUi:function(){var a=this._ui;if(Ext.isArray(a)){return a.join("-")}return a},applyPressedDelay:function(a){if(Ext.isNumber(a)){return a}return(a)?100:0},onPress:function(){var c=this,a=c.element,d=c.getPressedDelay(),b=c.getPressedCls();if(!c.getDisabled()){if(d>0){c.pressedTimeout=setTimeout(function(){delete c.pressedTimeout;if(a){a.addCls(b)}},d)}else{a.addCls(b)}}},onRelease:function(a){this.fireAction("release",[this,a],"doRelease")},doRelease:function(a,b){if(!a.getDisabled()){if(a.hasOwnProperty("pressedTimeout")){clearTimeout(a.pressedTimeout);delete a.pressedTimeout}else{a.element.removeCls(a.getPressedCls())}}},onTap:function(a){if(this.getDisabled()){return false}this.fireAction("tap",[this,a],"doTap")},doTap:function(c,d){var b=c.getHandler(),a=c.getScope()||c;if(!b){return}if(typeof b=="string"){b=a[b]}if(d&&d.preventDefault){d.preventDefault()}b.apply(a,arguments)}},function(){});Ext.define("Ext.Sheet",{extend:Ext.Panel,xtype:"sheet",config:{baseCls:Ext.baseCSSPrefix+"sheet",modal:true,centered:true,stretchX:null,stretchY:null,enter:"bottom",exit:"bottom",showAnimation:!Ext.browser.is.AndroidStock2?{type:"slideIn",duration:250,easing:"ease-out"}:null,hideAnimation:!Ext.browser.is.AndroidStock2?{type:"slideOut",duration:250,easing:"ease-in"}:null},isInputRegex:/^(input|textarea|select|a)$/i,beforeInitialize:function(){var a=this;Ext.os.is.iOS&&this.element.dom.addEventListener("touchstart",function(b){if(!a.isInputRegex.test(b.target.tagName)){b.preventDefault()}},true)},platformConfig:[{theme:["Windows"],enter:"top",exit:"top"}],applyHideAnimation:function(b){var a=this.getExit(),d=a;if(a===null){return null}if(b===true){b={type:"slideOut"}}if(Ext.isString(b)){b={type:b}}var c=Ext.factory(b,Ext.fx.Animation);if(c){if(a=="bottom"){d="down"}if(a=="top"){d="up"}c.setDirection(d)}return c},applyShowAnimation:function(a){var d=this.getEnter(),c=d;if(d===null){return null}if(a===true){a={type:"slideIn"}}if(Ext.isString(a)){a={type:a}}var b=Ext.factory(a,Ext.fx.Animation);if(b){if(d=="bottom"){c="down"}if(d=="top"){c="up"}b.setBefore({display:null});b.setReverse(true);b.setDirection(c)}return b},updateStretchX:function(a){this.getLeft();this.getRight();if(a){this.setLeft(0);this.setRight(0)}},updateStretchY:function(a){this.getTop();this.getBottom();if(a){this.setTop(0);this.setBottom(0)}}});Ext.define("Ext.ActionSheet",{extend:Ext.Sheet,alias:"widget.actionsheet",config:{baseCls:Ext.baseCSSPrefix+"sheet-action",left:0,right:0,bottom:0,centered:false,height:"auto",defaultType:"button"},platformConfig:[{theme:["Windows"],top:0,bottom:null}]});Ext.define("Ext.data.Connection",{mixins:{observable:Ext.mixin.Observable},statics:{requestId:0},config:{url:null,async:true,method:null,username:"",password:"",disableCaching:true,disableCachingParam:"_dc",timeout:30000,extraParams:null,defaultHeaders:null,useDefaultHeader:true,defaultPostHeader:"application/x-www-form-urlencoded; charset=UTF-8",useDefaultXhrHeader:true,defaultXhrHeader:"XMLHttpRequest",autoAbort:false},textAreaRe:/textarea/i,multiPartRe:/multipart\/form-data/i,lineBreakRe:/\r\n/g,constructor:function(a){this.initConfig(a);this.requests={}},request:function(k){k=k||{};var f=this,j=k.scope||window,e=k.username||f.getUsername(),h=k.password||f.getPassword()||"",g=k.xhr2===true&&Ext.feature.has.XHR2,b,c,d,a,i;if(!Ext.isEmpty(e)&&!Ext.isEmpty(h,true)&&Ext.isEmpty(k.withCredentials)){k.withCredentials=true}if(f.fireEvent("beforerequest",f,k)!==false){c=f.setOptions(k,j);if(this.isFormUpload(k)===true){this.upload(k.form,c.url,c.data,k);return null}if(k.autoAbort===true||f.getAutoAbort()){f.abort()}i=this.getXhrInstance();b=k.async!==false?(k.async||f.getAsync()):false;if(e){i.open(c.method,c.url,b,e,h)}else{i.open(c.method,c.url,b)}a=f.setupHeaders(i,k,c.data,c.params);d={id:++Ext.data.Connection.requestId,xhr:i,headers:a,options:k,async:b,timeout:setTimeout(function(){d.timedout=true;f.abort(d)},k.timeout||f.getTimeout())};f.requests[d.id]=d;if(b){i[g?"onload":"onreadystatechange"]=Ext.Function.bind(f.onStateChange,f,[d])}if(g){i.onerror=Ext.Function.bind(f.onStateChange,f,[d])}if(k.progress){i.onprogress=function(l){if(k.progress.isProgressable){if(l.total===0&&k.progress.getDynamic()){Ext.Logger.warn("Server is not configured to properly return Content-Length. Dynamic progress will be disabled");k.progress.setState.call(k.progress,"download");k.progress.setDynamic(false);i.onprogress=null;return}Ext.callback(k.progress.updateProgress,k.progress,[(l.loaded/l.total),"download"]);if(l.total>0&&!k.progress.getDynamic()&&k.progress.getInitialConfig().dynamic){k.progress.setDynamic(true)}}else{if(Ext.isFunction(k.progress)){Ext.callback(k.progress,k.progressScope||d,[l,"download"])}}};if(Ext.feature.has.XHRUploadProgress){i.upload.onprogress=function(l){f.fireEvent("requestuploadprogress",f,d,l);if(k.progress.isProgressable){Ext.callback(k.progress.updateProgress,k.progress,[(l.loaded/l.total),"upload"])}else{if(Ext.isFunction(k.progress)){Ext.callback(k.progress,k.progressScope||d,[l,"upload"])}}}}if(k.progress.isProgressable){if(!Ext.feature.has.XHRUploadProgress){k.progress.setDynamic(false)}Ext.callback(k.progress.startProgress,k.progress)}}i.send(c.data);if(!b){return this.onComplete(d)}return d}else{Ext.callback(k.callback,k.scope,[k,undefined,undefined]);return null}},upload:function(e,c,i,l){e=Ext.getDom(e);l=l||{};var d=Ext.id(),k=this,h=document.createElement("iframe"),j=[],g="multipart/form-data",f={target:e.target,method:e.method,encoding:e.encoding,enctype:e.enctype,action:e.action},b=function(m,n){a=document.createElement("input");Ext.fly(a).set({type:"hidden",value:n,name:m});e.appendChild(a);j.push(a)},a;Ext.fly(h).set({id:d,name:d,cls:Ext.baseCSSPrefix+"hide-display",src:Ext.SSL_SECURE_URL});document.body.appendChild(h);if(document.frames){document.frames[d].name=d}Ext.fly(e).set({target:d,method:"POST",enctype:g,encoding:g,action:c||f.action});if(i){Ext.iterate(Ext.Object.fromQueryString(i),function(m,n){if(Ext.isArray(n)){Ext.each(n,function(o){b(m,o)})}else{b(m,n)}})}h.addEventListener("load",function(){Ext.callback(k.onUploadComplete,k,[h,l,d]);h.removeEventListener("load",arguments.callee)});e.submit();Ext.fly(e).set(f);Ext.each(j,function(m){Ext.removeNode(m)})},onUploadComplete:function(h,c,i){var b={responseText:"",responseXML:null,request:{options:c}},g,a,f;try{g=(h.contentWindow&&h.contentWindow.document)||h.contentDocument||window.frames[i].document;if(g){if(g.hasOwnProperty("body")&&g.body){a=g.body}if(a){f=a.firstChild||{};if(this.textAreaRe.test(f.tagName)){b.responseText=f.value}else{b.responseText=f.innerHTML}b.responseXML=a.XMLDocument}}}catch(d){b.success=false;b.message="Cross-Domain access is not permitted between frames. XHR2 is recommended for this type of request.";b.error=d}this.onAfterUploadComplete(b,h,c)},onAfterUploadComplete:function(a,d,b){var c=this;c.fireEvent("requestcomplete",c,a,b);Ext.callback(b.callback,b.scope,[b,true,a]);setTimeout(function(){Ext.removeNode(d)},100)},isFormUpload:function(a){var b=this.getForm(a);if(b){return(a.isUpload||(this.multiPartRe).test(b.getAttribute("enctype")))}return false},getForm:function(a){return Ext.getDom(a.form)||null},setOptions:function(k,j){var h=this,e=k.params||{},g=h.getExtraParams(),d=k.urlParams,c=k.url||h.getUrl(),i=k.jsonData,b,a,f;if(Ext.isFunction(e)){e=e.call(j,k)}if(Ext.isFunction(c)){c=c.call(j,k)}c=this.setupUrl(k,c);f=k.data||k.rawData||k.binaryData||k.xmlData||i||null;if(i&&!Ext.isPrimitive(i)){f=Ext.encode(f)}if(k.binaryData){if(f instanceof Array){f=(new Uint8Array(k.binaryData))}if(f instanceof Uint8Array){f=f.buffer}}if(Ext.isObject(e)){e=Ext.Object.toQueryString(e)}if(Ext.isObject(g)){g=Ext.Object.toQueryString(g)}e=e+((g)?((e)?"&":"")+g:"");d=Ext.isObject(d)?Ext.Object.toQueryString(d):d;e=this.setupParams(k,e);b=(k.method||h.getMethod()||((e||f)?"POST":"GET")).toUpperCase();this.setupMethod(k,b);a=k.disableCaching!==false?(k.disableCaching||h.getDisableCaching()):false;if(a){c=Ext.urlAppend(c,(k.disableCachingParam||h.getDisableCachingParam())+"="+(new Date().getTime()))}if((b=="GET"||f)&&e){c=Ext.urlAppend(c,e);e=null}if(d){c=Ext.urlAppend(c,d)}return{url:c,method:b,data:f||e||null}},setupUrl:function(b,a){var c=this.getForm(b);if(c){a=a||c.action}return a},setupParams:function(a,d){var c=this.getForm(a),b;if(c&&!this.isFormUpload(a)){b=Ext.Element.serializeForm(c);d=d?(d+"&"+b):b}return d},setupMethod:function(a,b){if(this.isFormUpload(a)){return"POST"}return b},setupHeaders:function(l,m,d,c){var h=this,b=Ext.apply({},m.headers||{},h.getDefaultHeaders()||{}),k=h.getDefaultPostHeader(),i=m.jsonData,a=m.xmlData,j,f;if(!b["Content-Type"]&&(d||c)){if(d){if(m.rawData){k="text/plain"}else{if(a&&Ext.isDefined(a)){k="text/xml"}else{if(i&&Ext.isDefined(i)){k="application/json"}}}}if(!(Ext.feature.has.XHR2&&d instanceof FormData)){b["Content-Type"]=k}}if(((h.getUseDefaultXhrHeader()&&m.useDefaultXhrHeader!==false)||m.useDefaultXhrHeader)&&!b["X-Requested-With"]){b["X-Requested-With"]=h.getDefaultXhrHeader()}if(!Ext.isEmpty(m.username)&&!Ext.isEmpty(m.password)){b.Authorization="Basic "+btoa(m.username+":"+m.password)}try{for(j in b){if(b.hasOwnProperty(j)){f=b[j];l.setRequestHeader(j,f)}}}catch(g){h.fireEvent("exception",j,f)}if(m.responseType){try{l.responseType=m.responseType==="blob"&&Ext.browser.is.Safari?"arraybuffer":m.responseType}catch(g){}}if(m.withCredentials){l.withCredentials=m.withCredentials}return b},getXhrInstance:(function(){var b=[function(){return new XMLHttpRequest()},function(){return new ActiveXObject("MSXML2.XMLHTTP.3.0")},function(){return new ActiveXObject("MSXML2.XMLHTTP")},function(){return new ActiveXObject("Microsoft.XMLHTTP")}],c=0,a=b.length,f;for(;c=200&&a<300)||a==304||(a==0&&d.responseText&&d.responseText.length>0),b=false;if(!c){switch(a){case 12002:case 12029:case 12030:case 12031:case 12152:case 13030:b=true;break}}return{success:c,isException:b}},createResponse:function(d){var j=d.xhr,a={},k,f,l,g,i,b,e=j.responseType==="blob"||j.responseType==="arraybuffer",h=j.responseType==="text",c=j.responseType==="document";if(d.timedout||d.aborted){d.success=false;k=[]}else{k=j.getAllResponseHeaders().replace(this.lineBreakRe,"\n").split("\n")}f=k.length;while(f--){l=k[f];g=l.indexOf(":");if(g>=0){i=l.substr(0,g).toLowerCase();if(l.charAt(g+1)==" "){++g}a[i]=l.substr(g+1)}}d.xhr=null;delete d.xhr;b={request:d,requestId:d.id,status:j.status,statusText:j.statusText,getResponseHeader:function(m){return a[m.toLowerCase()]},getAllResponseHeaders:function(){return a},responseText:e?null:c?null:j.responseText,responseXML:e?null:h?null:j.responseXML,responseBytes:e?j.response:null};if(d.options.responseType==="blob"&&j.responseType==="arraybuffer"){b.responseBytes=new Blob([b.responseBytes],{type:j.getResponseHeader("Content-Type")})}j=null;return b},createException:function(a){return{request:a,requestId:a.id,status:a.aborted?-1:0,statusText:a.aborted?"transaction aborted":"communication failure",aborted:a.aborted,timedout:a.timedout}}});Ext.define("Ext.Ajax",{extend:Ext.data.Connection,singleton:true,autoAbort:false});Ext.define("Ext.Anim",{isAnim:true,disableAnimations:false,defaultConfig:{from:{},to:{},duration:250,delay:0,easing:"ease-in-out",autoClear:true,out:true,direction:null,reverse:false},opposites:{left:"right",right:"left",up:"down",down:"up"},constructor:function(a){a=Ext.apply({},a||{},this.defaultConfig);this.config=a;this.callSuper([a]);this.running=[]},initConfig:function(c,b){var d=this,a=Ext.apply({},b||{},d.config);a.el=c=Ext.get(c);if(a.reverse&&d.opposites[a.direction]){a.direction=d.opposites[a.direction]}if(d.config.before){d.config.before.call(a,c,a)}if(b.before){b.before.call(a.scope||a,c,a)}return a},run:function(c,a){c=Ext.get(c);a=a||{};var d=this,b=c.dom.style,e,f=a.after;if(d.running[c.id]){d.onTransitionEnd(null,c,{config:a,after:f})}a=this.initConfig(c,a);if(this.disableAnimations){for(e in a.to){if(!a.to.hasOwnProperty(e)){continue}b[e]=a.to[e]}this.onTransitionEnd(null,c,{config:a,after:f});return d}c.un("transitionend",d.onTransitionEnd,d);b.webkitTransitionDuration="0ms";for(e in a.from){if(!a.from.hasOwnProperty(e)){continue}b[e]=a.from[e]}setTimeout(function(){if(!c.dom){return}if(a.is3d===true){c.parent().setStyle({"-webkit-perspective":"1200","-webkit-transform-style":"preserve-3d"})}b.webkitTransitionDuration=a.duration+"ms";b.webkitTransitionProperty="all";b.webkitTransitionTimingFunction=a.easing;c.on("transitionend",d.onTransitionEnd,d,{single:true,config:a,after:f});for(e in a.to){if(!a.to.hasOwnProperty(e)){continue}b[e]=a.to[e]}},a.delay||5);d.running[c.id]=a;return d},onTransitionEnd:function(e,c,g){c=Ext.get(c);if(this.running[c.id]===undefined){return}var b=c.dom.style,a=g.config,d=this,f;if(a.autoClear){for(f in a.to){if(!a.to.hasOwnProperty(f)||a[f]===false){continue}b[f]=""}}b.webkitTransitionDuration=null;b.webkitTransitionProperty=null;b.webkitTransitionTimingFunction=null;if(a.is3d){c.parent().setStyle({"-webkit-perspective":"","-webkit-transform-style":""})}if(d.config.after){d.config.after.call(a,c,a)}if(g.after){g.after.call(a.scope||d,c,a)}delete d.running[c.id]}},function(){Ext.Anim.seed=1000;Ext.Anim.run=function(b,c,a){if(b.isComponent){b=b.element}else{b=Ext.get(b)}a=a||{};if(c.isAnim){c.run(b,a)}else{if(Ext.isObject(c)){if(a.before&&c.before){a.before=Ext.createInterceptor(a.before,c.before,c.scope)}if(a.after&&c.after){a.after=Ext.createInterceptor(a.after,c.after,c.scope)}a=Ext.apply({},a,c);c=c.type}if(!Ext.anims[c]){throw c+" is not a valid animation type."}else{if(b&&b.dom){Ext.anims[c].run(b,a)}}}};Ext.anims={fade:new Ext.Anim({type:"fade",before:function(b){var c=1,a=1,e=b.getStyle("z-index")=="auto"?0:b.getStyle("z-index"),d=e;if(this.out){a=0}else{d=Math.abs(e)+1;c=0}this.from={opacity:c,"z-index":d};this.to={opacity:a,"z-index":d}}}),slide:new Ext.Anim({direction:"left",cover:false,reveal:false,opacity:false,"z-index":false,before:function(a){var c=a.getStyle("z-index")=="auto"?0:a.getStyle("z-index"),f=a.getStyle("opacity"),h=c+1,d=this.out,l=this.direction,k=0,i=0,j=0,g=0,b=a.getHeight(),e=a.getWidth();if(l=="left"||l=="right"){if(d){k=-e}else{j=e}}else{if(l=="up"||l=="down"){if(d){i=-b}else{g=b}}}if(l=="right"||l=="down"){i*=-1;k*=-1;g*=-1;j*=-1}if(this.cover&&d){k=0;i=0;h=c}else{if(this.reveal&&!d){j=0;g=0;h=c}}this.from={"-webkit-transform":"translate3d("+j+"px, "+g+"px, 0)","z-index":h,opacity:f-0.01};this.to={"-webkit-transform":"translate3d("+k+"px, "+i+"px, 0)","z-index":h,opacity:f}}}),pop:new Ext.Anim({scaleOnExit:true,before:function(d){var b=1,c=1,g=1,a=1,h=d.getStyle("z-index")=="auto"?0:d.getStyle("z-index"),f=h,e=h;if(!this.out){b=0.01;f=h+1;e=h+1;g=0}else{if(this.scaleOnExit){c=0.01;a=0}else{a=0.8}}this.from={"-webkit-transform":"scale("+b+")","-webkit-transform-origin":"50% 50%",opacity:g,"z-index":f};this.to={"-webkit-transform":"scale("+c+")","-webkit-transform-origin":"50% 50%",opacity:a,"z-index":e}}}),flip:new Ext.Anim({is3d:true,direction:"left",before:function(c){var f="Y",a=1,b=1,e=0,d=0;if(this.out){d=-180;b=0.8}else{e=180;a=0.8}if(this.direction=="up"||this.direction=="down"){f="X"}if(this.direction=="right"||this.direction=="left"){d*=-1;e*=-1}this.from={"-webkit-transform":"rotate"+f+"("+e+"deg) scale("+a+")","-webkit-backface-visibility":"hidden"};this.to={"-webkit-transform":"rotate"+f+"("+d+"deg) scale("+b+")","-webkit-backface-visibility":"hidden"}}}),cube:new Ext.Anim({is3d:true,direction:"left",style:"outer",before:function(b){var k="0% 0%",l=0,a=0,i="Y",f=0,g=0,e=b.getWidth(),d=b.getHeight(),j=true,c=" translateX(0)",h="";if(this.direction=="left"||this.direction=="right"){if(this.out){k="100% 100%";g=e;a=-90}else{k="0% 0%";f=e;l=90}}else{if(this.direction=="up"||this.direction=="down"){i="X";if(this.out){k="100% 100%";g=d;a=90}else{k="0% 0%";f=d;l=-90}}}if(this.direction=="down"||this.direction=="right"){l*=-1;a*=-1;k=(k=="0% 0%")?"100% 100%":"0% 0%"}if(this.style=="inner"){f*=-1;g*=-1;l*=-1;a*=-1;if(!this.out){h=" translateX(0px)";k="0% 50%"}else{h=c;k="100% 50%"}}this.from={"-webkit-transform":"rotate"+i+"("+l+"deg)"+(j?" translateZ("+f+"px)":"")+c,"-webkit-transform-origin":k};this.to={"-webkit-transform":"rotate"+i+"("+a+"deg) translateZ("+g+"px)"+h,"-webkit-transform-origin":k}},duration:250}),wipe:new Ext.Anim({before:function(b){var d=b.getStyle("z-index"),c,a="";if(!this.out){c=d+1;a="-webkit-gradient(linear, left bottom, right bottom, from(transparent), to(#000), color-stop(66%, #000), color-stop(33%, transparent))";this.from={"-webkit-mask-image":a,"-webkit-mask-size":b.getWidth()*3+"px "+b.getHeight()+"px","z-index":c,"-webkit-mask-position-x":0};this.to={"-webkit-mask-image":a,"-webkit-mask-size":b.getWidth()*3+"px "+b.getHeight()+"px","z-index":c,"-webkit-mask-position-x":-b.getWidth()*2+"px"}}},duration:500})}});Ext.define("Ext.Media",{extend:Ext.Component,xtype:"media",config:{url:"",enableControls:Ext.os.is.Android?false:true,autoResume:false,autoPause:true,preload:true,loop:false,media:null,volume:1,muted:false},constructor:function(){this.mediaEvents={};this.callSuper(arguments)},initialize:function(){var a=this;a.callParent();a.on({scope:a,activate:a.onActivate,deactivate:a.onDeactivate});a.addMediaListener({canplay:"onCanPlay",play:"onPlay",pause:"onPause",ended:"onEnd",volumechange:"onVolumeChange",timeupdate:"onTimeUpdate"})},addMediaListener:function(c,a){var b=this,d=b.media.dom,e=Ext.Function.bind;Ext.Object.each(c,function(g,f){f=e(b[f],b);b.mediaEvents[g]=f;d.addEventListener(g,f)})},onPlay:function(){this.fireEvent("play",this)},onCanPlay:function(){this.fireEvent("canplay",this)},onPause:function(){this.fireEvent("pause",this,this.getCurrentTime())},onEnd:function(){this.fireEvent("ended",this,this.getCurrentTime())},onVolumeChange:function(){this.fireEvent("volumechange",this,this.media.dom.volume)},onTimeUpdate:function(){this.fireEvent("timeupdate",this,this.getCurrentTime())},isPlaying:function(){return !Boolean(this.media.dom.paused)},onActivate:function(){var a=this;if(a.getAutoResume()&&!a.isPlaying()){a.play()}},onDeactivate:function(){var a=this;if(a.getAutoPause()&&a.isPlaying()){a.pause()}},updateUrl:function(a){var b=this.media.dom;b.src=a;if("load" in b){b.load()}if(this.isPlaying()){this.play()}},updateEnableControls:function(a){this.media.dom.controls=a?"controls":false},updateLoop:function(a){this.media.dom.loop=a?"loop":false},play:function(){var a=this.media.dom;if("play" in a){a.play();setTimeout(function(){a.play()},10)}},pause:function(){var a=this.media.dom;if("pause" in a){a.pause()}},toggle:function(){if(this.isPlaying()){this.pause()}else{this.play()}},stop:function(){var a=this;a.setCurrentTime(0);a.fireEvent("stop",a);a.pause()},updateVolume:function(a){this.media.dom.volume=a},updateMuted:function(a){this.fireEvent("mutedchange",this,a);this.media.dom.muted=a},getCurrentTime:function(){return this.media.dom.currentTime},setCurrentTime:function(a){this.media.dom.currentTime=a;return a},getDuration:function(){return this.media.dom.duration},destroy:function(){var a=this,c=a.media.dom,b=a.mediaEvents;Ext.Object.each(b,function(e,d){c.removeEventListener(e,d)});this.callSuper()}});Ext.define("Ext.Audio",{extend:Ext.Media,xtype:"audio",config:{cls:Ext.baseCSSPrefix+"audio"},onActivate:function(){var a=this;a.callParent();if(Ext.os.is.Phone){a.element.show()}},onDeactivate:function(){var a=this;a.callParent();if(Ext.os.is.Phone){a.element.hide()}},template:[{reference:"media",preload:"auto",tag:"audio",cls:Ext.baseCSSPrefix+"component"}]});Ext.define("Ext.util.Geolocation",{extend:Ext.Evented,alternateClassName:["Ext.util.GeoLocation"],config:{autoUpdate:true,frequency:10000,latitude:null,longitude:null,accuracy:null,altitude:null,altitudeAccuracy:null,heading:null,speed:null,timestamp:null,allowHighAccuracy:false,timeout:Infinity,maximumAge:0,provider:undefined},updateMaximumAge:function(){if(this.watchOperation){this.updateWatchOperation()}},updateTimeout:function(){if(this.watchOperation){this.updateWatchOperation()}},updateAllowHighAccuracy:function(){if(this.watchOperation){this.updateWatchOperation()}},applyProvider:function(a){if(Ext.feature.has.Geolocation){if(!a){if(navigator&&navigator.geolocation){a=navigator.geolocation}else{if(window.google){a=google.gears.factory.create("beta.geolocation")}}}}else{this.fireEvent("locationerror",this,false,false,true,"This device does not support Geolocation.")}return a},updateAutoUpdate:function(a,b){var c=this,f=c.getProvider();if(b&&f){clearInterval(c.watchOperationId);c.watchOperationId=null}if(a){if(!f){c.fireEvent("locationerror",c,false,false,true,null);return}try{c.updateWatchOperation()}catch(d){c.fireEvent("locationerror",c,false,false,true,d.message)}}},updateWatchOperation:function(){var a=this,b=a.getProvider();if(a.watchOperationId){clearInterval(a.watchOperationId)}function c(){b.getCurrentPosition(Ext.bind(a.fireUpdate,a),Ext.bind(a.fireError,a),a.parseOptions())}c();a.watchOperationId=setInterval(c,this.getFrequency())},updateLocation:function(h,a,c){var b=this,g=b.getProvider();var f=function(i,e){if(e){b.fireError(e)}else{b.fireEvent("locationerror",b,false,false,true,i)}if(h){h.call(a||b,null,b)}};if(!g){f(null);return}try{g.getCurrentPosition(function(e){b.fireUpdate(e);if(h){h.call(a||b,b,b)}},function(e){f(null,e)},c||b.parseOptions())}catch(d){f(d.message)}},fireUpdate:function(a){var b=this,c=a.coords;this.position=a;b.setConfig({timestamp:a.timestamp,latitude:c.latitude,longitude:c.longitude,accuracy:c.accuracy,altitude:c.altitude,altitudeAccuracy:c.altitudeAccuracy,heading:c.heading,speed:c.speed});b.fireEvent("locationupdate",b)},fireError:function(a){var b=a.code;this.fireEvent("locationerror",this,b==a.TIMEOUT,b==a.PERMISSION_DENIED,b==a.POSITION_UNAVAILABLE,a.message==undefined?null:a.message)},parseOptions:function(){var b=this.getTimeout(),a={maximumAge:this.getMaximumAge(),enableHighAccuracy:this.getAllowHighAccuracy()};if(b!==Infinity){a.timeout=b}return a},destroy:function(){this.setAutoUpdate(false)}});Ext.define("Ext.Map",{extend:Ext.Container,xtype:"map",isMap:true,config:{baseCls:Ext.baseCSSPrefix+"map",useCurrentLocation:false,map:null,geo:null,mapOptions:{},mapListeners:null},constructor:function(){this.callParent(arguments);if(!(window.google||{}).maps){this.setHtml("Google Maps API is required")}},initialize:function(){this.callParent();this.initMap();this.on({painted:"doResize",scope:this});this.innerElement.on("touchstart","onTouchStart",this)},initMap:function(){var f=this.getMap();if(!f){var e=(window.google||{}).maps;if(!e){return null}var b=this.mapContainer,a=this.getMapOptions(),d=e.event,c=this;if(b.dom.firstChild){Ext.fly(b.dom.firstChild).destroy()}if(Ext.os.is.iPad){Ext.merge({navigationControlOptions:{style:e.NavigationControlStyle.ZOOM_PAN}},a)}a.mapTypeId=a.mapTypeId||e.MapTypeId.ROADMAP;a.center=a.center||new e.LatLng(37.381592,-122.135672);if(a.center&&a.center.latitude&&!Ext.isFunction(a.center.lat)){a.center=new e.LatLng(a.center.latitude,a.center.longitude)}a.zoom=a.zoom||12;f=new e.Map(b.dom,a);this.setMap(f);d.addListener(f,"zoom_changed",Ext.bind(c.onZoomChange,c));d.addListener(f,"maptypeid_changed",Ext.bind(c.onTypeChange,c));d.addListener(f,"center_changed",Ext.bind(c.onCenterChange,c));d.addListenerOnce(f,"tilesloaded",Ext.bind(c.onTilesLoaded,c));this.addMapListeners()}return this.getMap()},renderMap:function(){this.initMap()},getElementConfig:function(){return{reference:"element",className:"x-container",children:[{reference:"innerElement",className:"x-inner",children:[{reference:"mapContainer",className:Ext.baseCSSPrefix+"map-container"}]}]}},onTouchStart:function(a){a.makeUnpreventable()},applyMapOptions:function(a){return Ext.merge({},this.options,a)},updateMapOptions:function(c){var b=(window.google||{}).maps,a=this.getMap();if(b&&a){a.setOptions(c)}},doMapCenter:function(){this.setMapCenter(this.getMapOptions().center)},getMapOptions:function(){return Ext.merge({},this.options||this.getInitialConfig("mapOptions"))},updateUseCurrentLocation:function(a){this.setGeo(a);if(!a){this.setMapCenter()}},applyGeo:function(a){return Ext.factory(a,Ext.util.Geolocation,this.getGeo())},updateGeo:function(b,a){var c={locationupdate:"onGeoUpdate",locationerror:"onGeoError",scope:this};if(a){a.un(c)}if(b){b.on(c);b.updateLocation()}},doResize:function(){var b=(window.google||{}).maps,a=this.getMap();if(b&&a){b.event.trigger(a,"resize")}},onTilesLoaded:function(){this.fireEvent("maprender",this,this.getMap())},addMapListeners:function(){var e=(window.google||{}).maps,a=this.getMap(),j=this.getMapListeners();if(e){var b=e.event,h=this,d,k,i,g,f;if(Ext.isSimpleObject(j)){for(var c in j){d=j[c];if(Ext.isSimpleObject(d)){k=d.scope;i=d.fn}else{if(Ext.isFunction(d)){k=null;i=d}}if(i){g=function(){this.fn.apply(this.scope,[h]);if(this.handle){b.removeListener(this.handle);delete this.handle;delete this.fn;delete this.scope}};f=b.addListener(a,c,Ext.bind(g,g));g.fn=i;g.scope=k;if(d.single===true){g.handle=f}}}}}},onGeoUpdate:function(a){if(a){this.setMapCenter(new google.maps.LatLng(a.getLatitude(),a.getLongitude()))}},onGeoError:Ext.emptyFn,setMapCenter:function(e){var b=this,d=b.getMap(),a=b.getMapOptions(),c=(window.google||{}).maps;if(c){if(!e){if(d&&d.getCenter){e=d.getCenter()}else{if(a.hasOwnProperty("center")){e=a.center}else{e=new c.LatLng(37.381592,-122.135672)}}}if(e&&!(e instanceof c.LatLng)&&"longitude" in e){e=new c.LatLng(e.latitude,e.longitude)}if(!d){a.center=a.center||e;b.renderMap();d=b.getMap()}if(d&&e instanceof c.LatLng){d.panTo(e)}else{this.options=Ext.apply(this.getMapOptions(),{center:e})}}},onZoomChange:function(){var a=this.getMapOptions(),c=this.getMap(),b;b=(c&&c.getZoom)?c.getZoom():a.zoom||10;this.options=Ext.apply(a,{zoom:b});this.fireEvent("zoomchange",this,c,b)},onTypeChange:function(){var b=this.getMapOptions(),c=this.getMap(),a;a=(c&&c.getMapTypeId)?c.getMapTypeId():b.mapTypeId;this.options=Ext.apply(b,{mapTypeId:a});this.fireEvent("typechange",this,c,a)},onCenterChange:function(){var b=this.getMapOptions(),c=this.getMap(),a;a=(c&&c.getCenter)?c.getCenter():b.center;this.options=Ext.apply(b,{center:a});this.fireEvent("centerchange",this,c,a)},destroy:function(){Ext.destroy(this.getGeo());var a=this.getMap();if(a&&(window.google||{}).maps){google.maps.event.clearInstanceListeners(a)}this.callParent()}},function(){});Ext.define("Ext.BingMap",{extend:Ext.Map,xtype:"bingmap",initMap:function(){var f=this.getMap();if(!f){var e=this,c=e.mapContainer,a=e.getMapOptions(),d;var g=Microsoft.Maps;var b="AokX-S2lieXTaXG8pvEw3i2AKYuStBMK8RsUu6BDJ6hrL5AYv0IfQqM9zc-BAA-v";a=Ext.merge({credentials:b,mapTypeId:"r",zoom:12},a);if(!a.center){a.center=new g.Location(37.381592,-122.135672)}if(c.dom.firstChild){Ext.fly(c.dom.firstChild).destroy()}g.loadModule("Microsoft.Maps.Overlays.Style",{callback:function(){e.setMap(new g.Map(c.dom,a));if(a.callback){a.callback()}}});f=e.getMap()}e.fireEvent("maprender",e,f)},setMapCenter:function(c){var a=this,b=a.getMap(),d=Microsoft.Maps;if(!a.isPainted()){a.un("painted","setMapCenter",this);a.on("painted","setMapCenter",this,{delay:150,single:true,args:[c]});return}c=c||new d.Location(37.381592,-122.135672);if(c&&!(c instanceof d.Location)&&"longitude" in c){c=new d.Location(c.latitude,c.longitude)}if(!b){a.initMap();b=a.getMap()}if(b&&c instanceof d.Location){b.updateMapPosition(c)}else{this.options=Ext.apply(this.getMapOptions(),{center:c})}}},function(){});Ext.define("Ext.ComponentQuery",{singleton:true},function(){var g=this,j=["var r = [],","i = 0,","it = items,","l = it.length,","c;","for (; i < l; i++) {","c = it[i];","if (c.{0}) {","r.push(c);","}","}","return r;"].join(""),e=function(o,n){return n.method.apply(this,[o].concat(n.args))},a=function(p,t){var n=[],q=0,s=p.length,r,o=t!==">";for(;q\^])\s?|\s|$)/,c=/^(#)?([\w\-]+|\*)(?:\((true|false)\))?/,b=[{re:/^\.([\w\-]+)(?:\((true|false)\))?/,method:l},{re:/^(?:[\[](?:@)?([\w\-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]])/,method:m},{re:/^#([\w\-]+)/,method:d},{re:/^\:([\w\-]+)(?:\(((?:\{[^\}]+\})|(?:(?!\{)[^\s>\/]*?(?!\})))\))?/,method:k},{re:/^(?:\{([^\}]+)\})/,method:j}];g.Query=Ext.extend(Object,{constructor:function(n){n=n||{};Ext.apply(this,n)},execute:function(o){var q=this.operations,r=0,s=q.length,p,n;if(!o){n=Ext.ComponentManager.all.getArray()}else{if(Ext.isArray(o)){n=o}}for(;r1){for(q=0,r=s.length;q1){r=q.length;for(p=0;p=10){a.input.on({scope:a,keypress:"onKeyPress"})}},updateFastFocus:function(a){if(a){if(this.getFastFocus()&&Ext.os.is.iOS){this.input.on({scope:this,touchstart:"onTouchStart"})}}else{this.input.un({scope:this,touchstart:"onTouchStart"})}},useManualMaxLength:function(){return Boolean((Ext.os.is.Android&&!Ext.browser.is.Chrome))},applyUseMask:function(a){if(a==="auto"){a=Ext.os.is.iOS&&Ext.os.version.lt("5")}return Boolean(a)},updateUseMask:function(a){this.mask[a?"show":"hide"]()},updatePattern:function(a){this.updateFieldAttribute("pattern",a)},updateFieldAttribute:function(b,c){var a=this.input;if(!Ext.isEmpty(c,true)){a.dom.setAttribute(b,c)}else{a.dom.removeAttribute(b)}},updateCls:function(b,a){this.input.addCls(Ext.baseCSSPrefix+"input-el");this.input.replaceCls(a,b)},updateType:function(a,c){var b=Ext.baseCSSPrefix+"input-";this.input.replaceCls(b+c,b+a);this.updateFieldAttribute("type",a)},updateName:function(a){this.updateFieldAttribute("name",a)},getValue:function(){var a=this.input;if(a){this._value=a.dom.value}return this._value},applyValue:function(a){return(Ext.isEmpty(a))?"":a},updateValue:function(b){var a=this.input;if(a){a.dom.value=b}},setValue:function(b){var a=this._value;this.updateValue(this.applyValue(b));b=this.getValue();if(String(b)!=String(a)&&this.initialized){this.onChange(this,b,a)}return this},updateTabIndex:function(a){this.updateFieldAttribute("tabIndex",a)},testAutoFn:function(a){return[true,"on"].indexOf(a)!==-1},updateMaxLength:function(a){if(!this.useManualMaxLength()){this.updateFieldAttribute("maxlength",a)}},updatePlaceHolder:function(a){this.updateFieldAttribute("placeholder",a)},applyAutoComplete:function(a){return this.testAutoFn(a)},updateAutoComplete:function(a){var b=a?"on":"off";this.updateFieldAttribute("autocomplete",b)},applyAutoCapitalize:function(a){return this.testAutoFn(a)},updateAutoCapitalize:function(b){var a=b?"on":"off";this.updateFieldAttribute("autocapitalize",a)},applyAutoCorrect:function(a){return this.testAutoFn(a)},updateAutoCorrect:function(a){var b=a?"on":"off";this.updateFieldAttribute("autocorrect",b)},updateMinValue:function(a){this.updateFieldAttribute("min",a)},updateMaxValue:function(a){this.updateFieldAttribute("max",a)},updateStepValue:function(a){this.updateFieldAttribute("step",a)},checkedRe:/^(true|1|on)/i,getChecked:function(){var a=this.input,b;if(a){b=a.dom.checked;this._checked=b}return b},applyChecked:function(a){return !!this.checkedRe.test(String(a))},setChecked:function(a){this.updateChecked(this.applyChecked(a));this._checked=a},updateChecked:function(a){this.input.dom.checked=a},updateReadOnly:function(a){this.updateFieldAttribute("readonly",a?true:null)},updateMaxRows:function(a){this.updateFieldAttribute("rows",a)},doSetDisabled:function(a){this.callParent(arguments);if(Ext.browser.is.Safari&&!Ext.os.is.BlackBerry){this.input.dom.tabIndex=(a)?-1:0}this.input.dom.disabled=(Ext.browser.is.Safari&&!Ext.os.is.BlackBerry)?false:a;if(!a){this.blur()}},isDirty:function(){if(this.getDisabled()){return false}return String(this.getValue())!==String(this.originalValue)},reset:function(){this.setValue(this.originalValue)},onInputTap:function(a){this.fireAction("inputtap",[this,a],"doInputTap")},doInputTap:function(a,b){if(a.getDisabled()){return false}if(this.getFastFocus()&&Ext.os.is.iOS){a.focus()}},onMaskTap:function(a){this.fireAction("masktap",[this,a],"doMaskTap")},doMaskTap:function(a,b){if(a.getDisabled()){return false}a.focus()},showMask:function(){if(this.getUseMask()){this.mask.setStyle("display","block")}},hideMask:function(){if(this.getUseMask()){this.mask.setStyle("display","none")}},focus:function(){var b=this,a=b.input;if(a&&a.dom.focus){a.dom.focus()}return b},blur:function(){var b=this,a=this.input;if(a&&a.dom.blur){a.dom.blur()}return b},select:function(){var b=this,a=b.input;if(a&&a.dom.setSelectionRange){a.dom.setSelectionRange(0,9999)}return b},onFocus:function(a){this.fireAction("focus",[a],"doFocus")},doFocus:function(b){var a=this;a.hideMask();if(!a.getIsFocused()){a.setStartValue(a.getValue())}a.setIsFocused(true)},onTouchStart:function(a){if(document.activeElement!=a.target){a.preventDefault()}},onBlur:function(a){this.fireAction("blur",[a],"doBlur")},doBlur:function(d){var b=this,c=b.getValue(),a=b.getStartValue();b.showMask();b.setIsFocused(false);if(String(c)!=String(a)){b.onChange(b,c,a)}},onClearIconTap:function(a){this.fireEvent("clearicontap",this,a);if(Ext.os.is.Android){this.focus()}},onClearIconPress:function(){this.clearIcon.addCls(Ext.baseCSSPrefix+"pressing")},onClearIconRelease:function(){this.clearIcon.removeCls(Ext.baseCSSPrefix+"pressing")},onClick:function(a){this.fireEvent("click",a)},onChange:function(b,c,a){if(this.useManualMaxLength()){this.trimValueToMaxLength()}this.fireEvent("change",b,c,a)},onPaste:function(a){if(this.useManualMaxLength()){this.trimValueToMaxLength()}this.fireEvent("paste",a)},onKeyUp:function(a){if(this.useManualMaxLength()){this.trimValueToMaxLength()}this.fireEvent("keyup",a)},onKeyDown:function(){this.ignoreInput=true},onInput:function(b){var a=this;if(a.ignoreInput){a.ignoreInput=false;return}setTimeout(function(){if(!a.ignoreInput){a.fireEvent("keyup",b);a.ignoreInput=false}},10)},onKeyPress:function(a){if(a.browserEvent.keyCode==13){this.fireEvent("keyup",a)}},onMouseDown:function(a){this.fireEvent("mousedown",a)},trimValueToMaxLength:function(){var a=this.getMaxLength();if(a){var b=this.getValue();if(b.length>this.getMaxLength()){this.setValue(b.slice(0,a))}}}});Ext.define("Ext.field.Field",{extend:Ext.Decorator,alternateClassName:"Ext.form.Field",xtype:"field",isField:true,isFormField:true,config:{baseCls:Ext.baseCSSPrefix+"field",label:null,labelAlign:"left",labelWidth:"30%",labelWrap:false,clearIcon:null,required:false,inputType:null,name:null,value:null,tabIndex:null},platformConfig:[{theme:["Windows","MountainView","Blackberry","Blackberry103","Tizen"],labelAlign:"top"}],cachedConfig:{labelCls:null,requiredCls:Ext.baseCSSPrefix+"field-required",inputCls:null},getElementConfig:function(){var a=Ext.baseCSSPrefix;return{reference:"element",className:"x-container",children:[{reference:"label",cls:a+"form-label",children:[{reference:"labelspan",tag:"span"}]},{reference:"innerElement",cls:a+"component-outer"}]}},updateLabel:function(b,d){var a=this.renderElement,c=Ext.baseCSSPrefix;if(b){this.labelspan.setHtml(b);a.addCls(c+"field-labeled")}else{a.removeCls(c+"field-labeled")}},updateLabelAlign:function(b,c){var a=this.renderElement,d=Ext.baseCSSPrefix;if(b){a.addCls(d+"label-align-"+b);if(b=="top"||b=="bottom"){this.label.setWidth("100%")}else{this.updateLabelWidth(this.getLabelWidth())}}if(c){a.removeCls(d+"label-align-"+c)}},updateLabelCls:function(a,b){if(a){this.label.addCls(a)}if(b){this.label.removeCls(b)}},updateLabelWidth:function(b){var a=this.getLabelAlign();if(b){if(a=="top"||a=="bottom"){this.label.setWidth("100%")}else{this.label.setWidth(b)}}},updateLabelWrap:function(b,c){var a=Ext.baseCSSPrefix+"form-label-nowrap";if(!b){this.addCls(a)}else{this.removeCls(a)}},updateRequired:function(a){this.renderElement[a?"addCls":"removeCls"](this.getRequiredCls())},updateRequiredCls:function(a,b){if(this.getRequired()){this.renderElement.replaceCls(b,a)}},initialize:function(){var a=this;a.callParent();a.doInitValue()},doInitValue:function(){this.originalValue=this.getInitialConfig().value},reset:function(){this.setValue(this.originalValue);return this},resetOriginalValue:function(){this.originalValue=this.getValue()},isDirty:function(){return false}},function(){});Ext.define("Ext.field.Text",{extend:Ext.field.Field,xtype:"textfield",alternateClassName:"Ext.form.Text",config:{ui:"text",clearIcon:true,placeHolder:null,maxLength:null,autoComplete:null,autoCapitalize:null,autoCorrect:null,readOnly:null,component:{xtype:"input",type:"text",fastFocus:true},bubbleEvents:["action"]},initialize:function(){var a=this;a.callParent();a.getComponent().on({scope:this,keyup:"onKeyUp",change:"onChange",focus:"onFocus",blur:"onBlur",paste:"onPaste",mousedown:"onMouseDown",clearicontap:"onClearIconTap"});a.originalValue=a.getValue()||"";a.getComponent().originalValue=a.originalValue;a.syncEmptyCls()},syncEmptyCls:function(){var b=(this._value)?this._value.length:false,a=Ext.baseCSSPrefix+"empty";if(b){this.removeCls(a)}else{this.addCls(a)}},updateValue:function(c){var b=this.getComponent(),a=c!==undefined&&c!==null&&c!=="";if(b){b.setValue(c)}this[a&&this.isDirty()?"showClearIcon":"hideClearIcon"]();this.syncEmptyCls()},getValue:function(){var a=this;a._value=a.getComponent().getValue();a.syncEmptyCls();return a._value},updatePlaceHolder:function(a){this.getComponent().setPlaceHolder(a)},updateMaxLength:function(a){this.getComponent().setMaxLength(a)},updateAutoComplete:function(a){this.getComponent().setAutoComplete(a)},updateAutoCapitalize:function(a){this.getComponent().setAutoCapitalize(a)},updateAutoCorrect:function(a){this.getComponent().setAutoCorrect(a)},updateReadOnly:function(a){if(a){this.hideClearIcon()}else{this.showClearIcon()}this.getComponent().setReadOnly(a)},updateInputType:function(a){var b=this.getComponent();if(b){b.setType(a)}},updateName:function(a){var b=this.getComponent();if(b){b.setName(a)}},updateTabIndex:function(b){var a=this.getComponent();if(a){a.setTabIndex(b)}},updateInputCls:function(a,b){var c=this.getComponent();if(c){c.replaceCls(b,a)}},doSetDisabled:function(b){var c=this;c.callParent(arguments);var a=c.getComponent();if(a){a.setDisabled(b)}if(b){c.hideClearIcon()}else{c.showClearIcon()}},showClearIcon:function(){var b=this,c=b.getValue(),a=c!==undefined&&c!==null&&c!=="";if(b.getClearIcon()&&!b.getDisabled()&&!b.getReadOnly()&&a){b.element.addCls(Ext.baseCSSPrefix+"field-clearable")}return b},hideClearIcon:function(){if(this.getClearIcon()){this.element.removeCls(Ext.baseCSSPrefix+"field-clearable")}},onKeyUp:function(a){this.fireAction("keyup",[this,a],"doKeyUp")},doKeyUp:function(b,d){var c=b.getValue(),a=c!==undefined&&c!==null&&c!=="";this[a?"showClearIcon":"hideClearIcon"]();if(d.browserEvent.keyCode===13){b.fireAction("action",[b,d],"doAction")}},doAction:function(){this.blur()},onClearIconTap:function(a,b){this.fireAction("clearicontap",[this,a,b],"doClearIconTap")},doClearIconTap:function(a,b){a.setValue("");a.getValue()},onChange:function(b,c,a){b.fireEvent("change",this,c,a)},onFocus:function(a){this.addCls(Ext.baseCSSPrefix+"field-focused");this.isFocused=true;this.fireEvent("focus",this,a)},onBlur:function(b){var a=this;this.removeCls(Ext.baseCSSPrefix+"field-focused");this.isFocused=false;a.fireEvent("blur",a,b);setTimeout(function(){a.isFocused=false},50)},onPaste:function(a){this.fireEvent("paste",this,a)},onMouseDown:function(a){this.fireEvent("mousedown",this,a)},focus:function(){this.getComponent().focus();return this},blur:function(){this.getComponent().blur();return this},select:function(){this.getComponent().select();return this},resetOriginalValue:function(){this.callParent();var a=this.getComponent();if(a&&a.hasOwnProperty("originalValue")){this.getComponent().originalValue=this.originalValue}this.reset()},reset:function(){this.getComponent().reset();this.getValue();this[this.isDirty()?"showClearIcon":"hideClearIcon"]()},isDirty:function(){var a=this.getComponent();if(a){return a.isDirty()}return false}});Ext.define("Ext.field.TextAreaInput",{extend:Ext.field.Input,xtype:"textareainput",tag:"textarea"});Ext.define("Ext.field.TextArea",{extend:Ext.field.Text,xtype:"textareafield",alternateClassName:"Ext.form.TextArea",config:{ui:"textarea",autoCapitalize:false,component:{xtype:"textareainput"},maxRows:null},updateMaxRows:function(a){this.getComponent().setMaxRows(a)},doSetHeight:function(a){this.callParent(arguments);var b=this.getComponent();b.input.setHeight(a)},doSetWidth:function(b){this.callParent(arguments);var a=this.getComponent();a.input.setWidth(b)},doKeyUp:function(a){var b=a.getValue();a[b?"showClearIcon":"hideClearIcon"]()}});Ext.define("Ext.MessageBox",{extend:Ext.Sheet,config:{ui:"dark",baseCls:Ext.baseCSSPrefix+"msgbox",iconCls:null,showAnimation:{type:"popIn",duration:250,easing:"ease-out"},hideAnimation:{type:"popOut",duration:250,easing:"ease-out"},zIndex:999,defaultTextHeight:75,title:null,buttons:null,message:null,prompt:null,modal:true,layout:{type:"vbox",pack:"center"}},platformConfig:[{theme:["Windows"],ui:"light",showAnimation:{type:"fadeIn"},hideAnimation:{type:"fadeOut"}},{theme:["Blackberry","Blackberry103"],ui:"plain"},{theme:["MoutainView"]}],statics:{OK:{text:"OK",itemId:"ok",ui:"action"},YES:{text:"Yes",itemId:"yes",ui:"action"},NO:{text:"No",itemId:"no"},CANCEL:{text:"Cancel",itemId:"cancel"},INFO:Ext.baseCSSPrefix+"msgbox-info",WARNING:Ext.baseCSSPrefix+"msgbox-warning",QUESTION:Ext.baseCSSPrefix+"msgbox-question",ERROR:Ext.baseCSSPrefix+"msgbox-error",OKCANCEL:[{text:"Cancel",itemId:"cancel"},{text:"OK",itemId:"ok",ui:"action"}],YESNOCANCEL:[{text:"Cancel",itemId:"cancel"},{text:"No",itemId:"no"},{text:"Yes",itemId:"yes",ui:"action"}],YESNO:[{text:"No",itemId:"no"},{text:"Yes",itemId:"yes",ui:"action"}]},constructor:function(a){a=a||{};if(a.hasOwnProperty("promptConfig")){Ext.applyIf(a,{prompt:a.promptConfig});delete a.promptConfig}if(a.hasOwnProperty("multiline")||a.hasOwnProperty("multiLine")){a.prompt=a.prompt||{};Ext.applyIf(a.prompt,{multiLine:a.multiline||a.multiLine});delete a.multiline;delete a.multiLine}this.defaultAllowedConfig={};var e=["ui","showAnimation","hideAnimation","title","message","prompt","iconCls","buttons","defaultTextHeight"],d=e.length,b,c;for(b=0;bthis.getMaxProgressInput()){c=this.getMaxProgressInput()}if(c=0){d[b]=h}b++;if(g){g.then(f,a)}else{c.fulfill.apply(c,d)}}f();return c},whenComplete:function(g){var f=new this,e=-1,h=[],c=[],i;function a(j){i=g.shift();c.push(j);d(i)}function b(j){i=g.shift();h.push(j);d(i)}function d(j){e++;if(j){j.then(b,a)}else{f.fulfill.call(f,{fulfilled:h,rejected:c})}}d(g.shift());return f},from:function(){var a=new this;a.completed=1;a.lastResults=arguments;return a},fail:function(a){var b=new this;b.completed=-1;b.lastReason=a;return b}},completed:0,getListeners:function(b){var a=this.listeners;if(!a&&b){this.listeners=a=[]}return a},then:function(b,c,a){if(typeof b=="function"){a=c;c=b;b=null}if(typeof c=="string"){c=b[c]}if(typeof a=="string"){a=b[a]}return this.doThen(b,c,a)},doThen:function(d,g,b){var e=Ext.Promise,c=this.completed,f,a;if(c===-1){if(b){b.call(d,this.lastReason)}return this}if(c===1&&!this.isFulfilling){if(!g){return this}a=g.apply(d,this.lastResults);if(a instanceof e){f=a}else{f=e.from(a)}}else{f=new e;f.$owner=this;this.getListeners(true).push({scope:d,success:g,error:b,promise:f})}return f},error:function(b,a){if(typeof b=="function"){a=b;b=null}if(typeof a=="string"){a=b[a]}return this.doThen(b,null,a)},fulfill:function(){var b=arguments,d,e,c,g,f,a;this.lastResults=b;this.completed=1;while(d=this.getListeners()){delete this.listeners;this.isFulfilling=true;while(e=d.shift()){g=e.success;c=e.scope;f=e.promise;delete f.$owner;if(g){a=g.apply(c,b);if(a instanceof Ext.Promise){a.connect(f)}else{f.fulfill(a)}}else{f.fulfill(b)}}this.isFulfilling=false}return this},connect:function(b){var a=this;a.then(b,function(c){this.fulfill(c);return c},"reject")},reject:function(d){var b=this.getListeners(),c,a,e;this.lastReason=d;this.completed=-1;if(b){delete this.listeners;while(c=b.shift()){a=c.error;e=c.promise;delete e.$owner;if(a){a.call(c.scope,d)}e.reject(d)}}return this},cancel:function(){var c=this.getListeners(),a=this.$owner,b,d,e;if(c){for(b=0,d=c.length;b button",scope:a,tap:"onButtonRelease"});a.onAfter({delegate:"> button",scope:a,hide:"onButtonHiddenChange",show:"onButtonHiddenChange"})},updateAllowMultiple:function(a){if(!this.initialized&&!this.getInitialConfig().hasOwnProperty("allowDepress")&&a){this.setAllowDepress(true)}},applyItems:function(){var e=this,f=[],d,b,c,a;e.callParent(arguments);a=this.getItems();d=a.length;for(b=0;b=0;c--){d=b.items[c];if(!d.isHidden()){d.addCls(g);break}}},applyPressedButtons:function(a){var e=this,f=[],c,d,b;if(e.getAllowToggle()){if(Ext.isArray(a)){d=a.length;for(b=0;b0)?"taphold":"tapstart";if(!this.disabled){this.enable()}},onStart:function(b,a){if(this.cancelSelector&&b.getTarget(this.cancelSelector)){return}if(this.handleSelector&&!b.getTarget(this.handleSelector)){return}if(!this.sorting){this.onSortStart(b,a)}},onSortStart:function(c,b){this.sorting=true;var a=Ext.create("Ext.util.Draggable",b,{threshold:0,revert:this.revert,direction:this.direction,constrain:this.constrain===true?this.el:this.constrain,animationDuration:100});a.on({drag:this.onDrag,dragend:this.onDragEnd,scope:this});this.dragEl=b;this.calculateBoxes();if(!a.dragging){a.onStart(c)}this.fireEvent("sortstart",this,c)},calculateBoxes:function(){this.items=[];var b=this.el.select(this.itemSelector,false),f=b.length,a,e,c,d;for(a=0;a(h.bottom-h.top)/2){if(h.bottom>k.top&&k.top>h.top){l.el.insertAfter(k.el)}else{l.el.insertBefore(k.el)}d=true}else{if(this.horizontal&&Math.abs(a.left-a.right)>(h.right-h.left)/2){if(h.right>k.left&&k.left>h.left){l.el.insertAfter(k.el)}else{l.el.insertBefore(k.el)}d=true}}if(d){l.reset();l.moveTo(h.left,h.top);this.calculateBoxes();this.fireEvent("sortchange",this,l.el,this.el.select(this.itemSelector,false).indexOf(l.el.dom));return}}}},onDragEnd:function(a,b){a.destroy();this.sorting=false;this.fireEvent("sortend",this,a,b)},enable:function(){this.el.on(this.startEventName,this.onStart,this,{delegate:this.itemSelector,holdThreshold:this.getDelay()});this.disabled=false},disable:function(){this.el.un(this.startEventName,this.onStart,this);this.disabled=true},isDisabled:function(){return this.disabled},isSorting:function(){return this.sorting},isVertical:function(){return this.vertical},isHorizontal:function(){return this.horizontal}});Ext.define("Ext.TitleBar",{extend:Ext.Container,xtype:"titlebar",isToolbar:true,config:{baseCls:Ext.baseCSSPrefix+"toolbar",cls:Ext.baseCSSPrefix+"navigation-bar",ui:"dark",title:null,titleAlign:"center",defaultType:"button",minHeight:null,layout:{type:"hbox"},items:[],maxButtonWidth:"40%"},platformConfig:[{theme:["Blackberry","Blackberry103","Tizen"],titleAlign:"left"},{theme:["Cupertino"],maxButtonWidth:"80%"}],hasCSSMinHeight:true,beforeInitialize:function(){this.applyItems=this.applyInitialItems},initialize:function(){delete this.applyItems;this.add(this.initialItems);delete this.initialItems;this.on({painted:"refreshTitlePosition",single:true})},applyInitialItems:function(a){var c=this,b=c.getTitleAlign(),d=c.getDefaults()||{};c.initialItems=a;c.leftBox=c.add({xtype:"container",style:"position: relative",layout:{type:"hbox",align:"center"},listeners:{resize:"refreshTitlePosition",scope:c}});c.spacer=c.add({xtype:"component",style:"position: relative",flex:1,listeners:{resize:"refreshTitlePosition",scope:c}});c.rightBox=c.add({xtype:"container",style:"position: relative",layout:{type:"hbox",align:"center"},listeners:{resize:"refreshTitlePosition",scope:c}});switch(b){case"left":c.titleComponent=c.leftBox.add({xtype:"title",cls:Ext.baseCSSPrefix+"title-align-left",hidden:d.hidden});c.refreshTitlePosition=Ext.emptyFn;break;case"right":c.titleComponent=c.rightBox.add({xtype:"title",cls:Ext.baseCSSPrefix+"title-align-right",hidden:d.hidden});c.refreshTitlePosition=Ext.emptyFn;break;default:c.titleComponent=c.add({xtype:"title",hidden:d.hidden,centered:true});break}c.doAdd=c.doBoxAdd;c.remove=c.doBoxRemove;c.doInsert=c.doBoxInsert},doBoxAdd:function(a){if(a.config.align=="right"){this.rightBox.add(a)}else{this.leftBox.add(a)}},doBoxRemove:function(b,a){if(b.config.align=="right"){this.rightBox.remove(b,a)}else{this.leftBox.remove(b,a)}},doBoxInsert:function(a,b){if(b.config.align=="right"){this.rightBox.insert(a,b)}else{this.leftBox.insert(a,b)}},calculateMaxButtonWidth:function(){var a=this.getMaxButtonWidth();if(Ext.isString(a)){a=parseInt(a.replace("%",""),10)}a=Math.round((this.element.getWidth()/100)*a);return a},refreshTitlePosition:function(){if(this.isDestroyed){return}var g=this.titleComponent.renderElement;g.setWidth(null);g.setLeft(null);var b=this.leftBox,d=b.down("button"),a=b.getItems().getCount()==1,i,n;if(d&&a){if(d.getWidth()==null){d.renderElement.setWidth("auto")}i=b.renderElement.getWidth();n=this.calculateMaxButtonWidth();if(i>n){d.renderElement.setWidth(n)}}var k=this.spacer.renderElement.getPageBox();if(Ext.browser.is.IE){g.setWidth(k.width)}var l=g.getPageBox(),h=l.width-k.width,e=l.left,j=l.right,c,m,f;if(h>0){c=h/2;e+=c;j-=c;g.setWidth(k.width)}m=k.left-e;f=j-k.right;if(m>0){g.setLeft(m)}else{if(f>0){g.setLeft(-f)}}g.repaint()},updateTitle:function(a){this.titleComponent.setTitle(a);if(this.isPainted()){this.refreshTitlePosition()}}});Ext.define("Ext.Toast",{extend:Ext.Sheet,config:{ui:"dark",baseCls:Ext.baseCSSPrefix+"toast",showAnimation:{type:"popIn",duration:250,easing:"ease-out"},hideAnimation:{type:"popOut",duration:250,easing:"ease-out"},zIndex:999,message:null,timeout:1000,messageAnimation:true,hideOnMaskTap:true,modal:true,layout:{type:"vbox",pack:"center"}},applyMessage:function(a){a={html:a,cls:this.getBaseCls()+"-text"};return Ext.factory(a,Ext.Component,this._message)},updateMessage:function(a){if(a){this.add(a)}},applyTimeout:function(a){if(this._timeoutID){clearTimeout(this._timeoutID);if(!Ext.isEmpty(a)){this._timeoutID=setTimeout(Ext.bind(this.onTimeout,this),a)}}return a},next:Ext.emptyFn,show:function(a){var c=this,d=a.timeout,e=c.getMessageAnimation(),b=c.getMessage();if(c.isRendered()&&c.isHidden()===false){a.timeout=null;b.onAfter({hiddenchange:function(){c.setMessage(a.message);b=c.getMessage();b.onAfter({hiddenchange:function(){this._timeoutID=true;c.setTimeout(d)},scope:c,single:true});b.show(e)},scope:c,single:true});b.hide(e)}else{Ext.util.InputBlocker.blockInputs();c.setConfig(a);if(!c.getParent()&&Ext.Viewport){Ext.Viewport.add(c)}if(!Ext.isEmpty(d)){c._timeoutID=setTimeout(Ext.bind(c.onTimeout,c),d)}c.callParent(arguments)}},hide:function(a){clearTimeout(this._timeoutID);if(!this.next()){this.callParent(arguments)}},onTimeout:function(){this.hide()}},function(d){var c=[],e=false;function a(){var f=c.shift();if(f){e=true;this.show(f)}else{e=false}return e}function b(){if(!Ext.Toast._instance){Ext.Toast._instance=Ext.create("Ext.Toast");Ext.Toast._instance.next=a}return Ext.Toast._instance}Ext.toast=function(h,i){var f=b(),g=h;if(Ext.isString(h)){g={message:h,timeout:i}}if(g.timeout===undefined){g.timeout=Ext.Toast.prototype.config.timeout}c.push(g);if(!e){f.next()}return f}});Ext.define("Ext.Video",{extend:Ext.Media,xtype:"video",config:{posterUrl:null,baseCls:Ext.baseCSSPrefix+"video",controls:true},template:[{reference:"ghost",classList:[Ext.baseCSSPrefix+"video-ghost"]},{tag:"video",reference:"media",classList:[Ext.baseCSSPrefix+"media"]}],initialize:function(){var a=this;a.callParent();a.media.hide();a.onBefore({erased:"onErased",scope:a});a.ghost.on({tap:"onGhostTap",scope:a});a.media.on({pause:"onPause",scope:a});if(Ext.os.is.Android4||Ext.os.is.iPad){this.isInlineVideo=true}},applyUrl:function(a){return[].concat(a)},updateUrl:function(f){var c=this,e=c.media,g=f.length,d=e.query("source"),b=d.length,a;for(a=0;a=1){g+=j.cssText}}a=g.match(/[0-9]+s/g);for(e in a){b=parseInt(a[e]);if(b>c){c=b}}if(this.$themeVariationChangeTimeout){clearTimeout(this.$themeVariationChangeTimeout);this.$themeVariationChangeTimeout=null}this.$themeVariationChangeTimeout=Ext.defer(function(){f.removeCls(k)},b*1000)}f.removeCls(d+l);f.addCls(d+h)}},function(){});Ext.define("Ext.carousel.Item",{extend:Ext.Decorator,config:{baseCls:"x-carousel-item",component:null,translatable:true}});Ext.define("Ext.carousel.Indicator",{extend:Ext.Component,xtype:"carouselindicator",alternateClassName:"Ext.Carousel.Indicator",config:{baseCls:Ext.baseCSSPrefix+"carousel-indicator",direction:"horizontal"},initialize:function(){this.callParent();this.indicators=[];this.element.on({tap:"onTap",scope:this})},updateDirection:function(a,c){var b=this.getBaseCls();this.element.replaceCls(c,a,b);if(a==="horizontal"){this.setBottom(0);this.setRight(null)}else{this.setRight(0);this.setBottom(null)}},addIndicator:function(){this.indicators.push(this.element.createChild({tag:"span"}))},removeIndicator:function(){var a=this.indicators;if(a.length>0){a.pop().destroy()}},setActiveIndex:function(b){var e=this.indicators,d=this.activeIndex,a=e[d],f=e[b],c=this.getBaseCls();if(a){a.removeCls(c,null,"active")}if(f){f.addCls(c,null,"active")}this.activeIndex=b;return this},onTap:function(f){var g=f.touch,a=this.element.getPageBox(),d=a.left+(a.width/2),b=a.top+(a.height/2),c=this.getDirection();if((c==="horizontal"&&g.pageX>=d)||(c==="vertical"&&g.pageY>=b)){this.fireEvent("next",this)}else{this.fireEvent("previous",this)}},destroy:function(){var d=this.indicators,b,c,a;for(b=0,c=d.length;b=a-c&&b<=a+c)},getTranslatable:function(){var a=this.translatable;if(!a){this.translatable=a=new Ext.util.TranslatableGroup;a.setItems(this.orderedCarouselItems);a.on("animationend","onAnimationEnd",this)}return a},onDragStart:function(f){var d=this.getDirection(),b=f.absDeltaX,a=f.absDeltaY,c=this.getDirectionLock();this.isDragging=true;if(c){if((d==="horizontal"&&b>a)||(d==="vertical"&&a>b)){f.stopPropagation()}else{this.isDragging=false;return}}this.getTranslatable().stopAnimation();this.dragStartOffset=this.offset;this.dragDirection=0},onDrag:function(j){if(!this.isDragging){return}var k=this.dragStartOffset,l=this.getDirection(),m=l==="horizontal"?j.deltaX:j.deltaY,a=this.offset,i=this.flickStartTime,c=this.dragDirection,b=Ext.Date.now(),h=this.getActiveIndex(),f=this.getMaxItemIndex(),d=c,g;if((h===0&&m>0)||(h===f&&m<0)){m*=0.5}g=k+m;if(g>a){c=1}else{if(g300){this.flickStartOffset=a;this.flickStartTime=b}this.dragDirection=c;this.setOffset(g)},onDragEnd:function(j){if(!this.isDragging){return}this.onDrag(j);this.isDragging=false;var a=Ext.Date.now(),i=this.itemLength,g=i/2,f=this.offset,m=this.getActiveIndex(),c=this.getMaxItemIndex(),h=0,l=f-this.flickStartOffset,b=a-this.flickStartTime,k=this.getIndicator(),d;if(b>0&&Math.abs(l)>=10){d=l/b;if(Math.abs(d)>=1){if(d<0&&m0&&m>0){h=1}}}}if(h===0){if(m0&&f>g){h=1}}}if(k){k.setActiveIndex(m-h)}this.animationDirection=h;this.setOffsetAnimated(h*i)},applyAnimation:function(a){a.easing=Ext.factory(a.easing,Ext.fx.easing.EaseOut);return a},updateDirection:function(b){var a=this.getIndicator();this.currentAxis=(b==="horizontal")?"x":"y";if(a){a.setDirection(b)}},setOffset:function(a){this.offset=a;if(Ext.isNumber(this.itemOffset)){this.getTranslatable().translateAxis(this.currentAxis,a+this.itemOffset)}return this},setOffsetAnimated:function(b){var a=this.getIndicator();if(a){a.setActiveIndex(this.getActiveIndex()-this.animationDirection)}this.offset=b;this.getTranslatable().translateAxis(this.currentAxis,b+this.itemOffset,this.getAnimation());return this},onAnimationEnd:function(b){var c=this.getActiveIndex(),a=this.animationDirection,e=this.currentAxis,f=b[e],d=this.itemLength,g;if(a===-1){g=d+f}else{if(a===1){g=f-d}else{g=f}}g-=this.itemOffset;this.offset=g;this.setActiveItem(c-a)},refresh:function(){this.refreshSizing();this.refreshActiveItem()},refreshSizing:function(){var a=this.element,b=this.getItemLength(),e={x:0,y:0},c,d;if(this.getDirection()==="horizontal"){d=a.getWidth()}else{d=a.getHeight()}this.hiddenTranslation=-d;if(b===null){b=d;c=0}else{c=(d-b)/2}this.itemLength=b;this.itemOffset=c;e[this.currentAxis]=b;this.getTranslatable().setItemLength(e)},refreshOffset:function(){this.setOffset(this.offset)},refreshActiveItem:function(){this.doSetActiveItem(this.getActiveItem())},getActiveIndex:function(){return this.activeIndex},refreshActiveIndex:function(){this.activeIndex=this.getInnerItemIndex(this.getActiveItem())},refreshCarouselItems:function(){var a=this.carouselItems,b,d,c;for(b=0,d=a.length;b0){for(f=1;f<=c;f++){h=q-f;if(h>=0){a=this.getInnerItemAt(h);b=a.getId();o[b]=a;p[b]=c-f}else{break}}}if(qb){this.setActiveItem(b)}else{this.rebuildInnerIndexes(a);this.refreshActiveItem()}}},rebuildInnerIndexes:function(n){var c=this.innerIndexToItem,g=this.innerIdToIndex,j=this.innerItems.slice(),h=j.length,b=this.getBufferSize(),d=this.getMaxItemIndex(),l=[],e,k,f,a,m;if(n===undefined){this.innerIndexToItem=c={};this.innerIdToIndex=g={};for(e=0;e=0&&e<=d){if(c.hasOwnProperty(e)){Ext.Array.remove(j,c[e]);continue}l.push(e)}}for(e=0,h=l.length;eMath.min(b.x+b.width,a.x+a.width))||(Math.max(b.y,a.y)-c>Math.min(b.y+b.height,a.y+a.height))},spline:function(m){var e,c,k=m.length,b,h,l,f,a=0,g=new Float32Array(m.length),n=new Float32Array(m.length*3-2);g[0]=0;g[k-1]=0;for(e=1;e0;e--){a=3.732050807568877+48.248711305964385/(-13.928203230275537+Math.pow(0.07179676972449123,e));g[e]-=g[e+1]*a}f=m[0];b=f-g[0];for(e=0,c=0;e=d&&h>=s)||(h<=d&&h<=s)){g=j=p}else{g=f((i-e)/k(h-d));if(dp){c-=n}g+=c;j+=c;m=i-r*a(g);l=h+r*b(g);v=i+q*a(j);u=h+q*b(j);if((h>d&&ld)){m+=k(d-l)*(m-i)/(l-h);l=d}if((h>s&&us)){v-=k(s-u)*(v-i)/(u-h);u=s}return{x1:m,y1:l,x2:v,y2:u}},smooth:function(l,j,o){var k=l.length,h,g,c,b,q,p,n,m,f=[],e=[],d,a;for(d=0;d=360){e-=360}}if(i){i[0]=e;i[1]=o;i[2]=c}else{i=[e,o,c]}return i},setHSL:function(g,f,e){var j,d,b,a=Math.abs,i=Math.floor;g=(g%360+360)%360;f=f>1?1:f<0?0:f;e=e>1?1:e<0?0:e;if(f===0||g===null){e*=255;this.setRGB(e,e,e)}else{g/=60;j=f*(1-a(2*e-1));d=j*(1-a(g-2*i(g/2)-1));b=e-j/2;b*=255;j*=255;d*=255;switch(i(g)){case 0:this.setRGB(j+b,d+b,b);break;case 1:this.setRGB(d+b,j+b,b);break;case 2:this.setRGB(b,j+b,d+b);break;case 3:this.setRGB(b,d+b,j+b);break;case 4:this.setRGB(d+b,b,j+b);break;case 5:this.setRGB(j+b,b,d+b);break}}return this},createLighter:function(b){var a=this.getHSL();b=b||this.lightnessFactor;a[2]=a[2]+b;if(a[2]>1){a[2]=1}else{if(a[2]<0){a[2]=0}}return Ext.draw.Color.fromHSL(a[0],a[1],a[2])},createDarker:function(a){a=a||this.lightnessFactor;return this.createLighter(-a)},toString:function(){if(this.a===1){var f=this,c=Math.round,e=c(f.r).toString(16),d=c(f.g).toString(16),a=c(f.b).toString(16);e=(e.length===1)?"0"+e:e;d=(d.length===1)?"0"+d:d;a=(a.length===1)?"0"+a:a;return["#",e,d,a].join("")}else{return"rgba("+[Math.round(this.r),Math.round(this.g),Math.round(this.b),this.a.toFixed(15)].join(",")+")"}},toHex:function(b){if(Ext.isArray(b)){b=b[0]}if(!Ext.isString(b)){return""}if(b.substr(0,1)==="#"){return b}var e=Ext.draw.Color.colorToHexRe.exec(b);if(Ext.isArray(e)){var f=parseInt(e[2],10),d=parseInt(e[3],10),a=parseInt(e[4],10),c=a|(d<<8)|(f<<16);return e[1]+"#"+("000000"+c.toString(16)).slice(-6)}else{return""}},setFromString:function(j){var e,h,f,c,d=1,i=parseInt;if(j==="none"){this.r=this.g=this.b=this.a=0;return this}if((j.length===4||j.length===7)&&j.substr(0,1)==="#"){e=j.match(Ext.draw.Color.hexRe);if(e){h=i(e[1],16)>>0;f=i(e[2],16)>>0;c=i(e[3],16)>>0;if(j.length===4){h+=(h*16);f+=(f*16);c+=(c*16)}}}else{if((e=j.match(Ext.draw.Color.rgbToHexRe))){h=+e[1];f=+e[2];c=+e[3]}else{if((e=j.match(Ext.draw.Color.rgbaToHexRe))){h=+e[1];f=+e[2];c=+e[3];d=+e[4]}else{if(Ext.draw.Color.ColorList.hasOwnProperty(j.toLowerCase())){return this.setFromString(Ext.draw.Color.ColorList[j.toLowerCase()])}}}}if(typeof h==="undefined"){return this}this.r=h;this.g=f;this.b=c;this.a=d;return this}},function(){var a=new this();this.addStatics({fly:function(f,e,c,d){switch(arguments.length){case 1:a.setFromString(f);break;case 3:case 4:a.setRGB(f,e,c,d);break;default:return null}return a},ColorList:{aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4","indianred ":"#cd5c5c","indigo ":"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},fromHSL:function(d,c,b){return(new this(0,0,0,0)).setHSL(d,c,b)},fromString:function(b){return(new this(0,0,0,0)).setFromString(b)},create:function(b){if(b instanceof this){return b}else{if(Ext.isArray(b)){return new Ext.draw.Color(b[0],b[1],b[2],b[3])}else{if(Ext.isString(b)){return Ext.draw.Color.fromString(b)}else{if(arguments.length>2){return new Ext.draw.Color(arguments[0],arguments[1],arguments[2],arguments[3])}else{return new Ext.draw.Color(0,0,0,0)}}}}}})})})();Ext.define("Ext.draw.gradient.GradientDefinition",{singleton:true,urlStringRe:/^url\(#([\w\-]+)\)$/,gradients:{},add:function(a){var b=this.gradients,c,e,d;for(c=0,e=a.length;cMath.PI){a-=Math.PI*2}return a}},data:function(a){if(Ext.isArray(a)){return a.slice()}else{if(a instanceof Float32Array){return new Float32Array(a)}}},bool:function(a){return !!a},color:function(a){if(a instanceof Ext.draw.Color){return a.toString()}else{if(a instanceof Ext.draw.gradient.Gradient){return a}else{if(!a){return"none"}else{if(Ext.isString(a)){a=Ext.draw.gradient.GradientDefinition.get(a);if(Ext.isString(a)){return a}}}}}if(a.type==="linear"){return Ext.create("Ext.draw.gradient.Linear",a)}else{if(a.type==="radial"){return Ext.create("Ext.draw.gradient.Radial",a)}else{if(a.type==="pattern"){return Ext.create("Ext.draw.gradient.Pattern",a)}}}},limited:function(a,b){return(function(c){return isNaN(c)?undefined:Math.min(Math.max(+c,a),b)})},limited01:function(a){return isNaN(a)?undefined:Math.min(Math.max(+a,0),1)},enums:function(){var d={},a=Array.prototype.slice.call(arguments,0),b,c;for(b=0,c=a.length;bMath.PI){b-=Math.PI*2}else{if(b-c<-Math.PI){b+=Math.PI*2}}return[c,b]},compute:function(d,c,b){if(!Ext.isNumber(d)||!Ext.isNumber(c)){return c||d}else{return a(d,c,b)}}},path:{parseInitial:function(m,n){var c=m.toStripes(),o=n.toStripes(),e,d,k=c.length,p=o.length,h,f,b,g=o[p-1],l=[g[g.length-2],g[g.length-1]];for(e=k;e=1){return l.path}var e=0,f=c.length,d=0,b,k,h,n=l.temp.coords,g=0;for(;e=(7-4*l)/11){o=i*i-f((11-6*l-11*q)/4,2);break}}return o},elastic:function(l,i){return f(2,10*--l)*m(20*l*e*(i||1)/3)}};n=function(l,i){i=i&&i.length?i:[i];return Ext.apply(l,{easeIn:function(o){return l(o,i)},easeOut:function(o){return 1-l(1-o,i)},easeInOut:function(o){return(o<=0.5)?l(2*o,i)/2:(2-l(2*(1-o),i))/2}})};h=function(i){return function(l){return f(l,i)}};for(d=0,b=a.length;d-1},empty:function(){return this.animations.length===0},step:function(d){var c=this,f=c.animations,e,a=0,b=f.length;for(;a0},applyEasing:function(a){if(typeof a==="string"){return Ext.draw.TimingFunctions.easingMap[a]}else{return a}},applyCustomEasings:function(c,g){g=g||{};var a,b,f,d,e;for(a in c){f=c[a];b=a.split(",");if(typeof f==="string"){f=Ext.draw.TimingFunctions.easingMap[f]}for(d=0,e=b.length;d=1){h[a]=d[a];delete d[a];delete e[a]}else{h[a]=b.serve(b.compute(b.source,b.target,b.easing(i),g[a]));f=true}}g.lastUpdate=c;this.setAnimating(g,f);return h},pushDown:function(a,b){b=Ext.draw.modifier.Modifier.prototype.pushDown.call(this,a.animationOriginal,b);return this.setAttrs(a,b)},popUp:function(a,b){a=a.upperLevel;b=this.setAttrs(a,b);if(this._next){return this._next.popUp(a,b)}else{return Ext.apply(a,b)}},step:function(){var g=this,d=g.animatingPool.slice(),a,c,f;for(c=0,f=d.length;c0){return h(e(i)/3)}else{if(i<0){return -h(e(-i)/3)}else{return 0}}},linearFunction:function(k,j){var i;if(k===0){i=function(l){return j};i.solve=function(l){return[]}}else{i=function(l){return k*l+j};i.solve=function(l){return[(l-j)/k]}}return i},quadraticFunction:function(k,j,p){var i;if(k===0){return this.linearFunction(j,p)}else{i=function(q){return(k*q+j)*q+p};var o=j*j-4*k*p,n=function(q){return o+4*k*q},m=1/k*0.5,l=-m*j;m=a(m);i.solve=function(r){var q=n(r);if(q<0){return[]}q=f(q);return[l-q*m,l+q*m]}}return i},cubicFunction:function(s,r,p,o){var v;if(s===0){return this.quadraticFunction(r,p,o)}else{v=function(w){return((s*w+r)*w+p)*w+o};var m=r/s/3,i=p/s,l=o/s,q=m*m,u=(m*i-l)*0.5-m*q,t=q-i/3,k=t*t*t;if(t===0){v.solve=function(w){return[-m+this.cubicRoot(u*2+w/s)]}}else{if(t>0){var j=f(t),n=j*j*j;j+=j}v.solve=function(E){E/=s;var A=u+E*0.5,C=A*A-k;if(C>0){C=f(C);return[-m+this.cubicRoot(A+C)+this.cubicRoot(A-C)]}else{if(C===0){var D=this.cubicRoot(A),F=-m-D;if(A>=0){return[F,F,-m+2*D]}else{return[-m+2*D,F,F]}}else{var B=c(A/n)/3,z=j*g(B)-m,x=j*g(B+b)-m,w=j*g(B-b)-m;if(z0){if(s=Math.PI*2){n.ellipse(g,f,c,a,q,m,m+Math.PI,e);n.ellipse(g,f,c,a,q,m+Math.PI,d,e);return}if(!e){if(d=m){s.push(j+u*b+i,h+t*b+f,j*b+u+i,h*b+t+f,u+i,t+f);r+=6;v-=m;C=j;j=u;u=-C;C=h;h=t;t=-C}if(v){g=(0.3294738052815987+0.012120855841304373*v)*v;A=Math.cos(v);a=Math.sin(v);B=A+g*a;c=a-g*A;s.push(j+u*g+i,h+t*g+f,j*B+u*c+i,h*B+t*c+f,j*A+u*a+i,h*A+t*a+f);r+=6}return r},arcSvg:function(j,h,r,m,w,t,c){if(j<0){j=-j}if(h<0){h=-h}var x=this,u=x.cursor[0],f=x.cursor[1],a=(u-t)/2,y=(f-c)/2,d=Math.cos(r),s=Math.sin(r),o=a*d+y*s,v=-a*s+y*d,i=o/j,g=v/h,p=i*i+g*g,e=(u+t)*0.5,b=(f+c)*0.5,l=0,k=0;if(p>=1){p=Math.sqrt(p);j*=p;h*=p}else{p=Math.sqrt(1/p-1);if(m===w){p=-p}l=p*j*g;k=-p*h*i;e+=d*l-s*k;b+=s*l+d*k}var q=Math.atan2((v-k)/h,(o-l)/j),n=Math.atan2((-v-k)/h,(-o-l)/j)-q;if(w){if(n<=0){n+=Math.PI*2}}else{if(n>=0){n-=Math.PI*2}}x.ellipse(e,b,j,h,r,q,q+n,1-w)},fromSvgString:function(e){if(!e){return}var m=this,h,l={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0,A:7,C:6,H:1,L:2,M:2,Q:4,S:4,T:2,V:1,Z:0},k="",g,f,c=0,b=0,d=false,j,n,a;if(Ext.isString(e)){h=e.replace(Ext.draw.Path.pathRe," $1 ").replace(Ext.draw.Path.pathRe2," -").split(Ext.draw.Path.pathSplitRe)}else{if(Ext.isArray(e)){h=e.join(",").split(Ext.draw.Path.pathSplitRe)}}for(j=0,n=0;j=0){q=Math.sqrt(q);o=(q-g)/2/i;if(00){o-=q/i;if(0k.x){b=k.x}if(hk.y){f=k.y}if(a0&&m>0){a=(Math.sqrt(f*f+m*m)*Math.abs(Math.cos(c-Math.atan(f/m))))/2;k=q.createLinearGradient(d+p*a,b+j*a,d-p*a,b-j*a);for(e=0;e0){a[--b].destroy()}}else{while(b>0){a[--b].setParent(null)}}a.length=0;this.map={};this.dirtyZIndex=true},applyItems:function(a){if(this.getItems()){this.removeAll(true)}return Ext.Array.from(this.add(a))},prepareItems:function(a){a=[].concat(a);var g=this,f,c,e,b,d=function(h){this.remove(h,false)};for(c=0,e=a.length;ck.x){c=k.x}if(hk.y){g=k.y}if(a0){this.pendingRenderFrame=true;return}var f=this,g=this.getRegion(),c=f.getBackground(),a=f.getItems(),e,b,d;if(!g){return}f.orderByZIndex();if(f.getDirty()){f.clear();f.clearTransform();if(c){f.renderSprite(c)}for(b=0,d=a.length;bthis.position){this.removeElement(c[c.length-1])}for(a=0;athis.position){Ext.fly(a[a.length-1]).destroy()}return"url(#"+this.element.getId()+")"},destroy:function(){var b=this.statics().map,a=this.element;if(a){delete b[a.dom.id];a.destroy()}this.callSuper()}});Ext.define("Ext.draw.engine.Svg",{extend:Ext.draw.Surface,statics:{BBoxTextCache:{}},config:{highPrecision:false},getElementConfig:function(){return{reference:"element",style:{position:"absolute"},children:[{reference:"innerElement",style:{width:"100%",height:"100%",position:"relative"},children:[{tag:"svg",reference:"svgElement",namespace:"http://www.w3.org/2000/svg",version:1.1,cls:"x-surface"}]}]}},constructor:function(a){var b=this;b.callSuper([a]);b.mainGroup=b.createSvgNode("g");b.defElement=b.createSvgNode("defs");b.svgElement.appendChild(b.mainGroup);b.svgElement.appendChild(b.defElement);b.ctx=new Ext.draw.engine.SvgContext(b)},createSvgNode:function(a){var b=document.createElementNS("http://www.w3.org/2000/svg",a);return Ext.get(b)},getSvgElement:function(d,b,a){var c;if(d.dom.childNodes.length>a){c=d.dom.childNodes[a];if(c.tagName===b){return Ext.get(c)}else{Ext.destroy(c)}}c=Ext.get(this.createSvgNode(b));if(a===0){d.insertFirst(c)}else{c.insertAfter(Ext.fly(d.dom.childNodes[a-1]))}c.cache={};return c},setElementAttributes:function(d,b){var f=d.dom,a=d.cache,c,e;for(c in b){e=b[c];if(a[c]!==e){a[c]=e;f.setAttribute(c,e)}}},getNextDef:function(a){return this.getSvgElement(this.defElement,a,this.defPosition++)},clearTransform:function(){var a=this;a.mainGroup.set({transform:a.matrix.toSvg()})},clear:function(){this.ctx.clear();this.defPosition=0},renderSprite:function(b){var c=this,d=c.getRegion(),a=c.ctx;if(b.attr.hidden||b.attr.opacity===0){a.save();a.restore();return}try{b.element=a.save();b.preRender(this);b.useAttributes(a,d);if(false===b.render(this,a,[0,0,d[2],d[3]])){return false}b.setDirty(false)}finally{a.restore()}},destroy:function(c,a,d){var b=this;b.ctx.destroy();b.mainGroup.destroy();delete b.mainGroup;delete b.ctx;b.callSuper(arguments)},remove:function(a,b){if(a&&a.element){if(this.ctx){this.ctx.removeElement(a.element)}else{a.element.destroy()}a.element=null}this.callSuper(arguments)}});Ext.define("Ext.draw.engine.Canvas",{extend:Ext.draw.Surface,config:{highPrecision:false},statics:{contextOverrides:{setGradientBBox:function(a){this.bbox=a},fill:function(){var c=this.fillStyle,a=this.fillGradient,b=this.fillOpacity,d="rgba(0, 0, 0, 0)",e="rgba(0, 0, 0, 0.0)",g=this.bbox,f=this.globalAlpha;if(c!==d&&c!==e&&b!==0){if(a&&g){this.fillStyle=a.generateGradient(this,g)}if(b!==1){this.globalAlpha=f*b}this.$fill();if(b!==1){this.globalAlpha=f}if(a&&g){this.fillStyle=c}}},stroke:function(){var g=this.strokeStyle,e=this.strokeGradient,b=this.strokeOpacity,a="rgba(0, 0, 0, 0)",c="rgba(0, 0, 0, 0.0)",f=this.bbox,d=this.globalAlpha;if(g!==a&&g!==c&&b!==0){if(e&&f){this.strokeStyle=e.generateGradient(this,f)}if(b!==1){this.globalAlpha=d*b}this.$stroke();if(b!==1){this.globalAlpha=d}if(e&&f){this.strokeStyle=g}}},fillStroke:function(e,g){var k=this,j=this.fillStyle,i=this.fillOpacity,h=this.strokeStyle,d=this.strokeOpacity,c=k.shadowColor,b=k.shadowBlur,a="rgba(0, 0, 0, 0)",f="rgba(0, 0, 0, 0.0)";if(g===undefined){g=e.transformFillStroke}if(!g){e.inverseMatrix.toContext(k)}if(j!==a&&j!==f&&i!==0){k.fill();k.shadowColor="rgba(0,0,0,0)";k.shadowBlur=0}if(h!==a&&h!==f&&d!==0){k.stroke()}k.shadowColor=c;k.shadowBlur=b},ellipse:function(g,e,c,a,j,b,f,d){var i=Math.cos(j),h=Math.sin(j);this.transform(i*c,h*c,-h*a,i*a,g,e);this.arc(0,0,1,b,f,d);this.transform(i/c,-h/a,h/c,i/a,-(i*g+h*e)/c,(h*g-i*e)/a)},appendPath:function(g){var e=this,c=0,a=0,b=g.types,f=g.coords,d=g.types.length;e.beginPath();for(;c=m.canvases.length){m.createCanvas()}e=m.canvases[f].dom;e.style.left=g+"px";if(j*u!==e.height){e.height=j*u;e.style.height=j+"px"}d=Math.min(p,s-g);if(d*u!==e.width){e.width=d*u;e.style.width=d+"px"}m.applyDefaults(m.contexts[f])}for(;fm||o.x+o.widtha||o.y+o.heightSencha Touch GPLv3'},config:{cls:"x-draw-component",autoSize:false,viewBox:false,fitSurface:true,resizeHandler:null,background:null,sprites:null,gradients:[]},constructor:function(a){a=a||{};this.callSuper(arguments);this.frameCallbackId=Ext.draw.Animator.addFrameCallback("renderFrame",this)},applyGradients:function(b){var a=[],c,f,d,e;if(!Ext.isArray(b)){return a}for(c=0,f=b.length;cMath.PI){n-=Math.PI*2}if(k){n=n*(1-d)-Math.PI/2*d;j=c;c=m;m=j}else{n=n*(1-d)}h.rotationRads=n;h.x=g*(1-d)+b*d;h.y=f*(1-d)+a*d;p=b-g;o=a-f;if(Math.abs(o*c)>Math.abs(m*p)){if(o>0){h.calloutEndX=h.x-(m/(o*2)*p)*d;h.calloutEndY=h.y-m/2*d}else{h.calloutEndX=h.x+(m/(o*2)*p)*d;h.calloutEndY=h.y+m/2*d}}else{if(p>0){h.calloutEndX=h.x-c/2;h.calloutEndY=h.y-(c/(p*2)*o)*d}else{h.calloutEndX=h.x+c/2;h.calloutEndY=h.y+(c/(p*2)*o)*d}}}return h},pushDown:function(a,b){b=Ext.draw.modifier.Modifier.prototype.pushDown.call(this,a.calloutOriginal,b);return this.setAttrs(a,b)},popUp:function(a,b){a=Object.getPrototypeOf(a);b=this.setAttrs(a,b);if(this._next){return this._next.popUp(a,b)}else{return Ext.apply(a,b)}}});Ext.define("Ext.chart.label.Label",{extend:Ext.draw.sprite.Text,inheritableStatics:{def:{processors:{callout:"limited01",calloutPlaceX:"number",calloutPlaceY:"number",calloutStartX:"number",calloutStartY:"number",calloutEndX:"number",calloutEndY:"number",calloutColor:"color",calloutVertical:"bool",labelOverflowPadding:"number",display:"enums(none,under,over,rotate,insideStart,insideEnd,outside)",orientation:"enums(horizontal,vertical)",renderer:"default"},defaults:{callout:0,calloutPlaceX:0,calloutPlaceY:0,calloutStartX:0,calloutStartY:0,calloutEndX:0,calloutEndY:0,calloutVertical:false,calloutColor:"black",labelOverflowPadding:5,display:"none",orientation:"",renderer:null},dirtyTriggers:{callout:"transform",calloutPlaceX:"transform",calloutPlaceY:"transform",labelOverflowPadding:"transform",calloutRotation:"transform",display:"hidden"},updaters:{hidden:function(a){a.hidden=a.display==="none"}}}},config:{fx:{customDuration:{callout:200}},field:null},prepareModifiers:function(){this.callSuper(arguments);this.calloutModifier=new Ext.chart.label.Callout({sprite:this});this.fx.setNext(this.calloutModifier);this.calloutModifier.setNext(this.topModifier)},render:function(b,c,d){var e=this,a=e.attr;c.save();c.globalAlpha*=Math.max(0,a.callout-0.5)*2;if(c.globalAlpha>0){c.strokeStyle=a.calloutColor;c.fillStyle=a.calloutColor;c.beginPath();c.moveTo(e.attr.calloutStartX,e.attr.calloutStartY);c.lineTo(e.attr.calloutEndX,e.attr.calloutEndY);c.stroke();c.beginPath();c.arc(e.attr.calloutStartX,e.attr.calloutStartY,1,0,2*Math.PI,true);c.fill();c.beginPath();c.arc(e.attr.calloutEndX,e.attr.calloutEndY,1,0,2*Math.PI,true);c.fill()}c.restore();Ext.draw.sprite.Text.prototype.render.apply(e,arguments)}});Ext.define("Ext.chart.series.Series",{mixins:{observable:Ext.mixin.Observable},type:null,seriesType:"sprite",identifiablePrefix:"ext-line-",observableType:"series",config:{chart:null,title:null,renderer:null,showInLegend:true,triggerAfterDraw:false,themeStyle:{},style:{},subStyle:{},colors:null,store:null,label:{textBaseline:"middle",textAlign:"center",font:"14px Helvetica"},labelOverflowPadding:5,labelField:null,marker:null,markerSubStyle:null,itemInstancing:null,background:null,highlightItem:null,surface:null,overlaySurface:null,hidden:false,highlightCfg:null,animate:null},directions:[],sprites:null,getFields:function(f){var e=this,a=[],c,b,d;for(b=0,d=f.length;b0){for(t=0;t=0){w[q]=l[q];l[q]+=A[q];g[q]=l[q]}else{w[q]=y[q];y[q]+=A[q];g[q]=y[q]}}u["dataStart"+c]=w;u["data"+c]=g;z.getRangeOfData(w,n);z.getRangeOfData(g,n)}else{u["dataStart"+c]=w;u["data"+c]=A;z.getRangeOfData(A,n)}f[r].setAttributes(u)}}z.dataRange[d]=n.min;z.dataRange[d+h]=n.max;u={};u["dataMin"+x]=n.min;u["dataMax"+x]=n.max;for(t=0;t0){if(!Ext.isBoolean(h)||!h){for(d=0;da){a=f}}b.min=c;b.max=a},updateLabelData:function(){var h=this,l=h.getStore(),g=l.getData().items,f=h.getSprites(),a=h.getLabel().getTemplate(),n=Ext.Array.from(a.getField()||h.getLabelField()),c,b,e,d,m,k;if(!f.length||!n.length){return}for(c=0;cm.x){e=m.x}if(lm.y){j=m.y}if(ab.to){d.call(this,b.max,b.getLabel(b.max),b.steps+1,b)}}else{if(b.minb.to){d.call(this,b.max,b.max,b.steps+1,b)}}},renderTicks:function(k,l,r,o){var u=this,j=u.attr,t=j.position,m=j.matrix,e=0.5*j.lineWidth,f=m.getXX(),h=m.getDX(),i=m.getYY(),g=m.getDY(),n=r.majorTicks,d=j.majorTickSize,a=r.minorTicks,q=j.minorTickSize;if(n){switch(t){case"right":function p(v){return function(w,y,x){w=k.roundPixel(w*i+g)+e;l.moveTo(0,w);l.lineTo(v,w)}}u.iterate(n,p(d));a&&u.iterate(a,p(q));break;case"left":function s(v){return function(w,y,x){w=k.roundPixel(w*i+g)+e;l.moveTo(o[2]-v,w);l.lineTo(o[2],w)}}u.iterate(n,s(d));a&&u.iterate(a,s(q));break;case"bottom":function c(v){return function(w,y,x){w=k.roundPixel(w*f+h)-e;l.moveTo(w,0);l.lineTo(w,v)}}u.iterate(n,c(d));a&&u.iterate(a,c(q));break;case"top":function b(v){return function(w,y,x){w=k.roundPixel(w*f+h)-e;l.moveTo(w,o[3]);l.lineTo(w,o[3]-v)}}u.iterate(n,b(d));a&&u.iterate(a,b(q));break;case"angular":u.iterate(n,function(v,x,w){v=v/(j.max+1)*Math.PI*2+j.baseRotation;l.moveTo(j.centerX+(j.length)*Math.cos(v),j.centerY+(j.length)*Math.sin(v));l.lineTo(j.centerX+(j.length+d)*Math.cos(v),j.centerY+(j.length+d)*Math.sin(v))});break}}},renderLabels:function(r,s,z,x){var C=this,q=C.attr,c=0.5*q.lineWidth,A=q.position,t=q.matrix,v=q.textPadding,e=t.getXX(),i=t.getDX(),o=t.getYY(),h=t.getDY(),a=0,u=z.majorTicks,k=Math.max(q.majorTickSize,q.minorTickSize)+q.lineWidth,f=this.getLabel(),m,w=null,l=0,y=0,d=z.segmenter,p=this.getRenderer(),g,B=null,b,n,j;if(u&&f&&!f.attr.hidden){m=f.attr.font;if(s.font!==m){s.font=m}f.setAttributes({translationX:0,translationY:0},true,true);f.applyTransformations();g=f.attr.inverseMatrix.elements.slice(0);switch(A){case"left":f.setAttributes({translationX:r.roundPixel(x[2]-k+i)-c-C.thickness/2},true,true);break;case"right":f.setAttributes({translationX:r.roundPixel(k+i)-c+C.thickness/2},true,true);break;case"top":f.setAttributes({translationY:r.roundPixel(x[3]-k)-c-C.thickness/2},true,true);break;case"bottom":f.setAttributes({translationY:r.roundPixel(k)-c+C.thickness/2},true,true);break;case"radial":f.setAttributes({translationX:q.centerX},true,true);break;case"angular":f.setAttributes({translationY:q.centerY},true,true);break}if(A==="left"||A==="right"){C.iterate(u,function(D,F,E){if(F===undefined){return}j=p?p.call(this,F,z,w):d.renderer(F,z,w);w=F;f.setAttributes({text:String(j),translationY:r.roundPixel(D*o+h)},true,true);f.applyTransformations();a=Math.max(a,f.getBBox().width+k);if(a<=C.thickness){n=Ext.draw.Matrix.fly(f.attr.matrix.elements.slice(0));b=n.prepend.apply(n,g).transformBBox(f.getBBox(true));if(B&&!Ext.draw.Draw.isBBoxIntersect(b,B,v)){return}r.renderSprite(f);B=b;l+=b.height;y++}})}else{if(A==="top"||A==="bottom"){C.iterate(u,function(D,F,E){if(F===undefined){return}j=p?p.call(this,F,z,w):d.renderer(F,z,w);w=F;f.setAttributes({text:String(j),translationX:r.roundPixel(D*e+i)},true,true);f.applyTransformations();a=Math.max(a,f.getBBox().height+k);if(a<=C.thickness){n=Ext.draw.Matrix.fly(f.attr.matrix.elements.slice(0));b=n.prepend.apply(n,g).transformBBox(f.getBBox(true));if(B&&!Ext.draw.Draw.isBBoxIntersect(b,B,v)){return}r.renderSprite(f);B=b;l+=b.width;y++}})}else{if(A==="radial"){C.iterate(u,function(D,F,E){if(F===undefined){return}j=p?p.call(this,F,z,w):d.renderer(F,z,w);w=F;if(typeof j!=="undefined"){f.setAttributes({text:String(j),translationY:q.centerY-r.roundPixel(D)/q.max*q.length},true,true);f.applyTransformations();b=f.attr.matrix.transformBBox(f.getBBox(true));if(B&&!Ext.draw.Draw.isBBoxIntersect(b,B)){return}r.renderSprite(f);B=b;l+=b.width;y++}})}else{if(A==="angular"){C.iterate(u,function(D,F,E){if(F===undefined){return}j=p?p.call(this,F,z,w):d.renderer(F,z,w);w=F;if(typeof j!=="undefined"){var G=D/(q.max+1)*Math.PI*2+q.baseRotation;f.setAttributes({text:String(j),translationX:q.centerX+(q.length+10)*Math.cos(G),translationY:q.centerY+(q.length+10)*Math.sin(G)},true,true);f.applyTransformations();b=f.attr.matrix.transformBBox(f.getBBox(true));if(B&&!Ext.draw.Draw.isBBoxIntersect(b,B)){return}r.renderSprite(f);B=b;l+=b.width;y++}})}}}}if(q.enlargeEstStepSizeByText&&y){l/=y;l+=k;l*=2;if(q.estStepSize1){C.thickness=a;q.bbox.plain.dirty=true;q.bbox.transform.dirty=true;C.doThicknessChanged();return false}}},renderAxisLine:function(a,h,e,b){var g=this,f=g.attr,c=f.lineWidth*0.5,i=f.position,d;if(f.axisLine){switch(i){case"left":d=a.roundPixel(b[2])-c;h.moveTo(d,-f.endGap);h.lineTo(d,f.length+f.startGap);break;case"right":h.moveTo(c,-f.endGap);h.lineTo(c,f.length+f.startGap);break;case"bottom":h.moveTo(-f.startGap,c);h.lineTo(f.length+f.endGap,c);break;case"top":d=a.roundPixel(b[3])-c;h.moveTo(-f.startGap,d);h.lineTo(f.length+f.endGap,d);break;case"angular":h.moveTo(f.centerX+f.length,f.centerY);h.arc(f.centerX,f.centerY,f.length,0,Math.PI*2,true);break}}},renderGridLines:function(k,l,q,p){var r=this,i=r.attr,m=i.matrix,c=i.startGap,a=i.endGap,b=m.getXX(),h=m.getYY(),f=m.getDX(),e=m.getDY(),s=i.position,n=q.majorTicks,d,o,g;if(i.grid){if(n){if(s==="left"||s==="right"){g=i.min*h+e+a+c;r.iterate(n,function(j,u,t){d=j*h+e+a;r.putMarker("horizontal-"+(t%2?"odd":"even"),{y:d,height:g-d},o=t,true);g=d});o++;d=0;r.putMarker("horizontal-"+(o%2?"odd":"even"),{y:d,height:g-d},o,true)}else{if(s==="top"||s==="bottom"){g=i.min*b+f+c;if(c){r.putMarker("vertical-even",{x:0,width:g},-1,true)}r.iterate(n,function(j,u,t){d=j*b+f+c;r.putMarker("vertical-"+(t%2?"odd":"even"),{x:d,width:g-d},o=t,true);g=d});o++;d=i.length+i.startGap+i.endGap;r.putMarker("vertical-"+(o%2?"odd":"even"),{x:d,width:g-d},o,true)}else{if(s==="radial"){r.iterate(n,function(j,u,t){d=j/i.max*i.length;r.putMarker("circular-"+(t%2?"odd":"even"),{scalingX:d,scalingY:d},t,true);g=d})}else{if(s==="angular"){r.iterate(n,function(j,u,t){d=j/(i.max+1)*Math.PI*2+i.baseRotation;r.putMarker("radial-"+(t%2?"odd":"even"),{rotationRads:d,rotationCenterX:0,rotationCenterY:0,scalingX:i.length,scalingY:i.length},t,true);g=d})}}}}}}},doThicknessChanged:function(){var a=this.getAxis();if(a){a.onThicknessChanged()}},render:function(a,b,c){var e=this,d=e.getLayoutContext();if(d){if(false===e.renderLabels(a,b,d,c)){return false}b.beginPath();e.renderTicks(a,b,d,c);e.renderAxisLine(a,b,d,c);e.renderGridLines(a,b,d,c);b.stroke()}}});Ext.define("Ext.chart.axis.segmenter.Segmenter",{config:{axis:null},constructor:function(a){this.initConfig(a)},renderer:function(b,a){return String(b)},from:function(a){return a},diff:Ext.emptyFn,align:Ext.emptyFn,add:Ext.emptyFn,preferredStep:Ext.emptyFn});Ext.define("Ext.chart.axis.segmenter.Names",{extend:Ext.chart.axis.segmenter.Segmenter,alias:"segmenter.names",renderer:function(b,a){return b},diff:function(b,a,c){return Math.floor(a-b)},align:function(c,b,a){return Math.floor(c)},add:function(c,b,a){return c+b},preferredStep:function(c,a,b,d){return{unit:1,step:1}}});Ext.define("Ext.chart.axis.segmenter.Time",{extend:Ext.chart.axis.segmenter.Segmenter,alias:"segmenter.time",config:{step:null},renderer:function(c,b){var a=Ext.Date;switch(b.majorTicks.unit){case"y":return a.format(c,"Y");case"mo":return a.format(c,"Y-m");case"d":return a.format(c,"Y-m-d")}return a.format(c,"Y-m-d\nH:i:s")},from:function(a){return new Date(a)},diff:function(c,a,d){var b=Ext.Date;if(isFinite(c)){c=new Date(c)}if(isFinite(a)){a=new Date(a)}return b.diff(c,a,d)},align:function(a,c,b){if(b==="d"&&c>=7){a=Ext.Date.align(a,"d",c);a.setDate(a.getDate()-a.getDay()+1);return a}else{return Ext.Date.align(a,b,c)}},add:function(c,b,a){return Ext.Date.add(new Date(c),a,b)},preferredStep:function(b,e){if(this.getStep()){return this.getStep()}var h=new Date(+b),k=new Date(+b+Math.ceil(e)),l=Ext.Date,d=[[l.YEAR,1,2,5,10,20,50,100,200,500],[l.MONTH,1,3,6],[l.DAY,1,7,14],[l.HOUR,1,6,12],[l.MINUTE,1,5,15,30],[l.SECOND,1,5,15,30],[l.MILLI,1,2,5,10,20,50,100,200,500]],m;for(var c=0;c0){for(var a=1;aa){f.max=f.to}if(f.froma){f.max=f.to}if(f.from0){f.from=f.from+c*f.step*i;while(f.froma[1]){var b=a[0];a[0]=a[1];a[0]=b}if(a[1]===a[0]){a[1]+=1/this.getMaxZoom()}if(a[1]>a[0]+1){a[0]=0;a[1]=1}else{if(a[0]<0){a[1]-=a[0];a[0]=0}else{if(a[1]>1){a[0]-=a[1]-1;a[1]=1}}}if(c&&a[0]===c[0]&&a[1]===c[1]){return undefined}return a},updateVisibleRange:function(a){this.fireEvent("transformed",this,a)},onSeriesChanged:function(c){var e=this,b=c.getSeries(),g="get"+e.getDirection()+"Axis",f=[],a,d=b.length;for(a=0;ah){h=b[1]}}}if(!isFinite(h)){h=g.prevMax}if(!isFinite(c)){c=g.prevMin}if(this.getLabelInSpan()||c===h){h+=this.getIncrement();c-=this.getIncrement()}if(!isNaN(g.getMinimum())){c=g.getMinimum()}else{g.prevMin=c}if(!isNaN(g.getMaximum())){h=g.getMaximum()}else{g.prevMax=h}return this.range=[c,h]},applyStyle:function(c,b){var a=Ext.ClassManager.getByAlias("sprite."+this.seriesType);if(a&&a.def){c=a.def.normalize(c)}b=Ext.apply(b||{},c);return b},updateCenter:function(b){var e=this.getSprites(),a=e[0],d=b[0],c=b[1];if(a){a.setAttributes({centerX:d,centerY:c})}if(this.gridSpriteEven){this.gridSpriteEven.getTemplate().setAttributes({translationX:d,translationY:c,rotationCenterX:d,rotationCenterY:c})}if(this.gridSpriteOdd){this.gridSpriteOdd.getTemplate().setAttributes({translationX:d,translationY:c,rotationCenterX:d,rotationCenterY:c})}},getSprites:function(){if(!this.getChart()){return}var g=this,b=g.getRange(),a=g.getPosition(),e=g.getChart(),h=e.getAnimate(),d,c,f=g.getLength();if(h===false){h={duration:0}}if(b){c=Ext.applyIf({position:a,axis:g,min:b[0],max:b[1],length:f,grid:g.getGrid(),hidden:g.getHidden(),titleOffset:g.titleOffset,layout:g.getLayout(),segmenter:g.getSegmenter(),label:g.getLabel()},g.getStyle());if(!g.sprites.length){d=new Ext.chart.axis.sprite.Axis(c);d.fx.setCustomDuration({baseRotation:0});d.fx.on("animationstart","onAnimationStart",g);d.fx.on("animationend","onAnimationEnd",g);g.sprites.push(d);g.updateTitleSprite()}else{d=g.sprites[0];d.fx.setConfig(h);d.setAttributes(c);d.setLayout(g.getLayout());d.setSegmenter(g.getSegmenter());d.setLabel(g.getLabel())}if(g.getRenderer()){d.setRenderer(g.getRenderer())}}return g.sprites},updateTitleSprite:function(){if(!this.sprites[0]){return}var g=this,d=this.sprites[0].thickness,b=g.getSurface(),h=this.getTitle(),a=g.getPosition(),e=g.getTitleMargin(),f=g.getLength(),c=b.roundPixel(f/2);if(h){switch(a){case"top":h.setAttributes({x:c,y:e/2,textBaseline:"top",textAlign:"center"},true,true);h.applyTransformations();g.titleOffset=h.getBBox().height+e;break;case"bottom":h.setAttributes({x:c,y:d+e/2,textBaseline:"top",textAlign:"center"},true,true);h.applyTransformations();g.titleOffset=h.getBBox().height+e;break;case"left":h.setAttributes({x:e/2,y:c,textBaseline:"top",textAlign:"center",rotationCenterX:e/2,rotationCenterY:c,rotationRads:-Math.PI/2},true,true);h.applyTransformations();g.titleOffset=h.getBBox().width+e;break;case"right":h.setAttributes({x:d+e/2,y:c,textBaseline:"bottom",textAlign:"center",rotationCenterX:d+e/2,rotationCenterY:c,rotationRads:Math.PI/2},true,true);h.applyTransformations();g.titleOffset=h.getBBox().width+e;break}}},onThicknessChanged:function(){var a=this;a.getChart().onThicknessChanged()},getThickness:function(){if(this.getHidden()){return 0}return(this.sprites[0]&&this.sprites[0].thickness||1)+this.titleOffset},onAnimationStart:function(){this.animating++;if(this.animating===1){this.fireEvent("animationstart")}},onAnimationEnd:function(){this.animating--;if(this.animating===0){this.fireEvent("animationend")}},getItemId:function(){return this.getId()},getAncestorIds:function(){return[this.getChart().getId()]},isXType:function(a){return a==="axis"},destroy:function(){Ext.ComponentManager.unregister(this);this.callSuper()}});Ext.define("Ext.mixin.Sortable",{extend:Ext.mixin.Mixin,mixinConfig:{id:"sortable"},config:{sorters:null,defaultSortDirection:"ASC",sortRoot:null},dirtySortFn:false,sortFn:null,sorted:false,applySorters:function(a,b){if(!b){b=this.createSortersCollection()}b.clear();this.sorted=false;if(a){this.addSorters(a)}return b},createSortersCollection:function(){this._sorters=Ext.create("Ext.util.Collection",function(a){return a.getId()});return this._sorters},addSorter:function(b,a){this.addSorters([b],a)},addSorters:function(c,a){var b=this.getSorters();return this.insertSorters(b?b.length:0,c,a)},insertSorter:function(a,c,b){return this.insertSorters(a,[c],b)},insertSorters:function(e,h,a){if(!Ext.isArray(h)){h=[h]}var f=h.length,j=a||this.getDefaultSortDirection(),c=this.getSortRoot(),k=this.getSorters(),l=[],g,b,m,d;if(!k){k=this.createSortersCollection()}for(b=0;b>1;f=d(e,b[c]);if(f>=0){h=c+1}else{if(f<0){a=c-1}}}return h}});Ext.define("Ext.mixin.Filterable",{extend:Ext.mixin.Mixin,mixinConfig:{id:"filterable"},config:{filters:null,filterRoot:null},dirtyFilterFn:false,filterFn:null,filtered:false,applyFilters:function(a,b){if(!b){b=this.createFiltersCollection()}b.clear();this.filtered=false;this.dirtyFilterFn=true;if(a){this.addFilters(a)}return b},createFiltersCollection:function(){this._filters=Ext.create("Ext.util.Collection",function(a){return a.getId()});return this._filters},addFilter:function(a){this.addFilters([a])},addFilters:function(b){var a=this.getFilters();return this.insertFilters(a?a.length:0,b)},insertFilter:function(a,b){return this.insertFilters(a,[b])},insertFilters:function(h,c){if(!Ext.isArray(c)){c=[c]}var j=c.length,a=this.getFilterRoot(),d=this.getFilters(),e=[],f,g,b;if(!d){d=this.createFiltersCollection()}for(g=0;g=e.length||(a&&e.getAutoSort())){return e.add(d,f)}if(typeof d!="undefined"&&d!==null){if(typeof g[d]!="undefined"){e.replace(d,f);return false}g[d]=f}this.all.push(f);if(b&&this.getAutoFilter()&&this.mixins.filterable.isFiltered.call(e,f)){return null}e.length++;Ext.Array.splice(e.items,c,0,f);Ext.Array.splice(e.keys,c,0,d);e.dirtyIndices=true;return f},insertAll:function(g,d){if(g>=this.items.length||(this.sorted&&this.getAutoSort())){return this.addAll(d)}var s=this,h=this.filtered,a=this.sorted,b=this.all,m=this.items,l=this.keys,r=this.map,n=this.getAutoFilter(),o=this.getAutoSort(),t=[],j=[],f=[],c=this.mixins.filterable,e=false,k,u,p,q;if(a&&this.getAutoSort()){}if(Ext.isObject(d)){for(u in d){if(d.hasOwnProperty(u)){j.push(m[u]);t.push(u)}}}else{j=d;k=d.length;for(p=0;p=0){e=a[b];c=f[b];if(typeof c!="undefined"){delete g.map[c]}Ext.Array.erase(a,b,1);Ext.Array.erase(f,b,1);Ext.Array.remove(d,e);delete g.indices[c];g.length--;this.dirtyIndices=true;return e}return false},removeAtKey:function(a){return this.removeAt(this.indexOfKey(a))},getCount:function(){return this.length},indexOf:function(b){if(this.dirtyIndices){this.updateIndices()}var a=b?this.indices[this.getKey(b)]:-1;return(a===undefined)?-1:a},indexOfKey:function(b){if(this.dirtyIndices){this.updateIndices()}var a=this.indices[b];return(a===undefined)?-1:a},updateIndices:function(){var a=this.items,e=a.length,f=this.indices={},c,d,b;for(c=0;c=a;d--){b[b.length]=c[d]}}return b},findIndexBy:function(d,c,h){var g=this,f=g.keys,a=g.items,b=h||0,e=a.length;for(;b=0){return Ext.functionFactory("obj","return obj"+(b>0?".":"")+a)(d)}return d[a]},onMetaChange:function(f){var a=f.fields,e=this,d,c,b;e.metaData=f;if(f.rootProperty!==undefined){e.setRootProperty(f.rootProperty)}else{if(f.root!==undefined){e.setRootProperty(f.root)}}if(f.idProperty!==undefined){e.setIdProperty(f.idProperty)}if(f.totalProperty!==undefined){e.setTotalProperty(f.totalProperty)}if(f.successProperty!==undefined){e.setSuccessProperty(f.successProperty)}if(f.messageProperty!==undefined){e.setMessageProperty(f.messageProperty)}if(a){if(e.getModel()){e.getModel().setFields(a);e.buildExtractors()}else{b=e.getIdProperty();c={fields:a};if(b){c.idProperty=b}d=Ext.define("Ext.data.reader.MetaModel"+Ext.id(),{extend:"Ext.data.Model",config:c});e.setModel(d)}}else{e.buildExtractors()}}},function(){Ext.apply(this.prototype,{nullResultSet:new Ext.data.ResultSet({total:0,count:0,records:[],success:false})})});Ext.define("Ext.data.reader.Json",{extend:Ext.data.reader.Reader,alternateClassName:"Ext.data.JsonReader",alias:"reader.json",config:{record:null,useSimpleAccessors:false},objectRe:/[\[\.]/,getResponseData:function(a){var d=a;if(a&&a.responseText){d=a.responseText}if(typeof d!=="string"){return d}var c;try{c=Ext.decode(d)}catch(b){this.fireEvent("exception",this,a,"Unable to parse the JSON returned by the server: "+b.toString());Ext.Logger.warn("Unable to parse the JSON returned by the server: "+b.toString())}return c},buildExtractors:function(){var b=this,a=b.getRootProperty();b.callParent(arguments);if(a){b.rootAccessor=b.createAccessor(a)}else{delete b.rootAccessor}},getRoot:function(b){var a=this.getModel().getFields();if(a.isDirty){this.buildExtractors(true);delete a.isDirty}if(this.rootAccessor){return this.rootAccessor.call(this,b)}else{return b}},extractData:function(a){var e=this.getRecord(),d=[],c,b;if(e){c=a.length;if(!c&&Ext.isObject(a)){c=1;a=[a]}for(b=0;b=0){return Ext.functionFactory("obj","var value; try {value = obj"+(b>0?".":"")+c+"} catch(e) {}; return value;")}}return function(d){return d[c]}}}(),createFieldAccessExpression:function(g,b,c){var f=this,h=f.objectRe,e=(g.getMapping()!==null),a=e?g.getMapping():g.getName(),i,d;if(typeof a==="function"){i=b+".getMapping()("+c+", this)"}else{if(f.getUseSimpleAccessors()===true||((d=String(a).search(h))<0)){if(!e||isNaN(a)){a='"'+a+'"'}i=c+"["+a+"]"}else{i=c+(d>0?".":"")+a}}return i}});Ext.define("Ext.data.writer.Writer",{alias:"writer.base",alternateClassName:["Ext.data.DataWriter","Ext.data.Writer"],config:{writeAllFields:true,nameProperty:"name"},constructor:function(a){this.initConfig(a)},write:function(e){var c=e.getOperation(),b=c.getRecords()||[],a=b.length,d=0,f=[];for(;dg){e=g;g=c;c=e}for(d=c;d<=g;d++){a.push(b.getAt(d))}this.doMultiSelect(a,h)},select:function(c,e,b){var d=this,a;if(d.getDisableSelection()){return}if(typeof c==="number"){c=[d.getStore().getAt(c)]}if(!c){return}if(d.getMode()=="SINGLE"&&c){a=c.length?c[0]:c;d.doSingleSelect(a,b)}else{d.doMultiSelect(c,e,b)}},doSingleSelect:function(a,b){var d=this,c=d.selected;if(d.getDisableSelection()){return}if(d.isSelected(a)){return}if(c.getCount()>0){d.deselect(d.getLastSelected(),b)}c.add(a);d.setLastSelected(a);d.onItemSelect(a,b);d.setLastFocused(a);if(!b){d.fireSelectionChange([a])}},doMultiSelect:function(a,j,h){if(a===null||this.getDisableSelection()){return}a=!Ext.isArray(a)?[a]:a;var f=this,b=f.selected,e=a.length,g=false,c=0,d;if(!j&&b.getCount()>0){g=true;f.deselect(f.getSelection(),true)}for(;c0},refreshSelection:function(){var b=this,a=b.getSelection();b.deselectAll(true);if(a.length){b.select(a,false,true)}},onSelectionStoreRemove:function(c,b){var g=this,e=g.selected,f=b.length,a,d;if(g.getDisableSelection()){return}for(d=0;d ."+Ext.baseCSSPrefix+"data-item",scope:this})},initialize:function(){this.callParent();this.doInitialize()},onItemTouchStart:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);a.on({touchmove:"onItemTouchMove",scope:b,single:true});b.fireEvent("itemtouchstart",b,a,b.indexOf(a),d)},onItemTouchMove:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemtouchmove",b,a,b.indexOf(a),d)},onItemTouchEnd:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);a.un({touchmove:"onItemTouchMove",scope:b});b.fireEvent("itemtouchend",b,a,b.indexOf(a),d)},onItemTap:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemtap",b,a,b.indexOf(a),d)},onItemTapHold:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemtaphold",b,a,b.indexOf(a),d)},onItemSingleTap:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemsingletap",b,a,b.indexOf(a),d)},onItemDoubleTap:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemdoubletap",b,a,b.indexOf(a),d)},onItemSwipe:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemswipe",b,a,b.indexOf(a),d)},moveItemsToCache:function(j,k){var h=this,c=h.dataview,a=c.getMaxItemCache(),g=h.getViewItems(),f=h.itemCache,e=f.length,l=c.getPressedCls(),d=c.getSelectedCls(),b=k-j,m;for(;b>=0;b--){m=g[j+b];if(e!==a){h.remove(m,false);m.removeCls([l,d]);f.push(m);e++}else{m.destroy()}}if(h.getViewItems().length==0){this.dataview.showEmptyText()}},moveItemsFromCache:function(b){var l=this,e=l.dataview,m=e.getStore(),k=b.length,a=e.getDefaultType(),h=e.getItemConfig(),g=l.itemCache,f=g.length,j=[],c,n,d;if(k){e.hideEmptyText()}for(c=0;ci._tmpIndex?1:-1});for(c=0;c div",scope:this})},initialize:function(){this.callParent();this.doInitialize()},updateBaseCls:function(a,b){var c=this;c.callParent([a+"-container",b])},onItemTouchStart:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);Ext.get(c).on({touchmove:"onItemTouchMove",scope:b,single:true});b.fireEvent("itemtouchstart",b,Ext.get(c),a,d)},onItemTouchEnd:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);Ext.get(c).un({touchmove:"onItemTouchMove",scope:b});b.fireEvent("itemtouchend",b,Ext.get(c),a,d)},onItemTouchMove:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemtouchmove",b,Ext.get(c),a,d)},onItemTap:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemtap",b,Ext.get(c),a,d)},onItemTapHold:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemtaphold",b,Ext.get(c),a,d)},onItemDoubleTap:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemdoubletap",b,Ext.get(c),a,d)},onItemSingleTap:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemsingletap",b,Ext.get(c),a,d)},onItemSwipe:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemswipe",b,Ext.get(c),a,d)},updateListItem:function(b,f){var e=this,a=e.dataview,c=a.getStore(),d=c.indexOf(b),g=a.prepareData(b.getData(true),d,b);g.xcount=c.getCount();g.xindex=typeof g.xindex==="number"?g.xindex:d;f.innerHTML=a.getItemTpl().apply(g)},addListItem:function(e,c){var h=this,d=h.dataview,i=d.getStore(),a=d.prepareData(c.getData(true),e,c),b=h.element,j=b.dom.childNodes,g=j.length,f;a.xcount=typeof a.xcount==="number"?a.xcount:i.getCount();a.xindex=typeof a.xindex==="number"?a.xindex:e;f=Ext.Element.create(this.getItemElementConfig(e,a));if(!g||e==g){f.appendTo(b)}else{f.insertBefore(j[e])}},getItemElementConfig:function(c,e){var b=this.dataview,d=b.getItemCls(),a=b.getBaseCls()+"-item";if(d){a+=" "+d}return{cls:a,html:b.getItemTpl().apply(e)}},doRemoveItemCls:function(a){var d=this.getViewItems(),c=d.length,b=0;for(;b=0;b--){c=a[f+b];Ext.get(c).destroy()}if(d.getViewItems().length==0){this.dataview.showEmptyText()}},moveItemsFromCache:function(d){var g=this,b=g.dataview,c=b.getStore(),f=d.length,e,a;if(f){b.hideEmptyText()}for(e=0;eh._tmpIndex?1:-1});for(e=0;e{text}",pressedCls:"x-item-pressed",itemCls:null,selectedCls:"x-item-selected",triggerEvent:"itemtap",triggerCtEvent:"tap",deselectOnContainerClick:true,scrollable:true,inline:null,pressedDelay:100,loadingText:"Loading...",useComponents:null,itemConfig:{},maxItemCache:20,defaultType:"dataitem",scrollToTopOnRefresh:true},constructor:function(a){var c=this,b;c.hasLoadedStore=false;c.mixins.selectable.constructor.apply(c,arguments);c.indexOffset=0;c.callParent(arguments)},updateItemCls:function(c,b){var a=this.container;if(a){if(b){a.doRemoveItemCls(b)}if(c){a.doAddItemCls(c)}}},storeEventHooks:{beforeload:"onBeforeLoad",load:"onLoad",refresh:"refresh",addrecords:"onStoreAdd",removerecords:"onStoreRemove",updaterecord:"onStoreUpdate"},initialize:function(){this.callParent();var b=this,a,c=b.getTriggerEvent();b.on(b.getTriggerCtEvent(),b.onContainerTrigger,b);a=b.container=this.add(new Ext.dataview[b.getUseComponents()?"component":"element"].Container({baseCls:this.getBaseCls()}));a.dataview=b;if(c){b.on(c,b.onItemTrigger,b)}a.on({itemtouchstart:"onItemTouchStart",itemtouchend:"onItemTouchEnd",itemtap:"onItemTap",itemtaphold:"onItemTapHold",itemtouchmove:"onItemTouchMove",itemsingletap:"onItemSingleTap",itemdoubletap:"onItemDoubleTap",itemswipe:"onItemSwipe",scope:b});if(b.getStore()){if(b.isPainted()){b.refresh()}else{b.on({painted:"refresh",single:true})}}},applyInline:function(a){if(Ext.isObject(a)){a=Ext.apply({},a)}return a},updateInline:function(c,b){var a=this.getBaseCls();if(b){this.removeCls([a+"-inlineblock",a+"-nowrap"])}if(c){this.addCls(a+"-inlineblock");if(Ext.isObject(c)&&c.wrap===false){this.addCls(a+"-nowrap")}else{this.removeCls(a+"-nowrap")}}},prepareData:function(c,b,a){return c},onContainerTrigger:function(b){var a=this;if(b.target!=a.element.dom){return}if(a.getDeselectOnContainerClick()&&a.getStore()){a.deselectAll()}},onItemTrigger:function(b,a){if(!this.isDestroyed){this.selectWithEvent(this.getStore().getAt(a))}},doAddPressedCls:function(a){var c=this,b=c.getItemAt(c.getStore().indexOf(a));if(Ext.isElement(b)){b=Ext.get(b)}if(b){if(b.isComponent){b.renderElement.addCls(c.getPressedCls())}else{b.addCls(c.getPressedCls())}}},onItemTouchStart:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireAction("itemtouchstart",[f,d,h,a,g],"doItemTouchStart")},doItemTouchStart:function(c,b,e,a){var d=c.getPressedDelay();if(a){if(d>0){c.pressedTimeout=Ext.defer(c.doAddPressedCls,d,c,[a])}else{c.doAddPressedCls(a)}}},onItemTouchEnd:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);if(this.hasOwnProperty("pressedTimeout")){clearTimeout(this.pressedTimeout);delete this.pressedTimeout}if(a&&h){if(h.isComponent){h.renderElement.removeCls(f.getPressedCls())}else{h.removeCls(f.getPressedCls())}}f.fireEvent("itemtouchend",f,d,h,a,g)},onItemTouchMove:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);if(f.hasOwnProperty("pressedTimeout")){clearTimeout(f.pressedTimeout);delete f.pressedTimeout}if(a&&h){if(h.isComponent){h.renderElement.removeCls(f.getPressedCls())}else{h.removeCls(f.getPressedCls())}}f.fireEvent("itemtouchmove",f,d,h,a,g)},onItemTap:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemtap",f,d,h,a,g)},onItemTapHold:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemtaphold",f,d,h,a,g)},onItemSingleTap:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemsingletap",f,d,h,a,g)},onItemDoubleTap:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemdoubletap",f,d,h,a,g)},onItemSwipe:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemswipe",f,d,h,a,g)},onItemSelect:function(a,b){var c=this;if(b){c.doItemSelect(c,a)}else{c.fireAction("select",[c,a],"doItemSelect")}},doItemSelect:function(c,a){if(c.container&&!c.isDestroyed){var b=c.getItemAt(c.getStore().indexOf(a));if(Ext.isElement(b)){b=Ext.get(b)}if(b){if(b.isComponent){b.renderElement.removeCls(c.getPressedCls());b.renderElement.addCls(c.getSelectedCls())}else{b.removeCls(c.getPressedCls());b.addCls(c.getSelectedCls())}}}},onItemDeselect:function(a,b){var c=this;if(c.container&&!c.isDestroyed){if(b){c.doItemDeselect(c,a)}else{c.fireAction("deselect",[c,a,b],"doItemDeselect")}}},doItemDeselect:function(c,a){var b=c.getItemAt(c.getStore().indexOf(a));if(Ext.isElement(b)){b=Ext.get(b)}if(b){if(b.isComponent){b.renderElement.removeCls([c.getPressedCls(),c.getSelectedCls()])}else{b.removeCls([c.getPressedCls(),c.getSelectedCls()])}}},updateData:function(b){var a=this.getStore();if(!a){this.setStore(Ext.create("Ext.data.Store",{data:b,autoDestroy:true}))}else{a.add(b)}},applyStore:function(b){var d=this,e=Ext.apply({},d.storeEventHooks,{scope:d}),c,a;if(b){b=Ext.data.StoreManager.lookup(b);if(b&&Ext.isObject(b)&&b.isStore){b.on(e);c=b.getProxy();if(c){a=c.getReader();if(a){a.on("exception","handleException",this)}}}}return b},handleException:function(){this.setMasked(false)},updateStore:function(b,e){var d=this,f=Ext.apply({},d.storeEventHooks,{scope:d}),c,a;if(e&&Ext.isObject(e)&&e.isStore){e.un(f);if(!d.isDestroyed){d.onStoreClear()}if(e.getAutoDestroy()){e.destroy()}else{c=e.getProxy();if(c){a=c.getReader();if(a){a.un("exception","handleException",this)}}}}if(b){if(b.isLoaded()){this.hasLoadedStore=true}if(b.isLoading()){d.onBeforeLoad()}if(d.container){d.refresh()}}},onBeforeLoad:function(){var a=this.getLoadingText();if(a&&this.isPainted()){this.setMasked({xtype:"loadmask",message:a})}this.hideEmptyText()},updateEmptyText:function(c,d){var b=this,a;if(d&&b.emptyTextCmp){b.remove(b.emptyTextCmp,true);delete b.emptyTextCmp}if(c){b.emptyTextCmp=b.add({xtype:"component",cls:b.getBaseCls()+"-emptytext",html:c,hidden:true});a=b.getStore();if(a&&b.hasLoadedStore&&!a.getCount()){this.showEmptyText()}}},onLoad:function(a){this.hasLoadedStore=true;this.setMasked(false);if(!a.getCount()){this.showEmptyText()}},refresh:function(){var b=this,a=b.container;if(!b.getStore()){if(!b.hasLoadedStore&&!b.getDeferEmptyText()){b.showEmptyText()}return}if(a){b.fireAction("refresh",[b],"doRefresh")}},applyItemTpl:function(a){return(Ext.isObject(a)&&a.isTemplate)?a:new Ext.XTemplate(a)},onAfterRender:function(){var a=this;a.callParent(arguments);a.updateStore(a.getStore())},getItemAt:function(a){return this.getViewItems()[a-this.indexOffset]},getItemIndex:function(b){var a=this.getViewItems().indexOf(b);return(a===-1)?a:this.indexOffset+a},getViewItems:function(){return this.container.getViewItems()},doRefresh:function(g){var a=g.container,l=g.getStore(),b=l.getRange(),f=g.getViewItems(),j=b.length,o=f.length,c=j-o,h=g.getScrollable(),d,m;if(this.getScrollToTopOnRefresh()&&h){h.getScroller().scrollToTop()}if(j<1){g.onStoreClear();return}else{g.hideEmptyText()}if(c<0){a.moveItemsToCache(o+c,o-1);f=g.getViewItems();o=f.length}else{if(c>0){a.moveItemsFromCache(l.getRange(o))}}for(d=0;d{name}"],baseCls:"x-legend",padding:5,disableSelection:true,inline:true,position:null,toggleable:true,docked:"top",horizontalHeight:48,verticalWidth:150},constructor:function(){this.callSuper(arguments);var a=this.getScrollable().getScroller(),b=a.onDrag;a.onDrag=function(c){c.stopPropagation();b.call(this,c)}},doSetDocked:function(a){this.callSuper(arguments);if(a==="top"||a==="bottom"){this.setLayout({type:"hbox",pack:"center"});this.setInline(true);this.setWidth(null);this.setHeight(this.getHorizontalHeight());if(this.getScrollable()){this.setScrollable({direction:"horizontal"})}}else{this.setLayout({pack:"center"});this.setInline(false);this.setWidth(this.getVerticalWidth());this.setHeight(null);if(this.getScrollable()){this.setScrollable({direction:"vertical"})}}},setScrollable:function(a){this.callSuper(arguments);if(a===true){if(this.getDocked()==="top"||this.getDocked()==="bottom"){this.setScrollable({direction:"horizontal"})}else{if(this.getDocked()==="left"||this.getDocked()==="right"){this.setScrollable({direction:"vertical"})}}}},setPosition:function(a){this.setDocked(a)},getPosition:function(){return this.getDocked()},onItemTap:function(b,h,d,g){this.callSuper(arguments);if(this.getToggleable()){var f=this,c=f.getStore(),a=c&&c.getAt(d);a.beginEdit();a.set("disabled",!a.get("disabled"));a.commit()}}});Ext.define("Ext.data.SortTypes",{singleton:true,stripTagsRE:/<\/?[^>]+>/gi,none:function(a){return a},asText:function(a){return String(a).replace(this.stripTagsRE,"")},asUCText:function(a){return String(a).toUpperCase().replace(this.stripTagsRE,"")},asUCString:function(a){return String(a).toUpperCase()},asDate:function(a){if(!a){return 0}if(Ext.isDate(a)){return a.getTime()}return Date.parse(String(a))},asFloat:function(a){a=parseFloat(String(a).replace(/,/g,""));return isNaN(a)?0:a},asInt:function(a){a=parseInt(String(a).replace(/,/g,""),10);return isNaN(a)?0:a}});Ext.define("Ext.data.Types",{singleton:true,stripRe:/[\$,%]/g,dashesRe:/-/g,iso8601TestRe:/\d\dT\d\d/,iso8601SplitRe:/[- :T\.Z\+]/},function(){var b=this,a=Ext.data.SortTypes;Ext.apply(b,{AUTO:{convert:function(c){return c},sortType:a.none,type:"auto"},STRING:{convert:function(c){return(c===undefined||c===null)?(this.getAllowNull()?null:""):String(c)},sortType:a.asUCString,type:"string"},INT:{convert:function(c){return(c!==undefined&&c!==null&&c!=="")?((typeof c==="number")?parseInt(c,10):parseInt(String(c).replace(b.stripRe,""),10)):(this.getAllowNull()?null:0)},sortType:a.none,type:"int"},FLOAT:{convert:function(c){return(c!==undefined&&c!==null&&c!=="")?((typeof c==="number")?c:parseFloat(String(c).replace(b.stripRe,""),10)):(this.getAllowNull()?null:0)},sortType:a.none,type:"float"},BOOL:{convert:function(c){if((c===undefined||c===null||c==="")&&this.getAllowNull()){return null}return c!=="false"&&c!=="0"&&!!c},sortType:a.none,type:"bool"},DATE:{convert:function(e){var c=this.getDateFormat(),d;if(!e){return null}if(Ext.isDate(e)){return e}if(c){if(c=="timestamp"){return new Date(e*1000)}if(c=="time"){return new Date(parseInt(e,10))}return Ext.Date.parse(e,c)}d=new Date(Date.parse(e));if(isNaN(d)){if(b.iso8601TestRe.test(e)){d=e.split(b.iso8601SplitRe);d=new Date(d[0],d[1]-1,d[2],d[3],d[4],d[5])}if(isNaN(d)){d=new Date(Date.parse(e.replace(b.dashesRe,"/")))}}return isNaN(d)?null:d},sortType:a.asDate,type:"date"}});Ext.apply(b,{BOOLEAN:this.BOOL,INTEGER:this.INT,NUMBER:this.FLOAT})});Ext.define("Ext.data.Field",{alias:"data.field",isField:true,config:{name:null,type:"auto",convert:undefined,dateFormat:null,allowNull:true,defaultValue:undefined,mapping:null,sortType:undefined,sortDir:"ASC",allowBlank:true,persist:true,encode:null,decode:null,bubbleEvents:"action"},constructor:function(a){if(Ext.isString(a)){a={name:a}}this.initConfig(a)},applyType:function(c){var b=Ext.data.Types,a=b.AUTO;if(c){if(Ext.isString(c)){return b[c.toUpperCase()]||a}else{return c}}return a},updateType:function(a,b){var c=this.getConvert();if(b&&c===b.convert){this.setConvert(a.convert)}},applySortType:function(d){var c=Ext.data.SortTypes,a=this.getType(),b=a.sortType;if(d){if(Ext.isString(d)){return c[d]||b}else{return d}}return b},applyConvert:function(b){var a=this.getType().convert;if(b&&b!==a){this._hasCustomConvert=true;return b}else{this._hasCustomConvert=false;return a}},hasCustomConvert:function(){return this._hasCustomConvert}});Ext.define("Ext.data.identifier.Simple",{alias:"data.identifier.simple",statics:{AUTO_ID:1},config:{prefix:"ext-record-"},constructor:function(a){this.initConfig(a)},generate:function(a){return this._prefix+this.self.AUTO_ID++}});Ext.define("Ext.data.ModelManager",{extend:Ext.AbstractManager,alternateClassName:["Ext.ModelMgr","Ext.ModelManager"],singleton:true,modelNamespace:null,registerType:function(c,b){var d=b.prototype,a;if(d&&d.isModel){a=b}else{b={extend:b.extend||"Ext.data.Model",config:b};a=Ext.define(c,b)}this.types[c]=a;return a},onModelDefined:Ext.emptyFn,getModel:function(b){var a=b;if(typeof a=="string"){a=this.types[a];if(!a&&this.modelNamespace){a=this.types[this.modelNamespace+"."+a]}}return a},create:function(c,b,d){var a=typeof b=="function"?b:this.types[b||c.name];return new a(c,d)}},function(){Ext.regModel=function(){return this.ModelManager.registerType.apply(this.ModelManager,arguments)}});Ext.define("Ext.data.Request",{config:{action:null,params:null,method:"GET",url:null,operation:null,proxy:null,disableCaching:false,headers:{},callbackKey:null,jsonP:null,jsonData:null,xmlData:null,withCredentials:null,username:null,password:null,callback:null,scope:null,timeout:30000,records:null,directFn:null,args:null,useDefaultXhrHeader:null},constructor:function(a){this.initConfig(a)}});Ext.define("Ext.data.proxy.Server",{extend:Ext.data.proxy.Proxy,alias:"proxy.server",alternateClassName:"Ext.data.ServerProxy",config:{url:null,pageParam:"page",startParam:"start",limitParam:"limit",groupParam:"group",sortParam:"sort",filterParam:"filter",directionParam:"dir",enablePagingParams:true,simpleSortMode:false,noCache:true,cacheString:"_dc",timeout:30000,api:{create:undefined,read:undefined,update:undefined,destroy:undefined},extraParams:{}},constructor:function(a){a=a||{};if(a.nocache!==undefined){a.noCache=a.nocache}this.callParent([a])},create:function(){return this.doRequest.apply(this,arguments)},read:function(){return this.doRequest.apply(this,arguments)},update:function(){return this.doRequest.apply(this,arguments)},destroy:function(){return this.doRequest.apply(this,arguments)},setExtraParam:function(a,b){this.getExtraParams()[a]=b},buildRequest:function(a){var c=this,d=Ext.applyIf(a.getParams()||{},c.getExtraParams()||{}),b;d=Ext.applyIf(d,c.getParams(a));b=Ext.create("Ext.data.Request",{params:d,action:a.getAction(),records:a.getRecords(),url:a.getUrl(),operation:a,proxy:c});b.setUrl(c.buildUrl(b));a.setRequest(b);return b},processResponse:function(k,b,d,c,j,l){var h=this,a=b.getAction(),f,i;if(k===true){f=h.getReader();try{i=f.process(h.getResponseResult(c))}catch(g){b.setException(g.message);h.fireEvent("exception",h,c,b);return}if(!b.getModel()){b.setModel(this.getModel())}if(b.process(a,i,d,c)===false){h.setException(b,c);h.fireEvent("exception",h,c,b)}}else{h.setException(b,c);h.fireEvent("exception",this,c,b)}if(typeof j=="function"){j.call(l||h,b)}h.afterRequest(d,k)},getResponseResult:function(a){return a},setException:function(b,a){if(Ext.isObject(a)){b.setException({status:a.status,statusText:a.statusText})}},applyEncoding:function(a){return Ext.encode(a)},encodeSorters:function(d){var b=[],c=d.length,a=0;for(;a0){if(o){h[e]=m[0].getProperty();h[b]=m[0].getDirection()}else{h[e]=n.encodeSorters(m)}}if(c&&f&&f.length>0){h[c]=n.encodeFilters(f)}return h},buildUrl:function(c){var b=this,a=b.getUrl(c);if(b.getNoCache()){a=Ext.urlAppend(a,Ext.String.format("{0}={1}",b.getCacheString(),Ext.Date.now()))}return a},getUrl:function(a){return a?a.getUrl()||this.getApi()[a.getAction()]||this._url:this._url},doRequest:function(){},afterRequest:Ext.emptyFn});Ext.define("Ext.data.proxy.Ajax",{extend:Ext.data.proxy.Server,alias:"proxy.ajax",alternateClassName:["Ext.data.HttpProxy","Ext.data.AjaxProxy"],config:{withCredentials:false,useDefaultXhrHeader:true,username:null,password:null,actionMethods:{create:"POST",read:"GET",update:"POST",destroy:"POST"},headers:{}},doRequest:function(a,f,b){var d=this,e=d.getWriter(),c=d.buildRequest(a);c.setConfig({headers:d.getHeaders(),timeout:d.getTimeout(),method:d.getMethod(c),callback:d.createRequestCallback(c,a,f,b),scope:d,proxy:d,useDefaultXhrHeader:d.getUseDefaultXhrHeader()});if(a.getWithCredentials()||d.getWithCredentials()){c.setWithCredentials(true);c.setUsername(d.getUsername());c.setPassword(d.getPassword())}c=e.write(c);Ext.Ajax.request(c.getCurrentConfig());return c},getMethod:function(a){return this.getActionMethods()[a.getAction()]},createRequestCallback:function(d,a,e,b){var c=this;return function(g,h,f){c.processResponse(h,a,d,f,e,b)}}});Ext.define("Ext.data.association.Association",{alternateClassName:"Ext.data.Association",config:{ownerModel:null,ownerName:undefined,associatedModel:null,associatedName:undefined,associationKey:undefined,primaryKey:"id",reader:null,type:null,name:undefined},statics:{create:function(a){if(!a.isAssociation){if(Ext.isString(a)){a={type:a}}a.type=a.type.toLowerCase();return Ext.factory(a,Ext.data.association.Association,null,"association")}return a}},constructor:function(a){this.initConfig(a)},applyName:function(a){if(!a){a=this.getAssociatedName()}return a},applyOwnerModel:function(a){var b=Ext.data.ModelManager.getModel(a);if(b===undefined){Ext.Logger.error("The configured ownerModel was not valid (you tried "+a+")")}return b},applyOwnerName:function(a){if(!a){a=this.getOwnerModel().modelName}a=a.slice(a.lastIndexOf(".")+1);return a},updateOwnerModel:function(a,b){if(b){this.setOwnerName(a.modelName)}},applyAssociatedModel:function(a){var b=Ext.data.ModelManager.types[a];if(b===undefined){Ext.Logger.error("The configured associatedModel was not valid (you tried "+a+")")}return b},applyAssociatedName:function(a){if(!a){a=this.getAssociatedModel().modelName}a=a.slice(a.lastIndexOf(".")+1);return a},updateAssociatedModel:function(b,a){if(a){this.setAssociatedName(b.modelName)}},applyReader:function(a){if(a){if(Ext.isString(a)){a={type:a}}if(!a.isReader){Ext.applyIf(a,{type:"json"})}}return Ext.factory(a,Ext.data.Reader,this.getReader(),"reader")},updateReader:function(a){a.setModel(this.getAssociatedModel())}});Ext.define("Ext.util.Inflector",{singleton:true,plurals:[[(/(quiz)$/i),"$1zes"],[(/^(ox)$/i),"$1en"],[(/([m|l])ouse$/i),"$1ice"],[(/(matr|vert|ind)ix|ex$/i),"$1ices"],[(/(x|ch|ss|sh)$/i),"$1es"],[(/([^aeiouy]|qu)y$/i),"$1ies"],[(/(hive)$/i),"$1s"],[(/(?:([^f])fe|([lr])f)$/i),"$1$2ves"],[(/sis$/i),"ses"],[(/([ti])um$/i),"$1a"],[(/(buffal|tomat|potat)o$/i),"$1oes"],[(/(bu)s$/i),"$1ses"],[(/(alias|status|sex)$/i),"$1es"],[(/(octop|vir)us$/i),"$1i"],[(/(ax|test)is$/i),"$1es"],[(/^person$/),"people"],[(/^man$/),"men"],[(/^(child)$/),"$1ren"],[(/s$/i),"s"],[(/$/),"s"]],singulars:[[(/(quiz)zes$/i),"$1"],[(/(matr)ices$/i),"$1ix"],[(/(vert|ind)ices$/i),"$1ex"],[(/^(ox)en/i),"$1"],[(/(alias|status)es$/i),"$1"],[(/(octop|vir)i$/i),"$1us"],[(/(cris|ax|test)es$/i),"$1is"],[(/(shoe)s$/i),"$1"],[(/(o)es$/i),"$1"],[(/(bus)es$/i),"$1"],[(/([m|l])ice$/i),"$1ouse"],[(/(x|ch|ss|sh)es$/i),"$1"],[(/(m)ovies$/i),"$1ovie"],[(/(s)eries$/i),"$1eries"],[(/([^aeiouy]|qu)ies$/i),"$1y"],[(/([lr])ves$/i),"$1f"],[(/(tive)s$/i),"$1"],[(/(hive)s$/i),"$1"],[(/([^f])ves$/i),"$1fe"],[(/(^analy)ses$/i),"$1sis"],[(/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i),"$1$2sis"],[(/([ti])a$/i),"$1um"],[(/(n)ews$/i),"$1ews"],[(/people$/i),"person"],[(/s$/i),""]],uncountable:["sheep","fish","series","species","money","rice","information","equipment","grass","mud","offspring","deer","means"],singular:function(b,a){this.singulars.unshift([b,a])},plural:function(b,a){this.plurals.unshift([b,a])},clearSingulars:function(){this.singulars=[]},clearPlurals:function(){this.plurals=[]},isTransnumeral:function(a){return Ext.Array.indexOf(this.uncountable,a)!=-1},pluralize:function(f){if(this.isTransnumeral(f)){return f}var e=this.plurals,d=e.length,a,c,b;for(b=0;ba)){return false}else{return true}},email:function(b,a){return Ext.data.validations.emailRe.test(a)},format:function(a,b){if(b===undefined||b===null){b=""}return !!(a.matcher&&a.matcher.test(b))},inclusion:function(a,b){return a.list&&Ext.Array.indexOf(a.list,b)!=-1},exclusion:function(a,b){return a.list&&Ext.Array.indexOf(a.list,b)==-1}});Ext.define("Ext.data.Model",{alternateClassName:"Ext.data.Record",mixins:{observable:Ext.mixin.Observable},isModel:true,config:{idProperty:"id",data:null,fields:undefined,validations:null,associations:null,hasMany:null,hasOne:null,belongsTo:null,proxy:null,identifier:{type:"simple"},clientIdProperty:"clientId",isErased:false,useCache:true},staticConfigs:["idProperty","fields","validations","associations","hasMany","hasOne","belongsTo","clientIdProperty","identifier","useCache","proxy"],statics:{EDIT:"edit",REJECT:"reject",COMMIT:"commit",cache:{},generateProxyMethod:function(a){return function(){var b=this.prototype;return b[a].apply(b,arguments)}},generateCacheId:function(b,c){var a;if(b&&b.isModel){a=b.modelName;if(c===undefined){c=b.getId()}}else{a=b}return a.replace(/\./g,"-").toLowerCase()+"-"+c}},inheritableStatics:{load:function(a,b,h){var f=this.getProxy(),i=this.getIdProperty(),e=null,d={},g,c;h=h||(b&&b.scope)||this;if(Ext.isFunction(b)){b={callback:b,scope:h}}d[i]=a;b=Ext.apply({},b);b=Ext.applyIf(b,{action:"read",params:d,model:this});c=Ext.create("Ext.data.Operation",b);if(!f){Ext.Logger.error("You are trying to load a model that doesn't have a Proxy specified")}g=function(j){if(j.wasSuccessful()){e=j.getRecords()[0]||null;Ext.callback(b.success,h,[e,j])}else{Ext.callback(b.failure,h,[e,j])}Ext.callback(b.callback,h,[e,j])};f.read(c,g,this)}},editing:false,dirty:false,phantom:false,constructor:function(f,h,c,g){var e=this,d=null,a=e.getUseCache(),b=e.getIdProperty();f=f||g||{};if(h||h===0){f[b]=e.internalId=h}h=f[b];if(a&&(h||h===0)){d=Ext.data.Model.cache[Ext.data.Model.generateCacheId(this,h)];if(d){d.raw=c||d.raw;return d.mergeData(g||f||{})}}e.modified={};e.raw=c||f||{};e.stores=[];if(g){e.setConvertedData(f)}else{e.setData(f)}e.id=e.getIdentifier().generate(e);h=e.data[b];if(!h&&h!==0){e.data[b]=e.internalId=e.id;e.phantom=true;if(this.associations.length){this.handleInlineAssociationData(f)}}else{this.internalId=h}if(a){Ext.data.Model.cache[Ext.data.Model.generateCacheId(e)]=e}if(this.init&&typeof this.init=="function"){this.init()}},mergeData:function(a){var h=this,f=h.getFields().items,g=f.length,l=h.modified,c=[],d=h.data,e,j,m,k,b;for(e=0;e0&&h.editing){this.endEdit(false,c)}return this},setData:function(a){var k=this,g=k.fields.items,h=g.length,f=Ext.isArray(a),d=k._data=k.data={},e,l,b,m,j,c;if(!a){return k}for(e=0;e0){b=n.data.items;k=b.length;o.length=0;for(p=0;p0){h=o.shift();Ext.apply(s[h.associationName][h.j],this.prepareAssociatedData(h.associatedRecord,h.ids,h.associationType))}}}else{if(t&&(f.toLowerCase()=="belongsto"||f.toLowerCase()=="hasone")){a=d[e.getInstanceName()];if(a!==undefined){l=a.id;if(Ext.Array.indexOf(m,l)===-1){m.push(l);s[u]=a.getData();Ext.apply(s[u],this.prepareAssociatedData(a,m,c))}}}}}return s},join:function(a){Ext.Array.include(this.stores,a)},unjoin:function(a){Ext.Array.remove(this.stores,a)},setDirty:function(){var b=this,a;b.dirty=true;b.fields.each(function(c){if(c.getPersist()){a=c.getName();b.modified[a]=b.get(a)}})},validate:function(){var j=Ext.create("Ext.data.Errors"),c=this.getValidations().items,e=Ext.data.Validations,b,d,h,a,g,f;if(c){b=c.length;for(f=0;ff)?1:((ba?1:(d0){b.create=f;g=true}if(d.length>0){b.update=d;g=true}if(a.length>0){b.destroy=a;g=true}if(g&&e.fireEvent("beforesync",this,b)!==false){e.getProxy().batch(Ext.merge({operations:b,listeners:e.getBatchListeners()},c||{}))}return{added:f,updated:d,removed:a}},first:function(){return this.data.first()},last:function(){return this.data.last()},sum:function(e){var d=0,c=0,b=this.data.items,a=b.length;for(;c0){c=b[0].get(f)}for(;d0){a=c[0].get(f)}for(;da){a=e}}return a},average:function(e){var c=0,b=this.data.items,a=b.length,d=0;if(b.length>0){for(;c';g+='';for(f=0;f';g+=Ext.dom.Element.serializeNode(b.svgElement.dom);g+=""}g+="";d="data:image/svg+xml;utf8,"+g;break}if(k==="image"){e=new Image();e.src=d;return e}if(k==="stream"){return d.replace(/^data:image\/[^;]+/,"data:application/octet-stream")}return d},save:function(a){if(a){window.open(this.flatten(this.items.items,"stream"))}else{Ext.Viewport.add({xtype:"panel",layout:"fit",modal:true,width:"90%",height:"90%",hideOnMaskTap:true,centered:true,scrollable:false,items:{xtype:"image",mode:"img",src:this.flatten(this.items.items)},listeners:{hide:function(){Ext.Viewport.remove(this)}}}).show()}}});Ext.define("Ext.chart.grid.HorizontalGrid",{extend:Ext.draw.sprite.Sprite,alias:"grid.horizontal",inheritableStatics:{def:{processors:{x:"number",y:"number",width:"number",height:"number"},defaults:{x:0,y:0,width:1,height:1,strokeStyle:"#DDD"}}},render:function(b,c,e){var a=this.attr,f=b.roundPixel(a.y),d=c.lineWidth*0.5;c.beginPath();c.rect(e[0]-b.matrix.getDX(),f+d,+e[2],a.height);c.fill();c.beginPath();c.moveTo(e[0]-b.matrix.getDX(),f+d);c.lineTo(e[0]+e[2]-b.matrix.getDX(),f+d);c.stroke()}});Ext.define("Ext.chart.grid.VerticalGrid",{extend:Ext.draw.sprite.Sprite,alias:"grid.vertical",inheritableStatics:{def:{processors:{x:"number",y:"number",width:"number",height:"number"},defaults:{x:0,y:0,width:1,height:1,strokeStyle:"#DDD"}}},render:function(c,d,f){var b=this.attr,a=c.roundPixel(b.x),e=d.lineWidth*0.5;d.beginPath();d.rect(a-e,f[1]-c.matrix.getDY(),b.width,f[3]);d.fill();d.beginPath();d.moveTo(a-e,f[1]-c.matrix.getDY());d.lineTo(a-e,f[1]+f[3]-c.matrix.getDY());d.stroke()}});Ext.define("Ext.chart.CartesianChart",{extend:Ext.chart.AbstractChart,alternateClassName:"Ext.chart.Chart",config:{flipXY:false,innerRegion:[0,0,1,1]},xtype:"chart",alias:"Ext.chart.Chart",getDirectionForAxis:function(a){var b=this.getFlipXY();if(a==="left"||a==="right"){if(b){return"X"}else{return"Y"}}else{if(b){return"Y"}else{return"X"}}},performLayout:function(){try{this.resizing++;this.callSuper();this.suspendThicknessChanged();var y=this,x=y.getAxes(),b,q=y.getSeries(),h,k,a,m=y.element.getSize(),o=m.width,n=m.height,f=y.getInsetPadding(),u=y.getInnerPadding(),r,e={top:f.top,left:f.left,right:f.right,bottom:f.bottom},c,d,p,s,j,l,t,w,g,v=y.getFlipXY();if(o<=0||n<=0){return}for(w=0;w0&&j0&&hc){j=c}}if(h<0){h=0}else{if(h>b){h=b}}g.selectionRect.setAttributes({width:j-g.startX,height:h-g.startY});if(Math.abs(g.startX-j)<11||Math.abs(g.startY-h)<11){g.selectionRect.setAttributes({globalAlpha:0.5})}else{g.selectionRect.setAttributes({globalAlpha:1})}a.renderFrame();return false}},onGestureEnd:function(d){var g=this;if(g.zoomAnimationInProgress){return}if(g.getLocks()[g.getGesture()]===g){var f=g.getChart(),a=g.getSurface(),i=f.getInnerRegion(),c=i[2],b=i[3],k=f.element.getXY(),j=d.pageX-k[0]-i[0],h=d.pageY-k[1]-i[1];if(j<0){j=0}else{if(j>c){j=c}}if(h<0){h=0}else{if(h>b){h=b}}if(Math.abs(g.startX-j)<11||Math.abs(g.startY-h)<11){a.remove(g.selectionRect)}else{g.zoomBy([Math.min(g.startX,j)/c,1-Math.max(g.startY,h)/b,Math.max(g.startX,j)/c,1-Math.min(g.startY,h)/b]);g.selectionRect.setAttributes({x:Math.min(g.startX,j),y:Math.min(g.startY,h),width:Math.abs(g.startX-j),height:Math.abs(g.startY-h)});g.selectionRect.fx.setConfig(f.getAnimate()||{duration:0});g.selectionRect.setAttributes({globalAlpha:0,x:0,y:0,width:c,height:b});g.zoomAnimationInProgress=true;f.suspendThicknessChanged();g.selectionRect.fx.on("animationend",function(){f.resumeThicknessChanged();a.remove(g.selectionRect);g.selectionRect=null;g.zoomAnimationInProgress=false})}a.renderFrame();g.sync();g.unlockEvents(g.getGesture());g.setSeriesOpacity(1);if(!g.zoomAnimationInProgress){a.remove(g.selectionRect);g.selectionRect=null}}},zoomBy:function(k){var j=this,a=j.getAxes(),g=j.getChart().getAxes(),d,b={};for(var f=0;f0&&n0&&mE){k=E}}if(j<0){j=0}else{if(j>f){j=f}}k+=t;j+=q;for(B=0;B=a.left&&b.right<=a.right&&b.top>=a.top&&b.bottom<=a.bottom)},intersect:function(g){var f=this,d=Math.max(f.top,g.top),e=Math.min(f.right,g.right),a=Math.min(f.bottom,g.bottom),c=Math.max(f.left,g.left);if(a>d&&e>c){return new Ext.util.Region(d,e,a,c)}else{return false}},union:function(g){var f=this,d=Math.min(f.top,g.top),e=Math.max(f.right,g.right),a=Math.max(f.bottom,g.bottom),c=Math.min(f.left,g.left);return new Ext.util.Region(d,e,a,c)},constrainTo:function(b){var a=this,c=Ext.util.Numbers.constrain;a.top=c(a.top,b.top,b.bottom);a.bottom=c(a.bottom,b.top,b.bottom);a.left=c(a.left,b.left,b.right);a.right=c(a.right,b.left,b.right);return a},adjust:function(e,b,a,d){var c=this;c.top+=e;c.left+=d;c.right+=b;c.bottom+=a;return c},getOutOfBoundOffset:function(a,b){if(!Ext.isObject(a)){if(a=="x"){return this.getOutOfBoundOffsetX(b)}else{return this.getOutOfBoundOffsetY(b)}}else{var c=new Ext.util.Offset();c.x=this.getOutOfBoundOffsetX(a.x);c.y=this.getOutOfBoundOffsetY(a.y);return c}},getOutOfBoundOffsetX:function(a){if(a<=this.left){return this.left-a}else{if(a>=this.right){return this.right-a}}return 0},getOutOfBoundOffsetY:function(a){if(a<=this.top){return this.top-a}else{if(a>=this.bottom){return this.bottom-a}}return 0},isOutOfBound:function(a,b){if(!Ext.isObject(a)){if(a=="x"){return this.isOutOfBoundX(b)}else{return this.isOutOfBoundY(b)}}else{b=a;return(this.isOutOfBoundX(b.x)||this.isOutOfBoundY(b.y))}},isOutOfBoundX:function(a){return(athis.right)},isOutOfBoundY:function(a){return(athis.bottom)},restrict:function(b,d,a){if(Ext.isObject(b)){var c;a=d;d=b;if(d.copy){c=d.copy()}else{c={x:d.x,y:d.y}}c.x=this.restrictX(d.x,a);c.y=this.restrictY(d.y,a);return c}else{if(b=="x"){return this.restrictX(d,a)}else{return this.restrictY(d,a)}}},restrictX:function(b,a){if(!a){a=1}if(b<=this.left){b-=(b-this.left)*a}else{if(b>=this.right){b-=(b-this.right)*a}}return b},restrictY:function(b,a){if(!a){a=1}if(b<=this.top){b-=(b-this.top)*a}else{if(b>=this.bottom){b-=(b-this.bottom)*a}}return b},getSize:function(){return{width:this.right-this.left,height:this.bottom-this.top}},copy:function(){return new Ext.util.Region(this.top,this.right,this.bottom,this.left)},toString:function(){return"Region["+this.top+","+this.right+","+this.bottom+","+this.left+"]"},translateBy:function(a){this.left+=a.x;this.right+=a.x;this.top+=a.y;this.bottom+=a.y;return this},round:function(){this.top=Math.round(this.top);this.right=Math.round(this.right);this.bottom=Math.round(this.bottom);this.left=Math.round(this.left);return this},equals:function(a){return(this.top==a.top&&this.right==a.right&&this.bottom==a.bottom&&this.left==a.left)}});Ext.define("Ext.chart.interactions.PanZoom",{extend:Ext.chart.interactions.Abstract,type:"panzoom",alias:"interaction.panzoom",config:{axes:{top:{},right:{},bottom:{},left:{}},minZoom:null,maxZoom:null,showOverflowArrows:true,gesture:"pinch",panGesture:"drag",zoomOnPanGesture:false,modeToggleButton:{cls:["x-panzoom-toggle","x-zooming"],iconCls:"expand"},hideLabelInGesture:false},stopAnimationBeforeSync:true,applyAxes:function(b,a){return Ext.merge(a||{},b)},applyZoomOnPanGesture:function(a){this.getChart();if(this.isMultiTouch()){return false}return a},updateZoomOnPanGesture:function(c){if(!this.isMultiTouch()){var b=this.getModeToggleButton(),a=Ext.baseCSSPrefix+"zooming";if(c){b.addCls(a);if(!b.config.hideText){b.setText("Zoom")}}else{b.removeCls(a);if(!b.config.hideText){b.setText("Pan")}}}},toggleMode:function(){var a=this;if(!a.isMultiTouch()){a.setZoomOnPanGesture(!a.getZoomOnPanGesture())}},applyModeToggleButton:function(c,b){var d=this,a=Ext.factory(c,"Ext.Button",b);if(a&&!b){a.setHandler(function(){d.toggleMode()})}return a},getGestures:function(){var a=this,b={};b[a.getGesture()]="onGesture";b[a.getGesture()+"start"]="onGestureStart";b[a.getGesture()+"end"]="onGestureEnd";b[a.getPanGesture()]="onPanGesture";b[a.getPanGesture()+"start"]="onPanGestureStart";b[a.getPanGesture()+"end"]="onPanGestureEnd";b.doubletap="onDoubleTap";return b},onDoubleTap:function(a){},onPanGestureStart:function(d){if(!d||!d.touches||d.touches.length<2){var a=this,c=a.getChart().getInnerRegion(),b=a.getChart().element.getXY();a.startX=d.pageX-b[0]-c[0];a.startY=d.pageY-b[1]-c[1];a.oldVisibleRanges=null;a.hideLabels();a.getChart().suspendThicknessChanged();a.lockEvents(a.getPanGesture());return false}},onPanGesture:function(d){if(this.getLocks()[this.getPanGesture()]===this){var a=this,c=a.getChart().getInnerRegion(),b=a.getChart().element.getXY();if(a.getZoomOnPanGesture()){a.transformAxesBy(a.getZoomableAxes(d),0,0,(d.pageX-b[0]-c[0])/a.startX,a.startY/(d.pageY-b[1]-c[1]))}else{a.transformAxesBy(a.getPannableAxes(d),d.pageX-b[0]-c[0]-a.startX,d.pageY-b[1]-c[1]-a.startY,1,1)}a.sync();return false}},onPanGestureEnd:function(b){var a=this;if(this.getLocks()[this.getPanGesture()]===this){a.getChart().resumeThicknessChanged();a.showLabels();a.sync();a.unlockEvents(a.getGestures());return false}},onGestureStart:function(b){if(b.touches&&b.touches.length===2){var c=this,i=c.getChart().element.getXY(),f=c.getChart().getInnerRegion(),h=i[0]+f[0],d=i[1]+f[1],j=[b.touches[0].point.x-h,b.touches[0].point.y-d,b.touches[1].point.x-h,b.touches[1].point.y-d],g=Math.max(44,Math.abs(j[2]-j[0])),a=Math.max(44,Math.abs(j[3]-j[1]));c.getChart().suspendThicknessChanged();c.lastZoomDistances=[g,a];c.lastPoints=j;c.oldVisibleRanges=null;c.hideLabels();c.lockEvents(c.getGesture());return false}},onGesture:function(d){if(this.getLocks()[this.getGesture()]===this){var f=this,i=f.getChart().getInnerRegion(),n=f.getChart().element.getXY(),k=n[0]+i[0],h=n[1]+i[1],o=Math.abs,c=f.lastPoints,m=[d.touches[0].point.x-k,d.touches[0].point.y-h,d.touches[1].point.x-k,d.touches[1].point.y-h],g=Math.max(44,o(m[2]-m[0])),b=Math.max(44,o(m[3]-m[1])),a=this.lastZoomDistances||[g,b],l=g/a[0],j=b/a[1];f.transformAxesBy(f.getZoomableAxes(d),i[2]*(l-1)/2+m[2]-c[2]*l,i[3]*(j-1)/2+m[3]-c[3]*j,l,j);f.sync();return false}},onGestureEnd:function(b){var a=this;if(a.getLocks()[a.getGesture()]===a){a.getChart().resumeThicknessChanged();a.showLabels();a.sync();a.unlockEvents(a.getGestures());return false}},hideLabels:function(){if(this.getHideLabelInGesture()){this.eachInteractiveAxes(function(a){a.hideLabels()})}},showLabels:function(){if(this.getHideLabelInGesture()){this.eachInteractiveAxes(function(a){a.showLabels()})}},isEventOnAxis:function(c,a){var b=a.getSurface().getRegion();return b[0]<=c.pageX&&c.pageX<=b[0]+b[2]&&b[1]<=c.pageY&&c.pageY<=b[1]+b[3]},getPannableAxes:function(d){var h=this,a=h.getAxes(),f=h.getChart().getAxes(),c,g=f.length,k=[],j=false,b;if(d){for(c=0;c1){a=1}if(a*j<1){a=1/j}f=o[0];p=o[1];l=l[1]-l[0];if(a===l&&l===1){return}b.setVisibleRange([(o[0]+o[1]-a)*0.5-n/d*a,(o[0]+o[1]+a)*0.5-n/d*a]);return(Math.abs(f-b.getVisibleRange()[0])>1e-10||Math.abs(p-b.getVisibleRange()[1])>1e-10)},destroy:function(){this.setModeToggleButton(null);this.callSuper()}});Ext.define("Ext.chart.interactions.Rotate",{extend:Ext.chart.interactions.Abstract,type:"rotate",alias:"interaction.rotate",config:{gesture:"rotate",currentRotation:0},oldRotations:null,getGestures:function(){return{rotate:"onRotate",rotateend:"onRotate",dragstart:"onGestureStart",drag:"onGesture",dragend:"onGestureEnd"}},getAngle:function(f){var c=this,b=c.getChart(),d=b.getEventXY(f),a=b.getCenter();return Math.atan2(d[1]-a[1],d[0]-a[0])},getEventRadius:function(h){var f=this,d=f.getChart(),g=d.getEventXY(h),a=d.getCenter(),c=g[0]-a[0],b=g[1]-a[1];return Math.sqrt(c*c+b*b)},onGestureStart:function(f){var d=this,c=d.getChart(),b=c.getRadius(),a=d.getEventRadius(f);if(b>=a){d.lockEvents("drag");d.angle=d.getAngle(f);d.oldRotations={};return false}},onGesture:function(g){var n=this,k=n.getChart(),b=n.getAngle(g)-n.angle,j=k.getAxes(),d=k.getSeries(),l,m=n.oldRotations,a,f,c,h;if(n.getLocks().drag===n){k.suspendAnimation();for(c=0,h=j.length;c=b[a-1]){return a-1}while(f+1>1,e=b[c];if(e===d){return c}else{if(e=b;t--){h=l[t]*e+m;g=z[t]*o+k;r.lineTo(f,g);r.lineTo(f=h,g)}}else{for(t=a;t>=b;t--){h=l[t]*e+m;g=z[t]*o+k;r.lineTo(h,g)}}}else{r.lineTo(l[a]*e+m,g);r.lineTo(l[a]*e+m,k);r.lineTo(l[b]*e+m,k);r.lineTo(l[b]*e+m,j[t]*o+k)}if(p.transformFillStroke){p.matrix.toContext(r)}r.fill();if(p.transformFillStroke){p.inverseMatrix.toContext(r)}r.beginPath();if(p.step){for(t=b;t<=a;t++){h=l[t]*e+m;g=j[t]*o+k;r.lineTo(h,d);r.lineTo(h,d=g);n.translationX=c.x(h,g);n.translationY=c.y(h,g);w.putMarker("markers",n,t,!p.renderer)}}else{for(t=b;t<=a;t++){h=l[t]*e+m;g=j[t]*o+k;r.lineTo(h,g);n.translationX=c.x(h,g);n.translationY=c.y(h,g);w.putMarker("markers",n,t,!p.renderer)}}if(p.transformFillStroke){p.matrix.toContext(r)}r.stroke()}});Ext.define("Ext.chart.series.Area",{extend:Ext.chart.series.StackedCartesian,alias:"series.area",type:"area",seriesType:"areaSeries"});Ext.define("Ext.chart.series.sprite.Bar",{alias:"sprite.barSeries",extend:Ext.chart.series.sprite.StackedCartesian,inheritableStatics:{def:{processors:{minBarWidth:"number",maxBarWidth:"number",minGapWidth:"number",radius:"number",inGroupGapWidth:"number"},defaults:{minBarWidth:2,maxBarWidth:100,minGapWidth:5,inGroupGapWidth:3,radius:0}}},drawLabel:function(j,h,r,g,o){var p=this,m=p.attr,e=p.getBoundMarker("labels")[0],c=e.getTemplate(),k=p.labelCfg||(p.labelCfg={}),b=p.surfaceMatrix,i=m.labelOverflowPadding,a=c.attr.display,l=c.attr.orientation,f,d,n,q;n=p.getMarkerBBox("labels",o,true);k.text=j;if(!n){p.putMarker("labels",k,o);n=p.getMarkerBBox("labels",o,true)}if(!m.flipXY){k.rotationRads=-Math.PI*0.5}else{k.rotationRads=0}k.calloutVertical=!m.flipXY;switch(l){case"horizontal":k.rotationRads=0;break;case"vertical":k.rotationRads=-Math.PI*0.5;break}d=(n.width/2+i);if(r>g){d=-d}if((l==="horizontal"&&m.flipXY)||(l==="vertical"&&!m.flipXY)||!l){f=(a==="insideStart")?r+d:g-d}else{f=(a==="insideStart")?r+i*2:g-i*2}k.x=b.x(h,f);k.y=b.y(h,f);f=(a==="insideStart")?r-d:g+d;k.calloutPlaceX=b.x(h,f);k.calloutPlaceY=b.y(h,f);f=(a==="insideStart")?r:g;k.calloutStartX=b.x(h,f);k.calloutStartY=b.y(h,f);if(r>g){d=-d}if(Math.abs(g-r)<=d*2||a==="outside"){k.callout=1}else{k.callout=0}if(c.attr.renderer){q=c.attr.renderer.call(this,j,e,k,{store:this.getStore()},o);if(typeof q==="string"){k.text=q}else{Ext.apply(k,q)}}p.putMarker("labels",k,o)},drawBar:function(j,b,d,c,f,i,a,e){var h=this.itemCfg||(this.itemCfg={}),g;h.x=c;h.y=f;h.width=i-c;h.height=a-f;h.radius=this.attr.radius;if(this.attr.renderer){g=this.attr.renderer.call(this,this,h,{store:this.getStore()},e);Ext.apply(h,g)}this.putMarker("items",h,e,!this.attr.renderer)},renderClipped:function(x,y,C){if(this.cleanRedraw){return}var G=this,w=G.attr,r=w.dataX,p=w.dataY,b=w.labels,H=w.dataStartY,c=w.groupCount,k=w.groupOffset-(c-1)*0.5,B=w.inGroupGapWidth,m,f,a=y.lineWidth,z=w.matrix,l=z.elements[0],v=z.elements[3],s=z.elements[4],q=x.roundPixel(z.elements[5])-1,F=l-w.minGapWidth,u=x.roundPixel(Math.max(w.minBarWidth,(Math.min(F,w.maxBarWidth)-B*(c-1))/c)),j=this.surfaceMatrix,e,D,n,t,A,E,h=0.5*w.lineWidth,g=Math.max(0,Math.floor(C[0])),d=Math.min(r.length-1,Math.ceil(C[2])),o=b&&!!this.getBoundMarker("labels");for(A=g;A<=d;A++){m=H?H[A]:0;f=p[A];E=r[A]*l+s+k*(u+B);e=x.roundPixel(E-u/2)+h;t=x.roundPixel(f*v+a+q);D=x.roundPixel(E+u/2)-h;n=x.roundPixel(m*v+a+q);G.drawBar(y,x,C,e,t-h,D,n-h,A);if(o&&b[A]){G.drawLabel(b[A],E,n,t,A)}G.putMarker("markers",{translationX:j.x(E,t),translationY:j.y(E,t)},A,true)}},getIndexNearPoint:function(l,k){var m=this,g=m.attr,h=g.dataX,a=m.getParent(),e=a.getRegion(),j=e[3],d,c,f=-1;if(g.flipXY){d=j-k;c=l}else{d=l;c=j-k}for(var b=0;b=n.x&&d<=(n.x+n.width)&&c>=n.y&&c<=(n.y+n.height)){f=b}}return f}});Ext.define("Ext.chart.series.Bar",{extend:Ext.chart.series.StackedCartesian,alias:"series.bar",type:"bar",seriesType:"barSeries",config:{itemInstancing:{type:"rect",fx:{customDuration:{x:0,y:0,width:0,height:0,radius:0}}}},getItemForPoint:function(a,e){if(this.getSprites()){var c=this,b=c.getChart(),d=b.getInnerPadding();arguments[0]=a-d.left;arguments[1]=e+d.bottom;return c.callParent(arguments)}},updateXAxis:function(a){a.setLabelInSpan(true);this.callSuper(arguments)},updateHidden:function(a){this.callParent(arguments);this.updateStacked()},updateStacked:function(c){var f=this.getSprites(),d=f.length,e=[],a={},b;for(b=0;bf+1&&zn.length*2*b[1]){continue}if(b[3]&&m.map["time_"+b[3]]){o=m.map["time_"+b[3]][0];A=m.map["time_"+b[3]][1]}else{o=k;A=F}f=l;t=s;j=true;r[l]=r[o];h[l]=h[o];w[l]=w[o];C[l]=C[o];a[l]=a[o];y[l]=y[o];g[l]=g[o];q[l]=q[o];p[l]=p[o];B[l]=B[o];t=Ext.Date.add(t,b[0],b[1]);for(v=o+1;vB[l]){B[l]=B[v];p[l]=p[v];C[l]=C[v]}if(q[v]f){m.map["time_"+b[2]]=[f,l]}}},"double":function(h,u,j,a,t,b,c){var e=0,k,f=1,n,d,v,g,s,l,m,r,q,p,o;while(u>e+1){k=e;e=u;f+=f;for(n=k;n=h.maxY[n+1]){s=h.maxIdx[n];p=h.maxX[n];o=h.maxY[n]}else{s=h.maxIdx[n+1];p=h.maxX[n+1];o=h.maxY[n+1]}}h.startIdx[u]=d;h.endIdx[u]=v;h.minIdx[u]=g;h.maxIdx[u]=s;h.open[u]=l;h.close[u]=m;h.minX[u]=r;h.minY[u]=q;h.maxX[u]=p;h.maxY[u]=o;u++}h.map["double_"+f]=[e,u]}},none:Ext.emptyFn,aggregateData:function(h,a,r,c,d){var b=h.length,e=[],s=[],f=[],q=[],j=[],p=[],n=[],o=[],m=[],k=[],g={startIdx:e,endIdx:s,minIdx:f,maxIdx:q,open:j,minX:p,minY:n,maxX:o,maxY:m,close:k},l;for(l=0;l=b[c.startIdx[a-1]]){return a-1}while(g+1>1,f=b[c.startIdx[d]];if(f===e){return d}else{if(f=b[c.endIdx[a-1]]){return a-1}while(g+1>1,f=b[c.endIdx[d]];if(f===e){return d}else{if(f0){if(e){d.getAggregator().setData(b.dataX,b.dataY,e,a,f)}else{d.getAggregator().setData(b.dataX,b.dataY)}}},getGapWidth:function(){return 1},renderClipped:function(a,b,d,e){var c=this,f=c.getAggregator()&&c.getAggregator().getAggregation(d[0],d[2],(d[2]-d[0])/e[2]*c.getGapWidth());if(f){c.dataStart=f.data.startIdx[f.start];c.dataEnd=f.data.endIdx[f.end-1];c.renderAggregates(f.data,f.start,f.end,a,b,d,e)}}});Ext.define("Ext.chart.series.sprite.CandleStick",{alias:"sprite.candlestickSeries",extend:Ext.chart.series.sprite.Aggregative,inheritableStatics:{def:{processors:{raiseStyle:function(b,a){return Ext.merge({},a||{},b)},dropStyle:function(b,a){return Ext.merge({},a||{},b)},barWidth:"number",padding:"number",ohlcType:"enums(candlestick,ohlc)"},defaults:{raiseStyle:{strokeStyle:"green",fillStyle:"green"},dropStyle:{strokeStyle:"red",fillStyle:"red"},planar:false,barWidth:15,padding:3,lineJoin:"miter",miterLimit:5,ohlcType:"candlestick"},dirtyTriggers:{raiseStyle:"raiseStyle",dropStyle:"dropStyle"},updaters:{raiseStyle:function(){this.raiseTemplate&&this.raiseTemplate.setAttributes(this.attr.raiseStyle)},dropStyle:function(){this.dropTemplate&&this.dropTemplate.setAttributes(this.attr.dropStyle)}}}},candlestick:function(i,c,a,e,h,f,b){var d=Math.min(c,h),g=Math.max(c,h);i.moveTo(f,e);i.lineTo(f,g);i.moveTo(f+b,g);i.lineTo(f+b,d);i.lineTo(f-b,d);i.lineTo(f-b,g);i.closePath();i.moveTo(f,a);i.lineTo(f,d)},ohlc:function(b,d,e,a,f,c,g){b.moveTo(c,e);b.lineTo(c,a);b.moveTo(c,d);b.lineTo(c-g,d);b.moveTo(c,f);b.lineTo(c+g,f)},constructor:function(){this.callSuper(arguments);this.raiseTemplate=new Ext.draw.sprite.Rect({parent:this});this.dropTemplate=new Ext.draw.sprite.Rect({parent:this})},getGapWidth:function(){var a=this.attr,b=a.barWidth,c=a.padding;return b+c},renderAggregates:function(e,d,c,v,w,C,b){var G=this,u=this.attr,l=u.dataX,y=u.matrix,f=y.getXX(),t=y.getYY(),m=y.getDX(),k=y.getDY(),q=u.barWidth/f,F,j=u.ohlcType,g=Math.round(q*0.5*f),a=e.open,x=e.high,o=e.low,B=e.close,E=e.maxY,r=e.minY,s=e.startIdx,n,h,H,p,D,A,z=u.lineWidth*v.devicePixelRatio/2;z-=Math.floor(z);w.save();F=this.raiseTemplate;F.useAttributes(w);w.beginPath();for(A=d;AB[A]){n=Math.round(a[A]*t+k)+z;h=Math.round(E[A]*t+k)+z;H=Math.round(r[A]*t+k)+z;p=Math.round(B[A]*t+k)+z;D=Math.round(l[s[A]]*f+m)+z;G[j](w,n,h,H,p,D,g)}}w.fillStroke(F.attr);w.restore()}});Ext.define("Ext.chart.series.CandleStick",{extend:Ext.chart.series.Cartesian,alias:"series.candlestick",type:"candlestick",seriesType:"candlestickSeries",config:{openField:null,highField:null,lowField:null,closeField:null},fieldCategoryY:["Open","High","Low","Close"]});Ext.define("Ext.chart.series.Gauge",{alias:"series.gauge",extend:Ext.chart.series.Series,type:"gauge",seriesType:"pieslice",config:{angleField:null,field:null,needle:false,needleLengthRatio:undefined,needleLength:90,needleWidth:4,donut:30,showInLegend:false,value:null,colors:null,sectors:null,minimum:0,maximum:100,rotation:0,totalAngle:Math.PI/2,region:[0,0,1,1],center:[0.5,0.75],radius:0.5,wholeDisk:false},updateNeedle:function(b){var a=this,d=a.getSprites(),c=a.valueToAngle(a.getValue());if(d&&d.length){d[0].setAttributes({startAngle:(b?c:0),endAngle:c,strokeOpacity:(b?1:0),lineWidth:(b?a.getNeedleWidth():0)});a.doUpdateStyles()}},updateColors:function(a,b){var g=this,k=g.getSectors(),l=k&&k.length,f=g.getSprites(),h=f&&f.length,c=Ext.Array.clone(a),j=a&&a.length,d=g.getNeedle(),e;if(!j||!a[0]){return}for(e=0;e0?f[b-1].end:d.getMinimum()),end:Math.min(e,d.getMaximum())};if(b==(c-1)&&f[b].end0?f[b-1].end:d.getMinimum())}if(typeof e.end=="number"){a=Math.min(e.end,d.getMaximum())}else{a=d.getMaximum()}f[b].start=g;f[b].end=a}}}else{f=[{start:d.getMinimum(),end:d.getMaximum()}]}return f},getSprites:function(){var j=this,m=j.getStore(),l=j.getValue(),c,g;if(!m&&!Ext.isNumber(l)){return[]}var h=j.getChart(),b=h.getAnimate(),f=j.sprites,k=0,o,n,e,d;if(f&&f.length){f[0].fx.setConfig(b);return f}d={store:m,field:j.getField(),value:l,series:j};o=j.createSprite();o.setAttributes({zIndex:10},true);o.rendererData=d;o.rendererIndex=k++;j.getLabel().getTemplate().setField(true);n=j.normalizeSectors(j.getSectors());for(c=0,g=n.length;c-1){c.splice(g,1)}if(c.length===0){h.element.un(j,"relayMethod",this,[h,f]);k.removeListener(b,"#"+d.getId(),"chartdetached","detachChart",this,"after");delete a[f]}}}},relayMethod:function(h,f,l){var k=l[0],g=l[1],q=this.dispatcher,a=this.targetType,b=k.getEventXY(h),n=b[0],m=b[1],p=this.getSubscribers(k.getId())[g],d,j;if(p){for(d=0,j=p.length;d2&&a.dataY.length>2){this.smoothX=Ext.draw.Draw.spline(a.dataX);this.smoothY=Ext.draw.Draw.spline(a.dataY)}else{delete this.smoothX;delete this.smoothY}}}}},list:null,updatePlainBBox:function(d){var b=this.attr,c=Math.min(0,b.dataMinY),a=Math.max(0,b.dataMaxY);d.x=b.dataMinX;d.y=c;d.width=b.dataMaxX-b.dataMinX;d.height=a-c},drawStroke:function(w,z,d,c,E,g){var v=this.attr,B=v.matrix,f=B.getXX(),s=B.getYY(),o=B.getDX(),m=B.getDY(),r=v.smooth,e=v.step,I=Math.pow(2,h(v.dataX.length,c)),u=this.smoothX,t=this.smoothY,C,A,n,H,q,G,p,F,l,k,D,b,a;function h(x,i){var j=0,y=x;while(y>0&&y>j}return j>0?j-1:j}z.beginPath();if(r&&u&&t){z.moveTo(u[d*3]*f+o,t[d*3]*s+m);for(C=0,A=d*3+1;C=a[2]-d){g=a[2]-d}}if(f<=a[1]+l){f=a[1]+l}else{if(f>=a[3]-l){f=a[3]-l}}m.x=b.x(g,f);m.y=b.y(g,f);if(c.attr.renderer){r=c.attr.renderer.call(this,k,e,m,{store:this.getStore()},p);if(typeof r==="string"){m.text=r}else{Ext.apply(m,r)}}q.putMarker("labels",m,p)},renderAggregates:function(w,t,k,K,n,F,O){var l=this,j=l.attr,r=j.dataX,q=j.dataY,g=j.labels,Q=g&&!!l.getBoundMarker("labels"),B=j.matrix,a=K.matrix,s=K.devicePixelRatio,A=B.getXX(),f=B.getYY(),d=B.getDX(),c=B.getDY(),z={},p=this.list||(this.list=[]),I,H,N,D,C=w.minX,e=w.maxX,h=w.minY,M=w.maxY,P=w.startIdx;p.length=0;for(N=t;No){p.push(o*A+d,m*f+c,P[N]);p.push(L*A+d,J*f+c,P[N])}else{p.push(o*A+d,m*f+c,P[N])}}}if(p.length){for(N=0;N(d.endRho-d.startRho)){return 0}c=Math.sqrt(d.endRho*d.endRho-g*g);b=Math.sqrt(d.endRho*d.endRho-i*i);j=Math.abs(d.endAngle-d.startAngle);a=(j>Math.PI/2?i:Math.abs(Math.tan(j/2))*i);if(f.height+e*2>Math.min(c,b,a)*2){return 0}return 1}});Ext.define("Ext.chart.series.Pie",{extend:Ext.chart.series.Polar,type:"pie",alias:"series.pie",seriesType:"pieslice",config:{labelField:false,donut:0,field:null,rotation:0,totalAngle:Math.PI*2,hidden:[],radiusFactor:100,style:{}},directions:["X"],setField:function(a){return this.setXField(a)},getField:function(){return this.getXField()},applyRadius:function(a){return a*this.getRadiusFactor()*0.01},updateLabelData:function(){var h=this,j=h.getStore(),g=j.getData().items,e=h.getSprites(),a=h.getLabel().getTemplate().getField(),d=h.getHidden(),b,f,c,k;if(e.length>0&&a){c=[];for(b=0,f=g.length;b=d.length){d[c]=false}}if(e!==0){e=g/e}for(c=0;c=0){return b%a}return(b%a+a)%a},betweenAngle:function(d,e,c){var f=this.normalizeAngle;e=f(e);c=f(c);d=f(d);if(c===0){c=Math.PI*2}return d>=e&&d=a){return{series:h,sprite:f[b],index:b,record:g[b],field:h.getXField()}}}}}return null},getItemForPoint:function(j,h){var u=this,f=u.getSprites();if(f){var t=u.getCenter(),r=u.getOffsetX(),q=u.getOffsetY(),e=j-t[0]+r,d=h-t[1]+q,c=u.getStore(),k=u.getDonut(),l=c.getData().items,s=Math.atan2(d,e)-u.getRotation(),a=Math.sqrt(e*e+d*d),b=u.getRadius(),n=k/100*b,p=u.getHidden(),o,g,m;for(o=0,g=l.length;o0){c=(i+d)*0.5;h+=Math.cos(c)*f;g+=Math.sin(c)*f*b;o.moveTo(h+n*k,g+l*k*b);o.lineTo(h+n*a,g+l*a*b);o.lineTo(h+n*a,g+l*a*b+m);o.lineTo(h+n*k,g+l*k*b+m);o.closePath()}},innerRenderer:function(p){var k=this.attr,g=k.margin,i=k.centerX,h=k.centerY,b=k.distortion,e=k.baseRotation,j=k.startAngle+e,d=k.endAngle+e,n=k.thickness,m=k.startRho,o,a,f,l,c;c=(j+d)*0.5;i+=Math.cos(c)*g;h+=Math.sin(c)*g*b;if(j>=Math.PI*2){j-=Math.PI*2;d-=Math.PI*2}if(d>Math.PI&&dMath.PI*3){f=Math.PI;l=d;o=Math.sin(l);a=Math.cos(l);p.ellipse(i,h,m,m*b,0,f,l,false);p.lineTo(i+a*m,h+o*m*b+n);p.ellipse(i,h+n,m,m*b,0,l,f,true);p.closePath()}},outerRenderer:function(p){var l=this.attr,h=l.margin,j=l.centerX,i=l.centerY,c=l.distortion,f=l.baseRotation,k=l.startAngle+f,e=l.endAngle+f,n=l.thickness,b=l.endRho,o,a,g,m,d;d=(k+e)*0.5;j+=Math.cos(d)*h;i+=Math.sin(d)*h*c;if(k>=Math.PI*2){k-=Math.PI*2;e-=Math.PI*2}if(kMath.PI*2){g=Math.max(k,Math.PI*2);m=e;o=Math.sin(m);a=Math.cos(m);p.ellipse(j,i,b,b*c,0,g,m,false);p.lineTo(j+a*b,i+o*b*c+n);p.ellipse(j,i+n,b,b*c,0,m,g,true);p.closePath()}}});Ext.define("Ext.chart.series.Pie3D",{extend:Ext.chart.series.Polar,type:"pie3d",seriesType:"pie3d",alias:"series.pie3d",config:{region:[0,0,0,0],thickness:35,distortion:0.5,field:false,lengthField:false,donut:false,rotation:0},applyRotation:function(b){var a=Math.PI*2;return(b%a+a)%a},updateRotation:function(b){var d=this.getSprites(),a,c;for(a=0,c=d.length;a1){for(c=a.length;b0){f.timeout=setTimeout(Ext.bind(i.handleTimeout,i,[f]),l)}i.setupErrorHandling(f);i[k]=Ext.bind(i.handleResponse,i,[f],true);i.loadScript(f);return f},abort:function(b){var c=this.requests,a;if(b){if(!b.id){b=c[b]}this.handleAbort(b)}else{for(a in c){if(c.hasOwnProperty(a)){this.abort(c[a])}}}},setupErrorHandling:function(a){a.script.onerror=Ext.bind(this.handleError,this,[a])},handleAbort:function(a){a.errorType="abort";this.handleResponse(null,a)},handleError:function(a){a.errorType="error";this.handleResponse(null,a)},cleanupErrorHandling:function(a){a.script.onerror=null},handleTimeout:function(a){a.errorType="timeout";this.handleResponse(null,a)},handleResponse:function(a,b){var c=true;if(b.timeout){clearTimeout(b.timeout)}delete this[b.callbackName];delete this.requests[b.id];this.cleanupErrorHandling(b);Ext.fly(b.script).destroy();if(b.errorType){c=false;Ext.callback(b.failure,b.scope,[b.errorType,b])}else{Ext.callback(b.success,b.scope,[a,b])}Ext.callback(b.callback,b.scope,[c,a,b.errorType,b])},createScript:function(c,d,b){var a=document.createElement("script");a.setAttribute("src",Ext.urlAppend(c,Ext.Object.toQueryString(d)));a.setAttribute("async",true);a.setAttribute("type","text/javascript");return a},loadScript:function(a){Ext.getHead().appendChild(a.script)}});Ext.define("Ext.data.JsonStore",{extend:Ext.data.Store,alias:"store.json",config:{proxy:{type:"ajax",reader:"json",writer:"json"}}});Ext.define("Ext.data.NodeInterface",{alternateClassName:"Ext.data.Node",statics:{decorate:function(d){if(!d.isNode){var g=Ext.data.ModelManager,c=d.modelName,e=g.getModel(c),b=[],f,h,a;e.override(this.getPrototypeBody());b=this.applyFields(e,[{name:"parentId",type:"string",defaultValue:null},{name:"index",type:"int",defaultValue:0},{name:"depth",type:"int",defaultValue:0,persist:false},{name:"expanded",type:"bool",defaultValue:false,persist:false},{name:"expandable",type:"bool",defaultValue:true,persist:false},{name:"checked",type:"auto",defaultValue:null},{name:"leaf",type:"bool",defaultValue:false,persist:false},{name:"cls",type:"string",defaultValue:null,persist:false},{name:"iconCls",type:"string",defaultValue:null,persist:false},{name:"root",type:"boolean",defaultValue:false,persist:false},{name:"isLast",type:"boolean",defaultValue:false,persist:false},{name:"isFirst",type:"boolean",defaultValue:false,persist:false},{name:"allowDrop",type:"boolean",defaultValue:true,persist:false},{name:"allowDrag",type:"boolean",defaultValue:true,persist:false},{name:"loaded",type:"boolean",defaultValue:false,persist:false},{name:"loading",type:"boolean",defaultValue:false,persist:false},{name:"href",type:"string",defaultValue:null,persist:false},{name:"hrefTarget",type:"string",defaultValue:null,persist:false},{name:"qtip",type:"string",defaultValue:null,persist:false},{name:"qtitle",type:"string",defaultValue:null,persist:false}]);a=b.length;e.getFields().isDirty=true;for(f=0;f0},isExpandable:function(){var a=this;if(a.get("expandable")){return !(a.isLeaf()||(a.isLoaded()&&!a.hasChildNodes()))}return false},appendChild:function(b,j,h){var f=this,c,e,d,g,a;if(Ext.isArray(b)){for(c=0,e=b.length;c0){Ext.Array.sort(d,f);for(c=0;ce){return 1}else{if(fa.data.index)?1:-1},applyFilters:function(b){var a=this;return function(c){return a.isVisible(c)}},applyProxy:function(a){},applyNode:function(a){if(a){a=Ext.data.NodeInterface.decorate(a)}return a},updateNode:function(a,c){if(c&&!c.isDestroyed){c.un({append:"onNodeAppend",insert:"onNodeInsert",remove:"onNodeRemove",load:"onNodeLoad",scope:this});c.unjoin(this)}if(a){a.on({scope:this,append:"onNodeAppend",insert:"onNodeInsert",remove:"onNodeRemove",load:"onNodeLoad"});a.join(this);var b=[];if(a.childNodes.length){b=b.concat(this.retrieveChildNodes(a))}if(this.getRootVisible()){b.push(a)}else{if(a.isLoaded()||a.isLoading()){a.set("expanded",true)}}this.data.clear();this.fireEvent("clear",this);this.suspendEvents();this.add(b);this.resumeEvents();if(b.length===0){this.loaded=a.loaded=true}this.fireEvent("refresh",this,this.data)}},retrieveChildNodes:function(a){var d=this.getNode(),b=this.getRecursive(),c=[],e=a;if(!a.childNodes.length||(!b&&a!==d)){return c}if(!b){return a.childNodes}while(e){if(e._added){delete e._added;if(e===a){break}else{e=e.nextSibling||e.parentNode}}else{if(e!==a){c.push(e)}if(e.firstChild){e._added=true;e=e.firstChild}else{e=e.nextSibling||e.parentNode}}}return c},isVisible:function(b){var a=b.parentNode;if(!this.getRecursive()&&a!==this.getNode()){return false}while(a){if(!a.isExpanded()){return false}if(a===this.getNode()){break}a=a.parentNode}return true}});Ext.define("Ext.data.TreeStore",{extend:Ext.data.NodeStore,alias:"store.tree",config:{root:undefined,clearOnLoad:true,nodeParam:"node",defaultRootId:"root",defaultRootProperty:"children",recursive:true},applyProxy:function(){return Ext.data.Store.prototype.applyProxy.apply(this,arguments)},applyRoot:function(a){var b=this;a=a||{};a=Ext.apply({},a);if(!a.isModel){Ext.applyIf(a,{id:b.getStoreId()+"-"+b.getDefaultRootId(),text:"Root",allowDrag:false});a=Ext.data.ModelManager.create(a,b.getModel())}Ext.data.NodeInterface.decorate(a);a.set(a.raw);return a},handleTreeInsertionIndex:function(a,b,d,c){if(b.parentNode){b.parentNode.sort(d.getSortFn(),true,true)}return this.callParent(arguments)},handleTreeSort:function(a,b){if(this._sorting){return a}this._sorting=true;this.getNode().sort(b.getSortFn(),true,true);delete this._sorting;return this.callParent(arguments)},updateRoot:function(a,b){if(b){b.unBefore({expand:"onNodeBeforeExpand",scope:this});b.unjoin(this)}a.onBefore({expand:"onNodeBeforeExpand",scope:this});this.onNodeAppend(null,a);this.setNode(a);if(!a.isLoaded()&&!a.isLoading()&&a.isExpanded()){this.load({node:a})}this.fireEvent("rootchange",this,a,b)},getNodeById:function(a){return this.data.getByKey(a)},getById:function(a){return this.data.getByKey(a)},onNodeBeforeExpand:function(b,a,c){if(b.isLoading()){c.pause();this.on("load",function(){c.resume()},this,{single:true})}else{if(!b.isLoaded()){c.pause();this.load({node:b,callback:function(){c.resume()}})}}},onNodeAppend:function(n,c){var l=this.getProxy(),j=l.getReader(),b=this.getModel(),g=c.raw,d=[],a=j.getRootProperty(),m,h,f,k,e;if(!c.isLeaf()){m=j.getRoot(g);if(m){h=j.extractData(m);for(f=0,k=h.length;f>>16)&4095)|(a<<12),4);e[3]=c.toHex(128|((c.clockSeq>>>8)&63),2)+c.toHex(c.clockSeq&255,2);e[4]=c.toHex(b.hi,4)+c.toHex(b.lo,8);if(a==4){c.init()}else{++d.lo;if(d.lo>=c.twoPow32){d.lo=0;++d.hi}}return e.join("-").toLowerCase()},init:function(){var b=this,a=b.getSalt(),c=b.getTimestamp();if(b.getVersion()==4){b.clockSeq=b.rand(0,b.twoPow14-1);if(!a){a={};b.setSalt(a)}if(!c){c={};b.setTimestamp(c)}a.lo=b.rand(0,b.twoPow32-1);a.hi=b.rand(0,b.twoPow16-1);c.lo=b.rand(0,b.twoPow32-1);c.hi=b.rand(0,b.twoPow28-1)}else{b.setSalt(b.split(b.getSalt()));b.setTimestamp(b.split(b.getTimestamp()));b.getSalt().hi|=256}},twoPow14:Math.pow(2,14),twoPow16:Math.pow(2,16),twoPow28:Math.pow(2,28),twoPow32:Math.pow(2,32),toHex:function(c,b){var a=c.toString(16);if(a.length>b){a=a.substring(a.length-b)}else{if(a.length0?n:null)}},function(w,v){f++;n.push({clientId:u,error:v});if(f===l&&typeof o=="function"){o.call(q||m,r,n)}})})},selectRecords:function(p,t,c,b){var u=this,s=u.getTable(),f=u.getModel().getIdProperty(),r="SELECT * FROM "+s,q=[],a=" WHERE ",l=" ORDER BY ",o,g,v,k,e,h,j,n,d,m;k=new Ext.data.ResultSet({records:q,success:true});if(!Ext.isObject(t)){r+=a+f+" = "+t}else{g=t.filters&&t.filters.length;if(g){for(o=0;o0?k:null)}},function(v,u){f++;k.push({clientId:t,error:u});if(f===h&&typeof l=="function"){l.call(o||j,p,k)}})})},destroyRecords:function(b,c,k,m){var h=this,l=h.getTable(),n=h.getModel().getIdProperty(),a=[],j=[],d=[],e,g,o,f;for(e=0,g=c.length;e")}for(;c");for(j in k){if(k.hasOwnProperty(j)){d.push("<",j,">",k[j],"")}}d.push("")}if(h){d.push("")}a.setXmlData(d.join(""));return a}});Ext.define("Ext.dataview.IndexBar",{extend:Ext.Component,alternateClassName:"Ext.IndexBar",config:{baseCls:Ext.baseCSSPrefix+"indexbar",direction:"vertical",letters:["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"],ui:"alphabet",listPrefix:null},platformConfig:[{theme:["Blackberry","Blackberry103"],direction:"vertical",letters:["*","#","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]}],itemCls:Ext.baseCSSPrefix+"",updateDirection:function(a,c){var b=this.getBaseCls();this.element.replaceCls(b+"-"+c,b+"-"+a)},getElementConfig:function(){if(Ext.theme.is.Blackberry||Ext.theme.is.Blackberry103){return{reference:"wrapper",classList:["x-centered","x-indexbar-wrapper"],children:[{reference:"indicator",classList:["x-indexbar-indicator"],hidden:true,children:[{reference:"indicatorInner",classList:["x-indexbar-indicator-inner"]}]},this.callParent()]}}else{return{reference:"wrapper",classList:["x-centered","x-indexbar-wrapper"],children:[this.callParent()]}}},updateLetters:function(c){this.innerElement.setHtml("");if(c){var b=c.length,a;for(a=0;ah.bottom||a.yh.right||a.xb[a-1]){return a-1}while(f+1>1,e=b[c];if(e==d){return c}else{if(em){l=m-j;if(lk){break}q=d.shift();d.push(q);n.updateListItem(q,a,c);n.topRenderedIndex++}}}}}},onAnimationIdle:function(){var m=this,d=m.getListItemInfo(),c=m.getBufferSize(),k=m.topVisibleIndex,h=m.topRenderedIndex,j=m.getStore().getCount()-1,f=m.listItems,o=f.length,b,e,g,l,n,a;b=k-h;e=h+c-k;if(b0){l=e-b;for(g=0;gj){break}n=f.shift();f.push(n);m.updateListItem(n,a,d);m.topRenderedIndex++}}m.handleItemHeights();m.handleItemTransforms();m.onIdleBound=false},handleItemHeights:function(){var n=this,e=n.updatedItems,k=e.length,f=n.getItemMap(),b=n.getUseSimpleItems(),r=f.getMinimumHeight(),q=n.headerIndices,l=n.headerMap,c=n.getVariableHeights(),a,h,g,m,p,o,d;for(h=0;h=0||(b===0&&d+m>=0)||(b===0&&-m<=k[b])){g=-10000}else{if(j<0){g=j}else{g=Math.max(0,m)}}a=n.getGroupString(i);if(c.$currentHeader!=a){c.setHtml(a);c.$currentHeader=a}if(c.$position!=g){c.translate(0,g);c.$position=g}}},createItem:function(c){var h=this,a=h.container,d=h.listItems,f=h.getInfinite(),g=h.scrollElement,i,e,b;i=Ext.factory(c);i.dataview=h;i.$height=c.minHeight;if(!f){b=h.getBaseCls()+"-item-relative";i.addCls(b)}e=i.getHeader();if(!f){e.addCls(b)}else{e.setTranslatable({translationMethod:this.translationMethod});e.translate(0,-10000);g.insertFirst(e.renderElement)}a.doAdd(i);d.push(i);return i},setItemsCount:function(a){var d=this,e=d.listItems,b=d.getListItemConfig(),f=a-e.length,c;for(c=0;c=0){l[b]=true}}l[d-1]=true;return m},onIndex:function(c,f){var h=this,l=f.toLowerCase(),j=h.getStore(),d=j.getGroups(),g=d.length,k,e,b,a;for(e=0;e=l){b=k;break}else{b=k}}if(b){this.scrollToRecord(b.children[0])}},scrollToRecord:function(f,b,c){var i=this,g=i.container.getScrollable().getScroller(),j=i.getStore(),h=j.indexOf(f);g.stopAnimation();var a=g.getContainerSize().y,l=g.getSize().y,d=l-a,e,k;if(i.getInfinite()){e=i.getItemMap().map[h]}else{k=i.listItems[h];if(k.getHeader().isPainted()){e=k.getHeader().renderElement.dom.offsetTop}else{e=k.renderElement.dom.offsetTop}}if(!c){e=Math.min(e,d)}g.scrollTo(0,e,!!b)},onItemAdd:function(c){var b=this,a=c.config;if(a.scrollDock){if(a.scrollDock=="bottom"){b.scrollDockItems.bottom.push(c)}else{b.scrollDockItems.top.push(c)}if(b.getInfinite()){c.on({resize:"onScrollDockItemResize",scope:this});c.addCls(b.getBaseCls()+"-scrolldockitem");c.setTranslatable({translationMethod:this.translationMethod});c.translate(0,-10000);c.$scrollDockHeight=0}b.container.doAdd(c)}else{b.callParent(arguments)}},getScrollDockedItems:function(){return this.scrollDockItems.bottom.slice().concat(this.scrollDockItems.top.slice())},onScrollDockItemResize:function(g,c){var f=this,a=f.listItems,e=a.length,b,d;Ext.getCmp(g.id).$scrollDockHeight=c.height;for(b=0;b class="x-list-item-leaf">'+a.getItemTextTpl(b)+""},this.getListConfig())}},function(){});Ext.define("Ext.dataview.element.List",{extend:Ext.dataview.element.Container,updateBaseCls:function(a){var b=this;b.itemClsShortCache=a+"-item";b.headerClsShortCache=a+"-header";b.headerClsCache="."+b.headerClsShortCache;b.headerItemClsShortCache=a+"-header-item";b.footerClsShortCache=a+"-footer-item";b.footerClsCache="."+b.footerClsShortCache;b.labelClsShortCache=a+"-item-label";b.labelClsCache="."+b.labelClsShortCache;b.disclosureClsShortCache=a+"-disclosure";b.disclosureClsCache="."+b.disclosureClsShortCache;b.iconClsShortCache=a+"-icon";b.iconClsCache="."+b.iconClsShortCache;this.callParent(arguments)},hiddenDisplayCache:Ext.baseCSSPrefix+"hidden-display",getItemElementConfig:function(e,h){var f=this,c=f.dataview,g=c.getItemCls(),b=f.itemClsShortCache,d,a;if(g){b+=" "+g}d={cls:b,children:[{cls:f.labelClsShortCache,html:c.getItemTpl().apply(h)}]};if(c.getIcon()){a=h.iconSrc;d.children.push({cls:f.iconClsShortCache,style:"background-image: "+a?'url("'+newSrc+'")':""})}if(c.getOnItemDisclosure()){d.children.push({cls:f.disclosureClsShortCache+" "+((h[c.getDisclosureProperty()]===false)?f.hiddenDisplayCache:"")})}return d},updateListItem:function(d,k){var h=this,e=h.dataview,j=Ext.fly(k),g=j.down(h.labelClsCache,true),c=e.prepareData(d.getData(true),e.getStore().indexOf(d),d),b=e.getDisclosureProperty(),a=c&&c.hasOwnProperty(b),l=c&&c.hasOwnProperty("iconSrc"),f,i;g.innerHTML=e.getItemTpl().apply(c);if(a){f=j.down(h.disclosureClsCache);f[c[b]===false?"addCls":"removeCls"](h.hiddenDisplayCache)}if(e.getIcon()){i=j.down(h.iconClsCache,true);i.style.backgroundImage=l?'url("'+l+'")':""}},doRemoveHeaders:function(){var e=this,a=e.headerItemClsShortCache,b=e.element.query(e.headerClsCache),f=b.length,c=0,d;for(;c0){if(a){for(c=0,d=a.length;c0){this.sendRequest(b==1?a[0]:a);this.callBuffer=[]}},configureFormRequest:function(e,a,b,h,i){var g=this,c,f,d;c=new Ext.direct.Transaction({provider:g,action:e,method:a.getName(),args:[b,h,i],callback:i&&Ext.isFunction(h)?Ext.Function.bind(h,i):h,isForm:true});if(g.fireEvent("beforecall",g,c,a)!==false){Ext.direct.Manager.addTransaction(c);f=String(b.getAttribute("enctype")).toLowerCase()=="multipart/form-data";d={extTID:c.id,extAction:e,extMethod:a.getName(),extType:"rpc",extUpload:String(f)};Ext.apply(c,{form:Ext.getDom(b),isUpload:f,params:h&&Ext.isObject(h.params)?Ext.apply(d,h.params):d});g.fireEvent("call",g,c,a);g.sendFormRequest(c)}},sendFormRequest:function(b){var a=this;Ext.Ajax.request({url:a.getUrl(),params:b.params,callback:a.onData,scope:a,form:b.form,isUpload:b.isUpload,transaction:b})}});Ext.define("Ext.dom.CompositeElement",{alternateClassName:"Ext.CompositeElement",extend:Ext.dom.CompositeElementLite,getElement:function(a){return a},transformElement:function(a){return Ext.get(a)}});Ext.define("Ext.event.Event",{alternateClassName:"Ext.EventObject",isStopped:false,set:function(a,b){if(arguments.length===1&&typeof a!="string"){var c=a;for(a in c){if(c.hasOwnProperty(a)){this[a]=c[a]}}}else{this[a]=c[a]}},stopEvent:function(){return this.stopPropagation()},stopPropagation:function(){this.isStopped=true;return this}});Ext.define("Ext.event.Dom",{extend:Ext.event.Event,constructor:function(a){var c=a.target,b;if(c&&c.nodeType!==1){c=c.parentNode}b=a.changedTouches;if(b){b=b[0];this.pageX=b.pageX;this.pageY=b.pageY}else{this.pageX=a.pageX;this.pageY=a.pageY}this.browserEvent=this.event=a;this.target=this.delegatedTarget=c;this.type=a.type;this.timeStamp=this.time=+a.timeStamp;return this},stopEvent:function(){this.preventDefault();return this.callParent()},preventDefault:function(){this.browserEvent.preventDefault()},getPageX:function(){return this.pageX||this.browserEvent.pageX},getPageY:function(){return this.pageY||this.browserEvent.pageY},getXY:function(){if(!this.xy){this.xy=[this.getPageX(),this.getPageY()]}return this.xy},getTarget:function(b,c,a){if(arguments.length===0){return this.delegatedTarget}return b?Ext.fly(this.target).findParent(b,c,a):(a?Ext.get(this.target):this.target)},getTime:function(){return this.time},setDelegatedTarget:function(a){this.delegatedTarget=a},makeUnpreventable:function(){this.browserEvent.preventDefault=Ext.emptyFn}});Ext.define("Ext.event.Touch",{extend:Ext.event.Dom,constructor:function(b,c,a,h){var f=[],d,e,j,g;if(c){this.set(c)}this.changedTouches=this.cloneTouches(b.changedTouches,a);for(e=0,j=h.length;e(?:[\s]*)|(?:\s*))([\w\-]+)$/i,handledEvents:["*"],getSubscribers:function(b,a){var d=this.subscribers,c=d[b];if(!c&&a){c=d[b]={type:{$length:0},selector:[],$length:0}}return c},subscribe:function(g,f){if(this.idSelectorRegex.test(g)){return false}var e=g.match(this.optimizedSelectorRegex),a=this.getSubscribers(f,true),k=a.type,c=a.selector,d,i,j,b,h;if(e!==null){d=e[1];i=e[2].indexOf(">")===-1;j=e[3];b=k[j];if(!b){k[j]=b={descendents:{$length:0},children:{$length:0},$length:0}}h=i?b.descendents:b.children;if(h.hasOwnProperty(d)){h[d]++;return true}h[d]=1;h.$length++;b.$length++;k.$length++}else{if(c.hasOwnProperty(g)){c[g]++;return true}c[g]=1;c.push(g)}a.$length++;return true},unsubscribe:function(g,f,k){var a=this.getSubscribers(f);if(!a){return false}var e=g.match(this.optimizedSelectorRegex),l=a.type,c=a.selector,d,i,j,b,h;k=Boolean(k);if(e!==null){d=e[1];i=e[2].indexOf(">")===-1;j=e[3];b=l[j];if(!b){return true}h=i?b.descendents:b.children;if(!h.hasOwnProperty(d)||(!k&&--h[d]>0)){return true}delete h[d];h.$length--;b.$length--;l.$length--}else{if(!c.hasOwnProperty(g)||(!k&&--c[g]>0)){return true}delete c[g];Ext.Array.remove(c,g)}if(--a.$length===0){delete this.subscribers[f]}return true},notify:function(d,a){var c=this.getSubscribers(a),e,b;if(!c||c.$length===0){return false}e=d.substr(1);b=Ext.ComponentManager.get(e);if(b){this.dispatcher.doAddListener(this.targetType,d,a,"publish",this,{args:[a,b]},"before")}},matchesSelector:function(b,a){return Ext.ComponentQuery.is(b,a)},dispatch:function(d,b,c,a){this.dispatcher.doDispatchEvent(this.targetType,d,b,c,null,a)},publish:function(g,k){var e=this.getSubscribers(g);if(!e){return}var p=arguments[arguments.length-1],o=e.type,b=e.selector,d=Array.prototype.slice.call(arguments,2,-2),l=k.xtypesChain,s,n,t,a,m,v,r,u,h,f,q,c;for(u=0,h=l.length;u0){s=e.descendents;if(s.$length>0){if(!a){a=k.getAncestorIds()}for(q=0,c=a.length;q0){if(!t){if(a){t=a[0]}else{v=k.getParent();if(v){t=v.getId()}}}if(t){if(n.hasOwnProperty(t)){this.dispatch("#"+t+" > "+f,g,d,p)}}}}}h=b.length;if(h>0){for(u=0;u0)){return true}delete d[f];if(--d.$length===0){delete this.subscribers[a]}return true},onBeforeComponentRenderedChange:function(b,d,g){var f=this.eventNames,c=g?f.painted:f.erased,e=this.getSubscribers(c),a;if(e&&e.$length>0){this.renderedQueue[d.getId()]=a=[];this.publish(e,d,c,a)}},onBeforeComponentHiddenChange:function(c,d){var f=this.eventNames,b=d?f.erased:f.painted,e=this.getSubscribers(b),a;if(e&&e.$length>0){this.hiddenQueue[c.getId()]=a=[];this.publish(e,c,b,a)}},onComponentRenderedChange:function(b,c){var d=this.renderedQueue,e=c.getId(),a;if(!d.hasOwnProperty(e)){return}a=d[e];delete d[e];if(a.length>0){this.dispatchQueue(a)}},onComponentHiddenChange:function(c){var b=this.hiddenQueue,d=c.getId(),a;if(!b.hasOwnProperty(d)){return}a=b[d];delete b[d];if(a.length>0){this.dispatchQueue(a)}},dispatchQueue:function(g){var l=this.dispatcher,a=this.targetType,b=this.eventNames,e=g.slice(),f=e.length,c,k,h,d,j;g.length=0;if(f>0){for(c=0;c0)){return true}delete a[f];d[g][f].destroy();delete d[g][f];if(--a.$length===0){delete d[g];delete this.subscribers[g];i.removeListener(b,g,"painted","onComponentPainted",this,"before")}return true},onComponentPainted:function(b){var c=b.getObservableId(),a=this.sizeMonitors[c];if(a.resize){a.resize.refresh()}if(a.innerresize){a.innerresize.refresh()}},onComponentSizeChange:function(b,c,a){this.dispatcher.doDispatchEvent(this.targetType,c,a,[b])}});Ext.define("Ext.event.publisher.Dom",{extend:Ext.event.publisher.Publisher,targetType:"element",idOrClassSelectorRegex:/^([#|\.])([\w\-]+)$/,handledEvents:["focus","blur","paste","input","change","keyup","keydown","keypress","submit","transitionend","animationstart","animationend"],classNameSplitRegex:/\s+/,SELECTOR_ALL:"*",constructor:function(){var f=this.getHandledEvents(),e={},b,c,a,d;this.doBubbleEventsMap={click:true,submit:true,mousedown:true,mousemove:true,mouseup:true,mouseover:true,mouseout:true,transitionend:true};this.onEvent=Ext.Function.bind(this.onEvent,this);for(b=0,c=f.length;b0)){return true}delete c[i];c.$length--}else{if(!d.hasOwnProperty(i)||(!j&&--d[i]>0)){return true}delete d[i];d.$length--}}else{if(g===this.SELECTOR_ALL){if(j){a.all=0}else{a.all--}}else{if(!b.hasOwnProperty(g)||(!j&&--b[g]>0)){return true}delete b[g];Ext.Array.remove(b,g)}}a.$length--;return true},getElementTarget:function(a){if(a.nodeType!==1){a=a.parentNode;if(!a||a.nodeType!==1){return null}}return a},getBubblingTargets:function(b){var a=[];if(!b){return a}do{a[a.length]=b;b=b.parentNode}while(b&&b.nodeType===1);return a},dispatch:function(c,a,b){b.push(b[0].target);this.callParent(arguments)},publish:function(b,a,c){var d=this.getSubscribers(b),e;if(d.$length===0||!this.doPublish(d,b,a,c)){e=this.getSubscribers("*");if(e.$length>0){this.doPublish(e,b,a,c)}}return this},doPublish:function(f,h,x,u){var r=f.id,g=f.className,b=f.selector,p=r.$length>0,a=g.$length>0,l=b.length>0,o=f.all>0,y={},e=[u],q=false,m=this.classNameSplitRegex,v,k,t,d,z,n,c,w,s;for(v=0,k=x.length;v0)){return true}delete d[f];this.monitors[f].destroy();delete this.monitors[f];return true},onElementPainted:function(b,a){Ext.TaskQueue.requestRead("dispatch",this,[b,"painted",[a]])}});Ext.define("Ext.mixin.Templatable",{extend:Ext.mixin.Mixin,mixinConfig:{id:"templatable"},referenceAttributeName:"reference",referenceSelector:"[reference]",getElementConfig:function(){return{reference:"element"}},getElementTemplate:function(){var a=document.createDocumentFragment();a.appendChild(Ext.Element.create(this.getElementConfig(),true));return a},initElement:function(){var a=this.self.prototype;a.elementTemplate=this.getElementTemplate();a.initElement=a.doInitElement;this.initElement.apply(this,arguments)},linkElement:function(a,b){this.link(a,b)},doInitElement:function(){var g=this.referenceAttributeName,c,d,e,f,b,a;c=this.elementTemplate.cloneNode(true);d=c.querySelectorAll(this.referenceSelector);for(e=0,f=d.length;e0){c.width=b;c.height=j;c.contentWidth=a;c.contentHeight=i;c.flag=g;e=true;this.getCallback().apply(this.getScope(),this.getArgs())}return e},refresh:function(a){if(this.refreshSize()||a){Ext.TaskQueue.requestWrite("refreshMonitors",this)}},destroy:function(){var a=this.getElement();this.bindListeners(false);if(a&&!a.isDestroyed){a.removeCls("x-size-monitored")}delete this._element;this.callSuper()}});Ext.define("Ext.util.sizemonitor.Default",{extend:Ext.util.sizemonitor.Abstract,updateElement:function(a){},bindListeners:function(b){var a=this.getElement().dom;if(!a){return}if(b){a.onresize=this.refresh}else{delete a.onresize}},getContentBounds:function(){return this.getElement().dom.getBoundingClientRect()},getContentWidth:function(){return this.getElement().getWidth()},getContentHeight:function(){return this.getElement().getHeight()}});Ext.define("Ext.util.sizemonitor.Scroll",{extend:Ext.util.sizemonitor.Abstract,getElementConfig:function(){return{reference:"detectorsContainer",classList:["x-size-monitors","scroll"],children:[{reference:"expandMonitor",className:"expand"},{reference:"shrinkMonitor",className:"shrink"}]}},constructor:function(a){this.onScroll=Ext.Function.bind(this.onScroll,this);this.callSuper(arguments)},bindListeners:function(b){var a=b?"addEventListener":"removeEventListener";this.expandMonitor[a]("scroll",this.onScroll,true);this.shrinkMonitor[a]("scroll",this.onScroll,true)},forceRefresh:function(){Ext.TaskQueue.requestRead("refresh",this,[true])},onScroll:function(){Ext.TaskQueue.requestRead("refresh",this)},refreshMonitors:function(){var b=this.expandMonitor,c=this.shrinkMonitor,a=1000000;if(b&&!b.isDestroyed){b.scrollLeft=a;b.scrollTop=a}if(c&&!c.isDestroyed){c.scrollLeft=a;c.scrollTop=a}}});Ext.define("Ext.util.sizemonitor.OverflowChange",{extend:Ext.util.sizemonitor.Abstract,constructor:function(a){this.onExpand=Ext.Function.bind(this.onExpand,this);this.onShrink=Ext.Function.bind(this.onShrink,this);this.callSuper(arguments)},getElementConfig:function(){return{reference:"detectorsContainer",classList:["x-size-monitors","overflowchanged"],children:[{reference:"expandMonitor",className:"expand",children:[{reference:"expandHelper"}]},{reference:"shrinkMonitor",className:"shrink",children:[{reference:"shrinkHelper"}]}]}},bindListeners:function(b){var a=b?"addEventListener":"removeEventListener";this.expandMonitor[a](Ext.browser.is.Firefox?"underflow":"overflowchanged",this.onExpand,true);this.shrinkMonitor[a](Ext.browser.is.Firefox?"overflow":"overflowchanged",this.onShrink,true)},onExpand:function(a){if(Ext.browser.is.Webkit&&a.horizontalOverflow&&a.verticalOverflow){return}Ext.TaskQueue.requestRead("refresh",this)},onShrink:function(a){if(Ext.browser.is.Webkit&&!a.horizontalOverflow&&!a.verticalOverflow){return}Ext.TaskQueue.requestRead("refresh",this)},refreshMonitors:function(){if(this.isDestroyed){return}var f=this.expandHelper,e=this.shrinkHelper,b=this.getContentBounds(),d=b.width,a=b.height,c;if(f&&!f.isDestroyed){c=f.style;c.width=(d+1)+"px";c.height=(a+1)+"px"}if(e&&!e.isDestroyed){c=e.style;c.width=d+"px";c.height=a+"px"}Ext.TaskQueue.requestRead("refresh",this)}});Ext.define("Ext.util.SizeMonitor",{constructor:function(a){var b=Ext.util.sizemonitor;if(Ext.browser.is.Firefox){return new b.OverflowChange(a)}else{if(Ext.browser.is.WebKit||Ext.browser.is.IE11){return new b.Scroll(a)}else{return new b.Default(a)}}}});Ext.define("Ext.event.publisher.ElementSize",{extend:Ext.event.publisher.Publisher,targetType:"element",handledEvents:["resize"],constructor:function(){this.monitors={};this.callSuper(arguments)},subscribe:function(e){var b=e.match(this.idSelectorRegex),d=this.subscribers,f,c,a;if(!b){return false}f=b[1];if(d.hasOwnProperty(f)){d[f]++;return true}d[f]=1;c=Ext.get(f);this.monitors[f]=a=new Ext.util.SizeMonitor({element:c,callback:this.onElementResize,scope:this,args:[e,c]});this.dispatcher.addListener("element",e,"painted","forceRefresh",a);return true},unsubscribe:function(g,a,e){var c=g.match(this.idSelectorRegex),f=this.subscribers,d=this.monitors,h,b;if(!c){return false}h=c[1];if(!f.hasOwnProperty(h)||(!e&&--f[h]>0)){return true}delete f[h];b=d[h];this.dispatcher.removeListener("element",g,"painted","forceRefresh",b);b.destroy();delete d[h];return true},onElementResize:function(c,a,b){Ext.TaskQueue.requestRead("dispatch",this,[c,"resize",[a,b]])}});Ext.define("Ext.event.publisher.TouchGesture",{extend:Ext.event.publisher.Dom,isNotPreventable:/^(select|a)$/i,handledEvents:["touchstart","touchmove","touchend","touchcancel"],mouseToTouchMap:{mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},lastEventType:null,config:{moveThrottle:0,recognizers:{}},constructor:function(a){var b=this;this.eventProcessors={touchstart:this.onTouchStart,touchmove:this.onTouchMove,touchend:this.onTouchEnd,touchcancel:this.onTouchEnd};this.eventToRecognizerMap={};this.activeRecognizers=[];this.touchesMap={};this.currentIdentifiers=[];if(Ext.browser.is.Chrome&&Ext.os.is.Android){this.screenPositionRatio=Ext.browser.version.gt("18")?1:1/window.devicePixelRatio}else{if(Ext.browser.is.AndroidStock4){this.screenPositionRatio=1}else{if(Ext.os.is.BlackBerry){this.screenPositionRatio=1/window.devicePixelRatio}else{if(Ext.browser.engineName=="WebKit"&&Ext.os.is.Desktop){this.screenPositionRatio=1}else{this.screenPositionRatio=window.innerWidth/window.screen.width}}}}this.initConfig(a);if(Ext.feature.has.Touch){b.onTargetTouchMove=b.onTargetTouchMove.bind(b);b.onTargetTouchEnd=b.onTargetTouchEnd.bind(b)}return this.callSuper()},applyRecognizers:function(b){var c,a;for(c in b){if(b.hasOwnProperty(c)){a=b[c];if(a){this.registerRecognizer(a)}}}return b},handles:function(a){return this.callSuper(arguments)||this.eventToRecognizerMap.hasOwnProperty(a)},doesEventBubble:function(){return true},onEvent:function(f){var d=f.type,b=this.lastEventType,c=[f];if(this.eventProcessors[d]){this.eventProcessors[d].call(this,f);return}if("button" in f&&f.button>0){return}else{if(d==="mousedown"&&b&&b!=="mouseup"){var a=document.createEvent("MouseEvent");a.initMouseEvent("mouseup",f.bubbles,f.cancelable,document.defaultView,f.detail,f.screenX,f.screenY,f.clientX,f.clientY,f.ctrlKey,f.altKey,f.shiftKey,f.metaKey,f.metaKey,f.button,f.relatedTarget);this.onEvent(a)}if(d!=="mousemove"){this.lastEventType=d}f.identifier=1;f.touches=(d!=="mouseup")?c:[];f.targetTouches=(d!=="mouseup")?c:[];f.changedTouches=c;this.eventProcessors[this.mouseToTouchMap[d]].call(this,f)}},registerRecognizer:function(a){var g=this.eventToRecognizerMap,e=this.activeRecognizers,c=a.getHandledEvents(),d,f,b;a.setOnRecognized(this.onRecognized);a.setCallbackScope(this);for(d=0,f=c.length;d=2){g.preventDefault()}if(b){h.addEventListener("touchmove",k.onTargetTouchMove);h.addEventListener("touchend",k.onTargetTouchEnd);h.addEventListener("touchcancel",k.onTargetTouchEnd)}for(d=0;d0){this.invokeRecognizers("onTouchMove",d)}},onTouchEnd:function(h){if(!this.isStarted){return}if(this.lastMoveEvent){this.onAnimationFrame()}var a=this.touchesMap,d=this.currentIdentifiers,f=h.changedTouches,g=f.length,b,c,j;this.updateTouches(f);f=h.changedTouches;for(c=0;c0){return}a=this.pointerToTouchMap[a];b.identifier=b.pointerId;b.changedTouches=[b];this.eventProcessors[a].call(this,b)}})}else{if(!Ext.browser.is.Ripple&&(Ext.os.is.ChromeOS||!Ext.feature.has.Touch)){this.override({handledEvents:["touchstart","touchmove","touchend","touchcancel","mousedown","mousemove","mouseup"]})}}});Ext.define("Ext.event.recognizer.Recognizer",{mixins:[Ext.mixin.Identifiable],handledEvents:[],config:{onRecognized:Ext.emptyFn,onFailed:Ext.emptyFn,callbackScope:null},constructor:function(a){this.initConfig(a);return this},getHandledEvents:function(){return this.handledEvents},onStart:Ext.emptyFn,onEnd:Ext.emptyFn,fail:function(){this.getOnFailed().apply(this.getCallbackScope(),arguments);return false},fire:function(){this.getOnRecognized().apply(this.getCallbackScope(),arguments)}});Ext.define("Ext.event.recognizer.Touch",{extend:Ext.event.recognizer.Recognizer,onTouchStart:Ext.emptyFn,onTouchMove:Ext.emptyFn,onTouchEnd:Ext.emptyFn});Ext.define("Ext.event.recognizer.SingleTouch",{extend:Ext.event.recognizer.Touch,inheritableStatics:{NOT_SINGLE_TOUCH:1,TOUCH_MOVED:2},onTouchStart:function(a){if(a.touches.length>1){return this.fail(this.self.NOT_SINGLE_TOUCH)}}});Ext.define("Ext.event.recognizer.DoubleTap",{extend:Ext.event.recognizer.SingleTouch,inheritableStatics:{DIFFERENT_TARGET:3},config:{maxDuration:300},handledEvents:["singletap","doubletap"],singleTapTimer:null,startTime:0,lastTapTime:0,onTouchStart:function(a){if(this.callParent(arguments)===false){return false}this.startTime=a.time;clearTimeout(this.singleTapTimer)},onTouchMove:function(){return this.fail(this.self.TOUCH_MOVED)},onEnd:function(g){var i=this,d=this.getMaxDuration(),f=g.changedTouches[0],a=g.time,h=g.target,j=this.lastTapTime,b=this.lastTarget,c;this.lastTapTime=a;this.lastTarget=h;if(j){c=a-j;if(c<=d){if(h!==b){return this.fail(this.self.DIFFERENT_TARGET)}this.lastTarget=null;this.lastTapTime=0;this.fire("doubletap",g,[f],{touch:f,duration:c});return}}if(a-this.startTime>d){this.fireSingleTap(g,f)}else{this.singleTapTimer=setTimeout(function(){i.fireSingleTap(g,f)},d)}},fireSingleTap:function(a,b){this.fire("singletap",a,[b],{touch:b})}});Ext.define("Ext.event.recognizer.Drag",{extend:Ext.event.recognizer.SingleTouch,isStarted:false,startPoint:null,previousPoint:null,lastPoint:null,handledEvents:["dragstart","drag","dragend"],config:{minDistance:8},constructor:function(){this.callSuper(arguments);this.info={touch:null,previous:{x:0,y:0},x:0,y:0,delta:{x:0,y:0},absDelta:{x:0,y:0},flick:{velocity:{x:0,y:0}},direction:{x:0,y:0},time:0,previousTime:{x:0,y:0}}},onTouchStart:function(a){if(this.callSuper(arguments)===false){if(this.isStarted&&this.lastMoveEvent!==null){this.lastMoveEvent.isStopped=false;this.onTouchEnd(this.lastMoveEvent)}return false}this.startTime=a.time;this.startPoint=a.changedTouches[0].point},tryDragStart:function(f){var b=this.startPoint,d=f.changedTouches,h=d[0],a=h.point,g=this.getMinDistance(),c=this.info;if(Math.abs(a.getDistanceTo(b))>=g){this.isStarted=true;this.previousPoint=this.lastPoint=a;this.resetInfo("x",f,h);this.resetInfo("y",f,h);c.time=f.time;this.fire("dragstart",f,d,c)}},onTouchMove:function(c){if(!this.isStarted){this.tryDragStart(c)}if(!this.isStarted){return}var b=c.changedTouches,d=b[0],a=d.point;if(this.lastPoint){this.previousPoint=this.lastPoint}this.lastPoint=a;this.lastMoveEvent=c;this.updateInfo("x",c,d,true);this.updateInfo("y",c,d,true);this.info.time=c.time;this.fire("drag",c,b,this.info)},onAxisDragEnd:function(a,c){var b=c.time-c.previousTime[a];if(b>0){c.flick.velocity[a]=(c[a]-c.previous[a])/b}},resetInfo:function(c,g,i){var d=this.lastPoint[c],b=this.startPoint[c],h=d-b,a=c.toUpperCase(),f=this.info;f.touch=i;f.delta[c]=h;f.absDelta[c]=Math.abs(h);f.previousTime[c]=this.startTime;f.previous[c]=b;f[c]=d;f.direction[c]=0;f["start"+a]=this.startPoint[c];f["previous"+a]=f.previous[c];f["page"+a]=f[c];f["delta"+a]=f.delta[c];f["absDelta"+a]=f.absDelta[c];f["previousDelta"+a]=0;f.startTime=this.startTime},updateInfo:function(f,k,j,l){var d=k.time,n=this.lastPoint[f],g=this.previousPoint[f],a=this.startPoint[f],o=n-a,c=this.info,m=c.direction,i=f.toUpperCase(),b=c.previous[f],h;c.touch=j;h=c.delta[f];c.delta[f]=o;c.absDelta[f]=Math.abs(o);if(l&&n!==b&&n!==c[f]&&d-c.previousTime[f]>=50){c.previous[f]=c[f];c.previousTime[f]=c.time}c[f]=n;if(n>g){m[f]=1}else{if(nthis.getMaxDuration()){return this.fail(this.self.MAX_DURATION_EXCEEDED)}if(this.isHorizontal&&c>this.getMaxOffset()){this.isHorizontal=false}if(this.isVertical&&d>this.getMaxOffset()){this.isVertical=false}if(!this.isVertical||!this.isHorizontal){if(this.isHorizontal&&df){this.isVertical=false}if(this.isHorizontal&&b>f){this.isHorizontal=false}if(this.isVertical&&this.isHorizontal){if(b>c){this.isHorizontal=false}else{this.isVertical=false}}if(this.isHorizontal){m=(h<0)?"left":"right";a=h}else{if(this.isVertical){m=(g<0)?"up":"down";a=g}}this.direction=this.direction||m;if(this.direction=="up"){a=g*-1}else{if(this.direction=="left"){a=h*-1}}this.distance=a;if(a==0){return this.fail(this.self.DISTANCE_NOT_ENOUGH)}if(!this.started){if(this.direction=="right"&&this.startX>p){return this.fail(this.self.NOT_NEAR_EDGE)}else{if(this.direction=="down"&&this.startY>p){return this.fail(this.self.NOT_NEAR_EDGE)}else{if(this.direction=="left"&&(n-this.startX)>p){return this.fail(this.self.NOT_NEAR_EDGE)}else{if(this.direction=="up"&&(j-this.startY)>p){return this.fail(this.self.NOT_NEAR_EDGE)}}}}this.started=true;this.startTime=k.time;this.fire("edgeswipestart",k,[i],{touch:i,direction:this.direction,distance:this.distance,duration:d})}else{this.fire("edgeswipe",k,[i],{touch:i,direction:this.direction,distance:this.distance,duration:d})}},onTouchEnd:function(b){if(this.onTouchMove(b)!==false){var c=b.changedTouches[0],a=b.time-this.startTime;this.fire("edgeswipeend",b,[c],{touch:c,direction:this.direction,distance:this.distance,duration:a})}}});Ext.define("Ext.event.recognizer.HorizontalSwipe",{extend:Ext.event.recognizer.Swipe,handledEvents:["swipe"],onTouchStart:function(a){if(this.callParent(arguments)===false){return false}var b=a.changedTouches[0];this.startTime=a.time;this.startX=b.pageX;this.startY=b.pageY},onTouchMove:function(f){var h=f.changedTouches[0],g=h.pageY,a=Math.abs(g-this.startY),d=f.time,c=this.getMaxDuration(),b=this.getMaxOffset();if(d-this.startTime>c){return this.fail(this.self.MAX_DURATION_EXCEEDED)}if(a>b){return this.fail(this.self.MAX_OFFSET_EXCEEDED)}},onTouchEnd:function(f){if(this.onTouchMove(f)!==false){var i=f.changedTouches[0],a=i.pageX,b=a-this.startX,h=Math.abs(b),d=f.time-this.startTime,g=this.getMinDistance(),c;if(ha){this.end(d)}}},onTouchEnd:function(a){this.end(a)},start:function(){if(!this.isTracking){this.isTracking=true;this.isStarted=false}},end:function(a){if(this.isTracking){this.isTracking=false;if(this.isStarted){this.isStarted=false;this.fireEnd(a)}}}});Ext.define("Ext.event.recognizer.Pinch",{extend:Ext.event.recognizer.MultiTouch,requiredTouchesCount:2,handledEvents:["pinchstart","pinch","pinchend"],startDistance:0,lastTouches:null,onTouchMove:function(c){if(!this.isTracking){return}var b=Array.prototype.slice.call(c.touches),d,a,f;d=b[0].point;a=b[1].point;f=d.getDistanceTo(a);if(f===0){return}if(!this.isStarted){this.isStarted=true;this.startDistance=f;this.fire("pinchstart",c,b,{touches:b,distance:f,scale:1})}else{this.fire("pinch",c,b,{touches:b,distance:f,scale:f/this.startDistance})}this.lastTouches=b},fireEnd:function(a){this.fire("pinchend",a,this.lastTouches)},fail:function(){return this.callParent(arguments)}});Ext.define("Ext.event.recognizer.Rotate",{extend:Ext.event.recognizer.MultiTouch,requiredTouchesCount:2,handledEvents:["rotatestart","rotate","rotateend"],startAngle:0,lastTouches:null,lastAngle:null,onTouchMove:function(h){if(!this.isTracking){return}var g=Array.prototype.slice.call(h.touches),b=this.lastAngle,d,f,c,a,i,j;d=g[0].point;f=g[1].point;c=d.getAngleTo(f);if(b!==null){j=Math.abs(b-c);a=c+360;i=c-360;if(Math.abs(a-b)=this.getMoveDistance()){this.fire("tapcancel",b,[c],{touch:c});return this.fail(this.self.TOUCH_MOVED)}},onTouchEnd:function(a){var b=a.changedTouches[0];this.fire("tap",a,[b],{touch:b})}});Ext.define("Ext.event.recognizer.VerticalSwipe",{extend:Ext.event.recognizer.Swipe,onTouchStart:function(a){if(this.callParent(arguments)===false){return false}var b=a.changedTouches[0];this.startTime=a.time;this.startX=b.pageX;this.startY=b.pageY},onTouchMove:function(g){var h=g.changedTouches[0],a=h.pageX,b=Math.abs(a-this.startX),d=this.getMaxDuration(),c=this.getMaxOffset(),f=g.time;if(f-this.startTime>d){return this.fail(this.self.MAX_DURATION_EXCEEDED)}if(b>c){return this.fail(this.self.MAX_OFFSET_EXCEEDED)}},onTouchEnd:function(d){if(this.onTouchMove(d)!==false){var i=d.changedTouches[0],h=i.pageY,a=h-this.startY,g=Math.abs(a),c=d.time-this.startTime,f=this.getMinDistance(),b;if(g'+Ext.baseCSSPrefix+'picker-invalid">{'+a+"}")}},updateAlign:function(a,c){var b=this.element;b.addCls(Ext.baseCSSPrefix+"picker-"+a);b.removeCls(Ext.baseCSSPrefix+"picker-"+c)},applyData:function(d){var f=[],c=d&&d.length,a,b,e;if(d&&Ext.isArray(d)&&c){for(a=0;a0){c[0].addCls(b+"first");c[c.length-1].addCls(b+"last")}this.updateUseTitles(this.getUseTitles())},onDoneButtonTap:function(){var a=this._value,b=this.getValue(true);if(b!=a){this.fireEvent("change",this,b)}this.hide();Ext.util.InputBlocker.unblockInputs()},onCancelButtonTap:function(){this.fireEvent("cancel",this);this.hide();Ext.util.InputBlocker.unblockInputs()},onSlotPick:function(a){this.fireEvent("pick",this,this.getValue(true),a)},show:function(){if(this.getParent()===undefined){Ext.Viewport.add(this)}this.callParent(arguments);if(!this.isHidden()){this.setValue(this._value)}Ext.util.InputBlocker.blockInputs()},setValue:function(k,a){var f=this,d=f.getInnerItems(),e=d.length,j,h,c,b,g;if(!k){k={};for(b=0;b{'+this.getDisplayField()+":htmlEncode}",listeners:{select:this.onListSelect,itemtap:this.onListTap,scope:this}}},a))}return this.listPanel},onMaskTap:function(){this.onFocus();return false},showPicker:function(){var f=this,j=f.getStore(),i=f.getValue();if(!j||j.getCount()===0){return}if(f.getReadOnly()){return}f.isFocused=true;if(f.getUsePicker()){var d=f.getPhonePicker(),a=f.getName(),h={};h[a]=i;d.setValue(h);if(!d.getParent()){Ext.Viewport.add(d)}d.show()}else{var g=f.getTabletPicker(),e=g.down("list"),c,b;if(!g.getParent()){Ext.Viewport.add(g)}g.showBy(f.getComponent(),null);if(i||f.getAutoSelect()){j=e.getStore();c=j.find(f.getValueField(),i,null,null,null,true);b=j.getAt(c);if(b){e.select(b,null,true)}}}},onListSelect:function(c,a){var b=this;if(a){b.setValue(a)}},onListTap:function(){this.listPanel.hide({type:"fade",out:true,scope:this})},onPickerChange:function(d,f){var e=this,g=f[e.getName()],b=e.getStore(),c=b.find(e.getValueField(),g,null,null,null,true),a=b.getAt(c);e.setValue(a)},onChange:function(f,h,e){var g=this,b=g.getStore(),d=(b)?b.find(g.getDisplayField(),e,null,null,null,true):-1,c=g.getValueField(),a=(b)?b.getAt(d):null;e=(a)?a.get(c):null;g.fireEvent("change",g,g.getValue(),e)},updateOptions:function(b){var a=this.getStore();if(!a){this.setStore(true);a=this._store}if(!b){a.clearData()}else{a.setData(b);this.onStoreDataChanged(a)}return this},applyStore:function(a){if(a===true){a=Ext.create("Ext.data.Store",{fields:[this.getValueField(),this.getDisplayField()],autoDestroy:true})}if(a){a=Ext.data.StoreManager.lookup(a);a.on({scope:this,addrecords:"onStoreDataChanged",removerecords:"onStoreDataChanged",updaterecord:"onStoreDataChanged",refresh:"onStoreDataChanged"})}return a},updateStore:function(a){if(a){this.onStoreDataChanged(a)}if(this.getUsePicker()&&this.picker){this.picker.down("pickerslot").setStore(a)}else{if(this.listPanel){this.listPanel.down("dataview").setStore(a)}}},onStoreDataChanged:function(a){var c=this.getInitialConfig(),b=this.getValue();if(b||b==0){this.updateValue(this.applyValue(b))}if(this.getValue()===null){if(c.hasOwnProperty("value")){this.setValue(c.value)}if(this.getValue()===null&&this.getAutoSelect()){if(a.getCount()>0){this.setValue(a.getAt(0))}}}},doSetDisabled:function(b){var a=this.getComponent();if(a){a.setDisabled(b)}Ext.Component.prototype.doSetDisabled.apply(this,arguments)},setDisabled:function(){Ext.Component.prototype.setDisabled.apply(this,arguments)},updateLabelWidth:function(){if(Ext.theme.is.Blackberry||Ext.theme.is.Blackberry103){return}else{this.callParent(arguments)}},updateLabelAlign:function(){if(Ext.theme.is.Blackberry||Ext.theme.is.Blackberry103){return}else{this.callParent(arguments)}},reset:function(){var d=this,a;if(d.getAutoSelect()){var b=d.getStore();a=(d.originalValue)?d.originalValue:b.getAt(0)}else{var e=d.getUsePicker(),c=e?d.picker:d.listPanel;if(c){c=c.child(e?"pickerslot":"dataview");c.deselectAll()}a=null}d.setValue(a);return d},onFocus:function(b){if(this.getDisabled()){return false}var a=this.getComponent();this.fireEvent("focus",this,b);if(Ext.os.is.Android4){a.input.dom.focus()}a.input.dom.blur();this.isFocused=true;this.showPicker()},destroy:function(){this.callParent(arguments);var a=this.getStore();if(a&&a.getAutoDestroy()){Ext.destroy(a)}Ext.destroy(this.listPanel,this.picker)}});Ext.define("Ext.picker.Date",{extend:Ext.picker.Picker,xtype:"datepicker",alternateClassName:"Ext.DatePicker",config:{yearFrom:1980,yearTo:new Date().getFullYear(),monthText:"Month",dayText:"Day",yearText:"Year",slotOrder:["month","day","year"],doneButton:true},platformConfig:[{theme:["Windows"],doneButton:{iconCls:"check2",ui:"round",text:""}}],initialize:function(){this.callParent();this.on({scope:this,delegate:"> slot",slotpick:this.onSlotPick});this.on({scope:this,show:this.onSlotPick})},setValue:function(b,a){if(Ext.isDate(b)){b={day:b.getDate(),month:b.getMonth()+1,year:b.getFullYear()}}this.callParent([b,a]);this.onSlotPick()},getValue:function(k){var h={},e=this.getItems().items,d=e.length,a,g,c,f,j,b;for(b=0;be,j,d,a;while(m){f.push({text:m,value:m});if(m===e){break}if(h){m--}else{m++}}a=k.getDaysInMonth(1,new Date().getFullYear());for(d=0;d thumb",tap:"onTap",dragstart:"onThumbDragStart",drag:"onThumbDrag",dragend:"onThumbDragEnd"});var a=this.getThumb(0);if(a){a.on("resize","onThumbResize",this)}},factoryThumb:function(){return Ext.factory(this.getThumbConfig(),Ext.slider.Thumb)},getThumbs:function(){return this.innerItems},getThumb:function(a){if(typeof a!="number"){a=0}return this.innerItems[a]},refreshOffsetValueRatio:function(){var b=this.getMaxValue()-this.getMinValue(),a=this.elementWidth-this.thumbWidth;this.offsetValueRatio=a/b},onThumbResize:function(){var a=this.getThumb(0);if(a){this.thumbWidth=a.getElementWidth()}this.refresh()},onResize:function(a,b){this.elementWidth=b.width;this.refresh()},refresh:function(){this.refreshValue()},setActiveThumb:function(b){var a=this.activeThumb;if(a&&a!==b){a.setZIndex(null)}this.activeThumb=b;b.setZIndex(2);return this},onThumbDragStart:function(a,b){if(b.absDeltaX<=b.absDeltaY||this.getReadOnly()){return false}else{b.stopPropagation()}if(this.getAllowThumbsOverlapping()){this.setActiveThumb(a)}this.dragStartValue=this.getValue()[this.getThumbIndex(a)];this.fireEvent("dragstart",this,a,this.dragStartValue,b)},onThumbDrag:function(c,g,a){var d=this.getThumbIndex(c),f=this.offsetValueRatio,b=this.constrainValue(this.getMinValue()+a/f);g.stopPropagation();this.setIndexValue(d,b);this.fireEvent("drag",this,c,this.getValue(),g);return false},setIndexValue:function(d,f,b){var a=this.getThumb(d),h=this.getValue(),e=this.getMinValue(),c=this.offsetValueRatio,g=this.getIncrement(),i=a.getDraggable();i.setOffset((f-e)*c,null,b);h[d]=e+Math.round((i.offset.x/c)/g)*g},onThumbDragEnd:function(a,f){this.refreshThumbConstraints(a);var c=this.getThumbIndex(a),d=this.getValue()[c],b=this.dragStartValue;this.fireEvent("dragend",this,a,this.getValue(),f);if(b!==d){this.fireEvent("change",this,a,d,b)}},getThumbIndex:function(a){return this.getThumbs().indexOf(a)},refreshThumbConstraints:function(d){var b=this.getAllowThumbsOverlapping(),a=d.getDraggable().getOffset().x,c=this.getThumbs(),e=this.getThumbIndex(d),g=c[e-1],h=c[e+1],f=this.thumbWidth;if(g){g.getDraggable().addExtraConstraint({max:{x:a-((b)?0:f)}})}if(h){h.getDraggable().addExtraConstraint({min:{x:a+((b)?0:f)}})}},onTap:function(j){if(this.isDisabled()||this.getReadOnly()){return}var k=Ext.get(j.target);if(!k||(Ext.browser.engineName=="WebKit"&&k.hasCls("x-thumb"))){return}var n=j.touch.point.x,h=this.element,c=h.getX(),d=n-c-(this.thumbWidth/2),o=this.constrainValue(this.getMinValue()+d/this.offsetValueRatio),r=this.getValue(),q=Infinity,m=r.length,g,f,l,p,b,a;if(m===1){p=0}else{for(g=0;g=(a/2)){e+=(c>0)?a:-a}e=Math.max(d,e);e=Math.min(f,e);return e},setThumbsCount:function(e){var a=this.getThumbs(),f=a.length,c,d,b;if(f>e){for(c=0,d=f-e;c1){this.addCls(Ext.baseCSSPrefix+"slider-multiple")}}});Ext.define("Ext.util.TapRepeater",{mixins:{observable:Ext.mixin.Observable},config:{el:null,accelerate:true,interval:10,delay:250,preventDefault:true,stopDefault:false,timer:0,pressCls:null},constructor:function(a){var b=this;b.initConfig(a)},updateEl:function(c,b){var a={touchstart:"onTouchStart",touchend:"onTouchEnd",tap:"eventOptions",scope:this};if(b){b.un(a)}c.on(a)},eventOptions:function(a){if(this.getPreventDefault()){a.preventDefault()}if(this.getStopDefault()){a.stopEvent()}},destroy:function(){this.clearListeners();Ext.destroy(this.el)},onTouchStart:function(c){var b=this,a=b.getPressCls();clearTimeout(b.getTimer());if(a){b.getEl().addCls(a)}b.tapStartTime=new Date();b.fireEvent("touchstart",b,c);b.fireEvent("tap",b,c);if(b.getAccelerate()){b.delay=400}b.setTimer(Ext.defer(b.tap,b.getDelay()||b.getInterval(),b,[c]))},tap:function(b){var a=this;a.fireEvent("tap",a,b);a.setTimer(Ext.defer(a.tap,a.getAccelerate()?a.easeOutExpo(Ext.Date.getElapsed(a.tapStartTime),400,-390,12000):a.getInterval(),a,[b]))},easeOutExpo:function(e,a,g,f){return(e==f)?a+g:g*(-Math.pow(2,-10*e/f)+1)+a},onTouchEnd:function(b){var a=this;clearTimeout(a.getTimer());a.getEl().removeCls(a.getPressCls());a.fireEvent("touchend",a,b)}});Ext.define("Ext.field.Spinner",{extend:Ext.field.Number,xtype:"spinnerfield",alternateClassName:"Ext.form.Spinner",config:{cls:Ext.baseCSSPrefix+"spinner",minValue:Number.NEGATIVE_INFINITY,maxValue:Number.MAX_VALUE,stepValue:0.1,accelerateOnTapHold:true,cycle:false,clearIcon:false,defaultValue:0,tabIndex:-1,groupButtons:true,component:{disabled:true}},platformConfig:[{platform:"android",component:{disabled:false,readOnly:true}}],constructor:function(){var a=this;a.callParent(arguments);if(!a.getValue()){a.suspendEvents();a.setValue(a.getDefaultValue());a.resumeEvents()}},syncEmptyCls:Ext.emptyFn,updateComponent:function(b){this.callParent(arguments);var a=this.getCls();if(b){this.spinDownButton=Ext.Element.create({cls:a+"-button "+a+"-button-down",html:"-"});this.spinUpButton=Ext.Element.create({cls:a+"-button "+a+"-button-up",html:"+"});this.downRepeater=this.createRepeater(this.spinDownButton,this.onSpinDown);this.upRepeater=this.createRepeater(this.spinUpButton,this.onSpinUp)}},updateGroupButtons:function(a,e){var c=this,d=c.innerElement,b=c.getBaseCls()+"-grouped-buttons";c.getComponent();if(a!=e){if(a){this.addCls(b);d.appendChild(c.spinDownButton);d.appendChild(c.spinUpButton)}else{this.removeCls(b);d.insertFirst(c.spinDownButton);d.appendChild(c.spinUpButton)}}},applyValue:function(a){a=parseFloat(a);if(isNaN(a)||a===null){a=this.getDefaultValue()}a=Math.round(a*10)/10;return this.callParent([a])},createRepeater:function(c,b){var d=this,a=Ext.create("Ext.util.TapRepeater",{el:c,accelerate:d.getAccelerateOnTapHold()});a.on({tap:b,touchstart:"onTouchStart",touchend:"onTouchEnd",scope:d});return a},onSpinDown:function(){if(!this.getDisabled()&&!this.getReadOnly()){this.spin(true)}},onSpinUp:function(){if(!this.getDisabled()&&!this.getReadOnly()){this.spin(false)}},onTouchStart:function(a){if(!this.getDisabled()&&!this.getReadOnly()){a.getEl().addCls(Ext.baseCSSPrefix+"button-pressed")}},onTouchEnd:function(a){a.getEl().removeCls(Ext.baseCSSPrefix+"button-pressed")},spin:function(h){var c=this,b=c.getValue(),a=c.getStepValue(),g=h?"down":"up",e=c.getMinValue(),f=c.getMaxValue(),d;if(h){d=b-a}else{d=b+a}if(c.getCycle()){if(b==e&&df){d=e}}c.setValue(d);d=c.getValue();c.fireEvent("spin",c,d,g);c.fireEvent("spin"+g,c,d)},doSetDisabled:function(a){Ext.Component.prototype.doSetDisabled.apply(this,arguments)},setDisabled:function(){Ext.Component.prototype.setDisabled.apply(this,arguments)},reset:function(){this.setValue(this.getDefaultValue())},destroy:function(){var a=this;Ext.destroy(a.downRepeater,a.upRepeater,a.spinDownButton,a.spinUpButton);a.callParent(arguments)}},function(){});Ext.define("Ext.slider.Toggle",{extend:Ext.slider.Slider,config:{baseCls:"x-toggle",minValueCls:"x-toggle-off",maxValueCls:"x-toggle-on"},initialize:function(){this.callParent();this.on({change:"onChange"})},applyMinValue:function(){return 0},applyMaxValue:function(){return 1},applyIncrement:function(){return 1},updateMinValueCls:function(c,b){var a=this.element;if(b&&a.hasCls(b)){a.replaceCls(b,c)}},updateMaxValueCls:function(c,b){var a=this.element;if(b&&a.hasCls(b)){a.replaceCls(b,c)}},setValue:function(b,a){this.callParent(arguments);this.onChange(this,this.getThumbs()[0],b,a)},setIndexValue:function(c,e,d){var b=this.getValue()[c];this.callParent(arguments);var a=this.getThumb(c),f=this.getValue()[c];if(b!==f){this.fireEvent("change",this,a,f,b)}},onChange:function(e,a,g,c){var h=g>0,b=e.getMaxValueCls(),f=e.getMinValueCls(),d=this.element;d.addCls(h?b:f);d.removeCls(h?f:b)},toggle:function(){var a=this.getValue();this.setValue((a==1)?0:1);return this},onTap:function(){if(this.isDisabled()||this.getReadOnly()){return}var b=this.getValue(),c=(b==1)?0:1,a=this.getThumb(0);this.setIndexValue(0,c,this.getAnimation());this.refreshThumbConstraints(a)}});Ext.define("Ext.field.Toggle",{extend:Ext.field.Slider,xtype:"togglefield",alternateClassName:"Ext.form.Toggle",config:{cls:"x-toggle-field",labelAlign:"left",activeLabel:null,inactiveLabel:null},platformConfig:[{theme:["Windows"],labelAlign:"left"},{theme:["Blackberry","Blackberry103","MountainView"],activeLabel:"On",inactiveLabel:"Off"}],proxyConfig:{minValueCls:"x-toggle-off",maxValueCls:"x-toggle-on"},applyComponent:function(a){return Ext.factory(a,Ext.slider.Toggle)},updateActiveLabel:function(b,a){if(b!=a){this.getComponent().element.dom.setAttribute("data-activelabel",b)}},updateInactiveLabel:function(b,a){if(b!=a){this.getComponent().element.dom.setAttribute("data-inactivelabel",b)}},setValue:function(b){if(b===true){b=1}var a=this.getValue();if(a!=b){this.getComponent().setValue(b);this.fireEvent("change",this,b,a)}return this},getValue:function(){return(this.getComponent().getValue()==1)?1:0},onSliderChange:function(c,a,d,b){this.fireEvent.call(this,"change",this,d,b)},toggle:function(){var a=this.getValue();this.setValue((a==1)?0:1);return this},onChange:function(){this.setLabel((this.getValue()==1)?this.toggleOnLabel:this.toggleOffLabel)}});Ext.define("Ext.field.Url",{extend:Ext.field.Text,xtype:"urlfield",alternateClassName:"Ext.form.Url",config:{autoCapitalize:false,component:{type:"url"}}});Ext.define("Ext.form.FieldSet",{extend:Ext.Container,alias:"widget.fieldset",config:{baseCls:Ext.baseCSSPrefix+"form-fieldset",title:null,instructions:null},applyTitle:function(a){if(typeof a=="string"){a={title:a}}Ext.applyIf(a,{docked:"top",baseCls:this.getBaseCls()+"-title"});return Ext.factory(a,Ext.Title,this._title)},updateTitle:function(b,a){if(b){this.add(b)}if(a){this.remove(a)}},getTitle:function(){var a=this._title;if(a&&a instanceof Ext.Title){return a.getTitle()}return a},applyInstructions:function(a){if(typeof a=="string"){a={title:a}}Ext.applyIf(a,{docked:"bottom",baseCls:this.getBaseCls()+"-instructions"});return Ext.factory(a,Ext.Title,this._instructions)},updateInstructions:function(b,a){if(b){this.add(b)}if(a){this.remove(a)}},getInstructions:function(){var a=this._instructions;if(a&&a instanceof Ext.Title){return a.getTitle()}return a},doSetDisabled:function(a){this.getFieldsAsArray().forEach(function(b){b.setDisabled(a)});return this},getFieldsAsArray:function(){var a=[],b=function(c){if(c.isField){a.push(c)}if(c.isContainer){c.getItems().each(b)}};this.getItems().each(b);return a}});Ext.define("Ext.form.Panel",{alternateClassName:"Ext.form.FormPanel",extend:Ext.Panel,xtype:"formpanel",config:{baseCls:Ext.baseCSSPrefix+"form",standardSubmit:false,url:null,enctype:null,baseParams:null,submitOnAction:false,record:null,method:"post",scrollable:{translatable:{translationMethod:"scrollposition"}},trackResetOnLoad:false,api:null,paramOrder:null,paramsAsHash:null,timeout:30,multipartDetection:true,enableSubmissionForm:true},getElementConfig:function(){var a=this.callParent();a.tag="form";a.children.push({tag:"input",type:"submit",style:"visibility: hidden; width: 0; height: 0; position: absolute; right: 0; bottom: 0;"});return a},initialize:function(){var a=this;a.callParent();a.element.on({submit:"onSubmit",scope:a})},applyEnctype:function(b){var a=this.element.dom||null;if(a){if(b){a.setAttribute("enctype",b)}else{a.setAttribute("enctype")}}},updateRecord:function(c){var a,b,d;if(c&&(a=c.fields)){b=this.getValues();for(d in b){if(b.hasOwnProperty(d)&&a.containsKey(d)){c.set(d,b[d])}}}return this},setRecord:function(a){var b=this;if(a&&a.data){b.setValues(a.data)}b._record=a;return this},onSubmit:function(b){var a=this;if(b&&!a.getStandardSubmit()){b.stopEvent()}else{if(a.getEnableSubmissionForm()){b.stopEvent()}this.submit(null,b)}},updateSubmitOnAction:function(a){if(a){this.on({action:"onFieldAction",scope:this})}else{this.un({action:"onFieldAction",scope:this})}},onFieldAction:function(a){if(this.getSubmitOnAction()){a.blur();this.submit()}},submit:function(a,f){a=a||{};var c=this,d=c.getValues(c.getStandardSubmit()||!a.submitDisabled),b=c.element.dom||{};if(this.getEnableSubmissionForm()){b=this.createSubmissionForm(b,d)}a=Ext.apply({url:c.getUrl()||b.action,submit:false,form:b,method:c.getMethod()||b.method||"post",autoAbort:false,params:null,waitMsg:null,headers:null,success:null,failure:null},a||{});return c.fireAction("beforesubmit",[c,d,a,f],"doBeforeSubmit")},createSubmissionForm:function(e,c){var a=this.getFields(),d,b,f,g,h;if(e.nodeType===1){e=e.cloneNode(false);for(d in c){b=document.createElement("input");b.setAttribute("type","text");b.setAttribute("name",d);b.setAttribute("value",c[d]);e.appendChild(b)}}for(d in a){if(a.hasOwnProperty(d)){f=a[d];if(f.isFile){if(!e.$fileswap){e.$fileswap=[]}h=f.getComponent().input;g=h.dom;b=g.cloneNode(true);g.parentNode.insertBefore(b,g.nextSibling);e.appendChild(g);e.$fileswap.push({original:g,placeholder:b})}else{if(f.isPassword){if(f.getComponent().getType!=="password"){f.setRevealed(false)}}}}}return e},doBeforeSubmit:function(r,n,d){var c=d.form||{},g=false;if(this.getMultipartDetection()===true){this.getFieldsAsArray().forEach(function(i){if(i.isFile===true){g=true;return false}});if(g){c.setAttribute("enctype","multipart/form-data")}}if(d.enctype){c.setAttribute("enctype",d.enctype)}if(r.getStandardSubmit()){if(d.url&&Ext.isEmpty(c.action)){c.action=d.url}var o=this.query("spinnerfield"),j=o.length,q,b;for(q=0;q0){}else{return j+l}}return j}else{if(g=="number"){if(j==0){return"0"}if(this.lengthProperties[b]){return j+l}if(this.angleProperties[b]){return j+this.DEFAULT_UNIT_ANGLE}if(this.durationProperties[b]){return j+this.DEFAULT_UNIT_DURATION}}else{if(b==="transform"){e=this.transformMethods;c=[];for(d=0,f=e.length;d0)?k.join(", "):"none"}}}}return j}});Ext.define("Ext.fx.runner.CssTransition",{extend:Ext.fx.runner.Css,listenersAttached:false,constructor:function(){this.runningAnimationsData={};return this.callParent(arguments)},attachListeners:function(){this.listenersAttached=true;this.getEventDispatcher().addListener("element","*","transitionend","onTransitionEnd",this)},onTransitionEnd:function(b){var a=b.target,c=a.id;if(c&&this.runningAnimationsData.hasOwnProperty(c)){this.refreshRunningAnimationsData(Ext.get(a),[b.browserEvent.propertyName])}},onAnimationEnd:function(g,f,d,j,n){var c=g.getId(),k=this.runningAnimationsData[c],o={},m={},b,h,e,l,a;d.un("stop","onAnimationStop",this);if(k){b=k.nameMap}o[c]=m;if(f.onBeforeEnd){f.onBeforeEnd.call(f.scope||this,g,j)}d.fireEvent("animationbeforeend",d,g,j);this.fireEvent("animationbeforeend",this,d,g,j);if(n||(!j&&!f.preserveEndState)){h=f.toPropertyNames;for(e=0,l=h.length;e0},refreshRunningAnimationsData:function(d,k,t,p){var g=d.getId(),q=this.runningAnimationsData,a=q[g];if(!a){return}var m=a.nameMap,s=a.nameList,b=a.sessions,f,h,e,u,l,c,r,o,n=false;t=Boolean(t);p=Boolean(p);if(!b){return this}f=b.length;if(f===0){return this}if(p){a.nameMap={};s.length=0;for(l=0;l");d.close();this.testElement=c=d.createElement("div");c.style.setProperty("position","absolute","important");d.body.appendChild(c);this.testElementComputedStyle=window.getComputedStyle(c)}return c},getCssStyleValue:function(b,e){var d=this.getTestElement(),a=this.testElementComputedStyle,c=d.style;c.setProperty(b,e);if(Ext.browser.is.Firefox){d.offsetHeight}e=a.getPropertyValue(b);c.removeProperty(b);return e},run:function(q){var G=this,h=this.lengthProperties,y={},F={},H={},d,t,z,e,v,J,w,r,s,a,n,B,A,p,C,l,u,g,D,I,k,f,x,o,c,E,b,m;if(!this.listenersAttached){this.attachListeners()}q=Ext.Array.from(q);for(B=0,p=q.length;B0){this.refreshRunningAnimationsData(d,Ext.Array.merge(J,w),true,H.replacePrevious)}c=a.nameMap;E=a.nameList;u={};for(A=0;A0){J=Ext.Array.difference(E,J);w=Ext.Array.merge(J,w);n["transition-property"]=J}y[t]=n;F[t]=Ext.apply({},e);F[t]["transition-property"]=w;F[t]["transition-duration"]=H.duration;F[t]["transition-timing-function"]=H.easing;F[t]["transition-delay"]=H.delay;C.startTime=Date.now()}s=this.$className;this.applyStyles(y);r=function(i){if(i.data===s&&i.source===window){window.removeEventListener("message",r,false);G.applyStyles(F)}};if(Ext.browser.is.IE){window.requestAnimationFrame(function(){window.addEventListener("message",r,false);window.postMessage(s,"*")})}else{window.addEventListener("message",r,false);window.postMessage(s,"*")}},onAnimationStop:function(d){var f=this.runningAnimationsData,h,a,g,b,c,e;for(h in f){if(f.hasOwnProperty(h)){a=f[h];g=a.sessions;for(b=0,c=g.length;b=g){this.isEnded=true;return a}return f}});Ext.define("Ext.fx.layout.card.Cube",{extend:Ext.fx.layout.card.Style,alias:"fx.layout.card.cube",config:{reverse:null,inAnimation:{type:"cube"},outAnimation:{type:"cube",out:true}}});Ext.define("Ext.fx.layout.card.ScrollCover",{extend:Ext.fx.layout.card.Scroll,alias:"fx.layout.card.scrollcover",onActiveItemChange:function(c,g,d,k,e){var i,a,j,h,b,f;this.lastController=e;this.inItem=g;if(g&&d){i=this.getLayout().container.innerElement;a=i.getSize();j=this.calculateXY(a);h={easing:this.getEasing(),duration:this.getDuration()};g.renderElement.dom.style.setProperty("visibility","hidden","important");b=g.setTranslatable(true).getTranslatable();f=d.setTranslatable(true).getTranslatable();f.translate({x:0,y:0});b.translate({x:j.left,y:j.top});b.getWrapper().dom.style.setProperty("z-index","100","important");g.show();b.on({animationstart:"onInAnimationStart",animationend:"onInAnimationEnd",scope:this});b.translateAnimated({x:0,y:0},h);e.pause()}},onInAnimationStart:function(){this.inItem.renderElement.dom.style.removeProperty("visibility")},onInAnimationEnd:function(){this.inItem.getTranslatable().getWrapper().dom.style.removeProperty("z-index");this.lastController.resume()}});Ext.define("Ext.fx.layout.card.ScrollReveal",{extend:Ext.fx.layout.card.Scroll,alias:"fx.layout.card.scrollreveal",onActiveItemChange:function(c,g,d,k,e){var i,a,j,h,f,b;this.lastController=e;this.outItem=d;this.inItem=g;if(g&&d){i=this.getLayout().container.innerElement;a=i.getSize();j=this.calculateXY(a);h={easing:this.getEasing(),duration:this.getDuration()};f=d.setTranslatable(true).getTranslatable();b=g.setTranslatable(true).getTranslatable();f.getWrapper().dom.style.setProperty("z-index","100","important");f.translate({x:0,y:0});b.translate({x:0,y:0});g.show();f.on({animationend:"onOutAnimationEnd",scope:this});f.translateAnimated({x:j.x,y:j.y},h);e.pause()}},onOutAnimationEnd:function(){this.outItem.getTranslatable().getWrapper().dom.style.removeProperty("z-index");this.lastController.resume()}});Ext.define("Ext.fx.runner.CssAnimation",{extend:Ext.fx.runner.Css,constructor:function(){this.runningAnimationsMap={};this.elementEndStates={};this.animationElementMap={};this.keyframesRulesCache={};this.uniqueId=0;return this.callParent(arguments)},attachListeners:function(){var a=this.getEventDispatcher();this.listenersAttached=true;a.addListener("element","*","animationstart","onAnimationStart",this);a.addListener("element","*","animationend","onAnimationEnd",this)},onAnimationStart:function(g){var b=g.browserEvent.animationName,a=this.animationElementMap[b],f=this.runningAnimationsMap[a][b],h=this.elementEndStates,c=h[a],d={};console.log("START============= "+b);if(c){delete h[a];d[a]=c;this.applyStyles(d)}if(f.before){d[a]=f.before;this.applyStyles(d)}},onAnimationEnd:function(i){var c=i.target,b=i.browserEvent.animationName,d=this.animationElementMap,a=d[b],f=this.runningAnimationsMap,h=f[a],g=h[b];console.log("END============= "+b);if(g.onBeforeEnd){g.onBeforeEnd.call(g.scope||this,c)}if(g.onEnd){g.onEnd.call(g.scope||this,c)}delete d[b];delete h[b];this.removeKeyframesRule(b)},generateAnimationId:function(){return"animation-"+(++this.uniqueId)},run:function(f){var s={},t=this.elementEndStates,o=this.animationElementMap,r=this.runningAnimationsMap,b,d,h,k,p,g,q,u,m,l,c,e,a,j,n;if(!this.listenersAttached){this.attachListeners()}f=Ext.Array.from(f);for(p=0,g=f.length;p1;d.doChangeView(c,a,false)},onViewRemove:function(c){var d=this,b=d.backButtonStack,a;d.endAnimation();b.pop();a=b.length>1;d.doChangeView(c,a,true)},doChangeView:function(k,c,g){var r=this,o=r.leftBox,e=o.element,f=r.titleComponent,m=f.element,n=r.getBackButton(),l=r.getTitleText(),h=r.getBackButtonText(),q=r.getAnimation()&&k.getLayout().getAnimation(),p=q&&q.isAnimation&&k.isPainted(),d,i,a,j,b;if(p){i=r.createProxy(o.element);e.setStyle("opacity","0");n.setText(h);n[c?"show":"hide"]();a=r.createProxy(f.element.getParent());m.setStyle("opacity","0");r.setTitle(l);d=r.measureView(i,a,g);j=d.left;b=d.title;r.isAnimating=true;r.animate(e,j.element);r.animate(m,b.element,function(){m.setLeft(d.titleLeft);r.isAnimating=false;r.refreshTitlePosition()});if(Ext.browser.is.AndroidStock2&&!this.getAndroid2Transforms()){i.ghost.destroy();a.ghost.destroy()}else{r.animate(i.ghost,j.ghost);r.animate(a.ghost,b.ghost,function(){i.ghost.destroy();a.ghost.destroy()})}}else{if(c){n.setText(h);n.show()}else{n.hide()}r.setTitle(l)}},measureView:function(e,u,k){var w=this,j=w.element,v=w.leftBox.element,p=w.titleComponent.element,l=Math.min(j.getWidth()/3,200),q=v.getWidth(),c=j.getX(),m=j.getWidth(),n=p.getX(),d=p.getLeft(),s=p.getWidth(),r=e.x,t=e.width,a=e.left,h=Ext.browser.is.AndroidStock2&&!this.getAndroid2Transforms(),i,b,f,x,o,g;g=c-r-t;if(k){i=g;b=Math.min(n-t,l)}else{b=g;i=Math.min(n-c,l)}if(h){f={element:{from:{left:i,opacity:1},to:{left:0,opacity:1}}}}else{f={element:{from:{transform:{translateX:i},opacity:0},to:{transform:{translateX:0},opacity:1}},ghost:{to:{transform:{translateX:b},opacity:0}}}}g=c-n+q;if((a+s)>n){o=c-n-s}if(k){p.setLeft(0);b=c+m-n-s;if(o!==undefined){i=o}else{i=g}}else{i=c+m-n-s;if(o!==undefined){b=o}else{b=g}i=Math.max(d,i)}if(h){x={element:{from:{left:i,opacity:1},to:{left:d,opacity:1}}}}else{x={element:{from:{transform:{translateX:i},opacity:0},to:{transform:{translateX:d},opacity:1}},ghost:{to:{transform:{translateX:b},opacity:0}}}}return{left:f,title:x,titleLeft:d}},animate:function(b,a,e){var c=this,d;b.setLeft(0);a=Ext.apply(a,{element:b,easing:"ease-in-out",duration:c.getAnimation().duration||250,preserveEndState:true});d=new Ext.fx.Animation(a);d.on("animationend",function(){if(e){e.call(c)}},c);Ext.Animator.run(d);c.activeAnimations.push(d)},endAnimation:function(){var a=this.activeAnimations,d,b,c;if(a){c=a.length;for(b=0;b=0;a--){if((Ext.isString(f)&&Ext.ComponentQuery.is(g[a],f))||(Ext.isObject(f)&&f==g[a])){f=d-a;break}}if(!Ext.isNumber(f)){return false}}var c=g.length,b;if(!Ext.isNumber(f)||f<1){f=1}f=Math.min(f,c-1);if(f){e.getNavigationBar().beforePop(f);b=g.splice(-f,f-1);for(a=0;a0){if(b&&b.isAnimation){b.setReverse(true)}a.setActiveItem(d-1);a.getNavigationBar().onViewRemove(a,c[d],d)}},doRemove:function(){var a=this.getLayout().getAnimation();if(a&&a.isAnimation){a.setReverse(false)}this.callParent(arguments)},onItemAdd:function(b,a){if(b&&b.getDocked()&&b.config.title===true){this.$titleContainer=b}this.doItemLayoutAdd(b,a);var c=this.getInitialConfig().navigationBar;if(!this.isItemsInitializing&&b.isInnerItem()){this.setActiveItem(b);if(c){this.getNavigationBar().onViewAdd(this,b,a)}if(this.$backButtonContainer){this.$backButton.show()}}if(b&&b.isInnerItem()){this.updateTitleContainerTitle((b.getTitle)?b.getTitle():b.config.title)}if(this.initialized){this.fireEvent("add",this,b,a)}},updateTitleContainerTitle:function(a){if(this.$titleContainer){this.$titleContainer.setTitle(a)}else{this.$currentTitle=a}},reset:function(){return this.pop(this.getInnerItems().length)}});Ext.define("Ext.plugin.ListPaging",{extend:Ext.Component,alias:"plugin.listpaging",config:{autoPaging:false,loadMoreText:"Load More...",noMoreRecordsText:"No More Records",loadTpl:['
','','','','',"
",'
{message}
'].join(""),loadMoreCmp:{xtype:"component",baseCls:Ext.baseCSSPrefix+"list-paging",scrollDock:"bottom",hidden:true},loadMoreCmpAdded:false,loadingCls:Ext.baseCSSPrefix+"loading",list:null,scroller:null,loading:false},init:function(c){var a=c.getScrollable().getScroller(),b=c.getStore();this.setList(c);this.setScroller(a);this.bindStore(c.getStore());this.addLoadMoreCmp();c.updateStore=Ext.Function.createInterceptor(c.updateStore,this.bindStore,this);if(this.getAutoPaging()){a.on({scrollend:this.onScrollEnd,scope:this})}},bindStore:function(a,b){if(b){b.un({beforeload:this.onStoreBeforeLoad,load:this.onStoreLoad,filter:this.onFilter,scope:this})}if(a){a.on({beforeload:this.onStoreBeforeLoad,load:this.onStoreLoad,filter:this.onFilter,scope:this})}},disableDataViewMask:function(){var a=this.getList();this._listMask=a.getLoadingText();a.setLoadingText(null)},enableDataViewMask:function(){if(this._listMask){var a=this.getList();a.setLoadingText(this._listMask);delete this._listMask}},applyLoadTpl:function(a){return(Ext.isObject(a)&&a.isTemplate)?a:new Ext.XTemplate(a)},applyLoadMoreCmp:function(a){a=Ext.merge(a,{html:this.getLoadTpl().apply({cssPrefix:Ext.baseCSSPrefix,message:this.getLoadMoreText()}),scrollDock:"bottom",listeners:{tap:{fn:this.loadNextPage,scope:this,element:"element"}}});return Ext.factory(a,Ext.Component,this.getLoadMoreCmp())},onScrollEnd:function(b,a,d){var c=this.getList();if(!this.getLoading()&&d>=b.maxPosition.y){this.currentScrollToTopOnRefresh=c.getScrollToTopOnRefresh();c.setScrollToTopOnRefresh(false);this.loadNextPage()}},updateLoading:function(a){var b=this.getLoadMoreCmp(),c=this.getLoadingCls();if(a){b.addCls(c)}else{b.removeCls(c)}},onStoreBeforeLoad:function(a){if(a.getCount()===0){this.getLoadMoreCmp().hide()}},onStoreLoad:function(a){var d=this.getLoadMoreCmp(),b=this.getLoadTpl(),c=this.storeFullyLoaded()?this.getNoMoreRecordsText():this.getLoadMoreText();if(a.getCount()){d.show()}this.setLoading(false);d.setHtml(b.apply({cssPrefix:Ext.baseCSSPrefix,message:c}));if(this.currentScrollToTopOnRefresh!==undefined){this.getList().setScrollToTopOnRefresh(this.currentScrollToTopOnRefresh);delete this.currentScrollToTopOnRefresh}this.enableDataViewMask()},onFilter:function(a){if(a.getCount()===0){this.getLoadMoreCmp().hide()}else{this.getLoadMoreCmp().show()}},addLoadMoreCmp:function(){var b=this.getList(),a=this.getLoadMoreCmp();if(!this.getLoadMoreCmpAdded()){b.add(a);b.fireEvent("loadmorecmpadded",this,b);this.setLoadMoreCmpAdded(true)}return a},storeFullyLoaded:function(){var a=this.getList().getStore(),b=a.getTotalCount();return b!==null?a.getTotalCount()<=(a.currentPage*a.getPageSize()):false},loadNextPage:function(){var a=this;if(!a.storeFullyLoaded()){a.disableDataViewMask();a.setLoading(true);a.getList().getStore().nextPage({addRecords:true})}}});Ext.define("Ext.plugin.PullRefresh",{extend:Ext.Component,alias:"plugin.pullrefresh",config:{width:"100%",list:null,pullText:"Pull down to refresh...",releaseText:"Release to refresh...",loadingText:"Loading...",loadedText:"Loaded.",lastUpdatedText:"Last Updated: ",scrollerAutoRefresh:false,autoSnapBack:true,snappingAnimationDuration:300,lastUpdatedDateFormat:"m/d/Y h:iA",overpullSnapBackDuration:300,pullTpl:['
','
','','','','',"
",'
','

{message}

','
{updated}
',"
"].join(""),translatable:true},$state:"pull",getState:function(){return this.$state},setState:function(a){this.$state=a;this.updateView()},$isSnappingBack:false,getIsSnappingBack:function(){return this.$isSnappingBack},setIsSnappingBack:function(a){this.$isSnappingBack=a},init:function(b){var a=this;a.setList(b);a.initScrollable()},getElementConfig:function(){return{reference:"element",classList:["x-unsized"],children:[{reference:"innerElement",className:Ext.baseCSSPrefix+"list-pullrefresh"}]}},initScrollable:function(){var b=this,d=b.getList(),c=d.getScrollable(),a;if(!c){return}a=c.getScroller();a.setAutoRefresh(this.getScrollerAutoRefresh());b.lastUpdated=new Date();d.insert(0,b);a.on({scroll:b.onScrollChange,scope:b});this.updateView()},applyPullTpl:function(a){if(a instanceof Ext.XTemplate){return a}else{return new Ext.XTemplate(a)}},updateList:function(a,c){var b=this;if(a&&a!=c){a.on({order:"after",scrollablechange:b.initScrollable,scope:b})}else{if(c){c.un({order:"after",scrollablechange:b.initScrollable,scope:b})}}},getPullHeight:function(){return this.innerElement.getHeight()},fetchLatest:function(){var b=this.getList().getStore(),c=b.getProxy(),a;a=Ext.create("Ext.data.Operation",{page:1,start:0,model:b.getModel(),limit:b.getPageSize(),action:"read",sorters:b.getSorters(),filters:b.getRemoteFilter()?b.getFilters():[]});c.read(a,this.onLatestFetched,this)},onLatestFetched:function(d){var j=this.getList().getStore(),b=j.getData(),c=d.getRecords(),a=c.length,g=[],h,f,e;for(e=0;e=d+10){this.setState("release");b.getContainer().onBefore({dragend:"onScrollerDragEnd",single:true,scope:this})}else{if((this.getState()==="release")&&(-e tab",scope:a})},onTabTap:function(a){this.setActiveTab(a)},applyActiveTab:function(b,c){if(!b&&b!==0){return}var a=this.parseActiveTab(b);if(!a){return}return a},doSetDocked:function(a){var c=this.getLayout(),d=this.getInitialConfig(),b;if(!d.layout||!d.layout.pack){b=(a=="bottom")?"center":"left";if(c.isLayout){c.setPack(b)}else{c.pack=(c&&c.pack)?c.pack:b}}this.callParent(arguments)},doSetActiveTab:function(b,a){if(b){b.setActive(true)}if(a&&a.parent){a.setActive(false)}},parseActiveTab:function(a){if(typeof a=="number"){return this.getItems().items[a]}else{if(typeof a=="string"){a=Ext.getCmp(a)}}return a}});Ext.define("Ext.tab.Panel",{extend:Ext.Container,xtype:"tabpanel",alternateClassName:"Ext.TabPanel",config:{ui:"dark",tabBar:true,tabBarPosition:"top",layout:{type:"card",animation:{type:"slide",direction:"left"}},cls:Ext.baseCSSPrefix+"tabpanel"},initialize:function(){this.callParent();this.on({order:"before",activetabchange:"doTabChange",delegate:"> tabbar",scope:this});this.on({disabledchange:"onItemDisabledChange",delegate:"> component",scope:this})},platformConfig:[{theme:["Blackberry","Blackberry103"],tabBarPosition:"bottom"}],applyScrollable:function(){return false},updateUi:function(a,b){this.callParent(arguments);if(this.initialized){this.getTabBar().setUi(a)}},doSetActiveItem:function(d,j){if(d){var f=this.getInnerItems(),g=f.indexOf(j),i=f.indexOf(d),e=g>i,c=this.getLayout().getAnimation(),b=this.getTabBar(),h=b.parseActiveTab(g),a=b.parseActiveTab(i);if(c&&c.setReverse){c.setReverse(e)}this.callParent(arguments);if(i!=-1){this.forcedChange=true;b.setActiveTab(i);this.forcedChange=false;if(h){h.setActive(false)}if(a){a.setActive(true)}}}},doTabChange:function(a,d){var b=this.getActiveItem(),c;this.setActiveItem(a.indexOf(d));c=this.getActiveItem();return this.forcedChange||b!==c},applyTabBar:function(a){if(a===true){a={}}if(a){Ext.applyIf(a,{ui:this.getUi(),docked:this.getTabBarPosition()})}return Ext.factory(a,Ext.tab.Bar,this.getTabBar())},updateTabBar:function(a){if(a){this.add(a);this.setTabBarPosition(a.getDocked())}},updateTabBarPosition:function(b){var a=this.getTabBar();if(a){a.setDocked(b)}},onItemAdd:function(e){var k=this;if(!e.isInnerItem()){return k.callParent(arguments)}var c=k.getTabBar(),o=e.getInitialConfig(),d=o.tab||{},g=(e.getTitle)?e.getTitle():o.title,i=(e.getIconCls)?e.getIconCls():o.iconCls,j=(e.getHidden)?e.getHidden():o.hidden,n=(e.getDisabled)?e.getDisabled():o.disabled,p=(e.getBadgeText)?e.getBadgeText():o.badgeText,b=k.getInnerItems(),h=b.indexOf(e),l=c.getItems(),a=c.getActiveTab(),m=(l.length>=b.length)&&l.getAt(h),f;if(g&&!d.title){d.title=g}if(i&&!d.iconCls){d.iconCls=i}if(j&&!d.hidden){d.hidden=j}if(n&&!d.disabled){d.disabled=n}if(p&&!d.badgeText){d.badgeText=p}f=Ext.factory(d,Ext.tab.Tab,m);if(!m){c.insert(h,f)}e.tab=f;k.callParent(arguments);if(!a&&a!==0){c.setActiveTab(c.getActiveItem())}},onItemDisabledChange:function(a,b){if(a&&a.tab){a.tab.setDisabled(b)}},onItemRemove:function(b,a){this.getTabBar().remove(b.tab,this.getAutoDestroy());this.callParent(arguments)}},function(){});Ext.define("Ext.table.Cell",{extend:Ext.Container,xtype:"tablecell",config:{baseCls:"x-table-cell"},getElementConfig:function(){var a=this.callParent();a.children.length=0;return a}});Ext.define("Ext.table.Row",{extend:Ext.table.Cell,xtype:"tablerow",config:{baseCls:"x-table-row",defaultType:"tablecell"}});Ext.define("Ext.table.Table",{extend:Ext.Container,xtype:"table",config:{baseCls:"x-table",defaultType:"tablerow"},cachedConfig:{fixedLayout:false},fixedLayoutCls:"x-table-fixed",updateFixedLayout:function(a){this.innerElement[a?"addCls":"removeCls"](this.fixedLayoutCls)}});Ext.define("Ext.util.Droppable",{mixins:{observable:Ext.mixin.Observable},config:{baseCls:Ext.baseCSSPrefix+"droppable"},activeCls:Ext.baseCSSPrefix+"drop-active",invalidCls:Ext.baseCSSPrefix+"drop-invalid",hoverCls:Ext.baseCSSPrefix+"drop-hover",validDropMode:"intersect",disabled:false,group:"base",tolerance:null,monitoring:false,constructor:function(b,a){var c=this;a=a||{};Ext.apply(c,a);c.el=Ext.get(b);c.callParent();c.mixins.observable.constructor.call(c);if(!c.disabled){c.enable()}c.el.addCls(c.baseCls)},onDragStart:function(a,b){if(a.group===this.group){this.monitoring=true;this.el.addCls(this.activeCls);this.region=this.el.getPageBox(true);a.on({drag:this.onDrag,beforedragend:this.onBeforeDragEnd,dragend:this.onDragEnd,scope:this});if(this.isDragOver(a)){this.setCanDrop(true,a,b)}this.fireEvent("dropactivate",this,a,b)}else{a.on({dragend:function(){this.el.removeCls(this.invalidCls)},scope:this,single:true});this.el.addCls(this.invalidCls)}},isDragOver:function(a,b){return this.region[this.validDropMode](a.region)},onDrag:function(a,b){this.setCanDrop(this.isDragOver(a),a,b)},setCanDrop:function(c,a,b){if(c&&!this.canDrop){this.canDrop=true;this.el.addCls(this.hoverCls);this.fireEvent("dropenter",this,a,b)}else{if(!c&&this.canDrop){this.canDrop=false;this.el.removeCls(this.hoverCls);this.fireEvent("dropleave",this,a,b)}}},onBeforeDragEnd:function(a,b){a.cancelRevert=this.canDrop},onDragEnd:function(a,b){this.monitoring=false;this.el.removeCls(this.activeCls);a.un({drag:this.onDrag,beforedragend:this.onBeforeDragEnd,dragend:this.onDragEnd,scope:this});if(this.canDrop){this.canDrop=false;this.el.removeCls(this.hoverCls);this.fireEvent("drop",this,a,b)}this.fireEvent("dropdeactivate",this,a,b)},enable:function(){if(!this.mgr){this.mgr=Ext.util.Observable.observe(Ext.util.Draggable)}this.mgr.on({dragstart:this.onDragStart,scope:this});this.disabled=false},disable:function(){this.mgr.un({dragstart:this.onDragStart,scope:this});this.disabled=true},isDisabled:function(){return this.disabled},isMonitoring:function(){return this.monitoring}});Ext.define("Ext.util.TranslatableList",{extend:Ext.util.translatable.Abstract,config:{items:[]},applyItems:function(a){return Ext.Array.from(a)},doTranslate:function(a,h){var b=this.getItems(),g=0,c,e,d,f;for(c=0,e=b.length;c0){c=b.touches[0];if(c&&c.target&&this.isInputRegex.test(c.target.tagName)){return}}if(a&&a.nodeType===1&&!this.isInputRegex.test(a.tagName)){b.preventDefault()}},doPreventZooming:function(b){if("button" in b&&b.button!==0){return}var a=b.target,c;if(this.isInteractiveWebComponentRegEx.test(a.tagName)&&b.touches&&b.touches.length>0){c=b.touches[0];if(c&&c.target&&this.isInputRegex.test(c.target.tagName)){return}}if(a&&a.nodeType===1&&!this.isInputRegex.test(a.tagName)){b.preventDefault()}},addWindowListener:function(b,c,a){window.addEventListener(b,c,Boolean(a))},removeWindowListener:function(b,c,a){window.removeEventListener(b,c,Boolean(a))},doAddListener:function(a,d,c,b){if(a==="ready"&&this.isReady&&!this.isMaximizing){d.call(c);return this}return this.callSuper(arguments)},determineOrientation:function(){if(Ext.feature.has.Orientation){var a=this.getWindowOrientation();if(Math.abs(a)===90||a===270){return this.LANDSCAPE}else{return this.PORTRAIT}}else{if(Ext.feature.has.MatchMedia){return window.matchMedia("(orientation : landscape)").matches?this.LANDSCAPE:this.PORTRAIT}else{if(this.orientationElement){return this.orientationElement.getStyle("content")}}}},updateOrientation:function(b,a){if(a){this.fireOrientationChangeEvent(b,a)}},onOrientationChange:function(){this.setOrientation(this.determineOrientation())},onResize:function(){this.updateSize();this.setOrientation(this.determineOrientation())},fireOrientationChangeEvent:function(b,c){var a=Ext.baseCSSPrefix;Ext.getBody().replaceCls(a+c,a+b);this.updateSize();this.fireEvent("orientationchange",this,b,this.windowWidth,this.windowHeight)},updateSize:function(b,a){this.windowWidth=b!==undefined?b:this.getWindowWidth();this.windowHeight=a!==undefined?a:this.getWindowHeight();return this},maximize:function(){this.fireMaximizeEvent()},fireMaximizeEvent:function(){this.updateSize();this.fireEvent("maximize",this)},doSetHeight:function(a){Ext.getBody().setHeight(a);this.callParent(arguments)},doSetWidth:function(a){Ext.getBody().setWidth(a);this.callParent(arguments)},scrollToTop:function(){window.scrollTo(0,-1)},getWindowWidth:function(){return window.innerWidth},getWindowHeight:function(){return window.innerHeight},getWindowOuterHeight:function(){return window.outerHeight},getWindowOrientation:function(){return window.orientation},getSize:function(){return{width:this.windowWidth,height:this.windowHeight}},onItemFullscreenChange:function(a){a.addCls(this.fullscreenItemCls);this.add(a)},waitUntil:function(h,e,g,a,f){if(!a){a=50}if(!f){f=2000}var c=this,b=0;setTimeout(function d(){b+=a;if(h.call(c)===true){if(e){e.call(c)}}else{if(b>=f){if(g){g.call(c)}}else{setTimeout(d,a)}}},a)},setMenu:function(e,a){var b=this;a=a||{};if(Ext.os.is.iOS&&!this.hasiOSOrientationFix){this.hasiOSOrientationFix=true;this.on("orientationchange",function(){window.scrollTo(0,0)},this)}if(!e){return}if(!a.side){return}if(["left","right","top","bottom"].indexOf(a.side)==-1){return}var d=b.getMenus();if(!d){d={}}if(!b.addedSwipeListener){b.addedSwipeListener=true;b.element.on({tap:b.onTap,swipestart:b.onSwipeStart,edgeswipestart:b.onEdgeSwipeStart,edgeswipe:b.onEdgeSwipe,edgeswipeend:b.onEdgeSwipeEnd,scope:b});if(window.blackberry){var c=function(){var f=b.getMenus(),g=f.top;if(!g){return}if(g.isHidden()){b.showMenu("top")}else{b.hideMenu("top")}};if(blackberry.app&&blackberry.app.event&&blackberry.app.event.onSwipeDown){blackberry.app.event.onSwipeDown(c)}else{if(blackberry.event&&blackberry.event.addEventListener){blackberry.event.addEventListener("swipedown",c)}}}}d[a.side]=e;e.$reveal=Boolean(a.reveal);e.$cover=a.cover!==false&&!e.$reveal;e.$side=a.side;b.fixMenuSize(e,a.side);if(a.side=="left"){e.setLeft(0);e.setRight(null);e.setTop(0);e.setBottom(0)}else{if(a.side=="right"){e.setLeft(null);e.setRight(0);e.setTop(0);e.setBottom(0)}else{if(a.side=="top"){e.setLeft(0);e.setRight(0);e.setTop(0);e.setBottom(null)}else{if(a.side=="bottom"){e.setLeft(0);e.setRight(0);e.setTop(null);e.setBottom(0)}}}}b.setMenus(d)},removeMenu:function(a){var b=this.getMenus()||{},c=b[a];if(c){this.hideMenu(a)}delete b[a];this.setMenus(b)},fixMenuSize:function(b,a){if(a=="top"||a=="bottom"){b.setWidth("100%")}else{if(a=="left"||a=="right"){b.setHeight("100%")}}},showMenu:function(b){var e=this.getMenus(),h=e[b],d,g,f,c;if(!h||h.isAnimating){return}this.hideOtherMenus(b);d={translateX:0,translateY:0};g={translateX:0,translateY:0};f={translateX:0,translateY:0};c={translateX:0,translateY:0};if(h.$reveal){Ext.getBody().insertFirst(h.element)}else{Ext.Viewport.add(h)}h.show();h.addCls("x-"+b);var a=(b=="left"||b=="right")?h.element.getWidth():h.element.getHeight();if(b=="left"){d.translateX=-a;c.translateX=a}else{if(b=="right"){d.translateX=a;c.translateX=-a}else{if(b=="top"){d.translateY=-a;c.translateY=a}else{if(b=="bottom"){d.translateY=a;c.translateY=-a}}}}if(h.$reveal){if(Ext.browser.getPreferredTranslationMethod()!="scrollposition"){h.translate(0,0)}}else{h.translate(d.translateX,d.translateY)}if(h.$cover){h.getTranslatable().on("animationend",function(){h.isAnimating=false},this,{single:true});h.translate(g.translateX,g.translateY,{preserveEndState:true,duration:200})}else{this.translate(f.translateX,f.translateY);this.getTranslatable().on("animationend",function(){h.isAnimating=false},this,{single:true});this.translate(c.translateX,c.translateY,{preserveEndState:true,duration:200})}h.isAnimating=true},hideMenu:function(c,a){var e=this.getMenus(),g=e[c],f,d,b;a=(a===false)?false:true;if(!g||(g.isHidden()||g.isAnimating)){return}f={translateX:0,translateY:0};d={translateX:0,translateY:0};b=(c=="left"||c=="right")?g.element.getWidth():g.element.getHeight();if(c=="left"){f.translateX=-b}else{if(c=="right"){f.translateX=b}else{if(c=="top"){f.translateY=-b}else{if(c=="bottom"){f.translateY=b}}}}if(g.$cover){if(a){g.getTranslatable().on("animationend",function(){g.isAnimating=false;g.hide()},this,{single:true});g.translate(f.translateX,f.translateY,{preserveEndState:true,duration:200})}else{g.translate(f.translateX,f.translateY);g.hide()}}else{if(a){this.getTranslatable().on("animationend",function(){g.isAnimating=false;g.hide()},this,{single:true});this.translate(d.translateX,d.translateY,{preserveEndState:true,duration:200})}else{this.translate(d.translateX,d.translateY);g.hide()}}},hideAllMenus:function(c){var b=this.getMenus();for(var a in b){this.hideMenu(a,c)}},hideOtherMenus:function(a,c){var b=this.getMenus();for(var d in b){if(a!=d){this.hideMenu(d,c)}}},toggleMenu:function(a){var b=this.getMenus(),c;if(b[a]){c=b[a];if(c.isHidden()){this.showMenu(a)}else{this.hideMenu(a)}}},sideForDirection:function(a){if(a=="left"){return"right"}else{if(a=="right"){return"left"}else{if(a=="up"){return"bottom"}else{if(a=="down"){return"top"}}}}},sideForSwipeDirection:function(a){if(a=="up"){return"top"}else{if(a=="down"){return"bottom"}}return a},onTap:function(a){},onSwipeStart:function(b){var a=this.sideForSwipeDirection(b.direction);this.hideMenu(a)},onEdgeSwipeStart:function(h){var j=this.sideForDirection(h.direction),d=this.getMenus(),b=d[j],k,i;if(!b||!b.isHidden()){return}for(k in d){i=d[k];if(i.isHidden()!==false){return}}this.$swiping=true;this.hideAllMenus(false);if(b.$reveal){Ext.getBody().insertFirst(b.element)}else{Ext.Viewport.add(b)}b.show();var l=(j=="left"||j=="right")?b.element.getWidth():b.element.getHeight(),a,g;a={translateX:0,translateY:0};g={translateX:0,translateY:0};if(j=="left"){a.translateX=-l}else{if(j=="right"){a.translateX=l}else{if(j=="top"){a.translateY=-l}else{if(j=="bottom"){a.translateY=l}}}}var c="webkitTransform" in document.createElement("div").style?"webkitTransform":"transform",f=b.element.dom.style[c];if(f){b.element.dom.style[c]=""}if(b.$reveal){if(Ext.browser.getPreferredTranslationMethod()!="scrollposition"){b.translate(0,0)}}else{b.translate(a.translateX,a.translateY)}if(!b.$cover){if(f){this.innerElement.dom.style[c]=""}this.translate(g.translateX,g.translateY)}},onEdgeSwipe:function(g){var c=this.sideForDirection(g.direction),i=this.getMenus()[c];if(!i||!this.$swiping){return}var b=(c=="left"||c=="right")?i.element.getWidth():i.element.getHeight(),h,f,a=Math.min(g.distance-b,0),d=Math.min(g.distance,b);h={translateX:0,translateY:0};f={translateX:0,translateY:0};if(c=="left"){h.translateX=a;f.translateX=d}else{if(c=="right"){h.translateX=-a;f.translateX=-d}else{if(c=="top"){h.translateY=a;f.translateY=d}else{if(c=="bottom"){h.translateY=-a;f.translateY=-d}}}}if(i.$cover){i.translate(h.translateX,h.translateY)}else{this.translate(f.translateX,f.translateY)}},onEdgeSwipeEnd:function(i){var j=this.sideForDirection(i.direction),b=this.getMenus()[j],h=false;if(!b){return}var k=(j=="left"||j=="right")?b.element.getWidth():b.element.getHeight(),f=(i.flick)?i.flick.velocity:0;if(j=="right"){if(f.x>0){h=true}}else{if(j=="left"){if(f.x<0){h=true}}else{if(j=="top"){if(f.y<0){h=true}}else{if(j=="bottom"){if(f.y>0){h=true}}}}}var c=(h)?k:0,d=(h)?0:-k,a,g;a={translateX:0,translateY:0};g={translateX:0,translateY:0};if(j=="left"){a.translateX=-c;g.translateX=-d}else{if(j=="right"){a.translateX=c;g.translateX=d}else{if(j=="top"){a.translateY=-c;g.translateY=-d}else{if(j=="bottom"){a.translateY=c;g.translateY=d}}}}if(b.$cover){b.getTranslatable().on("animationend",function(){if(h){b.hide()}},this,{single:true});b.translate(a.translateX,a.translateY,{preserveEndState:true,duration:200})}else{this.getTranslatable().on("animationend",function(){if(h){b.hide()}},this,{single:true});this.translate(g.translateX,g.translateY,{preserveEndState:true,duration:200})}this.$swiping=false}});Ext.define("Ext.viewport.AndroidStock",{extend:Ext.viewport.Default,alternateClassName:["Ext.viewport.Android"],config:{translatable:{translationMethod:"csstransform"}},constructor:function(){this.on("orientationchange","hideKeyboardIfNeeded",this,{prepend:true});this.callSuper(arguments)},getWindowWidth:function(){return this.element.getWidth()},getWindowHeight:function(){return this.element.getHeight()},getDummyInput:function(){var a=this.dummyInput,c=this.focusedElement,b=Ext.fly(c).getPageBox();if(!a){this.dummyInput=a=document.createElement("input");a.style.position="absolute";a.style.opacity="0";a.style.pointerEvents="none";document.body.appendChild(a)}a.style.left=b.left+"px";a.style.top=b.top+"px";a.style.display="";return a},doBlurInput:function(c){var b=c.target,d=this.focusedElement,a;if(d&&!this.isInputRegex.test(b.tagName)){a=this.getDummyInput();delete this.focusedElement;a.focus();setTimeout(function(){a.style.display="none"},100)}},hideKeyboardIfNeeded:function(){var a=arguments[arguments.length-1],b=this.focusedElement;if(b){delete this.focusedElement;a.pause();if(Ext.os.version.lt("4")){b.style.display="none"}else{b.blur()}setTimeout(function(){b.style.display="";a.resume()},1000)}},getActualWindowOuterHeight:function(){return Math.round(this.getWindowOuterHeight()/window.devicePixelRatio)},maximize:function(){var c=this.stretchHeights,b=this.getOrientation(),a;a=c[b];if(!a){c[b]=a=this.getActualWindowOuterHeight()}if(!this.addressBarHeight){this.addressBarHeight=a-this.getWindowHeight()}this.setHeight(a);var d=Ext.Function.bind(this.isHeightMaximized,this,[a]);this.scrollToTop();this.waitUntil(d,this.fireMaximizeEvent,this.fireMaximizeEvent)},isHeightMaximized:function(a){this.scrollToTop();return this.getWindowHeight()===a},doPreventZooming:function(b){if("button" in b&&b.button!==0){return}var a=b.target;if(a&&a.nodeType===1&&!this.isInputRegex.test(a.tagName)&&!this.focusedElement){b.preventDefault()}}},function(){if(!Ext.os.is.Android){return}var a=Ext.os.version,b=Ext.browser.userAgent,c=/(htc|desire|incredible|ADR6300)/i.test(b)&&a.lt("2.3");if(c){this.override({constructor:function(d){if(!d){d={}}d.autoMaximize=false;this.watchDogTick=Ext.Function.bind(this.watchDogTick,this);setInterval(this.watchDogTick,1000);return this.callParent([d])},watchDogTick:function(){this.watchDogLastTick=Ext.Date.now()},doPreventPanning:function(){var e=Ext.Date.now(),f=this.watchDogLastTick,d=e-f;if(d>=2000){return}return this.callParent(arguments)},doPreventZooming:function(){var e=Ext.Date.now(),f=this.watchDogLastTick,d=e-f;if(d>=2000){return}return this.callParent(arguments)}})}if(a.match("2")){this.override({onReady:function(){this.addWindowListener("resize",Ext.Function.bind(this.onWindowResize,this));this.callParent(arguments)},scrollToTop:function(){document.body.scrollTop=100},onWindowResize:function(){var e=this.windowWidth,g=this.windowHeight,f=this.getWindowWidth(),d=this.getWindowHeight();if(this.getAutoMaximize()&&!this.isMaximizing&&!this.orientationChanging&&window.scrollY===0&&e===f&&d=g-this.addressBarHeight)||!this.focusedElement)){this.scrollToTop()}}})}else{if(a.gtEq("3.1")){this.override({isHeightMaximized:function(d){this.scrollToTop();return this.getWindowHeight()===d-1}})}else{if(a.match("3")){this.override({isHeightMaximized:function(){this.scrollToTop();return true}})}}}if(a.gtEq("4")){this.override({doBlurInput:Ext.emptyFn})}});Ext.define("Ext.viewport.Ios",{extend:Ext.viewport.Default,isFullscreen:function(){return this.isHomeScreen()},isHomeScreen:function(){return window.navigator.standalone===true},constructor:function(){this.callParent(arguments);if(this.getAutoMaximize()&&!this.isFullscreen()){this.addWindowListener("touchstart",Ext.Function.bind(this.onTouchStart,this))}},maximize:function(){if(this.isFullscreen()){return this.callParent()}var c=this.stretchHeights,b=this.getOrientation(),d=this.getWindowHeight(),a=c[b];if(window.scrollY>0){this.scrollToTop();if(!a){c[b]=a=this.getWindowHeight()}this.setHeight(a);this.fireMaximizeEvent()}else{if(!a){a=this.getScreenHeight()}this.setHeight(a);this.waitUntil(function(){this.scrollToTop();return d!==this.getWindowHeight()},function(){if(!c[b]){a=c[b]=this.getWindowHeight();this.setHeight(a)}this.fireMaximizeEvent()},function(){a=c[b]=this.getWindowHeight();this.setHeight(a);this.fireMaximizeEvent()},50,1000)}},getScreenHeight:function(){var a=this.getOrientation();return window.screen[a===this.PORTRAIT?"height":"width"]},onElementFocus:function(){if(this.getAutoMaximize()&&!this.isFullscreen()){clearTimeout(this.scrollToTopTimer)}this.callParent(arguments)},onElementBlur:function(){if(this.getAutoMaximize()&&!this.isFullscreen()){this.scrollToTopTimer=setTimeout(this.scrollToTop,500)}this.callParent(arguments)},onTouchStart:function(){if(this.focusedElement===null){this.scrollToTop()}},scrollToTop:function(){window.scrollTo(0,0)}},function(){if(!Ext.os.is.iOS){return}if(Ext.os.version.lt("3.2")){this.override({constructor:function(){var a=this.stretchHeights={};a[this.PORTRAIT]=416;a[this.LANDSCAPE]=268;return this.callOverridden(arguments)}})}if(Ext.os.version.lt("5")){this.override({fieldMaskClsTest:"-field-mask",doPreventZooming:function(b){var a=b.target;if(a&&a.nodeType===1&&!this.isInputRegex.test(a.tagName)&&a.className.indexOf(this.fieldMaskClsTest)==-1){b.preventDefault()}}})}if(Ext.os.is.iPad){this.override({isFullscreen:function(){return true}})}if(Ext.os.version.gtEq("7")){if(Ext.os.deviceType==="Tablet"||!Ext.browser.is.Safari||window.navigator.standalone){this.override({constructor:function(){var d={},b={},a=this.determineOrientation(),f=window.screen.height,c=window.screen.width,e=a===this.PORTRAIT?f-window.innerHeight:c-window.innerHeight;d[this.PORTRAIT]=f-e;d[this.LANDSCAPE]=c-e;b[this.PORTRAIT]=c;b[this.LANDSCAPE]=f;this.stretchHeights=d;this.stretchWidths=b;this.callOverridden(arguments);this.on("ready",this.setViewportSizeToAbsolute,this);this.on("orientationchange",this.setViewportSizeToAbsolute,this)},getWindowHeight:function(){var a=this.getOrientation();return this.stretchHeights[a]},getWindowWidth:function(){var a=this.getOrientation();return this.stretchWidths[a]},setViewportSizeToAbsolute:function(){this.setWidth(this.getWindowWidth());this.setHeight(this.getWindowHeight())}})}if(Ext.os.deviceType==="Tablet"){this.override({constructor:function(){this.callOverridden(arguments);window.addEventListener("scroll",function(){if(window.scrollX!==0){window.scrollTo(0,window.scrollY)}},false)},setViewportSizeToAbsolute:function(){window.scrollTo(0,0);this.callOverridden(arguments)},onElementBlur:function(){this.callOverridden(arguments);if(window.scrollY!==0){window.scrollTo(0,0)}}})}}});Ext.define("Ext.viewport.WindowsPhone",{requires:[],alternateClassName:"Ext.viewport.WP",extend:Ext.viewport.Default,config:{translatable:{translationMethod:"csstransform"}},initialize:function(){var a=function(d){var c=d.srcElement.nodeName.toUpperCase(),b=["INPUT","TEXTAREA"];if(b.indexOf(c)==-1){return false}};document.body.addEventListener("onselectstart",a);this.callParent(arguments)}});Ext.define("Ext.viewport.Viewport",{constructor:function(b){var c=Ext.os.name,d,a;switch(c){case"Android":d=(Ext.browser.name=="ChromeMobile")?"Default":"AndroidStock";break;case"iOS":d="Ios";break;case"Windows":d=(Ext.browser.name=="IE")?"WindowsPhone":"Default";break;case"WindowsPhone":d="WindowsPhone";break;default:d="Default";break}a=Ext.create("Ext.viewport."+d,b);return a}}); \ No newline at end of file diff --git a/vendor/touch/sencha-touch-debug.js b/vendor/touch/sencha-touch-debug.js index 161aedd47..7f9110b1f 100644 --- a/vendor/touch/sencha-touch-debug.js +++ b/vendor/touch/sencha-touch-debug.js @@ -5,10 +5,13 @@ Copyright (c) 2011-2015 Sencha Inc Contact: http://www.sencha.com/contact -Commercial Usage -Licensees holding valid commercial licenses may use this file in accordance with the Commercial -Software License Agreement provided with the Software or, alternatively, in accordance with the -terms contained in a written agreement between you and Sencha. +GNU General Public License Usage +This file may be used under the terms of the GNU General Public License version 3.0 as +published by the Free Software Foundation and appearing in the file LICENSE included in the +packaging of this file. + +Please review the following information to ensure the GNU General Public License version 3.0 +requirements will be met: http://www.gnu.org/copyleft/gpl.html. If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact. @@ -9290,6 +9293,11 @@ Ext.apply(Ext, { elementSize: { xclass: 'Ext.event.publisher.ElementSize' } + // + ,seriesItemEvents: { + xclass: 'Ext.chart.series.ItemPublisher' + } + // }, // @@ -15168,6 +15176,68 @@ Ext.ClassManager.addNameAlternateMappings({ ], "Ext.carousel.Infinite": [], "Ext.carousel.Item": [], + "Ext.chart.AbstractChart": [], + "Ext.chart.CartesianChart": [ + "Ext.chart.Chart" + ], + "Ext.chart.Legend": [], + "Ext.chart.MarkerHolder": [], + "Ext.chart.Markers": [], + "Ext.chart.PolarChart": [], + "Ext.chart.SpaceFillingChart": [], + "Ext.chart.axis.Axis": [], + "Ext.chart.axis.Category": [], + "Ext.chart.axis.Numeric": [], + "Ext.chart.axis.Time": [], + "Ext.chart.axis.layout.CombineDuplicate": [], + "Ext.chart.axis.layout.Continuous": [], + "Ext.chart.axis.layout.Discrete": [], + "Ext.chart.axis.layout.Layout": [], + "Ext.chart.axis.segmenter.Names": [], + "Ext.chart.axis.segmenter.Numeric": [], + "Ext.chart.axis.segmenter.Segmenter": [], + "Ext.chart.axis.segmenter.Time": [], + "Ext.chart.axis.sprite.Axis": [], + "Ext.chart.grid.CircularGrid": [], + "Ext.chart.grid.HorizontalGrid": [], + "Ext.chart.grid.RadialGrid": [], + "Ext.chart.grid.VerticalGrid": [], + "Ext.chart.interactions.Abstract": [], + "Ext.chart.interactions.CrossZoom": [], + "Ext.chart.interactions.Crosshair": [], + "Ext.chart.interactions.ItemHighlight": [], + "Ext.chart.interactions.ItemInfo": [], + "Ext.chart.interactions.PanZoom": [], + "Ext.chart.interactions.Rotate": [], + "Ext.chart.interactions.RotatePie3D": [], + "Ext.chart.label.Callout": [], + "Ext.chart.label.Label": [], + "Ext.chart.series.Area": [], + "Ext.chart.series.Bar": [], + "Ext.chart.series.CandleStick": [], + "Ext.chart.series.Cartesian": [], + "Ext.chart.series.Gauge": [], + "Ext.chart.series.ItemPublisher": [], + "Ext.chart.series.Line": [], + "Ext.chart.series.Pie": [], + "Ext.chart.series.Pie3D": [], + "Ext.chart.series.Polar": [], + "Ext.chart.series.Radar": [], + "Ext.chart.series.Scatter": [], + "Ext.chart.series.Series": [], + "Ext.chart.series.StackedCartesian": [], + "Ext.chart.series.sprite.Aggregative": [], + "Ext.chart.series.sprite.Area": [], + "Ext.chart.series.sprite.Bar": [], + "Ext.chart.series.sprite.CandleStick": [], + "Ext.chart.series.sprite.Cartesian": [], + "Ext.chart.series.sprite.Line": [], + "Ext.chart.series.sprite.Pie3DPart": [], + "Ext.chart.series.sprite.PieSlice": [], + "Ext.chart.series.sprite.Polar": [], + "Ext.chart.series.sprite.Radar": [], + "Ext.chart.series.sprite.Scatter": [], + "Ext.chart.series.sprite.StackedCartesian": [], "Ext.data.ArrayStore": [], "Ext.data.Batch": [], "Ext.data.Connection": [], @@ -15445,6 +15515,47 @@ Ext.ClassManager.addNameAlternateMappings({ "Ext.dom.CompositeElement": [ "Ext.CompositeElement" ], + "Ext.draw.Animator": [], + "Ext.draw.Color": [], + "Ext.draw.Component": [], + "Ext.draw.Draw": [], + "Ext.draw.LimitedCache": [], + "Ext.draw.Matrix": [], + "Ext.draw.Path": [], + "Ext.draw.SegmentTree": [], + "Ext.draw.Solver": [], + "Ext.draw.Surface": [], + "Ext.draw.TextMeasurer": [], + "Ext.draw.TimingFunctions": [], + "Ext.draw.engine.Canvas": [], + "Ext.draw.engine.Svg": [], + "Ext.draw.engine.SvgContext": [], + "Ext.draw.engine.SvgContext.Gradient": [], + "Ext.draw.engine.SvgExporter": [], + "Ext.draw.gradient.Gradient": [], + "Ext.draw.gradient.GradientDefinition": [], + "Ext.draw.gradient.Linear": [], + "Ext.draw.gradient.Radial": [], + "Ext.draw.modifier.Animation": [], + "Ext.draw.modifier.Highlight": [], + "Ext.draw.modifier.Modifier": [], + "Ext.draw.modifier.Target": [], + "Ext.draw.sprite.AnimationParser": [], + "Ext.draw.sprite.Arc": [], + "Ext.draw.sprite.AttributeDefinition": [], + "Ext.draw.sprite.AttributeParser": [], + "Ext.draw.sprite.Circle": [], + "Ext.draw.sprite.Composite": [], + "Ext.draw.sprite.Ellipse": [], + "Ext.draw.sprite.EllipticalArc": [], + "Ext.draw.sprite.Image": [], + "Ext.draw.sprite.Instancing": [], + "Ext.draw.sprite.Line": [], + "Ext.draw.sprite.Path": [], + "Ext.draw.sprite.Rect": [], + "Ext.draw.sprite.Sector": [], + "Ext.draw.sprite.Sprite": [], + "Ext.draw.sprite.Text": [], "Ext.event.Controller": [], "Ext.event.Dispatcher": [], "Ext.event.Dom": [], @@ -15835,6 +15946,153 @@ Ext.ClassManager.addNameAliasMappings({ ], "Ext.carousel.Infinite": [], "Ext.carousel.Item": [], + "Ext.chart.AbstractChart": [], + "Ext.chart.CartesianChart": [ + "Ext.chart.Chart", + "widget.chart" + ], + "Ext.chart.Legend": [ + "widget.legend" + ], + "Ext.chart.MarkerHolder": [], + "Ext.chart.Markers": [], + "Ext.chart.PolarChart": [ + "widget.polar" + ], + "Ext.chart.SpaceFillingChart": [ + "widget.spacefilling" + ], + "Ext.chart.axis.Axis": [ + "widget.axis" + ], + "Ext.chart.axis.Category": [ + "axis.category" + ], + "Ext.chart.axis.Numeric": [ + "axis.numeric" + ], + "Ext.chart.axis.Time": [ + "axis.time" + ], + "Ext.chart.axis.layout.CombineDuplicate": [ + "axisLayout.combineDuplicate" + ], + "Ext.chart.axis.layout.Continuous": [ + "axisLayout.continuous" + ], + "Ext.chart.axis.layout.Discrete": [ + "axisLayout.discrete" + ], + "Ext.chart.axis.layout.Layout": [], + "Ext.chart.axis.segmenter.Names": [ + "segmenter.names" + ], + "Ext.chart.axis.segmenter.Numeric": [ + "segmenter.numeric" + ], + "Ext.chart.axis.segmenter.Segmenter": [], + "Ext.chart.axis.segmenter.Time": [ + "segmenter.time" + ], + "Ext.chart.axis.sprite.Axis": [], + "Ext.chart.grid.CircularGrid": [ + "grid.circular" + ], + "Ext.chart.grid.HorizontalGrid": [ + "grid.horizontal" + ], + "Ext.chart.grid.RadialGrid": [ + "grid.radial" + ], + "Ext.chart.grid.VerticalGrid": [ + "grid.vertical" + ], + "Ext.chart.interactions.Abstract": [ + "widget.interaction" + ], + "Ext.chart.interactions.CrossZoom": [ + "interaction.crosszoom" + ], + "Ext.chart.interactions.Crosshair": [ + "interaction.crosshair" + ], + "Ext.chart.interactions.ItemHighlight": [ + "interaction.itemhighlight" + ], + "Ext.chart.interactions.ItemInfo": [ + "interaction.iteminfo" + ], + "Ext.chart.interactions.PanZoom": [ + "interaction.panzoom" + ], + "Ext.chart.interactions.Rotate": [ + "interaction.rotate" + ], + "Ext.chart.interactions.RotatePie3D": [ + "interaction.rotatePie3d" + ], + "Ext.chart.label.Callout": [], + "Ext.chart.label.Label": [], + "Ext.chart.series.Area": [ + "series.area" + ], + "Ext.chart.series.Bar": [ + "series.bar" + ], + "Ext.chart.series.CandleStick": [ + "series.candlestick" + ], + "Ext.chart.series.Cartesian": [], + "Ext.chart.series.Gauge": [ + "series.gauge" + ], + "Ext.chart.series.ItemPublisher": [], + "Ext.chart.series.Line": [ + "series.line" + ], + "Ext.chart.series.Pie": [ + "series.pie" + ], + "Ext.chart.series.Pie3D": [ + "series.pie3d" + ], + "Ext.chart.series.Polar": [], + "Ext.chart.series.Radar": [ + "series.radar" + ], + "Ext.chart.series.Scatter": [ + "series.scatter" + ], + "Ext.chart.series.Series": [], + "Ext.chart.series.StackedCartesian": [], + "Ext.chart.series.sprite.Aggregative": [], + "Ext.chart.series.sprite.Area": [ + "sprite.areaSeries" + ], + "Ext.chart.series.sprite.Bar": [ + "sprite.barSeries" + ], + "Ext.chart.series.sprite.CandleStick": [ + "sprite.candlestickSeries" + ], + "Ext.chart.series.sprite.Cartesian": [], + "Ext.chart.series.sprite.Line": [ + "sprite.lineSeries" + ], + "Ext.chart.series.sprite.Pie3DPart": [ + "sprite.pie3dPart" + ], + "Ext.chart.series.sprite.PieSlice": [ + "sprite.pieslice" + ], + "Ext.chart.series.sprite.Polar": [], + "Ext.chart.series.sprite.Radar": [ + "sprite.radar" + ], + "Ext.chart.series.sprite.Scatter": [ + "sprite.scatterSeries" + ], + "Ext.chart.series.sprite.StackedCartesian": [], "Ext.data.ArrayStore": [ "store.array" ], @@ -16094,6 +16352,83 @@ Ext.ClassManager.addNameAliasMappings({ "direct.transaction" ], "Ext.dom.CompositeElement": [], + "Ext.draw.Animator": [], + "Ext.draw.Color": [], + "Ext.draw.Component": [ + "widget.draw" + ], + "Ext.draw.Draw": [], + "Ext.draw.LimitedCache": [], + "Ext.draw.Matrix": [], + "Ext.draw.Path": [], + "Ext.draw.SegmentTree": [], + "Ext.draw.Solver": [], + "Ext.draw.Surface": [ + "widget.surface" + ], + "Ext.draw.TextMeasurer": [], + "Ext.draw.TimingFunctions": [], + "Ext.draw.engine.Canvas": [], + "Ext.draw.engine.Svg": [], + "Ext.draw.engine.SvgContext": [], + "Ext.draw.engine.SvgContext.Gradient": [], + "Ext.draw.engine.SvgExporter": [], + "Ext.draw.gradient.Gradient": [], + "Ext.draw.gradient.GradientDefinition": [], + "Ext.draw.gradient.Linear": [], + "Ext.draw.gradient.Radial": [], + "Ext.draw.modifier.Animation": [ + "modifier.animation" + ], + "Ext.draw.modifier.Highlight": [ + "modifier.highlight" + ], + "Ext.draw.modifier.Modifier": [], + "Ext.draw.modifier.Target": [ + "modifier.target" + ], + "Ext.draw.sprite.AnimationParser": [], + "Ext.draw.sprite.Arc": [ + "sprite.arc" + ], + "Ext.draw.sprite.AttributeDefinition": [], + "Ext.draw.sprite.AttributeParser": [], + "Ext.draw.sprite.Circle": [ + "sprite.circle" + ], + "Ext.draw.sprite.Composite": [ + "sprite.composite" + ], + "Ext.draw.sprite.Ellipse": [ + "sprite.ellipse" + ], + "Ext.draw.sprite.EllipticalArc": [ + "sprite.ellipticalArc" + ], + "Ext.draw.sprite.Image": [ + "sprite.image" + ], + "Ext.draw.sprite.Instancing": [ + "sprite.instancing" + ], + "Ext.draw.sprite.Line": [ + "sprite.line" + ], + "Ext.draw.sprite.Path": [ + "sprite.path" + ], + "Ext.draw.sprite.Rect": [ + "sprite.rect" + ], + "Ext.draw.sprite.Sector": [ + "sprite.sector" + ], + "Ext.draw.sprite.Sprite": [ + "sprite.sprite" + ], + "Ext.draw.sprite.Text": [ + "sprite.text" + ], "Ext.event.Controller": [], "Ext.event.Dispatcher": [], "Ext.event.Dom": [], diff --git a/vendor/touch/sencha-touch.js b/vendor/touch/sencha-touch.js index 483a15db4..e4a272d1e 100644 --- a/vendor/touch/sencha-touch.js +++ b/vendor/touch/sencha-touch.js @@ -5,14 +5,17 @@ Copyright (c) 2011-2015 Sencha Inc Contact: http://www.sencha.com/contact -Commercial Usage -Licensees holding valid commercial licenses may use this file in accordance with the Commercial -Software License Agreement provided with the Software or, alternatively, in accordance with the -terms contained in a written agreement between you and Sencha. +GNU General Public License Usage +This file may be used under the terms of the GNU General Public License version 3.0 as +published by the Free Software Foundation and appearing in the file LICENSE included in the +packaging of this file. + +Please review the following information to ensure the GNU General Public License version 3.0 +requirements will be met: http://www.gnu.org/copyleft/gpl.html. If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact. Build date: 2015-06-10 14:41:48 (dd5f81fb46d0676281fdd021ada1da3ef06abd27) */ -(function(){var global=this,objectPrototype=Object.prototype,toString=objectPrototype.toString,enumerables=true,enumerablesTest={toString:1},emptyFn=function(){},i;if(typeof Ext==="undefined"){global.Ext={}}Ext.global=global;for(i in enumerablesTest){enumerables=null}if(enumerables){enumerables=["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","constructor"]}Ext.enumerables=enumerables;Ext.apply=function(object,config,defaults){if(defaults){Ext.apply(object,defaults)}if(object&&config&&typeof config==="object"){var i,j,k;for(i in config){object[i]=config[i]}if(enumerables){for(j=enumerables.length;j--;){k=enumerables[j];if(config.hasOwnProperty(k)){object[k]=config[k]}}}}return object};Ext.buildSettings=Ext.apply({baseCSSPrefix:"x-",scopeResetCSS:false},Ext.buildSettings||{});Ext.apply(Ext,{emptyFn:emptyFn,baseCSSPrefix:Ext.buildSettings.baseCSSPrefix,applyIf:function(object,config){var property;if(object){for(property in config){if(object[property]===undefined){object[property]=config[property]}}}return object},iterate:function(object,fn,scope){if(Ext.isEmpty(object)){return}if(scope===undefined){scope=object}if(Ext.isIterable(object)){Ext.Array.each.call(Ext.Array,object,fn,scope)}else{Ext.Object.each.call(Ext.Object,object,fn,scope)}}});Ext.apply(Ext,{extend:function(){var objectConstructor=objectPrototype.constructor,inlineOverrides=function(o){for(var m in o){if(!o.hasOwnProperty(m)){continue}this[m]=o[m]}};return function(subclass,superclass,overrides){if(Ext.isObject(superclass)){overrides=superclass;superclass=subclass;subclass=overrides.constructor!==objectConstructor?overrides.constructor:function(){superclass.apply(this,arguments)}}if(!superclass){Ext.Error.raise({sourceClass:"Ext",sourceMethod:"extend",msg:"Attempting to extend from a class which has not been loaded on the page."})}var F=function(){},subclassProto,superclassProto=superclass.prototype;F.prototype=superclassProto;subclassProto=subclass.prototype=new F();subclassProto.constructor=subclass;subclass.superclass=superclassProto;if(superclassProto.constructor===objectConstructor){superclassProto.constructor=superclass}subclass.override=function(overrides){Ext.override(subclass,overrides)};subclassProto.override=inlineOverrides;subclassProto.proto=subclassProto;subclass.override(overrides);subclass.extend=function(o){return Ext.extend(subclass,o)};return subclass}}(),override:function(cls,overrides){if(cls.$isClass){return cls.override(overrides)}else{Ext.apply(cls.prototype,overrides)}}});Ext.apply(Ext,{valueFrom:function(value,defaultValue,allowBlank){return Ext.isEmpty(value,allowBlank)?defaultValue:value},typeOf:function(value){if(value===null){return"null"}var type=typeof value;if(type==="undefined"||type==="string"||type==="number"||type==="boolean"){return type}var typeToString=toString.call(value);switch(typeToString){case"[object Array]":return"array";case"[object Date]":return"date";case"[object Boolean]":return"boolean";case"[object Number]":return"number";case"[object RegExp]":return"regexp"}if(type==="function"){return"function"}if(type==="object"){if(value.nodeType!==undefined){if(value.nodeType===3){return(/\S/).test(value.nodeValue)?"textnode":"whitespace"}else{return"element"}}return"object"}Ext.Error.raise({sourceClass:"Ext",sourceMethod:"typeOf",msg:'Failed to determine the type of the specified value "'+value+'". This is most likely a bug.'})},isEmpty:function(value,allowEmptyString){return(value===null)||(value===undefined)||(!allowEmptyString?value==="":false)||(Ext.isArray(value)&&value.length===0)},isArray:("isArray" in Array)?Array.isArray:function(value){return toString.call(value)==="[object Array]"},isDate:function(value){return toString.call(value)==="[object Date]"},isMSDate:function(value){if(!Ext.isString(value)){return false}else{return value.match("\\\\?/Date\\(([-+])?(\\d+)(?:[+-]\\d{4})?\\)\\\\?/")!==null}},isObject:(toString.call(null)==="[object Object]")?function(value){return value!==null&&value!==undefined&&toString.call(value)==="[object Object]"&&value.ownerDocument===undefined}:function(value){return toString.call(value)==="[object Object]"},isSimpleObject:function(value){return value instanceof Object&&value.constructor===Object},isPrimitive:function(value){var type=typeof value;return type==="string"||type==="number"||type==="boolean"},isFunction:(typeof document!=="undefined"&&typeof document.getElementsByTagName("body")==="function")?function(value){return toString.call(value)==="[object Function]"}:function(value){return typeof value==="function"},isNumber:function(value){return typeof value==="number"&&isFinite(value)},isNumeric:function(value){return !isNaN(parseFloat(value))&&isFinite(value)},isString:function(value){return typeof value==="string"},isBoolean:function(value){return typeof value==="boolean"},isElement:function(value){return value?value.nodeType===1:false},isTextNode:function(value){return value?value.nodeName==="#text":false},isDefined:function(value){return typeof value!=="undefined"},isIterable:function(value){return(value&&typeof value!=="string")?value.length!==undefined:false}});Ext.apply(Ext,{clone:function(item){if(item===null||item===undefined){return item}if(item.nodeType&&item.cloneNode){return item.cloneNode(true)}var type=toString.call(item);if(type==="[object Date]"){return new Date(item.getTime())}var i,j,k,clone,key;if(type==="[object Array]"){i=item.length;clone=[];while(i--){clone[i]=Ext.clone(item[i])}}else{if(type==="[object Object]"&&item.constructor===Object){clone={};for(key in item){clone[key]=Ext.clone(item[key])}if(enumerables){for(j=enumerables.length;j--;){k=enumerables[j];clone[k]=item[k]}}}}return clone||item},getUniqueGlobalNamespace:function(){var uniqueGlobalNamespace=this.uniqueGlobalNamespace;if(uniqueGlobalNamespace===undefined){var i=0;do{uniqueGlobalNamespace="ExtBox"+(++i)}while(Ext.global[uniqueGlobalNamespace]!==undefined);Ext.global[uniqueGlobalNamespace]=Ext;this.uniqueGlobalNamespace=uniqueGlobalNamespace}return uniqueGlobalNamespace},functionFactory:function(){var args=Array.prototype.slice.call(arguments),ln=args.length;if(ln>0){args[ln-1]="var Ext=window."+this.getUniqueGlobalNamespace()+";"+args[ln-1]}return Function.prototype.constructor.apply(Function.prototype,args)},globalEval:("execScript" in global)?function(code){global.execScript(code)}:function(code){(function(){eval(code)})()},Logger:{log:function(message,priority){if("console" in global){if(!priority||!(priority in global.console)){priority="log"}message="["+priority.toUpperCase()+"] "+message;global.console[priority](message)}},verbose:function(message){this.log(message,"verbose")},info:function(message){this.log(message,"info")},warn:function(message){this.log(message,"warn")},error:function(message){throw new Error(message)},deprecate:function(message){this.log(message,"warn")}}});Ext.type=Ext.typeOf})();(function(){var a="2.4.2.571",b;Ext.Version=b=Ext.extend(Object,{constructor:function(d){var c=this.toNumber,f,e;if(d instanceof b){return d}this.version=this.shortVersion=String(d).toLowerCase().replace(/_/g,".").replace(/[\-+]/g,"");e=this.version.search(/([^\d\.])/);if(e!==-1){this.release=this.version.substr(e,d.length);this.shortVersion=this.version.substr(0,e)}this.shortVersion=this.shortVersion.replace(/[^\d]/g,"");f=this.version.split(".");this.major=c(f.shift());this.minor=c(f.shift());this.patch=c(f.shift());this.build=c(f.shift());return this},toNumber:function(c){c=parseInt(c||0,10);if(isNaN(c)){c=0}return c},toString:function(){return this.version},valueOf:function(){return this.version},getMajor:function(){return this.major||0},getMinor:function(){return this.minor||0},getPatch:function(){return this.patch||0},getBuild:function(){return this.build||0},getRelease:function(){return this.release||""},isGreaterThan:function(c){return b.compare(this.version,c)===1},isGreaterThanOrEqual:function(c){return b.compare(this.version,c)>=0},isLessThan:function(c){return b.compare(this.version,c)===-1},isLessThanOrEqual:function(c){return b.compare(this.version,c)<=0},equals:function(c){return b.compare(this.version,c)===0},match:function(c){c=String(c);return this.version.substr(0,c.length)===c},toArray:function(){return[this.getMajor(),this.getMinor(),this.getPatch(),this.getBuild(),this.getRelease()]},getShortVersion:function(){return this.shortVersion},gt:function(){return this.isGreaterThan.apply(this,arguments)},lt:function(){return this.isLessThan.apply(this,arguments)},gtEq:function(){return this.isGreaterThanOrEqual.apply(this,arguments)},ltEq:function(){return this.isLessThanOrEqual.apply(this,arguments)}});Ext.apply(b,{releaseValueMap:{dev:-6,alpha:-5,a:-5,beta:-4,b:-4,rc:-3,"#":-2,p:-1,pl:-1},getComponentValue:function(c){return !c?0:(isNaN(c)?this.releaseValueMap[c]||c:parseInt(c,10))},compare:function(g,f){var d,e,c;g=new b(g).toArray();f=new b(f).toArray();for(c=0;ce){return 1}}}return 0}});Ext.apply(Ext,{versions:{},lastRegisteredVersion:null,setVersion:function(d,c){Ext.versions[d]=new b(c);Ext.lastRegisteredVersion=Ext.versions[d];return this},getVersion:function(c){if(c===undefined){return Ext.lastRegisteredVersion}return Ext.versions[c]},deprecate:function(c,e,f,d){if(b.compare(Ext.getVersion(c),e)<1){f.call(d)}}});Ext.setVersion("core",a)})();Ext.String={trimRegex:/^[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+|[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+$/g,escapeRe:/('|\\)/g,formatRe:/\{(\d+)\}/g,escapeRegexRe:/([-.*+?^${}()|[\]\/\\])/g,htmlEncode:(function(){var d={"&":"&",">":">","<":"<",'"':"""},b=[],c,a;for(c in d){b.push(c)}a=new RegExp("("+b.join("|")+")","g");return function(e){return(!e)?e:String(e).replace(a,function(g,f){return d[f]})}})(),htmlDecode:(function(){var d={"&":"&",">":">","<":"<",""":'"'},b=[],c,a;for(c in d){b.push(c)}a=new RegExp("("+b.join("|")+"|&#[0-9]{1,5};)","g");return function(e){return(!e)?e:String(e).replace(a,function(g,f){if(f in d){return d[f]}else{return String.fromCharCode(parseInt(f.substr(2),10))}})}})(),urlAppend:function(b,a){if(!Ext.isEmpty(a)){return b+(b.indexOf("?")===-1?"?":"&")+a}return b},trim:function(a){return a.replace(Ext.String.trimRegex,"")},capitalize:function(a){return a.charAt(0).toUpperCase()+a.substr(1)},ellipsis:function(c,a,d){if(c&&c.length>a){if(d){var e=c.substr(0,a-2),b=Math.max(e.lastIndexOf(" "),e.lastIndexOf("."),e.lastIndexOf("!"),e.lastIndexOf("?"));if(b!==-1&&b>=(a-15)){return e.substr(0,b)+"..."}}return c.substr(0,a-3)+"..."}return c},escapeRegex:function(a){return a.replace(Ext.String.escapeRegexRe,"\\$1")},escape:function(a){return a.replace(Ext.String.escapeRe,"\\$1")},toggle:function(b,c,a){return b===c?a:c},leftPad:function(b,c,d){var a=String(b);d=d||" ";while(a.lengthH){for(C=e;C--;){F[z+C]=F[H+C]}}}if(J&&G===B){F.length=B;F.push.apply(F,I)}else{F.length=B+J;for(C=0;C-1;y--){if(A.call(z||C[y],C[y],y,C)===false){return y}}}return true},forEach:i?function(z,y,e){return z.forEach(y,e)}:function(B,z,y){var e=0,A=B.length;for(;eD.length){return 1}else{if(E.lengthe){e=z}}}return e},mean:function(e){return e.length>0?a.sum(e)/e.length:undefined},sum:function(B){var y=0,e,A,z;for(e=0,A=B.length;e=c){f+=c}else{if(b*2<-c){f-=c}}}return Ext.Number.constrain(f,d,g)},toFixed:function(d,b){if(a){b=b||0;var c=Math.pow(10,b);return(Math.round(d*c)/c).toFixed(b)}return d.toFixed(b)},from:function(c,b){if(isFinite(c)){c=parseFloat(c)}return !isNaN(c)?c:b}}})();Ext.num=function(){return Ext.Number.from.apply(this,arguments)};(function(){var a=function(){};var b=Ext.Object={chain:("create" in Object)?function(c){return Object.create(c)}:function(d){a.prototype=d;var c=new a();a.prototype=null;return c},toQueryObjects:function(e,j,d){var c=b.toQueryObjects,h=[],f,g;if(Ext.isArray(j)){for(f=0,g=j.length;f0){h=n.split("=");v=decodeURIComponent(h[0]);m=(h[1]!==undefined)?decodeURIComponent(h[1]):"";if(!q){if(t.hasOwnProperty(v)){if(!Ext.isArray(t[v])){t[v]=[t[v]]}t[v].push(m)}else{t[v]=m}}else{g=v.match(/(\[):?([^\]]*)\]/g);s=v.match(/^([^\[]+)/);if(!s){throw new Error('[Ext.Object.fromQueryString] Malformed query string given, failed parsing name from "'+n+'"')}v=s[0];k=[];if(g===null){t[v]=m;continue}for(o=0,c=g.length;o0){return setTimeout(e,c)}e();return 0},createSequence:function(b,c,a){if(!c){return b}else{return function(){var d=b.apply(this,arguments);c.apply(a||this,arguments);return d}}},createBuffered:function(e,b,d,c){var a;return function(){var g=c||Array.prototype.slice.call(arguments,0),f=d||this;if(a){clearTimeout(a)}a=setTimeout(function(){e.apply(f,g)},b)}},createThrottled:function(e,b,d){var f,a,c,h,g=function(){e.apply(d||this,c);f=new Date().getTime()};return function(){a=new Date().getTime()-f;c=arguments;clearTimeout(h);if(!f||(a>=b)){g()}else{h=setTimeout(g,b-a)}}},interceptBefore:function(b,a,d,c){var e=b[a]||Ext.emptyFn;return(b[a]=function(){var f=d.apply(c||this,arguments);e.apply(this,arguments);return f})},interceptAfter:function(b,a,d,c){var e=b[a]||Ext.emptyFn;return(b[a]=function(){e.apply(this,arguments);return d.apply(c||this,arguments)})}};Ext.defer=Ext.Function.alias(Ext.Function,"defer");Ext.pass=Ext.Function.alias(Ext.Function,"pass");Ext.bind=Ext.Function.alias(Ext.Function,"bind");Ext.JSON=new (function(){var useHasOwn=!!{}.hasOwnProperty,isNative=function(){var useNative=null;return function(){if(useNative===null){useNative=Ext.USE_NATIVE_JSON&&window.JSON&&JSON.toString()=="[object JSON]"}return useNative}}(),pad=function(n){return n<10?"0"+n:n},doDecode=function(json){return eval("("+json+")")},doEncode=function(o){if(!Ext.isDefined(o)||o===null){return"null"}else{if(Ext.isArray(o)){return encodeArray(o)}else{if(Ext.isDate(o)){return Ext.JSON.encodeDate(o)}else{if(Ext.isString(o)){if(Ext.isMSDate(o)){return encodeMSDate(o)}else{return encodeString(o)}}else{if(typeof o=="number"){return isFinite(o)?String(o):"null"}else{if(Ext.isBoolean(o)){return String(o)}else{if(Ext.isObject(o)){return encodeObject(o)}else{if(typeof o==="function"){return"null"}}}}}}}}return"undefined"},m={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\","\x0b":"\\u000b"},charToReplace=/[\\\"\x00-\x1f\x7f-\uffff]/g,encodeString=function(s){return'"'+s.replace(charToReplace,function(a){var c=m[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"'},encodeArray=function(o){var a=["[",""],len=o.length,i;for(i=0;i0){for(d=0;d0){if(m===l){return o[m]}n=o[m];l=l.substring(m.length+1)}if(n.length>0){n+="/"}return n.replace(/\/\.\//g,"/")+l.replace(/\./g,"/")+".js"},getPrefix:function(m){var o=this.config.paths,n,l="";if(o.hasOwnProperty(m)){return m}for(n in o){if(o.hasOwnProperty(n)&&n+"."===m.substring(0,n.length+1)){if(n.length>l.length){l=n}}}return l},require:function(n,m,l,o){if(m){m.call(l)}},syncRequire:function(){},exclude:function(m){var l=this;return{require:function(p,o,n){return l.require(p,o,n,m)},syncRequire:function(p,o,n){return l.syncRequire(p,o,n,m)}}},onReady:function(o,n,p,l){var m;if(p!==false&&Ext.onDocumentReady){m=o;o=function(){Ext.onDocumentReady(m,n,l)}}o.call(n)}};Ext.apply(b,{documentHead:typeof document!="undefined"&&(document.head||document.getElementsByTagName("head")[0]),isLoading:false,queue:[],isClassFileLoaded:{},isFileLoaded:{},readyListeners:[],optionalRequires:[],requiresMap:{},numPendingFiles:0,numLoadedFiles:0,hasFileLoadError:false,classNameToFilePathMap:{},syncModeEnabled:false,scriptElements:{},refreshQueue:function(){var l=this.queue,r=l.length,o,q,m,p,n;if(r===0){this.triggerReady();return}for(o=0;othis.numLoadedFiles){continue}m=0;do{if(a.isCreated(p[m])){g(p,m,1)}else{m++}}while(m=200&&o<300)||o==304||(o==0&&r.length>0)){Ext.globalEval(r+"\n//@ sourceURL="+m);t.call(x)}else{p.call(this,"Failed loading synchronously via XHR: '"+m+"'; please verify that the file exists. XHR status code: "+o,l)}v=null}},syncRequire:function(){var l=this.syncModeEnabled;if(!l){this.syncModeEnabled=true}this.require.apply(this,arguments);if(!l){this.syncModeEnabled=false}this.refreshQueue()},require:function(G,u,o,r){var w={},n={},z=this.queue,D=this.classNameToFilePathMap,B=this.isClassFileLoaded,t=[],I=[],F=[],m=[],s,H,y,x,l,q,E,C,A,v,p;if(r){r=i(r);for(C=0,v=r.length;C0){t=a.getNamesByExpression(l);for(A=0,p=t.length;A0){s=function(){var L=[],K,M,J;for(K=0,M=m.length;K0){I=a.getNamesByExpression(x);p=I.length;for(A=0;A0){if(!this.config.enabled){throw new Error("Ext.Loader is not enabled, so dependencies cannot be resolved dynamically. Missing required class"+((F.length>1)?"es":"")+": "+F.join(", "))}}else{s.call(o);return this}H=this.syncModeEnabled;if(!H){z.push({requires:F.slice(),callback:s,scope:o})}v=F.length;for(C=0;C ")+" -> "+q[0])}for(p=0,t=y[C].length;p=2){if("1496x2048" in r){e(r["1496x2048"],"(orientation: landscape)")}if("1536x2008" in r){e(r["1536x2008"],"(orientation: portrait)")}if("144" in p){n(p["144"],"144x144",t)}}else{if("748x1024" in r){e(r["748x1024"],"(orientation: landscape)")}if("768x1004" in r){e(r["768x1004"],"(orientation: portrait)")}if("72" in p){n(p["72"],"72x72",t)}}}else{if(o>=2&&Ext.os.version.gtEq("4.3")){if(Ext.os.is.iPhone5){e(r["640x1096"])}else{e(r["640x920"])}if("114" in p){n(p["114"],"114x114",t)}}else{e(r["320x460"]);if("57" in p){n(p["57"],null,t)}}}},application:function(b){var a=b.name,e,d,c;if(!b){b={}}if(!Ext.Loader.config.paths[a]){Ext.Loader.setPath(a,b.appFolder||"app")}c=Ext.Array.from(b.requires);b.requires=["Ext.app.Application"];e=b.onReady;d=b.scope;b.onReady=function(){b.requires=c;new Ext.app.Application(b);if(e){e.call(d)}};Ext.setup(b)},factoryConfig:function(a,l){var g=Ext.isSimpleObject(a);if(g&&a.xclass){var f=a.xclass;delete a.xclass;Ext.require(f,function(){Ext.factoryConfig(a,function(i){l(Ext.create(f,i))})});return}var d=Ext.isArray(a),m=[],k,j,c,e;if(g||d){if(g){for(k in a){if(a.hasOwnProperty(k)){j=a[k];if(Ext.isSimpleObject(j)||Ext.isArray(j)){m.push(k)}}}}else{for(c=0,e=a.length;c=e){l(a);return}k=m[c];j=a[k];Ext.factoryConfig(j,h)}b();return}l(a)},factory:function(b,e,a,f){var d=Ext.ClassManager,c;if(!b||b.isInstance){if(a&&a!==b){a.destroy()}return b}if(f){if(typeof b=="string"){return d.instantiateByAlias(f+"."+b)}else{if(Ext.isObject(b)&&"type" in b){return d.instantiateByAlias(f+"."+b.type,b)}}}if(b===true){return a||d.instantiate(e)}if(!Ext.isObject(b)){Ext.Logger.error("Invalid config, must be a valid config object")}if("xtype" in b){c=d.instantiateByAlias("widget."+b.xtype,b)}else{if("xclass" in b){c=d.instantiate(b.xclass,b)}}if(c){if(a){a.destroy()}return c}if(a){return a.setConfig(b)}return d.instantiate(e,b)},deprecateClassMember:function(b,c,a,d){return this.deprecateProperty(b.prototype,c,a,d)},deprecateClassMembers:function(b,c){var d=b.prototype,e,a;for(e in c){if(c.hasOwnProperty(e)){a=c[e];this.deprecateProperty(d,e,a)}}},deprecateProperty:function(b,c,a,d){if(!d){d="'"+c+"' is deprecated"}if(a){d+=", please use '"+a+"' instead"}if(a){Ext.Object.defineProperty(b,c,{get:function(){Ext.Logger.deprecate(d,1);return this[a]},set:function(e){Ext.Logger.deprecate(d,1);this[a]=e},configurable:true})}},deprecatePropertyValue:function(b,a,d,c){Ext.Object.defineProperty(b,a,{get:function(){Ext.Logger.deprecate(c,1);return d},configurable:true})},deprecateMethod:function(b,a,d,c){b[a]=function(){Ext.Logger.deprecate(c,2);if(d){return d.apply(this,arguments)}}},deprecateClassMethod:function(a,b,h,d){if(typeof b!="string"){var g,f;for(g in b){if(b.hasOwnProperty(g)){f=b[g];Ext.deprecateClassMethod(a,g,f)}}return}var c=typeof h=="string",e;if(!d){d="'"+b+"()' is deprecated, please use '"+(c?h:h.name)+"()' instead"}if(c){e=function(){Ext.Logger.deprecate(d,this);return this[h].apply(this,arguments)}}else{e=function(){Ext.Logger.deprecate(d,this);return h.apply(this,arguments)}}if(b in a.prototype){Ext.Object.defineProperty(a.prototype,b,{value:null,writable:true,configurable:true})}a.addMember(b,e)},showLeaks:function(){var c=Ext.ComponentManager.all.map,a=[],b;Ext.Object.each(c,function(e,d){while((b=d.getParent())&&c.hasOwnProperty(b.getId())){d=b}if(a.indexOf(d)===-1){a.push(d)}});console.log(a)},isReady:false,readyListeners:[],triggerReady:function(){var b=Ext.readyListeners,a,c,d;if(!Ext.isReady){Ext.isReady=true;for(a=0,c=b.length;a0){return b+Ext.String.capitalize(a)}return a},getPreferredTranslationMethod:function(a){if(typeof a=="object"&&"translationMethod" in a&&a.translationMethod!=="auto"){return a.translationMethod}else{if(this.is.AndroidStock2||this.is.IE){return"scrollposition"}else{return"csstransform"}}}},function(){var a=Ext.browser=new this(Ext.global.navigator.userAgent)});Ext.define("Ext.env.OS",{statics:{names:{ios:"iOS",android:"Android",windowsPhone:"WindowsPhone",webos:"webOS",blackberry:"BlackBerry",rimTablet:"RIMTablet",mac:"MacOS",win:"Windows",tizen:"Tizen",linux:"Linux",bada:"Bada",chrome:"ChromeOS",other:"Other"},prefixes:{tizen:"(Tizen )",ios:"i(?:Pad|Phone|Pod)(?:.*)CPU(?: iPhone)? OS ",android:"(Android |HTC_|Silk/)",windowsPhone:"Windows Phone ",blackberry:"(?:BlackBerry|BB)(?:.*)Version/",rimTablet:"RIM Tablet OS ",webos:"(?:webOS|hpwOS)/",bada:"Bada/",chrome:"CrOS "}},is:Ext.emptyFn,name:null,version:null,setFlag:function(a,b){if(typeof b=="undefined"){b=true}this.is[a]=b;this.is[a.toLowerCase()]=b;return this},constructor:function(o,b,k){var l=this.statics(),j=l.names,d=l.prefixes,a,h="",c,g,f,n,e,m;k=k||Ext.browser;e=this.is=function(i){return this.is[i]===true};for(c in d){if(d.hasOwnProperty(c)){g=d[c];f=o.match(new RegExp("(?:"+g+")([^\\s;]+)"));if(f){a=j[c];m=f[1];if(m&&m=="HTC_"){h=new Ext.Version("2.3")}else{if(m&&m=="Silk/"){h=new Ext.Version("2.3")}else{h=new Ext.Version(f[f.length-1])}}break}}}if(!a){a=j[(o.toLowerCase().match(/mac|win|linux/)||["other"])[0]];h=new Ext.Version("")}this.name=a;this.version=h;if(b){this.setFlag(b.replace(/ simulator$/i,""))}this.setFlag(a);if(h){this.setFlag(a+(h.getMajor()||""));this.setFlag(a+h.getShortVersion())}for(c in j){if(j.hasOwnProperty(c)){n=j[c];if(!e.hasOwnProperty(a)){this.setFlag(n,(a===n))}}}if(this.name=="iOS"&&window.screen.height==568){this.setFlag("iPhone5")}if(k.is.Safari||k.is.Silk){if(this.is.Android2||this.is.Android3||k.version.shortVersion==501){k.setFlag("AndroidStock");k.setFlag("AndroidStock2")}if(this.is.Android4){k.setFlag("AndroidStock");k.setFlag("AndroidStock4")}}return this}},function(){var a=Ext.global.navigator,e=a.userAgent,b,g,d;Ext.os=b=new this(e,a.platform);g=b.name;var c=window.location.search.match(/deviceType=(Tablet|Phone)/),f=window.deviceType;if(c&&c[1]){d=c[1]}else{if(f==="iPhone"){d="Phone"}else{if(f==="iPad"){d="Tablet"}else{if(!b.is.Android&&!b.is.iOS&&!b.is.WindowsPhone&&/Windows|Linux|MacOS/.test(g)){d="Desktop";Ext.browser.is.WebView=Ext.browser.is.Ripple?true:false}else{if(b.is.iPad||b.is.RIMTablet||b.is.Android3||Ext.browser.is.Silk||(b.is.Android&&e.search(/mobile/i)==-1)){d="Tablet"}else{d="Phone"}}}}}b.setFlag(d,true);b.deviceType=d});Ext.define("Ext.env.Feature",{constructor:function(){this.testElements={};this.has=function(a){return !!this.has[a]};if(!Ext.theme){Ext.theme={name:"Default"}}Ext.theme.is={};Ext.theme.is[Ext.theme.name]=true;Ext.onDocumentReady(function(){this.registerTest({ProperHBoxStretching:function(){var b=document.createElement("div"),c=b.appendChild(document.createElement("div")),d=c.appendChild(document.createElement("div")),a;b.setAttribute("style","width: 100px; height: 100px; position: relative;");c.setAttribute("style","position: absolute; display: -ms-flexbox; display: -webkit-flex; display: -moz-flexbox; display: flex; -ms-flex-direction: row; -webkit-flex-direction: row; -moz-flex-direction: row; flex-direction: row; min-width: 100%;");d.setAttribute("style","width: 200px; height: 50px;");document.body.appendChild(b);a=c.offsetWidth;document.body.removeChild(b);return(a>100)}})},this)},getTestElement:function(a,b){if(a===undefined){a="div"}else{if(typeof a!=="string"){return a}}if(b){return document.createElement(a)}if(!this.testElements[a]){this.testElements[a]=document.createElement(a)}return this.testElements[a]},isStyleSupported:function(c,b){var d=this.getTestElement(b).style,a=Ext.String.capitalize(c);if(typeof d[c]!=="undefined"||typeof d[Ext.browser.getStylePrefix(c)+a]!=="undefined"){return true}return false},isStyleSupportedWithoutPrefix:function(b,a){var c=this.getTestElement(a).style;if(typeof c[b]!=="undefined"){return true}return false},isEventSupported:function(c,a){if(a===undefined){a=window}var e=this.getTestElement(a),b="on"+c.toLowerCase(),d=(b in e);if(!d){if(e.setAttribute&&e.removeAttribute){e.setAttribute(b,"");d=typeof e[b]==="function";if(typeof e[b]!=="undefined"){e[b]=undefined}e.removeAttribute(b)}}return d},getSupportedPropertyName:function(b,a){var c=Ext.browser.getVendorProperyName(a);if(c in b){return c}else{if(a in b){return a}}return null},registerTest:Ext.Function.flexSetter(function(a,b){this.has[a]=b.call(this);return this})},function(){Ext.feature=new this;var a=Ext.feature.has;Ext.feature.registerTest({Canvas:function(){var b=this.getTestElement("canvas");return !!(b&&b.getContext&&b.getContext("2d"))},Svg:function(){var b=document;return !!(b.createElementNS&&!!b.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect)},Vml:function(){var c=this.getTestElement(),b=false;c.innerHTML="";b=(c.childNodes.length===1);c.innerHTML="";return b},Touch:function(){return Ext.browser.is.Ripple||(this.isEventSupported("touchstart")&&!(Ext.os&&Ext.os.name.match(/Windows|MacOS|Linux/)&&!Ext.os.is.BlackBerry6))},Pointer:function(){return !!window.navigator.msPointerEnabled},Orientation:function(){return"orientation" in window},OrientationChange:function(){return this.isEventSupported("orientationchange")},DeviceMotion:function(){return this.isEventSupported("devicemotion")},Geolocation:function(){return"geolocation" in window.navigator},SqlDatabase:function(){return"openDatabase" in window},WebSockets:function(){return"WebSocket" in window},Range:function(){return !!document.createRange},CreateContextualFragment:function(){var b=!!document.createRange?document.createRange():false;return b&&!!b.createContextualFragment},History:function(){return("history" in window&&"pushState" in window.history)},CssTransforms:function(){return this.isStyleSupported("transform")},CssTransformNoPrefix:function(){if(!Ext.browser.is.AndroidStock){return this.isStyleSupportedWithoutPrefix("transform")}else{return this.isStyleSupportedWithoutPrefix("transform")&&!this.isStyleSupportedWithoutPrefix("-webkit-transform")}},Css3dTransforms:function(){return this.has("CssTransforms")&&this.isStyleSupported("perspective")&&!Ext.browser.is.AndroidStock2},CssAnimations:function(){return this.isStyleSupported("animationName")},CssTransitions:function(){return this.isStyleSupported("transitionProperty")},Audio:function(){return !!this.getTestElement("audio").canPlayType},Video:function(){return !!this.getTestElement("video").canPlayType},ClassList:function(){return"classList" in this.getTestElement()},LocalStorage:function(){var b=false;try{if("localStorage" in window&&window.localStorage!==null){localStorage.setItem("sencha-localstorage-test","test success");localStorage.removeItem("sencha-localstorage-test");b=true}}catch(c){}return b},MatchMedia:function(){return"matchMedia" in window},XHR2:function(){return window.ProgressEvent&&window.FormData&&window.XMLHttpRequest&&("withCredentials" in new XMLHttpRequest)},XHRUploadProgress:function(){if(window.XMLHttpRequest&&!Ext.browser.is.AndroidStock){var b=new XMLHttpRequest();return b&&("upload" in b)&&("onprogress" in b.upload)}return false},NumericInputPlaceHolder:function(){return !(Ext.browser.is.AndroidStock4&&Ext.os.version.getMinor()<2)}})});Ext.define("Ext.dom.Query",{select:function(h,b){var g=[],d,f,e,c,a;b=b||document;if(typeof b=="string"){b=document.getElementById(b)}h=h.split(",");for(f=0,c=h.length;f")}else{c.push(">");if((h=d.tpl)){h.applyOut(d.tplData,c)}if((h=d.html)){c.push(h)}if((h=d.cn||d.children)){g.generateMarkup(h,c)}f=g.closeTags;c.push(f[a]||(f[a]=""))}}}return c},generateStyles:function(e,c){var b=c||[],d;for(d in e){if(e.hasOwnProperty(d)){b.push(this.decamelizeName(d),":",e[d],";")}}return c||b.join("")},markup:function(a){if(typeof a=="string"){return a}var b=this.generateMarkup(a,[]);return b.join("")},applyStyles:function(a,b){Ext.fly(a).applyStyles(b)},createContextualFragment:function(c){var f=document.createElement("div"),a=document.createDocumentFragment(),b=0,d,e;f.innerHTML=c;e=f.childNodes;d=e.length;for(;b";return b}},isElement:true,constructor:function(a){if(typeof a=="string"){a=document.getElementById(a)}if(!a){throw new Error("Invalid domNode reference or an id of an existing domNode: "+a)}this.dom=a;this.getUniqueId()},attach:function(a){this.dom=a;this.id=a.id;return this},getUniqueId:function(){var b=this.id,a;if(!b){a=this.dom;if(a.id.length>0){this.id=b=a.id}else{a.id=b=this.mixins.identifiable.getUniqueId.call(this)}Ext.Element.cache[b]=this}return b},setId:function(c){var a=this.id,b=Ext.Element.cache;if(a){delete b[a]}this.dom.id=c;this.id=c;b[c]=this;return this},setHtml:function(a){this.dom.innerHTML=a},getHtml:function(){return this.dom.innerHTML},setText:function(a){this.dom.textContent=a},redraw:function(){var b=this.dom,a=b.style;a.display="none";b.offsetHeight;a.display=""},isPainted:(function(){return !Ext.browser.is.IE?function(){var a=this.dom;return Boolean(a&&a.offsetParent)}:function(){var a=this.dom;return Boolean(a&&(a.offsetHeight!==0&&a.offsetWidth!==0))}})(),set:function(a,b){var e=this.dom,c,d;for(c in a){if(a.hasOwnProperty(c)){d=a[c];if(c=="style"){this.applyStyles(d)}else{if(c=="cls"){e.className=d}else{if(b!==false){if(d===undefined){e.removeAttribute(c)}else{e.setAttribute(c,d)}}else{e[c]=d}}}}}return this},is:function(a){return Ext.DomQuery.is(this.dom,a)},getValue:function(b){var a=this.dom.value;return b?parseInt(a,10):a},getAttribute:function(a,b){var c=this.dom;return c.getAttributeNS(b,a)||c.getAttribute(b+":"+a)||c.getAttribute(a)||c[a]},setSizeState:function(d){var c=["x-sized","x-unsized","x-stretched"],a=[true,false,null],b=a.indexOf(d),e;if(b!==-1){e=c[b];c.splice(b,1);this.addCls(e)}this.removeCls(c);return this},destroy:function(){this.isDestroyed=true;var a=Ext.Element.cache,b=this.dom;if(b&&b.parentNode&&b.tagName!="BODY"){b.parentNode.removeChild(b)}delete a[this.id];delete this.dom}},function(a){Ext.elements=Ext.cache=a.cache;this.addStatics({Fly:new Ext.Class({extend:a,constructor:function(b){this.dom=b}}),_flyweights:{},fly:function(e,c){var f=null,d=a._flyweights,b;c=c||"_global";e=Ext.getDom(e);if(e){f=d[c]||(d[c]=new a.Fly());f.dom=e;f.isSynchronized=false;b=Ext.cache[e.id];if(b&&b.isElement){b.isSynchronized=false}}return f}});Ext.get=function(b){return a.get(b)};Ext.fly=function(){return a.fly.apply(a,arguments)};Ext.ClassManager.onCreated(function(){a.mixin("observable",Ext.mixin.Observable)},null,"Ext.mixin.Observable")});Ext.dom.Element.addStatics({numberRe:/\d+$/,unitRe:/\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i,camelRe:/(-[a-z])/gi,cssRe:/([a-z0-9-]+)\s*:\s*([^;\s]+(?:\s*[^;\s]+)*);?/gi,opacityRe:/alpha\(opacity=(.*)\)/i,propertyCache:{},defaultUnit:"px",borders:{l:"border-left-width",r:"border-right-width",t:"border-top-width",b:"border-bottom-width"},paddings:{l:"padding-left",r:"padding-right",t:"padding-top",b:"padding-bottom"},margins:{l:"margin-left",r:"margin-right",t:"margin-top",b:"margin-bottom"},addUnits:function(b,a){if(b===""||b=="auto"||b===undefined||b===null){return b||""}if(Ext.isNumber(b)||this.numberRe.test(b)){return b+(a||this.defaultUnit||"px")}else{if(!this.unitRe.test(b)){Ext.Logger.warn("Warning, size detected ("+b+") not a valid property value on Element.addUnits.");return b||""}}return b},isAncestor:function(b,d){var a=false;b=Ext.getDom(b);d=Ext.getDom(d);if(b&&d){if(b.contains){return b.contains(d)}else{if(b.compareDocumentPosition){return !!(b.compareDocumentPosition(d)&16)}else{while((d=d.parentNode)){a=d==b||a}}}}return a},parseBox:function(b){if(typeof b!="string"){b=b.toString()}var c=b.split(" "),a=c.length;if(a==1){c[1]=c[2]=c[3]=c[0]}else{if(a==2){c[2]=c[0];c[3]=c[1]}else{if(a==3){c[3]=c[1]}}}return{top:c[0]||0,right:c[1]||0,bottom:c[2]||0,left:c[3]||0}},unitizeBox:function(c,a){var b=this;c=b.parseBox(c);return b.addUnits(c.top,a)+" "+b.addUnits(c.right,a)+" "+b.addUnits(c.bottom,a)+" "+b.addUnits(c.left,a)},camelReplaceFn:function(b,c){return c.charAt(1).toUpperCase()},normalize:function(a){return this.propertyCache[a]||(this.propertyCache[a]=a.replace(this.camelRe,this.camelReplaceFn))},fromPoint:function(a,b){return Ext.get(document.elementFromPoint(a,b))},parseStyles:function(c){var a={},b=this.cssRe,d;if(c){b.lastIndex=0;while((d=b.exec(c))){a[d[1]]=d[2]}}return a}});Ext.dom.Element.addMembers({appendChild:function(a){this.dom.appendChild(Ext.getDom(a));return this},removeChild:function(a){this.dom.removeChild(Ext.getDom(a));return this},append:function(){this.appendChild.apply(this,arguments)},appendTo:function(a){Ext.getDom(a).appendChild(this.dom);return this},insertBefore:function(a){a=Ext.getDom(a);a.parentNode.insertBefore(this.dom,a);return this},insertAfter:function(a){a=Ext.getDom(a);a.parentNode.insertBefore(this.dom,a.nextSibling);return this},insertFirst:function(b){var a=Ext.getDom(b),d=this.dom,c=d.firstChild;if(!c){d.appendChild(a)}else{d.insertBefore(a,c)}return this},insertSibling:function(e,c,d){var f=this,b,a=(c||"before").toLowerCase()=="after",g;if(Ext.isArray(e)){g=f;Ext.each(e,function(h){b=Ext.fly(g,"_internal").insertSibling(h,c,d);if(a){g=b}});return b}e=e||{};if(e.nodeType||e.dom){b=f.dom.parentNode.insertBefore(Ext.getDom(e),a?f.dom.nextSibling:f.dom);if(!d){b=Ext.get(b)}}else{if(a&&!f.dom.nextSibling){b=Ext.core.DomHelper.append(f.dom.parentNode,e,!d)}else{b=Ext.core.DomHelper[a?"insertAfter":"insertBefore"](f.dom,e,!d)}}return b},replace:function(a){a=Ext.getDom(a);a.parentNode.replaceChild(this.dom,a);return this},replaceWith:function(a){var b=this;if(a.nodeType||a.dom||typeof a=="string"){a=Ext.get(a);b.dom.parentNode.insertBefore(a.dom,b.dom)}else{a=Ext.core.DomHelper.insertBefore(b.dom,a)}delete Ext.cache[b.id];Ext.removeNode(b.dom);b.id=Ext.id(b.dom=a);return b},doReplaceWith:function(a){var b=this.dom;b.parentNode.replaceChild(Ext.getDom(a),b)},createChild:function(b,a,c){b=b||{tag:"div"};if(a){return Ext.core.DomHelper.insertBefore(a,b,c!==true)}else{return Ext.core.DomHelper[!this.dom.firstChild?"insertFirst":"append"](this.dom,b,c!==true)}},wrap:function(b,c){var e=this.dom,f=this.self.create(b,c),d=(c)?f:f.dom,a=e.parentNode;if(a){a.insertBefore(d,e)}d.appendChild(e);return f},wrapAllChildren:function(a){var d=this.dom,b=d.childNodes,e=this.self.create(a),c=e.dom;while(b.length>0){c.appendChild(d.firstChild)}d.appendChild(c);return e},unwrapAllChildren:function(){var c=this.dom,b=c.childNodes,a=c.parentNode;if(a){while(b.length>0){a.insertBefore(c,c.firstChild)}this.destroy()}},unwrap:function(){var c=this.dom,a=c.parentNode,b;if(a){b=a.parentNode;b.insertBefore(c,a);b.removeChild(a)}else{b=document.createDocumentFragment();b.appendChild(c)}return this},detach:function(){var a=this.dom;if(a&&a.parentNode&&a.tagName!=="BODY"){a.parentNode.removeChild(a)}return this},insertHtml:function(b,c,a){var d=Ext.core.DomHelper.insertHtml(b,this.dom,c);return a?Ext.get(d):d}});Ext.dom.Element.override({getX:function(){return this.getXY()[0]},getY:function(){return this.getXY()[1]},getXY:function(){var b=this.dom.getBoundingClientRect(),a=Math.round;return[a(b.left+window.pageXOffset),a(b.top+window.pageYOffset)]},getOffsetsTo:function(a){var c=this.getXY(),b=Ext.fly(a,"_internal").getXY();return[c[0]-b[0],c[1]-b[1]]},setX:function(a){return this.setXY([a,this.getY()])},setY:function(a){return this.setXY([this.getX(),a])},setXY:function(d){var b=this;if(arguments.length>1){d=[d,arguments[1]]}var c=b.translatePoints(d),a=b.dom.style;for(d in c){if(!c.hasOwnProperty(d)){continue}if(!isNaN(c[d])){a[d]=c[d]+"px"}}return b},getLeft:function(){return parseInt(this.getStyle("left"),10)||0},getRight:function(){return parseInt(this.getStyle("right"),10)||0},getTop:function(){return parseInt(this.getStyle("top"),10)||0},getBottom:function(){return parseInt(this.getStyle("bottom"),10)||0},translatePoints:function(a,g){g=isNaN(a[1])?g:a[1];a=isNaN(a[0])?a:a[0];var d=this,e=d.isStyle("position","relative"),f=d.getXY(),b=parseInt(d.getStyle("left"),10),c=parseInt(d.getStyle("top"),10);b=!isNaN(b)?b:(e?0:d.dom.offsetLeft);c=!isNaN(c)?c:(e?0:d.dom.offsetTop);return{left:(a-f[0]+b),top:(g-f[1]+c)}},setBox:function(d){var c=this,b=d.width,a=d.height,f=d.top,e=d.left;if(e!==undefined){c.setLeft(e)}if(f!==undefined){c.setTop(f)}if(b!==undefined){c.setWidth(b)}if(a!==undefined){c.setHeight(a)}return this},getBox:function(g,j){var h=this,e=h.dom,c=e.offsetWidth,k=e.offsetHeight,n,f,d,a,m,i;if(!j){n=h.getXY()}else{if(g){n=[0,0]}else{n=[parseInt(h.getStyle("left"),10)||0,parseInt(h.getStyle("top"),10)||0]}}if(!g){f={x:n[0],y:n[1],0:n[0],1:n[1],width:c,height:k}}else{d=h.getBorderWidth.call(h,"l")+h.getPadding.call(h,"l");a=h.getBorderWidth.call(h,"r")+h.getPadding.call(h,"r");m=h.getBorderWidth.call(h,"t")+h.getPadding.call(h,"t");i=h.getBorderWidth.call(h,"b")+h.getPadding.call(h,"b");f={x:n[0]+d,y:n[1]+m,0:n[0]+d,1:n[1]+m,width:c-(d+a),height:k-(m+i)}}f.left=f.x;f.top=f.y;f.right=f.x+f.width;f.bottom=f.y+f.height;return f},getPageBox:function(e){var g=this,c=g.dom;if(!c){return new Ext.util.Region()}var j=c.offsetWidth,f=c.offsetHeight,m=g.getXY(),k=m[1],a=m[0]+j,i=m[1]+f,d=m[0];if(e){return new Ext.util.Region(k,a,i,d)}else{return{left:d,top:k,width:j,height:f,right:a,bottom:i}}}});Ext.dom.Element.addMembers({WIDTH:"width",HEIGHT:"height",MIN_WIDTH:"min-width",MIN_HEIGHT:"min-height",MAX_WIDTH:"max-width",MAX_HEIGHT:"max-height",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left",VISIBILITY:1,DISPLAY:2,OFFSETS:3,SEPARATOR:"-",trimRe:/^\s+|\s+$/g,wordsRe:/\w/g,spacesRe:/\s+/,styleSplitRe:/\s*(?::|;)\s*/,transparentRe:/^(?:transparent|(?:rgba[(](?:\s*\d+\s*[,]){3}\s*0\s*[)]))$/i,classNameSplitRegex:/[\s]+/,borders:{t:"border-top-width",r:"border-right-width",b:"border-bottom-width",l:"border-left-width"},paddings:{t:"padding-top",r:"padding-right",b:"padding-bottom",l:"padding-left"},margins:{t:"margin-top",r:"margin-right",b:"margin-bottom",l:"margin-left"},defaultUnit:"px",isSynchronized:false,synchronize:function(){var g=this.dom,a={},d=g.className,f,c,e,b;if(d.length>0){f=g.className.split(this.classNameSplitRegex);for(c=0,e=f.length;c0?a:0},getWidth:function(a){var c=this.dom,b=a?(c.clientWidth-this.getPadding("lr")):c.offsetWidth;return b>0?b:0},getBorderWidth:function(a){return this.addStyles(a,this.borders)},getPadding:function(a){return this.addStyles(a,this.paddings)},applyStyles:function(d){if(d){var e=this.dom,c,b,a;if(typeof d=="function"){d=d.call()}c=typeof d;if(c=="string"){d=Ext.util.Format.trim(d).split(this.styleSplitRe);for(b=0,a=d.length;b "+a,c.dom);return b?d:Ext.get(d)},parent:function(a,b){return this.matchNode("parentNode","parentNode",a,b)},next:function(a,b){return this.matchNode("nextSibling","nextSibling",a,b)},prev:function(a,b){return this.matchNode("previousSibling","previousSibling",a,b)},first:function(a,b){return this.matchNode("nextSibling","firstChild",a,b)},last:function(a,b){return this.matchNode("previousSibling","lastChild",a,b)},matchNode:function(b,e,a,c){if(!this.dom){return null}var d=this.dom[e];while(d){if(d.nodeType==1&&(!a||Ext.DomQuery.is(d,a))){return !c?Ext.get(d):d}d=d[b]}return null},isAncestor:function(a){return this.self.isAncestor.call(this.self,this.dom,a)}});Ext.define("Ext.dom.CompositeElementLite",{alternateClassName:["Ext.CompositeElementLite","Ext.CompositeElement"],statics:{importElementMethods:function(){}},constructor:function(b,a){this.elements=[];this.add(b,a);this.el=new Ext.dom.Element.Fly()},isComposite:true,getElement:function(a){return this.el.attach(a).synchronize()},transformElement:function(a){return Ext.getDom(a)},getCount:function(){return this.elements.length},add:function(c,a){var e=this.elements,b,d;if(!c){return this}if(typeof c=="string"){c=Ext.dom.Element.selectorFunction(c,a)}else{if(c.isComposite){c=c.elements}else{if(!Ext.isIterable(c)){c=[c]}}}for(b=0,d=c.length;b-1){c=Ext.getDom(c);if(a){f=this.elements[b];f.parentNode.insertBefore(c,f);Ext.removeNode(f)}Ext.Array.splice(this.elements,b,1,c)}return this},clear:function(){this.elements=[]},addElements:function(c,a){if(!c){return this}if(typeof c=="string"){c=Ext.dom.Element.selectorFunction(c,a)}var b=this.elements;Ext.each(c,function(d){b.push(Ext.get(d))});return this},first:function(){return this.item(0)},last:function(){return this.item(this.getCount()-1)},contains:function(a){return this.indexOf(a)!=-1},removeElement:function(c,e){var b=this,d=this.elements,a;Ext.each(c,function(f){if((a=(d[f]||d[f=b.indexOf(f)]))){if(e){if(a.dom){a.remove()}else{Ext.removeNode(a)}}Ext.Array.erase(d,f,1)}});return this}},function(){var a=Ext.dom.Element,d=a.prototype,c=this.prototype,b;for(b in d){if(typeof d[b]=="function"){(function(e){if(e==="destroy"){c[e]=function(){return this.invoke(e,arguments)}}else{c[e]=c[e]||function(){return this.invoke(e,arguments)}}}).call(c,b)}}c.on=c.addListener;a.selectorFunction=Ext.DomQuery.select;Ext.dom.Element.select=function(e,h,f){var g;if(typeof e=="string"){g=Ext.dom.Element.selectorFunction(e,f)}else{if(e.length!==undefined){g=e}else{throw new Error("[Ext.select] Invalid selector specified: "+e)}}return(h===true)?new Ext.dom.CompositeElement(g):new Ext.dom.CompositeElementLite(g)};Ext.select=function(){return a.select.apply(a,arguments)}});Ext.ClassManager.addNameAlternateMappings({"Ext.AbstractComponent":[],"Ext.AbstractManager":[],"Ext.AbstractPlugin":[],"Ext.ActionSheet":[],"Ext.Ajax":[],"Ext.Anim":[],"Ext.AnimationQueue":[],"Ext.Audio":[],"Ext.BingMap":[],"Ext.Button":[],"Ext.Component":["Ext.lib.Component"],"Ext.ComponentManager":["Ext.ComponentMgr"],"Ext.ComponentQuery":[],"Ext.Container":["Ext.lib.Container"],"Ext.Decorator":[],"Ext.Evented":["Ext.EventedBase"],"Ext.Img":[],"Ext.ItemCollection":[],"Ext.Label":[],"Ext.LoadMask":[],"Ext.Map":[],"Ext.Mask":[],"Ext.Media":[],"Ext.Menu":[],"Ext.MessageBox":[],"Ext.Panel":["Ext.lib.Panel"],"Ext.ProgressIndicator":[],"Ext.Promise":[],"Ext.SegmentedButton":[],"Ext.Sheet":[],"Ext.Sortable":[],"Ext.Spacer":[],"Ext.TaskQueue":[],"Ext.Template":[],"Ext.Title":[],"Ext.TitleBar":[],"Ext.Toast":[],"Ext.Toolbar":[],"Ext.Video":[],"Ext.XTemplate":[],"Ext.XTemplateCompiler":[],"Ext.XTemplateParser":[],"Ext.app.Action":[],"Ext.app.Application":[],"Ext.app.Controller":[],"Ext.app.History":[],"Ext.app.Profile":[],"Ext.app.Route":[],"Ext.app.Router":[],"Ext.behavior.Behavior":[],"Ext.behavior.Draggable":[],"Ext.behavior.Scrollable":[],"Ext.behavior.Translatable":[],"Ext.carousel.Carousel":["Ext.Carousel"],"Ext.carousel.Indicator":["Ext.Carousel.Indicator"],"Ext.carousel.Infinite":[],"Ext.carousel.Item":[],"Ext.data.ArrayStore":[],"Ext.data.Batch":[],"Ext.data.Connection":[],"Ext.data.DirectStore":[],"Ext.data.Error":[],"Ext.data.Errors":[],"Ext.data.Field":[],"Ext.data.JsonP":["Ext.util.JSONP"],"Ext.data.JsonStore":[],"Ext.data.Model":["Ext.data.Record"],"Ext.data.ModelManager":["Ext.ModelMgr","Ext.ModelManager"],"Ext.data.NodeInterface":["Ext.data.Node"],"Ext.data.NodeStore":[],"Ext.data.Operation":[],"Ext.data.Request":[],"Ext.data.ResultSet":[],"Ext.data.SortTypes":[],"Ext.data.Store":[],"Ext.data.StoreManager":["Ext.StoreMgr","Ext.data.StoreMgr","Ext.StoreManager"],"Ext.data.TreeStore":[],"Ext.data.Types":[],"Ext.data.Validations":["Ext.data.validations"],"Ext.data.association.Association":["Ext.data.Association"],"Ext.data.association.BelongsTo":["Ext.data.BelongsToAssociation"],"Ext.data.association.HasMany":["Ext.data.HasManyAssociation"],"Ext.data.association.HasOne":["Ext.data.HasOneAssociation"],"Ext.data.identifier.Sequential":[],"Ext.data.identifier.Simple":[],"Ext.data.identifier.Uuid":[],"Ext.data.proxy.Ajax":["Ext.data.HttpProxy","Ext.data.AjaxProxy"],"Ext.data.proxy.Client":["Ext.proxy.ClientProxy"],"Ext.data.proxy.Direct":["Ext.data.DirectProxy"],"Ext.data.proxy.JsonP":["Ext.data.ScriptTagProxy"],"Ext.data.proxy.LocalStorage":["Ext.data.LocalStorageProxy"],"Ext.data.proxy.Memory":["Ext.data.MemoryProxy"],"Ext.data.proxy.Proxy":["Ext.data.DataProxy","Ext.data.Proxy"],"Ext.data.proxy.Rest":["Ext.data.RestProxy"],"Ext.data.proxy.Server":["Ext.data.ServerProxy"],"Ext.data.proxy.SessionStorage":["Ext.data.SessionStorageProxy"],"Ext.data.proxy.Sql":["Ext.data.proxy.SQL"],"Ext.data.proxy.WebStorage":["Ext.data.WebStorageProxy"],"Ext.data.reader.Array":["Ext.data.ArrayReader"],"Ext.data.reader.Json":["Ext.data.JsonReader"],"Ext.data.reader.Reader":["Ext.data.Reader","Ext.data.DataReader"],"Ext.data.reader.Xml":["Ext.data.XmlReader"],"Ext.data.writer.Json":["Ext.data.JsonWriter"],"Ext.data.writer.Writer":["Ext.data.DataWriter","Ext.data.Writer"],"Ext.data.writer.Xml":["Ext.data.XmlWriter"],"Ext.dataview.DataView":["Ext.DataView"],"Ext.dataview.IndexBar":["Ext.IndexBar"],"Ext.dataview.List":["Ext.List"],"Ext.dataview.ListItemHeader":[],"Ext.dataview.NestedList":["Ext.NestedList"],"Ext.dataview.component.Container":[],"Ext.dataview.component.DataItem":[],"Ext.dataview.component.ListItem":[],"Ext.dataview.component.SimpleListItem":[],"Ext.dataview.element.Container":[],"Ext.dataview.element.List":[],"Ext.device.Accelerometer":[],"Ext.device.Browser":[],"Ext.device.Camera":[],"Ext.device.Capture":[],"Ext.device.Communicator":[],"Ext.device.Compass":[],"Ext.device.Connection":[],"Ext.device.Contacts":[],"Ext.device.Device":[],"Ext.device.FileSystem":[],"Ext.device.Geolocation":[],"Ext.device.Globalization":[],"Ext.device.Media":[],"Ext.device.Notification":[],"Ext.device.Orientation":[],"Ext.device.Purchases":[],"Ext.device.Purchases.Product":[],"Ext.device.Push":[],"Ext.device.SQLite":[],"Ext.device.Splashscreen":[],"Ext.device.Storage":[],"Ext.device.Tunnel":[],"Ext.device.accelerometer.Abstract":[],"Ext.device.accelerometer.Cordova":["Ext.device.accelerometer.PhoneGap"],"Ext.device.accelerometer.Simulator":[],"Ext.device.browser.Abstract":[],"Ext.device.browser.Cordova":[],"Ext.device.browser.Simulator":[],"Ext.device.browser.Window":[],"Ext.device.camera.Abstract":[],"Ext.device.camera.Cordova":["Ext.device.camera.PhoneGap"],"Ext.device.camera.Sencha":[],"Ext.device.camera.Simulator":[],"Ext.device.capture.Abstract":["Ext.device.capture.Simulator"],"Ext.device.capture.Cordova":[],"Ext.device.communicator.Android":[],"Ext.device.communicator.Default":[],"Ext.device.compass.Abstract":[],"Ext.device.compass.Cordova":["Ext.device.compass.PhoneGap"],"Ext.device.compass.Simulator":[],"Ext.device.connection.Abstract":[],"Ext.device.connection.Cordova":["Ext.device.connection.PhoneGap"],"Ext.device.connection.Sencha":[],"Ext.device.connection.Simulator":[],"Ext.device.contacts.Abstract":[],"Ext.device.contacts.Cordova":["Ext.device.contacts.PhoneGap"],"Ext.device.contacts.Sencha":[],"Ext.device.device.Abstract":[],"Ext.device.device.Cordova":["Ext.device.device.PhoneGap"],"Ext.device.device.Sencha":[],"Ext.device.device.Simulator":[],"Ext.device.filesystem.Abstract":[],"Ext.device.filesystem.Chrome":[],"Ext.device.filesystem.Cordova":["Ext.device.filesystem.PhoneGap"],"Ext.device.filesystem.DirectoryEntry":[],"Ext.device.filesystem.Entry":[],"Ext.device.filesystem.FileEntry":[],"Ext.device.filesystem.FileSystem":[],"Ext.device.filesystem.HTML5":[],"Ext.device.filesystem.Sencha":[],"Ext.device.filesystem.Simulator":[],"Ext.device.geolocation.Abstract":[],"Ext.device.geolocation.Cordova":["Ext.device.geolocation.PhoneGap"],"Ext.device.geolocation.Sencha":[],"Ext.device.geolocation.Simulator":[],"Ext.device.globalization.Abstract":[],"Ext.device.globalization.Cordova":["Ext.device.globalization.PhoneGap"],"Ext.device.globalization.Simulator":[],"Ext.device.media.Abstract":[],"Ext.device.media.Cordova":["Ext.device.media.PhoneGap"],"Ext.device.notification.Abstract":[],"Ext.device.notification.Cordova":["Ext.device.notification.PhoneGap"],"Ext.device.notification.Sencha":[],"Ext.device.notification.Simulator":[],"Ext.device.orientation.Abstract":[],"Ext.device.orientation.HTML5":[],"Ext.device.orientation.Sencha":[],"Ext.device.purchases.Purchase":[],"Ext.device.purchases.Sencha":[],"Ext.device.push.Abstract":[],"Ext.device.push.Cordova":[],"Ext.device.push.Sencha":[],"Ext.device.splashscreen.Abstract":[],"Ext.device.splashscreen.Cordova":["Ext.device.splashscreen.PhoneGap"],"Ext.device.splashscreen.Simulator":[],"Ext.device.sqlite.Database":[],"Ext.device.sqlite.SQLResultSet":[],"Ext.device.sqlite.SQLResultSetRowList":[],"Ext.device.sqlite.SQLTransaction":[],"Ext.device.sqlite.Sencha":[],"Ext.device.storage.Abstract":[],"Ext.device.storage.Cordova":["Ext.device.storage.PhoneGap"],"Ext.device.storage.HTML5.Database":[],"Ext.device.storage.HTML5.HTML5":[],"Ext.device.storage.HTML5.SQLStatement":[],"Ext.device.storage.Simulator":[],"Ext.device.tunnel.Abstract":[],"Ext.device.tunnel.Connection":[],"Ext.device.tunnel.Sencha":[],"Ext.device.tunnel.Simulator":[],"Ext.direct.Event":[],"Ext.direct.ExceptionEvent":[],"Ext.direct.JsonProvider":[],"Ext.direct.Manager":["Ext.Direct"],"Ext.direct.PollingProvider":[],"Ext.direct.Provider":[],"Ext.direct.RemotingEvent":[],"Ext.direct.RemotingMethod":[],"Ext.direct.RemotingProvider":[],"Ext.direct.Transaction":["Ext.Direct.Transaction"],"Ext.dom.CompositeElement":["Ext.CompositeElement"],"Ext.event.Controller":[],"Ext.event.Dispatcher":[],"Ext.event.Dom":[],"Ext.event.Event":["Ext.EventObject"],"Ext.event.ListenerStack":[],"Ext.event.Touch":[],"Ext.event.publisher.ComponentDelegation":[],"Ext.event.publisher.ComponentPaint":[],"Ext.event.publisher.ComponentSize":[],"Ext.event.publisher.Dom":[],"Ext.event.publisher.ElementPaint":[],"Ext.event.publisher.ElementSize":[],"Ext.event.publisher.Publisher":[],"Ext.event.publisher.TouchGesture":[],"Ext.event.recognizer.DoubleTap":[],"Ext.event.recognizer.Drag":[],"Ext.event.recognizer.EdgeSwipe":[],"Ext.event.recognizer.HorizontalSwipe":[],"Ext.event.recognizer.LongPress":[],"Ext.event.recognizer.MultiTouch":[],"Ext.event.recognizer.Pinch":[],"Ext.event.recognizer.Recognizer":[],"Ext.event.recognizer.Rotate":[],"Ext.event.recognizer.SingleTouch":[],"Ext.event.recognizer.Swipe":[],"Ext.event.recognizer.Tap":[],"Ext.event.recognizer.Touch":[],"Ext.event.recognizer.VerticalSwipe":[],"Ext.field.Checkbox":["Ext.form.Checkbox"],"Ext.field.DatePicker":["Ext.form.DatePicker"],"Ext.field.DatePickerNative":["Ext.form.DatePickerNative"],"Ext.field.Email":["Ext.form.Email"],"Ext.field.Field":["Ext.form.Field"],"Ext.field.File":[],"Ext.field.FileInput":[],"Ext.field.Hidden":["Ext.form.Hidden"],"Ext.field.Input":[],"Ext.field.Number":["Ext.form.Number"],"Ext.field.Password":["Ext.form.Password"],"Ext.field.Radio":["Ext.form.Radio"],"Ext.field.Search":["Ext.form.Search"],"Ext.field.Select":["Ext.form.Select"],"Ext.field.Slider":["Ext.form.Slider"],"Ext.field.Spinner":["Ext.form.Spinner"],"Ext.field.Text":["Ext.form.Text"],"Ext.field.TextArea":["Ext.form.TextArea"],"Ext.field.TextAreaInput":[],"Ext.field.Toggle":["Ext.form.Toggle"],"Ext.field.Url":["Ext.form.Url"],"Ext.form.FieldSet":[],"Ext.form.Panel":["Ext.form.FormPanel"],"Ext.fx.Animation":[],"Ext.fx.Easing":[],"Ext.fx.Runner":[],"Ext.fx.State":[],"Ext.fx.animation.Abstract":[],"Ext.fx.animation.Cube":[],"Ext.fx.animation.Fade":["Ext.fx.animation.FadeIn"],"Ext.fx.animation.FadeOut":[],"Ext.fx.animation.Flip":[],"Ext.fx.animation.Pop":["Ext.fx.animation.PopIn"],"Ext.fx.animation.PopOut":[],"Ext.fx.animation.Slide":["Ext.fx.animation.SlideIn"],"Ext.fx.animation.SlideOut":[],"Ext.fx.animation.Wipe":["Ext.fx.animation.WipeIn"],"Ext.fx.animation.WipeOut":[],"Ext.fx.easing.Abstract":[],"Ext.fx.easing.Bounce":[],"Ext.fx.easing.BoundMomentum":[],"Ext.fx.easing.EaseIn":[],"Ext.fx.easing.EaseOut":[],"Ext.fx.easing.Linear":[],"Ext.fx.easing.Momentum":[],"Ext.fx.layout.Card":[],"Ext.fx.layout.card.Abstract":[],"Ext.fx.layout.card.Cover":[],"Ext.fx.layout.card.Cube":[],"Ext.fx.layout.card.Fade":[],"Ext.fx.layout.card.Flip":[],"Ext.fx.layout.card.Pop":[],"Ext.fx.layout.card.Reveal":[],"Ext.fx.layout.card.Scroll":[],"Ext.fx.layout.card.ScrollCover":[],"Ext.fx.layout.card.ScrollReveal":[],"Ext.fx.layout.card.Slide":[],"Ext.fx.layout.card.Style":[],"Ext.fx.runner.Css":[],"Ext.fx.runner.CssAnimation":[],"Ext.fx.runner.CssTransition":[],"Ext.layout.Abstract":[],"Ext.layout.Box":[],"Ext.layout.Card":[],"Ext.layout.Default":[],"Ext.layout.Fit":[],"Ext.layout.FlexBox":[],"Ext.layout.Float":[],"Ext.layout.HBox":[],"Ext.layout.VBox":[],"Ext.layout.wrapper.BoxDock":[],"Ext.layout.wrapper.Dock":[],"Ext.layout.wrapper.Inner":[],"Ext.log.Base":[],"Ext.log.Logger":[],"Ext.log.filter.Filter":[],"Ext.log.filter.Priority":[],"Ext.log.formatter.Default":[],"Ext.log.formatter.Formatter":[],"Ext.log.formatter.Identity":[],"Ext.log.writer.Console":[],"Ext.log.writer.DocumentTitle":[],"Ext.log.writer.Remote":[],"Ext.log.writer.Writer":[],"Ext.mixin.Bindable":[],"Ext.mixin.Filterable":[],"Ext.mixin.Mixin":[],"Ext.mixin.Observable":["Ext.util.Observable"],"Ext.mixin.Progressable":[],"Ext.mixin.Selectable":[],"Ext.mixin.Sortable":[],"Ext.mixin.Templatable":[],"Ext.mixin.Traversable":[],"Ext.navigation.Bar":[],"Ext.navigation.View":["Ext.NavigationView"],"Ext.picker.Date":["Ext.DatePicker"],"Ext.picker.Picker":["Ext.Picker"],"Ext.picker.Slot":["Ext.Picker.Slot"],"Ext.plugin.ListPaging":[],"Ext.plugin.PullRefresh":[],"Ext.plugin.SortableList":[],"Ext.scroll.Indicator":["Ext.util.Indicator"],"Ext.scroll.Scroller":[],"Ext.scroll.View":["Ext.util.ScrollView"],"Ext.scroll.indicator.Abstract":[],"Ext.scroll.indicator.CssTransform":[],"Ext.scroll.indicator.Rounded":[],"Ext.scroll.indicator.ScrollPosition":[],"Ext.slider.Slider":[],"Ext.slider.Thumb":[],"Ext.slider.Toggle":[],"Ext.tab.Bar":["Ext.TabBar"],"Ext.tab.Panel":["Ext.TabPanel"],"Ext.tab.Tab":["Ext.Tab"],"Ext.table.Cell":[],"Ext.table.Row":[],"Ext.table.Table":[],"Ext.util.AbstractMixedCollection":[],"Ext.util.Audio":[],"Ext.util.Collection":[],"Ext.util.DelayedTask":[],"Ext.util.Draggable":[],"Ext.util.Droppable":[],"Ext.util.Filter":[],"Ext.util.Format":[],"Ext.util.Geolocation":["Ext.util.GeoLocation"],"Ext.util.Grouper":[],"Ext.util.HashMap":[],"Ext.util.Inflector":[],"Ext.util.InputBlocker":[],"Ext.util.LineSegment":[],"Ext.util.MixedCollection":[],"Ext.util.Offset":[],"Ext.util.PaintMonitor":[],"Ext.util.Point":[],"Ext.util.PositionMap":[],"Ext.util.Region":[],"Ext.util.SizeMonitor":[],"Ext.util.Sortable":[],"Ext.util.Sorter":[],"Ext.util.TapRepeater":[],"Ext.util.Translatable":[],"Ext.util.TranslatableGroup":[],"Ext.util.TranslatableList":[],"Ext.util.Wrapper":[],"Ext.util.paintmonitor.Abstract":[],"Ext.util.paintmonitor.CssAnimation":[],"Ext.util.paintmonitor.OverflowChange":[],"Ext.util.sizemonitor.Abstract":[],"Ext.util.sizemonitor.Default":[],"Ext.util.sizemonitor.OverflowChange":[],"Ext.util.sizemonitor.Scroll":[],"Ext.util.translatable.Abstract":[],"Ext.util.translatable.CssPosition":[],"Ext.util.translatable.CssTransform":[],"Ext.util.translatable.Dom":[],"Ext.util.translatable.ScrollPosition":[],"Ext.ux.ActionOverFlowMenuButton":[],"Ext.ux.ApplicationMenu":[],"Ext.ux.ContextMenu":[],"Ext.ux.MenuButton":[],"Ext.ux.TabMenuButton":[],"Ext.ux.device.Analytics":[],"Ext.ux.device.Twitter":[],"Ext.ux.device.analytics.Abstract":[],"Ext.ux.device.analytics.Cordova":[],"Ext.ux.device.twitter.Abstract":[],"Ext.ux.device.twitter.Cordova":[],"Ext.ux.parse.Helper":["ParseHelper"],"Ext.ux.parse.Model":[],"Ext.ux.parse.Proxy":[],"Ext.ux.parse.Reader":[],"Ext.ux.parse.Store":[],"Ext.ux.parse.association.Pointer":[],"Ext.ux.parse.association.Relation":[],"Ext.viewport.AndroidStock":["Ext.viewport.Android"],"Ext.viewport.Default":[],"Ext.viewport.Ios":[],"Ext.viewport.Viewport":[],"Ext.viewport.WindowsPhone":["Ext.viewport.WP"]});Ext.ClassManager.addNameAliasMappings({"Ext.AbstractComponent":[],"Ext.AbstractManager":[],"Ext.AbstractPlugin":[],"Ext.ActionSheet":["widget.actionsheet"],"Ext.Ajax":[],"Ext.Anim":[],"Ext.AnimationQueue":[],"Ext.Audio":["widget.audio"],"Ext.BingMap":["widget.bingmap"],"Ext.Button":["widget.button"],"Ext.Component":["widget.component"],"Ext.ComponentManager":[],"Ext.ComponentQuery":[],"Ext.Container":["widget.container"],"Ext.Decorator":[],"Ext.Evented":[],"Ext.Img":["widget.image","widget.img"],"Ext.ItemCollection":[],"Ext.Label":["widget.label"],"Ext.LoadMask":["widget.loadmask"],"Ext.Map":["widget.map"],"Ext.Mask":["widget.mask"],"Ext.Media":["widget.media"],"Ext.Menu":["widget.menu"],"Ext.MessageBox":[],"Ext.Panel":["widget.panel"],"Ext.ProgressIndicator":["widget.progressindicator"],"Ext.Promise":[],"Ext.SegmentedButton":["widget.segmentedbutton"],"Ext.Sheet":["widget.sheet"],"Ext.Sortable":[],"Ext.Spacer":["widget.spacer"],"Ext.TaskQueue":[],"Ext.Template":[],"Ext.Title":["widget.title"],"Ext.TitleBar":["widget.titlebar"],"Ext.Toast":[],"Ext.Toolbar":["widget.toolbar"],"Ext.Video":["widget.video"],"Ext.XTemplate":[],"Ext.XTemplateCompiler":[],"Ext.XTemplateParser":[],"Ext.app.Action":[],"Ext.app.Application":[],"Ext.app.Controller":[],"Ext.app.History":[],"Ext.app.Profile":[],"Ext.app.Route":[],"Ext.app.Router":[],"Ext.behavior.Behavior":[],"Ext.behavior.Draggable":[],"Ext.behavior.Scrollable":[],"Ext.behavior.Translatable":[],"Ext.carousel.Carousel":["widget.carousel"],"Ext.carousel.Indicator":["widget.carouselindicator"],"Ext.carousel.Infinite":[],"Ext.carousel.Item":[],"Ext.data.ArrayStore":["store.array"],"Ext.data.Batch":[],"Ext.data.Connection":[],"Ext.data.DirectStore":["store.direct"],"Ext.data.Error":[],"Ext.data.Errors":[],"Ext.data.Field":["data.field"],"Ext.data.JsonP":[],"Ext.data.JsonStore":["store.json"],"Ext.data.Model":[],"Ext.data.ModelManager":[],"Ext.data.NodeInterface":[],"Ext.data.NodeStore":["store.node"],"Ext.data.Operation":[],"Ext.data.Request":[],"Ext.data.ResultSet":[],"Ext.data.SortTypes":[],"Ext.data.Store":["store.store"],"Ext.data.StoreManager":[],"Ext.data.TreeStore":["store.tree"],"Ext.data.Types":[],"Ext.data.Validations":[],"Ext.data.association.Association":[],"Ext.data.association.BelongsTo":["association.belongsto"],"Ext.data.association.HasMany":["association.hasmany"],"Ext.data.association.HasOne":["association.hasone"],"Ext.data.identifier.Sequential":["data.identifier.sequential"],"Ext.data.identifier.Simple":["data.identifier.simple"],"Ext.data.identifier.Uuid":["data.identifier.uuid"],"Ext.data.proxy.Ajax":["proxy.ajax"],"Ext.data.proxy.Client":[],"Ext.data.proxy.Direct":["proxy.direct"],"Ext.data.proxy.JsonP":["proxy.jsonp","proxy.scripttag"],"Ext.data.proxy.LocalStorage":["proxy.localstorage"],"Ext.data.proxy.Memory":["proxy.memory"],"Ext.data.proxy.Proxy":["proxy.proxy"],"Ext.data.proxy.Rest":["proxy.rest"],"Ext.data.proxy.Server":["proxy.server"],"Ext.data.proxy.SessionStorage":["proxy.sessionstorage"],"Ext.data.proxy.Sql":["proxy.sql"],"Ext.data.proxy.WebStorage":[],"Ext.data.reader.Array":["reader.array"],"Ext.data.reader.Json":["reader.json"],"Ext.data.reader.Reader":[],"Ext.data.reader.Xml":["reader.xml"],"Ext.data.writer.Json":["writer.json"],"Ext.data.writer.Writer":["writer.base"],"Ext.data.writer.Xml":["writer.xml"],"Ext.dataview.DataView":["widget.dataview"],"Ext.dataview.IndexBar":[],"Ext.dataview.List":["widget.list"],"Ext.dataview.ListItemHeader":["widget.listitemheader"],"Ext.dataview.NestedList":["widget.nestedlist"],"Ext.dataview.component.Container":[],"Ext.dataview.component.DataItem":["widget.dataitem"],"Ext.dataview.component.ListItem":["widget.listitem"],"Ext.dataview.component.SimpleListItem":["widget.simplelistitem"],"Ext.dataview.element.Container":[],"Ext.dataview.element.List":[],"Ext.device.Accelerometer":[],"Ext.device.Browser":[],"Ext.device.Camera":[],"Ext.device.Capture":[],"Ext.device.Communicator":[],"Ext.device.Compass":[],"Ext.device.Connection":[],"Ext.device.Contacts":[],"Ext.device.Device":[],"Ext.device.FileSystem":[],"Ext.device.Geolocation":[],"Ext.device.Globalization":[],"Ext.device.Media":[],"Ext.device.Notification":[],"Ext.device.Orientation":[],"Ext.device.Purchases":[],"Ext.device.Purchases.Product":[],"Ext.device.Push":[],"Ext.device.SQLite":[],"Ext.device.Splashscreen":[],"Ext.device.Storage":[],"Ext.device.Tunnel":[],"Ext.device.accelerometer.Abstract":[],"Ext.device.accelerometer.Cordova":[],"Ext.device.accelerometer.Simulator":[],"Ext.device.browser.Abstract":[],"Ext.device.browser.Cordova":[],"Ext.device.browser.Simulator":[],"Ext.device.browser.Window":[],"Ext.device.camera.Abstract":[],"Ext.device.camera.Cordova":[],"Ext.device.camera.Sencha":[],"Ext.device.camera.Simulator":[],"Ext.device.capture.Abstract":[],"Ext.device.capture.Cordova":[],"Ext.device.communicator.Android":[],"Ext.device.communicator.Default":[],"Ext.device.compass.Abstract":[],"Ext.device.compass.Cordova":[],"Ext.device.compass.Simulator":[],"Ext.device.connection.Abstract":[],"Ext.device.connection.Cordova":[],"Ext.device.connection.Sencha":[],"Ext.device.connection.Simulator":[],"Ext.device.contacts.Abstract":[],"Ext.device.contacts.Cordova":[],"Ext.device.contacts.Sencha":[],"Ext.device.device.Abstract":[],"Ext.device.device.Cordova":[],"Ext.device.device.Sencha":[],"Ext.device.device.Simulator":[],"Ext.device.filesystem.Abstract":[],"Ext.device.filesystem.Chrome":[],"Ext.device.filesystem.Cordova":[],"Ext.device.filesystem.DirectoryEntry":[],"Ext.device.filesystem.Entry":[],"Ext.device.filesystem.FileEntry":[],"Ext.device.filesystem.FileSystem":[],"Ext.device.filesystem.HTML5":[],"Ext.device.filesystem.Sencha":[],"Ext.device.filesystem.Simulator":[],"Ext.device.geolocation.Abstract":[],"Ext.device.geolocation.Cordova":[],"Ext.device.geolocation.Sencha":[],"Ext.device.geolocation.Simulator":[],"Ext.device.globalization.Abstract":[],"Ext.device.globalization.Cordova":[],"Ext.device.globalization.Simulator":[],"Ext.device.media.Abstract":[],"Ext.device.media.Cordova":[],"Ext.device.notification.Abstract":[],"Ext.device.notification.Cordova":[],"Ext.device.notification.Sencha":[],"Ext.device.notification.Simulator":[],"Ext.device.orientation.Abstract":[],"Ext.device.orientation.HTML5":[],"Ext.device.orientation.Sencha":[],"Ext.device.purchases.Purchase":[],"Ext.device.purchases.Sencha":[],"Ext.device.push.Abstract":[],"Ext.device.push.Cordova":[],"Ext.device.push.Sencha":[],"Ext.device.splashscreen.Abstract":[],"Ext.device.splashscreen.Cordova":[],"Ext.device.splashscreen.Simulator":[],"Ext.device.sqlite.Database":[],"Ext.device.sqlite.SQLResultSet":[],"Ext.device.sqlite.SQLResultSetRowList":[],"Ext.device.sqlite.SQLTransaction":[],"Ext.device.sqlite.Sencha":[],"Ext.device.storage.Abstract":[],"Ext.device.storage.Cordova":[],"Ext.device.storage.HTML5.Database":[],"Ext.device.storage.HTML5.HTML5":[],"Ext.device.storage.HTML5.SQLStatement":[],"Ext.device.storage.Simulator":[],"Ext.device.tunnel.Abstract":[],"Ext.device.tunnel.Connection":[],"Ext.device.tunnel.Sencha":[],"Ext.device.tunnel.Simulator":[],"Ext.direct.Event":["direct.event"],"Ext.direct.ExceptionEvent":["direct.exception"],"Ext.direct.JsonProvider":["direct.jsonprovider"],"Ext.direct.Manager":[],"Ext.direct.PollingProvider":["direct.pollingprovider"],"Ext.direct.Provider":["direct.provider"],"Ext.direct.RemotingEvent":["direct.rpc"],"Ext.direct.RemotingMethod":[],"Ext.direct.RemotingProvider":["direct.remotingprovider"],"Ext.direct.Transaction":["direct.transaction"],"Ext.dom.CompositeElement":[],"Ext.event.Controller":[],"Ext.event.Dispatcher":[],"Ext.event.Dom":[],"Ext.event.Event":[],"Ext.event.ListenerStack":[],"Ext.event.Touch":[],"Ext.event.publisher.ComponentDelegation":[],"Ext.event.publisher.ComponentPaint":[],"Ext.event.publisher.ComponentSize":[],"Ext.event.publisher.Dom":[],"Ext.event.publisher.ElementPaint":[],"Ext.event.publisher.ElementSize":[],"Ext.event.publisher.Publisher":[],"Ext.event.publisher.TouchGesture":[],"Ext.event.recognizer.DoubleTap":[],"Ext.event.recognizer.Drag":[],"Ext.event.recognizer.EdgeSwipe":[],"Ext.event.recognizer.HorizontalSwipe":[],"Ext.event.recognizer.LongPress":[],"Ext.event.recognizer.MultiTouch":[],"Ext.event.recognizer.Pinch":[],"Ext.event.recognizer.Recognizer":[],"Ext.event.recognizer.Rotate":[],"Ext.event.recognizer.SingleTouch":[],"Ext.event.recognizer.Swipe":[],"Ext.event.recognizer.Tap":[],"Ext.event.recognizer.Touch":[],"Ext.event.recognizer.VerticalSwipe":[],"Ext.field.Checkbox":["widget.checkboxfield"],"Ext.field.DatePicker":["widget.datepickerfield"],"Ext.field.DatePickerNative":["widget.datepickernativefield"],"Ext.field.Email":["widget.emailfield"],"Ext.field.Field":["widget.field"],"Ext.field.File":["widget.filefield"],"Ext.field.FileInput":["widget.fileinput"],"Ext.field.Hidden":["widget.hiddenfield"],"Ext.field.Input":["widget.input"],"Ext.field.Number":["widget.numberfield"],"Ext.field.Password":["widget.passwordfield"],"Ext.field.Radio":["widget.radiofield"],"Ext.field.Search":["widget.searchfield"],"Ext.field.Select":["widget.selectfield"],"Ext.field.Slider":["widget.sliderfield"],"Ext.field.Spinner":["widget.spinnerfield"],"Ext.field.Text":["widget.textfield"],"Ext.field.TextArea":["widget.textareafield"],"Ext.field.TextAreaInput":["widget.textareainput"],"Ext.field.Toggle":["widget.togglefield"],"Ext.field.Url":["widget.urlfield"],"Ext.form.FieldSet":["widget.fieldset"],"Ext.form.Panel":["widget.formpanel"],"Ext.fx.Animation":[],"Ext.fx.Easing":[],"Ext.fx.Runner":[],"Ext.fx.State":[],"Ext.fx.animation.Abstract":[],"Ext.fx.animation.Cube":["animation.cube"],"Ext.fx.animation.Fade":["animation.fade","animation.fadeIn"],"Ext.fx.animation.FadeOut":["animation.fadeOut"],"Ext.fx.animation.Flip":["animation.flip"],"Ext.fx.animation.Pop":["animation.pop","animation.popIn"],"Ext.fx.animation.PopOut":["animation.popOut"],"Ext.fx.animation.Slide":["animation.slide","animation.slideIn"],"Ext.fx.animation.SlideOut":["animation.slideOut"],"Ext.fx.animation.Wipe":[],"Ext.fx.animation.WipeOut":[],"Ext.fx.easing.Abstract":[],"Ext.fx.easing.Bounce":[],"Ext.fx.easing.BoundMomentum":[],"Ext.fx.easing.EaseIn":["easing.ease-in"],"Ext.fx.easing.EaseOut":["easing.ease-out"],"Ext.fx.easing.Linear":["easing.linear"],"Ext.fx.easing.Momentum":[],"Ext.fx.layout.Card":[],"Ext.fx.layout.card.Abstract":[],"Ext.fx.layout.card.Cover":["fx.layout.card.cover"],"Ext.fx.layout.card.Cube":["fx.layout.card.cube"],"Ext.fx.layout.card.Fade":["fx.layout.card.fade"],"Ext.fx.layout.card.Flip":["fx.layout.card.flip"],"Ext.fx.layout.card.Pop":["fx.layout.card.pop"],"Ext.fx.layout.card.Reveal":["fx.layout.card.reveal"],"Ext.fx.layout.card.Scroll":["fx.layout.card.scroll"],"Ext.fx.layout.card.ScrollCover":["fx.layout.card.scrollcover"],"Ext.fx.layout.card.ScrollReveal":["fx.layout.card.scrollreveal"],"Ext.fx.layout.card.Slide":["fx.layout.card.slide"],"Ext.fx.layout.card.Style":[],"Ext.fx.runner.Css":[],"Ext.fx.runner.CssAnimation":[],"Ext.fx.runner.CssTransition":[],"Ext.layout.Abstract":[],"Ext.layout.Box":["layout.tablebox"],"Ext.layout.Card":["layout.card"],"Ext.layout.Default":["layout.auto","layout.default"],"Ext.layout.Fit":["layout.fit"],"Ext.layout.FlexBox":["layout.box"],"Ext.layout.Float":["layout.float"],"Ext.layout.HBox":["layout.hbox"],"Ext.layout.VBox":["layout.vbox"],"Ext.layout.wrapper.BoxDock":[],"Ext.layout.wrapper.Dock":[],"Ext.layout.wrapper.Inner":[],"Ext.log.Base":[],"Ext.log.Logger":[],"Ext.log.filter.Filter":[],"Ext.log.filter.Priority":[],"Ext.log.formatter.Default":[],"Ext.log.formatter.Formatter":[],"Ext.log.formatter.Identity":[],"Ext.log.writer.Console":[],"Ext.log.writer.DocumentTitle":[],"Ext.log.writer.Remote":[],"Ext.log.writer.Writer":[],"Ext.mixin.Bindable":[],"Ext.mixin.Filterable":[],"Ext.mixin.Mixin":[],"Ext.mixin.Observable":[],"Ext.mixin.Progressable":[],"Ext.mixin.Selectable":[],"Ext.mixin.Sortable":[],"Ext.mixin.Templatable":[],"Ext.mixin.Traversable":[],"Ext.navigation.Bar":[],"Ext.navigation.View":["widget.navigationview"],"Ext.picker.Date":["widget.datepicker"],"Ext.picker.Picker":["widget.picker"],"Ext.picker.Slot":["widget.pickerslot"],"Ext.plugin.ListPaging":["plugin.listpaging"],"Ext.plugin.PullRefresh":["plugin.pullrefresh"],"Ext.plugin.SortableList":["plugin.sortablelist"],"Ext.scroll.Indicator":[],"Ext.scroll.Scroller":[],"Ext.scroll.View":[],"Ext.scroll.indicator.Abstract":[],"Ext.scroll.indicator.CssTransform":[],"Ext.scroll.indicator.Rounded":[],"Ext.scroll.indicator.ScrollPosition":[],"Ext.slider.Slider":["widget.slider"],"Ext.slider.Thumb":["widget.thumb"],"Ext.slider.Toggle":[],"Ext.tab.Bar":["widget.tabbar"],"Ext.tab.Panel":["widget.tabpanel"],"Ext.tab.Tab":["widget.tab"],"Ext.table.Cell":["widget.tablecell"],"Ext.table.Row":["widget.tablerow"],"Ext.table.Table":["widget.table"],"Ext.util.AbstractMixedCollection":[],"Ext.util.Audio":[],"Ext.util.Collection":[],"Ext.util.DelayedTask":[],"Ext.util.Draggable":[],"Ext.util.Droppable":[],"Ext.util.Filter":[],"Ext.util.Format":[],"Ext.util.Geolocation":[],"Ext.util.Grouper":[],"Ext.util.HashMap":[],"Ext.util.Inflector":[],"Ext.util.InputBlocker":[],"Ext.util.LineSegment":[],"Ext.util.MixedCollection":[],"Ext.util.Offset":[],"Ext.util.PaintMonitor":[],"Ext.util.Point":[],"Ext.util.PositionMap":[],"Ext.util.Region":[],"Ext.util.SizeMonitor":[],"Ext.util.Sortable":[],"Ext.util.Sorter":[],"Ext.util.TapRepeater":[],"Ext.util.Translatable":[],"Ext.util.TranslatableGroup":[],"Ext.util.TranslatableList":[],"Ext.util.Wrapper":[],"Ext.util.paintmonitor.Abstract":[],"Ext.util.paintmonitor.CssAnimation":[],"Ext.util.paintmonitor.OverflowChange":[],"Ext.util.sizemonitor.Abstract":[],"Ext.util.sizemonitor.Default":[],"Ext.util.sizemonitor.OverflowChange":[],"Ext.util.sizemonitor.Scroll":[],"Ext.util.translatable.Abstract":[],"Ext.util.translatable.CssPosition":[],"Ext.util.translatable.CssTransform":[],"Ext.util.translatable.Dom":[],"Ext.util.translatable.ScrollPosition":[],"Ext.ux.ActionOverFlowMenuButton":[],"Ext.ux.ApplicationMenu":[],"Ext.ux.ContextMenu":[],"Ext.ux.MenuButton":[],"Ext.ux.TabMenuButton":[],"Ext.ux.device.Analytics":[],"Ext.ux.device.Twitter":[],"Ext.ux.device.analytics.Abstract":[],"Ext.ux.device.analytics.Cordova":[],"Ext.ux.device.twitter.Abstract":[],"Ext.ux.device.twitter.Cordova":[],"Ext.ux.parse.Helper":[],"Ext.ux.parse.Model":[],"Ext.ux.parse.Proxy":["proxy.parse"],"Ext.ux.parse.Reader":["reader.parse"],"Ext.ux.parse.Store":[],"Ext.ux.parse.association.Pointer":["association.pointer"],"Ext.ux.parse.association.Relation":["association.relation"],"Ext.viewport.AndroidStock":[],"Ext.viewport.Default":["widget.viewport"],"Ext.viewport.Ios":[],"Ext.viewport.Viewport":[],"Ext.viewport.WindowsPhone":[]}); \ No newline at end of file +(function(){var global=this,objectPrototype=Object.prototype,toString=objectPrototype.toString,enumerables=true,enumerablesTest={toString:1},emptyFn=function(){},i;if(typeof Ext==="undefined"){global.Ext={}}Ext.global=global;for(i in enumerablesTest){enumerables=null}if(enumerables){enumerables=["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","constructor"]}Ext.enumerables=enumerables;Ext.apply=function(object,config,defaults){if(defaults){Ext.apply(object,defaults)}if(object&&config&&typeof config==="object"){var i,j,k;for(i in config){object[i]=config[i]}if(enumerables){for(j=enumerables.length;j--;){k=enumerables[j];if(config.hasOwnProperty(k)){object[k]=config[k]}}}}return object};Ext.buildSettings=Ext.apply({baseCSSPrefix:"x-",scopeResetCSS:false},Ext.buildSettings||{});Ext.apply(Ext,{emptyFn:emptyFn,baseCSSPrefix:Ext.buildSettings.baseCSSPrefix,applyIf:function(object,config){var property;if(object){for(property in config){if(object[property]===undefined){object[property]=config[property]}}}return object},iterate:function(object,fn,scope){if(Ext.isEmpty(object)){return}if(scope===undefined){scope=object}if(Ext.isIterable(object)){Ext.Array.each.call(Ext.Array,object,fn,scope)}else{Ext.Object.each.call(Ext.Object,object,fn,scope)}}});Ext.apply(Ext,{extend:function(){var objectConstructor=objectPrototype.constructor,inlineOverrides=function(o){for(var m in o){if(!o.hasOwnProperty(m)){continue}this[m]=o[m]}};return function(subclass,superclass,overrides){if(Ext.isObject(superclass)){overrides=superclass;superclass=subclass;subclass=overrides.constructor!==objectConstructor?overrides.constructor:function(){superclass.apply(this,arguments)}}var F=function(){},subclassProto,superclassProto=superclass.prototype;F.prototype=superclassProto;subclassProto=subclass.prototype=new F();subclassProto.constructor=subclass;subclass.superclass=superclassProto;if(superclassProto.constructor===objectConstructor){superclassProto.constructor=superclass}subclass.override=function(overrides){Ext.override(subclass,overrides)};subclassProto.override=inlineOverrides;subclassProto.proto=subclassProto;subclass.override(overrides);subclass.extend=function(o){return Ext.extend(subclass,o)};return subclass}}(),override:function(cls,overrides){if(cls.$isClass){return cls.override(overrides)}else{Ext.apply(cls.prototype,overrides)}}});Ext.apply(Ext,{valueFrom:function(value,defaultValue,allowBlank){return Ext.isEmpty(value,allowBlank)?defaultValue:value},typeOf:function(value){if(value===null){return"null"}var type=typeof value;if(type==="undefined"||type==="string"||type==="number"||type==="boolean"){return type}var typeToString=toString.call(value);switch(typeToString){case"[object Array]":return"array";case"[object Date]":return"date";case"[object Boolean]":return"boolean";case"[object Number]":return"number";case"[object RegExp]":return"regexp"}if(type==="function"){return"function"}if(type==="object"){if(value.nodeType!==undefined){if(value.nodeType===3){return(/\S/).test(value.nodeValue)?"textnode":"whitespace"}else{return"element"}}return"object"}},isEmpty:function(value,allowEmptyString){return(value===null)||(value===undefined)||(!allowEmptyString?value==="":false)||(Ext.isArray(value)&&value.length===0)},isArray:("isArray" in Array)?Array.isArray:function(value){return toString.call(value)==="[object Array]"},isDate:function(value){return toString.call(value)==="[object Date]"},isMSDate:function(value){if(!Ext.isString(value)){return false}else{return value.match("\\\\?/Date\\(([-+])?(\\d+)(?:[+-]\\d{4})?\\)\\\\?/")!==null}},isObject:(toString.call(null)==="[object Object]")?function(value){return value!==null&&value!==undefined&&toString.call(value)==="[object Object]"&&value.ownerDocument===undefined}:function(value){return toString.call(value)==="[object Object]"},isSimpleObject:function(value){return value instanceof Object&&value.constructor===Object},isPrimitive:function(value){var type=typeof value;return type==="string"||type==="number"||type==="boolean"},isFunction:(typeof document!=="undefined"&&typeof document.getElementsByTagName("body")==="function")?function(value){return toString.call(value)==="[object Function]"}:function(value){return typeof value==="function"},isNumber:function(value){return typeof value==="number"&&isFinite(value)},isNumeric:function(value){return !isNaN(parseFloat(value))&&isFinite(value)},isString:function(value){return typeof value==="string"},isBoolean:function(value){return typeof value==="boolean"},isElement:function(value){return value?value.nodeType===1:false},isTextNode:function(value){return value?value.nodeName==="#text":false},isDefined:function(value){return typeof value!=="undefined"},isIterable:function(value){return(value&&typeof value!=="string")?value.length!==undefined:false}});Ext.apply(Ext,{clone:function(item){if(item===null||item===undefined){return item}if(item.nodeType&&item.cloneNode){return item.cloneNode(true)}var type=toString.call(item);if(type==="[object Date]"){return new Date(item.getTime())}var i,j,k,clone,key;if(type==="[object Array]"){i=item.length;clone=[];while(i--){clone[i]=Ext.clone(item[i])}}else{if(type==="[object Object]"&&item.constructor===Object){clone={};for(key in item){clone[key]=Ext.clone(item[key])}if(enumerables){for(j=enumerables.length;j--;){k=enumerables[j];clone[k]=item[k]}}}}return clone||item},getUniqueGlobalNamespace:function(){var uniqueGlobalNamespace=this.uniqueGlobalNamespace;if(uniqueGlobalNamespace===undefined){var i=0;do{uniqueGlobalNamespace="ExtBox"+(++i)}while(Ext.global[uniqueGlobalNamespace]!==undefined);Ext.global[uniqueGlobalNamespace]=Ext;this.uniqueGlobalNamespace=uniqueGlobalNamespace}return uniqueGlobalNamespace},functionFactory:function(){var args=Array.prototype.slice.call(arguments),ln=args.length;if(ln>0){args[ln-1]="var Ext=window."+this.getUniqueGlobalNamespace()+";"+args[ln-1]}return Function.prototype.constructor.apply(Function.prototype,args)},globalEval:("execScript" in global)?function(code){global.execScript(code)}:function(code){(function(){eval(code)})()}});Ext.type=Ext.typeOf})();(function(){var a="2.4.2.571",b;Ext.Version=b=Ext.extend(Object,{constructor:function(d){var c=this.toNumber,f,e;if(d instanceof b){return d}this.version=this.shortVersion=String(d).toLowerCase().replace(/_/g,".").replace(/[\-+]/g,"");e=this.version.search(/([^\d\.])/);if(e!==-1){this.release=this.version.substr(e,d.length);this.shortVersion=this.version.substr(0,e)}this.shortVersion=this.shortVersion.replace(/[^\d]/g,"");f=this.version.split(".");this.major=c(f.shift());this.minor=c(f.shift());this.patch=c(f.shift());this.build=c(f.shift());return this},toNumber:function(c){c=parseInt(c||0,10);if(isNaN(c)){c=0}return c},toString:function(){return this.version},valueOf:function(){return this.version},getMajor:function(){return this.major||0},getMinor:function(){return this.minor||0},getPatch:function(){return this.patch||0},getBuild:function(){return this.build||0},getRelease:function(){return this.release||""},isGreaterThan:function(c){return b.compare(this.version,c)===1},isGreaterThanOrEqual:function(c){return b.compare(this.version,c)>=0},isLessThan:function(c){return b.compare(this.version,c)===-1},isLessThanOrEqual:function(c){return b.compare(this.version,c)<=0},equals:function(c){return b.compare(this.version,c)===0},match:function(c){c=String(c);return this.version.substr(0,c.length)===c},toArray:function(){return[this.getMajor(),this.getMinor(),this.getPatch(),this.getBuild(),this.getRelease()]},getShortVersion:function(){return this.shortVersion},gt:function(){return this.isGreaterThan.apply(this,arguments)},lt:function(){return this.isLessThan.apply(this,arguments)},gtEq:function(){return this.isGreaterThanOrEqual.apply(this,arguments)},ltEq:function(){return this.isLessThanOrEqual.apply(this,arguments)}});Ext.apply(b,{releaseValueMap:{dev:-6,alpha:-5,a:-5,beta:-4,b:-4,rc:-3,"#":-2,p:-1,pl:-1},getComponentValue:function(c){return !c?0:(isNaN(c)?this.releaseValueMap[c]||c:parseInt(c,10))},compare:function(g,f){var d,e,c;g=new b(g).toArray();f=new b(f).toArray();for(c=0;ce){return 1}}}return 0}});Ext.apply(Ext,{versions:{},lastRegisteredVersion:null,setVersion:function(d,c){Ext.versions[d]=new b(c);Ext.lastRegisteredVersion=Ext.versions[d];return this},getVersion:function(c){if(c===undefined){return Ext.lastRegisteredVersion}return Ext.versions[c]},deprecate:function(c,e,f,d){if(b.compare(Ext.getVersion(c),e)<1){f.call(d)}}});Ext.setVersion("core",a)})();Ext.String={trimRegex:/^[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+|[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+$/g,escapeRe:/('|\\)/g,formatRe:/\{(\d+)\}/g,escapeRegexRe:/([-.*+?^${}()|[\]\/\\])/g,htmlEncode:(function(){var d={"&":"&",">":">","<":"<",'"':"""},b=[],c,a;for(c in d){b.push(c)}a=new RegExp("("+b.join("|")+")","g");return function(e){return(!e)?e:String(e).replace(a,function(g,f){return d[f]})}})(),htmlDecode:(function(){var d={"&":"&",">":">","<":"<",""":'"'},b=[],c,a;for(c in d){b.push(c)}a=new RegExp("("+b.join("|")+"|&#[0-9]{1,5};)","g");return function(e){return(!e)?e:String(e).replace(a,function(g,f){if(f in d){return d[f]}else{return String.fromCharCode(parseInt(f.substr(2),10))}})}})(),urlAppend:function(b,a){if(!Ext.isEmpty(a)){return b+(b.indexOf("?")===-1?"?":"&")+a}return b},trim:function(a){return a.replace(Ext.String.trimRegex,"")},capitalize:function(a){return a.charAt(0).toUpperCase()+a.substr(1)},ellipsis:function(c,a,d){if(c&&c.length>a){if(d){var e=c.substr(0,a-2),b=Math.max(e.lastIndexOf(" "),e.lastIndexOf("."),e.lastIndexOf("!"),e.lastIndexOf("?"));if(b!==-1&&b>=(a-15)){return e.substr(0,b)+"..."}}return c.substr(0,a-3)+"..."}return c},escapeRegex:function(a){return a.replace(Ext.String.escapeRegexRe,"\\$1")},escape:function(a){return a.replace(Ext.String.escapeRe,"\\$1")},toggle:function(b,c,a){return b===c?a:c},leftPad:function(b,c,d){var a=String(b);d=d||" ";while(a.lengthH){for(C=e;C--;){F[z+C]=F[H+C]}}}if(J&&G===B){F.length=B;F.push.apply(F,I)}else{F.length=B+J;for(C=0;C-1;y--){if(A.call(z||C[y],C[y],y,C)===false){return y}}}return true},forEach:i?function(z,y,e){return z.forEach(y,e)}:function(B,z,y){var e=0,A=B.length;for(;eD.length){return 1}else{if(E.lengthe){e=z}}}return e},mean:function(e){return e.length>0?a.sum(e)/e.length:undefined},sum:function(B){var y=0,e,A,z;for(e=0,A=B.length;e=c){f+=c}else{if(b*2<-c){f-=c}}}return Ext.Number.constrain(f,d,g)},toFixed:function(d,b){if(a){b=b||0;var c=Math.pow(10,b);return(Math.round(d*c)/c).toFixed(b)}return d.toFixed(b)},from:function(c,b){if(isFinite(c)){c=parseFloat(c)}return !isNaN(c)?c:b}}})();Ext.num=function(){return Ext.Number.from.apply(this,arguments)};(function(){var a=function(){};var b=Ext.Object={chain:("create" in Object)?function(c){return Object.create(c)}:function(d){a.prototype=d;var c=new a();a.prototype=null;return c},toQueryObjects:function(e,j,d){var c=b.toQueryObjects,h=[],f,g;if(Ext.isArray(j)){for(f=0,g=j.length;f0){h=n.split("=");v=decodeURIComponent(h[0]);m=(h[1]!==undefined)?decodeURIComponent(h[1]):"";if(!q){if(t.hasOwnProperty(v)){if(!Ext.isArray(t[v])){t[v]=[t[v]]}t[v].push(m)}else{t[v]=m}}else{g=v.match(/(\[):?([^\]]*)\]/g);s=v.match(/^([^\[]+)/);v=s[0];k=[];if(g===null){t[v]=m;continue}for(o=0,c=g.length;o0){return setTimeout(e,c)}e();return 0},createSequence:function(b,c,a){if(!c){return b}else{return function(){var d=b.apply(this,arguments);c.apply(a||this,arguments);return d}}},createBuffered:function(e,b,d,c){var a;return function(){var g=c||Array.prototype.slice.call(arguments,0),f=d||this;if(a){clearTimeout(a)}a=setTimeout(function(){e.apply(f,g)},b)}},createThrottled:function(e,b,d){var f,a,c,h,g=function(){e.apply(d||this,c);f=new Date().getTime()};return function(){a=new Date().getTime()-f;c=arguments;clearTimeout(h);if(!f||(a>=b)){g()}else{h=setTimeout(g,b-a)}}},interceptBefore:function(b,a,d,c){var e=b[a]||Ext.emptyFn;return(b[a]=function(){var f=d.apply(c||this,arguments);e.apply(this,arguments);return f})},interceptAfter:function(b,a,d,c){var e=b[a]||Ext.emptyFn;return(b[a]=function(){e.apply(this,arguments);return d.apply(c||this,arguments)})}};Ext.defer=Ext.Function.alias(Ext.Function,"defer");Ext.pass=Ext.Function.alias(Ext.Function,"pass");Ext.bind=Ext.Function.alias(Ext.Function,"bind");Ext.JSON=new (function(){var useHasOwn=!!{}.hasOwnProperty,isNative=function(){var useNative=null;return function(){if(useNative===null){useNative=Ext.USE_NATIVE_JSON&&window.JSON&&JSON.toString()=="[object JSON]"}return useNative}}(),pad=function(n){return n<10?"0"+n:n},doDecode=function(json){return eval("("+json+")")},doEncode=function(o){if(!Ext.isDefined(o)||o===null){return"null"}else{if(Ext.isArray(o)){return encodeArray(o)}else{if(Ext.isDate(o)){return Ext.JSON.encodeDate(o)}else{if(Ext.isString(o)){if(Ext.isMSDate(o)){return encodeMSDate(o)}else{return encodeString(o)}}else{if(typeof o=="number"){return isFinite(o)?String(o):"null"}else{if(Ext.isBoolean(o)){return String(o)}else{if(Ext.isObject(o)){return encodeObject(o)}else{if(typeof o==="function"){return"null"}}}}}}}}return"undefined"},m={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\","\x0b":"\\u000b"},charToReplace=/[\\\"\x00-\x1f\x7f-\uffff]/g,encodeString=function(s){return'"'+s.replace(charToReplace,function(a){var c=m[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"'},encodeArray=function(o){var a=["[",""],len=o.length,i;for(i=0;i0){for(d=0;d0){if(m===l){return o[m]}n=o[m];l=l.substring(m.length+1)}if(n.length>0){n+="/"}return n.replace(/\/\.\//g,"/")+l.replace(/\./g,"/")+".js"},getPrefix:function(m){var o=this.config.paths,n,l="";if(o.hasOwnProperty(m)){return m}for(n in o){if(o.hasOwnProperty(n)&&n+"."===m.substring(0,n.length+1)){if(n.length>l.length){l=n}}}return l},require:function(n,m,l,o){if(m){m.call(l)}},syncRequire:function(){},exclude:function(m){var l=this;return{require:function(p,o,n){return l.require(p,o,n,m)},syncRequire:function(p,o,n){return l.syncRequire(p,o,n,m)}}},onReady:function(o,n,p,l){var m;if(p!==false&&Ext.onDocumentReady){m=o;o=function(){Ext.onDocumentReady(m,n,l)}}o.call(n)}};Ext.apply(b,{documentHead:typeof document!="undefined"&&(document.head||document.getElementsByTagName("head")[0]),isLoading:false,queue:[],isClassFileLoaded:{},isFileLoaded:{},readyListeners:[],optionalRequires:[],requiresMap:{},numPendingFiles:0,numLoadedFiles:0,hasFileLoadError:false,classNameToFilePathMap:{},syncModeEnabled:false,scriptElements:{},refreshQueue:function(){var l=this.queue,r=l.length,o,q,m,p,n;if(r===0){this.triggerReady();return}for(o=0;othis.numLoadedFiles){continue}m=0;do{if(a.isCreated(p[m])){g(p,m,1)}else{m++}}while(m=200&&o<300)||o==304||(o==0&&r.length>0)){Ext.globalEval(r+"\n//@ sourceURL="+m);t.call(x)}else{}v=null}},syncRequire:function(){var l=this.syncModeEnabled;if(!l){this.syncModeEnabled=true}this.require.apply(this,arguments);if(!l){this.syncModeEnabled=false}this.refreshQueue()},require:function(G,u,o,r){var w={},n={},z=this.queue,D=this.classNameToFilePathMap,B=this.isClassFileLoaded,t=[],I=[],F=[],m=[],s,H,y,x,l,q,E,C,A,v,p;if(r){r=i(r);for(C=0,v=r.length;C0){t=a.getNamesByExpression(l);for(A=0,p=t.length;A0){s=function(){var L=[],K,M,J;for(K=0,M=m.length;K0){I=a.getNamesByExpression(x);p=I.length;for(A=0;A0){if(!this.config.enabled){throw new Error("Ext.Loader is not enabled, so dependencies cannot be resolved dynamically. Missing required class"+((F.length>1)?"es":"")+": "+F.join(", "))}}else{s.call(o);return this}H=this.syncModeEnabled;if(!H){z.push({requires:F.slice(),callback:s,scope:o})}v=F.length;for(C=0;C=2){if("1496x2048" in r){e(r["1496x2048"],"(orientation: landscape)")}if("1536x2008" in r){e(r["1536x2008"],"(orientation: portrait)")}if("144" in p){n(p["144"],"144x144",t)}}else{if("748x1024" in r){e(r["748x1024"],"(orientation: landscape)")}if("768x1004" in r){e(r["768x1004"],"(orientation: portrait)")}if("72" in p){n(p["72"],"72x72",t)}}}else{if(o>=2&&Ext.os.version.gtEq("4.3")){if(Ext.os.is.iPhone5){e(r["640x1096"])}else{e(r["640x920"])}if("114" in p){n(p["114"],"114x114",t)}}else{e(r["320x460"]);if("57" in p){n(p["57"],null,t)}}}},application:function(b){var a=b.name,e,d,c;if(!b){b={}}if(!Ext.Loader.config.paths[a]){Ext.Loader.setPath(a,b.appFolder||"app")}c=Ext.Array.from(b.requires);b.requires=["Ext.app.Application"];e=b.onReady;d=b.scope;b.onReady=function(){b.requires=c;new Ext.app.Application(b);if(e){e.call(d)}};Ext.setup(b)},factoryConfig:function(a,l){var g=Ext.isSimpleObject(a);if(g&&a.xclass){var f=a.xclass;delete a.xclass;Ext.require(f,function(){Ext.factoryConfig(a,function(i){l(Ext.create(f,i))})});return}var d=Ext.isArray(a),m=[],k,j,c,e;if(g||d){if(g){for(k in a){if(a.hasOwnProperty(k)){j=a[k];if(Ext.isSimpleObject(j)||Ext.isArray(j)){m.push(k)}}}}else{for(c=0,e=a.length;c=e){l(a);return}k=m[c];j=a[k];Ext.factoryConfig(j,h)}b();return}l(a)},factory:function(b,e,a,f){var d=Ext.ClassManager,c;if(!b||b.isInstance){if(a&&a!==b){a.destroy()}return b}if(f){if(typeof b=="string"){return d.instantiateByAlias(f+"."+b)}else{if(Ext.isObject(b)&&"type" in b){return d.instantiateByAlias(f+"."+b.type,b)}}}if(b===true){return a||d.instantiate(e)}if("xtype" in b){c=d.instantiateByAlias("widget."+b.xtype,b)}else{if("xclass" in b){c=d.instantiate(b.xclass,b)}}if(c){if(a){a.destroy()}return c}if(a){return a.setConfig(b)}return d.instantiate(e,b)},deprecateClassMember:function(b,c,a,d){return this.deprecateProperty(b.prototype,c,a,d)},deprecateClassMembers:function(b,c){var d=b.prototype,e,a;for(e in c){if(c.hasOwnProperty(e)){a=c[e];this.deprecateProperty(d,e,a)}}},deprecateProperty:function(b,c,a,d){if(!d){d="'"+c+"' is deprecated"}if(a){d+=", please use '"+a+"' instead"}if(a){Ext.Object.defineProperty(b,c,{get:function(){return this[a]},set:function(e){this[a]=e},configurable:true})}},deprecatePropertyValue:function(b,a,d,c){Ext.Object.defineProperty(b,a,{get:function(){return d},configurable:true})},deprecateMethod:function(b,a,d,c){b[a]=function(){if(d){return d.apply(this,arguments)}}},deprecateClassMethod:function(a,b,h,d){if(typeof b!="string"){var g,f;for(g in b){if(b.hasOwnProperty(g)){f=b[g];Ext.deprecateClassMethod(a,g,f)}}return}var c=typeof h=="string",e;if(!d){d="'"+b+"()' is deprecated, please use '"+(c?h:h.name)+"()' instead"}if(c){e=function(){return this[h].apply(this,arguments)}}else{e=function(){return h.apply(this,arguments)}}if(b in a.prototype){Ext.Object.defineProperty(a.prototype,b,{value:null,writable:true,configurable:true})}a.addMember(b,e)},isReady:false,readyListeners:[],triggerReady:function(){var b=Ext.readyListeners,a,c,d;if(!Ext.isReady){Ext.isReady=true;for(a=0,c=b.length;a0){return b+Ext.String.capitalize(a)}return a},getPreferredTranslationMethod:function(a){if(typeof a=="object"&&"translationMethod" in a&&a.translationMethod!=="auto"){return a.translationMethod}else{if(this.is.AndroidStock2||this.is.IE){return"scrollposition"}else{return"csstransform"}}}},function(){var a=Ext.browser=new this(Ext.global.navigator.userAgent)});Ext.define("Ext.env.OS",{statics:{names:{ios:"iOS",android:"Android",windowsPhone:"WindowsPhone",webos:"webOS",blackberry:"BlackBerry",rimTablet:"RIMTablet",mac:"MacOS",win:"Windows",tizen:"Tizen",linux:"Linux",bada:"Bada",chrome:"ChromeOS",other:"Other"},prefixes:{tizen:"(Tizen )",ios:"i(?:Pad|Phone|Pod)(?:.*)CPU(?: iPhone)? OS ",android:"(Android |HTC_|Silk/)",windowsPhone:"Windows Phone ",blackberry:"(?:BlackBerry|BB)(?:.*)Version/",rimTablet:"RIM Tablet OS ",webos:"(?:webOS|hpwOS)/",bada:"Bada/",chrome:"CrOS "}},is:Ext.emptyFn,name:null,version:null,setFlag:function(a,b){if(typeof b=="undefined"){b=true}this.is[a]=b;this.is[a.toLowerCase()]=b;return this},constructor:function(o,b,k){var l=this.statics(),j=l.names,d=l.prefixes,a,h="",c,g,f,n,e,m;k=k||Ext.browser;e=this.is=function(i){return this.is[i]===true};for(c in d){if(d.hasOwnProperty(c)){g=d[c];f=o.match(new RegExp("(?:"+g+")([^\\s;]+)"));if(f){a=j[c];m=f[1];if(m&&m=="HTC_"){h=new Ext.Version("2.3")}else{if(m&&m=="Silk/"){h=new Ext.Version("2.3")}else{h=new Ext.Version(f[f.length-1])}}break}}}if(!a){a=j[(o.toLowerCase().match(/mac|win|linux/)||["other"])[0]];h=new Ext.Version("")}this.name=a;this.version=h;if(b){this.setFlag(b.replace(/ simulator$/i,""))}this.setFlag(a);if(h){this.setFlag(a+(h.getMajor()||""));this.setFlag(a+h.getShortVersion())}for(c in j){if(j.hasOwnProperty(c)){n=j[c];if(!e.hasOwnProperty(a)){this.setFlag(n,(a===n))}}}if(this.name=="iOS"&&window.screen.height==568){this.setFlag("iPhone5")}if(k.is.Safari||k.is.Silk){if(this.is.Android2||this.is.Android3||k.version.shortVersion==501){k.setFlag("AndroidStock");k.setFlag("AndroidStock2")}if(this.is.Android4){k.setFlag("AndroidStock");k.setFlag("AndroidStock4")}}return this}},function(){var a=Ext.global.navigator,e=a.userAgent,b,g,d;Ext.os=b=new this(e,a.platform);g=b.name;var c=window.location.search.match(/deviceType=(Tablet|Phone)/),f=window.deviceType;if(c&&c[1]){d=c[1]}else{if(f==="iPhone"){d="Phone"}else{if(f==="iPad"){d="Tablet"}else{if(!b.is.Android&&!b.is.iOS&&!b.is.WindowsPhone&&/Windows|Linux|MacOS/.test(g)){d="Desktop";Ext.browser.is.WebView=Ext.browser.is.Ripple?true:false}else{if(b.is.iPad||b.is.RIMTablet||b.is.Android3||Ext.browser.is.Silk||(b.is.Android&&e.search(/mobile/i)==-1)){d="Tablet"}else{d="Phone"}}}}}b.setFlag(d,true);b.deviceType=d});Ext.define("Ext.env.Feature",{constructor:function(){this.testElements={};this.has=function(a){return !!this.has[a]};if(!Ext.theme){Ext.theme={name:"Default"}}Ext.theme.is={};Ext.theme.is[Ext.theme.name]=true;Ext.onDocumentReady(function(){this.registerTest({ProperHBoxStretching:function(){var b=document.createElement("div"),c=b.appendChild(document.createElement("div")),d=c.appendChild(document.createElement("div")),a;b.setAttribute("style","width: 100px; height: 100px; position: relative;");c.setAttribute("style","position: absolute; display: -ms-flexbox; display: -webkit-flex; display: -moz-flexbox; display: flex; -ms-flex-direction: row; -webkit-flex-direction: row; -moz-flex-direction: row; flex-direction: row; min-width: 100%;");d.setAttribute("style","width: 200px; height: 50px;");document.body.appendChild(b);a=c.offsetWidth;document.body.removeChild(b);return(a>100)}})},this)},getTestElement:function(a,b){if(a===undefined){a="div"}else{if(typeof a!=="string"){return a}}if(b){return document.createElement(a)}if(!this.testElements[a]){this.testElements[a]=document.createElement(a)}return this.testElements[a]},isStyleSupported:function(c,b){var d=this.getTestElement(b).style,a=Ext.String.capitalize(c);if(typeof d[c]!=="undefined"||typeof d[Ext.browser.getStylePrefix(c)+a]!=="undefined"){return true}return false},isStyleSupportedWithoutPrefix:function(b,a){var c=this.getTestElement(a).style;if(typeof c[b]!=="undefined"){return true}return false},isEventSupported:function(c,a){if(a===undefined){a=window}var e=this.getTestElement(a),b="on"+c.toLowerCase(),d=(b in e);if(!d){if(e.setAttribute&&e.removeAttribute){e.setAttribute(b,"");d=typeof e[b]==="function";if(typeof e[b]!=="undefined"){e[b]=undefined}e.removeAttribute(b)}}return d},getSupportedPropertyName:function(b,a){var c=Ext.browser.getVendorProperyName(a);if(c in b){return c}else{if(a in b){return a}}return null},registerTest:Ext.Function.flexSetter(function(a,b){this.has[a]=b.call(this);return this})},function(){Ext.feature=new this;var a=Ext.feature.has;Ext.feature.registerTest({Canvas:function(){var b=this.getTestElement("canvas");return !!(b&&b.getContext&&b.getContext("2d"))},Svg:function(){var b=document;return !!(b.createElementNS&&!!b.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect)},Vml:function(){var c=this.getTestElement(),b=false;c.innerHTML="";b=(c.childNodes.length===1);c.innerHTML="";return b},Touch:function(){return Ext.browser.is.Ripple||(this.isEventSupported("touchstart")&&!(Ext.os&&Ext.os.name.match(/Windows|MacOS|Linux/)&&!Ext.os.is.BlackBerry6))},Pointer:function(){return !!window.navigator.msPointerEnabled},Orientation:function(){return"orientation" in window},OrientationChange:function(){return this.isEventSupported("orientationchange")},DeviceMotion:function(){return this.isEventSupported("devicemotion")},Geolocation:function(){return"geolocation" in window.navigator},SqlDatabase:function(){return"openDatabase" in window},WebSockets:function(){return"WebSocket" in window},Range:function(){return !!document.createRange},CreateContextualFragment:function(){var b=!!document.createRange?document.createRange():false;return b&&!!b.createContextualFragment},History:function(){return("history" in window&&"pushState" in window.history)},CssTransforms:function(){return this.isStyleSupported("transform")},CssTransformNoPrefix:function(){if(!Ext.browser.is.AndroidStock){return this.isStyleSupportedWithoutPrefix("transform")}else{return this.isStyleSupportedWithoutPrefix("transform")&&!this.isStyleSupportedWithoutPrefix("-webkit-transform")}},Css3dTransforms:function(){return this.has("CssTransforms")&&this.isStyleSupported("perspective")&&!Ext.browser.is.AndroidStock2},CssAnimations:function(){return this.isStyleSupported("animationName")},CssTransitions:function(){return this.isStyleSupported("transitionProperty")},Audio:function(){return !!this.getTestElement("audio").canPlayType},Video:function(){return !!this.getTestElement("video").canPlayType},ClassList:function(){return"classList" in this.getTestElement()},LocalStorage:function(){var b=false;try{if("localStorage" in window&&window.localStorage!==null){localStorage.setItem("sencha-localstorage-test","test success");localStorage.removeItem("sencha-localstorage-test");b=true}}catch(c){}return b},MatchMedia:function(){return"matchMedia" in window},XHR2:function(){return window.ProgressEvent&&window.FormData&&window.XMLHttpRequest&&("withCredentials" in new XMLHttpRequest)},XHRUploadProgress:function(){if(window.XMLHttpRequest&&!Ext.browser.is.AndroidStock){var b=new XMLHttpRequest();return b&&("upload" in b)&&("onprogress" in b.upload)}return false},NumericInputPlaceHolder:function(){return !(Ext.browser.is.AndroidStock4&&Ext.os.version.getMinor()<2)}})});Ext.define("Ext.dom.Query",{select:function(h,b){var g=[],d,f,e,c,a;b=b||document;if(typeof b=="string"){b=document.getElementById(b)}h=h.split(",");for(f=0,c=h.length;f")}else{c.push(">");if((h=d.tpl)){h.applyOut(d.tplData,c)}if((h=d.html)){c.push(h)}if((h=d.cn||d.children)){g.generateMarkup(h,c)}f=g.closeTags;c.push(f[a]||(f[a]=""))}}}return c},generateStyles:function(e,c){var b=c||[],d;for(d in e){if(e.hasOwnProperty(d)){b.push(this.decamelizeName(d),":",e[d],";")}}return c||b.join("")},markup:function(a){if(typeof a=="string"){return a}var b=this.generateMarkup(a,[]);return b.join("")},applyStyles:function(a,b){Ext.fly(a).applyStyles(b)},createContextualFragment:function(c){var f=document.createElement("div"),a=document.createDocumentFragment(),b=0,d,e;f.innerHTML=c;e=f.childNodes;d=e.length;for(;b";return b}},isElement:true,constructor:function(a){if(typeof a=="string"){a=document.getElementById(a)}if(!a){throw new Error("Invalid domNode reference or an id of an existing domNode: "+a)}this.dom=a;this.getUniqueId()},attach:function(a){this.dom=a;this.id=a.id;return this},getUniqueId:function(){var b=this.id,a;if(!b){a=this.dom;if(a.id.length>0){this.id=b=a.id}else{a.id=b=this.mixins.identifiable.getUniqueId.call(this)}Ext.Element.cache[b]=this}return b},setId:function(c){var a=this.id,b=Ext.Element.cache;if(a){delete b[a]}this.dom.id=c;this.id=c;b[c]=this;return this},setHtml:function(a){this.dom.innerHTML=a},getHtml:function(){return this.dom.innerHTML},setText:function(a){this.dom.textContent=a},redraw:function(){var b=this.dom,a=b.style;a.display="none";b.offsetHeight;a.display=""},isPainted:(function(){return !Ext.browser.is.IE?function(){var a=this.dom;return Boolean(a&&a.offsetParent)}:function(){var a=this.dom;return Boolean(a&&(a.offsetHeight!==0&&a.offsetWidth!==0))}})(),set:function(a,b){var e=this.dom,c,d;for(c in a){if(a.hasOwnProperty(c)){d=a[c];if(c=="style"){this.applyStyles(d)}else{if(c=="cls"){e.className=d}else{if(b!==false){if(d===undefined){e.removeAttribute(c)}else{e.setAttribute(c,d)}}else{e[c]=d}}}}}return this},is:function(a){return Ext.DomQuery.is(this.dom,a)},getValue:function(b){var a=this.dom.value;return b?parseInt(a,10):a},getAttribute:function(a,b){var c=this.dom;return c.getAttributeNS(b,a)||c.getAttribute(b+":"+a)||c.getAttribute(a)||c[a]},setSizeState:function(d){var c=["x-sized","x-unsized","x-stretched"],a=[true,false,null],b=a.indexOf(d),e;if(b!==-1){e=c[b];c.splice(b,1);this.addCls(e)}this.removeCls(c);return this},destroy:function(){this.isDestroyed=true;var a=Ext.Element.cache,b=this.dom;if(b&&b.parentNode&&b.tagName!="BODY"){b.parentNode.removeChild(b)}delete a[this.id];delete this.dom}},function(a){Ext.elements=Ext.cache=a.cache;this.addStatics({Fly:new Ext.Class({extend:a,constructor:function(b){this.dom=b}}),_flyweights:{},fly:function(e,c){var f=null,d=a._flyweights,b;c=c||"_global";e=Ext.getDom(e);if(e){f=d[c]||(d[c]=new a.Fly());f.dom=e;f.isSynchronized=false;b=Ext.cache[e.id];if(b&&b.isElement){b.isSynchronized=false}}return f}});Ext.get=function(b){return a.get(b)};Ext.fly=function(){return a.fly.apply(a,arguments)};Ext.ClassManager.onCreated(function(){a.mixin("observable",Ext.mixin.Observable)},null,"Ext.mixin.Observable")});Ext.dom.Element.addStatics({numberRe:/\d+$/,unitRe:/\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i,camelRe:/(-[a-z])/gi,cssRe:/([a-z0-9-]+)\s*:\s*([^;\s]+(?:\s*[^;\s]+)*);?/gi,opacityRe:/alpha\(opacity=(.*)\)/i,propertyCache:{},defaultUnit:"px",borders:{l:"border-left-width",r:"border-right-width",t:"border-top-width",b:"border-bottom-width"},paddings:{l:"padding-left",r:"padding-right",t:"padding-top",b:"padding-bottom"},margins:{l:"margin-left",r:"margin-right",t:"margin-top",b:"margin-bottom"},addUnits:function(b,a){if(b===""||b=="auto"||b===undefined||b===null){return b||""}if(Ext.isNumber(b)||this.numberRe.test(b)){return b+(a||this.defaultUnit||"px")}else{if(!this.unitRe.test(b)){return b||""}}return b},isAncestor:function(b,d){var a=false;b=Ext.getDom(b);d=Ext.getDom(d);if(b&&d){if(b.contains){return b.contains(d)}else{if(b.compareDocumentPosition){return !!(b.compareDocumentPosition(d)&16)}else{while((d=d.parentNode)){a=d==b||a}}}}return a},parseBox:function(b){if(typeof b!="string"){b=b.toString()}var c=b.split(" "),a=c.length;if(a==1){c[1]=c[2]=c[3]=c[0]}else{if(a==2){c[2]=c[0];c[3]=c[1]}else{if(a==3){c[3]=c[1]}}}return{top:c[0]||0,right:c[1]||0,bottom:c[2]||0,left:c[3]||0}},unitizeBox:function(c,a){var b=this;c=b.parseBox(c);return b.addUnits(c.top,a)+" "+b.addUnits(c.right,a)+" "+b.addUnits(c.bottom,a)+" "+b.addUnits(c.left,a)},camelReplaceFn:function(b,c){return c.charAt(1).toUpperCase()},normalize:function(a){return this.propertyCache[a]||(this.propertyCache[a]=a.replace(this.camelRe,this.camelReplaceFn))},fromPoint:function(a,b){return Ext.get(document.elementFromPoint(a,b))},parseStyles:function(c){var a={},b=this.cssRe,d;if(c){b.lastIndex=0;while((d=b.exec(c))){a[d[1]]=d[2]}}return a}});Ext.dom.Element.addMembers({appendChild:function(a){this.dom.appendChild(Ext.getDom(a));return this},removeChild:function(a){this.dom.removeChild(Ext.getDom(a));return this},append:function(){this.appendChild.apply(this,arguments)},appendTo:function(a){Ext.getDom(a).appendChild(this.dom);return this},insertBefore:function(a){a=Ext.getDom(a);a.parentNode.insertBefore(this.dom,a);return this},insertAfter:function(a){a=Ext.getDom(a);a.parentNode.insertBefore(this.dom,a.nextSibling);return this},insertFirst:function(b){var a=Ext.getDom(b),d=this.dom,c=d.firstChild;if(!c){d.appendChild(a)}else{d.insertBefore(a,c)}return this},insertSibling:function(e,c,d){var f=this,b,a=(c||"before").toLowerCase()=="after",g;if(Ext.isArray(e)){g=f;Ext.each(e,function(h){b=Ext.fly(g,"_internal").insertSibling(h,c,d);if(a){g=b}});return b}e=e||{};if(e.nodeType||e.dom){b=f.dom.parentNode.insertBefore(Ext.getDom(e),a?f.dom.nextSibling:f.dom);if(!d){b=Ext.get(b)}}else{if(a&&!f.dom.nextSibling){b=Ext.core.DomHelper.append(f.dom.parentNode,e,!d)}else{b=Ext.core.DomHelper[a?"insertAfter":"insertBefore"](f.dom,e,!d)}}return b},replace:function(a){a=Ext.getDom(a);a.parentNode.replaceChild(this.dom,a);return this},replaceWith:function(a){var b=this;if(a.nodeType||a.dom||typeof a=="string"){a=Ext.get(a);b.dom.parentNode.insertBefore(a.dom,b.dom)}else{a=Ext.core.DomHelper.insertBefore(b.dom,a)}delete Ext.cache[b.id];Ext.removeNode(b.dom);b.id=Ext.id(b.dom=a);return b},doReplaceWith:function(a){var b=this.dom;b.parentNode.replaceChild(Ext.getDom(a),b)},createChild:function(b,a,c){b=b||{tag:"div"};if(a){return Ext.core.DomHelper.insertBefore(a,b,c!==true)}else{return Ext.core.DomHelper[!this.dom.firstChild?"insertFirst":"append"](this.dom,b,c!==true)}},wrap:function(b,c){var e=this.dom,f=this.self.create(b,c),d=(c)?f:f.dom,a=e.parentNode;if(a){a.insertBefore(d,e)}d.appendChild(e);return f},wrapAllChildren:function(a){var d=this.dom,b=d.childNodes,e=this.self.create(a),c=e.dom;while(b.length>0){c.appendChild(d.firstChild)}d.appendChild(c);return e},unwrapAllChildren:function(){var c=this.dom,b=c.childNodes,a=c.parentNode;if(a){while(b.length>0){a.insertBefore(c,c.firstChild)}this.destroy()}},unwrap:function(){var c=this.dom,a=c.parentNode,b;if(a){b=a.parentNode;b.insertBefore(c,a);b.removeChild(a)}else{b=document.createDocumentFragment();b.appendChild(c)}return this},detach:function(){var a=this.dom;if(a&&a.parentNode&&a.tagName!=="BODY"){a.parentNode.removeChild(a)}return this},insertHtml:function(b,c,a){var d=Ext.core.DomHelper.insertHtml(b,this.dom,c);return a?Ext.get(d):d}});Ext.dom.Element.override({getX:function(){return this.getXY()[0]},getY:function(){return this.getXY()[1]},getXY:function(){var b=this.dom.getBoundingClientRect(),a=Math.round;return[a(b.left+window.pageXOffset),a(b.top+window.pageYOffset)]},getOffsetsTo:function(a){var c=this.getXY(),b=Ext.fly(a,"_internal").getXY();return[c[0]-b[0],c[1]-b[1]]},setX:function(a){return this.setXY([a,this.getY()])},setY:function(a){return this.setXY([this.getX(),a])},setXY:function(d){var b=this;if(arguments.length>1){d=[d,arguments[1]]}var c=b.translatePoints(d),a=b.dom.style;for(d in c){if(!c.hasOwnProperty(d)){continue}if(!isNaN(c[d])){a[d]=c[d]+"px"}}return b},getLeft:function(){return parseInt(this.getStyle("left"),10)||0},getRight:function(){return parseInt(this.getStyle("right"),10)||0},getTop:function(){return parseInt(this.getStyle("top"),10)||0},getBottom:function(){return parseInt(this.getStyle("bottom"),10)||0},translatePoints:function(a,g){g=isNaN(a[1])?g:a[1];a=isNaN(a[0])?a:a[0];var d=this,e=d.isStyle("position","relative"),f=d.getXY(),b=parseInt(d.getStyle("left"),10),c=parseInt(d.getStyle("top"),10);b=!isNaN(b)?b:(e?0:d.dom.offsetLeft);c=!isNaN(c)?c:(e?0:d.dom.offsetTop);return{left:(a-f[0]+b),top:(g-f[1]+c)}},setBox:function(d){var c=this,b=d.width,a=d.height,f=d.top,e=d.left;if(e!==undefined){c.setLeft(e)}if(f!==undefined){c.setTop(f)}if(b!==undefined){c.setWidth(b)}if(a!==undefined){c.setHeight(a)}return this},getBox:function(g,j){var h=this,e=h.dom,c=e.offsetWidth,k=e.offsetHeight,n,f,d,a,m,i;if(!j){n=h.getXY()}else{if(g){n=[0,0]}else{n=[parseInt(h.getStyle("left"),10)||0,parseInt(h.getStyle("top"),10)||0]}}if(!g){f={x:n[0],y:n[1],0:n[0],1:n[1],width:c,height:k}}else{d=h.getBorderWidth.call(h,"l")+h.getPadding.call(h,"l");a=h.getBorderWidth.call(h,"r")+h.getPadding.call(h,"r");m=h.getBorderWidth.call(h,"t")+h.getPadding.call(h,"t");i=h.getBorderWidth.call(h,"b")+h.getPadding.call(h,"b");f={x:n[0]+d,y:n[1]+m,0:n[0]+d,1:n[1]+m,width:c-(d+a),height:k-(m+i)}}f.left=f.x;f.top=f.y;f.right=f.x+f.width;f.bottom=f.y+f.height;return f},getPageBox:function(e){var g=this,c=g.dom;if(!c){return new Ext.util.Region()}var j=c.offsetWidth,f=c.offsetHeight,m=g.getXY(),k=m[1],a=m[0]+j,i=m[1]+f,d=m[0];if(e){return new Ext.util.Region(k,a,i,d)}else{return{left:d,top:k,width:j,height:f,right:a,bottom:i}}}});Ext.dom.Element.addMembers({WIDTH:"width",HEIGHT:"height",MIN_WIDTH:"min-width",MIN_HEIGHT:"min-height",MAX_WIDTH:"max-width",MAX_HEIGHT:"max-height",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left",VISIBILITY:1,DISPLAY:2,OFFSETS:3,SEPARATOR:"-",trimRe:/^\s+|\s+$/g,wordsRe:/\w/g,spacesRe:/\s+/,styleSplitRe:/\s*(?::|;)\s*/,transparentRe:/^(?:transparent|(?:rgba[(](?:\s*\d+\s*[,]){3}\s*0\s*[)]))$/i,classNameSplitRegex:/[\s]+/,borders:{t:"border-top-width",r:"border-right-width",b:"border-bottom-width",l:"border-left-width"},paddings:{t:"padding-top",r:"padding-right",b:"padding-bottom",l:"padding-left"},margins:{t:"margin-top",r:"margin-right",b:"margin-bottom",l:"margin-left"},defaultUnit:"px",isSynchronized:false,synchronize:function(){var g=this.dom,a={},d=g.className,f,c,e,b;if(d.length>0){f=g.className.split(this.classNameSplitRegex);for(c=0,e=f.length;c0?a:0},getWidth:function(a){var c=this.dom,b=a?(c.clientWidth-this.getPadding("lr")):c.offsetWidth;return b>0?b:0},getBorderWidth:function(a){return this.addStyles(a,this.borders)},getPadding:function(a){return this.addStyles(a,this.paddings)},applyStyles:function(d){if(d){var e=this.dom,c,b,a;if(typeof d=="function"){d=d.call()}c=typeof d;if(c=="string"){d=Ext.util.Format.trim(d).split(this.styleSplitRe);for(b=0,a=d.length;b "+a,c.dom);return b?d:Ext.get(d)},parent:function(a,b){return this.matchNode("parentNode","parentNode",a,b)},next:function(a,b){return this.matchNode("nextSibling","nextSibling",a,b)},prev:function(a,b){return this.matchNode("previousSibling","previousSibling",a,b)},first:function(a,b){return this.matchNode("nextSibling","firstChild",a,b)},last:function(a,b){return this.matchNode("previousSibling","lastChild",a,b)},matchNode:function(b,e,a,c){if(!this.dom){return null}var d=this.dom[e];while(d){if(d.nodeType==1&&(!a||Ext.DomQuery.is(d,a))){return !c?Ext.get(d):d}d=d[b]}return null},isAncestor:function(a){return this.self.isAncestor.call(this.self,this.dom,a)}});Ext.define("Ext.dom.CompositeElementLite",{alternateClassName:["Ext.CompositeElementLite","Ext.CompositeElement"],statics:{importElementMethods:function(){}},constructor:function(b,a){this.elements=[];this.add(b,a);this.el=new Ext.dom.Element.Fly()},isComposite:true,getElement:function(a){return this.el.attach(a).synchronize()},transformElement:function(a){return Ext.getDom(a)},getCount:function(){return this.elements.length},add:function(c,a){var e=this.elements,b,d;if(!c){return this}if(typeof c=="string"){c=Ext.dom.Element.selectorFunction(c,a)}else{if(c.isComposite){c=c.elements}else{if(!Ext.isIterable(c)){c=[c]}}}for(b=0,d=c.length;b-1){c=Ext.getDom(c);if(a){f=this.elements[b];f.parentNode.insertBefore(c,f);Ext.removeNode(f)}Ext.Array.splice(this.elements,b,1,c)}return this},clear:function(){this.elements=[]},addElements:function(c,a){if(!c){return this}if(typeof c=="string"){c=Ext.dom.Element.selectorFunction(c,a)}var b=this.elements;Ext.each(c,function(d){b.push(Ext.get(d))});return this},first:function(){return this.item(0)},last:function(){return this.item(this.getCount()-1)},contains:function(a){return this.indexOf(a)!=-1},removeElement:function(c,e){var b=this,d=this.elements,a;Ext.each(c,function(f){if((a=(d[f]||d[f=b.indexOf(f)]))){if(e){if(a.dom){a.remove()}else{Ext.removeNode(a)}}Ext.Array.erase(d,f,1)}});return this}},function(){var a=Ext.dom.Element,d=a.prototype,c=this.prototype,b;for(b in d){if(typeof d[b]=="function"){(function(e){if(e==="destroy"){c[e]=function(){return this.invoke(e,arguments)}}else{c[e]=c[e]||function(){return this.invoke(e,arguments)}}}).call(c,b)}}c.on=c.addListener;a.selectorFunction=Ext.DomQuery.select;Ext.dom.Element.select=function(e,h,f){var g;if(typeof e=="string"){g=Ext.dom.Element.selectorFunction(e,f)}else{if(e.length!==undefined){g=e}else{}}return(h===true)?new Ext.dom.CompositeElement(g):new Ext.dom.CompositeElementLite(g)};Ext.select=function(){return a.select.apply(a,arguments)}});Ext.ClassManager.addNameAlternateMappings({"Ext.AbstractComponent":[],"Ext.AbstractManager":[],"Ext.AbstractPlugin":[],"Ext.ActionSheet":[],"Ext.Ajax":[],"Ext.Anim":[],"Ext.AnimationQueue":[],"Ext.Audio":[],"Ext.BingMap":[],"Ext.Button":[],"Ext.Component":["Ext.lib.Component"],"Ext.ComponentManager":["Ext.ComponentMgr"],"Ext.ComponentQuery":[],"Ext.Container":["Ext.lib.Container"],"Ext.Decorator":[],"Ext.Evented":["Ext.EventedBase"],"Ext.Img":[],"Ext.ItemCollection":[],"Ext.Label":[],"Ext.LoadMask":[],"Ext.Map":[],"Ext.Mask":[],"Ext.Media":[],"Ext.Menu":[],"Ext.MessageBox":[],"Ext.Panel":["Ext.lib.Panel"],"Ext.ProgressIndicator":[],"Ext.Promise":[],"Ext.SegmentedButton":[],"Ext.Sheet":[],"Ext.Sortable":[],"Ext.Spacer":[],"Ext.TaskQueue":[],"Ext.Template":[],"Ext.Title":[],"Ext.TitleBar":[],"Ext.Toast":[],"Ext.Toolbar":[],"Ext.Video":[],"Ext.XTemplate":[],"Ext.XTemplateCompiler":[],"Ext.XTemplateParser":[],"Ext.app.Action":[],"Ext.app.Application":[],"Ext.app.Controller":[],"Ext.app.History":[],"Ext.app.Profile":[],"Ext.app.Route":[],"Ext.app.Router":[],"Ext.behavior.Behavior":[],"Ext.behavior.Draggable":[],"Ext.behavior.Scrollable":[],"Ext.behavior.Translatable":[],"Ext.carousel.Carousel":["Ext.Carousel"],"Ext.carousel.Indicator":["Ext.Carousel.Indicator"],"Ext.carousel.Infinite":[],"Ext.carousel.Item":[],"Ext.data.ArrayStore":[],"Ext.data.Batch":[],"Ext.data.Connection":[],"Ext.data.DirectStore":[],"Ext.data.Error":[],"Ext.data.Errors":[],"Ext.data.Field":[],"Ext.data.JsonP":["Ext.util.JSONP"],"Ext.data.JsonStore":[],"Ext.data.Model":["Ext.data.Record"],"Ext.data.ModelManager":["Ext.ModelMgr","Ext.ModelManager"],"Ext.data.NodeInterface":["Ext.data.Node"],"Ext.data.NodeStore":[],"Ext.data.Operation":[],"Ext.data.Request":[],"Ext.data.ResultSet":[],"Ext.data.SortTypes":[],"Ext.data.Store":[],"Ext.data.StoreManager":["Ext.StoreMgr","Ext.data.StoreMgr","Ext.StoreManager"],"Ext.data.TreeStore":[],"Ext.data.Types":[],"Ext.data.Validations":["Ext.data.validations"],"Ext.data.association.Association":["Ext.data.Association"],"Ext.data.association.BelongsTo":["Ext.data.BelongsToAssociation"],"Ext.data.association.HasMany":["Ext.data.HasManyAssociation"],"Ext.data.association.HasOne":["Ext.data.HasOneAssociation"],"Ext.data.identifier.Sequential":[],"Ext.data.identifier.Simple":[],"Ext.data.identifier.Uuid":[],"Ext.data.proxy.Ajax":["Ext.data.HttpProxy","Ext.data.AjaxProxy"],"Ext.data.proxy.Client":["Ext.proxy.ClientProxy"],"Ext.data.proxy.Direct":["Ext.data.DirectProxy"],"Ext.data.proxy.JsonP":["Ext.data.ScriptTagProxy"],"Ext.data.proxy.LocalStorage":["Ext.data.LocalStorageProxy"],"Ext.data.proxy.Memory":["Ext.data.MemoryProxy"],"Ext.data.proxy.Proxy":["Ext.data.DataProxy","Ext.data.Proxy"],"Ext.data.proxy.Rest":["Ext.data.RestProxy"],"Ext.data.proxy.Server":["Ext.data.ServerProxy"],"Ext.data.proxy.SessionStorage":["Ext.data.SessionStorageProxy"],"Ext.data.proxy.Sql":["Ext.data.proxy.SQL"],"Ext.data.proxy.WebStorage":["Ext.data.WebStorageProxy"],"Ext.data.reader.Array":["Ext.data.ArrayReader"],"Ext.data.reader.Json":["Ext.data.JsonReader"],"Ext.data.reader.Reader":["Ext.data.Reader","Ext.data.DataReader"],"Ext.data.reader.Xml":["Ext.data.XmlReader"],"Ext.data.writer.Json":["Ext.data.JsonWriter"],"Ext.data.writer.Writer":["Ext.data.DataWriter","Ext.data.Writer"],"Ext.data.writer.Xml":["Ext.data.XmlWriter"],"Ext.dataview.DataView":["Ext.DataView"],"Ext.dataview.IndexBar":["Ext.IndexBar"],"Ext.dataview.List":["Ext.List"],"Ext.dataview.ListItemHeader":[],"Ext.dataview.NestedList":["Ext.NestedList"],"Ext.dataview.component.Container":[],"Ext.dataview.component.DataItem":[],"Ext.dataview.component.ListItem":[],"Ext.dataview.component.SimpleListItem":[],"Ext.dataview.element.Container":[],"Ext.dataview.element.List":[],"Ext.device.Accelerometer":[],"Ext.device.Browser":[],"Ext.device.Camera":[],"Ext.device.Capture":[],"Ext.device.Communicator":[],"Ext.device.Compass":[],"Ext.device.Connection":[],"Ext.device.Contacts":[],"Ext.device.Device":[],"Ext.device.FileSystem":[],"Ext.device.Geolocation":[],"Ext.device.Globalization":[],"Ext.device.Media":[],"Ext.device.Notification":[],"Ext.device.Orientation":[],"Ext.device.Purchases":[],"Ext.device.Purchases.Product":[],"Ext.device.Push":[],"Ext.device.SQLite":[],"Ext.device.Splashscreen":[],"Ext.device.Storage":[],"Ext.device.Tunnel":[],"Ext.device.accelerometer.Abstract":[],"Ext.device.accelerometer.Cordova":["Ext.device.accelerometer.PhoneGap"],"Ext.device.accelerometer.Simulator":[],"Ext.device.browser.Abstract":[],"Ext.device.browser.Cordova":[],"Ext.device.browser.Simulator":[],"Ext.device.browser.Window":[],"Ext.device.camera.Abstract":[],"Ext.device.camera.Cordova":["Ext.device.camera.PhoneGap"],"Ext.device.camera.Sencha":[],"Ext.device.camera.Simulator":[],"Ext.device.capture.Abstract":["Ext.device.capture.Simulator"],"Ext.device.capture.Cordova":[],"Ext.device.communicator.Android":[],"Ext.device.communicator.Default":[],"Ext.device.compass.Abstract":[],"Ext.device.compass.Cordova":["Ext.device.compass.PhoneGap"],"Ext.device.compass.Simulator":[],"Ext.device.connection.Abstract":[],"Ext.device.connection.Cordova":["Ext.device.connection.PhoneGap"],"Ext.device.connection.Sencha":[],"Ext.device.connection.Simulator":[],"Ext.device.contacts.Abstract":[],"Ext.device.contacts.Cordova":["Ext.device.contacts.PhoneGap"],"Ext.device.contacts.Sencha":[],"Ext.device.device.Abstract":[],"Ext.device.device.Cordova":["Ext.device.device.PhoneGap"],"Ext.device.device.Sencha":[],"Ext.device.device.Simulator":[],"Ext.device.filesystem.Abstract":[],"Ext.device.filesystem.Chrome":[],"Ext.device.filesystem.Cordova":["Ext.device.filesystem.PhoneGap"],"Ext.device.filesystem.DirectoryEntry":[],"Ext.device.filesystem.Entry":[],"Ext.device.filesystem.FileEntry":[],"Ext.device.filesystem.FileSystem":[],"Ext.device.filesystem.HTML5":[],"Ext.device.filesystem.Sencha":[],"Ext.device.filesystem.Simulator":[],"Ext.device.geolocation.Abstract":[],"Ext.device.geolocation.Cordova":["Ext.device.geolocation.PhoneGap"],"Ext.device.geolocation.Sencha":[],"Ext.device.geolocation.Simulator":[],"Ext.device.globalization.Abstract":[],"Ext.device.globalization.Cordova":["Ext.device.globalization.PhoneGap"],"Ext.device.globalization.Simulator":[],"Ext.device.media.Abstract":[],"Ext.device.media.Cordova":["Ext.device.media.PhoneGap"],"Ext.device.notification.Abstract":[],"Ext.device.notification.Cordova":["Ext.device.notification.PhoneGap"],"Ext.device.notification.Sencha":[],"Ext.device.notification.Simulator":[],"Ext.device.orientation.Abstract":[],"Ext.device.orientation.HTML5":[],"Ext.device.orientation.Sencha":[],"Ext.device.purchases.Purchase":[],"Ext.device.purchases.Sencha":[],"Ext.device.push.Abstract":[],"Ext.device.push.Cordova":[],"Ext.device.push.Sencha":[],"Ext.device.splashscreen.Abstract":[],"Ext.device.splashscreen.Cordova":["Ext.device.splashscreen.PhoneGap"],"Ext.device.splashscreen.Simulator":[],"Ext.device.sqlite.Database":[],"Ext.device.sqlite.SQLResultSet":[],"Ext.device.sqlite.SQLResultSetRowList":[],"Ext.device.sqlite.SQLTransaction":[],"Ext.device.sqlite.Sencha":[],"Ext.device.storage.Abstract":[],"Ext.device.storage.Cordova":["Ext.device.storage.PhoneGap"],"Ext.device.storage.HTML5.Database":[],"Ext.device.storage.HTML5.HTML5":[],"Ext.device.storage.HTML5.SQLStatement":[],"Ext.device.storage.Simulator":[],"Ext.device.tunnel.Abstract":[],"Ext.device.tunnel.Connection":[],"Ext.device.tunnel.Sencha":[],"Ext.device.tunnel.Simulator":[],"Ext.direct.Event":[],"Ext.direct.ExceptionEvent":[],"Ext.direct.JsonProvider":[],"Ext.direct.Manager":["Ext.Direct"],"Ext.direct.PollingProvider":[],"Ext.direct.Provider":[],"Ext.direct.RemotingEvent":[],"Ext.direct.RemotingMethod":[],"Ext.direct.RemotingProvider":[],"Ext.direct.Transaction":["Ext.Direct.Transaction"],"Ext.dom.CompositeElement":["Ext.CompositeElement"],"Ext.event.Controller":[],"Ext.event.Dispatcher":[],"Ext.event.Dom":[],"Ext.event.Event":["Ext.EventObject"],"Ext.event.ListenerStack":[],"Ext.event.Touch":[],"Ext.event.publisher.ComponentDelegation":[],"Ext.event.publisher.ComponentPaint":[],"Ext.event.publisher.ComponentSize":[],"Ext.event.publisher.Dom":[],"Ext.event.publisher.ElementPaint":[],"Ext.event.publisher.ElementSize":[],"Ext.event.publisher.Publisher":[],"Ext.event.publisher.TouchGesture":[],"Ext.event.recognizer.DoubleTap":[],"Ext.event.recognizer.Drag":[],"Ext.event.recognizer.EdgeSwipe":[],"Ext.event.recognizer.HorizontalSwipe":[],"Ext.event.recognizer.LongPress":[],"Ext.event.recognizer.MultiTouch":[],"Ext.event.recognizer.Pinch":[],"Ext.event.recognizer.Recognizer":[],"Ext.event.recognizer.Rotate":[],"Ext.event.recognizer.SingleTouch":[],"Ext.event.recognizer.Swipe":[],"Ext.event.recognizer.Tap":[],"Ext.event.recognizer.Touch":[],"Ext.event.recognizer.VerticalSwipe":[],"Ext.field.Checkbox":["Ext.form.Checkbox"],"Ext.field.DatePicker":["Ext.form.DatePicker"],"Ext.field.DatePickerNative":["Ext.form.DatePickerNative"],"Ext.field.Email":["Ext.form.Email"],"Ext.field.Field":["Ext.form.Field"],"Ext.field.File":[],"Ext.field.FileInput":[],"Ext.field.Hidden":["Ext.form.Hidden"],"Ext.field.Input":[],"Ext.field.Number":["Ext.form.Number"],"Ext.field.Password":["Ext.form.Password"],"Ext.field.Radio":["Ext.form.Radio"],"Ext.field.Search":["Ext.form.Search"],"Ext.field.Select":["Ext.form.Select"],"Ext.field.Slider":["Ext.form.Slider"],"Ext.field.Spinner":["Ext.form.Spinner"],"Ext.field.Text":["Ext.form.Text"],"Ext.field.TextArea":["Ext.form.TextArea"],"Ext.field.TextAreaInput":[],"Ext.field.Toggle":["Ext.form.Toggle"],"Ext.field.Url":["Ext.form.Url"],"Ext.form.FieldSet":[],"Ext.form.Panel":["Ext.form.FormPanel"],"Ext.fx.Animation":[],"Ext.fx.Easing":[],"Ext.fx.Runner":[],"Ext.fx.State":[],"Ext.fx.animation.Abstract":[],"Ext.fx.animation.Cube":[],"Ext.fx.animation.Fade":["Ext.fx.animation.FadeIn"],"Ext.fx.animation.FadeOut":[],"Ext.fx.animation.Flip":[],"Ext.fx.animation.Pop":["Ext.fx.animation.PopIn"],"Ext.fx.animation.PopOut":[],"Ext.fx.animation.Slide":["Ext.fx.animation.SlideIn"],"Ext.fx.animation.SlideOut":[],"Ext.fx.animation.Wipe":["Ext.fx.animation.WipeIn"],"Ext.fx.animation.WipeOut":[],"Ext.fx.easing.Abstract":[],"Ext.fx.easing.Bounce":[],"Ext.fx.easing.BoundMomentum":[],"Ext.fx.easing.EaseIn":[],"Ext.fx.easing.EaseOut":[],"Ext.fx.easing.Linear":[],"Ext.fx.easing.Momentum":[],"Ext.fx.layout.Card":[],"Ext.fx.layout.card.Abstract":[],"Ext.fx.layout.card.Cover":[],"Ext.fx.layout.card.Cube":[],"Ext.fx.layout.card.Fade":[],"Ext.fx.layout.card.Flip":[],"Ext.fx.layout.card.Pop":[],"Ext.fx.layout.card.Reveal":[],"Ext.fx.layout.card.Scroll":[],"Ext.fx.layout.card.ScrollCover":[],"Ext.fx.layout.card.ScrollReveal":[],"Ext.fx.layout.card.Slide":[],"Ext.fx.layout.card.Style":[],"Ext.fx.runner.Css":[],"Ext.fx.runner.CssAnimation":[],"Ext.fx.runner.CssTransition":[],"Ext.layout.Abstract":[],"Ext.layout.Box":[],"Ext.layout.Card":[],"Ext.layout.Default":[],"Ext.layout.Fit":[],"Ext.layout.FlexBox":[],"Ext.layout.Float":[],"Ext.layout.HBox":[],"Ext.layout.VBox":[],"Ext.layout.wrapper.BoxDock":[],"Ext.layout.wrapper.Dock":[],"Ext.layout.wrapper.Inner":[],"Ext.mixin.Bindable":[],"Ext.mixin.Filterable":[],"Ext.mixin.Mixin":[],"Ext.mixin.Observable":["Ext.util.Observable"],"Ext.mixin.Progressable":[],"Ext.mixin.Selectable":[],"Ext.mixin.Sortable":[],"Ext.mixin.Templatable":[],"Ext.mixin.Traversable":[],"Ext.navigation.Bar":[],"Ext.navigation.View":["Ext.NavigationView"],"Ext.picker.Date":["Ext.DatePicker"],"Ext.picker.Picker":["Ext.Picker"],"Ext.picker.Slot":["Ext.Picker.Slot"],"Ext.plugin.ListPaging":[],"Ext.plugin.PullRefresh":[],"Ext.plugin.SortableList":[],"Ext.scroll.Indicator":["Ext.util.Indicator"],"Ext.scroll.Scroller":[],"Ext.scroll.View":["Ext.util.ScrollView"],"Ext.scroll.indicator.Abstract":[],"Ext.scroll.indicator.CssTransform":[],"Ext.scroll.indicator.Rounded":[],"Ext.scroll.indicator.ScrollPosition":[],"Ext.slider.Slider":[],"Ext.slider.Thumb":[],"Ext.slider.Toggle":[],"Ext.tab.Bar":["Ext.TabBar"],"Ext.tab.Panel":["Ext.TabPanel"],"Ext.tab.Tab":["Ext.Tab"],"Ext.table.Cell":[],"Ext.table.Row":[],"Ext.table.Table":[],"Ext.util.AbstractMixedCollection":[],"Ext.util.Audio":[],"Ext.util.Collection":[],"Ext.util.DelayedTask":[],"Ext.util.Draggable":[],"Ext.util.Droppable":[],"Ext.util.Filter":[],"Ext.util.Format":[],"Ext.util.Geolocation":["Ext.util.GeoLocation"],"Ext.util.Grouper":[],"Ext.util.HashMap":[],"Ext.util.Inflector":[],"Ext.util.InputBlocker":[],"Ext.util.LineSegment":[],"Ext.util.MixedCollection":[],"Ext.util.Offset":[],"Ext.util.PaintMonitor":[],"Ext.util.Point":[],"Ext.util.PositionMap":[],"Ext.util.Region":[],"Ext.util.SizeMonitor":[],"Ext.util.Sortable":[],"Ext.util.Sorter":[],"Ext.util.TapRepeater":[],"Ext.util.Translatable":[],"Ext.util.TranslatableGroup":[],"Ext.util.TranslatableList":[],"Ext.util.Wrapper":[],"Ext.util.paintmonitor.Abstract":[],"Ext.util.paintmonitor.CssAnimation":[],"Ext.util.paintmonitor.OverflowChange":[],"Ext.util.sizemonitor.Abstract":[],"Ext.util.sizemonitor.Default":[],"Ext.util.sizemonitor.OverflowChange":[],"Ext.util.sizemonitor.Scroll":[],"Ext.util.translatable.Abstract":[],"Ext.util.translatable.CssPosition":[],"Ext.util.translatable.CssTransform":[],"Ext.util.translatable.Dom":[],"Ext.util.translatable.ScrollPosition":[],"Ext.ux.ActionOverFlowMenuButton":[],"Ext.ux.ApplicationMenu":[],"Ext.ux.ContextMenu":[],"Ext.ux.MenuButton":[],"Ext.ux.TabMenuButton":[],"Ext.ux.device.Analytics":[],"Ext.ux.device.Twitter":[],"Ext.ux.device.analytics.Abstract":[],"Ext.ux.device.analytics.Cordova":[],"Ext.ux.device.twitter.Abstract":[],"Ext.ux.device.twitter.Cordova":[],"Ext.ux.parse.Helper":["ParseHelper"],"Ext.ux.parse.Model":[],"Ext.ux.parse.Proxy":[],"Ext.ux.parse.Reader":[],"Ext.ux.parse.Store":[],"Ext.ux.parse.association.Pointer":[],"Ext.ux.parse.association.Relation":[],"Ext.viewport.AndroidStock":["Ext.viewport.Android"],"Ext.viewport.Default":[],"Ext.viewport.Ios":[],"Ext.viewport.Viewport":[],"Ext.viewport.WindowsPhone":["Ext.viewport.WP"]});Ext.ClassManager.addNameAliasMappings({"Ext.AbstractComponent":[],"Ext.AbstractManager":[],"Ext.AbstractPlugin":[],"Ext.ActionSheet":["widget.actionsheet"],"Ext.Ajax":[],"Ext.Anim":[],"Ext.AnimationQueue":[],"Ext.Audio":["widget.audio"],"Ext.BingMap":["widget.bingmap"],"Ext.Button":["widget.button"],"Ext.Component":["widget.component"],"Ext.ComponentManager":[],"Ext.ComponentQuery":[],"Ext.Container":["widget.container"],"Ext.Decorator":[],"Ext.Evented":[],"Ext.Img":["widget.image","widget.img"],"Ext.ItemCollection":[],"Ext.Label":["widget.label"],"Ext.LoadMask":["widget.loadmask"],"Ext.Map":["widget.map"],"Ext.Mask":["widget.mask"],"Ext.Media":["widget.media"],"Ext.Menu":["widget.menu"],"Ext.MessageBox":[],"Ext.Panel":["widget.panel"],"Ext.ProgressIndicator":["widget.progressindicator"],"Ext.Promise":[],"Ext.SegmentedButton":["widget.segmentedbutton"],"Ext.Sheet":["widget.sheet"],"Ext.Sortable":[],"Ext.Spacer":["widget.spacer"],"Ext.TaskQueue":[],"Ext.Template":[],"Ext.Title":["widget.title"],"Ext.TitleBar":["widget.titlebar"],"Ext.Toast":[],"Ext.Toolbar":["widget.toolbar"],"Ext.Video":["widget.video"],"Ext.XTemplate":[],"Ext.XTemplateCompiler":[],"Ext.XTemplateParser":[],"Ext.app.Action":[],"Ext.app.Application":[],"Ext.app.Controller":[],"Ext.app.History":[],"Ext.app.Profile":[],"Ext.app.Route":[],"Ext.app.Router":[],"Ext.behavior.Behavior":[],"Ext.behavior.Draggable":[],"Ext.behavior.Scrollable":[],"Ext.behavior.Translatable":[],"Ext.carousel.Carousel":["widget.carousel"],"Ext.carousel.Indicator":["widget.carouselindicator"],"Ext.carousel.Infinite":[],"Ext.carousel.Item":[],"Ext.data.ArrayStore":["store.array"],"Ext.data.Batch":[],"Ext.data.Connection":[],"Ext.data.DirectStore":["store.direct"],"Ext.data.Error":[],"Ext.data.Errors":[],"Ext.data.Field":["data.field"],"Ext.data.JsonP":[],"Ext.data.JsonStore":["store.json"],"Ext.data.Model":[],"Ext.data.ModelManager":[],"Ext.data.NodeInterface":[],"Ext.data.NodeStore":["store.node"],"Ext.data.Operation":[],"Ext.data.Request":[],"Ext.data.ResultSet":[],"Ext.data.SortTypes":[],"Ext.data.Store":["store.store"],"Ext.data.StoreManager":[],"Ext.data.TreeStore":["store.tree"],"Ext.data.Types":[],"Ext.data.Validations":[],"Ext.data.association.Association":[],"Ext.data.association.BelongsTo":["association.belongsto"],"Ext.data.association.HasMany":["association.hasmany"],"Ext.data.association.HasOne":["association.hasone"],"Ext.data.identifier.Sequential":["data.identifier.sequential"],"Ext.data.identifier.Simple":["data.identifier.simple"],"Ext.data.identifier.Uuid":["data.identifier.uuid"],"Ext.data.proxy.Ajax":["proxy.ajax"],"Ext.data.proxy.Client":[],"Ext.data.proxy.Direct":["proxy.direct"],"Ext.data.proxy.JsonP":["proxy.jsonp","proxy.scripttag"],"Ext.data.proxy.LocalStorage":["proxy.localstorage"],"Ext.data.proxy.Memory":["proxy.memory"],"Ext.data.proxy.Proxy":["proxy.proxy"],"Ext.data.proxy.Rest":["proxy.rest"],"Ext.data.proxy.Server":["proxy.server"],"Ext.data.proxy.SessionStorage":["proxy.sessionstorage"],"Ext.data.proxy.Sql":["proxy.sql"],"Ext.data.proxy.WebStorage":[],"Ext.data.reader.Array":["reader.array"],"Ext.data.reader.Json":["reader.json"],"Ext.data.reader.Reader":[],"Ext.data.reader.Xml":["reader.xml"],"Ext.data.writer.Json":["writer.json"],"Ext.data.writer.Writer":["writer.base"],"Ext.data.writer.Xml":["writer.xml"],"Ext.dataview.DataView":["widget.dataview"],"Ext.dataview.IndexBar":[],"Ext.dataview.List":["widget.list"],"Ext.dataview.ListItemHeader":["widget.listitemheader"],"Ext.dataview.NestedList":["widget.nestedlist"],"Ext.dataview.component.Container":[],"Ext.dataview.component.DataItem":["widget.dataitem"],"Ext.dataview.component.ListItem":["widget.listitem"],"Ext.dataview.component.SimpleListItem":["widget.simplelistitem"],"Ext.dataview.element.Container":[],"Ext.dataview.element.List":[],"Ext.device.Accelerometer":[],"Ext.device.Browser":[],"Ext.device.Camera":[],"Ext.device.Capture":[],"Ext.device.Communicator":[],"Ext.device.Compass":[],"Ext.device.Connection":[],"Ext.device.Contacts":[],"Ext.device.Device":[],"Ext.device.FileSystem":[],"Ext.device.Geolocation":[],"Ext.device.Globalization":[],"Ext.device.Media":[],"Ext.device.Notification":[],"Ext.device.Orientation":[],"Ext.device.Purchases":[],"Ext.device.Purchases.Product":[],"Ext.device.Push":[],"Ext.device.SQLite":[],"Ext.device.Splashscreen":[],"Ext.device.Storage":[],"Ext.device.Tunnel":[],"Ext.device.accelerometer.Abstract":[],"Ext.device.accelerometer.Cordova":[],"Ext.device.accelerometer.Simulator":[],"Ext.device.browser.Abstract":[],"Ext.device.browser.Cordova":[],"Ext.device.browser.Simulator":[],"Ext.device.browser.Window":[],"Ext.device.camera.Abstract":[],"Ext.device.camera.Cordova":[],"Ext.device.camera.Sencha":[],"Ext.device.camera.Simulator":[],"Ext.device.capture.Abstract":[],"Ext.device.capture.Cordova":[],"Ext.device.communicator.Android":[],"Ext.device.communicator.Default":[],"Ext.device.compass.Abstract":[],"Ext.device.compass.Cordova":[],"Ext.device.compass.Simulator":[],"Ext.device.connection.Abstract":[],"Ext.device.connection.Cordova":[],"Ext.device.connection.Sencha":[],"Ext.device.connection.Simulator":[],"Ext.device.contacts.Abstract":[],"Ext.device.contacts.Cordova":[],"Ext.device.contacts.Sencha":[],"Ext.device.device.Abstract":[],"Ext.device.device.Cordova":[],"Ext.device.device.Sencha":[],"Ext.device.device.Simulator":[],"Ext.device.filesystem.Abstract":[],"Ext.device.filesystem.Chrome":[],"Ext.device.filesystem.Cordova":[],"Ext.device.filesystem.DirectoryEntry":[],"Ext.device.filesystem.Entry":[],"Ext.device.filesystem.FileEntry":[],"Ext.device.filesystem.FileSystem":[],"Ext.device.filesystem.HTML5":[],"Ext.device.filesystem.Sencha":[],"Ext.device.filesystem.Simulator":[],"Ext.device.geolocation.Abstract":[],"Ext.device.geolocation.Cordova":[],"Ext.device.geolocation.Sencha":[],"Ext.device.geolocation.Simulator":[],"Ext.device.globalization.Abstract":[],"Ext.device.globalization.Cordova":[],"Ext.device.globalization.Simulator":[],"Ext.device.media.Abstract":[],"Ext.device.media.Cordova":[],"Ext.device.notification.Abstract":[],"Ext.device.notification.Cordova":[],"Ext.device.notification.Sencha":[],"Ext.device.notification.Simulator":[],"Ext.device.orientation.Abstract":[],"Ext.device.orientation.HTML5":[],"Ext.device.orientation.Sencha":[],"Ext.device.purchases.Purchase":[],"Ext.device.purchases.Sencha":[],"Ext.device.push.Abstract":[],"Ext.device.push.Cordova":[],"Ext.device.push.Sencha":[],"Ext.device.splashscreen.Abstract":[],"Ext.device.splashscreen.Cordova":[],"Ext.device.splashscreen.Simulator":[],"Ext.device.sqlite.Database":[],"Ext.device.sqlite.SQLResultSet":[],"Ext.device.sqlite.SQLResultSetRowList":[],"Ext.device.sqlite.SQLTransaction":[],"Ext.device.sqlite.Sencha":[],"Ext.device.storage.Abstract":[],"Ext.device.storage.Cordova":[],"Ext.device.storage.HTML5.Database":[],"Ext.device.storage.HTML5.HTML5":[],"Ext.device.storage.HTML5.SQLStatement":[],"Ext.device.storage.Simulator":[],"Ext.device.tunnel.Abstract":[],"Ext.device.tunnel.Connection":[],"Ext.device.tunnel.Sencha":[],"Ext.device.tunnel.Simulator":[],"Ext.direct.Event":["direct.event"],"Ext.direct.ExceptionEvent":["direct.exception"],"Ext.direct.JsonProvider":["direct.jsonprovider"],"Ext.direct.Manager":[],"Ext.direct.PollingProvider":["direct.pollingprovider"],"Ext.direct.Provider":["direct.provider"],"Ext.direct.RemotingEvent":["direct.rpc"],"Ext.direct.RemotingMethod":[],"Ext.direct.RemotingProvider":["direct.remotingprovider"],"Ext.direct.Transaction":["direct.transaction"],"Ext.dom.CompositeElement":[],"Ext.event.Controller":[],"Ext.event.Dispatcher":[],"Ext.event.Dom":[],"Ext.event.Event":[],"Ext.event.ListenerStack":[],"Ext.event.Touch":[],"Ext.event.publisher.ComponentDelegation":[],"Ext.event.publisher.ComponentPaint":[],"Ext.event.publisher.ComponentSize":[],"Ext.event.publisher.Dom":[],"Ext.event.publisher.ElementPaint":[],"Ext.event.publisher.ElementSize":[],"Ext.event.publisher.Publisher":[],"Ext.event.publisher.TouchGesture":[],"Ext.event.recognizer.DoubleTap":[],"Ext.event.recognizer.Drag":[],"Ext.event.recognizer.EdgeSwipe":[],"Ext.event.recognizer.HorizontalSwipe":[],"Ext.event.recognizer.LongPress":[],"Ext.event.recognizer.MultiTouch":[],"Ext.event.recognizer.Pinch":[],"Ext.event.recognizer.Recognizer":[],"Ext.event.recognizer.Rotate":[],"Ext.event.recognizer.SingleTouch":[],"Ext.event.recognizer.Swipe":[],"Ext.event.recognizer.Tap":[],"Ext.event.recognizer.Touch":[],"Ext.event.recognizer.VerticalSwipe":[],"Ext.field.Checkbox":["widget.checkboxfield"],"Ext.field.DatePicker":["widget.datepickerfield"],"Ext.field.DatePickerNative":["widget.datepickernativefield"],"Ext.field.Email":["widget.emailfield"],"Ext.field.Field":["widget.field"],"Ext.field.File":["widget.filefield"],"Ext.field.FileInput":["widget.fileinput"],"Ext.field.Hidden":["widget.hiddenfield"],"Ext.field.Input":["widget.input"],"Ext.field.Number":["widget.numberfield"],"Ext.field.Password":["widget.passwordfield"],"Ext.field.Radio":["widget.radiofield"],"Ext.field.Search":["widget.searchfield"],"Ext.field.Select":["widget.selectfield"],"Ext.field.Slider":["widget.sliderfield"],"Ext.field.Spinner":["widget.spinnerfield"],"Ext.field.Text":["widget.textfield"],"Ext.field.TextArea":["widget.textareafield"],"Ext.field.TextAreaInput":["widget.textareainput"],"Ext.field.Toggle":["widget.togglefield"],"Ext.field.Url":["widget.urlfield"],"Ext.form.FieldSet":["widget.fieldset"],"Ext.form.Panel":["widget.formpanel"],"Ext.fx.Animation":[],"Ext.fx.Easing":[],"Ext.fx.Runner":[],"Ext.fx.State":[],"Ext.fx.animation.Abstract":[],"Ext.fx.animation.Cube":["animation.cube"],"Ext.fx.animation.Fade":["animation.fade","animation.fadeIn"],"Ext.fx.animation.FadeOut":["animation.fadeOut"],"Ext.fx.animation.Flip":["animation.flip"],"Ext.fx.animation.Pop":["animation.pop","animation.popIn"],"Ext.fx.animation.PopOut":["animation.popOut"],"Ext.fx.animation.Slide":["animation.slide","animation.slideIn"],"Ext.fx.animation.SlideOut":["animation.slideOut"],"Ext.fx.animation.Wipe":[],"Ext.fx.animation.WipeOut":[],"Ext.fx.easing.Abstract":[],"Ext.fx.easing.Bounce":[],"Ext.fx.easing.BoundMomentum":[],"Ext.fx.easing.EaseIn":["easing.ease-in"],"Ext.fx.easing.EaseOut":["easing.ease-out"],"Ext.fx.easing.Linear":["easing.linear"],"Ext.fx.easing.Momentum":[],"Ext.fx.layout.Card":[],"Ext.fx.layout.card.Abstract":[],"Ext.fx.layout.card.Cover":["fx.layout.card.cover"],"Ext.fx.layout.card.Cube":["fx.layout.card.cube"],"Ext.fx.layout.card.Fade":["fx.layout.card.fade"],"Ext.fx.layout.card.Flip":["fx.layout.card.flip"],"Ext.fx.layout.card.Pop":["fx.layout.card.pop"],"Ext.fx.layout.card.Reveal":["fx.layout.card.reveal"],"Ext.fx.layout.card.Scroll":["fx.layout.card.scroll"],"Ext.fx.layout.card.ScrollCover":["fx.layout.card.scrollcover"],"Ext.fx.layout.card.ScrollReveal":["fx.layout.card.scrollreveal"],"Ext.fx.layout.card.Slide":["fx.layout.card.slide"],"Ext.fx.layout.card.Style":[],"Ext.fx.runner.Css":[],"Ext.fx.runner.CssAnimation":[],"Ext.fx.runner.CssTransition":[],"Ext.layout.Abstract":[],"Ext.layout.Box":["layout.tablebox"],"Ext.layout.Card":["layout.card"],"Ext.layout.Default":["layout.auto","layout.default"],"Ext.layout.Fit":["layout.fit"],"Ext.layout.FlexBox":["layout.box"],"Ext.layout.Float":["layout.float"],"Ext.layout.HBox":["layout.hbox"],"Ext.layout.VBox":["layout.vbox"],"Ext.layout.wrapper.BoxDock":[],"Ext.layout.wrapper.Dock":[],"Ext.layout.wrapper.Inner":[],"Ext.mixin.Bindable":[],"Ext.mixin.Filterable":[],"Ext.mixin.Mixin":[],"Ext.mixin.Observable":[],"Ext.mixin.Progressable":[],"Ext.mixin.Selectable":[],"Ext.mixin.Sortable":[],"Ext.mixin.Templatable":[],"Ext.mixin.Traversable":[],"Ext.navigation.Bar":[],"Ext.navigation.View":["widget.navigationview"],"Ext.picker.Date":["widget.datepicker"],"Ext.picker.Picker":["widget.picker"],"Ext.picker.Slot":["widget.pickerslot"],"Ext.plugin.ListPaging":["plugin.listpaging"],"Ext.plugin.PullRefresh":["plugin.pullrefresh"],"Ext.plugin.SortableList":["plugin.sortablelist"],"Ext.scroll.Indicator":[],"Ext.scroll.Scroller":[],"Ext.scroll.View":[],"Ext.scroll.indicator.Abstract":[],"Ext.scroll.indicator.CssTransform":[],"Ext.scroll.indicator.Rounded":[],"Ext.scroll.indicator.ScrollPosition":[],"Ext.slider.Slider":["widget.slider"],"Ext.slider.Thumb":["widget.thumb"],"Ext.slider.Toggle":[],"Ext.tab.Bar":["widget.tabbar"],"Ext.tab.Panel":["widget.tabpanel"],"Ext.tab.Tab":["widget.tab"],"Ext.table.Cell":["widget.tablecell"],"Ext.table.Row":["widget.tablerow"],"Ext.table.Table":["widget.table"],"Ext.util.AbstractMixedCollection":[],"Ext.util.Audio":[],"Ext.util.Collection":[],"Ext.util.DelayedTask":[],"Ext.util.Draggable":[],"Ext.util.Droppable":[],"Ext.util.Filter":[],"Ext.util.Format":[],"Ext.util.Geolocation":[],"Ext.util.Grouper":[],"Ext.util.HashMap":[],"Ext.util.Inflector":[],"Ext.util.InputBlocker":[],"Ext.util.LineSegment":[],"Ext.util.MixedCollection":[],"Ext.util.Offset":[],"Ext.util.PaintMonitor":[],"Ext.util.Point":[],"Ext.util.PositionMap":[],"Ext.util.Region":[],"Ext.util.SizeMonitor":[],"Ext.util.Sortable":[],"Ext.util.Sorter":[],"Ext.util.TapRepeater":[],"Ext.util.Translatable":[],"Ext.util.TranslatableGroup":[],"Ext.util.TranslatableList":[],"Ext.util.Wrapper":[],"Ext.util.paintmonitor.Abstract":[],"Ext.util.paintmonitor.CssAnimation":[],"Ext.util.paintmonitor.OverflowChange":[],"Ext.util.sizemonitor.Abstract":[],"Ext.util.sizemonitor.Default":[],"Ext.util.sizemonitor.OverflowChange":[],"Ext.util.sizemonitor.Scroll":[],"Ext.util.translatable.Abstract":[],"Ext.util.translatable.CssPosition":[],"Ext.util.translatable.CssTransform":[],"Ext.util.translatable.Dom":[],"Ext.util.translatable.ScrollPosition":[],"Ext.ux.ActionOverFlowMenuButton":[],"Ext.ux.ApplicationMenu":[],"Ext.ux.ContextMenu":[],"Ext.ux.MenuButton":[],"Ext.ux.TabMenuButton":[],"Ext.ux.device.Analytics":[],"Ext.ux.device.Twitter":[],"Ext.ux.device.analytics.Abstract":[],"Ext.ux.device.analytics.Cordova":[],"Ext.ux.device.twitter.Abstract":[],"Ext.ux.device.twitter.Cordova":[],"Ext.ux.parse.Helper":[],"Ext.ux.parse.Model":[],"Ext.ux.parse.Proxy":["proxy.parse"],"Ext.ux.parse.Reader":["reader.parse"],"Ext.ux.parse.Store":[],"Ext.ux.parse.association.Pointer":["association.pointer"],"Ext.ux.parse.association.Relation":["association.relation"],"Ext.viewport.AndroidStock":[],"Ext.viewport.Default":["widget.viewport"],"Ext.viewport.Ios":[],"Ext.viewport.Viewport":[],"Ext.viewport.WindowsPhone":[]}); \ No newline at end of file diff --git a/vendor/touch/src/chart/AbstractChart.js b/vendor/touch/src/chart/AbstractChart.js new file mode 100644 index 000000000..339695e67 --- /dev/null +++ b/vendor/touch/src/chart/AbstractChart.js @@ -0,0 +1,1313 @@ +/** + * The Ext.chart package provides the capability to visualize data. + * Each chart binds directly to an {@link Ext.data.Store} enabling automatic updates of the chart. + * A chart configuration object has some overall styling options as well as an array of axes + * and series. A chart instance example could look like: + * + * new Ext.chart.CartesianChart({ + * width: 800, + * height: 600, + * animate: true, + * store: store1, + * legend: { + * position: 'right' + * }, + * axes: [ + * // ...some axes options... + * ], + * series: [ + * // ...some series options... + * ] + * }); + * + * In this example we set the `width` and `height` of a cartesian chart; We decide whether our series are + * animated or not and we select a store to be bound to the chart; We also set the legend to the right part of the + * chart. + * + * You can register certain interactions such as {@link Ext.chart.interactions.PanZoom} on the chart by specify an + * array of names or more specific config objects. All the events will be wired automatically. + * + * You can also listen to `itemXXX` events directly on charts. That case all the contained series will relay this event to the + * chart. + * + * For more information about the axes and series configurations please check the documentation of + * each series (Line, Bar, Pie, etc). + * + */ + +Ext.define('Ext.chart.AbstractChart', { + + extend: 'Ext.draw.Component', + + requires: [ + 'Ext.chart.series.Series', + 'Ext.chart.interactions.Abstract', + 'Ext.chart.axis.Axis', + 'Ext.data.StoreManager', + 'Ext.chart.Legend', + 'Ext.data.Store', + 'Ext.draw.engine.SvgExporter' + ], + /** + * @event beforerefresh + * Fires before a refresh to the chart data is called. If the `beforerefresh` handler returns + * `false` the {@link #refresh} action will be canceled. + * @param {Ext.chart.AbstractChart} this + */ + + /** + * @event refresh + * Fires after the chart data has been refreshed. + * @param {Ext.chart.AbstractChart} this + */ + + /** + * @event redraw + * Fires after the chart is redrawn. + * @param {Ext.chart.AbstractChart} this + */ + + /** + * @event itemmousemove + * Fires when the mouse is moved on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemmouseup + * Fires when a mouseup event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemmousedown + * Fires when a mousedown event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemmouseover + * Fires when the mouse enters a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemmouseout + * Fires when the mouse exits a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemclick + * Fires when a click event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemdoubleclick + * Fires when a doubleclick event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemtap + * Fires when a tap event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemtapstart + * Fires when a tapstart event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemtapend + * Fires when a tapend event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemtapcancel + * Fires when a tapcancel event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemtaphold + * Fires when a taphold event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemdoubletap + * Fires when a doubletap event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemsingletap + * Fires when a singletap event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemtouchstart + * Fires when a touchstart event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemtouchmove + * Fires when a touchmove event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemtouchend + * Fires when a touchend event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemdragstart + * Fires when a dragstart event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemdrag + * Fires when a drag event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemdragend + * Fires when a dragend event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itempinchstart + * Fires when a pinchstart event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itempinch + * Fires when a pinch event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itempinchend + * Fires when a pinchend event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + /** + * @event itemswipe + * Fires when a swipe event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + + /** + * @property version Current Version of Touch Charts + * @type {String} + */ + version: '2.0.0', + + // @ignore + viewBox: false, + + delegationRegex: /^item([a-z]+)$/i, + + domEvents: /click|focus|blur|paste|input|mousemove|mousedown|mouseup|mouseover|mouseout|keyup|keydown|keypress|submit|pinch|pinchstart|pinchend|touchstart|touchend|rotate|rotatestart|rotateend|drag|dragstart|dragend|tap|doubletap|singletap/, + + config: { + + /** + * @cfg {Ext.data.Store} store + * The store that supplies data to this chart. + */ + store: null, + + /** + * @cfg {Boolean/Object} shadow (optional) `true` for the default shadow configuration `{shadowOffsetX: 2, shadowOffsetY: 2, shadowBlur: 3, shadowColor: '#444'}` + * or a standard shadow config object to be used for default chart shadows. + */ + shadow: false, + + /** + * @cfg {Boolean/Object} animate (optional) `true` for the default animation (easing: 'ease' and duration: 500) + * or a standard animation config object to be used for default chart animations. + */ + animate: true, + + /** + * @cfg {Ext.chart.series.Series/Array} series + * Array of {@link Ext.chart.series.Series Series} instances or config objects. For example: + * + * series: [{ + * type: 'column', + * axis: 'left', + * listeners: { + * 'afterrender': function() { + * console.log('afterrender'); + * } + * }, + * xField: 'category', + * yField: 'data1' + * }] + */ + series: [], + + /** + * @cfg {Ext.chart.axis.Axis/Array/Object} axes + * Array of {@link Ext.chart.axis.Axis Axis} instances or config objects. For example: + * + * axes: [{ + * type: 'numeric', + * position: 'left', + * title: 'Number of Hits', + * minimum: 0 + * }, { + * type: 'category', + * position: 'bottom', + * title: 'Month of the Year' + * }] + */ + axes: [], + + /** + * @cfg {Ext.chart.Legend/Object} legend + */ + legend: null, + + /** + * @cfg {Boolean/Array} colors Array of colors/gradients to override the color of items and legends. + */ + colors: null, + + /** + * @cfg {Object|Number} insetPadding The amount of inset padding in pixels for the chart. Inset padding is + * the padding from the boundary of the chart to any of its contents. + * @cfg {Number} insetPadding.top + */ + insetPadding: { + top: 10, + left: 10, + right: 10, + bottom: 10 + }, + + /** + * @cfg {Object} innerPadding The amount of inner padding in pixel. Inner padding is the padding from + * axis to the series. + */ + innerPadding: { + top: 0, + left: 0, + right: 0, + bottom: 0 + }, + + /** + * @cfg {Object} background Set the chart background. This can be a gradient object, image, or color. + * + * For example, if `background` were to be a color we could set the object as + * + * background: { + * //color string + * fill: '#ccc' + * } + * + * You can specify an image by using: + * + * background: { + * image: 'http://path.to.image/' + * } + * + * Also you can specify a gradient by using the gradient object syntax: + * + * background: { + * gradient: { + * type: 'linear', + * angle: 45, + * stops: { + * 0: { + * color: '#555' + * }, + * 100: { + * color: '#ddd' + * } + * } + * } + * } + */ + background: null, + + /** + * @cfg {Array} interactions + * Interactions are optional modules that can be plugged in to a chart to allow the user to interact + * with the chart and its data in special ways. The `interactions` config takes an Array of Object + * configurations, each one corresponding to a particular interaction class identified by a `type` property: + * + * new Ext.chart.AbstractChart({ + * renderTo: Ext.getBody(), + * width: 800, + * height: 600, + * store: store1, + * axes: [ + * // ...some axes options... + * ], + * series: [ + * // ...some series options... + * ], + * interactions: [{ + * type: 'interactiontype' + * // ...additional configs for the interaction... + * }] + * }); + * + * When adding an interaction which uses only its default configuration (no extra properties other than `type`), + * you can alternately specify only the type as a String rather than the full Object: + * + * interactions: ['reset', 'rotate'] + * + * The current supported interaction types include: + * + * - {@link Ext.chart.interactions.PanZoom panzoom} - allows pan and zoom of axes + * - {@link Ext.chart.interactions.ItemHighlight itemhighlight} - allows highlighting of series data points + * - {@link Ext.chart.interactions.ItemInfo iteminfo} - allows displaying details of a data point in a popup panel + * - {@link Ext.chart.interactions.Rotate rotate} - allows rotation of pie and radar series + * + * See the documentation for each of those interaction classes to see how they can be configured. + * + * Additional custom interactions can be registered using `'interactions.'` alias prefix. + */ + interactions: [], + + /** + * @private + * The main region of the chart. + */ + mainRegion: null, + + /** + * @private + * Override value + */ + autoSize: false, + + /** + * @private + * Override value + */ + viewBox: false, + + /** + * @private + * Override value + */ + fitSurface: false, + + /** + * @private + * Override value + */ + resizeHandler: null, + + /** + * @readonly + * @cfg {Object} highlightItem + * The current highlight item in the chart. + * The object must be the one that you get from item events. + * + * Note that series can also own highlight items. + * This notion is separate from this one and should not be used at the same time. + */ + highlightItem: null + }, + + /** + * @private + */ + resizing: 0, + + /** + * Toggle for chart interactions that require animation to be suspended. + * @private + */ + animationSuspended: 0, + + /** + * @private The z-indexes to use for the various surfaces + */ + surfaceZIndexes: { + main: 0, + grid: 1, + series: 2, + axis: 3, + overlay: 4, + events: 5 + }, + + animating: 0, + + layoutSuspended: 0, + + applyAnimate: function (newAnimate, oldAnimate) { + if (!newAnimate) { + newAnimate = { + duration: 0 + }; + } else if (newAnimate === true) { + newAnimate = { + easing: 'easeInOut', + duration: 500 + }; + } + if (!oldAnimate) { + return newAnimate; + } else { + oldAnimate = Ext.apply({}, newAnimate, oldAnimate); + } + return oldAnimate; + }, + + applyInsetPadding: function (padding, oldPadding) { + if (Ext.isNumber(padding)) { + return { + top: padding, + left: padding, + right: padding, + bottom: padding + }; + } else if (!oldPadding) { + return padding; + } else { + return Ext.apply(oldPadding, padding); + } + }, + + applyInnerPadding: function (padding, oldPadding) { + if (Ext.isNumber(padding)) { + return { + top: padding, + left: padding, + right: padding, + bottom: padding + }; + } else if (!oldPadding) { + return padding; + } else { + return Ext.apply(oldPadding, padding); + } + }, + + suspendAnimation: function () { + this.animationSuspended++; + if (this.animationSuspended === 1) { + var series = this.getSeries(), i = -1, n = series.length; + while (++i < n) { + //update animation config to not animate + series[i].setAnimate(this.getAnimate()); + } + } + }, + + resumeAnimation: function () { + this.animationSuspended--; + if (this.animationSuspended === 0) { + var series = this.getSeries(), i = -1, n = series.length; + while (++i < n) { + //update animation config to animate + series[i].setAnimate(this.getAnimate()); + } + } + }, + + suspendLayout: function () { + this.layoutSuspended++; + if (this.layoutSuspended === 1) { + if (this.scheduledLayoutId) { + this.layoutInSuspension = true; + this.cancelLayout(); + } else { + this.layoutInSuspension = false; + } + } + }, + + resumeLayout: function () { + this.layoutSuspended--; + if (this.layoutSuspended === 0) { + if (this.layoutInSuspension) { + this.scheduleLayout(); + } + } + }, + + /** + * Cancel a scheduled layout. + */ + cancelLayout: function () { + if (this.scheduledLayoutId) { + Ext.draw.Animator.cancel(this.scheduledLayoutId); + this.scheduledLayoutId = null; + } + }, + + /** + * Schedule a layout at next frame. + */ + scheduleLayout: function () { + if (!this.scheduledLayoutId) { + this.scheduledLayoutId = Ext.draw.Animator.schedule('doScheduleLayout', this); + } + }, + + doScheduleLayout: function () { + if (this.layoutSuspended) { + this.layoutInSuspension = true; + } else { + this.performLayout(); + } + }, + + getAnimate: function () { + if (this.resizing || this.animationSuspended) { + return { + duration: 0 + }; + } else { + return this._animate; + } + }, + + constructor: function () { + var me = this; + me.itemListeners = {}; + me.surfaceMap = {}; + me.legendStore = new Ext.data.Store({ + storeId: this.getId() + '-legendStore', + autoDestroy: true, + fields: [ + 'id', 'name', 'mark', 'disabled', 'series', 'index' + ] + }); + me.suspendLayout(); + me.callSuper(arguments); + me.refreshLegendStore(); + me.getLegendStore().on('updaterecord', 'onUpdateLegendStore', me); + me.resumeLayout(); + }, + + /** + * Return the legend store that contains all the legend information. These + * information are collected from all the series. + * @return {Ext.data.Store} + */ + getLegendStore: function () { + return this.legendStore; + }, + + refreshLegendStore: function () { + if (this.getLegendStore()) { + var i, ln, + series = this.getSeries(), seriesItem, + legendData = []; + if (series) { + for (i = 0, ln = series.length; i < ln; i++) { + seriesItem = series[i]; + if (seriesItem.getShowInLegend()) { + seriesItem.provideLegendInfo(legendData); + } + } + } + this.getLegendStore().setData(legendData); + } + }, + + resetLegendStore: function () { + if (this.getLegendStore()) { + var data = this.getLegendStore().getData().items, + i, ln = data.length, + record; + for (i = 0; i < ln; i++) { + record = data[i]; + record.beginEdit(); + record.set('disabled', false); + record.commit(); + } + } + }, + + onUpdateLegendStore: function (store, record) { + var series = this.getSeries(), seriesItem; + if (record && series) { + seriesItem = series.map[record.get('series')]; + if (seriesItem) { + seriesItem.setHiddenByIndex(record.get('index'), record.get('disabled')); + this.redraw(); + } + } + }, + + initialize: function () { + var me = this; + me.callSuper(); + me.getSurface('main'); + me.getSurface('overlay-surface', 'overlay').waitFor(me.getSurface('series-surface', 'series')); + }, + + resizeHandler: function (size) { + var me = this; + me.scheduleLayout(); + return false; + }, + + applyMainRegion: function (newRegion, region) { + if (!region) { + return newRegion; + } + this.getSeries(); + this.getAxes(); + if (newRegion[0] === region[0] && + newRegion[1] === region[1] && + newRegion[2] === region[2] && + newRegion[3] === region[3]) { + return region; + } else { + return newRegion; + } + }, + + getSurface: function (name, type) { + name = name || 'main'; + type = type || name; + var me = this, + surface = this.callSuper([name]), + zIndexes = me.surfaceZIndexes; + if (type in zIndexes) { + surface.element.setStyle('zIndex', zIndexes[type]); + } + if (!me.surfaceMap[type]) { + me.surfaceMap[type] = []; + } + surface.type = type; + me.surfaceMap[type].push(surface); + return surface; + }, + + updateColors: function (colors) { + var series = this.getSeries(), + seriesCount = series && series.length, + seriesItem; + for (var i = 0; i < seriesCount; i++) { + seriesItem = series[i]; + if (!seriesItem.getColors()) { + seriesItem.updateColors(colors); + } + } + }, + + applyAxes: function (newAxes, oldAxes) { + this.resizing++; + try { + if (!oldAxes) { + oldAxes = []; + oldAxes.map = {}; + } + var result = [], i, ln, axis, oldAxis, oldMap = oldAxes.map; + result.map = {}; + newAxes = Ext.Array.from(newAxes, true); + for (i = 0, ln = newAxes.length; i < ln; i++) { + axis = newAxes[i]; + if (!axis) { + continue; + } + axis = Ext.factory(axis, null, oldAxis = oldMap[axis.getId && axis.getId() || axis.id], 'axis'); + if (axis) { + axis.setChart(this); + result.push(axis); + result.map[axis.getId()] = axis; + if (!oldAxis) { + axis.on('animationstart', 'onAnimationStart', this); + axis.on('animationend', 'onAnimationEnd', this); + } + } + } + + for (i in oldMap) { + if (!result.map[i]) { + oldMap[i].destroy(); + } + } + return result; + } finally { + this.resizing--; + } + }, + + updateAxes: function (newAxes) { + this.scheduleLayout(); + }, + + applySeries: function (newSeries, oldSeries) { + this.resizing++; + try { + this.getAxes(); + if (!oldSeries) { + oldSeries = []; + oldSeries.map = {}; + } + var me = this, + result = [], + i, ln, series, oldMap = oldSeries.map, oldSeriesItem; + result.map = {}; + newSeries = Ext.Array.from(newSeries, true); + for (i = 0, ln = newSeries.length; i < ln; i++) { + series = newSeries[i]; + if (!series) { + continue; + } + oldSeriesItem = oldSeries.map[series.getId && series.getId() || series.id]; + if (series instanceof Ext.chart.series.Series) { + if (oldSeriesItem !== series) { + // Replacing + if (oldSeriesItem) { + oldSeriesItem.destroy(); + } + me.addItemListenersToSeries(series); + } + series.setChart(this); + } else if (Ext.isObject(series)) { + if (oldSeriesItem) { + // Update + oldSeriesItem.setConfig(series); + series = oldSeriesItem; + } else { + // Create a series. + if (Ext.isString(series)) { + series = Ext.create(series.xclass || ("series." + series), {chart: this}); + } else { + series.chart = this; + series = Ext.create(series.xclass || ("series." + series.type), series); + } + series.on('animationstart', 'onAnimationStart', this); + series.on('animationend', 'onAnimationEnd', this); + me.addItemListenersToSeries(series); + } + } + + result.push(series); + result.map[series.getId()] = series; + } + + for (i in oldMap) { + if (!result.map[oldMap[i].getId()]) { + oldMap[i].destroy(); + } + } + return result; + } finally { + this.resizing--; + } + }, + + applyLegend: function (newLegend, oldLegend) { + return Ext.factory(newLegend, Ext.chart.Legend, oldLegend); + }, + + updateLegend: function (legend) { + if (legend) { + // On create + legend.setStore(this.getLegendStore()); + if (!legend.getDocked()) { + legend.setDocked('bottom'); + } + if (this.getParent()) { + this.getParent().add(legend); + } + } + }, + + setParent: function (parent) { + this.callSuper(arguments); + if (parent && this.getLegend()) { + parent.add(this.getLegend()); + } + }, + + updateSeries: function (newSeries, oldSeries) { + this.resizing++; + try { + this.fireEvent('serieschanged', this, newSeries, oldSeries); + this.refreshLegendStore(); + this.scheduleLayout(); + } finally { + this.resizing--; + } + }, + + applyInteractions: function (interactions, oldInteractions) { + if (!oldInteractions) { + oldInteractions = []; + oldInteractions.map = {}; + } + var me = this, + result = [], oldMap = oldInteractions.map, + i, ln, interaction; + result.map = {}; + interactions = Ext.Array.from(interactions, true); + for (i = 0, ln = interactions.length; i < ln; i++) { + interaction = interactions[i]; + if (!interaction) { + continue; + } + interaction = Ext.factory(interaction, null, oldMap[interaction.getId && interaction.getId() || interaction.id], 'interaction'); + if (interaction) { + interaction.setChart(me); + result.push(interaction); + result.map[interaction.getId()] = interaction; + } + } + + for (i in oldMap) { + if (!result.map[oldMap[i]]) { + oldMap[i].destroy(); + } + } + return result; + }, + + applyStore: function (store) { + return Ext.StoreManager.lookup(store); + }, + + updateStore: function (newStore, oldStore) { + var me = this; + if (oldStore) { + oldStore.un('refresh', 'onRefresh', me, null, 'after'); + if (oldStore.autoDestroy) { + oldStore.destroy(); + } + } + if (newStore) { + newStore.on('refresh', 'onRefresh', me, null, 'after'); + } + + me.fireEvent('storechanged', newStore, oldStore); + me.onRefresh(); + }, + + /** + * Redraw the chart. If animations are set this will animate the chart too. + */ + redraw: function () { + this.fireEvent('redraw', this); + }, + + performLayout: function () { + this.cancelLayout(); + }, + + getEventXY: function (e) { + e = (e.changedTouches && e.changedTouches[0]) || e.event || e.browserEvent || e; + var me = this, + xy = me.element.getXY(), + region = me.getMainRegion(); + return [e.pageX - xy[0] - region[0], e.pageY - xy[1] - region[1]]; + }, + + /** + * Given an x/y point relative to the chart, find and return the first series item that + * matches that point. + * @param {Number} x + * @param {Number} y + * @return {Object} An object with `series` and `item` properties, or `false` if no item found. + */ + getItemForPoint: function (x, y) { + var me = this, + i = 0, + items = me.getSeries(), + l = items.length, + series, item; + + for (; i < l; i++) { + series = items[i]; + item = series.getItemForPoint(x, y); + if (item) { + return item; + } + } + + return null; + }, + + /** + * Given an x/y point relative to the chart, find and return all series items that match that point. + * @param {Number} x + * @param {Number} y + * @return {Array} An array of objects with `series` and `item` properties. + */ + getItemsForPoint: function (x, y) { + var me = this, + series = me.getSeries(), + seriesItem, + items = []; + + for (var i = 0; i < series.length; i++) { + seriesItem = series[i]; + var item = seriesItem.getItemForPoint(x, y); + if (item) { + items.push(item); + } + } + + return items; + }, + + /** + * @private + */ + delayThicknessChanged: 0, + + /** + * @private + */ + thicknessChanged: false, + + /** + * Suspend the layout initialized by thickness change + */ + suspendThicknessChanged: function () { + this.delayThicknessChanged++; + }, + + /** + * Resume the layout initialized by thickness change + */ + resumeThicknessChanged: function () { + this.delayThicknessChanged--; + if (this.delayThicknessChanged === 0 && this.thicknessChanged) { + this.onThicknessChanged(); + } + }, + + onAnimationStart: function () { + this.fireEvent('animationstart', this); + }, + + onAnimationEnd: function () { + this.fireEvent('animationend', this); + }, + + onThicknessChanged: function () { + if (this.delayThicknessChanged === 0) { + this.thicknessChanged = false; + this.performLayout(); + } else { + this.thicknessChanged = true; + } + }, + + /** + * @private + */ + onRefresh: function () { + var region = this.getMainRegion(), + axes = this.getAxes(), + store = this.getStore(), + series = this.getSeries(); + if (!store || !axes || !series || !region) { + return; + } + this.redraw(); + }, + + /** + * Changes the data store bound to this chart and refreshes it. + * @param {Ext.data.Store} store The store to bind to this chart. + */ + bindStore: function (store) { + this.setStore(store); + }, + + applyHighlightItem: function (newHighlightItem, oldHighlightItem) { + if (newHighlightItem === oldHighlightItem) { + return; + } + if (Ext.isObject(newHighlightItem) && Ext.isObject(oldHighlightItem)) { + if (newHighlightItem.sprite === oldHighlightItem.sprite && + newHighlightItem.index === oldHighlightItem.index + ) { + return; + } + } + return newHighlightItem; + }, + + updateHighlightItem: function (newHighlightItem, oldHighlightItem) { + if (oldHighlightItem) { + oldHighlightItem.series.setAttributesForItem(oldHighlightItem, {highlighted: false}); + } + if (newHighlightItem) { + newHighlightItem.series.setAttributesForItem(newHighlightItem, {highlighted: true}); + } + }, + + addItemListenersToSeries: function (series) { + for (var name in this.itemListeners) { + var listenerMap = this.itemListeners[name], i, ln; + for (i = 0, ln = listenerMap.length; i < ln; i++) { + series.addListener.apply(series, listenerMap[i]); + } + } + }, + + addItemListener: function (name, fn, scope, options, order) { + var listenerMap = this.itemListeners[name] || (this.itemListeners[name] = []), + series = this.getSeries(), seriesItem, + i, ln; + listenerMap.push([name, fn, scope, options, order]); + if (series) { + for (i = 0, ln = series.length; i < ln; i++) { + seriesItem = series[i]; + seriesItem.addListener(name, fn, scope, options, order); + } + } + }, + + remoteItemListener: function (name, fn, scope, options, order) { + var listenerMap = this.itemListeners[name], + series = this.getSeries(), seriesItem, + i, ln; + if (listenerMap) { + for (i = 0, ln = listenerMap.length; i < ln; i++) { + if (listenerMap[i].fn === fn) { + listenerMap.splice(i, 1); + if (series) { + for (i = 0, ln = series.length; i < ln; i++) { + seriesItem = series[i]; + seriesItem.removeListener(name, fn, scope, options, order); + } + } + break; + } + } + } + }, + + doAddListener: function (name, fn, scope, options, order) { + if (name.match(this.delegationRegex)) { + return this.addItemListener(name, fn, scope || this, options, order); + } else if (name.match(this.domEvents)) { + return this.element.doAddListener.apply(this.element, arguments); + } else { + return this.callSuper(arguments); + } + }, + + doRemoveListener: function (name, fn, scope, options, order) { + if (name.match(this.delegationRegex)) { + return this.remoteItemListener(name, fn, scope || this, options, order); + } else if (name.match(this.domEvents)) { + return this.element.doRemoveListener.apply(this.element, arguments); + } else { + return this.callSuper(arguments); + } + }, + + onItemRemove: function (item) { + this.callSuper(arguments); + if (this.surfaceMap) { + Ext.Array.remove(this.surfaceMap[item.type], item); + if (this.surfaceMap[item.type].length === 0) { + delete this.surfaceMap[item.type]; + } + } + }, + + // @private remove gently. + destroy: function () { + var me = this, + emptyArray = [], + legend = me.getLegend(), + legendStore = me.getLegendStore(); + me.surfaceMap = null; + me.setHighlightItem(null); + me.setSeries(emptyArray); + me.setAxes(emptyArray); + me.setInteractions(emptyArray); + if (legendStore) { + legendStore.destroy(); + me.legendStore = null; + } + if (legend) { + legend.destroy(); + me.setLegend(null); + } + me.setStore(null); + Ext.Viewport.un('orientationchange', me.redraw, me); + me.cancelLayout(); + this.callSuper(arguments); + }, + + /* --------------------------------- + Methods needed for ComponentQuery + ----------------------------------*/ + + /** + * @private + * @param {Boolean} deep + * @return {Array} + */ + getRefItems: function (deep) { + var me = this, + series = me.getSeries(), + axes = me.getAxes(), + interaction = me.getInteractions(), + ans = [], i, ln; + + for (i = 0, ln = series.length; i < ln; i++) { + ans.push(series[i]); + if (series[i].getRefItems) { + ans.push.apply(ans, series[i].getRefItems(deep)); + } + } + + for (i = 0, ln = axes.length; i < ln; i++) { + ans.push(axes[i]); + if (axes[i].getRefItems) { + ans.push.apply(ans, axes[i].getRefItems(deep)); + } + } + + for (i = 0, ln = interaction.length; i < ln; i++) { + ans.push(interaction[i]); + if (interaction[i].getRefItems) { + ans.push.apply(ans, interaction[i].getRefItems(deep)); + } + } + + return ans; + }, + + /** + * Flattens the given chart surfaces into a single image. + * Note: Surfaces whose class name is different from chart's engine will be omitted. + * @param {Array} surfaces A list of chart's surfaces to flatten. + * @param {String} format If set to 'image', the method will return an Image object. Otherwise, the dataURL + * of the flattened image will be returned. + * @returns {String|Image} An Image DOM element containing the flattened image or its dataURL. + */ + flatten: function (surfaces, format) { + var me = this, + size = me.element.getSize(), + svg, canvas, ctx, + i, surface, region, + img, dataURL; + + switch (me.engine) { + case 'Ext.draw.engine.Canvas': + canvas = document.createElement('canvas'); + canvas.width = size.width; + canvas.height = size.height; + ctx = canvas.getContext('2d'); + for (i = 0; i < surfaces.length; i++) { + surface = surfaces[i]; + if (Ext.getClassName(surface) !== me.engine) { + continue; + } + region = surface.getRegion(); + ctx.drawImage(surface.canvases[0].dom, region[0], region[1]); + } + dataURL = canvas.toDataURL(); + break; + case 'Ext.draw.engine.Svg': + svg = ''; + svg += ''; + for (i = 0; i < surfaces.length - 1; i++) { + surface = surfaces[i]; + if (Ext.getClassName(surface) !== me.engine) { + continue; + } + region = surface.getRegion(); + svg += ''; + svg += Ext.dom.Element.serializeNode(surface.svgElement.dom); + svg += ''; + } + svg += ''; + dataURL = 'data:image/svg+xml;utf8,' + svg; + break; + } + if (format === 'image') { + img = new Image(); + img.src = dataURL; + return img; + } + if (format === 'stream') { + return dataURL.replace(/^data:image\/[^;]+/, 'data:application/octet-stream'); + } + return dataURL; + }, + + save: function (download) { + if (download) { + // TODO: no control over filename, we are at the browser's mercy + // TODO: unfortunatelly, a.download attribute remains a novelty on mobile: http://caniuse.com/#feat=download + window.open(this.flatten(this.items.items, 'stream')); + } else { + Ext.Viewport.add({ + xtype: 'panel', + layout: 'fit', + modal: true, + width: '90%', + height: '90%', + hideOnMaskTap: true, + centered: true, + scrollable: false, + items: { + xtype: 'image', + mode: 'img', + src: this.flatten(this.items.items) + }, + listeners: { + hide: function () { + Ext.Viewport.remove(this); + } + } + }).show(); + } + } +}); diff --git a/vendor/touch/src/chart/CartesianChart.js b/vendor/touch/src/chart/CartesianChart.js new file mode 100644 index 000000000..dc06bbd20 --- /dev/null +++ b/vendor/touch/src/chart/CartesianChart.js @@ -0,0 +1,304 @@ +/** + * @class Ext.chart.CartesianChart + * @extends Ext.chart.AbstractChart + * + * Represents a chart that uses cartesian coordinates. + * A cartesian chart have two directions, X direction and Y direction. + * The series and axes are coordinated along these directions. + * By default the x direction is horizontal and y direction is vertical, + * You can swap the by setting {@link #flipXY} config to `true`. + * + * Cartesian series often treats x direction an y direction differently. + * In most cases, data on x direction are assumed to be monotonically increasing. + * Based on this property, cartesian series can be trimmed and summarized properly + * to gain a better performance. + * + * @xtype chart + */ + +Ext.define('Ext.chart.CartesianChart', { + extend: 'Ext.chart.AbstractChart', + alternateClassName: 'Ext.chart.Chart', + requires: ['Ext.chart.grid.HorizontalGrid', 'Ext.chart.grid.VerticalGrid'], + config: { + /** + * @cfg {Boolean} flipXY Flip the direction of X and Y axis. + * If flipXY is true, the X axes will be vertical and Y axes will be horizontal. + */ + flipXY: false, + + innerRegion: [0, 0, 1, 1] + }, + xtype: 'chart', + alias: 'Ext.chart.Chart', + + getDirectionForAxis: function (position) { + var flipXY = this.getFlipXY(); + if (position === 'left' || position === 'right') { + if (flipXY) { + return 'X'; + } else { + return 'Y'; + } + } else { + if (flipXY) { + return 'Y'; + } else { + return 'X'; + } + } + }, + + /** + * Layout the axes and series. + */ + performLayout: function () { + try { + this.resizing++; + this.callSuper(); + this.suspendThicknessChanged(); + var me = this, + axes = me.getAxes(), axis, + seriesList = me.getSeries(), series, + axisSurface, thickness, + size = me.element.getSize(), + width = size.width, + height = size.height, + insetPadding = me.getInsetPadding(), + innerPadding = me.getInnerPadding(), + surface, + shrinkBox = { + top: insetPadding.top, + left: insetPadding.left, + right: insetPadding.right, + bottom: insetPadding.bottom + }, + gridSurface, + mainRegion, innerWidth, innerHeight, + elements, floating, matrix, i, ln, + flipXY = me.getFlipXY(); + + if (width <= 0 || height <= 0) { + return; + } + + for (i = 0; i < axes.length; i++) { + axis = axes[i]; + axisSurface = axis.getSurface(); + floating = axis.getStyle && axis.getStyle() && axis.getStyle().floating; + thickness = axis.getThickness(); + switch (axis.getPosition()) { + case 'top': + axisSurface.setRegion([0, shrinkBox.top, width, thickness]); + break; + case 'bottom': + axisSurface.setRegion([0, height - (shrinkBox.bottom + thickness), width, thickness]); + break; + case 'left': + axisSurface.setRegion([shrinkBox.left, 0, thickness, height]); + break; + case 'right': + axisSurface.setRegion([width - (shrinkBox.right + thickness), 0, thickness, height]); + break; + } + if (!floating) { + shrinkBox[axis.getPosition()] += thickness; + } + } + + width -= shrinkBox.left + shrinkBox.right; + height -= shrinkBox.top + shrinkBox.bottom; + + mainRegion = [shrinkBox.left, shrinkBox.top, width, height]; + + shrinkBox.left += innerPadding.left; + shrinkBox.top += innerPadding.top; + shrinkBox.right += innerPadding.right; + shrinkBox.bottom += innerPadding.bottom; + + innerWidth = width - innerPadding.left - innerPadding.right; + innerHeight = height - innerPadding.top - innerPadding.bottom; + + me.setInnerRegion([shrinkBox.left, shrinkBox.top, innerWidth, innerHeight]); + + if (innerWidth <= 0 || innerHeight <= 0) { + return; + } + + me.setMainRegion(mainRegion); + me.getSurface('main').setRegion(mainRegion); + + for (i = 0, ln = me.surfaceMap.grid && me.surfaceMap.grid.length; i < ln; i++) { + gridSurface = me.surfaceMap.grid[i]; + gridSurface.setRegion(mainRegion); + gridSurface.matrix.set(1, 0, 0, 1, innerPadding.left, innerPadding.top); + gridSurface.matrix.inverse(gridSurface.inverseMatrix); + } + + for (i = 0; i < axes.length; i++) { + axis = axes[i]; + axisSurface = axis.getSurface(); + matrix = axisSurface.matrix; + elements = matrix.elements; + switch (axis.getPosition()) { + case 'top': + case 'bottom': + elements[4] = shrinkBox.left; + axis.setLength(innerWidth); + break; + case 'left': + case 'right': + elements[5] = shrinkBox.top; + axis.setLength(innerHeight); + break; + } + axis.updateTitleSprite(); + matrix.inverse(axisSurface.inverseMatrix); + } + + for (i = 0, ln = seriesList.length; i < ln; i++) { + series = seriesList[i]; + surface = series.getSurface(); + surface.setRegion(mainRegion); + if (flipXY) { + surface.matrix.set(0, -1, 1, 0, innerPadding.left, innerHeight + innerPadding.top); + } else { + surface.matrix.set(1, 0, 0, -1, innerPadding.left, innerHeight + innerPadding.top); + } + surface.matrix.inverse(surface.inverseMatrix); + series.getOverlaySurface().setRegion(mainRegion); + } + me.redraw(); + me.onPlaceWatermark(); + } finally { + this.resizing--; + this.resumeThicknessChanged(); + } + }, + + redraw: function () { + var me = this, + series = me.getSeries(), + axes = me.getAxes(), + region = me.getMainRegion(), + innerWidth, innerHeight, + innerPadding = me.getInnerPadding(), + left, right, top, bottom, i, j, + sprites, xRange, yRange, isSide, attr, + axisX, axisY, range, visibleRange, + flipXY = me.getFlipXY(), + sprite, zIndex, zBase = 1000, + markers, markerCount, markerIndex, markerSprite, markerZIndex; + + if (!region) { + return; + } + + innerWidth = region[2] - innerPadding.left - innerPadding.right; + innerHeight = region[3] - innerPadding.top - innerPadding.bottom; + for (i = 0; i < series.length; i++) { + if ((axisX = series[i].getXAxis())) { + visibleRange = axisX.getVisibleRange(); + xRange = axisX.getRange(); + xRange = [xRange[0] + (xRange[1] - xRange[0]) * visibleRange[0], xRange[0] + (xRange[1] - xRange[0]) * visibleRange[1]]; + } else { + xRange = series[i].getXRange(); + } + + if ((axisY = series[i].getYAxis())) { + visibleRange = axisY.getVisibleRange(); + yRange = axisY.getRange(); + yRange = [yRange[0] + (yRange[1] - yRange[0]) * visibleRange[0], yRange[0] + (yRange[1] - yRange[0]) * visibleRange[1]]; + } else { + yRange = series[i].getYRange(); + } + + left = xRange[0]; + right = xRange[1]; + top = yRange[0]; + bottom = yRange[1]; + + attr = { + visibleMinX: xRange[0], + visibleMaxX: xRange[1], + visibleMinY: yRange[0], + visibleMaxY: yRange[1], + innerWidth: innerWidth, + innerHeight: innerHeight, + flipXY: flipXY + }; + + sprites = series[i].getSprites(); + for (j = 0; j < sprites.length; j++) { + + // All the series now share the same surface, so we must assign + // the sprites a zIndex that depends on the index of their series. + sprite = sprites[j]; + zIndex = (sprite.attr.zIndex || 0); + if (zIndex < zBase) { + // Set the sprite's zIndex + zIndex += (i+1) * 100 + zBase; + sprite.attr.zIndex = zIndex; + // Iterate through its marker sprites to do the same. + markers = sprite.boundMarkers; + if (markers) { + markerCount = (markers.items ? markers.items.length : 0); + if (markerCount) { + for (markerIndex = 0; markerIndex < markerCount; markerIndex++) { + markerSprite = markers.items[markerIndex]; + markerZIndex = (markerSprite.attr.zIndex || 0); + if (markerZIndex == Number.MAX_VALUE) { + markerSprite.attr.zIndex = zIndex; + } else { + if (markerZIndex < zBase) { + markerSprite.attr.zIndex = zIndex + markerZIndex; + } + } + } + } + } + } + + sprite.setAttributes(attr, true); + } + } + + for (i = 0; i < axes.length; i++) { + isSide = axes[i].isSide(); + sprites = axes[i].getSprites(); + range = axes[i].getRange(); + visibleRange = axes[i].getVisibleRange(); + attr = { + dataMin: range[0], + dataMax: range[1], + visibleMin: visibleRange[0], + visibleMax: visibleRange[1] + }; + if (isSide) { + attr.length = innerHeight; + attr.startGap = innerPadding.bottom; + attr.endGap = innerPadding.top; + } else { + attr.length = innerWidth; + attr.startGap = innerPadding.left; + attr.endGap = innerPadding.right; + } + for (j = 0; j < sprites.length; j++) { + sprites[j].setAttributes(attr, true); + } + } + me.renderFrame(); + me.callSuper(arguments); + }, + + onPlaceWatermark: function () { + var region0 = this.element.getBox(), + region = this.getSurface ? this.getSurface('main').getRegion() : this.getItems().get(0).getRegion(); + if (region) { + this.watermarkElement.setStyle({ + right: Math.round(region0.width - (region[2] + region[0])) + 'px', + bottom: Math.round(region0.height - (region[3] + region[1])) + 'px' + }); + } + } +}); diff --git a/vendor/touch/src/chart/Legend.js b/vendor/touch/src/chart/Legend.js new file mode 100644 index 000000000..f2d3b2a2c --- /dev/null +++ b/vendor/touch/src/chart/Legend.js @@ -0,0 +1,147 @@ +/** + * @class Ext.chart.Legend + * @extends Ext.dataview.DataView + * + * A default legend for charts. + * + * @example preview + * var chart = new Ext.chart.Chart({ + * animate: true, + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':'metric one', 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':'metric two', 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':'metric three', 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':'metric four', 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':'metric five', 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * legend: { + * position: 'bottom' + * }, + * axes: [{ + * type: 'numeric', + * position: 'left', + * fields: ['data1'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * grid: true, + * minimum: 0 + * }, { + * type: 'category', + * position: 'bottom', + * fields: ['name'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * } + * }], + * series: [{ + * type: 'area', + * title: ['Data1', 'Data2', 'Data3'], + * subStyle: { + * fill: ['blue', 'green', 'red'] + * }, + * xField: 'name', + * yField: ['data1', 'data2', 'data3'] + * + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + */ +Ext.define("Ext.chart.Legend", { + xtype: 'legend', + extend: "Ext.dataview.DataView", + config: { + itemTpl: [ + "{name}" + ], + baseCls: 'x-legend', + padding: 5, + disableSelection: true, + inline: true, + /** + * @cfg {String} position + * @deprecated Use `docked` instead. + * Delegates to `docked` + */ + position: null, + /** + * @cfg {Boolean} toggleable 'true' if the series items in the legend can be toggled on and off. + */ + toggleable: true, + docked: 'top', + horizontalHeight: 48, + verticalWidth: 150 + }, + + constructor: function () { + this.callSuper(arguments); + + var scroller = this.getScrollable().getScroller(), + onDrag = scroller.onDrag; + scroller.onDrag = function (e) { + e.stopPropagation(); + onDrag.call(this, e); + }; + }, + + doSetDocked: function (docked) { + this.callSuper(arguments); + if (docked === 'top' || docked === 'bottom') { + this.setLayout({type: 'hbox', pack: 'center'}); + this.setInline(true); + // TODO: Remove this when possible + this.setWidth(null); + this.setHeight(this.getHorizontalHeight()); + if (this.getScrollable()) { + this.setScrollable({direction: 'horizontal'}); + } + } else { + this.setLayout({pack: 'center'}); + this.setInline(false); + // TODO: Remove this when possible + this.setWidth(this.getVerticalWidth()); + this.setHeight(null); + if (this.getScrollable()) { + this.setScrollable({direction: 'vertical'}); + } + } + }, + + setScrollable: function (scrollable) { + this.callSuper(arguments); + if (scrollable === true) { + if (this.getDocked() === 'top' || this.getDocked() === 'bottom') { + this.setScrollable({direction: 'horizontal'}); + } else if (this.getDocked() === 'left' || this.getDocked() === 'right') { + this.setScrollable({direction: 'vertical'}); + } + } + }, + + + setPosition: function (position) { + this.setDocked(position); + }, + + getPosition: function () { + return this.getDocked(); + }, + + onItemTap: function (container, target, index, e) { + this.callSuper(arguments); + if(this.getToggleable()) { + var me = this, + store = me.getStore(), + record = store && store.getAt(index); + record.beginEdit(); + record.set('disabled', !record.get('disabled')); + record.commit(); + } + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/MarkerHolder.js b/vendor/touch/src/chart/MarkerHolder.js new file mode 100644 index 000000000..b90ac36b8 --- /dev/null +++ b/vendor/touch/src/chart/MarkerHolder.js @@ -0,0 +1,109 @@ +/** + * @class Ext.chart.MarkerHolder + * @extends Ext.mixin.Mixin + * + * Mixin that provides the functionality to place markers. + */ +Ext.define('Ext.chart.MarkerHolder', { + extend: 'Ext.mixin.Mixin', + mixinConfig: { + id: 'markerHolder', + hooks: { + constructor: 'constructor', + preRender: 'preRender' + } + }, + + isMarkerHolder: true, + + constructor: function () { + this.boundMarkers = {}; + this.cleanRedraw = false; + }, + + /** + * + * @param {String} name + * @param {Ext.chart.Markers} marker + */ + bindMarker: function (name, marker) { + if (marker) { + if (!this.boundMarkers[name]) { + this.boundMarkers[name] = []; + } + Ext.Array.include(this.boundMarkers[name], marker); + } + }, + + getBoundMarker: function (name) { + return this.boundMarkers[name]; + }, + + preRender: function () { + var boundMarkers = this.boundMarkers, boundMarkersItem, + name, i, ln, id = this.getId(), + parent = this.getParent(), + matrix = this.surfaceMatrix ? this.surfaceMatrix.set(1, 0, 0, 1, 0, 0) : (this.surfaceMatrix = new Ext.draw.Matrix()); + + this.cleanRedraw = !this.attr.dirty; + if (!this.cleanRedraw) { + for (name in this.boundMarkers) { + if (boundMarkers[name]) { + for (boundMarkersItem = boundMarkers[name], i = 0, ln = boundMarkersItem.length; i < ln; i++) { + boundMarkersItem[i].clear(id); + } + } + } + } + + while (parent && parent.attr && parent.attr.matrix) { + matrix.prependMatrix(parent.attr.matrix); + parent = parent.getParent(); + } + matrix.prependMatrix(parent.matrix); + this.surfaceMatrix = matrix; + this.inverseSurfaceMatrix = matrix.inverse(this.inverseSurfaceMatrix); + }, + + putMarker: function (name, markerAttr, index, canonical, keepRevision) { + var boundMarkersItem, i, ln, id = this.getId(); + if (this.boundMarkers[name]) { + for (boundMarkersItem = this.boundMarkers[name], i = 0, ln = boundMarkersItem.length; i < ln; i++) { + boundMarkersItem[i].putMarkerFor(id, markerAttr, index, canonical); + } + } + }, + + getMarkerBBox: function (name, index, isWithoutTransform) { + var id = this.getId(), + left = Infinity, + right = -Infinity, + top = Infinity, + bottom = -Infinity, + bbox, boundMarker, i, ln; + + if (this.boundMarkers[name]) { + for (boundMarker = this.boundMarkers[name], i = 0, ln = boundMarker.length; i < ln; i++) { + bbox = boundMarker[i].getMarkerBBoxFor(id, index, isWithoutTransform); + if (left > bbox.x) { + left = bbox.x; + } + if (right < bbox.x + bbox.width) { + right = bbox.x + bbox.width; + } + if (top > bbox.y) { + top = bbox.y; + } + if (bottom < bbox.y + bbox.height) { + bottom = bbox.y + bbox.height; + } + } + } + return { + x: left, + y: top, + width: right - left, + height: bottom - top + }; + } +}); diff --git a/vendor/touch/src/chart/Markers.js b/vendor/touch/src/chart/Markers.js new file mode 100644 index 000000000..1c144cdd1 --- /dev/null +++ b/vendor/touch/src/chart/Markers.js @@ -0,0 +1,103 @@ +/** + * @class Ext.chart.Markers + * @extends Ext.draw.sprite.Instancing + * + * Marker sprite. A specialized version of instancing sprite that groups instances. + * Putting a marker is grouped by its category id. Clearing removes that category. + */ +Ext.define('Ext.chart.Markers', { + extend: 'Ext.draw.sprite.Instancing', + revisions: 0, + + constructor: function () { + this.callSuper(arguments); + this.map = {}; + this.revisions = {}; + }, + + /** + * Clear the markers in the category + * @param {String} category + */ + clear: function (category) { + category = category || 'default'; + if (!(category in this.revisions)) { + this.revisions[category] = 1; + } else { + this.revisions[category]++; + } + }, + + /** + * Put a marker in the category with additional + * attributes. + * @param {String} category + * @param {Object} markerAttr + * @param {String|Number} index + * @param {Boolean} [canonical] + * @param {Boolean} [keepRevision] + */ + putMarkerFor: function (category, markerAttr, index, canonical, keepRevision) { + category = category || 'default'; + + var me = this, + map = me.map[category] || (me.map[category] = {}); + if (index in map) { + me.setAttributesFor(map[index], markerAttr, canonical); + } else { + map[index] = me.instances.length; + me.createInstance(markerAttr, null, canonical); + } + me.instances[map[index]].category = category; + if (!keepRevision) { + me.instances[map[index]].revision = me.revisions[category] || (me.revisions[category] = 1); + } + }, + + /** + * + * @param {String} category + * @param {Mixed} index + * @param {Boolean} [isWithoutTransform] + */ + getMarkerBBoxFor: function (category, index, isWithoutTransform) { + if (category in this.map) { + if (index in this.map[category]) { + return this.getBBoxFor(this.map[category][index], isWithoutTransform); + } + } + return { + x: Infinity, + y: Infinity, + width: -Infinity, + height: -Infinity + }; + }, + + getBBox: function () { return null; }, + + render: function (surface, ctx, clipRegion) { + var me = this, + revisions = me.revisions, + mat = me.attr.matrix, + template = me.getTemplate(), + originalAttr = template.attr, + instances = me.instances, + i, ln = me.instances.length; + mat.toContext(ctx); + template.preRender(surface, ctx, clipRegion); + template.useAttributes(ctx); + for (i = 0; i < ln; i++) { + if (instances[i].hidden || instances[i].revision !== revisions[instances[i].category]) { + continue; + } + ctx.save(); + template.attr = instances[i]; + template.applyTransformations(); + template.useAttributes(ctx); + template.render(surface, ctx, clipRegion); + ctx.restore(); + } + template.attr = originalAttr; + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/PolarChart.js b/vendor/touch/src/chart/PolarChart.js new file mode 100644 index 000000000..d8d44f684 --- /dev/null +++ b/vendor/touch/src/chart/PolarChart.js @@ -0,0 +1,164 @@ +/** + * @class Ext.chart.PolarChart + * @extends Ext.chart.AbstractChart + * + * Creates a chart that uses polar coordinates. + */ +Ext.define('Ext.chart.PolarChart', { + + requires: [ + 'Ext.chart.grid.CircularGrid', + 'Ext.chart.grid.RadialGrid' + ], + + extend: 'Ext.chart.AbstractChart', + xtype: 'polar', + + config: { + /** + * @cfg {Array} center Determines the center of the polar chart. + * Updated when the chart performs layout. + */ + center: [0, 0], + /** + * @cfg {Number} radius Determines the radius of the polar chart. + * Updated when the chart performs layout. + */ + radius: 0 + }, + + getDirectionForAxis: function (position) { + if (position === 'radial') { + return 'Y'; + } else { + return 'X'; + } + }, + + applyCenter: function (center, oldCenter) { + if (oldCenter && center[0] === oldCenter[0] && center[1] === oldCenter[1]) { + return; + } + return [+center[0], +center[1]]; + }, + + updateCenter: function (center) { + var me = this, + axes = me.getAxes(), axis, + series = me.getSeries(), seriesItem, + i, ln; + for (i = 0, ln = axes.length; i < ln; i++) { + axis = axes[i]; + axis.setCenter(center); + } + + for (i = 0, ln = series.length; i < ln; i++) { + seriesItem = series[i]; + seriesItem.setCenter(center); + } + }, + + updateRadius: function (radius) { + var me = this, + axes = me.getAxes(), axis, + series = me.getSeries(), seriesItem, + i, ln; + for (i = 0, ln = axes.length; i < ln; i++) { + axis = axes[i]; + axis.setMinimum(0); + axis.setLength(radius); + axis.getSprites(); + } + + for (i = 0, ln = series.length; i < ln; i++) { + seriesItem = series[i]; + seriesItem.setRadius(radius); + } + }, + + doSetSurfaceRegion: function (surface, region) { + var mainRegion = this.getMainRegion(); + surface.setRegion(region); + surface.matrix.set(1, 0, 0, 1, mainRegion[0] - region[0], mainRegion[1] - region[1]); + surface.inverseMatrix.set(1, 0, 0, 1, region[0] - mainRegion[0], region[1] - mainRegion[1]); + }, + + performLayout: function () { + try { + this.resizing++; + this.callSuper(); + var me = this, + size = me.element.getSize(), + fullRegion = [0, 0, size.width, size.height], + + inset = me.getInsetPadding(), + inner = me.getInnerPadding(), + + left = inset.left, + top = inset.top, + width = size.width - left - inset.right, + height = size.height - top - inset.bottom, + region = [inset.left, inset.top, width, height], + + innerWidth = width - inner.left - inner.right, + innerHeight = height - inner.top - inner.bottom, + + center = [innerWidth * 0.5 + inner.left, innerHeight * 0.5 + inner.top], + radius = Math.min(innerWidth, innerHeight) * 0.5, + axes = me.getAxes(), axis, + series = me.getSeries(), seriesItem, + i, ln; + + me.setMainRegion(region); + + for (i = 0, ln = series.length; i < ln; i++) { + seriesItem = series[i]; + me.doSetSurfaceRegion(seriesItem.getSurface(), region); + me.doSetSurfaceRegion(seriesItem.getOverlaySurface(), fullRegion); + } + + me.doSetSurfaceRegion(me.getSurface(), fullRegion); + for (i = 0, ln = me.surfaceMap.grid && me.surfaceMap.grid.length; i < ln; i++) { + me.doSetSurfaceRegion(me.surfaceMap.grid[i], fullRegion); + } + for (i = 0, ln = axes.length; i < ln; i++) { + axis = axes[i]; + me.doSetSurfaceRegion(axis.getSurface(), fullRegion); + } + + me.setRadius(radius); + me.setCenter(center); + me.redraw(); + } finally { + this.resizing--; + } + }, + + getEventXY: function (e) { + e = (e.changedTouches && e.changedTouches[0]) || e.event || e.browserEvent || e; + var me = this, + xy = me.element.getXY(), + padding = me.getInsetPadding(); + return [e.pageX - xy[0] - padding.left, e.pageY - xy[1] - padding.top]; + }, + + redraw: function () { + var me = this, + axes = me.getAxes(), axis, + series = me.getSeries(), seriesItem, + i, ln; + + for (i = 0, ln = axes.length; i < ln; i++) { + axis = axes[i]; + axis.getSprites(); + } + + for (i = 0, ln = series.length; i < ln; i++) { + seriesItem = series[i]; + seriesItem.getSprites(); + } + + me.renderFrame(); + me.callSuper(arguments); + } +}); diff --git a/vendor/touch/src/chart/SpaceFillingChart.js b/vendor/touch/src/chart/SpaceFillingChart.js new file mode 100644 index 000000000..3e2076758 --- /dev/null +++ b/vendor/touch/src/chart/SpaceFillingChart.js @@ -0,0 +1,58 @@ +/** + * @class Ext.chart.SpaceFillingChart + * @extends Ext.chart.AbstractChart + * + * Creates a chart that fills the entire area of the chart. + * e.g. Gauge Charts + */ +Ext.define('Ext.chart.SpaceFillingChart', { + + extend: 'Ext.chart.AbstractChart', + xtype: 'spacefilling', + + config: { + + }, + + performLayout: function () { + try { + this.resizing++; + this.callSuper(); + var me = this, + size = me.element.getSize(), + series = me.getSeries(), seriesItem, + padding = me.getInsetPadding(), + width = size.width - padding.left - padding.right, + height = size.height - padding.top - padding.bottom, + region = [padding.left, padding.top, width, height], + fullRegion = [0, 0, size.width, size.height], + i, ln; + me.getSurface().setRegion(region); + me.setMainRegion(region); + for (i = 0, ln = series.length; i < ln; i++) { + seriesItem = series[i]; + seriesItem.getSurface().setRegion(region); + seriesItem.setRegion(region); + + seriesItem.getOverlaySurface().setRegion(fullRegion); + } + me.redraw(); + } finally { + this.resizing--; + } + }, + + redraw: function () { + var me = this, + series = me.getSeries(), seriesItem, + i, ln; + + for (i = 0, ln = series.length; i < ln; i++) { + seriesItem = series[i]; + seriesItem.getSprites(); + } + + me.renderFrame(); + me.callSuper(arguments); + } +}); diff --git a/vendor/touch/src/chart/axis/Axis.js b/vendor/touch/src/chart/axis/Axis.js new file mode 100644 index 000000000..49a73b6a0 --- /dev/null +++ b/vendor/touch/src/chart/axis/Axis.js @@ -0,0 +1,890 @@ +/** + * @class Ext.chart.axis.Axis + * + * Defines axis for charts. + * + * Using the current model, the type of axis can be easily extended. By default, Sencha Touch provides three different + * types of axis: + * + * * **numeric** - the data attached with this axes are considered to be numeric and continuous. + * * **time** - the data attached with this axes are considered (or get converted into) date/time and they are continuous. + * * **category** - the data attached with this axes conforms a finite set. They will be evenly placed on the axis and displayed in the same form they were provided. + * + * The behavior of an axis can be easily changed by setting different types of axis layout and axis segmenter to the axis. + * + * Axis layout defines how the data points are placed. Using continuous layout, the data points will be distributed by + * the numeric value. Using discrete layout the data points will be spaced evenly. Furthermore, if you want to combine + * the data points with the duplicate values in a discrete layout, you should use combineDuplicate layout. + * + * Segmenter defines the way to segment data range. For example, if you have a Date-type data range from Jan 1, 1997 to + * Jan 1, 2017, the segmenter will segement the data range into years, months or days based on the current zooming + * level. + * + * It is possible to write custom axis layouts and segmenters to extends this behavior by simply implementing interfaces + * {@link Ext.chart.axis.layout.Layout} and {@link Ext.chart.axis.segmenter.Segmenter}. + * + * Here's an example for the axes part of a chart definition: + * An example of axis for a series (in this case for an area chart that has multiple layers of yFields) could be: + * + * axes: [{ + * type: 'numeric', + * position: 'left', + * title: 'Number of Hits', + * grid: { + * odd: { + * opacity: 1, + * fill: '#ddd', + * stroke: '#bbb', + * lineWidth: 1 + * } + * }, + * minimum: 0 + * }, { + * type: 'category', + * position: 'bottom', + * title: 'Month of the Year', + * grid: true, + * label: { + * rotate: { + * degrees: 315 + * } + * } + * }] + * + * In this case we use a `numeric` axis for displaying the values of the Area series and a `category` axis for displaying the names of + * the store elements. The numeric axis is placed on the left of the screen, while the category axis is placed at the bottom of the chart. + * Both the category and numeric axes have `grid` set, which means that horizontal and vertical lines will cover the chart background. In the + * category axis the labels will be rotated so they can fit the space better. + */ +Ext.define('Ext.chart.axis.Axis', { + xtype: 'axis', + + mixins: { + observable: 'Ext.mixin.Observable' + }, + + requires: [ + 'Ext.chart.axis.sprite.Axis', + 'Ext.chart.axis.segmenter.*', + 'Ext.chart.axis.layout.*' + ], + + config: { + /** + * @cfg {String} position + * Where to set the axis. Available options are `left`, `bottom`, `right`, `top`, `radial` and `angular`. + */ + position: 'bottom', + + /** + * @cfg {Array} fields + * An array containing the names of the record fields which should be mapped along the axis. + * This is optional if the binding between series and fields is clear. + */ + fields: [], + + /** + * @cfg {Object} label + * + * The label configuration object for the Axis. This object may include style attributes + * like `spacing`, `padding`, `font` that receives a string or number and + * returns a new string with the modified values. + * + * For more supported values, see the configurations for {@link Ext.chart.label.Label}. + */ + label: { x: 0, y: 0, textBaseline: 'middle', textAlign: 'center', fontSize: 12, fontFamily: 'Helvetica' }, + + /** + * @cfg {Object} grid + * The grid configuration object for the Axis style. Can contain `stroke` or `fill` attributes. + * Also may contain an `odd` or `even` property in which you only style things on odd or even rows. + * For example: + * + * + * grid { + * odd: { + * stroke: '#555' + * }, + * even: { + * stroke: '#ccc' + * } + * } + */ + grid: false, + + /** + * @cfg {Function} renderer Allows direct customisation of rendered axis sprites. + * @param {String} label The label. + * @param {Object|Ext.chart.axis.layout.Layout} layout The layout configuration used by the axis. + * @param {String} lastLabel The last label. + * @return {String} The label to display. + */ + renderer: null, + + /** + * @protected + * @cfg {Ext.chart.AbstractChart} chart The Chart that the Axis is bound. + */ + chart: null, + + /** + * @cfg {Object} style + * The style for the axis line and ticks. + * Refer to the {@link Ext.chart.axis.sprite.Axis} + */ + style: null, + + /** + * @cfg {Number} titleMargin + * The margin around the axis title. Unlike CSS where the margin is added on all 4 + * sides of an element, the `titleMargin` is the total space that is added horizontally + * for a vertical title and vertically for an horizontal title, with half the `titleMargin` + * being added on either side. + */ + titleMargin: 4, + + /** + * @cfg {Object} background + * The background config for the axis surface. + */ + background: null, + + /** + * @cfg {Number} minimum + * The minimum value drawn by the axis. If not set explicitly, the axis + * minimum will be calculated automatically. + */ + minimum: NaN, + + /** + * @cfg {Number} maximum + * The maximum value drawn by the axis. If not set explicitly, the axis + * maximum will be calculated automatically. + */ + maximum: NaN, + + /** + * @cfg {Number} minZoom + * The minimum zooming level for axis. + */ + minZoom: 1, + + /** + * @cfg {Number} maxZoom + * The maximum zooming level for axis + */ + maxZoom: 10000, + + /** + * @cfg {Object|Ext.chart.axis.layout.Layout} layout + * The axis layout config. See {@link Ext.chart.axis.layout.Layout} + */ + layout: 'continuous', + + /** + * @cfg {Object|Ext.chart.axis.segmenter.Segmenter} segmenter + * The segmenter config. See {@link Ext.chart.axis.segmenter.Segmenter} + */ + segmenter: 'numeric', + + /** + * @cfg {Boolean} hidden + * Indicate whether to hide the axis. + * If the axis is hidden, one of the axis line, ticks, labels or the title will be shown and + * no margin will be taken. + * The coordination mechanism works fine no matter if the axis is hidden. + */ + hidden: false, + + /** + * @cfg {Number} majorTickSteps + * If `minimum` and `maximum` are specified it forces the number of major ticks to the specified value. + */ + majorTickSteps: false, + + /** + * @cfg {Number} [minorTickSteps=0] + * The number of small ticks between two major ticks. + */ + minorTickSteps: false, + + /** + * @private + * @cfg {Boolean} adjustMaximumByMajorUnit + * Will be supported soon. + */ + adjustMaximumByMajorUnit: false, + + /** + * @private + * @cfg {Boolean} adjustMinimumByMajorUnit + * Will be supported soon. + * + */ + adjustMinimumByMajorUnit: false, + + /** + * @cfg {String|Object} title + * The title for the Axis. + * If given a String, the text style of the title sprite will be set, + * otherwise the style will be set. + */ + title: { fontSize: 18, fontFamily: 'Helvetica'}, + + /** + * @cfg {Number} increment + * Given a minimum and maximum bound for the series to be rendered (that can be obtained + * automatically or by manually setting `minimum` and `maximum`) tick marks will be added + * on each `increment` from the minimum value to the maximum one. + */ + increment: 0.5, + + /** + * @private + * @cfg {Number} length + * Length of the axis position. Equals to the size of inner region on the docking side of this axis. + * WARNING: Meant to be set automatically by chart. Do not set it manually. + */ + length: 0, + + /** + * @private + * @cfg {Array} center + * Center of the polar axis. + * WARNING: Meant to be set automatically by chart. Do not set it manually. + */ + center: null, + + /** + * @private + * @cfg {Number} radius + * Radius of the polar axis. + * WARNING: Meant to be set automatically by chart. Do not set it manually. + */ + radius: null, + + /** + * @private + * @cfg {Number} rotation + * Rotation of the polar axis. + * WARNING: Meant to be set automatically by chart. Do not set it manually. + */ + rotation: null, + + /** + * @cfg {Boolean} [labelInSpan] + * Draws the labels in the middle of the spans. + */ + labelInSpan: null, + + /** + * @cfg {Array} visibleRange + * Specify the proportion of the axis to be rendered. The series bound to + * this axis will be synchronized and transformed. + */ + visibleRange: [0, 1], + + /** + * @cfg {Boolean} needHighPrecision + * Indicates that the axis needs high precision surface implementation. + * See {@link Ext.draw.engine.Canvas#highPrecision} + */ + needHighPrecision: false + }, + + observableType: 'component', + + titleOffset: 0, + + animating: 0, + + prevMin: 0, + + prevMax: 1, + + boundSeries: [], + + sprites: null, + + /** + * @private + * @property {Array} The full data range of the axis. Should not be set directly, clear it to `null` and use + * `getRange` to update. + */ + range: null, + + xValues: [], + + yValues: [], + + applyRotation: function (rotation) { + var twoPie = Math.PI * 2; + return (rotation % twoPie + Math.PI) % twoPie - Math.PI; + }, + + updateRotation: function (rotation) { + var sprites = this.getSprites(), + position = this.getPosition(); + if (!this.getHidden() && position === 'angular' && sprites[0]) { + sprites[0].setAttributes({ + baseRotation: rotation + }); + } + }, + + applyTitle: function (title, oldTitle) { + var surface; + + if (Ext.isString(title)) { + title = { text: title }; + } + + if (!oldTitle) { + oldTitle = Ext.create('sprite.text', title); + if ((surface = this.getSurface())) { + surface.add(oldTitle); + } + } else { + oldTitle.setAttributes(title); + } + return oldTitle; + }, + + constructor: function (config) { + var me = this; + me.sprites = []; + this.labels = []; + this.initConfig(config); + me.getId(); + me.mixins.observable.constructor.apply(me, arguments); + Ext.ComponentManager.register(me); + }, + + /** + * @private + * @return {String} + */ + getAlignment: function () { + switch (this.getPosition()) { + case 'left': + case 'right': + return 'vertical'; + case 'top': + case 'bottom': + return 'horizontal'; + case 'radial': + return 'radial'; + case 'angular': + return 'angular'; + } + }, + + /** + * @private + * @return {String} + */ + getGridAlignment: function () { + switch (this.getPosition()) { + case 'left': + case 'right': + return 'horizontal'; + case 'top': + case 'bottom': + return 'vertical'; + case 'radial': + return 'circular'; + case 'angular': + return "radial"; + } + }, + + /** + * @private + * Get the surface for drawing the series sprites + */ + getSurface: function () { + if (!this.surface) { + var chart = this.getChart(); + if (!chart) { + return null; + } + var surface = this.surface = chart.getSurface(this.getId(), 'axis'), + gridSurface = this.gridSurface = chart.getSurface('main'), + sprites = this.getSprites(), + sprite = sprites[0], + grid = this.getGrid(), + gridAlignment = this.getGridAlignment(), + gridSprite; + if (grid) { + gridSprite = this.gridSpriteEven = new Ext.chart.Markers(); + gridSprite.setTemplate({xclass: 'grid.' + gridAlignment}); + if (Ext.isObject(grid)) { + gridSprite.getTemplate().setAttributes(grid); + if (Ext.isObject(grid.even)) { + gridSprite.getTemplate().setAttributes(grid.even); + } + } + gridSurface.add(gridSprite); + sprite.bindMarker(gridAlignment + '-even', gridSprite); + + gridSprite = this.gridSpriteOdd = new Ext.chart.Markers(); + gridSprite.setTemplate({xclass: 'grid.' + gridAlignment}); + if (Ext.isObject(grid)) { + gridSprite.getTemplate().setAttributes(grid); + if (Ext.isObject(grid.odd)) { + gridSprite.getTemplate().setAttributes(grid.odd); + } + } + gridSurface.add(gridSprite); + sprite.bindMarker(gridAlignment + '-odd', gridSprite); + + gridSurface.waitFor(surface); + } + } + return this.surface; + }, + + /** + * + * Mapping data value into coordinate. + * + * @param {*} value + * @param {String} field + * @param {Number} [idx] + * @param {Ext.util.MixedCollection} [items] + * @return {Number} + */ + getCoordFor: function (value, field, idx, items) { + return this.getLayout().getCoordFor(value, field, idx, items); + }, + + applyPosition: function (pos) { + return pos.toLowerCase(); + }, + + applyLabel: function (newText, oldText) { + if (!oldText) { + oldText = new Ext.draw.sprite.Text({}); + } + oldText.setAttributes(newText); + return oldText; + }, + + applyLayout: function (layout, oldLayout) { + // TODO: finish this + layout = Ext.factory(layout, null, oldLayout, 'axisLayout'); + layout.setAxis(this); + return layout; + }, + + applySegmenter: function (segmenter, oldSegmenter) { + // TODO: finish this + segmenter = Ext.factory(segmenter, null, oldSegmenter, 'segmenter'); + segmenter.setAxis(this); + return segmenter; + }, + + updateMinimum: function () { + this.range = null; + }, + + updateMaximum: function () { + this.range = null; + }, + + hideLabels: function () { + this.getSprites()[0].setDirty(true); + this.setLabel({hidden: true}); + }, + + showLabels: function () { + this.getSprites()[0].setDirty(true); + this.setLabel({hidden: false}); + }, + + /** + * Invokes renderFrame on this axis's surface(s) + */ + renderFrame: function () { + this.getSurface().renderFrame(); + }, + + updateChart: function (newChart, oldChart) { + var me = this, surface; + if (oldChart) { + oldChart.un('serieschanged', me.onSeriesChanged, me); + } + if (newChart) { + newChart.on('serieschanged', me.onSeriesChanged, me); + if (newChart.getSeries()) { + me.onSeriesChanged(newChart); + } + me.surface = null; + surface = me.getSurface(); + surface.add(me.getSprites()); + surface.add(me.getTitle()); + } + }, + + applyBackground: function (background) { + var rect = Ext.ClassManager.getByAlias('sprite.rect'); + return rect.def.normalize(background); + }, + + /** + * @protected + * Invoked when data has changed. + */ + processData: function () { + this.getLayout().processData(); + this.range = null; + }, + + getDirection: function () { + return this.getChart().getDirectionForAxis(this.getPosition()); + }, + + isSide: function () { + var position = this.getPosition(); + return position === 'left' || position === 'right'; + }, + + applyFields: function (fields) { + return [].concat(fields); + }, + + updateFields: function (fields) { + this.fieldsMap = {}; + for (var i = 0; i < fields.length; i++) { + this.fieldsMap[fields[i]] = true; + } + }, + + applyVisibleRange: function (visibleRange, oldVisibleRange) { + // If it is in reversed order swap them + if (visibleRange[0] > visibleRange[1]) { + var temp = visibleRange[0]; + visibleRange[0] = visibleRange[1]; + visibleRange[0] = temp; + } + if (visibleRange[1] === visibleRange[0]) { + visibleRange[1] += 1 / this.getMaxZoom(); + } + if (visibleRange[1] > visibleRange[0] + 1) { + visibleRange[0] = 0; + visibleRange[1] = 1; + } else if (visibleRange[0] < 0) { + visibleRange[1] -= visibleRange[0]; + visibleRange[0] = 0; + } else if (visibleRange[1] > 1) { + visibleRange[0] -= visibleRange[1] - 1; + visibleRange[1] = 1; + } + + if (oldVisibleRange && visibleRange[0] === oldVisibleRange[0] && visibleRange[1] === oldVisibleRange[1]) { + return undefined; + } + + return visibleRange; + }, + + updateVisibleRange: function (visibleRange) { + this.fireEvent('transformed', this, visibleRange); + }, + + onSeriesChanged: function (chart) { + var me = this, + series = chart.getSeries(), + getAxisMethod = 'get' + me.getDirection() + 'Axis', + boundSeries = [], i, ln = series.length; + for (i = 0; i < ln; i++) { + if (this === series[i][getAxisMethod]()) { + boundSeries.push(series[i]); + } + } + + me.boundSeries = boundSeries; + me.getLayout().processData(); + }, + + applyRange: function (newRange) { + if (!newRange) { + return this.dataRange.slice(0); + } else { + return [ + newRange[0] === null ? this.dataRange[0] : newRange[0], + newRange[1] === null ? this.dataRange[1] : newRange[1] + ]; + } + }, + + /** + * Get the range derived from all the bound series. + * @return {Array} + */ + getRange: function () { + var me = this, + getRangeMethod = 'get' + me.getDirection() + 'Range'; + + if (me.range) { + return me.range; + } + if (!isNaN(me.getMinimum()) && !isNaN(me.getMaximum())) { + return this.range = [me.getMinimum(), me.getMaximum()]; + } + var min = Infinity, + max = -Infinity, + boundSeries = me.boundSeries, + series, i, ln; + + // For each series bound to this axis, ask the series for its min/max values + // and use them to find the overall min/max. + for (i = 0, ln = boundSeries.length; i < ln; i++) { + series = boundSeries[i]; + var minMax = series[getRangeMethod](); + + if (minMax) { + if (minMax[0] < min) { + min = minMax[0]; + } + if (minMax[1] > max) { + max = minMax[1]; + } + } + } + if (!isFinite(max)) { + max = me.prevMax; + } + + if (!isFinite(min)) { + min = me.prevMin; + } + + if (this.getLabelInSpan() || min === max) { + max += this.getIncrement(); + min -= this.getIncrement(); + } + + if (!isNaN(me.getMinimum())) { + min = me.getMinimum(); + } else { + me.prevMin = min; + } + + if (!isNaN(me.getMaximum())) { + max = me.getMaximum(); + } else { + me.prevMax = max; + } + + return this.range = [min, max]; + }, + + applyStyle: function (style, oldStyle) { + var cls = Ext.ClassManager.getByAlias('sprite.' + this.seriesType); + if (cls && cls.def) { + style = cls.def.normalize(style); + } + oldStyle = Ext.apply(oldStyle || {}, style); + return oldStyle; + }, + + updateCenter: function (center) { + var sprites = this.getSprites(), + axisSprite = sprites[0], + centerX = center[0], + centerY = center[1]; + if (axisSprite) { + axisSprite.setAttributes({ + centerX: centerX, + centerY: centerY + }); + } + if (this.gridSpriteEven) { + this.gridSpriteEven.getTemplate().setAttributes({ + translationX: centerX, + translationY: centerY, + rotationCenterX: centerX, + rotationCenterY: centerY + }); + } + if (this.gridSpriteOdd) { + this.gridSpriteOdd.getTemplate().setAttributes({ + translationX: centerX, + translationY: centerY, + rotationCenterX: centerX, + rotationCenterY: centerY + }); + } + }, + + getSprites: function () { + if (!this.getChart()) { + return; + } + var me = this, + range = me.getRange(), + position = me.getPosition(), + chart = me.getChart(), + animation = chart.getAnimate(), + baseSprite, style, + length = me.getLength(); + + // If animation is false, then stop animation. + if (animation === false) { + animation = { + duration: 0 + }; + } + if (range) { + style = Ext.applyIf({ + position: position, + axis: me, + min: range[0], + max: range[1], + length: length, + grid: me.getGrid(), + hidden: me.getHidden(), + titleOffset: me.titleOffset, + layout: me.getLayout(), + segmenter: me.getSegmenter(), + label: me.getLabel() + }, me.getStyle()); + + // If the sprites are not created. + if (!me.sprites.length) { + baseSprite = new Ext.chart.axis.sprite.Axis(style); + baseSprite.fx.setCustomDuration({ + baseRotation: 0 + }); + baseSprite.fx.on("animationstart", "onAnimationStart", me); + baseSprite.fx.on("animationend", "onAnimationEnd", me); + me.sprites.push(baseSprite); + me.updateTitleSprite(); + } else { + baseSprite = me.sprites[0]; + baseSprite.fx.setConfig(animation); + baseSprite.setAttributes(style); + baseSprite.setLayout(me.getLayout()); + baseSprite.setSegmenter(me.getSegmenter()); + baseSprite.setLabel(me.getLabel()); + } + + if (me.getRenderer()) { + baseSprite.setRenderer(me.getRenderer()); + } + } + + return me.sprites; + }, + + updateTitleSprite: function () { + if (!this.sprites[0]) { + return; + } + var me = this, + thickness = this.sprites[0].thickness, + surface = me.getSurface(), + title = this.getTitle(), + position = me.getPosition(), + titleMargin = me.getTitleMargin(), + length = me.getLength(), + anchor = surface.roundPixel(length / 2); + + if (title) { + switch (position) { + case 'top': + title.setAttributes({ + x: anchor, + y: titleMargin / 2, + textBaseline: 'top', + textAlign: 'center' + }, true, true); + title.applyTransformations(); + me.titleOffset = title.getBBox().height + titleMargin; + break; + case 'bottom': + title.setAttributes({ + x: anchor, + y: thickness + titleMargin / 2, + textBaseline: 'top', + textAlign: 'center' + }, true, true); + title.applyTransformations(); + me.titleOffset = title.getBBox().height + titleMargin; + break; + case 'left': + title.setAttributes({ + x: titleMargin / 2, + y: anchor, + textBaseline: 'top', + textAlign: 'center', + rotationCenterX: titleMargin / 2, + rotationCenterY: anchor, + rotationRads: -Math.PI / 2 + }, true, true); + title.applyTransformations(); + me.titleOffset = title.getBBox().width + titleMargin; + break; + case 'right': + title.setAttributes({ + x: thickness + titleMargin / 2, + y: anchor, + textBaseline: 'bottom', + textAlign: 'center', + rotationCenterX: thickness + titleMargin / 2, + rotationCenterY: anchor, + rotationRads: Math.PI / 2 + }, true, true); + title.applyTransformations(); + me.titleOffset = title.getBBox().width + titleMargin; + break; + } + } + }, + + onThicknessChanged: function () { + var me = this; + me.getChart().onThicknessChanged(); + }, + + getThickness: function () { + if (this.getHidden()) { + return 0; + } + return (this.sprites[0] && this.sprites[0].thickness || 1) + this.titleOffset; + }, + + onAnimationStart: function () { + this.animating++; + if (this.animating === 1) { + this.fireEvent("animationstart"); + } + }, + + onAnimationEnd: function () { + this.animating--; + if (this.animating === 0) { + this.fireEvent("animationend"); + } + }, + + // Methods used in ComponentQuery and controller + getItemId: function () { + return this.getId(); + }, + + getAncestorIds: function () { + return [this.getChart().getId()]; + }, + + isXType: function (xtype) { + return xtype === 'axis'; + }, + + destroy: function () { + Ext.ComponentManager.unregister(this); + this.callSuper(); + } +}); + diff --git a/vendor/touch/src/chart/axis/Category.js b/vendor/touch/src/chart/axis/Category.js new file mode 100644 index 000000000..e64adab17 --- /dev/null +++ b/vendor/touch/src/chart/axis/Category.js @@ -0,0 +1,69 @@ +/** + * @class Ext.chart.axis.Category + * @extends Ext.chart.axis.Axis + * + * A type of axis that displays items in categories. This axis is generally used to + * display categorical information like names of items, month names, quarters, etc. + * but no quantitative values. For that other type of information {@link Ext.chart.axis.Numeric Numeric} + * axis are more suitable. + * + * As with other axis you can set the position of the axis and its title. For example: + * + * @example preview + * var chart = new Ext.chart.CartesianChart({ + * animate: true, + * innerPadding: { + * left: 40, + * right: 40 + * }, + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':'metric one', 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':'metric two', 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':'metric three', 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':'metric four', 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':'metric five', 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * axes: [{ + * type: 'category', + * position: 'bottom', + * fields: ['name'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * } + * }], + * series: [{ + * type: 'area', + * subStyle: { + * fill: ['blue', 'green', 'red'] + * }, + * xField: 'name', + * yField: ['data1', 'data2', 'data3'] + * + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + * + * In this example with set the category axis to the bottom of the surface, bound the axis to + * the `name` property and set as title "Sample Values". + */ + +Ext.define('Ext.chart.axis.Category', { + requires: [ + 'Ext.chart.axis.layout.CombineDuplicate', + 'Ext.chart.axis.segmenter.Names' + ], + extend: 'Ext.chart.axis.Axis', + alias: 'axis.category', + type: 'category', + + config: { + layout: 'combineDuplicate', + + segmenter: 'names' + } +}); diff --git a/vendor/touch/src/chart/axis/Numeric.js b/vendor/touch/src/chart/axis/Numeric.js new file mode 100644 index 000000000..0bd03d885 --- /dev/null +++ b/vendor/touch/src/chart/axis/Numeric.js @@ -0,0 +1,72 @@ +/** + * @class Ext.chart.axis.Numeric + * @extends Ext.chart.axis.Axis + * + * An axis to handle numeric values. This axis is used for quantitative data as + * opposed to the category axis. You can set minimum and maximum values to the + * axis so that the values are bound to that. If no values are set, then the + * scale will auto-adjust to the values. + * + * @example preview + * var chart = new Ext.chart.CartesianChart({ + * animate: true, + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':1, 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':2, 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':3, 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':4, 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':5, 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * axes: [{ + * type: 'numeric', + * position: 'left', + * fields: ['data1', 'data2', 'data3', 'data4', 'data5'], + * title: 'Sample Values', + * grid: { + * odd: { + * opacity: 1, + * fill: '#ddd', + * stroke: '#bbb', + * 'lineWidth': 1 + * } + * }, + * minimum: 0, + * adjustMinimumByMajorUnit: 0 + * }], + * series: [{ + * type: 'area', + * subStyle: { + * fill: ['blue', 'green', 'red'] + * }, + * xField: 'name', + * yField: ['data1', 'data2', 'data3'] + * + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + * In this example we create an axis of Numeric type. We set a minimum value so that + * even if all series have values greater than zero, the grid starts at zero. We bind + * the axis onto the left part of the surface by setting _position_ to _left_. + * We bind three different store fields to this axis by setting _fields_ to an array. + * We set the title of the axis to _Number of Hits_ by using the _title_ property. + * We use a _grid_ configuration to set odd background rows to a certain style and even rows + * to be transparent/ignored. + * + */ +Ext.define('Ext.chart.axis.Numeric', { + extend: 'Ext.chart.axis.Axis', + alias: 'axis.numeric', + type: 'numeric', + requires: ['Ext.chart.axis.layout.Continuous', 'Ext.chart.axis.segmenter.Numeric'], + config: { + layout: 'continuous', + + segmenter: 'numeric', + + aggregator: 'double' + } +}); diff --git a/vendor/touch/src/chart/axis/Time.js b/vendor/touch/src/chart/axis/Time.js new file mode 100644 index 000000000..f0d6cd389 --- /dev/null +++ b/vendor/touch/src/chart/axis/Time.js @@ -0,0 +1,140 @@ +/** + * @class Ext.chart.axis.Time + * @extends Ext.chart.axis.Numeric + * + * A type of axis whose units are measured in time values. Use this axis + * for listing dates that you will want to group or dynamically change. + * If you just want to display dates as categories then use the + * Category class for axis instead. + * + * @example preview + * var chart = new Ext.chart.CartesianChart({ + * animate: true, + * store: { + * fields: ['time', 'open', 'high', 'low', 'close'], + * data: [ + * {'time':new Date('Jan 1 2010').getTime(), 'open':600, 'high':614, 'low':578, 'close':590}, + * {'time':new Date('Jan 2 2010').getTime(), 'open':590, 'high':609, 'low':580, 'close':580}, + * {'time':new Date('Jan 3 2010').getTime(), 'open':580, 'high':602, 'low':578, 'close':602}, + * {'time':new Date('Jan 4 2010').getTime(), 'open':602, 'high':614, 'low':586, 'close':586}, + * {'time':new Date('Jan 5 2010').getTime(), 'open':586, 'high':602, 'low':565, 'close':565} + * ] + * }, + * axes: [{ + * type: 'numeric', + * position: 'left', + * fields: ['open', 'high', 'low', 'close'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * grid: true, + * minimum: 560, + * maximum: 640 + * }, { + * type: 'time', + * position: 'bottom', + * fields: ['time'], + * fromDate: new Date('Dec 31 2009'), + * toDate: new Date('Jan 6 2010'), + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * style: { + * axisLine: false + * } + * }], + * series: [{ + * type: 'candlestick', + * xField: 'time', + * openField: 'open', + * highField: 'high', + * lowField: 'low', + * closeField: 'close', + * style: { + * ohlcType: 'ohlc', + * dropStyle: { + * fill: 'rgb(237, 123, 43)', + * stroke: 'rgb(237, 123, 43)' + * }, + * raiseStyle: { + * fill: 'rgb(55, 153, 19)', + * stroke: 'rgb(55, 153, 19)' + * } + * }, + * aggregator: { + * strategy: 'time' + * } + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + */ +Ext.define('Ext.chart.axis.Time', { + extend: 'Ext.chart.axis.Numeric', + alias: 'axis.time', + type: 'time', + requires: ['Ext.chart.axis.layout.Continuous', 'Ext.chart.axis.segmenter.Time', 'Ext.DateExtras'], + config: { + /** + * @cfg {Boolean} calculateByLabelSize + * The minimum value drawn by the axis. If not set explicitly, the axis + * minimum will be calculated automatically. + */ + calculateByLabelSize: true, + + /** + * @cfg {String/Boolean} dateFormat + * Indicates the format the date will be rendered on. + * For example: 'M d' will render the dates as 'Jan 30', etc. + */ + dateFormat: null, + + /** + * @cfg {Date} fromDate The starting date for the time axis. + */ + fromDate: null, + + /** + * @cfg {Date} toDate The ending date for the time axis. + */ + toDate: null, + + /** + * @cfg {Array} [step=[Ext.Date.DAY, 1]] An array with two components: + * + * - The unit of the step (Ext.Date.DAY, Ext.Date.MONTH, etc). + * - The number of units for the step (1, 2, etc). + * + */ + step: [Ext.Date.DAY, 1], + + layout: 'continuous', + + segmenter: 'time', + + aggregator: 'time' + }, + + updateDateFormat: function (format) { + this.setRenderer(function (date) { + return Ext.Date.format(new Date(date), format); + }); + }, + + updateFromDate: function (date) { + this.setMinimum(+date); + }, + + updateToDate: function (date) { + this.setMaximum(+date); + }, + + getCoordFor: function (value) { + if (Ext.isString(value)) { + value = new Date(value); + } + return +value; + } +}); diff --git a/vendor/touch/src/chart/axis/layout/CombineDuplicate.js b/vendor/touch/src/chart/axis/layout/CombineDuplicate.js new file mode 100644 index 000000000..8a49b3c9c --- /dev/null +++ b/vendor/touch/src/chart/axis/layout/CombineDuplicate.js @@ -0,0 +1,20 @@ +/** + * @class Ext.chart.axis.layout.CombineDuplicate + * @extends Ext.chart.axis.layout.Discrete + * + * Discrete processor that combines duplicate data points. + */ +Ext.define("Ext.chart.axis.layout.CombineDuplicate", { + extend: 'Ext.chart.axis.layout.Discrete', + alias: 'axisLayout.combineDuplicate', + + getCoordFor: function (value, field, idx, items) { + if (!(value in this.labelMap)) { + var result = this.labelMap[value] = this.labels.length; + this.labels.push(value); + return result; + } + return this.labelMap[value]; + } + +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/axis/layout/Continuous.js b/vendor/touch/src/chart/axis/layout/Continuous.js new file mode 100644 index 000000000..3c6aaa129 --- /dev/null +++ b/vendor/touch/src/chart/axis/layout/Continuous.js @@ -0,0 +1,76 @@ +/** + * @class Ext.chart.axis.layout.Continuous + * @extends Ext.chart.axis.layout.Layout + * + * Processor for axis data that can be interpolated. + */ +Ext.define('Ext.chart.axis.layout.Continuous', { + extend: 'Ext.chart.axis.layout.Layout', + alias: 'axisLayout.continuous', + config: { + adjustMinimumByMajorUnit: false, + adjustMaximumByMajorUnit: false + }, + + getCoordFor: function (value, field, idx, items) { + return +value; + }, + + //@inheritdoc + snapEnds: function (context, min, max, estStepSize) { + var segmenter = context.segmenter, + axis = this.getAxis(), + minimum = axis.getMinimum(), + maximum = axis.getMaximum(), + majorTickSteps = axis.getMajorTickSteps(), + out = majorTickSteps && Ext.isNumber(minimum) && Ext.isNumber(maximum) && segmenter.exactStep ? + segmenter.exactStep(min, (max - min) / majorTickSteps) : + segmenter.preferredStep(min, estStepSize), + unit = out.unit, + step = out.step, + from = segmenter.align(min, step, unit), + steps = segmenter.diff(min, max, unit) + 1; + return { + min: segmenter.from(min), + max: segmenter.from(max), + from: from, + to: segmenter.add(from, steps * step, unit), + step: step, + steps: steps, + unit: unit, + get: function (current) { + return segmenter.add(this.from, this.step * current, unit); + } + }; + }, + + snapMinorEnds: function (context) { + var majorTicks = context.majorTicks, + minorTickSteps = this.getAxis().getMinorTickSteps(), + segmenter = context.segmenter, + min = majorTicks.min, + max = majorTicks.max, + from = majorTicks.from, + unit = majorTicks.unit, + step = majorTicks.step / minorTickSteps, + scaledStep = step * unit.scale, + fromMargin = from - min, + offset = Math.floor(fromMargin / scaledStep), + extraSteps = offset + Math.floor((max - majorTicks.to) / scaledStep) + 1, + steps = majorTicks.steps * minorTickSteps + extraSteps; + return { + min: min, + max: max, + from: min + fromMargin % scaledStep, + to: segmenter.add(from, steps * step, unit), + step: step, + steps: steps, + unit: unit, + get: function (current) { + return (current % minorTickSteps + offset + 1 !== 0) ? // don't render minor tick in major tick position + segmenter.add(this.from, this.step * current, unit) : + null; + } + } + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/axis/layout/Discrete.js b/vendor/touch/src/chart/axis/layout/Discrete.js new file mode 100644 index 000000000..4b8e84bb2 --- /dev/null +++ b/vendor/touch/src/chart/axis/layout/Discrete.js @@ -0,0 +1,127 @@ +/** + * @class Ext.chart.axis.layout.Discrete + * @extends Ext.chart.axis.layout.Layout + * + * Simple processor for data that cannot be interpolated. + */ +Ext.define('Ext.chart.axis.layout.Discrete', { + extend: 'Ext.chart.axis.layout.Layout', + alias: 'axisLayout.discrete', + + processData: function () { + var me = this, + axis = me.getAxis(), + boundSeries = axis.boundSeries, + direction = axis.getDirection(), + i, ln, item; + this.labels = []; + this.labelMap = {}; + for (i = 0, ln = boundSeries.length; i < ln; i++) { + item = boundSeries[i]; + if (item['get' + direction + 'Axis']() === axis) { + item['coordinate' + direction](); + } + } + // About the labels on Category axes (aka. axes with a Discrete layout)... + // + // When the data set from the store changes, series.processData() is called, which does its thing + // at the series level and then calls series.updateLabelData() to update the labels in the sprites + // that belong to the series. At the same time, series.processData() calls axis.processData(), which + // also does its thing but at the axis level, and also needs to update the labels for the sprite(s) + // that belong to the axis. This is not that simple, however. So how are the axis labels rendered? + // First, axis.sprite.Axis.render() calls renderLabels() which obtains the majorTicks from the + // axis.layout and iterate() through them. The majorTicks are an object returned by snapEnds() below + // which provides a getLabel() function that returns the label from the axis.layoutContext.data array. + // So now the question is: how are the labels transferred from the axis.layout to the axis.layoutContext? + // The easy response is: it's in calculateLayout() below. The issue is to call calculateLayout() because + // it takes in an axis.layoutContext that can only be created in axis.sprite.Axis.doLayout(), which is + // a private "updater" function that is called by all the sprite's "dirtyTriggers". Of course, we don't + // want to call doLayout() directly from here, so instead we update the sprite's data attribute, which + // sets the dirtyTrigger which calls doLayout() which calls calculateLayout() etc... + // Note that the sprite's data attribute could be set to any value and it would still result in the + // dirtyTrigger we need. For consistency, however, it is set to the labels. + axis.getSprites()[0].setAttributes({data:this.labels}); + }, + + // @inheritdoc + calculateLayout: function (context) { + context.data = this.labels; + this.callSuper([context]); + }, + + //@inheritdoc + calculateMajorTicks: function (context) { + var me = this, + attr = context.attr, + data = context.data, + range = attr.max - attr.min, + zoom = range / Math.max(1, attr.length) * (attr.visibleMax - attr.visibleMin), + viewMin = attr.min + range * attr.visibleMin, + viewMax = attr.min + range * attr.visibleMax, + estStepSize = attr.estStepSize * zoom; + + var out = me.snapEnds(context, Math.max(0, attr.min), Math.min(attr.max, data.length - 1), estStepSize); + if (out) { + me.trimByRange(context, out, viewMin, viewMax); + context.majorTicks = out; + } + }, + + // @inheritdoc + snapEnds: function (context, min, max, estStepSize) { + estStepSize = Math.ceil(estStepSize); + var steps = Math.floor((max - min) / estStepSize), + data = context.data; + return { + min: min, + max: max, + from: min, + to: steps * estStepSize + min, + step: estStepSize, + steps: steps, + unit: 1, + getLabel: function (current) { + return data[this.from + this.step * current]; + }, + get: function (current) { + return this.from + this.step * current; + } + }; + }, + + // @inheritdoc + trimByRange: function (context, out, trimMin, trimMax) { + var unit = out.unit, + beginIdx = Math.ceil((trimMin - out.from) / unit) * unit, + endIdx = Math.floor((trimMax - out.from) / unit) * unit, + begin = Math.max(0, Math.ceil(beginIdx / out.step)), + end = Math.min(out.steps, Math.floor(endIdx / out.step)); + + if (end < out.steps) { + out.to = end; + } + + if (out.max > trimMax) { + out.max = out.to; + } + + if (out.from < trimMin && out.step > 0) { + out.from = out.from + begin * out.step * unit; + while (out.from < trimMin) { + begin++; + out.from += out.step * unit; + } + } + + if (out.min < trimMin) { + out.min = out.from; + } + + out.steps = end - begin; + }, + + getCoordFor: function (value, field, idx, items) { + this.labels.push(value); + return this.labels.length - 1; + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/axis/layout/Layout.js b/vendor/touch/src/chart/axis/layout/Layout.js new file mode 100644 index 000000000..5965d3f5b --- /dev/null +++ b/vendor/touch/src/chart/axis/layout/Layout.js @@ -0,0 +1,139 @@ +/** + * @abstract + * @class Ext.chart.axis.layout.Layout + * + * Interface used by Axis to process its data into a meaningful layout. + */ +Ext.define("Ext.chart.axis.layout.Layout", { + config: { + /** + * @cfg {Ext.chart.axis.Axis} axis The axis that the Layout is bound. + */ + axis: null + }, + + constructor: function (config) { + this.initConfig(); + }, + + /** + * Processes the data of the series bound to the axis. + * @param {Ext.chart.series.Series} series The bound series. + */ + processData: function (series) { + var me = this, + axis = me.getAxis(), + direction = axis.getDirection(), + boundSeries = axis.boundSeries, + i, ln, item; + if (series) { + series['coordinate' + direction](); + } else { + for (i = 0, ln = boundSeries.length; i < ln; i++) { + item = boundSeries[i]; + if (item['get' + direction + 'Axis']() === axis) { + item['coordinate' + direction](); + } + } + } + }, + + /** + * Calculates the position of major ticks for the axis. + * @param {Object} context + */ + calculateMajorTicks: function (context) { + var me = this, + attr = context.attr, + range = attr.max - attr.min, + zoom = range / Math.max(1, attr.length) * (attr.visibleMax - attr.visibleMin), + viewMin = attr.min + range * attr.visibleMin, + viewMax = attr.min + range * attr.visibleMax, + estStepSize = attr.estStepSize * zoom, + out = me.snapEnds(context, attr.min, attr.max, estStepSize); + if (out) { + me.trimByRange(context, out, viewMin, viewMax); + context.majorTicks = out; + } + }, + + /** + * Calculates the position of sub ticks for the axis. + * @param {Object} context + */ + calculateMinorTicks: function (context) { + var attr = context.attr; + if (this.snapMinorEnds) { + context.minorTicks = this.snapMinorEnds(context); + } + }, + + /** + * Calculates the position of tick marks for the axis. + * @param {Object} context + * @return {*} + */ + calculateLayout: function (context) { + var me = this, + attr = context.attr, + majorTicks = attr.majorTicks, + minorTicks = attr.minorTicks; + if (attr.length === 0) { + return null; + } + + if (majorTicks) { + this.calculateMajorTicks(context); + if (minorTicks) { + this.calculateMinorTicks(context); + } + } + }, + + /** + * Snaps the data bound to the axis to meaningful tick marks. + * @param {Object} context + * @param {Number} min + * @param {Number} max + * @param {Number} estStepSize + */ + snapEnds: Ext.emptyFn, + + /** + * Trims the layout of the axis by the defined minimum and maximum. + * @param {Object} context + * @param {Object} out + * @param {Number} trimMin + * @param {Number} trimMax + */ + trimByRange: function (context, out, trimMin, trimMax) { + var segmenter = context.segmenter, + unit = out.unit, + beginIdx = segmenter.diff(out.from, trimMin, unit), + endIdx = segmenter.diff(out.from, trimMax, unit), + begin = Math.max(0, Math.ceil(beginIdx / out.step)), + end = Math.min(out.steps, Math.floor(endIdx / out.step)); + + if (end < out.steps) { + out.to = segmenter.add(out.from, end * out.step, unit); + } + + if (out.max > trimMax) { + out.max = out.to; + } + + if (out.from < trimMin) { + out.from = segmenter.add(out.from, begin * out.step, unit); + while (out.from < trimMin) { + begin++; + out.from = segmenter.add(out.from, out.step, unit); + } + } + + if (out.min < trimMin) { + out.min = out.from; + } + + out.steps = end - begin; + } +}); diff --git a/vendor/touch/src/chart/axis/segmenter/Names.js b/vendor/touch/src/chart/axis/segmenter/Names.js new file mode 100644 index 000000000..6259d5943 --- /dev/null +++ b/vendor/touch/src/chart/axis/segmenter/Names.js @@ -0,0 +1,36 @@ +/** + * @class Ext.chart.axis.segmenter.Names + * @extends Ext.chart.axis.segmenter.Segmenter + * + * Names data type. Names will be calculated as their indices in the methods in this class. + * The `preferredStep` always return `{ unit: 1, step: 1 }` to indicate "show every item". + * + */ +Ext.define("Ext.chart.axis.segmenter.Names", { + extend: 'Ext.chart.axis.segmenter.Segmenter', + alias: 'segmenter.names', + + renderer: function (value, context) { + return value; + }, + + diff: function (min, max, unit) { + return Math.floor(max - min); + }, + + align: function (value, step, unit) { + return Math.floor(value); + }, + + + add: function (value, step, unit) { + return value + step; + }, + + preferredStep: function (min, estStepSize, minIdx, data) { + return { + unit: 1, + step: 1 + }; + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/axis/segmenter/Numeric.js b/vendor/touch/src/chart/axis/segmenter/Numeric.js new file mode 100644 index 000000000..323972560 --- /dev/null +++ b/vendor/touch/src/chart/axis/segmenter/Numeric.js @@ -0,0 +1,72 @@ +/** + * @class Ext.chart.axis.segmenter.Numeric + * @extends Ext.chart.axis.segmenter.Segmenter + * + * Numeric data type. + */ +Ext.define('Ext.chart.axis.segmenter.Numeric', { + extend: 'Ext.chart.axis.segmenter.Segmenter', + alias: 'segmenter.numeric', + + renderer: function (value, context) { + return value.toFixed(Math.max(0, context.majorTicks.unit.fixes)); + }, + + diff: function (min, max, unit) { + return Math.floor((max - min) / unit.scale); + }, + + align: function (value, step, unit) { + return Math.floor(value / (unit.scale * step)) * unit.scale * step; + }, + + + add: function (value, step, unit) { + return value + step * unit.scale; + }, + + preferredStep: function (min, estStepSize) { + var logs = Math.floor(Math.log(estStepSize) * Math.LOG10E), // common logarithm of estStepSize + scale = Math.pow(10, logs); + estStepSize /= scale; + if (estStepSize < 2) { + estStepSize = 2; + } else if (estStepSize < 5) { + estStepSize = 5; + } else if (estStepSize < 10) { + estStepSize = 10; + logs++; + } + return { + unit: { + // when estStepSize < 1, rounded down log10(estStepSize) is equal to -number_of_leading_zeros in estStepSize + fixes: -logs, // number of fractional digits + scale: scale + }, + step: estStepSize + }; + }, + + /** + * Wraps the provided estimated step size of a range without altering it into a step size object. + * + * @param {*} min The start point of range. + * @param {*} estStepSize The estimated step size. + * @return {Object} Return the step size by an object of step x unit. + * @return {Number} return.step The step count of units. + * @return {Object} return.unit The unit. + */ + + exactStep: function (min, estStepSize) { + var logs = Math.floor(Math.log(estStepSize) * Math.LOG10E), + scale = Math.pow(10, logs); + return { + unit: { + // add one decimal point if estStepSize is not a multiple of scale + fixes: -logs + (estStepSize % scale === 0 ? 0 : 1), + scale: 1 + }, + step: estStepSize + } + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/axis/segmenter/Segmenter.js b/vendor/touch/src/chart/axis/segmenter/Segmenter.js new file mode 100644 index 000000000..d68102c37 --- /dev/null +++ b/vendor/touch/src/chart/axis/segmenter/Segmenter.js @@ -0,0 +1,84 @@ +/** + * @abstract + * @class Ext.chart.axis.segmenter.Segmenter + * + * Interface for a segmenter in an Axis. A segmenter defines the operations you can do to a specific + * data type. + * + * See {@link Ext.chart.axis.Axis}. + * + */ +Ext.define('Ext.chart.axis.segmenter.Segmenter', { + + config: { + /** + * @cfg {Ext.chart.axis.Axis} axis The axis that the Segmenter is bound. + */ + axis: null + }, + + constructor: function (config) { + this.initConfig(config); + }, + + /** + * This method formats the value. + * + * @param {*} value The value to format. + * @param {Object} context Axis layout context. + * @return {String} + */ + renderer: function (value, context) { + return String(value); + }, + + /** + * Convert from any data into the target type. + * @param {*} value The value to convert from + * @return {*} The converted value. + */ + from: function (value) { + return value; + }, + + /** + * Returns the difference between the min and max value based on the given unit scale. + * + * @param {*} min The smaller value. + * @param {*} max The larger value. + * @param {*} unit The unit scale. Unit can be any type. + * @return {Number} The number of `unit`s between min and max. It is the minimum n that min + n * unit >= max. + */ + diff: Ext.emptyFn, + + /** + * Align value with step of units. + * For example, for the date segmenter, if the unit is "Month" and step is 3, the value will be aligned by + * seasons. + * + * @param {*} value The value to be aligned. + * @param {Number} step The step of units. + * @param {*} unit The unit. + * @return {*} Aligned value. + */ + align: Ext.emptyFn, + + /** + * Add `step` `unit`s to the value. + * @param {*} value The value to be added. + * @param {Number} step The step of units. Negative value are allowed. + * @param {*} unit The unit. + */ + add: Ext.emptyFn, + + /** + * Given a start point and estimated step size of a range, determine the preferred step size. + * + * @param {*} start The start point of range. + * @param {*} estStepSize The estimated step size. + * @return {Object} Return the step size by an object of step x unit. + * @return {Number} return.step The step count of units. + * @return {Number|Object} return.unit The unit. + */ + preferredStep: Ext.emptyFn +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/axis/segmenter/Time.js b/vendor/touch/src/chart/axis/segmenter/Time.js new file mode 100644 index 000000000..bac131730 --- /dev/null +++ b/vendor/touch/src/chart/axis/segmenter/Time.js @@ -0,0 +1,107 @@ +/** + * @class Ext.chart.axis.segmenter.Time + * @extends Ext.chart.axis.segmenter.Segmenter + * + * Time data type. + */ +Ext.define('Ext.chart.axis.segmenter.Time', { + extend: 'Ext.chart.axis.segmenter.Segmenter', + alias: 'segmenter.time', + + config: { + /** + * @cfg {Object} step + * If specified, the will override the result of {@link #preferredStep}. + */ + step: null + }, + + renderer: function (value, context) { + var ExtDate = Ext.Date; + switch (context.majorTicks.unit) { + case 'y': + return ExtDate.format(value, 'Y'); + case 'mo': + return ExtDate.format(value, 'Y-m'); + case 'd': + return ExtDate.format(value, 'Y-m-d'); + } + return ExtDate.format(value, 'Y-m-d\nH:i:s'); + }, + + from: function (value) { + return new Date(value); + }, + + diff: function (min, max, unit) { + var ExtDate = Ext.Date; + if (isFinite(min)) { + min = new Date(min); + } + if (isFinite(max)) { + max = new Date(max); + } + return ExtDate.diff(min, max, unit); + }, + + align: function (date, step, unit) { + if (unit === 'd' && step >= 7) { + date = Ext.Date.align(date, 'd', step); + date.setDate(date.getDate() - date.getDay() + 1); + return date; + } else { + return Ext.Date.align(date, unit, step); + } + }, + + add: function (value, step, unit) { + return Ext.Date.add(new Date(value), unit, step); + }, + + preferredStep: function (min, estStepSize) { + if (this.getStep()) { + return this.getStep(); + } + var from = new Date(+min), + to = new Date(+min + Math.ceil(estStepSize)), + ExtDate = Ext.Date, + units = [ + [ExtDate.YEAR, 1, 2, 5, 10, 20, 50, 100, 200, 500], + [ExtDate.MONTH, 1, 3, 6], + [ExtDate.DAY, 1, 7, 14], + [ExtDate.HOUR, 1, 6, 12], + [ExtDate.MINUTE, 1, 5, 15, 30], + [ExtDate.SECOND, 1, 5, 15, 30], + [ExtDate.MILLI, 1, 2, 5, 10, 20, 50, 100, 200, 500] + ], + result; + + for (var i = 0; i < units.length; i++) { + var unit = units[i][0], + diff = this.diff(from, to, unit); + if (diff > 0) { + for (var j = 1; j < units[i].length; j++) { + if (diff <= units[i][j]) { + result = { + unit: unit, + step: units[i][j] + }; + break; + } + } + if (!result) { + i--; + result = { + unit: units[i][0], + step: 1 + }; + } + break; + } + } + if (!result) { + result = {unit: ExtDate.DAY, step: 1}; // Default step is one Day. + } + return result; + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/axis/sprite/Axis.js b/vendor/touch/src/chart/axis/sprite/Axis.js new file mode 100644 index 000000000..203be9851 --- /dev/null +++ b/vendor/touch/src/chart/axis/sprite/Axis.js @@ -0,0 +1,715 @@ +/** + * @private + * @class Ext.chart.axis.sprite.Axis + * @extends Ext.draw.sprite.Sprite + * + * The axis sprite. Currently all types of the axis will be rendered with this sprite. + * TODO(touch-2.2): Split different types of axis into different sprite classes. + */ +Ext.define('Ext.chart.axis.sprite.Axis', { + extend: 'Ext.draw.sprite.Sprite', + mixins: { + markerHolder: 'Ext.chart.MarkerHolder' + }, + + requires: ['Ext.draw.sprite.Text'], + + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Boolean} grid 'true' if the axis has a grid. + */ + grid: 'bool', + + /** + * @cfg {Boolean} axisLine 'true' if the main line of the axis is drawn. + */ + axisLine: 'bool', + + /** + * @cfg {Boolean} minorTricks 'true' if the axis has sub ticks. + */ + minorTicks: 'bool', + + /** + * @cfg {Number} minorTickSize The length of the minor ticks. + */ + minorTickSize: 'number', + + /** + * @cfg {Boolean} majorTicks 'true' if the axis has major ticks. + */ + majorTicks: 'bool', + + /** + * @cfg {Number} majorTickSize The length of the major ticks. + */ + majorTickSize: 'number', + + /** + * @cfg {Number} length The total length of the axis. + */ + length: 'number', + + /** + * @private + * @cfg {Number} startGap Axis start determined by the chart inset padding. + */ + startGap: 'number', + + /** + * @private + * @cfg {Number} endGap Axis end determined by the chart inset padding. + */ + endGap: 'number', + + /** + * @cfg {Number} dataMin The minimum value of the axis data. + */ + dataMin: 'number', + + /** + * @cfg {Number} dataMax The maximum value of the axis data. + */ + dataMax: 'number', + + /** + * @cfg {Number} visibleMin The minimum value that is displayed. + */ + visibleMin: 'number', + + /** + * @cfg {Number} visibleMax The maximum value that is displayed. + */ + visibleMax: 'number', + + /** + * @cfg {String} position The position of the axis on the chart. + */ + position: 'enums(left,right,top,bottom,angular,radial)', + + /** + * @cfg {Number} minStepSize The minimum step size between ticks. + */ + minStepSize: 'number', + + /** + * @private + * @cfg {Number} estStepSize The estimated step size between ticks. + */ + estStepSize: 'number', + + /** + * @private + * Unused. + */ + titleOffset: 'number', + + /** + * @cfg {Number} textPadding The padding around axis labels to determine collision. + */ + textPadding: 'number', + + /** + * @cfg {Number} min The minimum value of the axis. + */ + min: 'number', + + /** + * @cfg {Number} max The maximum value of the axis. + */ + max: 'number', + + /** + * @cfg {Number} centerX The central point of the angular axis on the x-axis. + */ + centerX: 'number', + + /** + * @cfg {Number} centerY The central point of the angular axis on the y-axis. + */ + centerY: 'number', + + /** + * @private + * @cfg {Number} radius + * Unused. + */ + radius: 'number', + + /** + * @cfg {Number} The starting rotation of the angular axis. + */ + baseRotation: 'number', + + /** + * @private + * Unused. + */ + data: 'default', + + /** + * @cfg {Boolean} 'true' if the estimated step size is adjusted by text size. + */ + enlargeEstStepSizeByText: 'bool' + }, + + defaults: { + grid: false, + axisLine: true, + minorTicks: false, + minorTickSize: 3, + majorTicks: true, + majorTickSize: 5, + length: 0, + startGap: 0, + endGap: 0, + visibleMin: 0, + visibleMax: 1, + dataMin: 0, + dataMax: 1, + position: '', + minStepSize: 0, + estStepSize: 20, + min: 0, + max: 1, + centerX: 0, + centerY: 0, + radius: 1, + baseRotation: 0, + data: null, + titleOffset: 0, + textPadding: 5, + scalingCenterY: 0, + scalingCenterX: 0, + // Override default + strokeStyle: 'black', + enlargeEstStepSizeByText: false + }, + + dirtyTriggers: { + minorTickSize: 'bbox', + majorTickSize: 'bbox', + position: 'bbox,layout', + axisLine: 'bbox,layout', + min: 'layout', + max: 'layout', + length: 'layout', + minStepSize: 'layout', + estStepSize: 'layout', + data: 'layout', + dataMin: 'layout', + dataMax: 'layout', + visibleMin: 'layout', + visibleMax: 'layout', + enlargeEstStepSizeByText: 'layout' + }, + updaters: { + 'layout': function () { + this.doLayout(); + } + } + } + }, + + config: { + + /** + * @cfg {Object} label + * + * The label configuration object for the Axis. This object may include style attributes + * like `spacing`, `padding`, `font` that receives a string or number and + * returns a new string with the modified values. + */ + label: null, + + /** + * @cfg {Object|Ext.chart.axis.layout.Layout} layout The layout configuration used by the axis. + */ + layout: null, + + /** + * @cfg {Object|Ext.chart.axis.segmenter.Segmenter} segmenter The method of segmenter used by the axis. + */ + segmenter: null, + + /** + * @cfg {Function} renderer Allows direct customisation of rendered axis sprites. + */ + renderer: null, + + /** + * @private + * @cfg {Object} layoutContext Stores the context after calculating layout. + */ + layoutContext: null, + + /** + * @cfg {Ext.chart.axis.Axis} axis The axis represented by the this sprite. + */ + axis: null + }, + + thickness: 0, + + stepSize: 0, + + getBBox: function () { return null; }, + + doLayout: function () { + var me = this, + attr = me.attr, + layout = me.getLayout(), + min = attr.dataMin + (attr.dataMax - attr.dataMin) * attr.visibleMin, + max = attr.dataMin + (attr.dataMax - attr.dataMin) * attr.visibleMax, + context = { + attr: attr, + segmenter: me.getSegmenter() + }; + + if (attr.position === 'left' || attr.position === 'right') { + attr.translationX = 0; + attr.translationY = max * attr.length / (max - min); + attr.scalingX = 1; + attr.scalingY = -attr.length / (max - min); + attr.scalingCenterY = 0; + attr.scalingCenterX = 0; + me.applyTransformations(true); + } else if (attr.position === 'top' || attr.position === 'bottom') { + attr.translationX = -min * attr.length / (max - min); + attr.translationY = 0; + attr.scalingX = attr.length / (max - min); + attr.scalingY = 1; + attr.scalingCenterY = 0; + attr.scalingCenterX = 0; + me.applyTransformations(true); + } + + if (layout) { + layout.calculateLayout(context); + me.setLayoutContext(context); + } + }, + + iterate: function (snaps, fn) { + var i, position; + if (snaps.getLabel) { + if (snaps.min < snaps.from) { + fn.call(this, snaps.min, snaps.getLabel(snaps.min), -1, snaps); + } + for (i = 0; i <= snaps.steps; i++) { + fn.call(this, snaps.get(i), snaps.getLabel(i), i, snaps); + } + if (snaps.max > snaps.to) { + fn.call(this, snaps.max, snaps.getLabel(snaps.max), snaps.steps + 1, snaps); + } + } else { + if (snaps.min < snaps.from) { + fn.call(this, snaps.min, snaps.min, -1, snaps); + } + for (i = 0; i <= snaps.steps; i++) { + position = snaps.get(i); + fn.call(this, position, position, i, snaps); + } + if (snaps.max > snaps.to) { + fn.call(this, snaps.max, snaps.max, snaps.steps + 1, snaps); + } + } + }, + + renderTicks: function (surface, ctx, layout, clipRegion) { + var me = this, + attr = me.attr, + docked = attr.position, + matrix = attr.matrix, + halfLineWidth = 0.5 * attr.lineWidth, + xx = matrix.getXX(), + dx = matrix.getDX(), + yy = matrix.getYY(), + dy = matrix.getDY(), + majorTicks = layout.majorTicks, + majorTickSize = attr.majorTickSize, + minorTicks = layout.minorTicks, + minorTickSize = attr.minorTickSize; + + if (majorTicks) { + switch (docked) { + case 'right': + function getRightTickFn(size) { + return function (position, labelText, i) { + position = surface.roundPixel(position * yy + dy) + halfLineWidth; + ctx.moveTo(0, position); + ctx.lineTo(size, position); + }; + } + me.iterate(majorTicks, getRightTickFn(majorTickSize)); + minorTicks && me.iterate(minorTicks, getRightTickFn(minorTickSize)); + break; + case 'left': + function getLeftTickFn(size) { + return function (position, labelText, i) { + position = surface.roundPixel(position * yy + dy) + halfLineWidth; + ctx.moveTo(clipRegion[2] - size, position); + ctx.lineTo(clipRegion[2], position); + }; + } + me.iterate(majorTicks, getLeftTickFn(majorTickSize)); + minorTicks && me.iterate(minorTicks, getLeftTickFn(minorTickSize)); + break; + case 'bottom': + function getBottomTickFn(size) { + return function (position, labelText, i) { + position = surface.roundPixel(position * xx + dx) - halfLineWidth; + ctx.moveTo(position, 0); + ctx.lineTo(position, size); + }; + } + me.iterate(majorTicks, getBottomTickFn(majorTickSize)); + minorTicks && me.iterate(minorTicks, getBottomTickFn(minorTickSize)); + break; + case 'top': + function getTopTickFn(size) { + return function (position, labelText, i) { + position = surface.roundPixel(position * xx + dx) - halfLineWidth; + ctx.moveTo(position, clipRegion[3]); + ctx.lineTo(position, clipRegion[3] - size); + }; + } + me.iterate(majorTicks, getTopTickFn(majorTickSize)); + minorTicks && me.iterate(minorTicks, getTopTickFn(minorTickSize)); + break; + case 'angular': + me.iterate(majorTicks, function (position, labelText, i) { + position = position / (attr.max + 1) * Math.PI * 2 + attr.baseRotation; + ctx.moveTo( + attr.centerX + (attr.length) * Math.cos(position), + attr.centerY + (attr.length) * Math.sin(position) + ); + ctx.lineTo( + attr.centerX + (attr.length + majorTickSize) * Math.cos(position), + attr.centerY + (attr.length + majorTickSize) * Math.sin(position) + ); + }); + break; + } + } + }, + + renderLabels: function (surface, ctx, layout, clipRegion) { + var me = this, + attr = me.attr, + halfLineWidth = 0.5 * attr.lineWidth, + docked = attr.position, + matrix = attr.matrix, + textPadding = attr.textPadding, + xx = matrix.getXX(), + dx = matrix.getDX(), + yy = matrix.getYY(), + dy = matrix.getDY(), + thickness = 0, + majorTicks = layout.majorTicks, + padding = Math.max(attr.majorTickSize, attr.minorTickSize) + attr.lineWidth, + label = this.getLabel(), font, + lastLabelText = null, + textSize = 0, textCount = 0, + segmenter = layout.segmenter, + renderer = this.getRenderer(), + labelInverseMatrix, lastBBox = null, bbox, fly, text; + if (majorTicks && label && !label.attr.hidden) { + font = label.attr.font; + if (ctx.font !== font) { + ctx.font = font; + } // This can profoundly improve performance. + label.setAttributes({translationX: 0, translationY: 0}, true, true); + label.applyTransformations(); + labelInverseMatrix = label.attr.inverseMatrix.elements.slice(0); + switch (docked) { + case 'left': + label.setAttributes({ + translationX: surface.roundPixel(clipRegion[2] - padding + dx) - halfLineWidth - me.thickness / 2 + }, true, true); + break; + case 'right': + label.setAttributes({ + translationX: surface.roundPixel(padding + dx) - halfLineWidth + me.thickness / 2 + }, true, true); + break; + case 'top': + label.setAttributes({ + translationY: surface.roundPixel(clipRegion[3] - padding) - halfLineWidth - me.thickness / 2 + }, true, true); + break; + case 'bottom': + label.setAttributes({ + translationY: surface.roundPixel(padding) - halfLineWidth + me.thickness / 2 + }, true, true); + break; + case 'radial' : + label.setAttributes({ + translationX: attr.centerX + }, true, true); + break; + case 'angular': + label.setAttributes({ + translationY: attr.centerY + }, true, true); + break; + } + + // TODO: there are better ways to detect collision. + if (docked === 'left' || docked === 'right') { + me.iterate(majorTicks, function (position, labelText, i) { + if (labelText === undefined) { + return; + } + text = renderer ? renderer.call(this, labelText, layout, lastLabelText) : segmenter.renderer(labelText, layout, lastLabelText); + lastLabelText = labelText; + label.setAttributes({ + text: String(text), + translationY: surface.roundPixel(position * yy + dy) + }, true, true); + label.applyTransformations(); + thickness = Math.max(thickness, label.getBBox().width + padding); + if (thickness <= me.thickness) { + fly = Ext.draw.Matrix.fly(label.attr.matrix.elements.slice(0)); + bbox = fly.prepend.apply(fly, labelInverseMatrix).transformBBox(label.getBBox(true)); + if (lastBBox && !Ext.draw.Draw.isBBoxIntersect(bbox, lastBBox, textPadding)) { + return; + } + surface.renderSprite(label); + lastBBox = bbox; + textSize += bbox.height; + textCount++; + } + }); + } else if (docked === 'top' || docked === 'bottom') { + me.iterate(majorTicks, function (position, labelText, i) { + if (labelText === undefined) { + return; + } + text = renderer ? renderer.call(this, labelText, layout, lastLabelText) : segmenter.renderer(labelText, layout, lastLabelText); + lastLabelText = labelText; + label.setAttributes({ + text: String(text), + translationX: surface.roundPixel(position * xx + dx) + }, true, true); + label.applyTransformations(); + thickness = Math.max(thickness, label.getBBox().height + padding); + if (thickness <= me.thickness) { + fly = Ext.draw.Matrix.fly(label.attr.matrix.elements.slice(0)); + bbox = fly.prepend.apply(fly, labelInverseMatrix).transformBBox(label.getBBox(true)); + if (lastBBox && !Ext.draw.Draw.isBBoxIntersect(bbox, lastBBox, textPadding)) { + return; + } + surface.renderSprite(label); + lastBBox = bbox; + textSize += bbox.width; + textCount++; + } + }); + } else if (docked === 'radial') { + me.iterate(majorTicks, function (position, labelText, i) { + if (labelText === undefined) { + return; + } + text = renderer ? renderer.call(this, labelText, layout, lastLabelText) : segmenter.renderer(labelText, layout, lastLabelText); + lastLabelText = labelText; + if (typeof text !== 'undefined') { + label.setAttributes({ + text: String(text), + translationY: attr.centerY - surface.roundPixel(position) / attr.max * attr.length + }, true, true); + label.applyTransformations(); + bbox = label.attr.matrix.transformBBox(label.getBBox(true)); + if (lastBBox && !Ext.draw.Draw.isBBoxIntersect(bbox, lastBBox)) { + return; + } + surface.renderSprite(label); + lastBBox = bbox; + textSize += bbox.width; + textCount++; + } + }); + } else if (docked === 'angular') { + me.iterate(majorTicks, function (position, labelText, i) { + if (labelText === undefined) { + return; + } + text = renderer ? renderer.call(this, labelText, layout, lastLabelText) : segmenter.renderer(labelText, layout, lastLabelText); + lastLabelText = labelText; + + if (typeof text !== 'undefined') { + var angle = position / (attr.max + 1) * Math.PI * 2 + attr.baseRotation; + label.setAttributes({ + text: String(text), + translationX: attr.centerX + (attr.length + 10) * Math.cos(angle), + translationY: attr.centerY + (attr.length + 10) * Math.sin(angle) + }, true, true); + label.applyTransformations(); + bbox = label.attr.matrix.transformBBox(label.getBBox(true)); + if (lastBBox && !Ext.draw.Draw.isBBoxIntersect(bbox, lastBBox)) { + return; + } + surface.renderSprite(label); + lastBBox = bbox; + textSize += bbox.width; + textCount++; + } + }); + } + + if (attr.enlargeEstStepSizeByText && textCount) { + textSize /= textCount; + textSize += padding; + textSize *= 2; + if (attr.estStepSize < textSize) { + attr.estStepSize = textSize; + } + } + + if (Math.abs(me.thickness - (thickness)) > 1) { + me.thickness = thickness; + attr.bbox.plain.dirty = true; + attr.bbox.transform.dirty = true; + me.doThicknessChanged(); + return false; + } + } + }, + + renderAxisLine: function (surface, ctx, layout, clipRegion) { + var me = this, + attr = me.attr, + halfLineWidth = attr.lineWidth * 0.5, + docked = attr.position, + position; + if (attr.axisLine) { + switch (docked) { + case 'left': + position = surface.roundPixel(clipRegion[2]) - halfLineWidth; + ctx.moveTo(position, -attr.endGap); + ctx.lineTo(position, attr.length + attr.startGap); + break; + case 'right': + ctx.moveTo(halfLineWidth, -attr.endGap); + ctx.lineTo(halfLineWidth, attr.length + attr.startGap); + break; + case 'bottom': + ctx.moveTo(-attr.startGap, halfLineWidth); + ctx.lineTo(attr.length + attr.endGap, halfLineWidth); + break; + case 'top': + position = surface.roundPixel(clipRegion[3]) - halfLineWidth; + ctx.moveTo(-attr.startGap, position); + ctx.lineTo(attr.length + attr.endGap, position); + break; + case 'angular': + ctx.moveTo(attr.centerX + attr.length, attr.centerY); + ctx.arc(attr.centerX, attr.centerY, attr.length, 0, Math.PI * 2, true); + break; + } + } + }, + + renderGridLines: function (surface, ctx, layout, clipRegion) { + var me = this, + attr = me.attr, + matrix = attr.matrix, + startGap = attr.startGap, + endGap = attr.endGap, + xx = matrix.getXX(), + yy = matrix.getYY(), + dx = matrix.getDX(), + dy = matrix.getDY(), + position = attr.position, + majorTicks = layout.majorTicks, + anchor, j, lastAnchor; + if (attr.grid) { + if (majorTicks) { + if (position === 'left' || position === 'right') { + lastAnchor = attr.min * yy + dy + endGap + startGap; + me.iterate(majorTicks, function (position, labelText, i) { + anchor = position * yy + dy + endGap; + me.putMarker('horizontal-' + (i % 2 ? 'odd' : 'even'), { + y: anchor, + height: lastAnchor - anchor + }, j = i, true); + lastAnchor = anchor; + }); + j++; + anchor = 0; + me.putMarker('horizontal-' + (j % 2 ? 'odd' : 'even'), { + y: anchor, + height: lastAnchor - anchor + }, j, true); + } else if (position === 'top' || position === 'bottom') { + lastAnchor = attr.min * xx + dx + startGap; + if (startGap) { + me.putMarker('vertical-even', { + x: 0, + width: lastAnchor + }, -1, true); + } + me.iterate(majorTicks, function (position, labelText, i) { + anchor = position * xx + dx + startGap; + me.putMarker('vertical-' + (i % 2 ? 'odd' : 'even'), { + x: anchor, + width: lastAnchor - anchor + }, j = i, true); + lastAnchor = anchor; + }); + j++; + anchor = attr.length + attr.startGap + attr.endGap; + me.putMarker('vertical-' + (j % 2 ? 'odd' : 'even'), { + x: anchor, + width: lastAnchor - anchor + }, j, true); + } else if (position === 'radial') { + me.iterate(majorTicks, function (position, labelText, i) { + anchor = position / attr.max * attr.length; + me.putMarker('circular-' + (i % 2 ? 'odd' : 'even'), { + scalingX: anchor, + scalingY: anchor + }, i, true); + lastAnchor = anchor; + }); + } else if (position === 'angular') { + me.iterate(majorTicks, function (position, labelText, i) { + anchor = position / (attr.max + 1) * Math.PI * 2 + attr.baseRotation; + me.putMarker('radial-' + (i % 2 ? 'odd' : 'even'), { + rotationRads: anchor, + rotationCenterX: 0, + rotationCenterY: 0, + scalingX: attr.length, + scalingY: attr.length + }, i, true); + lastAnchor = anchor; + }); + } + } + } + }, + + doThicknessChanged: function () { + var axis = this.getAxis(); + if (axis) { + axis.onThicknessChanged(); + } + }, + + render: function (surface, ctx, clipRegion) { + var me = this, + layout = me.getLayoutContext(); + if (layout) { + if (false === me.renderLabels(surface, ctx, layout, clipRegion)) { + return false; + } + ctx.beginPath(); + me.renderTicks(surface, ctx, layout, clipRegion); + me.renderAxisLine(surface, ctx, layout, clipRegion); + me.renderGridLines(surface, ctx, layout, clipRegion); + ctx.stroke(); + } + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/grid/CircularGrid.js b/vendor/touch/src/chart/grid/CircularGrid.js new file mode 100644 index 000000000..496d72132 --- /dev/null +++ b/vendor/touch/src/chart/grid/CircularGrid.js @@ -0,0 +1,19 @@ +/** + * @class Ext.chart.grid.CircularGrid + * @extends Ext.draw.sprite.Circle + * + * Circular Grid sprite. Used by Radar chart to render a series of concentric circles. + */ +Ext.define('Ext.chart.grid.CircularGrid', { + extend: 'Ext.draw.sprite.Circle', + alias: 'grid.circular', + + inheritableStatics: { + def: { + defaults: { + r: 1, + strokeStyle: '#DDD' + } + } + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/grid/HorizontalGrid.js b/vendor/touch/src/chart/grid/HorizontalGrid.js new file mode 100644 index 000000000..7aaf70d46 --- /dev/null +++ b/vendor/touch/src/chart/grid/HorizontalGrid.js @@ -0,0 +1,43 @@ +/** + * @class Ext.chart.grid.HorizontalGrid + * @extends Ext.draw.sprite.Sprite + * + * Horizontal Grid sprite. Used in Cartesian Charts. + */ +Ext.define("Ext.chart.grid.HorizontalGrid", { + extend: 'Ext.draw.sprite.Sprite', + alias: 'grid.horizontal', + + inheritableStatics: { + def: { + processors: { + x: 'number', + y: 'number', + width: 'number', + height: 'number' + }, + + defaults: { + x: 0, + y: 0, + width: 1, + height: 1, + strokeStyle: '#DDD' + } + } + }, + + render: function (surface, ctx, clipRegion) { + var attr = this.attr, + y = surface.roundPixel(attr.y), + halfLineWidth = ctx.lineWidth * 0.5; + ctx.beginPath(); + ctx.rect(clipRegion[0] - surface.matrix.getDX(), y + halfLineWidth, +clipRegion[2], attr.height); + ctx.fill(); + + ctx.beginPath(); + ctx.moveTo(clipRegion[0] - surface.matrix.getDX(), y + halfLineWidth); + ctx.lineTo(clipRegion[0] + clipRegion[2] - surface.matrix.getDX(), y + halfLineWidth); + ctx.stroke(); + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/grid/RadialGrid.js b/vendor/touch/src/chart/grid/RadialGrid.js new file mode 100644 index 000000000..a56bb68d6 --- /dev/null +++ b/vendor/touch/src/chart/grid/RadialGrid.js @@ -0,0 +1,44 @@ +/** + * @class Ext.chart.grid.RadialGrid + * @extends Ext.draw.sprite.Path + * + * Radial Grid sprite. Used by Radar chart to render a series of radial lines. + * Represents the scale of the radar chart on the yField. + */ +Ext.define('Ext.chart.grid.RadialGrid', { + extend: 'Ext.draw.sprite.Path', + alias: 'grid.radial', + + inheritableStatics: { + def: { + processors: { + startRadius: 'number', + endRadius: 'number' + }, + + defaults: { + startRadius: 0, + endRadius: 1, + scalingCenterX: 0, + scalingCenterY: 0, + strokeStyle: '#DDD' + }, + + dirtyTriggers: { + startRadius: 'path,bbox', + endRadius: 'path,bbox' + } + } + }, + + render: function () { + this.callSuper(arguments); + }, + + updatePath: function (path, attr) { + var startRadius = attr.startRadius, + endRadius = attr.endRadius; + path.moveTo(startRadius, 0); + path.lineTo(endRadius, 0); + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/grid/VerticalGrid.js b/vendor/touch/src/chart/grid/VerticalGrid.js new file mode 100644 index 000000000..1404a53f3 --- /dev/null +++ b/vendor/touch/src/chart/grid/VerticalGrid.js @@ -0,0 +1,43 @@ +/** + * @class Ext.chart.grid.VerticalGrid + * @extends Ext.draw.sprite.Sprite + * + * Vertical Grid sprite. Used in Cartesian Charts. + */ +Ext.define("Ext.chart.grid.VerticalGrid", { + extend: 'Ext.draw.sprite.Sprite', + alias: 'grid.vertical', + + inheritableStatics: { + def: { + processors: { + x: 'number', + y: 'number', + width: 'number', + height: 'number' + }, + + defaults: { + x: 0, + y: 0, + width: 1, + height: 1, + strokeStyle: '#DDD' + } + } + }, + + render: function (surface, ctx, clipRegion) { + var attr = this.attr, + x = surface.roundPixel(attr.x), + halfLineWidth = ctx.lineWidth * 0.5; + ctx.beginPath(); + ctx.rect(x - halfLineWidth, clipRegion[1] - surface.matrix.getDY(), attr.width, clipRegion[3]); + ctx.fill(); + + ctx.beginPath(); + ctx.moveTo(x - halfLineWidth, clipRegion[1] - surface.matrix.getDY()); + ctx.lineTo(x - halfLineWidth, clipRegion[1] + clipRegion[3] - surface.matrix.getDY()); + ctx.stroke(); + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/interactions/Abstract.js b/vendor/touch/src/chart/interactions/Abstract.js new file mode 100644 index 000000000..186081d38 --- /dev/null +++ b/vendor/touch/src/chart/interactions/Abstract.js @@ -0,0 +1,246 @@ +/** + * @class Ext.chart.interactions.Abstract + * + * Defines a common abstract parent class for all interactions. + * + */ +Ext.define('Ext.chart.interactions.Abstract', { + + xtype: 'interaction', + + mixins: { + observable: 'Ext.mixin.Observable' + }, + + config: { + /** + * @cfg {String} gesture + * Specifies which gesture type should be used for starting the interaction. + */ + gesture: 'tap', + + /** + * @cfg {Ext.chart.AbstractChart} chart The chart that the interaction is bound. + */ + chart: null, + + /** + * @cfg {Boolean} enabled 'true' if the interaction is enabled. + */ + enabled: true + }, + + /** + * Android device is emerging too many events so if we re-render every frame it will take for-ever to finish a frame. + * This throttle technique will limit the timespan between two frames. + */ + throttleGap: 0, + + stopAnimationBeforeSync: false, + + constructor: function (config) { + var me = this; + me.initConfig(config); + Ext.ComponentManager.register(this); + }, + + /** + * @protected + * A method to be implemented by subclasses where all event attachment should occur. + */ + initialize: Ext.emptyFn, + + updateChart: function (newChart, oldChart) { + var me = this, gestures = me.getGestures(); + if (oldChart) { + me.removeChartListener(oldChart); + } + if (newChart) { + me.addChartListener(); + } + }, + + updateEnabled: function (enabled) { + var me = this, + chart = me.getChart(); + if (chart) { + if (enabled) { + me.addChartListener(); + } else { + me.removeChartListener(chart); + } + } + }, + + getGestures: function () { + var gestures = {}; + gestures[this.getGesture()] = this.onGesture; + return gestures; + }, + + /** + * @protected + * Placeholder method. + */ + onGesture: Ext.emptyFn, + + /** + * @protected Find and return a single series item corresponding to the given event, + * or null if no matching item is found. + * @param {Event} e + * @return {Object} the item object or null if none found. + */ + getItemForEvent: function (e) { + var me = this, + chart = me.getChart(), + chartXY = chart.getEventXY(e); + return chart.getItemForPoint(chartXY[0], chartXY[1]); + }, + + /** + * @protected Find and return all series items corresponding to the given event. + * @param {Event} e + * @return {Array} array of matching item objects + */ + getItemsForEvent: function (e) { + var me = this, + chart = me.getChart(), + chartXY = chart.getEventXY(e); + return chart.getItemsForPoint(chartXY[0], chartXY[1]); + }, + + /** + * @private + */ + addChartListener: function () { + var me = this, + chart = me.getChart(), + gestures = me.getGestures(), + gesture; + + if (!me.getEnabled()) { + return; + } + + function insertGesture(name, fn) { + chart.on( + name, + // wrap the handler so it does not fire if the event is locked by another interaction + me.listeners[name] = function (e) { + var locks = me.getLocks(), result; + if (me.getEnabled() && (!(name in locks) || locks[name] === me)) { + result = (Ext.isFunction(fn) ? fn : me[fn]).apply(this, arguments); + if (result === false && e && e.stopPropagation) { + e.stopPropagation(); + } + return result; + } + }, + me + ); + } + + me.listeners = me.listeners || {}; + for (gesture in gestures) { + insertGesture(gesture, gestures[gesture]); + } + }, + + removeChartListener: function (chart) { + var me = this, + gestures = me.getGestures(), + gesture; + + function removeGesture(name) { + chart.un(name, me.listeners[name]); + delete me.listeners[name]; + } + + for (gesture in gestures) { + removeGesture(gesture); + } + }, + + lockEvents: function () { + var me = this, + locks = me.getLocks(), + args = Array.prototype.slice.call(arguments), + i = args.length; + while (i--) { + locks[args[i]] = me; + } + }, + + unlockEvents: function () { + var locks = this.getLocks(), + args = Array.prototype.slice.call(arguments), + i = args.length; + while (i--) { + delete locks[args[i]]; + } + }, + + getLocks: function () { + var chart = this.getChart(); + return chart.lockedEvents || (chart.lockedEvents = {}); + }, + + isMultiTouch: function () { + if (Ext.browser.is.IE10) { + return true; + } + return !(Ext.os.is.MultiTouch === false || Ext.browser.is.AndroidStock2 || Ext.os.is.Desktop); + }, + + initializeDefaults: Ext.emptyFn, + + doSync: function () { + var chart = this.getChart(); + if (this.syncTimer) { + clearTimeout(this.syncTimer); + this.syncTimer = null; + } + if (this.stopAnimationBeforeSync) { + chart.resizing = true; + } + chart.redraw(); + if (this.stopAnimationBeforeSync) { + chart.resizing = false; + } + this.syncThrottle = Date.now() + this.throttleGap; + }, + + sync: function () { + var me = this; + if (me.throttleGap && Ext.frameStartTime < me.syncThrottle) { + if (me.syncTimer) { + return; + } + me.syncTimer = setTimeout(function () { + me.doSync(); + }, me.throttleGap); + } else { + me.doSync(); + } + }, + + getItemId: function () { + return this.getId(); + }, + + isXType: function (xtype) { + return xtype === 'interaction'; + }, + + destroy: function () { + Ext.ComponentManager.unregister(this); + this.listeners = []; + this.callSuper(); + } +}, function () { + if (Ext.browser.is.AndroidStock2) { + this.prototype.throttleGap = 20; + } else if (Ext.os.is.Android4) { + this.prototype.throttleGap = 40; + } +}); diff --git a/vendor/touch/src/chart/interactions/CrossZoom.js b/vendor/touch/src/chart/interactions/CrossZoom.js new file mode 100644 index 000000000..c6ea6d8ea --- /dev/null +++ b/vendor/touch/src/chart/interactions/CrossZoom.js @@ -0,0 +1,409 @@ +/** + * @class Ext.chart.interactions.CrossZoom + * @extends Ext.chart.interactions.Abstract + * + * The CrossZoom interaction allows the user to zoom in on a selected area of the chart. + * + * @example preview + * var lineChart = new Ext.chart.CartesianChart({ + * interactions: [{ + * type: 'crosszoom' + * }], + * animate: true, + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':'metric one', 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':'metric two', 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':'metric three', 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':'metric four', 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':'metric five', 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * axes: [{ + * type: 'numeric', + * position: 'left', + * fields: ['data1'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * grid: true, + * minimum: 0 + * }, { + * type: 'category', + * position: 'bottom', + * fields: ['name'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * } + * }], + * series: [{ + * type: 'line', + * highlight: { + * size: 7, + * radius: 7 + * }, + * style: { + * stroke: 'rgb(143,203,203)' + * }, + * xField: 'name', + * yField: 'data1', + * marker: { + * type: 'path', + * path: ['M', -2, 0, 0, 2, 2, 0, 0, -2, 'Z'], + * stroke: 'blue', + * lineWidth: 0 + * } + * }, { + * type: 'line', + * highlight: { + * size: 7, + * radius: 7 + * }, + * fill: true, + * xField: 'name', + * yField: 'data3', + * marker: { + * type: 'circle', + * radius: 4, + * lineWidth: 0 + * } + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(lineChart); + */ +Ext.define('Ext.chart.interactions.CrossZoom', { + + extend: 'Ext.chart.interactions.Abstract', + + type: 'crosszoom', + alias: 'interaction.crosszoom', + + config: { + /** + * @cfg {Object/Array} axes + * Specifies which axes should be made navigable. The config value can take the following formats: + * + * - An Object whose keys correspond to the {@link Ext.chart.axis.Axis#position position} of each + * axis that should be made navigable. Each key's value can either be an Object with further + * configuration options for each axis or simply `true` for a default set of options. + * { + * type: 'crosszoom', + * axes: { + * left: { + * maxZoom: 5, + * allowPan: false + * }, + * bottom: true + * } + * } + * + * If using the full Object form, the following options can be specified for each axis: + * + * - minZoom (Number) A minimum zoom level for the axis. Defaults to `1` which is its natural size. + * - maxZoom (Number) A maximum zoom level for the axis. Defaults to `10`. + * - startZoom (Number) A starting zoom level for the axis. Defaults to `1`. + * - allowZoom (Boolean) Whether zooming is allowed for the axis. Defaults to `true`. + * - allowPan (Boolean) Whether panning is allowed for the axis. Defaults to `true`. + * - startPan (Boolean) A starting panning offset for the axis. Defaults to `0`. + * + * - An Array of strings, each one corresponding to the {@link Ext.chart.axis.Axis#position position} + * of an axis that should be made navigable. The default options will be used for each named axis. + * + * { + * type: 'crosszoom', + * axes: ['left', 'bottom'] + * } + * + * If the `axes` config is not specified, it will default to making all axes navigable with the + * default axis options. + */ + axes: true, + + gesture: 'drag', + + undoButton: {} + }, + + stopAnimationBeforeSync: false, + + zoomAnimationInProgress: false, + + constructor: function () { + this.callSuper(arguments); + this.zoomHistory = []; + }, + + applyAxes: function (axesConfig) { + var result = {}; + if (axesConfig === true) { + return { + top: {}, + right: {}, + bottom: {}, + left: {} + }; + } else if (Ext.isArray(axesConfig)) { + // array of axis names - translate to full object form + result = {}; + Ext.each(axesConfig, function (axis) { + result[axis] = {}; + }); + } else if (Ext.isObject(axesConfig)) { + Ext.iterate(axesConfig, function (key, val) { + // axis name with `true` value -> translate to object + if (val === true) { + result[key] = {}; + } else if (val !== false) { + result[key] = val; + } + }); + } + return result; + }, + + applyUndoButton: function (button, oldButton) { + var me = this; + if (button) { + if (oldButton) { + oldButton.destroy(); + } + return Ext.create('Ext.Button', Ext.apply({ + cls: [], + iconCls: 'refresh', + text: 'Undo Zoom', + disabled: true, + handler: function () { + me.undoZoom(); + } + }, button)); + } else if (oldButton) { + oldButton.destroy(); + } + }, + + getGestures: function () { + var me = this, + gestures = {}; + gestures[me.getGesture()] = 'onGesture'; + gestures[me.getGesture() + 'start'] = 'onGestureStart'; + gestures[me.getGesture() + 'end'] = 'onGestureEnd'; + gestures.doubletap = 'onDoubleTap'; + return gestures; + }, + + getSurface: function () { + return this.getChart() && this.getChart().getSurface('main'); + }, + + setSeriesOpacity: function (opacity) { + var surface = this.getChart() && this.getChart().getSurface('series-surface', 'series'); + if (surface) { + surface.element.setStyle('opacity', opacity); + } + }, + + onGestureStart: function (e) { + var me = this, + chart = me.getChart(), + surface = me.getSurface(), + region = chart.getInnerRegion(), + chartWidth = region[2], + chartHeight = region[3], + xy = chart.element.getXY(), + x = e.pageX - xy[0] - region[0], + y = e.pageY - xy[1] - region[1]; + + if (me.zoomAnimationInProgress) { + return; + } + if (x > 0 && x < chartWidth && y > 0 && y < chartHeight) { + me.lockEvents(me.getGesture()); + me.startX = x; + me.startY = y; + me.selectionRect = surface.add({ + type: 'rect', + globalAlpha: 0.5, + fillStyle: 'rgba(80,80,140,0.5)', + strokeStyle: 'rgba(80,80,140,1)', + lineWidth: 2, + x: x, + y: y, + width: 0, + height: 0, + zIndex: 10000 + }); + me.setSeriesOpacity(0.8); + return false; + } + }, + + onGesture: function (e) { + var me = this; + if (me.zoomAnimationInProgress) { + return; + } + if (me.getLocks()[me.getGesture()] === me) { + var chart = me.getChart(), + surface = me.getSurface(), + region = chart.getInnerRegion(), + chartWidth = region[2], + chartHeight = region[3], + xy = chart.element.getXY(), + x = e.pageX - xy[0] - region[0], + y = e.pageY - xy[1] - region[1]; + + if (x < 0) { + x = 0; + } else if (x > chartWidth) { + x = chartWidth; + } + if (y < 0) { + y = 0; + } else if (y > chartHeight) { + y = chartHeight; + } + me.selectionRect.setAttributes({ + width: x - me.startX, + height: y - me.startY + }); + if (Math.abs(me.startX - x) < 11 || Math.abs(me.startY - y) < 11) { + me.selectionRect.setAttributes({globalAlpha: 0.5}); + } else { + me.selectionRect.setAttributes({globalAlpha: 1}); + } + surface.renderFrame(); + return false; + } + }, + + onGestureEnd: function (e) { + var me = this; + if (me.zoomAnimationInProgress) { + return; + } + if (me.getLocks()[me.getGesture()] === me) { + var chart = me.getChart(), + surface = me.getSurface(), + region = chart.getInnerRegion(), + chartWidth = region[2], + chartHeight = region[3], + xy = chart.element.getXY(), + x = e.pageX - xy[0] - region[0], + y = e.pageY - xy[1] - region[1]; + + if (x < 0) { + x = 0; + } else if (x > chartWidth) { + x = chartWidth; + } + if (y < 0) { + y = 0; + } else if (y > chartHeight) { + y = chartHeight; + } + if (Math.abs(me.startX - x) < 11 || Math.abs(me.startY - y) < 11) { + surface.remove(me.selectionRect); + } else { + me.zoomBy([ + Math.min(me.startX, x) / chartWidth, + 1 - Math.max(me.startY, y) / chartHeight, + Math.max(me.startX, x) / chartWidth, + 1 - Math.min(me.startY, y) / chartHeight + ]); + + me.selectionRect.setAttributes({ + x: Math.min(me.startX, x), + y: Math.min(me.startY, y), + width: Math.abs(me.startX - x), + height: Math.abs(me.startY - y) + }); + + me.selectionRect.fx.setConfig(chart.getAnimate() || {duration: 0}); + me.selectionRect.setAttributes({ + globalAlpha: 0, + x: 0, + y: 0, + width: chartWidth, + height: chartHeight + }); + + me.zoomAnimationInProgress = true; + + chart.suspendThicknessChanged(); + me.selectionRect.fx.on('animationend', function () { + chart.resumeThicknessChanged(); + + surface.remove(me.selectionRect); + me.selectionRect = null; + + me.zoomAnimationInProgress = false; + }); + } + + surface.renderFrame(); + me.sync(); + me.unlockEvents(me.getGesture()); + me.setSeriesOpacity(1.0); + + if (!me.zoomAnimationInProgress) { + surface.remove(me.selectionRect); + me.selectionRect = null; + } + } + }, + + zoomBy: function (region) { + var me = this, + axisConfigs = me.getAxes(), + axes = me.getChart().getAxes(), + config, + zoomMap = {}; + + for (var i = 0; i < axes.length; i++) { + var axis = axes[i]; + config = axisConfigs[axis.getPosition()]; + if (config && config.allowZoom !== false) { + var isSide = axis.isSide(), + oldRange = axis.getVisibleRange(); + zoomMap[axis.getId()] = oldRange.slice(0); + if (!isSide) { + axis.setVisibleRange([ + (oldRange[1] - oldRange[0]) * region[0] + oldRange[0], + (oldRange[1] - oldRange[0]) * region[2] + oldRange[0] + ]); + } else { + axis.setVisibleRange([ + (oldRange[1] - oldRange[0]) * region[1] + oldRange[0], + (oldRange[1] - oldRange[0]) * region[3] + oldRange[0] + ]); + } + } + } + + me.zoomHistory.push(zoomMap); + me.getUndoButton().setDisabled(false); + }, + + undoZoom: function () { + var zoomMap = this.zoomHistory.pop(), + axes = this.getChart().getAxes(); + if (zoomMap) { + for (var i = 0; i < axes.length; i++) { + var axis = axes[i]; + if (zoomMap[axis.getId()]) { + axis.setVisibleRange(zoomMap[axis.getId()]); + } + } + } + this.getUndoButton().setDisabled(this.zoomHistory.length === 0); + this.sync(); + }, + + onDoubleTap: function (e) { + this.undoZoom(); + } +}); diff --git a/vendor/touch/src/chart/interactions/Crosshair.js b/vendor/touch/src/chart/interactions/Crosshair.js new file mode 100644 index 000000000..bbe4938e7 --- /dev/null +++ b/vendor/touch/src/chart/interactions/Crosshair.js @@ -0,0 +1,410 @@ +/** + * The Crosshair interaction allows the user to get precise values for a specific point on the chart. + * The values are obtained by single-touch dragging on the chart. + * + * @example preview + * var lineChart = Ext.create('Ext.chart.CartesianChart', { + * innerPadding: 20, + * interactions: [{ + * type: 'crosshair', + * axes: { + * left: { + * label: { + * fillStyle: 'white' + * }, + * rect: { + * fillStyle: 'brown', + * radius: 6 + * } + * }, + * bottom: { + * label: { + * fontSize: '14px', + * fontWeight: 'bold' + * } + * } + * }, + * lines: { + * horizontal: { + * strokeStyle: 'brown', + * lineWidth: 2, + * lineDash: [20, 2, 2, 2, 2, 2, 2, 2] + * } + * } + * }], + * store: { + * fields: ['name', 'data'], + * data: [ + * {name: 'apple', data: 300}, + * {name: 'orange', data: 900}, + * {name: 'banana', data: 800}, + * {name: 'pear', data: 400}, + * {name: 'grape', data: 500} + * ] + * }, + * axes: [{ + * type: 'numeric', + * position: 'left', + * fields: ['data'], + * title: { + * text: 'Value', + * fontSize: 15 + * }, + * grid: true, + * label: { + * rotationRads: -Math.PI / 4 + * } + * }, { + * type: 'category', + * position: 'bottom', + * fields: ['name'], + * title: { + * text: 'Category', + * fontSize: 15 + * } + * }], + * series: [{ + * type: 'line', + * style: { + * strokeStyle: 'black' + * }, + * xField: 'name', + * yField: 'data', + * marker: { + * type: 'circle', + * radius: 5, + * fillStyle: 'lightblue' + * } + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(lineChart); + */ + +Ext.define('Ext.chart.interactions.Crosshair', { + + extend: 'Ext.chart.interactions.Abstract', + requires: [ + 'Ext.chart.grid.HorizontalGrid', + 'Ext.chart.grid.VerticalGrid', + 'Ext.chart.CartesianChart', + 'Ext.chart.axis.layout.Discrete' + ], + + type: 'crosshair', + alias: 'interaction.crosshair', + + config: { + /** + * @cfg {Object} axes + * Specifies label text and label rect configs on per axis basis or as a single config for all axes. + * + * { + * type: 'crosshair', + * axes: { + * label: { fillStyle: 'white' }, + * rect: { fillStyle: 'maroon'} + * } + * } + * + * In case per axis configuration is used, an object with keys corresponding + * to the {@link Ext.chart.axis.Axis#position position} must be provided. + * + * { + * type: 'crosshair', + * axes: { + * left: { + * label: { fillStyle: 'white' }, + * rect: { + * fillStyle: 'maroon', + * radius: 4 + * } + * }, + * bottom: { + * label: { + * fontSize: '14px', + * fontWeight: 'bold' + * }, + * rect: { fillStyle: 'white' } + * } + * } + * + * If the `axes` config is not specified, the following defaults will be used: + * - `label` will use values from the {@link Ext.chart.axis.Axis#label label} config. + * - `rect` will use the 'white' fillStyle. + */ + axes: { + top: {label: {}, rect: {}}, + right: {label: {}, rect: {}}, + bottom: {label: {}, rect: {}}, + left: {label: {}, rect: {}} + }, + + /** + * @cfg {Object} lines + * Specifies attributes of horizontal and vertical lines that make up the crosshair. + * If this config is missing, black dashed lines will be used. + * + * { + * horizontal: { + * strokeStyle: 'red', + * lineDash: [] // solid line + * }, + * vertical: { + * lineWidth: 2, + * lineDash: [15, 5, 5, 5] + * } + * } + */ + lines: { + horizontal: { + strokeStyle: 'black', + lineDash: [5, 5] + }, + vertical: { + strokeStyle: 'black', + lineDash: [5, 5] + } + }, + gesture: 'drag' + }, + + applyAxes: function (axesConfig, oldAxesConfig) { + return Ext.merge(oldAxesConfig || {}, axesConfig); + }, + + applyLines: function (linesConfig, oldLinesConfig) { + return Ext.merge(oldLinesConfig || {}, linesConfig); + }, + + updateChart: function (chart) { + if (!(chart instanceof Ext.chart.CartesianChart)) { + throw 'Crosshair interaction can only be used on cartesian charts.'; + } + this.callParent(arguments); + }, + + getGestures: function () { + var me = this, + gestures = {}; + gestures[me.getGesture()] = 'onGesture'; + gestures[me.getGesture() + 'start'] = 'onGestureStart'; + gestures[me.getGesture() + 'end'] = 'onGestureEnd'; + return gestures; + }, + + onGestureStart: function (e) { + var me = this, + chart = me.getChart(), + surface = chart.getSurface('overlay-surface'), + region = chart.getInnerRegion(), + chartWidth = region[2], + chartHeight = region[3], + xy = chart.element.getXY(), + x = e.pageX - xy[0] - region[0], + y = e.pageY - xy[1] - region[1], + axes = chart.getAxes(), + axesConfig = me.getAxes(), + linesConfig = me.getLines(), + axis, axisSurface, axisRegion, axisWidth, axisHeight, axisPosition, + axisLabel, labelPadding, + axisSprite, attr, axisThickness, lineWidth, halfLineWidth, + i; + + if (x > 0 && x < chartWidth && y > 0 && y < chartHeight) { + me.lockEvents(me.getGesture()); + me.horizontalLine = surface.add(Ext.apply({ + xclass: 'Ext.chart.grid.HorizontalGrid', + x: 0, + y: y, + width: chartWidth + }, linesConfig.horizontal)); + me.verticalLine = surface.add(Ext.apply({ + xclass: 'Ext.chart.grid.VerticalGrid', + x: x, + y: 0, + height: chartHeight + }, linesConfig.vertical)); + me.axesLabels = me.axesLabels || {}; + for (i = 0; i < axes.length; i++) { + axis = axes[i]; + axisSurface = axis.getSurface(); + axisRegion = axisSurface.getRegion(); + axisSprite = axis.getSprites()[0]; + axisWidth = axisRegion[2]; + axisHeight = axisRegion[3]; + axisPosition = axis.getPosition(); + attr = axisSprite.attr; + axisThickness = axisSprite.thickness; + lineWidth = attr.axisLine ? attr.lineWidth : 0; + halfLineWidth = lineWidth / 2; + labelPadding = Math.max(attr.majorTickSize, attr.minorTickSize) + lineWidth; + + axisLabel = me.axesLabels[axisPosition] = axisSurface.add({type: 'composite'}); + axisLabel.labelRect = axisLabel.add(Ext.apply({ + type: 'rect', + fillStyle: 'white', + x: axisPosition === 'right' ? lineWidth : axisSurface.roundPixel(axisWidth - axisThickness - labelPadding) - halfLineWidth, + y: axisPosition === 'bottom' ? lineWidth : axisSurface.roundPixel(axisHeight - axisThickness - labelPadding) - lineWidth, + width: axisPosition === 'left' ? axisThickness - halfLineWidth + labelPadding : axisThickness + labelPadding, + height: axisPosition === 'top' ? axisThickness + labelPadding : axisThickness + labelPadding + }, axesConfig.rect || axesConfig[axisPosition].rect)); + axisLabel.labelText = axisLabel.add(Ext.apply(Ext.Object.chain(axis.config.label), axesConfig.label || axesConfig[axisPosition].label, { + type: 'text', + x: (function () { + switch (axisPosition) { + case 'left': + return axisWidth - labelPadding - halfLineWidth - axisThickness / 2; + case 'right': + return axisThickness / 2 + labelPadding - halfLineWidth; + default: + return 0; + } + })(), + y: (function () { + switch (axisPosition) { + case 'top': + return axisHeight - labelPadding - halfLineWidth - axisThickness / 2; + case 'bottom': + return axisThickness / 2 + labelPadding; + default: + return 0; + } + })() + })); + } + return false; + } + + }, + + onGesture: function (e) { + var me = this; + if (me.getLocks()[me.getGesture()] !== me) { + return; + } + var chart = me.getChart(), + surface = chart.getSurface('overlay-surface'), + region = Ext.Array.slice(chart.getInnerRegion()), + padding = chart.getInnerPadding(), + px = padding.left, + py = padding.top, + chartWidth = region[2], + chartHeight = region[3], + xy = chart.element.getXY(), + x = e.pageX - xy[0] - region[0], + y = e.pageY - xy[1] - region[1], + axes = chart.getAxes(), + axis, axisPosition, axisAlignment, axisSurface, axisSprite, axisMatrix, + axisLayoutContext, axisSegmenter, + axisLabel, labelBBox, textPadding, + xx, yy, dx, dy, + xValue, yValue, + text, + i; + + if (x < 0) { + x = 0; + } else if (x > chartWidth) { + x = chartWidth; + } + if (y < 0) { + y = 0; + } else if (y > chartHeight) { + y = chartHeight; + } + x += px; + y += py; + + for (i = 0; i < axes.length; i++) { + axis = axes[i]; + axisPosition = axis.getPosition(); + axisAlignment = axis.getAlignment(); + axisSurface = axis.getSurface(); + axisSprite = axis.getSprites()[0]; + axisMatrix = axisSprite.attr.matrix; + textPadding = axisSprite.attr.textPadding * 2; + axisLabel = me.axesLabels[axisPosition]; + axisLayoutContext = axisSprite.getLayoutContext(); + axisSegmenter = axis.getSegmenter(); + + if (axisLabel) { + if (axisAlignment === 'vertical') { + yy = axisMatrix.getYY(); + dy = axisMatrix.getDY(); + yValue = (y - dy - py) / yy; + if (axis.getLayout() instanceof Ext.chart.axis.layout.Discrete) { + y = Math.round(yValue) * yy + dy + py; + yValue = axisSegmenter.from(Math.round(yValue)); + yValue = axisSprite.attr.data[yValue]; + } else { + yValue = axisSegmenter.from(yValue); + } + text = axisSegmenter.renderer(yValue, axisLayoutContext); + + axisLabel.setAttributes({translationY: y - py}); + axisLabel.labelText.setAttributes({text: text}); + labelBBox = axisLabel.labelText.getBBox(); + axisLabel.labelRect.setAttributes({ + height: labelBBox.height + textPadding, + y: -(labelBBox.height + textPadding) / 2 + }); + axisSurface.renderFrame(); + } else { + xx = axisMatrix.getXX(); + dx = axisMatrix.getDX(); + xValue = (x - dx - px) / xx; + if (axis.getLayout() instanceof Ext.chart.axis.layout.Discrete) { + x = Math.round(xValue) * xx + dx + px; + xValue = axisSegmenter.from(Math.round(xValue)); + xValue = axisSprite.attr.data[xValue]; + } else { + xValue = axisSegmenter.from(xValue); + } + text = axisSegmenter.renderer(xValue, axisLayoutContext); + + axisLabel.setAttributes({translationX: x - px}); + axisLabel.labelText.setAttributes({text: text}); + labelBBox = axisLabel.labelText.getBBox(); + axisLabel.labelRect.setAttributes({ + width: labelBBox.width + textPadding, + x: -(labelBBox.width + textPadding) / 2 + }); + axisSurface.renderFrame(); + } + } + } + me.horizontalLine.setAttributes({y: y}); + me.verticalLine.setAttributes({x: x}); + surface.renderFrame(); + return false; + }, + + onGestureEnd: function (e) { + var me = this, + chart = me.getChart(), + surface = chart.getSurface('overlay-surface'), + axes = chart.getAxes(), + axis, axisPosition, axisSurface, axisLabel, + i; + + surface.remove(me.verticalLine); + surface.remove(me.horizontalLine); + + for (i = 0; i < axes.length; i++) { + axis = axes[i]; + axisPosition = axis.getPosition(); + axisSurface = axis.getSurface(); + axisLabel = me.axesLabels[axisPosition]; + if (axisLabel) { + delete me.axesLabels[axisPosition]; + axisSurface.remove(axisLabel); + } + axisSurface.renderFrame(); + } + + surface.renderFrame(); + me.unlockEvents(me.getGesture()); + } + +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/interactions/ItemHighlight.js b/vendor/touch/src/chart/interactions/ItemHighlight.js new file mode 100644 index 000000000..742e952db --- /dev/null +++ b/vendor/touch/src/chart/interactions/ItemHighlight.js @@ -0,0 +1,38 @@ +/** + * @class Ext.chart.interactions.ItemHighlight + * @extends Ext.chart.interactions.Abstract + * + * The ItemHighlight interaction allows the user to highlight series items in the chart. + */ +Ext.define('Ext.chart.interactions.ItemHighlight', { + + extend: 'Ext.chart.interactions.Abstract', + + type: 'itemhighlight', + alias: 'interaction.itemhighlight', + + config: { + /** + * @cfg {String} gesture + * Defines the gesture type that should trigger item highlighting. + */ + gesture: 'tap' + }, + + getGestures: function () { + var gestures = {}; + gestures['item' + this.getGesture()] = 'onGesture'; + gestures[this.getGesture()] = 'onFailedGesture'; + return gestures; + }, + + onGesture: function (series, item, e) { + e.highlightItem = item; + return false; + }, + + onFailedGesture: function (e) { + this.getChart().setHighlightItem(e.highlightItem || null); + this.sync(); + } +}); diff --git a/vendor/touch/src/chart/interactions/ItemInfo.js b/vendor/touch/src/chart/interactions/ItemInfo.js new file mode 100644 index 000000000..4108150e6 --- /dev/null +++ b/vendor/touch/src/chart/interactions/ItemInfo.js @@ -0,0 +1,107 @@ +/** + * The ItemInfo interaction allows displaying detailed information about a series data + * point in a popup panel. + * + * To attach this interaction to a chart, include an entry in the chart's + * {@link Ext.chart.AbstractChart#interactions interactions} config with the `iteminfo` type: + * + * new Ext.chart.AbstractChart({ + * renderTo: Ext.getBody(), + * width: 800, + * height: 600, + * store: store1, + * axes: [ ...some axes options... ], + * series: [ ...some series options... ], + * interactions: [{ + * type: 'iteminfo', + * listeners: { + * show: function(me, item, panel) { + * panel.setHtml('Stock Price: $' + item.record.get('price')); + * } + * } + * }] + * }); + */ +Ext.define('Ext.chart.interactions.ItemInfo', { + + extend: 'Ext.chart.interactions.Abstract', + + type: 'iteminfo', + alias: 'interaction.iteminfo', + + /** + * @event show + * Fires when the info panel is shown. + * @param {Ext.chart.interactions.ItemInfo} this The interaction instance + * @param {Object} item The item whose info is being displayed + * @param {Ext.Panel} panel The panel for displaying the info + */ + + config: { + /** + * @cfg {String} gesture + * Defines the gesture type that should trigger the item info panel to be displayed. + */ + gesture: 'itemtap', + + /** + * @cfg {Object} panel + * An optional set of configuration overrides for the {@link Ext.Panel} that gets + * displayed. This object will be merged with the default panel configuration. + */ + panel: { + modal: true, + centered: true, + width: 250, + height: 300, + styleHtmlContent: true, + scrollable: 'vertical', + hideOnMaskTap: true, + fullscreen: false, + hidden: true, + zIndex: 30, + items: [ + { + docked: 'top', + xtype: 'toolbar', + title: 'Item Detail' + } + ] + } + }, + + applyPanel: function (panel, oldPanel) { + return Ext.factory(panel, 'Ext.Panel', oldPanel); + }, + + updatePanel: function (panel, oldPanel) { + if (panel) { + panel.on('hide', "reset", this); + } + if (oldPanel) { + oldPanel.un('hide', "reset", this); + } + }, + + onGesture: function (series, item) { + var me = this, + panel = me.getPanel(); + me.item = item; + me.fireEvent('show', me, item, panel); + Ext.Viewport.add(panel); + panel.show('pop'); + series.setAttributesForItem(item, { highlighted: true }); + me.sync(); + return false; + }, + + reset: function () { + var me = this, + item = me.item; + if (item) { + item.series.setAttributesForItem(item, { highlighted: false }); + delete me.item; + me.sync(); + } + } +}); diff --git a/vendor/touch/src/chart/interactions/PanZoom.js b/vendor/touch/src/chart/interactions/PanZoom.js new file mode 100644 index 000000000..289abbac6 --- /dev/null +++ b/vendor/touch/src/chart/interactions/PanZoom.js @@ -0,0 +1,502 @@ +/** + * The PanZoom interaction allows the user to navigate the data for one or more chart + * axes by panning and/or zooming. Navigation can be limited to particular axes. Zooming is + * performed by pinching on the chart or axis area; panning is performed by single-touch dragging. + * + * For devices which do not support multiple-touch events, zooming can not be done via pinch gestures; in this case the + * interaction will allow the user to perform both zooming and panning using the same single-touch drag gesture. + * {@link #modeToggleButton} provides a button to indicate and toggle between two modes. + * + * @example preview + * var lineChart = new Ext.chart.CartesianChart({ + * interactions: [{ + * type: 'panzoom', + * zoomOnPanGesture: true + * }], + * animate: true, + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':'metric one', 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':'metric two', 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':'metric three', 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':'metric four', 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':'metric five', 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * axes: [{ + * type: 'numeric', + * position: 'left', + * fields: ['data1'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * grid: true, + * minimum: 0 + * }, { + * type: 'category', + * position: 'bottom', + * fields: ['name'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * } + * }], + * series: [{ + * type: 'line', + * highlight: { + * size: 7, + * radius: 7 + * }, + * style: { + * stroke: 'rgb(143,203,203)' + * }, + * xField: 'name', + * yField: 'data1', + * marker: { + * type: 'path', + * path: ['M', -2, 0, 0, 2, 2, 0, 0, -2, 'Z'], + * stroke: 'blue', + * lineWidth: 0 + * } + * }, { + * type: 'line', + * highlight: { + * size: 7, + * radius: 7 + * }, + * fill: true, + * xField: 'name', + * yField: 'data3', + * marker: { + * type: 'circle', + * radius: 4, + * lineWidth: 0 + * } + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(lineChart); + * + * The configuration object for the `panzoom` interaction type should specify which axes + * will be made navigable via the `axes` config. See the {@link #axes} config documentation + * for details on the allowed formats. If the `axes` config is not specified, it will default + * to making all axes navigable with the default axis options. + * + */ +Ext.define('Ext.chart.interactions.PanZoom', { + + extend: 'Ext.chart.interactions.Abstract', + + type: 'panzoom', + alias: 'interaction.panzoom', + requires: [ + 'Ext.util.Region', + 'Ext.draw.Animator' + ], + + config: { + + /** + * @cfg {Object/Array} axes + * Specifies which axes should be made navigable. The config value can take the following formats: + * + * - An Object with keys corresponding to the {@link Ext.chart.axis.Axis#position position} of each + * axis that should be made navigable. Each key's value can either be an Object with further + * configuration options for each axis or simply `true` for a default set of options. + * + * { + * type: 'panzoom', + * axes: { + * left: { + * maxZoom: 5, + * allowPan: false + * }, + * bottom: true + * } + * } + * + * If using the full Object form, the following options can be specified for each axis: + * + * - minZoom (Number) A minimum zoom level for the axis. Defaults to `1` which is its natural size. + * - maxZoom (Number) A maximum zoom level for the axis. Defaults to `10`. + * - startZoom (Number) A starting zoom level for the axis. Defaults to `1`. + * - allowZoom (Boolean) Whether zooming is allowed for the axis. Defaults to `true`. + * - allowPan (Boolean) Whether panning is allowed for the axis. Defaults to `true`. + * - startPan (Boolean) A starting panning offset for the axis. Defaults to `0`. + * + * - An Array of strings, each one corresponding to the {@link Ext.chart.axis.Axis#position position} + * of an axis that should be made navigable. The default options will be used for each named axis. + * + * { + * type: 'panzoom', + * axes: ['left', 'bottom'] + * } + * + * If the `axes` config is not specified, it will default to making all axes navigable with the + * default axis options. + */ + axes: { + top: {}, + right: {}, + bottom: {}, + left: {} + }, + + minZoom: null, + + maxZoom: null, + + /** + * @cfg {Boolean} showOverflowArrows + * If `true`, arrows will be conditionally shown at either end of each axis to indicate that the + * axis is overflowing and can therefore be panned in that direction. Set this to `false` to + * prevent the arrows from being displayed. + */ + showOverflowArrows: true, + + /** + * @cfg {Object} overflowArrowOptions + * A set of optional overrides for the overflow arrow sprites' options. Only relevant when + * {@link #showOverflowArrows} is `true`. + */ + + gesture: 'pinch', + + panGesture: 'drag', + + zoomOnPanGesture: false, + + modeToggleButton: { + cls: ['x-panzoom-toggle', 'x-zooming'], + iconCls: 'expand' + }, + + hideLabelInGesture: false //Ext.os.is.Android + }, + + stopAnimationBeforeSync: true, + + applyAxes: function (axesConfig, oldAxesConfig) { + return Ext.merge(oldAxesConfig || {}, axesConfig); + }, + + applyZoomOnPanGesture: function (zoomOnPanGesture) { + this.getChart(); + if (this.isMultiTouch()) { + return false; + } + return zoomOnPanGesture; + }, + + updateZoomOnPanGesture: function (zoomOnPanGesture) { + if (!this.isMultiTouch()) { + var button = this.getModeToggleButton(), + zoomModeCls = Ext.baseCSSPrefix + 'zooming'; + if (zoomOnPanGesture) { + button.addCls(zoomModeCls); + if (!button.config.hideText) { + button.setText('Zoom'); + } + } else { + button.removeCls(zoomModeCls); + if (!button.config.hideText) { + button.setText('Pan'); + } + } + } + }, + + toggleMode: function () { + var me = this; + if (!me.isMultiTouch()) { + me.setZoomOnPanGesture(!me.getZoomOnPanGesture()); + } + }, + + applyModeToggleButton: function (button, oldButton) { + var me = this, + result = Ext.factory(button, "Ext.Button", oldButton); + if (result && !oldButton) { + result.setHandler(function () { + me.toggleMode(); + }); + } + return result; + }, + + getGestures: function () { + var me = this, + gestures = {}; + gestures[me.getGesture()] = 'onGesture'; + gestures[me.getGesture() + 'start'] = 'onGestureStart'; + gestures[me.getGesture() + 'end'] = 'onGestureEnd'; + gestures[me.getPanGesture()] = 'onPanGesture'; + gestures[me.getPanGesture() + 'start'] = 'onPanGestureStart'; + gestures[me.getPanGesture() + 'end'] = 'onPanGestureEnd'; + gestures.doubletap = 'onDoubleTap'; + return gestures; + }, + + onDoubleTap: function (e) { + + }, + + onPanGestureStart: function (e) { + if (!e || !e.touches || e.touches.length < 2) { //Limit drags to single touch + var me = this, + region = me.getChart().getInnerRegion(), + xy = me.getChart().element.getXY(); + me.startX = e.pageX - xy[0] - region[0]; + me.startY = e.pageY - xy[1] - region[1]; + me.oldVisibleRanges = null; + me.hideLabels(); + me.getChart().suspendThicknessChanged(); + me.lockEvents(me.getPanGesture()); + return false; + } + }, + + onPanGesture: function (e) { + if (this.getLocks()[this.getPanGesture()] === this) { //Limit drags to single touch + var me = this, + region = me.getChart().getInnerRegion(), + xy = me.getChart().element.getXY(); + if (me.getZoomOnPanGesture()) { + me.transformAxesBy(me.getZoomableAxes(e), 0, 0, (e.pageX - xy[0] - region[0]) / me.startX, me.startY / (e.pageY - xy[1] - region[1])); + } else { + me.transformAxesBy(me.getPannableAxes(e), e.pageX - xy[0] - region[0] - me.startX, e.pageY - xy[1] - region[1] - me.startY, 1, 1); + } + me.sync(); + return false; + } + }, + + onPanGestureEnd: function (e) { + var me = this; + if (this.getLocks()[this.getPanGesture()] === this) { + me.getChart().resumeThicknessChanged(); + me.showLabels(); + me.sync(); + me.unlockEvents(me.getGestures()); + return false; + } + }, + + onGestureStart: function (e) { + if (e.touches && e.touches.length === 2) { + var me = this, + xy = me.getChart().element.getXY(), + region = me.getChart().getInnerRegion(), + x = xy[0] + region[0], + y = xy[1] + region[1], + newPoints = [e.touches[0].point.x - x, e.touches[0].point.y - y, e.touches[1].point.x - x, e.touches[1].point.y - y], + xDistance = Math.max(44, Math.abs(newPoints[2] - newPoints[0])), + yDistance = Math.max(44, Math.abs(newPoints[3] - newPoints[1])); + me.getChart().suspendThicknessChanged(); + me.lastZoomDistances = [xDistance, yDistance]; + me.lastPoints = newPoints; + me.oldVisibleRanges = null; + me.hideLabels(); + me.lockEvents(me.getGesture()); + return false; + } + }, + + onGesture: function (e) { + if (this.getLocks()[this.getGesture()] === this) { + var me = this, + region = me.getChart().getInnerRegion(), + xy = me.getChart().element.getXY(), + x = xy[0] + region[0], + y = xy[1] + region[1], + abs = Math.abs, + lastPoints = me.lastPoints, + newPoints = [e.touches[0].point.x - x, e.touches[0].point.y - y, e.touches[1].point.x - x, e.touches[1].point.y - y], + xDistance = Math.max(44, abs(newPoints[2] - newPoints[0])), + yDistance = Math.max(44, abs(newPoints[3] - newPoints[1])), + lastDistances = this.lastZoomDistances || [xDistance, yDistance], + zoomX = xDistance / lastDistances[0], + zoomY = yDistance / lastDistances[1]; + + me.transformAxesBy(me.getZoomableAxes(e), + region[2] * (zoomX - 1) / 2 + newPoints[2] - lastPoints[2] * zoomX, + region[3] * (zoomY - 1) / 2 + newPoints[3] - lastPoints[3] * zoomY, + zoomX, + zoomY); + me.sync(); + return false; + } + }, + + onGestureEnd: function (e) { + var me = this; + if (me.getLocks()[me.getGesture()] === me) { + me.getChart().resumeThicknessChanged(); + me.showLabels(); + me.sync(); + me.unlockEvents(me.getGestures()); + return false; + } + }, + + hideLabels: function () { + if (this.getHideLabelInGesture()) { + this.eachInteractiveAxes(function (axis) { + axis.hideLabels(); + }); + } + }, + + showLabels: function () { + if (this.getHideLabelInGesture()) { + this.eachInteractiveAxes(function (axis) { + axis.showLabels(); + }); + } + }, + + isEventOnAxis: function (e, axis) { + // TODO: right now this uses the current event position but really we want to only + // use the gesture's start event. Pinch does not give that to us though. + var region = axis.getSurface().getRegion(); + return region[0] <= e.pageX && e.pageX <= region[0] + region[2] && region[1] <= e.pageY && e.pageY <= region[1] + region[3]; + }, + + getPannableAxes: function (e) { + var me = this, + axisConfigs = me.getAxes(), + axes = me.getChart().getAxes(), + i, ln = axes.length, + result = [], isEventOnAxis = false, + config; + + if (e) { + for (i = 0; i < ln; i++) { + if (this.isEventOnAxis(e, axes[i])) { + isEventOnAxis = true; + break; + } + } + } + + for (i = 0; i < ln; i++) { + config = axisConfigs[axes[i].getPosition()]; + if (config && config.allowPan !== false && (!isEventOnAxis || this.isEventOnAxis(e, axes[i]))) { + result.push(axes[i]); + } + } + return result; + }, + + getZoomableAxes: function (e) { + var me = this, + axisConfigs = me.getAxes(), + axes = me.getChart().getAxes(), + result = [], + i, ln = axes.length, axis, + isEventOnAxis = false, config; + + if (e) { + for (i = 0; i < ln; i++) { + if (this.isEventOnAxis(e, axes[i])) { + isEventOnAxis = true; + break; + } + } + } + + for (i = 0; i < ln; i++) { + axis = axes[i]; + config = axisConfigs[axis.getPosition()]; + if (config && config.allowZoom !== false && (!isEventOnAxis || this.isEventOnAxis(e, axis))) { + result.push(axis); + } + } + return result; + }, + + eachInteractiveAxes: function (fn) { + var me = this, + axisConfigs = me.getAxes(), + axes = me.getChart().getAxes(); + for (var i = 0; i < axes.length; i++) { + if (axisConfigs[axes[i].getPosition()]) { + if (false === fn.call(this, axes[i])) { + return; + } + } + } + }, + + transformAxesBy: function (axes, panX, panY, sx, sy) { + var region = this.getChart().getInnerRegion(), + axesCfg = this.getAxes(), axisCfg, + oldVisibleRanges = this.oldVisibleRanges, + result = false; + + if (!oldVisibleRanges) { + this.oldVisibleRanges = oldVisibleRanges = {}; + this.eachInteractiveAxes(function (axis) { + oldVisibleRanges[axis.getId()] = axis.getVisibleRange(); + }); + } + + if (!region) { + return; + } + + for (var i = 0; i < axes.length; i++) { + axisCfg = axesCfg[axes[i].getPosition()]; + result = this.transformAxisBy(axes[i], oldVisibleRanges[axes[i].getId()], panX, panY, sx, sy, this.minZoom || axisCfg.minZoom, this.maxZoom || axisCfg.maxZoom) || result; + } + return result; + }, + + transformAxisBy: function (axis, oldVisibleRange, panX, panY, sx, sy, minZoom, maxZoom) { + var me = this, + visibleLength = oldVisibleRange[1] - oldVisibleRange[0], + visibleRange = axis.getVisibleRange(), + actualMinZoom = minZoom || me.getMinZoom() || axis.config.minZoom, + actualMaxZoom = maxZoom || me.getMaxZoom() || axis.config.maxZoom, + region = me.getChart().getInnerRegion(), + left, right; + if (!region) { + return; + } + + var isSide = axis.isSide(), + length = isSide ? region[3] : region[2], + pan = isSide ? -panY : panX; + visibleLength /= isSide ? sy : sx; + if (visibleLength < 0) { + visibleLength = -visibleLength; + } + + if (visibleLength * actualMinZoom > 1) { + visibleLength = 1; + } + + if (visibleLength * actualMaxZoom < 1) { + visibleLength = 1 / actualMaxZoom; + } + left = oldVisibleRange[0]; + right = oldVisibleRange[1]; + + visibleRange = visibleRange[1] - visibleRange[0]; + if (visibleLength === visibleRange && visibleRange === 1) { + return; + } + axis.setVisibleRange([ + (oldVisibleRange[0] + oldVisibleRange[1] - visibleLength) * 0.5 - pan / length * visibleLength, + (oldVisibleRange[0] + oldVisibleRange[1] + visibleLength) * 0.5 - pan / length * visibleLength + ]); + return (Math.abs(left - axis.getVisibleRange()[0]) > 1e-10 || Math.abs(right - axis.getVisibleRange()[1]) > 1e-10); + }, + + destroy: function () { + this.setModeToggleButton(null); + this.callSuper(); + } +}); diff --git a/vendor/touch/src/chart/interactions/Rotate.js b/vendor/touch/src/chart/interactions/Rotate.js new file mode 100644 index 000000000..5bc8c9635 --- /dev/null +++ b/vendor/touch/src/chart/interactions/Rotate.js @@ -0,0 +1,197 @@ +/** + * @class Ext.chart.interactions.Rotate + * @extends Ext.chart.interactions.Abstract + * + * The Rotate interaction allows the user to rotate a polar chart about its central point. + * + * @example preview + * var chart = new Ext.chart.PolarChart({ + * animate: true, + * interactions: ['rotate'], + * colors: ["#115fa6", "#94ae0a", "#a61120", "#ff8809", "#ffd13e"], + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':'metric one', 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':'metric two', 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':'metric three', 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':'metric four', 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':'metric five', 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * series: [{ + * type: 'pie', + * label: { + * field: 'name', + * display: 'rotate' + * }, + * xField: 'data3', + * donut: 30 + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + */ +Ext.define('Ext.chart.interactions.Rotate', { + extend: 'Ext.chart.interactions.Abstract', + + type: 'rotate', + + alias: 'interaction.rotate', + + /** + * @event rotate + * Fires on every tick of the rotation + * @param {Ext.chart.interactions.Rotate} this This interaction. + * @param {Number} angle The new current rotation angle. + */ + + /** + * @event rotationEnd + * Fires after a user finishes the rotation + * @param {Ext.chart.interactions.Rotate} this This interaction. + * @param {Number} angle The new current rotation angle. + */ + + config: { + /** + * @cfg {String} gesture + * Defines the gesture type that will be used to rotate the chart. Currently only + * supports `pinch` for two-finger rotation and `drag` for single-finger rotation. + */ + gesture: 'rotate', + + /** + * @cfg {Number} currentRotation + * Saves the current rotation of the series. Accepts negative values and values > 360 ( / 180 * Math.PI) + * @private + */ + currentRotation: 0 + }, + + oldRotations: null, + + getGestures: function() { + return { + rotate: 'onRotate', + rotateend: 'onRotate', + dragstart: 'onGestureStart', + drag: 'onGesture', + dragend: 'onGestureEnd' + }; + }, + + getAngle: function(e) { + var me = this, + chart = me.getChart(), + xy = chart.getEventXY(e), + center = chart.getCenter(); + + return Math.atan2( + xy[1] - center[1], + xy[0] - center[0] + ); + }, + + getEventRadius: function(e) { + var me = this, + chart = me.getChart(), + xy = chart.getEventXY(e), + center = chart.getCenter(), + dx = xy[0] - center[0], + dy = xy[1] - center[1]; + + return Math.sqrt(dx * dx + dy * dy); + }, + + onGestureStart: function(e) { + var me = this, + chart = me.getChart(), + radius = chart.getRadius(), + eventRadius = me.getEventRadius(e); + + if (radius >= eventRadius) { + me.lockEvents('drag'); + me.angle = me.getAngle(e); + me.oldRotations = {}; + return false; + } + }, + + onGesture: function(e) { + var me = this, + chart = me.getChart(), + angle = me.getAngle(e) - me.angle, + axes = chart.getAxes(), + series = chart.getSeries(), seriesItem, + oldRotations = me.oldRotations, + axis, oldRotation, i, ln; + + if (me.getLocks().drag === me) { + chart.suspendAnimation(); + + for (i = 0, ln = axes.length; i < ln; i++) { + axis = axes[i]; + oldRotation = oldRotations[axis.getId()] || (oldRotations[axis.getId()] = axis.getRotation()); + axis.setRotation(angle + oldRotation); + } + + for (i = 0, ln = series.length; i < ln; i++) { + seriesItem = series[i]; + oldRotation = oldRotations[seriesItem.getId()] || (oldRotations[seriesItem.getId()] = seriesItem.getRotation()); + + seriesItem.setRotation(angle + oldRotation); + } + + me.setCurrentRotation(angle + oldRotation); + + me.fireEvent('rotate', me, me.getCurrentRotation()); + + me.sync(); + chart.resumeAnimation(); + return false; + } + }, + + rotateTo: function(angle) { + var me = this, + chart = me.getChart(), + axes = chart.getAxes(), + series = chart.getSeries(), + i, ln; + + chart.suspendAnimation(); + + for (i = 0, ln = axes.length; i < ln; i++) { + axes[i].setRotation(angle); + } + + for (i = 0, ln = series.length; i < ln; i++) { + series[i].setRotation(angle); + } + + me.setCurrentRotation(angle); + + me.fireEvent('rotate', me, me.getCurrentRotation()); + + me.sync(); + chart.resumeAnimation(); + }, + + onGestureEnd: function(e) { + var me = this; + + if (me.getLocks().drag === me) { + me.onGesture(e); + me.unlockEvents('drag'); + + me.fireEvent('rotationEnd', me, me.getCurrentRotation()); + + return false; + } + }, + + onRotate: function(e) { + + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/interactions/RotatePie3D.js b/vendor/touch/src/chart/interactions/RotatePie3D.js new file mode 100644 index 000000000..f457f58b4 --- /dev/null +++ b/vendor/touch/src/chart/interactions/RotatePie3D.js @@ -0,0 +1,22 @@ +/** + * @class Ext.chart.interactions.RotatePie3D + * @extends Ext.chart.interactions.Rotate + * + * A special version of the Rotate interaction used by Pie3D Chart. + */ +Ext.define('Ext.chart.interactions.RotatePie3D', { + + extend: 'Ext.chart.interactions.Rotate', + + type: 'rotatePie3d', + + alias: 'interaction.rotatePie3d', + + getAngle: function (e) { + var me = this, + chart = me.getChart(), + xy = chart.element.getXY(), + region = chart.getMainRegion(); + return Math.atan2(e.pageY - xy[1] - region[3] * 0.5, e.pageX - xy[0] - region[2] * 0.5); + } +}); diff --git a/vendor/touch/src/chart/label/Callout.js b/vendor/touch/src/chart/label/Callout.js new file mode 100644 index 000000000..514c5db41 --- /dev/null +++ b/vendor/touch/src/chart/label/Callout.js @@ -0,0 +1,107 @@ +/** + * @class Ext.chart.label.Callout + * @extends Ext.draw.modifier.Modifier + * + * This is a modifier to place labels and callouts by additional attributes. + */ +Ext.define("Ext.chart.label.Callout", { + extend: 'Ext.draw.modifier.Modifier', + + prepareAttributes: function (attr) { + if (!attr.hasOwnProperty('calloutOriginal')) { + attr.calloutOriginal = Ext.Object.chain(attr); + } + if (this._previous) { + this._previous.prepareAttributes(attr.calloutOriginal); + } + }, + + setAttrs: function (attr, changes) { + var callout = attr.callout, + origin = attr.calloutOriginal, + bbox = attr.bbox.plain, + width = (bbox.width || 0) + attr.labelOverflowPadding, + height = (bbox.height || 0) + attr.labelOverflowPadding, + dx, dy; + + if ('callout' in changes) { + callout = changes.callout; + } + + if ('callout' in changes || 'calloutPlaceX' in changes || 'calloutPlaceY' in changes || 'x' in changes || 'y' in changes) { + var rotationRads = 'rotationRads' in changes ? origin.rotationRads = changes.rotationRads : origin.rotationRads, + x = 'x' in changes ? (origin.x = changes.x) : origin.x, + y = 'y' in changes ? (origin.y = changes.y) : origin.y, + calloutPlaceX = 'calloutPlaceX' in changes ? changes.calloutPlaceX : attr.calloutPlaceX, + calloutPlaceY = 'calloutPlaceY' in changes ? changes.calloutPlaceY : attr.calloutPlaceY, + calloutVertical = 'calloutVertical' in changes ? changes.calloutVertical : attr.calloutVertical, + temp; + + // Normalize Rotations + rotationRads %= Math.PI * 2; + if (Math.cos(rotationRads) < 0) { + rotationRads = (rotationRads + Math.PI) % (Math.PI * 2); + } + + if (rotationRads > Math.PI) { + rotationRads -= Math.PI * 2; + } + + if (calloutVertical) { + rotationRads = rotationRads * (1 - callout) - Math.PI / 2 * callout; + temp = width; + width = height; + height = temp; + } else { + rotationRads = rotationRads * (1 - callout); + } + changes.rotationRads = rotationRads; + + + // Placing label. + changes.x = x * (1 - callout) + calloutPlaceX * callout; + changes.y = y * (1 - callout) + calloutPlaceY * callout; + + + // Placing the end of the callout line. + dx = calloutPlaceX - x; + dy = calloutPlaceY - y; + if (Math.abs(dy * width) > Math.abs(height * dx)) { + // on top/bottom + if (dy > 0) { + changes.calloutEndX = changes.x - (height / (dy * 2) * dx) * callout; + changes.calloutEndY = changes.y - height / 2 * callout; + } else { + changes.calloutEndX = changes.x + (height / (dy * 2) * dx) * callout; + changes.calloutEndY = changes.y + height / 2 * callout; + } + } else { + // on left/right + if (dx > 0) { + changes.calloutEndX = changes.x - width / 2; + changes.calloutEndY = changes.y - (width / (dx * 2) * dy) * callout; + } else { + changes.calloutEndX = changes.x + width / 2; + changes.calloutEndY = changes.y + (width / (dx * 2) * dy) * callout; + } + } + } + + return changes; + }, + + pushDown: function (attr, changes) { + changes = Ext.draw.modifier.Modifier.prototype.pushDown.call(this, attr.calloutOriginal, changes); + return this.setAttrs(attr, changes); + }, + + popUp: function (attr, changes) { + attr = Object.getPrototypeOf(attr); + changes = this.setAttrs(attr, changes); + if (this._next) { + return this._next.popUp(attr, changes); + } else { + return Ext.apply(attr, changes); + } + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/label/Label.js b/vendor/touch/src/chart/label/Label.js new file mode 100644 index 000000000..fc3130eb2 --- /dev/null +++ b/vendor/touch/src/chart/label/Label.js @@ -0,0 +1,105 @@ +/** + * @class Ext.chart.label.Label + * @extends Ext.draw.sprite.Text + * + * Sprite used to represent labels in series. + */ +Ext.define('Ext.chart.label.Label', { + extend: 'Ext.draw.sprite.Text', + requires: ['Ext.chart.label.Callout'], + + inheritableStatics: { + def: { + processors: { + callout: 'limited01', + calloutPlaceX: 'number', + calloutPlaceY: 'number', + calloutStartX: 'number', + calloutStartY: 'number', + calloutEndX: 'number', + calloutEndY: 'number', + calloutColor: 'color', + calloutVertical: 'bool', + labelOverflowPadding: 'number', + display: 'enums(none,under,over,rotate,insideStart,insideEnd,outside)', + orientation: 'enums(horizontal,vertical)', + renderer: 'default' + }, + defaults: { + callout: 0, + calloutPlaceX: 0, + calloutPlaceY: 0, + calloutStartX: 0, + calloutStartY: 0, + calloutEndX: 0, + calloutEndY: 0, + calloutVertical: false, + calloutColor: 'black', + labelOverflowPadding: 5, + display: 'none', + orientation: '', + renderer: null + }, + + dirtyTriggers: { + callout: 'transform', + calloutPlaceX: 'transform', + calloutPlaceY: 'transform', + labelOverflowPadding: 'transform', + calloutRotation: 'transform', + display: 'hidden' + }, + + updaters: { + hidden: function (attrs) { + attrs.hidden = attrs.display === 'none'; + } + } + } + }, + + config: { + /** + * @cfg {Object} fx Animation configuration. + */ + fx: { + customDuration: { + callout: 200 + } + }, + field: null + }, + + prepareModifiers: function () { + this.callSuper(arguments); + this.calloutModifier = new Ext.chart.label.Callout({sprite: this}); + this.fx.setNext(this.calloutModifier); + this.calloutModifier.setNext(this.topModifier); + }, + + render: function (surface, ctx, clipRegion) { + var me = this, + attr = me.attr; + ctx.save(); + ctx.globalAlpha *= Math.max(0, attr.callout - 0.5) * 2; + if (ctx.globalAlpha > 0) { + ctx.strokeStyle = attr.calloutColor; + ctx.fillStyle = attr.calloutColor; + ctx.beginPath(); + ctx.moveTo(me.attr.calloutStartX, me.attr.calloutStartY); + ctx.lineTo(me.attr.calloutEndX, me.attr.calloutEndY); + ctx.stroke(); + + ctx.beginPath(); + ctx.arc(me.attr.calloutStartX, me.attr.calloutStartY, 1, 0, 2 * Math.PI, true); + ctx.fill(); + + ctx.beginPath(); + ctx.arc(me.attr.calloutEndX, me.attr.calloutEndY, 1, 0, 2 * Math.PI, true); + ctx.fill(); + } + ctx.restore(); + + Ext.draw.sprite.Text.prototype.render.apply(me, arguments); + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/series/Area.js b/vendor/touch/src/chart/series/Area.js new file mode 100644 index 000000000..85e974024 --- /dev/null +++ b/vendor/touch/src/chart/series/Area.js @@ -0,0 +1,61 @@ +/** + * @class Ext.chart.series.Area + * @extends Ext.chart.series.StackedCartesian + * + * Creates an Area Chart. + * + * @example preview + * var chart = new Ext.chart.CartesianChart({ + * animate: true, + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':'metric one', 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':'metric two', 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':'metric three', 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':'metric four', 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':'metric five', 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * axes: [{ + * type: 'numeric', + * position: 'left', + * fields: ['data1'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * grid: true, + * minimum: 0 + * }, { + * type: 'category', + * position: 'bottom', + * fields: ['name'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * } + * }], + * series: [{ + * type: 'area', + * subStyle: { + * fill: ['blue', 'green', 'red'] + * }, + * xField: 'name', + * yField: ['data1', 'data2', 'data3'] + * + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + */ +Ext.define('Ext.chart.series.Area', { + + extend: 'Ext.chart.series.StackedCartesian', + + alias: 'series.area', + type: 'area', + seriesType: 'areaSeries', + + requires: ['Ext.chart.series.sprite.Area'] +}); diff --git a/vendor/touch/src/chart/series/Bar.js b/vendor/touch/src/chart/series/Bar.js new file mode 100644 index 000000000..06a910ab9 --- /dev/null +++ b/vendor/touch/src/chart/series/Bar.js @@ -0,0 +1,134 @@ +/** + * @class Ext.chart.series.Bar + * @extends Ext.chart.series.StackedCartesian + * + * Creates a Bar Chart. + * + * @example preview + * var chart = new Ext.chart.Chart({ + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':'metric one', 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':'metric two', 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':'metric three', 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':'metric four', 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':'metric five', 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * axes: [{ + * type: 'numeric', + * position: 'left', + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * fields: 'data1' + * }, { + * type: 'category', + * position: 'bottom', + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * fields: 'name' + * }], + * series: [{ + * type: 'bar', + * xField: 'name', + * yField: 'data1', + * style: { + * fill: 'blue' + * } + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + */ +Ext.define('Ext.chart.series.Bar', { + + extend: 'Ext.chart.series.StackedCartesian', + + alias: 'series.bar', + type: 'bar', + seriesType: 'barSeries', + + requires: [ + 'Ext.chart.series.sprite.Bar', + 'Ext.draw.sprite.Rect' + ], + + config: { + /** + * @private + * @cfg {Object} itemInstancing Sprite template used for series. + */ + itemInstancing: { + type: 'rect', + fx: { + customDuration: { + x: 0, + y: 0, + width: 0, + height: 0, + radius: 0 + } + } + } + }, + + getItemForPoint: function (x, y) { + if (this.getSprites()) { + var me = this, + chart = me.getChart(), + padding = chart.getInnerPadding(); + + // Convert the coordinates because the "items" sprites that draw the bars ignore the chart's InnerPadding. + // See also Ext.chart.series.sprite.Bar.getItemForPoint(x,y) regarding the series's vertical coordinate system. + // + // TODO: Cleanup the bar sprites. + arguments[0] = x - padding.left; + arguments[1] = y + padding.bottom; + return me.callParent(arguments); + } + }, + + updateXAxis: function (axis) { + axis.setLabelInSpan(true); + this.callSuper(arguments); + }, + + updateHidden: function (hidden) { + this.callParent(arguments); + this.updateStacked(); + }, + + updateStacked: function (stacked) { + var sprites = this.getSprites(), + ln = sprites.length, + visible = [], + attrs = {}, i; + + for (i = 0; i < ln; i++) { + if (!sprites[i].attr.hidden) { + visible.push(sprites[i]); + } + } + ln = visible.length; + + if (this.getStacked()) { + attrs.groupCount = 1; + attrs.groupOffset = 0; + for (i = 0; i < ln; i++) { + visible[i].setAttributes(attrs); + } + } else { + attrs.groupCount = visible.length; + for (i = 0; i < ln; i++) { + attrs.groupOffset = i; + visible[i].setAttributes(attrs); + } + } + this.callSuper(arguments); + } +}); diff --git a/vendor/touch/src/chart/series/CandleStick.js b/vendor/touch/src/chart/series/CandleStick.js new file mode 100644 index 000000000..56c5aea2a --- /dev/null +++ b/vendor/touch/src/chart/series/CandleStick.js @@ -0,0 +1,100 @@ +/** + * @class Ext.chart.series.CandleStick + * @extends Ext.chart.series.Cartesian + * + * Creates a candlestick or OHLC Chart. + * + * @example preview + * var chart = new Ext.chart.CartesianChart({ + * animate: true, + * store: { + * fields: ['time', 'open', 'high', 'low', 'close'], + * data: [ + * {'time':new Date('Jan 1 2010').getTime(), 'open':600, 'high':614, 'low':578, 'close':590}, + * {'time':new Date('Jan 2 2010').getTime(), 'open':590, 'high':609, 'low':580, 'close':580}, + * {'time':new Date('Jan 3 2010').getTime(), 'open':580, 'high':602, 'low':578, 'close':602}, + * {'time':new Date('Jan 4 2010').getTime(), 'open':602, 'high':614, 'low':586, 'close':586}, + * {'time':new Date('Jan 5 2010').getTime(), 'open':586, 'high':602, 'low':565, 'close':565} + * ] + * }, + * axes: [{ + * type: 'numeric', + * position: 'left', + * fields: ['open', 'high', 'low', 'close'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * grid: true, + * minimum: 560, + * maximum: 640 + * }, { + * type: 'time', + * position: 'bottom', + * fields: ['time'], + * fromDate: new Date('Dec 31 2009'), + * toDate: new Date('Jan 6 2010'), + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * style: { + * axisLine: false + * } + * }], + * series: [{ + * type: 'candlestick', + * xField: 'time', + * openField: 'open', + * highField: 'high', + * lowField: 'low', + * closeField: 'close', + * style: { + * dropStyle: { + * fill: 'rgb(237, 123, 43)', + * stroke: 'rgb(237, 123, 43)' + * }, + * raiseStyle: { + * fill: 'rgb(55, 153, 19)', + * stroke: 'rgb(55, 153, 19)' + * } + * }, + * aggregator: { + * strategy: 'time' + * } + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + */ +Ext.define('Ext.chart.series.CandleStick', { + extend: 'Ext.chart.series.Cartesian', + requires: ['Ext.chart.series.sprite.CandleStick'], + alias: 'series.candlestick', + type: 'candlestick', + seriesType: 'candlestickSeries', + config: { + /** + * @cfg {String} openField + * The store record field name that represents the opening value of the given period. + */ + openField: null, + /** + * @cfg {String} highField + * The store record field name that represents the highest value of the time interval represented. + */ + highField: null, + /** + * @cfg {String} lowField + * The store record field name that represents the lowest value of the time interval represented. + */ + lowField: null, + /** + * @cfg {String} closeField + * The store record field name that represents the closing value of the given period. + */ + closeField: null + }, + + fieldCategoryY: ['Open', 'High', 'Low', 'Close'] +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/series/Cartesian.js b/vendor/touch/src/chart/series/Cartesian.js new file mode 100644 index 000000000..c0ded615e --- /dev/null +++ b/vendor/touch/src/chart/series/Cartesian.js @@ -0,0 +1,145 @@ +/** + * @abstract + * @class Ext.chart.series.Cartesian + * @extends Ext.chart.series.Series + * + * Common base class for series implementations which plot values using x/y coordinates. + * + * @constructor + */ +Ext.define('Ext.chart.series.Cartesian', { + extend: 'Ext.chart.series.Series', + config: { + /** + * The field used to access the x axis value from the items from the data source. + * + * @cfg {String} xField + */ + xField: null, + + /** + * The field(s) used to access the y-axis value(s) of the items from the data source. + * + * @cfg {String|String[]} yField + */ + yField: null, + + /** + * @cfg {Ext.chart.axis.Axis} xAxis The chart axis bound to the series on the x-axis. + */ + xAxis: null, + + /** + * @cfg {Ext.chart.axis.Axis} yAxis The chart axis bound to the series on the y-axis. + */ + yAxis: null + }, + + directions: ['X', 'Y'], + fieldCategoryX: ['X'], + fieldCategoryY: ['Y'], + + updateXAxis: function (axis) { + axis.processData(this); + }, + + updateYAxis: function (axis) { + axis.processData(this); + }, + + coordinateX: function () { + return this.coordinate('X', 0, 2); + }, + + coordinateY: function () { + return this.coordinate('Y', 1, 2); + }, + + getItemForPoint: function (x, y) { + if (this.getSprites()) { + var me = this, + sprite = me.getSprites()[0], + store = me.getStore(), + item; + + if(me.getHidden()) { + return null; + } + if (sprite) { + var index = sprite.getIndexNearPoint(x, y); + if (index !== -1) { + item = { + series: this, + category: this.getItemInstancing() ? 'items' : 'markers', + index: index, + record: store.getData().items[index], + field: this.getYField(), + sprite: sprite + }; + return item; + } + } + } + }, + + createSprite: function () { + var sprite = this.callSuper(), + xAxis = this.getXAxis(); + sprite.setAttributes({flipXY: this.getChart().getFlipXY()}); + if (sprite.setAggregator && xAxis && xAxis.getAggregator) { + if (xAxis.getAggregator) { + sprite.setAggregator({strategy: xAxis.getAggregator()}); + } else { + sprite.setAggregator({}); + } + } + return sprite; + }, + + getSprites: function () { + var me = this, + chart = this.getChart(), + animation = chart && chart.getAnimate(), + itemInstancing = me.getItemInstancing(), + sprites = me.sprites, sprite; + + if (!chart) { + return []; + } + + if (!sprites.length) { + sprite = me.createSprite(); + } else { + sprite = sprites[0]; + } + + if (animation) { + me.getLabel().getTemplate().fx.setConfig(animation); + if (itemInstancing) { + sprite.itemsMarker.getTemplate().fx.setConfig(animation); + } + sprite.fx.setConfig(animation); + } + return sprites; + }, + + provideLegendInfo: function (target) { + var style = this.getStyle(); + target.push({ + name: this.getTitle() || this.getYField() || this.getId(), + mark: style.fillStyle || style.strokeStyle || 'black', + disabled: false, + series: this.getId(), + index: 0 + }); + }, + + getXRange: function () { + return [this.dataRange[0], this.dataRange[2]]; + }, + + getYRange: function () { + return [this.dataRange[1], this.dataRange[3]]; + } +}) +; \ No newline at end of file diff --git a/vendor/touch/src/chart/series/Gauge.js b/vendor/touch/src/chart/series/Gauge.js new file mode 100644 index 000000000..a9eb85908 --- /dev/null +++ b/vendor/touch/src/chart/series/Gauge.js @@ -0,0 +1,467 @@ +/** + * @class Ext.chart.series.Gauge + * @extends Ext.chart.series.Series + * + * Creates a Gauge Chart. + * + * @example preview + * var chart = new Ext.chart.SpaceFillingChart({ + * series: [{ + * type: 'gauge', + * minimum: 100, + * maximum: 800, + * value: 400, + * donut: 30, + * colors: ["#115fa6", "lightgrey"] + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + */ +Ext.define('Ext.chart.series.Gauge', { + alias: 'series.gauge', + extend: 'Ext.chart.series.Series', + type: "gauge", + seriesType: 'pieslice', + + requires: [ + 'Ext.draw.sprite.Sector' + ], + + config: { + /** + * @cfg {String} angleField + * @deprecated Use `field` directly + * The store record field name to be used for the gauge angles. + * The values bound to this field name must be positive real numbers. + */ + angleField: null, + + /** + * @cfg {String} field + * The store record field name to be used for the gauge value. + * The values bound to this field name must be positive real numbers. + */ + field: null, + + /** + * @cfg {Boolean} needle + * If true, display the gauge as a needle, otherwise as a sector. + */ + needle: false, + + /** + * @cfg {Number} needleLengthRatio + * @deprecated Use `needleLength` directly + * Ratio of the length of needle compared to the radius of the entire disk. + */ + needleLengthRatio: undefined, + + /** + * @cfg {Number} needleLength + * Percentage of the length of needle compared to the radius of the entire disk. + */ + needleLength: 90, + + /** + * @cfg {Number} needleWidth + * Width of the needle in pixels. + */ + needleWidth: 4, + + /** + * @cfg {Number} donut + * Percentage of the radius of the donut hole compared to the entire disk. + */ + donut: 30, + + /** + * @cfg {Boolean} showInLegend + * Whether to add the gauge chart elements as legend items. + */ + showInLegend: false, + + /** + * @cfg {Number} value + * Directly sets the displayed value of the gauge. + * It is ignored if {@link #field} is provided. + */ + value: null, + + /** + * @cfg {Array} colors (required) + * An array of color values which is used for the needle and the `sectors`. + */ + colors: null, + + /** + * @cfg {Array} sectors + * Allows to paint sectors of different colors in the background of the gauge, + * with optional labels. + * + * It can be an array of numbers (each between `minimum` and `maximum`) that + * define the highest value of each sector. For N sectors, only (N-1) values are + * needed because it is assumed that the first sector starts at `minimum` and the + * last sector ends at `maximum`. Example: a water temperature gauge that is blue + * below 20C, red above 80C, gray in-between, and with an orange needle... + * + * minimum: 0, + * maximum: 100, + * sectors: [20, 80], + * colors: ['orange', 'blue', 'lightgray', 'red'] + * + * It can be also an array of objects, each with the following properties: + * + * @cfg {Number} sectors.start The starting value of the sector. If omitted, it + * uses the previous sector's `end` value or the chart's `minimum`. + * @cfg {Number} sectors.end The ending value of the sector. If omitted, it uses + * the `maximum` defined for the chart. + * @cfg {String} sectors.label The label for this sector. Labels are styled using + * the series' {@link Ext.chart.series.Series#label label} config. + * @cfg {String} sectors.color The color of the sector. If omitted, it uses one + * of the `colors` defined for the series or for the chart. + * @cfg {Object} sectors.style An additional style object for the sector (for + * instance to set the opacity or to draw a line of a different color around the + * sector). + * + * minimum: 0, + * maximum: 100, + * sectors: [{ + * end: 20, + * label: 'Cold', + * color: 'aqua' + * }, + * { + * end: 80, + * label: 'Temp.', + * color: 'lightgray', + * style: { strokeStyle:'black', strokeOpacity:1, lineWidth:1 } + * }, + * { + * label: 'Hot', + * color: 'tomato' + * }] + */ + sectors: null, + + /** + * @cfg {Number} minimum + * The minimum value of the gauge. + */ + minimum: 0, + + /** + * @cfg {Number} maximum + * The maximum value of the gauge. + */ + maximum: 100, + + rotation: 0, + + /** + * @cfg {Number} totalAngle + * The size of the sector that the series will occupy. + */ + totalAngle: Math.PI / 2, + + region: [0, 0, 1, 1], + + center: [0.5, 0.75], + + radius: 0.5, + + /** + * @cfg {Boolean} wholeDisk Indicates whether to show the whole disk or only the marked part. + */ + wholeDisk: false + }, + + updateNeedle: function(needle) { + var me = this, + sprites = me.getSprites(), + angle = me.valueToAngle(me.getValue()); + + if (sprites && sprites.length) { + sprites[0].setAttributes({ + startAngle: (needle ? angle : 0), + endAngle: angle, + strokeOpacity: (needle ? 1 : 0), + lineWidth: (needle ? me.getNeedleWidth() : 0) + + }); + me.doUpdateStyles(); + } + }, + + updateColors: function (colors, oldColors) { + var me = this, + sectors = me.getSectors(), + sectorCount = sectors && sectors.length, + sprites = me.getSprites(), + spriteCount = sprites && sprites.length, + newColors = Ext.Array.clone(colors), + colorCount = colors && colors.length, + needle = me.getNeedle(), + i; + + if (!colorCount || !colors[0]) { + return; + } + + // Make sure the 'sectors' colors are not overridden. + for (i = 0; i < sectorCount; i++) { + newColors[i+1] = sectors[i].color || newColors[i+1] || colors[i%colorCount]; + } + + sprites[0].setAttributes({stroke:newColors[0]}); + this.setSubStyle({color:newColors}); + this.doUpdateStyles(); + }, + + updateAngleField: function (angleField) { + this.setField(angleField); + }, + + updateNeedleLengthRatio: function (needleLengthRatio) { + this.setNeedleLength(needleLengthRatio * 100); + }, + + updateRegion: function (region) { + var wholeDisk = this.getWholeDisk(), + halfTotalAngle = wholeDisk ? Math.PI : this.getTotalAngle() / 2, + donut = this.getDonut() / 100, + width, height, radius; + if (halfTotalAngle <= Math.PI / 2) { + width = 2 * Math.sin(halfTotalAngle); + height = 1 - donut * Math.cos(halfTotalAngle); + } else { + width = 2; + height = 1 - Math.cos(halfTotalAngle); + } + + radius = Math.min(region[2] / width, region[3] / height); + this.setRadius(radius); + this.setCenter([region[2] / 2, radius + (region[3] - height * radius) / 2]); + }, + + updateCenter: function (center) { + this.setStyle({ + centerX: center[0], + centerY: center[1], + rotationCenterX: center[0], + rotationCenterY: center[1] + }); + this.doUpdateStyles(); + }, + + updateRotation: function (rotation) { + this.setStyle({ + rotationRads: rotation - (this.getTotalAngle() + Math.PI) / 2 + }); + this.doUpdateStyles(); + }, + + doUpdateShape: function (radius, donut) { + var endRhoArray, + sectors = this.getSectors(), + sectorCount = (sectors && sectors.length) || 0, + needleLength = this.getNeedleLength() / 100; + + // Initialize an array that contains the endRho for each sprite. + // The first sprite is for the needle, the others for the gauge background sectors. + // Note: SubStyle arrays are handled in series.getOverriddenStyleByIndex(). + endRhoArray = [radius * needleLength, radius]; + while (sectorCount --) { + endRhoArray.push(radius); + } + + this.setSubStyle({ + endRho: endRhoArray, + startRho: radius / 100 * donut + }); + this.doUpdateStyles(); + }, + + updateRadius: function (radius) { + var donut = this.getDonut(); + this.doUpdateShape(radius, donut); + }, + + updateDonut: function (donut) { + var radius = this.getRadius(); + this.doUpdateShape(radius, donut); + }, + + valueToAngle: function(value) { + value = this.applyValue(value); + return this.getTotalAngle() * (value - this.getMinimum()) / (this.getMaximum() - this.getMinimum()); + }, + + applyValue: function (value) { + return Math.min(this.getMaximum(), Math.max(value, this.getMinimum())); + }, + + updateValue: function (value) { + var me = this, + needle = me.getNeedle(), + angle = me.valueToAngle(value), + sprites = me.getSprites(); + + sprites[0].rendererData.value = value; + sprites[0].setAttributes({ + startAngle: (needle ? angle : 0), + endAngle: angle + }); + me.doUpdateStyles(); + }, + + processData: function () { + var store = this.getStore(); + if (!store) { + return; + } + var field = this.getField(); + if (!field) { + return; + } + if (!store.getData().items.length) { + return; + } + this.setValue(store.getData().items[0].get(field)); + }, + + getDefaultSpriteConfig: function () { + return { + type: this.seriesType, + renderer: this.getRenderer(), + fx: { + customDuration: { + translationX: 0, + translationY: 0, + rotationCenterX: 0, + rotationCenterY: 0, + centerX: 0, + centerY: 0, + startRho: 0, + endRho: 0, + baseRotation: 0 + } + } + }; + }, + + normalizeSectors: function(sectors) { + // Make sure all the sectors in the array have a legit start and end. + // Note: the array is modified in-place. + var me = this, + sectorCount = (sectors && sectors.length) || 0, + i, value, start, end; + + if (sectorCount) { + for (i = 0; i < sectorCount; i++) { + value = sectors[i]; + if (typeof value == "number") { + sectors[i] = { + start: (i > 0 ? sectors[i-1].end : me.getMinimum()), + end: Math.min(value, me.getMaximum()) + }; + if (i == (sectorCount - 1) && sectors[i].end < me.getMaximum()) { + sectors[i+1] = { + start: sectors[i].end, + end: me.getMaximum() + }; + } + } else { + if (typeof value.start == "number") { + start = Math.max(value.start, me.getMinimum()); + } else { + start = (i > 0 ? sectors[i-1].end : me.getMinimum()); + } + if (typeof value.end == "number") { + end = Math.min(value.end, me.getMaximum()); + } else { + end = me.getMaximum(); + } + sectors[i].start = start; + sectors[i].end = end; + } + } + } else { + sectors = [{ + start: me.getMinimum(), + end: me.getMaximum() + }]; + } + return sectors; + }, + + getSprites: function () { + var me = this, + store = me.getStore(), + value = me.getValue(), + i, ln; + + // The store must be initialized, or the value must be set + if (!store && !Ext.isNumber(value)) { + return []; + } + + // Return cached sprites + var chart = me.getChart(), + animate = chart.getAnimate(), + sprites = me.sprites, + spriteIndex = 0, + sprite, sectors, attr, rendererData; + + if (sprites && sprites.length) { + sprites[0].fx.setConfig(animate); + return sprites; + } + + rendererData = { + store: store, + field: me.getField(), + value: value, + series: me + }; + + // Create needle sprite + sprite = me.createSprite(); + sprite.setAttributes({ + zIndex: 10 + }, true); + sprite.rendererData = rendererData; + sprite.rendererIndex = spriteIndex++; + + // Create background sprite(s) + me.getLabel().getTemplate().setField(true); // Enable labels + sectors = me.normalizeSectors(me.getSectors()); + for (i = 0, ln = sectors.length; i < ln; i++) { + attr = { + startAngle: me.valueToAngle(sectors[i].start), + endAngle: me.valueToAngle(sectors[i].end), + label: sectors[i].label, + fillStyle: sectors[i].color, + strokeOpacity: 0, + rotateLabels: false, + doCallout: false, // Show labels inside sectors. + labelOverflowPadding: -1 // Allow labels to overlap. + }; + Ext.apply(attr, sectors[i].style); + sprite = me.createSprite(); + sprite.rendererData = rendererData; + sprite.rendererIndex = spriteIndex++; + sprite.setAttributes(attr, true); + } + + // Make sure we have some default colors + var colors = me.getColors() || (chart && chart.config.colors); + if (!colors) { + me.setColors(['blue','lightgray']); + } + + me.doUpdateStyles(); + return sprites; + } +}); + diff --git a/vendor/touch/src/chart/series/ItemPublisher.js b/vendor/touch/src/chart/series/ItemPublisher.js new file mode 100644 index 000000000..4e7419531 --- /dev/null +++ b/vendor/touch/src/chart/series/ItemPublisher.js @@ -0,0 +1,337 @@ +/** + * @private + */ +Ext.define('Ext.chart.series.ItemPublisher', { + extend: 'Ext.event.publisher.Publisher', + + targetType: 'series', + + handledEvents: [ + /** + * @event itemmousemove + * Fires when the mouse is moved on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemmousemove', + /** + * @event itemmouseup + * Fires when a mouseup event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemmouseup', + /** + * @event itemmousedown + * Fires when a mousedown event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemmousedown', + /** + * @event itemmouseover + * Fires when the mouse enters a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemmouseover', + /** + * @event itemmouseout + * Fires when the mouse exits a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemmouseout', + /** + * @event itemclick + * Fires when a click event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemclick', + /** + * @event itemdoubleclick + * Fires when a doubleclick event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemdoubleclick', + /** + * @event itemtap + * Fires when a tap event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemtap', + /** + * @event itemtapstart + * Fires when a tapstart event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemtapstart', + /** + * @event itemtapend + * Fires when a tapend event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemtapend', + /** + * @event itemtapcancel + * Fires when a tapcancel event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemtapcancel', + /** + * @event itemtaphold + * Fires when a taphold event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemtaphold', + /** + * @event itemdoubletap + * Fires when a doubletap event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemdoubletap', + /** + * @event itemsingletap + * Fires when a singletap event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemsingletap', + /** + * @event itemtouchstart + * Fires when a touchstart event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemtouchstart', + /** + * @event itemtouchmove + * Fires when a touchmove event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemtouchmove', + /** + * @event itemtouchend + * Fires when a touchend event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemtouchend', + /** + * @event itemdragstart + * Fires when a dragstart event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemdragstart', + /** + * @event itemdrag + * Fires when a drag event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemdrag', + /** + * @event itemdragend + * Fires when a dragend event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemdragend', + /** + * @event itempinchstart + * Fires when a pinchstart event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itempinchstart', + /** + * @event itempinch + * Fires when a pinch event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itempinch', + /** + * @event itempinchend + * Fires when a pinchend event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itempinchend', + /** + * @event itemswipe + * Fires when a swipe event occurs on a series item. + * @param {Ext.chart.series.Series} series + * @param {Object} item + * @param {Event} event + */ + 'itemswipe' + ], + + delegationRegex: /^item([a-z]+)$/i, + + getSubscribers: function (chartId) { + var subscribers = this.subscribers; + + if (!subscribers.hasOwnProperty(chartId)) { + subscribers[chartId] = {}; + } + + return subscribers[chartId]; + }, + + subscribe: function (target, eventName) { + var match = target.match(this.idSelectorRegex), + dispatcher = this.dispatcher, + targetType = this.targetType, + series, id; + + if (!match) { + return false; + } + + id = match[1]; + series = Ext.ComponentManager.get(id); + if (!series) { + return false; + } + + if (!series.getChart()) { + dispatcher.addListener(targetType, target, 'chartattached', 'attachChart', this, [series, eventName], 'before'); + } else { + this.attachChart(series.getChart(), [series, eventName]); + } + + return true; + }, + + attachChart: function (chart, args) { + var dispatcher = this.dispatcher, + targetType = this.targetType, + series = args[0], + eventName = args[1], + subscribers = this.getSubscribers(chart.getId()), + match = eventName.match(this.delegationRegex); + if (match) { + var chartEventName = match[1]; + if (!subscribers.hasOwnProperty(eventName)) { + subscribers[eventName] = []; + dispatcher.addListener(targetType, '#' + series.getId(), 'chartdetached', 'detachChart', this, [series, eventName, subscribers], 'after'); + chart.element.on(chartEventName, "relayMethod", this, [chart, eventName]); + } + subscribers[eventName].push(series); + return true; + } else { + return false; + } + }, + + unsubscribe: function (target, eventName) { + var match = target.match(this.idSelectorRegex), + dispatcher = this.dispatcher, + targetType = this.targetType, + series, id; + + if (!match) { + return false; + } + + id = match[1]; + series = Ext.ComponentManager.get(id); + if (!series) { + return false; + } + + dispatcher.removeListener(targetType, target, 'chartattached', 'attachChart', this, 'before'); + if (series.getChart()) { + this.detachChart(series.getChart(), [series, eventName]); + } + return true; + }, + + detachChart: function (chart, args) { + var dispatcher = this.dispatcher, + targetType = this.targetType, + series = args[0], + eventName = args[1], + subscribers = this.getSubscribers(chart.getId()), + match = eventName.match(this.delegationRegex), + index, seriesArray; + if (match) { + var chartEventName = match[1]; + if (subscribers.hasOwnProperty(eventName)) { + seriesArray = subscribers[eventName]; + index = seriesArray.indexOf(series); + if (index > -1) { + seriesArray.splice(index, 1); + } + if (seriesArray.length === 0) { + chart.element.un(chartEventName, "relayMethod", this, [chart, eventName]); + dispatcher.removeListener(targetType, '#' + series.getId(), 'chartdetached', 'detachChart', this, 'after'); + delete subscribers[eventName]; + } + } + } + }, + + relayMethod: function (e, sender, args) { + var chart = args[0], + eventName = args[1], + dispatcher = this.dispatcher, + targetType = this.targetType, + chartXY = chart.getEventXY(e), + x = chartXY[0], + y = chartXY[1], + subscriber = this.getSubscribers(chart.getId())[eventName], + i, ln; + if (subscriber) { + for (i = 0, ln = subscriber.length; i < ln; i++) { + var series = subscriber[i], + item = series.getItemForPoint(x, y); + if (item) { + // TODO: Don't stop at the first item. + // Depending on the selectionTolerance, there might be an item in another + // series that's closer to the event location. See test case 3943c. + dispatcher.doDispatchEvent(targetType, '#' + series.getId(), eventName, [series, item, e]); + return; + } + } + } + } + +}, function () { + +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/series/Line.js b/vendor/touch/src/chart/series/Line.js new file mode 100644 index 000000000..cc585bd85 --- /dev/null +++ b/vendor/touch/src/chart/series/Line.js @@ -0,0 +1,202 @@ +/** + * @class Ext.chart.series.Line + * @extends Ext.chart.series.Cartesian + * + * Creates a Line Chart. A Line Chart is a useful visualization technique to display quantitative information for different + * categories or other real values (as opposed to the bar chart), that can show some progression (or regression) in the dataset. + * As with all other series, the Line Series must be appended in the *series* Chart array configuration. See the Chart + * documentation for more information. A typical configuration object for the line series could be: + * + * @example preview + * var lineChart = new Ext.chart.CartesianChart({ + * animate: true, + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':'metric one', 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':'metric two', 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':'metric three', 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':'metric four', 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':'metric five', 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * axes: [{ + * type: 'numeric', + * position: 'left', + * fields: ['data1'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * grid: true, + * minimum: 0 + * }, { + * type: 'category', + * position: 'bottom', + * fields: ['name'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * } + * }], + * series: [{ + * type: 'line', + * highlight: { + * size: 7, + * radius: 7 + * }, + * style: { + * stroke: 'rgb(143,203,203)' + * }, + * xField: 'name', + * yField: 'data1', + * marker: { + * type: 'path', + * path: ['M', -2, 0, 0, 2, 2, 0, 0, -2, 'Z'], + * stroke: 'blue', + * lineWidth: 0 + * } + * }, { + * type: 'line', + * highlight: { + * size: 7, + * radius: 7 + * }, + * fill: true, + * xField: 'name', + * yField: 'data3', + * marker: { + * type: 'circle', + * radius: 4, + * lineWidth: 0 + * } + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(lineChart); + * + * In this configuration we're adding two series (or lines), one bound to the `data1` + * property of the store and the other to `data3`. The type for both configurations is + * `line`. The `xField` for both series is the same, the `name` property of the store. + * Both line series share the same axis, the left axis. You can set particular marker + * configuration by adding properties onto the markerConfig object. Both series have + * an object as highlight so that markers animate smoothly to the properties in highlight + * when hovered. The second series has `fill = true` which means that the line will also + * have an area below it of the same color. + * + * **Note:** In the series definition remember to explicitly set the axis to bind the + * values of the line series to. This can be done by using the `axis` configuration property. + */ +Ext.define('Ext.chart.series.Line', { + extend: 'Ext.chart.series.Cartesian', + alias: 'series.line', + type: 'line', + seriesType: 'lineSeries', + + requires: [ + 'Ext.chart.series.sprite.Line' + ], + + config: { + /** + * @cfg {Number} selectionTolerance + * The offset distance from the cursor position to the line series to trigger events (then used for highlighting series, etc). + */ + selectionTolerance: 20, + + /** + * @cfg {Object} style + * An object containing styles for the visualization lines. These styles will override the theme styles. + * Some options contained within the style object will are described next. + */ + + /** + * @cfg {Boolean/Number} smooth + * If set to `true` or a non-zero number, the line will be smoothed/rounded around its points; otherwise + * straight line segments will be drawn. + * + * A numeric value is interpreted as a divisor of the horizontal distance between consecutive points in + * the line; larger numbers result in sharper curves while smaller numbers result in smoother curves. + * + * If set to `true` then a default numeric value of 3 will be used. + */ + smooth: false, + + /** + * @cfg {Boolean} step + * If set to `true`, the line uses steps instead of straight lines to connect the dots. + * It is ignored if `smooth` is true. + */ + step: false, + + /** + * @cfg {Boolean} fill + * If set to `true`, the area underneath the line is filled with the color defined as follows, listed by priority: + * - The color that is configured for this series ({@link Ext.chart.series.Series#colors}). + * - The color that is configured for this chart ({@link Ext.chart.AbstractChart#colors}). + * - The fill color that is set in the {@link #style} config. + * - The stroke color that is set in the {@link #style} config, or the same color as the line. + * + * Note: Do not confuse `series.config.fill` (which is a boolean) with `series.style.fill' (which is an alias + * for the `fillStyle` property and contains a color). For compatibility with previous versions of the API, + * if `config.fill` is undefined but a `style.fill' color is provided, `config.fill` is considered true. + * So the default value below must be undefined, not false. + */ + fill: undefined, + + aggregator: { strategy: 'double' } + }, + + /** + * @private Default numeric smoothing value to be used when `{@link #smooth} = true`. + */ + defaultSmoothness: 3, + + /** + * @private Size of the buffer area on either side of the viewport to provide seamless zoom/pan + * transforms. Expressed as a multiple of the viewport length, e.g. 1 will make the buffer on + * each side equal to the length of the visible axis viewport. + */ + overflowBuffer: 1, + + /** + * @private Override {@link Ext.chart.series.Series#getDefaultSpriteConfig} + */ + getDefaultSpriteConfig: function () { + var me = this, + parentConfig = me.callSuper(arguments), + style = me.getStyle(), + fillArea = false; + + if (typeof me.config.fill != 'undefined') { + // If config.fill is present but there is no fillStyle, then use the + // strokeStyle to fill (and paint the area the same color as the line). + if (me.config.fill) { + fillArea = true; + if (typeof style.fillStyle == 'undefined') { + style.fillStyle = style.strokeStyle; + } + } + } else { + // For compatibility with previous versions of the API, if config.fill + // is undefined but style.fillStyle is provided, we fill the area. + if (style.fillStyle) { + fillArea = true; + } + } + + // If we don't fill, then delete the fillStyle because that's what is used by + // the Line sprite to fill below the line. + if (!fillArea) { + delete style.fillStyle; + } + + return Ext.apply(parentConfig || {}, { + fillArea: fillArea, + step: me.config.step, + smooth: me.config.smooth, + selectionTolerance: me.config.selectionTolerance + }); + } + +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/series/Pie.js b/vendor/touch/src/chart/series/Pie.js new file mode 100644 index 000000000..c90d009ad --- /dev/null +++ b/vendor/touch/src/chart/series/Pie.js @@ -0,0 +1,393 @@ +/** + * @class Ext.chart.series.Pie + * @extends Ext.chart.series.Polar + * + * Creates a Pie Chart. A Pie Chart is a useful visualization technique to display quantitative information for different + * categories that also have a meaning as a whole. + * As with all other series, the Pie Series must be appended in the *series* Chart array configuration. See the Chart + * documentation for more information. A typical configuration object for the pie series could be: + * + * @example preview + * var chart = new Ext.chart.PolarChart({ + * animate: true, + * interactions: ['rotate'], + * colors: ['#115fa6', '#94ae0a', '#a61120', '#ff8809', '#ffd13e'], + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {name: 'metric one', data1: 10, data2: 12, data3: 14, data4: 8, data5: 13}, + * {name: 'metric two', data1: 7, data2: 8, data3: 16, data4: 10, data5: 3}, + * {name: 'metric three', data1: 5, data2: 2, data3: 14, data4: 12, data5: 7}, + * {name: 'metric four', data1: 2, data2: 14, data3: 6, data4: 1, data5: 23}, + * {name: 'metric five', data1: 27, data2: 38, data3: 36, data4: 13, data5: 33} + * ] + * }, + * series: [{ + * type: 'pie', + * label: { + * field: 'name', + * display: 'rotate' + * }, + * xField: 'data3', + * donut: 30 + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + * + * In this configuration we set `pie` as the type for the series, set an object with specific style properties for highlighting options + * (triggered when hovering elements). We also set true to `showInLegend` so all the pie slices can be represented by a legend item. + * We set `data1` as the value of the field to determine the angle span for each pie slice. We also set a label configuration object + * where we set the field name of the store field to be rendered as text for the label. The labels will also be displayed rotated. + * We set `contrast` to `true` to flip the color of the label if it is to similar to the background color. Finally, we set the font family + * and size through the `font` parameter. + * + */ +Ext.define('Ext.chart.series.Pie', { + extend: 'Ext.chart.series.Polar', + requires: [ + 'Ext.chart.series.sprite.PieSlice' + ], + type: 'pie', + alias: 'series.pie', + seriesType: 'pieslice', + + config: { + /** + * @cfg {String} labelField + * @deprecated Use {@link Ext.chart.series.Pie#label} instead. + * The store record field name to be used for the pie slice labels. + */ + labelField: false, + + /** + * @cfg {Number} donut Specifies the radius of the donut hole, as a percentage of the chart's radius. + * Defaults to 0 (no donut hole). + */ + donut: 0, + + /** + * @cfg {String} field + * @deprecated Use xField directly + */ + field: null, + + /** + * @cfg {Number} rotation The starting angle of the pie slices. + */ + rotation: 0, + + /** + * @cfg {Number} [totalAngle=2*PI] The total angle of the pie series. + */ + totalAngle: Math.PI * 2, + + /** + * @cfg {Array} hidden Determines which pie slices are hidden. + */ + hidden: [], + + /** + * @cfg {Number} Allows adjustment of the radius by a spefic perfentage. + */ + radiusFactor: 100, + + style: { + + } + }, + + directions: ['X'], + + setField: function (f) { + return this.setXField(f); + }, + + getField: function () { + return this.getXField(); + }, + + applyRadius : function (radius) { + return radius * this.getRadiusFactor() * 0.01; + }, + + updateLabelData: function () { + var me = this, + store = me.getStore(), + items = store.getData().items, + sprites = me.getSprites(), + labelField = me.getLabel().getTemplate().getField(), + hidden = me.getHidden(), + i, ln, labels, sprite; + if (sprites.length > 0 && labelField) { + labels = []; + for (i = 0, ln = items.length; i < ln; i++) { + labels.push(items[i].get(labelField)); + } + for (i = 0, ln = sprites.length; i < ln; i++) { + sprite = sprites[i]; + sprite.setAttributes({label: labels[i]}); + sprite.putMarker('labels', {hidden: hidden[i]}, sprite.attr.attributeId); + } + } + }, + + coordinateX: function () { + var me = this, + store = me.getStore(), + items = store.getData().items, + length = items.length, + field = me.getXField(), + value, sum = 0, + hidden = me.getHidden(), + summation = [], i, + lastAngle = 0, + totalAngle = me.getTotalAngle(), + sprites = me.getSprites(); + + if (!sprites) { + return; + } + + for (i = 0; i < length; i++) { + value = Math.abs(Number(items[i].get(field))) || 0; + if (!hidden[i]) { + sum += value; + } + summation[i] = sum; + if (i >= hidden.length) { + hidden[i] = false; + } + } + + if (sum !== 0) { + sum = totalAngle / sum; + } + for (i = 0; i < length; i++) { + sprites[i].setAttributes({ + startAngle: lastAngle, + endAngle: lastAngle = (sum ? summation[i] * sum : 0), + globalAlpha: 1 + }); + } + for (; i < me.sprites.length; i++) { + sprites[i].setAttributes({ + startAngle: totalAngle, + endAngle: totalAngle, + globalAlpha: 0 + }); + } + me.getChart().refreshLegendStore(); + }, + + updateCenter: function (center) { + this.setStyle({ + translationX: center[0] + this.getOffsetX(), + translationY: center[1] + this.getOffsetY() + }); + this.doUpdateStyles(); + }, + + updateRadius: function (radius) { + this.setStyle({ + startRho: radius * this.getDonut() * 0.01, // Percentage + endRho: radius + }); + this.doUpdateStyles(); + }, + + updateDonut: function (donut) { + var radius = this.getRadius(); + this.setStyle({ + startRho: radius * donut * 0.01, // Percentage + endRho: radius + }); + this.doUpdateStyles(); + }, + + updateRotation: function (rotation) { + this.setStyle({ + rotationRads: rotation + }); + this.doUpdateStyles(); + }, + + updateTotalAngle: function (totalAngle) { + this.processData(); + }, + + getSprites: function () { + var me = this, + chart = me.getChart(), + store = me.getStore(); + if (!chart || !store) { + return []; + } + me.getColors(); + me.getSubStyle(); + var items = store.getData().items, + length = items.length, + animation = chart && chart.getAnimate(), + sprites = me.sprites, sprite, + spriteIndex = 0, rendererData, + i, spriteCreated = false, + label = me.getLabel(), + labelTpl = label.getTemplate(); + + rendererData = { + store: store, + field: me.getField(), + series: me + }; + + for (i = 0; i < length; i++) { + sprite = sprites[i]; + if (!sprite) { + sprite = me.createSprite(); + if (me.getHighlightCfg()) { + sprite.config.highlightCfg = me.getHighlightCfg(); + sprite.addModifier('highlight', true); + } + if (labelTpl.getField()) { + labelTpl.setAttributes({ + labelOverflowPadding: me.getLabelOverflowPadding() + }); + labelTpl.fx.setCustomDuration({'callout': 200}); + sprite.bindMarker('labels', label); + } + sprite.setAttributes(me.getStyleByIndex(i)); + sprite.rendererData = rendererData; + sprite.rendererIndex = spriteIndex++; + spriteCreated = true; + } + sprite.fx.setConfig(animation); + } + if (spriteCreated) { + me.doUpdateStyles(); + } + return me.sprites; + }, + + normalizeAngle: function (angle) { + var pi2 = Math.PI * 2; + if (angle >= 0) { + return angle % pi2; + } + return (angle % pi2 + pi2) % pi2; + }, + + betweenAngle: function (x, a, b) { + var normalize = this.normalizeAngle; + a = normalize(a); + b = normalize(b); + x = normalize(x); + if (b === 0) { + b = Math.PI * 2; + } + return x >= a && x < b; + }, + + /** + * Returns the pie slice for a given angle + * @param {Number} angle The angle to search for the slice + * @return {Object} An object containing the reocord, sprite, scope etc. + */ + getItemForAngle: function (angle) { + var me = this, + sprites = me.getSprites(), + attr; + + angle %= Math.PI * 2; + + while (angle < 0) { + angle += Math.PI * 2; + } + + if (sprites) { + var store = me.getStore(), + items = store.getData().items, + hidden = me.getHidden(), + i = 0, + ln = store.getCount(); + + for (; i < ln; i++) { + if(!hidden[i]) { + // Fortunately, the id of items equals the index of it in instances list. + attr = sprites[i].attr; + + if (attr.startAngle <= angle && attr.endAngle >= angle) { + return { + series: me, + sprite: sprites[i], + index: i, + record: items[i], + field: me.getXField() + }; + } + } + } + } + + return null; + }, + + getItemForPoint: function (x, y) { + var me = this, + sprites = me.getSprites(); + if (sprites) { + var center = me.getCenter(), + offsetX = me.getOffsetX(), + offsetY = me.getOffsetY(), + originalX = x - center[0] + offsetX, + originalY = y - center[1] + offsetY, + store = me.getStore(), + donut = me.getDonut(), + items = store.getData().items, + direction = Math.atan2(originalY, originalX) - me.getRotation(), + donutLimit = Math.sqrt(originalX * originalX + originalY * originalY), + endRadius = me.getRadius(), + startRadius = donut / 100 * endRadius, + hidden = me.getHidden(), + i, ln, attr; + + for (i = 0, ln = items.length; i < ln; i++) { + if(!hidden[i]) { + // Fortunately, the id of items equals the index of it in instances list. + attr = sprites[i].attr; + if (startRadius + attr.margin <= donutLimit && donutLimit + attr.margin <= endRadius) { + if (this.betweenAngle(direction, attr.startAngle, attr.endAngle)) { + return { + series: this, + sprite: sprites[i], + index: i, + record: items[i], + field: this.getXField() + }; + } + } + } + } + return null; + } + }, + + provideLegendInfo: function (target) { + var store = this.getStore(); + if (store) { + var items = store.getData().items, + labelField = this.getLabel().getTemplate().getField(), + field = this.getField(), + hidden = this.getHidden(); + for (var i = 0; i < items.length; i++) { + target.push({ + name: labelField ? String(items[i].get(labelField)) : field + ' ' + i, + mark: this.getStyleByIndex(i).fillStyle || this.getStyleByIndex(i).strokeStyle || 'black', + disabled: hidden[i], + series: this.getId(), + index: i + }); + } + } + } +}); + diff --git a/vendor/touch/src/chart/series/Pie3D.js b/vendor/touch/src/chart/series/Pie3D.js new file mode 100644 index 000000000..cd47de7b3 --- /dev/null +++ b/vendor/touch/src/chart/series/Pie3D.js @@ -0,0 +1,247 @@ +/** + * @class Ext.chart.series.Pie3D + * @extends Ext.chart.series.Polar + * + * Creates a 3D Pie Chart. + * + * @example preview + * var chart = new Ext.chart.PolarChart({ + * animate: true, + * interactions: ['rotate'], + * colors: ["#115fa6", "#94ae0a", "#a61120", "#ff8809", "#ffd13e"], + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':'metric one', 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':'metric two', 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':'metric three', 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':'metric four', 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':'metric five', 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * series: [{ + * type: 'pie3d', + * field: 'data3', + * donut: 30 + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + */ +Ext.define('Ext.chart.series.Pie3D', { + requires: ['Ext.chart.series.sprite.Pie3DPart'], + extend: 'Ext.chart.series.Polar', + type: 'pie3d', + seriesType: 'pie3d', + alias: 'series.pie3d', + config: { + region: [0, 0, 0, 0], + thickness: 35, + distortion: 0.5, + + /** + * @cfg {String} field (required) + * The store record field name to be used for the pie angles. + * The values bound to this field name must be positive real numbers. + */ + field: false, + + /** + * @private + * @cfg {String} lengthField + * Not supported. + */ + lengthField: false, + + /** + * @cfg {Boolean/Number} donut + * Whether to set the pie chart as donut chart. + * Can be set to a particular percentage to set the radius + * of the donut chart. + */ + donut: false, + + rotation: 0 + }, + + applyRotation: function (rotation) { + var twoPie = Math.PI * 2; + return (rotation % twoPie + twoPie) % twoPie; + }, + + updateRotation: function (rotation) { + var sprites = this.getSprites(), + i, ln; + for (i = 0, ln = sprites.length; i < ln; i++) { + sprites[i].setAttributes({ + baseRotation: rotation + }); + } + }, + + updateColors: function (colorSet) { + this.setSubStyle({baseColor: colorSet}); + }, + + doUpdateStyles: function () { + var sprites = this.getSprites(), + i = 0, j = 0, ln = sprites && sprites.length; + for (; i < ln; i += 5, j++) { + sprites[i].setAttributes(this.getStyleByIndex(j)); + sprites[i + 1].setAttributes(this.getStyleByIndex(j)); + sprites[i + 2].setAttributes(this.getStyleByIndex(j)); + sprites[i + 3].setAttributes(this.getStyleByIndex(j)); + sprites[i + 4].setAttributes(this.getStyleByIndex(j)); + } + }, + + processData: function () { + var me = this, + chart = me.getChart(), + animation = chart && chart.getAnimate(), + store = me.getStore(), + items = store.getData().items, + length = items.length, + field = me.getField(), + value, sum = 0, ratio, + summation = [], + i, + sprites = this.getSprites(), + lastAngle; + + for (i = 0; i < length; i++) { + value = items[i].get(field); + sum += value; + summation[i] = sum; + } + if (sum === 0) { + return; + } + ratio = 2 * Math.PI / sum; + for (i = 0; i < length; i++) { + summation[i] *= ratio; + } + + for (i = 0; i < sprites.length; i++) { + sprites[i].fx.setConfig(animation); + } + + for (i = 0, lastAngle = 0; i < length; i++) { + var commonAttributes = {opacity: 1, startAngle: lastAngle, endAngle: summation[i]}; + sprites[i * 5].setAttributes(commonAttributes); + sprites[i * 5 + 1].setAttributes(commonAttributes); + sprites[i * 5 + 2].setAttributes(commonAttributes); + sprites[i * 5 + 3].setAttributes(commonAttributes); + sprites[i * 5 + 4].setAttributes(commonAttributes); + lastAngle = summation[i]; + } + }, + + getSprites: function () { + var me = this, + chart = this.getChart(), + surface = me.getSurface(), + store = me.getStore(); + if (!store) { + return []; + } + var items = store.getData().items, + length = items.length, + animation = chart && chart.getAnimate(), + region = chart.getMainRegion() || [0, 0, 1, 1], + rotation = me.getRotation(), + center = me.getCenter(), + offsetX = me.getOffsetX(), + offsetY = me.getOffsetY(), + radius = Math.min((region[3] - me.getThickness() * 2) / me.getDistortion(), region[2]) / 2, + commonAttributes = { + centerX: center[0] + offsetX, + centerY: center[1] + offsetY - me.getThickness() / 2, + endRho: radius, + startRho: radius * me.getDonut() / 100, + thickness: me.getThickness(), + distortion: me.getDistortion() + }, sliceAttributes, twoPie = Math.PI * 2, + topSprite, startSprite, endSprite, innerSideSprite, outerSideSprite, + i; + + for (i = 0; i < length; i++) { + sliceAttributes = Ext.apply({}, this.getStyleByIndex(i), commonAttributes); + topSprite = me.sprites[i * 5]; + if (!topSprite) { + topSprite = surface.add({ + type: 'pie3dPart', + part: 'top', + startAngle: twoPie, + endAngle: twoPie + }); + startSprite = surface.add({ + type: 'pie3dPart', + part: 'start', + startAngle: twoPie, + endAngle: twoPie + }); + endSprite = surface.add({ + type: 'pie3dPart', + part: 'end', + startAngle: twoPie, + endAngle: twoPie + }); + innerSideSprite = surface.add({ + type: 'pie3dPart', + part: 'inner', + startAngle: twoPie, + endAngle: twoPie, + thickness: 0 + }); + outerSideSprite = surface.add({ + type: 'pie3dPart', + part: 'outer', + startAngle: twoPie, + endAngle: twoPie, + thickness: 0 + }); + topSprite.fx.setDurationOn('baseRotation', 0); + startSprite.fx.setDurationOn('baseRotation', 0); + endSprite.fx.setDurationOn('baseRotation', 0); + innerSideSprite.fx.setDurationOn('baseRotation', 0); + outerSideSprite.fx.setDurationOn('baseRotation', 0); + topSprite.setAttributes(sliceAttributes); + startSprite.setAttributes(sliceAttributes); + endSprite.setAttributes(sliceAttributes); + innerSideSprite.setAttributes(sliceAttributes); + outerSideSprite.setAttributes(sliceAttributes); + me.sprites.push(topSprite, startSprite, endSprite, innerSideSprite, outerSideSprite); + } else { + startSprite = me.sprites[i * 5 + 1]; + endSprite = me.sprites[i * 5 + 2]; + innerSideSprite = me.sprites[i * 5 + 3]; + outerSideSprite = me.sprites[i * 5 + 4]; + if (animation) { + topSprite.fx.setConfig(animation); + startSprite.fx.setConfig(animation); + endSprite.fx.setConfig(animation); + innerSideSprite.fx.setConfig(animation); + outerSideSprite.fx.setConfig(animation); + } + topSprite.setAttributes(sliceAttributes); + startSprite.setAttributes(sliceAttributes); + endSprite.setAttributes(sliceAttributes); + innerSideSprite.setAttributes(sliceAttributes); + outerSideSprite.setAttributes(sliceAttributes); + } + } + + for (i *= 5; i < me.sprites.length; i++) { + me.sprites[i].fx.setConfig(animation); + me.sprites[i].setAttributes({ + opacity: 0, + startAngle: twoPie, + endAngle: twoPie, + baseRotation: rotation + }); + } + + return me.sprites; + } +}); diff --git a/vendor/touch/src/chart/series/Polar.js b/vendor/touch/src/chart/series/Polar.js new file mode 100644 index 000000000..a3d5da4bf --- /dev/null +++ b/vendor/touch/src/chart/series/Polar.js @@ -0,0 +1,90 @@ +/** + * Polar series. + */ +Ext.define('Ext.chart.series.Polar', { + + extend: 'Ext.chart.series.Series', + + config: { + /** + * @cfg {Number} rotation + * The angle in degrees at which the first polar series item should start. + */ + rotation: 0, + + /** + * @cfg {Number} radius + * The radius of the polar series. Set to `null` will fit the polar series to the boundary. + */ + radius: null, + + /** + * @cfg {Array} center for the polar series. + */ + center: [0, 0], + + /** + * @cfg {Number} offsetX + * The x-offset of center of the polar series related to the center of the boundary. + */ + offsetX: 0, + + /** + * @cfg {Number} offsetY + * The y-offset of center of the polar series related to the center of the boundary. + */ + offsetY: 0, + + /** + * @cfg {Boolean} showInLegend + * Whether to add the series elements as legend items. + */ + showInLegend: true, + + /** + * @cfg {String} xField + * The store record field name for the labels used in the radar series. + */ + xField: null, + + /** + * @cfg {String} yField + * The store record field name for the deflection of the graph in the radar series. + */ + yField: null, + + xAxis: null, + + yAxis: null + }, + + directions: ['X', 'Y'], + + fieldCategoryX: ['X'], + fieldCategoryY: ['Y'], + + getDefaultSpriteConfig: function () { + return { + type: this.seriesType, + renderer: this.getRenderer(), + centerX: 0, + centerY: 0, + rotationCenterX: 0, + rotationCenterY: 0 + }; + }, + + applyRotation: function (rotation) { + var twoPie = Math.PI * 2; + return (rotation % twoPie + Math.PI) % twoPie - Math.PI; + }, + + updateRotation: function (rotation) { + var sprites = this.getSprites(); + if (sprites && sprites[0]) { + sprites[0].setAttributes({ + baseRotation: rotation + }); + } + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/series/Radar.js b/vendor/touch/src/chart/series/Radar.js new file mode 100644 index 000000000..6c04fafbf --- /dev/null +++ b/vendor/touch/src/chart/series/Radar.js @@ -0,0 +1,171 @@ +/** + * @class Ext.chart.series.Radar + * @extends Ext.chart.series.Polar + * + * Creates a Radar Chart. A Radar Chart is a useful visualization technique for comparing different quantitative values for + * a constrained number of categories. + * As with all other series, the Radar series must be appended in the *series* Chart array configuration. See the Chart + * documentation for more information. A typical configuration object for the radar series could be: + * + * @example preview + * var chart = new Ext.chart.PolarChart({ + * animate: true, + * interactions: ['rotate'], + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':'metric one', 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':'metric two', 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':'metric three', 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':'metric four', 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':'metric five', 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * series: [{ + * type: 'radar', + * xField: 'name', + * yField: 'data4', + * style: { + * fillStyle: 'rgba(0, 0, 255, 0.1)', + * strokeStyle: 'rgba(0, 0, 0, 0.8)', + * lineWidth: 1 + * } + * }], + * axes: [ + * { + * type: 'numeric', + * position: 'radial', + * fields: 'data4', + * style: { + * estStepSize: 10 + * }, + * grid: true + * }, + * { + * type: 'category', + * position: 'angular', + * fields: 'name', + * style: { + * estStepSize: 1 + * }, + * grid: true + * } + * ] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + * + * + */ +Ext.define('Ext.chart.series.Radar', { + extend: 'Ext.chart.series.Polar', + type: "radar", + seriesType: 'radar', + alias: 'series.radar', + requires: ['Ext.chart.series.Cartesian', 'Ext.chart.series.sprite.Radar'], + /** + * @cfg {Object} style + * An object containing styles for overriding series styles from theming. + */ + + config: { + + }, + + updateAngularAxis: function (axis) { + axis.processData(this); + }, + + updateRadialAxis: function (axis) { + axis.processData(this); + }, + + coordinateX: function () { + return this.coordinate('X', 0, 2); + }, + + coordinateY: function () { + return this.coordinate('Y', 1, 2); + }, + + updateCenter: function (center) { + this.setStyle({ + translationX: center[0] + this.getOffsetX(), + translationY: center[1] + this.getOffsetY() + }); + this.doUpdateStyles(); + }, + + updateRadius: function (radius) { + this.setStyle({ + endRho: radius + }); + this.doUpdateStyles(); + }, + + updateRotation: function (rotation) { + this.setStyle({ + rotationRads: rotation + }); + this.doUpdateStyles(); + }, + + updateTotalAngle: function (totalAngle) { + this.processData(); + }, + + getItemForPoint: function (x, y) { + var me = this, + sprite = me.sprites && me.sprites[0], + attr = sprite.attr, + dataX = attr.dataX, + dataY = attr.dataY, + centerX = attr.centerX, + centerY = attr.centerY, + minX = attr.dataMinX, + maxX = attr.dataMaxX, + maxY = attr.dataMaxY, + endRho = attr.endRho, + startRho = attr.startRho, + baseRotation = attr.baseRotation, + i, length = dataX.length, + store = me.getStore(), + marker = me.getMarker(), + item, th, r; + + if(me.getHidden()) { + return null; + } + if (sprite && marker) { + for (i = 0; i < length; i++) { + th = (dataX[i] - minX) / (maxX - minX + 1) * 2 * Math.PI + baseRotation; + r = dataY[i] / maxY * (endRho - startRho) + startRho; + if (Math.abs(centerX + Math.cos(th) * r - x) < 22 && Math.abs(centerY + Math.sin(th) * r - y) < 22) { + item = { + series: this, + sprite: sprite, + index: i, + record: store.getData().items[i], + field: store.getFields().items[i] + }; + return item; + } + } + } + return this.callSuper(arguments); + }, + + getXRange: function () { + return [this.dataRange[0], this.dataRange[2]]; + }, + + getYRange: function () { + return [this.dataRange[1], this.dataRange[3]]; + } +}, function () { + var klass = this; + // TODO: [HACK] Steal from cartesian series. + klass.prototype.onAxesChanged = Ext.chart.series.Cartesian.prototype.onAxesChanged; + klass.prototype.getSprites = Ext.chart.series.Cartesian.prototype.getSprites; +}); + diff --git a/vendor/touch/src/chart/series/Scatter.js b/vendor/touch/src/chart/series/Scatter.js new file mode 100644 index 000000000..da6796504 --- /dev/null +++ b/vendor/touch/src/chart/series/Scatter.js @@ -0,0 +1,108 @@ +/** + * @class Ext.chart.series.Scatter + * @extends Ext.chart.series.Cartesian + * + * Creates a Scatter Chart. The scatter plot is useful when trying to display more than two variables in the same visualization. + * These variables can be mapped into x, y coordinates and also to an element's radius/size, color, etc. + * As with all other series, the Scatter Series must be appended in the *series* Chart array configuration. See the Chart + * documentation for more information on creating charts. A typical configuration object for the scatter could be: + * + * @example preview + * var chart = new Ext.chart.CartesianChart({ + * animate: true, + * store: { + * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], + * data: [ + * {'name':'metric one', 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13}, + * {'name':'metric two', 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3}, + * {'name':'metric three', 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7}, + * {'name':'metric four', 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23}, + * {'name':'metric five', 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33} + * ] + * }, + * axes: [{ + * type: 'numeric', + * position: 'left', + * fields: ['data1'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * }, + * grid: true, + * minimum: 0 + * }, { + * type: 'category', + * position: 'bottom', + * fields: ['name'], + * title: { + * text: 'Sample Values', + * fontSize: 15 + * } + * }], + * series: [{ + * type: 'scatter', + * highlight: { + * size: 7, + * radius: 7 + * }, + * fill: true, + * xField: 'name', + * yField: 'data3', + * marker: { + * type: 'circle', + * fillStyle: 'blue', + * radius: 10, + * lineWidth: 0 + * } + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(chart); + * + * In this configuration we add three different categories of scatter series. Each of them is bound to a different field of the same data store, + * `data1`, `data2` and `data3` respectively. All x-fields for the series must be the same field, in this case `name`. + * Each scatter series has a different styling configuration for markers, specified by the `marker` object. Finally we set the left axis as + * axis to show the current values of the elements. + * + */ +Ext.define('Ext.chart.series.Scatter', { + + extend: 'Ext.chart.series.Cartesian', + + alias: 'series.scatter', + + type: 'scatter', + seriesType: 'scatterSeries', + + requires: [ + 'Ext.chart.series.sprite.Scatter' + ], + + config: { + itemInstancing: { + fx: { + customDuration: { + translationX: 0, + translationY: 0 + } + } + } + }, + + applyMarker: function (marker) { + this.getItemInstancing(); + this.setItemInstancing(marker); + }, + + provideLegendInfo: function (target) { + var style = this.config.marker; + target.push({ + name: this.getTitle() || this.getYField() || this.getId(), + mark: style.fill || style.stroke || 'black', + disabled: false, + series: this.getId(), + index: 0 + }); + } +}); + diff --git a/vendor/touch/src/chart/series/Series.js b/vendor/touch/src/chart/series/Series.js new file mode 100644 index 000000000..92d312845 --- /dev/null +++ b/vendor/touch/src/chart/series/Series.js @@ -0,0 +1,1028 @@ +/** + * Series is the abstract class containing the common logic to all chart series. Series includes + * methods from Labels, Highlights, and Callouts mixins. This class implements the logic of + * animating, hiding, showing all elements and returning the color of the series to be used as a legend item. + * + * ## Listeners + * + * The series class supports listeners via the Observable syntax. Some of these listeners are: + * + * - `itemmouseup` When the user interacts with a marker. + * - `itemmousedown` When the user interacts with a marker. + * - `itemmousemove` When the user interacts with a marker. + * - (similar `item*` events occur for many raw mouse and touch events) + * - `afterrender` Will be triggered when the animation ends or when the series has been rendered completely. + * + * For example: + * + * series: [{ + * type: 'bar', + * axis: 'left', + * listeners: { + * 'afterrender': function() { + * console('afterrender'); + * } + * }, + * xField: 'category', + * yField: 'data1' + * }] + * + */ +Ext.define('Ext.chart.series.Series', { + + requires: ['Ext.chart.Markers', 'Ext.chart.label.Label'], + + mixins: { + observable: 'Ext.mixin.Observable' + }, + + /** + * @property {String} type + * The type of series. Set in subclasses. + * @protected + */ + type: null, + + /** + * @property {String} seriesType + * Default series sprite type. + */ + seriesType: 'sprite', + + identifiablePrefix: 'ext-line-', + + observableType: 'series', + + /** + * @event chartattached + * Fires when the {@link Ext.chart.AbstractChart} has been attached to this series. + * @param {Ext.chart.AbstractChart} chart + * @param {Ext.chart.series.Series} series + */ + /** + * @event chartdetached + * Fires when the {@link Ext.chart.AbstractChart} has been detached from this series. + * @param {Ext.chart.AbstractChart} chart + * @param {Ext.chart.series.Series} series + */ + + config: { + /** + * @private + * @cfg {Object} chart The chart that the series is bound. + */ + chart: null, + + /** + * @cfg {String|String[]} title + * The human-readable name of the series (displayed in the legend). + */ + title: null, + + /** + * @cfg {Function} renderer + * A function that can be provided to set custom styling properties to each rendered element. + * It receives `(sprite, config, rendererData, index)` as parameters. + * + * @param {Object} sprite The sprite affected by the renderer. The visual attributes are in `sprite.attr`. + * The data field is available in `sprite.getField()`. + * @param {Object} config The sprite configuration. It varies with the series and the type of sprite: + * for instance, a Line chart sprite might have just the `x` and `y` properties while a Bar + * chart sprite also has `width` and `height`. A `type` might be present too. For instance to + * draw each marker and each segment of a Line chart, the renderer is called with the + * `config.type` set to either `marker` or `line`. + * @param {Object} rendererData A record with different properties depending on the type of chart. + * The only guaranteed property is `rendererData.store`, the store used by the series. + * In some cases, a store may not exist: for instance a Gauge chart may read its value directly + * from its configuration; in this case rendererData.store is null and the value is + * available in rendererData.value. + * @param {Number} index The index of the sprite. It is usually the index of the store record associated + * with the sprite, in which case the record can be obtained with `store.getData().items[index]`. + * If the chart is not associated with a store, the index represents the index of the sprite within + * the series. For instance a Gauge chart may have as many sprites as there are sectors in the + * background of the gauge, plus one for the needle. + * + * @return {Object} The attributes that have been changed or added. Note: it is usually possible to + * add or modify the attributes directly into the `config` parameter and not return anything, + * but returning an object with only those attributes that have been changed may allow for + * optimizations in the rendering of some series. Example to draw every other item in red: + * + * renderer: function (sprite, config, rendererData, index) { + * if (index % 2 == 0) { + * return { strokeStyle: 'red' }; + * } + * } + */ + renderer: null, + + /** + * @cfg {Boolean} showInLegend + * Whether to show this series in the legend. + */ + showInLegend: true, + + //@private triggerdrawlistener flag + triggerAfterDraw: false, + + /** + * @private + * Not supported. + */ + themeStyle: {}, + + /** + * @cfg {Object} style Custom style configuration for the sprite used in the series. + */ + style: {}, + + /** + * @cfg {Object} subStyle This is the cyclic used if the series has multiple sprites. + */ + subStyle: {}, + + /** + * @cfg {Array} colors + * An array of color values which will be used, in order, as the pie slice fill colors. + */ + colors: null, + + /** + * @protected + * @cfg {Object} store The store of values used in the series. + */ + store: null, + + /** + * @cfg {Object} label + * The style object for labels. + */ + + /** + * @cfg {Object} label + * Object with the following properties: + * + * @cfg {String} label.display + * + * Specifies the presence and position of the labels. The possible values depend on the chart type. + * For Line charts: 'under' | 'over' | 'rotate'. + * For Bar charts: 'insideStart' | 'insideEnd' | 'outside'. + * For Pie charts: 'outside' | 'rotate'. + * For all charts: 'none' hides the labels. + * + * Default value: 'none'. + * + * @cfg {String} label.color + * + * The color of the label text. + * + * Default value: '#000' (black). + * + * @cfg {String|String[]} label.field + * + * The name(s) of the field(s) to be displayed in the labels. If your chart has 3 series + * that correspond to the fields 'a', 'b', and 'c' of your model and you only want to + * display labels for the series 'c', you must still provide an array `[null, null, 'c']`. + * + * Default value: null. + * + * @cfg {String} label.font + * + * The font used for the labels. + * + * Default value: '14px Helvetica'. + * + * @cfg {String} label.orientation + * + * Either 'horizontal' or 'vertical'. If not set (default), the orientation is inferred + * from the value of the flipXY property of the series. + * + * Default value: ''. + * + * @cfg {Function} label.renderer + * + * Optional function for formatting the label into a displayable value. + * + * The arguments to the method are: + * + * - *`text`*, *`sprite`*, *`config`*, *`rendererData`*, *`index`* + * + * Label's renderer is passed the same arguments as {@link #renderer} + * plus one extra 'text' argument which comes first. + * + * @return {Object|String} The attributes that have been changed or added, or the text for the label. + * Example to enclose every other label in parentheses: + * + * renderer: function (text) { + * if (index % 2 == 0) { + * return '(' + text + ')' + * } + * } + * + * Default value: null. + */ + label: {textBaseline: 'middle', textAlign: 'center', font: '14px Helvetica'}, + + /** + * @cfg {Number} labelOverflowPadding + * Extra distance value for which the labelOverflow listener is triggered. + */ + labelOverflowPadding: 5, + + /** + * @cfg {String|String[]} labelField + * @deprecated Use 'field' property of {@link Ext.chart.series.Series#label} instead. + * The store record field name to be used for the series labels. + */ + labelField: null, + + /** + * @cfg {Object} marker + * The sprite template used by marker instances on the series. + */ + marker: null, + + /** + * @cfg {Object} markerSubStyle + * This is cyclic used if series have multiple marker sprites. + */ + markerSubStyle: null, + + /** + * @protected + * @cfg {Object} itemInstancing The sprite template used to create sprite instances in the series. + */ + itemInstancing: null, + + /** + * @cfg {Object} background Sets the background of the surface the series is attached. + */ + background: null, + + /** + * @cfg {Object} highlightItem The item currently highlighted in the series. + */ + highlightItem: null, + + /** + * @protected + * @cfg {Object} surface The surface that the series is attached. + */ + surface: null, + + /** + * @protected + * @cfg {Object} overlaySurface The surface that series markers are attached. + */ + overlaySurface: null, + + /** + * @cfg {Boolean|Array} hidden + */ + hidden: false, + + /** + * @cfg {Object} highlightCfg The sprite configuration used when highlighting items in the series. + */ + highlightCfg: null, + + /** + * @cfg {Object} animate The series animation configuration. + */ + animate: null + }, + + directions: [], + + sprites: null, + + getFields: function (fieldCategory) { + var me = this, + fields = [], fieldsItem, + i, ln; + for (i = 0, ln = fieldCategory.length; i < ln; i++) { + fieldsItem = me['get' + fieldCategory[i] + 'Field'](); + fields.push(fieldsItem); + } + return fields; + }, + + updateAnimate: function (animate) { + var sprites = this.getSprites(), i = -1, ln = sprites.length; + while (++i < ln) { + sprites[i].fx.setConfig(animate); + } + }, + + updateTitle: function (newTitle) { + if (newTitle) { + var chart = this.getChart(), + series = chart.getSeries(), + legendStore = chart.getLegendStore(), + index, rec; + + if (series) { + index = Ext.Array.indexOf(series, this); + + if (index !== -1) { + rec = legendStore.getAt(index); + rec.set('name', newTitle); + } + } + } + }, + + updateColors: function (colorSet) { + this.setSubStyle({fillStyle: colorSet}); + this.doUpdateStyles(); + }, + + applyHighlightCfg: function (highlight, oldHighlight) { + return Ext.apply(oldHighlight || {}, highlight); + }, + + applyItemInstancing: function (instancing, oldInstancing) { + return Ext.merge(oldInstancing || {}, instancing); + }, + + setAttributesForItem: function (item, change) { + if (item && item.sprite) { + if (item.sprite.itemsMarker && item.category === 'items') { + item.sprite.putMarker(item.category, change, item.index, false, true); + } + if (item.sprite.isMarkerHolder && item.category === 'markers') { + item.sprite.putMarker(item.category, change, item.index, false, true); + } else if (item.sprite instanceof Ext.draw.sprite.Instancing) { + item.sprite.setAttributesFor(item.index, change); + } else { + + item.sprite.setAttributes(change); + } + } + }, + + applyHighlightItem: function (newHighlightItem, oldHighlightItem) { + if (newHighlightItem === oldHighlightItem) { + return; + } + if (Ext.isObject(newHighlightItem) && Ext.isObject(oldHighlightItem)) { + if (newHighlightItem.sprite === oldHighlightItem.sprite && + newHighlightItem.index === oldHighlightItem.index + ) { + return; + } + } + return newHighlightItem; + }, + + updateHighlightItem: function (newHighlightItem, oldHighlightItem) { + this.setAttributesForItem(oldHighlightItem, {highlighted: false}); + this.setAttributesForItem(newHighlightItem, {highlighted: true}); + }, + + constructor: function (config) { + var me = this; + me.getId(); + me.sprites = []; + me.dataRange = []; + Ext.ComponentManager.register(me); + me.mixins.observable.constructor.apply(me, arguments); + }, + + applyStore: function (store) { + return Ext.StoreManager.lookup(store); + }, + + getStore: function () { + return this._store || this.getChart() && this.getChart().getStore(); + }, + + updateStore: function (newStore, oldStore) { + var me = this, + chartStore = this.getChart() && this.getChart().getStore(), + sprites = me.getSprites(), + ln = sprites.length, + i, sprite; + newStore = newStore || chartStore; + oldStore = oldStore || chartStore; + + if (oldStore) { + oldStore.un('updaterecord', 'onUpdateRecord', me); + oldStore.un('refresh', 'refresh', me); + } + if (newStore) { + newStore.on('updaterecord', 'onUpdateRecord', me); + newStore.on('refresh', 'refresh', me); + for (i = 0; i < ln; i++) { + sprite = sprites[i]; + if (sprite.setStore) { + sprite.setStore(newStore); + } + } + me.refresh(); + } + }, + + onStoreChanged: function (store, oldStore) { + if (!this._store) { + this.updateStore(store, oldStore); + } + }, + + coordinateStacked: function (direction, directionOffset, directionCount) { + var me = this, + store = me.getStore(), + items = store.getData().items, + axis = me['get' + direction + 'Axis'](), + hidden = me.getHidden(), + range = {min: 0, max: 0}, + directions = me['fieldCategory' + direction], + fieldCategoriesItem, + i, j, k, fields, field, data, style = {}, + dataStart = [], dataEnd, posDataStart = [], negDataStart = [], + stacked = me.getStacked(), + sprites = me.getSprites(); + + if (sprites.length > 0) { + for (i = 0; i < directions.length; i++) { + fieldCategoriesItem = directions[i]; + fields = me.getFields([fieldCategoriesItem]); + for (j = 0; j < items.length; j++) { + dataStart[j] = 0; + posDataStart[j] = 0; + negDataStart[j] = 0; + } + for (j = 0; j < fields.length; j++) { + style = {}; + field = fields[j]; + if (hidden[j]) { + style['dataStart' + fieldCategoriesItem] = dataStart; + style['data' + fieldCategoriesItem] = dataStart; + sprites[j].setAttributes(style); + continue; + } + data = me.coordinateData(items, field, axis); + if (stacked) { + dataEnd = []; + for (k = 0; k < items.length; k++) { + if (!data[k]) { + data[k] = 0; + } + if (data[k] >= 0) { + dataStart[k] = posDataStart[k]; + posDataStart[k] += data[k]; + dataEnd[k] = posDataStart[k]; + } else { + dataStart[k] = negDataStart[k]; + negDataStart[k] += data[k]; + dataEnd[k] = negDataStart[k]; + } + } + style['dataStart' + fieldCategoriesItem] = dataStart; + style['data' + fieldCategoriesItem] = dataEnd; + me.getRangeOfData(dataStart, range); + me.getRangeOfData(dataEnd, range); + } else { + style['dataStart' + fieldCategoriesItem] = dataStart; + style['data' + fieldCategoriesItem] = data; + me.getRangeOfData(data, range); + } + sprites[j].setAttributes(style); + } + } + me.dataRange[directionOffset] = range.min; + me.dataRange[directionOffset + directionCount] = range.max; + style = {}; + style['dataMin' + direction] = range.min; + style['dataMax' + direction] = range.max; + for (i = 0; i < sprites.length; i++) { + sprites[i].setAttributes(style); + } + } + }, + + coordinate: function (direction, directionOffset, directionCount) { + var me = this, + store = me.getStore(), + hidden = me.getHidden(), + items = store.getData().items, + axis = me['get' + direction + 'Axis'](), + range = {min: Infinity, max: -Infinity}, + fieldCategory = me['fieldCategory' + direction] || [direction], + fields = me.getFields(fieldCategory), + i, field, data, style = {}, + sprites = me.getSprites(); + if (sprites.length > 0) { + if (!Ext.isBoolean(hidden) || !hidden) { + for (i = 0; i < fieldCategory.length; i++) { + field = fields[i]; + data = me.coordinateData(items, field, axis); + me.getRangeOfData(data, range); + style['data' + fieldCategory[i]] = data; + } + } + me.dataRange[directionOffset] = range.min; + me.dataRange[directionOffset + directionCount] = range.max; + style['dataMin' + direction] = range.min; + style['dataMax' + direction] = range.max; + if (axis) { + axis.range = null; + style['range' + direction] = axis.getRange(); + } + for (i = 0; i < sprites.length; i++) { + sprites[i].setAttributes(style); + } + } + }, + + /** + * @private + * This method will return an array containing data coordinated by a specific axis. + * @param {Array} items + * @param {String} field + * @param {Ext.chart.axis.Axis} axis + * @return {Array} + */ + coordinateData: function (items, field, axis) { + var data = [], + length = items.length, + layout = axis && axis.getLayout(), + coord = axis ? function (x, field, idx, items) { + return layout.getCoordFor(x, field, idx, items); + } : function (x) { return +x; }, + i, x; + for (i = 0; i < length; i++) { + x = items[i].data[field]; + data[i] = !Ext.isEmpty(x) ? coord(x, field, i, items) : x; + } + return data; + }, + + getRangeOfData: function (data, range) { + var i, length = data.length, + value, min = range.min, max = range.max; + for (i = 0; i < length; i++) { + value = data[i]; + if (value < min) { + min = value; + } + if (value > max) { + max = value; + } + } + range.min = min; + range.max = max; + }, + + updateLabelData: function () { + var me = this, + store = me.getStore(), + items = store.getData().items, + sprites = me.getSprites(), + labelTpl = me.getLabel().getTemplate(), + labelFields = Ext.Array.from(labelTpl.getField() || me.getLabelField()), + i, j, ln, labels, + sprite, field; + + if (!sprites.length || !labelFields.length) { + return; + } + + for (i = 0; i < sprites.length; i++) { + labels = []; + sprite = sprites[i]; + field = sprite.getField(); + if (labelFields.indexOf(field) < 0) { + field = labelFields[i]; + } + for (j = 0, ln = items.length; j < ln; j++) { + labels.push(items[j].get(field)); + } + sprite.setAttributes({labels: labels}); + } + }, + + updateLabelField: function (labelField) { + var labelTpl = this.getLabel().getTemplate(); + if (!labelTpl.config.field) { + labelTpl.setField(labelField) + } + }, + + processData: function () { + if (!this.getStore()) { + return; + } + + var me = this, + directions = this.directions, + i, ln = directions.length, + fieldCategory, axis; + + for (i = 0; i < ln; i++) { + fieldCategory = directions[i]; + if (me['get' + fieldCategory + 'Axis']) { + axis = me['get' + fieldCategory + 'Axis'](); + if (axis) { + axis.processData(me); + continue; + } + } + if (me['coordinate' + fieldCategory]) { + me['coordinate' + fieldCategory](); + } + } + me.updateLabelData(); + }, + + applyBackground: function (background) { + if (this.getChart()) { + this.getSurface().setBackground(background); + return this.getSurface().getBackground(); + } else { + return background; + } + }, + + updateChart: function (newChart, oldChart) { + var me = this; + if (oldChart) { + oldChart.un('axeschanged', 'onAxesChanged', me); + // TODO: destroy them + me.sprites = []; + me.setSurface(null); + me.setOverlaySurface(null); + me.onChartDetached(oldChart); + } + if (newChart) { + me.setSurface(newChart.getSurface('series-surface', 'series')); + me.setOverlaySurface(newChart.getSurface('overlay-surface', 'overlay')); + + newChart.on('axeschanged', 'onAxesChanged', me); + if (newChart.getAxes()) { + me.onAxesChanged(newChart); + } + me.onChartAttached(newChart); + } + + me.updateStore(me._store, null); + }, + + onAxesChanged: function (chart) { + var me = this, + axes = chart.getAxes(), axis, + directionMap = {}, directionMapItem, + fieldMap = {}, fieldMapItem, + needHighPrecision = false, + directions = this.directions, direction, + i, ln, j, ln2, k, ln3; + + for (i = 0, ln = directions.length; i < ln; i++) { + direction = directions[i]; + fieldMap[direction] = me.getFields(me['fieldCategory' + direction]); + } + + for (i = 0, ln = axes.length; i < ln; i++) { + axis = axes[i]; + if (!directionMap[axis.getDirection()]) { + directionMap[axis.getDirection()] = [axis]; + } else { + directionMap[axis.getDirection()].push(axis); + } + } + + for (i = 0, ln = directions.length; i < ln; i++) { + direction = directions[i]; + if (directionMap[direction]) { + directionMapItem = directionMap[direction]; + for (j = 0, ln2 = directionMapItem.length; j < ln2; j++) { + axis = directionMapItem[j]; + if (axis.getFields().length === 0) { + me['set' + direction + 'Axis'](axis); + if (axis.getNeedHighPrecision()) { + needHighPrecision = true; + } + } else { + fieldMapItem = fieldMap[direction]; + if (fieldMapItem) { + for (k = 0, ln3 = fieldMapItem.length; k < ln3; k++) { + if (axis.fieldsMap[fieldMapItem[k]]) { + me['set' + direction + 'Axis'](axis); + if (axis.getNeedHighPrecision()) { + needHighPrecision = true; + } + break; + } + } + } + } + } + } + } + this.getSurface().setHighPrecision(needHighPrecision); + }, + + onChartDetached: function (oldChart) { + var me = this; + me.fireEvent('chartdetached', oldChart, me); + oldChart.un('storechanged', 'onStoreChanged', me); + }, + + onChartAttached: function (chart) { + var me = this; + me.setBackground(me.getBackground()); + me.fireEvent('chartattached', chart, me); + chart.on('storechanged', 'onStoreChanged', me); + me.processData(); + }, + + updateOverlaySurface: function (overlaySurface) { + var me = this; + if (overlaySurface) { + if (me.getLabel()) { + me.getOverlaySurface().add(me.getLabel()); + } + } + }, + + applyLabel: function (newLabel, oldLabel) { + if (!oldLabel) { + oldLabel = new Ext.chart.Markers({zIndex: 10}); + oldLabel.setTemplate(new Ext.chart.label.Label(newLabel)); + } else { + oldLabel.getTemplate().setAttributes(newLabel); + } + return oldLabel; + }, + + createItemInstancingSprite: function (sprite, itemInstancing) { + var me = this, + template, + markers = new Ext.chart.Markers(); + + markers.setAttributes({zIndex: Number.MAX_VALUE}); + var config = Ext.apply({}, itemInstancing); + if (me.getHighlightCfg()) { + config.highlightCfg = me.getHighlightCfg(); + config.modifiers = ['highlight']; + } + markers.setTemplate(config); + template = markers.getTemplate(); + template.setAttributes(me.getStyle()); + template.fx.on('animationstart', 'onSpriteAnimationStart', this); + template.fx.on('animationend', 'onSpriteAnimationEnd', this); + sprite.bindMarker('items', markers); + + me.getSurface().add(markers); + return markers; + }, + + getDefaultSpriteConfig: function () { + return { + type: this.seriesType, + renderer: this.getRenderer() + }; + }, + + createSprite: function () { + var me = this, + surface = me.getSurface(), + itemInstancing = me.getItemInstancing(), + marker, config, + sprite = surface.add(me.getDefaultSpriteConfig()); + + sprite.setAttributes(this.getStyle()); + + if (itemInstancing) { + sprite.itemsMarker = me.createItemInstancingSprite(sprite, itemInstancing); + } + + if (sprite.bindMarker) { + if (me.getMarker()) { + marker = new Ext.chart.Markers(); + config = Ext.merge({}, me.getMarker()); + if (me.getHighlightCfg()) { + config.highlightCfg = me.getHighlightCfg(); + config.modifiers = ['highlight']; + } + marker.setTemplate(config); + marker.getTemplate().fx.setCustomDuration({ + translationX: 0, + translationY: 0 + }); + sprite.dataMarker = marker; + sprite.bindMarker('markers', marker); + me.getOverlaySurface().add(marker); + } + if (me.getLabel().getTemplate().getField() || me.getLabelField()) { + sprite.bindMarker('labels', me.getLabel()); + } + } + + if (sprite.setStore) { + sprite.setStore(me.getStore()); + } + + sprite.fx.on('animationstart', 'onSpriteAnimationStart', me); + sprite.fx.on('animationend', 'onSpriteAnimationEnd', me); + + me.sprites.push(sprite); + + return sprite; + }, + + /** + * Performs drawing of this series. + */ + getSprites: Ext.emptyFn, + + onUpdateRecord: function () { + // TODO: do something REALLY FAST. + this.processData(); + }, + + refresh: function () { + this.processData(); + }, + + isXType: function (xtype) { + return xtype === 'series'; + }, + + getItemId: function () { + return this.getId(); + }, + + applyStyle: function (style, oldStyle) { + // TODO: Incremental setter + var cls = Ext.ClassManager.get(Ext.ClassManager.getNameByAlias('sprite.' + this.seriesType)); + if (cls && cls.def) { + style = cls.def.normalize(style); + } + return Ext.apply(oldStyle || Ext.Object.chain(this.getThemeStyle()), style); + }, + + applyMarker: function (marker, oldMarker) { + var type = (marker && marker.type) || (oldMarker && oldMarker.type) || this.seriesType, + cls; + if (type) { + cls = Ext.ClassManager.get(Ext.ClassManager.getNameByAlias('sprite.' + type)); + if (cls && cls.def) { + marker = cls.def.normalize(marker, true); + marker.type = type; + return Ext.merge(oldMarker || {}, marker); + } + return Ext.merge(oldMarker || {}, marker); + } + }, + + applyMarkerSubStyle: function (marker, oldMarker) { + var type = (marker && marker.type) || (oldMarker && oldMarker.type) || this.seriesType, + cls; + if (type) { + cls = Ext.ClassManager.get(Ext.ClassManager.getNameByAlias('sprite.' + type)); + if (cls && cls.def) { + marker = cls.def.batchedNormalize(marker, true); + return Ext.merge(oldMarker || {}, marker); + } + return Ext.merge(oldMarker || {}, marker); + } + }, + + applySubStyle: function (subStyle, oldSubStyle) { + var cls = Ext.ClassManager.get(Ext.ClassManager.getNameByAlias('sprite.' + this.seriesType)); + if (cls && cls.def) { + subStyle = cls.def.batchedNormalize(subStyle, true); + return Ext.merge(oldSubStyle || {}, subStyle); + } + return Ext.merge(oldSubStyle || {}, subStyle); + }, + + updateHidden: function (hidden) { + // TODO: remove this when jacky fix the problem. + this.getColors(); + this.getSubStyle(); + this.setSubStyle({hidden: hidden}); + this.processData(); + this.doUpdateStyles(); + }, + + /** + * + * @param {Number} index + * @param {Boolean} value + */ + setHiddenByIndex: function (index, value) { + if (Ext.isArray(this.getHidden())) { + this.getHidden()[index] = value; + this.updateHidden(this.getHidden()); + } else { + this.setHidden(value); + } + }, + + updateStyle: function () { + this.doUpdateStyles(); + }, + + updateSubStyle: function () { + this.doUpdateStyles(); + }, + + doUpdateStyles: function () { + var sprites = this.sprites, + itemInstancing = this.getItemInstancing(), + i = 0, ln = sprites && sprites.length, + markerCfg = this.getMarker(), + style; + for (; i < ln; i++) { + style = this.getStyleByIndex(i); + if (itemInstancing) { + sprites[i].itemsMarker.getTemplate().setAttributes(style); + } + sprites[i].setAttributes(style); + if (markerCfg && sprites[i].dataMarker) { + sprites[i].dataMarker.getTemplate().setAttributes(this.getMarkerStyleByIndex(i)); + } + } + }, + + getMarkerStyleByIndex: function (i) { + return this.getOverriddenStyleByIndex(i, this.getOverriddenStyleByIndex(i, this.getMarkerSubStyle(), this.getMarker()), this.getStyleByIndex(i)); + }, + + getStyleByIndex: function (i) { + return this.getOverriddenStyleByIndex(i, this.getSubStyle(), this.getStyle()); + }, + + getOverriddenStyleByIndex: function (i, subStyle, baseStyle) { + var subStyleItem, + result = Ext.Object.chain(baseStyle || {}); + for (var name in subStyle) { + subStyleItem = subStyle[name]; + if (Ext.isArray(subStyleItem)) { + result[name] = subStyleItem[i % subStyle[name].length]; + } else { + result[name] = subStyleItem; + } + } + return result; + }, + + /** + * For a given x/y point relative to the main region, find a corresponding item from this + * series, if any. + * @param {Number} x + * @param {Number} y + * @param {Object} [target] optional target to receive the result + * @return {Object} An object describing the item, or null if there is no matching item. The exact contents of + * this object will vary by series type, but should always contain at least the following: + * + * @return {Ext.data.Model} return.record the record of the item. + * @return {Array} return.point the x/y coordinates relative to the chart box of a single point + * for this data item, which can be used as e.g. a tooltip anchor point. + * @return {Ext.draw.sprite.Sprite} return.sprite the item's rendering Sprite. + * @return {Number} return.subSprite the index if sprite is an instancing sprite. + */ + getItemForPoint: Ext.emptyFn, + + onSpriteAnimationStart: function (sprite) { + this.fireEvent('animationstart', sprite); + }, + + onSpriteAnimationEnd: function (sprite) { + this.fireEvent('animationend', sprite); + }, + + /** + * Provide legend information to target array. + * + * @param {Array} target + * + * The information consists: + * @param {String} target.name + * @param {String} target.markColor + * @param {Boolean} target.disabled + * @param {String} target.series + * @param {Number} target.index + */ + provideLegendInfo: function (target) { + target.push({ + name: this.getTitle() || this.getId(), + mark: 'black', + disabled: false, + series: this.getId(), + index: 0 + }); + }, + + destroy: function () { + this.clearListeners(); + Ext.ComponentManager.unregister(this); + var store = this.getStore(); + if (store && store.getAutoDestroy()) { + Ext.destroy(store); + } + this.setStore(null); + this.callSuper(); + } +}); diff --git a/vendor/touch/src/chart/series/StackedCartesian.js b/vendor/touch/src/chart/series/StackedCartesian.js new file mode 100644 index 000000000..6bb7707fa --- /dev/null +++ b/vendor/touch/src/chart/series/StackedCartesian.js @@ -0,0 +1,160 @@ +/** + * @abstract + * @extends Ext.chart.series.Cartesian + * Abstract class for all the stacked cartesian series including area series + * and bar series. + */ +Ext.define('Ext.chart.series.StackedCartesian', { + + extend: 'Ext.chart.series.Cartesian', + + config: { + /** + * @cfg {Boolean} + * 'true' to display the series in its stacked configuration. + */ + stacked: true, + + /** + * @cfg {Array} hidden + */ + hidden: [] + }, + + animatingSprites: 0, + + updateStacked: function () { + this.processData(); + }, + + coordinateY: function () { + return this.coordinateStacked('Y', 1, 2); + }, + + getFields: function (fieldCategory) { + var me = this, + fields = [], fieldsItem, + i, ln; + for (i = 0, ln = fieldCategory.length; i < ln; i++) { + fieldsItem = me['get' + fieldCategory[i] + 'Field'](); + if (Ext.isArray(fieldsItem)) { + fields.push.apply(fields, fieldsItem); + } else { + fields.push(fieldsItem); + } + } + return fields; + }, + + updateLabelOverflowPadding: function (labelOverflowPadding) { + this.getLabel().setAttributes({labelOverflowPadding: labelOverflowPadding}); + }, + + getSprites: function () { + var me = this, + chart = this.getChart(), + animation = chart && chart.getAnimate(), + fields = me.getFields(me.fieldCategoryY), + itemInstancing = me.getItemInstancing(), + sprites = me.sprites, sprite, + hidden = me.getHidden(), + spritesCreated = false, + i, length = fields.length; + + if (!chart) { + return []; + } + + for (i = 0; i < length; i++) { + sprite = sprites[i]; + if (!sprite) { + sprite = me.createSprite(); + if (chart.getFlipXY()) { + sprite.setAttributes({zIndex: i}); + } else { + sprite.setAttributes({zIndex: -i}); + } + sprite.setField(fields[i]); + spritesCreated = true; + hidden.push(false); + if (itemInstancing) { + sprite.itemsMarker.getTemplate().setAttributes(me.getOverriddenStyleByIndex(i)); + } else { + sprite.setAttributes(me.getStyleByIndex(i)); + } + } + if (animation) { + if (itemInstancing) { + sprite.itemsMarker.getTemplate().fx.setConfig(animation); + } + sprite.fx.setConfig(animation); + } + } + + if (spritesCreated) { + me.updateHidden(hidden); + } + return sprites; + }, + + getItemForPoint: function (x, y) { + if (this.getSprites()) { + var me = this, + i, ln, sprite, + itemInstancing = me.getItemInstancing(), + sprites = me.getSprites(), + store = me.getStore(), + hidden = me.getHidden(), + item; + + for (i = 0, ln = sprites.length; i < ln; i++) { + if(!hidden[i]) { + sprite = sprites[i]; + var index = sprite.getIndexNearPoint(x, y); + if (index !== -1) { + item = { + series: me, + index: index, + category: itemInstancing ? 'items' : 'markers', + record: store.getData().items[index], + field: this.getYField()[i], + sprite: sprite + }; + return item; + } + } + } + return null; + } + }, + + provideLegendInfo: function (target) { + var sprites = this.getSprites(), + title = this.getTitle(), + field = this.getYField(), + hidden = this.getHidden(); + for (var i = 0; i < sprites.length; i++) { + target.push({ + name: Ext.isArray(this.getTitle()) ? this.getTitle()[i] : (field && field[i]) || this.getId(), + mark: this.getStyleByIndex(i).fillStyle || this.getStyleByIndex(i).strokeStyle || 'black', + disabled: hidden[i], + series: this.getId(), + index: i + }); + } + }, + + onSpriteAnimationStart: function (sprite) { + this.animatingSprites++; + if (this.animatingSprites === 1) { + this.fireEvent('animationstart'); + } + }, + + onSpriteAnimationEnd: function (sprite) { + this.animatingSprites--; + if (this.animatingSprites === 0) { + this.fireEvent('animationend'); + } + } +}); diff --git a/vendor/touch/src/chart/series/sprite/Aggregative.js b/vendor/touch/src/chart/series/sprite/Aggregative.js new file mode 100644 index 000000000..427816c92 --- /dev/null +++ b/vendor/touch/src/chart/series/sprite/Aggregative.js @@ -0,0 +1,86 @@ +/** + * + */ +Ext.define('Ext.chart.series.sprite.Aggregative', { + extend: 'Ext.chart.series.sprite.Cartesian', + requires: ['Ext.draw.LimitedCache', 'Ext.draw.SegmentTree'], + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Object} [dataHigh=null] Data items representing the high values of the aggregated data. + */ + dataHigh: 'data', + + /** + * @cfg {Object} [dataLow=null] Data items representing the low values of the aggregated data. + */ + dataLow: 'data', + + /** + * @cfg {Object} [dataClose=null] Data items representing the closing values of the aggregated data. + */ + dataClose: 'data' + }, + aliases: { + /** + * @cfg {Object} [dataOpen=null] Data items representing the opening values of the aggregated data. + */ + dataOpen: 'dataY' + }, + defaults: { + dataHigh: null, + dataLow: null, + dataClose: null + } + } + }, + + config: { + aggregator: {} + }, + + applyAggregator: function (aggregator, oldAggr) { + return Ext.factory(aggregator, Ext.draw.SegmentTree, oldAggr); + }, + + constructor: function () { + this.callSuper(arguments); + }, + + processDataY: function () { + var me = this, + attr = me.attr, + high = attr.dataHigh, + low = attr.dataLow, + close = attr.dataClose, + open = attr.dataY; + me.callSuper(arguments); + if (attr.dataX && open && open.length > 0) { + if (high) { + me.getAggregator().setData(attr.dataX, attr.dataY, high, low, close); + } else { + me.getAggregator().setData(attr.dataX, attr.dataY); + } + } + }, + + getGapWidth: function () { + return 1; + }, + + renderClipped: function (surface, ctx, clip, region) { + var me = this, + aggregates = me.getAggregator() && me.getAggregator().getAggregation( + clip[0], + clip[2], + (clip[2] - clip[0]) / region[2] * me.getGapWidth() + ); + if (aggregates) { + me.dataStart = aggregates.data.startIdx[aggregates.start]; + me.dataEnd = aggregates.data.endIdx[aggregates.end - 1]; + + me.renderAggregates(aggregates.data, aggregates.start, aggregates.end, surface, ctx, clip, region); + } + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/series/sprite/Area.js b/vendor/touch/src/chart/series/sprite/Area.js new file mode 100644 index 000000000..4f6522d53 --- /dev/null +++ b/vendor/touch/src/chart/series/sprite/Area.js @@ -0,0 +1,116 @@ +/** + * @class Ext.chart.series.sprite.Area + * @extends Ext.chart.series.sprite.StackedCartesian + * + * Area series sprite. + */ +Ext.define("Ext.chart.series.sprite.Area", { + alias: 'sprite.areaSeries', + extend: "Ext.chart.series.sprite.StackedCartesian", + + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Boolean} [step=false] 'true' if the area is represented with steps instead of lines. + */ + step: 'bool' + }, + defaults: { + step: false + } + } + }, + + renderClipped: function (surface, ctx, clip, clipRegion) { + var me = this, + attr = me.attr, + dataX = attr.dataX, + dataY = attr.dataY, + dataStartY = attr.dataStartY, + matrix = attr.matrix, + x, y, i, lastX, lastY, + xx = matrix.elements[0], + dx = matrix.elements[4], + yy = matrix.elements[3], + dy = matrix.elements[5], + surfaceMatrix = me.surfaceMatrix, + markerCfg = {}, + start = Math.max(0, this.binarySearch(clip[0])), + end = Math.min(dataX.length - 1, this.binarySearch(clip[2]) + 1); + ctx.beginPath(); + + if (attr.step) { + lastY = dataY[start] * yy + dy; + for (i = start; i <= end; i++) { + x = dataX[i] * xx + dx; + y = dataY[i] * yy + dy; + ctx.lineTo(x, lastY); + ctx.lineTo(x, lastY = y); + } + } else { + for (i = start; i <= end; i++) { + x = dataX[i] * xx + dx; + y = dataY[i] * yy + dy; + ctx.lineTo(x, y); + } + } + + if (dataStartY) { + if (attr.step) { + lastX = dataX[end] * xx + dx; + for (i = end; i >= start; i--) { + x = dataX[i] * xx + dx; + y = dataStartY[i] * yy + dy; + ctx.lineTo(lastX, y); + ctx.lineTo(lastX = x, y); + } + } else { + for (i = end; i >= start; i--) { + x = dataX[i] * xx + dx; + y = dataStartY[i] * yy + dy; + ctx.lineTo(x, y); + } + } + } else { + // dataStartY[i] == 0; + ctx.lineTo(dataX[end] * xx + dx, y); + ctx.lineTo(dataX[end] * xx + dx, dy); + ctx.lineTo(dataX[start] * xx + dx, dy); + ctx.lineTo(dataX[start] * xx + dx, dataY[i] * yy + dy); + } + if (attr.transformFillStroke) { + attr.matrix.toContext(ctx); + } + ctx.fill(); + if (attr.transformFillStroke) { + attr.inverseMatrix.toContext(ctx); + } + ctx.beginPath(); + if (attr.step) { + for (i = start; i <= end; i++) { + x = dataX[i] * xx + dx; + y = dataY[i] * yy + dy; + ctx.lineTo(x, lastY); + ctx.lineTo(x, lastY = y); + markerCfg.translationX = surfaceMatrix.x(x, y); + markerCfg.translationY = surfaceMatrix.y(x, y); + me.putMarker("markers", markerCfg, i, !attr.renderer); + } + } else { + for (i = start; i <= end; i++) { + x = dataX[i] * xx + dx; + y = dataY[i] * yy + dy; + ctx.lineTo(x, y); + markerCfg.translationX = surfaceMatrix.x(x, y); + markerCfg.translationY = surfaceMatrix.y(x, y); + me.putMarker("markers", markerCfg, i, !attr.renderer); + } + } + + if (attr.transformFillStroke) { + attr.matrix.toContext(ctx); + } + ctx.stroke(); + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/series/sprite/Bar.js b/vendor/touch/src/chart/series/sprite/Bar.js new file mode 100644 index 000000000..7206b2476 --- /dev/null +++ b/vendor/touch/src/chart/series/sprite/Bar.js @@ -0,0 +1,223 @@ +/** + * @class Ext.chart.series.sprite.Bar + * @extends Ext.chart.series.sprite.StackedCartesian + * + * Draws a sprite used in the bar series. + */ +Ext.define('Ext.chart.series.sprite.Bar', { + alias: 'sprite.barSeries', + extend: 'Ext.chart.series.sprite.StackedCartesian', + + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Number} [minBarWidth=2] The minimum bar width. + */ + minBarWidth: 'number', + + /** + * @cfg {Number} [maxBarWidth=100] The maximum bar width. + */ + maxBarWidth: 'number', + + /** + * @cfg {Number} [minGapWidth=5] The minimum gap between bars. + */ + minGapWidth: 'number', + + /** + * @cfg {Number} [radius=0] The degree of rounding for rounded bars. + */ + radius: 'number', + + /** + * @cfg {Number} [inGroupGapWidth=3] The gap between grouped bars. + */ + inGroupGapWidth: 'number' + }, + defaults: { + minBarWidth: 2, + maxBarWidth: 100, + minGapWidth: 5, + inGroupGapWidth: 3, + radius: 0 + } + } + }, + + // TODO: design this more carefully + drawLabel: function (text, dataX, dataStartY, dataY, labelId) { + var me = this, + attr = me.attr, + label = me.getBoundMarker('labels')[0], + labelTpl = label.getTemplate(), + labelCfg = me.labelCfg || (me.labelCfg = {}), + surfaceMatrix = me.surfaceMatrix, + labelOverflowPadding = attr.labelOverflowPadding, + labelDisplay = labelTpl.attr.display, + labelOrientation = labelTpl.attr.orientation, + labelY, halfWidth, labelBox, + changes; + + labelBox = me.getMarkerBBox('labels', labelId, true); + labelCfg.text = text; + if (!labelBox) { + me.putMarker('labels', labelCfg, labelId); + labelBox = me.getMarkerBBox('labels', labelId, true); + } + if (!attr.flipXY) { + labelCfg.rotationRads = -Math.PI * 0.5; + } else { + labelCfg.rotationRads = 0; + } + labelCfg.calloutVertical = !attr.flipXY; + + switch (labelOrientation) { + case 'horizontal': labelCfg.rotationRads = 0; break; + case 'vertical': labelCfg.rotationRads = -Math.PI * 0.5; break; + } + + halfWidth = (labelBox.width / 2 + labelOverflowPadding); + if (dataStartY > dataY) { + halfWidth = -halfWidth; + } + + if ((labelOrientation === 'horizontal' && attr.flipXY) || (labelOrientation === 'vertical' && !attr.flipXY) || !labelOrientation) { + labelY = (labelDisplay === 'insideStart') ? dataStartY + halfWidth : dataY - halfWidth; + } else { + labelY = (labelDisplay === 'insideStart') ? dataStartY + labelOverflowPadding * 2 : dataY - labelOverflowPadding * 2; + } + labelCfg.x = surfaceMatrix.x(dataX, labelY); + labelCfg.y = surfaceMatrix.y(dataX, labelY); + + labelY = (labelDisplay === 'insideStart') ? dataStartY - halfWidth : dataY + halfWidth; + labelCfg.calloutPlaceX = surfaceMatrix.x(dataX, labelY); + labelCfg.calloutPlaceY = surfaceMatrix.y(dataX, labelY); + + labelY = (labelDisplay === 'insideStart') ? dataStartY : dataY; + labelCfg.calloutStartX = surfaceMatrix.x(dataX, labelY); + labelCfg.calloutStartY = surfaceMatrix.y(dataX, labelY); + if (dataStartY > dataY) { + halfWidth = -halfWidth; + } + if (Math.abs(dataY - dataStartY) <= halfWidth * 2 || labelDisplay === 'outside') { + labelCfg.callout = 1; + } else { + labelCfg.callout = 0; + } + + if (labelTpl.attr.renderer) { + changes = labelTpl.attr.renderer.call(this, text, label, labelCfg, {store: this.getStore()}, labelId); + if (typeof changes === 'string') { + labelCfg.text = changes; + } else { + Ext.apply(labelCfg, changes); + } + } + + me.putMarker('labels', labelCfg, labelId); + }, + + drawBar: function (ctx, surface, clip, left, top, right, bottom, index) { + var itemCfg = this.itemCfg || (this.itemCfg = {}), + changes; + + itemCfg.x = left; + itemCfg.y = top; + itemCfg.width = right - left; + itemCfg.height = bottom - top; + itemCfg.radius = this.attr.radius; + + if (this.attr.renderer) { + changes = this.attr.renderer.call(this, this, itemCfg, {store:this.getStore()}, index); + Ext.apply(itemCfg, changes); + } + this.putMarker('items', itemCfg, index, !this.attr.renderer); + }, + + //@inheritdoc + renderClipped: function (surface, ctx, clip) { + if (this.cleanRedraw) { + return; + } + var me = this, + attr = me.attr, + dataX = attr.dataX, + dataY = attr.dataY, + dataText = attr.labels, + dataStartY = attr.dataStartY, + groupCount = attr.groupCount, + groupOffset = attr.groupOffset - (groupCount - 1) * 0.5, + inGroupGapWidth = attr.inGroupGapWidth, + yLow, yHi, + lineWidth = ctx.lineWidth, + matrix = attr.matrix, + xx = matrix.elements[0], + yy = matrix.elements[3], + dx = matrix.elements[4], + dy = surface.roundPixel(matrix.elements[5]) - 1, + maxBarWidth = xx - attr.minGapWidth, + barWidth = surface.roundPixel(Math.max(attr.minBarWidth, (Math.min(maxBarWidth, attr.maxBarWidth) - inGroupGapWidth * (groupCount - 1)) / groupCount)), + surfaceMatrix = this.surfaceMatrix, + left, right, bottom, top, i, center, + halfLineWidth = 0.5 * attr.lineWidth, + start = Math.max(0, Math.floor(clip[0])), + end = Math.min(dataX.length - 1, Math.ceil(clip[2])), + drawMarkers = dataText && !!this.getBoundMarker('labels'); + + for (i = start; i <= end; i++) { + yLow = dataStartY ? dataStartY[i] : 0; + yHi = dataY[i]; + + center = dataX[i] * xx + dx + groupOffset * (barWidth + inGroupGapWidth); + left = surface.roundPixel(center - barWidth / 2) + halfLineWidth; + top = surface.roundPixel(yHi * yy + lineWidth + dy); + right = surface.roundPixel(center + barWidth / 2) - halfLineWidth; + bottom = surface.roundPixel(yLow * yy + lineWidth + dy); + + me.drawBar(ctx, surface, clip, left, top - halfLineWidth, right, bottom - halfLineWidth, i); + + if (drawMarkers && dataText[i]) { + me.drawLabel(dataText[i], center, bottom, top, i); + } + me.putMarker('markers', { + translationX: surfaceMatrix.x(center, top), + translationY: surfaceMatrix.y(center, top) + }, i, true); + } + }, + + //@inheritdoc + getIndexNearPoint: function (x, y) { + var sprite = this, + attr = sprite.attr, + dataX = attr.dataX, + surface = sprite.getParent(), + surfaceRegion = surface.getRegion(), + surfaceHeight = surfaceRegion[3], + hitX, hitY, index = -1; + + // The "items" sprites that draw the bars work in a reverse vertical coordinate system + // starting with 0 at the bottom and increasing the Y coordinate toward the top. + // See also Ext.chart.series.Bar.getItemForPoint(x,y) regarding the chart's InnerPadding. + // + // TODO: Cleanup the bar sprites. + if (attr.flipXY) { + hitX = surfaceHeight - y; + hitY = x; + } else { + hitX = x; + hitY = surfaceHeight - y; + } + + for (var i = 0; i < dataX.length; i++) { + var bbox = sprite.getMarkerBBox('items', i); + if (bbox && hitX >= bbox.x && hitX <= (bbox.x + bbox.width) && hitY >= bbox.y && hitY <= (bbox.y + bbox.height)) { + index = i; + } + } + return index; + } + +}); diff --git a/vendor/touch/src/chart/series/sprite/CandleStick.js b/vendor/touch/src/chart/series/sprite/CandleStick.js new file mode 100644 index 000000000..1ad021987 --- /dev/null +++ b/vendor/touch/src/chart/series/sprite/CandleStick.js @@ -0,0 +1,165 @@ +/** + * @class Ext.chart.series.sprite.CandleStick + * @extends Ext.chart.series.sprite.Aggregative + * + * CandleStick series sprite. + */ +Ext.define('Ext.chart.series.sprite.CandleStick', { + alias: 'sprite.candlestickSeries', + extend: 'Ext.chart.series.sprite.Aggregative', + inheritableStatics: { + def: { + processors: { + raiseStyle: function (n, o) { + return Ext.merge({}, o || {}, n); + }, + dropStyle: function (n, o) { + return Ext.merge({}, o || {}, n); + }, + + /** + * @cfg {Number} [barWidth=15] The bar width of the candles. + */ + barWidth: 'number', + + /** + * @cfg {Number} [padding=3] The amount of padding between candles. + */ + padding: 'number', + + /** + * @cfg {String} [ohlcType='candlestick'] Determines whether candlestick or ohlc is used. + */ + ohlcType: 'enums(candlestick,ohlc)' + }, + defaults: { + raiseStyle: { + strokeStyle: 'green', + fillStyle: 'green' + }, + dropStyle: { + strokeStyle: 'red', + fillStyle: 'red' + }, + planar: false, + barWidth: 15, + padding: 3, + lineJoin: 'miter', + miterLimit: 5, + ohlcType: 'candlestick' + }, + + dirtyTriggers: { + raiseStyle: 'raiseStyle', + dropStyle: 'dropStyle' + }, + + updaters: { + raiseStyle: function () { + this.raiseTemplate && this.raiseTemplate.setAttributes(this.attr.raiseStyle); + }, + dropStyle: function () { + this.dropTemplate && this.dropTemplate.setAttributes(this.attr.dropStyle); + } + } + } + }, + + candlestick: function (ctx, open, high, low, close, mid, halfWidth) { + var minOC = Math.min(open, close), + maxOC = Math.max(open, close); + ctx.moveTo(mid, low); + ctx.lineTo(mid, maxOC); + + ctx.moveTo(mid + halfWidth, maxOC); + ctx.lineTo(mid + halfWidth, minOC); + ctx.lineTo(mid - halfWidth, minOC); + ctx.lineTo(mid - halfWidth, maxOC); + ctx.closePath(); + + ctx.moveTo(mid, high); + ctx.lineTo(mid, minOC); + }, + + ohlc: function (ctx, open, high, low, close, mid, halfWidth) { + ctx.moveTo(mid, high); + ctx.lineTo(mid, low); + ctx.moveTo(mid, open); + ctx.lineTo(mid - halfWidth, open); + ctx.moveTo(mid, close); + ctx.lineTo(mid + halfWidth, close); + }, + + constructor: function () { + this.callSuper(arguments); + this.raiseTemplate = new Ext.draw.sprite.Rect({parent: this}); + this.dropTemplate = new Ext.draw.sprite.Rect({parent: this}); + }, + + getGapWidth: function () { + var attr = this.attr, + barWidth = attr.barWidth, + padding = attr.padding; + return barWidth + padding; + }, + + renderAggregates: function (aggregates, start, end, surface, ctx, clip, region) { + var me = this, + attr = this.attr, + dataX = attr.dataX, + matrix = attr.matrix, + xx = matrix.getXX(), + yy = matrix.getYY(), + dx = matrix.getDX(), + dy = matrix.getDY(), + barWidth = attr.barWidth / xx, + template, + ohlcType = attr.ohlcType, + halfWidth = Math.round(barWidth * 0.5 * xx), + opens = aggregates.open, + highs = aggregates.high, + lows = aggregates.low, + closes = aggregates.close, + maxYs = aggregates.maxY, + minYs = aggregates.minY, + startIdxs = aggregates.startIdx, + open, high, low, close, mid, + i, + pixelAdjust = attr.lineWidth * surface.devicePixelRatio / 2; + + pixelAdjust -= Math.floor(pixelAdjust); + ctx.save(); + template = this.raiseTemplate; + template.useAttributes(ctx); + ctx.beginPath(); + for (i = start; i < end; i++) { + if (opens[i] <= closes[i]) { + open = Math.round(opens[i] * yy + dy) + pixelAdjust; + high = Math.round(maxYs[i] * yy + dy) + pixelAdjust; + low = Math.round(minYs[i] * yy + dy) + pixelAdjust; + close = Math.round(closes[i] * yy + dy) + pixelAdjust; + mid = Math.round(dataX[startIdxs[i]] * xx + dx) + pixelAdjust; + me[ohlcType](ctx, open, high, low, close, mid, halfWidth); + } + } + ctx.fillStroke(template.attr); + ctx.restore(); + + ctx.save(); + template = this.dropTemplate; + template.useAttributes(ctx); + ctx.beginPath(); + for (i = start; i < end; i++) { + if (opens[i] > closes[i]) { + open = Math.round(opens[i] * yy + dy) + pixelAdjust; + high = Math.round(maxYs[i] * yy + dy) + pixelAdjust; + low = Math.round(minYs[i] * yy + dy) + pixelAdjust; + close = Math.round(closes[i] * yy + dy) + pixelAdjust; + mid = Math.round(dataX[startIdxs[i]] * xx + dx) + pixelAdjust; + me[ohlcType](ctx, open, high, low, close, mid, halfWidth); + } + } + ctx.fillStroke(template.attr); + ctx.restore(); + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/series/sprite/Cartesian.js b/vendor/touch/src/chart/series/sprite/Cartesian.js new file mode 100644 index 000000000..5b4dcc8db --- /dev/null +++ b/vendor/touch/src/chart/series/sprite/Cartesian.js @@ -0,0 +1,284 @@ +/** + * @class Ext.chart.series.sprite.Cartesian + * @extends Ext.draw.sprite.Sprite + * + * Cartesian sprite. + */ +Ext.define('Ext.chart.series.sprite.Cartesian', { + extend: 'Ext.draw.sprite.Sprite', + mixins: { + markerHolder: 'Ext.chart.MarkerHolder' + }, + homogeneous: true, + ascending: true, + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Number} [dataMinX=0] Data minimum on the x-axis. + */ + dataMinX: 'number', + + /** + * @cfg {Number} [dataMaxX=1] Data maximum on the x-axis. + */ + dataMaxX: 'number', + + /** + * @cfg {Number} [dataMinY=0] Data minimum on the y-axis. + */ + dataMinY: 'number', + + /** + * @cfg {Number} [dataMaxY=2] Data maximum on the y-axis. + */ + dataMaxY: 'number', + + /** + * @cfg {Array} Data range derived from all the series bound to the x-axis. + */ + rangeX: 'data', + /** + * @cfg {Array} Data range derived from all the series bound to the y-axis. + */ + rangeY: 'data', + + /** + * @cfg {Object} [dataY=null] Data items on the y-axis. + */ + dataY: 'data', + + /** + * @cfg {Object} [dataX=null] Data items on the x-axis. + */ + dataX: 'data', + + /** + * @cfg {Object} [labels=null] Labels used in the series. + */ + labels: 'default', + + /** + * @cfg {Number} [labelOverflowPadding=10] Padding around labels to determine overlap. + */ + labelOverflowPadding: 'number', + + /** + * @cfg {Number} [selectionTolerance=20] + * The distance from the event position to the sprite's data points to trigger interactions (used for 'iteminfo', etc). + */ + selectionTolerance: 'number', + + /** + * @cfg {Boolean} If flipXY is 'true', the series is flipped. + */ + flipXY: 'bool', + + renderer: 'default', + + // PanZoom information + visibleMinX: 'number', + visibleMinY: 'number', + visibleMaxX: 'number', + visibleMaxY: 'number', + innerWidth: 'number', + innerHeight: 'number' + }, + defaults: { + dataY: null, + dataX: null, + dataMinX: 0, + dataMaxX: 1, + dataMinY: 0, + dataMaxY: 1, + labels: null, + labelOverflowPadding: 10, + selectionTolerance: 20, + flipXY: false, + renderer: null, + transformFillStroke: false, + + visibleMinX: 0, + visibleMinY: 0, + visibleMaxX: 1, + visibleMaxY: 1, + innerWidth: 1, + innerHeight: 1 + }, + dirtyTriggers: { + dataX: 'dataX,bbox', + dataY: 'dataY,bbox', + dataMinX: 'bbox', + dataMaxX: 'bbox', + dataMinY: 'bbox', + dataMaxY: 'bbox', + visibleMinX: 'panzoom', + visibleMinY: 'panzoom', + visibleMaxX: 'panzoom', + visibleMaxY: 'panzoom', + innerWidth: 'panzoom', + innerHeight: 'panzoom' + }, + updaters: { + dataX: function (attrs) { + this.processDataX(); + if (!attrs.dirtyFlags.dataY) { + attrs.dirtyFlags.dataY = []; + } + attrs.dirtyFlags.dataY.push('dataY'); + }, + + dataY: function () { + this.processDataY(); + }, + + panzoom: function (attrs) { + var dx = attrs.visibleMaxX - attrs.visibleMinX, + dy = attrs.visibleMaxY - attrs.visibleMinY, + innerWidth = attrs.flipXY ? attrs.innerHeight : attrs.innerWidth, + innerHeight = !attrs.flipXY ? attrs.innerHeight : attrs.innerWidth; + attrs.translationX = -attrs.visibleMinX * innerWidth / dx; + attrs.translationY = -attrs.visibleMinY * innerHeight / dy; + attrs.scalingX = innerWidth / dx; + attrs.scalingY = innerHeight / dy; + attrs.scalingCenterX = 0; + attrs.scalingCenterY = 0; + this.applyTransformations(true); + } + } + } + }, + + config: { + /** + * @private + * @cfg {Object} store The store that is passed to the renderer. + */ + store: null, + + /** + * @cfg {String} field The store field used by the series. + */ + field: null + }, + + processDataY: Ext.emptyFn, + + processDataX: Ext.emptyFn, + + updatePlainBBox: function (plain) { + var attr = this.attr; + plain.x = attr.dataMinX; + plain.y = attr.dataMinY; + plain.width = attr.dataMaxX - attr.dataMinX; + plain.height = attr.dataMaxY - attr.dataMinY; + }, + + /** + * Does a binary search of the data on the x-axis using the given key. + * @param {String} key + * @return {*} + */ + binarySearch: function (key) { + var dx = this.attr.dataX, + start = 0, + end = dx.length; + if (key <= dx[0]) { + return start; + } + if (key >= dx[end - 1]) { + return end - 1; + } + while (start + 1 < end) { + var mid = (start + end) >> 1, + val = dx[mid]; + if (val === key) { + return mid; + } else if (val < key) { + start = mid; + } else { + end = mid; + } + } + return start; + }, + + render: function (surface, ctx, region) { + var me = this, + attr = me.attr, + flipXY = attr.flipXY, + inverseMatrix = attr.inverseMatrix.clone(); + + inverseMatrix.appendMatrix(surface.inverseMatrix); + + if (attr.dataX === null) { + return; + } + if (attr.dataY === null) { + return; + } + + if (inverseMatrix.getXX() * inverseMatrix.getYX() || inverseMatrix.getXY() * inverseMatrix.getYY()) { + console.log('Cartesian Series sprite does not support rotation/sheering'); + return; + } + + var clip = inverseMatrix.transformList([ + [region[0] - 1, region[3] + 1], + [region[0] + region[2] + 1, -1] + ]); + + clip = clip[0].concat(clip[1]); + + if (clip[2] < clip[0]) { + console.log('Cartesian Series sprite does not supports flipped X.'); + // TODO: support it + return; + } + me.renderClipped(surface, ctx, clip, region); + }, + + /** + * Render the given visible clip range. + * @param {Ext.draw.Surface} surface + * @param {Ext.draw.engine.Canvas/Ext.draw.engine.SvgContext} ctx + * @param {Array} clip + * @param {Arrary} region + */ + renderClipped: Ext.emptyFn, + + /** + * Get the nearest item index from point (x, y). -1 as not found. + * @param {Number} x + * @param {Number} y + * @return {Number} The index + */ + getIndexNearPoint: function (x, y) { + var sprite = this, + mat = sprite.attr.matrix, + dataX = sprite.attr.dataX, + dataY = sprite.attr.dataY, + selectionTolerance = sprite.attr.selectionTolerance, + minX, minY, index = -1, + imat = mat.clone().prependMatrix(this.surfaceMatrix).inverse(), + center = imat.transformPoint([x, y]), + positionLB = imat.transformPoint([x - selectionTolerance, y - selectionTolerance]), + positionTR = imat.transformPoint([x + selectionTolerance, y + selectionTolerance]), + left = Math.min(positionLB[0], positionTR[0]), + right = Math.max(positionLB[0], positionTR[0]), + top = Math.min(positionLB[1], positionTR[1]), + bottom = Math.max(positionLB[1], positionTR[1]); + + for (var i = 0; i < dataX.length; i++) { + if (left < dataX[i] && dataX[i] < right && top < dataY[i] && dataY[i] < bottom) { + if (index === -1 || (Math.abs(dataX[i] - center[0]) < minX) && (Math.abs(dataY[i] - center[1]) < minY)) { + minX = Math.abs(dataX[i] - center[0]); + minY = Math.abs(dataY[i] - center[1]); + index = i; + } + } + } + + return index; + } +}); diff --git a/vendor/touch/src/chart/series/sprite/Line.js b/vendor/touch/src/chart/series/sprite/Line.js new file mode 100644 index 000000000..81d8e93bc --- /dev/null +++ b/vendor/touch/src/chart/series/sprite/Line.js @@ -0,0 +1,387 @@ +/** + * @class Ext.chart.series.sprite.Line + * @extends Ext.chart.series.sprite.Aggregative + * + * Line series sprite. + */ +Ext.define('Ext.chart.series.sprite.Line', { + alias: 'sprite.lineSeries', + extend: 'Ext.chart.series.sprite.Aggregative', + + inheritableStatics: { + def: { + processors: { + smooth: 'bool', + fillArea: 'bool', + step: 'bool', + preciseStroke: 'bool' + }, + + defaults: { + /** + * @cfg {Boolean} smooth 'true' if the sprite uses line smoothing. + */ + smooth: false, + + /** + * @cfg {Boolean} fillArea 'true' if the sprite paints the area underneath the line. + */ + fillArea: false, + + /** + * @cfg {Boolean} step 'true' if the line uses steps instead of straight lines to connect the dots. + * It is ignored if `smooth` is true. + */ + step: false, + + /** + * @cfg {Boolean} preciseStroke 'true' if the line uses precise stroke. + */ + preciseStroke: true + }, + + dirtyTriggers: { + dataX: 'dataX,bbox,smooth', + dataY: 'dataY,bbox,smooth', + smooth: 'smooth' + }, + + updaters: { + smooth: function (attr) { + if (attr.smooth && attr.dataX && attr.dataY && attr.dataX.length > 2 && attr.dataY.length > 2) { + this.smoothX = Ext.draw.Draw.spline(attr.dataX); + this.smoothY = Ext.draw.Draw.spline(attr.dataY); + } else { + delete this.smoothX; + delete this.smoothY; + } + } + } + } + }, + + list: null, + + updatePlainBBox: function (plain) { + var attr = this.attr, + ymin = Math.min(0, attr.dataMinY), + ymax = Math.max(0, attr.dataMaxY); + plain.x = attr.dataMinX; + plain.y = ymin; + plain.width = attr.dataMaxX - attr.dataMinX; + plain.height = ymax - ymin; + }, + + drawStroke: function (surface, ctx, start, end, list, xAxis) { + var attr = this.attr, + matrix = attr.matrix, + xx = matrix.getXX(), + yy = matrix.getYY(), + dx = matrix.getDX(), + dy = matrix.getDY(), + smooth = attr.smooth, + step = attr.step, + scale = Math.pow(2, power(attr.dataX.length, end)), + smoothX = this.smoothX, + smoothY = this.smoothY, + i, j, lineConfig, changes, + cx1, cy1, cx2, cy2, x, y, x0, y0, saveOpacity; + + function power(count, end) { + var power = 0, + n = count; + while (n > 0 && n < end) { + power++; + n += count >> power; + } + return power > 0 ? power - 1 : power; + } + + ctx.beginPath(); + if (smooth && smoothX && smoothY) { + ctx.moveTo(smoothX[start * 3] * xx + dx, smoothY[start * 3] * yy + dy); + for (i = 0, j = start * 3 + 1; i < list.length - 3; i += 3, j += 3 * scale) { + cx1 = smoothX[j] * xx + dx; + cy1 = smoothY[j] * yy + dy; + cx2 = smoothX[j + 1] * xx + dx; + cy2 = smoothY[j + 1] * yy + dy; + x = list[i + 3]; + y = list[i + 4]; + x0 = list[i]; + y0 = list[i + 1]; + if (attr.renderer) { + lineConfig = { + type: 'line', + smooth: true, + step: step, + cx1: cx1, + cy1: cy1, + cx2: cx2, + cy2: cy2, + x: x, + y: y, + x0: x0, + y0: y0 + }; + changes = attr.renderer.call(this, this, lineConfig, {store:this.getStore()}, (i/3 + 1)); + ctx.save(); + Ext.apply(ctx, changes); + // Fill the area if we need to, using the fill color and transparent strokes. + if (attr.fillArea) { + saveOpacity = ctx.strokeOpacity; + ctx.save(); + ctx.strokeOpacity = 0; + ctx.moveTo(x0, y0); + ctx.bezierCurveTo(cx1, cy1, cx2, cy2, x, y); + ctx.lineTo(x, xAxis); + ctx.lineTo(x0, xAxis); + ctx.lineTo(x0, y0); + ctx.closePath(); + ctx.fillStroke(attr, true); + ctx.restore(); + ctx.strokeOpacity = saveOpacity; + ctx.beginPath(); + } + // Draw the line on top of the filled area. + ctx.moveTo(x0, y0); + ctx.bezierCurveTo(cx1, cy1, cx2, cy2, x, y); + ctx.moveTo(x0, y0); + ctx.closePath(); + ctx.stroke(); + ctx.restore(); + ctx.beginPath(); + ctx.moveTo(x, y); + } else { + ctx.bezierCurveTo(cx1, cy1, cx2, cy2, x, y); + } + } + } else { + ctx.moveTo(list[0], list[1]); + for (i = 3; i < list.length; i += 3) { + x = list[i]; + y = list[i + 1]; + x0 = list[i - 3]; + y0 = list[i - 2]; + if (attr.renderer) { + lineConfig = { + type: 'line', + smooth: false, + step: step, + x: x, + y: y, + x0: x0, + y0: y0 + }; + changes = attr.renderer.call(this, this, lineConfig, {store:this.getStore()}, i/3); + ctx.save(); + Ext.apply(ctx, changes); + // Fill the area if we need to, using the fill color and transparent strokes. + if (attr.fillArea) { + saveOpacity = ctx.strokeOpacity; + ctx.save(); + ctx.strokeOpacity = 0; + if (step) { + ctx.lineTo(x, y0); + } else { + ctx.lineTo(x, y); + } + ctx.lineTo(x, xAxis); + ctx.lineTo(x0, xAxis); + ctx.lineTo(x0, y0); + ctx.closePath(); + ctx.fillStroke(attr, true); + ctx.restore(); + ctx.strokeOpacity = saveOpacity; + ctx.beginPath(); + } + // Draw the line (or the 2 lines if 'step') on top of the filled area. + ctx.moveTo(x0, y0); + if (step) { + ctx.lineTo(x, y0); + ctx.closePath(); + ctx.stroke(); + ctx.beginPath(); + ctx.moveTo(x, y0); + } + ctx.lineTo(x, y); + ctx.closePath(); + ctx.stroke(); + ctx.restore(); + ctx.beginPath(); + ctx.moveTo(x, y); + } else { + if (step) { + ctx.lineTo(x, y0); + } + ctx.lineTo(x, y); + } + } + } + }, + + drawLabel: function (text, dataX, dataY, labelId, region) { + var me = this, + attr = me.attr, + label = me.getBoundMarker('labels')[0], + labelTpl = label.getTemplate(), + labelCfg = me.labelCfg || (me.labelCfg = {}), + surfaceMatrix = me.surfaceMatrix, + labelX, labelY, + labelOverflowPadding = attr.labelOverflowPadding, + halfWidth, halfHeight, + labelBox, + changes; + + labelCfg.text = text; + + labelBox = this.getMarkerBBox('labels', labelId, true); + if (!labelBox) { + me.putMarker('labels', labelCfg, labelId); + labelBox = this.getMarkerBBox('labels', labelId, true); + } + + if (attr.flipXY) { + labelCfg.rotationRads = Math.PI * 0.5; + } else { + labelCfg.rotationRads = 0; + } + + halfWidth = labelBox.width / 2; + halfHeight = labelBox.height / 2; + + labelX = dataX; + if (labelTpl.attr.display === 'over') { + labelY = dataY + halfHeight + labelOverflowPadding; + } else { + labelY = dataY - halfHeight - labelOverflowPadding; + } + + if (labelX <= region[0] + halfWidth) { + labelX = region[0] + halfWidth; + } else if (labelX >= region[2] - halfWidth) { + labelX = region[2] - halfWidth; + } + + if (labelY <= region[1] + halfHeight) { + labelY = region[1] + halfHeight; + } else if (labelY >= region[3] - halfHeight) { + labelY = region[3] - halfHeight; + } + + labelCfg.x = surfaceMatrix.x(labelX, labelY); + labelCfg.y = surfaceMatrix.y(labelX, labelY); + + if (labelTpl.attr.renderer) { + changes = labelTpl.attr.renderer.call(this, text, label, labelCfg, {store: this.getStore()}, labelId); + if (typeof changes === 'string') { + labelCfg.text = changes; + } else { + Ext.apply(labelCfg, changes); + } + } + + me.putMarker('labels', labelCfg, labelId); + }, + + renderAggregates: function (aggregates, start, end, surface, ctx, clip, region) { + var me = this, + attr = me.attr, + dataX = attr.dataX, + dataY = attr.dataY, + labels = attr.labels, + drawLabels = labels && !!me.getBoundMarker('labels'), + matrix = attr.matrix, + surfaceMatrix = surface.matrix, + pixel = surface.devicePixelRatio, + xx = matrix.getXX(), + yy = matrix.getYY(), + dx = matrix.getDX(), + dy = matrix.getDY(), + markerCfg = {}, + list = this.list || (this.list = []), + x, y, i, index, + minXs = aggregates.minX, + maxXs = aggregates.maxX, + minYs = aggregates.minY, + maxYs = aggregates.maxY, + idx = aggregates.startIdx; + + list.length = 0; + for (i = start; i < end; i++) { + var minX = minXs[i], + maxX = maxXs[i], + minY = minYs[i], + maxY = maxYs[i]; + + if (minX < maxX) { + list.push(minX * xx + dx, minY * yy + dy, idx[i]); + list.push(maxX * xx + dx, maxY * yy + dy, idx[i]); + } else if (minX > maxX) { + list.push(maxX * xx + dx, maxY * yy + dy, idx[i]); + list.push(minX * xx + dx, minY * yy + dy, idx[i]); + } else { + list.push(maxX * xx + dx, maxY * yy + dy, idx[i]); + } + } + + if (list.length) { + for (i = 0; i < list.length; i += 3) { + x = list[i]; + y = list[i + 1]; + index = list[i + 2]; + if (attr.renderer) { + markerCfg = { + type: 'marker', + x: x, + y: y + }; + markerCfg = attr.renderer.call(this, this, markerCfg, {store:this.getStore()}, i/3) || {}; + } + markerCfg.translationX = surfaceMatrix.x(x, y); + markerCfg.translationY = surfaceMatrix.y(x, y); + me.putMarker('markers', markerCfg, index, !attr.renderer); + + if (drawLabels && labels[index]) { + me.drawLabel(labels[index], x, y, index, region); + } + } + me.drawStroke(surface, ctx, start, end, list, region[1] - pixel); + if (!attr.renderer) { + var lastPointX = dataX[dataX.length - 1] * xx + dx + pixel, + lastPointY = dataY[dataY.length - 1] * yy + dy, + bottomY = region[1] - pixel, + firstPointX = dataX[0] * xx + dx - pixel, + firstPointY = dataY[0] * yy + dy; + ctx.lineTo(lastPointX, lastPointY); + ctx.lineTo(lastPointX, bottomY); + ctx.lineTo(firstPointX, bottomY); + ctx.lineTo(firstPointX, firstPointY); + } + ctx.closePath(); + + if (attr.transformFillStroke) { + attr.matrix.toContext(ctx); + } + if (attr.preciseStroke) { + if (attr.fillArea) { + ctx.fill(); + } + if (attr.transformFillStroke) { + attr.inverseMatrix.toContext(ctx); + } + me.drawStroke(surface, ctx, start, end, list, region[1] - pixel); + if (attr.transformFillStroke) { + attr.matrix.toContext(ctx); + } + ctx.stroke(); + } else { + // Prevent the reverse transform to fix floating point err. + if (attr.fillArea) { + ctx.fillStroke(attr, true); + } else { + ctx.stroke(true); + } + } + } + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/series/sprite/Pie3DPart.js b/vendor/touch/src/chart/series/sprite/Pie3DPart.js new file mode 100644 index 000000000..3e0bb22a4 --- /dev/null +++ b/vendor/touch/src/chart/series/sprite/Pie3DPart.js @@ -0,0 +1,377 @@ +/** + * @class Ext.chart.series.sprite.Pie3DPart + * @extends Ext.draw.sprite.Path + * + * Pie3D series sprite. + */ +Ext.define("Ext.chart.series.sprite.Pie3DPart", { + extend: 'Ext.draw.sprite.Path', + mixins: { + markerHolder: "Ext.chart.MarkerHolder" + }, + alias: 'sprite.pie3dPart', + type: 'pie3dPart', + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Number} [centerX=0] The central point of the series on the x-axis. + */ + centerX: "number", + + /** + * @cfg {Number} [centerY=0] The central point of the series on the x-axis. + */ + centerY: "number", + + /** + * @cfg {Number} [startAngle=0] The starting angle of the polar series. + */ + startAngle: "number", + + /** + * @cfg {Number} [endAngle=Math.PI] The ending angle of the polar series. + */ + endAngle: "number", + + /** + * @cfg {Number} [startRho=0] The starting radius of the polar series. + */ + startRho: "number", + + /** + * @cfg {Number} [endRho=150] The ending radius of the polar series. + */ + endRho: "number", + + /** + * @cfg {Number} [margin=0] Margin from the center of the pie. Used for donut. + */ + margin: "number", + + /** + * @cfg {Number} [thickness=0] The thickness of the 3D pie part. + */ + thickness: "number", + + /** + * @cfg {Number} [distortion=0] The distortion of the 3D pie part. + */ + distortion: "number", + + /** + * @cfg {Object} [baseColor='white'] The color of the 3D pie part before adding the 3D effect. + */ + baseColor: "color", + + /** + * @cfg {Number} [baseRotation=0] The starting rotation of the polar series. + */ + baseRotation: "number", + + /** + * @cfg {String} [part=0] The part of the 3D Pie represented by the sprite. + */ + part: "enums(top,start,end,inner,outer)" + }, + aliases: { + rho: 'endRho' + }, + dirtyTriggers: { + centerX: "path,bbox", + centerY: "path,bbox", + startAngle: "path,partZIndex", + endAngle: "path,partZIndex", + startRho: "path", + endRho: "path,bbox", + margin: "path,bbox", + thickness: "path", + baseRotation: "path,partZIndex,partColor", + baseColor: 'partZIndex,partColor', + part: "path,partZIndex" + }, + defaults: { + centerX: 0, + centerY: 0, + startAngle: 0, + endAngle: 0, + startRho: 0, + endRho: 150, + margin: 0, + distortion: 1, + baseRotation: 0, + baseColor: 'white', + part: "top" + }, + updaters: { + "partColor": function (attrs) { + var color = Ext.draw.Color.fly(attrs.baseColor), + fillStyle; + switch (attrs.part) { + case 'top': + fillStyle = color.toString(); + break; + case 'outer': + fillStyle = Ext.create("Ext.draw.gradient.Linear", { + type: 'linear', + stops: [ + { + offset: 0, + color: color.createDarker(0.3).toString() + }, + { + offset: 0.3, + color: color.toString() + }, + { + offset: 0.8, + color: color.createLighter(0.2).toString() + }, + { + offset: 1, + color: color.createDarker(0.4).toString() + } + ] + }); + break; + case 'start': + fillStyle = color.createDarker(0.3).toString(); + break; + case 'end': + fillStyle = color.createDarker(0.3).toString(); + break; + case 'inner': + fillStyle = Ext.create("Ext.draw.gradient.Linear", { + type: 'linear', + stops: [ + { + offset: 0, + color: color.createDarker(0.4).toString() + }, + { + offset: 0.2, + color: color.createLighter(0.2).toString() + }, + { + offset: 0.7, + color: color.toString() + }, + { + offset: 1, + color: color.createDarker(0.3).toString() + } + ] + }); + break; + } + + attrs.fillStyle = fillStyle; + attrs.canvasAttributes.fillStyle = fillStyle; + }, + "partZIndex": function (attrs) { + var rotation = attrs.baseRotation; + switch (attrs.part) { + case 'top': + attrs.zIndex = 5; + break; + case 'outer': + attrs.zIndex = 4; + break; + case 'start': + attrs.zIndex = 1 + Math.sin(attrs.startAngle + rotation); + break; + case 'end': + attrs.zIndex = 1 + Math.sin(attrs.endAngle + rotation); + break; + case 'inner': + attrs.zIndex = 1; + break; + } + attrs.dirtyZIndex = true; + } + } + } + }, + + updatePlainBBox: function (plain) { + var attr = this.attr, + rho = attr.part === 'inner' ? attr.startRho : attr.endRho; + plain.width = rho * 2; + plain.height = rho * attr.distortion * 2 + attr.thickness; + plain.x = attr.centerX - rho; + plain.y = attr.centerY - rho * attr.distortion; + }, + + updateTransformedBBox: function (transform) { + return this.updatePlainBBox(transform); + }, + + updatePath: function (path) { + if (this.attr.endAngle < this.attr.startAngle) { + return; + } + this[this.attr.part + 'Renderer'](path); + }, + + topRenderer: function (path) { + var attr = this.attr, + margin = attr.margin, + distortion = attr.distortion, + centerX = attr.centerX, + centerY = attr.centerY, + baseRotation = attr.baseRotation, + startAngle = attr.startAngle + baseRotation , + endAngle = attr.endAngle + baseRotation , + startRho = attr.startRho, + endRho = attr.endRho, + midAngle, + sinEnd = Math.sin(endAngle), + cosEnd = Math.cos(endAngle); + midAngle = (startAngle + endAngle) * 0.5; + centerX += Math.cos(midAngle) * margin; + centerY += Math.sin(midAngle) * margin * distortion; + path.ellipse(centerX, centerY, startRho, startRho * distortion, 0, startAngle, endAngle, false); + path.lineTo(centerX + cosEnd * endRho, centerY + sinEnd * endRho * distortion); + path.ellipse(centerX, centerY, endRho, endRho * distortion, 0, endAngle, startAngle, true); + path.closePath(); + }, + + startRenderer: function (path) { + var attr = this.attr, + margin = attr.margin, + centerX = attr.centerX, + centerY = attr.centerY, + distortion = attr.distortion, + baseRotation = attr.baseRotation, + startAngle = attr.startAngle + baseRotation , + endAngle = attr.endAngle + baseRotation, + thickness = attr.thickness, + startRho = attr.startRho, + endRho = attr.endRho, + sinStart = Math.sin(startAngle), + cosStart = Math.cos(startAngle), + midAngle; + if (cosStart < 0) { + midAngle = (startAngle + endAngle) * 0.5; + centerX += Math.cos(midAngle) * margin; + centerY += Math.sin(midAngle) * margin * distortion; + path.moveTo(centerX + cosStart * startRho, centerY + sinStart * startRho * distortion); + path.lineTo(centerX + cosStart * endRho, centerY + sinStart * endRho * distortion); + path.lineTo(centerX + cosStart * endRho, centerY + sinStart * endRho * distortion + thickness); + path.lineTo(centerX + cosStart * startRho, centerY + sinStart * startRho * distortion + thickness); + path.closePath(); + } + }, + + endRenderer: function (path) { + var attr = this.attr, + margin = attr.margin, + centerX = attr.centerX, + centerY = attr.centerY, + distortion = attr.distortion, + baseRotation = attr.baseRotation, + startAngle = attr.startAngle + baseRotation , + endAngle = attr.endAngle + baseRotation, + thickness = attr.thickness, + startRho = attr.startRho, + endRho = attr.endRho, + sin = Math.sin(endAngle), + cos = Math.cos(endAngle), midAngle; + if (cos > 0) { + midAngle = (startAngle + endAngle) * 0.5; + centerX += Math.cos(midAngle) * margin; + centerY += Math.sin(midAngle) * margin * distortion; + path.moveTo(centerX + cos * startRho, centerY + sin * startRho * distortion); + path.lineTo(centerX + cos * endRho, centerY + sin * endRho * distortion); + path.lineTo(centerX + cos * endRho, centerY + sin * endRho * distortion + thickness); + path.lineTo(centerX + cos * startRho, centerY + sin * startRho * distortion + thickness); + path.closePath(); + } + }, + + innerRenderer: function (path) { + var attr = this.attr, + margin = attr.margin, + centerX = attr.centerX, + centerY = attr.centerY, + distortion = attr.distortion, + baseRotation = attr.baseRotation, + startAngle = attr.startAngle + baseRotation , + endAngle = attr.endAngle + baseRotation, + thickness = attr.thickness, + startRho = attr.startRho, + sinEnd, cosEnd, + tempStart, tempEnd, midAngle; + midAngle = (startAngle + endAngle) * 0.5; + centerX += Math.cos(midAngle) * margin; + centerY += Math.sin(midAngle) * margin * distortion; + if (startAngle >= Math.PI * 2) { + startAngle -= Math.PI * 2; + endAngle -= Math.PI * 2; + } + if (endAngle > Math.PI && endAngle < Math.PI * 3) { + tempStart = startAngle; + tempEnd = Math.min(endAngle, Math.PI * 2); + sinEnd = Math.sin(tempEnd); + cosEnd = Math.cos(tempEnd); + path.ellipse(centerX, centerY, startRho, startRho * distortion, 0, tempStart, tempEnd, false); + path.lineTo(centerX + cosEnd * startRho, centerY + sinEnd * startRho * distortion + thickness); + path.ellipse(centerX, centerY + thickness, startRho, startRho * distortion, 0, tempEnd, tempStart, true); + path.closePath(); + } + if (endAngle > Math.PI * 3) { + tempStart = Math.PI; + tempEnd = endAngle; + sinEnd = Math.sin(tempEnd); + cosEnd = Math.cos(tempEnd); + path.ellipse(centerX, centerY, startRho, startRho * distortion, 0, tempStart, tempEnd, false); + path.lineTo(centerX + cosEnd * startRho, centerY + sinEnd * startRho * distortion + thickness); + path.ellipse(centerX, centerY + thickness, startRho, startRho * distortion, 0, tempEnd, tempStart, true); + path.closePath(); + } + }, + + outerRenderer: function (path) { + var attr = this.attr, + margin = attr.margin, + centerX = attr.centerX, + centerY = attr.centerY, + distortion = attr.distortion, + baseRotation = attr.baseRotation, + startAngle = attr.startAngle + baseRotation , + endAngle = attr.endAngle + baseRotation, + thickness = attr.thickness, + endRho = attr.endRho, + sinEnd, cosEnd, + tempStart, tempEnd, midAngle; + midAngle = (startAngle + endAngle) * 0.5; + centerX += Math.cos(midAngle) * margin; + centerY += Math.sin(midAngle) * margin * distortion; + + if (startAngle >= Math.PI * 2) { + startAngle -= Math.PI * 2; + endAngle -= Math.PI * 2; + } + + if (startAngle < Math.PI) { + tempStart = startAngle; + tempEnd = Math.min(endAngle, Math.PI); + sinEnd = Math.sin(tempEnd); + cosEnd = Math.cos(tempEnd); + path.ellipse(centerX, centerY, endRho, endRho * distortion, 0, tempStart, tempEnd, false); + path.lineTo(centerX + cosEnd * endRho, centerY + sinEnd * endRho * distortion + thickness); + path.ellipse(centerX, centerY + thickness, endRho, endRho * distortion, 0, tempEnd, tempStart, true); + path.closePath(); + } + if (endAngle > Math.PI * 2) { + tempStart = Math.max(startAngle, Math.PI * 2); + tempEnd = endAngle; + sinEnd = Math.sin(tempEnd); + cosEnd = Math.cos(tempEnd); + path.ellipse(centerX, centerY, endRho, endRho * distortion, 0, tempStart, tempEnd, false); + path.lineTo(centerX + cosEnd * endRho, centerY + sinEnd * endRho * distortion + thickness); + path.ellipse(centerX, centerY + thickness, endRho, endRho * distortion, 0, tempEnd, tempStart, true); + path.closePath(); + } + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/series/sprite/PieSlice.js b/vendor/touch/src/chart/series/sprite/PieSlice.js new file mode 100644 index 000000000..d6be4e818 --- /dev/null +++ b/vendor/touch/src/chart/series/sprite/PieSlice.js @@ -0,0 +1,180 @@ +/** + * @class Ext.chart.series.sprite.PieSlice + * + * Pie slice sprite. + */ +Ext.define('Ext.chart.series.sprite.PieSlice', { + alias: 'sprite.pieslice', + mixins: { + markerHolder: 'Ext.chart.MarkerHolder' + }, + extend: 'Ext.draw.sprite.Sector', + + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Boolean} [doCallout=true] 'true' if the pie series uses label callouts. + */ + doCallout: 'bool', + + /** + * @cfg {Boolean} [rotateLabels=true] 'true' if the labels are rotated for easier reading. + */ + rotateLabels: 'bool', + + /** + * @cfg {String} [label=''] Label associated with the Pie sprite. + */ + label: 'string', + + /** + * @cfg {Number} [labelOverflowPadding=10] Padding around labels to determine overlap. + * Any negative number allows the labels to overlap. + */ + labelOverflowPadding: 'number', + + renderer: 'default' + }, + defaults: { + doCallout: true, + rotateLabels: true, + label: '', + labelOverflowPadding: 10, + renderer: null + } + } + }, + + config: { + /** + * @private + * @cfg {Object} rendererData The object that is passed to the renderer. + * + * For instance when the PieSlice sprite is used in a Gauge chart, the object + * contains the 'store' and 'field' properties, and the 'value' as well + * for that one PieSlice that is used to draw the needle of the Gauge. + */ + rendererData: null, + rendererIndex: 0 + }, + + render: function (ctx, surface, clipRegion) { + var me = this, + attr = me.attr, + itemCfg = {}, + changes; + + if (attr.renderer) { + itemCfg = { + type: 'sector', + text: attr.text, + centerX: attr.centerX, + centerY: attr.centerY, + margin: attr.margin, + startAngle: Math.min(attr.startAngle, attr.endAngle), + endAngle: Math.max(attr.startAngle, attr.endAngle), + startRho: Math.min(attr.startRho, attr.endRho), + endRho: Math.max(attr.startRho, attr.endRho) + }; + changes = attr.renderer.call(me, me, itemCfg, me.rendererData, me.rendererIndex); + Ext.apply(me.attr, changes); + } + + // Draw the sector + me.callSuper(arguments); + + // Draw the labels + if (attr.label && me.getBoundMarker('labels')) { + me.placeLabel(); + } + }, + + placeLabel: function () { + var me = this, + attr = me.attr, + startAngle = Math.min(attr.startAngle, attr.endAngle), + endAngle = Math.max(attr.startAngle, attr.endAngle), + midAngle = (startAngle + endAngle) * 0.5, + margin = attr.margin, + centerX = attr.centerX, + centerY = attr.centerY, + startRho = Math.min(attr.startRho, attr.endRho) + margin, + endRho = Math.max(attr.startRho, attr.endRho) + margin, + midRho = (startRho + endRho) * 0.5, + surfaceMatrix = me.surfaceMatrix, + labelCfg = me.labelCfg || (me.labelCfg = {}), + labelTpl = me.getBoundMarker('labels')[0].getTemplate(), + labelBox, x, y, changes; + + surfaceMatrix.appendMatrix(attr.matrix); + + labelCfg.text = attr.label; + + x = centerX + Math.cos(midAngle) * midRho; + y = centerY + Math.sin(midAngle) * midRho; + labelCfg.x = surfaceMatrix.x(x, y); + labelCfg.y = surfaceMatrix.y(x, y); + + x = centerX + Math.cos(midAngle) * endRho; + y = centerY + Math.sin(midAngle) * endRho; + labelCfg.calloutStartX = surfaceMatrix.x(x, y); + labelCfg.calloutStartY = surfaceMatrix.y(x, y); + + x = centerX + Math.cos(midAngle) * (endRho + 40); + y = centerY + Math.sin(midAngle) * (endRho + 40); + labelCfg.calloutPlaceX = surfaceMatrix.x(x, y); + labelCfg.calloutPlaceY = surfaceMatrix.y(x, y); + + labelCfg.rotationRads = (attr.rotateLabels ? midAngle + Math.atan2(surfaceMatrix.y(1, 0) - surfaceMatrix.y(0, 0), surfaceMatrix.x(1, 0) - surfaceMatrix.x(0, 0)) : 0); + labelCfg.calloutColor = me.attr.fillStyle; + labelCfg.globalAlpha = attr.globalAlpha * attr.fillOpacity; + + // If a slice is empty, don't display the label. + // This behavior can be overridden by a renderer. + labelCfg.hidden = (attr.startAngle == attr.endAngle); + + if (attr.renderer) { + labelCfg.type = 'label'; + changes = attr.renderer.call(me, me, labelCfg, me.rendererData, me.rendererIndex); + Ext.apply(labelCfg, changes); + } + me.putMarker('labels', labelCfg, me.attr.attributeId); + + labelBox = me.getMarkerBBox('labels', me.attr.attributeId, true); + if (labelBox) { + if (attr.doCallout) { + if (labelTpl.attr.display === 'outside') { + me.putMarker('labels', {callout: 1}, me.attr.attributeId); + } else { + me.putMarker('labels', {callout: 1 - +me.sliceContainsLabel(attr, labelBox)}, me.attr.attributeId); + } + } else { + me.putMarker('labels', {globalAlpha: +me.sliceContainsLabel(attr, labelBox)}, me.attr.attributeId); + } + } + }, + + sliceContainsLabel: function (attr, bbox) { + var padding = attr.labelOverflowPadding, + middle = (attr.endRho + attr.startRho) / 2, + outer = middle + (bbox.width + padding) / 2, + inner = middle - (bbox.width + padding) / 2, + sliceAngle, l1, l2, l3; + + if (padding < 0) { + return 1; + } + if (bbox.width + padding * 2 > (attr.endRho - attr.startRho)) { + return 0; + } + l1 = Math.sqrt(attr.endRho * attr.endRho - outer * outer); + l2 = Math.sqrt(attr.endRho * attr.endRho - inner * inner); + sliceAngle = Math.abs(attr.endAngle - attr.startAngle); + l3 = (sliceAngle > Math.PI/2 ? inner : Math.abs(Math.tan(sliceAngle / 2)) * inner); + if (bbox.height + padding * 2 > Math.min(l1, l2, l3) * 2) { + return 0; + } + return 1; + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/series/sprite/Polar.js b/vendor/touch/src/chart/series/sprite/Polar.js new file mode 100644 index 000000000..e1a500d4c --- /dev/null +++ b/vendor/touch/src/chart/series/sprite/Polar.js @@ -0,0 +1,150 @@ +/** + * @class Ext.chart.series.sprite.Polar + * @extends Ext.draw.sprite.Sprite + * + * Polar sprite. + */ +Ext.define('Ext.chart.series.sprite.Polar', { + mixins: { + markerHolder: 'Ext.chart.MarkerHolder' + }, + extend: 'Ext.draw.sprite.Sprite', + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Number} [dataMinX=0] Data minimum on the x-axis. + */ + dataMinX: 'number', + + /** + * @cfg {Number} [dataMaxX=1] Data maximum on the x-axis. + */ + dataMaxX: 'number', + + /** + * @cfg {Number} [dataMinY=0] Data minimum on the y-axis. + */ + dataMinY: 'number', + + /** + * @cfg {Number} [dataMaxY=2] Data maximum on the y-axis. + */ + dataMaxY: 'number', + + /** + * @cfg {Array} Data range derived from all the series bound to the x-axis. + */ + rangeX: 'data', + /** + * @cfg {Array} Data range derived from all the series bound to the y-axis. + */ + rangeY: 'data', + + /** + * @cfg {Object} [dataY=null] Data items on the y-axis. + */ + dataY: 'data', + + /** + * @cfg {Object} [dataX=null] Data items on the x-axis. + */ + dataX: 'data', + + /** + * @cfg {Number} [centerX=0] The central point of the series on the x-axis. + */ + centerX: 'number', + + /** + * @cfg {Number} [centerY=0] The central point of the series on the y-axis. + */ + centerY: 'number', + + /** + * @cfg {Number} [startAngle=0] The starting angle of the polar series. + */ + startAngle: "number", + + /** + * @cfg {Number} [endAngle=Math.PI] The ending angle of the polar series. + */ + endAngle: "number", + + /** + * @cfg {Number} [startRho=0] The starting radius of the polar series. + */ + startRho: "number", + + /** + * @cfg {Number} [endRho=150] The ending radius of the polar series. + */ + endRho: "number", + + /** + * @cfg {Number} [baseRotation=0] The starting rotation of the polar series. + */ + baseRotation: "number", + + /** + * @cfg {Object} [labels=null] Labels used in the series. + */ + labels: 'default', + + /** + * @cfg {Number} [labelOverflowPadding=10] Padding around labels to determine overlap. + */ + labelOverflowPadding: 'number' + }, + defaults: { + dataY: null, + dataX: null, + dataMinX: 0, + dataMaxX: 1, + dataMinY: 0, + dataMaxY: 1, + centerX: 0, + centerY: 0, + startAngle: 0, + endAngle: Math.PI, + startRho: 0, + endRho: 150, + baseRotation: 0, + labels: null, + labelOverflowPadding: 10 + }, + dirtyTriggers: { + dataX: 'bbox', + dataY: 'bbox', + dataMinX: 'bbox', + dataMaxX: 'bbox', + dataMinY: 'bbox', + dataMaxY: 'bbox', + centerX: "bbox", + centerY: "bbox", + startAngle: "bbox", + endAngle: "bbox", + startRho: "bbox", + endRho: "bbox", + baseRotation: "bbox" + } + } + }, + + config: { + /** + * @private + * @cfg {Object} store The store that is passed to the renderer. + */ + store: null, + field: null + }, + + updatePlainBBox: function (plain) { + var attr = this.attr; + plain.x = attr.centerX - attr.endRho; + plain.y = attr.centerY + attr.endRho; + plain.width = attr.endRho * 2; + plain.height = attr.endRho * 2; + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/series/sprite/Radar.js b/vendor/touch/src/chart/series/sprite/Radar.js new file mode 100644 index 000000000..5a946010f --- /dev/null +++ b/vendor/touch/src/chart/series/sprite/Radar.js @@ -0,0 +1,44 @@ +/** + * @class Ext.chart.series.sprite.Radar + * @extends Ext.chart.series.sprite.Polar + * + * Radar series sprite. + */ +Ext.define('Ext.chart.series.sprite.Radar', { + alias: 'sprite.radar', + extend: 'Ext.chart.series.sprite.Polar', + + render: function (surface, ctx) { + var me = this, + attr = me.attr, + centerX = attr.centerX, + centerY = attr.centerY, + matrix = attr.matrix, + minX = attr.dataMinX, + maxX = attr.dataMaxX, + maxY = attr.dataMaxY, + dataX = attr.dataX, + dataY = attr.dataY, + rangeY = attr.rangeY, + endRho = attr.endRho, + startRho = attr.startRho, + baseRotation = attr.baseRotation, + i, length = dataX.length, + markerCfg = {}, + surfaceMatrix = me.surfaceMatrix, + x, y, r, th; + ctx.beginPath(); + for (i = 0; i < length; i++) { + th = (dataX[i] - minX) / (maxX - minX + 1) * 2 * Math.PI + baseRotation; + r = dataY[i] / (rangeY ? rangeY[1] : maxY) * (endRho - startRho) + startRho; + x = matrix.x(centerX + Math.cos(th) * r, centerY + Math.sin(th) * r); + y = matrix.y(centerX + Math.cos(th) * r, centerY + Math.sin(th) * r); + ctx.lineTo(x, y); + markerCfg.translationX = surfaceMatrix.x(x, y); + markerCfg.translationY = surfaceMatrix.y(x, y); + me.putMarker('markers', markerCfg, i, true); + } + ctx.closePath(); + ctx.fillStroke(attr); + } +}); \ No newline at end of file diff --git a/vendor/touch/src/chart/series/sprite/Scatter.js b/vendor/touch/src/chart/series/sprite/Scatter.js new file mode 100644 index 000000000..e9293b4fc --- /dev/null +++ b/vendor/touch/src/chart/series/sprite/Scatter.js @@ -0,0 +1,43 @@ +/** + * @class Ext.chart.series.sprite.Scatter + * @extends Ext.chart.series.sprite.Cartesian + * + * Scatter series sprite. + */ +Ext.define("Ext.chart.series.sprite.Scatter", { + alias: 'sprite.scatterSeries', + extend: 'Ext.chart.series.sprite.Cartesian', + renderClipped: function (surface, ctx, clip, clipRegion) { + if (this.cleanRedraw) { + return; + } + var attr = this.attr, + dataX = attr.dataX, + dataY = attr.dataY, + matrix = this.attr.matrix, + xx = matrix.getXX(), + yy = matrix.getYY(), + dx = matrix.getDX(), + dy = matrix.getDY(), + markerCfg = {}, + left = clipRegion[0] - xx, + right = clipRegion[0] + clipRegion[2] + xx, + top = clipRegion[1] - yy, + bottom = clipRegion[1] + clipRegion[3] + yy, + x, y; + for (var i = 0; i < dataX.length; i++) { + x = dataX[i]; + y = dataY[i]; + x = x * xx + dx; + y = y * yy + dy; + if (left <= x && x <= right && top <= y && y <= bottom) { + if (attr.renderer) { + attr.renderer.call(this, this, markerCfg, {store:this.getStore()}, i); + } + markerCfg.translationX = x; + markerCfg.translationY = y; + this.putMarker("items", markerCfg, i, !attr.renderer); + } + } + } +}); diff --git a/vendor/touch/src/chart/series/sprite/StackedCartesian.js b/vendor/touch/src/chart/series/sprite/StackedCartesian.js new file mode 100644 index 000000000..cb0216e58 --- /dev/null +++ b/vendor/touch/src/chart/series/sprite/StackedCartesian.js @@ -0,0 +1,73 @@ +/** + * @class Ext.chart.series.sprite.StackedCartesian + * @extends Ext.chart.series.sprite.Cartesian + * + * Stacked cartesian sprite. + */ +Ext.define("Ext.chart.series.sprite.StackedCartesian", { + extend: 'Ext.chart.series.sprite.Cartesian', + inheritableStatics: { + def: { + processors: { + /** + * @private + * @cfg {Number} [groupCount=1] The number of groups in the series. + */ + groupCount: 'number', + + /** + * @private + * @cfg {Number} [groupOffset=0] The group index of the series sprite. + */ + groupOffset: 'number', + + /** + * @private + * @cfg {Object} [dataStartY=null] The starting point of the data used in the series. + */ + dataStartY: 'data' + }, + defaults: { + selectionTolerance: 20, + groupCount: 1, + groupOffset: 0, + dataStartY: null + }, + dirtyTriggers: { + dataStartY: 'dataY,bbox' + } + } + }, + + //@inheritdoc + getIndexNearPoint: function (x, y) { + var sprite = this, + mat = sprite.attr.matrix, + dataX = sprite.attr.dataX, + dataY = sprite.attr.dataY, + dataStartY = sprite.attr.dataStartY, + selectionTolerance = sprite.attr.selectionTolerance, + minX = 0.5, minY = Infinity, index = -1, + imat = mat.clone().prependMatrix(this.surfaceMatrix).inverse(), + center = imat.transformPoint([x, y]), + positionLB = imat.transformPoint([x - selectionTolerance, y - selectionTolerance]), + positionTR = imat.transformPoint([x + selectionTolerance, y + selectionTolerance]), + dx, dy, + top = Math.min(positionLB[1], positionTR[1]), + bottom = Math.max(positionLB[1], positionTR[1]); + + for (var i = 0; i < dataX.length; i++) { + if (Math.min(dataStartY[i], dataY[i]) <= bottom && top <= Math.max(dataStartY[i], dataY[i])) { + dx = Math.abs(dataX[i] - center[0]); + dy = Math.max(-Math.min(dataY[i] - center[1], center[1] - dataStartY[i]), 0); + if (dx < minX && dy <= minY) { + minX = dx; + minY = dy; + index = i; + } + } + } + + return index; + } +}); \ No newline at end of file diff --git a/vendor/touch/src/core/Ext-more.js b/vendor/touch/src/core/Ext-more.js index efdc346a9..dc8ea81cb 100644 --- a/vendor/touch/src/core/Ext-more.js +++ b/vendor/touch/src/core/Ext-more.js @@ -293,6 +293,11 @@ Ext.apply(Ext, { elementSize: { xclass: 'Ext.event.publisher.ElementSize' } + // + ,seriesItemEvents: { + xclass: 'Ext.chart.series.ItemPublisher' + } + // }, // diff --git a/vendor/touch/src/draw/Animator.js b/vendor/touch/src/draw/Animator.js new file mode 100644 index 000000000..60e4b7323 --- /dev/null +++ b/vendor/touch/src/draw/Animator.js @@ -0,0 +1,201 @@ +/** + * @class Ext.draw.Animator + * + * Singleton class that manages the animation pool. + */ +Ext.define('Ext.draw.Animator', { + uses: ['Ext.draw.Draw'], + singleton: true, + + frameCallbacks: {}, + frameCallbackId: 0, + scheduled: 0, + frameStartTimeOffset:Date.now(), + animations: [], + running: false, + + /** + * Cross platform `animationTime` implementation. + * @return {Number} + */ + animationTime: function () { + return Ext.AnimationQueue.frameStartTime - this.frameStartTimeOffset; + }, + + /** + * Adds an animated object to the animation pool. + * + * @param {Object} animation The animation descriptor to add to the pool. + */ + add: function (animation) { + if (!this.contains(animation)) { + this.animations.push(animation); + Ext.draw.Animator.ignite(); + if ('fireEvent' in animation) { + animation.fireEvent('animationstart', animation); + } + } + }, + + /** + * Removes an animation from the pool. + * TODO: This is broken when called within `step` method. + * @param {Object} animation The animation to remove from the pool. + */ + remove: function (animation) { + var me = this, + animations = me.animations, + i = 0, + l = animations.length; + + for (; i < l; ++i) { + if (animations[i] === animation) { + animations.splice(i, 1); + if ('fireEvent' in animation) { + animation.fireEvent('animationend', animation); + } + return; + } + } + }, + + /** + * Returns `true` or `false` whether it contains the given animation or not. + * + * @param {Object} animation The animation to check for. + * @return {Boolean} + */ + contains: function (animation) { + return this.animations.indexOf(animation) > -1; + }, + + /** + * Returns `true` or `false` whether the pool is empty or not. + * @return {Boolean} + */ + empty: function () { + return this.animations.length === 0; + }, + + /** + * Given a frame time it will filter out finished animations from the pool. + * + * @param {Number} frameTime The frame's start time, in milliseconds. + */ + step: function (frameTime) { + var me = this, + animations = me.animations, + animation, + i = 0, + ln = animations.length; + + for (; i < ln; i++) { + animation = animations[i]; + animation.step(frameTime); + if (!animation.animating) { + animations.splice(i, 1); + i--; + ln--; + if (animation.fireEvent) { + animation.fireEvent('animationend'); + } + } + } + }, + + /** + * Register an one-time callback that will be called at the next frame. + * @param {Function} callback + * @param {Object} scope + * @return {String} + */ + schedule: function (callback, scope) { + scope = scope || this; + var id = 'frameCallback' + (this.frameCallbackId++); + + if (Ext.isString(callback)) { + callback = scope[callback]; + } + Ext.draw.Animator.frameCallbacks[id] = {fn: callback, scope: scope, once: true}; + this.scheduled++; + Ext.draw.Animator.ignite(); + return id; + }, + + /** + * Cancel a registered one-time callback + * @param {String} id + */ + cancel: function (id) { + if (Ext.draw.Animator.frameCallbacks[id] && Ext.draw.Animator.frameCallbacks[id].once) { + this.scheduled--; + delete Ext.draw.Animator.frameCallbacks[id]; + } + }, + + /** + * Register a recursive callback that will be called at every frame. + * + * @param {Function} callback + * @param {Object} scope + * @return {String} + */ + addFrameCallback: function (callback, scope) { + scope = scope || this; + if (Ext.isString(callback)) { + callback = scope[callback]; + } + var id = 'frameCallback' + (this.frameCallbackId++); + + Ext.draw.Animator.frameCallbacks[id] = {fn: callback, scope: scope}; + return id; + }, + + /** + * Unregister a recursive callback. + * @param {String} id + */ + removeFrameCallback: function (id) { + delete Ext.draw.Animator.frameCallbacks[id]; + }, + + /** + * @private + */ + fireFrameCallbacks: function () { + var callbacks = this.frameCallbacks, + id, fn, cb; + + for (id in callbacks) { + cb = callbacks[id]; + fn = cb.fn; + if (Ext.isString(fn)) { + fn = cb.scope[fn]; + } + + fn.call(cb.scope); + + if (callbacks[id] && cb.once) { + this.scheduled--; + delete callbacks[id]; + } + } + }, + + handleFrame: function() { + this.step(this.animationTime()); + this.fireFrameCallbacks(); + if (!this.scheduled && this.empty()) { + Ext.AnimationQueue.stop(this.handleFrame, this); + this.running = false; + } + }, + + ignite: function() { + if (!this.running) { + this.running = true; + Ext.AnimationQueue.start(this.handleFrame, this); + Ext.draw.Draw.updateIOS(); + } + } +}); diff --git a/vendor/touch/src/draw/Color.js b/vendor/touch/src/draw/Color.js new file mode 100644 index 000000000..ce0c53a1e --- /dev/null +++ b/vendor/touch/src/draw/Color.js @@ -0,0 +1,427 @@ +(function () { + /** + * Represents an RGB color and provides helper functions on it e.g. to get + * color components in HSL color space. + */ + Ext.define('Ext.draw.Color', { + statics: { + colorToHexRe: /(.*?)rgb\((\d+),\s*(\d+),\s*(\d+)\)/, + rgbToHexRe: /\s*rgb\((\d+),\s*(\d+),\s*(\d+)\)/, + rgbaToHexRe: /\s*rgba\((\d+),\s*(\d+),\s*(\d+),\s*([\.\d]+)\)/, + hexRe: /\s*#([0-9a-fA-F][0-9a-fA-F]?)([0-9a-fA-F][0-9a-fA-F]?)([0-9a-fA-F][0-9a-fA-F]?)\s*/ + }, + + isColor: true, + /** + * @cfg {Number} lightnessFactor + * + * The default factor to compute the lighter or darker color. + */ + lightnessFactor: 0.2, + + /** + * @constructor + * @param {Number} red Red component (0..255) + * @param {Number} green Green component (0..255) + * @param {Number} blue Blue component (0..255) + * @param {Number} [alpha=1] (optional) Alpha component (0..1) + */ + constructor: function (red, green, blue, alpha) { + this.setRGB(red, green, blue, alpha); + }, + + setRGB: function (red, green, blue, alpha) { + var me = this; + me.r = Math.min(255, Math.max(0, red)); + me.g = Math.min(255, Math.max(0, green)); + me.b = Math.min(255, Math.max(0, blue)); + if (alpha === undefined) { + me.a = 1; + } else { + me.a = Math.min(1, Math.max(0, alpha)); + } + }, + + /** + * Returns the gray value (0 to 255) of the color. + * + * The gray value is calculated using the formula r*0.3 + g*0.59 + b*0.11. + * + * @return {Number} + */ + getGrayscale: function () { + // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale + return this.r * 0.3 + this.g * 0.59 + this.b * 0.11; + }, + + /** + * Get the equivalent HSL components of the color. + * @param {Array} [target] Optional array to receive the values. + * @return {Array} + */ + getHSL: function (target) { + var me = this, + r = me.r / 255, + g = me.g / 255, + b = me.b / 255, + max = Math.max(r, g, b), + min = Math.min(r, g, b), + delta = max - min, + h, + s = 0, + l = 0.5 * (max + min); + + // min==max means achromatic (hue is undefined) + if (min !== max) { + s = (l < 0.5) ? delta / (max + min) : delta / (2 - max - min); + if (r === max) { + h = 60 * (g - b) / delta; + } else if (g === max) { + h = 120 + 60 * (b - r) / delta; + } else { + h = 240 + 60 * (r - g) / delta; + } + if (h < 0) { + h += 360; + } + if (h >= 360) { + h -= 360; + } + } + if (target) { + target[0] = h; + target[1] = s; + target[2] = l; + } else { + target = [h, s, l]; + } + return target; + }, + + /** + * Set current color based on the specified HSL values. + * + * @param {Number} h Hue component (0..359) + * @param {Number} s Saturation component (0..1) + * @param {Number} l Lightness component (0..1) + * @return this + */ + setHSL: function (h, s, l) { + var c, x, m, + abs = Math.abs, + floor = Math.floor; + h = (h % 360 + 360 ) % 360; + s = s > 1 ? 1 : s < 0 ? 0 : s; + l = l > 1 ? 1 : l < 0 ? 0 : l; + if (s === 0 || h === null) { + l *= 255; + this.setRGB(l, l, l); + } + else { + // http://en.wikipedia.org/wiki/HSL_and_HSV#From_HSL + // C is the chroma + // X is the second largest component + // m is the lightness adjustment + h /= 60; + c = s * (1 - abs(2 * l - 1)); + x = c * (1 - abs(h - 2 * floor(h / 2) - 1)); + m = l - c / 2; + m *= 255; + c *= 255; + x *= 255; + switch (floor(h)) { + case 0: + this.setRGB(c + m, x + m, m); + break; + case 1: + this.setRGB(x + m, c + m, m); + break; + case 2: + this.setRGB(m, c + m, x + m); + break; + case 3: + this.setRGB(m, x + m, c + m); + break; + case 4: + this.setRGB(x + m, m, c + m); + break; + case 5: + this.setRGB(c + m, m, x + m); + break; + } + } + return this; + }, + + /** + * Return a new color that is lighter than this color. + * @param {Number} [factor=0.2] Lighter factor (0..1). + * @return {Ext.draw.Color} + */ + createLighter: function (factor) { + var hsl = this.getHSL(); + factor = factor || this.lightnessFactor; + // COMPAT Ext.util.Numbers -> Ext.Number + hsl[2] = hsl[2] + factor; + if (hsl[2] > 1) { + hsl[2] = 1; + } else if (hsl[2] < 0) { + hsl[2] = 0; + } + return Ext.draw.Color.fromHSL(hsl[0], hsl[1], hsl[2]); + }, + + /** + * Return a new color that is darker than this color. + * @param {Number} [factor=0.2] Darker factor (0..1). + * @return {Ext.draw.Color} + */ + createDarker: function (factor) { + factor = factor || this.lightnessFactor; + return this.createLighter(-factor); + }, + + /** + * Return the color in the hex format, i.e. '#rrggbb'. + * @return {String} + */ + toString: function () { + if (this.a === 1) { + var me = this, + round = Math.round, + r = round(me.r).toString(16), + g = round(me.g).toString(16), + b = round(me.b).toString(16); + r = (r.length === 1) ? '0' + r : r; + g = (g.length === 1) ? '0' + g : g; + b = (b.length === 1) ? '0' + b : b; + return ['#', r, g, b].join(''); + } else { + return 'rgba(' + [Math.round(this.r), Math.round(this.g), Math.round(this.b), this.a.toFixed(15)].join(',') + ')'; + } + }, + + /** + * Convert a color to hexadecimal format. + * + * @param {String/Array} color The color value (i.e 'rgb(255, 255, 255)', 'color: #ffffff'). + * Can also be an Array, in this case the function handles the first member. + * @return {String} The color in hexadecimal format. + */ + toHex: function (color) { + if (Ext.isArray(color)) { + color = color[0]; + } + if (!Ext.isString(color)) { + return ''; + } + if (color.substr(0, 1) === '#') { + return color; + } + var digits = Ext.draw.Color.colorToHexRe.exec(color); + + if (Ext.isArray(digits)) { + var red = parseInt(digits[2], 10), + green = parseInt(digits[3], 10), + blue = parseInt(digits[4], 10), + rgb = blue | (green << 8) | (red << 16); + return digits[1] + '#' + ("000000" + rgb.toString(16)).slice(-6); + } + else { + return ''; + } + }, + + /** + * Parse the string and set current color. + * + * Supported formats: '#rrggbb', '#rgb', and 'rgb(r,g,b)'. + * + * If the string is not recognized, an `undefined` will be returned instead. + * + * @param {String} str Color in string. + * @return this + */ + setFromString: function (str) { + var values, r, g, b, a = 1, + parse = parseInt; + + if (str === 'none') { + this.r = this.g = this.b = this.a = 0; + return this; + } + + if ((str.length === 4 || str.length === 7) && str.substr(0, 1) === '#') { + values = str.match(Ext.draw.Color.hexRe); + if (values) { + r = parse(values[1], 16) >> 0; + g = parse(values[2], 16) >> 0; + b = parse(values[3], 16) >> 0; + if (str.length === 4) { + r += (r * 16); + g += (g * 16); + b += (b * 16); + } + } + } + else if ((values = str.match(Ext.draw.Color.rgbToHexRe))) { + r = +values[1]; + g = +values[2]; + b = +values[3]; + } else if ((values = str.match(Ext.draw.Color.rgbaToHexRe))) { + r = +values[1]; + g = +values[2]; + b = +values[3]; + a = +values[4]; + } else { + if (Ext.draw.Color.ColorList.hasOwnProperty(str.toLowerCase())) { + return this.setFromString(Ext.draw.Color.ColorList[str.toLowerCase()]); + } + } + if (typeof r === 'undefined') { + return this; + } + this.r = r; + this.g = g; + this.b = b; + this.a = a; + return this; + } + }, function () { + var flyColor = new this(); + + // + this.createAlias({ + "getLighter": "createLighter", + "getDarker": "createDarker" + }); + // + + this.addStatics({ + /** + * Returns a flyweight instance of Ext.draw.Color. + * + * Can be called with either a CSS color string or with separate + * arguments for red, green, blue, alpha. + * + * @param {Number/String} red Red component (0..255) or CSS color string. + * @param {Number} [green] Green component (0..255) + * @param {Number} [blue] Blue component (0..255) + * @param {Number} [alpha=1] Alpha component (0..1) + * @return {Ext.draw.Color} + * @static + */ + fly: function (r, g, b, a) { + switch (arguments.length) { + case 1: + flyColor.setFromString(r); + break; + case 3: + case 4: + flyColor.setRGB(r, g, b, a); + break; + default: + return null; + } + return flyColor; + }, + + ColorList: { + "aliceblue": "#f0f8ff", "antiquewhite": "#faebd7", "aqua": "#00ffff", "aquamarine": "#7fffd4", "azure": "#f0ffff", + "beige": "#f5f5dc", "bisque": "#ffe4c4", "black": "#000000", "blanchedalmond": "#ffebcd", "blue": "#0000ff", "blueviolet": "#8a2be2", "brown": "#a52a2a", "burlywood": "#deb887", + "cadetblue": "#5f9ea0", "chartreuse": "#7fff00", "chocolate": "#d2691e", "coral": "#ff7f50", "cornflowerblue": "#6495ed", "cornsilk": "#fff8dc", "crimson": "#dc143c", "cyan": "#00ffff", + "darkblue": "#00008b", "darkcyan": "#008b8b", "darkgoldenrod": "#b8860b", "darkgray": "#a9a9a9", "darkgreen": "#006400", "darkkhaki": "#bdb76b", "darkmagenta": "#8b008b", "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", "darkorchid": "#9932cc", "darkred": "#8b0000", "darksalmon": "#e9967a", "darkseagreen": "#8fbc8f", "darkslateblue": "#483d8b", "darkslategray": "#2f4f4f", "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", "deeppink": "#ff1493", "deepskyblue": "#00bfff", "dimgray": "#696969", "dodgerblue": "#1e90ff", + "firebrick": "#b22222", "floralwhite": "#fffaf0", "forestgreen": "#228b22", "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", "ghostwhite": "#f8f8ff", "gold": "#ffd700", "goldenrod": "#daa520", "gray": "#808080", "green": "#008000", "greenyellow": "#adff2f", + "honeydew": "#f0fff0", "hotpink": "#ff69b4", + "indianred ": "#cd5c5c", "indigo ": "#4b0082", "ivory": "#fffff0", "khaki": "#f0e68c", + "lavender": "#e6e6fa", "lavenderblush": "#fff0f5", "lawngreen": "#7cfc00", "lemonchiffon": "#fffacd", "lightblue": "#add8e6", "lightcoral": "#f08080", "lightcyan": "#e0ffff", "lightgoldenrodyellow": "#fafad2", + "lightgray": "#d3d3d3", "lightgrey": "#d3d3d3", "lightgreen": "#90ee90", "lightpink": "#ffb6c1", "lightsalmon": "#ffa07a", "lightseagreen": "#20b2aa", "lightskyblue": "#87cefa", "lightslategray": "#778899", "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", "lime": "#00ff00", "limegreen": "#32cd32", "linen": "#faf0e6", + "magenta": "#ff00ff", "maroon": "#800000", "mediumaquamarine": "#66cdaa", "mediumblue": "#0000cd", "mediumorchid": "#ba55d3", "mediumpurple": "#9370d8", "mediumseagreen": "#3cb371", "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", "mediumturquoise": "#48d1cc", "mediumvioletred": "#c71585", "midnightblue": "#191970", "mintcream": "#f5fffa", "mistyrose": "#ffe4e1", "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", "navy": "#000080", + "oldlace": "#fdf5e6", "olive": "#808000", "olivedrab": "#6b8e23", "orange": "#ffa500", "orangered": "#ff4500", "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", "palegreen": "#98fb98", "paleturquoise": "#afeeee", "palevioletred": "#d87093", "papayawhip": "#ffefd5", "peachpuff": "#ffdab9", "peru": "#cd853f", "pink": "#ffc0cb", "plum": "#dda0dd", "powderblue": "#b0e0e6", "purple": "#800080", + "red": "#ff0000", "rosybrown": "#bc8f8f", "royalblue": "#4169e1", + "saddlebrown": "#8b4513", "salmon": "#fa8072", "sandybrown": "#f4a460", "seagreen": "#2e8b57", "seashell": "#fff5ee", "sienna": "#a0522d", "silver": "#c0c0c0", "skyblue": "#87ceeb", "slateblue": "#6a5acd", "slategray": "#708090", "snow": "#fffafa", "springgreen": "#00ff7f", "steelblue": "#4682b4", + "tan": "#d2b48c", "teal": "#008080", "thistle": "#d8bfd8", "tomato": "#ff6347", "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", "white": "#ffffff", "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", "yellowgreen": "#9acd32" + }, + + /** + * Create a new color based on the specified HSL values. + * + * @param {Number} h Hue component (0..359) + * @param {Number} s Saturation component (0..1) + * @param {Number} l Lightness component (0..1) + * @return {Ext.draw.Color} + * @static + */ + fromHSL: function (h, s, l) { + return (new this(0, 0, 0, 0)).setHSL(h, s, l); + }, + + /** + * Parse the string and create a new color. + * + * Supported formats: '#rrggbb', '#rgb', and 'rgb(r,g,b)'. + * + * If the string is not recognized, an undefined will be returned instead. + * + * @param {String} string Color in string. + * @returns {Ext.draw.Color} + * @static + */ + fromString: function (string) { + return (new this(0, 0, 0, 0)).setFromString(string); + }, + + /** + * Convenience method for creating a color. + * + * Can be called with several different combinations of arguments: + * + * // Ext.draw.Color is returned unchanged. + * Ext.draw.Color.create(new Ext.draw.color(255, 0, 0, 0)); + * + * // CSS color string. + * Ext.draw.Color.create("red"); + * + * // Array of red, green, blue, alpha + * Ext.draw.Color.create([255, 0, 0, 0]); + * + * // Separate arguments of red, green, blue, alpha + * Ext.draw.Color.create(255, 0, 0, 0); + * + * // Returns black when no arguments given. + * Ext.draw.Color.create(); + * + * @param {Ext.draw.Color/String/Number[]/Number} [red] Red component (0..255), + * CSS color string or array of all components. + * @param {Number} [green] Green component (0..255) + * @param {Number} [blue] Blue component (0..255) + * @param {Number} [alpha=1] Alpha component (0..1) + * @return {Ext.draw.Color} + * @static + */ + create: function (arg) { + if (arg instanceof this) { + return arg; + } else if (Ext.isArray(arg)) { + return new Ext.draw.Color(arg[0], arg[1], arg[2], arg[3]); + } else if (Ext.isString(arg)) { + return Ext.draw.Color.fromString(arg); + } else if (arguments.length > 2) { + return new Ext.draw.Color(arguments[0], arguments[1], arguments[2], arguments[3]); + } else { + return new Ext.draw.Color(0, 0, 0, 0); + } + } + }); + }); +})(); \ No newline at end of file diff --git a/vendor/touch/src/draw/Component.js b/vendor/touch/src/draw/Component.js new file mode 100644 index 000000000..bcfb8e6f1 --- /dev/null +++ b/vendor/touch/src/draw/Component.js @@ -0,0 +1,354 @@ +/** + * The Draw Component is a surface in which sprites can be rendered. The Draw Component + * manages and holds a `Surface` instance: an interface that has + * an SVG or VML implementation depending on the browser capabilities and where + * Sprites can be appended. + * One way to create a draw component is: + * + * var drawComponent = new Ext.draw.Component({ + * fullscreen: true, + * sprites: [{ + * type: 'circle', + * fill: '#79BB3F', + * radius: 100, + * x: 100, + * y: 100 + * }] + * }); + * + * In this case we created a draw component and added a sprite to it. + * The *type* of the sprite is *circle* so if you run this code you'll see a yellow-ish + * circle in a Window. When setting `viewBox` to `false` we are responsible for setting the object's position and + * dimensions accordingly. + * + * You can also add sprites by using the surface's add method: + * + * drawComponent.getSurface('main').add({ + * type: 'circle', + * fill: 'blue', + * radius: 100, + * x: 100, + * y: 100 + * }); + * + * For more information on Sprites, the core elements added to a draw component's surface, + * refer to the {@link Ext.draw.sprite.Sprite} documentation. + */ +Ext.define('Ext.draw.Component', { + + extend: 'Ext.Container', + xtype: 'draw', + defaultType: 'surface', + + requires: [ + 'Ext.draw.Surface', + 'Ext.draw.engine.Svg', + 'Ext.draw.engine.Canvas', + 'Ext.draw.gradient.GradientDefinition' + ], + engine: 'Ext.draw.engine.Canvas', + statics: { + WATERMARK: 'Powered by Sencha Touch GPLv3' + }, + config: { + cls: 'x-draw-component', + + /** + * @deprecated 2.2.0 Please implement custom resize event handler. + * Resize the draw component by the content size of the main surface. + * + * __Note:__ It is applied only when there is only one surface. + */ + autoSize: false, + + /** + * @deprecated 2.2.0 Please implement custom resize event handler. + * Pan/Zoom the content in main surface to fit the component size. + * + * __Note:__ It is applied only when there is only one surface. + */ + viewBox: false, + + /** + * @deprecated 2.2.0 Please implement custom resize event handler. + * Fit the main surface to the size of component. + * + * __Note:__ It is applied only when there is only one surface. + */ + fitSurface: true, + + /** + * @cfg {Function} [resizeHandler] The resize function that can be configured to have a behavior. + * + * __Note:__ since resize events trigger {@link #renderFrame} calls automatically, + * return `false` from the resize function, if it also calls `renderFrame`, to prevent double rendering. + */ + resizeHandler: null, + + background: null, + + sprites: null, + + /** + * @cfg {Object[]} gradients + * Defines a set of gradients that can be used as color properties + * (fillStyle and strokeStyle, but not shadowColor) in sprites. + * The gradients array is an array of objects with the following properties: + * - **id** - string - The unique name of the gradient. + * - **type** - string, optional - The type of the gradient. Available types are: 'linear', 'radial'. Defaults to 'linear'. + * - **angle** - number, optional - The angle of the gradient in degrees. + * - **stops** - array - An array of objects with 'color' and 'offset' properties, where 'offset' is a real number from 0 to 1. + * + * For example: + * + * gradients: [{ + * id: 'gradientId1', + * type: 'linear', + * angle: 45, + * stops: [{ + * offset: 0, + * color: 'red' + * }, { + * offset: 1, + * color: 'yellow' + * }] + * }, { + * id: 'gradientId2', + * type: 'radial', + * stops: [{ + * offset: 0, + * color: '#555', + * }, { + * offset: 1, + * color: '#ddd', + * }] + * }] + * + * Then the sprites can use 'gradientId1' and 'gradientId2' by setting the color attributes to those ids, for example: + * + * sprite.setAttributes({ + * fillStyle: 'url(#gradientId1)', + * strokeStyle: 'url(#gradientId2)' + * }); + */ + gradients: [] + }, + + constructor: function (config) { + config = config || {}; + this.callSuper(arguments); + this.frameCallbackId = Ext.draw.Animator.addFrameCallback('renderFrame', this); + }, + + applyGradients: function (gradients) { + var result = [], + i, n, gradient, offset; + if (!Ext.isArray(gradients)) { + return result; + } + for (i = 0, n = gradients.length; i < n; i++) { + gradient = gradients[i]; + if (!Ext.isObject(gradient)) { + continue; + } + // ExtJS only supported linear gradients, so we didn't have to specify their type + if (typeof gradient.type !== 'string') { + gradient.type = 'linear'; + } + if (gradient.angle) { + gradient.degrees = gradient.angle; + delete gradient.angle; + } + // Convert ExtJS stops object to Touch stops array + if (Ext.isObject(gradient.stops)) { + gradient.stops = (function (stops) { + var result = [], stop; + for (offset in stops) { + stop = stops[offset]; + stop.offset = offset / 100; + result.push(stop); + } + return result; + })(gradient.stops); + } + result.push(gradient); + } + Ext.draw.gradient.GradientDefinition.add(result); + return result; + }, + + initialize: function () { + var me = this; + me.callSuper(); + me.element.on('resize', 'onResize', this); + }, + + applySprites: function (sprites) { + // Never update + if (!sprites) { + return; + } + + sprites = Ext.Array.from(sprites); + + var ln = sprites.length, + i, surface; + + for (i = 0; i < ln; i++) { + if (sprites[i].surface instanceof Ext.draw.Surface) { + surface = sprites[i].surface; + } else if (Ext.isString(sprites[i].surface)) { + surface = this.getSurface(sprites[i].surface); + } else { + surface = this.getSurface('main'); + } + surface.add(sprites[i]); + } + }, + + getElementConfig: function () { + return { + reference: 'element', + className: 'x-container', + children: [ + { + reference: 'innerElement', + className: 'x-inner', + children: [ + { + reference: 'watermarkElement', + cls: 'x-chart-watermark', + html: Ext.draw.Component.WATERMARK, + style: Ext.draw.Component.WATERMARK ? '': 'display: none' + } + ] + } + ] + }; + }, + + updateBackground: function (background) { + this.element.setStyle({ + background: background + }); + }, + + /** + * @protected + * Place water mark after resize. + */ + onPlaceWatermark: function () { + // Do nothing + }, + + onResize: function () { + var me = this, + size = me.element.getSize(), + resizeHandler = me.getResizeHandler() || me.resizeHandler, + result; + me.fireEvent('resize', me, size); + result = resizeHandler.call(me, size); + if (result !== false) { + me.renderFrame(); + me.onPlaceWatermark(); + } + }, + + resizeHandler: function (size) { + var me = this; + + // + var surfaces = me.getItems(), + surface, bbox, mat, zoomX, zoomY, zoom; + + if (surfaces.length === 1) { + surface = surfaces.get(0); + if (me.getAutoSize()) { + bbox = surface.getItems().getBBox(); + mat = new Ext.draw.Matrix(); + mat.prepend(1, 0, 0, 1, -bbox.x, -bbox.y); + surface.matrix = mat; + surface.inverseMatrix = mat.inverse(); + surface.setRegion([0, 0, bbox.width, bbox.height]); + } else if (me.getViewBox()) { + bbox = surface.getItems().getBBox(); + zoomX = size.width / bbox.width; + zoomY = size.height / bbox.height; + zoom = Math.min(zoomX, zoomY); + mat = new Ext.draw.Matrix(); + mat.prepend( + zoom, 0, 0, zoom, + size.width * 0.5 + (-bbox.x - bbox.width * 0.5) * zoom, + size.height * 0.5 + (-bbox.y - bbox.height * 0.5) * zoom); + surface.matrix = mat; + surface.inverseMatrix = mat.inverse(); + surface.setRegion([0, 0, size.width, size.height]); + } else if (me.getFitSurface()) { + surface.setRegion([0, 0, size.width, size.height]); + } + } else if (!me.getFitSurface()) { + return; + } + // + + me.getItems().each(function (surface) { + surface.setRegion([0, 0, size.width, size.height]); + }); + }, + + /** + * Get a surface by the given id or create one if it doesn't exist. + * @param {String} [id="main"] + * @return {Ext.draw.Surface} + */ + getSurface: function (id) { + id = this.getId() + '-' + (id || 'main'); + var me = this, + surfaces = me.getItems(), + surface = surfaces.get(id), + size; + + if (!surface) { + surface = me.add({xclass: me.engine, id: id}); + if (me.getFitSurface()) { + size = me.element.getSize(); + surface.setRegion([0, 0, size.width, size.height]); + } + surface.renderFrame(); + } + return surface; + }, + + /** + * Render all the surfaces in the component. + */ + renderFrame: function () { + var me = this, + i, ln, bbox, + surfaces = me.getItems(); + + for (i = 0, ln = surfaces.length; i < ln; i++) { + surfaces.items[i].renderFrame(); + } + // + // TODO: Throw a deprecation message + if (surfaces.length === 1 && me.getAutoSize()) { + bbox = me.getSurface().getItems().getBBox(); + me.setSize(Math.ceil(bbox.width) + 1, Math.ceil(bbox.height) + 1); + } + // + }, + + destroy: function () { + Ext.draw.Animator.removeFrameCallback(this.frameCallbackId); + this.callSuper(); + } + +}, function () { + if (location.search.match('svg')) { + Ext.draw.Component.prototype.engine = 'Ext.draw.engine.Svg'; + } else if ((Ext.os.is.BlackBerry && Ext.os.version.getMajor() === 10) || (Ext.browser.is.AndroidStock4 && (Ext.os.version.getMinor() === 1 || Ext.os.version.getMinor() === 2 || Ext.os.version.getMinor() === 3))) { + // http://code.google.com/p/android/issues/detail?id=37529 + Ext.draw.Component.prototype.engine = 'Ext.draw.engine.Svg'; + } +}); diff --git a/vendor/touch/src/draw/Draw.js b/vendor/touch/src/draw/Draw.js new file mode 100644 index 000000000..283d4edbd --- /dev/null +++ b/vendor/touch/src/draw/Draw.js @@ -0,0 +1,261 @@ +(function () { + if (!Ext.global.Float32Array) { + // Typed Array polyfill + var Float32Array = function (array) { + if (typeof array === 'number') { + this.length = array; + } else if ('length' in array) { + this.length = array.length; + for (var i = 0, len = array.length; i < len; i++) { + this[i] = +array[i]; + } + } + }; + + Float32Array.prototype = []; + Ext.global.Float32Array = Float32Array; + } +})(); + +/** + * Utility class providing mathematics functionalities through all the draw package. + */ +Ext.define('Ext.draw.Draw', { + singleton: true, + + radian: Math.PI / 180, + pi2: Math.PI * 2, + + /** + * Function that returns its first element. + * @param {Mixed} a + * @return {Mixed} + */ + reflectFn: function (a) { + return a; + }, + + /** + * Converting degrees to radians. + * @param {Number} degrees + * @return {Number} + */ + rad: function (degrees) { + return degrees % 360 * Math.PI / 180; + }, + + /** + * Converting radians to degrees. + * @param {Number} radian + * @return {Number} + */ + degrees: function (radian) { + return radian * 180 / Math.PI % 360; + }, + + /** + * + * @param {Object} bbox1 + * @param {Object} bbox2 + * @param {Number} [padding] + * @return {Boolean} + */ + isBBoxIntersect: function (bbox1, bbox2, padding) { + padding = padding || 0; + return (Math.max(bbox1.x, bbox2.x) - padding > Math.min(bbox1.x + bbox1.width, bbox2.x + bbox2.width)) || + (Math.max(bbox1.y, bbox2.y) - padding > Math.min(bbox1.y + bbox1.height, bbox2.y + bbox2.height)); + }, + + /** + * Natural cubic spline interpolation. + * This algorithm runs in linear time. + * + * @param {Array} points Array of numbers. + */ + spline: function (points) { + var i, j, ln = points.length, + nd, d, y, ny, + r = 0, + zs = new Float32Array(points.length), + result = new Float32Array(points.length * 3 - 2); + + zs[0] = 0; + zs[ln - 1] = 0; + + for (i = 1; i < ln - 1; i++) { + zs[i] = (points[i + 1] + points[i - 1] - 2 * points[i]) - zs[i - 1]; + r = 1 / (4 - r); + zs[i] *= r; + } + + for (i = ln - 2; i > 0; i--) { + r = 3.732050807568877 + 48.248711305964385 / (-13.928203230275537 + Math.pow(0.07179676972449123, i)); + zs[i] -= zs[i + 1] * r; + } + + ny = points[0]; + nd = ny - zs[0]; + for (i = 0, j = 0; i < ln - 1; j += 3) { + y = ny; + d = nd; + i++; + ny = points[i]; + nd = ny - zs[i]; + result[j] = y; + result[j + 1] = (nd + 2 * d) / 3; + result[j + 2] = (nd * 2 + d) / 3; + } + result[j] = ny; + return result; + }, + + /** + * @private + * + * Calculates bezier curve control anchor points for a particular point in a path, with a + * smoothing curve applied. The smoothness of the curve is controlled by the 'value' parameter. + * Note that this algorithm assumes that the line being smoothed is normalized going from left + * to right; it makes special adjustments assuming this orientation. + * + * @param {Number} prevX X coordinate of the previous point in the path + * @param {Number} prevY Y coordinate of the previous point in the path + * @param {Number} curX X coordinate of the current point in the path + * @param {Number} curY Y coordinate of the current point in the path + * @param {Number} nextX X coordinate of the next point in the path + * @param {Number} nextY Y coordinate of the next point in the path + * @param {Number} value A value to control the smoothness of the curve; this is used to + * divide the distance between points, so a value of 2 corresponds to + * half the distance between points (a very smooth line) while higher values + * result in less smooth curves. Defaults to 4. + * @return {Object} Object containing x1, y1, x2, y2 bezier control anchor points; x1 and y1 + * are the control point for the curve toward the previous path point, and + * x2 and y2 are the control point for the curve toward the next path point. + */ + getAnchors: function (prevX, prevY, curX, curY, nextX, nextY, value) { + value = value || 4; + var PI = Math.PI, + halfPI = PI / 2, + abs = Math.abs, + sin = Math.sin, + cos = Math.cos, + atan = Math.atan, + control1Length, control2Length, control1Angle, control2Angle, + control1X, control1Y, control2X, control2Y, alpha; + + // Find the length of each control anchor line, by dividing the horizontal distance + // between points by the value parameter. + control1Length = (curX - prevX) / value; + control2Length = (nextX - curX) / value; + + // Determine the angle of each control anchor line. If the middle point is a vertical + // turnaround then we force it to a flat horizontal angle to prevent the curve from + // dipping above or below the middle point. Otherwise we use an angle that points + // toward the previous/next target point. + if ((curY >= prevY && curY >= nextY) || (curY <= prevY && curY <= nextY)) { + control1Angle = control2Angle = halfPI; + } else { + control1Angle = atan((curX - prevX) / abs(curY - prevY)); + if (prevY < curY) { + control1Angle = PI - control1Angle; + } + control2Angle = atan((nextX - curX) / abs(curY - nextY)); + if (nextY < curY) { + control2Angle = PI - control2Angle; + } + } + + // Adjust the calculated angles so they point away from each other on the same line + alpha = halfPI - ((control1Angle + control2Angle) % (PI * 2)) / 2; + if (alpha > halfPI) { + alpha -= PI; + } + control1Angle += alpha; + control2Angle += alpha; + + // Find the control anchor points from the angles and length + control1X = curX - control1Length * sin(control1Angle); + control1Y = curY + control1Length * cos(control1Angle); + control2X = curX + control2Length * sin(control2Angle); + control2Y = curY + control2Length * cos(control2Angle); + + // One last adjustment, make sure that no control anchor point extends vertically past + // its target prev/next point, as that results in curves dipping above or below and + // bending back strangely. If we find this happening we keep the control angle but + // reduce the length of the control line so it stays within bounds. + if ((curY > prevY && control1Y < prevY) || (curY < prevY && control1Y > prevY)) { + control1X += abs(prevY - control1Y) * (control1X - curX) / (control1Y - curY); + control1Y = prevY; + } + if ((curY > nextY && control2Y < nextY) || (curY < nextY && control2Y > nextY)) { + control2X -= abs(nextY - control2Y) * (control2X - curX) / (control2Y - curY); + control2Y = nextY; + } + + return { + x1: control1X, + y1: control1Y, + x2: control2X, + y2: control2Y + }; + }, + + /** + * Given coordinates of the points, calculates coordinates of a Bezier curve that goes through them. + * @param dataX x-coordinates of the points. + * @param dataY y-coordinates of the points. + * @param value A value to control the smoothness of the curve. + * @return {Object} Object holding two arrays, for x and y coordinates of the curve. + */ + smooth: function (dataX, dataY, value) { + var ln = dataX.length, + prevX, prevY, + curX, curY, + nextX, nextY, + x, y, + smoothX = [], smoothY = [], + i, anchors; + + for (i = 0; i < ln - 1; i++) { + prevX = dataX[i]; + prevY = dataY[i]; + if (i === 0) { + x = prevX; + y = prevY; + smoothX.push(x); + smoothY.push(y); + if (ln === 1) { + break; + } + } + curX = dataX[i+1]; + curY = dataY[i+1]; + nextX = dataX[i+2]; + nextY = dataY[i+2]; + if (isNaN(nextX) || isNaN(nextY)) { + smoothX.push(x, curX, curX); + smoothY.push(y, curY, curY); + break; + } + anchors = this.getAnchors(prevX, prevY, curX, curY, nextX, nextY, value); + smoothX.push(x, anchors.x1, curX); + smoothY.push(y, anchors.y1, curY); + x = anchors.x2; + y = anchors.y2; + } + return { + smoothX: smoothX, + smoothY: smoothY + } + }, + + /** + * @method + * @private + * Work around for iOS. + * Nested 3d-transforms seems to prevent the redraw inside it until some event is fired. + */ + updateIOS: Ext.os.is.iOS ? function () { + Ext.getBody().createChild({id: 'frame-workaround', style: 'position: absolute; top: 0px; bottom: 0px; left: 0px; right: 0px; background: rgba(0,0,0,0.001); z-index: 100000'}); + Ext.draw.Animator.schedule(function () {Ext.get('frame-workaround').destroy();}); + } : Ext.emptyFn +}); diff --git a/vendor/touch/src/draw/LimitedCache.js b/vendor/touch/src/draw/LimitedCache.js new file mode 100644 index 000000000..552cb745c --- /dev/null +++ b/vendor/touch/src/draw/LimitedCache.js @@ -0,0 +1,80 @@ +/** + * Limited cache is a size limited cache container that stores limited number of objects. + * + * When {@link #get} is called, the container will try to find the object in the list. + * If failed it will call the {@link #feeder} to create that object. If there are too many + * objects in the container, the old ones are removed. + * + * __Note:__ This is not using a Least Recently Used policy due to simplicity and performance consideration. + */ +Ext.define("Ext.draw.LimitedCache", { + config: { + /** + * @cfg {Number} + * The amount limit of the cache. + */ + limit: 40, + + /** + * @cfg {Function} + * Function that generates the object when look-up failed. + * @return {Number} + */ + feeder: function () { + return 0; + }, + + /** + * @cfg {Object} + * The scope for {@link #feeder} + */ + scope: null + }, + cache: null, + + constructor: function (config) { + this.cache = {}; + this.cache.list = []; + this.cache.tail = 0; + this.initConfig(config); + }, + + /** + * Get a cached object. + * @param {String} id + * @param {Mixed...} args Arguments appended to feeder. + * @return {Object} + */ + get: function (id) { + // TODO: Implement cache hit optimization + var cache = this.cache, + limit = this.getLimit(), + feeder = this.getFeeder(), + scope = this.getScope() || this; + + if (cache[id]) { + return cache[id].value; + } + if (cache.list[cache.tail]) { + delete cache[cache.list[cache.tail].cacheId]; + } + cache[id] = cache.list[cache.tail] = { + value: feeder.apply(scope, Array.prototype.slice.call(arguments, 1)), + cacheId: id + }; + cache.tail++; + if (cache.tail === limit) { + cache.tail = 0; + } + return cache[id].value; + }, + + /** + * Clear all the objects. + */ + clear: function () { + this.cache = {}; + this.cache.list = []; + this.cache.tail = 0; + } +}); \ No newline at end of file diff --git a/vendor/touch/src/draw/Matrix.js b/vendor/touch/src/draw/Matrix.js new file mode 100644 index 000000000..410e4ede9 --- /dev/null +++ b/vendor/touch/src/draw/Matrix.js @@ -0,0 +1,809 @@ +/** + * Utility class to calculate [affine transformation](http://en.wikipedia.org/wiki/Affine_transformation) matrix. + * + * This class is compatible with SVGMatrix except: + * + * 1. Ext.draw.Matrix is not read only. + * 2. Using Number as its components rather than floats. + * + * Using this class to reduce the severe numeric problem with HTML Canvas and SVG transformation. + * + */ +Ext.define('Ext.draw.Matrix', { + + statics: { + /** + * @static + * Return the affine matrix that transform two points (x0, y0) and (x1, y1) to (x0p, y0p) and (x1p, y1p) + * @param {Number} x0 + * @param {Number} y0 + * @param {Number} x1 + * @param {Number} y1 + * @param {Number} x0p + * @param {Number} y0p + * @param {Number} x1p + * @param {Number} y1p + */ + createAffineMatrixFromTwoPair: function (x0, y0, x1, y1, x0p, y0p, x1p, y1p) { + var dx = x1 - x0, + dy = y1 - y0, + dxp = x1p - x0p, + dyp = y1p - y0p, + r = 1 / (dx * dx + dy * dy), + a = dx * dxp + dy * dyp, + b = dxp * dy - dx * dyp, + c = -a * x0 - b * y0, + f = b * x0 - a * y0; + + return new this(a * r, -b * r, b * r, a * r, c * r + x0p, f * r + y0p); + }, + + /** + * @static + * Return the affine matrix that transform two points (x0, y0) and (x1, y1) to (x0p, y0p) and (x1p, y1p) + * @param {Number} x0 + * @param {Number} y0 + * @param {Number} x1 + * @param {Number} y1 + * @param {Number} x0p + * @param {Number} y0p + * @param {Number} x1p + * @param {Number} y1p + */ + createPanZoomFromTwoPair: function (x0, y0, x1, y1, x0p, y0p, x1p, y1p) { + if (arguments.length === 2) { + return this.createPanZoomFromTwoPair.apply(this, x0.concat(y0)); + } + var dx = x1 - x0, + dy = y1 - y0, + cx = (x0 + x1) * 0.5, + cy = (y0 + y1) * 0.5, + dxp = x1p - x0p, + dyp = y1p - y0p, + cxp = (x0p + x1p) * 0.5, + cyp = (y0p + y1p) * 0.5, + r = dx * dx + dy * dy, + rp = dxp * dxp + dyp * dyp, + scale = Math.sqrt(rp / r); + + return new this(scale, 0, 0, scale, cxp - scale * cx, cyp - scale * cy); + }, + + /** + * @static + * Create a flyweight to wrap the given array. + * The flyweight will directly refer the object and the elements can be changed by other methods. + * + * Do not hold the instance of flyweight matrix. + * + * @param {Array} elements + * @return {Ext.draw.Matrix} + */ + fly: (function () { + var flyMatrix = null, + simplefly = function (elements) { + flyMatrix.elements = elements; + return flyMatrix; + }; + + return function (elements) { + if (!flyMatrix) { + flyMatrix = new Ext.draw.Matrix(); + } + flyMatrix.elements = elements; + Ext.draw.Matrix.fly = simplefly; + return flyMatrix; + }; + })(), + + /** + * @static + * Create a matrix from `mat`. If `mat` is already a matrix, returns it. + * @param {Mixed} mat + * @return {Ext.draw.Matrix} + */ + create: function (mat) { + if (mat instanceof this) { + return mat; + } + return new this(mat); + } + }, + + /** + * Create an affine transform matrix. + * + * @param {Number} xx Coefficient from x to x + * @param {Number} xy Coefficient from x to y + * @param {Number} yx Coefficient from y to x + * @param {Number} yy Coefficient from y to y + * @param {Number} dx Offset of x + * @param {Number} dy Offset of y + */ + constructor: function (xx, xy, yx, yy, dx, dy) { + if (xx && xx.length === 6) { + this.elements = xx.slice(); + } else if (xx !== undefined) { + this.elements = [xx, xy, yx, yy, dx, dy]; + } else { + this.elements = [1, 0, 0, 1, 0, 0]; + } + }, + + /** + * Prepend a matrix onto the current. + * + * __Note:__ The given transform will come after the current one. + * + * @param {Number} xx Coefficient from x to x. + * @param {Number} xy Coefficient from x to y. + * @param {Number} yx Coefficient from y to x. + * @param {Number} yy Coefficient from y to y. + * @param {Number} dx Offset of x. + * @param {Number} dy Offset of y. + * @return {Ext.draw.Matrix} this + */ + prepend: function (xx, xy, yx, yy, dx, dy) { + var elements = this.elements, + xx0 = elements[0], + xy0 = elements[1], + yx0 = elements[2], + yy0 = elements[3], + dx0 = elements[4], + dy0 = elements[5]; + + elements[0] = xx * xx0 + yx * xy0; + elements[1] = xy * xx0 + yy * xy0; + elements[2] = xx * yx0 + yx * yy0; + elements[3] = xy * yx0 + yy * yy0; + elements[4] = xx * dx0 + yx * dy0 + dx; + elements[5] = xy * dx0 + yy * dy0 + dy; + return this; + }, + + /** + * Prepend a matrix onto the current. + * + * __Note:__ The given transform will come after the current one. + * @param {Ext.draw.Matrix} matrix + * @return {Ext.draw.Matrix} this + */ + prependMatrix: function (matrix) { + return this.prepend.apply(this, matrix.elements); + }, + + /** + * Postpend a matrix onto the current. + * + * __Note:__ The given transform will come before the current one. + * + * @param {Number} xx Coefficient from x to x. + * @param {Number} xy Coefficient from x to y. + * @param {Number} yx Coefficient from y to x. + * @param {Number} yy Coefficient from y to y. + * @param {Number} dx Offset of x. + * @param {Number} dy Offset of y. + * @return {Ext.draw.Matrix} this + */ + append: function (xx, xy, yx, yy, dx, dy) { + var elements = this.elements, + xx0 = elements[0], + xy0 = elements[1], + yx0 = elements[2], + yy0 = elements[3], + dx0 = elements[4], + dy0 = elements[5]; + + elements[0] = xx * xx0 + xy * yx0; + elements[1] = xx * xy0 + xy * yy0; + elements[2] = yx * xx0 + yy * yx0; + elements[3] = yx * xy0 + yy * yy0; + elements[4] = dx * xx0 + dy * yx0 + dx0; + elements[5] = dx * xy0 + dy * yy0 + dy0; + return this; + }, + + /** + * Postpend a matrix onto the current. + * + * __Note:__ The given transform will come before the current one. + * + * @param {Ext.draw.Matrix} matrix + * @return {Ext.draw.Matrix} this + */ + appendMatrix: function (matrix) { + return this.append.apply(this, matrix.elements); + }, + + /** + * Set the elements of a Matrix + * @param {Number} xx + * @param {Number} xy + * @param {Number} yx + * @param {Number} yy + * @param {Number} dx + * @param {Number} dy + * @return {Ext.draw.Matrix} this + */ + set: function (xx, xy, yx, yy, dx, dy) { + var elements = this.elements; + + elements[0] = xx; + elements[1] = xy; + elements[2] = yx; + elements[3] = yy; + elements[4] = dx; + elements[5] = dy; + return this; + }, + + /** + * Return a new matrix represents the opposite transformation of the current one. + * + * @param {Ext.draw.Matrix} [target] A target matrix. If present, it will receive + * the result of inversion to avoid creating a new object. + * + * @return {Ext.draw.Matrix} + */ + inverse: function (target) { + var elements = this.elements, + a = elements[0], + b = elements[1], + c = elements[2], + d = elements[3], + e = elements[4], + f = elements[5], + rDim = 1 / (a * d - b * c); + + a *= rDim; + b *= rDim; + c *= rDim; + d *= rDim; + if (target) { + target.set(d, -b, -c, a, c * f - d * e, b * e - a * f); + return target; + } else { + return new Ext.draw.Matrix(d, -b, -c, a, c * f - d * e, b * e - a * f); + } + }, + + /** + * Translate the matrix. + * + * @param {Number} x + * @param {Number} y + * @param {Boolean} [prepend] If `true`, this will transformation be prepended to the matrix. + * @return {Ext.draw.Matrix} this + */ + translate: function (x, y, prepend) { + if (prepend) { + return this.prepend(1, 0, 0, 1, x, y); + } else { + return this.append(1, 0, 0, 1, x, y); + } + }, + + /** + * Scale the matrix. + * + * @param {Number} sx + * @param {Number} sy + * @param {Number} scx + * @param {Number} scy + * @param {Boolean} [prepend] If `true`, this will transformation be prepended to the matrix. + * @return {Ext.draw.Matrix} this + */ + scale: function (sx, sy, scx, scy, prepend) { + var me = this; + + // null or undefined + if (sy == null) { + sy = sx; + } + if (scx === undefined) { + scx = 0; + } + if (scy === undefined) { + scy = 0; + } + + if (prepend) { + return me.prepend(sx, 0, 0, sy, scx - scx * sx, scy - scy * sy); + } else { + return me.append(sx, 0, 0, sy, scx - scx * sx, scy - scy * sy); + } + }, + + /** + * Rotate the matrix. + * + * @param {Number} angle Radians to rotate + * @param {Number|null} rcx Center of rotation. + * @param {Number|null} rcy Center of rotation. + * @param {Boolean} [prepend] If `true`, this will transformation be prepended to the matrix. + * @return {Ext.draw.Matrix} this + */ + rotate: function (angle, rcx, rcy, prepend) { + var me = this, + cos = Math.cos(angle), + sin = Math.sin(angle); + + rcx = rcx || 0; + rcy = rcy || 0; + + if (prepend) { + return me.prepend( + cos, sin, + -sin, cos, + rcx - cos * rcx + rcy * sin, + rcy - cos * rcy - rcx * sin + ); + } else { + return me.append( + cos, sin, + -sin, cos, + rcx - cos * rcx + rcy * sin, + rcy - cos * rcy - rcx * sin + ); + } + }, + + /** + * Rotate the matrix by the angle of a vector. + * + * @param {Number} x + * @param {Number} y + * @param {Boolean} [prepend] If `true`, this will transformation be prepended to the matrix. + * @return {Ext.draw.Matrix} this + */ + rotateFromVector: function (x, y, prepend) { + var me = this, + d = Math.sqrt(x * x + y * y), + cos = x / d, + sin = y / d; + if (prepend) { + return me.prepend(cos, sin, -sin, cos, 0, 0); + } else { + return me.append(cos, sin, -sin, cos, 0, 0); + } + }, + + /** + * Clone this matrix. + * @return {Ext.draw.Matrix} + */ + clone: function () { + return new Ext.draw.Matrix(this.elements); + }, + + /** + * Horizontally flip the matrix + * @return {Ext.draw.Matrix} this + */ + flipX: function () { + return this.append(-1, 0, 0, 1, 0, 0); + }, + + /** + * Vertically flip the matrix + * @return {Ext.draw.Matrix} this + */ + flipY: function () { + return this.append(1, 0, 0, -1, 0, 0); + }, + + /** + * Skew the matrix + * @param {Number} angle + * @return {Ext.draw.Matrix} this + */ + skewX: function (angle) { + return this.append(1, Math.tan(angle), 0, -1, 0, 0); + }, + + /** + * Skew the matrix + * @param {Number} angle + * @return {Ext.draw.Matrix} this + */ + skewY: function (angle) { + return this.append(1, 0, Math.tan(angle), -1, 0, 0); + }, + + /** + * Reset the matrix to identical. + * @return {Ext.draw.Matrix} this + */ + reset: function () { + return this.set(1, 0, 0, 1, 0, 0); + }, + + /** + * @private + * Split Matrix to `{{devicePixelRatio,c,0},{b,devicePixelRatio,0},{0,0,1}}.{{xx,0,dx},{0,yy,dy},{0,0,1}}` + * @return {Object} Object with b,c,d=devicePixelRatio,xx,yy,dx,dy + */ + precisionCompensate: function (devicePixelRatio, comp) { + var elements = this.elements, + x2x = elements[0], + x2y = elements[1], + y2x = elements[2], + y2y = elements[3], + newDx = elements[4], + newDy = elements[5], + r = x2y * y2x - x2x * y2y; + + comp.b = devicePixelRatio * x2y / x2x; + comp.c = devicePixelRatio * y2x / y2y; + comp.d = devicePixelRatio; + comp.xx = x2x / devicePixelRatio; + comp.yy = y2y / devicePixelRatio; + comp.dx = (newDy * x2x * y2x - newDx * x2x * y2y) / r / devicePixelRatio; + comp.dy = (newDx * x2y * y2y - newDy * x2x * y2y) / r / devicePixelRatio; + }, + + /** + * @private + * Split Matrix to `{{1,c,0},{b,d,0},{0,0,1}}.{{xx,0,dx},{0,xx,dy},{0,0,1}}` + * @return {Object} Object with b,c,d,xx,yy=xx,dx,dy + */ + precisionCompensateRect: function (devicePixelRatio, comp) { + var elements = this.elements, + x2x = elements[0], + x2y = elements[1], + y2x = elements[2], + y2y = elements[3], + newDx = elements[4], + newDy = elements[5], + yxOnXx = y2x / x2x; + + comp.b = devicePixelRatio * x2y / x2x; + comp.c = devicePixelRatio * yxOnXx; + comp.d = devicePixelRatio * y2y / x2x; + comp.xx = x2x / devicePixelRatio; + comp.yy = x2x / devicePixelRatio; + comp.dx = (newDy * y2x - newDx * y2y) / (x2y * yxOnXx - y2y) / devicePixelRatio; + comp.dy = -(newDy * x2x - newDx * x2y) / (x2y * yxOnXx - y2y) / devicePixelRatio; + }, + + /** + * Transform point returning the x component of the result. + * @param {Number} x + * @param {Number} y + * @return {Number} x component of the result. + */ + x: function (x, y) { + var elements = this.elements; + return x * elements[0] + y * elements[2] + elements[4]; + }, + + /** + * Transform point returning the y component of the result. + * @param {Number} x + * @param {Number} y + * @return {Number} y component of the result. + */ + y: function (x, y) { + var elements = this.elements; + + return x * elements[1] + y * elements[3] + elements[5]; + }, + + /** + * @private + * @param {Number} i + * @param {Number} j + * @return {String} + */ + get: function (i, j) { + return +this.elements[i + j * 2].toFixed(4); + }, + + /** + * Transform a point to a new array. + * @param {Array} point + * @return {Array} + */ + transformPoint: function (point) { + var elements = this.elements; + + return [ + point[0] * elements[0] + point[1] * elements[2] + elements[4], + point[0] * elements[1] + point[1] * elements[3] + elements[5] + ]; + }, + + /** + * @param {Object} bbox Given as `{x: Number, y: Number, width: Number, height: Number}`. + * @param {Number} [radius] + * @param {Object} [target] Optional target object to recieve the result. + * Recommended to use it for better gc. + * + * @return {Object} Object with x, y, width and height. + */ + transformBBox: function (bbox, radius, target) { + var elements = this.elements, + l = bbox.x, + t = bbox.y, + w0 = bbox.width * 0.5, + h0 = bbox.height * 0.5, + xx = elements[0], + xy = elements[1], + yx = elements[2], + yy = elements[3], + cx = l + w0, + cy = t + h0, + w, h, scales; + + if (radius) { + w0 -= radius; + h0 -= radius; + scales = [ + Math.sqrt(elements[0] * elements[0] + elements[2] * elements[2]), + Math.sqrt(elements[1] * elements[1] + elements[3] * elements[3]) + ]; + w = Math.abs(w0 * xx) + Math.abs(h0 * yx) + Math.abs(scales[0] * radius); + h = Math.abs(w0 * xy) + Math.abs(h0 * yy) + Math.abs(scales[1] * radius); + } else { + w = Math.abs(w0 * xx) + Math.abs(h0 * yx); + h = Math.abs(w0 * xy) + Math.abs(h0 * yy); + } + + if (!target) { + target = {}; + } + + target.x = cx * xx + cy * yx + elements[4] - w; + target.y = cx * xy + cy * yy + elements[5] - h; + target.width = w + w; + target.height = h + h; + + return target; + }, + + /** + * Transform a list for points. + * + * __Note:__ will change the original list but not points inside it. + * @param {Array} list + * @return {Array} list + */ + transformList: function (list) { + var elements = this.elements, + xx = elements[0], yx = elements[2], dx = elements[4], + xy = elements[1], yy = elements[3], dy = elements[5], + ln = list.length, + p, i; + + for (i = 0; i < ln; i++) { + p = list[i]; + list[i] = [ + p[0] * xx + p[1] * yx + dx, + p[0] * xy + p[1] * yy + dy + ]; + } + return list; + }, + + /** + * Determines whether this matrix is an identity matrix (no transform). + * @return {Boolean} + */ + isIdentity: function () { + var elements = this.elements; + + return elements[0] === 1 && + elements[1] === 0 && + elements[2] === 0 && + elements[3] === 1 && + elements[4] === 0 && + elements[5] === 0; + }, + + /** + * Determines if this matrix has the same values as another matrix. + * @param {Ext.draw.Matrix} matrix + * @return {Boolean} + */ + equals: function (matrix) { + var elements = this.elements, + elements2 = matrix.elements; + + return elements[0] === elements2[0] && + elements[1] === elements2[1] && + elements[2] === elements2[2] && + elements[3] === elements2[3] && + elements[4] === elements2[4] && + elements[5] === elements2[5]; + }, + + /** + * Create an array of elements by horizontal order (xx,yx,dx,yx,yy,dy). + * @return {Array} + */ + toArray: function () { + var elements = this.elements; + return [elements[0], elements[2], elements[4], elements[1], elements[3], elements[5]]; + }, + + /** + * Create an array of elements by vertical order (xx,xy,yx,yy,dx,dy). + * @return {Array|String} + */ + toVerticalArray: function () { + return this.elements.slice(); + }, + + /** + * Get an array of elements. + * The numbers are rounded to keep only 4 decimals. + * @return {Array} + */ + toString: function () { + var me = this; + return [me.get(0, 0), me.get(0, 1), me.get(1, 0), me.get(1, 1), me.get(2, 0), me.get(2, 1)].join(','); + }, + + /** + * Apply the matrix to a drawing context. + * @param {Object} ctx + * @return {Ext.draw.Matrix} this + */ + toContext: function (ctx) { + ctx.transform.apply(ctx, this.elements); + return this; + }, + + /** + * Return a string that can be used as transform attribute in SVG. + * @return {String} + */ + toSvg: function () { + var elements = this.elements; + // The reason why we cannot use `.join` is the `1e5` form is not accepted in svg. + return "matrix(" + + elements[0].toFixed(9) + ',' + + elements[1].toFixed(9) + ',' + + elements[2].toFixed(9) + ',' + + elements[3].toFixed(9) + ',' + + elements[4].toFixed(9) + ',' + + elements[5].toFixed(9) + + ")"; + }, + + /** + * Get the x scale of the matrix. + * @return {Number} + */ + getScaleX: function () { + var elements = this.elements; + return Math.sqrt(elements[0] * elements[0] + elements[2] * elements[2]); + }, + + /** + * Get the y scale of the matrix. + * @return {Number} + */ + getScaleY: function () { + var elements = this.elements; + return Math.sqrt(elements[1] * elements[1] + elements[3] * elements[3]); + }, + + /** + * Get x-to-x component of the matrix + * @return {Number} + */ + getXX: function () { + return this.elements[0]; + }, + + /** + * Get x-to-y component of the matrix. + * @return {Number} + */ + getXY: function () { + return this.elements[1]; + }, + + /** + * Get y-to-x component of the matrix. + * @return {Number} + */ + getYX: function () { + return this.elements[2]; + }, + + /** + * Get y-to-y component of the matrix. + * @return {Number} + */ + getYY: function () { + return this.elements[3]; + }, + + /** + * Get offset x component of the matrix. + * @return {Number} + */ + getDX: function () { + return this.elements[4]; + }, + + /** + * Get offset y component of the matrix. + * @return {Number} + */ + getDY: function () { + return this.elements[5]; + }, + + /** + * Split matrix into Translate, Scale, Shear, and Rotate. + * @return {Object} + */ + split: function () { + var el = this.elements, + xx = el[0], + xy = el[1], + yx = el[2], + yy = el[3], + out = { + translateX: el[4], + translateY: el[5] + }; + out.scaleX = Math.sqrt(xx * xx + yx * yx); + out.shear = (xx * xy + yx * yy) / out.scaleX; + xy -= out.shear * xx; + yy -= out.shear * yx; + out.scaleY = Math.sqrt(xy * xy + yy * yy); + out.shear /= out.scaleY; + out.rotation = -Math.atan2(yx / out.scaleX, xy / out.scaleY); + out.isSimple = Math.abs(out.shear) < 1e-9 && (!out.rotation || Math.abs(out.scaleX - out.scaleY) < 1e-9); + return out; + } +}, function () { + function registerName(properties, name, i) { + properties[name] = { + get: function () { + return this.elements[i]; + }, + set: function (val) { + this.elements[i] = val; + } + }; + } + + // Compatibility with SVGMatrix + // https://developer.mozilla.org/en/DOM/SVGMatrix + if (Object.defineProperties) { + var properties = {}; + /** + * @property {Number} a Get x-to-x component of the matrix. Avoid using it for performance consideration. + * Use {@link #getXX} instead. + */ + registerName(properties, 'a', 0); + + // TODO: Help me finish this. + registerName(properties, 'b', 1); + registerName(properties, 'c', 2); + registerName(properties, 'd', 3); + registerName(properties, 'e', 4); + registerName(properties, 'f', 5); + Object.defineProperties(this.prototype, properties); + } + + /** + * Postpend a matrix onto the current. + * + * __Note:__ The given transform will come before the current one. + * + * @method + * @param {Ext.draw.Matrix} matrix + * @return {Ext.draw.Matrix} this + */ + this.prototype.multiply = this.prototype.appendMatrix; + // + this.prototype.postpend = this.prototype.append; + this.prototype.postpendMatrix = this.prototype.appendMatrix; + // +}); diff --git a/vendor/touch/src/draw/Path.js b/vendor/touch/src/draw/Path.js new file mode 100644 index 000000000..473432bf9 --- /dev/null +++ b/vendor/touch/src/draw/Path.js @@ -0,0 +1,1181 @@ +/** + * Class representing a path. + * Designed to be compatible with [CanvasPathMethods](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#canvaspathmethods) + * and will hopefully be replaced by the browsers' implementation of the Path object. + */ +Ext.define('Ext.draw.Path', { + requires: ['Ext.draw.Draw', 'Ext.draw.Solver'], + statics: { + pathRe: /,?([achlmqrstvxz]),?/gi, + pathRe2: /-/gi, + pathSplitRe: /\s|,/g + }, + svgString: '', + + /** + * Create a path from pathString + * @constructor + * @param {String} pathString + */ + constructor: function (pathString) { + var me = this; + me.coords = []; + me.types = []; + me.cursor = null; + me.startX = 0; + me.startY = 0; + me.solvers = {}; + if (pathString) { + me.fromSvgString(pathString); + } + }, + + /** + * Clear the path. + */ + clear: function () { + var me = this; + me.coords.length = 0; + me.types.length = 0; + me.cursor = null; + me.startX = 0; + me.startY = 0; + me.solvers = {}; + me.dirt(); + }, + + /** + * @private + */ + dirt: function () { + this.svgString = ''; + }, + + /** + * Move to a position. + * @param {Number} x + * @param {Number} y + */ + moveTo: function (x, y) { + var me = this; + if (!me.cursor) { + me.cursor = [x, y]; + } + me.coords.push(x, y); + me.types.push('M'); + me.startX = x; + me.startY = y; + me.cursor[0] = x; + me.cursor[1] = y; + me.dirt(); + }, + + /** + * A straight line to a position. + * @param {Number} x + * @param {Number} y + */ + lineTo: function (x, y) { + var me = this; + if (!me.cursor) { + me.cursor = [x, y]; + me.coords.push(x, y); + me.types.push('M'); + } else { + me.coords.push(x, y); + me.types.push('L'); + } + me.cursor[0] = x; + me.cursor[1] = y; + me.dirt(); + }, + + /** + * A cubic bezier curve to a position. + * @param {Number} cx1 + * @param {Number} cy1 + * @param {Number} cx2 + * @param {Number} cy2 + * @param {Number} x + * @param {Number} y + */ + bezierCurveTo: function (cx1, cy1, cx2, cy2, x, y) { + var me = this; + if (!me.cursor) { + me.moveTo(cx1, cy1); + } + me.coords.push(cx1, cy1, cx2, cy2, x, y); + me.types.push('C'); + me.cursor[0] = x; + me.cursor[1] = y; + me.dirt(); + }, + + /** + * A quadratic bezier curve to a position. + * @param {Number} cx + * @param {Number} cy + * @param {Number} x + * @param {Number} y + */ + quadraticCurveTo: function (cx, cy, x, y) { + var me = this; + if (!me.cursor) { + me.moveTo(cx, cy); + } + me.bezierCurveTo( + (me.cursor[0] * 2 + cx) / 3, (me.cursor[1] * 2 + cy) / 3, + (x * 2 + cx) / 3, (y * 2 + cy) / 3, + x, y + ); + }, + + /** + * Close this path with a straight line. + */ + closePath: function () { + var me = this; + if (me.cursor) { + me.types.push('Z'); + me.dirt(); + } + }, + + /** + * Create a elliptic arc curve compatible with SVG's arc to instruction. + * + * The curve start from (`x1`, `y1`) and ends at (`x2`, `y2`). The ellipse + * has radius `rx` and `ry` and a rotation of `rotation`. + * @param {Number} x1 + * @param {Number} y1 + * @param {Number} x2 + * @param {Number} y2 + * @param {Number} [rx] + * @param {Number} [ry] + * @param {Number} [rotation] + */ + arcTo: function (x1, y1, x2, y2, rx, ry, rotation) { + var me = this; + if (ry === undefined) { + ry = rx; + } + + if (rotation === undefined) { + rotation = 0; + } + + if (!me.cursor) { + me.moveTo(x1, y1); + return; + } + + if (rx === 0 || ry === 0) { + me.lineTo(x1, y1); + return; + } + + x2 -= x1; + y2 -= y1; + + var x0 = me.cursor[0] - x1, + y0 = me.cursor[1] - y1, + area = x2 * y0 - y2 * x0, + cos, sin, xx, yx, xy, yy, + l0 = Math.sqrt(x0 * x0 + y0 * y0), + l2 = Math.sqrt(x2 * x2 + y2 * y2), + dist, cx, cy; + // cos rx, -sin ry , x1 - cos rx x1 + ry sin y1 + // sin rx, cos ry, -rx sin x1 + y1 - cos ry y1 + if (area === 0) { + me.lineTo(x1, y1); + return; + } + + if (ry !== rx) { + cos = Math.cos(rotation); + sin = Math.sin(rotation); + xx = cos / rx; + yx = sin / ry; + xy = -sin / rx; + yy = cos / ry; + var temp = xx * x0 + yx * y0; + y0 = xy * x0 + yy * y0; + x0 = temp; + temp = xx * x2 + yx * y2; + y2 = xy * x2 + yy * y2; + x2 = temp; + } else { + x0 /= rx; + y0 /= ry; + x2 /= rx; + y2 /= ry; + } + + cx = x0 * l2 + x2 * l0; + cy = y0 * l2 + y2 * l0; + dist = 1 / (Math.sin(Math.asin(Math.abs(area) / (l0 * l2)) * 0.5) * Math.sqrt(cx * cx + cy * cy)); + cx *= dist; + cy *= dist; + + var k0 = (cx * x0 + cy * y0) / (x0 * x0 + y0 * y0), + k2 = (cx * x2 + cy * y2) / (x2 * x2 + y2 * y2); + var cosStart = x0 * k0 - cx, + sinStart = y0 * k0 - cy, + cosEnd = x2 * k2 - cx, + sinEnd = y2 * k2 - cy, + startAngle = Math.atan2(sinStart, cosStart), + endAngle = Math.atan2(sinEnd, cosEnd); + if (area > 0) { + if (endAngle < startAngle) { + endAngle += Math.PI * 2; + } + } else { + if (startAngle < endAngle) { + startAngle += Math.PI * 2; + } + } + if (ry !== rx) { + cx = cos * cx * rx - sin * cy * ry + x1; + cy = sin * cy * ry + cos * cy * ry + y1; + me.lineTo(cos * rx * cosStart - sin * ry * sinStart + cx, + sin * rx * cosStart + cos * ry * sinStart + cy); + me.ellipse(cx, cy, rx, ry, rotation, startAngle, endAngle, area < 0); + } else { + cx = cx * rx + x1; + cy = cy * ry + y1; + me.lineTo(rx * cosStart + cx, ry * sinStart + cy); + me.ellipse(cx, cy, rx, ry, rotation, startAngle, endAngle, area < 0); + } + }, + + /** + * Create an elliptic arc. + * + * See [the whatwg reference of ellipse](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-ellipse). + * + * @param {Number} cx + * @param {Number} cy + * @param {Number} radiusX + * @param {Number} radiusY + * @param {Number} rotation + * @param {Number} startAngle + * @param {Number} endAngle + * @param {Number} anticlockwise + */ + ellipse: function (cx, cy, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) { + var me = this, + coords = me.coords, + start = coords.length, count, + i, j; + if (endAngle - startAngle >= Math.PI * 2) { + me.ellipse(cx, cy, radiusX, radiusY, rotation, startAngle, startAngle + Math.PI, anticlockwise); + me.ellipse(cx, cy, radiusX, radiusY, rotation, startAngle + Math.PI, endAngle, anticlockwise); + return; + } + if (!anticlockwise) { + if (endAngle < startAngle) { + endAngle += Math.PI * 2; + } + count = me.approximateArc(coords, cx, cy, radiusX, radiusY, rotation, startAngle, endAngle); + } else { + if (startAngle < endAngle) { + startAngle += Math.PI * 2; + } + count = me.approximateArc(coords, cx, cy, radiusX, radiusY, rotation, endAngle, startAngle); + for (i = start, j = coords.length - 2; i < j; i += 2, j -= 2) { + var temp = coords[i]; + coords[i] = coords[j]; + coords[j] = temp; + temp = coords[i + 1]; + coords[i + 1] = coords[j + 1]; + coords[j + 1] = temp; + } + } + + if (!me.cursor) { + me.cursor = [coords[coords.length - 2], coords[coords.length - 1]]; + me.types.push('M'); + } else { + me.cursor[0] = coords[coords.length - 2]; + me.cursor[1] = coords[coords.length - 1]; + me.types.push('L'); + } + + for (i = 2; i < count; i += 6) { + me.types.push('C'); + } + me.dirt(); + }, + + /** + * Create an circular arc. + * + * @param {Number} x + * @param {Number} y + * @param {Number} radius + * @param {Number} startAngle + * @param {Number} endAngle + * @param {Number} anticlockwise + */ + arc: function (x, y, radius, startAngle, endAngle, anticlockwise) { + this.ellipse(x, y, radius, radius, 0, startAngle, endAngle, anticlockwise); + }, + + /** + * Draw a rectangle and close it. + * + * @param {Number} x + * @param {Number} y + * @param {Number} width + * @param {Number} height + */ + rect: function (x, y, width, height) { + if (width == 0 || height == 0) { + return; + } + var me = this; + me.moveTo(x, y); + me.lineTo(x + width, y); + me.lineTo(x + width, y + height); + me.lineTo(x, y + height); + me.closePath(); + }, + + /** + * @private + * @param {Array} result + * @param {Number} cx + * @param {Number} cy + * @param {Number} rx + * @param {Number} ry + * @param {Number} phi + * @param {Number} theta1 + * @param {Number} theta2 + * @return {Number} + */ + approximateArc: function (result, cx, cy, rx, ry, phi, theta1, theta2) { + var cosPhi = Math.cos(phi), + sinPhi = Math.sin(phi), + cosTheta1 = Math.cos(theta1), + sinTheta1 = Math.sin(theta1), + xx = cosPhi * cosTheta1 * rx - sinPhi * sinTheta1 * ry, + yx = -cosPhi * sinTheta1 * rx - sinPhi * cosTheta1 * ry, + xy = sinPhi * cosTheta1 * rx + cosPhi * sinTheta1 * ry, + yy = -sinPhi * sinTheta1 * rx + cosPhi * cosTheta1 * ry, + rightAngle = Math.PI / 2, + count = 2, + exx = xx, + eyx = yx, + exy = xy, + eyy = yy, + rho = 0.547443256150549, + temp, y1, x3, y3, x2, y2; + + theta2 -= theta1; + if (theta2 < 0) { + theta2 += Math.PI * 2; + } + result.push(xx + cx, xy + cy); + while (theta2 >= rightAngle) { + result.push( + exx + eyx * rho + cx, exy + eyy * rho + cy, + exx * rho + eyx + cx, exy * rho + eyy + cy, + eyx + cx, eyy + cy + ); + count += 6; + theta2 -= rightAngle; + temp = exx; + exx = eyx; + eyx = -temp; + temp = exy; + exy = eyy; + eyy = -temp; + } + if (theta2) { + y1 = (0.3294738052815987 + 0.012120855841304373 * theta2) * theta2; + x3 = Math.cos(theta2); + y3 = Math.sin(theta2); + x2 = x3 + y1 * y3; + y2 = y3 - y1 * x3; + result.push( + exx + eyx * y1 + cx, exy + eyy * y1 + cy, + exx * x2 + eyx * y2 + cx, exy * x2 + eyy * y2 + cy, + exx * x3 + eyx * y3 + cx, exy * x3 + eyy * y3 + cy + ); + count += 6; + } + return count; + }, + + /** + * [http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes](http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes) + * @param {Number} rx + * @param {Number} ry + * @param {Number} rotation Differ from svg spec, this is radian. + * @param {Number} fA + * @param {Number} fS + * @param {Number} x2 + * @param {Number} y2 + */ + arcSvg: function (rx, ry, rotation, fA, fS, x2, y2) { + if (rx < 0) { + rx = -rx; + } + if (ry < 0) { + ry = -ry; + } + var me = this, + x1 = me.cursor[0], + y1 = me.cursor[1], + hdx = (x1 - x2) / 2, + hdy = (y1 - y2) / 2, + cosPhi = Math.cos(rotation), + sinPhi = Math.sin(rotation), + xp = hdx * cosPhi + hdy * sinPhi, + yp = -hdx * sinPhi + hdy * cosPhi, + ratX = xp / rx, + ratY = yp / ry, + lambda = ratX * ratX + ratY * ratY, + cx = (x1 + x2) * 0.5, cy = (y1 + y2) * 0.5, + cpx = 0, cpy = 0; + if (lambda >= 1) { + lambda = Math.sqrt(lambda); + rx *= lambda; + ry *= lambda; + // me gives lambda == cpx == cpy == 0; + } else { + lambda = Math.sqrt(1 / lambda - 1); + if (fA === fS) { + lambda = -lambda; + } + cpx = lambda * rx * ratY; + cpy = -lambda * ry * ratX; + cx += cosPhi * cpx - sinPhi * cpy; + cy += sinPhi * cpx + cosPhi * cpy; + } + + var theta1 = Math.atan2((yp - cpy) / ry, (xp - cpx) / rx), + deltaTheta = Math.atan2((-yp - cpy) / ry, (-xp - cpx) / rx) - theta1; + + if (fS) { + if (deltaTheta <= 0) { + deltaTheta += Math.PI * 2; + } + } else { + if (deltaTheta >= 0) { + deltaTheta -= Math.PI * 2; + } + } + me.ellipse(cx, cy, rx, ry, rotation, theta1, theta1 + deltaTheta, 1 - fS); + }, + + /** + * Feed the path from svg path string. + * @param {String} pathString + */ + fromSvgString: function (pathString) { + if (!pathString) { + return; + } + var me = this, + parts, + paramCounts = { + a: 7, c: 6, h: 1, l: 2, m: 2, q: 4, s: 4, t: 2, v: 1, z: 0, + A: 7, C: 6, H: 1, L: 2, M: 2, Q: 4, S: 4, T: 2, V: 1, Z: 0 + }, + lastCommand = '', + lastControlX, lastControlY, + lastX = 0, lastY = 0, + part = false, i, partLength, relative; + + // Split the string to items. + if (Ext.isString(pathString)) { + parts = pathString.replace(Ext.draw.Path.pathRe, " $1 ").replace(Ext.draw.Path.pathRe2, " -").split(Ext.draw.Path.pathSplitRe); + } else if (Ext.isArray(pathString)) { + parts = pathString.join(',').split(Ext.draw.Path.pathSplitRe); + } + + // Remove empty entries + for (i = 0, partLength = 0; i < parts.length; i++) { + if (parts[i] !== '') { + parts[partLength++] = parts[i]; + } + } + parts.length = partLength; + + me.clear(); + for (i = 0; i < parts.length;) { + lastCommand = part; + part = parts[i]; + relative = (part.toUpperCase() !== part); + i++; + switch (part) { + case 'M': + me.moveTo(lastX = +parts[i], lastY = +parts[i + 1]); + i += 2; + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.lineTo(lastX = +parts[i], lastY = +parts[i + 1]); + i += 2; + } + break; + case 'L': + me.lineTo(lastX = +parts[i], lastY = +parts[i + 1]); + i += 2; + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.lineTo(lastX = +parts[i], lastY = +parts[i + 1]); + i += 2; + } + break; + case 'A': + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.arcSvg( + +parts[i], +parts[i + 1], + +parts[i + 2] * Math.PI / 180, + +parts[i + 3], +parts[i + 4], + lastX = +parts[i + 5], lastY = +parts[i + 6]); + i += 7; + } + break; + case 'C': + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.bezierCurveTo( + +parts[i ], +parts[i + 1], + lastControlX = +parts[i + 2], lastControlY = +parts[i + 3], + lastX = +parts[i + 4], lastY = +parts[i + 5]); + i += 6; + } + break; + case 'Z': + me.closePath(); + break; + case 'm': + me.moveTo(lastX += +parts[i], lastY += +parts[i + 1]); + i += 2; + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.lineTo(lastX += +parts[i], lastY += +parts[i + 1]); + i += 2; + } + break; + case 'l': + me.lineTo(lastX += +parts[i], lastY += +parts[i + 1]); + i += 2; + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.lineTo(lastX += +parts[i], lastY += +parts[i + 1]); + i += 2; + } + break; + case 'a': + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.arcSvg( + +parts[i], +parts[i + 1], + +parts[i + 2] * Math.PI / 180, + +parts[i + 3], +parts[i + 4], + lastX += +parts[i + 5], lastY += +parts[i + 6]); + i += 7; + } + break; + case 'c': + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.bezierCurveTo(lastX + (+parts[i]), lastY + (+parts[i + 1]), + lastControlX = lastX + (+parts[i + 2]), lastControlY = lastY + (+parts[i + 3]), + lastX += +parts[i + 4], lastY += +parts[i + 5]); + i += 6; + } + break; + case 'z': + me.closePath(); + break; + case 's': + if (!(lastCommand === 'c' || lastCommand === 'C' || lastCommand === 's' || lastCommand === 'S')) { + lastControlX = lastX; + lastControlY = lastY; + } + + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.bezierCurveTo( + lastX + lastX - lastControlX, lastY + lastY - lastControlY, + lastControlX = lastX + (+parts[i]), lastControlY = lastY + (+parts[i + 1]), + lastX += +parts[i + 2], lastY += +parts[i + 3]); + i += 4; + } + break; + case 'S': + if (!(lastCommand === 'c' || lastCommand === 'C' || lastCommand === 's' || lastCommand === 'S')) { + lastControlX = lastX; + lastControlY = lastY; + } + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.bezierCurveTo( + lastX + lastX - lastControlX, lastY + lastY - lastControlY, + lastControlX = +parts[i], lastControlY = +parts[i + 1], + lastX = (+parts[i + 2]), lastY = (+parts[i + 3])); + i += 4; + } + break; + case 'q': + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.quadraticCurveTo( + lastControlX = lastX + (+parts[i]), lastControlY = lastY + (+parts[i + 1]), + lastX += +parts[i + 2], lastY += +parts[i + 3]); + i += 4; + } + break; + case 'Q': + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.quadraticCurveTo( + lastControlX = +parts[i], lastControlY = +parts[i + 1], + lastX = +parts[i + 2], lastY = +parts[i + 3]); + i += 4; + } + break; + case 't': + if (!(lastCommand === 'q' || lastCommand === 'Q' || lastCommand === 't' || lastCommand === 'T')) { + lastControlX = lastX; + lastControlY = lastY; + } + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.quadraticCurveTo( + lastControlX = lastX + lastX - lastControlX, lastControlY = lastY + lastY - lastControlY, + lastX += +parts[i + 1], lastY += +parts[i + 2]); + i += 2; + } + break; + case 'T': + if (!(lastCommand === 'q' || lastCommand === 'Q' || lastCommand === 't' || lastCommand === 'T')) { + lastControlX = lastX; + lastControlY = lastY; + } + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.quadraticCurveTo( + lastControlX = lastX + lastX - lastControlX, lastControlY = lastY + lastY - lastControlY, + lastX = (+parts[i + 1]), lastY = (+parts[i + 2])); + i += 2; + } + break; + case 'h': + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.lineTo(lastX += +parts[i], lastY); + i++; + } + break; + case 'H': + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.lineTo(lastX = +parts[i], lastY); + i++; + } + break; + case 'v': + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.lineTo(lastX, lastY += +parts[i]); + i++; + } + break; + case 'V': + while (i < partLength && !paramCounts.hasOwnProperty(parts[i])) { + me.lineTo(lastX, lastY = +parts[i]); + i++; + } + break; + } + } + }, + + /** + * @private + * @param {Number} x1 + * @param {Number} y1 + * @param {Number} x2 + * @param {Number} y2 + * @param {Number} x + * @param {Number} y + * @return {Number} + */ + rayTestLine: function (x1, y1, x2, y2, x, y) { + var cx; + if (y1 === y2) { + if (y === y1) { + if (Math.min(x1, x2) <= x && x <= Math.max(x1, x2)) { + return -1; + } + } else { + return 0; + } + } + if (y1 < y && y < y2 || y2 < y && y < y1) { + cx = (y - y1) * (x2 - x1) / (y2 - y1) + x1; + if (cx === x) { + return -1; + } else if (cx < x) { + return 0; + } else { + return 1; + } + } else { + return 0; + } + }, + + /** + * @private + * @param {Number} x1 + * @param {Number} y1 + * @param {Number} x2 + * @param {Number} y2 + * @param {Number} x3 + * @param {Number} y3 + * @param {Number} x4 + * @param {Number} y4 + * @param {Number} x + * @param {Number} y + * @param {Number} idx + * @return {*} + */ + rayTestCubicBezier: function (x1, y1, x2, y2, x3, y3, x4, y4, x, y, idx) { + if (Math.min(x1, x2, x3, x4) <= x && x <= Math.max(x1, x2, x3, x4)) { + if (Math.min(y1, y2, y3, y4) <= y && y <= Math.max(y1, y2, y3, y4)) { + var me = this, + solver = me.solvers[idx] || (me.solvers[idx] = Ext.draw.Solver.createBezierSolver(x1, x2, x3, x4)), + result = solver.solve(y); + return (+(x <= result[0] && 0 <= result[0] && result[0] <= 1)) + + (+(x <= result[1] && 0 <= result[1] && result[1] <= 1)) + + (+(x <= result[2] && 0 <= result[2] && result[2] <= 1)); + } + } + return 0; + }, + + /** + * Test whether the given point is on or inside the path. + * @param {Number} x + * @param {Number} y + * @return {Boolean} + */ + isPointInPath: function (x, y) { + var me = this, + i, j, count = 0, test = 0, + types = me.types, + coords = me.coords, + ln = types.length, firstX = null, firstY = null, lastX = 0, lastY = 0; + for (i = 0, j = 0; i < ln; i++) { + switch (types[i]) { + case 'M': + if (firstX !== null) { + test = me.rayTestLine(firstX, firstY, lastX, lastY, x, y); + if (test < 0) { + count += 1; + } else { + count += test; + } + } + firstX = lastX = coords[j]; + firstY = lastY = coords[j + 1]; + j += 2; + break; + case 'L': + test = me.rayTestLine(lastX, lastY, coords[j], coords[j + 1], x, y); + if (test < 0) { + return true; + } + count += test; + lastX = coords[j]; + lastY = coords[j + 1]; + j += 2; + break; + case 'C': + test = me.rayTestCubicBezier( + lastX, lastY, + coords[j], coords[j + 1], + coords[j + 2], coords[j + 3], + coords[j + 4], coords[j + 5], + x, y, i); + if (test < 0) { + return true; + } + count += test; + lastX = coords[j + 4]; + lastY = coords[j + 5]; + j += 6; + break; + case 'Z': + break; + } + } + return count % 2 === 1; + }, + + /** + * Clone this path. + * @return {Ext.draw.Path} + */ + clone: function () { + var me = this, + path = new Ext.draw.Path(); + path.coords = me.coords.slice(0); + path.types = me.types.slice(0); + path.cursor = me.cursor ? me.cursor.slice(0) : null; + path.startX = me.startX; + path.startY = me.startY; + path.svgString = me.svgString; + return path; + }, + + /** + * Transform the current path by a matrix. + * @param {Ext.draw.Matrix} matrix + */ + transform: function (matrix) { + if (matrix.isIdentity()) { + return; + } + var xx = matrix.getXX(), yx = matrix.getYX(), dx = matrix.getDX(), + xy = matrix.getXY(), yy = matrix.getYY(), dy = matrix.getDY(), + coords = this.coords, + i = 0, ln = coords.length, + x, y; + + for (; i < ln; i += 2) { + x = coords[i]; + y = coords[i + 1]; + coords[i] = x * xx + y * yx + dx; + coords[i + 1] = x * xy + y * yy + dy; + } + this.dirt(); + }, + + /** + * Get the bounding box of this matrix. + * @param {Object} [target] Optional object to receive the result. + * + * @return {Object} Object with x, y, width and height + */ + getDimension: function (target) { + if (!target) { + target = {}; + } + + if (!this.types || !this.types.length) { + target.x = 0; + target.y = 0; + target.width = 0; + target.height = 0; + return target; + } + + target.left = Infinity; + target.top = Infinity; + target.right = -Infinity; + target.bottom = -Infinity; + var i = 0, j = 0, + types = this.types, + coords = this.coords, + ln = types.length, x, y; + for (; i < ln; i++) { + switch (types[i]) { + case 'M': + case 'L': + x = coords[j]; + y = coords[j + 1]; + target.left = Math.min(x, target.left); + target.top = Math.min(y, target.top); + target.right = Math.max(x, target.right); + target.bottom = Math.max(y, target.bottom); + j += 2; + break; + case 'C': + this.expandDimension(target, x, y, + coords[j], coords[j + 1], + coords[j + 2], coords[j + 3], + x = coords[j + 4], y = coords[j + 5]); + j += 6; + break; + } + } + + target.x = target.left; + target.y = target.top; + target.width = target.right - target.left; + target.height = target.bottom - target.top; + return target; + }, + + /** + * Get the bounding box as if the path is transformed by a matrix. + * + * @param {Ext.draw.Matrix} matrix + * @param {Object} [target] Optional object to receive the result. + * + * @return {Object} An object with x, y, width and height. + */ + getDimensionWithTransform: function (matrix, target) { + if (!this.types || !this.types.length) { + if (!target) { + target = {}; + } + target.x = 0; + target.y = 0; + target.width = 0; + target.height = 0; + return target; + } + + target.left = Infinity; + target.top = Infinity; + target.right = -Infinity; + target.bottom = -Infinity; + + var xx = matrix.getXX(), yx = matrix.getYX(), dx = matrix.getDX(), + xy = matrix.getXY(), yy = matrix.getYY(), dy = matrix.getDY(), + i = 0, j = 0, + types = this.types, + coords = this.coords, + ln = types.length, x, y; + for (; i < ln; i++) { + switch (types[i]) { + case 'M': + case 'L': + x = coords[j] * xx + coords[j + 1] * yx + dx; + y = coords[j] * xy + coords[j + 1] * yy + dy; + target.left = Math.min(x, target.left); + target.top = Math.min(y, target.top); + target.right = Math.max(x, target.right); + target.bottom = Math.max(y, target.bottom); + j += 2; + break; + case 'C': + this.expandDimension(target, + x, y, + coords[j] * xx + coords[j + 1] * yx + dx, + coords[j] * xy + coords[j + 1] * yy + dy, + coords[j + 2] * xx + coords[j + 3] * yx + dx, + coords[j + 2] * xy + coords[j + 3] * yy + dy, + x = coords[j + 4] * xx + coords[j + 5] * yx + dx, + y = coords[j + 4] * xy + coords[j + 5] * yy + dy); + j += 6; + break; + } + } + if (!target) { + target = {}; + } + target.x = target.left; + target.y = target.top; + target.width = target.right - target.left; + target.height = target.bottom - target.top; + return target; + }, + + /** + * @private + * Expand the rect by the bbox of a bezier curve. + * + * @param {Object} target + * @param {Number} x1 + * @param {Number} y1 + * @param {Number} cx1 + * @param {Number} cy1 + * @param {Number} cx2 + * @param {Number} cy2 + * @param {Number} x2 + * @param {Number} y2 + */ + expandDimension: function (target, x1, y1, cx1, cy1, cx2, cy2, x2, y2) { + var me = this, + l = target.left, r = target.right, t = target.top, b = target.bottom, + dim = me.dim || (me.dim = []); + + me.curveDimension(x1, cx1, cx2, x2, dim); + l = Math.min(l, dim[0]); + r = Math.max(r, dim[1]); + + me.curveDimension(y1, cy1, cy2, y2, dim); + t = Math.min(t, dim[0]); + b = Math.max(b, dim[1]); + + target.left = l; + target.right = r; + target.top = t; + target.bottom = b; + }, + + /** + * @private + * Determine the curve + * @param {Number} a + * @param {Number} b + * @param {Number} c + * @param {Number} d + * @param {Number} dim + */ + curveDimension: function (a, b, c, d, dim) { + var qa = 3 * (-a + 3 * (b - c) + d), + qb = 6 * (a - 2 * b + c), + qc = -3 * (a - b), x, y, + min = Math.min(a, d), + max = Math.max(a, d), delta; + + if (qa === 0) { + if (qb === 0) { + dim[0] = min; + dim[1] = max; + return; + } else { + x = -qc / qb; + if (0 < x && x < 1) { + y = this.interpolate(a, b, c, d, x); + min = Math.min(min, y); + max = Math.max(max, y); + } + } + } else { + delta = qb * qb - 4 * qa * qc; + if (delta >= 0) { + delta = Math.sqrt(delta); + x = (delta - qb) / 2 / qa; + if (0 < x && x < 1) { + y = this.interpolate(a, b, c, d, x); + min = Math.min(min, y); + max = Math.max(max, y); + } + if (delta > 0) { + x -= delta / qa; + if (0 < x && x < 1) { + y = this.interpolate(a, b, c, d, x); + min = Math.min(min, y); + max = Math.max(max, y); + } + } + } + } + dim[0] = min; + dim[1] = max; + }, + + /** + * @private + * + * Returns `a * (1 - t) ^ 3 + 3 * b (1 - t) ^ 2 * t + 3 * c (1 - t) * t ^ 3 + d * t ^ 3`. + * + * @param {Number} a + * @param {Number} b + * @param {Number} c + * @param {Number} d + * @param {Number} t + * @return {Number} + */ + interpolate: function (a, b, c, d, t) { + if (t === 0) { + return a; + } + if (t === 1) { + return d; + } + var rate = (1 - t) / t; + return t * t * t * (d + rate * (3 * c + rate * (3 * b + rate * a))); + }, + + /** + * Reconstruct path from cubic bezier curve stripes. + * @param {Array} stripes + */ + fromStripes: function (stripes) { + var me = this, + i = 0, ln = stripes.length, + j, ln2, stripe; + me.clear(); + for (; i < ln; i++) { + stripe = stripes[i]; + me.coords.push.apply(me.coords, stripe); + me.types.push('M'); + for (j = 2, ln2 = stripe.length; j < ln2; j += 6) { + me.types.push('C'); + } + } + if (!me.cursor) { + me.cursor = []; + } + me.cursor[0] = me.coords[me.coords.length - 2]; + me.cursor[1] = me.coords[me.coords.length - 1]; + me.dirt(); + }, + + /** + * Convert path to bezier curve stripes. + * @param {Array} [target] The optional array to receive the result. + * @return {Array} + */ + toStripes: function (target) { + var stripes = target || [], curr, + x, y, lastX, lastY, startX, startY, + i, j, + types = this.types, + coords = this.coords, + ln = types.length; + for (i = 0, j = 0; i < ln; i++) { + switch (types[i]) { + case 'M': + curr = [startX = lastX = coords[j++], startY = lastY = coords[j++]]; + stripes.push(curr); + break; + case 'L': + x = coords[j++]; + y = coords[j++]; + curr.push((lastX + lastX + x) / 3, (lastY + lastY + y) / 3, (lastX + x + x) / 3, (lastY + y + y) / 3, lastX = x, lastY = y); + break; + case 'C': + curr.push(coords[j++], coords[j++], coords[j++], coords[j++], lastX = coords[j++], lastY = coords[j++]); + break; + case 'Z': + x = startX; + y = startY; + curr.push((lastX + lastX + x) / 3, (lastY + lastY + y) / 3, (lastX + x + x) / 3, (lastY + y + y) / 3, lastX = x, lastY = y); + break; + } + } + return stripes; + }, + + /** + * @private + * Update cache for svg string of this path. + */ + updateSvgString: function () { + var result = [], + types = this.types, + coords = this.coords, + ln = types.length, + i = 0, j = 0; + for (; i < ln; i++) { + switch (types[i]) { + case 'M': + result.push('M' + coords[j] + ',' + coords[j + 1]); + j += 2; + break; + case 'L': + result.push('L' + coords[j] + ',' + coords[j + 1]); + j += 2; + break; + case 'C': + result.push('C' + coords[j] + ',' + coords[j + 1] + ' ' + + coords[j + 2] + ',' + coords[j + 3] + ' ' + + coords[j + 4] + ',' + coords[j + 5]); + j += 6; + break; + case 'Z': + result.push('Z'); + break; + } + } + this.svgString = result.join(''); + }, + + /** + * Return an svg path string for this path. + * @return {String} + */ + toString: function () { + if (!this.svgString) { + this.updateSvgString(); + } + return this.svgString; + } +}); diff --git a/vendor/touch/src/draw/SegmentTree.js b/vendor/touch/src/draw/SegmentTree.js new file mode 100644 index 000000000..39ac2bc65 --- /dev/null +++ b/vendor/touch/src/draw/SegmentTree.js @@ -0,0 +1,402 @@ +/** + * This class we summarize the data and returns it when required. + */ +Ext.define("Ext.draw.SegmentTree", { + + config: { + strategy: "double" + }, + + /** + * @private + * @param {Object} result + * @param {Number} last + * @param {Number} dataX + * @param {Number} dataOpen + * @param {Number} dataHigh + * @param {Number} dataLow + * @param {Number} dataClose + */ + time: function (result, last, dataX, dataOpen, dataHigh, dataLow, dataClose) { + var start = 0, lastOffset, lastOffsetEnd, + minimum = new Date(dataX[result.startIdx[0]]), + maximum = new Date(dataX[result.endIdx[last - 1]]), + extDate = Ext.Date, + units = [ + [extDate.MILLI, 1, 'ms1', null], + [extDate.MILLI, 2, 'ms2', 'ms1'], + [extDate.MILLI, 5, 'ms5', 'ms1'], + [extDate.MILLI, 10, 'ms10', 'ms5'], + [extDate.MILLI, 50, 'ms50', 'ms10'], + [extDate.MILLI, 100, 'ms100', 'ms50'], + [extDate.MILLI, 500, 'ms500', 'ms100'], + [extDate.SECOND, 1, 's1', 'ms500'], + [extDate.SECOND, 10, 's10', 's1'], + [extDate.SECOND, 30, 's30', 's10'], + [extDate.MINUTE, 1, 'mi1', 's10'], + [extDate.MINUTE, 5, 'mi5', 'mi1'], + [extDate.MINUTE, 10, 'mi10', 'mi5'], + [extDate.MINUTE, 30, 'mi30', 'mi10'], + [extDate.HOUR, 1, 'h1', 'mi30'], + [extDate.HOUR, 6, 'h6', 'h1'], + [extDate.HOUR, 12, 'h12', 'h6'], + [extDate.DAY, 1, 'd1', 'h12'], + [extDate.DAY, 7, 'd7', 'd1'], + [extDate.MONTH, 1, 'mo1', 'd1'], + [extDate.MONTH, 3, 'mo3', 'mo1'], + [extDate.MONTH, 6, 'mo6', 'mo3'], + [extDate.YEAR, 1, 'y1', 'mo3'], + [extDate.YEAR, 5, 'y5', 'y1'], + [extDate.YEAR, 10, 'y10', 'y5'], + [extDate.YEAR, 100, 'y100', 'y10'] + ], unitIdx, currentUnit, + plainStart = start, + plainEnd = last, + first = false, + startIdxs = result.startIdx, + endIdxs = result.endIdx, + minIdxs = result.minIdx, + maxIdxs = result.maxIdx, + opens = result.open, + closes = result.close, + minXs = result.minX, + minYs = result.minY, + maxXs = result.maxX, + maxYs = result.maxY, + i, current; + + for (unitIdx = 0; last > start + 1 && unitIdx < units.length; unitIdx++) { + minimum = new Date(dataX[startIdxs[0]]); + currentUnit = units[unitIdx]; + minimum = extDate.align(minimum, currentUnit[0], currentUnit[1]); + if (extDate.diff(minimum, maximum, currentUnit[0]) > dataX.length * 2 * currentUnit[1]) { + continue; + } + if (currentUnit[3] && result.map['time_' + currentUnit[3]]) { + lastOffset = result.map['time_' + currentUnit[3]][0]; + lastOffsetEnd = result.map['time_' + currentUnit[3]][1]; + } else { + lastOffset = plainStart; + lastOffsetEnd = plainEnd; + } + + start = last; + current = minimum; + first = true; + + startIdxs[last] = startIdxs[lastOffset]; + endIdxs[last] = endIdxs[lastOffset]; + minIdxs[last] = minIdxs[lastOffset]; + maxIdxs[last] = maxIdxs[lastOffset]; + opens[last] = opens[lastOffset]; + closes[last] = closes[lastOffset]; + minXs[last] = minXs[lastOffset]; + minYs[last] = minYs[lastOffset]; + maxXs[last] = maxXs[lastOffset]; + maxYs[last] = maxYs[lastOffset]; + current = Ext.Date.add(current, currentUnit[0], currentUnit[1]); + + for (i = lastOffset + 1; i < lastOffsetEnd; i++) { + if (dataX[endIdxs[i]] < +current) { + endIdxs[last] = endIdxs[i]; + closes[last] = closes[i]; + if (maxYs[i] > maxYs[last]) { + maxYs[last] = maxYs[i]; + maxXs[last] = maxXs[i]; + maxIdxs[last] = maxIdxs[i]; + } + if (minYs[i] < minYs[last]) { + minYs[last] = minYs[i]; + minXs[last] = minXs[i]; + minIdxs[last] = minIdxs[i]; + } + } else { + last++; + startIdxs[last] = startIdxs[i]; + endIdxs[last] = endIdxs[i]; + minIdxs[last] = minIdxs[i]; + maxIdxs[last] = maxIdxs[i]; + opens[last] = opens[i]; + closes[last] = closes[i]; + minXs[last] = minXs[i]; + minYs[last] = minYs[i]; + maxXs[last] = maxXs[i]; + maxYs[last] = maxYs[i]; + current = Ext.Date.add(current, currentUnit[0], currentUnit[1]); + } + } + if (last > start) { + result.map['time_' + currentUnit[2]] = [start, last]; + } + } + }, + + /** + * @private + * @param {Object} result + * @param {Number} position + * @param {Number} dataX + * @param {Number} dataOpen + * @param {Number} dataHigh + * @param {Number} dataLow + * @param {Number} dataClose + */ + "double": function (result, position, dataX, dataOpen, dataHigh, dataLow, dataClose) { + var offset = 0, lastOffset, step = 1, + i, + startIdx, + endIdx, + minIdx, + maxIdx, + open, + close, + minX, + minY, + maxX, + maxY; + while (position > offset + 1) { + lastOffset = offset; + offset = position; + step += step; + for (i = lastOffset; i < offset; i += 2) { + if (i === offset - 1) { + startIdx = result.startIdx[i]; + endIdx = result.endIdx[i]; + minIdx = result.minIdx[i]; + maxIdx = result.maxIdx[i]; + open = result.open[i]; + close = result.close[i]; + minX = result.minX[i]; + minY = result.minY[i]; + maxX = result.maxX[i]; + maxY = result.maxY[i]; + } else { + + startIdx = result.startIdx[i]; + endIdx = result.endIdx[i + 1]; + open = result.open[i]; + close = result.close[i]; + if (result.minY[i] <= result.minY[i + 1]) { + minIdx = result.minIdx[i]; + minX = result.minX[i]; + minY = result.minY[i]; + } else { + minIdx = result.minIdx[i + 1]; + minX = result.minX[i + 1]; + minY = result.minY[i + 1]; + } + if (result.maxY[i] >= result.maxY[i + 1]) { + maxIdx = result.maxIdx[i]; + maxX = result.maxX[i]; + maxY = result.maxY[i]; + } else { + maxIdx = result.maxIdx[i + 1]; + maxX = result.maxX[i + 1]; + maxY = result.maxY[i + 1]; + } + } + result.startIdx[position] = startIdx; + result.endIdx[position] = endIdx; + result.minIdx[position] = minIdx; + result.maxIdx[position] = maxIdx; + result.open[position] = open; + result.close[position] = close; + result.minX[position] = minX; + result.minY[position] = minY; + result.maxX[position] = maxX; + result.maxY[position] = maxY; + position++; + } + result.map['double_' + step] = [offset, position]; + } + }, + + /** + * @private + */ + none: Ext.emptyFn, + + /** + * @private + * + * @param {Number} dataX + * @param {Number} dataOpen + * @param {Number} dataHigh + * @param {Number} dataLow + * @param {Number} dataClose + * @return {Object} + */ + aggregateData: function (dataX, dataOpen, dataHigh, dataLow, dataClose) { + var length = dataX.length, + startIdx = [], + endIdx = [], + minIdx = [], + maxIdx = [], + open = [], + minX = [], + minY = [], + maxX = [], + maxY = [], + close = [], + result = { + startIdx: startIdx, + endIdx: endIdx, + minIdx: minIdx, + maxIdx: maxIdx, + open: open, + minX: minX, + minY: minY, + maxX: maxX, + maxY: maxY, + close: close + }, + i; + + for (i = 0; i < length; i++) { + startIdx[i] = i; + endIdx[i] = i; + minIdx[i] = i; + maxIdx[i] = i; + open[i] = dataOpen[i]; + minX[i] = dataX[i]; + minY[i] = dataLow[i]; + maxX[i] = dataX[i]; + maxY[i] = dataHigh[i]; + close[i] = dataClose[i]; + } + + result.map = { + original: [0, length] + }; + if (length) { + this[this.getStrategy()](result, length, dataX, dataOpen, dataHigh, dataLow, dataClose); + } + return result; + }, + + /** + * @private + * @param {Object} items + * @param {Number} start + * @param {Number} end + * @param {Number} key + * @return {*} + */ + binarySearchMin: function (items, start, end, key) { + var dx = this.dataX; + if (key <= dx[items.startIdx[0]]) { + return start; + } + if (key >= dx[items.startIdx[end - 1]]) { + return end - 1; + } + while (start + 1 < end) { + var mid = (start + end) >> 1, + val = dx[items.startIdx[mid]]; + if (val === key) { + return mid; + } else if (val < key) { + start = mid; + } else { + end = mid; + } + } + return start; + }, + + /** + * @private + * @param {Object} items + * @param {Number} start + * @param {Number} end + * @param {Number} key + * @return {*} + */ + binarySearchMax: function (items, start, end, key) { + var dx = this.dataX; + if (key <= dx[items.endIdx[0]]) { + return start; + } + if (key >= dx[items.endIdx[end - 1]]) { + return end - 1; + } + while (start + 1 < end) { + var mid = (start + end) >> 1, + val = dx[items.endIdx[mid]]; + if (val === key) { + return mid; + } else if (val < key) { + start = mid; + } else { + end = mid; + } + } + return end; + }, + + constructor: function (config) { + this.initConfig(config); + }, + + /** + * Sets the data of the segment tree. + * @param {Number} dataX + * @param {Number} dataOpen + * @param {Number} dataHigh + * @param {Number} dataLow + * @param {Number} dataClose + */ + setData: function (dataX, dataOpen, dataHigh, dataLow, dataClose) { + if (!dataHigh) { + dataClose = dataLow = dataHigh = dataOpen; + } + this.dataX = dataX; + this.dataOpen = dataOpen; + this.dataHigh = dataHigh; + this.dataLow = dataLow; + this.dataClose = dataClose; + if (dataX.length === dataHigh.length && + dataX.length === dataLow.length) { + this.cache = this.aggregateData(dataX, dataOpen, dataHigh, dataLow, dataClose); + } + }, + + /** + * Returns the minimum range of data that fits the given range and step size. + * + * @param {Number} min + * @param {Number} max + * @param {Number} estStep + * @return {Object} The aggregation information. + * @return {Number} return.start + * @return {Number} return.end + * @return {Object} return.data The aggregated data + */ + getAggregation: function (min, max, estStep) { + if (!this.cache) { + return null; + } + var minStep = Infinity, + range = this.dataX[this.dataX.length - 1] - this.dataX[0], + cacheMap = this.cache.map, + result = cacheMap.original, + name, positions, ln, step, minIdx, maxIdx; + + for (name in cacheMap) { + positions = cacheMap[name]; + ln = positions[1] - positions[0] - 1; + step = range / ln; + if (estStep <= step && step < minStep) { + result = positions; + minStep = step; + } + } + minIdx = Math.max(this.binarySearchMin(this.cache, result[0], result[1], min), result[0]); + maxIdx = Math.min(this.binarySearchMax(this.cache, result[0], result[1], max) + 1, result[1]); + return { + data: this.cache, + start: minIdx, + end: maxIdx + }; + } +}); diff --git a/vendor/touch/src/draw/Solver.js b/vendor/touch/src/draw/Solver.js new file mode 100644 index 000000000..f2753d306 --- /dev/null +++ b/vendor/touch/src/draw/Solver.js @@ -0,0 +1,175 @@ +(function () { + var PI2_3 = 2.0943951023931953/* 120 Deg */, + abs = Math.abs, + sin = Math.cos, + cos = Math.cos, + acos = Math.acos, + sqrt = Math.sqrt, + exp = Math.exp, + log = Math.log; + + /** + * @private + * Singleton Class that provides methods to solve cubic equation. + */ + Ext.define("Ext.draw.Solver", { + singleton: true, + /** + * Cubic root of number + * @param {Number} number + */ + cubicRoot: function (number) { + if (number > 0) { + return exp(log(number) / 3); + } else if (number < 0) { + return -exp(log(-number) / 3); + } else { + return 0; + } + }, + + /** + * Returns the function f(x) = a * x + b and solver for f(x) = y + * @param {Number} a + * @param {Number} b + */ + linearFunction: function (a, b) { + var result; + if (a === 0) { + result = function (t) { + return b; + }; + result.solve = function (y) { + // if y == d there should be a real root + // but we can ignore it for geometry calculations. + return []; + }; + } else { + result = function (t) { + return a * t + b; + }; + result.solve = function (y) { + return [(y - b) / a]; + }; + } + return result; + }, + + /** + * Returns the function f(x) = a * x ^ 2 + b * x + c and solver for f(x) = y + * + * @param {Number} a + * @param {Number} b + * @param {Number} c + */ + quadraticFunction: function (a, b, c) { + var result; + if (a === 0) { + return this.linearFunction(b, c); + } else { + // Quadratic equation. + result = function (t) { + return (a * t + b) * t + c; + }; + var delta0temp = b * b - 4 * a * c, + delta = function (y) { + return delta0temp + 4 * a * y; + }, solveTemp0 = 1 / a * 0.5, + solveTemp1 = -solveTemp0 * b; + solveTemp0 = abs(solveTemp0); + result.solve = function (y) { + var deltaTemp = delta(y); + if (deltaTemp < 0) { + return []; + } + deltaTemp = sqrt(deltaTemp); + // have to distinct roots here. + return [solveTemp1 - deltaTemp * solveTemp0, solveTemp1 + deltaTemp * solveTemp0]; + }; + } + return result; + }, + + /** + * Returns the function f(x) = a * x^3 + b * x^2 + c * x + d and solver for f(x) = y + * @param {Number} a + * @param {Number} b + * @param {Number} c + * @param {Number} d + */ + cubicFunction: function (a, b, c, d) { + var result; + if (a === 0) { + return this.quadraticFunction(b, c, d); + } else { + result = function (t) { + return ((a * t + b) * t + c) * t + d; + }; + + var b_a_3 = b / a / 3, + c_a = c / a, + d_a = d / a, + b2 = b_a_3 * b_a_3, + deltaTemp0 = (b_a_3 * c_a - d_a) * 0.5 - b_a_3 * b2, + deltaTemp1 = b2 - c_a / 3, + deltaTemp13 = deltaTemp1 * deltaTemp1 * deltaTemp1; + + if (deltaTemp1 === 0) { + result.solve = function (y) { + return [-b_a_3 + this.cubicRoot(deltaTemp0 * 2 + y / a)]; + }; + } else { + if (deltaTemp1 > 0) { + var deltaTemp1_2 = sqrt(deltaTemp1), + deltaTemp13_2 = deltaTemp1_2 * deltaTemp1_2 * deltaTemp1_2; + deltaTemp1_2 += deltaTemp1_2; + } + result.solve = function (y) { + y /= a; + var d0 = deltaTemp0 + y * 0.5, + deltaTemp = d0 * d0 - deltaTemp13; + if (deltaTemp > 0) { + deltaTemp = sqrt(deltaTemp); + return [-b_a_3 + this.cubicRoot(d0 + deltaTemp) + this.cubicRoot(d0 - deltaTemp)]; + } else if (deltaTemp === 0) { + var cr = this.cubicRoot(d0), + root0 = -b_a_3 - cr; + if (d0 >= 0) { + return [root0, root0, -b_a_3 + 2 * cr]; + } else { + return [-b_a_3 + 2 * cr, root0, root0]; + } + } else { + var theta = acos(d0 / deltaTemp13_2) / 3, + ra = deltaTemp1_2 * cos(theta) - b_a_3, + rb = deltaTemp1_2 * cos(theta + PI2_3) - b_a_3, + rc = deltaTemp1_2 * cos(theta - PI2_3) - b_a_3; + if (ra < rb) { + if (rb < rc) { + return [ra, rb, rc]; + } else if (ra < rc) { + return[ra, rc, rb]; + } else { + return [rc, ra, rb]; + } + } else { + if (ra < rc) { + return [rb, ra, rc]; + } else if (rb < rc) { + return [rb, rc, ra]; + } else { + return [rc, rb, ra]; + } + } + } + }; + } + } + return result; + }, + + createBezierSolver: function (a, b, c, d) { + return this.cubicFunction(3 * (b - c) + d - a, 3 * (a - 2 * b + c), 3 * (b - a), a); + } + }); +})(); diff --git a/vendor/touch/src/draw/Surface.js b/vendor/touch/src/draw/Surface.js new file mode 100644 index 000000000..1cb74bf43 --- /dev/null +++ b/vendor/touch/src/draw/Surface.js @@ -0,0 +1,622 @@ +/** + * A Surface is an interface to render methods inside a draw {@link Ext.draw.Component}. + * A Surface contains methods to render sprites, get bounding boxes of sprites, add + * sprites to the canvas, initialize other graphic components, etc. One of the most used + * methods for this class is the `add` method, to add Sprites to the surface. + * + * Most of the Surface methods are abstract and they have a concrete implementation + * in Canvas or SVG engines. + * + * A Surface instance can be accessed as a property of a draw component. For example: + * + * drawComponent.getSurface('main').add({ + * type: 'circle', + * fill: '#ffc', + * radius: 100, + * x: 100, + * y: 100 + * }); + * + * The configuration object passed in the `add` method is the same as described in the {@link Ext.draw.sprite.Sprite} + * class documentation. + * + * ## Example + * + * drawComponent.getSurface('main').add([ + * { + * type: 'circle', + * radius: 10, + * fill: '#f00', + * x: 10, + * y: 10 + * }, + * { + * type: 'circle', + * radius: 10, + * fill: '#0f0', + * x: 50, + * y: 50 + * }, + * { + * type: 'circle', + * radius: 10, + * fill: '#00f', + * x: 100, + * y: 100 + * }, + * { + * type: 'rect', + * radius: 10, + * x: 10, + * y: 10 + * }, + * { + * type: 'rect', + * radius: 10, + * x: 50, + * y: 50 + * }, + * { + * type: 'rect', + * radius: 10, + * x: 100, + * y: 100 + * } + * ]); + * + */ +Ext.define('Ext.draw.Surface', { + extend: 'Ext.Component', + xtype: 'surface', + + requires: [ + 'Ext.draw.sprite.*', + 'Ext.draw.gradient.*', + 'Ext.draw.sprite.AttributeDefinition', + 'Ext.draw.Matrix', + 'Ext.draw.Draw' + ], + + uses: [ + "Ext.draw.engine.Canvas" + ], + + defaultIdPrefix: 'ext-surface-', + + /** + * The reported device pixel density. + */ + devicePixelRatio: window.devicePixelRatio || 1, + + statics: { + /** + * Stably sort the list of sprites by their zIndex. + * TODO: Improve the performance. Reduce gc impact. + * @param {Array} list + */ + stableSort: function (list) { + if (list.length < 2) { + return; + } + var keys = {}, sortedKeys, result = [], i, ln, zIndex; + + for (i = 0, ln = list.length; i < ln; i++) { + zIndex = list[i].attr.zIndex; + if (!keys[zIndex]) { + keys[zIndex] = [list[i]]; + } else { + keys[zIndex].push(list[i]); + } + } + sortedKeys = Ext.Object.getKeys(keys).sort(function (a, b) {return a - b;}); + for (i = 0, ln = sortedKeys.length; i < ln; i++) { + result.push.apply(result, keys[sortedKeys[i]]); + } + for (i = 0, ln = list.length; i < ln; i++) { + list[i] = result[i]; + } + } + }, + + config: { + /** + * @cfg {Array} + * The region of the surface related to its component. + */ + region: null, + + /** + * @cfg {Object} + * Background sprite config of the surface. + */ + background: null, + + /** + * @cfg {Array} + * Array of sprite instances. + */ + items: [], + + /** + * @cfg {Boolean} + * Indicates whether the surface needs redraw. + */ + dirty: false + }, + + dirtyPredecessor: 0, + + constructor: function (config) { + var me = this; + + me.predecessors = []; + me.successors = []; + // The `pendingRenderFrame` flag is used to indicate that `predecessors` (surfaces that should render first) + // are dirty, and to call `renderFrame` when all `predecessors` have their `renderFrame` called + // (i.e. not dirty anymore). + me.pendingRenderFrame = false; + me.map = {}; + + me.callSuper([config]); + me.matrix = new Ext.draw.Matrix(); + me.inverseMatrix = me.matrix.inverse(me.inverseMatrix); + me.resetTransform(); + }, + + /** + * Round the number to align to the pixels on device. + * @param {Number} num The number to align. + * @return {Number} The resultant alignment. + */ + roundPixel: function (num) { + return Math.round(this.devicePixelRatio * num) / this.devicePixelRatio; + }, + + /** + * Mark the surface to render after another surface is updated. + * @param {Ext.draw.Surface} surface The surface to wait for. + */ + waitFor: function (surface) { + var me = this, + predecessors = me.predecessors; + if (!Ext.Array.contains(predecessors, surface)) { + predecessors.push(surface); + surface.successors.push(me); + if (surface._dirty) { + me.dirtyPredecessor++; + } + } + }, + + setDirty: function (dirty) { + if (this._dirty !== dirty) { + var successors = this.successors, successor, + i, ln = successors.length; + for (i = 0; i < ln; i++) { + successor = successors[i]; + if (dirty) { + successor.dirtyPredecessor++; + successor.setDirty(true); + } else { + successor.dirtyPredecessor--; + if (successor.dirtyPredecessor === 0 && successor.pendingRenderFrame) { + successor.renderFrame(); + } + } + } + this._dirty = dirty; + } + }, + + applyElement: function (newElement, oldElement) { + if (oldElement) { + oldElement.set(newElement); + } else { + oldElement = Ext.Element.create(newElement); + } + this.setDirty(true); + return oldElement; + }, + + applyBackground: function (background, oldBackground) { + this.setDirty(true); + if (Ext.isString(background)) { + background = { fillStyle: background }; + } + return Ext.factory(background, Ext.draw.sprite.Rect, oldBackground); + }, + + applyRegion: function (region, oldRegion) { + if (oldRegion && region[0] === oldRegion[0] && region[1] === oldRegion[1] && region[2] === oldRegion[2] && region[3] === oldRegion[3]) { + return; + } + if (Ext.isArray(region)) { + return [region[0], region[1], region[2], region[3]]; + } else if (Ext.isObject(region)) { + return [ + region.x || region.left, + region.y || region.top, + region.width || (region.right - region.left), + region.height || (region.bottom - region.top) + ]; + } + }, + + updateRegion: function (region) { + var me = this, + l = region[0], + t = region[1], + r = l + region[2], + b = t + region[3], + background = this.getBackground(), + element = me.element; + + element.setBox({ + top: Math.floor(t), + left: Math.floor(l), + width: Math.ceil(r - Math.floor(l)), + height: Math.ceil(b - Math.floor(t)) + }); + + if (background) { + background.setAttributes({ + x: 0, + y: 0, + width: Math.ceil(r - Math.floor(l)), + height: Math.ceil(b - Math.floor(t)) + }); + } + me.setDirty(true); + }, + + /** + * Reset the matrix of the surface. + */ + resetTransform: function () { + this.matrix.set(1, 0, 0, 1, 0, 0); + this.inverseMatrix.set(1, 0, 0, 1, 0, 0); + this.setDirty(true); + }, + + updateComponent: function (component, oldComponent) { + if (component) { + component.element.dom.appendChild(this.element.dom); + } + }, + + /** + * Get the sprite by id or index. + * It will first try to find a sprite with the given id, otherwise will try to use the id as an index. + * @param {String|Number} id + * @returns {Ext.draw.sprite.Sprite} + */ + get: function (id) { + return this.map[id] || this.items[id]; + }, + + /** + * Add a Sprite to the surface. + * You can put any number of object as parameter. + * See {@link Ext.draw.sprite.Sprite} for the configuration object to be passed into this method. + * + * For example: + * + * drawComponent.surface.add({ + * type: 'circle', + * fill: '#ffc', + * radius: 100, + * x: 100, + * y: 100 + * }); + * + */ + add: function () { + var me = this, + args = Array.prototype.slice.call(arguments), + argIsArray = Ext.isArray(args[0]), + results = [], + sprite, sprites, items, i, ln; + + items = Ext.Array.clean(argIsArray ? args[0] : args); + if (!items.length) { + return results; + } + sprites = me.prepareItems(items); + + for (i = 0, ln = sprites.length; i < ln; i++) { + sprite = sprites[i]; + me.map[sprite.getId()] = sprite; + results.push(sprite); + sprite.setParent(this); + me.onAdd(sprite); + } + + items = me.getItems(); + if (items) { + items.push.apply(items, results); + } + + me.dirtyZIndex = true; + me.setDirty(true); + + if (!argIsArray && results.length === 1) { + return results[0]; + } else { + return results; + } + }, + + /** + * @protected + * Invoked when a sprite is added to the surface. + * @param {Ext.draw.sprite.Sprite} sprite The sprite to be added. + */ + onAdd: Ext.emptyFn, + + /** + * Remove a given sprite from the surface, optionally destroying the sprite in the process. + * You can also call the sprite own `remove` method. + * + * For example: + * + * drawComponent.surface.remove(sprite); + * // or... + * sprite.remove(); + * + * @param {Ext.draw.sprite.Sprite} sprite + * @param {Boolean} [destroySprite=false] + */ + remove: function (sprite, destroySprite) { + if (sprite) { + delete this.map[sprite.getId()]; + if (destroySprite) { + sprite.destroy(); + } else { + sprite.setParent(null); + Ext.Array.remove(this.getItems(), sprite); + } + this.dirtyZIndex = true; + this.setDirty(true); + } + }, + + /** + * Remove all sprites from the surface, optionally destroying the sprites in the process. + * + * For example: + * + * drawComponent.getSurface('main').removeAll(); + * + * @param {Boolean} [destroySprites=false] + */ + removeAll: function (destroySprites) { + var items = this.getItems(), + i = items.length; + if (destroySprites) { + while (i > 0) { + items[--i].destroy(); + } + } else { + while (i > 0) { + items[--i].setParent(null); + } + } + items.length = 0; + this.map = {}; + this.dirtyZIndex = true; + }, + + // @private + applyItems: function (items) { + if (this.getItems()) { + this.removeAll(true); + } + return Ext.Array.from(this.add(items)); + }, + + /** + * @private + * Initialize and apply defaults to surface items. + */ + prepareItems: function (items) { + items = [].concat(items); + // Make sure defaults are applied and item is initialized + + var me = this, + item, i, ln, j, + removeSprite = function (sprite) { + this.remove(sprite, false); + }; + + for (i = 0, ln = items.length; i < ln; i++) { + item = items[i]; + if (!(item instanceof Ext.draw.sprite.Sprite)) { + // Temporary, just take in configs... + item = items[i] = me.createItem(item); + } + item.on('beforedestroy', removeSprite, me); + } + return items; + }, + + /** + * @private Creates an item and appends it to the surface. Called + * as an internal method when calling `add`. + */ + createItem: function (config) { + var sprite = Ext.create(config.xclass || 'sprite.' + config.type, config); + return sprite; + }, + + /** + * Return the minimal bounding box that contains all the sprites bounding boxes in the given list of sprites. + * @param {Ext.draw.sprite.Sprite[]|Ext.draw.sprite.Sprite} sprites + * @param {Boolean} [isWithoutTransform=false] + * @returns {{x: Number, y: Number, width: number, height: number}} + */ + getBBox: function (sprites, isWithoutTransform) { + var sprites = Ext.Array.from(sprites), + left = Infinity, + right = -Infinity, + top = Infinity, + bottom = -Infinity, + sprite, bbox, i, ln; + + for (i = 0, ln = sprites.length; i < ln; i++) { + sprite = sprites[i]; + bbox = sprite.getBBox(isWithoutTransform); + if (left > bbox.x) { + left = bbox.x; + } + if (right < bbox.x + bbox.width) { + right = bbox.x + bbox.width; + } + if (top > bbox.y) { + top = bbox.y; + } + if (bottom < bbox.y + bbox.height) { + bottom = bbox.y + bbox.height; + } + } + return { + x: left, + y: top, + width: right - left, + height: bottom - top + }; + }, + + /** + * Empty the surface content (without touching the sprites.) + */ + clear: Ext.emptyFn, + + /** + * @private + * Order the items by their z-index if any of that has been changed since last sort. + */ + orderByZIndex: function () { + var me = this, + items = me.getItems(), + dirtyZIndex = false, + i, ln; + + if (me.getDirty()) { + for (i = 0, ln = items.length; i < ln; i++) { + if (items[i].attr.dirtyZIndex) { + dirtyZIndex = true; + break; + } + } + if (dirtyZIndex) { + // sort by zIndex + Ext.draw.Surface.stableSort(items); + this.setDirty(true); + } + + for (i = 0, ln = items.length; i < ln; i++) { + items[i].attr.dirtyZIndex = false; + } + } + }, + + /** + * Force the element to redraw. + */ + repaint: function () { + var me = this; + me.repaint = Ext.emptyFn; + setTimeout(function () { + delete me.repaint; + me.element.repaint(); + }, 1); + }, + + /** + * Triggers the re-rendering of the canvas. + */ + renderFrame: function () { + if (!this.element) { + return; + } + if (this.dirtyPredecessor > 0) { + this.pendingRenderFrame = true; + return; + } + + var me = this, + region = this.getRegion(), + background = me.getBackground(), + items = me.getItems(), + item, i, ln; + + // Cannot render before the surface is placed. + if (!region) { + return; + } + + // This will also check the dirty flags of the sprites. + me.orderByZIndex(); + if (me.getDirty()) { + me.clear(); + me.clearTransform(); + + if (background) { + me.renderSprite(background); + } + + for (i = 0, ln = items.length; i < ln; i++) { + item = items[i]; + if (false === me.renderSprite(item)) { + return; + } + item.attr.textPositionCount = me.textPosition; + } + + me.setDirty(false); + } + }, + + /** + * @private + * Renders a single sprite into the surface. + * Do not call it from outside `renderFrame` method. + * + * @param {Ext.draw.sprite.Sprite} sprite The Sprite to be rendered. + * @return {Boolean} returns `false` to stop the rendering to continue. + */ + renderSprite: Ext.emptyFn, + + /** + * @private + * Clears the current transformation state on the surface. + */ + clearTransform: Ext.emptyFn, + + /** + * Returns 'true' if the surface is dirty. + * @return {Boolean} 'true' if the surface is dirty + */ + getDirty: function () { + return this._dirty; + }, + + /** + * Destroys the surface. This is done by removing all components from it and + * also removing its reference to a DOM element. + * + * For example: + * + * drawComponent.surface.destroy(); + */ + destroy: function () { + var me = this; + me.removeAll(); + me.setBackground(null); + me.predecessors = null; + me.successors = null; + me.callSuper(); + } +}); + + diff --git a/vendor/touch/src/draw/TextMeasurer.js b/vendor/touch/src/draw/TextMeasurer.js new file mode 100644 index 000000000..3b710bb6b --- /dev/null +++ b/vendor/touch/src/draw/TextMeasurer.js @@ -0,0 +1,143 @@ +/** + * Utility class to provide a way to *approximately* measure the dimension of texts without a drawing context. + */ +Ext.define("Ext.draw.TextMeasurer", { + singleton: true, + + uses: ['Ext.draw.engine.Canvas'], + + measureDiv: null, + measureCache: {}, + + /** + * @private Measure the size of a text with specific font by using DOM to measure it. + * Could be very expensive therefore should be used lazily. + * @param {String} text + * @param {String} font + * @return {Object} An object with `width` and `height` properties. + * @return {Number} return.width + * @return {Number} return.height + */ + actualMeasureText: function (text, font) { + var me = Ext.draw.TextMeasurer, + measureDiv = me.measureDiv, + FARAWAY = 100000, + size; + + if (!measureDiv) { + var parent = Ext.Element.create({ + style: { + "overflow": "hidden", + "position": "relative", + "float": "left", // DO NOT REMOVE THE QUOTE OR IT WILL BREAK COMPRESSOR + "width": 0, + "height": 0 + } + }); + me.measureDiv = measureDiv = Ext.Element.create({}); + measureDiv.setStyle({ + "position": 'absolute', + "x": FARAWAY, + "y": FARAWAY, + "z-index": -FARAWAY, + "white-space": "nowrap", + "display": 'block', + "padding": 0, + "margin": 0 + }); + Ext.getBody().appendChild(parent); + parent.appendChild(measureDiv); + } + if (font) { + measureDiv.setStyle({ + font: font, + lineHeight: 'normal' + }); + } + measureDiv.setText('(' + text + ')'); + size = measureDiv.getSize(); + measureDiv.setText('()'); + size.width -= measureDiv.getSize().width; + return size; + }, + + /** + * Measure a single-line text with specific font. + * This will split the text to characters and add up their size. + * That may *not* be the exact size of the text as it is displayed. + * @param {String} text + * @param {String} font + * @return {Object} An object with `width` and `height` properties. + * @return {Number} return.width + * @return {Number} return.height + */ + measureTextSingleLine: function (text, font) { + text = text.toString(); + var cache = this.measureCache, + chars = text.split(''), + width = 0, + height = 0, + cachedItem, charactor, i, ln, size; + + if (!cache[font]) { + cache[font] = {}; + } + cache = cache[font]; + + if (cache[text]) { + return cache[text]; + } + + for (i = 0, ln = chars.length; i < ln; i++) { + charactor = chars[i]; + if (!(cachedItem = cache[charactor])) { + size = this.actualMeasureText(charactor, font); + cachedItem = cache[charactor] = size; + } + width += cachedItem.width; + height = Math.max(height, cachedItem.height); + } + return cache[text] = { + width: width, + height: height + }; + }, + + /** + * Measure a text with specific font. + * This will split the text to lines and add up their size. + * That may *not* be the exact size of the text as it is displayed. + * @param {String} text + * @param {String} font + * @return {Object} An object with `width`, `height` and `sizes` properties. + * @return {Number} return.width + * @return {Number} return.height + * @return {Array} return.sizes Results of individual line measurements, in case of multiline text. + */ + measureText: function (text, font) { + var lines = text.split('\n'), + ln = lines.length, + height = 0, + width = 0, + line, i, + sizes; + + if (ln === 1) { + return this.measureTextSingleLine(text, font); + } + + sizes = []; + for (i = 0; i < ln; i++) { + line = this.measureTextSingleLine(lines[i], font); + sizes.push(line); + height += line.height; + width = Math.max(width, line.width); + } + + return { + width: width, + height: height, + sizes: sizes + }; + } +}); \ No newline at end of file diff --git a/vendor/touch/src/draw/TimingFunctions.js b/vendor/touch/src/draw/TimingFunctions.js new file mode 100644 index 000000000..3b49e8fb1 --- /dev/null +++ b/vendor/touch/src/draw/TimingFunctions.js @@ -0,0 +1,139 @@ +(function () { + var pow = Math.pow, + sin = Math.sin, + cos = Math.cos, + sqrt = Math.sqrt, + pi = Math.PI, + easings, addEasing, poly, createPoly, easing, i, l; + + //create polynomial easing equations + poly = ['quad', 'cubic', 'quart', 'quint']; + + //create other easing equations + easings = { + pow: function (p, x) { + return pow(p, x[0] || 6); + }, + + expo: function (p) { + return pow(2, 8 * (p - 1)); + }, + + circ: function (p) { + return 1 - sqrt(1 - p * p); + }, + + sine: function (p) { + return 1 - sin((1 - p) * pi / 2); + }, + + back: function (p, n) { + n = n || 1.616; + return p * p * ((n + 1) * p - n); + }, + + bounce: function (p) { + var value; + for (var a = 0, b = 1; 1; a += b, b /= 2) { + if (p >= (7 - 4 * a) / 11) { + value = b * b - pow((11 - 6 * a - 11 * p) / 4, 2); + break; + } + } + return value; + }, + + elastic: function (p, x) { + return pow(2, 10 * --p) * cos(20 * p * pi * (x || 1) / 3); + } + }; + + //Add easeIn, easeOut, easeInOut options to all easing equations. + addEasing = function (easing, params) { + params = params && params.length ? params : [ params ]; + return Ext.apply(easing, { + + easeIn: function (pos) { + return easing(pos, params); + }, + + easeOut: function (pos) { + return 1 - easing(1 - pos, params); + }, + + easeInOut: function (pos) { + return (pos <= 0.5) ? easing(2 * pos, params) / 2 + : (2 - easing(2 * (1 - pos), params)) / 2; + } + }); + }; + + //Append the polynomial equations with easing support to the EasingPrototype. + createPoly = function (times) { + return function (p) { + return pow(p, times); + }; + }; + + for (i = 0, l = poly.length; i < l; ++i) { + easings[poly[i]] = createPoly(i + 2); + } + + //Add linear interpolator + easings.linear = function (x) { + return x; + }; + + for (easing in easings) { + if (easings.hasOwnProperty(easing)) { + addEasing(easings[easing]); + } + } + + /** + * @class + * Contains transition equations such as `Quad`, `Cubic`, `Quart`, `Quint`, + * `Expo`, `Circ`, `Pow`, `Sine`, `Back`, `Bounce`, `Elastic`, etc. + * + * Contains transition equations such as `Quad`, `Cubic`, `Quart`, `Quint`, `Expo`, `Circ`, `Pow`, `Sine`, `Back`, `Bounce`, `Elastic`, etc. + * Each transition also contains methods for applying this function as ease in, ease out or ease in and out accelerations. + * + * var fx = Ext.create('Ext.draw.fx.Sprite', { + * sprite: sprite, + * duration: 1000, + * easing: 'backOut' + * }); + */ + Ext.define('Ext.draw.TimingFunctions', { + singleton: true, + easingMap: { + linear: easings.linear, + easeIn: easings.quad.easeIn, + easeOut: easings.quad.easeOut, + easeInOut: easings.quad.easeInOut, + backIn: easings.back, + backOut: function (x, n) { + return 1 - easings.back(1 - x, n); + }, + backInOut: function (x, n) { + if (x < 0.5) { + return easings.back(x * 2, n) * 0.5; + } else { + return 1 - easings.back((1 - x) * 2, n) * 0.5; + } + }, + elasticIn: function (x, n) { + return 1 - easings.elastic(1 - x, n); + }, + elasticOut: easings.elastic, + bounceIn: easings.bounce, + bounceOut: function (x) { + return 1 - easings.bounce(1 - x); + } + } + }, function () { + Ext.apply(this, easings); + }); + +})(); + diff --git a/vendor/touch/src/draw/engine/Canvas.js b/vendor/touch/src/draw/engine/Canvas.js new file mode 100644 index 000000000..e27c581a9 --- /dev/null +++ b/vendor/touch/src/draw/engine/Canvas.js @@ -0,0 +1,822 @@ +/** + * Provides specific methods to draw with 2D Canvas element. + */ +Ext.define('Ext.draw.engine.Canvas', { + extend: 'Ext.draw.Surface', + config: { + /** + * @cfg {Boolean} highPrecision + * True to have the canvas use JavaScript Number instead of single precision floating point for transforms. + * + * For example, when using huge data to plot line series, the transform matrix of the canvas will have + * a big element. Due to the implementation of SVGMatrix, the elements are restored by 32-bits floats, which + * will work incorrectly. To compensate that, we enable the canvas context to perform all the transform by + * JavaScript. Do not use it if you are not encountering 32-bits floating point errors problem since it will + * have a performance penalty. + */ + highPrecision: false + }, + requires: ['Ext.draw.Animator'], + + statics: { + contextOverrides: { + /** + * @ignore + */ + setGradientBBox: function (bbox) { + this.bbox = bbox; + }, + + /** + * Fills the subpaths of the current default path or the given path with the current fill style. + * @ignore + */ + fill: function () { + var fillStyle = this.fillStyle, + fillGradient = this.fillGradient, + fillOpacity = this.fillOpacity, + rgba = 'rgba(0, 0, 0, 0)', + rgba0 = 'rgba(0, 0, 0, 0.0)', + bbox = this.bbox, + alpha = this.globalAlpha; + + if (fillStyle !== rgba && fillStyle !== rgba0 && fillOpacity !== 0) { + if (fillGradient && bbox) { + this.fillStyle = fillGradient.generateGradient(this, bbox); + } + + if (fillOpacity !== 1) { + this.globalAlpha = alpha * fillOpacity; + } + this.$fill(); + if (fillOpacity !== 1) { + this.globalAlpha = alpha; + } + + if (fillGradient && bbox) { + this.fillStyle = fillStyle; + } + } + }, + + /** + * Strokes the subpaths of the current default path or the given path with the current stroke style. + * @ignore + */ + stroke: function () { + var strokeStyle = this.strokeStyle, + strokeGradient = this.strokeGradient, + strokeOpacity = this.strokeOpacity, + rgba = 'rgba(0, 0, 0, 0)', + rgba0 = 'rgba(0, 0, 0, 0.0)', + bbox = this.bbox, + alpha = this.globalAlpha; + + if (strokeStyle !== rgba && strokeStyle !== rgba0 && strokeOpacity !== 0) { + if (strokeGradient && bbox) { + this.strokeStyle = strokeGradient.generateGradient(this, bbox); + } + + if (strokeOpacity !== 1) { + this.globalAlpha = alpha * strokeOpacity; + } + this.$stroke(); + if (strokeOpacity !== 1) { + this.globalAlpha = alpha; + } + + if (strokeGradient && bbox) { + this.strokeStyle = strokeStyle; + } + } + }, + + /** + * @ignore + */ + fillStroke: function (attr, transformFillStroke) { + var ctx = this, + fillStyle = this.fillStyle, + fillOpacity = this.fillOpacity, + strokeStyle = this.strokeStyle, + strokeOpacity = this.strokeOpacity, + shadowColor = ctx.shadowColor, + shadowBlur = ctx.shadowBlur, + rgba = 'rgba(0, 0, 0, 0)', + rgba0 = 'rgba(0, 0, 0, 0.0)'; + + if (transformFillStroke === undefined) { + transformFillStroke = attr.transformFillStroke; + } + + if (!transformFillStroke) { + attr.inverseMatrix.toContext(ctx); + } + if (fillStyle !== rgba && fillStyle !== rgba0 && fillOpacity !== 0) { + ctx.fill(); + ctx.shadowColor = 'rgba(0,0,0,0)'; + ctx.shadowBlur = 0; + } + if (strokeStyle !== rgba && strokeStyle !== rgba0 && strokeOpacity !== 0) { + ctx.stroke(); + } + ctx.shadowColor = shadowColor; + ctx.shadowBlur = shadowBlur; + }, + + /** + * Adds points to the subpath such that the arc described by the circumference of the + * ellipse described by the arguments, starting at the given start angle and ending at + * the given end angle, going in the given direction (defaulting to clockwise), is added + * to the path, connected to the previous point by a straight line. + * @ignore + */ + ellipse: function (cx, cy, rx, ry, rotation, start, end, anticlockwise) { + var cos = Math.cos(rotation), + sin = Math.sin(rotation); + this.transform(cos * rx, sin * rx, -sin * ry, cos * ry, cx, cy); + this.arc(0, 0, 1, start, end, anticlockwise); + this.transform( + cos / rx, -sin / ry, + sin / rx, cos / ry, + -(cos * cx + sin * cy) / rx, (sin * cx - cos * cy) / ry); + }, + + /** + * Uses the given path commands to begin a new path on the canvas. + * @ignore + */ + appendPath: function (path) { + var me = this, + i = 0, j = 0, + types = path.types, + coords = path.coords, + ln = path.types.length; + me.beginPath(); + for (; i < ln; i++) { + switch (types[i]) { + case "M": + me.moveTo(coords[j], coords[j + 1]); + j += 2; + break; + case "L": + me.lineTo(coords[j], coords[j + 1]); + j += 2; + break; + case "C": + me.bezierCurveTo( + coords[j], coords[j + 1], + coords[j + 2], coords[j + 3], + coords[j + 4], coords[j + 5] + ); + j += 6; + break; + case "Z": + me.closePath(); + break; + } + } + } + } + }, + + splitThreshold: 1800, + + getElementConfig: function () { + return { + reference: 'element', + style: { + position: 'absolute' + }, + children: [ + { + reference: 'innerElement', + style: { + width: '100%', + height: '100%', + position: 'relative' + } + } + ] + }; + }, + + /** + * @private + * + * Creates the canvas element. + */ + createCanvas: function () { + var canvas = Ext.Element.create({ + tag: 'canvas', + cls: 'x-surface' + }), + overrides = Ext.draw.engine.Canvas.contextOverrides, + ctx = canvas.dom.getContext('2d'), + backingStoreRatio = ctx.webkitBackingStorePixelRatio || + ctx.mozBackingStorePixelRatio || + ctx.msBackingStorePixelRatio || + ctx.oBackingStorePixelRatio || + ctx.backingStorePixelRatio || 1, + name; + + // Windows Phone does not currently support backingStoreRatio + this.devicePixelRatio /= (Ext.os.is.WindowsPhone) ? window.innerWidth / window.screen.width : backingStoreRatio; + + if (ctx.ellipse) { + delete overrides.ellipse; + } + + for (name in overrides) { + ctx['$' + name] = ctx[name]; + } + Ext.apply(ctx, overrides); + + if (this.getHighPrecision()) { + this.enablePrecisionCompensation(ctx); + } else { + this.disablePrecisionCompensation(ctx); + } + + this.innerElement.appendChild(canvas); + this.canvases.push(canvas); + this.contexts.push(ctx); + }, + + /** + * Initialize the canvas element. + */ + initElement: function () { + this.callSuper(); + this.canvases = []; + this.contexts = []; + this.createCanvas(); + this.activeCanvases = 0; + }, + + updateHighPrecision: function (pc) { + var contexts = this.contexts, + ln = contexts.length, + i, context; + + for (i = 0; i < ln; i++) { + context = contexts[i]; + if (pc) { + this.enablePrecisionCompensation(context); + } else { + this.disablePrecisionCompensation(context); + } + } + }, + + precisionMethods: { + rect: false, + fillRect: false, + strokeRect: false, + clearRect: false, + moveTo: false, + lineTo: false, + arc: false, + arcTo: false, + save: false, + restore: false, + updatePrecisionCompensate: false, + setTransform: false, + transform: false, + scale: false, + translate: false, + rotate: false, + quadraticCurveTo: false, + bezierCurveTo: false, + createLinearGradient: false, + createRadialGradient: false, + fillText: false, + strokeText: false, + drawImage: false + }, + + /** + * @private + * Clears canvas of compensation for canvas' use of single precision floating point. + * @param {CanvasRenderingContext2D} ctx The canvas context. + */ + disablePrecisionCompensation: function (ctx) { + var precisionMethods = this.precisionMethods, + name; + + for (name in precisionMethods) { + delete ctx[name]; + } + + this.setDirty(true); + }, + + /** + * @private + * Compensate for canvas' use of single precision floating point. + * @param {CanvasRenderingContext2D} ctx The canvas context. + */ + enablePrecisionCompensation: function (ctx) { + var surface = this, + xx = 1, yy = 1, + dx = 0, dy = 0, + matrix = new Ext.draw.Matrix(), + transStack = [], + comp = {}, + originalCtx = ctx.constructor.prototype; + + /** + * @class CanvasRenderingContext2D + * @ignore + */ + var override = { + /** + * Adds a new closed subpath to the path, representing the given rectangle. + * @return {*} + * @ignore + */ + rect: function (x, y, w, h) { + return originalCtx.rect.call(this, x * xx + dx, y * yy + dy, w * xx, h * yy); + }, + + /** + * Paints the given rectangle onto the canvas, using the current fill style. + * @ignore + */ + fillRect: function (x, y, w, h) { + this.updatePrecisionCompensateRect(); + originalCtx.fillRect.call(this, x * xx + dx, y * yy + dy, w * xx, h * yy); + this.updatePrecisionCompensate(); + }, + + /** + * Paints the box that outlines the given rectangle onto the canvas, using the current stroke style. + * @ignore + */ + strokeRect: function (x, y, w, h) { + this.updatePrecisionCompensateRect(); + originalCtx.strokeRect.call(this, x * xx + dx, y * yy + dy, w * xx, h * yy); + this.updatePrecisionCompensate(); + }, + + /** + * Clears all pixels on the canvas in the given rectangle to transparent black. + * @ignore + */ + clearRect: function (x, y, w, h) { + return originalCtx.clearRect.call(this, x * xx + dx, y * yy + dy, w * xx, h * yy); + }, + + /** + * Creates a new subpath with the given point. + * @ignore + */ + moveTo: function (x, y) { + return originalCtx.moveTo.call(this, x * xx + dx, y * yy + dy); + }, + + /** + * Adds the given point to the current subpath, connected to the previous one by a straight line. + * @ignore + */ + lineTo: function (x, y) { + return originalCtx.lineTo.call(this, x * xx + dx, y * yy + dy); + }, + + /** + * Adds points to the subpath such that the arc described by the circumference of the + * circle described by the arguments, starting at the given start angle and ending at + * the given end angle, going in the given direction (defaulting to clockwise), is added + * to the path, connected to the previous point by a straight line. + * @ignore + */ + arc: function (x, y, radius, startAngle, endAngle, anticlockwise) { + this.updatePrecisionCompensateRect(); + originalCtx.arc.call(this, x * xx + dx, y * xx + dy, radius * xx, startAngle, endAngle, anticlockwise); + this.updatePrecisionCompensate(); + }, + + /** + * Adds an arc with the given control points and radius to the current subpath, + * connected to the previous point by a straight line. If two radii are provided, the + * first controls the width of the arc's ellipse, and the second controls the height. If + * only one is provided, or if they are the same, the arc is from a circle. + * + * In the case of an ellipse, the rotation argument controls the clockwise inclination + * of the ellipse relative to the x-axis. + * @ignore + */ + arcTo: function (x1, y1, x2, y2, radius) { + this.updatePrecisionCompensateRect(); + originalCtx.arcTo.call(this, x1 * xx + dx, y1 * yy + dy, x2 * xx + dx, y2 * yy + dy, radius * xx); + this.updatePrecisionCompensate(); + }, + + /** + * Pushes the context state to the state stack. + * @ignore + */ + save: function () { + transStack.push(matrix); + matrix = matrix.clone(); + return originalCtx.save.call(this); + }, + + /** + * Pops the state stack and restores the state. + * @ignore + */ + restore: function () { + matrix = transStack.pop(); + originalCtx.restore.call(this); + this.updatePrecisionCompensate(); + }, + + /** + * @ignore + */ + updatePrecisionCompensate: function () { + matrix.precisionCompensate(surface.devicePixelRatio, comp); + xx = comp.xx; + yy = comp.yy; + dx = comp.dx; + dy = comp.dy; + return originalCtx.setTransform.call(this, surface.devicePixelRatio, comp.b, comp.c, comp.d, 0, 0); + }, + + /** + * @ignore + */ + updatePrecisionCompensateRect: function () { + matrix.precisionCompensateRect(surface.devicePixelRatio, comp); + xx = comp.xx; + yy = comp.yy; + dx = comp.dx; + dy = comp.dy; + return originalCtx.setTransform.call(this, surface.devicePixelRatio, comp.b, comp.c, comp.d, 0, 0); + }, + + /** + * Changes the transformation matrix to the matrix given by the arguments as described below. + * @ignore + */ + setTransform: function (x2x, x2y, y2x, y2y, newDx, newDy) { + matrix.set(x2x, x2y, y2x, y2y, newDx, newDy); + this.updatePrecisionCompensate(); + }, + + /** + * Changes the transformation matrix to apply the matrix given by the arguments as described below. + * @ignore + */ + transform: function (x2x, x2y, y2x, y2y, newDx, newDy) { + matrix.append(x2x, x2y, y2x, y2y, newDx, newDy); + this.updatePrecisionCompensate(); + }, + + /** + * Scales the transformation matrix. + * @return {*} + * @ignore + */ + scale: function (sx, sy) { + return this.transform(sx, 0, 0, sy, 0, 0); + }, + + /** + * Translates the transformation matrix. + * @return {*} + * @ignore + */ + translate: function (dx, dy) { + return this.transform(1, 0, 0, 1, dx, dy); + }, + + /** + * Rotates the transformation matrix. + * @return {*} + * @ignore + */ + rotate: function (radians) { + var cos = Math.cos(radians), + sin = Math.sin(radians); + return this.transform(cos, sin, -sin, cos, 0, 0); + }, + + /** + * Adds the given point to the current subpath, connected to the previous one by a + * quadratic Bézier curve with the given control point. + * @return {*} + * @ignore + */ + quadraticCurveTo: function (cx, cy, x, y) { + return originalCtx.quadraticCurveTo.call(this, + cx * xx + dx, + cy * yy + dy, + x * xx + dx, + y * yy + dy + ); + }, + + /** + * Adds the given point to the current subpath, connected to the previous one by a cubic + * Bézier curve with the given control points. + * @return {*} + * @ignore + */ + bezierCurveTo: function (c1x, c1y, c2x, c2y, x, y) { + return originalCtx.bezierCurveTo.call(this, + c1x * xx + dx, + c1y * yy + dy, + c2x * xx + dx, + c2y * yy + dy, + x * xx + dx, + y * yy + dy + ); + }, + + /** + * Returns an object that represents a linear gradient that paints along the line given + * by the coordinates represented by the arguments. + * @return {*} + * @ignore + */ + createLinearGradient: function (x0, y0, x1, y1) { + this.updatePrecisionCompensateRect(); + var grad = originalCtx.createLinearGradient.call(this, + x0 * xx + dx, + y0 * yy + dy, + x1 * xx + dx, + y1 * yy + dy + ); + this.updatePrecisionCompensate(); + return grad; + }, + + /** + * Returns a CanvasGradient object that represents a radial gradient that paints along + * the cone given by the circles represented by the arguments. If either of the radii + * are negative, throws an IndexSizeError exception. + * @return {*} + * @ignore + */ + createRadialGradient: function (x0, y0, r0, x1, y1, r1) { + this.updatePrecisionCompensateRect(); + var grad = originalCtx.createLinearGradient.call(this, + x0 * xx + dx, + y0 * xx + dy, + r0 * xx, + x1 * xx + dx, + y1 * xx + dy, + r1 * xx + ); + this.updatePrecisionCompensate(); + return grad; + }, + + /** + * Fills the given text at the given position. If a maximum width is provided, the text + * will be scaled to fit that width if necessary. + * @ignore + */ + fillText: function (text, x, y, maxWidth) { + originalCtx.setTransform.apply(this, matrix.elements); + if (typeof maxWidth === 'undefined') { + originalCtx.fillText.call(this, text, x, y); + } else { + originalCtx.fillText.call(this, text, x, y, maxWidth); + } + this.updatePrecisionCompensate(); + }, + + /** + * Strokes the given text at the given position. If a + * maximum width is provided, the text will be scaled to + * fit that width if necessary. + * @ignore + */ + strokeText: function (text, x, y, maxWidth) { + originalCtx.setTransform.apply(this, matrix.elements); + if (typeof maxWidth === 'undefined') { + originalCtx.strokeText.call(this, text, x, y); + } else { + originalCtx.strokeText.call(this, text, x, y, maxWidth); + } + this.updatePrecisionCompensate(); + }, + + /** + * Fills the subpaths of the current default path or the given path with the current fill style. + * @ignore + */ + fill: function () { + this.updatePrecisionCompensateRect(); + originalCtx.fill.call(this); + this.updatePrecisionCompensate(); + }, + + /** + * Strokes the subpaths of the current default path or the given path with the current stroke style. + * @ignore + */ + stroke: function () { + this.updatePrecisionCompensateRect(); + originalCtx.stroke.call(this); + this.updatePrecisionCompensate(); + }, + + /** + * Draws the given image onto the canvas. If the first argument isn't an img, canvas, + * or video element, throws a TypeMismatchError exception. If the image has no image + * data, throws an InvalidStateError exception. If the one of the source rectangle + * dimensions is zero, throws an IndexSizeError exception. If the image isn't yet fully + * decoded, then nothing is drawn. + * @return {*} + * @ignore + */ + drawImage: function (img_elem, arg1, arg2, arg3, arg4, dst_x, dst_y, dw, dh) { + switch (arguments.length) { + case 3: + return originalCtx.drawImage.call(this, img_elem, arg1 * xx + dx, arg2 * yy + dy); + case 5: + return originalCtx.drawImage.call(this, img_elem, arg1 * xx + dx, arg2 * yy + dy, arg3 * xx, arg4 * yy); + case 9: + return originalCtx.drawImage.call(this, img_elem, arg1, arg2, arg3, arg4, dst_x * xx + dx, dst_y * yy * dy, dw * xx, dh * yy); + } + } + }; + Ext.apply(ctx, override); + this.setDirty(true); + }, + + // Continue docs for the Canvas class + /** @class Ext.draw.engine.Canvas */ + + updateRegion: function (region) { + this.callSuper([region]); + + var me = this, + l = Math.floor(region[0]), + t = Math.floor(region[1]), + r = Math.ceil(region[0] + region[2]), + b = Math.ceil(region[1] + region[3]), + devicePixelRatio = me.devicePixelRatio, + w = r - l, + h = b - t, + splitThreshold = Math.round(me.splitThreshold / devicePixelRatio), + splits = Math.ceil(w / splitThreshold), + activeCanvases = me.activeCanvases, + i, offsetX, dom, leftWidth; + + for (i = 0, offsetX = 0; i < splits; i++, offsetX += splitThreshold) { + if (i >= me.canvases.length) { + me.createCanvas(); + } + dom = me.canvases[i].dom; + dom.style.left = offsetX + 'px'; + if (h * devicePixelRatio !== dom.height) { + dom.height = h * devicePixelRatio; + dom.style.height = h + 'px'; + } + leftWidth = Math.min(splitThreshold, w - offsetX); + if (leftWidth * devicePixelRatio !== dom.width) { + dom.width = leftWidth * devicePixelRatio; + dom.style.width = leftWidth + 'px'; + } + me.applyDefaults(me.contexts[i]); + } + + for (; i < activeCanvases; i++) { + dom = me.canvases[i].dom; + dom.width = 0; + dom.height = 0; + } + me.activeCanvases = splits; + me.clear(); + }, + + /** + * @inheritdoc + */ + clearTransform: function () { + var me = this, + activeCanvases = me.activeCanvases, + i, ctx; + + for (i = 0; i < activeCanvases; i++) { + ctx = me.contexts[i]; + ctx.translate(-me.splitThreshold * i, 0); + ctx.scale(me.devicePixelRatio, me.devicePixelRatio); + me.matrix.toContext(ctx); + } + + }, + + /** + * @private + * @inheritdoc + */ + renderSprite: function (sprite) { + var me = this, + region = me._region, + surfaceMatrix = me.matrix, + parent = sprite._parent, + matrix = Ext.draw.Matrix.fly([1, 0, 0, 1, 0, 0]), + bbox, i, offsetX, ctx, width, left = 0, top, right = region[2], bottom; + + while (parent && (parent !== me)) { + matrix.prependMatrix(parent.matrix || parent.attr && parent.attr.matrix); + parent = parent.getParent(); + } + matrix.prependMatrix(surfaceMatrix); + bbox = sprite.getBBox(); + if (bbox) { + bbox = matrix.transformBBox(bbox); + } + + sprite.preRender(me); + + if (sprite.attr.hidden || sprite.attr.globalAlpha === 0) { + sprite.setDirty(false); + return; + } + + top = 0; + bottom = top + region[3]; + + for (i = 0, offsetX = 0; i < me.activeCanvases; i++, offsetX += me.splitThreshold / me.devicePixelRatio) { + ctx = me.contexts[i]; + width = Math.min(region[2] - offsetX, me.splitThreshold / me.devicePixelRatio); + left = offsetX; + right = left + width; + + if (bbox) { + if (bbox.x > right || + bbox.x + bbox.width < left || + bbox.y > bottom || + bbox.y + bbox.height < top) { + continue; + } + } + + try { + ctx.save(); + // Set attributes to context. + sprite.useAttributes(ctx, region); + // Render shape + if (false === sprite.render(me, ctx, [left, top, width, bottom - top], region)) { + return false; + } + } finally { + ctx.restore(); + } + } + sprite.setDirty(false); + }, + + applyDefaults: function (ctx) { + ctx.strokeStyle = 'rgba(0,0,0,0)'; + ctx.fillStyle = 'rgba(0,0,0,0)'; + ctx.textAlign = 'start'; + ctx.textBaseline = 'top'; + ctx.miterLimit = 1; + }, + + /** + * @inheritdoc + */ + clear: function () { + var me = this, + activeCanvases = this.activeCanvases, + i, canvas, ctx; + for (i = 0; i < activeCanvases; i++) { + canvas = me.canvases[i].dom; + ctx = me.contexts[i]; + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.clearRect(0, 0, canvas.width, canvas.height); + } + me.setDirty(true); + }, + + /** + * Destroys the Canvas element and prepares it for Garbage Collection. + */ + destroy: function () { + var me = this, + i, ln = me.canvases.length; + for (i = 0; i < ln; i++) { + me.contexts[i] = null; + me.canvases[i].destroy(); + me.canvases[i] = null; + } + delete me.contexts; + delete me.canvases; + me.callSuper(arguments); + } +}, function () { + if (Ext.os.is.Android4 && Ext.browser.is.Chrome) { + this.prototype.splitThreshold = 3000; + } else if (Ext.os.is.Android) { + this.prototype.splitThreshold = 1e10; + } +}); \ No newline at end of file diff --git a/vendor/touch/src/draw/engine/Svg.js b/vendor/touch/src/draw/engine/Svg.js new file mode 100644 index 000000000..431ae1176 --- /dev/null +++ b/vendor/touch/src/draw/engine/Svg.js @@ -0,0 +1,195 @@ +/** + * @class Ext.draw.engine.Svg + * @extends Ext.draw.Surface + * + * SVG engine. + */ +Ext.define('Ext.draw.engine.Svg', { + extend: 'Ext.draw.Surface', + requires: ['Ext.draw.engine.SvgContext'], + + statics: { + BBoxTextCache: {} + }, + + config: { + /** + * Nothing needs to be done in high precision mode. + */ + highPrecision: false + }, + + getElementConfig: function () { + return { + reference: 'element', + style: { + position: 'absolute' + }, + children: [ + { + reference: 'innerElement', + style: { + width: '100%', + height: '100%', + position: 'relative' + }, + children: [ + { + tag: 'svg', + reference: 'svgElement', + namespace: "http://www.w3.org/2000/svg", + version: 1.1, + cls: 'x-surface' + } + ] + } + ] + }; + }, + + constructor: function (config) { + var me = this; + me.callSuper([config]); + me.mainGroup = me.createSvgNode("g"); + me.defElement = me.createSvgNode("defs"); + // me.svgElement is assigned in element creation of Ext.Component. + me.svgElement.appendChild(me.mainGroup); + me.svgElement.appendChild(me.defElement); + me.ctx = new Ext.draw.engine.SvgContext(me); + }, + + /** + * Creates a DOM element under the SVG namespace of the given type. + * @param {String} type The type of the SVG DOM element. + * @return {*} The created element. + */ + createSvgNode: function (type) { + var node = document.createElementNS("http://www.w3.org/2000/svg", type); + return Ext.get(node); + }, + + /** + * @private + * Returns the SVG DOM element at the given position. If it does not already exist or is a different element tag + * it will be created and inserted into the DOM. + * @param {Ext.dom.Element} group The parent DOM element. + * @param {String} tag The SVG element tag. + * @param {Number} position The position of the element in the DOM. + * @return {Ext.dom.Element} The SVG element. + */ + getSvgElement: function (group, tag, position) { + var element; + if (group.dom.childNodes.length > position) { + element = group.dom.childNodes[position]; + if (element.tagName === tag) { + return Ext.get(element); + } else { + Ext.destroy(element); + } + } + + element = Ext.get(this.createSvgNode(tag)); + if (position === 0) { + group.insertFirst(element); + } else { + element.insertAfter(Ext.fly(group.dom.childNodes[position - 1])); + } + element.cache = {}; + return element; + }, + + /** + * @private + * Applies attributes to the given element. + * @param {Ext.dom.Element} element The DOM element to be applied. + * @param {Object} attributes The attributes to apply to the element. + */ + setElementAttributes: function (element, attributes) { + var dom = element.dom, + cache = element.cache, + name, value; + for (name in attributes) { + value = attributes[name]; + if (cache[name] !== value) { + cache[name] = value; + dom.setAttribute(name, value); + } + } + }, + + /** + * @private + * Gets the next reference element under the SVG 'defs' tag. + * @param {String} tagName The type of reference element. + * @return {Ext.dom.Element} The reference element. + */ + getNextDef: function (tagName) { + return this.getSvgElement(this.defElement, tagName, this.defPosition++); + }, + + /** + * @inheritdoc + */ + clearTransform: function () { + var me = this; + me.mainGroup.set({transform: me.matrix.toSvg()}); + }, + + /** + * @inheritdoc + */ + clear: function () { + this.ctx.clear(); + this.defPosition = 0; + }, + + /** + * @inheritdoc + */ + renderSprite: function (sprite) { + var me = this, + region = me.getRegion(), + ctx = me.ctx; + if (sprite.attr.hidden || sprite.attr.opacity === 0) { + ctx.save(); + ctx.restore(); + return; + } + try { + sprite.element = ctx.save(); + sprite.preRender(this); + sprite.useAttributes(ctx, region); + if (false === sprite.render(this, ctx, [0, 0, region[2], region[3]])) { + return false; + } + sprite.setDirty(false); + } finally { + ctx.restore(); + } + }, + + /** + * Destroys the Canvas element and prepares it for Garbage Collection. + */ + destroy: function (path, matrix, band) { + var me = this; + me.ctx.destroy(); + me.mainGroup.destroy(); + delete me.mainGroup; + delete me.ctx; + me.callSuper(arguments); + }, + + remove: function (sprite, destroySprite) { + if (sprite && sprite.element) { + //if sprite has an associated svg element remove it from the surface + if (this.ctx) { + this.ctx.removeElement(sprite.element); + } else { + sprite.element.destroy(); + } + sprite.element = null; + } + this.callSuper(arguments); + } +}); diff --git a/vendor/touch/src/draw/engine/SvgContext.js b/vendor/touch/src/draw/engine/SvgContext.js new file mode 100644 index 000000000..03b069671 --- /dev/null +++ b/vendor/touch/src/draw/engine/SvgContext.js @@ -0,0 +1,718 @@ +/** + * @class Ext.draw.engine.SvgContext + * + * A class that imitates a canvas context but generates svg elements instead. + */ +Ext.define('Ext.draw.engine.SvgContext', { + /** + * @private + * Properties to be saved/restored in `save` and `restore` method. + */ + toSave: ["strokeOpacity", "strokeStyle", "fillOpacity", "fillStyle", "globalAlpha", "lineWidth", "lineCap", + "lineJoin", "lineDash", "lineDashOffset", "miterLimit", "shadowOffsetX", "shadowOffsetY", "shadowBlur", + "shadowColor", "globalCompositeOperation", "position"], + + "strokeOpacity": 1, + "strokeStyle": "none", + "fillOpacity": 1, + "fillStyle": "none", + "lineDash": [], + "lineDashOffset": 0, + "globalAlpha": 1, + "lineWidth": 1, + "lineCap": "butt", + "lineJoin": "miter", + "miterLimit": 10, + "shadowOffsetX": 0, + "shadowOffsetY": 0, + "shadowBlur": 0, + "shadowColor": "none", + "globalCompositeOperation": "src", + + urlStringRe: /^url\(#([\w\-]+)\)$/, + + constructor: function (SvgSurface) { + this.surface = SvgSurface; + this.status = []; + this.matrix = new Ext.draw.Matrix(); + this.path = null; + this.clear(); + }, + + /** + * Clears the context. + */ + clear: function () { + this.group = this.surface.mainGroup; + this.position = 0; + this.path = null; + }, + + /** + * @private + * @param {String} tag + * @return {*} + */ + getElement: function (tag) { + return this.surface.getSvgElement(this.group, tag, this.position++); + }, + + /** + * @private + * + * Destroys the DOM element and all associated gradients. + * + * @param element {HTMLElement|Ext.dom.Element|String} DOM element. + */ + removeElement: function (element) { + var element = Ext.fly(element), + fill, stroke, fillMatch, strokeMatch, + gradients, gradient, key; + + if (!element) { + return; + } + if (element.dom.tagName === 'g') { + gradients = element.dom.gradients; + for (key in gradients) { + gradients[key].destroy(); + } + } else { + fill = element.getAttribute('fill'); + stroke = element.getAttribute('stroke'); + fillMatch = fill && fill.match(this.urlStringRe); + strokeMatch = stroke && stroke.match(this.urlStringRe); + if (fillMatch && fillMatch[1]) { + gradient = Ext.fly(fillMatch[1]); + if (gradient) { + gradient.destroy(); + } + } + if (strokeMatch && strokeMatch[1]) { + gradient = Ext.fly(strokeMatch[1]); + if (gradient) { + gradient.destroy(); + } + } + } + element.destroy(); + }, + + /** + * Pushes the context state to the state stack. + */ + save: function () { + var toSave = this.toSave, + obj = {}, + group = this.getElement('g'), + key, i; + + for (i = 0; i < toSave.length; i++) { + key = toSave[i]; + if (key in this) { + obj[key] = this[key]; + } + } + this.position = 0; + obj.matrix = this.matrix.clone(); + this.status.push(obj); + this.group = group; + return group; + }, + + /** + * Pops the state stack and restores the state. + */ + restore: function () { + var toSave = this.toSave, + obj = this.status.pop(), + children = this.group.dom.childNodes, + key, i; + + // Removing extra DOM elements that were not reused. + while (children.length > this.position) { + this.removeElement(children[children.length - 1]); + } + for (i = 0; i < toSave.length; i++) { + key = toSave[i]; + if (key in obj) { + this[key] = obj[key]; + } else { + delete this[key]; + } + } + + this.setTransform.apply(this, obj.matrix.elements); + this.group = this.group.getParent(); + }, + + /** + * Changes the transformation matrix to apply the matrix given by the arguments as described below. + * @param {Number} xx + * @param {Number} yx + * @param {Number} xy + * @param {Number} yy + * @param {Number} dx + * @param {Number} dy + */ + transform: function (xx, yx, xy, yy, dx, dy) { + if (this.path) { + var inv = Ext.draw.Matrix.fly([xx, yx, xy, yy, dx, dy]).inverse(); + this.path.transform(inv); + } + this.matrix.append(xx, yx, xy, yy, dx, dy); + }, + + /** + * Changes the transformation matrix to the matrix given by the arguments as described below. + * @param {Number} xx + * @param {Number} yx + * @param {Number} xy + * @param {Number} yy + * @param {Number} dx + * @param {Number} dy + */ + setTransform: function (xx, yx, xy, yy, dx, dy) { + if (this.path) { + this.path.transform(this.matrix); + } + this.matrix.reset(); + this.transform(xx, yx, xy, yy, dx, dy); + }, + + /** + * Scales the current context by the specified horizontal (x) and vertical (y) factors. + * @param {Number} x The horizontal scaling factor, where 1 equals unity or 100% scale. + * @param {Number} y The vertical scaling factor. + */ + scale: function (x, y) { + this.transform(x, 0, 0, y, 0, 0); + }, + + /** + * Rotates the current context coordinates (that is, a transformation matrix). + * @param {Number} angle The rotation angle, in radians. + */ + rotate: function (angle) { + var xx = Math.cos(angle), + yx = Math.sin(angle), + xy = -Math.sin(angle), + yy = Math.cos(angle); + this.transform(xx, yx, xy, yy, 0, 0); + }, + + /** + * Specifies values to move the origin point in a canvas. + * @param {Number} x The value to add to horizontal (or x) coordinates. + * @param {Number} y The value to add to vertical (or y) coordinates. + */ + translate: function (x, y) { + this.transform(1, 0, 0, 1, x, y); + }, + + setGradientBBox: function (bbox) { + this.bbox = bbox; + }, + + /** + * Resets the current default path. + */ + beginPath: function () { + this.path = new Ext.draw.Path(); + }, + + /** + * Creates a new subpath with the given point. + * @param {Number} x + * @param {Number} y + */ + moveTo: function (x, y) { + if (!this.path) { + this.beginPath(); + } + this.path.moveTo(x, y); + this.path.element = null; + }, + + /** + * Adds the given point to the current subpath, connected to the previous one by a straight line. + * @param {Number} x + * @param {Number} y + */ + lineTo: function (x, y) { + if (!this.path) { + this.beginPath(); + } + this.path.lineTo(x, y); + this.path.element = null; + }, + + /** + * Adds a new closed subpath to the path, representing the given rectangle. + * @param {Number} x + * @param {Number} y + * @param {Number} width + * @param {Number} height + */ + rect: function (x, y, width, height) { + this.moveTo(x, y); + this.lineTo(x + width, y); + this.lineTo(x + width, y + height); + this.lineTo(x, y + height); + this.closePath(); + }, + + /** + * Paints the box that outlines the given rectangle onto the canvas, using the current stroke style. + * @param {Number} x + * @param {Number} y + * @param {Number} width + * @param {Number} height + */ + strokeRect: function (x, y, width, height) { + this.beginPath(); + this.rect(x, y, width, height); + this.stroke(); + }, + + /** + * Paints the given rectangle onto the canvas, using the current fill style. + * @param {Number} x + * @param {Number} y + * @param {Number} width + * @param {Number} height + */ + fillRect: function (x, y, width, height) { + this.beginPath(); + this.rect(x, y, width, height); + this.fill(); + }, + + /** + * Marks the current subpath as closed, and starts a new subpath with a point the same as the start and end of the newly closed subpath. + */ + closePath: function () { + if (!this.path) { + this.beginPath(); + } + this.path.closePath(); + this.path.element = null; + }, + + /** + * Arc command using svg parameters. + * @param {Number} r1 + * @param {Number} r2 + * @param {Number} rotation + * @param {Number} large + * @param {Number} swipe + * @param {Number} x2 + * @param {Number} y2 + */ + arcSvg: function (r1, r2, rotation, large, swipe, x2, y2) { + if (!this.path) { + this.beginPath(); + } + this.path.arcSvg(r1, r2, rotation, large, swipe, x2, y2); + this.path.element = null; + }, + + /** + * Adds points to the subpath such that the arc described by the circumference of the circle described by the arguments, starting at the given start angle and ending at the given end angle, going in the given direction (defaulting to clockwise), is added to the path, connected to the previous point by a straight line. + * @param {Number} x + * @param {Number} y + * @param {Number} radius + * @param {Number} startAngle + * @param {Number} endAngle + * @param {Number} anticlockwise + */ + arc: function (x, y, radius, startAngle, endAngle, anticlockwise) { + if (!this.path) { + this.beginPath(); + } + this.path.arc(x, y, radius, startAngle, endAngle, anticlockwise); + this.path.element = null; + }, + + /** + * Adds points to the subpath such that the arc described by the circumference of the ellipse described by the arguments, starting at the given start angle and ending at the given end angle, going in the given direction (defaulting to clockwise), is added to the path, connected to the previous point by a straight line. + * @param {Number} x + * @param {Number} y + * @param {Number} radiusX + * @param {Number} radiusY + * @param {Number} rotation + * @param {Number} startAngle + * @param {Number} endAngle + * @param {Number} anticlockwise + */ + ellipse: function (x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) { + if (!this.path) { + this.beginPath(); + } + this.path.ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise); + this.path.element = null; + }, + + /** + * Adds an arc with the given control points and radius to the current subpath, connected to the previous point by a straight line. + * If two radii are provided, the first controls the width of the arc's ellipse, and the second controls the height. If only one is provided, or if they are the same, the arc is from a circle. + * In the case of an ellipse, the rotation argument controls the clockwise inclination of the ellipse relative to the x-axis. + * @param {Number} x1 + * @param {Number} y1 + * @param {Number} x2 + * @param {Number} y2 + * @param {Number} radiusX + * @param {Number} radiusY + * @param {Number} rotation + */ + arcTo: function (x1, y1, x2, y2, radiusX, radiusY, rotation) { + if (!this.path) { + this.beginPath(); + } + this.path.arcTo(x1, y1, x2, y2, radiusX, radiusY, rotation); + this.path.element = null; + }, + + /** + * Adds the given point to the current subpath, connected to the previous one by a cubic Bézier curve with the given control points. + * @param {Number} x1 + * @param {Number} y1 + * @param {Number} x2 + * @param {Number} y2 + * @param {Number} x3 + * @param {Number} y3 + */ + bezierCurveTo: function (x1, y1, x2, y2, x3, y3) { + if (!this.path) { + this.beginPath(); + } + this.path.bezierCurveTo(x1, y1, x2, y2, x3, y3); + this.path.element = null; + }, + + /** + * Strokes the given text at the given position. If a maximum width is provided, the text will be scaled to fit that width if necessary. + * @param {String} text + * @param {Number} x + * @param {Number} y + */ + strokeText: function (text, x, y) { + text = String(text); + if (this.strokeStyle) { + var element = this.getElement('text'), + tspan = this.surface.getSvgElement(element, 'tspan', 0); + this.surface.setElementAttributes(element, { + "x": x, + "y": y, + "transform": this.matrix.toSvg(), + "stroke": this.strokeStyle, + "fill": "none", + "opacity": this.globalAlpha, + "stroke-opacity": this.strokeOpacity, + "style": "font: " + this.font + }); + if (this.lineDash.length) { + this.surface.setElementAttributes(element, { + "stroke-dasharray": this.lineDash.join(','), + "stroke-dashoffset": this.lineDashOffset + }); + } + if (tspan.dom.firstChild) { + tspan.dom.removeChild(tspan.dom.firstChild); + } + this.surface.setElementAttributes(tspan, { + "alignment-baseline": "middle", + "baseline-shift": "-50%" + }); + tspan.appendChild(document.createTextNode(Ext.String.htmlDecode(text))); + } + }, + + /** + * Fills the given text at the given position. If a maximum width is provided, the text will be scaled to fit that width if necessary. + * @param {String} text + * @param {Number} x + * @param {Number} y + */ + fillText: function (text, x, y) { + text = String(text); + if (this.fillStyle) { + var element = this.getElement('text'), + tspan = this.surface.getSvgElement(element, 'tspan', 0); + this.surface.setElementAttributes(element, { + "x": x, + "y": y, + "transform": this.matrix.toSvg(), + "fill": this.fillStyle, + "opacity": this.globalAlpha, + "fill-opacity": this.fillOpacity, + "style": "font: " + this.font + }); + if (tspan.dom.firstChild) { + tspan.dom.removeChild(tspan.dom.firstChild); + } + this.surface.setElementAttributes(tspan, { + "alignment-baseline": "middle", + "baseline-shift": "-50%" + }); + tspan.appendChild(document.createTextNode(Ext.String.htmlDecode(text))); + } + }, + + /** + * Draws the given image onto the canvas. + * If the first argument isn't an img, canvas, or video element, throws a TypeMismatchError exception. If the image has no image data, throws an InvalidStateError exception. If the one of the source rectangle dimensions is zero, throws an IndexSizeError exception. If the image isn't yet fully decoded, then nothing is drawn. + * @param {HTMLElement} image + * @param {Number} sx + * @param {Number} sy + * @param {Number} sw + * @param {Number} sh + * @param {Number} dx + * @param {Number} dy + * @param {Number} dw + * @param {Number} dh + */ + drawImage: function (image, sx, sy, sw, sh, dx, dy, dw, dh) { + var me = this, + element = me.getElement('image'), + x = sx, y = sy, + width = typeof sw === 'undefined' ? image.width : sw, + height = typeof sh === 'undefined' ? image.height : sh, + viewBox = null; + if (typeof dh !== 'undefined') { + viewBox = sx + " " + sy + " " + sw + " " + sh; + x = dx; + y = dy; + width = dw; + height = dh; + } + element.dom.setAttributeNS("http:/" + "/www.w3.org/1999/xlink", "href", image.src); + me.surface.setElementAttributes(element, { + viewBox: viewBox, + x: x, + y: y, + width: width, + height: height, + opacity: me.globalAlpha, + transform: me.matrix.toSvg() + }); + }, + + /** + * Fills the subpaths of the current default path or the given path with the current fill style. + */ + fill: function () { + if (!this.path) { + return; + } + if (this.fillStyle) { + var path, + fillGradient = this.fillGradient, + bbox = this.bbox, + element = this.path.element; + if (!element) { + path = this.path.toString(); + element = this.path.element = this.getElement('path'); + this.surface.setElementAttributes(element, { + "d": path, + "transform": this.matrix.toSvg() + }); + } + this.surface.setElementAttributes(element, { + "fill": fillGradient && bbox ? fillGradient.generateGradient(this, bbox) : this.fillStyle, + "fill-opacity": this.fillOpacity * this.globalAlpha + }); + } + }, + + /** + * Strokes the subpaths of the current default path or the given path with the current stroke style. + */ + stroke: function () { + if (!this.path) { + return; + } + if (this.strokeStyle) { + var path, + strokeGradient = this.strokeGradient, + bbox = this.bbox, + element = this.path.element; + if (!element || !this.path.svgString) { + path = this.path.toString(); + element = this.path.element = this.getElement('path'); + this.surface.setElementAttributes(element, { + "fill": "none", + "d": path, + "transform": this.matrix.toSvg() + }); + } + this.surface.setElementAttributes(element, { + "stroke": strokeGradient && bbox ? strokeGradient.generateGradient(this, bbox) : this.strokeStyle, + "stroke-linecap": this.lineCap, + "stroke-linejoin": this.lineJoin, + "stroke-width": this.lineWidth, + "stroke-opacity": this.strokeOpacity * this.globalAlpha + }); + if (this.lineDash.length) { + this.surface.setElementAttributes(element, { + "stroke-dasharray": this.lineDash.join(','), + "stroke-dashoffset": this.lineDashOffset + }); + } + } + }, + + /** + * @protected + * + * Note: After the method guarantees the transform matrix will be inverted. + * @param {Object} attr The attribute object + * @param {Boolean} [transformFillStroke] Indicate whether to transform fill and stroke. If this is not + * given, then uses `attr.transformFillStroke` instead. + */ + fillStroke: function (attr, transformFillStroke) { + var ctx = this, + fillStyle = ctx.fillStyle, + strokeStyle = ctx.strokeStyle, + fillOpacity = ctx.fillOpacity, + strokeOpacity = ctx.strokeOpacity; + + if (transformFillStroke === undefined) { + transformFillStroke = attr.transformFillStroke; + } + + if (!transformFillStroke) { + attr.inverseMatrix.toContext(ctx); + } + + if (fillStyle && fillOpacity !== 0) { + ctx.fill(); + } + + if (strokeStyle && strokeOpacity !== 0) { + ctx.stroke(); + } + }, + + appendPath: function (path) { + this.path = path.clone(); + }, + + /** + * Returns an object that represents a linear gradient that paints along the line given by the coordinates represented by the arguments. + * @param {Number} x0 + * @param {Number} y0 + * @param {Number} x1 + * @param {Number} y1 + * @return {Ext.draw.engine.SvgContext.Gradient} + */ + createLinearGradient: function (x0, y0, x1, y1) { + var me = this, + element = me.surface.getNextDef('linearGradient'), + gradients = me.group.dom.gradients || (me.group.dom.gradients = {}), + gradient; + me.surface.setElementAttributes(element, { + "x1": x0, + "y1": y0, + "x2": x1, + "y2": y1, + "gradientUnits": "userSpaceOnUse" + }); + gradient = new Ext.draw.engine.SvgContext.Gradient(me, me.surface, element); + gradients[element.dom.id] = gradient; + return gradient; + }, + + /** + * Returns a CanvasGradient object that represents a radial gradient that paints along the cone given by the circles represented by the arguments. + * If either of the radii are negative, throws an IndexSizeError exception. + * @param {Number} x0 + * @param {Number} y0 + * @param {Number} r0 + * @param {Number} x1 + * @param {Number} y1 + * @param {Number} r1 + * @return {Ext.draw.engine.SvgContext.Gradient} + */ + createRadialGradient: function (x0, y0, r0, x1, y1, r1) { + var me = this, + element = me.surface.getNextDef('radialGradient'), + gradients = me.group.dom.gradients || (me.group.dom.gradients = {}), + gradient; + me.surface.setElementAttributes(element, { + "fx": x0, + "fy": y0, + "cx": x1, + "cy": y1, + "r": r1, + "gradientUnits": "userSpaceOnUse" + }); + gradient = new Ext.draw.engine.SvgContext.Gradient(me, me.surface, element, r0 / r1); + gradients[element.dom.id] = gradient; + return gradient; + } +}); + +/** + * @class Ext.draw.engine.SvgContext.Gradient + */ +Ext.define("Ext.draw.engine.SvgContext.Gradient", { + + statics: { + map: {} + }, + + constructor: function (ctx, surface, element, compression) { + var map = this.statics().map, + oldInstance; + + // Because of the way Ext.draw.engine.Svg.getNextDef works, + // there is no guarantee that an existing DOM element from the 'defs' section won't be used + // for the 'element' param. + oldInstance = map[element.dom.id]; + if (oldInstance) { + oldInstance.element = null; + } + map[element.dom.id] = this; + + this.ctx = ctx; + this.surface = surface; + this.element = element; + this.position = 0; + this.compression = compression || 0; + }, + + /** + * Adds a color stop with the given color to the gradient at the given offset. 0.0 is the offset at one end of the gradient, 1.0 is the offset at the other end. + * @param {Number} offset + * @param {String} color + */ + addColorStop: function (offset, color) { + var stop = this.surface.getSvgElement(this.element, 'stop', this.position++), + compression = this.compression; + this.surface.setElementAttributes(stop, { + "offset": (((1 - compression) * offset + compression) * 100).toFixed(2) + '%', + "stop-color": color, + "stop-opacity": Ext.draw.Color.fly(color).a.toFixed(15) + }); + }, + + toString: function () { + var children = this.element.dom.childNodes; + // Removing surplus stops in case existing gradient element with more stops was reused. + while (children.length > this.position) { + Ext.fly(children[children.length - 1]).destroy(); + } + return 'url(#' + this.element.getId() + ')'; + }, + + destroy: function () { + var map = this.statics().map, + element = this.element; + if (element) { + delete map[element.dom.id]; + element.destroy(); + } + this.callSuper(); + } +}); diff --git a/vendor/touch/src/draw/engine/SvgExporter.js b/vendor/touch/src/draw/engine/SvgExporter.js new file mode 100644 index 000000000..20f2da946 --- /dev/null +++ b/vendor/touch/src/draw/engine/SvgExporter.js @@ -0,0 +1,150 @@ +/** + * Exports an SVG document to an image. To do this, + * the SVG string must be sent to a remote server and processed. + * + * # Sending the data + * + * A post request is made to the URL. The following fields are sent: + * + * + width: The width of the image + * + height: The height of the image + * + type: The image type to save as, see {@link #supportedTypes} + * + svg: The svg string for the surface + * + * # The response + * + * It is expected that the user will be prompted with an image download. + * As such, the following options should be set on the server: + * + * + Content-Disposition: 'attachment, filename="chart.png"' + * + Content-Type: 'image/png' + * + * **Important**: By default, chart data is sent to a server operated + * by Sencha to do data processing. You may change this default by + * setting the {@link #defaultUrl} of this class. + * In addition, please note that this service only creates PNG images. + */ +// TODO: can't use the canvas element to convert SVG to bitmap on the client, see: +// TODO: http://stackoverflow.com/questions/18586808/canvas-todatauri-on-chrome-security-issue +Ext.define('Ext.draw.engine.SvgExporter', { + singleton: true, + + /** + * @property {String} [defaultUrl="http://svg.sencha.io"] + * The default URL to submit the form request. + */ + defaultUrl: 'http://svg.sencha.io', + + /** + * @property {Array} [supportedTypes=["image/png", "image/jpeg"]] + * A list of export types supported by the server + */ + supportedTypes: ['image/png', 'image/jpeg'], + + /** + * @property {String} [widthParam="width"] + * The name of the width parameter to be sent to the server. + * The Sencha IO server expects it to be the default value. + */ + widthParam: 'width', + + /** + * @property {String} [heightParam="height"] + * The name of the height parameter to be sent to the server. + * The Sencha IO server expects it to be the default value. + */ + heightParam: 'height', + + /** + * @property {String} [typeParam="type"] + * The name of the type parameter to be sent to the server. + * The Sencha IO server expects it to be the default value. + */ + typeParam: 'type', + + /** + * @property {String} [svgParam="svg"] + * The name of the svg parameter to be sent to the server. + * The Sencha IO server expects it to be the default value. + */ + svgParam: 'svg', + + formCls: Ext.baseCSSPrefix + 'hide-display', + + /** + * Exports the surface to an image + * @param {String} svg The SVG document. + * @param {Object} [config] The following config options are supported: + * + * @param {Number} config.width A width to send to the server to for + * configuring the image width (required) + * + * @param {Number} config.height A height to send to the server for + * configuring the image height (required) + * + * @param {String} config.url The url to post the data to. Defaults to + * the {@link #defaultUrl} configuration on the class. + * + * @param {String} config.type The type of image to export. See the + * {@link #supportedTypes} + * + * @param {String} config.widthParam The name of the width parameter to send + * to the server. Defaults to {@link #widthParam} + * + * @param {String} config.heightParam The name of the height parameter to send + * to the server. Defaults to {@link #heightParam} + * + * @param {String} config.typeParam The name of the type parameter to send + * to the server. Defaults to {@link #typeParam} + * + * @param {String} config.svgParam The name of the svg parameter to send + * to the server. Defaults to {@link #svgParam} + * + * @return {Boolean} True if the surface was successfully sent to the server. + */ + generate: function(svg, config) { + config = config || {}; + var me = this, + type = config.type, + form; + + if (Ext.Array.indexOf(me.supportedTypes, type) === -1) { + return false; + } + + form = Ext.getBody().createChild({ + tag: 'form', + method: 'POST', + action: config.url || me.defaultUrl, + cls: me.formCls, + children: [{ + tag: 'input', + type: 'hidden', + name: config.widthParam || me.widthParam, + value: config.width + }, { + tag: 'input', + type: 'hidden', + name: config.heightParam || me.heightParam, + value: config.height + }, { + tag: 'input', + type: 'hidden', + name: config.typeParam || me.typeParam, + value: type + }, { + tag: 'input', + type: 'hidden', + name: config.svgParam || me.svgParam + }] + }); + + // Assign the data on the value so it doesn't get messed up in the html insertion + form.last(null, true).value = svg; + + form.dom.submit(); + form.remove(); + return true; + } + +}); diff --git a/vendor/touch/src/draw/gradient/Gradient.js b/vendor/touch/src/draw/gradient/Gradient.js new file mode 100644 index 000000000..c47f213bd --- /dev/null +++ b/vendor/touch/src/draw/gradient/Gradient.js @@ -0,0 +1,55 @@ +/** + * @class Ext.draw.gradient.Gradient + * + * Creates a gradient. + */ +Ext.define('Ext.draw.gradient.Gradient', { + + isGradient: true, + + config: { + /** + * @cfg {Array/Object} Defines the stops of the gradient. + */ + stops: [] + }, + + applyStops: function (newStops) { + var stops = [], + ln = newStops.length, + i, stop, color; + + for (i = 0; i < ln; i++) { + stop = newStops[i]; + color = Ext.draw.Color.fly(stop.color || 'none'); + stops.push({ + offset: Math.min(1, Math.max(0, 'offset' in stop ? stop.offset : stop.position || 0)), + color: color.toString() + }); + } + stops.sort(function (a, b) { + return a.offset - b.offset; + }); + return stops; + }, + + onClassExtended: function (subClass, member) { + if (!member.alias && member.type) { + member.alias = 'gradient.' + member.type; + } + }, + + constructor: function (config) { + this.initConfig(config); + }, + + /** + * @protected + * Generates the gradient for the given context. + * @param {Ext.draw.engine.SvgContext} ctx The context. + * @param {Object} bbox + * @return {Object} + */ + generateGradient: Ext.emptyFn + +}); diff --git a/vendor/touch/src/draw/gradient/GradientDefinition.js b/vendor/touch/src/draw/gradient/GradientDefinition.js new file mode 100644 index 000000000..99442b78e --- /dev/null +++ b/vendor/touch/src/draw/gradient/GradientDefinition.js @@ -0,0 +1,27 @@ +Ext.define('Ext.draw.gradient.GradientDefinition', { + singleton: true, + + urlStringRe: /^url\(#([\w\-]+)\)$/, + gradients: {}, + + add: function (gradients) { + var store = this.gradients, + i, n, gradient; + for (i = 0, n = gradients.length; i < n; i++) { + gradient = gradients[i]; + if (Ext.isString(gradient.id)) { + store[gradient.id] = gradient; + } + } + }, + + get: function (str) { + var store = this.gradients, + match = str.match(this.urlStringRe), + gradient; + if (match && match[1] && (gradient = store[match[1]])) { + return gradient || str; + } + return str; + } +}); \ No newline at end of file diff --git a/vendor/touch/src/draw/gradient/Linear.js b/vendor/touch/src/draw/gradient/Linear.js new file mode 100644 index 000000000..7dc03ab8a --- /dev/null +++ b/vendor/touch/src/draw/gradient/Linear.js @@ -0,0 +1,75 @@ +/** + * Linear gradient. + * + * @example preview miniphone + * var component = new Ext.draw.Component({ + * items: [{ + * type: 'circle', + * cx: 50, + * cy: 50, + * r: 100, + * fillStyle: { + * type: 'linear', + * degrees: 0, + * stops: [ + * { + * offset: 0, + * color: 'white' + * }, + * { + * offset: 1, + * color: 'blue' + * } + * ] + * } + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(component); + */ + +Ext.define("Ext.draw.gradient.Linear", { + extend: 'Ext.draw.gradient.Gradient', + type: 'linear', + config: { + /** + * @cfg {Number} The degree of rotation of the gradient. + */ + degrees: 0 + }, + + setAngle: function (angle) { + this.setDegrees(angle); + }, + + /** + * @inheritdoc + */ + generateGradient: function (ctx, bbox) { + var angle = Ext.draw.Draw.rad(this.getDegrees()), + cos = Math.cos(angle), + sin = Math.sin(angle), + w = bbox.width, + h = bbox.height, + cx = bbox.x + w * 0.5, + cy = bbox.y + h * 0.5, + stops = this.getStops(), + ln = stops.length, + gradient, + l, i; + + if (!isNaN(cx) && !isNaN(cy) && h > 0 && w > 0) { + l = (Math.sqrt(h * h + w * w) * Math.abs(Math.cos(angle - Math.atan(h / w)))) / 2; + gradient = ctx.createLinearGradient( + cx + cos * l, cy + sin * l, + cx - cos * l, cy - sin * l + ); + + for (i = 0; i < ln; i++) { + gradient.addColorStop(stops[i].offset, stops[i].color); + } + return gradient; + } + return 'none'; + } +}); \ No newline at end of file diff --git a/vendor/touch/src/draw/gradient/Radial.js b/vendor/touch/src/draw/gradient/Radial.js new file mode 100644 index 000000000..1cdb50cd8 --- /dev/null +++ b/vendor/touch/src/draw/gradient/Radial.js @@ -0,0 +1,144 @@ +/** + * Radial gradient. + * + * @example preview miniphone + * var component = new Ext.draw.Component({ + * items: [{ + * type: 'circle', + * cx: 50, + * cy: 50, + * r: 100, + * fillStyle: { + * type: 'radial', + * start: { + * x: 0, + * y: 0, + * r: 0 + * }, + * end: { + * x: 0, + * y: 0, + * r: 1 + * }, + * stops: [ + * { + * offset: 0, + * color: 'white' + * }, + * { + * offset: 1, + * color: 'blue' + * } + * ] + * } + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(component); + */ +Ext.define("Ext.draw.gradient.Radial", { + extend: 'Ext.draw.gradient.Gradient', + type: 'radial', + config: { + /** + * @cfg {Object} start The starting circle of the gradient. + */ + start: { + x: 0, + y: 0, + r: 0 + }, + /** + * @cfg {Object} end The ending circle of the gradient. + */ + end: { + x: 0, + y: 0, + r: 1 + } + }, + + applyStart: function (newStart, oldStart) { + if (!oldStart) { + return newStart; + } + var circle = { + x: oldStart.x, + y: oldStart.y, + r: oldStart.r + }; + + if ('x' in newStart) { + circle.x = newStart.x; + } else if ('centerX' in newStart) { + circle.x = newStart.centerX; + } + + if ('y' in newStart) { + circle.y = newStart.y; + } else if ('centerY' in newStart) { + circle.y = newStart.centerY; + } + + if ('r' in newStart) { + circle.r = newStart.r; + } else if ('radius' in newStart) { + circle.r = newStart.radius; + } + return circle; + }, + + applyEnd: function (newEnd, oldEnd) { + if (!oldEnd) { + return newEnd; + } + var circle = { + x: oldEnd.x, + y: oldEnd.y, + r: oldEnd.r + }; + + if ('x' in newEnd) { + circle.x = newEnd.x; + } else if ('centerX' in newEnd) { + circle.x = newEnd.centerX; + } + + if ('y' in newEnd) { + circle.y = newEnd.y; + } else if ('centerY' in newEnd) { + circle.y = newEnd.centerY; + } + + if ('r' in newEnd) { + circle.r = newEnd.r; + } else if ('radius' in newEnd) { + circle.r = newEnd.radius; + } + return circle; + }, + + /** + * @inheritdoc + */ + generateGradient: function (ctx, bbox) { + var start = this.getStart(), + end = this.getEnd(), + w = bbox.width * 0.5, + h = bbox.height * 0.5, + x = bbox.x + w, + y = bbox.y + h, + gradient = ctx.createRadialGradient( + x + start.x * w, y + start.y * h, start.r * Math.max(w, h), + x + end.x * w, y + end.y * h, end.r * Math.max(w, h) + ), + stops = this.getStops(), + ln = stops.length, + i; + + for (i = 0; i < ln; i++) { + gradient.addColorStop(stops[i].offset, stops[i].color); + } + return gradient; + } +}); \ No newline at end of file diff --git a/vendor/touch/src/draw/modifier/Animation.js b/vendor/touch/src/draw/modifier/Animation.js new file mode 100644 index 000000000..11293cb66 --- /dev/null +++ b/vendor/touch/src/draw/modifier/Animation.js @@ -0,0 +1,437 @@ +/** + * The Animation modifier. + * + * Sencha Touch allows users to use transitional animation on sprites. Simply set the duration + * and easing in the animation modifier, then all the changes to the sprites will be animated. + * + * Also, you can use different durations and easing functions on different attributes by using + * {@link #customDuration} and {@link #customEasings}. + * + * By default, an animation modifier will be created during the initialization of a sprite. + * You can get the modifier of `sprite` by `sprite.fx`. + * + */ +Ext.define("Ext.draw.modifier.Animation", { + mixins: { + observable: 'Ext.mixin.Observable' + }, + requires: [ + 'Ext.draw.TimingFunctions', + 'Ext.draw.Animator' + ], + extend: 'Ext.draw.modifier.Modifier', + alias: 'modifier.animation', + + config: { + /** + * @cfg {Function} easing + * Default easing function. + */ + easing: function (x) { + return x; + }, + + /** + * @cfg {Number} duration + * Default duration time (ms). + */ + duration: 0, + + /** + * @cfg {Object} customEasings Overrides the default easing function for defined attributes. + */ + customEasings: {}, + + /** + * @cfg {Object} customDuration Overrides the default duration for defined attributes. + */ + customDuration: {} + }, + + constructor: function () { + this.anyAnimation = false; + this.anySpecialAnimations = false; + this.animating = 0; + this.animatingPool = []; + this.callSuper(arguments); + }, + + /** + * @inheritdoc + */ + prepareAttributes: function (attr) { + if (!attr.hasOwnProperty('timers')) { + attr.animating = false; + attr.timers = {}; + attr.animationOriginal = Ext.Object.chain(attr); + attr.animationOriginal.upperLevel = attr; + } + if (this._previous) { + this._previous.prepareAttributes(attr.animationOriginal); + } + }, + + updateSprite: function (sprite) { + // Apply the config that was configured in the sprite. + this.setConfig(sprite.config.fx); + }, + + updateDuration: function (duration) { + this.anyAnimation = duration > 0; + }, + + applyEasing: function (easing) { + if (typeof easing === 'string') { + return Ext.draw.TimingFunctions.easingMap[easing]; + } else { + return easing; + } + }, + + applyCustomEasings: function (newCustomEasing, oldCustomEasing) { + oldCustomEasing = oldCustomEasing || {}; + var attr, attrs, easing, i, ln; + + for (attr in newCustomEasing) { + easing = newCustomEasing[attr]; + attrs = attr.split(','); + if (typeof easing === 'string') { + easing = Ext.draw.TimingFunctions.easingMap[easing]; + } + for (i = 0, ln = attrs.length; i < ln; i++) { + oldCustomEasing[attrs[i]] = easing; + } + } + return oldCustomEasing; + }, + + /** + * Set special easings on the given attributes. E.g.: + * + * circleSprite.fx.setEasingOn('r', 'elasticIn'); + * + * @param {String/Array} attrs The source attribute(s). + * @param {String} easing The special easings. + */ + setEasingOn: function (attrs, easing) { + attrs = Ext.Array.from(attrs).slice(); + var customEasings = {}, + i = 0, + ln = attrs.length; + + for (; i < ln; i++) { + customEasings[attrs[i]] = easing; + } + this.setCustomEasings(customEasings); + }, + + /** + * Remove special easings on the given attributes. + * @param {String/Array} attrs The source attribute(s). + */ + clearEasingOn: function (attrs) { + attrs = Ext.Array.from(attrs, true); + var i = 0, ln = attrs.length; + for (; i < ln; i++) { + delete this._customEasings[attrs[i]]; + } + }, + + applyCustomDuration: function (newCustomDuration, oldCustomDuration) { + oldCustomDuration = oldCustomDuration || {}; + var attr, duration, attrs, i, ln, anySpecialAnimations = this.anySpecialAnimations; + + for (attr in newCustomDuration) { + duration = newCustomDuration[attr]; + attrs = attr.split(','); + anySpecialAnimations = true; + + for (i = 0, ln = attrs.length; i < ln; i++) { + oldCustomDuration[attrs[i]] = duration; + } + } + this.anySpecialAnimations = anySpecialAnimations; + return oldCustomDuration; + }, + + /** + * Set special duration on the given attributes. E.g.: + * + * rectSprite.fx.setDurationOn('height', 2000); + * + * @param {String/Array} attrs The source attributes. + * @param {Number} duration The special duration. + */ + setDurationOn: function (attrs, duration) { + attrs = Ext.Array.from(attrs).slice(); + var customDurations = {}, + i = 0, + ln = attrs.length; + + for (; i < ln; i++) { + customDurations[attrs[i]] = duration; + } + this.setCustomDuration(customDurations); + }, + + /** + * Remove special easings on the given attributes. + * @param {Object} attrs The source attributes. + */ + clearDurationOn: function (attrs) { + attrs = Ext.Array.from(attrs, true); + var i = 0, ln = attrs.length; + + for (; i < ln; i++) { + delete this._customDuration[attrs[i]]; + } + }, + + /** + * @private + * Initializes Animator for the animation. + * @param {Object} attributes The source attributes. + * @param {String} animating The animating flag. + */ + setAnimating: function (attributes, animating) { + var me = this, + i, j; + + if (attributes.animating !== animating) { + attributes.animating = animating; + if (animating) { + me.animatingPool.push(attributes); + if (me.animating === 0) { + Ext.draw.Animator.add(me); + } + me.animating++; + } else { + for (i = 0, j = 0; i < me.animatingPool.length; i++) { + if (me.animatingPool[i] !== attributes) { + me.animatingPool[j++] = me.animatingPool[i]; + } + } + me.animating = me.animatingPool.length = j; + } + } + }, + + /** + * @private + * Set the attr with given easing and duration. + * @param {Object} attr The attributes collection. + * @param {Object} changes The changes that popped up from lower modifier. + * @return {Object} The changes to pop up. + */ + setAttrs: function (attr, changes) { + var timers = attr.timers, + parsers = this._sprite.self.def._animationProcessors, + defaultEasing = this._easing, + defaultDuration = this._duration, + customDuration = this._customDuration, + customEasings = this._customEasings, + anySpecial = this.anySpecialAnimations, + any = this.anyAnimation || anySpecial, + original = attr.animationOriginal, + ignite = false, + timer, name, newValue, startValue, parser, easing, duration; + + if (!any) { + // If there is no animation enabled + // When applying changes to attributes, simply stop current animation + // and set the value. + for (name in changes) { + if (attr[name] === changes[name]) { + delete changes[name]; + } else { + attr[name] = changes[name]; + } + delete original[name]; + delete timers[name]; + } + return changes; + } else { + // If any animation + for (name in changes) { + newValue = changes[name]; + startValue = attr[name]; + if (newValue !== startValue && any && startValue !== undefined && startValue !== null && (parser = parsers[name])) { + // If this property is animating. + + // Figure out the desired duration and easing. + easing = defaultEasing; + duration = defaultDuration; + if (anySpecial) { + // Deducing the easing function and duration + if (name in customEasings) { + easing = customEasings[name]; + } + if (name in customDuration) { + duration = customDuration[name]; + } + } + + // If the property is animating + if (duration) { + if (!timers[name]) { + timers[name] = {}; + } + + timer = timers[name]; + timer.start = 0; + timer.easing = easing; + timer.duration = duration; + timer.compute = parser.compute; + timer.serve = parser.serve || Ext.draw.Draw.reflectFn; + + if (parser.parseInitial) { + var initial = parser.parseInitial(startValue, newValue); + timer.source = initial[0]; + timer.target = initial[1]; + } else if (parser.parse) { + timer.source = parser.parse(startValue); + timer.target = parser.parse(newValue); + } else { + timer.source = startValue; + timer.target = newValue; + } + // The animation started. Change to originalVal. + timers[name] = timer; + original[name] = newValue; + delete changes[name]; + ignite = true; + continue; + } else { + delete original[name]; + } + } else { + delete original[name]; + } + + // If the property is not animating. + delete timers[name]; + } + } + + if (ignite && !attr.animating) { + this.setAnimating(attr, true); + } + + return changes; + }, + + /** + * @private + * + * Update attributes to current value according to current animation time. + * This method will not effect the values of lower layers, but may delete a + * value from it. + * @param {Object} attr The source attributes. + * @return {Object} the changes to popup. + */ + updateAttributes: function (attr) { + if (!attr.animating) { + return {}; + } + var changes = {}, + any = false, + original = attr.animationOriginal, + timers = attr.timers, + now = Ext.draw.Animator.animationTime(), + name, timer, delta; + + // If updated in the same frame, return. + if (attr.lastUpdate === now) { + return {}; + } + + for (name in timers) { + timer = timers[name]; + if (!timer.start) { + timer.start = now; + delta = 0; + } else { + delta = (now - timer.start) / timer.duration; + } + if (delta >= 1) { + changes[name] = original[name]; + delete original[name]; + delete timers[name]; + } else { + changes[name] = timer.serve(timer.compute(timer.source, timer.target, timer.easing(delta), attr[name])); + any = true; + } + } + attr.lastUpdate = now; + this.setAnimating(attr, any); + return changes; + }, + + /** + * @inheritdoc + */ + pushDown: function (attr, changes) { + changes = Ext.draw.modifier.Modifier.prototype.pushDown.call(this, attr.animationOriginal, changes); + return this.setAttrs(attr, changes); + }, + + /** + * @inheritdoc + */ + popUp: function (attr, changes) { + attr = attr.upperLevel; + changes = this.setAttrs(attr, changes); + if (this._next) { + return this._next.popUp(attr, changes); + } else { + return Ext.apply(attr, changes); + } + }, + + // This is called as an animated object in `Ext.draw.Animator`. + step: function () { + var me = this, + pool = me.animatingPool.slice(), + attributes, + i, ln; + + for (i = 0, ln = pool.length; i < ln; i++) { + attributes = pool[i]; + var changes = this.updateAttributes(attributes), + name; + + // Looking for anything in changes + //noinspection LoopStatementThatDoesntLoopJS + for (name in changes) { + if (this._next) { + this._next.popUp(attributes, changes); + } + break; + } + } + }, + + /** + * Stop all animations effected by this modifier + */ + stop: function () { + this.step(); + + var me = this, + pool = me.animatingPool, + i, ln; + + for (i = 0, ln = pool.length; i < ln; i++) { + pool[i].animating = false; + } + me.animatingPool.length = 0; + me.animating = 0; + Ext.draw.Animator.remove(me); + }, + + destroy: function () { + var me = this; + me.animatingPool.length = 0; + me.animating = 0; + } +}); diff --git a/vendor/touch/src/draw/modifier/Highlight.js b/vendor/touch/src/draw/modifier/Highlight.js new file mode 100644 index 000000000..6fdee3b01 --- /dev/null +++ b/vendor/touch/src/draw/modifier/Highlight.js @@ -0,0 +1,182 @@ +/** + * @class Ext.draw.modifier.Highlight + * @extends Ext.draw.modifier.Modifier + * + * Highlight is a modifier that will override the attributes + * with its `highlightStyle` attributes when `highlighted` is true. + */ +Ext.define("Ext.draw.modifier.Highlight", { + extend: 'Ext.draw.modifier.Modifier', + alias: 'modifier.highlight', + + config: { + + /** + * @cfg {Boolean} enabled 'true' if the highlight is applied. + */ + enabled: false, + + /** + * @cfg {Object} highlightStyle The style attributes of the highlight modifier. + */ + highlightStyle: null + }, + + preFx: true, + + applyHighlightStyle: function (style, oldStyle) { + oldStyle = oldStyle || {}; + if (this.getSprite()) { + Ext.apply(oldStyle, this.getSprite().self.def.normalize(style)); + } else { + Ext.apply(oldStyle, style); + } + return oldStyle; + }, + + /** + * @inheritdoc + */ + prepareAttributes: function (attr) { + if (!attr.hasOwnProperty('highlightOriginal')) { + attr.highlighted = false; + attr.highlightOriginal = Ext.Object.chain(attr); + } + if (this._previous) { + this._previous.prepareAttributes(attr.highlightOriginal); + } + }, + + updateSprite: function (sprite, oldSprite) { + if (sprite) { + if (this.getHighlightStyle()) { + this._highlightStyle = sprite.self.def.normalize(this.getHighlightStyle()); + } + this.setHighlightStyle(sprite.config.highlightCfg); + } + + // Before attaching to a sprite, register the highlight related + // attributes to its definition. + // + // TODO(zhangbei): Unfortunately this will effect all the sprites of the same type. + // As the redundant attributes would not effect performance, it is not yet a big problem. + var def = sprite.self.def; + this.setSprite(sprite); + def.setConfig({ + defaults: { + highlighted: false + }, + + processors: { + highlighted: 'bool' + }, + + aliases: { + "highlight": "highlighted", + "highlighting": "highlighted" + }, + + dirtyFlags: { + }, + + updaters: { + + } + }); + }, + + /** + * Filter modifier changes if overriding source attributes. + * @param {Object} attr The source attributes. + * @param {Object} changes The modifier changes. + * @return {*} The filtered changes. + */ + filterChanges: function (attr, changes) { + var me = this, + name, + original = attr.highlightOriginal, + style = me.getHighlightStyle(); + if (attr.highlighted) { + for (name in changes) { + if (style.hasOwnProperty(name)) { + // If it's highlighted, then save the changes to lower level + // on overridden attributes. + original[name] = changes[name]; + delete changes[name]; + } + } + } + + for (name in changes) { + if (name !== 'highlighted' && original[name] === changes[name]) { + // If it's highlighted, then save the changes to lower level + // on overridden attributes. + delete changes[name]; + } + } + + return changes; + }, + + /** + * @inheritdoc + */ + pushDown: function (attr, changes) { + var style = this.getHighlightStyle(), + original = attr.highlightOriginal, + oldHighlighted, name; + + if (changes.hasOwnProperty('highlighted')) { + oldHighlighted = changes.highlighted; + // Hide `highlighted` and `highlightStyle` to underlying modifiers. + delete changes.highlighted; + + if (this._previous) { + changes = this._previous.pushDown(original, changes); + } + changes = this.filterChanges(attr, changes); + + if (oldHighlighted !== attr.highlighted) { + if (oldHighlighted) { + // switching on + // At this time, original should be empty. + for (name in style) { + // If changes[name] just changed the value in lower levels, + if (name in changes) { + original[name] = changes[name]; + } else { + original[name] = attr[name]; + } + if (original[name] !== style[name]) { + changes[name] = style[name]; + } + } + } else { + // switching off + for (name in style) { + if (!(name in changes)) { + changes[name] = original[name]; + } + delete original[name]; // TODO: Need deletion API? + } + } + changes.highlighted = oldHighlighted; + } + } else { + if (this._previous) { + changes = this._previous.pushDown(original, changes); + } + changes = this.filterChanges(attr, changes); + } + + return changes; + }, + + /** + * @inheritdoc + */ + popUp: function (attr, changes) { + changes = this.filterChanges(attr, changes); + Ext.draw.modifier.Modifier.prototype.popUp.call(this, attr, changes); + } +}); diff --git a/vendor/touch/src/draw/modifier/Modifier.js b/vendor/touch/src/draw/modifier/Modifier.js new file mode 100644 index 000000000..add3ad764 --- /dev/null +++ b/vendor/touch/src/draw/modifier/Modifier.js @@ -0,0 +1,89 @@ +/** + * @class Ext.draw.modifier.Modifier + * + * Each sprite has a stack of modifiers. The resulting attributes of sprite is + * the content of the stack top. When setting attributes to a sprite, + * changes will be pushed-down though the stack of modifiers and pop-back the + * additive changes; When modifier is triggered to change the attribute of a + * sprite, it will pop-up the changes to the top. + */ +Ext.define("Ext.draw.modifier.Modifier", { + config: { + /** + * @cfg {Ext.draw.modifier.Modifier} previous Previous modifier that receives + * the push-down changes. + */ + previous: null, + + /** + * @cfg {Ext.draw.modifier.Modifier} next Next modifier that receives the + * pop-up changes. + */ + next: null, + + /** + * @cfg {Ext.draw.sprite.Sprite} sprite The sprite to which the modifier belongs. + */ + sprite: null + }, + + constructor: function (config) { + this.initConfig(config); + }, + + updateNext: function (next) { + if (next) { + next.setPrevious(this); + } + }, + + updatePrev: function (prev) { + if (prev) { + prev.setNext (this); + } + }, + + /** + * Validate attribute set before use. + * + * @param {Object} attr The attribute to be validated. Note that it may be already initialized, so do + * not override properties that have already been used. + */ + prepareAttributes: function (attr) { + if (this._previous) { + this._previous.prepareAttributes(attr); + } + }, + + /** + * Invoked when changes need to be popped up to the top. + * @param {Object} attributes The source attributes. + * @param {Object} changes The changes to be popped up. + */ + popUp: function (attributes, changes) { + if (this._next) { + this._next.popUp(attributes, changes); + } else { + Ext.apply(attributes, changes); + } + }, + + /** + * Invoked when changes need to be pushed down to the sprite. + * @param {Object} attr The source attributes. + * @param {Object} changes The changes to make. This object might be changed unexpectedly inside the method. + * @return {Mixed} + */ + pushDown: function (attr, changes) { + if (this._previous) { + return this._previous.pushDown(attr, changes); + } else { + for (var name in changes) { + if (changes[name] === attr[name]) { + delete changes[name]; + } + } + return changes; + } + } +}); diff --git a/vendor/touch/src/draw/modifier/Target.js b/vendor/touch/src/draw/modifier/Target.js new file mode 100644 index 000000000..80ad84f3c --- /dev/null +++ b/vendor/touch/src/draw/modifier/Target.js @@ -0,0 +1,113 @@ +/** + * @class Ext.draw.modifier.Target + * @extends Ext.draw.modifier.Modifier + * + * This is the destination modifier that has to be put at + * the top of the modifier stack. + * + */ +Ext.define("Ext.draw.modifier.Target", { + extend: "Ext.draw.modifier.Modifier", + alias: 'modifier.target', + statics: { + uniqueId: 0 + }, + + /** + * @inheritdoc + */ + prepareAttributes: function (attr) { + if (this._previous) { + this._previous.prepareAttributes(attr); + } + // TODO: Investigate the performance hit for introducing an id + attr.attributeId = 'attribute-' + Ext.draw.modifier.Target.uniqueId++; + if (!attr.hasOwnProperty('canvasAttributes')) { + attr.bbox = { + plain: {dirty: true}, + transform: {dirty: true} + }; + attr.dirty = true; + attr.dirtyFlags = {}; + attr.canvasAttributes = {}; + attr.matrix = new Ext.draw.Matrix(); + attr.inverseMatrix = new Ext.draw.Matrix(); + } + }, + + /** + * @private + * Applies the appropriate dirty flags from the modifier changes. + * @param {Object} attr The source attributes. + * @param {Object} changes The modifier changes. + */ + setDirtyFlags: function (attr, changes) { + Ext.apply(attr, changes); + var sprite = this._sprite, + dirtyTriggers = sprite.self.def._dirtyTriggers, + name, dirtyFlags = attr.dirtyFlags, flags, any = false, + triggers, trigger, i, ln, canvasNames; + + for (name in changes) { + if ((triggers = dirtyTriggers[name])) { + i = 0; + while ((trigger = triggers[i++])) { + if (!(flags = dirtyFlags[trigger])) { + flags = dirtyFlags[trigger] = []; + } + flags.push(name); + } + } + } + + for (name in changes) { + any = true; + break; + } + + if (!any) { + return; + } + + // This can prevent sub objects to set duplicated attributes to + // context. + if (dirtyFlags.canvas) { + canvasNames = dirtyFlags.canvas; + delete dirtyFlags.canvas; + for (i = 0, ln = canvasNames.length; i < ln; i++) { + name = canvasNames[i]; + attr.canvasAttributes[name] = attr[name]; + } + } + + // Spreading dirty flags to children + if (attr.hasOwnProperty('children')) { + for (i = 0, ln = attr.children.length; i < ln; i++) { + Ext.apply(attr.children[i].dirtyFlags, dirtyFlags); + sprite.updateDirtyFlags(attr.children[i]); + } + } + + sprite.setDirty(true); + }, + + /** + * @inheritdoc + */ + popUp: function (attributes, changes) { + this.setDirtyFlags(attributes, changes); + this._sprite.updateDirtyFlags(attributes); + }, + + /** + * @inheritdoc + */ + pushDown: function (attr, changes) { + if (this._previous) { + changes = this._previous.pushDown(attr, changes); + } + this.setDirtyFlags(attr, changes); + this._sprite.updateDirtyFlags(attr); + return changes; + } +}); diff --git a/vendor/touch/src/draw/sprite/AnimationParser.js b/vendor/touch/src/draw/sprite/AnimationParser.js new file mode 100644 index 000000000..1595a0b5b --- /dev/null +++ b/vendor/touch/src/draw/sprite/AnimationParser.js @@ -0,0 +1,180 @@ +(function () { + function compute(from, to, delta) { + return from + (to - from) * delta; + } + + /** + * @private + * @class Ext.draw.sprite.AnimationParser + * + * Parsers for sprite attributes used in animations. + */ + Ext.define("Ext.draw.sprite.AnimationParser", { + singleton: true, + attributeRe: /^url\(#([a-zA-Z\-]+)\)$/, + requires: ['Ext.draw.Color'], + + color: { + parseInitial: function (color1, color2) { + if (Ext.isString(color1)) { + color1 = Ext.draw.Color.create(color1); + } + if (Ext.isString(color2)) { + color2 = Ext.draw.Color.create(color2); + + } + if ((color1 instanceof Ext.draw.Color) && (color2 instanceof Ext.draw.Color)) { + return [ + [color1.r, color1.g, color1.b, color1.a], + [color2.r, color2.g, color2.b, color2.a] + ]; + } else { + return [color1 || color2, color2 || color1]; + } + }, + compute: function (from, to, delta) { + if (!Ext.isArray(from) || !Ext.isArray(to)) { + return to || from; + } else { + return [compute(from[0], to[0], delta), compute(from[1], to[1], delta), compute(from[2], to[2], delta), compute(from[3], to[3], delta)]; + + } + }, + serve: function (array) { + var color = Ext.draw.Color.fly(array[0], array[1], array[2], array[3]); + return color.toString(); + } + }, + + number: { + parse: function (n) { + return n === null ? null : +n; + }, + + compute: function (from, to, delta) { + if (!Ext.isNumber(from) || !Ext.isNumber(to)) { + return to || from; + } else { + return compute(from, to, delta); + } + } + }, + + angle: { + parseInitial: function (from, to) { + if (to - from > Math.PI) { + to -= Math.PI * 2; + } else if (to - from < -Math.PI) { + to += Math.PI * 2; + } + return [from, to]; + }, + + compute: function (from, to, delta) { + if (!Ext.isNumber(from) || !Ext.isNumber(to)) { + return to || from; + } else { + return compute(from, to, delta); + } + } + }, + + path: { + parseInitial: function (from, to) { + var fromStripes = from.toStripes(), + toStripes = to.toStripes(), + i, j, + fromLength = fromStripes.length, toLength = toStripes.length, + fromStripe, toStripe, + length, + lastStripe = toStripes[toLength - 1], + endPoint = [lastStripe[lastStripe.length - 2], lastStripe[lastStripe.length - 1]]; + for (i = fromLength; i < toLength; i++) { + fromStripes.push(fromStripes[fromLength - 1].slice(0)); + } + for (i = toLength; i < fromLength; i++) { + toStripes.push(endPoint.slice(0)); + } + length = fromStripes.length; + + toStripes.path = to; + toStripes.temp = new Ext.draw.Path(); + + for (i = 0; i < length; i++) { + fromStripe = fromStripes[i]; + toStripe = toStripes[i]; + fromLength = fromStripe.length; + toLength = toStripe.length; + toStripes.temp.types.push('M'); + for (j = toLength; j < fromLength; j += 6) { + toStripe.push(endPoint[0], endPoint[1], endPoint[0], endPoint[1], endPoint[0], endPoint[1]); + } + + lastStripe = toStripes[toStripes.length - 1]; + endPoint = [lastStripe[lastStripe.length - 2], lastStripe[lastStripe.length - 1]]; + for (j = fromLength; j < toLength; j += 6) { + fromStripe.push(endPoint[0], endPoint[1], endPoint[0], endPoint[1], endPoint[0], endPoint[1]); + } + for (i = 0; i < toStripe.length; i++) { + toStripe[i] -= fromStripe[i]; + } + for (i = 2; i < toStripe.length; i += 6) { + toStripes.temp.types.push('C'); + } + } + + return [fromStripes, toStripes]; + }, + + compute: function (fromStripes, toStripes, delta) { + if (delta >= 1) { + return toStripes.path; + } + var i = 0, ln = fromStripes.length, + j = 0, ln2, from, to, + temp = toStripes.temp.coords, pos = 0; + for (; i < ln; i++) { + from = fromStripes[i]; + to = toStripes[i]; + ln2 = from.length; + for (j = 0; j < ln2; j++) { + temp[pos++] = to[j] * delta + from[j]; + } + } + return toStripes.temp; + } + }, + + data: { + compute: function (from, to, delta, target) { + var lf = from.length - 1, + lt = to.length - 1, + len = Math.max(lf, lt), + f, t, i; + if (!target || target === from) { + target = []; + } + target.length = len + 1; + for (i = 0; i <= len; i++) { + f = from[Math.min(i, lf)]; + t = to[Math.min(i, lt)]; + if (isNaN(f)) { + target[i] = t; + } else { + target[i] = (t - f) * delta + f; + } + } + return target; + } + }, + + text: { + compute: function (from, to, delta) { + return from.substr(0, Math.round(from.length * (1 - delta))) + to.substr(Math.round(to.length * (1 - delta))); + } + }, + + limited: "number", + limited01: "number" + }); +})(); diff --git a/vendor/touch/src/draw/sprite/Arc.js b/vendor/touch/src/draw/sprite/Arc.js new file mode 100644 index 000000000..f70033d5f --- /dev/null +++ b/vendor/touch/src/draw/sprite/Arc.js @@ -0,0 +1,67 @@ +/** + * @class Ext.draw.sprite.Arc + * @extend Ext.draw.sprite.Circle + * + * A sprite that represents a circular arc. + * + * @example preview miniphone + * var component = new Ext.draw.Component({ + * items: [{ + * type: 'arc', + * cx: 100, + * cy: 100, + * r: 25, + * fillStyle: 'blue', + * startAngle: 0, + * endAngle: Math.PI, + * anticlockwise: true + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(component); + */ +Ext.define("Ext.draw.sprite.Arc", { + extend: "Ext.draw.sprite.Circle", + alias: 'sprite.arc', + type: 'arc', + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Number} [startAngle=0] The beginning angle of the arc. + */ + startAngle: "number", + + /** + * @cfg {Number} [endAngle=Math.PI*2] The ending angle of the arc. + */ + endAngle: "number", + + /** + * @cfg {Boolean} [anticlockwise=false] Determines whether or not the arc is drawn clockwise. + */ + anticlockwise: "bool" + }, + aliases: { + from: "startAngle", + to: "endAngle", + start: "startAngle", + end: "endAngle" + }, + defaults: { + startAngle: 0, + endAngle: Math.PI * 2, + anticlockwise: false + }, + dirtyTriggers: { + startAngle: 'path', + endAngle: 'path', + anticlockwise: 'path' + } + } + }, + + updatePath: function (path, attr) { + path.arc(attr.cx, attr.cy, attr.r, attr.startAngle, attr.endAngle, attr.anticlockwise); + } +}); \ No newline at end of file diff --git a/vendor/touch/src/draw/sprite/AttributeDefinition.js b/vendor/touch/src/draw/sprite/AttributeDefinition.js new file mode 100644 index 000000000..d1916ec8e --- /dev/null +++ b/vendor/touch/src/draw/sprite/AttributeDefinition.js @@ -0,0 +1,407 @@ +/** + * @private + * Flyweight object to process the attribute of a sprite. + */ +Ext.define("Ext.draw.sprite.AttributeDefinition", { + requires: [ + 'Ext.draw.sprite.AttributeParser', + 'Ext.draw.sprite.AnimationParser' + ], + + config: { + /** + * @cfg {Object} defaults Defines the default values of attributes. + */ + defaults: { + + }, + + /** + * @cfg {Object} aliases Defines the aletrnative names for attributes. + */ + aliases: { + + }, + + /** + * @cfg {Object} animationProcessors Defines the process used to animate between attributes. + */ + animationProcessors: { + + }, + + /** + * @cfg {Object} processors Defines the preprocessing used on the attribute. + */ + processors: { + + }, + + /** + * @cfg {Object} dirty Defines what other attributes need to be updated when an attribute is changed. + */ + dirtyTriggers: { + + }, + + /** + * @cfg {Object} updaters Defines the postprocessing used by the attribute. + */ + updaters: { + + } + }, + + inheritableStatics: { + processorRe: /^(\w+)\(([\w\-,]*)\)$/ + }, + + constructor: function (config) { + var me = this; + me.initConfig(config); + }, + + applyDefaults: function (defaults, oldDefaults) { + oldDefaults = Ext.apply(oldDefaults || {}, this.normalize(defaults)); + return oldDefaults; + }, + + applyAliases: function (aliases, oldAliases) { + return Ext.apply(oldAliases || {}, aliases); + }, + + applyProcessors: function (processors, oldProcessors) { + this.getAnimationProcessors(); + var name, + result = oldProcessors || {}, + defaultProcessor = Ext.draw.sprite.AttributeParser, + processorRe = this.self.processorRe, + animationProcessors = {}, anyAnimationProcessors, + match, fn; + + for (name in processors) { + fn = processors[name]; + if (!Ext.isFunction(fn)) { + if (Ext.isString(fn)) { + match = fn.match(processorRe); + if (match) { + fn = defaultProcessor[match[1]].apply(defaultProcessor, match[2].split(',')); + } else { + animationProcessors[name] = fn; + anyAnimationProcessors = true; + fn = defaultProcessor[fn]; + } + } else { + continue; + } + } + result[name] = fn; + } + + if (anyAnimationProcessors) { + this.setAnimationProcessors(animationProcessors); + } + + return result; + }, + + applyAnimationProcessors: function (animationProcessors, oldAnimationProcessors) { + var parser = Ext.draw.sprite.AnimationParser, + item; + + if (!oldAnimationProcessors) { + oldAnimationProcessors = {}; + } + + for (var name in animationProcessors) { + item = animationProcessors[name]; + if (item === 'none') { + oldAnimationProcessors[name] = null; + } else if (Ext.isString(item) && !(name in oldAnimationProcessors)) { + if (item in parser) { + while (Ext.isString(parser[item])) { + item = parser[item]; + } + oldAnimationProcessors[name] = parser[item]; + } + } else if (Ext.isObject(item)) { + oldAnimationProcessors[name] = item; + } + } + return oldAnimationProcessors; + }, + + applyDirtyTriggers: function (dirtyTriggers, oldDirtyTrigger) { + if (!oldDirtyTrigger) { + oldDirtyTrigger = {}; + } + for (var name in dirtyTriggers) { + oldDirtyTrigger[name] = dirtyTriggers[name].split(','); + } + return oldDirtyTrigger; + }, + + applyUpdaters: function (updaters, oldUpdaters) { + return Ext.apply(oldUpdaters || {}, updaters); + }, + + batchedNormalize: function (batchedChanges, reserveUnrecognized) { + if (!batchedChanges) { + return {}; + } + var definition = this, + processors = definition.getProcessors(), + aliases = definition.getAliases(), + normalized = {}, + i, ln, name, val, + translation, rotation, scaling, + matrix, subVal, split; + if ('rotation' in batchedChanges) { + rotation = batchedChanges.rotation; + } + else { + rotation = ('rotate' in batchedChanges) ? batchedChanges.rotate : undefined; + } + + if ('scaling' in batchedChanges) { + scaling = batchedChanges.scaling; + } + else { + scaling = ('scale' in batchedChanges) ? batchedChanges.scale : undefined; + } + + if ('translation' in batchedChanges) { + translation = batchedChanges.translation; + } else { + translation = ('translate' in batchedChanges) ? batchedChanges.translate : undefined; + } + + if (typeof scaling !== 'undefined') { + if (Ext.isNumber(scaling)) { + normalized.scalingX = scaling; + normalized.scalingY = scaling; + } else { + if ('x' in scaling) { + normalized.scalingX = scaling.x; + } + if ('y' in scaling) { + normalized.scalingY = scaling.y; + } + if ('centerX' in scaling) { + normalized.scalingCenterX = scaling.centerX; + } + if ('centerY' in scaling) { + normalized.scalingCenterY = scaling.centerY; + } + } + } + + if (typeof rotation !== 'undefined') { + if (Ext.isNumber(rotation)) { + rotation = Ext.draw.Draw.rad(rotation); + normalized.rotationRads = rotation; + } else { + if ('rads' in rotation) { + normalized.rotationRads = rotation.rads; + } else if ('degrees' in rotation) { + if (Ext.isArray(rotation.degrees)) { + normalized.rotationRads = rotation.degrees.map(function (deg) { + return Ext.draw.Draw.rad(deg); + }); + } else { + normalized.rotationRads = Ext.draw.Draw.rad(rotation.degrees); + } + } + if ('centerX' in rotation) { + normalized.rotationCenterX = rotation.centerX; + } + if ('centerY' in rotation) { + normalized.rotationCenterY = rotation.centerY; + } + } + } + if (typeof translation !== 'undefined') { + if ('x' in translation) { + normalized.translationX = translation.x; + } + if ('y' in translation) { + normalized.translationY = translation.y; + } + } + + if ('matrix' in batchedChanges) { + matrix = Ext.draw.Matrix.create(batchedChanges.matrix); + split = matrix.split(); + + normalized.matrix = matrix; + normalized.rotationRads = split.rotation; + normalized.rotationCenterX = 0; + normalized.rotationCenterY = 0; + normalized.scalingX = split.scaleX; + normalized.scalingY = split.scaleY; + normalized.scalingCenterX = 0; + normalized.scalingCenterY = 0; + normalized.translationX = split.translateX; + normalized.translationY = split.translateY; + } + + for (name in batchedChanges) { + val = batchedChanges[name]; + if (typeof val === 'undefined') { + continue; + } else if (Ext.isArray(val)) { + if (name in aliases) { + name = aliases[name]; + } + if (name in processors) { + normalized[name] = []; + for (i = 0, ln = val.length; i < ln; i++) { + subVal = processors[name].call(this, val[i]); + if (typeof subVal !== 'undefined') { + normalized[name][i] = subVal; + } + } + } else if (reserveUnrecognized){ + normalized[name] = val; + } + } else { + if (name in aliases) { + name = aliases[name]; + } + if (name in processors) { + val = processors[name].call(this, val); + if (typeof val !== 'undefined') { + normalized[name] = val; + } + } else if (reserveUnrecognized){ + normalized[name] = val; + } + } + } + return normalized; + }, + + /** + * Normalizes the changes given via their processors before they are applied as attributes. + * + * @param {Object} changes The changes given. + * @return {Object} The normalized values. + */ + normalize: function (changes, reserveUnrecognized) { + if (!changes) { + return {}; + } + var definition = this, + processors = definition.getProcessors(), + aliases = definition.getAliases(), + translation = changes.translation || changes.translate, + normalized = {}, + name, val, rotation, scaling, matrix, split; + + if ('rotation' in changes) { + rotation = changes.rotation; + } + else { + rotation = ('rotate' in changes) ? changes.rotate : undefined; + } + + if ('scaling' in changes) { + scaling = changes.scaling; + } + else { + scaling = ('scale' in changes) ? changes.scale : undefined; + } + + if (translation) { + if ('x' in translation) { + normalized.translationX = translation.x; + } + if ('y' in translation) { + normalized.translationY = translation.y; + } + } + + if (typeof scaling !== 'undefined') { + if (Ext.isNumber(scaling)) { + normalized.scalingX = scaling; + normalized.scalingY = scaling; + } else { + if ('x' in scaling) { + normalized.scalingX = scaling.x; + } + if ('y' in scaling) { + normalized.scalingY = scaling.y; + } + if ('centerX' in scaling) { + normalized.scalingCenterX = scaling.centerX; + } + if ('centerY' in scaling) { + normalized.scalingCenterY = scaling.centerY; + } + } + } + + if (typeof rotation !== 'undefined') { + if (Ext.isNumber(rotation)) { + rotation = Ext.draw.Draw.rad(rotation); + normalized.rotationRads = rotation; + } else { + if ('rads' in rotation) { + normalized.rotationRads = rotation.rads; + } else if ('degrees' in rotation) { + normalized.rotationRads = Ext.draw.Draw.rad(rotation.degrees); + } + if ('centerX' in rotation) { + normalized.rotationCenterX = rotation.centerX; + } + if ('centerY' in rotation) { + normalized.rotationCenterY = rotation.centerY; + } + } + } + + if ('matrix' in changes) { + matrix = Ext.draw.Matrix.create(changes.matrix); + split = matrix.split(); + + normalized.matrix = matrix; + normalized.rotationRads = split.rotation; + normalized.rotationCenterX = 0; + normalized.rotationCenterY = 0; + normalized.scalingX = split.scaleX; + normalized.scalingY = split.scaleY; + normalized.scalingCenterX = 0; + normalized.scalingCenterY = 0; + normalized.translationX = split.translateX; + normalized.translationY = split.translateY; + } + + for (name in changes) { + val = changes[name]; + if (typeof val === 'undefined') { + continue; + } + if (name in aliases) { + name = aliases[name]; + } + if (name in processors) { + val = processors[name].call(this, val); + if (typeof val !== 'undefined') { + normalized[name] = val; + } + } else if (reserveUnrecognized){ + normalized[name] = val; + } + } + return normalized; + }, + + setBypassingNormalization: function (attr, modifierStack, changes) { + return modifierStack.pushDown(attr, changes); + }, + + set: function (attr, modifierStack, changes) { + changes = this.normalize(changes); + return this.setBypassingNormalization(attr, modifierStack, changes); + } +}); \ No newline at end of file diff --git a/vendor/touch/src/draw/sprite/AttributeParser.js b/vendor/touch/src/draw/sprite/AttributeParser.js new file mode 100644 index 000000000..d3f9340a4 --- /dev/null +++ b/vendor/touch/src/draw/sprite/AttributeParser.js @@ -0,0 +1,98 @@ +/** + * @private + * @class Ext.draw.sprite.AttributeParser + * + * Parsers used for sprite attributes. + */ +Ext.define("Ext.draw.sprite.AttributeParser", { + singleton: true, + attributeRe: /^url\(#([a-zA-Z\-]+)\)$/, + requires: [ + 'Ext.draw.Color', + 'Ext.draw.gradient.GradientDefinition' + ], + + "default": function (n) { + return n; + }, + + string: function (n) { + return String(n); + }, + + number: function (n) { + if (!isNaN(n)) { + return n; + } + }, + + angle: function (n) { + if (!isNaN(n)) { + n %= Math.PI * 2; + if (n < -Math.PI) { + n += Math.PI * 2; + } + if (n > Math.PI) { + n -= Math.PI * 2; + } + return n; + } + }, + + data: function (n) { + if (Ext.isArray(n)) { + return n.slice(); + } else if (n instanceof Float32Array) { + return new Float32Array(n); + } + }, + + bool: function (n) { + return !!n; + }, + + color: function (n) { + if (n instanceof Ext.draw.Color) { + return n.toString(); + } else if (n instanceof Ext.draw.gradient.Gradient) { + return n; + } else if (!n) { + return 'none'; + } else if (Ext.isString(n)) { + n = Ext.draw.gradient.GradientDefinition.get(n); + if (Ext.isString(n)) { + return n; + } + } + if (n.type === 'linear') { + return Ext.create('Ext.draw.gradient.Linear', n); + } else if (n.type === 'radial') { + return Ext.create('Ext.draw.gradient.Radial', n); + } else if (n.type === 'pattern') { + return Ext.create('Ext.draw.gradient.Pattern', n); + } + }, + + limited: function (low, hi) { + return (function (n) { + return isNaN(n) ? undefined : Math.min(Math.max(+n, low), hi); + }); + }, + + limited01: function (n) { + return isNaN(n) ? undefined : Math.min(Math.max(+n, 0), 1); + }, + + enums: function () { + var enums = {}, + args = Array.prototype.slice.call(arguments, 0), + i, ln; + + for (i = 0, ln = args.length; i < ln; i++) { + enums[args[i]] = true; + } + return (function (n) { + return n in enums ? n : undefined; + }); + } +}); \ No newline at end of file diff --git a/vendor/touch/src/draw/sprite/Circle.js b/vendor/touch/src/draw/sprite/Circle.js new file mode 100644 index 000000000..c36f7ef20 --- /dev/null +++ b/vendor/touch/src/draw/sprite/Circle.js @@ -0,0 +1,93 @@ +/** + * @class Ext.draw.sprite.Circle + * @extends Ext.draw.sprite.Path + * + * A sprite that represents a circle. + * + * @example preview miniphone + * new Ext.draw.Component({ + * fullscreen: true, + * items: [{ + * type: 'circle', + * cx: 100, + * cy: 100, + * r: 25, + * fillStyle: 'blue' + * }] + * }); + * + */ +Ext.define("Ext.draw.sprite.Circle", { + extend: "Ext.draw.sprite.Path", + alias: 'sprite.circle', + type: 'circle', + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Number} [cx=0] The center coordinate of the sprite on the x-axis. + */ + cx: "number", + + /** + * @cfg {Number} [cy=0] The center coordinate of the sprite on the y-axis. + */ + cy: "number", + + /** + * @cfg {Number} [r=0] The radius of the sprite. + */ + r: "number" + }, + aliases: { + radius: "r", + x: "cx", + y: "cy", + centerX: "cx", + centerY: "cy" + }, + defaults: { + cx: 0, + cy: 0, + r: 0 + }, + dirtyTriggers: { + cx: 'path', + cy: 'path', + r: 'path' + } + } + }, + + updatePlainBBox: function (plain) { + var attr = this.attr, + cx = attr.cx, + cy = attr.cy, + r = attr.r; + plain.x = cx - r; + plain.y = cy - r; + plain.width = r + r; + plain.height = r + r; + }, + + updateTransformedBBox: function (transform) { + var attr = this.attr, + cx = attr.cx, + cy = attr.cy, + r = attr.r, + matrix = attr.matrix, + scalesX = matrix.getScaleX(), + scalesY = matrix.getScaleY(), + w, h; + w = scalesX * r; + h = scalesY * r; + transform.x = matrix.x(cx, cy) - w; + transform.y = matrix.y(cx, cy) - h; + transform.width = w + w; + transform.height = h + h; + }, + + updatePath: function (path, attr) { + path.arc(attr.cx, attr.cy, attr.r, 0, Math.PI * 2, false); + } +}); \ No newline at end of file diff --git a/vendor/touch/src/draw/sprite/Composite.js b/vendor/touch/src/draw/sprite/Composite.js new file mode 100644 index 000000000..659b66e60 --- /dev/null +++ b/vendor/touch/src/draw/sprite/Composite.js @@ -0,0 +1,107 @@ +/** + * @class Ext.draw.sprite.Composite + * @extends Ext.draw.sprite.Sprite + * + * Represents a group of sprites. + */ +Ext.define('Ext.draw.sprite.Composite', { + extend: 'Ext.draw.sprite.Sprite', + alias: 'sprite.composite', + type: 'composite', + + constructor: function () { + this.callSuper(arguments); + this.sprites = []; + this.sprites.map = {}; + }, + + /** + * Adds a sprite to the composite. + * @param {Ext.draw.sprite.Sprite|Object} sprite + */ + add: function (sprite) { + if (!(sprite instanceof Ext.draw.sprite.Sprite)) { + sprite = Ext.create('sprite.' + sprite.type, sprite); + sprite.setParent(this); + } + var oldTransformations = sprite.applyTransformations, + me = this, + attr = me.attr; + + sprite.applyTransformations = function () { + if (sprite.attr.dirtyTransform) { + attr.dirtyTransform = true; + attr.bbox.plain.dirty = true; + attr.bbox.transform.dirty = true; + } + oldTransformations.call(sprite); + }; + this.sprites.push(sprite); + this.sprites.map[sprite.id] = sprite.getId(); + attr.bbox.plain.dirty = true; + attr.bbox.transform.dirty = true; + return sprite; + }, + + /** + * Adds a list of sprites to the composite. + * @param {Ext.draw.sprite.Sprite[]|Object[]|Ext.draw.sprite.Sprite|Object} sprites + */ + addAll: function (sprites) { + if (sprites.isSprite || sprites.type) { + this.add(sprites); + } else if (Ext.isArray(sprites)) { + var i = 0; + while (i < sprites.length) { + this.add(sprites[i++]); + } + } + }, + + /** + * Updates the bounding box of the composite, which contains the bounding box of all sprites in the composite. + */ + updatePlainBBox: function (plain) { + var me = this, + left = Infinity, + right = -Infinity, + top = Infinity, + bottom = -Infinity, + sprite, bbox, i, ln; + + for (i = 0, ln = me.sprites.length; i < ln; i++) { + sprite = me.sprites[i]; + sprite.applyTransformations(); + bbox = sprite.getBBox(); + if (left > bbox.x) { + left = bbox.x; + } + if (right < bbox.x + bbox.width) { + right = bbox.x + bbox.width; + } + if (top > bbox.y) { + top = bbox.y; + } + if (bottom < bbox.y + bbox.height) { + bottom = bbox.y + bbox.height; + } + } + plain.x = left; + plain.y = top; + plain.width = right - left; + plain.height = bottom - top; + }, + + /** + * Renders all sprites contained in the composite to the surface. + */ + render: function (surface, ctx, region) { + var mat = this.attr.matrix, + i, ln; + + mat.toContext(ctx); + for (i = 0, ln = this.sprites.length; i < ln; i++) { + surface.renderSprite(this.sprites[i], region); + } + } +}); \ No newline at end of file diff --git a/vendor/touch/src/draw/sprite/Ellipse.js b/vendor/touch/src/draw/sprite/Ellipse.js new file mode 100644 index 000000000..5f583fc8e --- /dev/null +++ b/vendor/touch/src/draw/sprite/Ellipse.js @@ -0,0 +1,118 @@ +/** + * @class Ext.draw.sprite.Ellipse + * @extends Ext.draw.sprite.Path + * + * A sprite that represents an ellipse. + * + * @example preview miniphone + * var component = new Ext.draw.Component({ + * items: [{ + * type: 'ellipse', + * cx: 100, + * cy: 100, + * rx: 40, + * ry: 25, + * fillStyle: 'blue' + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(component); + */ +Ext.define("Ext.draw.sprite.Ellipse", { + extend: "Ext.draw.sprite.Path", + alias: 'sprite.ellipse', + type: 'circle', + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Number} [cx=0] The center coordinate of the sprite on the x-axis. + */ + cx: "number", + + /** + * @cfg {Number} [cy=0] The center coordinate of the sprite on the y-axis. + */ + cy: "number", + + /** + * @cfg {Number} [rx=1] The radius of the sprite on the x-axis. + */ + rx: "number", + + /** + * @cfg {Number} [ry=1] The radius of the sprite on the y-axis. + */ + ry: "number", + + /** + * @cfg {Number} [axisRotation=0] The rotation of the sprite about its axis. + */ + axisRotation: "number" + }, + aliases: { + radius: "r", + x: "cx", + y: "cy", + centerX: "cx", + centerY: "cy", + radiusX: "rx", + radiusY: "ry" + }, + defaults: { + cx: 0, + cy: 0, + rx: 1, + ry: 1, + axisRotation: 0 + }, + dirtyTriggers: { + cx: 'path', + cy: 'path', + rx: 'path', + ry: 'path', + axisRotation: 'path' + } + } + }, + + updatePlainBBox: function (plain) { + var attr = this.attr, + cx = attr.cx, + cy = attr.cy, + rx = attr.rx, + ry = attr.ry; + plain.x = cx - rx; + plain.y = cy - ry; + plain.width = rx + rx; + plain.height = ry + ry; + }, + + updateTransformedBBox: function (transform) { + var attr = this.attr, + cx = attr.cx, + cy = attr.cy, + rx = attr.rx, + ry = attr.ry, + rxy = ry / rx, + matrix = attr.matrix.clone(), + xx, xy, yx, yy, dx, dy, w, h; + matrix.append(1, 0, 0, rxy, 0, cy * (1 - rxy)); + xx = matrix.getXX(); + yx = matrix.getYX(); + dx = matrix.getDX(); + xy = matrix.getXY(); + yy = matrix.getYY(); + dy = matrix.getDY(); + w = Math.sqrt(xx * xx + yx * yx) * rx; + h = Math.sqrt(xy * xy + yy * yy) * rx; + transform.x = cx * xx + cy * yx + dx - w; + transform.y = cx * xy + cy * yy + dy - h; + transform.width = w + w; + transform.height = h + h; + }, + + updatePath: function (path, attr) { + path.ellipse(attr.cx, attr.cy, attr.rx, attr.ry, attr.axisRotation, 0, Math.PI * 2, false); + } +}); \ No newline at end of file diff --git a/vendor/touch/src/draw/sprite/EllipticalArc.js b/vendor/touch/src/draw/sprite/EllipticalArc.js new file mode 100644 index 000000000..b302817b3 --- /dev/null +++ b/vendor/touch/src/draw/sprite/EllipticalArc.js @@ -0,0 +1,68 @@ +/** + * @class Ext.draw.sprite.EllipticalArc + * @extends Ext.draw.sprite.Ellipse + * + * A sprite that represents an elliptical arc. + * + * @example preview miniphone + * var component = new Ext.draw.Component({ + * items: [{ + * type: 'ellipticalArc', + * cx: 100, + * cy: 100, + * rx: 40, + * ry: 25, + * fillStyle: 'blue', + * startAngle: 0, + * endAngle: Math.PI, + * anticlockwise: true + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(component); + */ +Ext.define("Ext.draw.sprite.EllipticalArc", { + extend: "Ext.draw.sprite.Ellipse", + alias: 'sprite.ellipticalArc', + type: 'ellipticalArc', + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Number} [startAngle=0] The beginning angle of the arc. + */ + startAngle: "number", + + /** + * @cfg {Number} [endAngle=Math.PI*2] The ending angle of the arc. + */ + endAngle: "number", + + /** + * @cfg {Boolean} [anticlockwise=false] Determines whether or not the arc is drawn clockwise. + */ + anticlockwise: "bool" + }, + aliases: { + from: "startAngle", + to: "endAngle", + start: "startAngle", + end: "endAngle" + }, + defaults: { + startAngle: 0, + endAngle: Math.PI * 2, + anticlockwise: false + }, + dirtyTriggers: { + startAngle: 'path', + endAngle: 'path', + anticlockwise: 'path' + } + } + }, + + updatePath: function (path, attr) { + path.ellipse(attr.cx, attr.cy, attr.rx, attr.ry, attr.axisRotation, attr.startAngle, attr.endAngle, attr.anticlockwise); + } +}); \ No newline at end of file diff --git a/vendor/touch/src/draw/sprite/Image.js b/vendor/touch/src/draw/sprite/Image.js new file mode 100644 index 000000000..56ed83f28 --- /dev/null +++ b/vendor/touch/src/draw/sprite/Image.js @@ -0,0 +1,74 @@ +/** + * @class Ext.draw.sprite.Image + * @extends Ext.draw.sprite.Rect + * + * A sprite that represents an image. + */ +Ext.define("Ext.draw.sprite.Image", { + extend: "Ext.draw.sprite.Rect", + alias: 'sprite.image', + type: 'image', + statics: { + imageLoaders: {} + }, + + inheritableStatics: { + def: { + processors: { + /** + * @cfg {String} [src=''] The image source of the sprite. + */ + src: 'string' + }, + defaults: { + src: '', + width: null, + height: null + } + } + }, + + render: function (surface, ctx) { + var me = this, + attr = me.attr, + mat = attr.matrix, + src = attr.src, + x = attr.x, + y = attr.y, + width = attr.width, + height = attr.height, + loadingStub = Ext.draw.sprite.Image.imageLoaders[src], + imageLoader, + i; + + if (loadingStub && loadingStub.done) { + mat.toContext(ctx); + ctx.drawImage(loadingStub.image, x, y, width || loadingStub.width, height || loadingStub.width); + } else if (!loadingStub) { + imageLoader = new Image(); + loadingStub = Ext.draw.sprite.Image.imageLoaders[src] = { + image: imageLoader, + done: false, + pendingSprites: [me], + pendingSurfaces: [surface] + }; + imageLoader.width = width; + imageLoader.height = height; + imageLoader.onload = function () { + if (!loadingStub.done) { + loadingStub.done = true; + for (i = 0; i < loadingStub.pendingSprites.length; i++) { + loadingStub.pendingSprites[i].setDirty(true); + } + for (i in loadingStub.pendingSurfaces) { + loadingStub.pendingSurfaces[i].renderFrame(); + } + } + }; + imageLoader.src = src; + } else { + Ext.Array.include(loadingStub.pendingSprites, me); + Ext.Array.include(loadingStub.pendingSurfaces, surface); + } + } +}); \ No newline at end of file diff --git a/vendor/touch/src/draw/sprite/Instancing.js b/vendor/touch/src/draw/sprite/Instancing.js new file mode 100644 index 000000000..46f675025 --- /dev/null +++ b/vendor/touch/src/draw/sprite/Instancing.js @@ -0,0 +1,149 @@ +/** + * @class Ext.draw.sprite.Instancing + * @extends Ext.draw.sprite.Sprite + * + * Sprite that represents multiple instances based on the given template. + */ +Ext.define("Ext.draw.sprite.Instancing", { + extend: "Ext.draw.sprite.Sprite", + alias: 'sprite.instancing', + type: 'instancing', + config: { + + /** + * @cfg {Object} [template=null] The sprite template used by all instances. + */ + template: null + }, + instances: null, + constructor: function (config) { + this.instances = []; + this.callSuper([config]); + if (config && config.template) { + this.setTemplate(config.template); + } + }, + + applyTemplate: function (template) { + if (!(template instanceof Ext.draw.sprite.Sprite)) { + template = Ext.create(template.xclass || "sprite." + template.type, template); + } + template.setParent(this); + template.attr.children = []; + this.instances = []; + this.position = 0; + return template; + }, + + /** + * Creates a new sprite instance. + * + * @param {Object} config The configuration of the instance. + * @param {Object} [data] + * @param {Boolean} [bypassNormalization] 'true' to bypass attribute normalization. + * @param {Boolean} [avoidCopy] 'true' to avoid copying. + * @return {Object} The attributes of the instance. + */ + createInstance: function (config, data, bypassNormalization, avoidCopy) { + var template = this.getTemplate(), + originalAttr = template.attr, + attr = Ext.Object.chain(originalAttr); + template.topModifier.prepareAttributes(attr); + template.attr = attr; + template.setAttributes(config, bypassNormalization, avoidCopy); + attr.data = data; + this.instances.push(attr); + template.attr = originalAttr; + this.position++; + originalAttr.children.push(attr); + return attr; + }, + + /** + * Not supported. + * + * @return {null} + */ + getBBox: function () { return null; }, + + /** + * Returns the bounding box for the instance at the given index. + * + * @param {Number} index The index of the instance. + * @param {Boolean} [isWithoutTransform] 'true' to not apply sprite transforms to the bounding box. + * @return {Object} The bounding box for the instance. + */ + getBBoxFor: function (index, isWithoutTransform) { + var template = this.getTemplate(), + originalAttr = template.attr, + bbox; + template.attr = this.instances[index]; + bbox = template.getBBox(isWithoutTransform); + template.attr = originalAttr; + return bbox; + }, + + render: function (surface, ctx, clipRegion, region) { + var me = this, + mat = me.attr.matrix, + template = me.getTemplate(), + originalAttr = template.attr, + instances = me.instances, + i, ln = me.position; + + mat.toContext(ctx); + template.preRender(surface, ctx, clipRegion, region); + template.useAttributes(ctx, region); + for (i = 0; i < ln; i++) { + if (instances[i].dirtyZIndex) { + break; + } + } + for (i = 0; i < ln; i++) { + if (instances[i].hidden) { + continue; + } + ctx.save(); + template.attr = instances[i]; + template.applyTransformations(); + template.useAttributes(ctx, region); + template.render(surface, ctx, clipRegion, region); + ctx.restore(); + } + template.attr = originalAttr; + }, + + /** + * Sets the attributes for the instance at the given index. + * + * @param {Number} index the index of the instance + * @param {Object} changes the attributes to change + * @param {Boolean} [bypassNormalization] 'true' to avoid attribute normalization + */ + setAttributesFor: function (index, changes, bypassNormalization) { + var template = this.getTemplate(), + originalAttr = template.attr, + attr = this.instances[index]; + template.attr = attr; + try { + if (bypassNormalization) { + changes = Ext.apply({}, changes); + } else { + changes = template.self.def.normalize(changes); + } + template.topModifier.pushDown(attr, changes); + template.updateDirtyFlags(attr); + } finally { + template.attr = originalAttr; + } + }, + + destroy: function () { + this.callSuper(); + this.instances.length = 0; + this.instances = null; + if (this.getTemplate()) { + this.getTemplate().destroy(); + } + } +}); \ No newline at end of file diff --git a/vendor/touch/src/draw/sprite/Line.js b/vendor/touch/src/draw/sprite/Line.js new file mode 100644 index 000000000..7f05a853e --- /dev/null +++ b/vendor/touch/src/draw/sprite/Line.js @@ -0,0 +1,35 @@ +Ext.define('Ext.draw.sprite.Line', { + extend: 'Ext.draw.sprite.Sprite', + alias: 'sprite.line', + type: 'line', + + inheritableStatics: { + def: { + processors: { + fromX: 'number', + fromY: 'number', + toX: 'number', + toY: 'number' + }, + + defaults: { + fromX: 0, + fromY: 0, + toX: 1, + toY: 1 + } + } + }, + + render: function (surface, ctx, clipRegion) { + var attr = this.attr, + matrix = this.attr.matrix; + + matrix.toContext(ctx); + + ctx.beginPath(); + ctx.moveTo(attr.fromX, attr.fromY); + ctx.lineTo(attr.toX, attr.toY); + ctx.stroke(); + } +}); \ No newline at end of file diff --git a/vendor/touch/src/draw/sprite/Path.js b/vendor/touch/src/draw/sprite/Path.js new file mode 100644 index 000000000..bdcf600f6 --- /dev/null +++ b/vendor/touch/src/draw/sprite/Path.js @@ -0,0 +1,88 @@ +/** + * @class Ext.draw.sprite.Path + * @extends Ext.draw.sprite.Sprite + * + * A sprite that represents a path. + * + * @example preview miniphone + * var component = new Ext.draw.Component({ + * items: [{ + * type: 'path', + * path: 'M75,75 c0,-25 50,25 50,0 c0,-25 -50,25 -50,0', + * fillStyle: 'blue' + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(component); + */ +Ext.define('Ext.draw.sprite.Path', { + extend: 'Ext.draw.sprite.Sprite', + requires: ['Ext.draw.Draw', 'Ext.draw.Path'], + alias: 'sprite.path', + type: 'path', + inheritableStatics: { + def: { + processors: { + /** + * @cfg {String} path The SVG based path string used by the sprite. + */ + path: function (n, o) { + if (!(n instanceof Ext.draw.Path)) { + n = new Ext.draw.Path(n); + } + return n; + } + }, + aliases: { + d: 'path' + }, + dirtyTriggers: { + path: 'bbox' + }, + updaters: { + path: function (attr) { + var path = attr.path; + if (!path || path.bindAttr !== attr) { + path = new Ext.draw.Path(); + path.bindAttr = attr; + attr.path = path; + } + path.clear(); + this.updatePath(path, attr); + attr.dirtyFlags.bbox = ['path']; + } + } + } + }, + + updatePlainBBox: function (plain) { + if (this.attr.path) { + this.attr.path.getDimension(plain); + } + }, + + updateTransformedBBox: function (transform) { + if (this.attr.path) { + this.attr.path.getDimensionWithTransform(this.attr.matrix, transform); + } + }, + + render: function (surface, ctx) { + var mat = this.attr.matrix, + attr = this.attr; + if (!attr.path || attr.path.coords.length === 0) { + return; + } + mat.toContext(ctx); + ctx.appendPath(attr.path); + ctx.fillStroke(attr); + }, + + /** + * Update the path. + * @param {Ext.draw.Path} path An empty path to draw on using path API. + * @param {Object} attr The attribute object. Note: DO NOT use the `sprite.attr` instead of this + * if you want to work with instancing. + */ + updatePath: function (path, attr) {} +}); \ No newline at end of file diff --git a/vendor/touch/src/draw/sprite/Rect.js b/vendor/touch/src/draw/sprite/Rect.js new file mode 100644 index 000000000..9ca742619 --- /dev/null +++ b/vendor/touch/src/draw/sprite/Rect.js @@ -0,0 +1,101 @@ +/** + * @class Ext.draw.sprite.Rect + * @extends Ext.draw.sprite.Path + * + * A sprite that represents a rectangle. + * + * @example preview miniphone + * var component = new Ext.draw.Component({ + * items: [{ + * type: 'rect', + * x: 50, + * y: 50, + * width: 50, + * height: 50, + * fillStyle: 'blue' + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(component); + */ +Ext.define('Ext.draw.sprite.Rect', { + extend: 'Ext.draw.sprite.Path', + alias: 'sprite.rect', + type: 'rect', + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Number} [x=0] The position of the sprite on the x-axis. + */ + x: 'number', + + /** + * @cfg {Number} [y=0] The position of the sprite on the y-axis. + */ + y: 'number', + + /** + * @cfg {Number} [width=1] The width of the sprite. + */ + width: 'number', + + /** + * @cfg {Number} [height=1] The height of the sprite. + */ + height: 'number', + + /** + * @cfg {Number} [radius=0] The radius of the rounded corners. + */ + radius: 'number' + }, + aliases: { + + }, + dirtyTriggers: { + x: 'path', + y: 'path', + width: 'path', + height: 'path', + radius: 'path' + }, + defaults: { + x: 0, + y: 0, + width: 1, + height: 1, + radius: 0 + } + } + }, + + updatePlainBBox: function (plain) { + var attr = this.attr; + plain.x = attr.x; + plain.y = attr.y; + plain.width = attr.width; + plain.height = attr.height; + }, + + updateTransformedBBox: function (transform, plain) { + this.attr.matrix.transformBBox(plain, this.attr.radius, transform); + }, + + updatePath: function (path, attr) { + var x = attr.x, + y = attr.y, + width = attr.width, + height = attr.height, + radius = Math.min(attr.radius, Math.abs(attr.height) * 0.5, Math.abs(attr.width) * 0.5); + if (radius === 0) { + path.rect(x, y, width, height); + } else { + path.moveTo(x + radius, y); + path.arcTo(x + width, y, x + width, y + height, radius); + path.arcTo(x + width, y + height, x, y + height, radius); + path.arcTo(x, y + height, x, y, radius); + path.arcTo(x, y, x + radius, y, radius); + } + } +}); \ No newline at end of file diff --git a/vendor/touch/src/draw/sprite/Sector.js b/vendor/touch/src/draw/sprite/Sector.js new file mode 100644 index 000000000..00168652e --- /dev/null +++ b/vendor/touch/src/draw/sprite/Sector.js @@ -0,0 +1,94 @@ +/** + * @class Ext.draw.sprite.Sector + * @extends Ext.draw.sprite.Path + * + * A sprite representing a pie slice. + */ +Ext.define('Ext.draw.sprite.Sector', { + extend: 'Ext.draw.sprite.Path', + alias: 'sprite.sector', + type: 'sector', + inheritableStatics: { + def: { + processors: { + /** + * @cfg {Number} [centerX=0] The center coordinate of the sprite on the x-axis. + */ + centerX: 'number', + + /** + * @cfg {Number} [centerY=0] The center coordinate of the sprite on the y-axis. + */ + centerY: 'number', + + /** + * @cfg {Number} [startAngle=0] The starting angle of the sprite. + */ + startAngle: 'number', + + /** + * @cfg {Number} [endAngle=0] The ending angle of the sprite. + */ + endAngle: 'number', + + /** + * @cfg {Number} [startRho=0] The starting point of the radius of the sprite. + */ + startRho: 'number', + + /** + * @cfg {Number} [endRho=150] The ending point of the radius of the sprite. + */ + endRho: 'number', + + /** + * @cfg {Number} [margin=0] The margin of the sprite from the center of pie. + */ + margin: 'number' + }, + aliases: { + rho: 'endRho' + }, + dirtyTriggers: { + centerX: 'path,bbox', + centerY: 'path,bbox', + startAngle: 'path,bbox', + endAngle: 'path,bbox', + startRho: 'path,bbox', + endRho: 'path,bbox', + margin: 'path,bbox' + }, + defaults: { + centerX: 0, + centerY: 0, + startAngle: 0, + endAngle: 0, + startRho: 0, + endRho: 150, + margin: 0, + path: 'M 0,0' + } + } + }, + + updatePath: function (path, attr) { + var startAngle = Math.min(attr.startAngle, attr.endAngle), + endAngle = Math.max(attr.startAngle, attr.endAngle), + midAngle = (startAngle + endAngle) * 0.5, + margin = attr.margin, + centerX = attr.centerX, + centerY = attr.centerY, + startRho = Math.min(attr.startRho, attr.endRho), + endRho = Math.max(attr.startRho, attr.endRho); + + if (margin) { + centerX += margin * Math.cos(midAngle); + centerY += margin * Math.sin(midAngle); + } + path.moveTo(centerX + startRho * Math.cos(startAngle), centerY + startRho * Math.sin(startAngle)); + path.lineTo(centerX + endRho * Math.cos(startAngle), centerY + endRho * Math.sin(startAngle)); + path.arc(centerX, centerY, endRho, startAngle, endAngle, false); + path.lineTo(centerX + startRho * Math.cos(endAngle), centerY + startRho * Math.sin(endAngle)); + path.arc(centerX, centerY, startRho, endAngle, startAngle, true); + } +}); \ No newline at end of file diff --git a/vendor/touch/src/draw/sprite/Sprite.js b/vendor/touch/src/draw/sprite/Sprite.js new file mode 100644 index 000000000..f2a4b80ab --- /dev/null +++ b/vendor/touch/src/draw/sprite/Sprite.js @@ -0,0 +1,722 @@ +/** + * A sprite is an object rendered in a drawing {@link Ext.draw.Surface}. + * The Sprite class itself is an abstract class and is not meant to be used directly. + * Every sprite in the Draw and Chart packages is a subclass of the Ext.draw.sprite.Sprite. + * The standard Sprite subclasses are: + * + * * {@link Ext.draw.sprite.Path} - A sprite that represents a path. + * * {@link Ext.draw.sprite.Rect} - A sprite that represents a rectangle. + * * {@link Ext.draw.sprite.Circle} - A sprite that represents a circle. + * * {@link Ext.draw.sprite.Sector} - A sprite representing a pie slice. + * * {@link Ext.draw.sprite.Arc} - A sprite that represents a circular arc. + * * {@link Ext.draw.sprite.Ellipse} - A sprite that represents an ellipse. + * * {@link Ext.draw.sprite.EllipticalArc} - A sprite that represents an elliptical arc. + * * {@link Ext.draw.sprite.Text} - A sprite that represents text. + * * {@link Ext.draw.sprite.Image} - A sprite that represents an image. + * * {@link Ext.draw.sprite.Instancing} - A sprite that represents multiple instances based on the given template. + * * {@link Ext.draw.sprite.Composite} - Represents a group of sprites. + * + * Sprites can be created with a reference to a {@link Ext.draw.Surface} + * + * var drawComponent = Ext.create('Ext.draw.Component', { + * // ... + * }); + * + * var sprite = Ext.create('Ext.draw.sprite.Sprite', { + * type: 'circle', + * fill: '#ff0', + * surface: drawComponent.getSurface('main'), + * radius: 5 + * }); + * + * Sprites can also be added to the surface as a configuration object: + * + * var sprite = drawComponent.getSurface('main').add({ + * type: 'circle', + * fill: '#ff0', + * radius: 5 + * }); + */ +Ext.define('Ext.draw.sprite.Sprite', { + alias: 'sprite.sprite', + + mixins: { + observable: 'Ext.mixin.Observable' + }, + + requires: [ + 'Ext.draw.Draw', + 'Ext.draw.gradient.Gradient', + 'Ext.draw.sprite.AttributeDefinition', + 'Ext.draw.sprite.AttributeParser', + 'Ext.draw.modifier.Target', + 'Ext.draw.modifier.Animation', + 'Ext.draw.modifier.Highlight' + ], + + isSprite: true, + + inheritableStatics: { + def: { + processors: { + /** + * @cfg {String} [strokeStyle="none"] The color of the stroke (a CSS color value). + */ + strokeStyle: "color", + + /** + * @cfg {String} [fillStyle="none"] The color of the shape (a CSS color value). + */ + fillStyle: "color", + + /** + * @cfg {Number} [strokeOpacity=1] The opacity of the stroke. Limited from 0 to 1. + */ + strokeOpacity: "limited01", + + /** + * @cfg {Number} [fillOpacity=1] The opacity of the fill. Limited from 0 to 1. + */ + fillOpacity: "limited01", + + /** + * @cfg {Number} [lineWidth=1] The width of the line stroke. + */ + lineWidth: "number", + + /** + * @cfg {String} [lineCap="butt"] The style of the line caps. + */ + lineCap: "enums(butt,round,square)", + + /** + * @cfg {String} [lineJoin="miter"] The style of the line join. + */ + lineJoin: "enums(round,bevel,miter)", + + /** + * @cfg {Array} An array of non-negative numbers specifying a dash/space sequence. + */ + lineDash: "data", + + /** + * @cfg {Number} A number specifying how far into the line dash sequence drawing commences. + */ + lineDashOffset: "number", + + /** + * @cfg {Number} [miterLimit=1] Sets the distance between the inner corner and the outer corner where two lines meet. + */ + miterLimit: "number", + + /** + * @cfg {String} [shadowColor="none"] The color of the shadow (a CSS color value). + */ + shadowColor: "color", + + /** + * @cfg {Number} [shadowOffsetX=0] The offset of the sprite's shadow on the x-axis. + */ + shadowOffsetX: "number", + + /** + * @cfg {Number} [shadowOffsetY=0] The offset of the sprite's shadow on the y-axis. + */ + shadowOffsetY: "number", + + /** + * @cfg {Number} [shadowBlur=0] The amount blur used on the shadow. + */ + shadowBlur: "number", + + /** + * @cfg {Number} [globalAlpha=1] The opacity of the sprite. Limited from 0 to 1. + */ + globalAlpha: "limited01", + globalCompositeOperation: "enums(source-over,destination-over,source-in,destination-in,source-out,destination-out,source-atop,destination-atop,lighter,xor,copy)", + + /** + * @cfg {Boolean} [hidden=false] Determines whether or not the sprite is hidden. + */ + hidden: "bool", + + /** + * @cfg {Boolean} [transformFillStroke=false] Determines whether the fill and stroke are affected by sprite transformations. + */ + transformFillStroke: "bool", + + /** + * @cfg {Number} [zIndex=0] The stacking order of the sprite. + */ + zIndex: "number", + + /** + * @cfg {Number} [translationX=0] The translation of the sprite on the x-axis. + */ + translationX: "number", + + /** + * @cfg {Number} [translationY=0] The translation of the sprite on the y-axis. + */ + translationY: "number", + + /** + * @cfg {Number} [rotationRads=0] The degree of rotation of the sprite. + */ + rotationRads: "number", + + /** + * @cfg {Number} [rotationCenterX=null] The central coordinate of the sprite's scale operation on the x-axis. + */ + rotationCenterX: "number", + + /** + * @cfg {Number} [rotationCenterY=null] The central coordinate of the sprite's rotate operation on the y-axis. + */ + rotationCenterY: "number", + + /** + * @cfg {Number} [scalingX=1] The scaling of the sprite on the x-axis. + */ + scalingX: "number", + + /** + * @cfg {Number} [scalingY=1] The scaling of the sprite on the y-axis. + */ + scalingY: "number", + + /** + * @cfg {Number} [scalingCenterX=null] The central coordinate of the sprite's scale operation on the x-axis. + */ + scalingCenterX: "number", + + /** + * @cfg {Number} [scalingCenterY=null] The central coordinate of the sprite's scale operation on the y-axis. + */ + scalingCenterY: "number", + + constrainGradients: "bool" + }, + + aliases: { + "stroke": "strokeStyle", + "fill": "fillStyle", + "color": "fillStyle", + "stroke-width": "lineWidth", + "stroke-linecap": "lineCap", + "stroke-linejoin": "lineJoin", + "stroke-miterlimit": "miterLimit", + "text-anchor": "textAlign", + "opacity": "globalAlpha", + + translateX: "translationX", + translateY: "translationY", + rotateRads: "rotationRads", + rotateCenterX: "rotationCenterX", + rotateCenterY: "rotationCenterY", + scaleX: "scalingX", + scaleY: "scalingY", + scaleCenterX: "scalingCenterX", + scaleCenterY: "scalingCenterY" + }, + + defaults: { + hidden: false, + zIndex: 0, + + strokeStyle: "none", + fillStyle: "none", + lineWidth: 1, + lineDash: [], + lineDashOffset: 0, + lineCap: "butt", + lineJoin: "miter", + miterLimit: 1, + + shadowColor: "none", + shadowOffsetX: 0, + shadowOffsetY: 0, + shadowBlur: 0, + + globalAlpha: 1, + strokeOpacity: 1, + fillOpacity: 1, + transformFillStroke: false, + + translationX: 0, + translationY: 0, + rotationRads: 0, + rotationCenterX: null, + rotationCenterY: null, + scalingX: 1, + scalingY: 1, + scalingCenterX: null, + scalingCenterY: null, + + constrainGradients: false + }, + + dirtyTriggers: { + hidden: "canvas", + zIndex: "zIndex", + + globalAlpha: "canvas", + globalCompositeOperation: "canvas", + + transformFillStroke: "canvas", + strokeStyle: "canvas", + fillStyle: "canvas", + strokeOpacity: "canvas", + fillOpacity: "canvas", + + lineWidth: "canvas", + lineCap: "canvas", + lineJoin: "canvas", + lineDash: "canvas", + lineDashOffset: "canvas", + miterLimit: "canvas", + + shadowColor: "canvas", + shadowOffsetX: "canvas", + shadowOffsetY: "canvas", + shadowBlur: "canvas", + + translationX: "transform", + translationY: "transform", + rotationRads: "transform", + rotationCenterX: "transform", + rotationCenterY: "transform", + scalingX: "transform", + scalingY: "transform", + scalingCenterX: "transform", + scalingCenterY: "transform", + + constrainGradients: "canvas" + }, + + updaters: { + "bbox": function (attrs) { + attrs.bbox.plain.dirty = true; + attrs.bbox.transform.dirty = true; + if ( + attrs.rotationRads !== 0 && (attrs.rotationCenterX === null || attrs.rotationCenterY === null) || + ((attrs.scalingX !== 1 || attrs.scalingY !== 1) && + (attrs.scalingCenterX === null || attrs.scalingCenterY === null) + ) + ) { + if (!attrs.dirtyFlags.transform) { + attrs.dirtyFlags.transform = []; + } + } + }, + + "zIndex": function (attrs) { + attrs.dirtyZIndex = true; + }, + + "transform": function (attrs) { + attrs.dirtyTransform = true; + attrs.bbox.transform.dirty = true; + } + } + } + }, + + /** + * @property {Object} attr + * The visual attributes of the sprite, e.g. strokeStyle, fillStyle, lineWidth... + */ + attr: {}, + + config: { + parent: null + }, + + onClassExtended: function (Class, member) { + var initCfg = Class.superclass.self.def.initialConfig, + cfg; + + if (member.inheritableStatics && member.inheritableStatics.def) { + cfg = Ext.merge({}, initCfg, member.inheritableStatics.def); + Class.def = Ext.create("Ext.draw.sprite.AttributeDefinition", cfg); + delete member.inheritableStatics.def; + } else { + Class.def = Ext.create("Ext.draw.sprite.AttributeDefinition", initCfg); + } + }, + + constructor: function (config) { + if (this.$className === 'Ext.draw.sprite.Sprite') { + throw 'Ext.draw.sprite.Sprite is an abstract class'; + } + config = config || {}; + var me = this; + + me.id = config.id || Ext.id(null, 'ext-sprite-'); + me.attr = {}; + me.initConfig(config); + var modifiers = Ext.Array.from(config.modifiers, true); + me.prepareModifiers(modifiers); + me.initializeAttributes(); + me.setAttributes(me.self.def.getDefaults(), true); + me.setAttributes(config); + }, + + getDirty: function () { + return this.attr.dirty; + }, + + setDirty: function (dirty) { + if ((this.attr.dirty = dirty)) { + if (this._parent) { + this._parent.setDirty(true); + } + } + }, + + addModifier: function (modifier, reinitializeAttributes) { + var me = this; + if (!(modifier instanceof Ext.draw.modifier.Modifier)) { + modifier = Ext.factory(modifier, null, null, 'modifier'); + } + modifier.setSprite(this); + if (modifier.preFx || modifier.config && modifier.config.preFx) { + if (me.fx.getPrevious()) { + me.fx.getPrevious().setNext(modifier); + } + modifier.setNext(me.fx); + } else { + me.topModifier.getPrevious().setNext(modifier); + modifier.setNext(me.topModifier); + } + if (reinitializeAttributes) { + me.initializeAttributes(); + } + return modifier; + }, + + prepareModifiers: function (additionalModifiers) { + // Set defaults + var me = this, + modifier, i, ln; + + me.topModifier = new Ext.draw.modifier.Target({sprite: me}); + + // Link modifiers + me.fx = new Ext.draw.modifier.Animation({sprite: me}); + me.fx.setNext(me.topModifier); + + for (i = 0, ln = additionalModifiers.length; i < ln; i++) { + me.addModifier(additionalModifiers[i], false); + } + }, + + initializeAttributes: function () { + var me = this; + me.topModifier.prepareAttributes(me.attr); + }, + + updateDirtyFlags: function (attrs) { + var me = this, + dirtyFlags = attrs.dirtyFlags, flags, + updaters = me.self.def._updaters, + any = false, + dirty = false, + flag; + + do { + any = false; + for (flag in dirtyFlags) { + me.updateDirtyFlags = Ext.emptyFn; + flags = dirtyFlags[flag]; + delete dirtyFlags[flag]; + if (updaters[flag]) { + updaters[flag].call(me, attrs, flags); + } + any = true; + delete me.updateDirtyFlags; + } + dirty = dirty || any; + } while (any); + + if (dirty) { + me.setDirty(true); + } + }, + + /** + * Set attributes of the sprite. + * + * @param {Object} changes The content of the change. + * @param {Boolean} [bypassNormalization] `true` to avoid normalization of the given changes. + * @param {Boolean} [avoidCopy] `true` to avoid copying the `changes` object. + * The content of object may be destroyed. + */ + setAttributes: function (changes, bypassNormalization, avoidCopy) { + var attributes = this.attr; + if (bypassNormalization) { + if (avoidCopy) { + this.topModifier.pushDown(attributes, changes); + } else { + this.topModifier.pushDown(attributes, Ext.apply({}, changes)); + } + } else { + this.topModifier.pushDown(attributes, this.self.def.normalize(changes)); + } + }, + + /** + * Set attributes of the sprite, assuming the names and values have already been + * normalized. + * + * @deprecated Use setAttributes directy with bypassNormalization argument being `true`. + * @param {Object} changes The content of the change. + * @param {Boolean} [avoidCopy] `true` to avoid copying the `changes` object. + * The content of object may be destroyed. + */ + setAttributesBypassingNormalization: function (changes, avoidCopy) { + return this.setAttributes(changes, true, avoidCopy); + }, + + /** + * Returns the bounding box for the given Sprite as calculated with the Canvas engine. + * + * @param {Boolean} [isWithoutTransform] Whether to calculate the bounding box with the current transforms or not. + */ + getBBox: function (isWithoutTransform) { + var me = this, + attr = me.attr, + bbox = attr.bbox, + plain = bbox.plain, + transform = bbox.transform; + if (plain.dirty) { + me.updatePlainBBox(plain); + plain.dirty = false; + } + if (isWithoutTransform) { + return plain; + } else { + me.applyTransformations(); + if (transform.dirty) { + me.updateTransformedBBox(transform, plain); + transform.dirty = false; + } + return transform; + } + }, + + /** + * @protected + * Subclass will fill the plain object with `x`, `y`, `width`, `height` information of the plain bounding box of + * this sprite. + * + * @param {Object} plain Target object. + */ + updatePlainBBox: Ext.emptyFn, + + /** + * @protected + * Subclass will fill the plain object with `x`, `y`, `width`, `height` information of the transformed + * bounding box of this sprite. + * + * @param {Object} transform Target object. + * @param {Object} plain Auxiliary object providing information of plain object. + */ + updateTransformedBBox: function (transform, plain) { + this.attr.matrix.transformBBox(plain, 0, transform); + }, + + /** + * Subclass can rewrite this function to gain better performance. + * @param {Boolean} isWithoutTransform + * @return {Array} + */ + getBBoxCenter: function (isWithoutTransform) { + var bbox = this.getBBox(isWithoutTransform); + if (bbox) { + return [ + bbox.x + bbox.width * 0.5, + bbox.y + bbox.height * 0.5 + ]; + } else { + return [0, 0]; + } + }, + + /** + * Hide the sprite. + * @return {Ext.draw.sprite.Sprite} this + * @chainable + */ + hide: function () { + this.attr.hidden = true; + this.setDirty(true); + return this; + }, + + /** + * Show the sprite. + * @return {Ext.draw.sprite.Sprite} this + * @chainable + */ + show: function () { + this.attr.hidden = false; + this.setDirty(true); + return this; + }, + + /** + * Applies sprite's attributes to the given context. + * @param {Object} ctx Context to apply sprite's attributes to. + * @param {Array} region The region of the context to be affected by gradients. + */ + useAttributes: function (ctx, region) { + this.applyTransformations(); + var attrs = this.attr, + canvasAttributes = attrs.canvasAttributes, + strokeStyle = canvasAttributes.strokeStyle, + fillStyle = canvasAttributes.fillStyle, + lineDash = canvasAttributes.lineDash, + lineDashOffset = canvasAttributes.lineDashOffset, + id; + + if (strokeStyle) { + if (strokeStyle.isGradient) { + ctx.strokeStyle = 'black'; + ctx.strokeGradient = strokeStyle; + } else { + ctx.strokeGradient = false; + } + } + + if (fillStyle) { + if (fillStyle.isGradient) { + ctx.fillStyle = 'black'; + ctx.fillGradient = fillStyle; + } else { + ctx.fillGradient = false; + } + } + + if (lineDash && ctx.setLineDash) { + ctx.setLineDash(lineDash); + } + + if (lineDashOffset && typeof ctx.lineDashOffset === 'number') { + ctx.lineDashOffset = lineDashOffset; + } + + for (id in canvasAttributes) { + if (canvasAttributes[id] !== undefined && canvasAttributes[id] !== ctx[id]) { + ctx[id] = canvasAttributes[id]; + } + } + + if(attrs.constrainGradients) { + ctx.setGradientBBox({x: region[0], y: region[1], width: region[2], height: region[3]}); + } else { + ctx.setGradientBBox(this.getBBox(attrs.transformFillStroke)); + } + }, + + /** + * @private + * + * Calculates forward and inverse transform matrices. + * @param {Boolean} force Forces recalculation of transform matrices even when sprite's transform attributes supposedly haven't changed. + */ + applyTransformations: function (force) { + if (!force && !this.attr.dirtyTransform) { + return; + } + var me = this, + attr = me.attr, + center = me.getBBoxCenter(true), + centerX = center[0], + centerY = center[1], + + x = attr.translationX, + y = attr.translationY, + + sx = attr.scalingX, + sy = attr.scalingY === null ? attr.scalingX : attr.scalingY, + scx = attr.scalingCenterX === null ? centerX : attr.scalingCenterX, + scy = attr.scalingCenterY === null ? centerY : attr.scalingCenterY, + + rad = attr.rotationRads, + rcx = attr.rotationCenterX === null ? centerX : attr.rotationCenterX, + rcy = attr.rotationCenterY === null ? centerY : attr.rotationCenterY, + + cos = Math.cos(rad), + sin = Math.sin(rad); + + if (sx === 1 && sy === 1) { + scx = 0; + scy = 0; + } + + if (rad === 0) { + rcx = 0; + rcy = 0; + } + + attr.matrix.elements = [ + cos * sx, sin * sy, + -sin * sx, cos * sy, + scx + (rcx - cos * rcx - scx + rcy * sin) * sx + x, + scy + (rcy - cos * rcy - scy + rcx * -sin) * sy + y + ]; + attr.matrix.inverse(attr.inverseMatrix); + attr.dirtyTransform = false; + attr.bbox.transform.dirty = true; + }, + + /** + * Called before rendering. + */ + preRender: Ext.emptyFn, + + /** + * Render method. + * @param {Ext.draw.Surface} surface The surface. + * @param {Object} ctx A context object compatible with CanvasRenderingContext2D. + * @param {Array} region The clip region (or called dirty rect) of the current rendering. Not be confused + * with `surface.getRegion()`. + * + * @return {*} returns `false` to stop rendering in this frame. All the sprite haven't been rendered + * will have their dirty flag untouched. + */ + render: Ext.emptyFn, + + repaint: function () { + var parent = this.getParent(); + while (parent && !(parent instanceof Ext.draw.Surface)) { + parent = parent.getParent(); + } + if (parent) { + parent.renderFrame(); + } + }, + + /** + * Removes the sprite and clears all listeners. + */ + destroy: function () { + var me = this, modifier = me.topModifier, curr; + while (modifier) { + curr = modifier; + modifier = modifier.getPrevious(); + curr.destroy(); + } + delete me.attr; + + me.destroy = Ext.emptyFn; + if (me.fireEvent('beforedestroy', me) !== false) { + me.fireEvent('destroy', me); + } + this.callSuper(); + } +}, function () { + this.def = Ext.create("Ext.draw.sprite.AttributeDefinition", this.def); +}); + diff --git a/vendor/touch/src/draw/sprite/Text.js b/vendor/touch/src/draw/sprite/Text.js new file mode 100644 index 000000000..44115ed79 --- /dev/null +++ b/vendor/touch/src/draw/sprite/Text.js @@ -0,0 +1,334 @@ +/** + * @class Ext.draw.sprite.Text + * @extends Ext.draw.sprite.Sprite + * + * A sprite that represents text. + * + * @example preview miniphone + * var component = new Ext.draw.Component({ + * items: [{ + * type: 'text', + * x: 50, + * y: 50, + * text: 'Sencha', + * fontSize: 18, + * fillStyle: 'blue' + * }] + * }); + * Ext.Viewport.setLayout('fit'); + * Ext.Viewport.add(component); + */ +Ext.define("Ext.draw.sprite.Text", { + extend: "Ext.draw.sprite.Sprite", + requires: ['Ext.draw.TextMeasurer'], + alias: 'sprite.text', + type: 'text', + lineBreakRe: /\n/g, + inheritableStatics: { + shortHand1Re: /'(.*)'/g, + shortHand2Re: / /g, + shortHand3Re: /\s*,\s*/g, + shortHand4Re: /\$\$\$\$/g, + def: { + processors: { + /** + * @cfg {Number} [x=0] The position of the sprite on the x-axis. + */ + x: "number", + + /** + * @cfg {Number} [y=0] The position of the sprite on the y-axis. + */ + y: "number", + + /** + * @cfg {String} [text=''] The text represented in the sprite. + */ + text: "string", + + /** + * @cfg {String/Number} [fontSize='10px'] The size of the font displayed. + */ + fontSize: function (n) { + if (!isNaN(n)) { + return +n + 'px'; + } else if (n.match(Ext.dom.Element.unitRe)) { + return n; + } + }, + + /** + * @cfg {String} [fontStyle=''] The style of the font displayed. {normal, italic, oblique} + */ + fontStyle: "enums(,italic,oblique)", + + /** + * @cfg {String} [fontVariant=''] The variant of the font displayed. {normal, small-caps} + */ + fontVariant: "enums(,small-caps)", + + /** + * @cfg {String} [fontWeight=''] The weight of the font displayed. {normal, bold, bolder, lighter} + */ + fontWeight: (function (fontWeights) { + return function (n) { + if (!n) { + return ""; + } else if (n === 'normal') { + return ''; + } else if (!isNaN(n)) { + n = +n; + if (100 <= n && n <= 900) { + return n; + } + } else if (n in fontWeights) { + return n; + } + }; + })({"normal": true, "bold": true, "bolder": true, "lighter": true}), + + /** + * @cfg {String} [fontFamily='sans-serif'] The family of the font displayed. + */ + fontFamily: "string", + + /** + * @cfg {String} [textAlign='start'] The alignment of the text displayed. {left, right, center, start, end} + */ + textAlign: (function (textAligns) { + return function (n) { + if (n === 'middle') { + return 'center'; + } else if (!n) { + return "center"; + } else if (!Ext.isString(n)) { + return undefined; + } else if (n in textAligns) { + return n; + } + }; + })({"left": true, "right": true, "center": true, "start": true, "end": true}), + + /** + * @cfg {String} [textBaseline="alphabetic"] The baseline of the text displayed. {top, hanging, middle, alphabetic, ideographic, bottom} + */ + textBaseline: (function (textBaselines) { + return function (n) { + if (n === false) { + return "alphabetic"; + } else if (n in textBaselines) { + return n; + } else if (n === 'center') { + return 'middle'; + } + }; + })({"top": true, "hanging": true, "middle": true, "alphabetic": true, "ideographic": true, "bottom": true}), + + /** + * @cfg {String} [font='10px sans-serif'] The font displayed. + */ + font: "string" + }, + aliases: { + "font-size": "fontSize", + "font-family": "fontFamily", + "font-weight": "fontWeight", + "font-variant": "fontVariant", + "text-anchor": "textAlign" + }, + defaults: { + fontStyle: '', + fontVariant: '', + fontWeight: '', + fontSize: '10px', + fontFamily: 'sans-serif', + font: '10px sans-serif', + textBaseline: "alphabetic", + textAlign: "start", + strokeStyle: 'rgba(0, 0, 0, 0)', + divBased: true, + fillStyle: '#000', + x: 0, + y: 0, + text: '' + }, + dirtyTriggers: { + fontStyle: 'font,bbox', + fontVariant: 'font,bbox', + fontWeight: 'font,bbox', + fontSize: 'font,bbox', + fontFamily: 'font,bbox', + font: 'font-short-hand,bbox,canvas', + textBaseline: 'bbox', + textAlign: 'bbox', + x: "bbox", + y: "bbox", + text: "bbox" + }, + updaters: { + "font-short-hand": (function (dispatcher) { + return function (attrs) { + // TODO: Do this according to http://www.w3.org/TR/CSS21/fonts.html#font-shorthand + var value = attrs.font, + parts, part, i, ln, dispKey; + value = value.replace(Ext.draw.sprite.Text.shortHand1Re, function (a, arg1) { + return arg1.replace(Ext.draw.sprite.Text.shortHand2Re, '$$$$'); + }); + value = value.replace(Ext.draw.sprite.Text.shortHand3Re, ','); + parts = value.split(' '); + + attrs = {}; + for (i = 0, ln = parts.length; i < ln; i++) { + part = parts[i]; + dispKey = dispatcher[part]; + if (dispKey) { + attrs[dispKey] = part; + } else if (part.match(Ext.dom.Element.unitRe)) { + attrs.fontSize = part; + } else { + attrs.fontFamily = part.replace(Ext.draw.sprite.Text.shortHand4Re, ' '); + } + } + this.setAttributes(attrs, true); + }; + })({ + "italic": "fontStyles", + "oblique": "fontStyles", + "bold": "fontWeights", + "bolder": "fontWeights", + "lighter": "fontWeights", + "100": "fontWeights", + "200": "fontWeights", + "300": "fontWeights", + "400": "fontWeights", + "500": "fontWeights", + "600": "fontWeights", + "700": "fontWeights", + "800": "fontWeights", + "900": "fontWeights", + "small-caps": "fontVariant" + }), + "font": function (attrs) { + var font = ''; + if (attrs.fontWeight) { + font += attrs.fontWeight + ' '; + } + if (attrs.fontVariant) { + font += attrs.fontVariant + ' '; + } + if (attrs.fontSize) { + font += attrs.fontSize + ' '; + } + if (attrs.fontFamily) { + font += attrs.fontFamily + ' '; + } + this.setAttributes({ + font: font.substr(0, font.length - 1) + }, true); + } + } + } + }, + + constructor: function (config) { + Ext.draw.sprite.Sprite.prototype.constructor.call(this, config); + }, + + updatePlainBBox: function (plain) { + var me = this, + attr = me.attr, + x = attr.x, + y = attr.y, + dx = [], + font = attr.font, + text = attr.text, + baseline = attr.textBaseline, + alignment = attr.textAlign, + size = Ext.draw.TextMeasurer.measureText(text, font), + sizes = size.sizes, + height = size.height, + width = size.width, + ln = sizes ? sizes.length : 0, + i = 0; + + switch (baseline) { + case 'hanging' : + case 'top': + break; + case 'ideographic' : + case 'bottom' : + y -= height; + break; + case 'alphabetic' : + y -= height * 0.8; + break; + case 'middle' : + case 'center' : + y -= height * 0.5; + break; + } + switch (alignment) { + case 'end' : + case 'right' : + x -= width; + for (; i < ln; i++) { + dx.push(width - sizes[i].width); + } + break; + case 'middle' : + case 'center' : + x -= width * 0.5; + for (; i < ln; i++) { + dx.push((width - sizes[i].width) * 0.5); + } + break; + } + + attr.textAlignOffsets = dx; + + plain.x = x; + plain.y = y; + plain.width = width; + plain.height = height; + }, + + setText: function (text) { + this.setAttributes({text: text}, true); + }, + + setElementStyles: function (element, styles) { + var stylesCache = element.stylesCache || (element.stylesCache = {}), + style = element.dom.style, + name; + for (name in styles) { + if (stylesCache[name] !== styles[name]) { + stylesCache[name] = style[name] = styles[name]; + } + } + }, + + render: function (surface, ctx) { + var attr = this.attr, + mat = Ext.draw.Matrix.fly(attr.matrix.elements.slice(0)), + bbox = this.getBBox(true), + dx = attr.textAlignOffsets, + x, y, i, lines; + if (attr.text.length === 0) { + return; + } + + lines = attr.text.split('\n'); + // Simulate textBaseline and textAlign. + x = attr.bbox.plain.x; + y = attr.bbox.plain.y; + mat.toContext(ctx); + for (i = 0; i < lines.length; i++) { + if (ctx.fillStyle !== 'rgba(0, 0, 0, 0)') { + ctx.fillText(lines[i], x + (dx[i] || 0), y + bbox.height / lines.length * i); + } + if (ctx.strokeStyle !== 'rgba(0, 0, 0, 0)') { + ctx.strokeText(lines[i], x + (dx[i] || 0), y + bbox.height / lines.length * i); + } + } + } +}); \ No newline at end of file