summaryrefslogtreecommitdiffstats
path: root/tests/benchmarks/widgets
diff options
context:
space:
mode:
Diffstat (limited to 'tests/benchmarks/widgets')
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.pro70
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.qrc85
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/main.cpp780
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_001_58x58.pngbin0 -> 6598 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_002_58x58.pngbin0 -> 6687 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_003_58x58.pngbin0 -> 6261 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_004_58x58.pngbin0 -> 6783 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_005_58x58.pngbin0 -> 6317 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_006_58x58.pngbin0 -> 7020 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_007_58x58.pngbin0 -> 3706 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_008_58x58.pngbin0 -> 6749 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_009_58x58.pngbin0 -> 5436 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_010_58x58.pngbin0 -> 1454 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_001_58x58.pngbin0 -> 2983 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_002_58x58.pngbin0 -> 3463 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_003_58x58.pngbin0 -> 763 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_004_58x58.pngbin0 -> 2252 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_005_58x58.pngbin0 -> 2451 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_001_58x58.pngbin0 -> 6330 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_002_58x58.pngbin0 -> 6237 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_003_58x58.pngbin0 -> 6192 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_004_58x58.pngbin0 -> 7489 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_005_58x58.pngbin0 -> 6764 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_006_58x58.pngbin0 -> 6218 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_007_58x58.pngbin0 -> 6122 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_008_58x58.pngbin0 -> 6658 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_009_58x58.pngbin0 -> 8293 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_010_58x58.pngbin0 -> 4783 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_background_360x640px.svg14
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_background_horisontal_640x360px.svg16
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_default_icon_52x52px.svg22
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_list_divider_360x76px.svg7
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_list_highlighter_360x76px.svg10
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_status_idle_33x33px.svg55
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_status_offline_33x33px.svg55
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_status_online_33x33px.svg56
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_scroll_16x80px.svg39
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_scrollbar_7x14px.svg7
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_status_field_left_14x24px.svg24
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_status_field_middle_14x24px.svg11
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_status_field_right_14x24px.svg13
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_topbar_356x96px.svg2007
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_topbar_horisontal_636x96px.svg4060
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_default_icon_68x68px.svg22
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_status_idle_38x38px.svg55
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_status_offline_38x38px.svg55
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_status_online_38x38px.svg55
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/areacodes.txt62
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/firstnamesF.txt100
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/firstnamesM.txt100
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/lastnames.txt150
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_background_360x640px.svg40
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_background_horisontal_640x360px.svg39
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_default_icon_53x53px.svg30
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_default_icon_highlight_53x53px.svg31
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_list_divider_360x76px.svg7
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_list_highlighter_357x80px.svg11
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_status_idle_27x47.svg63
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_status_offline_27x47.svg58
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_status_online_27x47.svg63
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_scroll_5x80px.svg12
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_scrollbar_5x14px.svg7
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_status_field_left_14x24px.svg30
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_status_field_middle_10x24px.svg18
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_status_field_right_14x24px.svg19
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_topbar_356x96px.svg26
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_topbar_horisontal_636x96px.svg26
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_default_icon_84x68px.svg32
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_status_idle_24x24px.svg53
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_status_offline_24x24px.svg53
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_status_online_24x24px.svg53
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemcontainer.cpp382
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemcontainer.h96
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemview.cpp425
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemview.h103
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractscrollarea.cpp236
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractscrollarea.h88
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractviewitem.cpp102
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractviewitem.h81
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/backgrounditem.cpp71
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/backgrounditem.h59
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/button.cpp196
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/button.h89
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.cpp183
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.h39
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.cpp127
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.h59
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/gvbwidget.cpp46
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/gvbwidget.h45
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/iconitem.cpp149
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/iconitem.h78
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.cpp248
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.h72
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.pri19
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglistview.cpp66
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglistview.h52
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/label.cpp81
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/label.h63
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitem.cpp287
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitem.h96
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcache.cpp79
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcache.h56
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcontainer.cpp182
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcontainer.h75
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listmodel.cpp133
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listmodel.h69
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listwidget.cpp117
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listwidget.h72
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/mainview.cpp331
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/mainview.h110
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/menu.cpp189
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/menu.h71
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/recycledlistitem.cpp134
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/recycledlistitem.h70
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/resourcemoninterface.h84
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scrollbar.cpp286
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scrollbar.h84
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller.cpp292
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller.h66
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller_p.h90
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/settings.cpp46
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/settings.h103
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelist.cpp143
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelist.h67
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelistview.cpp463
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelistview.h77
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/theme.cpp223
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/theme.h118
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/themeevent.cpp40
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/themeevent.h51
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/topbar.cpp346
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/topbar.h114
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/webview.cpp289
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/webview.h68
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/webview_p.h86
-rw-r--r--tests/benchmarks/widgets/graphicsview/functional/functional.pro4
-rw-r--r--tests/benchmarks/widgets/graphicsview/graphicsview.pro10
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsanchorlayout/qgraphicsanchorlayout.pro7
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsanchorlayout/tst_qgraphicsanchorlayout.cpp420
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsitem/qgraphicsitem.pro6
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp234
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicslayout/qgraphicslayout.pro5
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicslayout/tst_qgraphicslayout.cpp140
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro5
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp120
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro7
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp243
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/chip.cpp163
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/chip.debugbin0 -> 863805 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/chip.h55
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/chip.pro19
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/fileprint.pngbin0 -> 1456 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/images.qrc10
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/main.cpp44
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/mainwindow.cpp74
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/mainwindow.h53
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/qt4logo.pngbin0 -> 48333 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/rotateleft.pngbin0 -> 1754 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/rotateright.pngbin0 -> 1732 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/view.cpp251
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/view.h73
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/zoomin.pngbin0 -> 1622 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/zoomout.pngbin0 -> 1601 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/moveItems/main.cpp99
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/moveItems/moveItems.pro1
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/scrolltest/main.cpp139
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/scrolltest/scrolltest.pro1
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chip.cpp169
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chip.h55
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.cpp132
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.h74
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.pri13
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/images.qrc5
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/qt4logo.pngbin0 -> 48333 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/images/designer.pngbin0 -> 4205 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/images/wine-big.jpegbin0 -> 12249 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/images/wine.jpegbin0 -> 2265 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/qgraphicsview.pro9
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/qgraphicsview.qrc9
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/random.databin0 -> 800 bytes
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp901
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicswidget/qgraphicswidget.pro6
-rw-r--r--tests/benchmarks/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp83
-rw-r--r--tests/benchmarks/widgets/itemviews/itemviews.pro4
-rw-r--r--tests/benchmarks/widgets/itemviews/qheaderview/qheaderview.pro7
-rw-r--r--tests/benchmarks/widgets/itemviews/qheaderview/qheaderviewbench.cpp251
-rw-r--r--tests/benchmarks/widgets/itemviews/qtableview/qtableview.pro7
-rw-r--r--tests/benchmarks/widgets/itemviews/qtableview/tst_qtableview.cpp373
-rw-r--r--tests/benchmarks/widgets/kernel/kernel.pro4
-rw-r--r--tests/benchmarks/widgets/kernel/qapplication/main.cpp58
-rw-r--r--tests/benchmarks/widgets/kernel/qapplication/qapplication.pro8
-rw-r--r--tests/benchmarks/widgets/kernel/qwidget/qwidget.pro4
-rw-r--r--tests/benchmarks/widgets/kernel/qwidget/tst_qwidget.cpp243
-rw-r--r--tests/benchmarks/widgets/styles/qstylesheetstyle/main.cpp189
-rw-r--r--tests/benchmarks/widgets/styles/qstylesheetstyle/qstylesheetstyle.pro7
-rw-r--r--tests/benchmarks/widgets/styles/styles.pro3
-rw-r--r--tests/benchmarks/widgets/widgets.pro10
197 files changed, 21870 insertions, 0 deletions
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.pro b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.pro
new file mode 100644
index 0000000000..ded6a06795
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.pro
@@ -0,0 +1,70 @@
+TEMPLATE = app
+
+QT += svg testlib
+qtHaveModule(opengl): QT += opengl
+
+HEADERS += widgets/gvbwidget.h \
+ widgets/abstractscrollarea.h \
+ widgets/mainview.h \
+ widgets/iconitem.h \
+ widgets/label.h \
+ widgets/listitem.h \
+ widgets/scrollbar.h \
+ widgets/simplelistview.h \
+ widgets/scroller.h \
+ widgets/scroller_p.h \
+ widgets/button.h \
+ widgets/menu.h \
+ widgets/themeevent.h \
+ widgets/theme.h \
+ widgets/backgrounditem.h \
+ widgets/topbar.h \
+ widgets/commandline.h \
+ widgets/dummydatagen.h \
+ widgets/settings.h \
+ widgets/listitemcache.h \
+ widgets/listwidget.h \
+ widgets/simplelist.h \
+ widgets/itemrecyclinglist.h \
+ widgets/itemrecyclinglistview.h \
+ widgets/abstractitemview.h \
+ widgets/abstractviewitem.h \
+ widgets/recycledlistitem.h \
+ widgets/listitemcontainer.h \
+ widgets/abstractitemcontainer.h \
+ widgets/listmodel.h
+
+SOURCES += main.cpp \
+ widgets/gvbwidget.cpp \
+ widgets/abstractscrollarea.cpp \
+ widgets/mainview.cpp \
+ widgets/iconitem.cpp \
+ widgets/label.cpp \
+ widgets/listitem.cpp \
+ widgets/scrollbar.cpp \
+ widgets/simplelistview.cpp \
+ widgets/scroller.cpp \
+ widgets/button.cpp \
+ widgets/menu.cpp \
+ widgets/themeevent.cpp \
+ widgets/theme.cpp \
+ widgets/backgrounditem.cpp \
+ widgets/topbar.cpp \
+ widgets/commandline.cpp \
+ widgets/dummydatagen.cpp \
+ widgets/settings.cpp \
+ widgets/listitemcache.cpp \
+ widgets/listwidget.cpp \
+ widgets/simplelist.cpp \
+ widgets/itemrecyclinglist.cpp \
+ widgets/itemrecyclinglistview.cpp \
+ widgets/abstractitemview.cpp \
+ widgets/abstractviewitem.cpp \
+ widgets/recycledlistitem.cpp \
+ widgets/listitemcontainer.cpp \
+ widgets/abstractitemcontainer.cpp \
+ widgets/listmodel.cpp
+
+TARGET = tst_GraphicsViewBenchmark
+RESOURCES += GraphicsViewBenchmark.qrc
+INCLUDEPATH += widgets
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.qrc b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.qrc
new file mode 100644
index 0000000000..18ae04dd69
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.qrc
@@ -0,0 +1,85 @@
+<RCC>
+ <qresource prefix="/themes/blue">
+ <file alias="background.svg">resources/blue_SVG/blue_background_360x640px.svg</file>
+ <file alias="background_horisontal.svg">resources/blue_SVG/blue_background_horisontal_640x360px.svg</file>
+ <file alias="contact_default_icon.svg">resources/blue_SVG/blue_contact_default_icon_52x52px.svg</file>
+ <file alias="contact_list_divider.svg">resources/blue_SVG/blue_contact_list_divider_360x76px.svg</file>
+ <file alias="contact_list_highlighter.svg">resources/blue_SVG/blue_contact_list_highlighter_360x76px.svg</file>
+ <file alias="contact_status_idle.svg">resources/blue_SVG/blue_contact_status_idle_33x33px.svg</file>
+ <file alias="contact_status_offline.svg">resources/blue_SVG/blue_contact_status_offline_33x33px.svg</file>
+ <file alias="contact_status_online.svg">resources/blue_SVG/blue_contact_status_online_33x33px.svg</file>
+ <file alias="scrollbar.svg">resources/blue_SVG/blue_scrollbar_7x14px.svg</file>
+ <file alias="scroll.svg">resources/blue_SVG/blue_scroll_16x80px.svg</file>
+ <file alias="status_field_left.svg">resources/blue_SVG/blue_status_field_left_14x24px.svg</file>
+ <file alias="status_field_middle.svg">resources/blue_SVG/blue_status_field_middle_14x24px.svg</file>
+ <file alias="status_field_right.svg">resources/blue_SVG/blue_status_field_right_14x24px.svg</file>
+ <file alias="topbar.svg">resources/blue_SVG/blue_topbar_356x96px.svg</file>
+ <file alias="topbar_horisontal.svg">resources/blue_SVG/blue_topbar_horisontal_636x96px.svg</file>
+ <file alias="user_default_icon.svg">resources/blue_SVG/blue_user_default_icon_68x68px.svg</file>
+ <file alias="user_status_idle.svg">resources/blue_SVG/blue_user_status_idle_38x38px.svg</file>
+ <file alias="user_status_offline.svg">resources/blue_SVG/blue_user_status_offline_38x38px.svg</file>
+ <file alias="user_status_online.svg">resources/blue_SVG/blue_user_status_online_38x38px.svg</file>
+ </qresource>
+
+ <qresource prefix="/themes/lime">
+ <file alias="background.svg">resources/lime_SVG/lime_background_360x640px.svg</file>
+ <file alias="background_horisontal.svg">resources/lime_SVG/lime_background_horisontal_640x360px.svg</file>
+ <file alias="contact_default_icon.svg">resources/lime_SVG/lime_contact_default_icon_53x53px.svg</file>
+ <file alias="contact_default_icon_highlight.svg">resources/lime_SVG/lime_contact_default_icon_highlight_53x53px.svg</file>
+ <file alias="contact_list_divider.svg">resources/lime_SVG/lime_contact_list_divider_360x76px.svg</file>
+ <file alias="contact_list_highlighter.svg">resources/lime_SVG/lime_contact_list_highlighter_357x80px.svg</file>
+ <file alias="contact_status_idle.svg">resources/blue_SVG/blue_contact_status_idle_33x33px.svg</file>
+ <file alias="contact_status_offline.svg">resources/blue_SVG/blue_contact_status_offline_33x33px.svg</file>
+ <file alias="contact_status_online.svg">resources/blue_SVG/blue_contact_status_online_33x33px.svg</file>
+ <file alias="scrollbar.svg">resources/lime_SVG/lime_scrollbar_5x14px.svg</file>
+ <file alias="scroll.svg">resources/lime_SVG/lime_scroll_5x80px.svg</file>
+ <file alias="status_field_left.svg">resources/lime_SVG/lime_status_field_left_14x24px.svg</file>
+ <file alias="status_field_middle.svg">resources/lime_SVG/lime_status_field_middle_10x24px.svg</file>
+ <file alias="status_field_right.svg">resources/lime_SVG/lime_status_field_right_14x24px.svg</file>
+ <file alias="topbar.svg">resources/lime_SVG/lime_topbar_356x96px.svg</file>
+ <file alias="topbar_horisontal.svg">resources/lime_SVG/lime_topbar_horisontal_636x96px.svg</file>
+ <file alias="user_default_icon.svg">resources/lime_SVG/lime_user_default_icon_84x68px.svg</file>
+ <file alias="user_status_idle.svg">resources/lime_SVG/lime_user_status_idle_24x24px.svg</file>
+ <file alias="user_status_offline.svg">resources/lime_SVG/lime_user_status_offline_24x24px.svg</file>
+ <file alias="user_status_online.svg">resources/lime_SVG/lime_user_status_online_24x24px.svg</file>
+ </qresource>
+
+ <qresource prefix="/avatars">
+ <file alias="avatar_001.png">resources/avatars/avatar_man_001_58x58.png</file>
+ <file alias="avatar_002.png">resources/avatars/avatar_man_002_58x58.png</file>
+ <file alias="avatar_003.png">resources/avatars/avatar_man_003_58x58.png</file>
+ <file alias="avatar_004.png">resources/avatars/avatar_man_004_58x58.png</file>
+ <file alias="avatar_005.png">resources/avatars/avatar_man_005_58x58.png</file>
+ <file alias="avatar_006.png">resources/avatars/avatar_man_006_58x58.png</file>
+ <file alias="avatar_007.png">resources/avatars/avatar_man_007_58x58.png</file>
+ <file alias="avatar_008.png">resources/avatars/avatar_man_008_58x58.png</file>
+ <file alias="avatar_009.png">resources/avatars/avatar_man_009_58x58.png</file>
+ <file alias="avatar_010.png">resources/avatars/avatar_man_010_58x58.png</file>
+
+ <file alias="avatar_011.png">resources/avatars/avatar_picture_001_58x58.png</file>
+ <file alias="avatar_012.png">resources/avatars/avatar_picture_002_58x58.png</file>
+ <file alias="avatar_013.png">resources/avatars/avatar_picture_003_58x58.png</file>
+ <file alias="avatar_014.png">resources/avatars/avatar_picture_004_58x58.png</file>
+ <file alias="avatar_015.png">resources/avatars/avatar_picture_005_58x58.png</file>
+
+ <file alias="avatar_016.png">resources/avatars/avatar_woman_001_58x58.png</file>
+ <file alias="avatar_017.png">resources/avatars/avatar_woman_002_58x58.png</file>
+ <file alias="avatar_018.png">resources/avatars/avatar_woman_003_58x58.png</file>
+ <file alias="avatar_019.png">resources/avatars/avatar_woman_004_58x58.png</file>
+ <file alias="avatar_020.png">resources/avatars/avatar_woman_005_58x58.png</file>
+ <file alias="avatar_021.png">resources/avatars/avatar_woman_006_58x58.png</file>
+ <file alias="avatar_022.png">resources/avatars/avatar_woman_007_58x58.png</file>
+ <file alias="avatar_023.png">resources/avatars/avatar_woman_008_58x58.png</file>
+ <file alias="avatar_024.png">resources/avatars/avatar_woman_009_58x58.png</file>
+ <file alias="avatar_025.png">resources/avatars/avatar_woman_010_58x58.png</file>
+ </qresource>
+
+ <qresource prefix="/contact">
+ <file alias="areacodes.txt">resources/contacts/areacodes.txt</file>
+ <file alias="firstnamesF.txt">resources/contacts/firstnamesF.txt</file>
+ <file alias="firstnamesM.txt">resources/contacts/firstnamesM.txt</file>
+ <file alias="lastnames.txt">resources/contacts/lastnames.txt</file>
+ </qresource>
+
+</RCC>
+
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/main.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/main.cpp
new file mode 100644
index 0000000000..87ab80d74f
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/main.cpp
@@ -0,0 +1,780 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include <QtTest/QtTest>
+#include <QtGui/qgraphicsview.h>
+#include <QtGui/qpixmapcache.h>
+#include <QtGui/qdesktopwidget.h>
+
+#include "mainview.h"
+#include "dummydatagen.h"
+#include "simplelist.h"
+#include "itemrecyclinglist.h"
+#include "simplelist.h"
+#include "theme.h"
+#include "commandline.h"
+
+class tst_GraphicsViewBenchmark : public QObject
+{
+ Q_OBJECT
+public:
+ enum ListType {
+ Simple,
+ Recycling,
+ None
+ };
+
+ enum ScrollStep {
+ Slow = 2,
+ Normal = 8,
+ Fast = 64
+ };
+
+ tst_GraphicsViewBenchmark(Settings *settings)
+ : mSettings(settings), mMainView(0), currentListSize(-1), currentListType(None) {}
+ ~tst_GraphicsViewBenchmark() {}
+
+public slots:
+ void initTestCase();
+ void cleanupTestCase();
+ void init();
+
+private slots:
+ // Benchmarks:
+ void createAndFillList_data();
+ void createAndFillList();
+ void add100ItemsToBeginningOfList_data();
+ void add100ItemsToBeginningOfList();
+ void remove100ItemsFromBeginningOfList_data();
+ void remove100ItemsFromBeginningOfList();
+ void deleteList_data();
+ void deleteList();
+ void themeChange_data();
+ void themeChange();
+ void update_data();
+ void update();
+ void scroll_data();
+ void scroll();
+
+private:
+ Settings *mSettings;
+ MainView *mMainView;
+ DummyDataGenerator mDataGenerator;
+ int currentListSize;
+ ListType currentListType;
+
+ void resetView();
+ void ensureListSizeAndType(int listSize, ListType listType);
+ void ensureTheme(Theme::Themes theme);
+ void ensureRotationAngle(int rotation);
+ void ensureSubtreeCache(bool enable);
+ void ensureImageBasedRendering(bool enable);
+ void insertListData();
+ inline void setTestWidget(QGraphicsWidget *widget, int listSize, ListType listType)
+ {
+ currentListSize = listSize;
+ currentListType = listType;
+ mMainView->setTestWidget(widget);
+ }
+};
+
+Q_DECLARE_METATYPE(tst_GraphicsViewBenchmark::ListType)
+Q_DECLARE_METATYPE(Theme::Themes)
+Q_DECLARE_METATYPE(tst_GraphicsViewBenchmark::ScrollStep)
+
+const int AddRemoveCount = 100;
+
+static ListItem *newSimpleListItem(DummyDataGenerator &dataGenerator, const int id)
+{
+ ListItem *item = new ListItem();
+ item->setText(dataGenerator.randomName(), ListItem::FirstPos );
+ item->setText(dataGenerator.randomPhoneNumber(QString("%1").arg(id)), ListItem::SecondPos );
+ item->setIcon(new IconItem(dataGenerator.randomIconItem(), item), ListItem::LeftIcon );
+ item->setIcon(new IconItem(dataGenerator.randomStatusItem(), item), ListItem::RightIcon);
+ item->setFont(Theme::p()->font(Theme::ContactName), ListItem::FirstPos);
+ item->setFont(Theme::p()->font(Theme::ContactNumber), ListItem::SecondPos);
+ item->setBorderPen(Theme::p()->listItemBorderPen());
+ item->setRounding(Theme::p()->listItemRounding());
+ item->icon(ListItem::LeftIcon)->setRotation(Theme::p()->iconRotation(ListItem::LeftIcon));
+ item->icon(ListItem::RightIcon)->setRotation(Theme::p()->iconRotation(ListItem::RightIcon));
+ item->icon(ListItem::LeftIcon)->setSmoothTransformationEnabled(Theme::p()->isIconSmoothTransformationEnabled(ListItem::LeftIcon));
+ item->icon(ListItem::RightIcon)->setSmoothTransformationEnabled(Theme::p()->isIconSmoothTransformationEnabled(ListItem::RightIcon));
+ item->icon(ListItem::LeftIcon)->setOpacityEffectEnabled(Theme::p()->isIconOpacityEffectEnabled(ListItem::LeftIcon));
+ item->icon(ListItem::RightIcon)->setOpacityEffectEnabled(Theme::p()->isIconOpacityEffectEnabled(ListItem::RightIcon));
+ return item;
+}
+
+static RecycledListItem *newRecyclingListItem(DummyDataGenerator &dataGenerator, const int id)
+{
+ RecycledListItem *item = new RecycledListItem();
+ item->item()->setText(dataGenerator.randomName(), ListItem::FirstPos );
+ item->item()->setText(dataGenerator.randomPhoneNumber(QString("%1").arg(id)), ListItem::SecondPos );
+ item->item()->setIcon(new IconItem(dataGenerator.randomIconItem()), ListItem::LeftIcon );
+ item->item()->setIcon(new IconItem(dataGenerator.randomStatusItem()), ListItem::RightIcon);
+ item->item()->setFont(Theme::p()->font(Theme::ContactName), ListItem::FirstPos);
+ item->item()->setFont(Theme::p()->font(Theme::ContactNumber), ListItem::SecondPos);
+ item->item()->setBorderPen(Theme::p()->listItemBorderPen());
+ item->item()->setRounding(Theme::p()->listItemRounding());
+ item->item()->icon(ListItem::LeftIcon)->setRotation(Theme::p()->iconRotation(ListItem::LeftIcon));
+ item->item()->icon(ListItem::RightIcon)->setRotation(Theme::p()->iconRotation(ListItem::RightIcon));
+ item->item()->icon(ListItem::LeftIcon)->setSmoothTransformationEnabled(Theme::p()->isIconSmoothTransformationEnabled(ListItem::LeftIcon));
+ item->item()->icon(ListItem::RightIcon)->setSmoothTransformationEnabled(Theme::p()->isIconSmoothTransformationEnabled(ListItem::RightIcon));
+ item->item()->icon(ListItem::LeftIcon)->setOpacityEffectEnabled(Theme::p()->isIconOpacityEffectEnabled(ListItem::LeftIcon));
+ item->item()->icon(ListItem::RightIcon)->setOpacityEffectEnabled(Theme::p()->isIconOpacityEffectEnabled(ListItem::RightIcon));
+ return item;
+}
+
+static void fillList(DummyDataGenerator &dataGenerator, int itemCount, QGraphicsWidget *list)
+{
+ if (SimpleList *simpleList = qobject_cast<SimpleList *>(list)) {
+ for (int i = 0; i < itemCount; ++i)
+ simpleList->addItem(newSimpleListItem(dataGenerator, i));
+ } else if (ItemRecyclingList *recyclingList = qobject_cast<ItemRecyclingList *>(list)) {
+ for (int i = 0; i < itemCount; ++i)
+ recyclingList->addItem(newRecyclingListItem(dataGenerator, i));
+ } else {
+ qFatal("fillList: internal error");
+ }
+}
+
+void tst_GraphicsViewBenchmark::resetView()
+{
+ if (QGraphicsWidget *widget = mMainView->takeTestWidget()) {
+ delete widget;
+ currentListSize = -1;
+ currentListType = None;
+ QTest::qWait(50);
+ } else {
+ if (currentListSize != -1)
+ qFatal("tst_GraphicsViewBenchmark::resetView: internal error: wrong list size");
+ if (currentListType != None)
+ qFatal("tst_GraphicsViewBenchmark::resetView: internal error: wrong list type");
+ }
+ ensureTheme(Theme::Blue);
+ ensureRotationAngle(0);
+ ensureSubtreeCache(false);
+ ensureImageBasedRendering(false);
+}
+
+void tst_GraphicsViewBenchmark::ensureListSizeAndType(int listSize, ListType listType)
+{
+ if (currentListSize != listSize || currentListType != listType) {
+ resetView();
+ if (listType == Simple) {
+ SimpleList *list = new SimpleList;
+ fillList(mDataGenerator, listSize, list);
+ setTestWidget(list, listSize, listType);
+ } else if (listType == Recycling) {
+ ItemRecyclingList *list = new ItemRecyclingList;
+ fillList(mDataGenerator, listSize, list);
+ setTestWidget(list, listSize, listType);
+ }
+ QTest::qWait(50);
+ return;
+ }
+
+ // Okay, we're supposed to have the right list type and size. Make sure we actually have it.
+ QGraphicsWidget *widget = mMainView->testWidget();
+ if (!widget) {
+ if (currentListType != None || currentListSize != -1)
+ qFatal("tst_GraphicsViewBenchmark::ensureListSizeAndType: internal error: no test widget");
+ return;
+ }
+
+ if (listType == Simple) {
+ SimpleList *list = qobject_cast<SimpleList *>(widget);
+ if (!list)
+ qFatal("tst_GraphicsViewBenchmark::ensureListSizeAndType: internal error: wrong list type");
+ if (list->itemCount() != listSize)
+ qFatal("tst_GraphicsViewBenchmark::ensureListSizeAndType: internal error: wrong list size");
+ } else if (listType == Recycling){
+ ItemRecyclingList *list = qobject_cast<ItemRecyclingList *>(widget);
+ if (!list)
+ qFatal("tst_GraphicsViewBenchmark::ensureListSizeAndType: internal error: wrong list type");
+ if (list->rows() != listSize)
+ qFatal("tst_GraphicsViewBenchmark::ensureListSizeAndType: internal error: wrong list size");
+ }
+}
+
+void tst_GraphicsViewBenchmark::ensureTheme(Theme::Themes theme)
+{
+ if (Theme::p()->theme() != theme) {
+ Theme::p()->setTheme(theme);
+ // The theme change itself can take a lot of time, so make
+ // sure we give it a little bit time to stabilize *after*
+ // the changes, hence sendPostedEvents(); qWait();
+ QApplication::sendPostedEvents();
+ QTest::qWait(50);
+ }
+}
+
+void tst_GraphicsViewBenchmark::ensureRotationAngle(int angle)
+{
+ const bool useTwoColumns = angle != 0;
+ bool wait = false;
+ if (mMainView->rotationAngle() != angle) {
+ mMainView->rotateContent(-mMainView->rotationAngle() + angle);
+ wait = true;
+ }
+ if (QGraphicsWidget *widget = mMainView->testWidget()) {
+ if (SimpleList *list = qobject_cast<SimpleList *>(widget)) {
+ if (list->twoColumns() != useTwoColumns) {
+ list->setTwoColumns(useTwoColumns);
+ wait = true;
+ }
+ } else if (ItemRecyclingList *list = qobject_cast<ItemRecyclingList *>(widget)) {
+ if (list->twoColumns() != useTwoColumns) {
+ list->setTwoColumns(useTwoColumns);
+ wait = true;
+ }
+ }
+ }
+ if (wait)
+ QTest::qWait(50);
+}
+
+void tst_GraphicsViewBenchmark::ensureSubtreeCache(bool enable)
+{
+ QGraphicsWidget *widget = mMainView->testWidget();
+ if (!widget)
+ return;
+
+ if (SimpleList *list = qobject_cast<SimpleList *>(widget)) {
+ if (list->listItemCaching() != enable) {
+ list->setListItemCaching(enable);
+ QTest::qWait(50);
+ }
+ } else if (ItemRecyclingList *list = qobject_cast<ItemRecyclingList *>(widget)) {
+ if (list->listItemCaching() != enable) {
+ list->setListItemCaching(enable);
+ QTest::qWait(50);
+ }
+ }
+ QPixmapCache::clear();
+}
+
+void tst_GraphicsViewBenchmark::ensureImageBasedRendering(bool enable)
+{
+ if (mMainView->imageBasedRendering() != enable) {
+ mMainView->setImageBasedRendering(enable);
+ QTest::qWait(50);
+ }
+}
+
+void tst_GraphicsViewBenchmark::insertListData()
+{
+ QTest::addColumn<int>("listSize");
+ QTest::addColumn<ListType>("listType");
+
+ QTest::newRow("Simple list containing 10 items") << 10 << Simple;
+ QTest::newRow("Recycling list containing 10 items") << 10 << Recycling;
+ QTest::newRow("Simple list containing 50 items") << 50 << Simple;
+ QTest::newRow("Recycling list containing 50 items") << 50 << Recycling;
+ QTest::newRow("Simple list containing 500 items") << 500 << Simple;
+ QTest::newRow("Recycling list containing 500 items") << 500 << Recycling;
+}
+
+void tst_GraphicsViewBenchmark::initTestCase()
+{
+ mMainView = new MainView(mSettings->options() & Settings::UseOpenGL,
+ mSettings->options() & Settings::OutputFps);
+
+ if (mSettings->size().width() > 0 && mSettings->size().height() > 0) {
+ mMainView->resize(mSettings->size().width(), mSettings->size().height());
+ mMainView->show();
+ } else if (QApplication::desktop()->width() < 360 || QApplication::desktop()->height() < 640) {
+ mMainView->showFullScreen();
+ } else {
+ mMainView->resize(360, 640);
+ mMainView->show();
+ }
+
+ mDataGenerator.Reset();
+ SimpleList *list = new SimpleList;
+ list->setListItemCaching(false);
+ mMainView->setTestWidget(list);
+ fillList(mDataGenerator, 5, list);
+ mMainView->takeTestWidget();
+ delete list;
+
+ currentListSize = -1;
+ currentListType = None;
+
+ QVERIFY(QTest::qWaitForWindowShown(mMainView));
+}
+
+void tst_GraphicsViewBenchmark::cleanupTestCase()
+{
+ delete mMainView;
+ mMainView = 0;
+}
+
+void tst_GraphicsViewBenchmark::init()
+{
+ // Make sure we don't have pending events in the queue.
+ // Yes, each test run takes a little bit longer, but the results are more stable.
+ QTest::qWait(150);
+}
+
+void tst_GraphicsViewBenchmark::createAndFillList_data()
+{
+ insertListData();
+}
+
+void tst_GraphicsViewBenchmark::createAndFillList()
+{
+ QFETCH(int, listSize);
+ QFETCH(ListType, listType);
+
+ resetView();
+
+ if (listType == Simple) {
+ QBENCHMARK {
+ SimpleList *list = new SimpleList;
+ setTestWidget(list, listSize, listType);
+ fillList(mDataGenerator, listSize, list);
+ }
+ } else {
+ QBENCHMARK {
+ ItemRecyclingList *list = new ItemRecyclingList;
+ setTestWidget(list, listSize, listType);
+ fillList(mDataGenerator, listSize, list);
+ }
+ }
+
+ resetView();
+}
+
+void tst_GraphicsViewBenchmark::add100ItemsToBeginningOfList_data()
+{
+ insertListData();
+}
+
+void tst_GraphicsViewBenchmark::add100ItemsToBeginningOfList()
+{
+ QFETCH(int, listSize);
+ QFETCH(ListType, listType);
+
+ resetView();
+
+ if (listType == Simple) {
+ SimpleList *list = new SimpleList;
+ fillList(mDataGenerator, listSize, list);
+ setTestWidget(list, listSize, listType);
+ QTest::qWait(50);
+ QBENCHMARK {
+ for (int i = 0; i < AddRemoveCount; ++i)
+ list->insertItem(0, newSimpleListItem(mDataGenerator, i));
+ }
+ } else {
+ ItemRecyclingList *list = new ItemRecyclingList;
+ fillList(mDataGenerator, listSize, list);
+ setTestWidget(list, listSize, listType);
+ QTest::qWait(50);
+ QBENCHMARK {
+ for (int i = 0; i < AddRemoveCount; ++i)
+ list->insertItem(0, newRecyclingListItem(mDataGenerator, i));
+ }
+ }
+
+ resetView();
+}
+
+void tst_GraphicsViewBenchmark::remove100ItemsFromBeginningOfList_data()
+{
+ insertListData();
+}
+
+void tst_GraphicsViewBenchmark::remove100ItemsFromBeginningOfList()
+{
+ QFETCH(int, listSize);
+ QFETCH(ListType, listType);
+
+ resetView();
+
+ if (listType == Simple) {
+ SimpleList *list = new SimpleList;
+ fillList(mDataGenerator, listSize, list);
+ setTestWidget(list, listSize, listType);
+ QTest::qWait(50);
+ QBENCHMARK {
+ for (int i = 0; i < AddRemoveCount; ++i)
+ delete list->takeItem(0);
+ }
+ } else {
+ ItemRecyclingList *list = new ItemRecyclingList;
+ fillList(mDataGenerator, listSize, list);
+ setTestWidget(list, listSize, listType);
+ QTest::qWait(50);
+ QBENCHMARK {
+ for (int i = 0; i < AddRemoveCount; ++i)
+ delete list->takeItem(0);
+ }
+ }
+
+ resetView();
+}
+
+void tst_GraphicsViewBenchmark::deleteList_data()
+{
+ insertListData();
+ QTest::newRow("Simple list containing 1000 items") << 1000 << Simple;
+ QTest::newRow("Recycling list containing 1000 items") << 1000 << Recycling;
+}
+
+void tst_GraphicsViewBenchmark::deleteList()
+{
+ QFETCH(int, listSize);
+ QFETCH(ListType, listType);
+
+ if (listSize < 500)
+ return; // Too small to measure.
+
+ QGraphicsWidget *list = 0;
+ if (listType == Simple)
+ list = new SimpleList;
+ else
+ list = new ItemRecyclingList;
+ fillList(mDataGenerator, listSize, list);
+ QTest::qWait(20);
+
+ QBENCHMARK_ONCE {
+ delete list;
+ }
+}
+
+void tst_GraphicsViewBenchmark::themeChange_data()
+{
+ QTest::addColumn<int>("listSize");
+ QTest::addColumn<ListType>("listType");
+ QTest::addColumn<Theme::Themes>("fromTheme");
+ QTest::addColumn<Theme::Themes>("toTheme");
+
+ QTest::newRow("From Blue to Lime, simple list containing 10 items") << 10 << Simple << Theme::Blue << Theme::Lime;
+ QTest::newRow("From Lime to Blue, simple list containing 10 items") << 10 << Simple << Theme::Lime << Theme::Blue;
+
+ QTest::newRow("From Blue to Lime, recycling list containing 10 items") << 10 << Recycling << Theme::Blue << Theme::Lime;
+ QTest::newRow("From Lime to Blue, recycling list containing 10 items") << 10 << Recycling << Theme::Lime << Theme::Blue;
+
+ QTest::newRow("From Blue to Lime, simple list containing 50 items") << 50 << Simple << Theme::Blue << Theme::Lime;
+ QTest::newRow("From Lime to Blue, simple list containing 50 items") << 50 << Simple << Theme::Lime << Theme::Blue;
+
+ QTest::newRow("From Blue to Lime, recycling list containing 50 items") << 50 << Recycling << Theme::Blue << Theme::Lime;
+ QTest::newRow("From Lime to Blue, recycling list containing 50 items") << 50 << Recycling << Theme::Lime << Theme::Blue;
+
+ QTest::newRow("From Blue to Lime, simple list containing 500 items") << 500 << Simple << Theme::Blue << Theme::Lime;
+ QTest::newRow("From Lime to Blue, simple list containing 500 items") << 500 << Simple << Theme::Lime << Theme::Blue;
+
+ QTest::newRow("From Blue to Lime, recycling list containing 500 items") << 500 << Recycling << Theme::Blue << Theme::Lime;
+ QTest::newRow("From Lime to Blue, recycling list containing 500 items") << 500 << Recycling << Theme::Lime << Theme::Blue;
+}
+
+void tst_GraphicsViewBenchmark::themeChange()
+{
+ QFETCH(int, listSize);
+ QFETCH(ListType, listType);
+ QFETCH(Theme::Themes, fromTheme);
+ QFETCH(Theme::Themes, toTheme);
+
+ if (fromTheme == toTheme)
+ qFatal("tst_GraphicsViewBenchmark::themeChange: to and from theme is the same");
+
+ ensureListSizeAndType(listSize, listType);
+ ensureTheme(fromTheme);
+
+ QBENCHMARK {
+ Theme::p()->setTheme(toTheme);
+ }
+}
+
+static inline QLatin1String stringForTheme(Theme::Themes theme)
+{
+ if (theme == Theme::Blue)
+ return QLatin1String("Blue");
+ return QLatin1String("Lime");
+}
+
+static inline QLatin1String stringForListType(tst_GraphicsViewBenchmark::ListType type)
+{
+ if (type == tst_GraphicsViewBenchmark::Simple)
+ return QLatin1String("Simple");
+ if (type == tst_GraphicsViewBenchmark::Recycling)
+ return QLatin1String("Recycling");
+ return QLatin1String("None");
+}
+
+static inline QLatin1String stringForScrollStep(tst_GraphicsViewBenchmark::ScrollStep step)
+{
+ if (step == tst_GraphicsViewBenchmark::Slow)
+ return QLatin1String("Slow");
+ if (step == tst_GraphicsViewBenchmark::Normal)
+ return QLatin1String("Normal");
+ return QLatin1String("Fast");
+}
+
+static inline QString rowString(int listSize, tst_GraphicsViewBenchmark::ListType listType,
+ Theme::Themes theme, int toImage, int cache, int angle)
+{
+ return QString("Items=%1, List=%2, Theme=%3, RenderToImage=%4, Cache=%5, RotAngle=%6")
+ .arg(QString::number(listSize)).arg(stringForListType(listType))
+ .arg(stringForTheme(theme)).arg(QString::number(toImage))
+ .arg(QString::number(cache)).arg(QString::number(angle));
+}
+
+static inline QString rowString(int listSize, tst_GraphicsViewBenchmark::ListType listType,
+ Theme::Themes theme, int cache, int angle,
+ tst_GraphicsViewBenchmark::ScrollStep step)
+{
+ return QString("Items=%1, List=%2, Theme=%3, Cache=%4, RotAngle=%5, Speed=%6")
+ .arg(QString::number(listSize)).arg(stringForListType(listType))
+ .arg(stringForTheme(theme)).arg(QString::number(cache))
+ .arg(QString::number(angle)).arg(stringForScrollStep(step));
+}
+
+void tst_GraphicsViewBenchmark::update_data()
+{
+ QTest::addColumn<int>("listSize");
+ QTest::addColumn<ListType>("listType");
+ QTest::addColumn<Theme::Themes>("theme");
+ QTest::addColumn<bool>("renderToImage");
+ QTest::addColumn<bool>("subtreeCache");
+ QTest::addColumn<int>("rotationAngle");
+
+ QList<ListType> listTypes;
+ listTypes << Simple << Recycling;
+
+ QList<int> listSizes;
+ listSizes << 10 << 50 << 500;
+
+ QList<Theme::Themes> themes;
+ themes << Theme::Blue << Theme::Lime;
+
+ QList<int> rotationAngles;
+ rotationAngles << 0 << 90;
+
+ // Generate rows:
+ foreach (ListType listType, listTypes) {
+ foreach (int listSize, listSizes) {
+ foreach (int angle, rotationAngles) {
+ foreach (Theme::Themes theme, themes) {
+ for (int toImage = 0; toImage < 2; ++toImage) {
+ for (int cache = 0; cache < 2; ++cache) {
+ QString string = rowString(listSize, listType, theme, toImage, cache, angle);
+ QTest::newRow(string.toLatin1()) << listSize << listType << theme << bool(toImage)
+ << bool(cache) << angle;
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+void tst_GraphicsViewBenchmark::update()
+{
+ QFETCH(int, listSize);
+ QFETCH(ListType, listType);
+ QFETCH(Theme::Themes, theme);
+ QFETCH(bool, renderToImage);
+ QFETCH(bool, subtreeCache);
+ QFETCH(int, rotationAngle);
+
+ mMainView->viewport()->setUpdatesEnabled(false);
+
+ ensureListSizeAndType(listSize, listType);
+ ensureTheme(theme);
+ ensureRotationAngle(rotationAngle);
+ ensureSubtreeCache(subtreeCache);
+ ensureImageBasedRendering(renderToImage);
+
+ QEventLoop loop;
+ QObject::connect(mMainView, SIGNAL(repainted()), &loop, SLOT(quit()));
+ QTimer::singleShot(4000, &loop, SLOT(quit()));
+ // Dry run (especially important when cache is enabled).
+ // NB! setUpdatesEnabled triggers an update().
+ mMainView->viewport()->setUpdatesEnabled(true);
+ loop.exec(QEventLoop::AllEvents | QEventLoop::ExcludeUserInputEvents| QEventLoop::ExcludeSocketNotifiers);
+ QTest::qWait(50);
+
+ QTimer::singleShot(4000, &loop, SLOT(quit()));
+ QBENCHMARK {
+ mMainView->viewport()->update();
+ loop.exec(QEventLoop::AllEvents | QEventLoop::ExcludeUserInputEvents| QEventLoop::ExcludeSocketNotifiers);
+ }
+}
+
+void tst_GraphicsViewBenchmark::scroll_data()
+{
+ QTest::addColumn<int>("listSize");
+ QTest::addColumn<ListType>("listType");
+ QTest::addColumn<Theme::Themes>("theme");
+ QTest::addColumn<bool>("subtreeCache");
+ QTest::addColumn<int>("rotationAngle");
+ QTest::addColumn<ScrollStep>("scrollStep");
+
+ QList<ListType> listTypes;
+ listTypes << Simple << Recycling;
+
+ QList<int> listSizes;
+ listSizes << 10 << 50 << 500;
+
+ QList<Theme::Themes> themes;
+ themes << Theme::Blue << Theme::Lime;
+
+ QList<int> rotationAngles;
+ rotationAngles << 0 << 90;
+
+ QList<ScrollStep> scrollSteps;
+ scrollSteps << Slow << Normal << Fast;
+
+ // Generate rows:
+ foreach (ListType listType, listTypes) {
+ foreach (int listSize, listSizes) {
+ foreach (int angle, rotationAngles) {
+ foreach (ScrollStep step, scrollSteps) {
+ foreach (Theme::Themes theme, themes) {
+ for (int cache = 0; cache < 2; ++cache) {
+ QString string = rowString(listSize, listType, theme, cache, angle, step);
+ QTest::newRow(string.toLatin1()) << listSize << listType << theme
+ << bool(cache) << angle << step;
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+void tst_GraphicsViewBenchmark::scroll()
+{
+ QFETCH(int, listSize);
+ QFETCH(ListType, listType);
+ QFETCH(Theme::Themes, theme);
+ QFETCH(bool, subtreeCache);
+ QFETCH(int, rotationAngle);
+ QFETCH(ScrollStep, scrollStep);
+
+ mMainView->viewport()->setUpdatesEnabled(false);
+
+ ensureListSizeAndType(listSize, listType);
+ ensureTheme(theme);
+ ensureRotationAngle(rotationAngle);
+ ensureSubtreeCache(subtreeCache);
+ ensureImageBasedRendering(false);
+
+ ScrollBar *sb = 0;
+ if (listType == Simple)
+ sb = static_cast<SimpleList *>(mMainView->testWidget())->verticalScrollBar();
+ else
+ sb = static_cast<ItemRecyclingList *>(mMainView->testWidget())->verticalScrollBar();
+ const qreal sliderStart = sb->sliderSize() / qreal(2.0);
+ const qreal sliderTarget = sliderStart + qreal(scrollStep);
+ sb->setSliderPosition(sliderStart);
+
+ QEventLoop loop;
+ QObject::connect(mMainView, SIGNAL(repainted()), &loop, SLOT(quit()));
+ QTimer::singleShot(4000, &loop, SLOT(quit()));
+ // Dry run (especially important when cache is enabled).
+ // NB! setUpdatesEnabled triggers an update().
+ mMainView->viewport()->setUpdatesEnabled(true);
+ loop.exec(QEventLoop::AllEvents | QEventLoop::ExcludeUserInputEvents| QEventLoop::ExcludeSocketNotifiers);
+ QTest::qWait(50);
+
+ QTimer::singleShot(4000, &loop, SLOT(quit()));
+ QBENCHMARK {
+ sb->setSliderPosition(sliderTarget);
+ loop.exec(QEventLoop::AllEvents | QEventLoop::ExcludeUserInputEvents| QEventLoop::ExcludeSocketNotifiers);
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ Settings settings;
+ if (!readSettingsFromCommandLine(argc, argv, settings))
+ return 1;
+
+ // Eat command line arguments.
+ int aargc = 0;
+ for (int i = 0; i < argc; ++i) {
+ if (argv[i])
+ ++aargc;
+ }
+ char **aargv = new char*[aargc];
+ aargc = 0;
+ for (int i = 0; i < argc; ++i) {
+ if (argv[i])
+ aargv[aargc++] = argv[i];
+ }
+
+ QApplication app(aargc, aargv);
+
+ int returnValue = 0;
+ if (settings.options() & Settings::ManualTest) {
+ MainView view(settings.options() & Settings::UseOpenGL, settings.options() & Settings::OutputFps);
+
+ DummyDataGenerator dataGenerator;
+ dataGenerator.Reset();
+
+ SimpleList *list = new SimpleList;
+ if (settings.options() & Settings::UseListItemCache)
+ list->setListItemCaching(true);
+ else
+ list->setListItemCaching(false);
+
+ if (settings.listItemCount())
+ fillList(dataGenerator, settings.listItemCount(), list);
+ else
+ fillList(dataGenerator, 500, list);
+
+ view.setTestWidget(list);
+
+ if ((settings.angle() % 360) != 0)
+ view.rotateContent(settings.angle());
+
+ if (settings.size().width() > 0 && settings.size().height() > 0) {
+ view.resize(settings.size().width(), settings.size().height());
+ view.show();
+ } else if (QApplication::desktop()->width() < 360 || QApplication::desktop()->height() < 640) {
+ view.showFullScreen();
+ } else {
+ view.resize(360, 640);
+ view.show();
+ }
+ returnValue = app.exec();
+ } else {
+ QTEST_DISABLE_KEYPAD_NAVIGATION
+ tst_GraphicsViewBenchmark tc(&settings);
+ returnValue = QTest::qExec(&tc, aargc, aargv);
+ }
+
+ delete [] aargv;
+ return returnValue;
+}
+
+#include "main.moc"
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_001_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_001_58x58.png
new file mode 100644
index 0000000000..525b5559a0
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_001_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_002_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_002_58x58.png
new file mode 100644
index 0000000000..3d932985a6
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_002_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_003_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_003_58x58.png
new file mode 100644
index 0000000000..556cfcba6a
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_003_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_004_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_004_58x58.png
new file mode 100644
index 0000000000..94acf9e669
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_004_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_005_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_005_58x58.png
new file mode 100644
index 0000000000..ed0c7c42f0
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_005_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_006_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_006_58x58.png
new file mode 100644
index 0000000000..d4b4dc3a8e
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_006_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_007_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_007_58x58.png
new file mode 100644
index 0000000000..0e45d18e4d
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_007_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_008_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_008_58x58.png
new file mode 100644
index 0000000000..0c25540ac9
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_008_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_009_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_009_58x58.png
new file mode 100644
index 0000000000..ce435ea537
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_009_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_010_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_010_58x58.png
new file mode 100644
index 0000000000..021db25882
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_010_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_001_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_001_58x58.png
new file mode 100644
index 0000000000..0051da326f
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_001_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_002_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_002_58x58.png
new file mode 100644
index 0000000000..e8a946a8ba
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_002_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_003_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_003_58x58.png
new file mode 100644
index 0000000000..b2bb851f69
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_003_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_004_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_004_58x58.png
new file mode 100644
index 0000000000..871c075d05
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_004_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_005_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_005_58x58.png
new file mode 100644
index 0000000000..d4c18b8bb0
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_005_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_001_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_001_58x58.png
new file mode 100644
index 0000000000..10a5947234
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_001_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_002_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_002_58x58.png
new file mode 100644
index 0000000000..65b4e03c5b
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_002_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_003_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_003_58x58.png
new file mode 100644
index 0000000000..935ec07171
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_003_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_004_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_004_58x58.png
new file mode 100644
index 0000000000..fbc1a937fd
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_004_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_005_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_005_58x58.png
new file mode 100644
index 0000000000..af96d3e149
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_005_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_006_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_006_58x58.png
new file mode 100644
index 0000000000..fb4192d35f
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_006_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_007_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_007_58x58.png
new file mode 100644
index 0000000000..f5d6dea0b0
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_007_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_008_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_008_58x58.png
new file mode 100644
index 0000000000..d08b8dc364
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_008_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_009_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_009_58x58.png
new file mode 100644
index 0000000000..768b97de6e
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_009_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_010_58x58.png b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_010_58x58.png
new file mode 100644
index 0000000000..d1fe28e61e
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_010_58x58.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_background_360x640px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_background_360x640px.svg
new file mode 100644
index 0000000000..1552bafa17
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_background_360x640px.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="360px" height="640px" viewBox="0 0 360 640" enable-background="new 0 0 360 640" xml:space="preserve">
+<g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-3.5137" y1="2.1079" x2="363.6142" y2="637.9921">
+ <stop offset="0.1538" style="stop-color:#2BD5FF"/>
+ <stop offset="0.4396" style="stop-color:#80E6FF"/>
+ <stop offset="0.7253" style="stop-color:#29CAF2"/>
+ </linearGradient>
+ <rect x="0.05" y="0.05" fill="url(#SVGID_1_)" width="360" height="640"/>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_background_horisontal_640x360px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_background_horisontal_640x360px.svg
new file mode 100644
index 0000000000..5589110950
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_background_horisontal_640x360px.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="640px" height="360px" viewBox="0 0 640 360" enable-background="new 0 0 640 360" xml:space="preserve">
+<g>
+ <rect x="-0.5" y="-0.5" fill="#FFFFFF" width="640" height="360"/>
+
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="1580.5244" y1="-287.7886" x2="1038.1285" y2="-600.9408" gradientTransform="matrix(0 -1 -1 0 -124.8652 1488.8262)">
+ <stop offset="0.2527" style="stop-color:#2BD5FF"/>
+ <stop offset="0.5989" style="stop-color:#80E6FF"/>
+ <stop offset="0.9396" style="stop-color:#29CAF2"/>
+ </linearGradient>
+ <rect x="1.5" y="1.5" fill="url(#SVGID_1_)" width="636" height="356"/>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_default_icon_52x52px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_default_icon_52x52px.svg
new file mode 100644
index 0000000000..665675b1e8
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_default_icon_52x52px.svg
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="52px" height="52px" viewBox="0 0 52 52" enable-background="new 0 0 52 52" xml:space="preserve">
+<g>
+ <path fill="#29CAF2" d="M52.07,48.77c0,1.79-1.46,3.25-3.25,3.25H3.32c-1.79,0-3.25-1.46-3.25-3.25V3.27
+ c0-1.79,1.46-3.25,3.25-3.25h45.5c1.79,0,3.25,1.46,3.25,3.25V48.77z"/>
+ <g>
+ <rect x="3.37" y="3.69" fill="#2BD5FF" width="44.69" height="44.69"/>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="6.8594" y1="27.8086" x2="48.0244" y2="27.8086">
+ <stop offset="0.1538" style="stop-color:#27C0E6"/>
+ <stop offset="0.4396" style="stop-color:#25B7DB"/>
+ <stop offset="0.7253" style="stop-color:#22A5C4"/>
+ </linearGradient>
+ <path fill="url(#SVGID_1_)" d="M47.95,48.31c0.12-3.35,0.15-8.17-0.43-9.12c-2.87-4.64-11.55-3.61-14.02-3.22
+ c0-1.17-0.01-2.19-0.01-2.96c0.5-0.52,0.96-1.11,1.39-1.76l0.06,0.19c3.57,0.51,4.02-11.16,4.02-11.16
+ C39.21,3.66,28.83,7.47,27.18,8.18c-3.05-0.78-10.3-1.3-10.09,11.2c0,0-0.53,11.06,3.52,11.38c0.5,0.85,1.07,1.6,1.69,2.25
+ c-0.01,0.72-0.04,1.65-0.08,2.71c-5.32-0.36-14.73-0.08-15.35,6.39c-0.06,0.62,0.12,3.69,0.28,6.2L47.95,48.31z"/>
+ </g>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_list_divider_360x76px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_list_divider_360x76px.svg
new file mode 100644
index 0000000000..db9fc7af33
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_list_divider_360x76px.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="360px" height="76px" viewBox="0 0 360 76" enable-background="new 0 0 360 76" xml:space="preserve">
+<rect x="0.01" y="0.35" opacity="0.2" fill="#FFFFFF" width="360" height="76"/>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_list_highlighter_360x76px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_list_highlighter_360x76px.svg
new file mode 100644
index 0000000000..dae2bd4842
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_list_highlighter_360x76px.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="360px" height="76px" viewBox="0 0 360 76" enable-background="new 0 0 360 76" xml:space="preserve">
+<rect x="0.02" y="0.05" opacity="0.4" fill="#FFFFFF" fill-opacity="0.8" width="360" height="76"/>
+<g>
+ <path fill="#FFFFFF" d="M360.02,0.05v76h-360v-76H360.02 M359.02,1.05h-358v74h358V1.05L359.02,1.05z"/>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_status_idle_33x33px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_status_idle_33x33px.svg
new file mode 100644
index 0000000000..fe12e782a6
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_status_idle_33x33px.svg
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="33px" height="33px" viewBox="0 0 33 33" enable-background="new 0 0 33 33" xml:space="preserve">
+<g>
+ <path fill="#29CAF2" d="M33.03,16.58c0,9.11-7.39,16.5-16.5,16.5c-9.12,0-16.5-7.39-16.5-16.5c0-9.11,7.38-16.5,16.5-16.5
+ C25.63,0.08,33.03,7.47,33.03,16.58z"/>
+ <g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="16.5249" y1="29.1172" x2="16.5249" y2="4.0435">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.8407" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#D9D9D9"/>
+ </linearGradient>
+ <path fill="url(#SVGID_1_)" d="M16.52,29.12c-6.91,0-12.54-5.62-12.54-12.54c0-6.91,5.62-12.54,12.54-12.54
+ s12.54,5.62,12.54,12.54C29.06,23.49,23.44,29.12,16.52,29.12L16.52,29.12z"/>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="6.875" y1="9.8242" x2="26.1715" y2="23.3358">
+ <stop offset="0.1099" style="stop-color:#FFFFFF"/>
+ <stop offset="0.6978" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <circle fill="url(#SVGID_2_)" cx="16.52" cy="16.58" r="11.78"/>
+ <g>
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="8.6343" y1="11.1309" x2="24.2014" y2="22.0311">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <path fill="url(#SVGID_3_)" d="M16.42,26.08c-5.24,0-9.51-4.26-9.51-9.5c0-5.24,4.26-9.51,9.51-9.51c5.24,0,9.5,4.26,9.5,9.51
+ C25.92,21.82,21.66,26.08,16.42,26.08L16.42,26.08z"/>
+ <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="23.0186" y1="22.1201" x2="9.8155" y2="11.0414">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <circle fill="url(#SVGID_4_)" cx="16.42" cy="16.58" r="8.62"/>
+ <path fill="#FF901F" d="M16.42,24.06c-4.12,0-7.48-3.35-7.48-7.47c0-4.12,3.36-7.48,7.48-7.48c4.12,0,7.47,3.36,7.47,7.48
+ C23.89,20.7,20.54,24.06,16.42,24.06L16.42,24.06z"/>
+ <g>
+ <path fill="#FFD06B" d="M14.09,14.25c2.1-2.1,5.31-2.41,7.75-0.94c-0.26-0.43-0.57-0.84-0.94-1.21c-2.47-2.47-6.49-2.47-8.96,0
+ c-2.47,2.47-2.47,6.49,0,8.96c0.37,0.37,0.78,0.68,1.21,0.94C11.68,19.56,11.99,16.35,14.09,14.25z"/>
+
+ <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-122.4058" y1="66.873" x2="-127.2734" y2="58.442" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)">
+ <stop offset="0" style="stop-color:#FF901F"/>
+ <stop offset="1" style="stop-color:#FFB81F"/>
+ </linearGradient>
+ <path fill="url(#SVGID_5_)" d="M20.9,21.06c2.1-2.1,2.41-5.31,0.94-7.75c-2.43-1.47-5.65-1.16-7.75,0.94
+ c-2.1,2.1-2.41,5.31-0.94,7.75C15.58,23.47,18.8,23.16,20.9,21.06z"/>
+ </g>
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_status_offline_33x33px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_status_offline_33x33px.svg
new file mode 100644
index 0000000000..0c973f1bc9
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_status_offline_33x33px.svg
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="33px" height="33px" viewBox="0 0 33 33" enable-background="new 0 0 33 33" xml:space="preserve">
+<g>
+ <circle fill="#29CAF2" cx="16.46" cy="16.52" r="16.5"/>
+ <g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="16.4624" y1="29.0566" x2="16.4624" y2="3.9829">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.8407" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#D9D9D9"/>
+ </linearGradient>
+ <path fill="url(#SVGID_1_)" d="M16.46,29.06c-6.91,0-12.54-5.62-12.54-12.54c0-6.91,5.62-12.54,12.54-12.54S29,9.61,29,16.52
+ C29,23.43,23.37,29.06,16.46,29.06L16.46,29.06z"/>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="6.814" y1="9.7637" x2="26.1096" y2="23.2746">
+ <stop offset="0.1099" style="stop-color:#FFFFFF"/>
+ <stop offset="0.6978" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <path fill="url(#SVGID_2_)" d="M28.24,16.52c0,6.51-5.27,11.78-11.78,11.78c-6.5,0-11.78-5.27-11.78-11.78
+ c0-6.5,5.27-11.78,11.78-11.78C22.97,4.74,28.24,10.02,28.24,16.52z"/>
+ <g>
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="8.5713" y1="11.0693" x2="24.1392" y2="21.9701">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <path fill="url(#SVGID_3_)" d="M16.36,26.02c-5.24,0-9.51-4.26-9.51-9.5c0-5.24,4.26-9.51,9.51-9.51c5.24,0,9.5,4.27,9.5,9.51
+ C25.86,21.76,21.6,26.02,16.36,26.02L16.36,26.02z"/>
+ <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="22.9561" y1="22.0576" x2="9.7545" y2="10.9802">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <circle fill="url(#SVGID_4_)" cx="16.36" cy="16.52" r="8.62"/>
+ <path fill="#BD0700" d="M16.36,24c-4.12,0-7.48-3.35-7.48-7.48c0-4.12,3.36-7.48,7.48-7.48c4.12,0,7.47,3.36,7.47,7.48
+ C23.83,20.64,20.48,24,16.36,24L16.36,24z"/>
+ <g>
+ <path fill="#F25757" d="M14.03,14.19c2.1-2.1,5.31-2.41,7.75-0.94c-0.26-0.43-0.57-0.84-0.94-1.21c-2.47-2.47-6.49-2.47-8.96,0
+ c-2.47,2.47-2.47,6.49,0,8.96c0.37,0.37,0.78,0.68,1.21,0.94C11.62,19.5,11.93,16.29,14.03,14.19z"/>
+
+ <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-122.4668" y1="66.8125" x2="-127.3345" y2="58.3814" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)">
+ <stop offset="0" style="stop-color:#BD0700"/>
+ <stop offset="1" style="stop-color:#E35D58"/>
+ </linearGradient>
+ <path fill="url(#SVGID_5_)" d="M20.83,21c2.1-2.1,2.41-5.31,0.94-7.75c-2.43-1.47-5.65-1.16-7.75,0.94
+ c-2.1,2.1-2.41,5.31-0.94,7.75C15.52,23.4,18.74,23.1,20.83,21z"/>
+ </g>
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_status_online_33x33px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_status_online_33x33px.svg
new file mode 100644
index 0000000000..fcb434afda
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_status_online_33x33px.svg
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="33px" height="33px" viewBox="0 0 33 33" enable-background="new 0 0 33 33" xml:space="preserve">
+<g>
+ <path fill="#29CAF2" d="M32.96,16.59c0,9.11-7.39,16.5-16.5,16.5c-9.12,0-16.5-7.39-16.5-16.5c0-9.11,7.38-16.5,16.5-16.5
+ C25.57,0.09,32.96,7.47,32.96,16.59z"/>
+ <g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="16.4624" y1="29.123" x2="16.4624" y2="4.0493">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.8407" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#D9D9D9"/>
+ </linearGradient>
+ <path fill="url(#SVGID_1_)" d="M16.46,29.12c-6.91,0-12.54-5.62-12.54-12.54c0-6.91,5.62-12.54,12.54-12.54S29,9.67,29,16.58
+ C29,23.5,23.37,29.12,16.46,29.12L16.46,29.12z"/>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="6.813" y1="9.8301" x2="26.1095" y2="23.3416">
+ <stop offset="0.1099" style="stop-color:#FFFFFF"/>
+ <stop offset="0.6978" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <path fill="url(#SVGID_2_)" d="M28.24,16.58c0,6.51-5.27,11.78-11.78,11.78S4.68,23.09,4.68,16.58c0-6.5,5.27-11.78,11.78-11.78
+ S28.24,10.08,28.24,16.58z"/>
+ <g>
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="8.5723" y1="11.1362" x2="24.1386" y2="22.0359">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <path fill="url(#SVGID_3_)" d="M16.36,26.09c-5.24,0-9.51-4.26-9.51-9.5c0-5.24,4.26-9.51,9.51-9.51c5.24,0,9.5,4.27,9.5,9.51
+ C25.86,21.83,21.6,26.09,16.36,26.09L16.36,26.09z"/>
+ <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="22.9561" y1="22.125" x2="9.753" y2="11.0463">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <circle fill="url(#SVGID_4_)" cx="16.35" cy="16.58" r="8.62"/>
+ <path fill="#09B300" d="M16.36,24.06c-4.12,0-7.48-3.35-7.48-7.48c0-4.12,3.36-7.48,7.48-7.48c4.12,0,7.47,3.36,7.47,7.48
+ C23.83,20.71,20.48,24.06,16.36,24.06L16.36,24.06z"/>
+ <g>
+ <path fill="#57EB51" d="M14.03,14.25c2.1-2.1,5.31-2.41,7.75-0.94c-0.26-0.43-0.57-0.84-0.94-1.21c-2.47-2.47-6.49-2.47-8.96,0
+ c-2.47,2.47-2.47,6.49,0,8.96c0.37,0.37,0.78,0.68,1.21,0.94C11.62,19.57,11.93,16.35,14.03,14.25z"/>
+
+ <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-122.4678" y1="66.8789" x2="-127.3354" y2="58.4478" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)">
+ <stop offset="0" style="stop-color:#09AA00"/>
+ <stop offset="1" style="stop-color:#4DCC46"/>
+ </linearGradient>
+ <path fill="url(#SVGID_5_)" d="M20.83,21.06c2.1-2.1,2.41-5.31,0.94-7.75c-2.43-1.47-5.65-1.16-7.75,0.94
+ c-2.1,2.1-2.41,5.31-0.94,7.75C15.52,23.47,18.73,23.16,20.83,21.06z"/>
+ </g>
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_scroll_16x80px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_scroll_16x80px.svg
new file mode 100644
index 0000000000..897be81dc5
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_scroll_16x80px.svg
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="16px" height="80px" viewBox="0 0 16 80" enable-background="new 0 0 16 80" xml:space="preserve">
+<g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="0.1045" y1="40.0293" x2="16.1045" y2="40.0293">
+ <stop offset="0.1099" style="stop-color:#FFFFFF"/>
+ <stop offset="0.6978" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <path fill="url(#SVGID_1_)" d="M12.22,80.03c2.15,0,3.89-1.74,3.89-3.88V3.91c0-2.14-1.74-3.88-3.89-3.88H3.99
+ c-2.15,0-3.88,1.74-3.88,3.88c0,0,1.94,16.34,1.94,36.4c0,20.06-1.94,35.84-1.94,35.84c0,2.14,1.74,3.88,3.88,3.88H12.22z"/>
+ <path fill="#29CAF2" d="M12.22,78.09H3.99c-1.04,0-1.89-0.82-1.94-1.84c0.19-1.62,1.94-16.98,1.94-35.94
+ c0-18.96-1.75-34.84-1.94-36.49c0.05-1.03,0.9-1.85,1.94-1.85h8.23c1.04,0,1.89,0.82,1.94,1.84c-0.19,1.62-0.19,70.78,0,72.42
+ C14.11,77.27,13.26,78.09,12.22,78.09L12.22,78.09z"/>
+ <g>
+ <g>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="10.7334" y1="51.3867" x2="7.417" y2="45.6425">
+ <stop offset="0" style="stop-color:#E6E6E6"/>
+ <stop offset="0.6978" style="stop-color:#BFBFBF"/>
+ <stop offset="1" style="stop-color:#F2F2F2"/>
+ </linearGradient>
+ <polygon fill="url(#SVGID_2_)" points="7.42,51.39 5.76,48.52 7.42,45.64 10.73,45.64 12.39,48.52 10.73,51.39 "/>
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="10.7344" y1="42.9014" x2="7.4175" y2="37.1563">
+ <stop offset="0" style="stop-color:#E6E6E6"/>
+ <stop offset="0.6978" style="stop-color:#BFBFBF"/>
+ <stop offset="1" style="stop-color:#F2F2F2"/>
+ </linearGradient>
+ <polygon fill="url(#SVGID_3_)" points="7.42,42.9 5.76,40.03 7.42,37.16 10.73,37.16 12.39,40.03 10.73,42.9 "/>
+ <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="10.7334" y1="34.4131" x2="7.4175" y2="28.6697">
+ <stop offset="0" style="stop-color:#E6E6E6"/>
+ <stop offset="0.6978" style="stop-color:#BFBFBF"/>
+ <stop offset="1" style="stop-color:#F2F2F2"/>
+ </linearGradient>
+ <polygon fill="url(#SVGID_4_)" points="7.42,34.41 5.76,31.54 7.42,28.67 10.73,28.67 12.39,31.54 10.73,34.41 "/>
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_scrollbar_7x14px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_scrollbar_7x14px.svg
new file mode 100644
index 0000000000..3baec2f4b6
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_scrollbar_7x14px.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="7px" height="14px" viewBox="0 0 7 14" enable-background="new 0 0 7 14" xml:space="preserve">
+<rect x="0.01" y="0.01" fill="#2BD5FF" width="7" height="14"/>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_status_field_left_14x24px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_status_field_left_14x24px.svg
new file mode 100644
index 0000000000..dd6fb70a8d
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_status_field_left_14x24px.svg
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="14px" height="24px" viewBox="0 0 14 24" enable-background="new 0 0 14 24" xml:space="preserve">
+<g>
+ <path fill="none" d="M4.92,21.95c-0.28-0.33-0.53-0.67-0.77-1.03C4.39,21.28,4.64,21.63,4.92,21.95z"/>
+ <path fill="none" d="M2.11,15.42c-0.05-0.46-0.09-0.92-0.09-1.39C2.02,14.5,2.06,14.97,2.11,15.42z"/>
+ <path fill="none" d="M4.08,20.82c-0.23-0.35-0.45-0.71-0.64-1.08C3,18.9,2.65,18.01,2.41,17.07C2.76,18.43,3.33,19.7,4.08,20.82z"
+ />
+ <path fill="none" d="M2.37,16.92c-0.09-0.38-0.16-0.77-0.22-1.17C2.21,16.14,2.28,16.54,2.37,16.92z"/>
+ <path fill="#29CAF2" d="M4.13,20.82c-0.74-1.13-1.3-2.39-1.64-3.75c-0.01-0.05-0.02-0.1-0.04-0.16c-0.09-0.38-0.16-0.77-0.22-1.17
+ c-0.01-0.11-0.03-0.22-0.04-0.33c-0.05-0.46-0.08-0.92-0.08-1.39c0-6.63,5.57-12,11.86-12l0,0v-2h-2.61
+ c-6.29,0-11.39,5.37-11.39,12c0,4.13,1.98,7.76,4.99,9.92c-0.27-0.33-0.52-0.67-0.76-1.03C4.17,20.89,4.15,20.86,4.13,20.82z"/>
+ <path fill="#80E6FF" d="M10.17,22.03c-2.5,0-4.8-0.86-6.68-2.29c0.19,0.37,0.41,0.73,0.63,1.08c0.02,0.03,0.04,0.07,0.07,0.1
+ c0.24,0.36,0.49,0.7,0.76,1.03c1.82,1.31,4.03,2.08,6.4,2.08h2.61v-2H10.17z"/>
+ <path fill="#80E6FF" d="M4.08,20.82c0.02,0.04,0.04,0.07,0.07,0.1C4.12,20.89,4.1,20.86,4.08,20.82z"/>
+ <path fill="#2BD5FF" d="M13.97,2.03c-6.29,0-11.86,5.37-11.86,12c0,0.47,0.03,0.93,0.08,1.39c0.01,0.11,0.03,0.22,0.04,0.33
+ c0.06,0.4,0.12,0.79,0.22,1.17c0.01,0.05,0.02,0.1,0.04,0.16c0.24,0.94,0.58,1.83,1.01,2.67c1.88,1.44,4.18,2.29,6.68,2.29h3.8
+ V2.03L13.97,2.03z"/>
+ <path fill="#2BD5FF" d="M2.41,17.07c-0.01-0.05-0.02-0.1-0.04-0.16C2.39,16.97,2.4,17.02,2.41,17.07z"/>
+ <path fill="#2BD5FF" d="M2.15,15.75c-0.01-0.11-0.03-0.22-0.04-0.33C2.12,15.53,2.14,15.64,2.15,15.75z"/>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_status_field_middle_14x24px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_status_field_middle_14x24px.svg
new file mode 100644
index 0000000000..cabf9285a7
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_status_field_middle_14x24px.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="10px" height="24px" viewBox="0 0 10 24" enable-background="new 0 0 10 24" xml:space="preserve">
+<g>
+ <rect y="1" fill="#2BD5FF" width="10" height="22"/>
+ <rect fill="#29CAF2" width="10" height="2"/>
+ <rect y="22" fill="#80E6FF" width="10" height="2"/>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_status_field_right_14x24px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_status_field_right_14x24px.svg
new file mode 100644
index 0000000000..f3a795b88d
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_status_field_right_14x24px.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="14px" height="24px" viewBox="0 0 14 24" enable-background="new 0 0 14 24" xml:space="preserve">
+<g>
+ <path fill="#29CAF2" d="M4.59,2C7,2,9.25,2.77,11.1,4.08C8.98,1.58,5.88,0,2.42,0H0v2H4.59z"/>
+ <path fill="#80E6FF" d="M11.6,4.71c0.76,1.6,1.2,3.39,1.2,5.29c0,6.63-5.19,12-11.59,12H0v2h2.41C8.82,24,14,18.63,14,12
+ C14,9.25,13.1,6.73,11.6,4.71z"/>
+ <path fill="#2BD5FF" d="M0,2v20h1.21c6.4,0,11.59-5.37,11.59-12c0-1.9-0.44-3.69-1.2-5.29c-0.16-0.22-0.32-0.43-0.5-0.64
+ C9.25,2.77,7,2,4.59,2H0z"/>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_topbar_356x96px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_topbar_356x96px.svg
new file mode 100644
index 0000000000..a0efd347fb
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_topbar_356x96px.svg
@@ -0,0 +1,2007 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="356px" height="96px" viewBox="0 0 356 96" enable-background="new 0 0 356 96" xml:space="preserve">
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-182.1821" y1="-52.7012" x2="-115.6673" y2="130.047" gradientTransform="matrix(-1 0 0 1 29.2188 0)">
+ <stop offset="0" style="stop-color:#2BD5FF"/>
+ <stop offset="0.3516" style="stop-color:#80E6FF"/>
+ <stop offset="0.9176" style="stop-color:#28C4EB"/>
+</linearGradient>
+<path fill="url(#SVGID_1_)" d="M356.19,76.95V0H0.24v77.4c0,0,82.53,12.07,184.11,12.07C184.34,89.46,277.67,90.39,356.19,76.95z"/>
+<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-327.1934" y1="86.1738" x2="28.8057" y2="86.1738" gradientTransform="matrix(-1 0 0 1 29.2188 0)">
+ <stop offset="0" style="stop-color:#2BD5FF"/>
+ <stop offset="0.9176" style="stop-color:#28C6ED"/>
+</linearGradient>
+<path fill="url(#SVGID_2_)" d="M184.54,89.13C82.96,89.13,0.43,77.06,0.43,77.06l-0.02,4.56c0,0,82.53,14.04,184.11,14.04h171.39
+ l0.1-18.98C277.57,90.05,184.54,89.13,184.54,89.13z"/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-365.623" y1="-266.3726" x2="-362.1982" y2="-260.4406" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_3_)" d="M353.52,73.18c-0.71-1-1.42-2.02-2.14-3.03c-1.43,0.19-2.85,0.38-4.27,0.56
+ c-0.71,1.21-1.42,2.43-2.13,3.65C347.82,73.98,350.67,73.58,353.52,73.18z"/>
+<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-365.6025" y1="-276.23" x2="-361.4175" y2="-268.9812" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_4_)" d="M351.38,66.97c0.71-1.2,1.42-2.4,2.14-3.59c-0.71-1.02-1.42-2.04-2.14-3.07
+ c-1.42,0.16-2.85,0.32-4.28,0.48c-0.71,1.2-1.42,2.4-2.14,3.61c0.71,1.04,1.43,2.08,2.14,3.11
+ C348.53,67.33,349.95,67.15,351.38,66.97z"/>
+<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-365.5835" y1="-286.0889" x2="-361.4316" y2="-278.8976" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_5_)" d="M351.38,57.12c0.71-1.19,1.43-2.37,2.14-3.55c-0.71-1.03-1.43-2.07-2.14-3.11
+ c-1.43,0.14-2.85,0.27-4.28,0.4c-0.71,1.18-1.43,2.37-2.14,3.57c0.71,1.05,1.43,2.1,2.14,3.15
+ C348.53,57.43,349.95,57.27,351.38,57.12z"/>
+<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-365.5649" y1="-295.9473" x2="-361.4463" y2="-288.8135" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_6_)" d="M351.38,47.27c0.71-1.17,1.42-2.34,2.14-3.51c-0.71-1.04-1.43-2.1-2.14-3.15
+ c-1.43,0.11-2.85,0.22-4.28,0.33c-0.71,1.17-1.43,2.35-2.14,3.53c0.71,1.07,1.43,2.13,2.14,3.18
+ C348.52,47.52,349.95,47.4,351.38,47.27z"/>
+<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-365.5439" y1="-305.8047" x2="-361.4585" y2="-298.7285" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_7_)" d="M351.37,37.43c0.71-1.16,1.43-2.32,2.14-3.47c-0.71-1.06-1.43-2.12-2.14-3.19
+ c-1.43,0.08-2.86,0.17-4.29,0.25c-0.71,1.16-1.43,2.32-2.14,3.49c0.72,1.08,1.43,2.16,2.14,3.23
+ C348.52,37.63,349.95,37.52,351.37,37.43z"/>
+<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="-365.5264" y1="-315.6636" x2="-361.4736" y2="-308.644" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_8_)" d="M351.37,27.58c0.71-1.15,1.43-2.29,2.14-3.43c-0.71-1.07-1.43-2.15-2.14-3.23
+ c-1.43,0.06-2.86,0.11-4.29,0.17c-0.71,1.15-1.43,2.3-2.14,3.45c0.72,1.09,1.43,2.18,2.15,3.26
+ C348.51,27.72,349.94,27.65,351.37,27.58z"/>
+<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="-365.5044" y1="-325.519" x2="-361.4858" y2="-318.5587" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_9_)" d="M351.37,17.73c0.71-1.14,1.43-2.27,2.14-3.39c-0.72-1.08-1.43-2.18-2.15-3.27
+ c-1.43,0.03-2.86,0.06-4.29,0.09c-0.71,1.13-1.43,2.27-2.14,3.41c0.72,1.11,1.43,2.21,2.15,3.3
+ C348.51,17.82,349.94,17.78,351.37,17.73z"/>
+<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="-365.4863" y1="-335.3774" x2="-361.501" y2="-328.4746" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_10_)" d="M351.37,7.88c0.72-1.12,1.43-2.23,2.15-3.35c-0.72-1.1-1.43-2.2-2.15-3.31
+ c-1.43,0-2.86,0.01-4.3,0.01c-0.71,1.12-1.43,2.25-2.15,3.37c0.72,1.12,1.43,2.23,2.15,3.34C348.51,7.92,349.94,7.9,351.37,7.88z"/>
+<linearGradient id="SVGID_11_" gradientUnits="userSpaceOnUse" x1="-354.4824" y1="-269.5742" x2="-350.2368" y2="-262.2206" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_11_)" d="M340.23,73.74c0.71-1.22,1.42-2.45,2.13-3.66c-0.72-1.04-1.43-2.09-2.14-3.14
+ c-1.42,0.17-2.85,0.33-4.28,0.49c-0.71,1.22-1.42,2.45-2.13,3.68c0.71,1.06,1.43,2.12,2.14,3.17
+ C337.38,74.1,338.8,73.92,340.23,73.74z"/>
+<linearGradient id="SVGID_12_" gradientUnits="userSpaceOnUse" x1="-354.4536" y1="-279.6323" x2="-350.2397" y2="-272.3337" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_12_)" d="M340.22,63.69c0.71-1.21,1.42-2.42,2.13-3.62c-0.71-1.05-1.43-2.11-2.14-3.17
+ c-1.43,0.14-2.85,0.28-4.28,0.42c-0.71,1.21-1.43,2.42-2.14,3.64c0.71,1.07,1.43,2.14,2.14,3.21C337.37,64,338.8,63.85,340.22,63.69
+ z"/>
+<linearGradient id="SVGID_13_" gradientUnits="userSpaceOnUse" x1="-354.4287" y1="-289.6929" x2="-350.2451" y2="-282.4467" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_13_)" d="M340.21,53.64c0.71-1.2,1.43-2.39,2.14-3.59c-0.71-1.06-1.43-2.14-2.14-3.21
+ c-1.43,0.12-2.86,0.23-4.29,0.34c-0.71,1.2-1.42,2.4-2.14,3.6c0.71,1.08,1.43,2.17,2.15,3.24
+ C337.36,53.91,338.78,53.78,340.21,53.64z"/>
+<linearGradient id="SVGID_14_" gradientUnits="userSpaceOnUse" x1="-354.4023" y1="-299.7485" x2="-350.2505" y2="-292.5573" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_14_)" d="M340.2,43.59c0.71-1.19,1.43-2.37,2.14-3.55c-0.72-1.08-1.43-2.16-2.15-3.25
+ c-1.43,0.09-2.86,0.18-4.29,0.27c-0.71,1.19-1.43,2.37-2.14,3.57c0.71,1.1,1.43,2.19,2.15,3.28
+ C337.34,43.81,338.77,43.7,340.2,43.59z"/>
+<linearGradient id="SVGID_15_" gradientUnits="userSpaceOnUse" x1="-354.376" y1="-309.8076" x2="-350.2554" y2="-302.6705" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_15_)" d="M340.19,33.54c0.71-1.17,1.43-2.34,2.14-3.51c-0.72-1.09-1.43-2.19-2.15-3.29
+ c-1.43,0.07-2.86,0.13-4.29,0.2c-0.71,1.17-1.43,2.35-2.14,3.53c0.72,1.11,1.43,2.21,2.15,3.31
+ C337.33,33.71,338.76,33.63,340.19,33.54z"/>
+<linearGradient id="SVGID_16_" gradientUnits="userSpaceOnUse" x1="-354.3486" y1="-319.8672" x2="-350.2593" y2="-312.7842" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_16_)" d="M340.18,23.5c0.71-1.16,1.43-2.32,2.14-3.47c-0.71-1.1-1.43-2.21-2.15-3.32
+ c-1.43,0.04-2.86,0.08-4.29,0.12c-0.71,1.16-1.43,2.33-2.14,3.5c0.72,1.12,1.43,2.24,2.15,3.35
+ C337.32,23.61,338.75,23.55,340.18,23.5z"/>
+<linearGradient id="SVGID_17_" gradientUnits="userSpaceOnUse" x1="-354.3242" y1="-329.9253" x2="-350.2656" y2="-322.8956" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_17_)" d="M340.17,13.45c0.71-1.15,1.43-2.29,2.15-3.43c-0.72-1.12-1.44-2.24-2.15-3.36
+ c-1.43,0.02-2.86,0.03-4.29,0.05c-0.71,1.15-1.43,2.3-2.14,3.46c0.72,1.13,1.43,2.26,2.15,3.39
+ C337.31,13.51,338.74,13.48,340.17,13.45z"/>
+<linearGradient id="SVGID_18_" gradientUnits="userSpaceOnUse" x1="-353.3623" y1="-338.3662" x2="-350.2695" y2="-333.0094" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_18_)" d="M333.71,0c0.72,1.15,1.43,2.29,2.15,3.42c1.43-0.01,2.86-0.01,4.3-0.02
+ c0.71-1.14,1.43-2.27,2.15-3.4C339.44,0,336.58,0,333.71,0z"/>
+<linearGradient id="SVGID_19_" gradientUnits="userSpaceOnUse" x1="-343.7051" y1="-263.6235" x2="-340.2715" y2="-257.6764" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_19_)" d="M331.57,76.08c-0.71-1.06-1.43-2.13-2.14-3.2c-1.43,0.17-2.86,0.33-4.28,0.49
+ c-0.71,1.24-1.42,2.49-2.13,3.73C325.87,76.78,328.72,76.43,331.57,76.08z"/>
+<linearGradient id="SVGID_20_" gradientUnits="userSpaceOnUse" x1="-343.6792" y1="-273.8569" x2="-339.4126" y2="-266.4669" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_20_)" d="M329.42,69.57c0.71-1.23,1.42-2.46,2.13-3.69c-0.71-1.07-1.43-2.15-2.15-3.23
+ c-1.43,0.14-2.86,0.28-4.28,0.42c-0.71,1.23-1.43,2.46-2.14,3.7c0.72,1.09,1.43,2.18,2.15,3.27C326.57,69.89,328,69.73,329.42,69.57
+ z"/>
+<linearGradient id="SVGID_21_" gradientUnits="userSpaceOnUse" x1="-343.6494" y1="-284.0972" x2="-339.4106" y2="-276.7554" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_21_)" d="M329.41,59.34c0.71-1.22,1.42-2.44,2.14-3.65c-0.72-1.09-1.43-2.18-2.15-3.27
+ c-1.43,0.12-2.86,0.24-4.29,0.35c-0.71,1.22-1.42,2.44-2.14,3.67c0.72,1.1,1.43,2.21,2.15,3.3
+ C326.55,59.61,327.98,59.48,329.41,59.34z"/>
+<linearGradient id="SVGID_22_" gradientUnits="userSpaceOnUse" x1="-343.6177" y1="-294.3369" x2="-339.4092" y2="-287.0476" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_22_)" d="M329.39,49.11c0.71-1.21,1.42-2.42,2.14-3.62c-0.72-1.1-1.43-2.2-2.15-3.3
+ c-1.43,0.1-2.86,0.19-4.29,0.28c-0.71,1.21-1.42,2.42-2.14,3.63c0.72,1.11,1.43,2.23,2.15,3.33
+ C326.53,49.33,327.96,49.22,329.39,49.11z"/>
+<linearGradient id="SVGID_23_" gradientUnits="userSpaceOnUse" x1="-343.5854" y1="-304.5762" x2="-339.4058" y2="-297.3367" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_23_)" d="M329.38,38.88c0.71-1.2,1.43-2.39,2.14-3.58c-0.72-1.11-1.43-2.22-2.15-3.34
+ c-1.43,0.07-2.86,0.14-4.29,0.21c-0.71,1.2-1.42,2.4-2.14,3.6c0.72,1.13,1.43,2.25,2.15,3.37
+ C326.52,39.06,327.95,38.97,329.38,38.88z"/>
+<linearGradient id="SVGID_24_" gradientUnits="userSpaceOnUse" x1="-343.5562" y1="-314.8164" x2="-339.4053" y2="-307.6269" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_24_)" d="M329.36,28.65c0.71-1.19,1.43-2.37,2.14-3.55c-0.72-1.12-1.43-2.24-2.15-3.37
+ c-1.43,0.05-2.86,0.1-4.29,0.15c-0.71,1.19-1.43,2.38-2.14,3.57c0.72,1.14,1.43,2.27,2.15,3.4
+ C326.5,28.78,327.93,28.71,329.36,28.65z"/>
+<linearGradient id="SVGID_25_" gradientUnits="userSpaceOnUse" x1="-343.5239" y1="-325.0557" x2="-339.4028" y2="-317.9177" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_25_)" d="M329.34,18.42c0.71-1.17,1.43-2.34,2.14-3.51c-0.72-1.13-1.44-2.27-2.15-3.41
+ c-1.43,0.03-2.86,0.05-4.29,0.08c-0.71,1.17-1.43,2.35-2.14,3.53c0.72,1.15,1.44,2.29,2.15,3.44
+ C326.48,18.5,327.91,18.46,329.34,18.42z"/>
+<linearGradient id="SVGID_26_" gradientUnits="userSpaceOnUse" x1="-343.4932" y1="-335.2979" x2="-339.4009" y2="-328.2098" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_26_)" d="M329.33,8.19c0.71-1.16,1.43-2.32,2.14-3.48c-0.72-1.14-1.44-2.29-2.15-3.45
+ c-1.43,0-2.87,0.01-4.3,0.01c-0.71,1.16-1.43,2.33-2.14,3.5c0.72,1.16,1.44,2.32,2.15,3.47C326.46,8.22,327.89,8.21,329.33,8.19z"/>
+<linearGradient id="SVGID_27_" gradientUnits="userSpaceOnUse" x1="-332.5376" y1="-267.1743" x2="-328.2202" y2="-259.6964" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_27_)" d="M318.26,76.36c0.71-1.25,1.42-2.5,2.13-3.75c-0.71-1.09-1.43-2.19-2.15-3.29
+ c-1.43,0.14-2.86,0.28-4.29,0.42c-0.71,1.25-1.42,2.5-2.14,3.76c0.72,1.11,1.44,2.22,2.15,3.32
+ C315.4,76.67,316.83,76.52,318.26,76.36z"/>
+<linearGradient id="SVGID_28_" gradientUnits="userSpaceOnUse" x1="-332.502" y1="-277.5903" x2="-328.2109" y2="-270.1581" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_28_)" d="M318.24,65.96c0.71-1.24,1.42-2.48,2.14-3.71c-0.71-1.1-1.43-2.21-2.15-3.32
+ c-1.43,0.12-2.86,0.24-4.29,0.36c-0.71,1.24-1.42,2.48-2.14,3.73c0.72,1.12,1.44,2.24,2.15,3.36
+ C315.38,66.23,316.81,66.09,318.24,65.96z"/>
+<linearGradient id="SVGID_29_" gradientUnits="userSpaceOnUse" x1="-332.4697" y1="-288.0034" x2="-328.2061" y2="-280.6185" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_29_)" d="M318.22,55.55c0.71-1.23,1.42-2.46,2.14-3.68c-0.72-1.12-1.44-2.23-2.15-3.36
+ c-1.43,0.1-2.86,0.2-4.29,0.3c-0.71,1.23-1.43,2.46-2.14,3.7c0.72,1.13,1.44,2.26,2.15,3.39C315.36,55.78,316.79,55.66,318.22,55.55
+ z"/>
+<linearGradient id="SVGID_30_" gradientUnits="userSpaceOnUse" x1="-332.4331" y1="-298.416" x2="-328.1973" y2="-291.0793" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_30_)" d="M318.2,45.14c0.71-1.22,1.42-2.44,2.14-3.65c-0.72-1.13-1.43-2.26-2.15-3.39
+ c-1.43,0.08-2.86,0.16-4.29,0.23c-0.71,1.22-1.42,2.44-2.14,3.67c0.72,1.14,1.44,2.28,2.15,3.42
+ C315.34,45.33,316.77,45.24,318.2,45.14z"/>
+<linearGradient id="SVGID_31_" gradientUnits="userSpaceOnUse" x1="-332.3999" y1="-308.8311" x2="-328.1904" y2="-301.54" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_31_)" d="M318.18,34.74c0.71-1.21,1.43-2.42,2.14-3.62c-0.72-1.14-1.44-2.28-2.15-3.42
+ c-1.43,0.06-2.86,0.11-4.29,0.17c-0.71,1.21-1.43,2.42-2.14,3.63c0.72,1.16,1.44,2.3,2.15,3.45
+ C315.31,34.88,316.75,34.81,318.18,34.74z"/>
+<linearGradient id="SVGID_32_" gradientUnits="userSpaceOnUse" x1="-332.3647" y1="-319.2437" x2="-328.1831" y2="-312.0008" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_32_)" d="M318.15,24.33c0.71-1.2,1.43-2.39,2.14-3.58c-0.72-1.15-1.44-2.3-2.15-3.45
+ c-1.43,0.04-2.86,0.07-4.29,0.11c-0.71,1.2-1.43,2.4-2.14,3.6c0.72,1.16,1.44,2.32,2.15,3.48
+ C315.29,24.43,316.72,24.38,318.15,24.33z"/>
+<linearGradient id="SVGID_33_" gradientUnits="userSpaceOnUse" x1="-332.3286" y1="-329.6587" x2="-328.1729" y2="-322.4607" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_33_)" d="M318.13,13.92c0.72-1.19,1.43-2.37,2.14-3.55c-0.72-1.16-1.44-2.32-2.15-3.49
+ c-1.43,0.01-2.86,0.03-4.3,0.04c-0.71,1.19-1.43,2.38-2.14,3.57c0.72,1.18,1.44,2.34,2.15,3.51
+ C315.27,13.98,316.7,13.95,318.13,13.92z"/>
+<linearGradient id="SVGID_34_" gradientUnits="userSpaceOnUse" x1="-331.3086" y1="-338.3657" x2="-328.166" y2="-332.9226" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_34_)" d="M311.66,0c0.72,1.18,1.44,2.37,2.16,3.54c1.43-0.01,2.87-0.01,4.3-0.02
+ c0.71-1.18,1.42-2.35,2.14-3.52C317.39,0,314.53,0,311.66,0z"/>
+<linearGradient id="SVGID_35_" gradientUnits="userSpaceOnUse" x1="-321.7275" y1="-261.2515" x2="-318.2925" y2="-255.3018" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_35_)" d="M309.59,78.59c-0.72-1.11-1.43-2.23-2.15-3.35c-1.43,0.14-2.86,0.28-4.29,0.42
+ c-0.71,1.26-1.43,2.54-2.14,3.81C303.87,79.19,306.73,78.89,309.59,78.59z"/>
+<linearGradient id="SVGID_36_" gradientUnits="userSpaceOnUse" x1="-321.7114" y1="-271.8086" x2="-317.377" y2="-264.3011" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_36_)" d="M307.43,71.83c0.71-1.26,1.42-2.51,2.14-3.77c-0.72-1.12-1.44-2.25-2.15-3.38
+ c-1.43,0.12-2.86,0.24-4.29,0.36c-0.71,1.26-1.43,2.51-2.14,3.77c0.72,1.14,1.44,2.28,2.15,3.41C304.57,72.1,306,71.96,307.43,71.83
+ z"/>
+<linearGradient id="SVGID_37_" gradientUnits="userSpaceOnUse" x1="-321.6733" y1="-282.3789" x2="-317.3638" y2="-274.9145" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_37_)" d="M307.41,61.27c0.71-1.25,1.42-2.49,2.13-3.74c-0.72-1.13-1.44-2.27-2.15-3.41
+ c-1.43,0.1-2.86,0.2-4.29,0.3c-0.71,1.25-1.42,2.5-2.14,3.75c0.72,1.15,1.44,2.29,2.15,3.44C304.54,61.49,305.97,61.38,307.41,61.27
+ z"/>
+<linearGradient id="SVGID_38_" gradientUnits="userSpaceOnUse" x1="-321.6357" y1="-292.9482" x2="-317.3516" y2="-285.5278" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_38_)" d="M307.38,50.7c0.71-1.24,1.42-2.47,2.14-3.71c-0.72-1.14-1.44-2.29-2.15-3.44
+ c-1.43,0.08-2.86,0.16-4.29,0.24c-0.71,1.24-1.43,2.48-2.14,3.72c0.72,1.16,1.44,2.31,2.15,3.46
+ C304.52,50.89,305.95,50.8,307.38,50.7z"/>
+<linearGradient id="SVGID_39_" gradientUnits="userSpaceOnUse" x1="-321.6011" y1="-303.5161" x2="-317.3418" y2="-296.1388" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_39_)" d="M307.35,40.14c0.71-1.23,1.43-2.45,2.14-3.68c-0.72-1.15-1.44-2.31-2.16-3.47
+ c-1.43,0.06-2.86,0.12-4.29,0.18c-0.71,1.23-1.43,2.46-2.14,3.69c0.72,1.17,1.44,2.33,2.15,3.49
+ C304.49,40.29,305.92,40.22,307.35,40.14z"/>
+<linearGradient id="SVGID_40_" gradientUnits="userSpaceOnUse" x1="-321.5649" y1="-314.0874" x2="-317.3306" y2="-306.7532" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_40_)" d="M307.33,29.58c0.71-1.22,1.43-2.44,2.14-3.65c-0.72-1.16-1.44-2.33-2.15-3.5
+ c-1.43,0.04-2.86,0.08-4.3,0.12c-0.71,1.22-1.42,2.44-2.14,3.66c0.72,1.18,1.44,2.35,2.15,3.52
+ C304.47,29.69,305.9,29.63,307.33,29.58z"/>
+<linearGradient id="SVGID_41_" gradientUnits="userSpaceOnUse" x1="-321.5269" y1="-324.6572" x2="-317.3169" y2="-317.3654" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_41_)" d="M307.3,19.02c0.71-1.21,1.43-2.41,2.14-3.62c-0.72-1.17-1.44-2.35-2.16-3.53
+ c-1.43,0.02-2.86,0.04-4.3,0.07c-0.71,1.21-1.43,2.42-2.14,3.63c0.72,1.19,1.44,2.37,2.16,3.55
+ C304.44,19.09,305.87,19.05,307.3,19.02z"/>
+<linearGradient id="SVGID_42_" gradientUnits="userSpaceOnUse" x1="-321.4897" y1="-335.2251" x2="-317.3062" y2="-327.9789" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_42_)" d="M307.28,8.45c0.71-1.2,1.43-2.39,2.14-3.59c-0.72-1.18-1.44-2.37-2.16-3.56
+ c-1.43,0-2.86,0.01-4.3,0.01c-0.71,1.2-1.43,2.4-2.14,3.61c0.72,1.2,1.44,2.39,2.16,3.58C304.42,8.48,305.85,8.47,307.28,8.45z"/>
+<linearGradient id="SVGID_43_" gradientUnits="userSpaceOnUse" x1="-310.5508" y1="-265.1279" x2="-306.1753" y2="-257.5493" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_43_)" d="M296.25,78.6c0.71-1.27,1.43-2.54,2.14-3.81c-0.72-1.14-1.44-2.29-2.15-3.43
+ c-1.43,0.12-2.86,0.24-4.29,0.35c-0.71,1.27-1.43,2.55-2.14,3.82c0.72,1.16,1.44,2.31,2.16,3.46
+ C293.39,78.86,294.82,78.73,296.25,78.6z"/>
+<linearGradient id="SVGID_44_" gradientUnits="userSpaceOnUse" x1="-310.5122" y1="-275.8442" x2="-306.1597" y2="-268.3054" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_44_)" d="M296.22,67.89c0.71-1.26,1.42-2.53,2.14-3.79c-0.72-1.15-1.44-2.3-2.16-3.46
+ c-1.43,0.1-2.86,0.2-4.29,0.3c-0.71,1.26-1.42,2.53-2.14,3.79c0.72,1.17,1.44,2.33,2.15,3.49C293.36,68.12,294.79,68,296.22,67.89z"
+ />
+<linearGradient id="SVGID_45_" gradientUnits="userSpaceOnUse" x1="-310.4736" y1="-286.5635" x2="-306.144" y2="-279.0644" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_45_)" d="M296.2,57.18c0.71-1.25,1.43-2.51,2.14-3.76c-0.72-1.16-1.44-2.32-2.16-3.49
+ c-1.43,0.09-2.86,0.17-4.29,0.25c-0.71,1.25-1.42,2.51-2.14,3.77c0.72,1.17,1.44,2.34,2.16,3.51
+ C293.33,57.37,294.76,57.27,296.2,57.18z"/>
+<linearGradient id="SVGID_46_" gradientUnits="userSpaceOnUse" x1="-310.4351" y1="-297.2803" x2="-306.1279" y2="-289.8201" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_46_)" d="M296.17,46.46c0.71-1.25,1.42-2.49,2.14-3.73c-0.72-1.17-1.44-2.34-2.16-3.51
+ c-1.43,0.07-2.86,0.13-4.3,0.19c-0.71,1.25-1.42,2.49-2.14,3.74c0.72,1.18,1.44,2.36,2.16,3.54
+ C293.31,46.62,294.74,46.54,296.17,46.46z"/>
+<linearGradient id="SVGID_47_" gradientUnits="userSpaceOnUse" x1="-310.3955" y1="-307.9976" x2="-306.1123" y2="-300.5788" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_47_)" d="M296.14,35.75c0.71-1.24,1.43-2.47,2.14-3.71c-0.72-1.18-1.44-2.36-2.16-3.54
+ c-1.43,0.05-2.86,0.09-4.3,0.14c-0.71,1.24-1.42,2.48-2.14,3.72c0.72,1.19,1.44,2.38,2.16,3.56
+ C293.28,35.88,294.71,35.81,296.14,35.75z"/>
+<linearGradient id="SVGID_48_" gradientUnits="userSpaceOnUse" x1="-310.3628" y1="-318.7153" x2="-306.1011" y2="-311.3338" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_48_)" d="M296.12,25.04c0.71-1.23,1.43-2.46,2.14-3.68c-0.72-1.19-1.44-2.38-2.16-3.57
+ c-1.43,0.03-2.86,0.06-4.3,0.09c-0.71,1.23-1.42,2.46-2.14,3.69c0.72,1.2,1.44,2.4,2.16,3.59
+ C293.25,25.13,294.68,25.09,296.12,25.04z"/>
+<linearGradient id="SVGID_49_" gradientUnits="userSpaceOnUse" x1="-310.3232" y1="-329.4331" x2="-306.085" y2="-322.0922" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_49_)" d="M296.09,14.33c0.71-1.22,1.42-2.44,2.14-3.65c-0.72-1.19-1.44-2.39-2.16-3.6
+ c-1.43,0.01-2.86,0.02-4.3,0.04c-0.71,1.22-1.42,2.44-2.14,3.67c0.72,1.21,1.44,2.41,2.16,3.62
+ C293.22,14.38,294.66,14.36,296.09,14.33z"/>
+<linearGradient id="SVGID_50_" gradientUnits="userSpaceOnUse" x1="-309.2559" y1="-338.3657" x2="-306.0708" y2="-332.849" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_50_)" d="M289.61,0c0.72,1.22,1.44,2.43,2.16,3.64c1.43-0.01,2.87-0.01,4.3-0.02
+ c0.71-1.21,1.42-2.42,2.14-3.62C295.34,0,292.47,0,289.61,0z"/>
+<linearGradient id="SVGID_51_" gradientUnits="userSpaceOnUse" x1="-299.7114" y1="-259.2568" x2="-296.2817" y2="-253.3164" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_51_)" d="M287.56,80.72c-0.72-1.16-1.44-2.32-2.16-3.48c-1.43,0.12-2.87,0.23-4.3,0.35
+ c-0.71,1.28-1.42,2.57-2.14,3.86C281.84,81.21,284.7,80.97,287.56,80.72z"/>
+<linearGradient id="SVGID_52_" gradientUnits="userSpaceOnUse" x1="-299.7036" y1="-270.0845" x2="-295.3149" y2="-262.4831" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_52_)" d="M285.4,73.73c0.71-1.28,1.42-2.55,2.14-3.83c-0.72-1.16-1.44-2.33-2.16-3.5
+ c-1.43,0.1-2.87,0.2-4.3,0.3c-0.71,1.28-1.42,2.55-2.14,3.83c0.72,1.18,1.44,2.36,2.16,3.53C282.53,73.95,283.96,73.84,285.4,73.73z
+ "/>
+<linearGradient id="SVGID_53_" gradientUnits="userSpaceOnUse" x1="-299.6655" y1="-280.9321" x2="-295.2988" y2="-273.3688" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_53_)" d="M285.37,62.89c0.71-1.27,1.42-2.54,2.14-3.8c-0.72-1.17-1.44-2.35-2.16-3.53
+ c-1.43,0.08-2.87,0.17-4.3,0.25c-0.71,1.27-1.42,2.54-2.14,3.81c0.72,1.19,1.44,2.37,2.16,3.55
+ C282.51,63.07,283.94,62.98,285.37,62.89z"/>
+<linearGradient id="SVGID_54_" gradientUnits="userSpaceOnUse" x1="-299.627" y1="-291.7808" x2="-295.2812" y2="-284.2538" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_54_)" d="M285.34,52.04c0.71-1.26,1.42-2.52,2.14-3.78c-0.72-1.18-1.44-2.37-2.16-3.55
+ c-1.43,0.07-2.87,0.13-4.3,0.2c-0.71,1.26-1.42,2.52-2.14,3.79c0.72,1.2,1.44,2.39,2.16,3.58C282.48,52.2,283.91,52.12,285.34,52.04
+ z"/>
+<linearGradient id="SVGID_55_" gradientUnits="userSpaceOnUse" x1="-299.5894" y1="-302.6265" x2="-295.2642" y2="-295.135" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_55_)" d="M285.31,41.2c0.71-1.25,1.42-2.5,2.14-3.75c-0.72-1.19-1.44-2.38-2.16-3.58
+ c-1.43,0.05-2.87,0.1-4.3,0.15c-0.71,1.25-1.42,2.51-2.14,3.76c0.72,1.2,1.44,2.41,2.16,3.6C282.45,41.33,283.88,41.27,285.31,41.2z
+ "/>
+<linearGradient id="SVGID_56_" gradientUnits="userSpaceOnUse" x1="-299.5508" y1="-313.4751" x2="-295.2466" y2="-306.02" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_56_)" d="M285.29,30.36c0.71-1.24,1.42-2.49,2.14-3.73c-0.72-1.2-1.44-2.4-2.16-3.61
+ c-1.43,0.03-2.87,0.07-4.3,0.1c-0.71,1.25-1.42,2.49-2.14,3.74c0.72,1.21,1.44,2.42,2.16,3.63
+ C282.42,30.45,283.85,30.41,285.29,30.36z"/>
+<linearGradient id="SVGID_57_" gradientUnits="userSpaceOnUse" x1="-299.5132" y1="-324.3232" x2="-295.23" y2="-316.9045" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_57_)" d="M285.26,19.52c0.71-1.24,1.43-2.47,2.14-3.7c-0.72-1.21-1.44-2.42-2.16-3.63
+ c-1.43,0.02-2.87,0.04-4.3,0.05c-0.71,1.24-1.42,2.48-2.14,3.72c0.72,1.22,1.44,2.44,2.16,3.65
+ C282.39,19.58,283.83,19.55,285.26,19.52z"/>
+<linearGradient id="SVGID_58_" gradientUnits="userSpaceOnUse" x1="-299.4771" y1="-335.1685" x2="-295.2153" y2="-327.787" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_58_)" d="M285.23,8.68c0.71-1.23,1.43-2.45,2.14-3.68c-0.72-1.21-1.44-2.43-2.16-3.66
+ c-1.43,0-2.87,0-4.3,0.01c-0.71,1.23-1.42,2.46-2.14,3.69c0.72,1.23,1.44,2.45,2.16,3.67C282.36,8.7,283.8,8.69,285.23,8.68z"/>
+<linearGradient id="SVGID_59_" gradientUnits="userSpaceOnUse" x1="-288.5273" y1="-263.4331" x2="-284.1084" y2="-255.7793" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_59_)" d="M274.2,80.45c0.71-1.29,1.43-2.58,2.14-3.87c-0.72-1.18-1.44-2.37-2.16-3.55
+ c-1.43,0.1-2.87,0.19-4.3,0.29c-0.71,1.29-1.43,2.58-2.14,3.87c0.72,1.2,1.44,2.39,2.16,3.58C271.34,80.67,272.77,80.56,274.2,80.45
+ z"/>
+<linearGradient id="SVGID_60_" gradientUnits="userSpaceOnUse" x1="-288.4883" y1="-274.4014" x2="-284.0889" y2="-266.7814" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_60_)" d="M274.17,69.49c0.71-1.28,1.43-2.56,2.14-3.84c-0.72-1.19-1.44-2.38-2.16-3.57
+ c-1.43,0.08-2.87,0.17-4.3,0.25c-0.71,1.28-1.43,2.56-2.14,3.85c0.72,1.2,1.44,2.4,2.16,3.6C271.31,69.67,272.74,69.58,274.17,69.49
+ z"/>
+<linearGradient id="SVGID_61_" gradientUnits="userSpaceOnUse" x1="-288.4507" y1="-285.3701" x2="-284.0698" y2="-277.7823" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_61_)" d="M274.15,58.52c0.71-1.28,1.43-2.55,2.14-3.82c-0.72-1.2-1.44-2.39-2.16-3.6
+ c-1.43,0.07-2.86,0.14-4.3,0.2c-0.71,1.27-1.43,2.55-2.14,3.83c0.72,1.21,1.44,2.42,2.16,3.62
+ C271.28,58.68,272.71,58.6,274.15,58.52z"/>
+<linearGradient id="SVGID_62_" gradientUnits="userSpaceOnUse" x1="-288.4146" y1="-296.3384" x2="-284.0527" y2="-288.7835" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_62_)" d="M274.12,47.56c0.71-1.27,1.43-2.53,2.14-3.8c-0.72-1.21-1.44-2.41-2.16-3.62
+ c-1.43,0.05-2.86,0.11-4.3,0.16c-0.71,1.27-1.43,2.53-2.14,3.8c0.72,1.22,1.44,2.43,2.16,3.64
+ C271.25,47.69,272.69,47.63,274.12,47.56z"/>
+<linearGradient id="SVGID_63_" gradientUnits="userSpaceOnUse" x1="-288.3774" y1="-307.3091" x2="-284.0327" y2="-299.7838" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_63_)" d="M274.09,36.6c0.71-1.26,1.43-2.52,2.14-3.78c-0.72-1.21-1.44-2.42-2.16-3.64
+ c-1.43,0.04-2.87,0.08-4.3,0.12c-0.71,1.26-1.43,2.52-2.14,3.78c0.72,1.22,1.44,2.44,2.16,3.66
+ C271.23,36.7,272.66,36.65,274.09,36.6z"/>
+<linearGradient id="SVGID_64_" gradientUnits="userSpaceOnUse" x1="-288.3389" y1="-318.2759" x2="-284.0146" y2="-310.7861" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_64_)" d="M274.06,25.63c0.71-1.25,1.43-2.5,2.14-3.75c-0.72-1.22-1.44-2.44-2.16-3.66
+ c-1.43,0.02-2.87,0.05-4.3,0.07c-0.71,1.25-1.42,2.51-2.14,3.76c0.72,1.23,1.44,2.46,2.16,3.68
+ C271.2,25.7,272.63,25.67,274.06,25.63z"/>
+<linearGradient id="SVGID_65_" gradientUnits="userSpaceOnUse" x1="-288.3022" y1="-329.2456" x2="-283.9971" y2="-321.7888" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_65_)" d="M274.04,14.67c0.71-1.25,1.43-2.49,2.14-3.73c-0.72-1.23-1.44-2.46-2.16-3.69
+ c-1.43,0.01-2.86,0.02-4.3,0.03c-0.71,1.24-1.42,2.49-2.14,3.74c0.72,1.24,1.44,2.47,2.16,3.7
+ C271.17,14.71,272.61,14.69,274.04,14.67z"/>
+<linearGradient id="SVGID_66_" gradientUnits="userSpaceOnUse" x1="-287.2036" y1="-338.3652" x2="-283.9824" y2="-332.786" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_66_)" d="M267.55,0c0.72,1.24,1.44,2.48,2.16,3.72c1.43-0.01,2.86-0.01,4.3-0.01
+ c0.71-1.24,1.43-2.48,2.14-3.71C273.28,0,270.42,0,267.55,0z"/>
+<linearGradient id="SVGID_67_" gradientUnits="userSpaceOnUse" x1="-277.6582" y1="-257.6323" x2="-274.2441" y2="-251.719" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_67_)" d="M265.5,82.45c-0.72-1.2-1.44-2.4-2.16-3.6c-1.43,0.09-2.87,0.18-4.3,0.27
+ c-0.71,1.29-1.43,2.59-2.14,3.89C259.77,82.84,262.64,82.65,265.5,82.45z"/>
+<linearGradient id="SVGID_68_" gradientUnits="userSpaceOnUse" x1="-277.6636" y1="-268.6836" x2="-273.2383" y2="-261.0188" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_68_)" d="M263.34,75.27c0.71-1.29,1.43-2.58,2.14-3.87c-0.72-1.2-1.44-2.41-2.16-3.62
+ c-1.43,0.08-2.87,0.16-4.3,0.23c-0.71,1.29-1.43,2.58-2.14,3.87c0.72,1.22,1.44,2.43,2.16,3.64
+ C260.47,75.45,261.91,75.36,263.34,75.27z"/>
+<linearGradient id="SVGID_69_" gradientUnits="userSpaceOnUse" x1="-277.6289" y1="-279.7568" x2="-273.2192" y2="-272.1191" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_69_)" d="M263.31,64.2c0.71-1.29,1.43-2.57,2.14-3.85c-0.72-1.21-1.44-2.42-2.16-3.64
+ c-1.43,0.07-2.87,0.13-4.3,0.2c-0.71,1.28-1.43,2.57-2.14,3.86c0.72,1.22,1.44,2.44,2.16,3.66
+ C260.44,64.35,261.88,64.28,263.31,64.2z"/>
+<linearGradient id="SVGID_70_" gradientUnits="userSpaceOnUse" x1="-277.5923" y1="-290.8296" x2="-273.2012" y2="-283.224" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_70_)" d="M263.28,53.13c0.71-1.28,1.43-2.56,2.14-3.83c-0.72-1.22-1.44-2.43-2.16-3.66
+ c-1.43,0.05-2.87,0.11-4.3,0.16c-0.71,1.28-1.43,2.56-2.14,3.84c0.72,1.23,1.44,2.45,2.16,3.67
+ C260.42,53.26,261.85,53.2,263.28,53.13z"/>
+<linearGradient id="SVGID_71_" gradientUnits="userSpaceOnUse" x1="-277.5586" y1="-301.9033" x2="-273.1826" y2="-294.3239" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_71_)" d="M263.26,42.06c0.71-1.27,1.43-2.54,2.14-3.81c-0.72-1.22-1.44-2.45-2.16-3.68
+ c-1.43,0.04-2.87,0.08-4.3,0.12c-0.71,1.27-1.43,2.54-2.14,3.82c0.72,1.23,1.44,2.47,2.16,3.69
+ C260.39,42.16,261.82,42.11,263.26,42.06z"/>
+<linearGradient id="SVGID_72_" gradientUnits="userSpaceOnUse" x1="-277.5239" y1="-312.9766" x2="-273.1646" y2="-305.4259" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_72_)" d="M263.23,31c0.71-1.27,1.43-2.53,2.14-3.79c-0.72-1.23-1.44-2.46-2.16-3.69
+ c-1.43,0.03-2.87,0.05-4.3,0.08c-0.71,1.27-1.43,2.53-2.14,3.8c0.72,1.24,1.44,2.48,2.16,3.71C260.36,31.07,261.8,31.03,263.23,31z"
+ />
+<linearGradient id="SVGID_73_" gradientUnits="userSpaceOnUse" x1="-277.4893" y1="-324.0508" x2="-273.1465" y2="-316.5289" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_73_)" d="M263.2,19.93c0.71-1.26,1.43-2.52,2.14-3.77c-0.72-1.24-1.44-2.47-2.16-3.71
+ c-1.43,0.01-2.87,0.03-4.3,0.04c-0.71,1.26-1.43,2.52-2.14,3.78c0.72,1.25,1.44,2.49,2.16,3.73
+ C260.34,19.97,261.77,19.95,263.2,19.93z"/>
+<linearGradient id="SVGID_74_" gradientUnits="userSpaceOnUse" x1="-277.4536" y1="-335.1245" x2="-273.1274" y2="-327.6313" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_74_)" d="M263.18,8.86c0.71-1.25,1.43-2.5,2.14-3.75c-0.72-1.24-1.44-2.49-2.16-3.74c-1.43,0-2.87,0-4.3,0.01
+ c-0.71,1.25-1.43,2.51-2.14,3.76c0.72,1.25,1.44,2.5,2.16,3.75C260.31,8.88,261.74,8.87,263.18,8.86z"/>
+<linearGradient id="SVGID_75_" gradientUnits="userSpaceOnUse" x1="-266.4678" y1="-262.0903" x2="-262.0205" y2="-254.3874" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_75_)" d="M252.13,81.92c0.71-1.3,1.43-2.6,2.14-3.9c-0.72-1.22-1.44-2.44-2.16-3.66
+ c-1.44,0.08-2.87,0.15-4.3,0.22c-0.71,1.3-1.43,2.6-2.14,3.9c0.72,1.23,1.44,2.45,2.16,3.68C249.26,82.09,250.7,82.01,252.13,81.92z
+ "/>
+<linearGradient id="SVGID_76_" gradientUnits="userSpaceOnUse" x1="-266.4355" y1="-273.2568" x2="-262.0034" y2="-265.5802" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_76_)" d="M252.11,70.76c0.71-1.29,1.43-2.59,2.14-3.88c-0.72-1.22-1.44-2.44-2.16-3.67
+ c-1.43,0.06-2.87,0.12-4.3,0.19c-0.71,1.29-1.43,2.58-2.14,3.88c0.72,1.23,1.44,2.46,2.16,3.69
+ C249.24,70.9,250.67,70.83,252.11,70.76z"/>
+<linearGradient id="SVGID_77_" gradientUnits="userSpaceOnUse" x1="-266.4038" y1="-284.4263" x2="-261.9854" y2="-276.7733" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_77_)" d="M252.08,59.59c0.71-1.29,1.43-2.58,2.14-3.86c-0.72-1.23-1.44-2.46-2.16-3.69
+ c-1.43,0.05-2.87,0.1-4.3,0.15c-0.71,1.29-1.43,2.58-2.14,3.87c0.72,1.24,1.44,2.47,2.16,3.71
+ C249.21,59.71,250.65,59.66,252.08,59.59z"/>
+<linearGradient id="SVGID_78_" gradientUnits="userSpaceOnUse" x1="-266.3706" y1="-295.5933" x2="-261.9673" y2="-287.9665" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_78_)" d="M252.05,48.43c0.71-1.28,1.43-2.56,2.14-3.84c-0.72-1.23-1.44-2.47-2.16-3.71
+ c-1.43,0.04-2.87,0.08-4.3,0.12c-0.71,1.28-1.43,2.56-2.14,3.85c0.72,1.24,1.44,2.49,2.16,3.72
+ C249.19,48.53,250.62,48.48,252.05,48.43z"/>
+<linearGradient id="SVGID_79_" gradientUnits="userSpaceOnUse" x1="-266.3398" y1="-306.7612" x2="-261.9517" y2="-299.1607" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_79_)" d="M252.03,37.27c0.71-1.28,1.43-2.55,2.14-3.83c-0.72-1.24-1.44-2.48-2.16-3.73
+ c-1.43,0.03-2.87,0.06-4.3,0.09c-0.71,1.28-1.43,2.56-2.14,3.83c0.72,1.25,1.44,2.5,2.16,3.74
+ C249.17,37.34,250.6,37.31,252.03,37.27z"/>
+<linearGradient id="SVGID_80_" gradientUnits="userSpaceOnUse" x1="-266.3076" y1="-317.9287" x2="-261.9336" y2="-310.3527" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_80_)" d="M252,26.1c0.71-1.27,1.43-2.54,2.14-3.81c-0.72-1.25-1.44-2.49-2.16-3.74
+ c-1.43,0.02-2.87,0.04-4.3,0.06c-0.71,1.27-1.43,2.54-2.14,3.82c0.72,1.25,1.44,2.51,2.16,3.76C249.14,26.16,250.57,26.13,252,26.1z
+ "/>
+<linearGradient id="SVGID_81_" gradientUnits="userSpaceOnUse" x1="-266.2759" y1="-329.0972" x2="-261.9165" y2="-321.5465" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_81_)" d="M251.98,14.94c0.71-1.27,1.43-2.53,2.14-3.79c-0.72-1.25-1.44-2.5-2.16-3.76
+ c-1.43,0.01-2.86,0.02-4.3,0.02c-0.71,1.26-1.43,2.53-2.14,3.8c0.72,1.26,1.44,2.52,2.16,3.77
+ C249.11,14.97,250.55,14.96,251.98,14.94z"/>
+<linearGradient id="SVGID_82_" gradientUnits="userSpaceOnUse" x1="-265.1641" y1="-338.3574" x2="-261.9146" y2="-332.7291" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_82_)" d="M245.5,0c0.72,1.26,1.44,2.53,2.16,3.79c1.43,0,2.87-0.01,4.3-0.01c0.71-1.26,1.43-2.52,2.14-3.78
+ C251.23,0,248.37,0,245.5,0z"/>
+<linearGradient id="SVGID_83_" gradientUnits="userSpaceOnUse" x1="-255.5791" y1="-256.3857" x2="-252.186" y2="-250.5088" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_83_)" d="M243.42,83.79c-0.72-1.23-1.44-2.46-2.16-3.69c-1.43,0.07-2.87,0.14-4.31,0.2
+ c-0.71,1.3-1.43,2.61-2.14,3.91C237.68,84.08,240.55,83.94,243.42,83.79z"/>
+<linearGradient id="SVGID_84_" gradientUnits="userSpaceOnUse" x1="-255.5938" y1="-267.6055" x2="-251.1465" y2="-259.9026" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_84_)" d="M241.26,76.46c0.71-1.3,1.43-2.6,2.14-3.9c-0.72-1.23-1.44-2.47-2.16-3.71
+ c-1.43,0.06-2.87,0.12-4.3,0.17c-0.71,1.3-1.43,2.6-2.14,3.9c0.72,1.24,1.44,2.49,2.16,3.73C238.39,76.59,239.82,76.53,241.26,76.46
+ z"/>
+<linearGradient id="SVGID_85_" gradientUnits="userSpaceOnUse" x1="-255.5659" y1="-278.8545" x2="-251.1294" y2="-271.1702" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_85_)" d="M241.23,65.22c0.72-1.3,1.43-2.59,2.14-3.88c-0.72-1.24-1.44-2.48-2.16-3.72
+ c-1.43,0.05-2.87,0.1-4.3,0.14c-0.71,1.29-1.43,2.59-2.14,3.89c0.72,1.25,1.44,2.49,2.16,3.74
+ C238.36,65.33,239.8,65.27,241.23,65.22z"/>
+<linearGradient id="SVGID_86_" gradientUnits="userSpaceOnUse" x1="-255.5381" y1="-290.1001" x2="-251.1147" y2="-282.4387" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_86_)" d="M241.21,53.97c0.71-1.29,1.43-2.58,2.14-3.87c-0.72-1.24-1.44-2.49-2.16-3.74
+ c-1.43,0.04-2.87,0.08-4.3,0.12c-0.71,1.29-1.43,2.58-2.15,3.87c0.72,1.25,1.44,2.5,2.16,3.75
+ C238.34,54.06,239.78,54.02,241.21,53.97z"/>
+<linearGradient id="SVGID_87_" gradientUnits="userSpaceOnUse" x1="-255.5098" y1="-301.3467" x2="-251.0991" y2="-293.7072" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_87_)" d="M241.19,42.73c0.71-1.29,1.43-2.57,2.14-3.85c-0.72-1.25-1.44-2.5-2.16-3.75
+ c-1.43,0.03-2.87,0.06-4.3,0.09c-0.71,1.29-1.43,2.57-2.14,3.86c0.72,1.26,1.44,2.51,2.16,3.77
+ C238.32,42.8,239.75,42.77,241.19,42.73z"/>
+<linearGradient id="SVGID_88_" gradientUnits="userSpaceOnUse" x1="-255.4805" y1="-312.5938" x2="-251.0825" y2="-304.9763" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_88_)" d="M241.17,31.49c0.72-1.28,1.43-2.56,2.14-3.84c-0.72-1.25-1.44-2.51-2.16-3.77
+ c-1.43,0.02-2.87,0.04-4.3,0.06c-0.71,1.28-1.43,2.56-2.14,3.85c0.72,1.26,1.44,2.52,2.16,3.78
+ C238.3,31.54,239.73,31.51,241.17,31.49z"/>
+<linearGradient id="SVGID_89_" gradientUnits="userSpaceOnUse" x1="-255.4521" y1="-323.8418" x2="-251.0654" y2="-316.2438" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_89_)" d="M241.14,20.24c0.71-1.28,1.43-2.55,2.14-3.82c-0.72-1.26-1.43-2.52-2.16-3.78
+ c-1.43,0.01-2.87,0.02-4.3,0.03c-0.71,1.28-1.43,2.55-2.14,3.83c0.72,1.27,1.44,2.53,2.16,3.79
+ C238.28,20.28,239.71,20.26,241.14,20.24z"/>
+<linearGradient id="SVGID_90_" gradientUnits="userSpaceOnUse" x1="-255.4238" y1="-335.0898" x2="-251.0493" y2="-327.513" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_90_)" d="M241.12,9c0.71-1.27,1.43-2.54,2.14-3.81c-0.72-1.26-1.43-2.53-2.15-3.8c-1.43,0-2.87,0-4.3,0
+ c-0.71,1.27-1.43,2.55-2.14,3.82c0.72,1.27,1.44,2.54,2.15,3.8C238.25,9.01,239.69,9.01,241.12,9z"/>
+<linearGradient id="SVGID_91_" gradientUnits="userSpaceOnUse" x1="-244.3813" y1="-261.1006" x2="-239.9204" y2="-253.374" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_91_)" d="M230.04,83.01c0.72-1.3,1.43-2.61,2.15-3.91c-0.72-1.25-1.44-2.49-2.16-3.74
+ c-1.44,0.05-2.87,0.1-4.31,0.15c-0.71,1.3-1.43,2.61-2.15,3.91c0.72,1.26,1.44,2.51,2.16,3.76
+ C227.16,83.13,228.6,83.07,230.04,83.01z"/>
+<linearGradient id="SVGID_92_" gradientUnits="userSpaceOnUse" x1="-244.356" y1="-272.4121" x2="-239.9077" y2="-264.7075" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_92_)" d="M230.02,71.7c0.71-1.3,1.43-2.6,2.15-3.9c-0.72-1.25-1.44-2.5-2.16-3.75
+ c-1.43,0.04-2.87,0.09-4.3,0.13c-0.72,1.3-1.43,2.6-2.15,3.9c0.72,1.26,1.44,2.52,2.16,3.77C227.15,71.8,228.58,71.75,230.02,71.7z"
+ />
+<linearGradient id="SVGID_93_" gradientUnits="userSpaceOnUse" x1="-244.3325" y1="-283.729" x2="-239.8931" y2="-276.0396" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_93_)" d="M230,60.39c0.71-1.3,1.43-2.59,2.14-3.89c-0.72-1.25-1.44-2.51-2.16-3.77
+ c-1.43,0.04-2.87,0.07-4.3,0.11c-0.71,1.29-1.43,2.59-2.14,3.89c0.72,1.26,1.44,2.52,2.16,3.78C227.13,60.47,228.56,60.43,230,60.39
+ z"/>
+<linearGradient id="SVGID_94_" gradientUnits="userSpaceOnUse" x1="-244.3091" y1="-295.0435" x2="-239.8799" y2="-287.3719" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_94_)" d="M229.98,49.08c0.71-1.29,1.43-2.58,2.14-3.88c-0.72-1.26-1.44-2.52-2.16-3.78
+ c-1.44,0.03-2.87,0.06-4.3,0.08c-0.71,1.29-1.43,2.58-2.14,3.88c0.72,1.27,1.44,2.53,2.16,3.79
+ C227.11,49.14,228.54,49.11,229.98,49.08z"/>
+<linearGradient id="SVGID_95_" gradientUnits="userSpaceOnUse" x1="-244.2842" y1="-306.3579" x2="-239.8657" y2="-298.7049" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_95_)" d="M229.96,37.76c0.71-1.29,1.43-2.58,2.14-3.86c-0.72-1.26-1.44-2.53-2.16-3.79
+ c-1.43,0.02-2.87,0.04-4.3,0.06c-0.71,1.29-1.43,2.58-2.14,3.87c0.72,1.27,1.44,2.54,2.16,3.8
+ C227.09,37.81,228.52,37.79,229.96,37.76z"/>
+<linearGradient id="SVGID_96_" gradientUnits="userSpaceOnUse" x1="-244.2607" y1="-317.6738" x2="-239.8521" y2="-310.0378" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_96_)" d="M229.94,26.45c0.71-1.28,1.43-2.57,2.14-3.85c-0.72-1.27-1.44-2.53-2.16-3.8
+ c-1.43,0.01-2.87,0.03-4.3,0.04c-0.71,1.28-1.43,2.57-2.14,3.85c0.72,1.27,1.44,2.54,2.16,3.81
+ C227.07,26.49,228.5,26.47,229.94,26.45z"/>
+<linearGradient id="SVGID_97_" gradientUnits="userSpaceOnUse" x1="-244.2373" y1="-328.9888" x2="-239.8394" y2="-321.3713" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_97_)" d="M229.92,15.14c0.71-1.28,1.43-2.56,2.14-3.84c-0.72-1.27-1.44-2.54-2.16-3.82
+ c-1.43,0-2.86,0.01-4.3,0.01c-0.71,1.28-1.43,2.56-2.14,3.85c0.72,1.28,1.44,2.55,2.16,3.82C227.05,15.16,228.49,15.15,229.92,15.14
+ z"/>
+<linearGradient id="SVGID_98_" gradientUnits="userSpaceOnUse" x1="-243.1221" y1="-338.3506" x2="-239.853" y2="-332.6884" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_98_)" d="M223.45,0c0.72,1.28,1.43,2.56,2.15,3.83c1.43,0,2.86,0,4.3-0.01c0.71-1.28,1.43-2.55,2.14-3.83
+ C229.18,0,226.31,0,223.45,0z"/>
+<linearGradient id="SVGID_99_" gradientUnits="userSpaceOnUse" x1="-233.478" y1="-255.5127" x2="-230.1138" y2="-249.6856" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_99_)" d="M221.32,84.74c-0.72-1.26-1.44-2.51-2.16-3.77c-1.44,0.04-2.87,0.09-4.31,0.13
+ c-0.72,1.3-1.43,2.61-2.15,3.91C215.58,84.93,218.45,84.84,221.32,84.74z"/>
+<linearGradient id="SVGID_100_" gradientUnits="userSpaceOnUse" x1="-233.5024" y1="-266.855" x2="-229.0454" y2="-259.1352" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_100_)" d="M219.16,77.29c0.71-1.3,1.43-2.61,2.14-3.91c-0.72-1.26-1.44-2.52-2.16-3.78
+ c-1.44,0.04-2.87,0.08-4.31,0.11c-0.72,1.3-1.43,2.6-2.15,3.9c0.72,1.27,1.44,2.53,2.16,3.8C216.29,77.38,217.72,77.34,219.16,77.29
+ z"/>
+<linearGradient id="SVGID_101_" gradientUnits="userSpaceOnUse" x1="-233.4824" y1="-278.2231" x2="-229.0342" y2="-270.5186" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_101_)" d="M219.14,65.93c0.72-1.3,1.43-2.6,2.15-3.9c-0.72-1.26-1.44-2.53-2.16-3.79
+ c-1.44,0.03-2.87,0.06-4.31,0.09c-0.72,1.3-1.43,2.6-2.15,3.9c0.72,1.27,1.44,2.54,2.16,3.81C216.27,66,217.71,65.97,219.14,65.93z"
+ />
+<linearGradient id="SVGID_102_" gradientUnits="userSpaceOnUse" x1="-233.4624" y1="-289.5913" x2="-229.0225" y2="-281.9011" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_102_)" d="M219.12,54.56c0.71-1.29,1.43-2.59,2.15-3.89c-0.72-1.27-1.44-2.53-2.16-3.8
+ c-1.43,0.03-2.87,0.05-4.3,0.07c-0.71,1.29-1.43,2.59-2.15,3.89c0.72,1.27,1.44,2.54,2.16,3.81
+ C216.25,54.62,217.69,54.59,219.12,54.56z"/>
+<linearGradient id="SVGID_103_" gradientUnits="userSpaceOnUse" x1="-233.4443" y1="-300.959" x2="-229.0122" y2="-293.2823" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_103_)" d="M219.11,43.2c0.71-1.29,1.43-2.59,2.15-3.88c-0.72-1.27-1.44-2.54-2.16-3.81
+ c-1.43,0.02-2.87,0.04-4.3,0.06c-0.72,1.29-1.43,2.59-2.15,3.88c0.72,1.28,1.44,2.55,2.16,3.82
+ C216.24,43.24,217.67,43.22,219.11,43.2z"/>
+<linearGradient id="SVGID_104_" gradientUnits="userSpaceOnUse" x1="-233.4233" y1="-312.3262" x2="-229.0005" y2="-304.6656" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_104_)" d="M219.09,31.83c0.71-1.29,1.43-2.58,2.14-3.87c-0.72-1.27-1.44-2.54-2.16-3.82
+ c-1.43,0.01-2.87,0.02-4.3,0.04c-0.71,1.29-1.43,2.58-2.14,3.87c0.72,1.28,1.44,2.55,2.16,3.83
+ C216.23,31.86,217.66,31.85,219.09,31.83z"/>
+<linearGradient id="SVGID_105_" gradientUnits="userSpaceOnUse" x1="-233.4058" y1="-323.6953" x2="-228.9893" y2="-316.0457" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_105_)" d="M219.08,20.46c0.71-1.29,1.43-2.57,2.14-3.86c-0.72-1.28-1.43-2.55-2.15-3.83
+ c-1.43,0.01-2.87,0.01-4.3,0.02c-0.71,1.29-1.43,2.57-2.14,3.86c0.72,1.28,1.44,2.56,2.15,3.84
+ C216.21,20.49,217.64,20.47,219.08,20.46z"/>
+<linearGradient id="SVGID_106_" gradientUnits="userSpaceOnUse" x1="-233.3862" y1="-335.063" x2="-228.979" y2="-327.4294" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_106_)" d="M219.06,9.1c0.71-1.29,1.43-2.57,2.14-3.85c-0.72-1.28-1.44-2.56-2.15-3.84c-1.43,0-2.86,0-4.3,0
+ c-0.71,1.29-1.43,2.57-2.14,3.86c0.72,1.28,1.44,2.56,2.15,3.85C216.2,9.11,217.63,9.1,219.06,9.1z"/>
+<linearGradient id="SVGID_107_" gradientUnits="userSpaceOnUse" x1="-222.2739" y1="-260.4614" x2="-217.8154" y2="-252.7391" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_107_)" d="M207.93,83.72c0.72-1.3,1.43-2.61,2.15-3.91c-0.72-1.27-1.44-2.54-2.16-3.81
+ c-1.44,0.03-2.88,0.06-4.31,0.08c-0.71,1.3-1.43,2.6-2.15,3.9c0.72,1.28,1.44,2.55,2.16,3.82
+ C205.05,83.78,206.49,83.75,207.93,83.72z"/>
+<linearGradient id="SVGID_108_" gradientUnits="userSpaceOnUse" x1="-222.2593" y1="-271.8691" x2="-217.8081" y2="-264.1595" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_108_)" d="M207.92,72.31c0.72-1.3,1.43-2.6,2.15-3.9c-0.72-1.27-1.44-2.54-2.16-3.82
+ c-1.44,0.03-2.87,0.05-4.3,0.07c-0.72,1.3-1.43,2.6-2.15,3.9c0.72,1.28,1.44,2.55,2.16,3.83C205.04,72.37,206.48,72.34,207.92,72.31
+ z"/>
+<linearGradient id="SVGID_109_" gradientUnits="userSpaceOnUse" x1="-222.2451" y1="-283.2788" x2="-217.7993" y2="-275.5785" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_109_)" d="M207.9,60.9c0.72-1.3,1.43-2.6,2.15-3.9c-0.72-1.27-1.44-2.55-2.16-3.82
+ c-1.43,0.02-2.87,0.04-4.3,0.06c-0.72,1.3-1.43,2.59-2.15,3.89c0.72,1.28,1.44,2.56,2.16,3.84C205.03,60.95,206.47,60.92,207.9,60.9
+ z"/>
+<linearGradient id="SVGID_110_" gradientUnits="userSpaceOnUse" x1="-222.231" y1="-294.6875" x2="-217.792" y2="-286.999" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_110_)" d="M207.89,49.49c0.72-1.3,1.43-2.59,2.15-3.89c-0.72-1.27-1.44-2.55-2.16-3.83
+ c-1.43,0.02-2.87,0.03-4.3,0.04c-0.71,1.29-1.43,2.59-2.15,3.88c0.72,1.28,1.44,2.56,2.16,3.84
+ C205.02,49.53,206.46,49.51,207.89,49.49z"/>
+<linearGradient id="SVGID_111_" gradientUnits="userSpaceOnUse" x1="-222.2173" y1="-306.0991" x2="-217.7837" y2="-298.4199" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_111_)" d="M207.88,38.08c0.71-1.29,1.43-2.59,2.15-3.88c-0.72-1.28-1.44-2.56-2.15-3.84
+ c-1.43,0.01-2.87,0.02-4.3,0.03c-0.71,1.29-1.43,2.59-2.15,3.88c0.72,1.28,1.44,2.57,2.15,3.85
+ C205.01,38.11,206.45,38.1,207.88,38.08z"/>
+<linearGradient id="SVGID_112_" gradientUnits="userSpaceOnUse" x1="-222.2036" y1="-317.5083" x2="-217.7754" y2="-309.8384" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_112_)" d="M207.87,26.68c0.72-1.29,1.43-2.58,2.15-3.87c-0.72-1.28-1.44-2.56-2.15-3.84
+ c-1.43,0.01-2.87,0.02-4.3,0.02c-0.72,1.29-1.43,2.58-2.15,3.87c0.72,1.29,1.44,2.57,2.15,3.85C205,26.7,206.43,26.69,207.87,26.68z
+ "/>
+<linearGradient id="SVGID_113_" gradientUnits="userSpaceOnUse" x1="-222.1899" y1="-328.9189" x2="-217.7681" y2="-321.26" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_113_)" d="M207.86,15.27c0.71-1.29,1.43-2.58,2.14-3.87c-0.72-1.28-1.44-2.57-2.15-3.85
+ c-1.43,0-2.87,0-4.3,0.01c-0.72,1.29-1.43,2.58-2.15,3.87c0.72,1.29,1.43,2.57,2.15,3.86C204.99,15.28,206.42,15.27,207.86,15.27z"
+ />
+<linearGradient id="SVGID_114_" gradientUnits="userSpaceOnUse" x1="-221.0752" y1="-338.3481" x2="-217.7915" y2="-332.6606" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_114_)" d="M201.39,0c0.72,1.29,1.43,2.58,2.15,3.86c1.43,0,2.86,0,4.3,0c0.71-1.29,1.43-2.58,2.14-3.86
+ C207.12,0,204.26,0,201.39,0z"/>
+<linearGradient id="SVGID_115_" gradientUnits="userSpaceOnUse" x1="-211.3623" y1="-255.0103" x2="-208.0376" y2="-249.2517" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_115_)" d="M199.21,85.31c-0.72-1.28-1.44-2.55-2.16-3.83c-1.44,0.02-2.87,0.04-4.31,0.05
+ c-0.72,1.3-1.43,2.6-2.15,3.89C193.46,85.39,196.33,85.36,199.21,85.31z"/>
+<linearGradient id="SVGID_116_" gradientUnits="userSpaceOnUse" x1="-211.3921" y1="-266.4248" x2="-206.9434" y2="-258.7194" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_116_)" d="M197.05,77.77c0.72-1.3,1.43-2.6,2.15-3.9c-0.72-1.28-1.44-2.56-2.16-3.84
+ c-1.44,0.02-2.87,0.03-4.31,0.04c-0.72,1.3-1.43,2.59-2.15,3.89c0.72,1.29,1.44,2.57,2.16,3.85
+ C194.18,77.81,195.61,77.79,197.05,77.77z"/>
+<linearGradient id="SVGID_117_" gradientUnits="userSpaceOnUse" x1="-211.3843" y1="-277.8638" x2="-206.939" y2="-270.1643" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_117_)" d="M197.04,66.34c0.72-1.3,1.43-2.6,2.15-3.89c-0.72-1.28-1.44-2.56-2.15-3.84
+ c-1.44,0.02-2.87,0.03-4.31,0.04c-0.72,1.3-1.43,2.59-2.15,3.89c0.72,1.29,1.44,2.57,2.16,3.85
+ C194.17,66.37,195.6,66.35,197.04,66.34z"/>
+<linearGradient id="SVGID_118_" gradientUnits="userSpaceOnUse" x1="-211.3745" y1="-289.2998" x2="-206.9336" y2="-281.6079" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_118_)" d="M197.03,54.9c0.71-1.29,1.43-2.59,2.15-3.89c-0.72-1.28-1.43-2.56-2.15-3.85
+ c-1.44,0.01-2.87,0.02-4.3,0.03c-0.72,1.29-1.43,2.59-2.15,3.88c0.72,1.29,1.44,2.57,2.15,3.86
+ C194.16,54.93,195.6,54.91,197.03,54.9z"/>
+<linearGradient id="SVGID_119_" gradientUnits="userSpaceOnUse" x1="-211.3662" y1="-300.7378" x2="-206.9287" y2="-293.0518" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_119_)" d="M197.03,43.46c0.72-1.29,1.43-2.59,2.15-3.88c-0.72-1.28-1.44-2.57-2.15-3.85
+ c-1.43,0.01-2.87,0.02-4.3,0.03c-0.71,1.29-1.43,2.59-2.15,3.88c0.72,1.29,1.43,2.57,2.15,3.86
+ C194.16,43.48,195.59,43.48,197.03,43.46z"/>
+<linearGradient id="SVGID_120_" gradientUnits="userSpaceOnUse" x1="-211.3569" y1="-312.1753" x2="-206.9238" y2="-304.4969" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_120_)" d="M197.02,32.03c0.71-1.29,1.43-2.59,2.15-3.88c-0.72-1.28-1.43-2.57-2.15-3.86
+ c-1.43,0.01-2.87,0.01-4.3,0.02c-0.71,1.29-1.43,2.59-2.15,3.88c0.72,1.29,1.43,2.58,2.15,3.86
+ C194.15,32.04,195.58,32.03,197.02,32.03z"/>
+<linearGradient id="SVGID_121_" gradientUnits="userSpaceOnUse" x1="-211.3491" y1="-323.6118" x2="-206.9189" y2="-315.9385" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_121_)" d="M197.01,20.59c0.71-1.29,1.43-2.58,2.14-3.88c-0.72-1.29-1.43-2.57-2.15-3.86
+ c-1.43,0-2.87,0.01-4.3,0.01c-0.72,1.29-1.43,2.58-2.15,3.88c0.72,1.29,1.43,2.58,2.15,3.87C194.14,20.6,195.58,20.6,197.01,20.59z"
+ />
+<linearGradient id="SVGID_122_" gradientUnits="userSpaceOnUse" x1="-211.3398" y1="-335.0503" x2="-206.9136" y2="-327.3838" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_122_)" d="M197,9.15c0.71-1.29,1.43-2.58,2.15-3.87c-0.72-1.29-1.44-2.58-2.15-3.87c-1.43,0-2.87,0-4.3,0
+ c-0.71,1.29-1.43,2.58-2.15,3.87c0.72,1.29,1.43,2.58,2.15,3.87C194.13,9.16,195.57,9.16,197,9.15z"/>
+<linearGradient id="SVGID_123_" gradientUnits="userSpaceOnUse" x1="-200.1514" y1="-260.1733" x2="-195.7119" y2="-252.484" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_123_)" d="M185.81,84.04c0.72-1.3,1.43-2.59,2.15-3.89c-0.72-1.29-1.44-2.57-2.15-3.86
+ c-1.44,0.01-2.87,0.01-4.31,0.02c-0.72,1.29-1.44,2.59-2.15,3.88c0.72,1.29,1.43,2.58,2.15,3.87
+ C182.94,84.05,184.37,84.05,185.81,84.04z"/>
+<linearGradient id="SVGID_124_" gradientUnits="userSpaceOnUse" x1="-200.1489" y1="-271.625" x2="-195.7109" y2="-263.9382" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_124_)" d="M185.81,72.59c0.72-1.29,1.44-2.59,2.15-3.89c-0.72-1.29-1.44-2.57-2.15-3.86
+ c-1.43,0.01-2.87,0.01-4.31,0.02c-0.72,1.29-1.44,2.58-2.15,3.88c0.72,1.29,1.44,2.58,2.15,3.87
+ C182.93,72.6,184.37,72.6,185.81,72.59z"/>
+<linearGradient id="SVGID_125_" gradientUnits="userSpaceOnUse" x1="-200.146" y1="-283.0791" x2="-195.7095" y2="-275.3948" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_125_)" d="M185.8,61.13c0.72-1.29,1.43-2.59,2.15-3.88c-0.72-1.29-1.44-2.58-2.15-3.86
+ c-1.44,0-2.87,0.01-4.31,0.01c-0.72,1.29-1.43,2.59-2.15,3.88c0.72,1.29,1.43,2.58,2.15,3.87C182.93,61.15,184.37,61.14,185.8,61.13
+ z"/>
+<linearGradient id="SVGID_126_" gradientUnits="userSpaceOnUse" x1="-200.1416" y1="-294.5293" x2="-195.7075" y2="-286.8492" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_126_)" d="M185.8,49.68c0.72-1.29,1.43-2.59,2.15-3.88c-0.72-1.29-1.44-2.58-2.15-3.86
+ c-1.43,0-2.87,0.01-4.3,0.01c-0.72,1.29-1.43,2.58-2.15,3.87c0.72,1.29,1.43,2.58,2.15,3.87C182.93,49.69,184.37,49.69,185.8,49.68z
+ "/>
+<linearGradient id="SVGID_127_" gradientUnits="userSpaceOnUse" x1="-200.1396" y1="-305.9839" x2="-195.7061" y2="-298.3047" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_127_)" d="M185.8,38.23c0.72-1.29,1.43-2.59,2.15-3.88c-0.72-1.29-1.44-2.58-2.15-3.87
+ c-1.43,0-2.87,0.01-4.3,0.01c-0.72,1.29-1.43,2.58-2.15,3.88c0.72,1.29,1.43,2.58,2.15,3.87C182.93,38.24,184.36,38.24,185.8,38.23z
+ "/>
+<linearGradient id="SVGID_128_" gradientUnits="userSpaceOnUse" x1="-200.1367" y1="-317.4355" x2="-195.7051" y2="-309.7597" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_128_)" d="M185.79,26.78c0.71-1.29,1.43-2.59,2.15-3.88c-0.72-1.29-1.43-2.58-2.15-3.87c-1.43,0-2.87,0-4.3,0
+ c-0.72,1.29-1.43,2.58-2.15,3.88c0.72,1.29,1.43,2.58,2.15,3.87C182.93,26.78,184.36,26.78,185.79,26.78z"/>
+<linearGradient id="SVGID_129_" gradientUnits="userSpaceOnUse" x1="-200.1338" y1="-328.8887" x2="-195.7036" y2="-321.2154" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_129_)" d="M185.79,15.32c0.72-1.29,1.43-2.58,2.15-3.87c-0.72-1.29-1.43-2.58-2.15-3.87c-1.43,0-2.87,0-4.3,0
+ c-0.72,1.29-1.43,2.58-2.15,3.88c0.72,1.29,1.43,2.58,2.15,3.87C182.92,15.33,184.36,15.33,185.79,15.32z"/>
+<linearGradient id="SVGID_130_" gradientUnits="userSpaceOnUse" x1="-199.0234" y1="-338.3462" x2="-195.7349" y2="-332.6502" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_130_)" d="M179.34,0c0.71,1.29,1.43,2.58,2.15,3.88c1.43,0,2.86,0,4.3,0c0.72-1.29,1.43-2.58,2.15-3.87
+ C185.07,0,182.21,0,179.34,0z"/>
+<linearGradient id="SVGID_131_" gradientUnits="userSpaceOnUse" x1="-189.2378" y1="-254.8848" x2="-185.9585" y2="-249.2048" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_131_)" d="M177.09,85.48c-0.72-1.29-1.44-2.59-2.15-3.88c-1.44,0-2.87-0.01-4.31-0.02
+ c-0.72,1.29-1.44,2.57-2.16,3.86C171.34,85.47,174.21,85.48,177.09,85.48z"/>
+<linearGradient id="SVGID_132_" gradientUnits="userSpaceOnUse" x1="-189.2686" y1="-266.3203" x2="-184.8442" y2="-258.6572" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_132_)" d="M174.93,77.9c0.72-1.29,1.44-2.58,2.16-3.87c-0.72-1.29-1.44-2.58-2.15-3.88
+ c-1.44,0-2.87-0.01-4.31-0.02c-0.72,1.29-1.44,2.58-2.15,3.86c0.71,1.3,1.43,2.59,2.15,3.89C172.06,77.89,173.5,77.9,174.93,77.9z"
+ />
+<linearGradient id="SVGID_133_" gradientUnits="userSpaceOnUse" x1="-189.272" y1="-277.7749" x2="-184.8457" y2="-270.1084" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_133_)" d="M174.93,66.44c0.72-1.29,1.44-2.58,2.15-3.87c-0.72-1.29-1.44-2.58-2.15-3.88
+ c-1.43,0-2.87-0.01-4.31-0.01c-0.72,1.29-1.44,2.58-2.15,3.86c0.72,1.29,1.43,2.59,2.15,3.88C172.06,66.44,173.5,66.44,174.93,66.44
+ z"/>
+<linearGradient id="SVGID_134_" gradientUnits="userSpaceOnUse" x1="-189.2744" y1="-289.2305" x2="-184.8472" y2="-281.5623" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_134_)" d="M174.93,54.99c0.72-1.29,1.43-2.58,2.15-3.87c-0.72-1.29-1.44-2.59-2.15-3.88
+ c-1.43,0-2.87-0.01-4.3-0.01c-0.72,1.29-1.43,2.58-2.15,3.87c0.72,1.29,1.44,2.59,2.15,3.88C172.06,54.98,173.5,54.98,174.93,54.99z
+ "/>
+<linearGradient id="SVGID_135_" gradientUnits="userSpaceOnUse" x1="-189.2773" y1="-300.6846" x2="-184.8496" y2="-293.0155" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_135_)" d="M174.94,43.53c0.72-1.29,1.43-2.58,2.15-3.87c-0.72-1.29-1.43-2.58-2.15-3.88
+ c-1.43,0-2.87,0-4.3-0.01c-0.72,1.29-1.43,2.58-2.15,3.87c0.71,1.29,1.43,2.59,2.15,3.88C172.07,43.53,173.5,43.53,174.94,43.53z"/>
+<linearGradient id="SVGID_136_" gradientUnits="userSpaceOnUse" x1="-189.2793" y1="-312.1377" x2="-184.8516" y2="-304.4686" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_136_)" d="M174.94,32.08c0.72-1.29,1.43-2.58,2.15-3.87c-0.72-1.29-1.43-2.58-2.15-3.88
+ c-1.43,0-2.87,0-4.3-0.01c-0.71,1.29-1.43,2.58-2.15,3.87c0.71,1.29,1.43,2.59,2.15,3.88C172.07,32.08,173.5,32.08,174.94,32.08z"/>
+<linearGradient id="SVGID_137_" gradientUnits="userSpaceOnUse" x1="-189.2822" y1="-323.5933" x2="-184.853" y2="-315.9217" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_137_)" d="M174.94,20.62c0.72-1.29,1.43-2.58,2.15-3.88c-0.71-1.29-1.43-2.58-2.15-3.88c-1.43,0-2.87,0-4.3,0
+ c-0.72,1.29-1.43,2.58-2.15,3.87c0.72,1.29,1.43,2.59,2.15,3.88C172.07,20.62,173.5,20.62,174.94,20.62z"/>
+<linearGradient id="SVGID_138_" gradientUnits="userSpaceOnUse" x1="-189.2852" y1="-335.0493" x2="-184.855" y2="-327.376" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_138_)" d="M174.94,9.17c0.72-1.29,1.43-2.58,2.15-3.87c-0.72-1.29-1.43-2.59-2.15-3.88c-1.43,0-2.87,0-4.3,0
+ c-0.72,1.29-1.43,2.58-2.15,3.87c0.71,1.29,1.43,2.58,2.15,3.87C172.07,9.17,173.51,9.17,174.94,9.17z"/>
+<linearGradient id="SVGID_139_" gradientUnits="userSpaceOnUse" x1="-178.0176" y1="-260.2373" x2="-173.6118" y2="-252.6063" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_139_)" d="M163.69,83.98c0.72-1.28,1.44-2.56,2.16-3.85c-0.72-1.3-1.43-2.6-2.15-3.89
+ c-1.44-0.02-2.87-0.03-4.31-0.05c-0.72,1.28-1.44,2.56-2.16,3.84c0.72,1.3,1.44,2.6,2.15,3.9
+ C160.82,83.94,162.25,83.96,163.69,83.98z"/>
+<linearGradient id="SVGID_140_" gradientUnits="userSpaceOnUse" x1="-178.0269" y1="-271.6807" x2="-173.6177" y2="-264.0437" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_140_)" d="M163.7,72.54c0.72-1.28,1.43-2.57,2.15-3.85c-0.72-1.3-1.43-2.59-2.15-3.89
+ c-1.44-0.01-2.87-0.03-4.31-0.04c-0.72,1.28-1.43,2.56-2.15,3.84c0.72,1.3,1.43,2.6,2.15,3.9C160.82,72.5,162.26,72.52,163.7,72.54z
+ "/>
+<linearGradient id="SVGID_141_" gradientUnits="userSpaceOnUse" x1="-178.0342" y1="-283.124" x2="-173.6226" y2="-275.4829" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_141_)" d="M163.7,61.09c0.72-1.28,1.44-2.57,2.15-3.86c-0.72-1.3-1.43-2.59-2.15-3.89
+ c-1.43-0.01-2.87-0.02-4.31-0.04c-0.72,1.28-1.43,2.57-2.15,3.85c0.72,1.3,1.43,2.59,2.15,3.89
+ C160.83,61.07,162.26,61.08,163.7,61.09z"/>
+<linearGradient id="SVGID_142_" gradientUnits="userSpaceOnUse" x1="-178.043" y1="-294.5679" x2="-173.6274" y2="-286.92" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_142_)" d="M163.71,49.65c0.72-1.28,1.44-2.57,2.15-3.86c-0.72-1.29-1.43-2.59-2.15-3.88
+ c-1.43-0.01-2.87-0.02-4.31-0.03c-0.72,1.29-1.43,2.57-2.15,3.85c0.72,1.3,1.43,2.59,2.15,3.89
+ C160.84,49.63,162.27,49.64,163.71,49.65z"/>
+<linearGradient id="SVGID_143_" gradientUnits="userSpaceOnUse" x1="-178.0522" y1="-306.0107" x2="-173.6338" y2="-298.3578" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_143_)" d="M163.71,38.2c0.72-1.29,1.44-2.58,2.15-3.86c-0.72-1.29-1.43-2.59-2.15-3.88
+ c-1.44-0.01-2.87-0.01-4.3-0.02c-0.72,1.29-1.43,2.57-2.15,3.86c0.72,1.29,1.43,2.59,2.15,3.88
+ C160.84,38.19,162.28,38.2,163.71,38.2z"/>
+<linearGradient id="SVGID_144_" gradientUnits="userSpaceOnUse" x1="-178.0601" y1="-317.4526" x2="-173.6396" y2="-309.7963" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_144_)" d="M163.72,26.76c0.72-1.29,1.43-2.58,2.15-3.86c-0.72-1.29-1.43-2.58-2.15-3.88
+ c-1.43,0-2.87-0.01-4.3-0.01c-0.72,1.29-1.43,2.57-2.15,3.86c0.72,1.29,1.43,2.58,2.15,3.88C160.85,26.75,162.28,26.75,163.72,26.76
+ z"/>
+<linearGradient id="SVGID_145_" gradientUnits="userSpaceOnUse" x1="-178.0693" y1="-328.8984" x2="-173.644" y2="-321.2336" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_145_)" d="M163.72,15.31c0.72-1.29,1.43-2.58,2.15-3.87c-0.72-1.29-1.43-2.58-2.15-3.88c-1.43,0-2.87,0-4.3,0
+ c-0.72,1.29-1.43,2.58-2.15,3.86c0.71,1.29,1.43,2.58,2.14,3.87C160.86,15.31,162.29,15.31,163.72,15.31z"/>
+<linearGradient id="SVGID_146_" gradientUnits="userSpaceOnUse" x1="-176.9688" y1="-338.3462" x2="-173.6821" y2="-332.6536" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_146_)" d="M157.29,0c0.71,1.29,1.43,2.58,2.14,3.87c1.43,0,2.87,0,4.3,0c0.72-1.29,1.43-2.58,2.15-3.87
+ C163.02,0,160.15,0,157.29,0z"/>
+<linearGradient id="SVGID_147_" gradientUnits="userSpaceOnUse" x1="-167.1094" y1="-255.1313" x2="-163.8838" y2="-249.5445" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_147_)" d="M154.97,85.27c-0.72-1.3-1.43-2.6-2.15-3.9c-1.44-0.03-2.87-0.06-4.31-0.09
+ c-0.72,1.27-1.44,2.54-2.16,3.81C149.22,85.15,152.09,85.21,154.97,85.27z"/>
+<linearGradient id="SVGID_148_" gradientUnits="userSpaceOnUse" x1="-167.1416" y1="-266.5391" x2="-162.7549" y2="-258.941" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_148_)" d="M152.82,77.67c0.72-1.27,1.44-2.55,2.16-3.83c-0.72-1.3-1.43-2.6-2.15-3.9
+ c-1.44-0.02-2.87-0.05-4.31-0.08c-0.72,1.27-1.44,2.54-2.16,3.81c0.72,1.3,1.43,2.6,2.15,3.9
+ C149.95,77.61,151.38,77.64,152.82,77.67z"/>
+<linearGradient id="SVGID_149_" gradientUnits="userSpaceOnUse" x1="-167.1562" y1="-277.959" x2="-162.7646" y2="-270.3525" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_149_)" d="M152.83,66.25c0.72-1.28,1.44-2.55,2.16-3.83c-0.72-1.3-1.43-2.6-2.15-3.89
+ c-1.43-0.02-2.87-0.04-4.3-0.06c-0.72,1.27-1.44,2.55-2.16,3.82c0.72,1.3,1.43,2.6,2.15,3.9C149.96,66.2,151.39,66.23,152.83,66.25z
+ "/>
+<linearGradient id="SVGID_150_" gradientUnits="userSpaceOnUse" x1="-167.168" y1="-289.3774" x2="-162.772" y2="-281.7634" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_150_)" d="M152.84,54.83c0.72-1.28,1.44-2.56,2.15-3.84c-0.71-1.29-1.43-2.59-2.15-3.89
+ c-1.43-0.02-2.87-0.04-4.3-0.05c-0.72,1.28-1.44,2.55-2.16,3.83c0.72,1.3,1.43,2.59,2.15,3.89
+ C149.97,54.79,151.4,54.81,152.84,54.83z"/>
+<linearGradient id="SVGID_151_" gradientUnits="userSpaceOnUse" x1="-167.1821" y1="-300.7969" x2="-162.7808" y2="-293.1735" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_151_)" d="M152.85,43.4c0.72-1.28,1.44-2.56,2.15-3.84c-0.71-1.3-1.43-2.59-2.15-3.88
+ c-1.43-0.01-2.87-0.03-4.3-0.04c-0.72,1.28-1.44,2.56-2.16,3.83c0.71,1.3,1.43,2.59,2.15,3.88
+ C149.98,43.37,151.41,43.39,152.85,43.4z"/>
+<linearGradient id="SVGID_152_" gradientUnits="userSpaceOnUse" x1="-167.1958" y1="-312.2178" x2="-162.7891" y2="-304.5851" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_152_)" d="M152.86,31.98c0.72-1.28,1.44-2.57,2.15-3.85c-0.71-1.29-1.43-2.59-2.15-3.88
+ c-1.43-0.01-2.87-0.02-4.3-0.03c-0.72,1.28-1.44,2.56-2.15,3.84c0.72,1.29,1.43,2.58,2.15,3.88
+ C149.99,31.96,151.42,31.97,152.86,31.98z"/>
+<linearGradient id="SVGID_153_" gradientUnits="userSpaceOnUse" x1="-167.21" y1="-323.6357" x2="-162.7969" y2="-315.9921" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_153_)" d="M152.87,20.56c0.72-1.29,1.43-2.57,2.15-3.86c-0.72-1.29-1.43-2.58-2.15-3.87
+ c-1.43,0-2.87-0.01-4.3-0.01c-0.72,1.28-1.44,2.57-2.15,3.85c0.71,1.29,1.43,2.58,2.14,3.87C150,20.55,151.44,20.56,152.87,20.56z"
+ />
+<linearGradient id="SVGID_154_" gradientUnits="userSpaceOnUse" x1="-167.2231" y1="-335.0566" x2="-162.8057" y2="-327.4053" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_154_)" d="M152.88,9.14c0.72-1.29,1.43-2.57,2.15-3.86c-0.71-1.29-1.43-2.58-2.14-3.87c-1.43,0-2.86,0-4.3,0
+ c-0.72,1.29-1.43,2.57-2.15,3.86c0.72,1.29,1.43,2.57,2.15,3.86C150.01,9.13,151.45,9.14,152.88,9.14z"/>
+<linearGradient id="SVGID_155_" gradientUnits="userSpaceOnUse" x1="-155.8848" y1="-260.6543" x2="-151.5269" y2="-253.1062" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_155_)" d="M141.58,83.54c0.72-1.26,1.44-2.53,2.16-3.79c-0.72-1.31-1.43-2.61-2.15-3.91
+ c-1.44-0.04-2.87-0.08-4.31-0.12c-0.72,1.26-1.44,2.52-2.16,3.78c0.72,1.3,1.43,2.61,2.15,3.91
+ C138.7,83.45,140.14,83.5,141.58,83.54z"/>
+<linearGradient id="SVGID_156_" gradientUnits="userSpaceOnUse" x1="-155.9028" y1="-272.0366" x2="-151.5381" y2="-264.4767" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_156_)" d="M141.59,72.15c0.72-1.27,1.44-2.53,2.16-3.8c-0.71-1.3-1.43-2.6-2.15-3.9
+ c-1.44-0.03-2.87-0.07-4.31-0.1c-0.72,1.26-1.44,2.52-2.16,3.78c0.71,1.3,1.43,2.6,2.15,3.9C138.72,72.08,140.15,72.12,141.59,72.15
+ z"/>
+<linearGradient id="SVGID_157_" gradientUnits="userSpaceOnUse" x1="-155.9214" y1="-283.4185" x2="-151.5493" y2="-275.8458" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_157_)" d="M141.6,60.77c0.72-1.27,1.44-2.54,2.16-3.81c-0.71-1.3-1.43-2.6-2.15-3.89
+ c-1.43-0.03-2.87-0.05-4.3-0.08c-0.72,1.27-1.44,2.53-2.16,3.8c0.71,1.3,1.43,2.6,2.15,3.89C138.73,60.71,140.17,60.74,141.6,60.77z
+ "/>
+<linearGradient id="SVGID_158_" gradientUnits="userSpaceOnUse" x1="-155.9399" y1="-294.7988" x2="-151.5601" y2="-287.2126" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_158_)" d="M141.62,49.39c0.72-1.27,1.44-2.54,2.16-3.82c-0.72-1.29-1.43-2.59-2.15-3.88
+ c-1.44-0.02-2.87-0.04-4.3-0.07c-0.72,1.27-1.44,2.54-2.16,3.81c0.71,1.29,1.43,2.59,2.14,3.88
+ C138.75,49.33,140.18,49.36,141.62,49.39z"/>
+<linearGradient id="SVGID_159_" gradientUnits="userSpaceOnUse" x1="-155.9604" y1="-306.1821" x2="-151.5728" y2="-298.5824" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_159_)" d="M141.63,38c0.72-1.27,1.44-2.55,2.16-3.83c-0.72-1.29-1.43-2.59-2.15-3.88
+ c-1.44-0.01-2.87-0.03-4.3-0.05c-0.72,1.27-1.44,2.54-2.16,3.82c0.71,1.29,1.43,2.58,2.15,3.87C138.76,37.96,140.2,37.98,141.63,38z
+ "/>
+<linearGradient id="SVGID_160_" gradientUnits="userSpaceOnUse" x1="-155.9785" y1="-317.5605" x2="-151.5845" y2="-309.9498" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_160_)" d="M141.65,26.62c0.72-1.28,1.44-2.55,2.16-3.83c-0.72-1.29-1.43-2.58-2.15-3.87
+ c-1.43-0.01-2.87-0.02-4.3-0.03c-0.72,1.28-1.44,2.55-2.15,3.82c0.71,1.29,1.43,2.57,2.14,3.86
+ C138.78,26.59,140.21,26.6,141.65,26.62z"/>
+<linearGradient id="SVGID_161_" gradientUnits="userSpaceOnUse" x1="-155.9971" y1="-328.9438" x2="-151.5952" y2="-321.3196" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_161_)" d="M141.66,15.24c0.72-1.28,1.44-2.56,2.16-3.84c-0.71-1.29-1.43-2.57-2.14-3.86
+ c-1.43,0-2.87-0.01-4.3-0.01c-0.72,1.28-1.44,2.56-2.15,3.83c0.71,1.28,1.43,2.57,2.14,3.85C138.79,15.22,140.23,15.23,141.66,15.24
+ z"/>
+<linearGradient id="SVGID_162_" gradientUnits="userSpaceOnUse" x1="-154.9106" y1="-338.3506" x2="-151.6333" y2="-332.6741" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_162_)" d="M135.24,0c0.71,1.28,1.43,2.56,2.14,3.84c1.43,0,2.87,0,4.3,0.01c0.72-1.28,1.44-2.57,2.15-3.85
+ C140.96,0,138.1,0,135.24,0z"/>
+<linearGradient id="SVGID_163_" gradientUnits="userSpaceOnUse" x1="-144.9844" y1="-255.7524" x2="-141.8208" y2="-250.273" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_163_)" d="M132.85,84.67c-0.72-1.31-1.43-2.61-2.15-3.91c-1.44-0.05-2.87-0.11-4.31-0.16
+ c-0.72,1.25-1.44,2.49-2.16,3.74C127.11,84.45,129.98,84.56,132.85,84.67z"/>
+<linearGradient id="SVGID_164_" gradientUnits="userSpaceOnUse" x1="-145.0103" y1="-267.0806" x2="-140.6787" y2="-259.5781" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_164_)" d="M130.71,77.08c0.72-1.25,1.44-2.51,2.16-3.76c-0.72-1.3-1.43-2.6-2.15-3.9
+ c-1.44-0.05-2.87-0.09-4.31-0.14c-0.72,1.25-1.44,2.5-2.16,3.75c0.71,1.3,1.43,2.6,2.14,3.91
+ C127.84,76.98,129.28,77.03,130.71,77.08z"/>
+<linearGradient id="SVGID_165_" gradientUnits="userSpaceOnUse" x1="-145.0361" y1="-278.4165" x2="-140.6929" y2="-270.8938" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_165_)" d="M130.73,65.75c0.72-1.26,1.44-2.51,2.16-3.78c-0.72-1.3-1.43-2.59-2.15-3.89
+ c-1.44-0.04-2.87-0.07-4.31-0.12c-0.72,1.25-1.44,2.51-2.16,3.76c0.71,1.29,1.43,2.59,2.15,3.89
+ C127.86,65.66,129.29,65.71,130.73,65.75z"/>
+<linearGradient id="SVGID_166_" gradientUnits="userSpaceOnUse" x1="-145.0601" y1="-289.7476" x2="-140.7085" y2="-282.2104" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_166_)" d="M130.75,54.41c0.72-1.26,1.44-2.52,2.16-3.79c-0.71-1.3-1.43-2.59-2.14-3.88
+ c-1.44-0.03-2.87-0.06-4.3-0.09c-0.72,1.26-1.44,2.52-2.16,3.77c0.71,1.29,1.43,2.58,2.14,3.88
+ C127.88,54.34,129.31,54.38,130.75,54.41z"/>
+<linearGradient id="SVGID_167_" gradientUnits="userSpaceOnUse" x1="-145.0835" y1="-301.0791" x2="-140.7217" y2="-293.5242" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_167_)" d="M130.77,43.08c0.72-1.26,1.44-2.53,2.16-3.8c-0.71-1.29-1.43-2.58-2.14-3.87
+ c-1.43-0.02-2.87-0.05-4.3-0.07c-0.72,1.26-1.44,2.52-2.16,3.79c0.71,1.29,1.43,2.58,2.14,3.87
+ C127.9,43.02,129.33,43.05,130.77,43.08z"/>
+<linearGradient id="SVGID_168_" gradientUnits="userSpaceOnUse" x1="-145.1064" y1="-312.4102" x2="-140.7358" y2="-304.8401" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_168_)" d="M130.79,31.74c0.72-1.27,1.44-2.54,2.16-3.81c-0.72-1.29-1.43-2.58-2.14-3.86
+ c-1.43-0.02-2.87-0.03-4.3-0.05c-0.72,1.27-1.44,2.53-2.16,3.8c0.71,1.28,1.43,2.57,2.14,3.86
+ C127.92,31.7,129.35,31.72,130.79,31.74z"/>
+<linearGradient id="SVGID_169_" gradientUnits="userSpaceOnUse" x1="-145.1304" y1="-323.7427" x2="-140.75" y2="-316.1556" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_169_)" d="M130.8,20.41c0.72-1.27,1.44-2.54,2.15-3.82c-0.71-1.28-1.43-2.57-2.14-3.85
+ c-1.43-0.01-2.87-0.02-4.3-0.03c-0.72,1.27-1.44,2.54-2.16,3.81c0.72,1.28,1.43,2.56,2.14,3.84
+ C127.94,20.38,129.37,20.39,130.8,20.41z"/>
+<linearGradient id="SVGID_170_" gradientUnits="userSpaceOnUse" x1="-145.1538" y1="-335.0757" x2="-140.7642" y2="-327.4726" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_170_)" d="M130.82,9.07c0.72-1.27,1.44-2.55,2.15-3.83c-0.71-1.28-1.43-2.56-2.14-3.84c-1.43,0-2.86,0-4.3,0
+ c-0.72,1.28-1.44,2.55-2.16,3.82c0.71,1.27,1.43,2.55,2.14,3.83C127.95,9.06,129.39,9.07,130.82,9.07z"/>
+<linearGradient id="SVGID_171_" gradientUnits="userSpaceOnUse" x1="-133.7466" y1="-261.4253" x2="-129.4541" y2="-253.9905" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_171_)" d="M119.47,82.71c0.72-1.24,1.44-2.48,2.16-3.72c-0.71-1.3-1.43-2.6-2.14-3.91
+ c-1.43-0.06-2.87-0.12-4.3-0.19c-0.72,1.24-1.44,2.47-2.16,3.7c0.71,1.3,1.43,2.6,2.14,3.91C116.6,82.58,118.03,82.65,119.47,82.71z
+ "/>
+<linearGradient id="SVGID_172_" gradientUnits="userSpaceOnUse" x1="-133.7759" y1="-272.6929" x2="-129.4712" y2="-265.2369" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_172_)" d="M119.49,71.44c0.72-1.24,1.44-2.48,2.16-3.73c-0.72-1.3-1.43-2.59-2.15-3.89
+ c-1.43-0.05-2.87-0.1-4.3-0.16c-0.72,1.24-1.44,2.48-2.16,3.71c0.71,1.3,1.43,2.59,2.14,3.89
+ C116.62,71.33,118.06,71.38,119.49,71.44z"/>
+<linearGradient id="SVGID_173_" gradientUnits="userSpaceOnUse" x1="-133.8062" y1="-283.9609" x2="-129.4893" y2="-276.4839" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_173_)" d="M119.51,60.17c0.72-1.25,1.44-2.5,2.16-3.75c-0.71-1.3-1.43-2.59-2.14-3.88
+ c-1.43-0.04-2.87-0.08-4.3-0.13c-0.72,1.25-1.44,2.49-2.16,3.73c0.71,1.29,1.43,2.58,2.14,3.88
+ C116.64,60.07,118.08,60.12,119.51,60.17z"/>
+<linearGradient id="SVGID_174_" gradientUnits="userSpaceOnUse" x1="-133.8359" y1="-295.2256" x2="-129.5078" y2="-287.7291" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_174_)" d="M119.53,48.9c0.72-1.25,1.44-2.5,2.16-3.76c-0.71-1.29-1.43-2.58-2.14-3.87
+ c-1.43-0.03-2.87-0.07-4.3-0.1c-0.72,1.25-1.44,2.5-2.16,3.74c0.71,1.29,1.43,2.57,2.14,3.86C116.66,48.82,118.1,48.86,119.53,48.9z
+ "/>
+<linearGradient id="SVGID_175_" gradientUnits="userSpaceOnUse" x1="-133.8643" y1="-306.4946" x2="-129.5234" y2="-298.9761" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_175_)" d="M119.56,37.63c0.72-1.25,1.44-2.51,2.15-3.77c-0.71-1.29-1.43-2.57-2.14-3.85
+ c-1.43-0.02-2.87-0.05-4.3-0.07c-0.72,1.26-1.44,2.51-2.16,3.76c0.71,1.28,1.43,2.56,2.14,3.85
+ C116.69,37.56,118.12,37.6,119.56,37.63z"/>
+<linearGradient id="SVGID_176_" gradientUnits="userSpaceOnUse" x1="-133.8916" y1="-317.7617" x2="-129.5396" y2="-310.2238" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_176_)" d="M119.58,26.35c0.72-1.26,1.44-2.52,2.16-3.79c-0.71-1.28-1.43-2.56-2.14-3.84
+ c-1.43-0.02-2.87-0.03-4.3-0.05c-0.72,1.26-1.44,2.52-2.16,3.78c0.71,1.28,1.43,2.55,2.14,3.83
+ C116.71,26.31,118.14,26.33,119.58,26.35z"/>
+<linearGradient id="SVGID_177_" gradientUnits="userSpaceOnUse" x1="-133.9194" y1="-329.0303" x2="-129.5552" y2="-321.4712" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_177_)" d="M119.6,15.08c0.72-1.27,1.44-2.53,2.16-3.8c-0.71-1.28-1.43-2.55-2.14-3.83
+ c-1.43,0-2.87-0.01-4.3-0.02c-0.72,1.27-1.44,2.53-2.15,3.79c0.71,1.27,1.43,2.54,2.14,3.82C116.73,15.06,118.16,15.07,119.6,15.08z
+ "/>
+<linearGradient id="SVGID_178_" gradientUnits="userSpaceOnUse" x1="-132.8477" y1="-338.3555" x2="-129.5874" y2="-332.7086" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_178_)" d="M113.18,0c0.71,1.27,1.42,2.53,2.14,3.8c1.43,0,2.87,0,4.3,0.01c0.72-1.27,1.44-2.54,2.16-3.81
+ C118.91,0,116.05,0,113.18,0z"/>
+<linearGradient id="SVGID_179_" gradientUnits="userSpaceOnUse" x1="-122.8516" y1="-256.7583" x2="-119.7583" y2="-251.4006" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_179_)" d="M110.75,83.67c-0.72-1.3-1.43-2.61-2.14-3.9c-1.43-0.08-2.87-0.15-4.3-0.24
+ c-0.72,1.22-1.44,2.44-2.16,3.65C105.01,83.35,107.88,83.52,110.75,83.67z"/>
+<linearGradient id="SVGID_180_" gradientUnits="userSpaceOnUse" x1="-122.8828" y1="-267.9502" x2="-118.6206" y2="-260.5678" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_180_)" d="M108.62,76.14c0.72-1.23,1.44-2.46,2.16-3.69c-0.71-1.3-1.43-2.59-2.14-3.89
+ c-1.44-0.07-2.87-0.13-4.3-0.2c-0.72,1.22-1.44,2.45-2.16,3.67c0.72,1.29,1.43,2.59,2.14,3.89C105.75,76,107.18,76.07,108.62,76.14z
+ "/>
+<linearGradient id="SVGID_181_" gradientUnits="userSpaceOnUse" x1="-122.916" y1="-279.1445" x2="-118.6392" y2="-271.7368" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_181_)" d="M108.64,64.95c0.72-1.23,1.44-2.47,2.16-3.7c-0.71-1.29-1.43-2.59-2.14-3.88
+ c-1.43-0.05-2.87-0.11-4.3-0.17c-0.72,1.23-1.44,2.46-2.16,3.68c0.71,1.29,1.43,2.58,2.14,3.87
+ C105.77,64.82,107.21,64.89,108.64,64.95z"/>
+<linearGradient id="SVGID_182_" gradientUnits="userSpaceOnUse" x1="-122.9473" y1="-290.3364" x2="-118.6567" y2="-282.905" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_182_)" d="M108.67,53.75c0.72-1.24,1.44-2.48,2.16-3.72c-0.71-1.29-1.43-2.57-2.14-3.86
+ c-1.43-0.04-2.87-0.09-4.3-0.13c-0.72,1.24-1.44,2.47-2.16,3.7c0.71,1.28,1.43,2.57,2.14,3.85C105.8,53.65,107.23,53.7,108.67,53.75
+ z"/>
+<linearGradient id="SVGID_183_" gradientUnits="userSpaceOnUse" x1="-122.98" y1="-301.5293" x2="-118.6748" y2="-294.0725" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_183_)" d="M108.69,42.55c0.72-1.24,1.44-2.49,2.16-3.73c-0.71-1.28-1.43-2.56-2.14-3.84
+ c-1.43-0.03-2.87-0.07-4.3-0.1c-0.72,1.24-1.44,2.48-2.16,3.72c0.71,1.28,1.43,2.55,2.14,3.84
+ C105.82,42.47,107.25,42.51,108.69,42.55z"/>
+<linearGradient id="SVGID_184_" gradientUnits="userSpaceOnUse" x1="-123.0132" y1="-312.7188" x2="-118.6953" y2="-305.24" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_184_)" d="M108.71,31.35c0.72-1.25,1.44-2.5,2.16-3.75c-0.71-1.28-1.43-2.55-2.14-3.82
+ c-1.43-0.02-2.87-0.05-4.3-0.07c-0.72,1.25-1.44,2.49-2.16,3.73c0.71,1.27,1.43,2.54,2.14,3.82
+ C105.85,31.29,107.28,31.33,108.71,31.35z"/>
+<linearGradient id="SVGID_185_" gradientUnits="userSpaceOnUse" x1="-123.0459" y1="-323.9121" x2="-118.7134" y2="-316.408" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_185_)" d="M108.74,20.16c0.72-1.25,1.44-2.51,2.16-3.76c-0.71-1.27-1.43-2.54-2.14-3.81
+ c-1.43-0.01-2.87-0.02-4.3-0.04c-0.72,1.26-1.44,2.5-2.16,3.75c0.71,1.26,1.43,2.53,2.14,3.8C105.87,20.12,107.3,20.14,108.74,20.16
+ z"/>
+<linearGradient id="SVGID_186_" gradientUnits="userSpaceOnUse" x1="-123.0781" y1="-335.1045" x2="-118.7324" y2="-327.5775" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_186_)" d="M108.76,8.96c0.72-1.26,1.44-2.52,2.16-3.78c-0.71-1.26-1.43-2.53-2.14-3.79c-1.43,0-2.87,0-4.3,0
+ c-0.72,1.26-1.44,2.51-2.16,3.77c0.71,1.26,1.43,2.52,2.14,3.78C105.9,8.94,107.33,8.95,108.76,8.96z"/>
+<linearGradient id="SVGID_187_" gradientUnits="userSpaceOnUse" x1="-111.6235" y1="-262.5454" x2="-107.4111" y2="-255.2493" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_187_)" d="M97.38,81.5c0.72-1.21,1.44-2.41,2.16-3.63c-0.71-1.3-1.43-2.59-2.14-3.88
+ c-1.44-0.08-2.87-0.17-4.3-0.25c-0.72,1.21-1.44,2.41-2.16,3.61c0.71,1.29,1.42,2.59,2.14,3.88C94.51,81.32,95.95,81.41,97.38,81.5z
+ "/>
+<linearGradient id="SVGID_188_" gradientUnits="userSpaceOnUse" x1="-111.6582" y1="-273.647" x2="-107.4292" y2="-266.3221" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_188_)" d="M97.41,70.4c0.72-1.21,1.44-2.43,2.16-3.65c-0.71-1.29-1.43-2.58-2.14-3.87
+ c-1.43-0.07-2.87-0.14-4.3-0.22c-0.72,1.21-1.44,2.42-2.16,3.62c0.71,1.29,1.43,2.57,2.14,3.86C94.54,70.24,95.97,70.32,97.41,70.4z
+ "/>
+<linearGradient id="SVGID_189_" gradientUnits="userSpaceOnUse" x1="-111.6929" y1="-284.749" x2="-107.4473" y2="-277.3954" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_189_)" d="M97.43,59.29c0.72-1.22,1.44-2.44,2.16-3.67c-0.71-1.28-1.43-2.57-2.14-3.85
+ c-1.43-0.06-2.87-0.12-4.3-0.18c-0.72,1.22-1.44,2.43-2.16,3.65c0.71,1.28,1.43,2.56,2.14,3.84C94.57,59.16,96,59.22,97.43,59.29z"
+ />
+<linearGradient id="SVGID_190_" gradientUnits="userSpaceOnUse" x1="-111.7285" y1="-295.8501" x2="-107.4668" y2="-288.4686" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_190_)" d="M97.46,48.18c0.72-1.22,1.44-2.45,2.16-3.68c-0.71-1.28-1.43-2.55-2.14-3.83
+ c-1.43-0.05-2.87-0.09-4.3-0.14c-0.72,1.22-1.44,2.45-2.16,3.67c0.71,1.27,1.43,2.55,2.14,3.82C94.59,48.07,96.03,48.13,97.46,48.18
+ z"/>
+<linearGradient id="SVGID_191_" gradientUnits="userSpaceOnUse" x1="-111.7642" y1="-306.9541" x2="-107.4854" y2="-299.543" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_191_)" d="M97.49,37.08c0.72-1.23,1.44-2.46,2.16-3.7c-0.71-1.27-1.42-2.54-2.14-3.81
+ c-1.43-0.03-2.87-0.06-4.3-0.1c-0.72,1.23-1.44,2.46-2.16,3.68c0.71,1.27,1.43,2.53,2.14,3.8C94.62,36.99,96.05,37.04,97.49,37.08z"
+ />
+<linearGradient id="SVGID_192_" gradientUnits="userSpaceOnUse" x1="-111.7983" y1="-318.0527" x2="-107.5044" y2="-310.6154" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_192_)" d="M97.51,25.97c0.72-1.24,1.44-2.48,2.16-3.72c-0.72-1.27-1.43-2.53-2.14-3.79
+ c-1.43-0.02-2.87-0.04-4.3-0.06c-0.72,1.24-1.44,2.47-2.16,3.7c0.71,1.26,1.43,2.52,2.14,3.78C94.65,25.91,96.08,25.94,97.51,25.97z
+ "/>
+<linearGradient id="SVGID_193_" gradientUnits="userSpaceOnUse" x1="-111.8354" y1="-329.1562" x2="-107.5239" y2="-321.6885" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_193_)" d="M97.54,14.86c0.72-1.25,1.44-2.49,2.16-3.74c-0.71-1.26-1.43-2.52-2.14-3.78
+ c-1.43-0.01-2.87-0.01-4.3-0.02c-0.72,1.24-1.44,2.49-2.16,3.72c0.71,1.25,1.42,2.51,2.14,3.76C94.67,14.83,96.11,14.85,97.54,14.86
+ z"/>
+<linearGradient id="SVGID_194_" gradientUnits="userSpaceOnUse" x1="-110.7812" y1="-338.3633" x2="-107.5464" y2="-332.7603" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_194_)" d="M91.13,0c0.71,1.25,1.43,2.5,2.14,3.74c1.43,0,2.87,0.01,4.3,0.01C98.28,2.51,99,1.25,99.72,0
+ C96.86,0,93.99,0,91.13,0z"/>
+<linearGradient id="SVGID_195_" gradientUnits="userSpaceOnUse" x1="-100.7314" y1="-258.1406" x2="-97.7163" y2="-252.9183" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_195_)" d="M88.67,82.29c-0.71-1.3-1.43-2.59-2.14-3.88c-1.43-0.1-2.87-0.2-4.3-0.31
+ c-0.72,1.18-1.44,2.37-2.16,3.54C82.94,81.87,85.8,82.08,88.67,82.29z"/>
+<linearGradient id="SVGID_196_" gradientUnits="userSpaceOnUse" x1="-100.7686" y1="-269.1406" x2="-96.5928" y2="-261.908" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_196_)" d="M86.54,74.85c0.72-1.19,1.44-2.39,2.16-3.59c-0.71-1.29-1.43-2.57-2.14-3.86
+ c-1.43-0.09-2.87-0.17-4.3-0.26c-0.72,1.19-1.44,2.38-2.16,3.56c0.71,1.28,1.43,2.57,2.14,3.85C83.67,74.66,85.11,74.75,86.54,74.85
+ z"/>
+<linearGradient id="SVGID_197_" gradientUnits="userSpaceOnUse" x1="-100.8052" y1="-280.1421" x2="-96.6094" y2="-272.8748" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_197_)" d="M86.57,63.84c0.72-1.2,1.44-2.4,2.16-3.61c-0.71-1.28-1.43-2.56-2.14-3.84
+ c-1.43-0.07-2.87-0.15-4.3-0.22c-0.72,1.2-1.44,2.39-2.16,3.59c0.71,1.27,1.43,2.55,2.14,3.83C83.7,63.68,85.13,63.76,86.57,63.84z"
+ />
+<linearGradient id="SVGID_198_" gradientUnits="userSpaceOnUse" x1="-100.8433" y1="-291.1426" x2="-96.6304" y2="-283.8456" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_198_)" d="M86.6,52.84c0.72-1.21,1.44-2.42,2.16-3.63c-0.71-1.27-1.43-2.54-2.14-3.82
+ c-1.43-0.06-2.87-0.12-4.3-0.18c-0.72,1.21-1.44,2.41-2.16,3.61c0.71,1.27,1.43,2.54,2.14,3.81C83.73,52.7,85.16,52.77,86.6,52.84z"
+ />
+<linearGradient id="SVGID_199_" gradientUnits="userSpaceOnUse" x1="-100.8804" y1="-302.145" x2="-96.6479" y2="-294.8142" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_199_)" d="M86.62,41.83c0.72-1.21,1.44-2.43,2.16-3.65c-0.71-1.27-1.43-2.53-2.14-3.8
+ c-1.43-0.04-2.87-0.09-4.3-0.13c-0.72,1.21-1.44,2.43-2.16,3.63c0.71,1.26,1.43,2.52,2.14,3.79C83.76,41.72,85.19,41.78,86.62,41.83
+ z"/>
+<linearGradient id="SVGID_200_" gradientUnits="userSpaceOnUse" x1="-100.9175" y1="-313.145" x2="-96.667" y2="-305.783" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_200_)" d="M86.65,30.82c0.72-1.22,1.44-2.44,2.16-3.67c-0.71-1.26-1.43-2.52-2.14-3.78
+ c-1.43-0.03-2.87-0.06-4.3-0.09c-0.72,1.22-1.44,2.44-2.16,3.65c0.71,1.25,1.43,2.51,2.14,3.76C83.79,30.74,85.22,30.78,86.65,30.82
+ z"/>
+<linearGradient id="SVGID_201_" gradientUnits="userSpaceOnUse" x1="-100.9561" y1="-324.1465" x2="-96.6865" y2="-316.7514" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_201_)" d="M86.68,19.82c0.72-1.23,1.44-2.46,2.16-3.69c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.02-2.87-0.03-4.3-0.05c-0.72,1.23-1.44,2.46-2.16,3.67c0.71,1.25,1.43,2.49,2.14,3.74C83.81,19.77,85.25,19.79,86.68,19.82
+ z"/>
+<linearGradient id="SVGID_202_" gradientUnits="userSpaceOnUse" x1="-100.9922" y1="-335.146" x2="-96.7056" y2="-327.7213" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_202_)" d="M86.71,8.81c0.72-1.24,1.44-2.47,2.16-3.71c-0.71-1.25-1.43-2.49-2.14-3.73
+ c-1.43,0-2.86,0-4.3-0.01c-0.72,1.23-1.44,2.47-2.16,3.7c0.71,1.24,1.42,2.48,2.14,3.72C83.84,8.79,85.27,8.8,86.71,8.81z"/>
+<linearGradient id="SVGID_203_" gradientUnits="userSpaceOnUse" x1="-89.5137" y1="-264.0156" x2="-85.3979" y2="-256.887" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_203_)" d="M75.32,79.91c0.72-1.17,1.44-2.34,2.16-3.52c-0.71-1.28-1.43-2.57-2.14-3.85
+ c-1.43-0.11-2.87-0.21-4.3-0.32c-0.72,1.17-1.44,2.33-2.16,3.49c0.71,1.28,1.42,2.56,2.14,3.84C72.45,79.68,73.88,79.8,75.32,79.91z
+ "/>
+<linearGradient id="SVGID_204_" gradientUnits="userSpaceOnUse" x1="-89.5513" y1="-274.9004" x2="-85.4146" y2="-267.7354" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_204_)" d="M75.34,69.02c0.72-1.18,1.44-2.36,2.16-3.54c-0.71-1.28-1.42-2.55-2.14-3.82
+ c-1.43-0.09-2.87-0.18-4.3-0.27c-0.72,1.17-1.44,2.35-2.16,3.52c0.71,1.27,1.42,2.54,2.14,3.82C72.48,68.82,73.91,68.92,75.34,69.02
+ z"/>
+<linearGradient id="SVGID_205_" gradientUnits="userSpaceOnUse" x1="-89.5903" y1="-285.7837" x2="-85.4336" y2="-278.584" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_205_)" d="M75.37,58.13c0.72-1.19,1.44-2.37,2.16-3.57c-0.71-1.27-1.43-2.54-2.14-3.8
+ c-1.43-0.08-2.86-0.15-4.3-0.23c-0.72,1.18-1.44,2.37-2.16,3.54c0.71,1.26,1.43,2.53,2.14,3.79C72.51,57.96,73.94,58.05,75.37,58.13
+ z"/>
+<linearGradient id="SVGID_206_" gradientUnits="userSpaceOnUse" x1="-89.6284" y1="-296.668" x2="-85.4502" y2="-289.4311" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_206_)" d="M75.4,47.24c0.72-1.19,1.44-2.39,2.16-3.59c-0.71-1.26-1.43-2.52-2.14-3.78
+ c-1.43-0.06-2.86-0.12-4.3-0.18c-0.72,1.19-1.44,2.38-2.16,3.57c0.71,1.25,1.43,2.51,2.14,3.77C72.53,47.1,73.97,47.17,75.4,47.24z"
+ />
+<linearGradient id="SVGID_207_" gradientUnits="userSpaceOnUse" x1="-89.6689" y1="-307.5522" x2="-85.4692" y2="-300.2781" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_207_)" d="M75.43,36.35c0.72-1.2,1.44-2.41,2.16-3.61c-0.71-1.25-1.42-2.51-2.14-3.75
+ c-1.43-0.04-2.87-0.08-4.3-0.13c-0.72,1.2-1.44,2.4-2.16,3.59c0.71,1.25,1.42,2.49,2.14,3.74C72.56,36.25,73.99,36.3,75.43,36.35z"
+ />
+<linearGradient id="SVGID_208_" gradientUnits="userSpaceOnUse" x1="-89.7065" y1="-318.436" x2="-85.4863" y2="-311.1264" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_208_)" d="M75.46,25.46c0.72-1.21,1.44-2.42,2.16-3.64c-0.71-1.24-1.43-2.49-2.14-3.73
+ c-1.43-0.02-2.87-0.05-4.3-0.08c-0.72,1.21-1.44,2.41-2.16,3.61c0.71,1.24,1.43,2.48,2.14,3.72C72.59,25.39,74.02,25.43,75.46,25.46
+ z"/>
+<linearGradient id="SVGID_209_" gradientUnits="userSpaceOnUse" x1="-89.7466" y1="-329.3203" x2="-85.5044" y2="-321.9726" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_209_)" d="M75.48,14.57c0.72-1.22,1.44-2.44,2.16-3.66c-0.71-1.24-1.43-2.47-2.14-3.71
+ c-1.43-0.01-2.87-0.02-4.3-0.03c-0.72,1.22-1.44,2.43-2.16,3.64c0.71,1.23,1.43,2.46,2.14,3.69C72.62,14.53,74.05,14.55,75.48,14.57
+ z"/>
+<linearGradient id="SVGID_210_" gradientUnits="userSpaceOnUse" x1="-88.7231" y1="-338.3652" x2="-85.522" y2="-332.8206" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_210_)" d="M69.07,0c0.71,1.22,1.43,2.44,2.14,3.67c1.43,0.01,2.87,0.01,4.3,0.02
+ c0.72-1.23,1.44-2.45,2.16-3.68C74.8,0,71.94,0,69.07,0z"/>
+<linearGradient id="SVGID_211_" gradientUnits="userSpaceOnUse" x1="-78.6309" y1="-259.8955" x2="-75.7031" y2="-254.8245" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_211_)" d="M66.62,80.52c-0.71-1.28-1.43-2.56-2.14-3.83c-1.43-0.13-2.86-0.25-4.29-0.38
+ c-0.72,1.14-1.44,2.28-2.15,3.42C60.89,80,63.75,80.26,66.62,80.52z"/>
+<linearGradient id="SVGID_212_" gradientUnits="userSpaceOnUse" x1="-78.6694" y1="-270.6533" x2="-74.5952" y2="-263.5966" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_212_)" d="M64.49,73.2c0.72-1.15,1.44-2.31,2.16-3.47c-0.71-1.27-1.43-2.54-2.14-3.81
+ c-1.43-0.11-2.86-0.21-4.29-0.33c-0.72,1.15-1.44,2.3-2.15,3.45c0.71,1.26,1.42,2.53,2.14,3.8C61.63,72.96,63.06,73.08,64.49,73.2z"
+ />
+<linearGradient id="SVGID_213_" gradientUnits="userSpaceOnUse" x1="-78.7085" y1="-281.4111" x2="-74.6104" y2="-274.3129" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_213_)" d="M64.52,62.44c0.72-1.16,1.44-2.33,2.16-3.5c-0.71-1.26-1.42-2.52-2.14-3.78
+ c-1.43-0.09-2.86-0.18-4.3-0.27c-0.72,1.16-1.44,2.32-2.15,3.47c0.71,1.25,1.42,2.51,2.14,3.77C61.65,62.23,63.08,62.33,64.52,62.44
+ z"/>
+<linearGradient id="SVGID_214_" gradientUnits="userSpaceOnUse" x1="-78.7466" y1="-292.1685" x2="-74.6265" y2="-285.0322" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_214_)" d="M64.54,51.67c0.72-1.17,1.44-2.35,2.16-3.53c-0.71-1.25-1.42-2.51-2.14-3.75
+ c-1.43-0.07-2.86-0.15-4.3-0.22c-0.72,1.17-1.44,2.34-2.16,3.5c0.71,1.24,1.42,2.49,2.14,3.75C61.68,51.5,63.11,51.59,64.54,51.67z"
+ />
+<linearGradient id="SVGID_215_" gradientUnits="userSpaceOnUse" x1="-78.7861" y1="-302.9268" x2="-74.6421" y2="-295.7491" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_215_)" d="M64.57,40.91c0.72-1.18,1.44-2.36,2.16-3.55c-0.71-1.25-1.43-2.49-2.14-3.73
+ c-1.43-0.05-2.86-0.11-4.29-0.17c-0.72,1.18-1.44,2.36-2.16,3.53c0.71,1.24,1.43,2.48,2.14,3.72
+ C61.71,40.77,63.14,40.84,64.57,40.91z"/>
+<linearGradient id="SVGID_216_" gradientUnits="userSpaceOnUse" x1="-78.8252" y1="-313.6831" x2="-74.6592" y2="-306.4673" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_216_)" d="M64.6,30.14c0.72-1.19,1.44-2.38,2.16-3.58c-0.71-1.24-1.43-2.47-2.14-3.7
+ c-1.43-0.04-2.86-0.08-4.3-0.11c-0.72,1.19-1.44,2.37-2.16,3.55c0.71,1.23,1.42,2.46,2.14,3.69C61.74,30.04,63.17,30.09,64.6,30.14z
+ "/>
+<linearGradient id="SVGID_217_" gradientUnits="userSpaceOnUse" x1="-78.8643" y1="-324.4409" x2="-74.6738" y2="-317.1829" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_217_)" d="M64.63,19.38c0.72-1.2,1.44-2.4,2.16-3.6c-0.71-1.23-1.43-2.46-2.14-3.68
+ c-1.43-0.02-2.86-0.04-4.3-0.06c-0.72,1.2-1.44,2.39-2.16,3.58c0.71,1.22,1.43,2.44,2.14,3.66C61.76,19.32,63.19,19.35,64.63,19.38z
+ "/>
+<linearGradient id="SVGID_218_" gradientUnits="userSpaceOnUse" x1="-78.9038" y1="-335.1973" x2="-74.6914" y2="-327.9012" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_218_)" d="M64.65,8.62c0.72-1.21,1.44-2.42,2.16-3.63c-0.71-1.22-1.43-2.44-2.14-3.65
+ c-1.43,0-2.87,0-4.3-0.01c-0.72,1.21-1.44,2.41-2.16,3.61c0.71,1.21,1.42,2.42,2.14,3.63C61.79,8.59,63.22,8.6,64.65,8.62z"/>
+<linearGradient id="SVGID_219_" gradientUnits="userSpaceOnUse" x1="-67.4243" y1="-265.8389" x2="-63.4219" y2="-258.9064" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_219_)" d="M53.28,77.94c0.72-1.13,1.44-2.26,2.15-3.39c-0.71-1.27-1.42-2.53-2.14-3.79
+ c-1.43-0.13-2.86-0.26-4.29-0.39c-0.72,1.13-1.43,2.25-2.15,3.36c0.71,1.26,1.42,2.52,2.14,3.78C50.42,77.66,51.85,77.8,53.28,77.94
+ z"/>
+<linearGradient id="SVGID_220_" gradientUnits="userSpaceOnUse" x1="-67.4619" y1="-276.4507" x2="-63.4351" y2="-269.476" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_220_)" d="M53.3,67.32c0.72-1.14,1.44-2.28,2.15-3.42c-0.71-1.26-1.43-2.51-2.14-3.76
+ c-1.43-0.11-2.86-0.22-4.29-0.33c-0.72,1.13-1.44,2.27-2.15,3.39c0.71,1.25,1.42,2.5,2.13,3.75C50.44,67.07,51.88,67.2,53.3,67.32z"
+ />
+<linearGradient id="SVGID_221_" gradientUnits="userSpaceOnUse" x1="-67.4995" y1="-287.0659" x2="-63.4458" y2="-280.0447" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_221_)" d="M53.33,56.7c0.72-1.15,1.44-2.3,2.15-3.45c-0.71-1.25-1.42-2.49-2.14-3.73
+ c-1.43-0.09-2.86-0.18-4.29-0.27c-0.72,1.14-1.44,2.28-2.15,3.42c0.71,1.24,1.43,2.48,2.14,3.72C50.47,56.49,51.9,56.59,53.33,56.7z
+ "/>
+<linearGradient id="SVGID_222_" gradientUnits="userSpaceOnUse" x1="-67.5376" y1="-297.6787" x2="-63.46" y2="-290.616" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_222_)" d="M53.36,46.08c0.72-1.16,1.44-2.32,2.15-3.48c-0.71-1.24-1.43-2.47-2.14-3.71
+ c-1.43-0.07-2.86-0.14-4.29-0.21c-0.72,1.16-1.44,2.31-2.16,3.45c0.71,1.23,1.42,2.46,2.14,3.69
+ C50.49,45.91,51.93,45.99,53.36,46.08z"/>
+<linearGradient id="SVGID_223_" gradientUnits="userSpaceOnUse" x1="-67.5767" y1="-308.2935" x2="-63.4722" y2="-301.1843" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_223_)" d="M53.38,35.46c0.72-1.17,1.44-2.33,2.16-3.51c-0.71-1.23-1.42-2.46-2.14-3.68
+ c-1.43-0.05-2.86-0.1-4.29-0.15c-0.72,1.16-1.44,2.32-2.16,3.48c0.71,1.22,1.42,2.44,2.14,3.66C50.52,35.33,51.95,35.39,53.38,35.46
+ z"/>
+<linearGradient id="SVGID_224_" gradientUnits="userSpaceOnUse" x1="-67.6147" y1="-318.9062" x2="-63.4854" y2="-311.7539" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_224_)" d="M53.41,24.83c0.72-1.17,1.44-2.35,2.16-3.54c-0.71-1.22-1.42-2.43-2.14-3.65
+ c-1.43-0.03-2.86-0.06-4.29-0.1c-0.72,1.17-1.44,2.34-2.16,3.51c0.71,1.21,1.43,2.42,2.14,3.63C50.54,24.74,51.98,24.79,53.41,24.83
+ z"/>
+<linearGradient id="SVGID_225_" gradientUnits="userSpaceOnUse" x1="-67.6523" y1="-329.52" x2="-63.4971" y2="-322.3229" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_225_)" d="M53.43,14.21c0.72-1.19,1.44-2.37,2.16-3.57c-0.71-1.21-1.42-2.42-2.14-3.62
+ c-1.43-0.01-2.86-0.03-4.3-0.04c-0.72,1.19-1.44,2.37-2.16,3.54c0.71,1.2,1.43,2.4,2.14,3.6C50.57,14.16,52,14.19,53.43,14.21z"/>
+<linearGradient id="SVGID_226_" gradientUnits="userSpaceOnUse" x1="-66.6709" y1="-338.3662" x2="-63.5103" y2="-332.8918" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_226_)" d="M47.02,0c0.71,1.19,1.43,2.38,2.14,3.57c1.43,0,2.87,0.01,4.3,0.02C54.18,2.4,54.89,1.2,55.62,0
+ C52.75,0,49.89,0,47.02,0z"/>
+<linearGradient id="SVGID_227_" gradientUnits="userSpaceOnUse" x1="-56.5552" y1="-262.0264" x2="-53.7236" y2="-257.122" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_227_)" d="M44.6,78.36c-0.71-1.26-1.42-2.52-2.14-3.77c-1.43-0.15-2.86-0.3-4.29-0.45
+ c-0.72,1.1-1.43,2.19-2.15,3.28C38.88,77.73,41.74,78.05,44.6,78.36z"/>
+<linearGradient id="SVGID_228_" gradientUnits="userSpaceOnUse" x1="-56.5918" y1="-272.4888" x2="-52.6367" y2="-265.6384" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_228_)" d="M42.47,71.2c0.72-1.11,1.43-2.22,2.15-3.34c-0.71-1.25-1.42-2.5-2.14-3.74
+ c-1.43-0.13-2.86-0.26-4.29-0.39c-0.71,1.11-1.43,2.21-2.15,3.31c0.71,1.24,1.42,2.48,2.13,3.73C39.61,70.91,41.04,71.05,42.47,71.2
+ z"/>
+<linearGradient id="SVGID_229_" gradientUnits="userSpaceOnUse" x1="-56.627" y1="-282.9502" x2="-52.644" y2="-276.0516" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_229_)" d="M42.49,60.73c0.72-1.12,1.43-2.24,2.15-3.37c-0.71-1.24-1.42-2.48-2.14-3.71
+ c-1.43-0.11-2.86-0.21-4.29-0.33c-0.71,1.12-1.43,2.23-2.15,3.34c0.71,1.23,1.42,2.46,2.13,3.7C39.63,60.48,41.06,60.6,42.49,60.73z
+ "/>
+<linearGradient id="SVGID_230_" gradientUnits="userSpaceOnUse" x1="-56.6636" y1="-293.4126" x2="-52.6523" y2="-286.4649" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_230_)" d="M42.51,50.26c0.72-1.13,1.44-2.26,2.15-3.4c-0.71-1.23-1.43-2.46-2.14-3.68
+ c-1.43-0.09-2.86-0.17-4.29-0.26c-0.72,1.13-1.43,2.25-2.15,3.38c0.71,1.22,1.43,2.44,2.14,3.66
+ C39.65,50.05,41.08,50.16,42.51,50.26z"/>
+<linearGradient id="SVGID_231_" gradientUnits="userSpaceOnUse" x1="-56.7002" y1="-303.875" x2="-52.6606" y2="-296.8783" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_231_)" d="M42.54,39.79c0.72-1.14,1.44-2.29,2.15-3.43c-0.71-1.22-1.42-2.44-2.14-3.65
+ c-1.43-0.06-2.86-0.13-4.29-0.2c-0.72,1.14-1.43,2.28-2.15,3.41c0.71,1.21,1.42,2.42,2.14,3.63C39.68,39.63,41.11,39.71,42.54,39.79
+ z"/>
+<linearGradient id="SVGID_232_" gradientUnits="userSpaceOnUse" x1="-56.7358" y1="-314.3369" x2="-52.668" y2="-307.2912" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_232_)" d="M42.56,29.32c0.72-1.15,1.44-2.31,2.15-3.46c-0.71-1.21-1.43-2.41-2.14-3.62
+ c-1.43-0.04-2.86-0.09-4.3-0.13c-0.72,1.15-1.43,2.3-2.15,3.44c0.71,1.2,1.43,2.4,2.14,3.6C39.7,29.2,41.13,29.26,42.56,29.32z"/>
+<linearGradient id="SVGID_233_" gradientUnits="userSpaceOnUse" x1="-56.7715" y1="-324.7979" x2="-52.6758" y2="-317.7039" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_233_)" d="M42.58,18.85c0.72-1.16,1.44-2.33,2.15-3.5c-0.71-1.2-1.42-2.39-2.14-3.59
+ c-1.43-0.02-2.87-0.05-4.3-0.07c-0.72,1.16-1.44,2.32-2.15,3.47c0.71,1.19,1.43,2.37,2.14,3.57C39.72,18.77,41.15,18.81,42.58,18.85
+ z"/>
+<linearGradient id="SVGID_234_" gradientUnits="userSpaceOnUse" x1="-56.8086" y1="-335.2598" x2="-52.686" y2="-328.1193" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_234_)" d="M42.6,8.38c0.72-1.17,1.44-2.35,2.16-3.53c-0.71-1.19-1.43-2.38-2.14-3.56c-1.43,0-2.86,0-4.3-0.01
+ c-0.72,1.17-1.44,2.34-2.15,3.5c0.71,1.17,1.43,2.35,2.14,3.53C39.74,8.34,41.17,8.36,42.6,8.38z"/>
+<linearGradient id="SVGID_235_" gradientUnits="userSpaceOnUse" x1="-45.3628" y1="-268.0112" x2="-41.4912" y2="-261.3055" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_235_)" d="M31.28,75.58c0.72-1.08,1.43-2.16,2.15-3.25c-0.71-1.24-1.42-2.48-2.14-3.72
+ c-1.43-0.15-2.85-0.3-4.28-0.46c-0.72,1.08-1.43,2.15-2.14,3.21c0.71,1.23,1.42,2.47,2.13,3.71C28.43,75.25,29.85,75.42,31.28,75.58
+ z"/>
+<linearGradient id="SVGID_236_" gradientUnits="userSpaceOnUse" x1="-45.395" y1="-278.3027" x2="-41.4917" y2="-271.542" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_236_)" d="M31.3,65.28c0.72-1.09,1.43-2.18,2.15-3.28c-0.71-1.23-1.42-2.46-2.14-3.69
+ c-1.43-0.13-2.86-0.26-4.29-0.39c-0.72,1.09-1.43,2.17-2.15,3.25c0.71,1.22,1.42,2.44,2.13,3.67C28.44,64.99,29.87,65.14,31.3,65.28
+ z"/>
+<linearGradient id="SVGID_237_" gradientUnits="userSpaceOnUse" x1="-45.4272" y1="-288.5952" x2="-41.4937" y2="-281.782" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_237_)" d="M31.32,54.98c0.72-1.1,1.43-2.21,2.15-3.32c-0.71-1.22-1.42-2.44-2.14-3.65
+ c-1.43-0.11-2.86-0.21-4.29-0.32c-0.71,1.1-1.43,2.19-2.15,3.28c0.71,1.21,1.43,2.42,2.14,3.64C28.46,54.74,29.89,54.86,31.32,54.98
+ z"/>
+<linearGradient id="SVGID_238_" gradientUnits="userSpaceOnUse" x1="-45.459" y1="-298.8857" x2="-41.4961" y2="-292.0218" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_238_)" d="M31.33,44.68c0.72-1.11,1.43-2.23,2.15-3.35c-0.71-1.21-1.42-2.41-2.14-3.62
+ c-1.43-0.08-2.86-0.17-4.29-0.25c-0.72,1.11-1.43,2.22-2.15,3.32c0.71,1.2,1.43,2.4,2.14,3.6C28.48,44.49,29.91,44.58,31.33,44.68z"
+ />
+<linearGradient id="SVGID_239_" gradientUnits="userSpaceOnUse" x1="-45.4922" y1="-309.1777" x2="-41.499" y2="-302.2614" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_239_)" d="M31.35,34.38c0.72-1.12,1.43-2.25,2.15-3.38c-0.71-1.2-1.43-2.39-2.14-3.58
+ c-1.43-0.06-2.86-0.12-4.29-0.18c-0.72,1.12-1.43,2.24-2.15,3.36c0.71,1.18,1.43,2.37,2.14,3.56
+ C28.49,34.23,29.92,34.31,31.35,34.38z"/>
+<linearGradient id="SVGID_240_" gradientUnits="userSpaceOnUse" x1="-45.5244" y1="-319.4678" x2="-41.5015" y2="-312.4998" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_240_)" d="M31.37,24.08c0.71-1.13,1.43-2.27,2.15-3.42c-0.71-1.19-1.43-2.37-2.14-3.55
+ c-1.43-0.04-2.86-0.07-4.29-0.11c-0.72,1.13-1.44,2.26-2.15,3.39c0.71,1.17,1.43,2.35,2.14,3.53
+ C28.51,23.97,29.94,24.03,31.37,24.08z"/>
+<linearGradient id="SVGID_241_" gradientUnits="userSpaceOnUse" x1="-45.5576" y1="-329.7598" x2="-41.5039" y2="-322.7385" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_241_)" d="M31.39,13.78c0.72-1.15,1.44-2.29,2.15-3.45c-0.71-1.17-1.43-2.35-2.14-3.52
+ c-1.43-0.01-2.86-0.03-4.3-0.05c-0.72,1.15-1.44,2.29-2.15,3.43c0.71,1.16,1.43,2.33,2.14,3.5C28.53,13.72,29.96,13.75,31.39,13.78z
+ "/>
+<linearGradient id="SVGID_242_" gradientUnits="userSpaceOnUse" x1="-44.6172" y1="-338.3657" x2="-41.5068" y2="-332.9784" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_242_)" d="M24.97,0c0.71,1.15,1.43,2.3,2.14,3.46c1.43,0.01,2.87,0.02,4.3,0.03
+ c0.72-1.16,1.44-2.32,2.15-3.48C30.7,0,27.83,0,24.97,0z"/>
+<linearGradient id="SVGID_243_" gradientUnits="userSpaceOnUse" x1="-34.5127" y1="-264.5337" x2="-31.7847" y2="-259.8086" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_243_)" d="M22.61,75.8c-0.71-1.23-1.42-2.46-2.13-3.69c-1.42-0.17-2.85-0.35-4.28-0.53
+ c-0.71,1.05-1.43,2.08-2.14,3.12C16.91,75.08,19.76,75.45,22.61,75.8z"/>
+<linearGradient id="SVGID_244_" gradientUnits="userSpaceOnUse" x1="-34.54" y1="-274.6479" x2="-30.7202" y2="-268.0318" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_244_)" d="M20.48,68.84c0.72-1.06,1.43-2.12,2.15-3.19c-0.71-1.22-1.42-2.44-2.13-3.66
+ c-1.43-0.15-2.85-0.3-4.28-0.45c-0.71,1.06-1.43,2.11-2.14,3.15c0.71,1.21,1.42,2.42,2.14,3.64C17.63,68.51,19.06,68.67,20.48,68.84
+ z"/>
+<linearGradient id="SVGID_245_" gradientUnits="userSpaceOnUse" x1="-34.5679" y1="-284.7627" x2="-30.7153" y2="-278.0899" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_245_)" d="M20.5,58.72c0.72-1.07,1.43-2.15,2.14-3.23c-0.71-1.21-1.42-2.42-2.14-3.62
+ c-1.43-0.13-2.86-0.25-4.29-0.38c-0.71,1.07-1.43,2.13-2.14,3.19c0.71,1.2,1.43,2.4,2.14,3.6C17.64,58.43,19.07,58.57,20.5,58.72z"
+ />
+<linearGradient id="SVGID_246_" gradientUnits="userSpaceOnUse" x1="-34.5952" y1="-294.874" x2="-30.7109" y2="-288.1463" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_246_)" d="M20.51,48.59c0.71-1.08,1.43-2.17,2.15-3.26c-0.71-1.2-1.43-2.39-2.14-3.58
+ c-1.43-0.1-2.86-0.2-4.29-0.31c-0.71,1.08-1.43,2.16-2.14,3.23c0.71,1.18,1.42,2.38,2.14,3.57C17.65,48.36,19.08,48.48,20.51,48.59z
+ "/>
+<linearGradient id="SVGID_247_" gradientUnits="userSpaceOnUse" x1="-34.6221" y1="-304.9878" x2="-30.7056" y2="-298.2042" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_247_)" d="M20.52,38.47c0.71-1.1,1.43-2.2,2.15-3.3c-0.71-1.19-1.42-2.37-2.14-3.55
+ c-1.43-0.08-2.86-0.15-4.29-0.23c-0.71,1.09-1.43,2.18-2.15,3.27c0.71,1.17,1.42,2.35,2.14,3.53
+ C17.66,38.28,19.09,38.38,20.52,38.47z"/>
+<linearGradient id="SVGID_248_" gradientUnits="userSpaceOnUse" x1="-34.6523" y1="-315.1035" x2="-30.7021" y2="-308.2616" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_248_)" d="M20.53,28.35c0.72-1.11,1.43-2.22,2.15-3.33c-0.71-1.17-1.43-2.35-2.14-3.51
+ c-1.43-0.05-2.86-0.1-4.29-0.16c-0.72,1.11-1.43,2.21-2.15,3.31c0.71,1.16,1.43,2.32,2.14,3.49C17.67,28.21,19.1,28.28,20.53,28.35z
+ "/>
+<linearGradient id="SVGID_249_" gradientUnits="userSpaceOnUse" x1="-34.6782" y1="-325.2178" x2="-30.6943" y2="-318.3175" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_249_)" d="M20.55,18.23c0.71-1.12,1.43-2.24,2.15-3.37c-0.71-1.16-1.43-2.32-2.14-3.48
+ c-1.43-0.03-2.87-0.06-4.3-0.08c-0.72,1.12-1.43,2.23-2.15,3.34c0.71,1.15,1.43,2.3,2.14,3.46C17.68,18.14,19.12,18.18,20.55,18.23z
+ "/>
+<linearGradient id="SVGID_250_" gradientUnits="userSpaceOnUse" x1="-34.707" y1="-335.332" x2="-30.6909" y2="-328.3759" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_250_)" d="M20.56,8.1c0.72-1.13,1.43-2.26,2.15-3.4C22,3.54,21.28,2.4,20.57,1.25c-1.43,0-2.87-0.01-4.3-0.01
+ c-0.72,1.13-1.43,2.26-2.15,3.38c0.72,1.13,1.43,2.27,2.14,3.42C17.7,8.06,19.13,8.08,20.56,8.1z"/>
+<linearGradient id="SVGID_251_" gradientUnits="userSpaceOnUse" x1="-23.334" y1="-270.5356" x2="-19.6069" y2="-264.0802" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_251_)" d="M9.33,72.84c0.71-1.02,1.42-2.05,2.14-3.09c-0.71-1.21-1.42-2.42-2.14-3.63
+ c-1.43-0.17-2.85-0.35-4.28-0.53c-0.71,1.02-1.42,2.04-2.14,3.05c0.71,1.2,1.43,2.4,2.14,3.61C6.48,72.46,7.9,72.65,9.33,72.84z"/>
+<linearGradient id="SVGID_252_" gradientUnits="userSpaceOnUse" x1="-23.355" y1="-280.4526" x2="-19.5942" y2="-273.9388" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_252_)" d="M9.33,62.92c0.71-1.04,1.43-2.08,2.14-3.13c-0.71-1.2-1.42-2.4-2.14-3.59
+ c-1.43-0.15-2.85-0.3-4.28-0.45c-0.71,1.04-1.43,2.06-2.14,3.09c0.71,1.19,1.43,2.38,2.14,3.57C6.48,62.58,7.9,62.75,9.33,62.92z"/>
+<linearGradient id="SVGID_253_" gradientUnits="userSpaceOnUse" x1="-23.376" y1="-290.3691" x2="-19.5801" y2="-283.7945" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_253_)" d="M9.33,52.99c0.71-1.05,1.42-2.1,2.14-3.17c-0.71-1.19-1.42-2.37-2.14-3.55
+ c-1.43-0.12-2.85-0.25-4.28-0.37C4.34,46.95,3.63,48,2.92,49.04c0.71,1.17,1.43,2.35,2.14,3.53C6.48,52.71,7.91,52.85,9.33,52.99z"
+ />
+<linearGradient id="SVGID_254_" gradientUnits="userSpaceOnUse" x1="-23.396" y1="-300.2866" x2="-19.5649" y2="-293.651" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_254_)" d="M9.34,43.06c0.71-1.06,1.43-2.13,2.14-3.2c-0.71-1.17-1.42-2.34-2.14-3.51
+ c-1.43-0.1-2.85-0.19-4.29-0.29c-0.71,1.06-1.43,2.12-2.14,3.17c0.72,1.16,1.43,2.32,2.14,3.49C6.49,42.84,7.91,42.95,9.34,43.06z"
+ />
+<linearGradient id="SVGID_255_" gradientUnits="userSpaceOnUse" x1="-23.4194" y1="-310.2041" x2="-19.5522" y2="-303.506" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_255_)" d="M9.34,33.14c0.72-1.08,1.43-2.16,2.15-3.24c-0.71-1.16-1.43-2.32-2.14-3.47
+ c-1.43-0.07-2.86-0.14-4.29-0.21c-0.71,1.08-1.43,2.15-2.14,3.21c0.71,1.15,1.43,2.29,2.14,3.45C6.49,32.96,7.91,33.05,9.34,33.14z"
+ />
+<linearGradient id="SVGID_256_" gradientUnits="userSpaceOnUse" x1="-23.438" y1="-320.1191" x2="-19.5381" y2="-313.3643" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_256_)" d="M9.35,23.21c0.72-1.09,1.43-2.18,2.15-3.28c-0.71-1.15-1.43-2.29-2.14-3.43
+ c-1.43-0.04-2.86-0.09-4.29-0.13c-0.71,1.09-1.43,2.17-2.14,3.25c0.72,1.13,1.43,2.27,2.14,3.41C6.49,23.09,7.92,23.15,9.35,23.21z"
+ />
+<linearGradient id="SVGID_257_" gradientUnits="userSpaceOnUse" x1="-23.4614" y1="-330.0376" x2="-19.5244" y2="-323.2185" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_257_)" d="M9.35,13.28c0.72-1.1,1.43-2.21,2.15-3.32c-0.71-1.14-1.43-2.27-2.14-3.4
+ C7.92,6.55,6.5,6.53,5.06,6.52c-0.71,1.1-1.43,2.2-2.15,3.29c0.72,1.12,1.43,2.24,2.14,3.37C6.49,13.21,7.92,13.25,9.35,13.28z"/>
+<linearGradient id="SVGID_258_" gradientUnits="userSpaceOnUse" x1="-22.5654" y1="-338.3662" x2="-19.5107" y2="-333.0753" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+</linearGradient>
+<path fill="url(#SVGID_258_)" d="M2.92,0c0.71,1.11,1.43,2.22,2.15,3.33c1.44,0.01,2.86,0.02,4.3,0.03
+ c0.72-1.11,1.43-2.23,2.15-3.36C8.65,0,5.78,0,2.92,0z"/>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_topbar_horisontal_636x96px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_topbar_horisontal_636x96px.svg
new file mode 100644
index 0000000000..0a3efd8111
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_topbar_horisontal_636x96px.svg
@@ -0,0 +1,4060 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="636px" height="96px" viewBox="0 0 636 96" enable-background="new 0 0 636 96" xml:space="preserve">
+<g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="367.2852" y1="-98.1338" x2="268.8617" y2="172.2825">
+ <stop offset="0" style="stop-color:#2BD5FF"/>
+ <stop offset="0.3516" style="stop-color:#80E6FF"/>
+ <stop offset="0.9176" style="stop-color:#28C4EB"/>
+ </linearGradient>
+ <path fill="url(#SVGID_1_)" d="M464.28,86.13c0.34,0,0.68,0,1.02,0c0,0,92.78,0.9,170.84-12.08V-0.28H464.28H182.14h-182v74.75
+ c0,0,81.49,11.57,182,11.65H464.28z"/>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="329.376" y1="19.6938" x2="309.3868" y2="133.0578">
+ <stop offset="0" style="stop-color:#2BD5FF"/>
+ <stop offset="0.9176" style="stop-color:#28C6ED"/>
+ </linearGradient>
+ <path fill="url(#SVGID_2_)" d="M465.68,85.81c-0.41,0-283.53,0.32-283.53,0.32v-0.32C81.73,85.71,0.34,74.16,0.34,74.16l-0.02,4.41
+ c0,0,80.84,13.35,180.79,13.55v0.01c380.6,8.1,454.93-0.01,454.93-0.01l0.1-18.33C558.16,86.7,465.68,85.81,465.68,85.81z"/>
+
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-363.0977" y1="-269.0723" x2="-359.7446" y2="-263.2646" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_3_)" d="M631.02,70.41c-0.71-0.97-1.42-1.95-2.12-2.93c-1.42,0.18-2.83,0.37-4.25,0.54
+ c-0.71,1.17-1.41,2.34-2.12,3.52C625.36,71.17,628.19,70.79,631.02,70.41z"/>
+
+ <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-363.0767" y1="-278.5928" x2="-359.0044" y2="-271.5394" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_4_)" d="M628.9,64.4c0.71-1.16,1.41-2.32,2.12-3.47c-0.71-0.98-1.42-1.97-2.12-2.96
+ c-1.42,0.16-2.83,0.31-4.25,0.47c-0.71,1.16-1.41,2.32-2.12,3.48c0.71,1.01,1.42,2.01,2.13,3C626.06,64.75,627.48,64.58,628.9,64.4
+ z"/>
+
+ <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-363.0591" y1="-288.1143" x2="-359.0181" y2="-281.115" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_5_)" d="M628.9,54.89c0.71-1.15,1.42-2.29,2.12-3.43c-0.71-1-1.42-2-2.13-3c-1.42,0.13-2.84,0.26-4.25,0.39
+ c-0.71,1.14-1.42,2.29-2.13,3.45c0.71,1.02,1.42,2.03,2.13,3.04C626.06,55.19,627.48,55.04,628.9,54.89z"/>
+
+ <linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-363.041" y1="-297.6362" x2="-359.0332" y2="-290.6945" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_6_)" d="M628.89,45.38c0.71-1.13,1.42-2.26,2.13-3.39c-0.71-1.01-1.42-2.02-2.13-3.04
+ c-1.42,0.11-2.84,0.21-4.26,0.32c-0.71,1.13-1.42,2.27-2.13,3.41c0.71,1.03,1.42,2.05,2.13,3.07
+ C626.06,45.62,627.48,45.5,628.89,45.38z"/>
+
+ <linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-363.02" y1="-307.1558" x2="-359.0444" y2="-300.2698" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_7_)" d="M628.89,35.87c0.71-1.12,1.42-2.24,2.13-3.35c-0.71-1.02-1.42-2.05-2.13-3.08
+ c-1.42,0.08-2.84,0.16-4.26,0.24c-0.71,1.12-1.42,2.24-2.13,3.37c0.71,1.04,1.42,2.08,2.13,3.12
+ C626.05,36.06,627.47,35.97,628.89,35.87z"/>
+
+ <linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="-363.0029" y1="-316.6782" x2="-359.0586" y2="-309.8464" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_8_)" d="M628.89,26.36c0.71-1.11,1.42-2.21,2.13-3.31c-0.71-1.04-1.42-2.08-2.13-3.12
+ c-1.42,0.06-2.84,0.11-4.27,0.16c-0.71,1.11-1.42,2.22-2.13,3.34c0.71,1.05,1.42,2.1,2.13,3.15
+ C626.05,26.5,627.47,26.43,628.89,26.36z"/>
+
+ <linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="-362.9824" y1="-326.1982" x2="-359.0698" y2="-319.4214" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_9_)" d="M628.89,16.85c0.71-1.1,1.42-2.19,2.13-3.28c-0.71-1.05-1.42-2.1-2.13-3.16
+ c-1.42,0.03-2.85,0.06-4.27,0.08c-0.71,1.1-1.42,2.2-2.13,3.3c0.71,1.07,1.42,2.13,2.13,3.19
+ C626.04,16.94,627.47,16.89,628.89,16.85z"/>
+
+ <linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="-362.9653" y1="-335.7188" x2="-359.0854" y2="-328.9986" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_10_)" d="M628.89,7.33c0.71-1.08,1.42-2.16,2.13-3.23c-0.71-1.06-1.42-2.13-2.13-3.2
+ c-1.43,0-2.85,0.01-4.27,0.01c-0.71,1.08-1.42,2.17-2.13,3.26c0.71,1.08,1.42,2.15,2.13,3.22C626.04,7.38,627.46,7.35,628.89,7.33z
+ "/>
+
+ <linearGradient id="SVGID_11_" gradientUnits="userSpaceOnUse" x1="-352.021" y1="-272.1646" x2="-347.8901" y2="-265.0097" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_11_)" d="M617.82,70.94c0.71-1.18,1.41-2.36,2.12-3.54c-0.71-1.01-1.42-2.02-2.13-3.03
+ c-1.42,0.16-2.83,0.32-4.25,0.47c-0.71,1.18-1.41,2.36-2.12,3.55c0.71,1.02,1.42,2.04,2.13,3.06
+ C614.98,71.29,616.4,71.12,617.82,70.94z"/>
+
+ <linearGradient id="SVGID_12_" gradientUnits="userSpaceOnUse" x1="-351.9932" y1="-281.8779" x2="-347.8936" y2="-274.7772" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_12_)" d="M617.8,61.24c0.71-1.17,1.42-2.34,2.12-3.5c-0.71-1.02-1.42-2.04-2.13-3.07
+ c-1.42,0.14-2.84,0.27-4.26,0.4c-0.71,1.17-1.42,2.34-2.12,3.52c0.71,1.04,1.42,2.07,2.13,3.1
+ C614.97,61.54,616.39,61.39,617.8,61.24z"/>
+
+ <linearGradient id="SVGID_13_" gradientUnits="userSpaceOnUse" x1="-351.9683" y1="-291.5947" x2="-347.8979" y2="-284.5447" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_13_)" d="M617.79,51.53c0.71-1.16,1.42-2.31,2.12-3.46c-0.71-1.03-1.42-2.07-2.13-3.1
+ c-1.42,0.11-2.84,0.22-4.26,0.33c-0.71,1.16-1.41,2.32-2.12,3.48c0.71,1.05,1.42,2.09,2.13,3.13
+ C614.96,51.79,616.38,51.66,617.79,51.53z"/>
+
+ <linearGradient id="SVGID_14_" gradientUnits="userSpaceOnUse" x1="-351.9429" y1="-301.3062" x2="-347.9033" y2="-294.3094" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_14_)" d="M617.78,41.83c0.71-1.15,1.42-2.29,2.13-3.43c-0.71-1.04-1.42-2.09-2.13-3.14
+ c-1.42,0.09-2.84,0.17-4.26,0.26c-0.71,1.14-1.42,2.29-2.12,3.45c0.71,1.06,1.42,2.12,2.13,3.17
+ C614.94,42.04,616.37,41.93,617.78,41.83z"/>
+
+ <linearGradient id="SVGID_15_" gradientUnits="userSpaceOnUse" x1="-351.9175" y1="-311.022" x2="-347.9077" y2="-304.0768" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_15_)" d="M617.78,32.12c0.71-1.13,1.42-2.26,2.13-3.39c-0.71-1.05-1.42-2.11-2.14-3.17
+ c-1.42,0.06-2.84,0.13-4.26,0.19c-0.71,1.13-1.42,2.27-2.13,3.41c0.71,1.07,1.42,2.14,2.13,3.2
+ C614.93,32.28,616.36,32.2,617.78,32.12z"/>
+
+ <linearGradient id="SVGID_16_" gradientUnits="userSpaceOnUse" x1="-351.8921" y1="-320.7388" x2="-347.9116" y2="-313.8444" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_16_)" d="M617.77,22.42c0.71-1.12,1.42-2.24,2.13-3.36c-0.71-1.06-1.42-2.14-2.13-3.21
+ c-1.42,0.04-2.85,0.08-4.27,0.12c-0.71,1.12-1.42,2.25-2.13,3.38c0.71,1.08,1.42,2.16,2.14,3.24
+ C614.92,22.53,616.34,22.47,617.77,22.42z"/>
+
+ <linearGradient id="SVGID_17_" gradientUnits="userSpaceOnUse" x1="-351.8672" y1="-330.4517" x2="-347.917" y2="-323.6097" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_17_)" d="M617.75,12.71c0.71-1.11,1.42-2.21,2.13-3.32c-0.71-1.08-1.43-2.16-2.14-3.25
+ c-1.42,0.02-2.85,0.03-4.27,0.05c-0.71,1.11-1.42,2.23-2.13,3.34c0.71,1.09,1.42,2.19,2.14,3.27
+ C614.91,12.77,616.33,12.74,617.75,12.71z"/>
+
+ <linearGradient id="SVGID_18_" gradientUnits="userSpaceOnUse" x1="-350.9536" y1="-338.6313" x2="-347.9209" y2="-333.3785" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_18_)" d="M611.34-0.28c0.71,1.11,1.43,2.21,2.14,3.31c1.42-0.01,2.85-0.01,4.27-0.02
+ c0.71-1.1,1.42-2.19,2.13-3.28C617.03-0.28,614.18-0.28,611.34-0.28z"/>
+
+ <linearGradient id="SVGID_19_" gradientUnits="userSpaceOnUse" x1="-341.3149" y1="-266.4116" x2="-337.9531" y2="-260.5888" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_19_)" d="M609.21,73.21c-0.71-1.03-1.42-2.06-2.13-3.09c-1.42,0.16-2.84,0.32-4.26,0.47
+ c-0.71,1.2-1.42,2.4-2.12,3.61C603.54,73.88,606.37,73.55,609.21,73.21z"/>
+
+ <linearGradient id="SVGID_20_" gradientUnits="userSpaceOnUse" x1="-341.2812" y1="-276.2993" x2="-337.1309" y2="-269.1106" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_20_)" d="M607.07,66.92c0.71-1.19,1.42-2.38,2.12-3.56c-0.71-1.04-1.42-2.08-2.13-3.12
+ c-1.42,0.14-2.84,0.27-4.26,0.41c-0.71,1.19-1.42,2.38-2.12,3.57c0.71,1.06,1.43,2.11,2.14,3.16
+ C604.23,67.22,605.65,67.07,607.07,66.92z"/>
+
+ <linearGradient id="SVGID_21_" gradientUnits="userSpaceOnUse" x1="-341.2524" y1="-286.1904" x2="-337.1284" y2="-279.0474" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_21_)" d="M607.05,57.04c0.71-1.18,1.42-2.36,2.12-3.53c-0.71-1.05-1.43-2.1-2.13-3.16
+ c-1.42,0.12-2.84,0.23-4.26,0.34c-0.71,1.18-1.42,2.36-2.12,3.54c0.71,1.07,1.43,2.13,2.14,3.19
+ C604.22,57.3,605.63,57.17,607.05,57.04z"/>
+
+ <linearGradient id="SVGID_22_" gradientUnits="userSpaceOnUse" x1="-341.2212" y1="-296.0801" x2="-337.1265" y2="-288.9878" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_22_)" d="M607.04,47.16c0.71-1.17,1.42-2.33,2.12-3.49c-0.71-1.06-1.42-2.12-2.14-3.19
+ c-1.42,0.09-2.84,0.18-4.26,0.27c-0.71,1.17-1.42,2.34-2.12,3.51c0.71,1.08,1.42,2.15,2.14,3.22
+ C604.2,47.37,605.62,47.27,607.04,47.16z"/>
+
+ <linearGradient id="SVGID_23_" gradientUnits="userSpaceOnUse" x1="-341.1899" y1="-305.9692" x2="-337.1226" y2="-298.9243" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_23_)" d="M607.02,37.28c0.71-1.15,1.42-2.31,2.13-3.46c-0.71-1.07-1.42-2.15-2.14-3.22
+ c-1.42,0.07-2.84,0.14-4.27,0.21c-0.71,1.16-1.42,2.31-2.12,3.48c0.71,1.09,1.43,2.17,2.14,3.26
+ C604.18,37.45,605.6,37.36,607.02,37.28z"/>
+
+ <linearGradient id="SVGID_24_" gradientUnits="userSpaceOnUse" x1="-341.1616" y1="-315.8604" x2="-337.1216" y2="-308.8628" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_24_)" d="M607.01,27.4c0.71-1.15,1.42-2.29,2.13-3.43c-0.71-1.08-1.43-2.17-2.14-3.26
+ c-1.42,0.05-2.84,0.1-4.27,0.14c-0.71,1.15-1.42,2.29-2.12,3.45c0.71,1.1,1.42,2.19,2.14,3.29
+ C604.16,27.52,605.58,27.46,607.01,27.4z"/>
+
+ <linearGradient id="SVGID_25_" gradientUnits="userSpaceOnUse" x1="-341.1304" y1="-325.75" x2="-337.1187" y2="-318.8015" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_25_)" d="M606.99,17.51c0.71-1.13,1.42-2.26,2.13-3.39c-0.71-1.1-1.43-2.19-2.14-3.29
+ c-1.42,0.03-2.85,0.05-4.27,0.08c-0.71,1.13-1.42,2.27-2.12,3.41c0.71,1.11,1.43,2.22,2.14,3.32
+ C604.14,17.59,605.57,17.56,606.99,17.51z"/>
+
+ <linearGradient id="SVGID_26_" gradientUnits="userSpaceOnUse" x1="-341.0991" y1="-335.6426" x2="-337.1152" y2="-328.7423" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_26_)" d="M606.97,7.63c0.71-1.12,1.42-2.24,2.13-3.36c-0.71-1.1-1.43-2.21-2.14-3.33
+ c-1.43,0-2.85,0.01-4.27,0.01c-0.71,1.12-1.42,2.25-2.13,3.38c0.71,1.12,1.43,2.24,2.14,3.35C604.13,7.67,605.55,7.65,606.97,7.63z
+ "/>
+
+ <linearGradient id="SVGID_27_" gradientUnits="userSpaceOnUse" x1="-330.2061" y1="-269.8462" x2="-326.0059" y2="-262.5712" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_27_)" d="M595.97,73.47c0.71-1.21,1.41-2.42,2.12-3.62c-0.71-1.06-1.42-2.12-2.13-3.18
+ c-1.42,0.14-2.84,0.27-4.26,0.41c-0.71,1.21-1.42,2.42-2.12,3.63c0.71,1.07,1.43,2.14,2.14,3.21
+ C593.13,73.78,594.55,73.63,595.97,73.47z"/>
+
+ <linearGradient id="SVGID_28_" gradientUnits="userSpaceOnUse" x1="-330.1714" y1="-279.9058" x2="-325.9966" y2="-272.6748" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_28_)" d="M595.95,63.42c0.71-1.2,1.42-2.39,2.12-3.59c-0.71-1.07-1.42-2.14-2.13-3.21
+ c-1.42,0.12-2.84,0.23-4.27,0.35c-0.71,1.2-1.42,2.39-2.12,3.6c0.71,1.08,1.43,2.16,2.14,3.24
+ C593.11,63.69,594.53,63.56,595.95,63.42z"/>
+
+ <linearGradient id="SVGID_29_" gradientUnits="userSpaceOnUse" x1="-330.1382" y1="-289.9644" x2="-325.9897" y2="-282.7791" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_29_)" d="M595.93,53.38c0.71-1.19,1.42-2.38,2.12-3.56c-0.71-1.08-1.43-2.16-2.14-3.24
+ c-1.42,0.1-2.84,0.19-4.27,0.29c-0.71,1.19-1.42,2.38-2.13,3.57c0.71,1.09,1.43,2.19,2.14,3.27
+ C593.09,53.59,594.51,53.48,595.93,53.38z"/>
+
+ <linearGradient id="SVGID_30_" gradientUnits="userSpaceOnUse" x1="-330.1021" y1="-300.02" x2="-325.9805" y2="-292.8812" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_30_)" d="M595.91,43.32c0.71-1.18,1.41-2.35,2.12-3.52c-0.71-1.09-1.43-2.18-2.14-3.27
+ c-1.42,0.08-2.84,0.15-4.27,0.22c-0.71,1.18-1.42,2.36-2.13,3.54c0.71,1.1,1.43,2.2,2.14,3.3
+ C593.07,43.5,594.49,43.41,595.91,43.32z"/>
+
+ <linearGradient id="SVGID_31_" gradientUnits="userSpaceOnUse" x1="-330.0688" y1="-310.0796" x2="-325.9727" y2="-302.9848" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_31_)" d="M595.89,33.27c0.71-1.17,1.42-2.33,2.13-3.49c-0.71-1.1-1.43-2.2-2.14-3.31
+ c-1.42,0.06-2.84,0.11-4.27,0.17c-0.71,1.17-1.42,2.33-2.13,3.51c0.71,1.12,1.43,2.22,2.14,3.33
+ C593.04,33.41,594.47,33.34,595.89,33.27z"/>
+
+ <linearGradient id="SVGID_32_" gradientUnits="userSpaceOnUse" x1="-330.0347" y1="-320.1353" x2="-325.9658" y2="-313.0878" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_32_)" d="M595.87,23.22c0.71-1.16,1.42-2.31,2.13-3.46c-0.71-1.11-1.43-2.22-2.14-3.34
+ c-1.42,0.03-2.85,0.07-4.27,0.1c-0.71,1.16-1.42,2.32-2.12,3.48c0.71,1.12,1.43,2.24,2.14,3.36
+ C593.02,23.32,594.45,23.27,595.87,23.22z"/>
+
+ <linearGradient id="SVGID_33_" gradientUnits="userSpaceOnUse" x1="-329.9995" y1="-330.1958" x2="-325.9551" y2="-323.1906" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_33_)" d="M595.85,13.17c0.71-1.15,1.42-2.29,2.13-3.43c-0.71-1.12-1.43-2.24-2.14-3.37
+ c-1.42,0.01-2.85,0.03-4.27,0.04c-0.71,1.15-1.42,2.29-2.13,3.45c0.71,1.14,1.43,2.26,2.14,3.39
+ C593,13.23,594.42,13.2,595.85,13.17z"/>
+
+ <linearGradient id="SVGID_34_" gradientUnits="userSpaceOnUse" x1="-329.0283" y1="-338.6309" x2="-325.9473" y2="-333.2943" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_34_)" d="M589.41-0.28c0.71,1.14,1.43,2.29,2.14,3.42c1.43-0.01,2.85-0.01,4.27-0.02
+ c0.71-1.14,1.41-2.27,2.12-3.4C595.11-0.28,592.26-0.28,589.41-0.28z"/>
+
+ <linearGradient id="SVGID_35_" gradientUnits="userSpaceOnUse" x1="-319.4795" y1="-264.1133" x2="-316.1167" y2="-258.2888" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_35_)" d="M587.35,75.63c-0.71-1.08-1.43-2.15-2.14-3.23c-1.42,0.14-2.85,0.27-4.27,0.4
+ c-0.71,1.22-1.42,2.45-2.12,3.67C581.67,76.2,584.51,75.92,587.35,75.63z"/>
+
+ <linearGradient id="SVGID_36_" gradientUnits="userSpaceOnUse" x1="-319.4438" y1="-274.3223" x2="-315.2266" y2="-267.0177" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_36_)" d="M585.21,69.1c0.71-1.22,1.42-2.43,2.12-3.64c-0.71-1.08-1.43-2.17-2.14-3.26
+ c-1.42,0.12-2.85,0.23-4.26,0.35c-0.71,1.21-1.42,2.43-2.12,3.65c0.71,1.1,1.43,2.2,2.14,3.29
+ C582.36,69.36,583.78,69.23,585.21,69.1z"/>
+
+ <linearGradient id="SVGID_37_" gradientUnits="userSpaceOnUse" x1="-319.4058" y1="-284.5303" x2="-315.2134" y2="-277.2689" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_37_)" d="M585.18,58.9c0.71-1.21,1.41-2.41,2.12-3.61c-0.71-1.09-1.43-2.19-2.14-3.29
+ c-1.42,0.1-2.85,0.19-4.27,0.29c-0.71,1.21-1.42,2.41-2.12,3.62c0.71,1.11,1.43,2.21,2.14,3.32
+ C582.33,59.12,583.76,59.01,585.18,58.9z"/>
+
+ <linearGradient id="SVGID_38_" gradientUnits="userSpaceOnUse" x1="-319.3706" y1="-294.7388" x2="-315.2026" y2="-287.5196" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_38_)" d="M585.16,48.69c0.71-1.19,1.41-2.39,2.12-3.58c-0.71-1.1-1.43-2.21-2.14-3.32
+ c-1.42,0.08-2.85,0.16-4.27,0.23c-0.71,1.19-1.42,2.39-2.13,3.59c0.71,1.12,1.43,2.24,2.14,3.35
+ C582.31,48.88,583.73,48.79,585.16,48.69z"/>
+
+ <linearGradient id="SVGID_39_" gradientUnits="userSpaceOnUse" x1="-319.3335" y1="-304.9473" x2="-315.189" y2="-297.7687" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_39_)" d="M585.13,38.49c0.71-1.18,1.42-2.37,2.12-3.55c-0.71-1.11-1.43-2.23-2.14-3.35
+ c-1.42,0.06-2.85,0.12-4.27,0.18c-0.71,1.19-1.42,2.37-2.13,3.57c0.71,1.13,1.43,2.25,2.14,3.37
+ C582.29,38.64,583.71,38.57,585.13,38.49z"/>
+
+ <linearGradient id="SVGID_40_" gradientUnits="userSpaceOnUse" x1="-319.2974" y1="-315.1562" x2="-315.1777" y2="-308.0208" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_40_)" d="M585.11,28.29c0.71-1.17,1.42-2.35,2.12-3.52c-0.71-1.12-1.43-2.25-2.14-3.38
+ c-1.43,0.04-2.85,0.08-4.27,0.12c-0.71,1.18-1.42,2.36-2.12,3.54c0.71,1.14,1.43,2.27,2.14,3.4
+ C582.26,28.4,583.68,28.34,585.11,28.29z"/>
+
+ <linearGradient id="SVGID_41_" gradientUnits="userSpaceOnUse" x1="-319.2612" y1="-325.3652" x2="-315.1646" y2="-318.2696" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_41_)" d="M585.08,18.09c0.71-1.17,1.42-2.33,2.13-3.49c-0.71-1.13-1.43-2.27-2.14-3.41
+ c-1.42,0.02-2.85,0.04-4.27,0.07c-0.71,1.17-1.42,2.34-2.13,3.51c0.71,1.15,1.43,2.29,2.14,3.43
+ C582.24,18.16,583.66,18.12,585.08,18.09z"/>
+
+ <linearGradient id="SVGID_42_" gradientUnits="userSpaceOnUse" x1="-319.2231" y1="-335.5723" x2="-315.1519" y2="-328.5206" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_42_)" d="M585.06,7.89c0.71-1.16,1.42-2.31,2.12-3.46c-0.71-1.14-1.43-2.29-2.14-3.44
+ c-1.42,0-2.85,0.01-4.27,0.01c-0.71,1.16-1.42,2.32-2.13,3.48c0.71,1.15,1.43,2.31,2.14,3.46C582.21,7.92,583.63,7.9,585.06,7.89z"
+ />
+
+ <linearGradient id="SVGID_43_" gradientUnits="userSpaceOnUse" x1="-308.3457" y1="-267.8691" x2="-304.0898" y2="-260.4978" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_43_)" d="M574.09,75.64c0.71-1.23,1.42-2.46,2.12-3.68c-0.71-1.1-1.43-2.21-2.14-3.31
+ c-1.42,0.12-2.85,0.23-4.27,0.34c-0.71,1.23-1.42,2.46-2.12,3.69c0.71,1.12,1.43,2.23,2.14,3.34
+ C571.25,75.89,572.67,75.76,574.09,75.64z"/>
+
+ <linearGradient id="SVGID_44_" gradientUnits="userSpaceOnUse" x1="-308.3096" y1="-278.2183" x2="-304.0767" y2="-270.8867" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_44_)" d="M574.06,65.29c0.71-1.22,1.42-2.44,2.12-3.66c-0.71-1.11-1.43-2.22-2.14-3.34
+ c-1.42,0.1-2.85,0.2-4.27,0.29c-0.71,1.22-1.42,2.44-2.12,3.67c0.71,1.13,1.43,2.25,2.14,3.37
+ C571.22,65.51,572.64,65.4,574.06,65.29z"/>
+
+ <linearGradient id="SVGID_45_" gradientUnits="userSpaceOnUse" x1="-308.272" y1="-288.5713" x2="-304.0605" y2="-281.2769" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_45_)" d="M574.04,54.95c0.71-1.21,1.42-2.43,2.12-3.63c-0.71-1.12-1.43-2.24-2.14-3.37
+ c-1.42,0.08-2.85,0.16-4.27,0.24c-0.71,1.21-1.42,2.43-2.12,3.64c0.71,1.13,1.43,2.26,2.14,3.39
+ C571.19,55.13,572.62,55.04,574.04,54.95z"/>
+
+ <linearGradient id="SVGID_46_" gradientUnits="userSpaceOnUse" x1="-308.2344" y1="-298.9209" x2="-304.0454" y2="-291.6654" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_46_)" d="M574.01,44.6c0.71-1.2,1.42-2.4,2.12-3.6c-0.71-1.13-1.43-2.26-2.14-3.39
+ c-1.42,0.06-2.85,0.13-4.27,0.19c-0.71,1.2-1.42,2.41-2.12,3.62c0.71,1.14,1.43,2.28,2.14,3.42
+ C571.16,44.75,572.59,44.67,574.01,44.6z"/>
+
+ <linearGradient id="SVGID_47_" gradientUnits="userSpaceOnUse" x1="-308.1963" y1="-309.272" x2="-304.0293" y2="-302.0545" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_47_)" d="M573.98,34.26c0.71-1.19,1.42-2.39,2.13-3.58c-0.71-1.14-1.43-2.28-2.14-3.42
+ c-1.42,0.04-2.85,0.09-4.27,0.14c-0.71,1.2-1.42,2.39-2.12,3.59c0.71,1.15,1.43,2.3,2.14,3.44
+ C571.14,34.37,572.56,34.31,573.98,34.26z"/>
+
+ <linearGradient id="SVGID_48_" gradientUnits="userSpaceOnUse" x1="-308.1611" y1="-319.626" x2="-304.0151" y2="-312.4449" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_48_)" d="M573.96,23.91c0.71-1.19,1.42-2.37,2.13-3.55c-0.71-1.14-1.43-2.29-2.14-3.45
+ c-1.42,0.03-2.85,0.06-4.27,0.09c-0.71,1.19-1.42,2.37-2.12,3.56c0.71,1.16,1.43,2.31,2.14,3.47
+ C571.11,23.99,572.54,23.95,573.96,23.91z"/>
+
+ <linearGradient id="SVGID_49_" gradientUnits="userSpaceOnUse" x1="-308.1221" y1="-329.9766" x2="-303.9985" y2="-322.8344" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_49_)" d="M573.93,13.57c0.71-1.18,1.42-2.35,2.12-3.53c-0.71-1.15-1.43-2.31-2.14-3.47
+ c-1.42,0.01-2.85,0.02-4.27,0.04c-0.71,1.18-1.42,2.36-2.12,3.54c0.71,1.17,1.43,2.33,2.14,3.49
+ C571.08,13.61,572.51,13.59,573.93,13.57z"/>
+
+ <linearGradient id="SVGID_50_" gradientUnits="userSpaceOnUse" x1="-307.106" y1="-338.6313" x2="-303.9834" y2="-333.2229" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_50_)" d="M567.49-0.28c0.71,1.17,1.43,2.35,2.14,3.52c1.42-0.01,2.85-0.01,4.27-0.02
+ c0.71-1.17,1.42-2.33,2.13-3.5C573.18-0.28,570.34-0.28,567.49-0.28z"/>
+
+ <linearGradient id="SVGID_51_" gradientUnits="userSpaceOnUse" x1="-297.5938" y1="-262.1865" x2="-294.2358" y2="-256.3705" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_51_)" d="M565.46,77.68c-0.71-1.12-1.43-2.24-2.14-3.36c-1.42,0.12-2.85,0.22-4.27,0.33
+ c-0.71,1.24-1.42,2.48-2.12,3.73C559.76,78.16,562.61,77.92,565.46,77.68z"/>
+
+ <linearGradient id="SVGID_52_" gradientUnits="userSpaceOnUse" x1="-297.5625" y1="-272.6567" x2="-293.2939" y2="-265.2634" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_52_)" d="M563.3,70.93c0.71-1.23,1.42-2.47,2.12-3.7c-0.71-1.12-1.43-2.25-2.14-3.39
+ c-1.42,0.1-2.85,0.19-4.27,0.29c-0.71,1.23-1.41,2.47-2.12,3.71c0.72,1.14,1.43,2.27,2.14,3.41
+ C560.46,71.15,561.88,71.04,563.3,70.93z"/>
+
+ <linearGradient id="SVGID_53_" gradientUnits="userSpaceOnUse" x1="-297.5269" y1="-283.1328" x2="-293.2788" y2="-275.775" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_53_)" d="M563.28,60.46c0.71-1.23,1.42-2.45,2.13-3.67c-0.71-1.13-1.43-2.27-2.14-3.41
+ c-1.42,0.08-2.85,0.16-4.27,0.24c-0.71,1.23-1.42,2.45-2.12,3.68c0.71,1.15,1.43,2.29,2.14,3.43
+ C560.43,60.64,561.85,60.55,563.28,60.46z"/>
+
+ <linearGradient id="SVGID_54_" gradientUnits="userSpaceOnUse" x1="-297.4897" y1="-293.6089" x2="-293.2627" y2="-286.2874" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_54_)" d="M563.25,49.99c0.71-1.22,1.42-2.43,2.13-3.65c-0.72-1.14-1.43-2.29-2.14-3.43
+ c-1.42,0.07-2.85,0.13-4.27,0.19c-0.71,1.22-1.42,2.44-2.12,3.66c0.71,1.15,1.43,2.31,2.14,3.46
+ C560.4,50.14,561.82,50.07,563.25,49.99z"/>
+
+ <linearGradient id="SVGID_55_" gradientUnits="userSpaceOnUse" x1="-297.4526" y1="-304.0854" x2="-293.2446" y2="-296.797" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_55_)" d="M563.22,39.52c0.71-1.21,1.42-2.42,2.13-3.63c-0.72-1.15-1.43-2.3-2.15-3.46
+ c-1.42,0.05-2.85,0.1-4.27,0.14c-0.71,1.21-1.42,2.42-2.12,3.64c0.71,1.16,1.43,2.32,2.14,3.48
+ C560.37,39.64,561.8,39.58,563.22,39.52z"/>
+
+ <linearGradient id="SVGID_56_" gradientUnits="userSpaceOnUse" x1="-297.4146" y1="-314.562" x2="-293.228" y2="-307.3107" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_56_)" d="M563.19,29.04c0.71-1.2,1.42-2.4,2.12-3.6c-0.71-1.16-1.43-2.32-2.14-3.48
+ c-1.42,0.03-2.85,0.07-4.27,0.1c-0.71,1.2-1.42,2.41-2.12,3.61c0.71,1.17,1.43,2.34,2.14,3.5
+ C560.35,29.13,561.77,29.09,563.19,29.04z"/>
+
+ <linearGradient id="SVGID_57_" gradientUnits="userSpaceOnUse" x1="-297.3784" y1="-325.0405" x2="-293.2109" y2="-317.8222" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_57_)" d="M563.16,18.58c0.71-1.2,1.42-2.39,2.13-3.58c-0.71-1.17-1.43-2.33-2.14-3.51
+ c-1.42,0.02-2.85,0.04-4.27,0.05c-0.71,1.2-1.42,2.39-2.13,3.59c0.71,1.18,1.43,2.35,2.14,3.52
+ C560.32,18.63,561.74,18.6,563.16,18.58z"/>
+
+ <linearGradient id="SVGID_58_" gradientUnits="userSpaceOnUse" x1="-297.3384" y1="-335.5166" x2="-293.1929" y2="-328.3364" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_58_)" d="M563.14,8.1c0.71-1.19,1.42-2.37,2.12-3.55c-0.71-1.17-1.43-2.35-2.14-3.53
+ c-1.42,0-2.85,0-4.27,0.01c-0.71,1.19-1.42,2.38-2.13,3.57c0.72,1.18,1.43,2.37,2.15,3.54C560.29,8.13,561.71,8.12,563.14,8.1z"/>
+
+ <linearGradient id="SVGID_59_" gradientUnits="userSpaceOnUse" x1="-286.4502" y1="-266.2334" x2="-282.1519" y2="-258.7885" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_59_)" d="M552.18,77.43c0.71-1.25,1.42-2.49,2.13-3.73c-0.71-1.14-1.43-2.29-2.14-3.43
+ c-1.43,0.09-2.85,0.19-4.28,0.28c-0.71,1.24-1.42,2.49-2.13,3.74c0.71,1.16,1.43,2.31,2.14,3.45
+ C549.33,77.63,550.75,77.53,552.18,77.43z"/>
+
+ <linearGradient id="SVGID_60_" gradientUnits="userSpaceOnUse" x1="-286.4141" y1="-276.8271" x2="-282.1338" y2="-269.4135" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_60_)" d="M552.15,66.84c0.71-1.24,1.42-2.47,2.13-3.71c-0.71-1.15-1.43-2.3-2.14-3.45
+ c-1.42,0.08-2.85,0.16-4.27,0.24c-0.71,1.24-1.42,2.48-2.13,3.72c0.72,1.16,1.43,2.32,2.14,3.47
+ C549.3,67.01,550.72,66.93,552.15,66.84z"/>
+
+ <linearGradient id="SVGID_61_" gradientUnits="userSpaceOnUse" x1="-286.376" y1="-287.4204" x2="-282.1143" y2="-280.0389" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_61_)" d="M552.12,56.25c0.71-1.23,1.42-2.46,2.13-3.69c-0.71-1.16-1.43-2.31-2.15-3.47
+ c-1.42,0.07-2.85,0.13-4.27,0.19c-0.71,1.23-1.42,2.46-2.13,3.7c0.71,1.17,1.43,2.33,2.15,3.5
+ C549.27,56.4,550.7,56.32,552.12,56.25z"/>
+
+ <linearGradient id="SVGID_62_" gradientUnits="userSpaceOnUse" x1="-286.3418" y1="-298.0117" x2="-282.0991" y2="-290.6632" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_62_)" d="M552.09,45.66c0.71-1.23,1.42-2.45,2.13-3.67c-0.71-1.16-1.43-2.33-2.15-3.5
+ c-1.42,0.05-2.85,0.1-4.27,0.15c-0.71,1.22-1.42,2.45-2.12,3.68c0.71,1.17,1.43,2.35,2.14,3.51
+ C549.24,45.78,550.67,45.72,552.09,45.66z"/>
+
+ <linearGradient id="SVGID_63_" gradientUnits="userSpaceOnUse" x1="-286.3062" y1="-308.6084" x2="-282.0796" y2="-301.2878" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_63_)" d="M552.06,35.07c0.71-1.22,1.42-2.43,2.13-3.65c-0.71-1.17-1.43-2.34-2.14-3.52
+ c-1.42,0.04-2.85,0.08-4.27,0.11c-0.71,1.22-1.42,2.43-2.12,3.65c0.71,1.18,1.43,2.36,2.14,3.54
+ C549.22,35.17,550.64,35.12,552.06,35.07z"/>
+
+ <linearGradient id="SVGID_64_" gradientUnits="userSpaceOnUse" x1="-286.269" y1="-319.1992" x2="-282.062" y2="-311.9124" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_64_)" d="M552.04,24.48c0.71-1.21,1.42-2.42,2.12-3.62c-0.71-1.18-1.43-2.35-2.14-3.54
+ c-1.42,0.02-2.85,0.05-4.28,0.07c-0.71,1.21-1.42,2.42-2.12,3.63c0.71,1.19,1.43,2.37,2.14,3.56
+ C549.19,24.55,550.61,24.52,552.04,24.48z"/>
+
+ <linearGradient id="SVGID_65_" gradientUnits="userSpaceOnUse" x1="-286.2334" y1="-329.7939" x2="-282.0449" y2="-322.5393" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_65_)" d="M552.01,13.89c0.71-1.2,1.42-2.4,2.12-3.6c-0.71-1.18-1.43-2.37-2.14-3.56
+ c-1.42,0.01-2.85,0.02-4.27,0.03c-0.71,1.2-1.41,2.41-2.12,3.61c0.71,1.2,1.43,2.39,2.14,3.57
+ C549.16,13.93,550.59,13.91,552.01,13.89z"/>
+
+ <linearGradient id="SVGID_66_" gradientUnits="userSpaceOnUse" x1="-285.1821" y1="-338.6313" x2="-282.0254" y2="-333.1637" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_66_)" d="M545.56-0.28c0.71,1.2,1.43,2.4,2.14,3.59c1.43-0.01,2.85-0.01,4.27-0.01
+ c0.71-1.2,1.42-2.39,2.13-3.58C551.26-0.28,548.41-0.28,545.56-0.28z"/>
+
+ <linearGradient id="SVGID_67_" gradientUnits="userSpaceOnUse" x1="-275.6704" y1="-260.6182" x2="-272.3271" y2="-254.8275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_67_)" d="M543.53,79.35c-0.71-1.16-1.43-2.31-2.14-3.47c-1.43,0.09-2.85,0.18-4.28,0.26
+ c-0.71,1.25-1.42,2.5-2.13,3.76C537.83,79.73,540.68,79.54,543.53,79.35z"/>
+
+ <linearGradient id="SVGID_68_" gradientUnits="userSpaceOnUse" x1="-275.6523" y1="-271.3037" x2="-271.3477" y2="-263.8478" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_68_)" d="M541.38,72.42c0.71-1.25,1.42-2.49,2.13-3.74c-0.71-1.16-1.43-2.32-2.15-3.49
+ c-1.42,0.08-2.85,0.15-4.28,0.23c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.18,1.43,2.35,2.14,3.51
+ C538.52,72.59,539.95,72.51,541.38,72.42z"/>
+
+ <linearGradient id="SVGID_69_" gradientUnits="userSpaceOnUse" x1="-275.6177" y1="-281.9995" x2="-271.3281" y2="-274.5698" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_69_)" d="M541.35,61.73c0.71-1.24,1.42-2.48,2.13-3.72c-0.71-1.17-1.43-2.34-2.14-3.51
+ c-1.43,0.06-2.85,0.12-4.28,0.19c-0.71,1.24-1.42,2.48-2.13,3.73c0.71,1.18,1.43,2.36,2.14,3.53
+ C538.5,61.88,539.92,61.81,541.35,61.73z"/>
+
+ <linearGradient id="SVGID_70_" gradientUnits="userSpaceOnUse" x1="-275.5815" y1="-292.6943" x2="-271.3096" y2="-285.2951" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_70_)" d="M541.32,51.04c0.71-1.24,1.42-2.47,2.13-3.7c-0.71-1.18-1.43-2.35-2.14-3.53
+ c-1.43,0.05-2.85,0.1-4.28,0.15c-0.71,1.24-1.42,2.47-2.12,3.71c0.72,1.19,1.43,2.37,2.14,3.55
+ C538.47,51.16,539.89,51.1,541.32,51.04z"/>
+
+ <linearGradient id="SVGID_71_" gradientUnits="userSpaceOnUse" x1="-275.5479" y1="-303.3892" x2="-271.2905" y2="-296.0153" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_71_)" d="M541.29,40.35c0.71-1.23,1.42-2.46,2.13-3.68c-0.71-1.18-1.43-2.36-2.14-3.55
+ c-1.43,0.04-2.85,0.08-4.28,0.12c-0.71,1.23-1.42,2.46-2.13,3.69c0.71,1.19,1.43,2.38,2.14,3.57
+ C538.44,40.45,539.87,40.4,541.29,40.35z"/>
+
+ <linearGradient id="SVGID_72_" gradientUnits="userSpaceOnUse" x1="-275.5142" y1="-314.0815" x2="-271.2734" y2="-306.7364" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_72_)" d="M541.27,29.66c0.71-1.22,1.42-2.44,2.12-3.66c-0.71-1.19-1.43-2.38-2.14-3.57
+ c-1.43,0.03-2.85,0.05-4.27,0.08c-0.71,1.22-1.42,2.45-2.13,3.67c0.71,1.2,1.43,2.39,2.14,3.59
+ C538.42,29.73,539.84,29.7,541.27,29.66z"/>
+
+ <linearGradient id="SVGID_73_" gradientUnits="userSpaceOnUse" x1="-275.4805" y1="-324.7773" x2="-271.2563" y2="-317.4609" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_73_)" d="M541.24,18.97c0.71-1.22,1.42-2.43,2.12-3.64c-0.71-1.19-1.43-2.39-2.14-3.59
+ c-1.43,0.01-2.85,0.03-4.27,0.04c-0.71,1.22-1.42,2.43-2.13,3.65c0.72,1.2,1.43,2.41,2.15,3.6
+ C538.39,19.01,539.81,18.99,541.24,18.97z"/>
+
+ <linearGradient id="SVGID_74_" gradientUnits="userSpaceOnUse" x1="-275.4487" y1="-335.4722" x2="-271.2402" y2="-328.1828" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_74_)" d="M541.21,8.28c0.71-1.21,1.42-2.42,2.13-3.62c-0.71-1.2-1.43-2.4-2.14-3.61
+ c-1.42,0-2.85,0-4.27,0.01c-0.71,1.21-1.42,2.42-2.12,3.64c0.71,1.21,1.43,2.42,2.14,3.62C538.36,8.3,539.79,8.29,541.21,8.28z"/>
+
+ <linearGradient id="SVGID_75_" gradientUnits="userSpaceOnUse" x1="-264.5215" y1="-264.936" x2="-260.1963" y2="-257.4446" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_75_)" d="M530.23,78.85c0.71-1.26,1.42-2.51,2.13-3.76c-0.71-1.18-1.43-2.35-2.14-3.53
+ c-1.43,0.07-2.85,0.14-4.28,0.21c-0.71,1.25-1.42,2.51-2.13,3.77c0.72,1.18,1.43,2.37,2.15,3.55
+ C527.38,79.01,528.8,78.93,530.23,78.85z"/>
+
+ <linearGradient id="SVGID_76_" gradientUnits="userSpaceOnUse" x1="-264.4883" y1="-275.7197" x2="-260.1782" y2="-268.2545" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_76_)" d="M530.21,68.07c0.71-1.25,1.42-2.5,2.13-3.75c-0.71-1.18-1.43-2.36-2.15-3.54
+ c-1.43,0.06-2.85,0.12-4.28,0.18c-0.71,1.25-1.42,2.5-2.13,3.75c0.71,1.19,1.43,2.38,2.15,3.57
+ C527.36,68.2,528.78,68.14,530.21,68.07z"/>
+
+ <linearGradient id="SVGID_77_" gradientUnits="userSpaceOnUse" x1="-264.4595" y1="-286.5088" x2="-260.1611" y2="-279.0638" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_77_)" d="M530.18,57.28c0.71-1.24,1.42-2.49,2.13-3.73c-0.72-1.18-1.43-2.37-2.15-3.56
+ c-1.43,0.05-2.85,0.1-4.28,0.15c-0.71,1.24-1.42,2.49-2.13,3.73c0.72,1.2,1.43,2.39,2.15,3.58
+ C527.33,57.4,528.76,57.34,530.18,57.28z"/>
+
+ <linearGradient id="SVGID_78_" gradientUnits="userSpaceOnUse" x1="-264.4253" y1="-297.2939" x2="-260.1421" y2="-289.8752" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_78_)" d="M530.16,46.5c0.71-1.24,1.42-2.48,2.13-3.71c-0.72-1.19-1.43-2.38-2.15-3.58
+ c-1.43,0.04-2.85,0.08-4.28,0.12c-0.71,1.24-1.42,2.48-2.13,3.72c0.71,1.2,1.43,2.4,2.14,3.6
+ C527.31,46.59,528.73,46.55,530.16,46.5z"/>
+
+ <linearGradient id="SVGID_79_" gradientUnits="userSpaceOnUse" x1="-264.395" y1="-308.0801" x2="-260.1265" y2="-300.6867" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_79_)" d="M530.13,35.72c0.71-1.23,1.42-2.47,2.13-3.7c-0.71-1.2-1.43-2.4-2.14-3.6
+ c-1.43,0.03-2.85,0.06-4.27,0.08c-0.71,1.23-1.42,2.47-2.13,3.7c0.72,1.21,1.43,2.41,2.15,3.61
+ C527.29,35.79,528.71,35.75,530.13,35.72z"/>
+
+ <linearGradient id="SVGID_80_" gradientUnits="userSpaceOnUse" x1="-264.3638" y1="-318.8662" x2="-260.1089" y2="-311.4966" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_80_)" d="M530.11,24.94c0.71-1.23,1.42-2.46,2.13-3.68c-0.71-1.2-1.43-2.41-2.14-3.61
+ c-1.43,0.02-2.85,0.04-4.27,0.05c-0.71,1.23-1.42,2.46-2.13,3.69c0.71,1.21,1.43,2.42,2.14,3.63
+ C527.26,24.99,528.68,24.96,530.11,24.94z"/>
+
+ <linearGradient id="SVGID_81_" gradientUnits="userSpaceOnUse" x1="-264.333" y1="-329.6528" x2="-260.0918" y2="-322.3069" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_81_)" d="M530.08,14.15c0.71-1.22,1.42-2.44,2.13-3.66c-0.71-1.21-1.43-2.42-2.14-3.63
+ c-1.42,0.01-2.85,0.02-4.27,0.02c-0.71,1.22-1.42,2.45-2.13,3.67c0.71,1.22,1.43,2.43,2.14,3.64
+ C527.23,14.18,528.66,14.17,530.08,14.15z"/>
+
+ <linearGradient id="SVGID_82_" gradientUnits="userSpaceOnUse" x1="-263.2588" y1="-338.6313" x2="-260.0757" y2="-333.118" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_82_)" d="M523.64-0.28c0.71,1.22,1.43,2.44,2.14,3.66c1.42,0,2.85-0.01,4.27-0.01
+ c0.71-1.22,1.42-2.43,2.13-3.65C529.34-0.28,526.49-0.28,523.64-0.28z"/>
+
+ <linearGradient id="SVGID_83_" gradientUnits="userSpaceOnUse" x1="-253.7207" y1="-259.4141" x2="-250.3975" y2="-253.658" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_83_)" d="M521.58,80.65c-0.72-1.19-1.43-2.38-2.15-3.57c-1.43,0.07-2.86,0.13-4.28,0.19
+ c-0.71,1.26-1.42,2.52-2.13,3.78C515.87,80.93,518.72,80.8,521.58,80.65z"/>
+
+ <linearGradient id="SVGID_84_" gradientUnits="userSpaceOnUse" x1="-253.7124" y1="-270.2632" x2="-249.3857" y2="-262.7692" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_84_)" d="M519.42,73.57c0.71-1.26,1.42-2.51,2.13-3.76c-0.72-1.19-1.43-2.39-2.15-3.58
+ c-1.43,0.06-2.85,0.11-4.28,0.17c-0.71,1.25-1.42,2.51-2.13,3.76c0.71,1.2,1.43,2.4,2.15,3.6C516.57,73.7,518,73.63,519.42,73.57z"
+ />
+
+ <linearGradient id="SVGID_85_" gradientUnits="userSpaceOnUse" x1="-253.6851" y1="-281.127" x2="-249.3691" y2="-273.6516" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_85_)" d="M519.4,62.71c0.71-1.25,1.42-2.5,2.13-3.75c-0.71-1.2-1.43-2.4-2.14-3.6
+ c-1.43,0.05-2.85,0.1-4.28,0.14c-0.71,1.25-1.42,2.5-2.13,3.75c0.72,1.21,1.43,2.41,2.15,3.61
+ C516.54,62.82,517.97,62.77,519.4,62.71z"/>
+
+ <linearGradient id="SVGID_86_" gradientUnits="userSpaceOnUse" x1="-253.6572" y1="-291.9888" x2="-249.3545" y2="-284.5362" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_86_)" d="M519.38,51.85c0.71-1.25,1.42-2.49,2.13-3.74c-0.71-1.2-1.43-2.4-2.14-3.61
+ c-1.43,0.04-2.85,0.08-4.28,0.11c-0.71,1.25-1.42,2.49-2.13,3.74c0.72,1.21,1.43,2.42,2.15,3.62
+ C516.52,51.94,517.95,51.9,519.38,51.85z"/>
+
+ <linearGradient id="SVGID_87_" gradientUnits="userSpaceOnUse" x1="-253.6299" y1="-302.8511" x2="-249.3389" y2="-295.4188" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_87_)" d="M519.36,40.99c0.71-1.24,1.42-2.48,2.13-3.72c-0.71-1.21-1.43-2.41-2.14-3.62
+ c-1.43,0.03-2.85,0.06-4.28,0.08c-0.71,1.24-1.42,2.48-2.13,3.73c0.71,1.21,1.43,2.43,2.15,3.64
+ C516.5,41.06,517.93,41.03,519.36,40.99z"/>
+
+ <linearGradient id="SVGID_88_" gradientUnits="userSpaceOnUse" x1="-253.5986" y1="-313.7134" x2="-249.3208" y2="-306.304" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_88_)" d="M519.33,30.13c0.71-1.24,1.42-2.47,2.13-3.71c-0.71-1.21-1.43-2.42-2.14-3.64
+ c-1.43,0.02-2.85,0.04-4.28,0.06c-0.71,1.24-1.42,2.47-2.13,3.71c0.71,1.22,1.43,2.43,2.14,3.65
+ C516.48,30.18,517.91,30.16,519.33,30.13z"/>
+
+ <linearGradient id="SVGID_89_" gradientUnits="userSpaceOnUse" x1="-253.5713" y1="-324.5762" x2="-249.3047" y2="-317.1862" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_89_)" d="M519.31,19.27c0.71-1.23,1.42-2.46,2.13-3.69c-0.71-1.22-1.43-2.43-2.14-3.65
+ c-1.42,0.01-2.85,0.02-4.27,0.03c-0.71,1.23-1.42,2.46-2.13,3.7c0.71,1.22,1.43,2.44,2.14,3.66
+ C516.46,19.31,517.88,19.29,519.31,19.27z"/>
+
+ <linearGradient id="SVGID_90_" gradientUnits="userSpaceOnUse" x1="-253.5449" y1="-335.4404" x2="-249.2891" y2="-328.0691" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_90_)" d="M519.29,8.41c0.71-1.23,1.42-2.45,2.12-3.68c-0.71-1.22-1.43-2.44-2.14-3.67c-1.43,0-2.85,0-4.28,0
+ c-0.71,1.23-1.42,2.46-2.13,3.69c0.71,1.23,1.43,2.45,2.14,3.67C516.44,8.43,517.86,8.42,519.29,8.41z"/>
+
+ <linearGradient id="SVGID_91_" gradientUnits="userSpaceOnUse" x1="-242.5649" y1="-263.9795" x2="-238.2266" y2="-256.4652" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_91_)" d="M508.27,79.9c0.71-1.26,1.42-2.52,2.13-3.78c-0.72-1.2-1.43-2.41-2.15-3.62
+ c-1.43,0.05-2.86,0.1-4.28,0.15c-0.71,1.26-1.42,2.52-2.13,3.78c0.71,1.21,1.43,2.42,2.14,3.63
+ C505.41,80.01,506.84,79.96,508.27,79.9z"/>
+
+ <linearGradient id="SVGID_92_" gradientUnits="userSpaceOnUse" x1="-242.5405" y1="-274.9058" x2="-238.2139" y2="-267.4118" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_92_)" d="M508.25,68.97c0.71-1.26,1.42-2.51,2.13-3.77c-0.72-1.21-1.43-2.42-2.15-3.62
+ c-1.42,0.04-2.85,0.09-4.28,0.12c-0.71,1.25-1.42,2.51-2.13,3.76c0.71,1.21,1.43,2.43,2.15,3.64
+ C505.39,69.07,506.82,69.02,508.25,68.97z"/>
+
+ <linearGradient id="SVGID_93_" gradientUnits="userSpaceOnUse" x1="-242.5171" y1="-285.835" x2="-238.1987" y2="-278.3553" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_93_)" d="M508.23,58.05c0.71-1.25,1.42-2.5,2.13-3.75c-0.71-1.21-1.43-2.42-2.15-3.64
+ c-1.42,0.04-2.85,0.07-4.28,0.1c-0.71,1.25-1.42,2.5-2.13,3.75c0.71,1.22,1.43,2.44,2.15,3.65
+ C505.38,58.13,506.8,58.09,508.23,58.05z"/>
+
+ <linearGradient id="SVGID_94_" gradientUnits="userSpaceOnUse" x1="-242.4937" y1="-296.7627" x2="-238.186" y2="-289.3017" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_94_)" d="M508.21,47.12c0.71-1.25,1.42-2.49,2.13-3.74c-0.71-1.21-1.43-2.43-2.14-3.65
+ c-1.43,0.03-2.85,0.06-4.28,0.08c-0.71,1.25-1.42,2.5-2.13,3.74c0.71,1.22,1.43,2.44,2.14,3.66
+ C505.36,47.19,506.78,47.15,508.21,47.12z"/>
+
+ <linearGradient id="SVGID_95_" gradientUnits="userSpaceOnUse" x1="-242.4692" y1="-307.6914" x2="-238.1714" y2="-300.2473" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_95_)" d="M508.19,36.2c0.71-1.25,1.42-2.49,2.13-3.73c-0.71-1.22-1.43-2.44-2.14-3.66
+ c-1.42,0.02-2.85,0.04-4.27,0.06c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.22,1.43,2.45,2.14,3.67
+ C505.34,36.25,506.77,36.22,508.19,36.2z"/>
+
+ <linearGradient id="SVGID_96_" gradientUnits="userSpaceOnUse" x1="-242.4463" y1="-318.6201" x2="-238.1582" y2="-311.1929" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_96_)" d="M508.17,25.27c0.71-1.24,1.42-2.48,2.13-3.72c-0.71-1.22-1.43-2.45-2.14-3.67
+ c-1.43,0.01-2.85,0.03-4.28,0.04c-0.71,1.24-1.42,2.48-2.13,3.72c0.71,1.23,1.43,2.46,2.14,3.68
+ C505.32,25.31,506.75,25.29,508.17,25.27z"/>
+
+ <linearGradient id="SVGID_97_" gradientUnits="userSpaceOnUse" x1="-242.4224" y1="-329.5483" x2="-238.1445" y2="-322.1389" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_97_)" d="M508.15,14.34c0.71-1.24,1.42-2.47,2.13-3.71c-0.71-1.23-1.43-2.46-2.14-3.69
+ c-1.42,0-2.85,0.01-4.27,0.01c-0.71,1.24-1.42,2.47-2.13,3.71c0.71,1.23,1.43,2.46,2.14,3.69
+ C505.3,14.37,506.73,14.35,508.15,14.34z"/>
+
+ <linearGradient id="SVGID_98_" gradientUnits="userSpaceOnUse" x1="-241.3369" y1="-338.6299" x2="-238.1338" y2="-333.0819" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_98_)" d="M501.72-0.28c0.71,1.24,1.43,2.47,2.14,3.7c1.43,0,2.85,0,4.27-0.01c0.71-1.23,1.42-2.47,2.13-3.7
+ C507.41-0.28,504.57-0.28,501.72-0.28z"/>
+
+ <linearGradient id="SVGID_99_" gradientUnits="userSpaceOnUse" x1="-231.75" y1="-258.5693" x2="-228.4551" y2="-252.8624" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_99_)" d="M499.6,81.57c-0.71-1.21-1.43-2.43-2.14-3.64c-1.43,0.04-2.86,0.08-4.28,0.12
+ c-0.71,1.26-1.43,2.52-2.14,3.78C493.89,81.75,496.75,81.67,499.6,81.57z"/>
+
+ <linearGradient id="SVGID_100_" gradientUnits="userSpaceOnUse" x1="-231.75" y1="-269.5381" x2="-227.415" y2="-262.0297" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_100_)" d="M497.46,74.38c0.71-1.26,1.42-2.52,2.13-3.77c-0.71-1.22-1.43-2.43-2.14-3.65
+ c-1.43,0.04-2.86,0.07-4.28,0.11c-0.71,1.26-1.42,2.51-2.13,3.77c0.71,1.22,1.43,2.45,2.14,3.67
+ C494.6,74.46,496.03,74.42,497.46,74.38z"/>
+
+ <linearGradient id="SVGID_101_" gradientUnits="userSpaceOnUse" x1="-231.7305" y1="-280.5166" x2="-227.4038" y2="-273.0226" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_101_)" d="M497.44,63.4c0.71-1.26,1.42-2.51,2.13-3.76c-0.71-1.22-1.43-2.44-2.14-3.66
+ c-1.43,0.03-2.85,0.06-4.28,0.09c-0.71,1.25-1.42,2.51-2.13,3.76c0.71,1.23,1.43,2.45,2.14,3.68
+ C494.58,63.47,496.01,63.44,497.44,63.4z"/>
+
+ <linearGradient id="SVGID_102_" gradientUnits="userSpaceOnUse" x1="-231.7104" y1="-291.4966" x2="-227.3921" y2="-284.017" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_102_)" d="M497.42,52.42c0.71-1.25,1.42-2.5,2.13-3.75c-0.71-1.22-1.43-2.45-2.14-3.67
+ c-1.42,0.03-2.85,0.05-4.28,0.07c-0.71,1.25-1.42,2.5-2.13,3.75c0.71,1.23,1.43,2.46,2.14,3.68
+ C494.57,52.48,496,52.45,497.42,52.42z"/>
+
+ <linearGradient id="SVGID_103_" gradientUnits="userSpaceOnUse" x1="-231.6929" y1="-302.4766" x2="-227.3818" y2="-295.0096" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_103_)" d="M497.4,41.44c0.71-1.25,1.42-2.5,2.13-3.75c-0.72-1.22-1.43-2.45-2.14-3.68
+ c-1.42,0.02-2.85,0.04-4.28,0.05c-0.71,1.25-1.43,2.5-2.13,3.75c0.71,1.23,1.43,2.46,2.14,3.69
+ C494.55,41.49,495.98,41.47,497.4,41.44z"/>
+
+ <linearGradient id="SVGID_104_" gradientUnits="userSpaceOnUse" x1="-231.6724" y1="-313.4556" x2="-227.3706" y2="-306.0047" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_104_)" d="M497.39,30.46c0.71-1.25,1.42-2.49,2.13-3.74c-0.71-1.23-1.43-2.46-2.14-3.69
+ c-1.43,0.01-2.85,0.02-4.28,0.03c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.23,1.43,2.46,2.14,3.7
+ C494.54,30.5,495.96,30.48,497.39,30.46z"/>
+
+ <linearGradient id="SVGID_105_" gradientUnits="userSpaceOnUse" x1="-231.6548" y1="-324.4355" x2="-227.3584" y2="-316.994" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_105_)" d="M497.38,19.49c0.71-1.24,1.42-2.48,2.13-3.73c-0.71-1.23-1.43-2.46-2.14-3.7
+ c-1.42,0.01-2.85,0.01-4.28,0.02c-0.71,1.24-1.42,2.49-2.13,3.73c0.71,1.24,1.43,2.47,2.14,3.71
+ C494.52,19.51,495.95,19.5,497.38,19.49z"/>
+
+ <linearGradient id="SVGID_106_" gradientUnits="userSpaceOnUse" x1="-231.6353" y1="-335.4165" x2="-227.3472" y2="-327.9893" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_106_)" d="M497.36,8.51c0.71-1.24,1.42-2.48,2.13-3.71c-0.71-1.24-1.43-2.47-2.14-3.71
+ c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.42,2.48-2.13,3.73c0.71,1.24,1.43,2.48,2.14,3.71C494.51,8.52,495.93,8.51,497.36,8.51z"/>
+
+ <linearGradient id="SVGID_107_" gradientUnits="userSpaceOnUse" x1="-220.5879" y1="-263.3618" x2="-216.251" y2="-255.8501" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_107_)" d="M486.29,80.58c0.71-1.26,1.43-2.52,2.14-3.78c-0.71-1.23-1.43-2.45-2.14-3.68
+ c-1.43,0.03-2.86,0.06-4.28,0.08c-0.71,1.26-1.42,2.51-2.14,3.77c0.72,1.23,1.43,2.46,2.14,3.69
+ C483.43,80.64,484.86,80.61,486.29,80.58z"/>
+
+ <linearGradient id="SVGID_108_" gradientUnits="userSpaceOnUse" x1="-220.5737" y1="-274.3813" x2="-216.2437" y2="-266.8814" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_108_)" d="M486.28,69.56c0.71-1.25,1.42-2.51,2.14-3.77c-0.72-1.23-1.43-2.46-2.15-3.69
+ c-1.43,0.03-2.85,0.05-4.28,0.07c-0.71,1.26-1.42,2.51-2.14,3.77c0.72,1.23,1.43,2.47,2.14,3.7
+ C483.42,69.62,484.85,69.59,486.28,69.56z"/>
+
+ <linearGradient id="SVGID_109_" gradientUnits="userSpaceOnUse" x1="-220.5591" y1="-285.3999" x2="-216.2354" y2="-277.911" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_109_)" d="M486.27,58.54c0.71-1.25,1.42-2.51,2.13-3.76c-0.71-1.23-1.43-2.46-2.14-3.69
+ c-1.43,0.02-2.85,0.04-4.28,0.05c-0.71,1.25-1.42,2.51-2.13,3.76c0.71,1.24,1.43,2.47,2.14,3.71
+ C483.41,58.59,484.84,58.57,486.27,58.54z"/>
+
+ <linearGradient id="SVGID_110_" gradientUnits="userSpaceOnUse" x1="-220.5444" y1="-296.4189" x2="-216.2271" y2="-288.941" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_110_)" d="M486.25,47.52c0.71-1.25,1.42-2.5,2.13-3.75c-0.71-1.23-1.43-2.46-2.14-3.7
+ c-1.43,0.01-2.85,0.03-4.28,0.04c-0.71,1.25-1.42,2.5-2.13,3.75c0.71,1.24,1.43,2.47,2.14,3.71
+ C483.4,47.56,484.83,47.54,486.25,47.52z"/>
+
+ <linearGradient id="SVGID_111_" gradientUnits="userSpaceOnUse" x1="-220.5317" y1="-307.4409" x2="-216.2197" y2="-299.9723" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_111_)" d="M486.24,36.5c0.71-1.25,1.42-2.5,2.13-3.75c-0.71-1.24-1.43-2.47-2.14-3.71
+ c-1.43,0.01-2.85,0.02-4.28,0.03c-0.71,1.25-1.42,2.5-2.13,3.75c0.71,1.24,1.43,2.48,2.14,3.71
+ C483.39,36.53,484.82,36.52,486.24,36.5z"/>
+
+ <linearGradient id="SVGID_112_" gradientUnits="userSpaceOnUse" x1="-220.5171" y1="-318.4595" x2="-216.2109" y2="-311.001" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_112_)" d="M486.23,25.49c0.71-1.25,1.42-2.49,2.13-3.74c-0.71-1.24-1.43-2.47-2.14-3.71
+ c-1.42,0.01-2.85,0.01-4.27,0.02c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.24,1.43,2.48,2.14,3.72
+ C483.38,25.51,484.8,25.5,486.23,25.49z"/>
+
+ <linearGradient id="SVGID_113_" gradientUnits="userSpaceOnUse" x1="-220.5044" y1="-329.481" x2="-216.2031" y2="-322.0309" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_113_)" d="M486.22,14.47c0.71-1.25,1.42-2.49,2.13-3.74c-0.71-1.24-1.43-2.48-2.14-3.72
+ c-1.42,0-2.85,0-4.28,0.01c-0.71,1.24-1.42,2.49-2.13,3.73c0.71,1.24,1.42,2.49,2.14,3.73C483.37,14.48,484.79,14.47,486.22,14.47z
+ "/>
+
+ <linearGradient id="SVGID_114_" gradientUnits="userSpaceOnUse" x1="-219.4209" y1="-338.6265" x2="-216.2041" y2="-333.0548" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_114_)" d="M479.79-0.28c0.71,1.24,1.43,2.49,2.14,3.73c1.42,0,2.85,0,4.27,0c0.71-1.24,1.42-2.49,2.13-3.73
+ C485.49-0.28,482.64-0.28,479.79-0.28z"/>
+
+ <linearGradient id="SVGID_115_" gradientUnits="userSpaceOnUse" x1="-209.7646" y1="-258.085" x2="-206.5078" y2="-252.444" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_115_)" d="M477.62,82.12c-0.72-1.23-1.43-2.47-2.15-3.7c-1.43,0.02-2.86,0.04-4.28,0.05
+ c-0.71,1.25-1.43,2.51-2.14,3.76C471.91,82.2,474.76,82.16,477.62,82.12z"/>
+
+ <linearGradient id="SVGID_116_" gradientUnits="userSpaceOnUse" x1="-209.7695" y1="-269.1221" x2="-205.4429" y2="-261.6281" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_116_)" d="M475.47,74.84c0.71-1.25,1.42-2.51,2.14-3.77c-0.71-1.23-1.43-2.47-2.14-3.71
+ c-1.43,0.02-2.86,0.03-4.28,0.04c-0.71,1.25-1.43,2.51-2.14,3.76c0.71,1.24,1.43,2.48,2.14,3.72
+ C472.62,74.88,474.04,74.86,475.47,74.84z"/>
+
+ <linearGradient id="SVGID_117_" gradientUnits="userSpaceOnUse" x1="-209.7617" y1="-280.1714" x2="-205.4375" y2="-272.6816" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_117_)" d="M475.46,63.8c0.71-1.25,1.43-2.51,2.14-3.76c-0.71-1.24-1.43-2.47-2.14-3.71
+ c-1.43,0.02-2.85,0.03-4.28,0.04c-0.71,1.25-1.42,2.5-2.14,3.75c0.72,1.24,1.43,2.48,2.14,3.72
+ C472.61,63.83,474.04,63.81,475.46,63.8z"/>
+
+ <linearGradient id="SVGID_118_" gradientUnits="userSpaceOnUse" x1="-209.7529" y1="-291.2163" x2="-205.4326" y2="-283.7333" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_118_)" d="M475.46,52.75c0.71-1.25,1.42-2.5,2.13-3.75c-0.71-1.24-1.43-2.48-2.14-3.72
+ c-1.43,0.01-2.85,0.02-4.28,0.03c-0.71,1.25-1.42,2.5-2.14,3.75c0.71,1.24,1.43,2.48,2.14,3.73
+ C472.61,52.77,474.03,52.76,475.46,52.75z"/>
+
+ <linearGradient id="SVGID_119_" gradientUnits="userSpaceOnUse" x1="-209.7437" y1="-302.2632" x2="-205.4272" y2="-294.787" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_119_)" d="M475.45,41.7c0.71-1.25,1.42-2.5,2.13-3.75c-0.71-1.24-1.43-2.48-2.14-3.72
+ c-1.43,0.01-2.85,0.02-4.28,0.02c-0.71,1.25-1.42,2.5-2.13,3.75c0.71,1.24,1.43,2.49,2.14,3.73
+ C472.6,41.72,474.02,41.71,475.45,41.7z"/>
+
+ <linearGradient id="SVGID_120_" gradientUnits="userSpaceOnUse" x1="-209.7354" y1="-313.3101" x2="-205.4229" y2="-305.8406" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_120_)" d="M475.44,30.66c0.71-1.25,1.42-2.5,2.13-3.75c-0.71-1.24-1.43-2.48-2.14-3.73
+ c-1.43,0.01-2.85,0.01-4.28,0.02c-0.71,1.25-1.42,2.5-2.13,3.75c0.71,1.24,1.43,2.49,2.14,3.73
+ C472.59,30.67,474.02,30.66,475.44,30.66z"/>
+
+ <linearGradient id="SVGID_121_" gradientUnits="userSpaceOnUse" x1="-209.7261" y1="-324.355" x2="-205.417" y2="-316.8914" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_121_)" d="M475.44,19.61c0.71-1.25,1.42-2.49,2.13-3.74c-0.71-1.24-1.43-2.49-2.14-3.73
+ c-1.43,0-2.85,0.01-4.27,0.01c-0.71,1.25-1.42,2.5-2.14,3.74c0.71,1.25,1.43,2.49,2.14,3.73
+ C472.59,19.62,474.01,19.62,475.44,19.61z"/>
+
+ <linearGradient id="SVGID_122_" gradientUnits="userSpaceOnUse" x1="-209.7183" y1="-335.4033" x2="-205.4121" y2="-327.9449" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_122_)" d="M475.43,8.56c0.71-1.25,1.42-2.49,2.13-3.74c-0.71-1.24-1.43-2.49-2.14-3.73
+ c-1.42,0-2.85,0-4.27,0c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.43,2.49,2.14,3.74C472.58,8.57,474,8.57,475.43,8.56z"/>
+
+ <linearGradient id="SVGID_123_" gradientUnits="userSpaceOnUse" x1="90.915" y1="-257.9634" x2="94.127" y2="-252.4002" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_123_)" d="M176.95,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.28-0.02
+ c-0.71,1.24-1.43,2.49-2.14,3.72C171.23,82.27,174.09,82.28,176.95,82.29z"/>
+
+ <linearGradient id="SVGID_124_" gradientUnits="userSpaceOnUse" x1="90.9062" y1="-269.0225" x2="95.2104" y2="-261.5674" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_124_)" d="M174.8,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.86-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C171.95,74.95,173.38,74.96,174.8,74.96
+ z"/>
+
+ <linearGradient id="SVGID_125_" gradientUnits="userSpaceOnUse" x1="90.9033" y1="-280.0854" x2="95.209" y2="-272.6278" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_125_)" d="M174.8,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C171.95,63.89,173.38,63.89,174.8,63.9z"/>
+
+ <linearGradient id="SVGID_126_" gradientUnits="userSpaceOnUse" x1="90.9009" y1="-291.1475" x2="95.2061" y2="-283.6907" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_126_)" d="M174.81,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75
+ C171.95,52.83,173.38,52.83,174.81,52.83z"/>
+
+ <linearGradient id="SVGID_127_" gradientUnits="userSpaceOnUse" x1="90.8984" y1="-302.2114" x2="95.2056" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_127_)" d="M174.81,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.49-2.14-3.74
+ c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C171.96,41.77,173.38,41.77,174.81,41.77z"
+ />
+
+ <linearGradient id="SVGID_128_" gradientUnits="userSpaceOnUse" x1="90.897" y1="-313.2734" x2="95.2036" y2="-305.8141" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_128_)" d="M174.81,30.71c0.71-1.25,1.43-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C171.96,30.7,173.38,30.71,174.81,30.71z"/>
+
+ <linearGradient id="SVGID_129_" gradientUnits="userSpaceOnUse" x1="90.8945" y1="-324.3364" x2="95.2026" y2="-316.8746" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_129_)" d="M174.81,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.27,0
+ c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C171.96,19.64,173.38,19.64,174.81,19.64z"/>
+
+ <linearGradient id="SVGID_130_" gradientUnits="userSpaceOnUse" x1="90.8911" y1="-335.4014" x2="95.1997" y2="-327.9387" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_130_)" d="M174.81,8.58c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.75c-1.42,0-2.85,0-4.27,0
+ c-0.71,1.25-1.43,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C171.96,8.58,173.39,8.58,174.81,8.58z"/>
+
+ <linearGradient id="SVGID_131_" gradientUnits="userSpaceOnUse" x1="102.0923" y1="-263.147" x2="106.3779" y2="-255.724" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_131_)" d="M163.63,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76
+ c-1.43-0.02-2.86-0.03-4.28-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77
+ C160.77,80.8,162.2,80.82,163.63,80.83z"/>
+
+ <linearGradient id="SVGID_132_" gradientUnits="userSpaceOnUse" x1="102.0825" y1="-274.1987" x2="106.3711" y2="-266.7707" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_132_)" d="M163.63,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.76
+ c-1.43-0.01-2.85-0.03-4.28-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.43,2.51,2.14,3.76
+ C160.78,69.75,162.21,69.77,163.63,69.78z"/>
+
+ <linearGradient id="SVGID_133_" gradientUnits="userSpaceOnUse" x1="102.0747" y1="-285.251" x2="106.3657" y2="-277.8187" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_133_)" d="M163.64,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.51,2.14,3.76
+ C160.79,58.7,162.21,58.72,163.64,58.73z"/>
+
+ <linearGradient id="SVGID_134_" gradientUnits="userSpaceOnUse" x1="102.0659" y1="-296.3032" x2="106.3608" y2="-288.8642" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_134_)" d="M163.64,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.14,3.76
+ C160.79,47.66,162.22,47.67,163.64,47.67z"/>
+
+ <linearGradient id="SVGID_135_" gradientUnits="userSpaceOnUse" x1="102.0581" y1="-307.3564" x2="106.356" y2="-299.9124" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_135_)" d="M163.65,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75
+ C160.8,36.61,162.22,36.61,163.65,36.62z"/>
+
+ <linearGradient id="SVGID_136_" gradientUnits="userSpaceOnUse" x1="102.0498" y1="-318.4067" x2="106.3501" y2="-310.9584" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_136_)" d="M163.66,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.42,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.42,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74
+ C160.81,25.56,162.23,25.56,163.66,25.57z"/>
+
+ <linearGradient id="SVGID_137_" gradientUnits="userSpaceOnUse" x1="102.041" y1="-329.4595" x2="106.3452" y2="-322.0044" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_137_)" d="M163.66,14.51c0.71-1.24,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74
+ c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C160.81,14.51,162.24,14.51,163.66,14.51z"/>
+
+ <linearGradient id="SVGID_138_" gradientUnits="userSpaceOnUse" x1="103.1108" y1="-338.6255" x2="106.3306" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_138_)" d="M157.26-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74
+ C162.96-0.28,160.11-0.28,157.26-0.28z"/>
+
+ <linearGradient id="SVGID_139_" gradientUnits="userSpaceOnUse" x1="69.4688" y1="-257.9639" x2="72.6816" y2="-252.399" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_139_)" d="M198.39,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02
+ c-0.71,1.24-1.43,2.49-2.14,3.72C192.68,82.27,195.54,82.28,198.39,82.29z"/>
+
+ <linearGradient id="SVGID_140_" gradientUnits="userSpaceOnUse" x1="69.4604" y1="-269.0225" x2="73.7646" y2="-261.5674" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_140_)" d="M196.25,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75
+ C193.39,74.95,194.82,74.96,196.25,74.96z"/>
+
+ <linearGradient id="SVGID_141_" gradientUnits="userSpaceOnUse" x1="69.4565" y1="-280.0859" x2="73.7627" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_141_)" d="M196.25,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C193.4,63.89,194.82,63.89,196.25,63.9z"/>
+
+ <linearGradient id="SVGID_142_" gradientUnits="userSpaceOnUse" x1="69.4551" y1="-291.1479" x2="73.7607" y2="-283.6903" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_142_)" d="M196.25,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C193.4,52.83,194.83,52.83,196.25,52.83
+ z"/>
+
+ <linearGradient id="SVGID_143_" gradientUnits="userSpaceOnUse" x1="69.4531" y1="-302.2114" x2="73.7603" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_143_)" d="M196.25,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.49-2.14-3.74
+ c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C193.4,41.77,194.83,41.77,196.25,41.77z"
+ />
+
+ <linearGradient id="SVGID_144_" gradientUnits="userSpaceOnUse" x1="69.4507" y1="-313.2739" x2="73.7578" y2="-305.8138" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_144_)" d="M196.26,30.71c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.43,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C193.4,30.7,194.83,30.71,196.26,30.71z"/>
+
+ <linearGradient id="SVGID_145_" gradientUnits="userSpaceOnUse" x1="69.4487" y1="-324.3374" x2="73.7573" y2="-316.8747" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_145_)" d="M196.26,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.43,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C193.41,19.64,194.83,19.64,196.26,19.64z"/>
+
+ <linearGradient id="SVGID_146_" gradientUnits="userSpaceOnUse" x1="69.4448" y1="-335.4019" x2="73.7539" y2="-327.9383" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_146_)" d="M196.26,8.58c0.71-1.25,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.75c-1.43,0-2.85,0-4.27,0
+ c-0.71,1.25-1.42,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C193.41,8.58,194.83,8.58,196.26,8.58z"/>
+
+ <linearGradient id="SVGID_147_" gradientUnits="userSpaceOnUse" x1="80.647" y1="-263.147" x2="84.9326" y2="-255.724" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_147_)" d="M185.07,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76
+ c-1.43-0.02-2.86-0.03-4.28-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77
+ C182.22,80.8,183.64,80.82,185.07,80.83z"/>
+
+ <linearGradient id="SVGID_148_" gradientUnits="userSpaceOnUse" x1="80.6372" y1="-274.1987" x2="84.9258" y2="-266.7707" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_148_)" d="M185.08,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.42-2.5-2.14-3.76
+ c-1.43-0.01-2.85-0.03-4.28-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.43,2.51,2.14,3.76
+ C182.22,69.75,183.65,69.77,185.08,69.78z"/>
+
+ <linearGradient id="SVGID_149_" gradientUnits="userSpaceOnUse" x1="80.6304" y1="-285.251" x2="84.9219" y2="-277.8179" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_149_)" d="M185.08,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.51,2.14,3.76
+ C182.23,58.7,183.66,58.72,185.08,58.73z"/>
+
+ <linearGradient id="SVGID_150_" gradientUnits="userSpaceOnUse" x1="80.6216" y1="-296.3037" x2="84.917" y2="-288.8638" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_150_)" d="M185.09,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.5,2.14,3.76
+ C182.24,47.66,183.67,47.67,185.09,47.67z"/>
+
+ <linearGradient id="SVGID_151_" gradientUnits="userSpaceOnUse" x1="80.6123" y1="-307.356" x2="84.9102" y2="-299.9119" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_151_)" d="M185.1,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75
+ C182.24,36.61,183.67,36.61,185.1,36.62z"/>
+
+ <linearGradient id="SVGID_152_" gradientUnits="userSpaceOnUse" x1="80.604" y1="-318.4067" x2="84.9043" y2="-310.9584" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_152_)" d="M185.1,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.14-3.75
+ c-1.42,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74C182.25,25.56,183.68,25.56,185.1,25.57
+ z"/>
+
+ <linearGradient id="SVGID_153_" gradientUnits="userSpaceOnUse" x1="80.5957" y1="-329.4595" x2="84.8999" y2="-322.0044" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_153_)" d="M185.11,14.51c0.71-1.24,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74
+ c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C182.26,14.51,183.68,14.51,185.11,14.51z"/>
+
+ <linearGradient id="SVGID_154_" gradientUnits="userSpaceOnUse" x1="81.665" y1="-338.6255" x2="84.8848" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_154_)" d="M178.71-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74
+ C184.4-0.28,181.56-0.28,178.71-0.28z"/>
+
+ <linearGradient id="SVGID_155_" gradientUnits="userSpaceOnUse" x1="48.0234" y1="-257.9639" x2="51.2363" y2="-252.399" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_155_)" d="M219.84,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02
+ c-0.71,1.24-1.43,2.49-2.14,3.72C214.12,82.27,216.98,82.28,219.84,82.29z"/>
+
+ <linearGradient id="SVGID_156_" gradientUnits="userSpaceOnUse" x1="48.0156" y1="-269.0225" x2="52.3203" y2="-261.5665" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_156_)" d="M217.7,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.72-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C214.84,74.95,216.27,74.96,217.7,74.96
+ z"/>
+
+ <linearGradient id="SVGID_157_" gradientUnits="userSpaceOnUse" x1="48.0117" y1="-280.0859" x2="52.3179" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_157_)" d="M217.7,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C214.84,63.89,216.27,63.89,217.7,63.9z"/>
+
+ <linearGradient id="SVGID_158_" gradientUnits="userSpaceOnUse" x1="48.0107" y1="-291.1484" x2="52.3169" y2="-283.69" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_158_)" d="M217.7,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.42,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C214.84,52.83,216.27,52.83,217.7,52.83
+ z"/>
+
+ <linearGradient id="SVGID_159_" gradientUnits="userSpaceOnUse" x1="48.0078" y1="-302.2109" x2="52.3149" y2="-294.7508" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_159_)" d="M217.7,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.49-2.14-3.74
+ c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C214.85,41.77,216.27,41.77,217.7,41.77z"
+ />
+
+ <linearGradient id="SVGID_160_" gradientUnits="userSpaceOnUse" x1="48.0054" y1="-313.2739" x2="52.3125" y2="-305.8138" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_160_)" d="M217.7,30.71c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.43,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C214.85,30.7,216.28,30.71,217.7,30.71z"/>
+
+ <linearGradient id="SVGID_161_" gradientUnits="userSpaceOnUse" x1="48.0029" y1="-324.3374" x2="52.3115" y2="-316.8747" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_161_)" d="M217.7,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.43,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C214.85,19.64,216.28,19.64,217.7,19.64z"/>
+
+ <linearGradient id="SVGID_162_" gradientUnits="userSpaceOnUse" x1="47.9995" y1="-335.4019" x2="52.3086" y2="-327.9383" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_162_)" d="M217.7,8.58c0.71-1.25,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.75c-1.43,0-2.85,0-4.27,0
+ c-0.71,1.25-1.42,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C214.85,8.58,216.28,8.58,217.7,8.58z"/>
+
+ <linearGradient id="SVGID_163_" gradientUnits="userSpaceOnUse" x1="59.2012" y1="-263.1475" x2="63.4878" y2="-255.7228" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_163_)" d="M206.52,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76
+ c-1.43-0.02-2.86-0.03-4.29-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77
+ C203.66,80.8,205.09,80.82,206.52,80.83z"/>
+
+ <linearGradient id="SVGID_164_" gradientUnits="userSpaceOnUse" x1="59.1914" y1="-274.1997" x2="63.481" y2="-266.77" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_164_)" d="M206.53,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.42-2.5-2.14-3.76
+ c-1.43-0.01-2.86-0.03-4.29-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.43,2.51,2.14,3.76
+ C203.67,69.75,205.1,69.77,206.53,69.78z"/>
+
+ <linearGradient id="SVGID_165_" gradientUnits="userSpaceOnUse" x1="59.1846" y1="-285.251" x2="63.4761" y2="-277.8179" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_165_)" d="M206.53,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.51,2.14,3.76
+ C203.68,58.7,205.1,58.72,206.53,58.73z"/>
+
+ <linearGradient id="SVGID_166_" gradientUnits="userSpaceOnUse" x1="59.1753" y1="-296.3032" x2="63.4707" y2="-288.8633" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_166_)" d="M206.54,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.5,2.14,3.76
+ C203.68,47.66,205.11,47.67,206.54,47.67z"/>
+
+ <linearGradient id="SVGID_167_" gradientUnits="userSpaceOnUse" x1="59.1665" y1="-307.3555" x2="63.4644" y2="-299.9114" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_167_)" d="M206.54,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75
+ C203.69,36.61,205.12,36.61,206.54,36.62z"/>
+
+ <linearGradient id="SVGID_168_" gradientUnits="userSpaceOnUse" x1="59.1582" y1="-318.4077" x2="63.459" y2="-310.9586" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_168_)" d="M206.55,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74C203.7,25.56,205.12,25.56,206.55,25.57
+ z"/>
+
+ <linearGradient id="SVGID_169_" gradientUnits="userSpaceOnUse" x1="59.1489" y1="-329.46" x2="63.4536" y2="-322.004" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_169_)" d="M206.55,14.51c0.71-1.24,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74
+ c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C203.7,14.51,205.13,14.51,206.55,14.51z"/>
+
+ <linearGradient id="SVGID_170_" gradientUnits="userSpaceOnUse" x1="60.2197" y1="-338.6255" x2="63.4395" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_170_)" d="M200.15-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74
+ C205.85-0.28,203-0.28,200.15-0.28z"/>
+
+ <linearGradient id="SVGID_171_" gradientUnits="userSpaceOnUse" x1="26.5781" y1="-257.9639" x2="29.791" y2="-252.399" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_171_)" d="M241.28,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02
+ c-0.71,1.24-1.43,2.49-2.14,3.72C235.57,82.27,238.43,82.28,241.28,82.29z"/>
+
+ <linearGradient id="SVGID_172_" gradientUnits="userSpaceOnUse" x1="26.5708" y1="-269.0229" x2="30.8755" y2="-261.567" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_172_)" d="M239.14,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.72-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75
+ C236.29,74.95,237.71,74.96,239.14,74.96z"/>
+
+ <linearGradient id="SVGID_173_" gradientUnits="userSpaceOnUse" x1="26.5664" y1="-280.0859" x2="30.8726" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_173_)" d="M239.14,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C236.29,63.89,237.71,63.89,239.14,63.9z"
+ />
+
+ <linearGradient id="SVGID_174_" gradientUnits="userSpaceOnUse" x1="26.5654" y1="-291.1484" x2="30.8716" y2="-283.69" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_174_)" d="M239.14,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75
+ C236.29,52.83,237.72,52.83,239.14,52.83z"/>
+
+ <linearGradient id="SVGID_175_" gradientUnits="userSpaceOnUse" x1="26.5625" y1="-302.2109" x2="30.8696" y2="-294.7508" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_175_)" d="M239.14,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.49-2.14-3.74
+ c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C236.29,41.77,237.72,41.77,239.14,41.77z"
+ />
+
+ <linearGradient id="SVGID_176_" gradientUnits="userSpaceOnUse" x1="26.5601" y1="-313.2739" x2="30.8672" y2="-305.8138" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_176_)" d="M239.15,30.71c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.43,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C236.29,30.7,237.72,30.71,239.15,30.71z"/>
+
+ <linearGradient id="SVGID_177_" gradientUnits="userSpaceOnUse" x1="26.5576" y1="-324.3374" x2="30.8662" y2="-316.8747" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_177_)" d="M239.15,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.43,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C236.3,19.64,237.72,19.64,239.15,19.64z"/>
+
+ <linearGradient id="SVGID_178_" gradientUnits="userSpaceOnUse" x1="26.5547" y1="-335.4023" x2="30.8638" y2="-327.9388" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_178_)" d="M239.15,8.58c0.71-1.25,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.75c-1.43,0-2.85,0-4.27,0
+ c-0.71,1.25-1.42,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C236.3,8.58,237.72,8.58,239.15,8.58z"/>
+
+ <linearGradient id="SVGID_179_" gradientUnits="userSpaceOnUse" x1="37.7559" y1="-263.1475" x2="42.0425" y2="-255.7228" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_179_)" d="M227.96,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76
+ c-1.43-0.02-2.86-0.03-4.29-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77
+ C225.11,80.8,226.54,80.82,227.96,80.83z"/>
+
+ <linearGradient id="SVGID_180_" gradientUnits="userSpaceOnUse" x1="37.7461" y1="-274.1997" x2="42.0356" y2="-266.77" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_180_)" d="M227.97,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.76
+ c-1.43-0.01-2.86-0.03-4.29-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.43,2.51,2.14,3.76
+ C225.11,69.75,226.54,69.77,227.97,69.78z"/>
+
+ <linearGradient id="SVGID_181_" gradientUnits="userSpaceOnUse" x1="37.7393" y1="-285.251" x2="42.0308" y2="-277.8179" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_181_)" d="M227.98,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.51,2.14,3.76
+ C225.12,58.7,226.55,58.72,227.98,58.73z"/>
+
+ <linearGradient id="SVGID_182_" gradientUnits="userSpaceOnUse" x1="37.73" y1="-296.3032" x2="42.0254" y2="-288.8633" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_182_)" d="M227.98,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.5,2.14,3.76
+ C225.13,47.66,226.56,47.67,227.98,47.67z"/>
+
+ <linearGradient id="SVGID_183_" gradientUnits="userSpaceOnUse" x1="37.7207" y1="-307.3555" x2="42.0186" y2="-299.9114" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_183_)" d="M227.99,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75
+ C225.13,36.61,226.56,36.61,227.99,36.62z"/>
+
+ <linearGradient id="SVGID_184_" gradientUnits="userSpaceOnUse" x1="37.7129" y1="-318.4077" x2="42.0137" y2="-310.9586" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_184_)" d="M227.99,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.42,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74
+ C225.14,25.56,226.57,25.56,227.99,25.57z"/>
+
+ <linearGradient id="SVGID_185_" gradientUnits="userSpaceOnUse" x1="37.7046" y1="-329.459" x2="42.0088" y2="-322.0039" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_185_)" d="M228,14.51c0.71-1.24,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.27,0
+ c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C225.15,14.51,226.57,14.51,228,14.51z"/>
+
+ <linearGradient id="SVGID_186_" gradientUnits="userSpaceOnUse" x1="38.7744" y1="-338.6255" x2="41.9941" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_186_)" d="M221.6-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74
+ C227.29-0.28,224.45-0.28,221.6-0.28z"/>
+
+ <linearGradient id="SVGID_187_" gradientUnits="userSpaceOnUse" x1="5.1328" y1="-257.9639" x2="8.3452" y2="-252.3998" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_187_)" d="M262.73,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02
+ c-0.71,1.24-1.43,2.49-2.14,3.72C257.02,82.27,259.87,82.28,262.73,82.29z"/>
+
+ <linearGradient id="SVGID_188_" gradientUnits="userSpaceOnUse" x1="5.1255" y1="-269.0229" x2="9.4302" y2="-261.567" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_188_)" d="M260.59,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.72-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.75
+ C257.73,74.95,259.16,74.96,260.59,74.96z"/>
+
+ <linearGradient id="SVGID_189_" gradientUnits="userSpaceOnUse" x1="5.1216" y1="-280.0859" x2="9.4277" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_189_)" d="M260.59,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C257.73,63.89,259.16,63.89,260.59,63.9z"
+ />
+
+ <linearGradient id="SVGID_190_" gradientUnits="userSpaceOnUse" x1="5.1201" y1="-291.1484" x2="9.4263" y2="-283.69" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_190_)" d="M260.59,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75
+ C257.73,52.83,259.16,52.83,260.59,52.83z"/>
+
+ <linearGradient id="SVGID_191_" gradientUnits="userSpaceOnUse" x1="5.1172" y1="-302.2114" x2="9.4243" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_191_)" d="M260.59,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.49-2.14-3.74
+ c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C257.74,41.77,259.16,41.77,260.59,41.77z"
+ />
+
+ <linearGradient id="SVGID_192_" gradientUnits="userSpaceOnUse" x1="5.1143" y1="-313.2739" x2="9.4214" y2="-305.8138" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_192_)" d="M260.59,30.71c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C257.74,30.7,259.17,30.71,260.59,30.71z"/>
+
+ <linearGradient id="SVGID_193_" gradientUnits="userSpaceOnUse" x1="5.1123" y1="-324.3374" x2="9.4209" y2="-316.8747" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_193_)" d="M260.59,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.42,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C257.74,19.64,259.17,19.64,260.59,19.64z"/>
+
+ <linearGradient id="SVGID_194_" gradientUnits="userSpaceOnUse" x1="5.1094" y1="-335.4019" x2="9.4185" y2="-327.9383" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_194_)" d="M260.59,8.58c0.71-1.25,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.75c-1.42,0-2.85,0-4.27,0
+ c-0.71,1.25-1.42,2.5-2.13,3.74c0.71,1.25,1.42,2.49,2.13,3.74C257.74,8.58,259.17,8.58,260.59,8.58z"/>
+
+ <linearGradient id="SVGID_195_" gradientUnits="userSpaceOnUse" x1="16.311" y1="-263.1479" x2="20.5977" y2="-255.7233" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_195_)" d="M249.41,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76
+ c-1.43-0.02-2.86-0.03-4.29-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77
+ C246.55,80.8,247.98,80.82,249.41,80.83z"/>
+
+ <linearGradient id="SVGID_196_" gradientUnits="userSpaceOnUse" x1="16.3008" y1="-274.1997" x2="20.5903" y2="-266.77" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_196_)" d="M249.42,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.76
+ c-1.43-0.01-2.86-0.03-4.29-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.43,2.51,2.14,3.76
+ C246.56,69.75,247.99,69.77,249.42,69.78z"/>
+
+ <linearGradient id="SVGID_197_" gradientUnits="userSpaceOnUse" x1="16.2935" y1="-285.251" x2="20.585" y2="-277.8179" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_197_)" d="M249.42,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.51,2.14,3.76
+ C246.57,58.7,247.99,58.72,249.42,58.73z"/>
+
+ <linearGradient id="SVGID_198_" gradientUnits="userSpaceOnUse" x1="16.2842" y1="-296.3032" x2="20.5796" y2="-288.8633" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_198_)" d="M249.43,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.5,2.14,3.76
+ C246.57,47.66,248,47.67,249.43,47.67z"/>
+
+ <linearGradient id="SVGID_199_" gradientUnits="userSpaceOnUse" x1="16.2764" y1="-307.356" x2="20.5742" y2="-299.9119" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_199_)" d="M249.43,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75
+ C246.58,36.61,248.01,36.61,249.43,36.62z"/>
+
+ <linearGradient id="SVGID_200_" gradientUnits="userSpaceOnUse" x1="16.2686" y1="-318.4067" x2="20.5688" y2="-310.9584" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_200_)" d="M249.44,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.14-3.75
+ c-1.42,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.42,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74
+ C246.59,25.56,248.01,25.56,249.44,25.57z"/>
+
+ <linearGradient id="SVGID_201_" gradientUnits="userSpaceOnUse" x1="16.2598" y1="-329.4595" x2="20.564" y2="-322.0044" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_201_)" d="M249.44,14.51c0.71-1.24,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74
+ c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C246.6,14.51,248.02,14.51,249.44,14.51z"/>
+
+ <linearGradient id="SVGID_202_" gradientUnits="userSpaceOnUse" x1="17.3291" y1="-338.6255" x2="20.5488" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_202_)" d="M243.04-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74
+ C248.74-0.28,245.89-0.28,243.04-0.28z"/>
+
+ <linearGradient id="SVGID_203_" gradientUnits="userSpaceOnUse" x1="-16.3125" y1="-257.9639" x2="-13.1001" y2="-252.3998" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_203_)" d="M284.17,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02
+ c-0.71,1.24-1.43,2.49-2.14,3.72C278.46,82.27,281.32,82.28,284.17,82.29z"/>
+
+ <linearGradient id="SVGID_204_" gradientUnits="userSpaceOnUse" x1="-16.3208" y1="-269.0225" x2="-12.0166" y2="-261.5674" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_204_)" d="M282.03,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.72-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.75
+ C279.18,74.95,280.61,74.96,282.03,74.96z"/>
+
+ <linearGradient id="SVGID_205_" gradientUnits="userSpaceOnUse" x1="-16.3237" y1="-280.0859" x2="-12.0176" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_205_)" d="M282.03,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C279.18,63.89,280.61,63.89,282.03,63.9z"
+ />
+
+ <linearGradient id="SVGID_206_" gradientUnits="userSpaceOnUse" x1="-16.3257" y1="-291.1484" x2="-12.02" y2="-283.6908" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_206_)" d="M282.03,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75
+ C279.18,52.83,280.61,52.83,282.03,52.83z"/>
+
+ <linearGradient id="SVGID_207_" gradientUnits="userSpaceOnUse" x1="-16.3281" y1="-302.2114" x2="-12.021" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_207_)" d="M282.04,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.49-2.14-3.74
+ c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C279.18,41.77,280.61,41.77,282.04,41.77z"
+ />
+
+ <linearGradient id="SVGID_208_" gradientUnits="userSpaceOnUse" x1="-16.3296" y1="-313.2734" x2="-12.0229" y2="-305.8141" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_208_)" d="M282.04,30.71c0.71-1.25,1.43-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C279.19,30.7,280.61,30.71,282.04,30.71z"/>
+
+ <linearGradient id="SVGID_209_" gradientUnits="userSpaceOnUse" x1="-16.3325" y1="-324.3364" x2="-12.0244" y2="-316.8746" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_209_)" d="M282.04,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.27,0
+ c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C279.19,19.64,280.61,19.64,282.04,19.64z"/>
+
+ <linearGradient id="SVGID_210_" gradientUnits="userSpaceOnUse" x1="-16.3354" y1="-335.4014" x2="-12.0269" y2="-327.9387" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_210_)" d="M282.04,8.58c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.75c-1.42,0-2.85,0-4.27,0
+ c-0.71,1.25-1.43,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C279.19,8.58,280.62,8.58,282.04,8.58z"/>
+
+ <linearGradient id="SVGID_211_" gradientUnits="userSpaceOnUse" x1="-5.1348" y1="-263.1465" x2="-0.8486" y2="-255.7227" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_211_)" d="M270.86,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76
+ c-1.43-0.02-2.86-0.03-4.28-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77
+ C268,80.8,269.43,80.82,270.86,80.83z"/>
+
+ <linearGradient id="SVGID_212_" gradientUnits="userSpaceOnUse" x1="-5.144" y1="-274.1987" x2="-0.855" y2="-266.7699" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_212_)" d="M270.86,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.76
+ c-1.43-0.01-2.85-0.03-4.28-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.42,2.51,2.13,3.76
+ C268,69.75,269.43,69.77,270.86,69.78z"/>
+
+ <linearGradient id="SVGID_213_" gradientUnits="userSpaceOnUse" x1="-5.1514" y1="-285.251" x2="-0.8599" y2="-277.8179" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_213_)" d="M270.87,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.51,2.13,3.76
+ C268.01,58.7,269.44,58.72,270.87,58.73z"/>
+
+ <linearGradient id="SVGID_214_" gradientUnits="userSpaceOnUse" x1="-5.1597" y1="-296.3037" x2="-0.8643" y2="-288.8638" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_214_)" d="M270.87,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.76
+ C268.02,47.66,269.45,47.67,270.87,47.67z"/>
+
+ <linearGradient id="SVGID_215_" gradientUnits="userSpaceOnUse" x1="-5.1685" y1="-307.3564" x2="-0.8706" y2="-299.9124" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_215_)" d="M270.88,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75
+ C268.03,36.61,269.45,36.61,270.88,36.62z"/>
+
+ <linearGradient id="SVGID_216_" gradientUnits="userSpaceOnUse" x1="-5.1768" y1="-318.4067" x2="-0.8765" y2="-310.9584" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_216_)" d="M270.88,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.14-3.75
+ c-1.42,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.42,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74
+ C268.03,25.56,269.46,25.56,270.88,25.57z"/>
+
+ <linearGradient id="SVGID_217_" gradientUnits="userSpaceOnUse" x1="-5.186" y1="-329.4595" x2="-0.8818" y2="-322.0044" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_217_)" d="M270.89,14.51c0.71-1.24,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74
+ c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C268.04,14.51,269.46,14.51,270.89,14.51z"/>
+
+ <linearGradient id="SVGID_218_" gradientUnits="userSpaceOnUse" x1="-4.1157" y1="-338.6255" x2="-0.896" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_218_)" d="M264.49-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74
+ C270.19-0.28,267.34-0.28,264.49-0.28z"/>
+
+ <linearGradient id="SVGID_219_" gradientUnits="userSpaceOnUse" x1="-37.7573" y1="-257.9629" x2="-34.5454" y2="-252.3997" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_219_)" d="M305.62,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.28-0.02
+ c-0.71,1.24-1.43,2.49-2.14,3.72C299.9,82.27,302.76,82.28,305.62,82.29z"/>
+
+ <linearGradient id="SVGID_220_" gradientUnits="userSpaceOnUse" x1="-37.7656" y1="-269.0225" x2="-33.4614" y2="-261.5674" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_220_)" d="M303.47,74.96c0.72-1.25,1.43-2.49,2.14-3.74c-0.72-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.75
+ C300.62,74.95,302.05,74.96,303.47,74.96z"/>
+
+ <linearGradient id="SVGID_221_" gradientUnits="userSpaceOnUse" x1="-37.7686" y1="-280.0854" x2="-33.4629" y2="-272.6278" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_221_)" d="M303.48,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.42,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C300.62,63.89,302.05,63.89,303.48,63.9z"
+ />
+
+ <linearGradient id="SVGID_222_" gradientUnits="userSpaceOnUse" x1="-37.7705" y1="-291.1475" x2="-33.4653" y2="-283.6907" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_222_)" d="M303.48,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.42,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75
+ C300.62,52.83,302.05,52.83,303.48,52.83z"/>
+
+ <linearGradient id="SVGID_223_" gradientUnits="userSpaceOnUse" x1="-37.7734" y1="-302.2114" x2="-33.4663" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_223_)" d="M303.48,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.49-2.14-3.74
+ c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C300.63,41.77,302.05,41.77,303.48,41.77z"
+ />
+
+ <linearGradient id="SVGID_224_" gradientUnits="userSpaceOnUse" x1="-37.7749" y1="-313.2734" x2="-33.4683" y2="-305.8141" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_224_)" d="M303.48,30.71c0.71-1.25,1.43-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C300.63,30.7,302.06,30.71,303.48,30.71z"/>
+
+ <linearGradient id="SVGID_225_" gradientUnits="userSpaceOnUse" x1="-37.7778" y1="-324.3364" x2="-33.4697" y2="-316.8746" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_225_)" d="M303.48,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.27,0
+ c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C300.63,19.64,302.06,19.64,303.48,19.64z"/>
+
+ <linearGradient id="SVGID_226_" gradientUnits="userSpaceOnUse" x1="-37.7808" y1="-335.4014" x2="-33.4722" y2="-327.9387" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_226_)" d="M303.48,8.58c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.75c-1.42,0-2.85,0-4.27,0
+ c-0.71,1.25-1.43,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C300.63,8.58,302.06,8.58,303.48,8.58z"/>
+
+ <linearGradient id="SVGID_227_" gradientUnits="userSpaceOnUse" x1="-26.5801" y1="-263.1465" x2="-22.2944" y2="-255.7235" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_227_)" d="M292.3,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76
+ c-1.43-0.02-2.86-0.03-4.28-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77
+ C289.44,80.8,290.87,80.82,292.3,80.83z"/>
+
+ <linearGradient id="SVGID_228_" gradientUnits="userSpaceOnUse" x1="-26.5898" y1="-274.1987" x2="-22.3013" y2="-266.7707" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_228_)" d="M292.31,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.76
+ c-1.43-0.01-2.85-0.03-4.28-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.42,2.51,2.14,3.76
+ C289.45,69.75,290.88,69.77,292.31,69.78z"/>
+
+ <linearGradient id="SVGID_229_" gradientUnits="userSpaceOnUse" x1="-26.5967" y1="-285.251" x2="-22.3057" y2="-277.8187" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_229_)" d="M292.31,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.51,2.14,3.76
+ C289.46,58.7,290.88,58.72,292.31,58.73z"/>
+
+ <linearGradient id="SVGID_230_" gradientUnits="userSpaceOnUse" x1="-26.606" y1="-296.3032" x2="-22.311" y2="-288.8642" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_230_)" d="M292.32,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.14,3.76
+ C289.46,47.66,290.89,47.67,292.32,47.67z"/>
+
+ <linearGradient id="SVGID_231_" gradientUnits="userSpaceOnUse" x1="-26.6147" y1="-307.356" x2="-22.3169" y2="-299.9119" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_231_)" d="M292.32,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75
+ C289.47,36.61,290.9,36.61,292.32,36.62z"/>
+
+ <linearGradient id="SVGID_232_" gradientUnits="userSpaceOnUse" x1="-26.623" y1="-318.4062" x2="-22.3232" y2="-310.9588" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_232_)" d="M292.33,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.14-3.75
+ c-1.42,0-2.85-0.01-4.27-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.74C289.48,25.56,290.9,25.56,292.33,25.57
+ z"/>
+
+ <linearGradient id="SVGID_233_" gradientUnits="userSpaceOnUse" x1="-26.6309" y1="-329.4595" x2="-22.3271" y2="-322.0052" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_233_)" d="M292.33,14.51c0.71-1.24,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74
+ c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C289.49,14.51,290.91,14.51,292.33,14.51z"/>
+
+ <linearGradient id="SVGID_234_" gradientUnits="userSpaceOnUse" x1="-25.561" y1="-338.6255" x2="-22.3413" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_234_)" d="M285.94-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74
+ C291.63-0.28,288.78-0.28,285.94-0.28z"/>
+
+ <linearGradient id="SVGID_235_" gradientUnits="userSpaceOnUse" x1="-59.2031" y1="-257.9639" x2="-55.9907" y2="-252.3998" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_235_)" d="M327.06,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02
+ c-0.71,1.24-1.43,2.49-2.14,3.72C321.35,82.27,324.21,82.28,327.06,82.29z"/>
+
+ <linearGradient id="SVGID_236_" gradientUnits="userSpaceOnUse" x1="-59.2119" y1="-269.022" x2="-54.9077" y2="-261.5669" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_236_)" d="M324.92,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.72-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.75
+ C322.07,74.95,323.49,74.96,324.92,74.96z"/>
+
+ <linearGradient id="SVGID_237_" gradientUnits="userSpaceOnUse" x1="-59.2148" y1="-280.0859" x2="-54.9087" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_237_)" d="M324.92,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C322.07,63.89,323.5,63.89,324.92,63.9z"/>
+
+ <linearGradient id="SVGID_238_" gradientUnits="userSpaceOnUse" x1="-59.2163" y1="-291.1484" x2="-54.9106" y2="-283.6908" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_238_)" d="M324.92,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C322.07,52.83,323.5,52.83,324.92,52.83
+ z"/>
+
+ <linearGradient id="SVGID_239_" gradientUnits="userSpaceOnUse" x1="-59.2188" y1="-302.2114" x2="-54.9116" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_239_)" d="M324.93,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.49-2.14-3.74
+ c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C322.07,41.77,323.5,41.77,324.93,41.77z"
+ />
+
+ <linearGradient id="SVGID_240_" gradientUnits="userSpaceOnUse" x1="-59.2217" y1="-313.2739" x2="-54.9146" y2="-305.8138" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_240_)" d="M324.93,30.71c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.43,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C322.08,30.7,323.5,30.71,324.93,30.71z"/>
+
+ <linearGradient id="SVGID_241_" gradientUnits="userSpaceOnUse" x1="-59.2236" y1="-324.3369" x2="-54.915" y2="-316.8742" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_241_)" d="M324.93,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.43,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C322.08,19.64,323.5,19.64,324.93,19.64z"/>
+
+ <linearGradient id="SVGID_242_" gradientUnits="userSpaceOnUse" x1="-59.2275" y1="-335.4014" x2="-54.9185" y2="-327.9378" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_242_)" d="M324.93,8.58c0.71-1.25,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.75c-1.43,0-2.85,0-4.27,0
+ c-0.71,1.25-1.43,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C322.08,8.58,323.5,8.58,324.93,8.58z"/>
+
+ <linearGradient id="SVGID_243_" gradientUnits="userSpaceOnUse" x1="-48.0254" y1="-263.1465" x2="-43.7397" y2="-255.7235" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_243_)" d="M313.75,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76
+ c-1.43-0.02-2.86-0.03-4.28-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77
+ C310.89,80.8,312.32,80.82,313.75,80.83z"/>
+
+ <linearGradient id="SVGID_244_" gradientUnits="userSpaceOnUse" x1="-48.0352" y1="-274.1987" x2="-43.7466" y2="-266.7707" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_244_)" d="M313.75,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.42-2.5-2.14-3.76
+ c-1.43-0.01-2.85-0.03-4.28-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.42,2.51,2.14,3.76
+ C310.89,69.75,312.32,69.77,313.75,69.78z"/>
+
+ <linearGradient id="SVGID_245_" gradientUnits="userSpaceOnUse" x1="-48.042" y1="-285.251" x2="-43.751" y2="-277.8187" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_245_)" d="M313.76,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.42-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.51,2.14,3.76
+ C310.9,58.7,312.33,58.72,313.76,58.73z"/>
+
+ <linearGradient id="SVGID_246_" gradientUnits="userSpaceOnUse" x1="-48.0513" y1="-296.3032" x2="-43.7563" y2="-288.8642" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_246_)" d="M313.76,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.42-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.14,3.76
+ C310.91,47.66,312.34,47.67,313.76,47.67z"/>
+
+ <linearGradient id="SVGID_247_" gradientUnits="userSpaceOnUse" x1="-48.0596" y1="-307.356" x2="-43.7617" y2="-299.9119" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_247_)" d="M313.77,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75
+ C310.92,36.61,312.34,36.61,313.77,36.62z"/>
+
+ <linearGradient id="SVGID_248_" gradientUnits="userSpaceOnUse" x1="-48.0684" y1="-318.4062" x2="-43.7686" y2="-310.9588" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_248_)" d="M313.78,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.14-3.75
+ c-1.42,0-2.85-0.01-4.27-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.74
+ C310.92,25.56,312.35,25.56,313.78,25.57z"/>
+
+ <linearGradient id="SVGID_249_" gradientUnits="userSpaceOnUse" x1="-48.0762" y1="-329.4595" x2="-43.7725" y2="-322.0052" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_249_)" d="M313.78,14.51c0.71-1.24,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74
+ c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C310.93,14.51,312.36,14.51,313.78,14.51z"/>
+
+ <linearGradient id="SVGID_250_" gradientUnits="userSpaceOnUse" x1="-47.0068" y1="-338.6255" x2="-43.7871" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_250_)" d="M307.38-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74
+ C313.08-0.28,310.23-0.28,307.38-0.28z"/>
+
+ <linearGradient id="SVGID_251_" gradientUnits="userSpaceOnUse" x1="-80.6489" y1="-257.9639" x2="-77.4365" y2="-252.3998" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_251_)" d="M348.51,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02
+ c-0.71,1.24-1.43,2.49-2.14,3.72C342.79,82.27,345.65,82.28,348.51,82.29z"/>
+
+ <linearGradient id="SVGID_252_" gradientUnits="userSpaceOnUse" x1="-80.6572" y1="-269.022" x2="-76.353" y2="-261.5669" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_252_)" d="M346.37,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.72-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.75
+ C343.51,74.95,344.94,74.96,346.37,74.96z"/>
+
+ <linearGradient id="SVGID_253_" gradientUnits="userSpaceOnUse" x1="-80.6602" y1="-280.0859" x2="-76.354" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_253_)" d="M346.37,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C343.51,63.89,344.94,63.89,346.37,63.9z"
+ />
+
+ <linearGradient id="SVGID_254_" gradientUnits="userSpaceOnUse" x1="-80.6616" y1="-291.1484" x2="-76.356" y2="-283.6908" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_254_)" d="M346.37,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75
+ C343.52,52.83,344.94,52.83,346.37,52.83z"/>
+
+ <linearGradient id="SVGID_255_" gradientUnits="userSpaceOnUse" x1="-80.6636" y1="-302.2114" x2="-76.3564" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_255_)" d="M346.37,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.49-2.14-3.74
+ c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C343.52,41.77,344.94,41.77,346.37,41.77z"
+ />
+
+ <linearGradient id="SVGID_256_" gradientUnits="userSpaceOnUse" x1="-80.667" y1="-313.2739" x2="-76.3599" y2="-305.8138" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_256_)" d="M346.37,30.71c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.43,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C343.52,30.7,344.95,30.71,346.37,30.71z"/>
+
+ <linearGradient id="SVGID_257_" gradientUnits="userSpaceOnUse" x1="-80.6689" y1="-324.3369" x2="-76.3604" y2="-316.8742" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_257_)" d="M346.37,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.43,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C343.52,19.64,344.95,19.64,346.37,19.64z"/>
+
+ <linearGradient id="SVGID_258_" gradientUnits="userSpaceOnUse" x1="-80.6729" y1="-335.4014" x2="-76.3638" y2="-327.9378" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_258_)" d="M346.38,8.58c0.71-1.25,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.75c-1.43,0-2.85,0-4.27,0
+ c-0.71,1.25-1.43,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C343.53,8.58,344.95,8.58,346.38,8.58z"/>
+
+ <linearGradient id="SVGID_259_" gradientUnits="userSpaceOnUse" x1="-69.4707" y1="-263.1465" x2="-65.1851" y2="-255.7235" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_259_)" d="M335.19,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76
+ c-1.43-0.02-2.86-0.03-4.28-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77
+ C332.33,80.8,333.76,80.82,335.19,80.83z"/>
+
+ <linearGradient id="SVGID_260_" gradientUnits="userSpaceOnUse" x1="-69.48" y1="-274.1987" x2="-65.1914" y2="-266.7707" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_260_)" d="M335.2,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.42-2.5-2.14-3.76
+ c-1.43-0.01-2.85-0.03-4.28-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.43,2.51,2.14,3.76
+ C332.34,69.75,333.77,69.77,335.2,69.78z"/>
+
+ <linearGradient id="SVGID_261_" gradientUnits="userSpaceOnUse" x1="-69.4873" y1="-285.251" x2="-65.1963" y2="-277.8187" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_261_)" d="M335.2,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.51,2.14,3.76
+ C332.35,58.7,333.77,58.72,335.2,58.73z"/>
+
+ <linearGradient id="SVGID_262_" gradientUnits="userSpaceOnUse" x1="-69.4966" y1="-296.3032" x2="-65.2017" y2="-288.8642" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_262_)" d="M335.21,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.5,2.14,3.76
+ C332.35,47.66,333.78,47.67,335.21,47.67z"/>
+
+ <linearGradient id="SVGID_263_" gradientUnits="userSpaceOnUse" x1="-69.5054" y1="-307.356" x2="-65.2075" y2="-299.9119" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_263_)" d="M335.21,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75
+ C332.36,36.61,333.79,36.61,335.21,36.62z"/>
+
+ <linearGradient id="SVGID_264_" gradientUnits="userSpaceOnUse" x1="-69.5132" y1="-318.4067" x2="-65.2134" y2="-310.9593" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_264_)" d="M335.22,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.14-3.75
+ c-1.42,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.42,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.74
+ C332.37,25.56,333.79,25.56,335.22,25.57z"/>
+
+ <linearGradient id="SVGID_265_" gradientUnits="userSpaceOnUse" x1="-69.5215" y1="-329.4595" x2="-65.2173" y2="-322.0044" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_265_)" d="M335.22,14.51c0.71-1.24,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74
+ c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C332.38,14.51,333.8,14.51,335.22,14.51z"/>
+
+ <linearGradient id="SVGID_266_" gradientUnits="userSpaceOnUse" x1="-68.4521" y1="-338.6255" x2="-65.2324" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_266_)" d="M328.83-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74
+ C334.52-0.28,331.67-0.28,328.83-0.28z"/>
+
+ <linearGradient id="SVGID_267_" gradientUnits="userSpaceOnUse" x1="-102.0942" y1="-257.9639" x2="-98.8813" y2="-252.399" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_267_)" d="M369.95,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02
+ c-0.71,1.24-1.43,2.49-2.14,3.72C364.24,82.27,367.1,82.28,369.95,82.29z"/>
+
+ <linearGradient id="SVGID_268_" gradientUnits="userSpaceOnUse" x1="-102.1025" y1="-269.022" x2="-97.7983" y2="-261.5669" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_268_)" d="M367.81,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.72-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75
+ C364.96,74.95,366.38,74.96,367.81,74.96z"/>
+
+ <linearGradient id="SVGID_269_" gradientUnits="userSpaceOnUse" x1="-102.1055" y1="-280.0859" x2="-97.7993" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_269_)" d="M367.81,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C364.96,63.89,366.39,63.89,367.81,63.9z"
+ />
+
+ <linearGradient id="SVGID_270_" gradientUnits="userSpaceOnUse" x1="-102.1069" y1="-291.1484" x2="-97.8013" y2="-283.6908" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_270_)" d="M367.81,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75
+ C364.96,52.83,366.39,52.83,367.81,52.83z"/>
+
+ <linearGradient id="SVGID_271_" gradientUnits="userSpaceOnUse" x1="-102.1089" y1="-302.2114" x2="-97.8018" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_271_)" d="M367.82,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.49-2.14-3.74
+ c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C364.96,41.77,366.39,41.77,367.82,41.77z"
+ />
+
+ <linearGradient id="SVGID_272_" gradientUnits="userSpaceOnUse" x1="-102.1123" y1="-313.2739" x2="-97.8052" y2="-305.8138" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_272_)" d="M367.82,30.71c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.43,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C364.97,30.7,366.39,30.71,367.82,30.71z"/>
+
+ <linearGradient id="SVGID_273_" gradientUnits="userSpaceOnUse" x1="-102.1147" y1="-324.3369" x2="-97.8062" y2="-316.8742" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_273_)" d="M367.82,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.43,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C364.97,19.64,366.39,19.64,367.82,19.64z"/>
+
+ <linearGradient id="SVGID_274_" gradientUnits="userSpaceOnUse" x1="-102.1182" y1="-335.4019" x2="-97.8091" y2="-327.9383" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_274_)" d="M367.82,8.58c0.71-1.25,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.75c-1.43,0-2.85,0-4.27,0
+ c-0.71,1.25-1.43,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C364.97,8.58,366.39,8.58,367.82,8.58z"/>
+
+ <linearGradient id="SVGID_275_" gradientUnits="userSpaceOnUse" x1="-90.916" y1="-263.1475" x2="-86.6299" y2="-255.7237" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_275_)" d="M356.64,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76
+ c-1.43-0.02-2.86-0.03-4.29-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77
+ C353.78,80.8,355.21,80.82,356.64,80.83z"/>
+
+ <linearGradient id="SVGID_276_" gradientUnits="userSpaceOnUse" x1="-90.9258" y1="-274.1997" x2="-86.6367" y2="-266.7708" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_276_)" d="M356.64,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.42-2.5-2.14-3.76
+ c-1.43-0.01-2.86-0.03-4.28-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.43,2.51,2.14,3.76
+ C353.79,69.75,355.21,69.77,356.64,69.78z"/>
+
+ <linearGradient id="SVGID_277_" gradientUnits="userSpaceOnUse" x1="-90.9336" y1="-285.2505" x2="-86.6426" y2="-277.8182" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_277_)" d="M356.65,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.51,2.14,3.76
+ C353.79,58.7,355.22,58.72,356.65,58.73z"/>
+
+ <linearGradient id="SVGID_278_" gradientUnits="userSpaceOnUse" x1="-90.9419" y1="-296.3032" x2="-86.647" y2="-288.8642" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_278_)" d="M356.65,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.42,2.48-2.14,3.72c0.71,1.25,1.43,2.5,2.14,3.76
+ C353.8,47.66,355.23,47.67,356.65,47.67z"/>
+
+ <linearGradient id="SVGID_279_" gradientUnits="userSpaceOnUse" x1="-90.9507" y1="-307.356" x2="-86.6528" y2="-299.9119" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_279_)" d="M356.66,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.42,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75
+ C353.81,36.61,355.23,36.61,356.66,36.62z"/>
+
+ <linearGradient id="SVGID_280_" gradientUnits="userSpaceOnUse" x1="-90.959" y1="-318.4077" x2="-86.6582" y2="-310.9586" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_280_)" d="M356.67,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.42,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74
+ C353.81,25.56,355.24,25.56,356.67,25.57z"/>
+
+ <linearGradient id="SVGID_281_" gradientUnits="userSpaceOnUse" x1="-90.9683" y1="-329.46" x2="-86.6636" y2="-322.004" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_281_)" d="M356.67,14.51c0.71-1.24,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74
+ c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C353.82,14.51,355.25,14.51,356.67,14.51z"/>
+
+ <linearGradient id="SVGID_282_" gradientUnits="userSpaceOnUse" x1="-89.8975" y1="-338.6255" x2="-86.6777" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_282_)" d="M350.27-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74
+ C355.97-0.28,353.12-0.28,350.27-0.28z"/>
+
+ <linearGradient id="SVGID_283_" gradientUnits="userSpaceOnUse" x1="-123.5396" y1="-257.9639" x2="-120.3271" y2="-252.3998" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_283_)" d="M391.4,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02
+ c-0.71,1.24-1.43,2.49-2.14,3.72C385.69,82.27,388.54,82.28,391.4,82.29z"/>
+
+ <linearGradient id="SVGID_284_" gradientUnits="userSpaceOnUse" x1="-123.5479" y1="-269.022" x2="-119.2437" y2="-261.5669" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_284_)" d="M389.26,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.75C386.4,74.95,387.83,74.96,389.26,74.96
+ z"/>
+
+ <linearGradient id="SVGID_285_" gradientUnits="userSpaceOnUse" x1="-123.5508" y1="-280.0859" x2="-119.2446" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_285_)" d="M389.26,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C386.4,63.89,387.83,63.89,389.26,63.9z"/>
+
+ <linearGradient id="SVGID_286_" gradientUnits="userSpaceOnUse" x1="-123.5522" y1="-291.1479" x2="-119.2466" y2="-283.6903" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_286_)" d="M389.26,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75
+ C386.41,52.83,387.83,52.83,389.26,52.83z"/>
+
+ <linearGradient id="SVGID_287_" gradientUnits="userSpaceOnUse" x1="-123.5547" y1="-302.2114" x2="-119.2476" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_287_)" d="M389.26,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.49-2.14-3.74
+ c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C386.41,41.77,387.84,41.77,389.26,41.77z"
+ />
+
+ <linearGradient id="SVGID_288_" gradientUnits="userSpaceOnUse" x1="-123.5576" y1="-313.2739" x2="-119.2505" y2="-305.8138" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_288_)" d="M389.26,30.71c0.71-1.25,1.43-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C386.41,30.7,387.84,30.71,389.26,30.71z"/>
+
+ <linearGradient id="SVGID_289_" gradientUnits="userSpaceOnUse" x1="-123.5596" y1="-324.3374" x2="-119.251" y2="-316.8747" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_289_)" d="M389.26,19.64c0.71-1.25,1.43-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.42,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C386.41,19.64,387.84,19.64,389.26,19.64z"/>
+
+ <linearGradient id="SVGID_290_" gradientUnits="userSpaceOnUse" x1="-123.5625" y1="-335.4019" x2="-119.2534" y2="-327.9383" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_290_)" d="M389.27,8.58c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.75c-1.42,0-2.85,0-4.27,0
+ c-0.71,1.25-1.42,2.5-2.13,3.74c0.71,1.25,1.42,2.49,2.13,3.74C386.42,8.58,387.84,8.58,389.27,8.58z"/>
+
+ <linearGradient id="SVGID_291_" gradientUnits="userSpaceOnUse" x1="-112.3608" y1="-263.1479" x2="-108.0747" y2="-255.7242" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_291_)" d="M378.08,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76
+ c-1.43-0.02-2.86-0.03-4.29-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77
+ C375.22,80.8,376.65,80.82,378.08,80.83z"/>
+
+ <linearGradient id="SVGID_292_" gradientUnits="userSpaceOnUse" x1="-112.3706" y1="-274.1997" x2="-108.0811" y2="-266.77" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_292_)" d="M378.09,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.76
+ c-1.43-0.01-2.86-0.03-4.29-0.04c-0.71,1.24-1.42,2.47-2.14,3.71c0.71,1.25,1.43,2.51,2.14,3.76
+ C375.23,69.75,376.66,69.77,378.09,69.78z"/>
+
+ <linearGradient id="SVGID_293_" gradientUnits="userSpaceOnUse" x1="-112.3784" y1="-285.251" x2="-108.0869" y2="-277.8179" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_293_)" d="M378.09,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.42,2.48-2.14,3.72c0.71,1.25,1.43,2.51,2.14,3.76
+ C375.24,58.7,376.66,58.72,378.09,58.73z"/>
+
+ <linearGradient id="SVGID_294_" gradientUnits="userSpaceOnUse" x1="-112.3872" y1="-296.3032" x2="-108.0918" y2="-288.8633" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_294_)" d="M378.1,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.42,2.48-2.14,3.72c0.71,1.25,1.43,2.5,2.14,3.76
+ C375.24,47.66,376.67,47.67,378.1,47.67z"/>
+
+ <linearGradient id="SVGID_295_" gradientUnits="userSpaceOnUse" x1="-112.396" y1="-307.356" x2="-108.0981" y2="-299.9119" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_295_)" d="M378.11,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75
+ C375.25,36.61,376.68,36.61,378.11,36.62z"/>
+
+ <linearGradient id="SVGID_296_" gradientUnits="userSpaceOnUse" x1="-112.4043" y1="-318.4072" x2="-108.1035" y2="-310.9581" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_296_)" d="M378.11,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.42,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74
+ C375.26,25.56,376.68,25.56,378.11,25.57z"/>
+
+ <linearGradient id="SVGID_297_" gradientUnits="userSpaceOnUse" x1="-112.4136" y1="-329.4595" x2="-108.1089" y2="-322.0035" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_297_)" d="M378.12,14.51c0.71-1.24,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74
+ c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C375.27,14.51,376.69,14.51,378.12,14.51z"/>
+
+ <linearGradient id="SVGID_298_" gradientUnits="userSpaceOnUse" x1="-111.3423" y1="-338.6255" x2="-108.1226" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_298_)" d="M371.72-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74
+ C377.41-0.28,374.57-0.28,371.72-0.28z"/>
+
+ <linearGradient id="SVGID_299_" gradientUnits="userSpaceOnUse" x1="-144.9844" y1="-257.9639" x2="-141.772" y2="-252.3998" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_299_)" d="M412.84,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02
+ c-0.71,1.24-1.43,2.49-2.14,3.72C407.13,82.27,409.99,82.28,412.84,82.29z"/>
+
+ <linearGradient id="SVGID_300_" gradientUnits="userSpaceOnUse" x1="-144.9932" y1="-269.022" x2="-140.689" y2="-261.5669" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_300_)" d="M410.7,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.75C407.85,74.95,409.28,74.96,410.7,74.96
+ z"/>
+
+ <linearGradient id="SVGID_301_" gradientUnits="userSpaceOnUse" x1="-144.9961" y1="-280.0859" x2="-140.6899" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_301_)" d="M410.71,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C407.85,63.89,409.28,63.89,410.71,63.9z"
+ />
+
+ <linearGradient id="SVGID_302_" gradientUnits="userSpaceOnUse" x1="-144.9976" y1="-291.1479" x2="-140.6919" y2="-283.6903" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_302_)" d="M410.71,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75
+ C407.85,52.83,409.28,52.83,410.71,52.83z"/>
+
+ <linearGradient id="SVGID_303_" gradientUnits="userSpaceOnUse" x1="-145" y1="-302.2114" x2="-140.6929" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_303_)" d="M410.71,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.49-2.14-3.74
+ c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C407.86,41.77,409.28,41.77,410.71,41.77z"
+ />
+
+ <linearGradient id="SVGID_304_" gradientUnits="userSpaceOnUse" x1="-145.0029" y1="-313.2739" x2="-140.6958" y2="-305.8138" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_304_)" d="M410.71,30.71c0.71-1.25,1.43-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C407.86,30.7,409.28,30.71,410.71,30.71z"/>
+
+ <linearGradient id="SVGID_305_" gradientUnits="userSpaceOnUse" x1="-145.0049" y1="-324.3374" x2="-140.6963" y2="-316.8747" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_305_)" d="M410.71,19.64c0.71-1.25,1.43-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.42,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C407.86,19.64,409.29,19.64,410.71,19.64z"/>
+
+ <linearGradient id="SVGID_306_" gradientUnits="userSpaceOnUse" x1="-145.0088" y1="-335.4014" x2="-140.6997" y2="-327.9378" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_306_)" d="M410.71,8.58c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.75c-1.42,0-2.85,0-4.27,0
+ c-0.71,1.25-1.43,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C407.86,8.58,409.29,8.58,410.71,8.58z"/>
+
+ <linearGradient id="SVGID_307_" gradientUnits="userSpaceOnUse" x1="-133.8071" y1="-263.1475" x2="-129.5205" y2="-255.7228" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_307_)" d="M399.53,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76
+ c-1.43-0.02-2.86-0.03-4.29-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77
+ C396.67,80.8,398.1,80.82,399.53,80.83z"/>
+
+ <linearGradient id="SVGID_308_" gradientUnits="userSpaceOnUse" x1="-133.8159" y1="-274.1997" x2="-129.5264" y2="-266.77" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_308_)" d="M399.53,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.76
+ c-1.43-0.01-2.86-0.03-4.29-0.04c-0.71,1.24-1.42,2.47-2.14,3.71c0.71,1.25,1.42,2.51,2.13,3.76
+ C396.68,69.75,398.1,69.77,399.53,69.78z"/>
+
+ <linearGradient id="SVGID_309_" gradientUnits="userSpaceOnUse" x1="-133.8237" y1="-285.251" x2="-129.5322" y2="-277.8179" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_309_)" d="M399.54,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.51,2.13,3.76
+ C396.68,58.7,398.11,58.72,399.54,58.73z"/>
+
+ <linearGradient id="SVGID_310_" gradientUnits="userSpaceOnUse" x1="-133.8325" y1="-296.3032" x2="-129.5371" y2="-288.8633" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_310_)" d="M399.54,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.76
+ C396.69,47.66,398.12,47.67,399.54,47.67z"/>
+
+ <linearGradient id="SVGID_311_" gradientUnits="userSpaceOnUse" x1="-133.8413" y1="-307.356" x2="-129.5435" y2="-299.9119" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_311_)" d="M399.55,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75
+ C396.7,36.61,398.12,36.61,399.55,36.62z"/>
+
+ <linearGradient id="SVGID_312_" gradientUnits="userSpaceOnUse" x1="-133.8496" y1="-318.4072" x2="-129.5488" y2="-310.9581" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_312_)" d="M399.56,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.42,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74
+ C396.71,25.56,398.13,25.56,399.56,25.57z"/>
+
+ <linearGradient id="SVGID_313_" gradientUnits="userSpaceOnUse" x1="-133.8589" y1="-329.4595" x2="-129.5542" y2="-322.0035" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_313_)" d="M399.56,14.51c0.71-1.24,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74
+ c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C396.71,14.51,398.14,14.51,399.56,14.51z"/>
+
+ <linearGradient id="SVGID_314_" gradientUnits="userSpaceOnUse" x1="-132.7886" y1="-338.625" x2="-129.5688" y2="-333.0483" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_314_)" d="M393.16-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74
+ C398.86-0.28,396.01-0.28,393.16-0.28z"/>
+
+ <linearGradient id="SVGID_315_" gradientUnits="userSpaceOnUse" x1="-166.4292" y1="-257.9639" x2="-163.2168" y2="-252.3998" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_315_)" d="M434.29,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02
+ c-0.71,1.24-1.43,2.49-2.14,3.72C428.58,82.27,431.43,82.28,434.29,82.29z"/>
+
+ <linearGradient id="SVGID_316_" gradientUnits="userSpaceOnUse" x1="-166.438" y1="-269.0225" x2="-162.1338" y2="-261.5674" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_316_)" d="M432.15,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.75
+ C429.29,74.95,430.72,74.96,432.15,74.96z"/>
+
+ <linearGradient id="SVGID_317_" gradientUnits="userSpaceOnUse" x1="-166.4414" y1="-280.0859" x2="-162.1353" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_317_)" d="M432.15,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C429.29,63.89,430.72,63.89,432.15,63.9z"
+ />
+
+ <linearGradient id="SVGID_318_" gradientUnits="userSpaceOnUse" x1="-166.4434" y1="-291.1479" x2="-162.1377" y2="-283.6903" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_318_)" d="M432.15,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C429.3,52.83,430.72,52.83,432.15,52.83
+ z"/>
+
+ <linearGradient id="SVGID_319_" gradientUnits="userSpaceOnUse" x1="-166.4453" y1="-302.2114" x2="-162.1382" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_319_)" d="M432.15,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.49-2.14-3.74
+ c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C429.3,41.77,430.73,41.77,432.15,41.77z"
+ />
+
+ <linearGradient id="SVGID_320_" gradientUnits="userSpaceOnUse" x1="-166.4482" y1="-313.2739" x2="-162.1411" y2="-305.8138" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_320_)" d="M432.15,30.71c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C429.3,30.7,430.73,30.71,432.15,30.71z"/>
+
+ <linearGradient id="SVGID_321_" gradientUnits="userSpaceOnUse" x1="-166.4502" y1="-324.3369" x2="-162.1416" y2="-316.8742" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_321_)" d="M432.15,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.42,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C429.3,19.64,430.73,19.64,432.15,19.64z"/>
+
+ <linearGradient id="SVGID_322_" gradientUnits="userSpaceOnUse" x1="-166.4536" y1="-335.4019" x2="-162.1445" y2="-327.9383" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_322_)" d="M432.16,8.58c0.71-1.25,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.75c-1.42,0-2.85,0-4.27,0
+ c-0.71,1.25-1.43,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C429.31,8.58,430.73,8.58,432.16,8.58z"/>
+
+ <linearGradient id="SVGID_323_" gradientUnits="userSpaceOnUse" x1="-155.2524" y1="-263.1475" x2="-150.9663" y2="-255.7237" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_323_)" d="M420.97,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76
+ c-1.43-0.02-2.86-0.03-4.29-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77
+ C418.12,80.8,419.54,80.82,420.97,80.83z"/>
+
+ <linearGradient id="SVGID_324_" gradientUnits="userSpaceOnUse" x1="-155.2622" y1="-274.1992" x2="-150.9731" y2="-266.7704" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_324_)" d="M420.98,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.76
+ c-1.43-0.01-2.86-0.03-4.28-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.42,2.51,2.14,3.76
+ C418.12,69.75,419.55,69.77,420.98,69.78z"/>
+
+ <linearGradient id="SVGID_325_" gradientUnits="userSpaceOnUse" x1="-155.27" y1="-285.2505" x2="-150.979" y2="-277.8182" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_325_)" d="M420.98,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.51,2.14,3.76
+ C418.13,58.7,419.56,58.72,420.98,58.73z"/>
+
+ <linearGradient id="SVGID_326_" gradientUnits="userSpaceOnUse" x1="-155.2788" y1="-296.3027" x2="-150.9839" y2="-288.8637" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_326_)" d="M420.99,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.14,3.76
+ C418.13,47.66,419.56,47.67,420.99,47.67z"/>
+
+ <linearGradient id="SVGID_327_" gradientUnits="userSpaceOnUse" x1="-155.2876" y1="-307.3555" x2="-150.9897" y2="-299.9114" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_327_)" d="M421,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75
+ C418.14,36.61,419.57,36.61,421,36.62z"/>
+
+ <linearGradient id="SVGID_328_" gradientUnits="userSpaceOnUse" x1="-155.2959" y1="-318.4067" x2="-150.9956" y2="-310.9584" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_328_)" d="M421,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74C418.15,25.56,419.58,25.56,421,25.57z"
+ />
+
+ <linearGradient id="SVGID_329_" gradientUnits="userSpaceOnUse" x1="-155.3027" y1="-329.4595" x2="-150.999" y2="-322.0052" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_329_)" d="M421.01,14.51c0.71-1.24,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74
+ c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C418.16,14.51,419.58,14.51,421.01,14.51z"/>
+
+ <linearGradient id="SVGID_330_" gradientUnits="userSpaceOnUse" x1="-154.2339" y1="-338.625" x2="-151.0142" y2="-333.0483" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_330_)" d="M414.61-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74
+ C420.3-0.28,417.46-0.28,414.61-0.28z"/>
+
+ <linearGradient id="SVGID_331_" gradientUnits="userSpaceOnUse" x1="-187.875" y1="-257.9639" x2="-184.6626" y2="-252.3998" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_331_)" d="M455.73,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02
+ c-0.71,1.24-1.43,2.49-2.14,3.72C450.02,82.27,452.88,82.28,455.73,82.29z"/>
+
+ <linearGradient id="SVGID_332_" gradientUnits="userSpaceOnUse" x1="-187.8833" y1="-269.0225" x2="-183.5791" y2="-261.5674" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_332_)" d="M453.59,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.72-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.75
+ C450.74,74.95,452.17,74.96,453.59,74.96z"/>
+
+ <linearGradient id="SVGID_333_" gradientUnits="userSpaceOnUse" x1="-187.8872" y1="-280.0859" x2="-183.5811" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_333_)" d="M453.6,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C450.74,63.89,452.17,63.89,453.6,63.9z"/>
+
+ <linearGradient id="SVGID_334_" gradientUnits="userSpaceOnUse" x1="-187.8887" y1="-291.1479" x2="-183.583" y2="-283.6903" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_334_)" d="M453.6,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C450.74,52.83,452.17,52.83,453.6,52.83
+ z"/>
+
+ <linearGradient id="SVGID_335_" gradientUnits="userSpaceOnUse" x1="-187.8906" y1="-302.2114" x2="-183.5835" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_335_)" d="M453.6,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.49-2.14-3.74
+ c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C450.75,41.77,452.17,41.77,453.6,41.77z"
+ />
+
+ <linearGradient id="SVGID_336_" gradientUnits="userSpaceOnUse" x1="-187.8931" y1="-313.2739" x2="-183.5859" y2="-305.8138" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_336_)" d="M453.6,30.71c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C450.75,30.7,452.17,30.71,453.6,30.71z"/>
+
+ <linearGradient id="SVGID_337_" gradientUnits="userSpaceOnUse" x1="-187.895" y1="-324.3374" x2="-183.5864" y2="-316.8747" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_337_)" d="M453.6,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.42,0-2.85,0-4.28,0
+ c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C450.75,19.64,452.18,19.64,453.6,19.64z"/>
+
+ <linearGradient id="SVGID_338_" gradientUnits="userSpaceOnUse" x1="-187.8989" y1="-335.4019" x2="-183.5898" y2="-327.9383" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_338_)" d="M453.6,8.58c0.71-1.25,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.75c-1.42,0-2.85,0-4.27,0
+ c-0.71,1.25-1.43,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C450.75,8.58,452.18,8.58,453.6,8.58z"/>
+
+ <linearGradient id="SVGID_339_" gradientUnits="userSpaceOnUse" x1="-176.6978" y1="-263.147" x2="-172.4116" y2="-255.7232" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_339_)" d="M442.42,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76
+ c-1.43-0.02-2.86-0.03-4.29-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77
+ C439.56,80.8,440.99,80.82,442.42,80.83z"/>
+
+ <linearGradient id="SVGID_340_" gradientUnits="userSpaceOnUse" x1="-176.7075" y1="-274.1992" x2="-172.4185" y2="-266.7704" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_340_)" d="M442.42,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.76
+ c-1.43-0.01-2.86-0.03-4.28-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.42,2.51,2.14,3.76
+ C439.57,69.75,441,69.77,442.42,69.78z"/>
+
+ <linearGradient id="SVGID_341_" gradientUnits="userSpaceOnUse" x1="-176.7144" y1="-285.251" x2="-172.4233" y2="-277.8187" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_341_)" d="M442.43,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.42-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.51,2.14,3.76
+ C439.57,58.7,441,58.72,442.43,58.73z"/>
+
+ <linearGradient id="SVGID_342_" gradientUnits="userSpaceOnUse" x1="-176.7231" y1="-296.3032" x2="-172.4282" y2="-288.8642" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_342_)" d="M442.43,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.42-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.14,3.76
+ C439.58,47.66,441.01,47.67,442.43,47.67z"/>
+
+ <linearGradient id="SVGID_343_" gradientUnits="userSpaceOnUse" x1="-176.7319" y1="-307.3555" x2="-172.4341" y2="-299.9114" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_343_)" d="M442.44,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75
+ C439.59,36.61,441.02,36.61,442.44,36.62z"/>
+
+ <linearGradient id="SVGID_344_" gradientUnits="userSpaceOnUse" x1="-176.7397" y1="-318.4067" x2="-172.4399" y2="-310.9593" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_344_)" d="M442.45,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.14-3.75
+ c-1.42,0-2.85-0.01-4.27-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74C439.6,25.56,441.02,25.56,442.45,25.57
+ z"/>
+
+ <linearGradient id="SVGID_345_" gradientUnits="userSpaceOnUse" x1="-176.748" y1="-329.4595" x2="-172.4443" y2="-322.0052" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_345_)" d="M442.45,14.51c0.71-1.24,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74
+ c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C439.6,14.51,441.03,14.51,442.45,14.51z"/>
+
+ <linearGradient id="SVGID_346_" gradientUnits="userSpaceOnUse" x1="-175.6792" y1="-338.625" x2="-172.4595" y2="-333.0483" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_346_)" d="M436.05-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74
+ C441.75-0.28,438.9-0.28,436.05-0.28z"/>
+
+ <linearGradient id="SVGID_347_" gradientUnits="userSpaceOnUse" x1="-198.1436" y1="-263.147" x2="-193.8574" y2="-255.7232" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_347_)" d="M463.86,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76
+ c-1.43-0.02-2.86-0.03-4.29-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77
+ C461.01,80.8,462.44,80.82,463.86,80.83z"/>
+
+ <linearGradient id="SVGID_348_" gradientUnits="userSpaceOnUse" x1="-198.1533" y1="-274.1992" x2="-193.8643" y2="-266.7704" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_348_)" d="M463.87,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.76
+ c-1.43-0.01-2.86-0.03-4.28-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.42,2.51,2.14,3.76
+ C461.01,69.75,462.44,69.77,463.87,69.78z"/>
+
+ <linearGradient id="SVGID_349_" gradientUnits="userSpaceOnUse" x1="-198.1606" y1="-285.25" x2="-193.8696" y2="-277.8177" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_349_)" d="M463.88,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.42-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.51,2.14,3.76
+ C461.02,58.7,462.45,58.72,463.88,58.73z"/>
+
+ <linearGradient id="SVGID_350_" gradientUnits="userSpaceOnUse" x1="-198.1689" y1="-296.3027" x2="-193.874" y2="-288.8637" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_350_)" d="M463.88,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.42-2.5-2.14-3.75
+ c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.14,3.76
+ C461.03,47.66,462.46,47.67,463.88,47.67z"/>
+
+ <linearGradient id="SVGID_351_" gradientUnits="userSpaceOnUse" x1="-198.1777" y1="-307.3555" x2="-193.8799" y2="-299.9114" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_351_)" d="M463.89,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75
+ C461.03,36.61,462.46,36.61,463.89,36.62z"/>
+
+ <linearGradient id="SVGID_352_" gradientUnits="userSpaceOnUse" x1="-198.186" y1="-318.4072" x2="-193.8857" y2="-310.9589" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_352_)" d="M463.89,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74
+ C461.04,25.56,462.46,25.56,463.89,25.57z"/>
+
+ <linearGradient id="SVGID_353_" gradientUnits="userSpaceOnUse" x1="-198.1948" y1="-329.46" x2="-193.8906" y2="-322.0049" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_353_)" d="M463.9,14.51c0.71-1.24,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.42,0-2.85,0-4.27,0
+ c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C461.05,14.51,462.47,14.51,463.9,14.51z"/>
+
+ <linearGradient id="SVGID_354_" gradientUnits="userSpaceOnUse" x1="-197.124" y1="-338.6255" x2="-193.9043" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_354_)" d="M457.5-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74
+ C463.19-0.28,460.35-0.28,457.5-0.28z"/>
+
+ <linearGradient id="SVGID_355_" gradientUnits="userSpaceOnUse" x1="112.9204" y1="-258.2065" x2="116.082" y2="-252.7305" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_355_)" d="M154.96,82.08c-0.71-1.26-1.43-2.51-2.14-3.77c-1.43-0.03-2.86-0.06-4.29-0.09
+ c-0.71,1.23-1.43,2.45-2.14,3.68C149.24,81.97,152.1,82.03,154.96,82.08z"/>
+
+ <linearGradient id="SVGID_356_" gradientUnits="userSpaceOnUse" x1="112.9058" y1="-269.2368" x2="117.1743" y2="-261.8435" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_356_)" d="M152.82,74.74c0.71-1.23,1.43-2.46,2.14-3.7c-0.71-1.25-1.43-2.51-2.14-3.77
+ c-1.43-0.02-2.85-0.05-4.28-0.07c-0.72,1.23-1.43,2.46-2.15,3.68c0.71,1.25,1.42,2.51,2.14,3.77
+ C149.97,74.68,151.39,74.71,152.82,74.74z"/>
+
+ <linearGradient id="SVGID_357_" gradientUnits="userSpaceOnUse" x1="112.8926" y1="-280.2642" x2="117.1646" y2="-272.8649" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_357_)" d="M152.83,63.71c0.71-1.23,1.43-2.47,2.14-3.7c-0.71-1.26-1.43-2.51-2.14-3.76
+ c-1.42-0.02-2.85-0.04-4.28-0.06c-0.72,1.23-1.43,2.46-2.14,3.69c0.71,1.25,1.42,2.51,2.14,3.76
+ C149.98,63.66,151.4,63.69,152.83,63.71z"/>
+
+ <linearGradient id="SVGID_358_" gradientUnits="userSpaceOnUse" x1="112.8804" y1="-291.293" x2="117.1567" y2="-283.8861" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_358_)" d="M152.84,52.68c0.71-1.24,1.43-2.47,2.14-3.71c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.42-0.01-2.85-0.03-4.28-0.05c-0.71,1.23-1.43,2.46-2.14,3.69c0.71,1.25,1.42,2.5,2.14,3.76
+ C149.99,52.64,151.42,52.66,152.84,52.68z"/>
+
+ <linearGradient id="SVGID_359_" gradientUnits="userSpaceOnUse" x1="112.8647" y1="-302.3213" x2="117.1465" y2="-294.9051" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_359_)" d="M152.85,41.64c0.71-1.23,1.43-2.47,2.14-3.71c-0.71-1.25-1.42-2.5-2.14-3.75
+ c-1.42-0.01-2.85-0.02-4.27-0.04c-0.71,1.24-1.43,2.47-2.14,3.7c0.71,1.25,1.42,2.5,2.13,3.75C150,41.62,151.43,41.63,152.85,41.64
+ z"/>
+
+ <linearGradient id="SVGID_360_" gradientUnits="userSpaceOnUse" x1="112.8496" y1="-313.3501" x2="117.1362" y2="-305.9254" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_360_)" d="M152.86,30.61c0.72-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.42-0.01-2.85-0.02-4.27-0.03c-0.71,1.24-1.43,2.48-2.14,3.71c0.71,1.25,1.42,2.49,2.13,3.74
+ C150.01,30.59,151.44,30.6,152.86,30.61z"/>
+
+ <linearGradient id="SVGID_361_" gradientUnits="userSpaceOnUse" x1="112.8354" y1="-324.3779" x2="117.1284" y2="-316.9423" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_361_)" d="M152.87,19.58c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.42-2.49-2.14-3.74
+ c-1.42,0-2.85-0.01-4.27-0.01c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.49,2.13,3.74
+ C150.02,19.57,151.45,19.58,152.87,19.58z"/>
+
+ <linearGradient id="SVGID_362_" gradientUnits="userSpaceOnUse" x1="112.8232" y1="-335.4092" x2="117.1201" y2="-327.9668" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_362_)" d="M152.88,8.55c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.42-2.49-2.13-3.74
+ c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.24,1.42,2.49,2.13,3.73C150.03,8.54,151.46,8.55,152.88,8.55z"/>
+
+ <linearGradient id="SVGID_363_" gradientUnits="userSpaceOnUse" x1="124.0977" y1="-263.5513" x2="128.3364" y2="-256.2095" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_363_)" d="M141.64,80.41c0.71-1.22,1.43-2.44,2.14-3.66c-0.71-1.26-1.42-2.52-2.13-3.78
+ c-1.43-0.04-2.86-0.08-4.28-0.12c-0.71,1.22-1.43,2.43-2.15,3.65c0.71,1.26,1.43,2.52,2.13,3.78
+ C138.79,80.32,140.21,80.37,141.64,80.41z"/>
+
+ <linearGradient id="SVGID_364_" gradientUnits="userSpaceOnUse" x1="124.0786" y1="-274.5439" x2="128.3242" y2="-267.1903" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_364_)" d="M141.66,69.41c0.71-1.22,1.43-2.45,2.14-3.67c-0.71-1.26-1.42-2.51-2.13-3.77
+ c-1.43-0.03-2.86-0.06-4.28-0.1c-0.71,1.22-1.43,2.44-2.14,3.66c0.71,1.25,1.42,2.51,2.13,3.77
+ C138.8,69.34,140.23,69.38,141.66,69.41z"/>
+
+ <linearGradient id="SVGID_365_" gradientUnits="userSpaceOnUse" x1="124.0596" y1="-285.5361" x2="128.313" y2="-278.169" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_365_)" d="M141.67,58.42c0.71-1.23,1.43-2.45,2.14-3.68c-0.71-1.25-1.42-2.51-2.13-3.76
+ c-1.43-0.02-2.85-0.05-4.28-0.08c-0.71,1.22-1.43,2.44-2.14,3.67c0.71,1.25,1.42,2.51,2.13,3.76
+ C138.82,58.36,140.24,58.39,141.67,58.42z"/>
+
+ <linearGradient id="SVGID_366_" gradientUnits="userSpaceOnUse" x1="124.0405" y1="-296.5273" x2="128.3013" y2="-289.1475" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_366_)" d="M141.68,47.42c0.72-1.23,1.43-2.46,2.15-3.69c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43-0.02-2.85-0.04-4.28-0.06c-0.71,1.23-1.43,2.45-2.14,3.67c0.71,1.25,1.42,2.5,2.13,3.75
+ C138.83,47.37,140.26,47.4,141.68,47.42z"/>
+
+ <linearGradient id="SVGID_367_" gradientUnits="userSpaceOnUse" x1="124.02" y1="-307.5225" x2="128.2886" y2="-300.1291" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_367_)" d="M141.7,36.43c0.71-1.23,1.43-2.46,2.14-3.69c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43-0.01-2.85-0.03-4.28-0.04c-0.71,1.23-1.43,2.46-2.14,3.69c0.71,1.25,1.42,2.49,2.13,3.74
+ C138.85,36.39,140.27,36.41,141.7,36.43z"/>
+
+ <linearGradient id="SVGID_368_" gradientUnits="userSpaceOnUse" x1="124.0034" y1="-318.5122" x2="128.2773" y2="-311.1096" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_368_)" d="M141.71,25.43c0.71-1.23,1.43-2.47,2.14-3.7c-0.71-1.25-1.42-2.49-2.13-3.73
+ c-1.42-0.01-2.85-0.02-4.27-0.03c-0.71,1.23-1.43,2.46-2.14,3.69c0.71,1.25,1.42,2.49,2.13,3.73
+ C138.87,25.41,140.29,25.42,141.71,25.43z"/>
+
+ <linearGradient id="SVGID_369_" gradientUnits="userSpaceOnUse" x1="123.9839" y1="-329.5044" x2="128.2651" y2="-322.0891" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_369_)" d="M141.73,14.44c0.71-1.24,1.43-2.48,2.14-3.71c-0.71-1.24-1.42-2.48-2.13-3.72
+ c-1.43,0-2.85-0.01-4.27-0.01c-0.71,1.24-1.43,2.47-2.14,3.7c0.71,1.24,1.42,2.48,2.13,3.72C138.88,14.42,140.3,14.43,141.73,14.44
+ z"/>
+
+ <linearGradient id="SVGID_370_" gradientUnits="userSpaceOnUse" x1="125.0405" y1="-338.6304" x2="128.252" y2="-333.068" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_370_)" d="M135.34-0.28c0.71,1.24,1.42,2.48,2.13,3.71c1.42,0,2.85,0,4.27,0.01
+ c0.71-1.24,1.43-2.48,2.14-3.72C141.04-0.28,138.19-0.28,135.34-0.28z"/>
+
+ <linearGradient id="SVGID_371_" gradientUnits="userSpaceOnUse" x1="134.9282" y1="-258.8154" x2="138.0298" y2="-253.4434" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_371_)" d="M132.97,81.5c-0.71-1.26-1.42-2.52-2.13-3.78c-1.43-0.05-2.85-0.1-4.28-0.16
+ c-0.71,1.21-1.43,2.41-2.15,3.61C127.26,81.29,130.12,81.39,132.97,81.5z"/>
+
+ <linearGradient id="SVGID_372_" gradientUnits="userSpaceOnUse" x1="134.9053" y1="-269.7573" x2="139.1196" y2="-262.4579" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_372_)" d="M130.84,74.17c0.72-1.21,1.43-2.42,2.15-3.64c-0.71-1.26-1.42-2.51-2.13-3.77
+ c-1.43-0.04-2.85-0.09-4.28-0.14c-0.71,1.21-1.43,2.41-2.14,3.62c0.71,1.25,1.42,2.51,2.13,3.77
+ C127.99,74.07,129.42,74.12,130.84,74.17z"/>
+
+ <linearGradient id="SVGID_373_" gradientUnits="userSpaceOnUse" x1="134.8804" y1="-280.707" x2="139.1064" y2="-273.3873" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_373_)" d="M130.86,63.22c0.71-1.21,1.43-2.43,2.15-3.65c-0.71-1.25-1.42-2.5-2.13-3.76
+ c-1.43-0.03-2.85-0.07-4.28-0.11c-0.71,1.21-1.43,2.42-2.14,3.63c0.71,1.25,1.42,2.5,2.13,3.76
+ C128.01,63.14,129.44,63.19,130.86,63.22z"/>
+
+ <linearGradient id="SVGID_374_" gradientUnits="userSpaceOnUse" x1="134.8579" y1="-291.6499" x2="139.0913" y2="-284.3174" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_374_)" d="M130.88,52.28c0.71-1.22,1.43-2.44,2.14-3.66c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43-0.03-2.85-0.06-4.28-0.09c-0.71,1.22-1.43,2.43-2.14,3.64c0.71,1.25,1.42,2.5,2.13,3.75
+ C128.03,52.21,129.45,52.24,130.88,52.28z"/>
+
+ <linearGradient id="SVGID_375_" gradientUnits="userSpaceOnUse" x1="134.8335" y1="-302.5942" x2="139.0767" y2="-295.2449" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_375_)" d="M130.9,41.33c0.71-1.22,1.43-2.44,2.14-3.67c-0.71-1.25-1.42-2.49-2.13-3.74
+ c-1.43-0.02-2.85-0.04-4.28-0.07c-0.72,1.22-1.43,2.44-2.15,3.66c0.71,1.24,1.42,2.49,2.13,3.74
+ C128.05,41.27,129.47,41.3,130.9,41.33z"/>
+
+ <linearGradient id="SVGID_376_" gradientUnits="userSpaceOnUse" x1="134.8101" y1="-313.5381" x2="139.062" y2="-306.1735" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_376_)" d="M130.92,30.38c0.71-1.22,1.43-2.45,2.14-3.68c-0.71-1.24-1.42-2.49-2.13-3.73
+ c-1.42-0.01-2.85-0.03-4.28-0.05c-0.71,1.22-1.43,2.44-2.14,3.67c0.71,1.24,1.42,2.48,2.13,3.72
+ C128.07,30.34,129.49,30.36,130.92,30.38z"/>
+
+ <linearGradient id="SVGID_377_" gradientUnits="userSpaceOnUse" x1="134.7881" y1="-324.4824" x2="139.0493" y2="-317.1017" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_377_)" d="M130.94,19.44c0.71-1.23,1.43-2.46,2.14-3.69c-0.71-1.24-1.42-2.48-2.13-3.72
+ c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.23-1.43,2.45-2.14,3.68c0.71,1.24,1.42,2.47,2.13,3.71
+ C128.09,19.41,129.51,19.42,130.94,19.44z"/>
+
+ <linearGradient id="SVGID_378_" gradientUnits="userSpaceOnUse" x1="134.7637" y1="-335.4282" x2="139.0337" y2="-328.0323" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_378_)" d="M130.95,8.48c0.71-1.23,1.43-2.46,2.14-3.7c-0.71-1.24-1.42-2.47-2.13-3.71c-1.42,0-2.85,0-4.27,0
+ c-0.71,1.23-1.43,2.46-2.14,3.69c0.71,1.23,1.42,2.46,2.13,3.7C128.1,8.47,129.53,8.48,130.95,8.48z"/>
+
+ <linearGradient id="SVGID_379_" gradientUnits="userSpaceOnUse" x1="146.1016" y1="-264.2944" x2="150.2773" y2="-257.0618" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_379_)" d="M119.67,79.61c0.72-1.2,1.43-2.39,2.14-3.59c-0.71-1.26-1.42-2.52-2.13-3.77
+ c-1.43-0.06-2.85-0.12-4.28-0.18c-0.72,1.19-1.43,2.39-2.15,3.58c0.71,1.26,1.42,2.51,2.13,3.77
+ C116.81,79.48,118.24,79.54,119.67,79.61z"/>
+
+ <linearGradient id="SVGID_380_" gradientUnits="userSpaceOnUse" x1="146.0728" y1="-275.1763" x2="150.2603" y2="-267.9233" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_380_)" d="M119.69,68.72c0.72-1.2,1.43-2.4,2.15-3.6c-0.71-1.25-1.42-2.51-2.13-3.76
+ c-1.43-0.05-2.85-0.1-4.28-0.15c-0.71,1.2-1.43,2.39-2.15,3.59c0.71,1.25,1.42,2.5,2.13,3.76
+ C116.84,68.61,118.26,68.67,119.69,68.72z"/>
+
+ <linearGradient id="SVGID_381_" gradientUnits="userSpaceOnUse" x1="146.0444" y1="-286.0601" x2="150.2437" y2="-278.7868" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_381_)" d="M119.71,57.84c0.72-1.2,1.43-2.41,2.15-3.62c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43-0.04-2.85-0.08-4.28-0.13c-0.71,1.2-1.43,2.4-2.14,3.6c0.71,1.25,1.42,2.49,2.13,3.74
+ C116.86,57.74,118.28,57.79,119.71,57.84z"/>
+
+ <linearGradient id="SVGID_382_" gradientUnits="userSpaceOnUse" x1="146.0161" y1="-296.9409" x2="150.2271" y2="-289.6474" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_382_)" d="M119.73,46.95c0.72-1.21,1.43-2.42,2.14-3.63c-0.71-1.25-1.42-2.49-2.13-3.73
+ c-1.43-0.03-2.85-0.07-4.28-0.1c-0.71,1.21-1.43,2.41-2.14,3.62c0.71,1.24,1.42,2.49,2.13,3.73
+ C116.88,46.87,118.3,46.91,119.73,46.95z"/>
+
+ <linearGradient id="SVGID_383_" gradientUnits="userSpaceOnUse" x1="145.9873" y1="-307.8242" x2="150.21" y2="-300.5104" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_383_)" d="M119.75,36.06c0.71-1.21,1.43-2.43,2.14-3.64c-0.71-1.24-1.42-2.48-2.13-3.72
+ c-1.42-0.02-2.85-0.05-4.28-0.07c-0.71,1.21-1.43,2.42-2.14,3.63c0.71,1.24,1.42,2.47,2.13,3.71
+ C116.9,36,118.33,36.04,119.75,36.06z"/>
+
+ <linearGradient id="SVGID_384_" gradientUnits="userSpaceOnUse" x1="145.9595" y1="-318.7065" x2="150.1938" y2="-311.3724" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_384_)" d="M119.77,25.18c0.71-1.22,1.43-2.44,2.14-3.66c-0.71-1.24-1.42-2.47-2.13-3.71
+ c-1.42-0.01-2.85-0.03-4.28-0.04c-0.71,1.22-1.43,2.43-2.14,3.64c0.71,1.23,1.42,2.47,2.13,3.7
+ C116.92,25.14,118.35,25.16,119.77,25.18z"/>
+
+ <linearGradient id="SVGID_385_" gradientUnits="userSpaceOnUse" x1="145.9312" y1="-329.5879" x2="150.1763" y2="-322.2351" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_385_)" d="M119.79,14.29c0.71-1.22,1.43-2.45,2.14-3.67c-0.71-1.23-1.42-2.47-2.13-3.69
+ c-1.43,0-2.85-0.01-4.28-0.02c-0.71,1.22-1.43,2.44-2.14,3.66c0.71,1.23,1.42,2.46,2.13,3.69
+ C116.95,14.27,118.37,14.28,119.79,14.29z"/>
+
+ <linearGradient id="SVGID_386_" gradientUnits="userSpaceOnUse" x1="146.9658" y1="-338.6309" x2="150.1602" y2="-333.0981" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_386_)" d="M113.42-0.28c0.71,1.22,1.42,2.45,2.13,3.67c1.42,0,2.85,0,4.27,0.01
+ c0.71-1.23,1.43-2.45,2.14-3.68C119.11-0.28,116.27-0.28,113.42-0.28z"/>
+
+ <linearGradient id="SVGID_387_" gradientUnits="userSpaceOnUse" x1="156.9312" y1="-259.7856" x2="159.9639" y2="-254.5328" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_387_)" d="M111,80.54c-0.71-1.26-1.42-2.52-2.13-3.77c-1.43-0.08-2.85-0.15-4.28-0.23
+ c-0.71,1.18-1.43,2.35-2.14,3.52C105.3,80.23,108.15,80.39,111,80.54z"/>
+
+ <linearGradient id="SVGID_388_" gradientUnits="userSpaceOnUse" x1="156.9004" y1="-270.5967" x2="161.0474" y2="-263.4139" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_388_)" d="M108.88,73.27c0.71-1.19,1.43-2.37,2.15-3.56c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43-0.06-2.85-0.13-4.28-0.2c-0.72,1.18-1.43,2.36-2.15,3.54c0.71,1.25,1.42,2.5,2.13,3.75
+ C106.03,73.12,107.45,73.2,108.88,73.27z"/>
+
+ <linearGradient id="SVGID_389_" gradientUnits="userSpaceOnUse" x1="156.8677" y1="-281.4067" x2="161.0288" y2="-274.1994" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_389_)" d="M108.9,62.45c0.71-1.19,1.43-2.38,2.14-3.57c-0.71-1.25-1.42-2.5-2.13-3.74
+ c-1.42-0.05-2.85-0.11-4.28-0.16c-0.71,1.18-1.43,2.37-2.14,3.55c0.71,1.25,1.42,2.49,2.13,3.74
+ C106.05,62.33,107.48,62.39,108.9,62.45z"/>
+
+ <linearGradient id="SVGID_390_" gradientUnits="userSpaceOnUse" x1="156.8359" y1="-292.2158" x2="161.0098" y2="-284.9865" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_390_)" d="M108.93,51.64c0.72-1.2,1.43-2.39,2.15-3.59c-0.71-1.24-1.42-2.49-2.13-3.73
+ c-1.42-0.04-2.85-0.09-4.27-0.13c-0.71,1.19-1.43,2.38-2.14,3.57c0.71,1.24,1.42,2.48,2.13,3.72
+ C106.08,51.54,107.5,51.59,108.93,51.64z"/>
+
+ <linearGradient id="SVGID_391_" gradientUnits="userSpaceOnUse" x1="156.8042" y1="-303.0273" x2="160.9932" y2="-295.7719" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_391_)" d="M108.95,40.82c0.72-1.2,1.43-2.4,2.15-3.61c-0.71-1.24-1.42-2.48-2.13-3.71
+ c-1.42-0.03-2.85-0.06-4.27-0.1c-0.71,1.2-1.43,2.4-2.15,3.59c0.71,1.23,1.42,2.47,2.13,3.71
+ C106.1,40.74,107.53,40.78,108.95,40.82z"/>
+
+ <linearGradient id="SVGID_392_" gradientUnits="userSpaceOnUse" x1="156.7739" y1="-313.8354" x2="160.9746" y2="-306.5597" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_392_)" d="M108.97,30.01c0.71-1.2,1.43-2.41,2.15-3.62c-0.71-1.23-1.42-2.46-2.13-3.69
+ c-1.42-0.02-2.85-0.05-4.27-0.07c-0.71,1.2-1.43,2.41-2.15,3.61c0.71,1.23,1.42,2.46,2.13,3.69
+ C106.12,29.95,107.55,29.98,108.97,30.01z"/>
+
+ <linearGradient id="SVGID_393_" gradientUnits="userSpaceOnUse" x1="156.7407" y1="-324.646" x2="160.9561" y2="-317.3448" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_393_)" d="M109,19.19c0.71-1.21,1.43-2.42,2.14-3.63c-0.71-1.23-1.42-2.46-2.13-3.68
+ c-1.42-0.01-2.85-0.02-4.27-0.04c-0.71,1.21-1.43,2.42-2.14,3.62c0.71,1.22,1.42,2.45,2.13,3.67
+ C106.15,19.16,107.57,19.17,109,19.19z"/>
+
+ <linearGradient id="SVGID_394_" gradientUnits="userSpaceOnUse" x1="156.708" y1="-335.4565" x2="160.936" y2="-328.1334" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_394_)" d="M109.02,8.38c0.71-1.21,1.43-2.43,2.14-3.65c-0.71-1.22-1.42-2.44-2.13-3.67
+ c-1.42,0-2.85,0-4.27,0c-0.71,1.21-1.43,2.43-2.14,3.64c0.71,1.21,1.42,2.43,2.13,3.65C106.18,8.36,107.6,8.37,109.02,8.38z"/>
+
+ <linearGradient id="SVGID_395_" gradientUnits="userSpaceOnUse" x1="168.0923" y1="-265.375" x2="172.1914" y2="-258.2751" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_395_)" d="M97.71,78.44c0.71-1.17,1.43-2.33,2.14-3.5c-0.71-1.25-1.42-2.5-2.13-3.75
+ c-1.43-0.08-2.85-0.16-4.28-0.25c-0.71,1.16-1.43,2.33-2.14,3.48c0.71,1.25,1.42,2.5,2.12,3.75
+ C94.86,78.26,96.28,78.35,97.71,78.44z"/>
+
+ <linearGradient id="SVGID_396_" gradientUnits="userSpaceOnUse" x1="168.0586" y1="-276.0962" x2="172.1719" y2="-268.9718" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_396_)" d="M97.73,67.71c0.71-1.17,1.43-2.34,2.15-3.52c-0.71-1.25-1.42-2.49-2.13-3.73
+ c-1.42-0.07-2.85-0.14-4.27-0.21c-0.72,1.17-1.43,2.34-2.15,3.5c0.71,1.24,1.42,2.49,2.13,3.73
+ C94.88,67.56,96.31,67.64,97.73,67.71z"/>
+
+ <linearGradient id="SVGID_397_" gradientUnits="userSpaceOnUse" x1="168.0234" y1="-286.8203" x2="172.1543" y2="-279.6655" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_397_)" d="M97.76,56.99c0.72-1.18,1.43-2.36,2.15-3.54c-0.71-1.24-1.42-2.48-2.13-3.72
+ c-1.43-0.06-2.85-0.12-4.28-0.17c-0.72,1.18-1.43,2.35-2.14,3.52c0.71,1.23,1.42,2.47,2.13,3.71
+ C94.91,56.86,96.34,56.92,97.76,56.99z"/>
+
+ <linearGradient id="SVGID_398_" gradientUnits="userSpaceOnUse" x1="167.9888" y1="-297.542" x2="172.1348" y2="-290.3609" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_398_)" d="M97.79,46.26c0.71-1.18,1.43-2.37,2.14-3.56c-0.71-1.23-1.42-2.47-2.13-3.7
+ c-1.42-0.04-2.85-0.09-4.27-0.13c-0.72,1.18-1.43,2.36-2.15,3.54c0.71,1.23,1.42,2.46,2.13,3.69
+ C94.94,46.15,96.36,46.21,97.79,46.26z"/>
+
+ <linearGradient id="SVGID_399_" gradientUnits="userSpaceOnUse" x1="167.9531" y1="-308.2676" x2="172.1167" y2="-301.0561" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_399_)" d="M97.81,35.53c0.72-1.19,1.43-2.38,2.14-3.57c-0.71-1.23-1.42-2.46-2.12-3.69
+ c-1.43-0.03-2.85-0.06-4.28-0.1c-0.71,1.19-1.43,2.37-2.14,3.56c0.71,1.22,1.42,2.45,2.12,3.67
+ C94.96,35.45,96.39,35.49,97.81,35.53z"/>
+
+ <linearGradient id="SVGID_400_" gradientUnits="userSpaceOnUse" x1="167.9194" y1="-318.9868" x2="172.0981" y2="-311.7491" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_400_)" d="M97.84,24.81c0.71-1.2,1.43-2.39,2.14-3.59c-0.71-1.22-1.42-2.44-2.13-3.66
+ c-1.42-0.02-2.85-0.04-4.27-0.06c-0.72,1.19-1.43,2.39-2.14,3.58c0.71,1.22,1.42,2.43,2.12,3.66
+ C94.99,24.75,96.42,24.78,97.84,24.81z"/>
+
+ <linearGradient id="SVGID_401_" gradientUnits="userSpaceOnUse" x1="167.8838" y1="-329.7104" x2="172.0776" y2="-322.4465" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_401_)" d="M97.87,14.08c0.71-1.2,1.43-2.4,2.14-3.61c-0.71-1.22-1.42-2.43-2.13-3.65
+ c-1.42-0.01-2.85-0.01-4.27-0.02c-0.72,1.2-1.43,2.4-2.14,3.6c0.71,1.21,1.42,2.42,2.13,3.63C95.02,14.05,96.44,14.06,97.87,14.08z
+ "/>
+
+ <linearGradient id="SVGID_402_" gradientUnits="userSpaceOnUse" x1="168.8901" y1="-338.6313" x2="172.0601" y2="-333.1409" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_402_)" d="M91.49-0.28c0.71,1.2,1.42,2.41,2.13,3.62c1.42,0,2.85,0.01,4.27,0.01
+ c0.71-1.21,1.43-2.42,2.14-3.63C97.19-0.28,94.34-0.28,91.49-0.28z"/>
+
+ <linearGradient id="SVGID_403_" gradientUnits="userSpaceOnUse" x1="178.9194" y1="-261.1211" x2="181.877" y2="-255.9985" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_403_)" d="M89.05,79.2c-0.71-1.25-1.42-2.5-2.13-3.75c-1.42-0.1-2.85-0.19-4.27-0.3
+ c-0.71,1.14-1.43,2.29-2.14,3.42C83.35,78.79,86.2,79,89.05,79.2z"/>
+
+ <linearGradient id="SVGID_404_" gradientUnits="userSpaceOnUse" x1="178.8828" y1="-271.7446" x2="182.9463" y2="-264.7065" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_404_)" d="M86.93,72.01c0.71-1.15,1.43-2.31,2.15-3.46c-0.71-1.24-1.42-2.48-2.13-3.73
+ c-1.42-0.08-2.85-0.17-4.27-0.25c-0.71,1.15-1.43,2.3-2.14,3.44c0.71,1.24,1.42,2.48,2.12,3.72
+ C84.08,71.83,85.51,71.92,86.93,72.01z"/>
+
+ <linearGradient id="SVGID_405_" gradientUnits="userSpaceOnUse" x1="178.8457" y1="-282.3716" x2="182.9292" y2="-275.2988" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_405_)" d="M86.96,61.38c0.71-1.16,1.43-2.32,2.15-3.48c-0.71-1.24-1.42-2.47-2.13-3.71
+ c-1.43-0.07-2.85-0.14-4.28-0.21c-0.71,1.16-1.43,2.31-2.14,3.46c0.71,1.23,1.42,2.46,2.12,3.7
+ C84.11,61.23,85.54,61.31,86.96,61.38z"/>
+
+ <linearGradient id="SVGID_406_" gradientUnits="userSpaceOnUse" x1="178.8086" y1="-292.9961" x2="182.9087" y2="-285.8945" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_406_)" d="M86.99,50.75c0.71-1.17,1.43-2.33,2.15-3.51c-0.71-1.23-1.42-2.46-2.13-3.68
+ c-1.43-0.06-2.85-0.12-4.28-0.17c-0.71,1.17-1.43,2.33-2.14,3.49c0.71,1.22,1.42,2.45,2.13,3.68
+ C84.14,50.62,85.56,50.69,86.99,50.75z"/>
+
+ <linearGradient id="SVGID_407_" gradientUnits="userSpaceOnUse" x1="178.7725" y1="-303.6211" x2="182.8911" y2="-296.4874" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_407_)" d="M87.01,40.12c0.72-1.17,1.43-2.35,2.15-3.53c-0.71-1.22-1.42-2.45-2.13-3.67
+ c-1.42-0.04-2.85-0.09-4.27-0.13c-0.72,1.17-1.43,2.34-2.14,3.51c0.71,1.22,1.42,2.44,2.12,3.66
+ C84.17,40.02,85.59,40.07,87.01,40.12z"/>
+
+ <linearGradient id="SVGID_408_" gradientUnits="userSpaceOnUse" x1="178.7358" y1="-314.2451" x2="182.8716" y2="-307.0818" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_408_)" d="M87.04,29.49c0.72-1.18,1.43-2.36,2.15-3.54c-0.71-1.22-1.42-2.43-2.13-3.64
+ c-1.42-0.03-2.85-0.06-4.27-0.09c-0.71,1.18-1.43,2.36-2.14,3.53c0.71,1.21,1.42,2.42,2.13,3.64
+ C84.19,29.41,85.62,29.45,87.04,29.49z"/>
+
+ <linearGradient id="SVGID_409_" gradientUnits="userSpaceOnUse" x1="178.6992" y1="-324.8711" x2="182.853" y2="-317.6765" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_409_)" d="M87.07,18.86c0.71-1.19,1.43-2.38,2.14-3.57c-0.71-1.21-1.42-2.42-2.12-3.62
+ c-1.42-0.02-2.85-0.03-4.27-0.05c-0.71,1.19-1.43,2.37-2.14,3.55c0.71,1.2,1.42,2.41,2.12,3.61
+ C84.22,18.81,85.65,18.84,87.07,18.86z"/>
+
+ <linearGradient id="SVGID_410_" gradientUnits="userSpaceOnUse" x1="178.6616" y1="-335.4951" x2="182.8325" y2="-328.2709" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_410_)" d="M87.1,8.23c0.71-1.19,1.43-2.39,2.14-3.58c-0.71-1.21-1.42-2.41-2.13-3.61c-1.42,0-2.85,0-4.27,0
+ c-0.71,1.19-1.43,2.38-2.14,3.57C81.41,5.8,82.12,7,82.83,8.2C84.25,8.21,85.67,8.22,87.1,8.23z"/>
+
+ <linearGradient id="SVGID_411_" gradientUnits="userSpaceOnUse" x1="190.0698" y1="-266.7964" x2="194.0757" y2="-259.858" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_411_)" d="M75.77,76.91c0.71-1.13,1.43-2.26,2.14-3.4c-0.71-1.24-1.42-2.48-2.12-3.72
+ c-1.42-0.1-2.85-0.21-4.27-0.31c-0.71,1.13-1.43,2.25-2.14,3.38c0.71,1.23,1.42,2.47,2.12,3.71
+ C72.93,76.68,74.35,76.79,75.77,76.91z"/>
+
+ <linearGradient id="SVGID_412_" gradientUnits="userSpaceOnUse" x1="190.0327" y1="-277.3081" x2="194.0586" y2="-270.3351" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_412_)" d="M75.8,66.39c0.71-1.14,1.43-2.28,2.14-3.42c-0.71-1.23-1.42-2.46-2.12-3.69
+ c-1.42-0.09-2.85-0.17-4.27-0.26c-0.71,1.14-1.43,2.27-2.14,3.4c0.71,1.23,1.42,2.45,2.12,3.69C72.95,66.19,74.38,66.29,75.8,66.39
+ z"/>
+
+ <linearGradient id="SVGID_413_" gradientUnits="userSpaceOnUse" x1="189.9941" y1="-287.8203" x2="194.04" y2="-280.8126" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_413_)" d="M75.83,55.87c0.71-1.15,1.43-2.29,2.14-3.44c-0.71-1.23-1.42-2.45-2.13-3.67
+ c-1.42-0.07-2.85-0.15-4.27-0.22c-0.71,1.14-1.43,2.28-2.14,3.42c0.71,1.22,1.42,2.44,2.12,3.66
+ C72.98,55.71,74.4,55.79,75.83,55.87z"/>
+
+ <linearGradient id="SVGID_414_" gradientUnits="userSpaceOnUse" x1="189.957" y1="-298.3311" x2="194.0229" y2="-291.2887" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_414_)" d="M75.86,45.35c0.71-1.15,1.43-2.31,2.14-3.47c-0.71-1.22-1.42-2.43-2.13-3.65
+ c-1.42-0.06-2.85-0.11-4.27-0.17c-0.71,1.15-1.43,2.3-2.14,3.44c0.71,1.21,1.42,2.42,2.12,3.64
+ C73.01,45.22,74.43,45.29,75.86,45.35z"/>
+
+ <linearGradient id="SVGID_415_" gradientUnits="userSpaceOnUse" x1="189.918" y1="-308.8442" x2="194.0044" y2="-301.7663" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_415_)" d="M75.88,34.84c0.71-1.16,1.43-2.33,2.14-3.49c-0.71-1.21-1.42-2.42-2.12-3.63
+ c-1.43-0.04-2.85-0.08-4.27-0.12c-0.71,1.16-1.43,2.32-2.14,3.47c0.71,1.2,1.42,2.41,2.13,3.61
+ C73.04,34.73,74.46,34.78,75.88,34.84z"/>
+
+ <linearGradient id="SVGID_416_" gradientUnits="userSpaceOnUse" x1="189.8809" y1="-319.356" x2="193.9873" y2="-312.2434" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_416_)" d="M75.91,24.32c0.71-1.17,1.43-2.34,2.14-3.51c-0.71-1.2-1.42-2.4-2.12-3.6
+ c-1.43-0.02-2.85-0.05-4.28-0.08c-0.71,1.16-1.43,2.33-2.14,3.49c0.71,1.2,1.42,2.39,2.13,3.59
+ C73.06,24.24,74.49,24.28,75.91,24.32z"/>
+
+ <linearGradient id="SVGID_417_" gradientUnits="userSpaceOnUse" x1="189.8408" y1="-329.8691" x2="193.9688" y2="-322.7194" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_417_)" d="M75.94,13.8c0.71-1.18,1.43-2.35,2.15-3.54c-0.71-1.2-1.42-2.39-2.12-3.58
+ c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.17-1.43,2.35-2.14,3.52c0.71,1.19,1.42,2.37,2.13,3.57
+ C73.09,13.76,74.52,13.78,75.94,13.8z"/>
+
+ <linearGradient id="SVGID_418_" gradientUnits="userSpaceOnUse" x1="190.8145" y1="-338.6304" x2="193.9517" y2="-333.1966" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_418_)" d="M69.57-0.28c0.71,1.18,1.42,2.36,2.13,3.54c1.42,0.01,2.85,0.01,4.27,0.02
+ c0.71-1.18,1.43-2.37,2.14-3.56C75.26-0.28,72.42-0.28,69.57-0.28z"/>
+
+ <linearGradient id="SVGID_419_" gradientUnits="userSpaceOnUse" x1="200.8877" y1="-262.8164" x2="203.7612" y2="-257.8393" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_419_)" d="M67.13,77.49c-0.71-1.24-1.42-2.47-2.12-3.7c-1.42-0.12-2.85-0.24-4.27-0.37
+ c-0.71,1.1-1.43,2.2-2.14,3.3C61.44,76.99,64.28,77.24,67.13,77.49z"/>
+
+ <linearGradient id="SVGID_420_" gradientUnits="userSpaceOnUse" x1="200.8506" y1="-273.207" x2="204.8164" y2="-266.338" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_420_)" d="M65.01,70.42c0.71-1.12,1.43-2.23,2.14-3.36c-0.71-1.23-1.42-2.45-2.12-3.68
+ c-1.43-0.1-2.85-0.21-4.27-0.32c-0.71,1.11-1.43,2.22-2.14,3.33c0.71,1.22,1.42,2.44,2.12,3.67
+ C62.17,70.19,63.59,70.31,65.01,70.42z"/>
+
+ <linearGradient id="SVGID_421_" gradientUnits="userSpaceOnUse" x1="200.8115" y1="-283.5967" x2="204.8003" y2="-276.6879" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_421_)" d="M65.04,60.03c0.71-1.12,1.43-2.25,2.14-3.38c-0.71-1.22-1.42-2.44-2.12-3.65
+ c-1.43-0.09-2.85-0.17-4.27-0.26c-0.71,1.12-1.43,2.24-2.14,3.35c0.71,1.21,1.41,2.42,2.12,3.64
+ C62.19,59.83,63.62,59.93,65.04,60.03z"/>
+
+ <linearGradient id="SVGID_422_" gradientUnits="userSpaceOnUse" x1="200.7739" y1="-293.9863" x2="204.7837" y2="-287.0412" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_422_)" d="M65.07,49.63c0.71-1.13,1.43-2.27,2.14-3.4c-0.71-1.21-1.42-2.42-2.12-3.63
+ c-1.43-0.07-2.85-0.14-4.27-0.21c-0.71,1.13-1.43,2.26-2.14,3.38c0.71,1.2,1.42,2.41,2.12,3.62
+ C62.22,49.47,63.64,49.55,65.07,49.63z"/>
+
+ <linearGradient id="SVGID_423_" gradientUnits="userSpaceOnUse" x1="200.7354" y1="-304.377" x2="204.7686" y2="-297.3912" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_423_)" d="M65.09,39.23c0.71-1.14,1.43-2.28,2.14-3.43c-0.71-1.2-1.42-2.4-2.12-3.6
+ c-1.42-0.05-2.85-0.11-4.27-0.16c-0.71,1.14-1.43,2.27-2.14,3.41c0.71,1.19,1.42,2.39,2.12,3.59
+ C62.25,39.1,63.67,39.17,65.09,39.23z"/>
+
+ <linearGradient id="SVGID_424_" gradientUnits="userSpaceOnUse" x1="200.6973" y1="-314.7651" x2="204.751" y2="-307.7439" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_424_)" d="M65.12,28.84c0.71-1.15,1.43-2.3,2.14-3.45c-0.71-1.19-1.42-2.39-2.13-3.58
+ c-1.42-0.04-2.85-0.07-4.27-0.11c-0.71,1.15-1.43,2.29-2.14,3.43c0.71,1.19,1.42,2.37,2.13,3.56
+ C62.27,28.74,63.7,28.79,65.12,28.84z"/>
+
+ <linearGradient id="SVGID_425_" gradientUnits="userSpaceOnUse" x1="200.6582" y1="-325.1562" x2="204.7363" y2="-318.0927" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_425_)" d="M65.15,18.44c0.72-1.16,1.43-2.32,2.15-3.48c-0.71-1.19-1.42-2.37-2.13-3.55
+ c-1.42-0.02-2.85-0.04-4.27-0.06c-0.71,1.16-1.43,2.31-2.14,3.46c0.71,1.18,1.42,2.36,2.13,3.54
+ C62.3,18.38,63.72,18.41,65.15,18.44z"/>
+
+ <linearGradient id="SVGID_426_" gradientUnits="userSpaceOnUse" x1="200.6187" y1="-335.5449" x2="204.7178" y2="-328.445" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_426_)" d="M65.17,8.04c0.71-1.17,1.43-2.33,2.15-3.5c-0.71-1.18-1.42-2.36-2.13-3.53c-1.42,0-2.85,0-4.27,0
+ c-0.72,1.17-1.43,2.33-2.14,3.49C59.49,5.66,60.19,6.83,60.9,8C62.33,8.02,63.75,8.03,65.17,8.04z"/>
+
+ <linearGradient id="SVGID_427_" gradientUnits="userSpaceOnUse" x1="212.0288" y1="-268.5566" x2="215.9248" y2="-261.8086" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_427_)" d="M53.87,75c0.71-1.09,1.43-2.18,2.14-3.28c-0.71-1.22-1.42-2.44-2.12-3.66
+ c-1.42-0.12-2.85-0.25-4.27-0.38c-0.71,1.09-1.42,2.17-2.14,3.25c0.71,1.21,1.42,2.43,2.12,3.65C51.02,74.72,52.45,74.86,53.87,75z
+ "/>
+
+ <linearGradient id="SVGID_428_" gradientUnits="userSpaceOnUse" x1="211.9917" y1="-278.8057" x2="215.9116" y2="-272.0162" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_428_)" d="M53.89,64.74c0.71-1.1,1.43-2.2,2.14-3.3c-0.71-1.22-1.42-2.43-2.12-3.63
+ c-1.42-0.1-2.84-0.21-4.27-0.32c-0.71,1.1-1.43,2.19-2.14,3.28c0.71,1.21,1.42,2.41,2.12,3.62C51.05,64.5,52.47,64.62,53.89,64.74z
+ "/>
+
+ <linearGradient id="SVGID_429_" gradientUnits="userSpaceOnUse" x1="211.9541" y1="-289.0591" x2="215.8999" y2="-282.2248" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_429_)" d="M53.92,54.48c0.71-1.11,1.43-2.22,2.14-3.33c-0.71-1.2-1.41-2.41-2.12-3.61
+ c-1.42-0.09-2.85-0.17-4.27-0.26c-0.71,1.1-1.43,2.21-2.14,3.3c0.71,1.2,1.42,2.39,2.12,3.6C51.07,54.28,52.5,54.38,53.92,54.48z"
+ />
+
+ <linearGradient id="SVGID_430_" gradientUnits="userSpaceOnUse" x1="211.9165" y1="-299.3091" x2="215.8857" y2="-292.4342" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_430_)" d="M53.94,44.22c0.72-1.12,1.43-2.24,2.14-3.36c-0.71-1.2-1.42-2.39-2.12-3.58
+ c-1.42-0.07-2.85-0.14-4.27-0.21c-0.72,1.12-1.43,2.23-2.14,3.33c0.71,1.19,1.42,2.37,2.12,3.57
+ C51.1,44.06,52.52,44.14,53.94,44.22z"/>
+
+ <linearGradient id="SVGID_431_" gradientUnits="userSpaceOnUse" x1="211.8784" y1="-309.5605" x2="215.873" y2="-302.6416" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_431_)" d="M53.97,33.97c0.71-1.13,1.43-2.25,2.14-3.39c-0.71-1.18-1.42-2.37-2.12-3.55
+ c-1.42-0.05-2.85-0.1-4.27-0.15C49,28,48.29,29.12,47.57,30.24c0.71,1.18,1.42,2.36,2.13,3.54C51.12,33.84,52.54,33.91,53.97,33.97
+ z"/>
+
+ <linearGradient id="SVGID_432_" gradientUnits="userSpaceOnUse" x1="211.8413" y1="-319.811" x2="215.8604" y2="-312.8499" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_432_)" d="M53.99,23.71c0.71-1.13,1.43-2.27,2.14-3.42c-0.71-1.18-1.42-2.35-2.12-3.52
+ c-1.42-0.03-2.85-0.06-4.27-0.09c-0.71,1.13-1.43,2.26-2.14,3.39c0.71,1.17,1.42,2.34,2.13,3.51
+ C51.15,23.62,52.57,23.67,53.99,23.71z"/>
+
+ <linearGradient id="SVGID_433_" gradientUnits="userSpaceOnUse" x1="211.8042" y1="-330.0625" x2="215.8481" y2="-323.0582" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_433_)" d="M54.02,13.45c0.71-1.14,1.43-2.29,2.14-3.44c-0.71-1.17-1.42-2.33-2.12-3.5
+ c-1.42-0.01-2.85-0.02-4.27-0.04c-0.71,1.14-1.43,2.28-2.14,3.42c0.71,1.16,1.42,2.32,2.13,3.48C51.17,13.4,52.6,13.43,54.02,13.45
+ z"/>
+
+ <linearGradient id="SVGID_434_" gradientUnits="userSpaceOnUse" x1="212.7363" y1="-338.6313" x2="215.8345" y2="-333.2652" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_434_)" d="M47.65-0.28c0.71,1.15,1.42,2.3,2.13,3.45c1.42,0,2.85,0.01,4.27,0.02
+ c0.71-1.15,1.43-2.31,2.14-3.47C53.34-0.28,50.49-0.28,47.65-0.28z"/>
+
+ <linearGradient id="SVGID_435_" gradientUnits="userSpaceOnUse" x1="222.8325" y1="-264.8745" x2="225.6128" y2="-260.0589" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_435_)" d="M45.24,75.4c-0.71-1.22-1.41-2.43-2.12-3.64c-1.42-0.15-2.84-0.29-4.26-0.44
+ c-0.71,1.06-1.42,2.12-2.14,3.17C39.55,74.8,42.39,75.11,45.24,75.4z"/>
+
+ <linearGradient id="SVGID_436_" gradientUnits="userSpaceOnUse" x1="222.7974" y1="-274.979" x2="226.6479" y2="-268.3096" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_436_)" d="M43.12,68.49c0.71-1.07,1.43-2.15,2.14-3.23c-0.71-1.21-1.41-2.41-2.12-3.61
+ c-1.42-0.12-2.84-0.25-4.26-0.38c-0.71,1.07-1.42,2.14-2.13,3.2c0.71,1.2,1.41,2.4,2.12,3.6C40.28,68.21,41.7,68.35,43.12,68.49z"
+ />
+
+ <linearGradient id="SVGID_437_" gradientUnits="userSpaceOnUse" x1="222.7627" y1="-285.083" x2="226.6396" y2="-278.3679" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_437_)" d="M43.14,58.37c0.71-1.08,1.43-2.17,2.14-3.26c-0.71-1.2-1.42-2.39-2.12-3.58
+ c-1.42-0.1-2.84-0.21-4.26-0.32c-0.71,1.08-1.42,2.16-2.14,3.23c0.71,1.19,1.42,2.38,2.12,3.57C40.3,58.14,41.72,58.26,43.14,58.37
+ z"/>
+
+ <linearGradient id="SVGID_438_" gradientUnits="userSpaceOnUse" x1="222.7266" y1="-295.188" x2="226.6313" y2="-288.4247" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_438_)" d="M43.16,48.26c0.71-1.09,1.43-2.19,2.14-3.29c-0.71-1.19-1.42-2.37-2.12-3.55
+ c-1.42-0.08-2.84-0.17-4.27-0.25c-0.71,1.09-1.43,2.18-2.14,3.26c0.71,1.18,1.42,2.35,2.12,3.54
+ C40.32,48.07,41.74,48.17,43.16,48.26z"/>
+
+ <linearGradient id="SVGID_439_" gradientUnits="userSpaceOnUse" x1="222.6895" y1="-305.293" x2="226.6216" y2="-298.4823" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_439_)" d="M43.19,38.15c0.71-1.1,1.43-2.21,2.14-3.32c-0.71-1.18-1.42-2.35-2.12-3.53
+ c-1.42-0.06-2.85-0.13-4.27-0.19c-0.71,1.1-1.43,2.2-2.14,3.29c0.71,1.17,1.42,2.33,2.12,3.51C40.34,38,41.77,38.07,43.19,38.15z"
+ />
+
+ <linearGradient id="SVGID_440_" gradientUnits="userSpaceOnUse" x1="222.6543" y1="-315.397" x2="226.6138" y2="-308.539" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_440_)" d="M43.21,28.04c0.71-1.11,1.43-2.23,2.14-3.35c-0.71-1.17-1.42-2.33-2.12-3.49
+ c-1.42-0.04-2.85-0.09-4.27-0.13c-0.71,1.11-1.43,2.22-2.14,3.32c0.71,1.16,1.42,2.31,2.12,3.48
+ C40.36,27.93,41.79,27.98,43.21,28.04z"/>
+
+ <linearGradient id="SVGID_441_" gradientUnits="userSpaceOnUse" x1="222.6196" y1="-325.5005" x2="226.6055" y2="-318.5968" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_441_)" d="M43.23,17.93c0.71-1.12,1.43-2.25,2.14-3.38c-0.71-1.16-1.42-2.31-2.13-3.46
+ c-1.42-0.02-2.85-0.05-4.27-0.07c-0.71,1.12-1.43,2.24-2.14,3.36c0.71,1.15,1.42,2.29,2.13,3.45
+ C40.38,17.86,41.81,17.89,43.23,17.93z"/>
+
+ <linearGradient id="SVGID_442_" gradientUnits="userSpaceOnUse" x1="222.5825" y1="-335.6055" x2="226.5947" y2="-328.6561" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_442_)" d="M43.25,7.82c0.72-1.13,1.43-2.27,2.14-3.41c-0.71-1.15-1.42-2.29-2.13-3.44
+ c-1.42,0-2.85,0-4.27-0.01c-0.71,1.13-1.43,2.26-2.14,3.39c0.71,1.13,1.42,2.27,2.13,3.41C40.41,7.78,41.83,7.8,43.25,7.82z"/>
+
+ <linearGradient id="SVGID_443_" gradientUnits="userSpaceOnUse" x1="233.9585" y1="-270.6538" x2="237.728" y2="-264.1248" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_443_)" d="M32,72.72c0.71-1.04,1.42-2.09,2.13-3.14c-0.71-1.2-1.42-2.4-2.12-3.59
+ c-1.42-0.15-2.84-0.29-4.26-0.44c-0.71,1.04-1.42,2.07-2.13,3.1c0.7,1.19,1.41,2.39,2.12,3.58C29.16,72.4,30.58,72.56,32,72.72z"/>
+
+ <linearGradient id="SVGID_444_" gradientUnits="userSpaceOnUse" x1="233.9268" y1="-280.5952" x2="237.7271" y2="-274.0129" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_444_)" d="M32.02,62.77c0.71-1.05,1.42-2.11,2.13-3.17c-0.71-1.19-1.42-2.38-2.12-3.56
+ c-1.42-0.12-2.84-0.25-4.26-0.38c-0.71,1.05-1.42,2.1-2.13,3.14c0.71,1.18,1.41,2.36,2.12,3.55C29.18,62.5,30.6,62.64,32.02,62.77z
+ "/>
+
+ <linearGradient id="SVGID_445_" gradientUnits="userSpaceOnUse" x1="233.8955" y1="-290.5352" x2="237.7251" y2="-283.9021" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_445_)" d="M32.03,52.83c0.71-1.06,1.42-2.13,2.14-3.2c-0.71-1.18-1.42-2.35-2.12-3.53
+ c-1.42-0.1-2.84-0.2-4.26-0.31c-0.71,1.06-1.42,2.12-2.13,3.17c0.71,1.17,1.42,2.34,2.12,3.51C29.19,52.59,30.61,52.71,32.03,52.83
+ z"/>
+
+ <linearGradient id="SVGID_446_" gradientUnits="userSpaceOnUse" x1="233.8633" y1="-300.4727" x2="237.7207" y2="-293.7914" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_446_)" d="M32.05,42.88c0.71-1.08,1.42-2.15,2.14-3.24c-0.71-1.17-1.42-2.33-2.13-3.49
+ c-1.42-0.08-2.84-0.16-4.26-0.24c-0.71,1.07-1.42,2.14-2.13,3.21c0.71,1.16,1.42,2.32,2.12,3.48
+ C29.21,42.69,30.63,42.78,32.05,42.88z"/>
+
+ <linearGradient id="SVGID_447_" gradientUnits="userSpaceOnUse" x1="233.8306" y1="-310.4131" x2="237.7173" y2="-303.6811" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_447_)" d="M32.07,32.93c0.71-1.09,1.43-2.17,2.14-3.27c-0.71-1.16-1.42-2.31-2.13-3.46
+ c-1.42-0.06-2.84-0.12-4.27-0.18c-0.71,1.08-1.43,2.16-2.14,3.24c0.71,1.14,1.42,2.29,2.13,3.44
+ C29.23,32.78,30.65,32.86,32.07,32.93z"/>
+
+ <linearGradient id="SVGID_448_" gradientUnits="userSpaceOnUse" x1="233.8008" y1="-320.3525" x2="237.7163" y2="-313.5706" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_448_)" d="M32.09,22.98c0.71-1.1,1.43-2.2,2.14-3.3c-0.71-1.15-1.42-2.29-2.13-3.43
+ c-1.42-0.04-2.85-0.07-4.27-0.11c-0.71,1.1-1.43,2.19-2.14,3.27c0.71,1.13,1.42,2.27,2.13,3.41
+ C29.24,22.88,30.67,22.93,32.09,22.98z"/>
+
+ <linearGradient id="SVGID_449_" gradientUnits="userSpaceOnUse" x1="233.7666" y1="-330.2925" x2="237.7119" y2="-323.459" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_449_)" d="M32.11,13.03c0.71-1.11,1.43-2.22,2.14-3.33c-0.71-1.13-1.42-2.27-2.13-3.4
+ c-1.42-0.01-2.85-0.03-4.27-0.04c-0.71,1.11-1.43,2.21-2.14,3.31c0.71,1.12,1.42,2.25,2.13,3.38
+ C29.26,12.98,30.68,13.01,32.11,13.03z"/>
+
+ <linearGradient id="SVGID_450_" gradientUnits="userSpaceOnUse" x1="234.6597" y1="-338.6313" x2="237.7095" y2="-333.3489" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_450_)" d="M25.72-0.28c0.71,1.11,1.42,2.22,2.13,3.34c1.42,0.01,2.85,0.02,4.27,0.02
+ c0.71-1.12,1.43-2.24,2.14-3.37C31.42-0.28,28.57-0.28,25.72-0.28z"/>
+
+ <linearGradient id="SVGID_451_" gradientUnits="userSpaceOnUse" x1="244.7446" y1="-267.2954" x2="247.4238" y2="-262.6549" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_451_)" d="M23.38,72.94c-0.71-1.19-1.41-2.38-2.12-3.57c-1.41-0.17-2.83-0.34-4.25-0.51
+ c-0.71,1.01-1.42,2.01-2.13,3.01C17.71,72.24,20.55,72.59,23.38,72.94z"/>
+
+ <linearGradient id="SVGID_452_" gradientUnits="userSpaceOnUse" x1="244.7158" y1="-277.0654" x2="248.4365" y2="-270.621" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_452_)" d="M21.26,66.21c0.71-1.02,1.42-2.05,2.13-3.08c-0.71-1.18-1.42-2.36-2.12-3.53
+ c-1.42-0.14-2.84-0.29-4.26-0.43c-0.71,1.02-1.42,2.04-2.13,3.05c0.71,1.17,1.41,2.34,2.12,3.52
+ C18.43,65.89,19.85,66.05,21.26,66.21z"/>
+
+ <linearGradient id="SVGID_453_" gradientUnits="userSpaceOnUse" x1="244.6895" y1="-286.8335" x2="248.4409" y2="-280.3358" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_453_)" d="M21.28,56.43c0.71-1.04,1.42-2.08,2.13-3.12c-0.71-1.17-1.42-2.33-2.12-3.5
+ c-1.42-0.12-2.84-0.24-4.26-0.36c-0.71,1.03-1.42,2.06-2.13,3.08c0.71,1.16,1.42,2.32,2.12,3.48
+ C18.44,56.16,19.86,56.29,21.28,56.43z"/>
+
+ <linearGradient id="SVGID_454_" gradientUnits="userSpaceOnUse" x1="244.6626" y1="-296.5991" x2="248.4438" y2="-290.0498" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_454_)" d="M21.29,46.65c0.71-1.04,1.42-2.09,2.13-3.15c-0.71-1.16-1.42-2.31-2.13-3.46
+ c-1.42-0.1-2.84-0.2-4.26-0.3c-0.71,1.04-1.42,2.09-2.13,3.12c0.71,1.14,1.42,2.29,2.12,3.44C18.45,46.43,19.87,46.54,21.29,46.65z
+ "/>
+
+ <linearGradient id="SVGID_455_" gradientUnits="userSpaceOnUse" x1="244.6372" y1="-306.3667" x2="248.4497" y2="-299.7632" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_455_)" d="M21.3,36.88c0.71-1.06,1.43-2.12,2.13-3.19c-0.71-1.15-1.42-2.29-2.12-3.42
+ c-1.42-0.08-2.84-0.15-4.26-0.22c-0.71,1.06-1.42,2.11-2.13,3.16c0.71,1.13,1.42,2.27,2.13,3.41C18.46,36.7,19.88,36.79,21.3,36.88
+ z"/>
+
+ <linearGradient id="SVGID_456_" gradientUnits="userSpaceOnUse" x1="244.6079" y1="-316.1377" x2="248.4536" y2="-309.4767" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_456_)" d="M21.31,27.1c0.71-1.07,1.42-2.14,2.14-3.22c-0.71-1.13-1.42-2.27-2.13-3.39
+ c-1.42-0.05-2.84-0.1-4.27-0.15c-0.71,1.07-1.42,2.13-2.13,3.19c0.71,1.12,1.42,2.24,2.13,3.37C18.47,26.97,19.89,27.04,21.31,27.1
+ z"/>
+
+ <linearGradient id="SVGID_457_" gradientUnits="userSpaceOnUse" x1="244.5815" y1="-325.9062" x2="248.46" y2="-319.1886" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_457_)" d="M21.33,17.33c0.71-1.08,1.42-2.17,2.13-3.26c-0.71-1.12-1.42-2.24-2.13-3.36
+ c-1.42-0.03-2.85-0.05-4.27-0.08c-0.71,1.08-1.42,2.16-2.14,3.23c0.71,1.11,1.42,2.22,2.13,3.34
+ C18.48,17.24,19.91,17.28,21.33,17.33z"/>
+
+ <linearGradient id="SVGID_458_" gradientUnits="userSpaceOnUse" x1="244.5532" y1="-335.6743" x2="248.4624" y2="-328.9034" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_458_)" d="M21.34,7.55c0.71-1.09,1.43-2.19,2.14-3.29c-0.71-1.11-1.42-2.22-2.13-3.33
+ c-1.42,0-2.85-0.01-4.27-0.01c-0.71,1.09-1.42,2.18-2.14,3.27c0.71,1.09,1.42,2.19,2.13,3.3C18.49,7.51,19.92,7.53,21.34,7.55z"/>
+
+ <linearGradient id="SVGID_459_" gradientUnits="userSpaceOnUse" x1="255.856" y1="-273.0938" x2="259.4858" y2="-266.8066" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_459_)" d="M10.17,70.07c0.71-0.99,1.42-1.98,2.12-2.98c-0.71-1.17-1.42-2.34-2.12-3.51
+ c-1.42-0.17-2.83-0.33-4.25-0.51c-0.71,0.99-1.42,1.97-2.13,2.95c0.71,1.16,1.42,2.32,2.12,3.49C7.34,69.71,8.75,69.89,10.17,70.07
+ z"/>
+
+ <linearGradient id="SVGID_460_" gradientUnits="userSpaceOnUse" x1="255.8354" y1="-282.6714" x2="259.4985" y2="-276.3267" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_460_)" d="M10.18,60.49c0.71-1,1.42-2.01,2.13-3.02c-0.71-1.16-1.41-2.31-2.12-3.47
+ c-1.42-0.14-2.83-0.29-4.25-0.43c-0.71,1-1.42,1.99-2.13,2.98C4.51,57.7,5.22,58.85,5.92,60C7.34,60.17,8.76,60.33,10.18,60.49z"/>
+
+ <linearGradient id="SVGID_461_" gradientUnits="userSpaceOnUse" x1="255.8149" y1="-292.249" x2="259.5117" y2="-285.846" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_461_)" d="M10.18,50.9c0.71-1.01,1.42-2.03,2.13-3.06c-0.71-1.15-1.42-2.29-2.13-3.43
+ c-1.42-0.12-2.83-0.24-4.26-0.36c-0.71,1.01-1.42,2.02-2.13,3.02c0.71,1.13,1.42,2.27,2.13,3.41C7.35,50.63,8.76,50.77,10.18,50.9z
+ "/>
+
+ <linearGradient id="SVGID_462_" gradientUnits="userSpaceOnUse" x1="255.7964" y1="-301.8252" x2="259.5254" y2="-295.3664" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_462_)" d="M10.19,41.31c0.71-1.03,1.42-2.06,2.13-3.09c-0.71-1.13-1.42-2.26-2.13-3.39
+ c-1.42-0.09-2.84-0.19-4.26-0.28c-0.71,1.02-1.42,2.05-2.13,3.06c0.71,1.12,1.42,2.24,2.13,3.37C7.35,41.1,8.76,41.21,10.19,41.31z
+ "/>
+
+ <linearGradient id="SVGID_463_" gradientUnits="userSpaceOnUse" x1="255.7729" y1="-311.4058" x2="259.5381" y2="-304.8843" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_463_)" d="M10.19,31.73c0.71-1.04,1.42-2.08,2.13-3.13c-0.71-1.12-1.42-2.24-2.13-3.36
+ c-1.42-0.06-2.84-0.13-4.26-0.2c-0.71,1.04-1.42,2.07-2.13,3.1c0.71,1.11,1.42,2.22,2.13,3.33C7.35,31.56,8.77,31.64,10.19,31.73z"
+ />
+
+ <linearGradient id="SVGID_464_" gradientUnits="userSpaceOnUse" x1="255.7559" y1="-320.9819" x2="259.5527" y2="-314.4055" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_464_)" d="M10.2,22.14c0.71-1.05,1.42-2.11,2.13-3.17c-0.71-1.11-1.42-2.21-2.13-3.31
+ c-1.42-0.04-2.84-0.08-4.27-0.13c-0.71,1.05-1.42,2.1-2.13,3.14c0.71,1.09,1.42,2.19,2.13,3.29C7.36,22.02,8.77,22.08,10.2,22.14z"
+ />
+
+ <linearGradient id="SVGID_465_" gradientUnits="userSpaceOnUse" x1="255.7334" y1="-330.5615" x2="259.5659" y2="-323.9234" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_465_)" d="M10.2,12.55c0.71-1.06,1.43-2.13,2.13-3.2c-0.71-1.1-1.42-2.19-2.13-3.28
+ C8.78,6.05,7.36,6.03,5.93,6.02C5.22,7.08,4.51,8.14,3.8,9.2c0.71,1.08,1.42,2.16,2.13,3.25C7.36,12.48,8.78,12.52,10.2,12.55z"/>
+
+ <linearGradient id="SVGID_466_" gradientUnits="userSpaceOnUse" x1="256.5825" y1="-338.6318" x2="259.5781" y2="-333.4433" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)">
+ <stop offset="0.1264" style="stop-color:#80E6FF"/>
+ <stop offset="0.6429" style="stop-color:#2BD5FF"/>
+ <stop offset="1" style="stop-color:#2BD5FF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_466_)" d="M3.8-0.28c0.71,1.07,1.42,2.14,2.13,3.22c1.43,0.01,2.85,0.02,4.27,0.03
+ c0.71-1.08,1.43-2.16,2.14-3.24C9.5-0.28,6.65-0.28,3.8-0.28z"/>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_default_icon_68x68px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_default_icon_68x68px.svg
new file mode 100644
index 0000000000..1ffeedde1b
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_default_icon_68x68px.svg
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="68px" height="68px" viewBox="0 0 68 68" enable-background="new 0 0 68 68" xml:space="preserve">
+<g>
+ <path fill="#29CAF2" d="M68.03,63.85c0,2.35-1.9,4.25-4.25,4.25H4.28c-2.35,0-4.25-1.9-4.25-4.25V4.35C0.03,2,1.94,0.1,4.28,0.1
+ h59.5c2.35,0,4.25,1.9,4.25,4.25V63.85z"/>
+ <g>
+ <rect x="4.35" y="4.89" fill="#2BD5FF" width="58.44" height="58.44"/>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="8.9175" y1="36.4287" x2="62.7471" y2="36.4287">
+ <stop offset="0.1538" style="stop-color:#27C0E6"/>
+ <stop offset="0.4396" style="stop-color:#25B7DB"/>
+ <stop offset="0.7253" style="stop-color:#22A5C4"/>
+ </linearGradient>
+ <path fill="url(#SVGID_1_)" d="M62.65,63.24c0.15-4.38,0.2-10.69-0.56-11.92c-3.75-6.06-15.11-4.72-18.33-4.21
+ c0-1.52-0.01-2.86-0.02-3.88c0.66-0.68,1.26-1.46,1.81-2.31l0.08,0.25c4.67,0.67,5.26-14.6,5.26-14.6
+ C51.22,4.85,37.65,9.83,35.49,10.76c-3.99-1.01-13.46-1.7-13.19,14.65c0,0-0.69,14.47,4.61,14.88c0.65,1.11,1.4,2.09,2.21,2.94
+ c-0.01,0.94-0.05,2.15-0.1,3.54c-6.95-0.48-19.27-0.11-20.08,8.36c-0.08,0.82,0.15,4.82,0.36,8.11L62.65,63.24z"/>
+ </g>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_status_idle_38x38px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_status_idle_38x38px.svg
new file mode 100644
index 0000000000..71f49aa719
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_status_idle_38x38px.svg
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="38px" height="38px" viewBox="0 0 38 38" enable-background="new 0 0 38 38" xml:space="preserve">
+<g>
+ <circle fill="#29CAF2" cx="19.08" cy="19.08" r="19"/>
+ <g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="19.0747" y1="31.4219" x2="19.0747" y2="6.7417">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.8407" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#D9D9D9"/>
+ </linearGradient>
+ <path fill="url(#SVGID_1_)" d="M19.08,31.42c-6.8,0-12.34-5.54-12.34-12.34c0-6.8,5.54-12.34,12.34-12.34
+ c6.8,0,12.34,5.54,12.34,12.34C31.41,25.88,25.88,31.42,19.08,31.42L19.08,31.42z"/>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="9.5791" y1="12.4316" x2="28.57" y2="25.7292">
+ <stop offset="0.1099" style="stop-color:#FFFFFF"/>
+ <stop offset="0.6978" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <circle fill="url(#SVGID_2_)" cx="19.07" cy="19.08" r="11.59"/>
+ <g>
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="11.3086" y1="13.7173" x2="26.6309" y2="24.4461">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <path fill="url(#SVGID_3_)" d="M18.97,28.44c-5.16,0-9.36-4.19-9.36-9.35c0-5.16,4.2-9.36,9.36-9.36c5.16,0,9.35,4.2,9.35,9.36
+ C28.32,24.24,24.13,28.44,18.97,28.44L18.97,28.44z"/>
+ <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="25.4668" y1="24.5332" x2="12.4717" y2="13.629">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <circle fill="url(#SVGID_4_)" cx="18.97" cy="19.08" r="8.48"/>
+ <path fill="#FF901F" d="M18.97,26.44c-4.06,0-7.36-3.3-7.36-7.36c0-4.06,3.3-7.36,7.36-7.36c4.06,0,7.36,3.3,7.36,7.36
+ C26.33,23.14,23.03,26.44,18.97,26.44L18.97,26.44z"/>
+ <g>
+ <path fill="#FFD06B" d="M16.68,16.79c2.07-2.07,5.23-2.37,7.63-0.92c-0.25-0.42-0.56-0.83-0.93-1.19
+ c-2.43-2.43-6.39-2.43-8.82,0c-2.43,2.43-2.43,6.39,0,8.82c0.37,0.37,0.77,0.67,1.19,0.92C14.3,22.02,14.61,18.85,16.68,16.79z"
+ />
+
+ <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-119.9077" y1="69.291" x2="-124.6987" y2="60.9927" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)">
+ <stop offset="0" style="stop-color:#FF901F"/>
+ <stop offset="1" style="stop-color:#FFB81F"/>
+ </linearGradient>
+ <path fill="url(#SVGID_5_)" d="M23.38,23.49c2.07-2.07,2.37-5.23,0.93-7.63c-2.4-1.45-5.56-1.14-7.63,0.92
+ c-2.07,2.07-2.37,5.23-0.92,7.63C18.15,25.86,21.31,25.55,23.38,23.49z"/>
+ </g>
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_status_offline_38x38px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_status_offline_38x38px.svg
new file mode 100644
index 0000000000..84c2514adc
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_status_offline_38x38px.svg
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="38px" height="38px" viewBox="0 0 38 38" enable-background="new 0 0 38 38" xml:space="preserve">
+<g>
+ <circle fill="#29CAF2" cx="19.08" cy="19.09" r="19"/>
+ <g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="19.0757" y1="31.4287" x2="19.0757" y2="6.7485">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.8407" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#D9D9D9"/>
+ </linearGradient>
+ <path fill="url(#SVGID_1_)" d="M19.08,31.43c-6.8,0-12.34-5.54-12.34-12.34c0-6.8,5.54-12.34,12.34-12.34s12.34,5.54,12.34,12.34
+ C31.42,25.89,25.88,31.43,19.08,31.43L19.08,31.43z"/>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="9.5801" y1="12.439" x2="28.5702" y2="25.736">
+ <stop offset="0.1099" style="stop-color:#FFFFFF"/>
+ <stop offset="0.6978" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <circle fill="url(#SVGID_2_)" cx="19.07" cy="19.09" r="11.59"/>
+ <g>
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="11.3101" y1="13.7241" x2="26.6308" y2="24.4518">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <path fill="url(#SVGID_3_)" d="M18.97,28.44c-5.16,0-9.36-4.2-9.36-9.35c0-5.16,4.2-9.36,9.36-9.36c5.16,0,9.35,4.2,9.35,9.36
+ C28.32,24.25,24.13,28.44,18.97,28.44L18.97,28.44z"/>
+ <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="25.4678" y1="24.54" x2="12.4734" y2="13.6365">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <circle fill="url(#SVGID_4_)" cx="18.97" cy="19.09" r="8.48"/>
+ <path fill="#BD0700" d="M18.97,26.45c-4.06,0-7.36-3.3-7.36-7.36s3.3-7.36,7.36-7.36c4.06,0,7.36,3.3,7.36,7.36
+ S23.03,26.45,18.97,26.45L18.97,26.45z"/>
+ <g>
+ <path fill="#F25757" d="M16.68,16.79c2.07-2.07,5.23-2.37,7.63-0.92c-0.25-0.42-0.56-0.83-0.92-1.19
+ c-2.43-2.43-6.39-2.43-8.82,0c-2.43,2.43-2.43,6.39,0,8.82c0.37,0.37,0.77,0.67,1.19,0.92C14.3,22.02,14.61,18.86,16.68,16.79z"
+ />
+
+ <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-119.9072" y1="69.2979" x2="-124.6982" y2="60.9996" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)">
+ <stop offset="0" style="stop-color:#BD0700"/>
+ <stop offset="1" style="stop-color:#E35D58"/>
+ </linearGradient>
+ <path fill="url(#SVGID_5_)" d="M23.38,23.5c2.07-2.07,2.37-5.23,0.92-7.63c-2.4-1.45-5.56-1.14-7.63,0.92
+ c-2.07,2.07-2.37,5.23-0.92,7.63C18.15,25.86,21.31,25.56,23.38,23.5z"/>
+ </g>
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_status_online_38x38px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_status_online_38x38px.svg
new file mode 100644
index 0000000000..76daf31809
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_status_online_38x38px.svg
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="38px" height="38px" viewBox="0 0 38 38" enable-background="new 0 0 38 38" xml:space="preserve">
+<g>
+ <circle fill="#29CAF2" cx="19.07" cy="19.08" r="19"/>
+ <g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="19.0737" y1="31.4219" x2="19.0737" y2="6.7417">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.8407" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#D9D9D9"/>
+ </linearGradient>
+ <path fill="url(#SVGID_1_)" d="M19.07,31.42c-6.8,0-12.34-5.54-12.34-12.34c0-6.8,5.54-12.34,12.34-12.34s12.34,5.54,12.34,12.34
+ C31.41,25.88,25.88,31.42,19.07,31.42L19.07,31.42z"/>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="9.5786" y1="12.4321" x2="28.5695" y2="25.7297">
+ <stop offset="0.1099" style="stop-color:#FFFFFF"/>
+ <stop offset="0.6978" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <circle fill="url(#SVGID_2_)" cx="19.07" cy="19.08" r="11.59"/>
+ <g>
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="11.3086" y1="13.7178" x2="26.6293" y2="24.4454">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <path fill="url(#SVGID_3_)" d="M18.97,28.44c-5.16,0-9.36-4.19-9.36-9.35c0-5.16,4.2-9.36,9.36-9.36s9.35,4.2,9.35,9.36
+ C28.32,24.24,24.13,28.44,18.97,28.44L18.97,28.44z"/>
+ <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="25.4648" y1="24.5322" x2="12.4713" y2="13.6293">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <circle fill="url(#SVGID_4_)" cx="18.97" cy="19.08" r="8.48"/>
+ <path fill="#09B300" d="M18.97,26.44c-4.06,0-7.36-3.3-7.36-7.36c0-4.06,3.3-7.36,7.36-7.36c4.06,0,7.36,3.3,7.36,7.36
+ C26.33,23.14,23.03,26.44,18.97,26.44L18.97,26.44z"/>
+ <g>
+ <path fill="#57EB51" d="M16.68,16.79c2.07-2.07,5.23-2.37,7.62-0.92c-0.25-0.42-0.56-0.83-0.92-1.19
+ c-2.43-2.43-6.39-2.43-8.82,0c-2.43,2.43-2.43,6.39,0,8.82c0.37,0.37,0.77,0.67,1.19,0.93C14.3,22.02,14.61,18.85,16.68,16.79z"
+ />
+
+ <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-119.9087" y1="69.292" x2="-124.6997" y2="60.9937" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)">
+ <stop offset="0" style="stop-color:#09AA00"/>
+ <stop offset="1" style="stop-color:#4DCC46"/>
+ </linearGradient>
+ <path fill="url(#SVGID_5_)" d="M23.38,23.49c2.07-2.07,2.37-5.23,0.92-7.63c-2.39-1.45-5.56-1.14-7.62,0.92
+ c-2.07,2.07-2.37,5.23-0.93,7.63C18.15,25.86,21.31,25.55,23.38,23.49z"/>
+ </g>
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/areacodes.txt b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/areacodes.txt
new file mode 100644
index 0000000000..dc7e7d81b6
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/areacodes.txt
@@ -0,0 +1,62 @@
++30
++31
++32
++33
++34
++350
++351
++352
++353
++354
++355
++356
++357
++358
++359
++36
++3
++370
++371
++372
++373
++374
++375
++376
++377
++377 44
++378
++379
++38
++380
++381
++382
++383
++384
++385
++386
++386 49
++387
++388
++388 3
++389
++39
++40
++41
++42
++420
++421
++422
++423
++424
++425
++426
++427
++428
++429
++43
++44
++45
++46
++47
++48
++49 \ No newline at end of file
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/firstnamesF.txt b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/firstnamesF.txt
new file mode 100644
index 0000000000..4bf14924a7
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/firstnamesF.txt
@@ -0,0 +1,100 @@
+Aida
+Aija
+Aila
+Aili
+Ailikki
+Aimi
+Aina
+Alexia
+Alice
+Amanda
+Amber
+Amy
+Angela
+Angelica
+Ann
+Beth
+Brenda
+Brooke
+Caitlin
+Camilla
+Camille
+Carmen
+Cassandra
+Catherine
+Edna
+Eeva
+Eeve
+Eevi
+Eija
+Eila
+Eimi
+Eleanor
+Eleonora
+Elizabeth
+Ellen
+Enna
+Enni
+Erica
+Erika
+Erja
+Essi
+Essie
+Heini
+Heleena
+Helen
+Helena
+Helene
+Helga
+Hilja
+Hilkka
+Hille
+Hillervo
+Hillevi
+Hilma
+Irene
+Irina
+Irja
+Irma
+Irmeli
+Iro
+Jacqueline
+Jane
+Jennifer
+Jenny
+Jessica
+Jill
+Kaire
+Kaisa
+Kaisla
+Kaisu
+Katarine
+Kate
+Kate
+Kateriina
+Katharina
+Katharine
+Katherine
+Kathleen
+Marge
+Mary
+May
+Megan
+Melinda
+Morgan
+Nellie
+Nelly
+Pauline
+Peggy
+Pepi
+Scarlett
+Sheila
+Shirley
+Sissy
+Stephanie
+Sylvia
+Taylor
+Terrie
+Terry
+Victoria
+Violet \ No newline at end of file
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/firstnamesM.txt b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/firstnamesM.txt
new file mode 100644
index 0000000000..189d8d015f
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/firstnamesM.txt
@@ -0,0 +1,100 @@
+Aabraham
+Aadam
+Aadolf
+Aake
+Aaku
+Aatu
+Ahti
+Ahvo
+Aimo
+Aki
+Akseli
+Aku
+Bartholomew
+Ben
+Benjamin
+Bill
+Billie
+Billy
+Bob
+Brendan
+Brian
+Bryan
+Calvin
+Carl
+Charles
+Chester
+Chris
+Christian
+Christopher
+Chuck
+Dale
+Dave
+David
+Dennis
+Dick
+Dominick
+Donald
+Dustin
+Dusty
+Harri
+Heikki
+Heimo
+Heino
+Helmer
+Helmeri
+Hemmi
+Hemmo
+Henri
+Jeff
+Jeffrey
+Jermu
+Jero
+Jerri
+Jerry
+Jesper
+Jesperi
+Jesse
+Jetro
+Jim
+Jimi
+Jimmy
+Joakim
+Joe
+John
+Johnny
+Jonah
+Jonathan
+Joseph
+Leevi
+Leimo
+Leimu
+Leino
+Leivo
+Lenne
+Lennu
+Mark
+Martin
+Matt
+Matthew
+Michael
+Mike
+Niko
+Nooa
+Nuutti
+Nyyrikki
+Okke
+Okko
+Olavi
+Oliver
+Olli
+Onni
+Pertti
+Perttu
+Walter
+Warren
+Wesley
+William
+Willie
+Winston
+Woodrow \ No newline at end of file
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/lastnames.txt b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/lastnames.txt
new file mode 100644
index 0000000000..35b3f9f9c2
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/lastnames.txt
@@ -0,0 +1,150 @@
+Adams
+Allen
+Anderson
+Bailey
+Baker
+Barnes
+Bell
+Bennett
+Brooks
+Brown
+Butler
+Campbell
+Carter
+Clark
+Collins
+Cook
+Cooper
+Cox
+Cruz
+Davis
+Díaz
+Edwards
+Evans
+Fisher
+Flores
+Foster
+García
+Gómez
+González
+Gray
+Green
+Gutiérrez
+Hall
+Harris
+Heikkinen
+Helenius
+Helve
+Hernández
+Hill
+Hiltunen
+Hirvonen
+Holm
+Honkanen
+Howard
+Hughes
+Huhtala
+Huttunen
+Hyppönen
+Jackson
+James
+Jenkins
+Johnson
+Jones
+Kauppinen
+Kelly
+Kemppainen
+King
+Klemetti
+Kokkonen
+Kolehmainen
+Korhonen
+Kurikka
+Kuura
+Kyrö
+Kärkkäinen
+Lee
+Lewis
+Long
+López
+Martikainen
+Martin
+Martínez
+Mattila
+Mikkola
+Mikkonen
+Miller
+Mitchell
+Moore
+Morales
+Morgan
+Morris
+Muje
+Murphy
+Mustonen
+Myers
+Myllärinen
+Mäenpää
+Mäkelä
+Mäkinen
+Nelson
+Nguyen
+Ortiz
+Parker
+Pérez
+Perry
+Peterson
+Phillips
+Powell
+Price
+Ramírez
+Reed
+Reyes
+Richardson
+Rivera
+Roberts
+Robinson
+Rodríguez
+Rogers
+Ross
+Russell
+Saarinen
+Saaristo
+Salminen
+Salo
+Salonen
+Sánchez
+Sanders
+Scott
+Seppänen
+Silvennoinen
+Silvo
+Smith
+Sokura
+Stewart
+Sullivan
+Suomalainen
+Taylor
+Thomas
+Thompson
+Torres
+Turner
+Valkeapää
+Walker
+Valo
+Valtonen
+Vanhanen
+Ward
+Watson
+Venäläinen
+Vesa
+White
+Vihavainen
+Williams
+Wilson
+Virtanen
+Wood
+Voutilainen
+Wright
+Vuorela
+Young \ No newline at end of file
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_background_360x640px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_background_360x640px.svg
new file mode 100644
index 0000000000..8daf275b19
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_background_360x640px.svg
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="360px" height="640px" viewBox="0 0 360 640" enable-background="new 0 0 360 640" xml:space="preserve">
+<g>
+ <g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="180.5498" y1="640.4805" x2="180.5498" y2="0.4805">
+ <stop offset="0" style="stop-color:#9EFF78"/>
+ <stop offset="0.3626" style="stop-color:#46F200"/>
+ <stop offset="1" style="stop-color:#3AC900"/>
+ </linearGradient>
+ <rect x="0.55" y="0.48" fill="url(#SVGID_1_)" width="360" height="640"/>
+ </g>
+</g>
+<g>
+ <path opacity="0.5" fill="#3FD900" enable-background="new " d="M81.87,177.64c-26.04,112.67-2.73,201.9,36.7,294.07
+ c29.47,68.89,20.63,130.26,7.36,168.61H0.55V0.53h174.27C157.12,65.8,96.34,115.02,81.87,177.64z"/>
+
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="458.8857" y1="1985.248" x2="-180.46" y2="1985.248" gradientTransform="matrix(0 -1 0.7343 0 -1400.0699 459.4961)">
+ <stop offset="0" style="stop-color:#9EFF78"/>
+ <stop offset="0.3626" style="stop-color:#46F200"/>
+ <stop offset="1" style="stop-color:#3AC900"/>
+ </linearGradient>
+ <path opacity="0.5" fill="url(#SVGID_2_)" enable-background="new " d="M102.88,480.39c25.66,64.29,6.13,119.47-25.71,159.56
+ H0.69V536.03c32.62-1.35,73.55,32.06,82.03-30.04c6.33-46.35-59-157.3-41.01-287.49c6.61-47.82,9.32-133.33-6.81-217.89h72.92
+ C92.79,58.16,62.46,114.8,49.63,219.24C41.9,282.07,51.58,351.9,102.88,480.39z"/>
+ <path opacity="0.5" fill="#3FD900" enable-background="new " d="M279.23,463.41c26.04-112.67,2.74-201.9-36.7-294.07
+ c-29.47-68.89-20.63-130.26-7.36-168.61h125.38v639.81H186.27C215.23,586.79,264.76,526.04,279.23,463.41z"/>
+
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="655.6582" y1="83.9292" x2="16.3125" y2="83.9291" gradientTransform="matrix(0 1 -0.7343 0 366.7535 -15.209)">
+ <stop offset="0" style="stop-color:#9EFF78"/>
+ <stop offset="0.3626" style="stop-color:#46F200"/>
+ <stop offset="1" style="stop-color:#3AC900"/>
+ </linearGradient>
+ <path fill="url(#SVGID_3_)" d="M258.22,160.67C232.57,96.37,268.5-25.81,330.4,63.01l30-61.91V158.9
+ c0-79.74-73.55-85.93-82.03-23.82c-6.33,46.35,59,157.3,41.01,287.49c-6.61,47.82-9.32,133.33,6.81,217.89h-72.92
+ c15.02-57.56,45.35-114.2,58.18-218.63C319.2,358.99,309.51,289.15,258.22,160.67z"/>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_background_horisontal_640x360px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_background_horisontal_640x360px.svg
new file mode 100644
index 0000000000..c2b070a3b1
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_background_horisontal_640x360px.svg
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="640px" height="360px" viewBox="0 0 640 360" enable-background="new 0 0 640 360" xml:space="preserve">
+<g>
+ <g>
+ <rect x="0.02" y="0.02" fill="#FFFFFF" width="640" height="360"/>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="320.0181" y1="358.0205" x2="320.018" y2="2.0205">
+ <stop offset="0" style="stop-color:#9EFF78"/>
+ <stop offset="0.3626" style="stop-color:#46F200"/>
+ <stop offset="1" style="stop-color:#3AC900"/>
+ </linearGradient>
+ <polygon fill="url(#SVGID_1_)" points="638.02,358.02 2.02,358.02 2.02,2.02 638.02,2.02 638.02,358.02 "/>
+ </g>
+ <path opacity="0.5" fill="#3FD900" d="M144.17,100.86c-45.53,62.62-4.77,112.21,64.16,163.44c51.53,38.29,36.07,72.4,12.87,93.71
+ H2.03V2.42h304.66C275.74,38.7,169.48,66.06,144.17,100.86z"/>
+
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="507.0713" y1="-1386.6294" x2="151.7412" y2="-1386.6294" gradientTransform="matrix(0 -1 -0.7343 0 -916.2726 509.4961)">
+ <stop offset="0" style="stop-color:#9EFF78"/>
+ <stop offset="0.3626" style="stop-color:#46F200"/>
+ <stop offset="1" style="stop-color:#3AC900"/>
+ </linearGradient>
+ <path opacity="0.5" fill="url(#SVGID_2_)" d="M180.9,269.08c44.86,35.73,10.73,66.4-44.95,88.68H2.28V300
+ c57.02-0.75,128.57,17.82,143.4-16.7c11.07-25.76-103.15-87.42-71.7-159.78C85.52,96.94,90.26,49.41,62.07,2.42h127.46
+ c-26.25,31.99-79.27,63.47-101.71,121.51C74.31,158.85,91.24,197.67,180.9,269.08z"/>
+ <path opacity="0.5" fill="#3FD900" d="M495.59,259.17c45.54-62.62,4.77-112.21-64.15-163.44c-51.53-38.29-36.07-72.4-12.87-93.71
+ h219.17l0,355.59H333.07C383.69,327.74,470.28,293.98,495.59,259.17z"/>
+
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="499.5596" y1="193.2451" x2="144.2295" y2="193.2451" gradientTransform="matrix(0 1 0.7343 0 398.9562 -142.209)">
+ <stop offset="0" style="stop-color:#9EFF78"/>
+ <stop offset="0.3626" style="stop-color:#46F200"/>
+ <stop offset="1" style="stop-color:#3AC900"/>
+ </linearGradient>
+ <path fill="url(#SVGID_3_)" d="M458.86,90.7C414,54.97,476.82-12.94,585.04,36.43l52.45-34.41v87.7
+ c0-44.32-128.57-47.76-143.4-13.24c-11.07,25.76,103.15,87.42,71.7,159.78c-11.55,26.57-16.29,74.11,11.91,121.09H450.24
+ c26.25-31.99,79.27-63.47,101.71-121.51C565.45,200.92,548.52,162.11,458.86,90.7z"/>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_default_icon_53x53px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_default_icon_53x53px.svg
new file mode 100644
index 0000000000..6e34f255b2
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_default_icon_53x53px.svg
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="53px" height="53px" viewBox="0 0 53 53" enable-background="new 0 0 53 53" xml:space="preserve">
+<g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.4878" y1="53.0156" x2="26.4878" y2="0.0156">
+ <stop offset="0" style="stop-color:#8BF261"/>
+ <stop offset="0.1255" style="stop-color:#7AE74D"/>
+ <stop offset="0.3699" style="stop-color:#5DD62C"/>
+ <stop offset="0.6034" style="stop-color:#49C914"/>
+ <stop offset="0.8191" style="stop-color:#3CC205"/>
+ <stop offset="1" style="stop-color:#38BF00"/>
+ </linearGradient>
+ <path fill="url(#SVGID_1_)" d="M-0.01,49.7c0,1.83,1.48,3.31,3.31,3.31h46.38c1.83,0,3.31-1.48,3.31-3.31V3.33
+ c0-1.83-1.48-3.31-3.31-3.31H3.3c-1.83,0-3.31,1.48-3.31,3.31V49.7z"/>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="26.4878" y1="50.6777" x2="26.4878" y2="2.354">
+ <stop offset="0" style="stop-color:#3ED900"/>
+ <stop offset="0.3899" style="stop-color:#3DD500"/>
+ <stop offset="0.7931" style="stop-color:#3AC800"/>
+ <stop offset="1" style="stop-color:#38BF00"/>
+ </linearGradient>
+ <path fill="url(#SVGID_2_)" d="M2.33,49.7c0,0.54,0.44,0.98,0.97,0.98h46.38l0,0c0.54,0,0.97-0.44,0.97-0.98V3.33
+ c0-0.54-0.44-0.97-0.97-0.97H3.3c-0.54,0-0.97,0.44-0.97,0.97V49.7z"/>
+ <path fill="#43EB00" d="M45.55,50.68c0.11-8.96,0.14-13.45-0.4-14.33c-2.67-4.31-10.75-3.36-13.04-2.99c0-1.08-0.01-2.04-0.01-2.76
+ c0.47-0.49,0.9-1.04,1.29-1.64l0.06,0.18c3.33,0.47,3.74-10.39,3.74-10.39C37.41,3.29,27.75,6.83,26.22,7.49
+ c-2.84-0.72-9.58-1.21-9.39,10.43c0,0-0.49,10.29,3.28,10.59c0.46,0.79,0.99,1.49,1.58,2.09c-0.01,0.67-0.04,1.53-0.07,2.52
+ c-4.95-0.34-13.71-0.08-14.29,5.95c-0.05,0.58,0.11,3.43,0.26,11.62H45.55z"/>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_default_icon_highlight_53x53px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_default_icon_highlight_53x53px.svg
new file mode 100644
index 0000000000..29c284de08
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_default_icon_highlight_53x53px.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="53px" height="53px" viewBox="0 0 53 53" enable-background="new 0 0 53 53" xml:space="preserve">
+<g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.5083" y1="53.0332" x2="26.5083" y2="0.0342">
+ <stop offset="0" style="stop-color:#8BF261"/>
+ <stop offset="0.1471" style="stop-color:#A7F587"/>
+ <stop offset="0.3385" style="stop-color:#C6F9B2"/>
+ <stop offset="0.5243" style="stop-color:#DFFBD3"/>
+ <stop offset="0.7006" style="stop-color:#F1FDEB"/>
+ <stop offset="0.8635" style="stop-color:#FBFFFA"/>
+ <stop offset="1" style="stop-color:#FFFFFF"/>
+ </linearGradient>
+ <path fill="url(#SVGID_1_)" d="M0.01,49.72c0,1.83,1.48,3.31,3.31,3.31H49.7c1.83,0,3.31-1.48,3.31-3.31V3.35
+ c0-1.83-1.48-3.31-3.31-3.31H3.32c-1.83,0-3.31,1.48-3.31,3.31V49.72z"/>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="26.5083" y1="50.6963" x2="26.5083" y2="2.3726">
+ <stop offset="0" style="stop-color:#3ED900"/>
+ <stop offset="0.3899" style="stop-color:#3DD500"/>
+ <stop offset="0.7931" style="stop-color:#3AC800"/>
+ <stop offset="1" style="stop-color:#38BF00"/>
+ </linearGradient>
+ <path fill="url(#SVGID_2_)" d="M2.35,49.72c0,0.54,0.44,0.98,0.97,0.98H49.7l0,0c0.54,0,0.97-0.44,0.97-0.98V3.35
+ c0-0.54-0.44-0.97-0.97-0.97H3.32c-0.54,0-0.97,0.44-0.97,0.97V49.72z"/>
+ <path fill="#43EB00" d="M45.57,50.7c0.11-8.96,0.14-13.45-0.4-14.33c-2.67-4.31-10.75-3.36-13.04-2.99c0-1.09-0.01-2.04-0.01-2.76
+ c0.47-0.49,0.9-1.04,1.29-1.64l0.06,0.17c3.33,0.47,3.74-10.39,3.74-10.39C37.43,3.3,27.77,6.85,26.24,7.51
+ c-2.84-0.72-9.58-1.21-9.39,10.43c0,0-0.49,10.29,3.28,10.59c0.46,0.79,0.99,1.49,1.58,2.09c-0.01,0.67-0.04,1.53-0.07,2.52
+ c-4.95-0.34-13.71-0.08-14.29,5.95C7.29,39.66,7.45,42.51,7.6,50.7L45.57,50.7z"/>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_list_divider_360x76px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_list_divider_360x76px.svg
new file mode 100644
index 0000000000..db9fc7af33
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_list_divider_360x76px.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="360px" height="76px" viewBox="0 0 360 76" enable-background="new 0 0 360 76" xml:space="preserve">
+<rect x="0.01" y="0.35" opacity="0.2" fill="#FFFFFF" width="360" height="76"/>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_list_highlighter_357x80px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_list_highlighter_357x80px.svg
new file mode 100644
index 0000000000..0ee3ea23e6
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_list_highlighter_357x80px.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="357px" height="80px" viewBox="0 0 357 80" enable-background="new 0 0 357 80" xml:space="preserve">
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="8.300781e-03" y1="40.0156" x2="357.0078" y2="40.0156">
+ <stop offset="0" style="stop-color:#46F200"/>
+ <stop offset="1" style="stop-color:#94FF69"/>
+</linearGradient>
+<rect x="0.01" y="0.02" fill="url(#SVGID_1_)" width="357" height="80"/>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_status_idle_27x47.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_status_idle_27x47.svg
new file mode 100644
index 0000000000..925d3eb36e
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_status_idle_27x47.svg
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="27px" height="47px" viewBox="0 0 27 47" enable-background="new 0 0 27 47" xml:space="preserve">
+<g>
+ <path opacity="0.2" fill="#FFFFFF" d="M0.04,0.04c15.51,0,27,10.52,27,23.5c0,12.98-11.49,23.5-27,23.5V0.04z"/>
+ <g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-18.8911" y1="23.5415" x2="18.8759" y2="23.5415">
+ <stop offset="0" style="stop-color:#3ED900"/>
+ <stop offset="1" style="stop-color:#38BF00"/>
+ </linearGradient>
+ <path fill="url(#SVGID_1_)" d="M18.88,23.54C18.88,13,10.45,4.45,0.04,4.43v6.7c6.74,0.03,12.22,5.58,12.22,12.41
+ S6.78,35.93,0.04,35.96v6.7C10.45,42.63,18.88,34.08,18.88,23.54z"/>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="6.1475" y1="35.9551" x2="6.1475" y2="11.1284">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.8407" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#D9D9D9"/>
+ </linearGradient>
+ <path fill="url(#SVGID_2_)" d="M11.51,23.54c0,6.43-5.13,11.64-11.48,11.66v0.75c6.74-0.02,12.22-5.58,12.22-12.41
+ S6.78,11.15,0.04,11.13v0.75C6.38,11.91,11.51,17.12,11.51,23.54z"/>
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-8.9409" y1="16.0107" x2="10.0672" y2="29.3204">
+ <stop offset="0.1099" style="stop-color:#FFFFFF"/>
+ <stop offset="0.6978" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <path fill="url(#SVGID_3_)" d="M11.51,23.54c0-6.43-5.13-11.64-11.48-11.66v2.25c5.06,0.08,9.15,4.27,9.15,9.41
+ c0,5.14-4.09,9.32-9.15,9.4v2.25C6.38,35.18,11.51,29.97,11.51,23.54z"/>
+ <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-7.3013" y1="17.4404" x2="8.0348" y2="28.1788">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <path fill="url(#SVGID_4_)" d="M8.32,23.54c0,4.66-3.7,8.44-8.28,8.53v0.88c5.06-0.08,9.15-4.26,9.15-9.4
+ c0-5.14-4.09-9.32-9.15-9.41v0.88C4.62,15.1,8.32,18.88,8.32,23.54z"/>
+ <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="7.0356" y1="28.2002" x2="-5.98" y2="17.2788">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <path fill="url(#SVGID_5_)" d="M8.32,23.54c0-4.66-3.7-8.44-8.28-8.52v1.13C4,16.23,7.2,19.51,7.2,23.54
+ c0,4.03-3.2,7.31-7.16,7.39v1.13C4.62,31.99,8.32,28.2,8.32,23.54z"/>
+ <linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="0.0371" y1="23.542" x2="7.2012" y2="23.542">
+ <stop offset="0" style="stop-color:#FF901F"/>
+ <stop offset="1" style="stop-color:#FFB81F"/>
+ </linearGradient>
+ <path fill="url(#SVGID_6_)" d="M4.27,19.1c0.36,0.37,0.67,0.77,0.92,1.2c1.44,2.41,1.13,5.6-0.92,7.67
+ c-1.17,1.18-2.7,1.77-4.23,1.81v1.15C4,30.86,7.2,27.57,7.2,23.54c0-4.03-3.2-7.32-7.16-7.4v1.13C1.57,17.31,3.1,17.92,4.27,19.1z
+ "/>
+ <path fill="#FFD06B" d="M5.19,20.3c-0.25-0.43-0.56-0.83-0.92-1.2c-1.17-1.18-2.7-1.79-4.23-1.83v2.46
+ C1.74,19.17,3.62,19.35,5.19,20.3z"/>
+
+ <linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-137.9243" y1="73.1523" x2="-142.7352" y2="64.8197" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)">
+ <stop offset="0" style="stop-color:#FF901F"/>
+ <stop offset="1" style="stop-color:#FFB81F"/>
+ </linearGradient>
+ <path fill="url(#SVGID_7_)" d="M5.19,20.3c-1.56-0.96-3.45-1.14-5.15-0.57v10.05c1.54-0.04,3.06-0.62,4.23-1.81
+ C6.32,25.9,6.62,22.71,5.19,20.3z"/>
+ </g>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_status_offline_27x47.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_status_offline_27x47.svg
new file mode 100644
index 0000000000..6f74723f09
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_status_offline_27x47.svg
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="27px" height="47px" viewBox="0 0 27 47" enable-background="new 0 0 27 47" xml:space="preserve">
+<g>
+ <path opacity="0.2" fill="#FFFFFF" d="M0.04,0.04c15.51,0,27,10.52,27,23.5c0,12.98-11.49,23.5-27,23.5V0.04z"/>
+ <g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-18.8911" y1="23.542" x2="18.8759" y2="23.542">
+ <stop offset="0" style="stop-color:#3ED900"/>
+ <stop offset="1" style="stop-color:#38BF00"/>
+ </linearGradient>
+ <path fill="url(#SVGID_1_)" d="M18.88,23.54C18.88,13,10.45,4.45,0.04,4.43v6.7c6.74,0.03,12.22,5.58,12.22,12.41
+ c0,6.83-5.48,12.39-12.22,12.41v6.7C10.45,42.63,18.88,34.08,18.88,23.54z"/>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="6.1475" y1="35.9551" x2="6.1475" y2="11.1289">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.8407" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#D9D9D9"/>
+ </linearGradient>
+ <path fill="url(#SVGID_2_)" d="M11.51,23.54c0,6.43-5.13,11.64-11.48,11.66v0.75c6.74-0.03,12.22-5.58,12.22-12.41
+ c0-6.83-5.48-12.39-12.22-12.41v0.75C6.38,11.91,11.51,17.12,11.51,23.54z"/>
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-8.9409" y1="16.0107" x2="10.0672" y2="29.3204">
+ <stop offset="0.1099" style="stop-color:#FFFFFF"/>
+ <stop offset="0.6978" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <path fill="url(#SVGID_3_)" d="M11.51,23.54c0-6.43-5.13-11.64-11.48-11.66v2.25c5.06,0.08,9.15,4.27,9.15,9.41
+ c0,5.14-4.09,9.32-9.15,9.4v2.25C6.38,35.18,11.51,29.97,11.51,23.54z"/>
+ <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-7.3013" y1="17.4409" x2="8.0348" y2="28.1793">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <path fill="url(#SVGID_4_)" d="M8.32,23.54c0,4.66-3.7,8.44-8.28,8.53v0.88c5.06-0.08,9.15-4.27,9.15-9.4
+ c0-5.14-4.09-9.32-9.15-9.41v0.88C4.62,15.1,8.32,18.88,8.32,23.54z"/>
+ <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="7.0361" y1="28.2012" x2="-5.9795" y2="17.2798">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <path fill="url(#SVGID_5_)" d="M8.32,23.54c0-4.66-3.7-8.44-8.28-8.52v1.13C4,16.23,7.2,19.51,7.2,23.54
+ c0,4.03-3.2,7.31-7.16,7.39v1.13C4.62,31.99,8.32,28.2,8.32,23.54z"/>
+ <path fill="#BD0700" d="M4.27,19.1c0.36,0.37,0.67,0.77,0.92,1.2c1.44,2.41,1.13,5.6-0.92,7.67c-1.17,1.19-2.7,1.77-4.23,1.81
+ v1.15C4,30.86,7.2,27.57,7.2,23.54c0-4.03-3.2-7.32-7.16-7.4v1.13C1.57,17.31,3.1,17.92,4.27,19.1z"/>
+ <path fill="#F25757" d="M5.19,20.3c-0.25-0.43-0.56-0.83-0.92-1.2c-1.17-1.18-2.7-1.79-4.23-1.83v2.46
+ C1.74,19.17,3.62,19.35,5.19,20.3z"/>
+
+ <linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-137.9243" y1="73.1533" x2="-142.7357" y2="64.8198" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)">
+ <stop offset="0" style="stop-color:#BD0700"/>
+ <stop offset="1" style="stop-color:#E35D58"/>
+ </linearGradient>
+ <path fill="url(#SVGID_6_)" d="M5.19,20.3c-1.56-0.96-3.45-1.14-5.15-0.57v10.05c1.54-0.04,3.06-0.62,4.23-1.81
+ C6.32,25.9,6.62,22.72,5.19,20.3z"/>
+ </g>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_status_online_27x47.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_status_online_27x47.svg
new file mode 100644
index 0000000000..56951605de
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_status_online_27x47.svg
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="27px" height="47px" viewBox="0 0 27 47" enable-background="new 0 0 27 47" xml:space="preserve">
+<g>
+ <path opacity="0.2" fill="#FFFFFF" d="M0.04,0.03c15.51,0,27,10.52,27,23.5c0,12.98-11.49,23.5-27,23.5V0.03z"/>
+ <g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-18.8911" y1="23.5264" x2="18.8759" y2="23.5264">
+ <stop offset="0" style="stop-color:#3ED900"/>
+ <stop offset="1" style="stop-color:#38BF00"/>
+ </linearGradient>
+ <path fill="url(#SVGID_1_)" d="M18.88,23.53c0-10.54-8.43-19.09-18.84-19.11v6.7c6.74,0.02,12.22,5.58,12.22,12.41
+ c0,6.83-5.48,12.39-12.22,12.41v6.7C10.45,42.62,18.88,34.07,18.88,23.53z"/>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="6.1475" y1="35.9414" x2="6.1475" y2="11.1152">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.8407" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#D9D9D9"/>
+ </linearGradient>
+ <path fill="url(#SVGID_2_)" d="M11.51,23.53c0,6.43-5.13,11.64-11.48,11.66v0.75c6.74-0.03,12.22-5.58,12.22-12.41
+ c0-6.83-5.48-12.39-12.22-12.41v0.75C6.38,11.89,11.51,17.1,11.51,23.53z"/>
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-8.9414" y1="15.9961" x2="10.0667" y2="29.3057">
+ <stop offset="0.1099" style="stop-color:#FFFFFF"/>
+ <stop offset="0.6978" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <path fill="url(#SVGID_3_)" d="M11.51,23.53c0-6.43-5.13-11.64-11.48-11.66v2.25c5.06,0.08,9.15,4.27,9.15,9.41
+ c0,5.14-4.09,9.32-9.15,9.4v2.25C6.38,35.16,11.51,29.95,11.51,23.53z"/>
+ <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-7.3013" y1="17.4268" x2="8.0348" y2="28.1652">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <path fill="url(#SVGID_4_)" d="M8.32,23.53c0,4.66-3.7,8.44-8.28,8.53v0.88c5.06-0.08,9.15-4.27,9.15-9.4
+ c0-5.14-4.09-9.33-9.15-9.41V15C4.62,15.08,8.32,18.87,8.32,23.53z"/>
+ <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="7.0356" y1="28.1865" x2="-5.98" y2="17.2651">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <path fill="url(#SVGID_5_)" d="M8.32,23.53c0-4.66-3.7-8.44-8.28-8.52v1.13C4,16.21,7.2,19.5,7.2,23.53c0,4.03-3.2,7.31-7.16,7.39
+ v1.13C4.62,31.97,8.32,28.19,8.32,23.53z"/>
+ <linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="0.0371" y1="23.5283" x2="7.2012" y2="23.5283">
+ <stop offset="0" style="stop-color:#09AA00"/>
+ <stop offset="1" style="stop-color:#4DCC46"/>
+ </linearGradient>
+ <path fill="url(#SVGID_6_)" d="M4.27,19.09c0.36,0.37,0.67,0.77,0.92,1.2c1.44,2.41,1.13,5.6-0.92,7.67
+ c-1.17,1.19-2.7,1.77-4.23,1.81v1.15C4,30.84,7.2,27.56,7.2,23.53c0-4.03-3.2-7.32-7.16-7.4v1.13C1.57,17.3,3.1,17.91,4.27,19.09z
+ "/>
+ <path fill="#57EB51" d="M5.19,20.29c-0.25-0.43-0.56-0.83-0.92-1.2c-1.17-1.19-2.7-1.79-4.23-1.83v2.46
+ C1.74,19.15,3.62,19.33,5.19,20.29z"/>
+
+ <linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-137.9243" y1="73.1387" x2="-142.7352" y2="64.806" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)">
+ <stop offset="0" style="stop-color:#09AA00"/>
+ <stop offset="1" style="stop-color:#4DCC46"/>
+ </linearGradient>
+ <path fill="url(#SVGID_7_)" d="M5.19,20.29c-1.56-0.96-3.45-1.14-5.15-0.57v10.05c1.54-0.04,3.06-0.62,4.23-1.81
+ C6.32,25.88,6.62,22.7,5.19,20.29z"/>
+ </g>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_scroll_5x80px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_scroll_5x80px.svg
new file mode 100644
index 0000000000..4f6482afa5
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_scroll_5x80px.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="5px" height="80px" viewBox="0 0 5 80" enable-background="new 0 0 5 80" xml:space="preserve">
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="2.4917" y1="0.0908" x2="2.4917" y2="80.0913">
+ <stop offset="0" style="stop-color:#46F200"/>
+ <stop offset="0.3516" style="stop-color:#94FF69"/>
+ <stop offset="0.9176" style="stop-color:#3FD900"/>
+</linearGradient>
+<rect x="-0.01" y="0.09" fill="url(#SVGID_1_)" width="5" height="80"/>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_scrollbar_5x14px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_scrollbar_5x14px.svg
new file mode 100644
index 0000000000..54a40c3cc8
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_scrollbar_5x14px.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="5px" height="14px" viewBox="0 0 5 14" enable-background="new 0 0 5 14" xml:space="preserve">
+<rect fill="#41E600" width="5" height="14"/>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_status_field_left_14x24px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_status_field_left_14x24px.svg
new file mode 100644
index 0000000000..a21c91df48
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_status_field_left_14x24px.svg
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="14px" height="24px" viewBox="0 0 14 24" enable-background="new 0 0 14 24" xml:space="preserve">
+<g>
+ <path fill="none" d="M4.96,21.94c-0.28-0.33-0.53-0.67-0.77-1.03C4.43,21.27,4.68,21.62,4.96,21.94z"/>
+ <path fill="none" d="M2.15,15.41c-0.05-0.46-0.09-0.92-0.09-1.39C2.06,14.49,2.09,14.96,2.15,15.41z"/>
+ <path fill="none" d="M4.12,20.81c-0.23-0.35-0.45-0.71-0.64-1.09C3.03,18.89,2.69,18,2.45,17.06C2.79,18.42,3.36,19.69,4.12,20.81z
+ "/>
+ <path fill="none" d="M2.41,16.91c-0.09-0.38-0.16-0.77-0.22-1.17C2.25,16.13,2.32,16.52,2.41,16.91z"/>
+ <path fill="#38BF00" d="M4.17,20.81c-0.74-1.13-1.3-2.39-1.64-3.75c-0.01-0.05-0.02-0.1-0.04-0.16c-0.09-0.38-0.16-0.77-0.22-1.17
+ c-0.01-0.11-0.03-0.21-0.04-0.32c-0.05-0.46-0.08-0.92-0.08-1.39c0-6.63,5.57-12,11.86-12l0,0v-2H11.4c-6.29,0-11.39,5.37-11.39,12
+ c0,4.13,1.98,7.76,4.99,9.92c-0.27-0.33-0.52-0.67-0.76-1.03C4.21,20.88,4.19,20.85,4.17,20.81z"/>
+ <path fill="#8BF261" d="M10.21,22.02c-2.5,0-4.8-0.86-6.68-2.29c0.19,0.38,0.41,0.73,0.63,1.09c0.02,0.03,0.04,0.07,0.07,0.1
+ c0.24,0.36,0.49,0.7,0.76,1.03c1.82,1.31,4.03,2.08,6.4,2.08h2.61v-2H10.21z"/>
+ <path fill="#80E6FF" d="M4.12,20.81c0.02,0.04,0.04,0.07,0.07,0.1C4.16,20.88,4.14,20.85,4.12,20.81z"/>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="8.0742" y1="22.0195" x2="8.0742" y2="2.0205">
+ <stop offset="0" style="stop-color:#3ED900"/>
+ <stop offset="0.3899" style="stop-color:#3DD500"/>
+ <stop offset="0.7931" style="stop-color:#3AC800"/>
+ <stop offset="1" style="stop-color:#38BF00"/>
+ </linearGradient>
+ <path fill="url(#SVGID_1_)" d="M14.01,2.02c-6.29,0-11.86,5.37-11.86,12c0,0.47,0.03,0.94,0.08,1.39c0.01,0.11,0.03,0.22,0.04,0.32
+ c0.06,0.4,0.12,0.79,0.22,1.17c0.01,0.05,0.02,0.1,0.04,0.16C2.76,18,3.1,18.89,3.53,19.73c1.88,1.44,4.18,2.29,6.68,2.29h3.8V2.02
+ L14.01,2.02z"/>
+ <path fill="#2BD5FF" d="M2.45,17.06c-0.01-0.05-0.02-0.1-0.04-0.16C2.42,16.96,2.43,17.01,2.45,17.06z"/>
+ <path fill="#2BD5FF" d="M2.19,15.74c-0.01-0.11-0.03-0.21-0.04-0.32C2.16,15.52,2.17,15.63,2.19,15.74z"/>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_status_field_middle_10x24px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_status_field_middle_10x24px.svg
new file mode 100644
index 0000000000..b84200d9b1
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_status_field_middle_10x24px.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="10px" height="24px" viewBox="0 0 10 24" enable-background="new 0 0 10 24" xml:space="preserve">
+<g>
+
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="62.5" y1="-100.9995" x2="62.5" y2="-79" gradientTransform="matrix(1 0 0 -1 -57.5 -78)">
+ <stop offset="0" style="stop-color:#3ED900"/>
+ <stop offset="0.3899" style="stop-color:#3DD500"/>
+ <stop offset="0.7931" style="stop-color:#3AC800"/>
+ <stop offset="1" style="stop-color:#38BF00"/>
+ </linearGradient>
+ <rect y="1" fill="url(#SVGID_1_)" width="10" height="22"/>
+ <rect fill="#38BF00" width="10" height="2"/>
+ <rect y="22" fill="#8BF261" width="10" height="2"/>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_status_field_right_14x24px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_status_field_right_14x24px.svg
new file mode 100644
index 0000000000..231560dd9e
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_status_field_right_14x24px.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="14px" height="24px" viewBox="0 0 14 24" enable-background="new 0 0 14 24" xml:space="preserve">
+<g>
+ <path fill="#38BF00" d="M4.59,2.02c2.42,0,4.66,0.77,6.52,2.08C8.98,1.6,5.88,0.02,2.42,0.02H0.01v2H4.59z"/>
+ <path fill="#8BF261" d="M11.6,4.73c0.76,1.6,1.2,3.39,1.2,5.29c0,6.63-5.19,12-11.59,12H0.01v2h2.41c6.4,0,11.59-5.37,11.59-12
+ C14.01,9.27,13.1,6.75,11.6,4.73z"/>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="6.4028" y1="22.0205" x2="6.4028" y2="2.021">
+ <stop offset="0" style="stop-color:#3ED900"/>
+ <stop offset="0.3899" style="stop-color:#3DD500"/>
+ <stop offset="0.7931" style="stop-color:#3AC800"/>
+ <stop offset="1" style="stop-color:#38BF00"/>
+ </linearGradient>
+ <path fill="url(#SVGID_1_)" d="M0.01,2.02v20h1.21c6.4,0,11.59-5.37,11.59-12c0-1.9-0.44-3.69-1.2-5.29
+ c-0.16-0.22-0.32-0.43-0.5-0.64c-1.86-1.31-4.1-2.08-6.52-2.08H0.01z"/>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_topbar_356x96px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_topbar_356x96px.svg
new file mode 100644
index 0000000000..679d9a5305
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_topbar_356x96px.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="356px" height="96px" viewBox="0 0 356 96" enable-background="new 0 0 356 96" xml:space="preserve">
+<g>
+ <g>
+
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-184.8071" y1="-51.2339" x2="-112.3086" y2="147.9543" gradientTransform="matrix(-1 0 0 1 29.2188 0)">
+ <stop offset="0" style="stop-color:#46F200"/>
+ <stop offset="0.3516" style="stop-color:#94FF69"/>
+ <stop offset="0.9176" style="stop-color:#3FD900"/>
+ </linearGradient>
+ <polygon fill="url(#SVGID_1_)" points="355.87,95.84 355.87,0.39 -0.14,0.39 -0.14,96.39 "/>
+
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-148.647" y1="96.3936" x2="-148.647" y2="58.96" gradientTransform="matrix(-1 0 0 1 29.2188 0)">
+ <stop offset="0" style="stop-color:#46F200"/>
+ <stop offset="0.9176" style="stop-color:#3FD900"/>
+ </linearGradient>
+ <polygon fill="url(#SVGID_2_)" points="355.87,96.18 355.87,58.96 -0.14,58.96 -0.14,96.39 "/>
+ <polygon fill="#38BF00" points="355.87,96.37 355.87,92.21 -0.14,92.21 -0.14,96.39 "/>
+ </g>
+ <polygon opacity="0.2" fill="#FFFFFF" points="266.5,92.09 167.84,92.09 272.84,0.77 326.5,0.77 "/>
+ <polygon opacity="0.2" fill="#FFFFFF" points="314.5,92.09 285.84,92.09 330.84,0.77 339.5,0.77 "/>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_topbar_horisontal_636x96px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_topbar_horisontal_636x96px.svg
new file mode 100644
index 0000000000..1ef4fb9224
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_topbar_horisontal_636x96px.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="636px" height="96px" viewBox="0 0 636 96" enable-background="new 0 0 636 96" xml:space="preserve">
+<g>
+ <g>
+
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-61.3369" y1="-96.5996" x2="43.9144" y2="192.5761" gradientTransform="matrix(-1 0 0 1 309.2188 0)">
+ <stop offset="0" style="stop-color:#46F200"/>
+ <stop offset="0.3516" style="stop-color:#94FF69"/>
+ <stop offset="0.9176" style="stop-color:#3FD900"/>
+ </linearGradient>
+ <polygon fill="url(#SVGID_1_)" points="636.02,95.46 636.02,0.02 0.02,0.02 0.02,96.02 "/>
+
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-8.8003" y1="96.0205" x2="-8.8003" y2="58.5869" gradientTransform="matrix(-1 0 0 1 309.2188 0)">
+ <stop offset="0" style="stop-color:#46F200"/>
+ <stop offset="0.9176" style="stop-color:#3FD900"/>
+ </linearGradient>
+ <polygon fill="url(#SVGID_2_)" points="636.02,95.8 636.02,58.59 0.02,58.59 0.02,96.02 "/>
+ <polygon fill="#38BF00" points="636.02,95.99 636.02,91.84 0.02,91.84 0.02,96.02 "/>
+ </g>
+ <polygon opacity="0.2" fill="#FFFFFF" points="546.65,91.72 447.99,91.72 552.99,0.4 606.65,0.4 "/>
+ <polygon opacity="0.2" fill="#FFFFFF" points="594.65,91.72 565.99,91.72 610.99,0.4 619.65,0.4 "/>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_default_icon_84x68px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_default_icon_84x68px.svg
new file mode 100644
index 0000000000..4df0214e56
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_default_icon_84x68px.svg
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="84px" height="68px" viewBox="0 0 84 68" enable-background="new 0 0 84 68" xml:space="preserve">
+<g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="42.1343" y1="68.0352" x2="42.1343" y2="0.0361">
+ <stop offset="0" style="stop-color:#8BF261"/>
+ <stop offset="0.1255" style="stop-color:#7AE74D"/>
+ <stop offset="0.3699" style="stop-color:#5DD62C"/>
+ <stop offset="0.6034" style="stop-color:#49C914"/>
+ <stop offset="0.8191" style="stop-color:#3CC205"/>
+ <stop offset="1" style="stop-color:#38BF00"/>
+ </linearGradient>
+ <path fill="url(#SVGID_1_)" d="M80.01,0.04h-59.5c-2.35,0-4.25,1.9-4.25,4.25v25.78c-9,0.13-16.26,7.46-16.26,16.49
+ c0,9.03,7.26,16.36,16.26,16.49v0.75c0,2.35,1.9,4.25,4.25,4.25h59.5c2.35,0,4.25-1.9,4.25-4.25V4.29
+ C84.26,1.94,82.36,0.04,80.01,0.04z"/>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="42.1333" y1="65.0371" x2="42.1333" y2="3.0366">
+ <stop offset="0" style="stop-color:#3ED900"/>
+ <stop offset="0.3899" style="stop-color:#3DD500"/>
+ <stop offset="0.7931" style="stop-color:#3AC800"/>
+ <stop offset="1" style="stop-color:#38BF00"/>
+ </linearGradient>
+ <path fill="url(#SVGID_2_)" d="M80.01,65.04h-59.5c-0.69,0-1.25-0.56-1.25-1.25v-0.75v-2.96l-2.96-0.04
+ c-7.33-0.11-13.3-6.16-13.3-13.49s5.97-13.38,13.3-13.49l2.96-0.04v-2.96V4.29c0-0.69,0.56-1.25,1.25-1.25h59.5
+ c0.69,0,1.25,0.56,1.25,1.25v59.5C81.26,64.47,80.7,65.04,80.01,65.04L80.01,65.04z"/>
+ <path fill="#43EB00" d="M74.71,65.04c0.14-11.5,0.19-17.26-0.51-18.38c-3.42-5.53-13.79-4.31-16.74-3.84
+ c0-1.39-0.01-2.61-0.02-3.54c0.6-0.62,1.15-1.33,1.65-2.11l0.08,0.22c4.27,0.61,4.8-13.33,4.8-13.33
+ C64.28,4.23,51.88,8.78,49.91,9.62C46.27,8.7,37.62,8.07,37.87,23c0,0-0.63,13.21,4.21,13.58c0.59,1.01,1.28,1.91,2.02,2.69
+ c-0.01,0.86-0.05,1.96-0.09,3.23c-6.35-0.43-17.59-0.1-18.33,7.63c-0.07,0.74,0.14,4.4,0.33,14.91L74.71,65.04z"/>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_status_idle_24x24px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_status_idle_24x24px.svg
new file mode 100644
index 0000000000..2d6da38ad0
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_status_idle_24x24px.svg
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
+<g>
+ <g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="12.0337" y1="23.9922" x2="12.0337" y2="-7.812500e-03">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.8407" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#D9D9D9"/>
+ </linearGradient>
+ <path fill="url(#SVGID_1_)" d="M12.03,23.99c-6.62,0-12-5.38-12-12c0-6.62,5.39-12,12-12s12,5.38,12,12
+ C24.03,18.61,18.65,23.99,12.03,23.99L12.03,23.99z"/>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="2.7993" y1="5.5259" x2="21.267" y2="18.4571">
+ <stop offset="0.1099" style="stop-color:#FFFFFF"/>
+ <stop offset="0.6978" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <circle fill="url(#SVGID_2_)" cx="12.03" cy="11.99" r="11.27"/>
+ <g>
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="4.4814" y1="6.7754" x2="19.3806" y2="17.2079">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <path fill="url(#SVGID_3_)" d="M11.93,21.09c-5.02,0-9.1-4.08-9.1-9.09c0-5.02,4.08-9.1,9.1-9.1s9.1,4.08,9.1,9.1
+ C21.03,17.01,16.95,21.09,11.93,21.09L11.93,21.09z"/>
+ <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="18.249" y1="17.293" x2="5.613" y2="6.6901">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <circle fill="url(#SVGID_4_)" cx="11.93" cy="11.99" r="8.25"/>
+ <path fill="#FF901F" d="M11.93,19.15c-3.95,0-7.16-3.21-7.16-7.15c0-3.95,3.21-7.16,7.16-7.16c3.94,0,7.16,3.21,7.16,7.16
+ C19.09,15.94,15.88,19.15,11.93,19.15L11.93,19.15z"/>
+ <g>
+ <path fill="#FFD06B" d="M9.7,9.76c2.01-2.01,5.09-2.3,7.42-0.9c-0.25-0.41-0.54-0.8-0.9-1.16c-2.36-2.37-6.21-2.37-8.58,0
+ c-2.36,2.37-2.36,6.21,0,8.58c0.36,0.36,0.75,0.65,1.16,0.9C7.39,14.85,7.69,11.77,9.7,9.76z"/>
+
+ <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-127.042" y1="62.0576" x2="-131.7007" y2="53.9885" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)">
+ <stop offset="0" style="stop-color:#FF901F"/>
+ <stop offset="1" style="stop-color:#FFB81F"/>
+ </linearGradient>
+ <path fill="url(#SVGID_5_)" d="M16.22,16.28c2.01-2.01,2.3-5.09,0.9-7.42c-2.33-1.41-5.41-1.11-7.42,0.9
+ c-2.01,2.01-2.31,5.09-0.9,7.42C11.13,18.58,14.21,18.29,16.22,16.28z"/>
+ </g>
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_status_offline_24x24px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_status_offline_24x24px.svg
new file mode 100644
index 0000000000..d5920268b1
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_status_offline_24x24px.svg
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
+<g>
+ <g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="12.0005" y1="24.0449" x2="12.0005" y2="0.0454">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.8407" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#D9D9D9"/>
+ </linearGradient>
+ <path fill="url(#SVGID_1_)" d="M12,24.04c-6.62,0-12-5.38-12-12c0-6.62,5.39-12,12-12s12,5.38,12,12
+ C24,18.66,18.62,24.04,12,24.04L12,24.04z"/>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="2.7661" y1="5.5786" x2="21.2346" y2="18.5104">
+ <stop offset="0.1099" style="stop-color:#FFFFFF"/>
+ <stop offset="0.6978" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <circle fill="url(#SVGID_2_)" cx="12" cy="12.04" r="11.27"/>
+ <g>
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="4.4487" y1="6.8286" x2="19.3479" y2="17.2611">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <path fill="url(#SVGID_3_)" d="M11.9,21.14c-5.02,0-9.1-4.08-9.1-9.09c0-5.02,4.08-9.1,9.1-9.1c5.02,0,9.1,4.08,9.1,9.1
+ C20.99,17.06,16.92,21.14,11.9,21.14L11.9,21.14z"/>
+ <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="18.2168" y1="17.3467" x2="5.5801" y2="6.7432">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <circle fill="url(#SVGID_4_)" cx="11.9" cy="12.04" r="8.25"/>
+ <path fill="#BD0700" d="M11.9,19.2c-3.95,0-7.16-3.21-7.16-7.15c0-3.95,3.21-7.16,7.16-7.16c3.95,0,7.16,3.21,7.16,7.16
+ C19.05,15.99,15.84,19.2,11.9,19.2L11.9,19.2z"/>
+ <g>
+ <path fill="#F25757" d="M9.67,9.81c2.01-2.01,5.09-2.3,7.42-0.9c-0.25-0.41-0.54-0.8-0.9-1.16c-2.36-2.37-6.21-2.37-8.58,0
+ c-2.36,2.37-2.36,6.21,0,8.58c0.36,0.36,0.75,0.65,1.16,0.9C7.36,14.9,7.66,11.82,9.67,9.81z"/>
+
+ <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-127.0752" y1="62.1104" x2="-131.7339" y2="54.0413" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)">
+ <stop offset="0" style="stop-color:#BD0700"/>
+ <stop offset="1" style="stop-color:#E35D58"/>
+ </linearGradient>
+ <path fill="url(#SVGID_5_)" d="M16.19,16.33c2.01-2.01,2.3-5.08,0.9-7.41c-2.33-1.41-5.41-1.11-7.42,0.9
+ c-2.01,2.01-2.31,5.09-0.9,7.42C11.1,18.63,14.18,18.34,16.19,16.33z"/>
+ </g>
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_status_online_24x24px.svg b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_status_online_24x24px.svg
new file mode 100644
index 0000000000..46ad07dbbd
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_status_online_24x24px.svg
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
+<g>
+ <g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="12.0337" y1="23.9502" x2="12.0337" y2="-0.0498">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.8407" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#D9D9D9"/>
+ </linearGradient>
+ <path fill="url(#SVGID_1_)" d="M12.03,23.95c-6.62,0-12-5.38-12-12c0-6.62,5.38-12,12-12c6.62,0,12,5.38,12,12
+ C24.03,18.57,18.65,23.95,12.03,23.95L12.03,23.95z"/>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="2.7988" y1="5.4839" x2="21.2673" y2="18.4157">
+ <stop offset="0.1099" style="stop-color:#FFFFFF"/>
+ <stop offset="0.6978" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <circle fill="url(#SVGID_2_)" cx="12.03" cy="11.95" r="11.27"/>
+ <g>
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="4.4819" y1="6.7339" x2="19.3803" y2="17.1658">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <path fill="url(#SVGID_3_)" d="M11.93,21.05c-5.01,0-9.1-4.08-9.1-9.09c0-5.02,4.08-9.1,9.1-9.1c5.02,0,9.1,4.08,9.1,9.1
+ C21.03,16.97,16.95,21.05,11.93,21.05L11.93,21.05z"/>
+ <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="18.248" y1="17.251" x2="5.6128" y2="6.6487">
+ <stop offset="0" style="stop-color:#A6A6A6"/>
+ <stop offset="0.4341" style="stop-color:#8C8C8C"/>
+ <stop offset="0.7308" style="stop-color:#999999"/>
+ <stop offset="1" style="stop-color:#E6E6E6"/>
+ </linearGradient>
+ <circle fill="url(#SVGID_4_)" cx="11.93" cy="11.95" r="8.25"/>
+ <path fill="#09B300" d="M11.93,19.11c-3.95,0-7.16-3.21-7.16-7.15c0-3.95,3.21-7.16,7.16-7.16c3.94,0,7.16,3.21,7.16,7.16
+ C19.09,15.9,15.88,19.11,11.93,19.11L11.93,19.11z"/>
+ <g>
+ <path fill="#57EB51" d="M9.7,9.72c2.01-2.01,5.09-2.3,7.42-0.9c-0.25-0.41-0.54-0.8-0.9-1.16c-2.36-2.37-6.21-2.37-8.57,0
+ c-2.36,2.37-2.36,6.21,0,8.58c0.36,0.36,0.75,0.65,1.16,0.9C7.39,14.8,7.69,11.73,9.7,9.72z"/>
+
+ <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-127.042" y1="62.0156" x2="-131.7007" y2="53.9465" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)">
+ <stop offset="0" style="stop-color:#09AA00"/>
+ <stop offset="1" style="stop-color:#4DCC46"/>
+ </linearGradient>
+ <path fill="url(#SVGID_5_)" d="M16.22,16.24c2.01-2.01,2.3-5.09,0.9-7.42c-2.33-1.41-5.41-1.11-7.42,0.9
+ c-2.01,2.01-2.31,5.09-0.9,7.42C11.13,18.54,14.21,18.25,16.22,16.24z"/>
+ </g>
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemcontainer.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemcontainer.cpp
new file mode 100644
index 0000000000..00481a638d
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemcontainer.cpp
@@ -0,0 +1,382 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QDebug>
+#include <QGraphicsLayout>
+
+#include "abstractitemcontainer.h"
+#include "abstractitemview.h"
+#include "abstractviewitem.h"
+#include "scrollbar.h"
+
+AbstractItemContainer::AbstractItemContainer(int bufferSize, QGraphicsWidget *parent)
+ : GvbWidget(parent),
+ m_items(),
+ m_itemView(0),
+ m_prototype(0),
+ m_bufferSize(bufferSize),
+ m_twoColumns(false)
+{
+}
+
+AbstractItemContainer::~AbstractItemContainer()
+{
+ delete m_prototype;
+ m_prototype = 0;
+}
+
+AbstractViewItem *AbstractItemContainer::prototype()
+{
+ return m_prototype;
+}
+
+int AbstractItemContainer::bufferSize() const
+{
+ return m_bufferSize;
+}
+
+bool AbstractItemContainer::event(QEvent *e)
+{
+ if (e->type() == QEvent::LayoutRequest)
+ updateItemBuffer();
+
+ return QGraphicsWidget::event(e);
+}
+
+
+bool AbstractItemContainer::eventFilter(QObject *obj, QEvent *event)
+{
+ if (event->type()==QEvent::GraphicsSceneResize && m_itemView) {
+ const bool caching = m_itemView->listItemCaching();
+ m_itemView->setListItemCaching(false);
+
+ QSizeF s = m_itemView->size();
+ s.setWidth(s.width()-m_itemView->verticalScrollBar()->size().width());
+ adjustVisibleContainerSize(s);
+
+ m_itemView->updateViewContent();
+ updateItemBuffer();
+
+ m_itemView->setListItemCaching(caching);
+ }
+
+ return QGraphicsWidget::eventFilter(obj, event);
+}
+
+QVariant AbstractItemContainer::itemChange(GraphicsItemChange change, const QVariant &value)
+{
+ QVariant ichange = QGraphicsWidget::itemChange(change,value);
+
+ if (change == ItemPositionChange) {
+ if (m_itemView && layout() && !layout()->isActivated())
+ m_itemView->refreshContainerGeometry();
+ }
+ return ichange;
+ }
+
+/*virtual*/
+void AbstractItemContainer::setItemView(AbstractItemView *view)
+{
+ m_itemView = view;
+
+ if (m_itemView) {
+ setParentItem(m_itemView);
+ m_itemView->installEventFilter(this);
+ }
+}
+/*virtual*/
+void AbstractItemContainer::setItemPrototype(AbstractViewItem *ptype)
+{
+ m_prototype = ptype;
+ m_prototype->setParentItem(0);
+ m_prototype->hide();
+}
+
+/*virtual*/
+void AbstractItemContainer::reset()
+{
+ qDeleteAll(m_items);
+ m_items.clear();
+ updateItemBuffer();
+}
+
+
+/*virtual*/
+void AbstractItemContainer::addItem(const QModelIndex &index)
+{
+ if (m_items.count() < maxItemCountInItemBuffer() ||
+ (m_items.count() > 0 &&
+ m_items.first()->modelIndex().row()-1 <= index.row() &&
+ m_items.last()->modelIndex().row() >= index.row())) {
+ int itemPos = 0;
+ if (m_items.count() != 0)
+ itemPos = qMax(0, index.row() - m_items.first()->modelIndex().row());
+
+ if (itemPos >= m_items.count() || m_items.at(itemPos)->modelIndex() != index) {
+ AbstractViewItem *item = 0;
+ if (m_prototype)
+ item = m_prototype->newItemInstance();
+
+ if (item) {
+ item->setModel(m_itemView->model());
+ item->setTwoColumns(m_twoColumns);
+ m_items.insert(itemPos, item);
+ addItemToVisibleLayout(itemPos, item);
+
+ if (item->modelIndex() != index) {
+ item->setModelIndex(index);
+ }
+ }
+ }
+ updateItemBuffer();
+ }
+}
+void AbstractItemContainer::removeItem(const QModelIndex &index)
+{
+ AbstractViewItem *item = findItemByIndex(index);
+
+ if (item) {
+ if (maxItemCountInItemBuffer() < m_items.count()) {
+ m_items.removeOne(item);
+ removeItemFromVisibleLayout(item);
+
+ delete item;
+ }
+ else {
+ m_items.removeOne(item);
+ removeItemFromVisibleLayout(item);
+
+ QModelIndex newIndex = m_itemView->nextIndex(m_items.last()->modelIndex());
+ if (newIndex.isValid()) {
+ // Item readded as last item in buffer.
+ m_items.append(item);
+ addItemToVisibleLayout(m_items.count() - 1, item);
+ item->setModelIndex(newIndex);
+ } else {
+ // Item readded as first item in buffer.
+ newIndex = m_itemView->previousIndex(m_items.first()->modelIndex());
+
+ m_items.prepend(item);
+ addItemToVisibleLayout(0, item);
+ item->setModelIndex(newIndex);
+ }
+ }
+ }
+}
+
+/*virtual*/
+int AbstractItemContainer::itemCount() const
+{
+ return m_items.count();
+}
+
+AbstractViewItem *AbstractItemContainer::firstItem()
+{
+ return m_items.first();
+}
+
+/*virtual*/
+AbstractViewItem* AbstractItemContainer::itemAt(const int row) const
+{
+ if (row<0 || row >= m_items.count())
+ return 0;
+ return m_items.at(row);
+}
+
+AbstractViewItem* AbstractItemContainer::findItemByIndex(const QModelIndex &index) const
+{
+ AbstractViewItem *item = 0;
+ for (int i = 0; i < m_items.count(); ++i) {
+ if (m_items.at(i)->modelIndex() == index) {
+ item = m_items.at(i);
+ break;
+ }
+ }
+ return item;
+}
+
+bool AbstractItemContainer::itemVisibleInView(AbstractViewItem* item, const QRectF &viewRect, bool fullyVisible) const
+{
+ if (!item || !m_itemView)
+ return false;
+
+ QRectF itemRectBoundingRect = item->mapToItem(m_itemView, item->boundingRect()).boundingRect();
+
+ if (fullyVisible && viewRect.contains(itemRectBoundingRect))
+ return true;
+ else if (viewRect.intersects(itemRectBoundingRect))
+ return true;
+
+ return false;
+}
+
+void AbstractItemContainer::updateItemBuffer()
+{
+ if (!m_itemView || (m_itemView && !m_itemView->boundingRect().isValid()))
+ return;
+
+ int maxCount = maxItemCountInItemBuffer();
+
+ if (m_items.count() < maxCount) {
+ // New items needs to be added.
+ QModelIndex index;
+ if (m_items.count() > 0)
+ index = m_items.last()->modelIndex();
+ while (m_items.count() < maxCount) {
+ index = m_itemView->nextIndex(index);
+
+ if (!index.isValid())
+ break;
+
+ insertItem(m_items.count(), index);
+ }
+
+ index = m_items.first()->modelIndex();
+ while (m_items.count() < maxCount) {
+ index = m_itemView->previousIndex(index);
+
+ if (!index.isValid())
+ break;
+
+ insertItem(0, index);
+ }
+ }
+
+ QRectF viewRect = boundingRect();
+
+ while (m_items.count() > maxCount) {
+ int firstVisible = 0;
+ int lastVisible = 0;
+ findFirstAndLastVisibleBufferIndex(firstVisible, lastVisible, viewRect, false);
+
+ AbstractViewItem* item = 0;
+ if (lastVisible != m_items.count() - 1) {
+ item = m_items.takeLast();
+ }
+ else if (firstVisible != 0 && m_items.first()->modelIndex().row() != firstVisible-1) {
+ item = m_items.takeFirst();
+ }
+ else {
+ // All the items are visible. Take the item at the end of the buffer.
+ item = m_items.takeLast();
+ }
+
+ m_items.removeOne(item);
+ removeItemFromVisibleLayout(item);
+ delete item;
+ }
+}
+
+void AbstractItemContainer::insertItem(int pos, const QModelIndex &index)
+{
+ AbstractViewItem *item = 0;
+ if (m_prototype)
+ item = m_prototype->newItemInstance();
+
+ if (item) {
+ item->setModel(m_itemView->model());
+ item->setModelIndex(index);
+ item->setTwoColumns(m_twoColumns);
+ m_items.insert(pos, item);
+ addItemToVisibleLayout(pos, item);
+ item->updateItemContents();
+ if (pos == 0)
+ m_itemView->scrollContentsBy(qreal(0.0),
+ item->effectiveSizeHint(Qt::PreferredSize).height());
+ }
+}
+
+void AbstractItemContainer::findFirstAndLastVisibleBufferIndex(int &firstVisibleBufferIndex,
+ int &lastVisibleBufferIndex,
+ const QRectF &viewRect,
+ bool fullyVisible) const
+{
+ if (layout() && !layout()->isActivated())
+ layout()->activate();
+
+ firstVisibleBufferIndex = -1;
+ lastVisibleBufferIndex = -1;
+
+ int count = m_items.count();
+ for (int i = 0; i < count; ++i) {
+ if (itemVisibleInView(m_items.at(i), viewRect, fullyVisible)) {
+ if (firstVisibleBufferIndex == -1)
+ firstVisibleBufferIndex = i;
+ lastVisibleBufferIndex = i;
+ }
+ else if ( lastVisibleBufferIndex != -1 )
+ break; // lastVisibleBufferIndex is already set
+ }
+}
+
+/*virtual*/
+int AbstractItemContainer::maxItemCountInItemBuffer() const
+{
+ if (m_itemView && !m_itemView->boundingRect().isEmpty())
+ {
+ return m_itemView->indexCount();
+ }
+ return 0;
+}
+
+
+void AbstractItemContainer::themeChange()
+{
+ for (int i = 0; i <m_items.count(); ++i)
+ m_items.at(i)->themeChange();
+}
+
+void AbstractItemContainer::updateContent()
+{
+ for (int i = 0; i <m_items.count(); ++i)
+ m_items.at(i)->updateItemContents();
+}
+
+void AbstractItemContainer::setSubtreeCacheEnabled(bool enabled)
+{
+ for (int i = 0; i <m_items.count(); ++i)
+ m_items.at(i)->setSubtreeCacheEnabled(enabled);
+ if (m_prototype)
+ m_prototype->setSubtreeCacheEnabled(enabled);
+}
+
+void AbstractItemContainer::setTwoColumns(const bool enabled)
+{
+ if (m_twoColumns == enabled)
+ return;
+
+ m_twoColumns = enabled;
+
+ for (int i = 0; i < m_items.count(); ++i)
+ m_items.at(i)->setTwoColumns(enabled);
+}
+
+bool AbstractItemContainer::twoColumns()
+{
+ return m_twoColumns;
+}
+
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemcontainer.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemcontainer.h
new file mode 100644
index 0000000000..7373f66deb
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemcontainer.h
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ABSTRACTITEMCONTAINER_H
+#define ABSTRACTITEMCONTAINER_H
+
+#include <QModelIndex>
+
+#include "gvbwidget.h"
+
+class QGraphicsWidget;
+class AbstractItemView;
+class AbstractViewItem;
+
+class AbstractItemContainer : public GvbWidget
+{
+ Q_OBJECT
+public:
+ AbstractItemContainer(int bufferSize, QGraphicsWidget *parent=0);
+ virtual ~AbstractItemContainer();
+
+ virtual void addItem(const QModelIndex &index);
+ virtual void removeItem(const QModelIndex &index);
+
+ virtual void setItemView(AbstractItemView *view);
+ virtual void setItemPrototype(AbstractViewItem *ptype);
+ virtual void reset();
+ virtual int itemCount() const;
+ virtual AbstractViewItem* itemAt(const int row) const;
+ AbstractViewItem* findItemByIndex(const QModelIndex &index) const;
+ AbstractViewItem *prototype();
+ AbstractViewItem *firstItem();
+ void updateContent();
+ void themeChange();
+ int bufferSize() const;
+ virtual void setTwoColumns(const bool enabled);
+ bool twoColumns();
+
+ void setSubtreeCacheEnabled(const bool enabled);
+ virtual void setListItemCaching(const bool enabled, const int index) = 0;
+
+protected:
+ virtual void adjustVisibleContainerSize(const QSizeF &size) = 0;
+ virtual void addItemToVisibleLayout(int index, AbstractViewItem *item) = 0;
+ virtual void removeItemFromVisibleLayout(AbstractViewItem *item) = 0;
+
+ virtual bool event(QEvent *e);
+ virtual bool eventFilter(QObject *obj, QEvent *event);
+ virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value);
+ virtual int maxItemCountInItemBuffer() const;
+ bool itemVisibleInView(AbstractViewItem* item, const QRectF &viewRect, bool fullyVisible = true) const;
+
+protected:
+ void updateItemBuffer();
+ void findFirstAndLastVisibleBufferIndex(int &firstVisibleBufferIndex,
+ int &lastVisibleBufferIndex,
+ const QRectF &viewRect,
+ bool fullyVisible) const;
+ QList<AbstractViewItem*> m_items;
+ AbstractItemView *m_itemView;
+ AbstractViewItem *m_prototype;
+ int m_bufferSize;
+
+private:
+ void insertItem(int pos, const QModelIndex &index);
+ bool m_twoColumns;
+
+ Q_DISABLE_COPY(AbstractItemContainer)
+};
+
+#endif // ABSTRACTITEMCONTAINER_H
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemview.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemview.cpp
new file mode 100644
index 0000000000..961cf4e03c
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemview.cpp
@@ -0,0 +1,425 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QGraphicsLayout>
+
+#include "abstractitemview.h"
+#include "abstractviewitem.h"
+#include "scrollbar.h"
+
+AbstractItemView::AbstractItemView(QGraphicsWidget *parent)
+ : AbstractScrollArea(parent),
+ m_model(0),
+ m_rootIndex(),
+ m_container(0),
+ m_selectionModel(0),
+ m_currentIndex(),
+ m_scroller()
+{
+ setRootIndex(QModelIndex());
+}
+
+/*virtual*/
+AbstractItemView::~AbstractItemView()
+{
+}
+
+/*virtual*/
+void AbstractItemView::setModel(QAbstractItemModel *model, AbstractViewItem *prototype)
+{
+ if (m_model == model || !model)
+ return;
+
+ if (m_model) {
+ disconnect(m_model, SIGNAL(destroyed()),
+ this, SLOT(_q_modelDestroyed()));
+ disconnect(m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
+ this, SLOT(dataChanged(QModelIndex,QModelIndex)));
+ disconnect(m_model, SIGNAL(rowsInserted(QModelIndex,int,int)),
+ this, SLOT(rowsInserted(QModelIndex,int,int)));
+ disconnect(m_model, SIGNAL(rowsRemoved(QModelIndex,int,int)),
+ this, SLOT(rowsRemoved(QModelIndex,int,int)));
+ disconnect(m_model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
+ this, SLOT(rowsAboutToBeRemoved(QModelIndex,int,int)));
+ disconnect(m_model, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)),
+ this, SLOT(rowsAboutToBeInserted(QModelIndex,int,int)));
+ disconnect(m_model, SIGNAL(columnsInserted(QModelIndex,int,int)),
+ this, SLOT(columnsInserted(QModelIndex,int,int)));
+ disconnect(m_model, SIGNAL(columnsAboutToBeInserted(QModelIndex,int,int)),
+ this, SLOT(columnsAboutToBeInserted(QModelIndex,int,int)));
+ disconnect(m_model, SIGNAL(columnsRemoved(QModelIndex,int,int)),
+ this, SLOT(columnsRemoved(QModelIndex,int,int)));
+ disconnect(m_model, SIGNAL(columnsAboutToBeRemoved(QModelIndex,int,int)),
+ this, SLOT(columnsAboutToBeRemoved(QModelIndex,int,int)));
+ disconnect(m_model, SIGNAL(modelReset()), this, SLOT(reset()));
+ disconnect(m_model, SIGNAL(layoutChanged()), this, SLOT(_q_layoutChanged()));
+
+ m_model = 0;
+ }
+
+ setSelectionModel(0);
+
+ m_currentIndex = QModelIndex();
+ m_rootIndex = QModelIndex();
+
+ m_model = model;
+
+ Q_ASSERT_X(m_model->index(0,0) == m_model->index(0,0),
+ "AbstractItemView::setModel",
+ "A model should return the exact same index "
+ "(including its internal id/pointer) when asked for it twice in a row.");
+ Q_ASSERT_X(m_model->index(0,0).parent() == QModelIndex(),
+ "AbstractItemView::setModel",
+ "The parent of a top level index should be invalid");
+
+
+ connect(m_model, SIGNAL(destroyed()), this, SLOT(modelDestroyed()));
+ connect(m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
+ this, SLOT(dataChanged(QModelIndex,QModelIndex)));
+ connect(m_model, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)),
+ this, SLOT(rowsAboutToBeInserted(QModelIndex,int,int)));
+ connect(m_model, SIGNAL(rowsInserted(QModelIndex,int,int)),
+ this, SLOT(rowsInserted(QModelIndex,int,int)));
+ connect(m_model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
+ this, SLOT(rowsAboutToBeRemoved(QModelIndex,int,int)));
+ connect(m_model, SIGNAL(rowsRemoved(QModelIndex,int,int)),
+ this, SLOT(rowsRemoved(QModelIndex,int,int)));
+ connect(m_model, SIGNAL(modelReset()), this, SLOT(reset()));
+ connect(m_model, SIGNAL(layoutChanged()), this, SLOT(layoutChanged()));
+
+ setSelectionModel(new QItemSelectionModel(m_model));
+
+ if (prototype && m_container) {
+ m_container->setItemPrototype(prototype);
+ m_container->reset();
+ }
+}
+
+/*virtual*/
+void AbstractItemView::setContainer(AbstractItemContainer *container)
+{
+ m_container = container;
+ m_container->setItemView(this);
+ m_container->setParentItem(viewport());
+
+ viewport()->setFlag(
+ QGraphicsItem::ItemClipsChildrenToShape, true);
+ m_scroller.setScrollable(this);
+ installEventFilter(&m_scroller);
+}
+
+/*virtual*/
+void AbstractItemView::setRootIndex(const QModelIndex &index)
+{
+ m_rootIndex = index;
+ // TODO fix this if we change index, container should be updated? Or do we need root index?
+}
+
+/*virtual*/
+int AbstractItemView::indexCount() const
+{
+ if (m_model)
+ return m_model->rowCount(m_rootIndex);
+ return 0;
+}
+
+/*virtual*/
+QAbstractItemModel* AbstractItemView::model() const
+{
+ return m_model;
+}
+
+/*virtual*/
+QModelIndex AbstractItemView::nextIndex(const QModelIndex &index) const
+{
+ if (!m_model)
+ return QModelIndex();
+
+ if (index.isValid())
+ return m_model->index(index.row() + 1, 0, m_rootIndex);
+ else
+ return m_model->index(0, 0, m_rootIndex);
+}
+
+/*virtual*/
+QModelIndex AbstractItemView::previousIndex(const QModelIndex &index) const
+{
+ if (!m_model)
+ return QModelIndex();
+
+ if (index.isValid())
+ return m_model->index(index.row() - 1, 0, m_rootIndex);
+ else
+ return m_model->index(m_model->rowCount(m_rootIndex) - 1, 0, m_rootIndex);
+}
+
+/*virtual*/
+void AbstractItemView::setItemPrototype(AbstractViewItem* prototype)
+{
+ if (prototype && m_container) {
+ m_container->setItemPrototype(prototype);
+ m_container->reset();
+ }
+}
+
+void AbstractItemView::setSelectionModel(QItemSelectionModel *smodel)
+{
+ if (smodel && smodel->model() != m_model) {
+ return;
+ }
+ if (m_selectionModel) {
+ disconnect(m_selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
+ this, SLOT(currentSelectionChanged(QItemSelection,QItemSelection)));
+
+ disconnect(m_selectionModel, SIGNAL(currentChanged(QModelIndex,QModelIndex)),
+ this, SLOT(currentIndexChanged(QModelIndex,QModelIndex)));
+
+ delete m_selectionModel;
+ m_selectionModel = 0;
+ }
+
+ m_selectionModel = smodel;
+
+ if (m_selectionModel) {
+ connect(m_selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
+ this, SLOT(currentSelectionChanged(QItemSelection,QItemSelection)));
+ connect(m_selectionModel, SIGNAL(currentChanged(QModelIndex,QModelIndex)),
+ this, SLOT(currentIndexChanged(QModelIndex,QModelIndex)));
+ }
+}
+
+/*virtual*/
+void AbstractItemView::currentIndexChanged(const QModelIndex &current, const QModelIndex &previous)
+{
+ Q_UNUSED(previous)
+
+ if (current != m_currentIndex)
+ m_currentIndex = current;
+}
+
+/*virtual*/
+void AbstractItemView::currentSelectionChanged(const QItemSelection &selected,
+ const QItemSelection &deselected)
+{
+ Q_UNUSED(selected)
+ Q_UNUSED(deselected)
+}
+
+/*virtual*/
+void AbstractItemView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
+{
+ Q_UNUSED(topLeft)
+ Q_UNUSED(bottomRight)
+ // TODO implement if we like to edit view items.
+}
+
+/*virtual*/
+void AbstractItemView::rowsAboutToBeInserted(const QModelIndex &index, int start, int end)
+{
+ Q_UNUSED(index)
+ Q_UNUSED(start)
+ Q_UNUSED(end)
+
+ // TODO implement
+}
+
+/*virtual*/
+void AbstractItemView::rowsAboutToBeRemoved(const QModelIndex &index,int start, int end)
+{
+ Q_UNUSED(index)
+ Q_UNUSED(start)
+ Q_UNUSED(end)
+}
+
+/*virtual*/
+void AbstractItemView::rowsRemoved(const QModelIndex &parent,int start, int end)
+{
+ Q_UNUSED(parent)
+ Q_UNUSED(start)
+ Q_UNUSED(end)
+
+ if (start <= m_currentIndex.row() && m_currentIndex.row() <= end) {
+ QModelIndex newCurrentIndex = m_model->index(start, 0, m_rootIndex);
+ if (!newCurrentIndex.isValid()) {
+ newCurrentIndex = m_model->index(qMax(0,start - 1), 0, m_rootIndex);
+ }
+
+ if (m_selectionModel) {
+ m_selectionModel->setCurrentIndex(newCurrentIndex, QItemSelectionModel::NoUpdate);
+ }
+ }
+ for (int i = end; i >= start; --i) //The items are already removed from the model.
+ m_container->removeItem(QModelIndex()); // Indexes are already invalid.
+}
+
+/*virtual*/
+void AbstractItemView::reset()
+{
+ m_rootIndex = QModelIndex();
+
+ if (m_container)
+ m_container->reset();
+
+ setCurrentIndex(QModelIndex());
+
+ ScrollBar *sb = verticalScrollBar();
+
+ if (sb)
+ sb->setSliderSize(0);
+}
+
+/*virtual*/
+void AbstractItemView::rowsInserted(const QModelIndex &parent, int start, int end)
+{
+ if (!m_container)
+ return;
+
+ for (int i = start; i <= end; ++i)
+ m_container->addItem(m_model->index(i, 0, parent));
+
+ refreshContainerGeometry();
+}
+
+/*virtual*/
+void AbstractItemView::modelDestroyed()
+{
+ m_model = 0;
+ setSelectionModel(0);
+ reset();
+}
+
+/*virtual*/
+void AbstractItemView::layoutChanged()
+{
+ m_container->reset();
+}
+
+bool AbstractItemView::event(QEvent *e)
+{
+ bool result = AbstractScrollArea::event(e);
+ if (e && e->type()==QEvent::LayoutRequest) {
+ refreshContainerGeometry();
+ result = true;
+ }
+ if (e && e->type()==QEvent::GraphicsSceneResize) {
+ m_scroller.stopScrolling();
+ refreshContainerGeometry();
+
+ m_container->resize(this->size().width()-verticalScrollBar()->size().width(),
+ m_container->preferredHeight());
+
+ if (verticalScrollBar()->sliderPosition() > verticalScrollBar()->sliderSize())
+ verticalScrollBar()->setSliderPosition(verticalScrollBar()->sliderSize());
+
+ result = true;
+ }
+ return result;
+}
+
+void AbstractItemView::setCurrentIndex(const QModelIndex &index, QItemSelectionModel::SelectionFlags selectionFlag)
+{
+ if (m_selectionModel)
+ m_selectionModel->setCurrentIndex(index, selectionFlag);
+}
+
+void AbstractItemView::refreshContainerGeometry()
+{
+ if (!m_container || !m_model)
+ return;
+
+ if (m_container->layout() && !m_container->layout()->isActivated())
+ m_container->layout()->activate();
+
+ ScrollBar *sb = verticalScrollBar();
+
+ if (sb) {
+ AbstractViewItem *item = m_container->itemAt(0);
+ if (item) {
+ qreal oneItemH = item->size().height();
+ sb->setSliderSize(oneItemH*m_model->rowCount(m_rootIndex)-size().height());
+ }
+ if (!sb->isVisible() && verticalScrollBarPolicy() != Qt::ScrollBarAlwaysOff &&
+ contentsRect().height() < m_container->boundingRect().height())
+ sb->show();
+ }
+}
+
+void AbstractItemView::scrollContentsBy(qreal dx, qreal dy)
+{
+ AbstractScrollArea::scrollContentsBy(dx, dy);
+
+ if (!viewport() || !m_container || (m_container && m_container->itemCount() <= 0) ||
+ !m_model || (m_model && m_model->rowCount() <= 0) ||
+ (viewport() && viewport()->boundingRect().height() < contentsRect().height()))
+ return;
+
+ qreal itemH = 1;
+
+ AbstractViewItem *item = m_container->itemAt(0);
+ if (item && item->size().height() > 1) {
+ itemH = item->size().height();
+ } else if (item && item->preferredHeight() > 1) {
+ itemH = item->preferredHeight();
+ }
+
+ qreal vpx = m_container->pos().x();
+ qreal vpy = m_container->pos().y();
+
+ if ((vpy+m_container->size().height()-dy > pos().y()+size().height()) &&
+ (qAbs(dy) < itemH) && (vpy-dy <= 0)) {
+ m_container->setPos(vpx, vpy-dy);
+ } else {
+ qreal vPos = verticalScrollBar()->sliderPosition();
+ int startRow = m_model->index(vPos/itemH, 0).row();
+ int itemsInContainer = m_container->itemCount();
+
+ for (int i = 0; i<itemsInContainer; ++i) {
+ AbstractViewItem *changedItem = m_container->itemAt(i);
+ changedItem->setModelIndex(m_model->index(startRow+i,0));
+ m_container->setListItemCaching(listItemCaching(), i);
+ }
+
+ qreal diff = vPos-startRow*itemH;
+
+ if (diff < 0)
+ m_container->setPos(vpx, diff);
+ else
+ m_container->setPos(vpx, -diff);
+ }
+}
+
+void AbstractItemView::changeTheme()
+{
+ if (m_container)
+ m_container->themeChange();
+}
+
+void AbstractItemView::updateViewContent()
+{
+ if (m_container)
+ m_container->updateContent();
+}
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemview.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemview.h
new file mode 100644
index 0000000000..8cd295ba89
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemview.h
@@ -0,0 +1,103 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ABSTRACTITEMVIEW_H
+#define ABSTRACTITEMVIEW_H
+
+#include <QAbstractItemModel>
+#include <QGraphicsSceneResizeEvent>
+#include <QPersistentModelIndex>
+#include <QItemSelection>
+
+#include "listitemcontainer.h"
+#include "abstractscrollarea.h"
+#include "scroller.h"
+
+class QItemSelectionModel;
+
+class AbstractItemView : public AbstractScrollArea
+{
+ Q_OBJECT
+public:
+ AbstractItemView(QGraphicsWidget *parent = 0);
+ virtual ~AbstractItemView();
+ virtual void setContainer(AbstractItemContainer *container);
+ virtual void setModel(QAbstractItemModel *model, AbstractViewItem *prototype);
+ virtual QAbstractItemModel* model() const;
+ virtual void setItemPrototype(AbstractViewItem* prototype);
+
+ void setSelectionModel(QItemSelectionModel *smodel);
+
+ virtual QModelIndex nextIndex(const QModelIndex &index) const;
+ virtual QModelIndex previousIndex(const QModelIndex &index) const;
+
+ virtual int indexCount() const;
+
+ void refreshContainerGeometry(); // TODO Can this be moved to scroll area?
+
+ void updateViewContent();
+ virtual void scrollContentsBy(qreal dx, qreal dy);
+
+ virtual bool listItemCaching() const = 0;
+ virtual void setListItemCaching(bool enabled) = 0;
+
+protected:
+ virtual bool event(QEvent *e);
+ void changeTheme();
+
+public slots:
+ virtual void setRootIndex(const QModelIndex &index);
+ void setCurrentIndex(const QModelIndex &index,
+ QItemSelectionModel::SelectionFlags selectionFlag = QItemSelectionModel::NoUpdate);
+protected slots:
+ virtual void currentIndexChanged(const QModelIndex &current, const QModelIndex &previous);
+ virtual void currentSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
+ virtual void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);
+ virtual void rowsAboutToBeInserted(const QModelIndex &index, int start, int end);
+ virtual void rowsInserted(const QModelIndex &parent, int start, int end);
+ virtual void rowsAboutToBeRemoved(const QModelIndex &index,int start, int end);
+ virtual void rowsRemoved(const QModelIndex &parent,int start, int end);
+ virtual void modelDestroyed();
+ virtual void layoutChanged();
+ virtual void reset();
+
+protected:
+
+ QAbstractItemModel *m_model;
+ QPersistentModelIndex m_rootIndex;
+ AbstractItemContainer *m_container;
+ QItemSelectionModel *m_selectionModel;
+ QPersistentModelIndex m_currentIndex;
+
+private:
+ Q_DISABLE_COPY(AbstractItemView)
+ Scroller m_scroller;
+};
+
+
+#endif // ABSTRACTITEMVIEW_H
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractscrollarea.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractscrollarea.cpp
new file mode 100644
index 0000000000..39847b8edb
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractscrollarea.cpp
@@ -0,0 +1,236 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QGraphicsSceneResizeEvent>
+#include <QGraphicsWidget>
+#include <QDebug>
+#include "abstractscrollarea.h"
+#include "scrollbar.h"
+
+AbstractScrollArea::AbstractScrollArea(QGraphicsWidget *parent)
+ : GvbWidget(parent)
+ , m_viewport(0)
+ , m_horizontalScrollBar(0)
+ , m_verticalScrollBar(0)
+ , m_prevHorizontalValue(0.0)
+ , m_prevVerticalValue(0.0)
+{
+ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ setContentsMargins(0, 0, 0, 0);
+
+ m_horizontalScrollBar = new ScrollBar(Qt::Horizontal, this);
+ m_horizontalScrollBar->hide();
+ m_horizontalScrollBar->setContentsMargins(0, 0, 0, 0);
+ m_horizontalScrollBarPolicy = Qt::ScrollBarAsNeeded;
+ m_horizontalScrollBar->setZValue(zValue()+1); // Raise scroll bar to top
+ m_horizontalScrollBar->setVisible(false);
+
+ connect(m_horizontalScrollBar, SIGNAL(sliderPositionChange(qreal)),
+ this, SLOT(horizontalScroll(qreal)));
+ connect(m_horizontalScrollBar, SIGNAL(sliderPressed()),
+ this, SLOT(horizontalScrollStart()));
+
+ m_verticalScrollBar = new ScrollBar(Qt::Vertical, this);
+ m_verticalScrollBar->hide();
+ m_verticalScrollBar->setContentsMargins(0, 0, 0, 0);
+ m_verticalScrollBarPolicy = Qt::ScrollBarAsNeeded;
+ m_verticalScrollBar->setZValue(zValue()+1); // Raise scroll bar to top
+ m_verticalScrollBar->setVisible(false);
+
+ connect(m_verticalScrollBar, SIGNAL(sliderPositionChange(qreal)),
+ this, SLOT(verticalScroll(qreal)));
+ connect(m_verticalScrollBar, SIGNAL(sliderPressed()),
+ this, SLOT(verticalScrollStart()));
+
+ QGraphicsWidget *viewport = new QGraphicsWidget;
+ setViewport(viewport);
+}
+
+AbstractScrollArea::~AbstractScrollArea()
+{
+}
+
+ScrollBar *AbstractScrollArea::verticalScrollBar() const
+{
+ return m_verticalScrollBar;
+}
+
+ScrollBar *AbstractScrollArea::horizontalScrollBar() const
+{
+ return m_horizontalScrollBar;
+}
+
+void AbstractScrollArea::setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy policy)
+{
+ m_horizontalScrollBarPolicy = policy;
+}
+
+void AbstractScrollArea::setVerticalScrollBarPolicy(Qt::ScrollBarPolicy policy)
+{
+ m_verticalScrollBarPolicy = policy;
+}
+
+Qt::ScrollBarPolicy AbstractScrollArea::verticalScrollBarPolicy() const
+{
+ return m_verticalScrollBarPolicy;
+}
+
+Qt::ScrollBarPolicy AbstractScrollArea::horizontalScrollBarPolicy() const
+{
+ return m_horizontalScrollBarPolicy;
+}
+
+QGraphicsWidget *AbstractScrollArea::viewport() const
+{
+ return m_viewport;
+}
+
+void AbstractScrollArea::setViewport(QGraphicsWidget *viewport)
+{
+ if (m_viewport) {
+ m_viewport->setParentItem(0);
+
+ QList<QGraphicsItem*> children = m_viewport->childItems();
+
+ foreach (QGraphicsItem *child, children)
+ child->setParentItem(0);
+
+ delete m_viewport;
+ }
+
+ m_viewport = viewport;
+
+ if (viewport) {
+
+ m_viewport->setParentItem(this);
+ m_viewport->setContentsMargins(0, 0, 0, 0);
+
+ adjustScrollBars();
+ }
+
+ emit viewportChanged(viewport);
+}
+
+bool AbstractScrollArea::event(QEvent *e)
+{
+ if (e->type() == QEvent::ApplicationLayoutDirectionChange
+ || e->type() == QEvent::LayoutDirectionChange) {
+ } else if (e->type() == QEvent::GraphicsSceneResize) {
+ QGraphicsSceneResizeEvent *event =
+ static_cast<QGraphicsSceneResizeEvent*>(e);
+
+ QSizeF newSize = event->newSize();
+ QRectF hrect = m_horizontalScrollBar->boundingRect();
+ QRectF vrect = m_verticalScrollBar->boundingRect();
+
+ QSizeF vpSize = newSize;
+
+ if (m_horizontalScrollBarPolicy != Qt::ScrollBarAlwaysOff)
+ vpSize.setHeight(newSize.height() - hrect.height());
+ if (m_verticalScrollBarPolicy != Qt::ScrollBarAlwaysOff)
+ vpSize.setWidth(newSize.width() - vrect.width());
+
+ m_viewport->resize(vpSize);
+
+ adjustScrollBars();
+ }
+
+ return QGraphicsWidget::event(e);
+}
+
+
+void AbstractScrollArea::scrollContentsBy(qreal dx, qreal dy)
+{
+ Q_UNUSED(dx)
+ Q_UNUSED(dy)
+ prepareGeometryChange();
+}
+
+void AbstractScrollArea::verticalScrollStart()
+{
+ m_prevVerticalValue = m_verticalScrollBar->sliderPosition();
+}
+
+void AbstractScrollArea::verticalScroll(qreal value)
+{
+ qreal dy = value - m_prevVerticalValue;
+ if (!qFuzzyCompare(dy,qreal(0.0))) {
+ scrollContentsBy(0.0, dy);
+ m_prevVerticalValue = value;
+ }
+}
+
+void AbstractScrollArea::horizontalScrollStart()
+{
+ m_prevHorizontalValue = m_horizontalScrollBar->sliderPosition();
+}
+
+void AbstractScrollArea::horizontalScroll(qreal value)
+{
+ qreal dx = value - m_prevHorizontalValue;
+ if (!qFuzzyCompare(dx,qreal(0.0))) {
+ scrollContentsBy(dx, 0.0);
+ m_prevHorizontalValue = value;
+ }
+}
+
+void AbstractScrollArea::adjustScrollBars()
+{
+ if (m_horizontalScrollBarPolicy == Qt::ScrollBarAlwaysOff) {
+ m_horizontalScrollBar->hide();
+ } else {
+ m_horizontalScrollBar->show();
+
+ QRectF sbgeom = boundingRect();
+
+ sbgeom.setTop(sbgeom.bottom() - m_horizontalScrollBar->boundingRect().height());
+ sbgeom.setRight(sbgeom.right() - m_verticalScrollBar->boundingRect().width());
+ m_horizontalScrollBar->setGeometry(sbgeom);
+ }
+
+ if (m_verticalScrollBarPolicy == Qt::ScrollBarAlwaysOff) {
+ m_verticalScrollBar->hide();
+ QRectF sbgeom = boundingRect();
+ sbgeom.setLeft(sbgeom.right());
+ sbgeom.setBottom(sbgeom.bottom());
+ m_verticalScrollBar->setGeometry(sbgeom);
+ } else {
+ m_verticalScrollBar->show();
+
+ QRectF sbgeom = boundingRect();
+
+ sbgeom.setLeft(sbgeom.right() - m_verticalScrollBar->boundingRect().width());
+ if (m_horizontalScrollBarPolicy != Qt::ScrollBarAlwaysOff)
+ sbgeom.setBottom(sbgeom.bottom() - m_horizontalScrollBar->boundingRect().height());
+ m_verticalScrollBar->setGeometry(sbgeom);
+ }
+}
+
+
+
+
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractscrollarea.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractscrollarea.h
new file mode 100644
index 0000000000..f681ca9fce
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractscrollarea.h
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ABSTRACTSCROLLAREA_H
+#define ABSTRACTSCROLLAREA_H
+
+#include "gvbwidget.h"
+
+class ScrollBar;
+class QGraphicsGridLayout;
+
+class AbstractScrollArea : public GvbWidget
+{
+ Q_OBJECT
+
+public:
+
+ AbstractScrollArea(QGraphicsWidget *parent = 0);
+ ~AbstractScrollArea();
+
+public:
+
+ void setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy policy);
+ void setVerticalScrollBarPolicy(Qt::ScrollBarPolicy policy);
+ Qt::ScrollBarPolicy verticalScrollBarPolicy() const;
+ Qt::ScrollBarPolicy horizontalScrollBarPolicy() const;
+
+ QGraphicsWidget *viewport() const;
+ void setViewport(QGraphicsWidget *viewport);
+
+ ScrollBar *verticalScrollBar() const;
+ ScrollBar *horizontalScrollBar() const;
+
+signals:
+
+ void viewportChanged(QGraphicsWidget *viewport);
+
+protected:
+
+ virtual bool event(QEvent *e);
+ virtual void scrollContentsBy(qreal dx, qreal dy);
+
+private slots:
+
+ void verticalScrollStart();
+ void verticalScroll(qreal);
+ void horizontalScrollStart();
+ void horizontalScroll(qreal);
+
+private:
+
+ void adjustScrollBars();
+
+ QGraphicsWidget *m_viewport;
+ ScrollBar *m_horizontalScrollBar;
+ ScrollBar *m_verticalScrollBar;
+ Qt::ScrollBarPolicy m_verticalScrollBarPolicy;
+ Qt::ScrollBarPolicy m_horizontalScrollBarPolicy;
+ qreal m_prevHorizontalValue;
+ qreal m_prevVerticalValue;
+};
+
+#endif // ABSTRACTSCROLLAREA_H
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractviewitem.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractviewitem.cpp
new file mode 100644
index 0000000000..6a6df15e23
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractviewitem.cpp
@@ -0,0 +1,102 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "abstractviewitem.h"
+
+AbstractViewItem::AbstractViewItem(QGraphicsWidget *parent)
+ : GvbWidget(parent),
+ m_index(),
+ m_itemView(0),
+ m_prototype(0)
+{
+}
+
+/*virtual*/
+AbstractViewItem::~AbstractViewItem()
+{
+}
+
+QModelIndex AbstractViewItem::modelIndex() const
+{
+ return m_index;
+}
+
+AbstractViewItem *AbstractViewItem::prototype() const
+{
+ return m_prototype;
+}
+
+AbstractItemView *AbstractViewItem::itemView() const
+{
+ return m_itemView;
+}
+
+void AbstractViewItem::setItemView(AbstractItemView *itemView)
+{
+ m_itemView = itemView;
+}
+
+void AbstractViewItem::setModelIndex(const QModelIndex &index)
+{
+ if (m_index != index) {
+ m_index = index;
+ updateItemContents();
+ }
+}
+
+/*virtual*/
+QSizeF AbstractViewItem::effectiveSizeHint(Qt::SizeHint which, const QSizeF &constraint) const
+{
+ return GvbWidget::effectiveSizeHint(which, constraint);
+}
+
+/*virtual*/
+bool AbstractViewItem::event(QEvent *e)
+{
+ return QGraphicsWidget::event(e);
+}
+
+/*virtual*/
+void AbstractViewItem::updateItemContents()
+{
+ ; // No impl yet
+}
+
+/*virtual*/
+void AbstractViewItem::themeChange()
+{
+ ; // No impl yet
+}
+
+/*virtual*/
+void AbstractViewItem::setSubtreeCacheEnabled(bool enabled)
+{
+ Q_UNUSED(enabled)
+ ; // No impl
+}
+
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractviewitem.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractviewitem.h
new file mode 100644
index 0000000000..4f9fbf4623
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractviewitem.h
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ABSTRACTVIEWITEM_H
+#define ABSTRACTVIEWITEM_H
+
+#include <QModelIndex>
+
+#include "gvbwidget.h"
+#include "abstractitemview.h"
+#include "listitem.h"
+
+class QGraphicsWidget;
+
+class AbstractViewItem : public GvbWidget
+{
+ Q_OBJECT
+public:
+ AbstractViewItem(QGraphicsWidget *parent = 0);
+ virtual ~AbstractViewItem();
+
+ virtual AbstractViewItem *newItemInstance() = 0;
+
+ QModelIndex modelIndex() const;
+
+ void setModelIndex(const QModelIndex &index);
+
+ AbstractViewItem *prototype() const;
+ AbstractItemView *itemView() const;
+ void setItemView(AbstractItemView *itemView) ;
+ virtual void updateItemContents();
+ virtual void themeChange();
+
+ virtual void setSubtreeCacheEnabled(bool enabled);
+
+ virtual QSizeF effectiveSizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const;
+
+ virtual void setModel(QAbstractItemModel *model) = 0;
+ virtual QVariant data(int role) const = 0;
+ virtual void setData(const QVariant &value, int role = Qt::DisplayRole) = 0;
+ virtual void setTwoColumns(const bool enabled) = 0;
+
+protected:
+ virtual bool event(QEvent *e);
+
+ QPersistentModelIndex m_index;
+
+private:
+ Q_DISABLE_COPY(AbstractViewItem)
+
+ AbstractItemView *m_itemView;
+ AbstractViewItem *m_prototype;
+
+};
+
+#endif // ABSTRACTVIEWITEM_H
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/backgrounditem.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/backgrounditem.cpp
new file mode 100644
index 0000000000..9f5f16d373
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/backgrounditem.cpp
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QStyleOptionGraphicsItem>
+#include <QGraphicsSceneResizeEvent>
+#include <QPainter>
+#include <QRectF>
+
+#include "backgrounditem.h"
+#include "theme.h"
+
+BackgroundItem::BackgroundItem(const QString &filename, QGraphicsWidget *parent)
+ : GvbWidget(parent),
+ m_background(),
+ m_fileName(filename)
+{
+ setContentsMargins(0,0,0,0);
+
+ connect(Theme::p(), SIGNAL(themeChanged()), this, SLOT(themeChange()));
+}
+
+BackgroundItem::~BackgroundItem()
+{
+}
+
+void BackgroundItem::resizeEvent(QGraphicsSceneResizeEvent *event)
+{
+ GvbWidget::resizeEvent(event);
+ m_background = Theme::p()->pixmap(m_fileName, size().toSize());
+}
+
+void BackgroundItem::paint(QPainter *painter,
+ const QStyleOptionGraphicsItem *option,
+ QWidget *widget)
+{
+ Q_UNUSED(widget)
+ painter->setCompositionMode(QPainter::CompositionMode_Source);
+ painter->drawPixmap(option->exposedRect, m_background, option->exposedRect);
+}
+
+void BackgroundItem::themeChange()
+{
+ m_background = Theme::p()->pixmap(m_fileName, size().toSize());
+ update();
+}
+
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/backgrounditem.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/backgrounditem.h
new file mode 100644
index 0000000000..0cb0ee778c
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/backgrounditem.h
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef __BACKGROUNDITEM_H__
+#define __BACKGROUNDITEM_H__
+
+#include <QPixmap>
+
+#include "gvbwidget.h"
+
+class QGraphicsWidget;
+
+class BackgroundItem : public GvbWidget
+{
+ Q_OBJECT
+
+public:
+ BackgroundItem(const QString &filename, QGraphicsWidget *parent=0);
+ ~BackgroundItem();
+
+ void paint(QPainter *painter,
+ const QStyleOptionGraphicsItem *option,
+ QWidget *widget = 0);
+ void resizeEvent(QGraphicsSceneResizeEvent *event);
+
+public slots:
+ void themeChange();
+
+private:
+ QPixmap m_background;
+ QString m_fileName;
+};
+
+#endif /* __BACKGROUNDITEM_H__ */
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/button.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/button.cpp
new file mode 100644
index 0000000000..b8bd55789d
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/button.cpp
@@ -0,0 +1,196 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui>
+#include "button.h"
+#include "theme.h"
+
+static const int MinTextWidthAsChars = 8;
+
+class ButtonPrivate {
+ Q_DECLARE_PUBLIC(Button)
+
+public:
+
+ ButtonPrivate(Button *button)
+ : down(false)
+ , q_ptr(button)
+ {
+ textItem = new QGraphicsSimpleTextItem(q_ptr);
+ }
+
+ QGraphicsSimpleTextItem *textItem;
+ bool down;
+ Button *q_ptr;
+};
+
+Button::Button(const QString &text, QGraphicsItem *parent, QSizeF minimumSize)
+ : QGraphicsWidget(parent)
+ , d_ptr(new ButtonPrivate(this)), m_background(), m_selected(false)
+{
+ Q_D(Button);
+ setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
+ //setCacheMode(QGraphicsItem::ItemCoordinateCache);
+ if(minimumSize.isValid())
+ setMinimumSize(minimumSize);
+ setContentsMargins(0, 0, 0, 0);
+ d->textItem->setText(text);
+ prepareGeometryChange();
+
+ m_font = Theme::p()->font(Theme::MenuItem);
+ d->textItem->setFont(m_font);
+ connect(Theme::p(), SIGNAL(themeChanged()), this, SLOT(themeChange()));
+}
+
+Button::~Button()
+{
+ delete d_ptr;
+}
+
+bool Button::isDown()
+{
+ Q_D(Button);
+
+ return d->down;
+}
+
+void Button::setText(const QString &text)
+{
+ Q_D(Button);
+ d->textItem->setText(text);
+ update();
+}
+
+QString Button::text()
+{
+ Q_D(Button);
+ return d->textItem->text();
+}
+
+void Button::paint(QPainter *painter,
+ const QStyleOptionGraphicsItem *option,
+ QWidget *widget)
+{
+ Q_UNUSED(widget);
+ Q_UNUSED(option);
+
+ if(!m_background.isNull())
+ painter->drawPixmap(QPoint(), m_background);
+ if(m_selected) {
+ painter->setBrush(Qt::black);
+ painter->setOpacity(0.2);
+ painter->drawRect(boundingRect().toRect());
+ }
+}
+
+QSizeF Button::sizeHint(Qt::SizeHint which,
+ const QSizeF &constraint) const
+{
+ Q_D(const Button);
+
+ switch (which)
+ {
+ case Qt::MinimumSize:
+ {
+ QFontMetricsF fm(d->textItem->font());
+ return QSizeF(MinTextWidthAsChars * fm.maxWidth(), fm.height());
+ }
+ case Qt::PreferredSize:
+ {
+ QFontMetricsF fm(d->textItem->font());
+ return QSizeF(fm.horizontalAdvance(d->textItem->text()), fm.height());
+ }
+ default:
+ return QGraphicsWidget::sizeHint(which, constraint);
+ }
+}
+
+void Button::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+ Q_D(Button);
+
+ if (event->button() != Qt::LeftButton ||
+ !sceneBoundingRect().contains(event->scenePos()))
+ return;
+
+ d->down = true;
+
+ prepareGeometryChange();
+ emit pressed();
+
+}
+
+void Button::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+ Q_D(Button);
+
+ if (!d->down || event->button() != Qt::LeftButton)
+ return;
+
+ d->down = false;
+
+ prepareGeometryChange();
+
+ emit released();
+
+ if (sceneBoundingRect().contains(event->scenePos()))
+ emit clicked();
+}
+
+void Button::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+ Q_UNUSED(event);
+}
+
+void Button::resizeEvent(QGraphicsSceneResizeEvent *event)
+{
+ Q_D(Button);
+ QGraphicsWidget::resizeEvent(event);
+
+ QRectF rect = d->textItem->boundingRect();
+ QRectF buttonrect = this->boundingRect();
+ d->textItem->setPos((buttonrect.width() - rect.width())/2, (buttonrect.height() - rect.height())/2 );
+
+ QSize currentSize = buttonrect.size().toSize();
+ if( m_background.size() != currentSize && (currentSize.width() > 0 && currentSize.height() > 0) ) {
+ m_background = Theme::p()->pixmap("status_field_middle.svg", buttonrect.size().toSize());
+ }
+}
+
+void Button::setBackground(QPixmap& background)
+{
+ m_background = background;
+}
+
+void Button::themeChange()
+{
+ Q_D(Button);
+
+ m_font = Theme::p()->font(Theme::MenuItem);
+ d->textItem->setFont(m_font);
+}
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/button.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/button.h
new file mode 100644
index 0000000000..8e76b88463
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/button.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef BUTTON_H
+#define BUTTON_H
+
+#include <QGraphicsWidget>
+
+class ButtonPrivate;
+class QTextDocument;
+
+class QPixmap;
+class QFont;
+
+class Button : public QGraphicsWidget
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(Button)
+
+public:
+
+ Button(const QString &text, QGraphicsItem *parent=0, QSizeF minimumSize = QSizeF());
+ virtual ~Button();
+
+signals:
+
+ void clicked(bool checked = false);
+ void pressed();
+ void released();
+
+public slots:
+
+ void themeChange();
+ void setText(const QString &text);
+ QString text();
+
+public:
+
+ void setBackground(QPixmap& background);
+ bool isDown();
+ void select(bool select){m_selected = select;}
+ void click() {emit clicked();}
+
+private:
+
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
+ QWidget *widget = 0);
+ QSizeF sizeHint(Qt::SizeHint which,
+ const QSizeF &constraint = QSizeF()) const;
+
+ void mousePressEvent(QGraphicsSceneMouseEvent *event);
+ void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+ void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+ void resizeEvent(QGraphicsSceneResizeEvent *event);
+
+private:
+ Q_DISABLE_COPY(Button)
+ ButtonPrivate *d_ptr;
+ QPixmap m_background;
+ QFont m_font;
+ bool m_selected;
+};
+
+#endif // BUTTON_H
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.cpp
new file mode 100644
index 0000000000..226c60cec8
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.cpp
@@ -0,0 +1,183 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QStringList>
+#include <QDebug>
+
+#include "commandline.h"
+
+static void usage(const char *appname)
+{
+ Q_UNUSED(appname);
+ printf(" GraphicsViewBenchmark related options:\n");
+ printf(" -h,-help,--help: This help\n");
+ printf(" -resolution : UI resolution in format WxH where width and height are positive values\n");
+ printf(" -opengl : Enables OpenGL usage. Building PRECONDITIONS: QT_NO_OPENGL is off.\n");
+ printf(" -manual : Run test manually \n");
+ printf("\n The following options are available in manual mode:\n");
+ printf(" -rotation : UI rotation in degrees\n");
+ printf(" -subtree-cache : Enables usage of subtree caching method\n");
+ printf(" -fps : Output FPS count to stdout during application execution\n");
+ printf(" -items : Count of items created to the list\n");
+ printf("\n");
+}
+
+static inline bool argumentOnlyAvailableInManualMode(const char *arg)
+{
+ return (strcmp(arg, "-rotation") == 0)
+ || (strcmp(arg, "-subtree-cache") == 0)
+ || (strcmp(arg, "-fps") == 0)
+ || (strcmp(arg, "-items") == 0);
+}
+
+bool readSettingsFromCommandLine(int argc, char *argv[],
+ Settings& config)
+{
+ bool builtWithOpenGL = false;
+ Settings::Options options;
+
+#ifndef QT_NO_OPENGL
+ builtWithOpenGL = true;
+#endif
+ for (int i = 1; i < argc; ++i) {
+ if (strcmp(argv[i], "-manual") == 0) {
+ options |= Settings::ManualTest;
+ argv[i] = 0;
+ break;
+ }
+ }
+
+ for (int i = 1; i < argc; ++i) {
+ if (!argv[i])
+ continue;
+ if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "-help") == 0 || strcmp(argv[i], "--help") == 0) {
+ usage(argv[0]);
+ return true;
+ }
+ if (strcmp(argv[i], "-opengl") == 0) {
+ if (builtWithOpenGL) {
+ options |= Settings::UseOpenGL;
+ argv[i] = 0;
+ } else {
+ printf("-opengl parameter can be used only with building PRECONDITIONS: QT_NO_OPENGL is off.\n");
+ usage(argv[0]);
+ return false;
+ }
+ } else if (strcmp(argv[i], "-resolution") == 0) {
+ if (i + 1 >= argc) {
+ printf("-resolution needs an extra parameter specifying the application UI resolution\n");
+ usage(argv[0]);
+ return false;
+ }
+ else {
+ QStringList res = QString(argv[i+1]).split(QLatin1Char('x'));
+ if (res.count() != 2) {
+ printf("-resolution parameter UI resolution should be set in format WxH where width and height are positive values\n");
+ usage(argv[0]);
+ return false;
+ }
+ int width = res.at(0).toInt();
+ int height = res.at(1).toInt();
+
+ config.setSize(QSize(width, height));
+
+ if (width <=0 || height <=0) {
+ printf("-resolution parameter UI resolution should be set in format WxH where width and height are positive values\n");
+ usage(argv[0]);
+ return false;
+ }
+ argv[i] = 0;
+ i++;
+ argv[i] = 0;
+ }
+ }
+
+ if (!argv[i])
+ continue;
+
+ if (!(options & Settings::ManualTest)) {
+ if (argumentOnlyAvailableInManualMode(argv[i])) {
+ printf("\nWrong option: '%s' is only available in manual mode\n\n", argv[i]);
+ usage(argv[0]);
+ return false;
+ }
+ continue;
+ }
+
+ if (strcmp(argv[i], "-rotation") == 0) {
+ if (i + 1 >= argc) {
+ printf("-rotation needs an extra parameter specifying the application UI rotation in degrees\n");
+ usage(argv[0]);
+ return false;
+ }
+ else {
+ bool ok;
+ int angle = QString(argv[i+1]).toInt(&ok);
+ if (!ok) {
+ printf("-rotation parameter should specify rotation angle in degrees\n");
+ usage(argv[0]);
+ return false;
+ }
+ config.setAngle(angle);
+ argv[i] = 0;
+ i++;
+ argv[i] = 0;
+ }
+ } else if (strcmp(argv[i], "-subtree-cache") == 0) {
+ options |= Settings::UseListItemCache;
+ argv[i] = 0;
+ } else if (strcmp(argv[i], "-fps") == 0) {
+ options |= Settings::OutputFps;
+ argv[i] = 0;
+ } else if (strcmp(argv[i], "-items") == 0) {
+ if (i + 1 >= argc) {
+ printf("-items needs an extra parameter specifying amount of list items\n");
+ usage(argv[0]);
+ return false;
+ }
+ else {
+ bool ok;
+ int amount = QString(argv[i+1]).toInt(&ok);
+ if (!ok) {
+ printf("-items needs an extra parameter specifying amount (integer) of list items\n");
+ usage(argv[0]);
+ return false;
+ }
+ config.setListItemCount(amount);
+ argv[i] = 0;
+ i++;
+ argv[i] = 0;
+ }
+ }
+ }
+
+ config.setOptions(options);
+
+ return true;
+}
+
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.h
new file mode 100644
index 0000000000..eaddeac59d
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.h
@@ -0,0 +1,39 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef COMMANDLINE_H
+#define COMMANDLINE_H
+
+#include "settings.h"
+
+bool readSettingsFromCommandLine(int argc,
+ char *argv[],
+ Settings& settings);
+
+
+#endif // COMMANDLINE_H
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.cpp
new file mode 100644
index 0000000000..7809b38050
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.cpp
@@ -0,0 +1,127 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QFile>
+#include <QRandomGenerator>
+#include "theme.h"
+
+#include "dummydatagen.h"
+
+DummyDataGenerator::DummyDataGenerator() : m_isMale(false)
+{
+ QFile countryCodeFile(":/contact/areacodes.txt");
+ countryCodeFile.open(QIODevice::ReadOnly);
+ while (!countryCodeFile.atEnd()) {
+ m_countryCodes << QString(countryCodeFile.readLine()).remove("\n");
+ }
+
+ QFile firstNameFFile(":/contact/firstnamesF.txt");
+ firstNameFFile.open(QIODevice::ReadOnly);
+ while (!firstNameFFile.atEnd()) {
+ m_firstNamesF << QString(firstNameFFile.readLine()).remove("\n");
+ }
+
+ QFile firstNameMFile(":/contact/firstnamesM.txt");
+ firstNameMFile.open(QIODevice::ReadOnly);
+ while (!firstNameMFile.atEnd()) {
+ m_firstNamesM << QString(firstNameMFile.readLine()).remove("\n");
+ }
+
+ QFile lastNameFile(":/contact/lastnames.txt");
+ lastNameFile.open(QIODevice::ReadOnly);
+ while (!lastNameFile.atEnd()) {
+ m_lastNames << QString(lastNameFile.readLine()).remove("\n");
+ }
+ Reset();
+}
+
+DummyDataGenerator::~DummyDataGenerator()
+{
+}
+
+void DummyDataGenerator::Reset()
+{
+}
+
+QString DummyDataGenerator::randomPhoneNumber(QString indexNumber)
+{
+ int index = QRandomGenerator::global()->bounded(m_countryCodes.count());
+ QString countryCode = m_countryCodes.at(index);
+ QString areaCode = QString::number(index) + QString("0").repeated(2-QString::number(index).length());
+ QString beginNumber = QString::number(555-index*2);
+ QString endNumber = QString("0").repeated(4-indexNumber.length()) + indexNumber;
+
+ return countryCode + QLatin1Char(' ') + areaCode +QLatin1Char(' ') + beginNumber
+ + QLatin1Char(' ') + endNumber;
+}
+
+QString DummyDataGenerator::randomFirstName()
+{
+ m_isMale = !m_isMale;
+ if (m_isMale)
+ return m_firstNamesM.at(QRandomGenerator::global()->bounded(m_firstNamesM.count()));
+ return m_firstNamesF.at(QRandomGenerator::global()->bounded(m_firstNamesF.count()));
+}
+
+QString DummyDataGenerator::randomLastName()
+{
+ return m_lastNames.at(QRandomGenerator::global()->bounded(m_lastNames.count()));
+}
+
+QString DummyDataGenerator::randomName()
+{
+ return QString(randomFirstName()+QString(", ")+randomLastName());
+}
+
+QString DummyDataGenerator::randomIconItem()
+{
+ QString avatar = Theme::p()->pixmapPath() + "contact_default_icon.svg";
+ if (QRandomGenerator::global()->bounded(4)) {
+ int randVal = 1+QRandomGenerator::global()->bounded(25);
+
+ if (m_isMale && randVal > 15) {
+ randVal -= 15;
+ }
+ if (!m_isMale && randVal <= 10) {
+ randVal += 10;
+ }
+
+ avatar = QString(":/avatars/avatar_%1.png").arg(randVal, 3, 10, QChar('0'));
+ }
+ return avatar;
+}
+
+QString DummyDataGenerator::randomStatusItem()
+{
+ switch (QRandomGenerator::global()->bounded(3)) {
+ case 0: return Theme::p()->pixmapPath() + "contact_status_online.svg";
+ case 1: return Theme::p()->pixmapPath() + "contact_status_offline.svg";
+ case 2: return Theme::p()->pixmapPath() + "contact_status_idle.svg";
+ }
+ return 0;
+}
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.h
new file mode 100644
index 0000000000..bcb9681d5d
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.h
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef __DUMMYDATAGEN_H__
+#define __DUMMYDATAGEN_H__
+
+#include <QObject>
+#include <QStringList>
+
+class DummyDataGenerator : public QObject
+{
+ Q_OBJECT
+public:
+ DummyDataGenerator();
+ ~DummyDataGenerator();
+
+public:
+ void Reset();
+ QString randomPhoneNumber(QString indexNumber);
+ QString randomFirstName();
+ QString randomLastName();
+ QString randomName();
+ QString randomIconItem();
+ QString randomStatusItem();
+
+private:
+ QStringList m_countryCodes;
+ QStringList m_firstNamesF;
+ QStringList m_firstNamesM;
+ QStringList m_lastNames;
+ bool m_isMale;
+};
+
+#endif // __DUMMYDATAGEN_H__
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/gvbwidget.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/gvbwidget.cpp
new file mode 100644
index 0000000000..3682ae55e1
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/gvbwidget.cpp
@@ -0,0 +1,46 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui>
+#include "gvbwidget.h"
+
+GvbWidget::GvbWidget(QGraphicsItem * parent, Qt::WindowFlags wFlags)
+ : QGraphicsWidget(parent, wFlags)
+{
+
+}
+
+GvbWidget::~GvbWidget()
+{
+}
+
+void GvbWidget::keyPressEvent(QKeyEvent *event)
+{
+ Q_UNUSED(event)
+}
+
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/gvbwidget.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/gvbwidget.h
new file mode 100644
index 0000000000..7e247b63a4
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/gvbwidget.h
@@ -0,0 +1,45 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef GVBWIDGET_H
+#define GVBWIDGET_H
+
+#include <QGraphicsWidget>
+
+class GvbWidget : public QGraphicsWidget
+{
+ Q_OBJECT
+
+public:
+
+ GvbWidget(QGraphicsItem * parent = 0, Qt::WindowFlags wFlags = 0);
+ ~GvbWidget();
+ virtual void keyPressEvent(QKeyEvent *event);
+};
+
+#endif
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/iconitem.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/iconitem.cpp
new file mode 100644
index 0000000000..a081e1b064
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/iconitem.cpp
@@ -0,0 +1,149 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui>
+#include <QSvgRenderer>
+#include <QGraphicsEffect>
+
+#include "iconitem.h"
+
+IconItem::IconItem(const QString &filename, QGraphicsItem *parent)
+ : GvbWidget(parent)
+ , m_filename(filename)
+ , m_rotation(0.0)
+ , m_opacityEffect(0)
+ , m_smoothTransformation(false)
+{
+ setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+ setContentsMargins(0,0,0,0);
+ setPreferredSize(58,58);
+}
+
+IconItem::~IconItem()
+{
+}
+
+void IconItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+{
+ Q_UNUSED(option);
+ Q_UNUSED(widget);
+
+ reload();
+
+ const QPointF c = boundingRect().center();
+ painter->translate(c.x(), c.y());
+ painter->rotate(m_rotation);
+ painter->translate(-c.x(), -c.y());
+
+ if (m_smoothTransformation)
+ painter->setRenderHints(QPainter::SmoothPixmapTransform);
+
+ painter->drawPixmap(0,0, m_pixmap);
+}
+
+QSizeF IconItem::sizeHint(Qt::SizeHint which,
+ const QSizeF &constraint) const
+{
+ switch (which)
+ {
+ case Qt::MinimumSize:
+ case Qt::PreferredSize:
+ case Qt::MaximumSize:
+ return m_pixmap.size();
+
+ default:
+ return GvbWidget::sizeHint(which, constraint);
+ }
+}
+
+void IconItem::reload()
+{
+ const QSize iconSize = size().toSize();
+ if (iconSize.width() == 0 || iconSize.height() == 0)
+ return;
+
+ const QString key = m_filename+QString::number(iconSize.width())+QString::number(iconSize.height());
+ if (QPixmapCache::find(key, m_pixmap))
+ return;
+
+ if (m_filename.endsWith(".svg", Qt::CaseInsensitive))
+ {
+ m_pixmap = QPixmap(iconSize);
+ m_pixmap.fill(Qt::transparent);
+ QSvgRenderer doc(m_filename);
+ QPainter painter(&m_pixmap);
+ painter.setViewport(0, 0, iconSize.width(), iconSize.height());
+ doc.render(&painter);
+ }
+ else
+ {
+ m_pixmap = QPixmap(m_filename).scaled(iconSize);
+ }
+
+ QPixmapCache::insert(key, m_pixmap);
+ updateGeometry();
+}
+
+QString IconItem::fileName() const
+{
+ return m_filename;
+}
+
+void IconItem::setFileName(const QString &filename)
+{
+ if( m_filename != filename) {
+ m_filename = filename;
+ reload();
+ }
+}
+
+void IconItem::setOpacityEffectEnabled(const bool enable)
+{
+ if (!m_opacityEffect)
+ {
+ QRadialGradient gradient(0.5, 0.5, 1.0);
+ gradient.setCoordinateMode(QGradient::ObjectBoundingMode);
+ gradient.setColorAt(0.0, QColor(0,0,0, 255));
+ gradient.setColorAt(0.46, QColor(0,0,0, 255));
+ gradient.setColorAt(0.62, QColor(0,0,0, 0));
+
+ m_opacityEffect = new QGraphicsOpacityEffect;
+ m_opacityEffect->setOpacityMask(gradient);
+ m_opacityEffect->setOpacity(1.0);
+ this->setGraphicsEffect(m_opacityEffect);
+ }
+ m_opacityEffect->setEnabled(enable);
+}
+
+bool IconItem::isOpacityEffectEnabled() const
+{
+ if (m_opacityEffect)
+ return m_opacityEffect->isEnabled();
+
+ return false;
+}
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/iconitem.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/iconitem.h
new file mode 100644
index 0000000000..48d1bafe9f
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/iconitem.h
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ICONITEM_H
+#define ICONITEM_H
+
+#include <QPainter>
+
+#include "gvbwidget.h"
+
+class QGraphicsOpacityEffect;
+class QPainter;
+
+class IconItem : public GvbWidget
+{
+ Q_OBJECT
+
+public:
+
+ IconItem(const QString &filename = "", QGraphicsItem *parent = 0);
+
+ virtual ~IconItem();
+
+ QString fileName() const;
+ void setFileName(const QString &filename);
+
+ void setOpacityEffectEnabled(const bool enable);
+ bool isOpacityEffectEnabled() const;
+
+ void setRotation(const qreal rotation) { m_rotation = rotation; }
+ qreal rotation() const { return m_rotation; }
+
+ void setSmoothTransformationEnabled(const bool enable) { m_smoothTransformation = enable; }
+ bool isSmoothTransformationEnabled() const { return m_smoothTransformation; }
+
+private:
+
+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget */*widget = 0*/);
+ QSizeF sizeHint(Qt::SizeHint which,
+ const QSizeF &constraint = QSizeF()) const;
+
+private:
+ Q_DISABLE_COPY(IconItem)
+ void reload();
+
+ QString m_filename;
+ QPixmap m_pixmap;
+ qreal m_rotation;
+ QGraphicsOpacityEffect *m_opacityEffect;
+ bool m_smoothTransformation;
+};
+
+#endif
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.cpp
new file mode 100644
index 0000000000..eabe3671e5
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.cpp
@@ -0,0 +1,248 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QDebug>
+#include <QTime>
+
+#include "itemrecyclinglist.h"
+#include "listitemcontainer.h"
+#include "abstractviewitem.h"
+#include "recycledlistitem.h"
+#include "theme.h"
+#include "scrollbar.h"
+
+ItemRecyclingList::ItemRecyclingList(const int itemBuffer, QGraphicsWidget * parent)
+ : ItemRecyclingListView(parent),
+ m_listModel(new ListModel(this))
+{
+ ListItemContainer *container = new ListItemContainer(itemBuffer, this, this);
+ container->setParentItem(this);
+ ItemRecyclingListView::setContainer(container);
+ ItemRecyclingListView::setModel(m_listModel, new RecycledListItem(this));
+ setObjectName("ItemRecyclingList");
+ connect(Theme::p(), SIGNAL(themeChanged()), this, SLOT(themeChange()));
+
+ setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+}
+
+/* virtual */
+ItemRecyclingList::~ItemRecyclingList()
+{
+}
+
+/* virtual */
+void ItemRecyclingList::insertItem(int index, RecycledListItem *item)
+{
+ if (index<0)
+ index = 0;
+ if (index > m_listModel->rowCount())
+ index = m_listModel->rowCount();
+ if (m_listModel && item)
+ m_listModel->insert(index,item);
+
+ updateListItemBackgrounds(index);
+}
+
+/* virtual */
+void ItemRecyclingList::addItem(RecycledListItem *item)
+{
+ if (item)
+ m_listModel->appendRow(item);
+
+ const int index = m_listModel->rowCount()-1;
+ updateListItemBackgrounds(index);
+}
+
+/* virtual */
+void ItemRecyclingList::clear()
+{
+ m_listModel->clear();
+}
+
+/* virtual */
+AbstractViewItem *ItemRecyclingList::takeItem(const int row)
+{
+ if (row < 0 || row >= m_listModel->rowCount() || !m_listModel)
+ return 0;
+ return m_listModel->takeItem(row);
+}
+
+/*virtual*/
+void ItemRecyclingList::setItemPrototype(AbstractViewItem* prototype)
+{
+ ItemRecyclingListView::setItemPrototype(prototype);
+}
+
+void ItemRecyclingList::themeChange()
+{
+ const bool caching = listItemCaching();
+ setListItemCaching(false);
+
+ const QString iconName = Theme::p()->pixmapPath()+"contact_default_icon.svg";
+ const int count = m_listModel->rowCount();
+
+ for (int i=0; i<count; ++i)
+ {
+ RecycledListItem *ritem = m_listModel->item(i);
+ if (ritem) {
+ ListItem *item = ritem->item();
+
+ // Update default icons
+ const QString filename = item->icon(ListItem::LeftIcon)->fileName();
+ if (filename.contains("contact_default_icon")) {
+ item->icon(ListItem::LeftIcon)->setFileName(iconName);
+ }
+
+ // Update status icons
+ QString statusIcon = item->icon(ListItem::RightIcon)->fileName();
+ const int index = statusIcon.indexOf("contact_status");
+ if (index != -1) {
+ statusIcon.remove(0, index);
+ item->icon(ListItem::RightIcon)->setFileName(Theme::p()->pixmapPath()+statusIcon);
+ }
+
+ // Update fonts
+ item->setFont(Theme::p()->font(Theme::ContactName), ListItem::FirstPos);
+ item->setFont(Theme::p()->font(Theme::ContactNumber), ListItem::SecondPos);
+ item->setFont(Theme::p()->font(Theme::ContactEmail), ListItem::ThirdPos);
+
+ // Update list dividers
+ if (i%2) {
+ item->setBackgroundBrush(Theme::p()->listItemBackgroundBrushOdd());
+ item->setBackgroundOpacity(Theme::p()->listItemBackgroundOpacityOdd());
+ }
+ else {
+ item->setBackgroundBrush(Theme::p()->listItemBackgroundBrushEven());
+ item->setBackgroundOpacity(Theme::p()->listItemBackgroundOpacityEven());
+ }
+
+ // Update borders
+ item->setBorderPen(Theme::p()->listItemBorderPen());
+ item->setRounding(Theme::p()->listItemRounding());
+
+ // Update icons
+ item->icon(ListItem::LeftIcon)->setRotation(Theme::p()->iconRotation(ListItem::LeftIcon));
+ item->icon(ListItem::RightIcon)->setRotation(Theme::p()->iconRotation(ListItem::RightIcon));
+ item->icon(ListItem::LeftIcon)->setOpacityEffectEnabled(Theme::p()->isIconOpacityEffectEnabled(ListItem::LeftIcon));
+ item->icon(ListItem::RightIcon)->setOpacityEffectEnabled(Theme::p()->isIconOpacityEffectEnabled(ListItem::RightIcon));
+ item->icon(ListItem::LeftIcon)->setSmoothTransformationEnabled(Theme::p()->isIconSmoothTransformationEnabled(ListItem::LeftIcon));
+ item->icon(ListItem::RightIcon)->setSmoothTransformationEnabled(Theme::p()->isIconSmoothTransformationEnabled(ListItem::RightIcon));
+ }
+ }
+ updateViewContent();
+ setListItemCaching(caching);
+}
+
+void ItemRecyclingList::keyPressEvent(QKeyEvent *event)
+{
+ static QTime keyPressInterval = QTime::currentTime();
+ static qreal step = 0.0;
+ static bool repeat = false;
+ int interval = keyPressInterval.elapsed();
+
+ ScrollBar* sb = verticalScrollBar();
+ qreal currentValue = sb->sliderPosition();
+
+ if(interval < 250 ) {
+ if(!repeat) step = 0.0;
+ step = step + 2.0;
+ if(step > 100) step = 100;
+ repeat = true;
+ }
+ else {
+ step = 1.0;
+ if(m_listModel->item(0)) m_listModel->item(0)->size().height();
+ step = m_listModel->item(0)->size().height();
+ repeat = false;
+ }
+
+ if(event->key() == Qt::Key_Up ) { //Up Arrow
+ sb->setSliderPosition(currentValue - step);
+ }
+
+ if(event->key() == Qt::Key_Down ) { //Down Arrow
+ sb->setSliderPosition(currentValue + step);
+ }
+ keyPressInterval.start();
+}
+
+bool ItemRecyclingList::listItemCaching() const
+{
+ ListItemContainer *container =
+ static_cast<ListItemContainer *>(m_container);
+
+ return container->listItemCaching();
+}
+
+void ItemRecyclingList::setListItemCaching(bool enabled)
+{
+ ListItemContainer *container =
+ static_cast<ListItemContainer *>(m_container);
+ container->setListItemCaching(enabled);
+}
+
+void ItemRecyclingList::updateListItemBackgrounds(int index)
+{
+ const int itemCount = m_listModel->rowCount();
+
+ for (int i=index; i<itemCount; ++i)
+ {
+ RecycledListItem *ritem = m_listModel->item(i);
+ if (ritem) {
+ ListItem *item = ritem->item();
+ if (i%2) {
+ item->setBackgroundBrush(Theme::p()->listItemBackgroundBrushOdd());
+ item->setBackgroundOpacity(Theme::p()->listItemBackgroundOpacityOdd());
+ }
+ else {
+ item->setBackgroundBrush(Theme::p()->listItemBackgroundBrushEven());
+ item->setBackgroundOpacity(Theme::p()->listItemBackgroundOpacityEven());
+ }
+ }
+ }
+}
+
+void ItemRecyclingList::setTwoColumns(const bool enabled)
+{
+ if (twoColumns() == enabled)
+ return;
+
+ const bool caching = listItemCaching();
+ setListItemCaching(false);
+
+ m_container->setTwoColumns(enabled);
+ refreshContainerGeometry();
+
+ setListItemCaching(caching);
+}
+
+bool ItemRecyclingList::twoColumns()
+{
+ return m_container->twoColumns();
+}
+
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.h
new file mode 100644
index 0000000000..a69b60c9e2
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ITEMRECYCLINGLIST_H
+#define ITEMRECYCLINGLIST_H
+
+#include "listitem.h"
+#include "abstractitemview.h"
+#include "listmodel.h"
+#include "itemrecyclinglistview.h"
+#include "recycledlistitem.h"
+
+class QGraphicsWidget;
+
+class ItemRecyclingList : public ItemRecyclingListView
+{
+ Q_OBJECT
+
+public:
+ ItemRecyclingList(const int itemBuffer = 4, QGraphicsWidget * parent = 0);
+ virtual ~ItemRecyclingList();
+
+ virtual void insertItem(int index, RecycledListItem *item);
+ virtual void addItem(RecycledListItem *item);
+ virtual void clear();
+ virtual AbstractViewItem *takeItem(const int row);
+ virtual void setItemPrototype(AbstractViewItem* prototype);
+ virtual void keyPressEvent(QKeyEvent *event);
+ virtual bool listItemCaching() const;
+ virtual void setListItemCaching(bool enabled);
+
+ void setTwoColumns(const bool enabled);
+ bool twoColumns();
+
+public slots:
+ void themeChange();
+
+private:
+ void updateListItemBackgrounds(int index);
+
+private:
+ Q_DISABLE_COPY(ItemRecyclingList)
+
+ ListModel *m_listModel;
+};
+
+#endif // ITEMRECYCLINGLIST_H
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.pri b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.pri
new file mode 100644
index 0000000000..55b551ef8f
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.pri
@@ -0,0 +1,19 @@
+HEADERS += $$ROOTDIR/tests/itemrecyclinglist/itemrecyclinglist.h \
+ $$ROOTDIR/tests/itemrecyclinglist/itemrecyclinglistview.h \
+ $$ROOTDIR/tests/itemrecyclinglist/abstractitemview.h \
+ $$ROOTDIR/tests/itemrecyclinglist/abstractviewitem.h \
+ $$ROOTDIR/tests/itemrecyclinglist/recycledlistitem.h \
+ $$ROOTDIR/tests/itemrecyclinglist/listitemcontainer.h \
+ $$ROOTDIR/tests/itemrecyclinglist/abstractitemcontainer.h \
+ $$ROOTDIR/tests/itemrecyclinglist/listmodel.h
+
+SOURCES += $$ROOTDIR/tests/itemrecyclinglist/itemrecyclinglist.cpp \
+ $$ROOTDIR/tests/itemrecyclinglist/itemrecyclinglistview.cpp \
+ $$ROOTDIR/tests/itemrecyclinglist/abstractitemview.cpp \
+ $$ROOTDIR/tests/itemrecyclinglist/abstractviewitem.cpp \
+ $$ROOTDIR/tests/itemrecyclinglist/recycledlistitem.cpp \
+ $$ROOTDIR/tests/itemrecyclinglist/listitemcontainer.cpp \
+ $$ROOTDIR/tests/itemrecyclinglist/abstractitemcontainer.cpp \
+ $$ROOTDIR/tests/itemrecyclinglist/listmodel.cpp
+
+INCLUDEPATH += $$ROOTDIR/tests/itemrecyclinglist
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglistview.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglistview.cpp
new file mode 100644
index 0000000000..5aa93256ff
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglistview.cpp
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "itemrecyclinglistview.h"
+
+ItemRecyclingListView::ItemRecyclingListView(QGraphicsWidget * parent)
+ : AbstractItemView(parent), m_rootIndex()
+{
+}
+
+/*virtual*/
+ItemRecyclingListView::~ItemRecyclingListView()
+{
+}
+void ItemRecyclingListView::setCurrentRow(const int row)
+{
+ setCurrentIndex(model()->index(row,0));
+}
+
+int ItemRecyclingListView::rows() const
+{
+ if (m_model)
+ return m_model->rowCount();
+ return 0;
+}
+
+/*virtual*/
+void ItemRecyclingListView::rowsInserted(const QModelIndex &parent, int start, int end)
+{
+ if (parent == m_rootIndex) {
+ AbstractItemView::rowsInserted(parent, start, end);
+ }
+}
+
+/*virtual*/
+void ItemRecyclingListView::rowsRemoved(const QModelIndex &parent, int start, int end)
+{
+ if (parent == m_rootIndex) {
+ AbstractItemView::rowsRemoved(parent, start, end);
+ }
+}
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglistview.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglistview.h
new file mode 100644
index 0000000000..467f193604
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglistview.h
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ITEMRECYCLINGLISTVIEW_H
+#define ITEMRECYCLINGLISTVIEW_H
+
+#include "abstractitemview.h"
+
+class ItemRecyclingListView : public AbstractItemView
+{
+public:
+ ItemRecyclingListView(QGraphicsWidget * parent = 0);
+ virtual ~ItemRecyclingListView();
+ void setCurrentRow(const int row);
+ int rows() const;
+ virtual bool listItemCaching() const = 0;
+ virtual void setListItemCaching(bool enabled) = 0;
+
+protected:
+ void rowsInserted(const QModelIndex &parent, int start, int end);
+ void rowsRemoved(const QModelIndex &parent,int start,int end);
+
+private:
+ QModelIndex m_rootIndex;
+};
+
+#endif // ITEMRECYCLINGLISTVIEW_H
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/label.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/label.cpp
new file mode 100644
index 0000000000..5fb2ee1a51
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/label.cpp
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui>
+
+#include "label.h"
+
+Label::Label(const QString &text, QGraphicsItem *parent)
+ : GvbWidget(parent)
+{
+ m_textItem = new QGraphicsSimpleTextItem(this);
+ setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
+ setContentsMargins(0, 0, 0, 0);
+ setText(text);
+ // This flag was introduced in Qt 4.6.
+ setFlag(QGraphicsItem::ItemHasNoContents, true);
+}
+
+Label::~Label()
+{
+}
+
+void Label::setText(const QString &text)
+{
+ m_textItem->setText(text);
+ prepareGeometryChange();
+}
+
+QString Label::text() const
+{
+ return m_textItem->text();
+}
+
+void Label::setFont(const QFont font)
+{
+ m_textItem->setFont(font);
+}
+
+void Label::resizeEvent(QGraphicsSceneResizeEvent *event)
+{
+ GvbWidget::resizeEvent(event);
+}
+
+QSizeF Label::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
+{
+ switch (which) {
+ case Qt::MinimumSize:
+ // fall thru
+ case Qt::PreferredSize: {
+ QFontMetricsF fm(m_textItem->font());
+ return QSizeF(fm.horizontalAdvance(m_textItem->text()), fm.height());
+ }
+ default:
+ return GvbWidget::sizeHint(which, constraint);
+ }
+}
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/label.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/label.h
new file mode 100644
index 0000000000..2c1f14b20e
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/label.h
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef TEXTITEM_H
+#define TEXTITEM_H
+
+#include "gvbwidget.h"
+
+class QPainter;
+class QStyleOptionGraphicsItem;
+class QGraphicsTextItem;
+
+class Label : public GvbWidget
+{
+ Q_OBJECT
+
+public:
+
+ Label(const QString& text, QGraphicsItem *parent = 0);
+ ~Label();
+
+public:
+
+ void setText(const QString& text);
+ QString text() const;
+ void setFont(const QFont font);
+
+private:
+ void resizeEvent(QGraphicsSceneResizeEvent *event);
+ QSizeF sizeHint(Qt::SizeHint which,
+ const QSizeF &constraint = QSizeF()) const;
+
+private:
+ Q_DISABLE_COPY(Label)
+ QGraphicsSimpleTextItem *m_textItem;
+};
+
+#endif
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitem.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitem.cpp
new file mode 100644
index 0000000000..1872bcc9d3
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitem.cpp
@@ -0,0 +1,287 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QDebug>
+#include <QGraphicsGridLayout>
+#include <QGraphicsLinearLayout>
+#include <QGraphicsSceneMouseEvent>
+#include <QPainter>
+#include <QStyleOptionGraphicsItem>
+#include "listitem.h"
+#include "theme.h"
+
+struct ItemData
+{
+ QHash<ListItem::TextPos, QString> texts;
+ QHash<ListItem::TextPos, QFont> fonts;
+ QHash<ListItem::IconItemPos, QString> icons;
+ QHash<ListItem::IconItemPos, qreal> iconRotations;
+ QHash<ListItem::IconItemPos, bool> iconSmoothTransformations;
+ QHash<ListItem::IconItemPos, bool> iconOpacityEffets;
+ QPen borderPen;
+ QBrush backgroundBrush;
+ qreal backgroundOpacity;
+ QSize rounding;
+};
+Q_DECLARE_METATYPE(ItemData);
+
+ListItem::ListItem(QGraphicsWidget *parent)
+ : GvbWidget(parent)
+ , m_txtlayout(new QGraphicsGridLayout())
+ , m_layout(new QGraphicsLinearLayout(Qt::Horizontal))
+ , m_liconlayout(new QGraphicsLinearLayout(Qt::Horizontal))
+ , m_riconlayout(new QGraphicsLinearLayout(Qt::Horizontal))
+ , m_fonts()
+ , m_borderPen(Qt::NoPen)
+ , m_backgroundBrush(QBrush())
+ , m_backgroundOpacity(1.0)
+ , m_rounding(0.0, 0.0)
+{
+ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+ setContentsMargins(0,4,4,0);
+ m_layout->setContentsMargins(0,0,0,0);
+
+ m_txtlayout->setContentsMargins(0,8,0,8);
+ m_liconlayout->setContentsMargins(8,8,8,8);
+ m_riconlayout->setContentsMargins(0,8,4,8);
+
+ m_layout->insertItem(0, m_liconlayout);
+ m_layout->insertItem(1, m_txtlayout);
+ m_layout->insertItem(2, m_riconlayout);
+
+ m_layout->setStretchFactor(m_liconlayout, 1);
+ m_layout->setStretchFactor(m_txtlayout, 5);
+ m_layout->setStretchFactor(m_riconlayout, 1);
+
+ setFlag(QGraphicsItem::ItemClipsToShape);
+ setLayout(m_layout);
+}
+
+ListItem::~ListItem()
+{
+ if (!m_liconlayout->parentLayoutItem())
+ delete m_liconlayout;
+
+ if (!m_riconlayout->parentLayoutItem())
+ delete m_riconlayout;
+}
+
+void ListItem::setIcon(IconItem *iconItem, const IconItemPos iconPos)
+{
+ if (iconPos == LeftIcon) {
+ if (m_liconlayout->count() > 0 && m_liconlayout->itemAt(0)) {
+ delete m_liconlayout->itemAt(0);
+ m_liconlayout->addItem(iconItem);
+ } else {
+ m_liconlayout->addItem(iconItem);
+ }
+ m_liconlayout->itemAt(0)->setMaximumSize(58, 58);
+ } else if (iconPos == RightIcon) {
+ if (m_riconlayout->count() > 0 && m_riconlayout->itemAt(0)) {
+ delete m_riconlayout->itemAt(0);
+ m_riconlayout->addItem(iconItem);
+ } else {
+ m_riconlayout->addItem(iconItem);
+ }
+ m_riconlayout->itemAt(0)->setMaximumSize(22, 22);
+ }
+ m_layout->invalidate();
+}
+
+IconItem* ListItem::icon(const IconItemPos iconPos) const
+{
+ QGraphicsLayoutItem* item = 0;
+
+ if (iconPos == LeftIcon && m_liconlayout->count() > 0) {
+ item = m_liconlayout->itemAt(0);
+ }
+ else if (iconPos == RightIcon && m_riconlayout->count() > 0) {
+ item = m_riconlayout->itemAt(0);
+ }
+
+ if (item) {
+ IconItem* titem = static_cast<IconItem *>(item);
+ return titem;
+ }
+ return 0;
+}
+
+QVariant ListItem::data(int role) const
+{
+ if (role != Qt::DisplayRole)
+ return QVariant();
+
+ ItemData data;
+
+ if (text(ListItem::FirstPos).size() > 0) {
+ data.texts[ListItem::FirstPos] = text(ListItem::FirstPos);
+ data.fonts[ListItem::FirstPos] = m_fonts[ListItem::FirstPos];
+ }
+ if (text(ListItem::SecondPos).size() > 0) {
+ data.texts[ListItem::SecondPos] = text(ListItem::SecondPos);
+ data.fonts[ListItem::SecondPos] = m_fonts[ListItem::SecondPos];
+ }
+ if (text(ListItem::ThirdPos).size() > 0) {
+ data.texts[ListItem::ThirdPos] = text(ListItem::ThirdPos);
+ data.fonts[ListItem::ThirdPos] = m_fonts[ListItem::ThirdPos];
+ }
+ if (text(ListItem::LastPos).size() > 0) {
+ data.texts[ListItem::LastPos] = text(ListItem::LastPos);
+ data.fonts[ListItem::LastPos] = m_fonts[ListItem::LastPos];
+ }
+
+ if (icon(ListItem::LeftIcon)) {
+ data.icons[ListItem::LeftIcon] = icon(ListItem::LeftIcon)->fileName();
+ data.iconRotations[ListItem::LeftIcon] = icon(ListItem::LeftIcon)->rotation();
+ data.iconSmoothTransformations[ListItem::LeftIcon] = icon(ListItem::LeftIcon)->isSmoothTransformationEnabled();
+ data.iconOpacityEffets[ListItem::LeftIcon] = icon(ListItem::LeftIcon)->isOpacityEffectEnabled();
+ }
+
+ if (icon(ListItem::RightIcon)) {
+ data.icons[ListItem::RightIcon] = icon(ListItem::RightIcon)->fileName();
+ data.iconRotations[ListItem::RightIcon] = icon(ListItem::RightIcon)->rotation();
+ data.iconSmoothTransformations[ListItem::RightIcon] = icon(ListItem::RightIcon)->isSmoothTransformationEnabled();
+ data.iconOpacityEffets[ListItem::RightIcon] = icon(ListItem::RightIcon)->isOpacityEffectEnabled();
+ }
+
+ data.borderPen = m_borderPen;
+ data.backgroundBrush = m_backgroundBrush;
+ data.backgroundOpacity = m_backgroundOpacity;
+ data.rounding = m_rounding;
+
+ QVariant var;
+ var.setValue(data);
+ return var;
+}
+
+void ListItem::setData(const QVariant &value, int role)
+{
+ if (role != Qt::DisplayRole)
+ return;
+
+ ItemData data = value.value<ItemData>();
+ QList<ListItem::TextPos> textkeys = data.texts.keys();
+
+ for (int i = 0; i<textkeys.count(); ++i) {
+ setText(data.texts[textkeys.at(i)], textkeys.at(i));
+ setFont(data.fonts[textkeys.at(i)], textkeys.at(i));
+ }
+
+ QList<ListItem::IconItemPos> iconkeys = data.icons.keys();
+ for (int i = 0; i<iconkeys.count(); ++i) {
+ IconItem *iconItem = icon(iconkeys.at(i));
+ if (iconItem)
+ iconItem->setFileName(data.icons[iconkeys.at(i)]);
+ else {
+ IconItem *iconItem = new IconItem(data.icons[iconkeys.at(i)], this);
+ setIcon(iconItem, iconkeys.at(i));
+ }
+ }
+
+ if (icon(ListItem::LeftIcon)) {
+ icon(ListItem::LeftIcon)->setRotation(data.iconRotations[ListItem::LeftIcon]);
+ icon(ListItem::LeftIcon)->setSmoothTransformationEnabled(data.iconSmoothTransformations[ListItem::LeftIcon]);
+ icon(ListItem::LeftIcon)->setOpacityEffectEnabled(data.iconOpacityEffets[ListItem::LeftIcon]);
+ }
+
+ if (icon(ListItem::RightIcon)) {
+ icon(ListItem::RightIcon)->setRotation(data.iconRotations[ListItem::RightIcon]);
+ icon(ListItem::RightIcon)->setSmoothTransformationEnabled(data.iconSmoothTransformations[ListItem::RightIcon]);
+ icon(ListItem::RightIcon)->setOpacityEffectEnabled(data.iconOpacityEffets[ListItem::RightIcon]);
+ }
+
+ m_borderPen = data.borderPen;
+ m_backgroundBrush = data.backgroundBrush;
+ m_backgroundOpacity = data.backgroundOpacity;
+ m_rounding = data.rounding;
+}
+
+void ListItem::setText(const QString str, const TextPos position)
+{
+ QGraphicsLayoutItem * item = 0;
+
+ if (m_txtlayout->rowCount() > position && position >= 0)
+ item = m_txtlayout->itemAt(position, 0);
+
+ if (!item) {
+ Label *label = new Label(str,this);
+ m_txtlayout->addItem(label, position, 0);
+ if (m_fonts.contains(position))
+ label->setFont(m_fonts[position]);
+ } else {
+ Label *titem = static_cast<Label *>(item);
+ titem->setText(str);
+ }
+}
+
+void ListItem::setFont(const QFont font, const TextPos position)
+{
+ m_fonts.insert(position, font);
+ QGraphicsLayoutItem * item = 0;
+
+ if (m_txtlayout->rowCount() > position && position >= 0)
+ item = m_txtlayout->itemAt(position, 0);
+
+ if (item) {
+ Label *titem = static_cast<Label *>(item);
+ titem->setFont(font);
+ }
+}
+
+QString ListItem::text(const TextPos position) const
+{
+ QGraphicsLayoutItem * item = 0;
+
+ if (m_txtlayout->rowCount() > position && position >= 0)
+ item = m_txtlayout->itemAt(position, 0);
+
+ if (item) {
+ Label *titem = static_cast<Label *>(item);
+ return titem->text();
+ }
+ return "";
+}
+
+void ListItem::paint(QPainter *painter, const QStyleOptionGraphicsItem */*option*/, QWidget */*widget*/)
+{
+ const int penWidth = m_borderPen.width();
+ QRectF r = rect();
+ r.adjust(penWidth, penWidth, -penWidth, -penWidth);
+
+ if (m_borderPen != Qt::NoPen) {
+ painter->setPen(m_borderPen);
+ painter->drawRoundedRect(r, m_rounding.width(), m_rounding.height());
+ }
+
+ if (m_backgroundBrush != Qt::NoBrush) {
+ painter->setPen(Qt::NoPen);
+ painter->setBrush(m_backgroundBrush);
+ painter->setOpacity(m_backgroundOpacity);
+ painter->drawRoundedRect(r, m_rounding.width(), m_rounding.height());
+ }
+}
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitem.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitem.h
new file mode 100644
index 0000000000..4f033803ac
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitem.h
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef LISTITEM_H
+#define LISTITEM_H
+
+#include <QPen>
+#include "iconitem.h"
+#include "label.h"
+#include "gvbwidget.h"
+
+class QGraphicsGridLayout;
+class QGraphicsLinearLayout;
+class QGraphicsSceneMouseEvent;
+class QGraphicsItem;
+
+class ListItem : public GvbWidget
+{
+ Q_OBJECT
+
+public:
+
+ enum TextPos {
+ FirstPos = 0,
+ SecondPos = 1,
+ ThirdPos = 2,
+ LastPos = 3
+ };
+
+ enum IconItemPos {
+ LeftIcon = 0,
+ RightIcon = 1
+ };
+
+ ListItem(QGraphicsWidget *parent = 0);
+ virtual ~ListItem();
+
+ void setIcon(IconItem *iconItem, const IconItemPos iconPos);
+ IconItem* icon(const IconItemPos position) const;
+ void setText(const QString str, const TextPos position);
+ QString text(const TextPos position) const;
+ void setFont(const QFont font, const TextPos position);
+
+ QVariant data(int role = Qt::DisplayRole) const;
+ void setData(const QVariant &value, int role = Qt::DisplayRole);
+
+ void setBorderPen(const QPen pen) { m_borderPen = pen; }
+ void setBackgroundBrush(const QBrush brush) { m_backgroundBrush = brush; }
+ void setBackgroundOpacity(const qreal opacity) { m_backgroundOpacity = opacity; }
+ void setRounding(const QSize rounding) { m_rounding = rounding; }
+
+protected:
+
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
+
+private:
+ Q_DISABLE_COPY(ListItem)
+ QGraphicsGridLayout *m_txtlayout;
+ QGraphicsLinearLayout *m_layout;
+ QGraphicsLinearLayout *m_liconlayout;
+ QGraphicsLinearLayout *m_riconlayout;
+ QHash<TextPos, QFont> m_fonts;
+
+ QPen m_borderPen;
+ QBrush m_backgroundBrush;
+ qreal m_backgroundOpacity;
+ QSize m_rounding;
+};
+
+#endif // LISTITEM_H
+
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcache.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcache.cpp
new file mode 100644
index 0000000000..0e4520d0a8
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcache.cpp
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QGraphicsItem>
+#include <QPainter>
+#include <QDebug>
+#include "listitemcache.h"
+
+ListItemCache::ListItemCache()
+{
+}
+
+ListItemCache::~ListItemCache()
+{
+ QPixmapCache::remove(m_cacheKey);
+}
+
+void ListItemCache::draw(QPainter * painter)
+{
+ QRectF irect = sourceBoundingRect(Qt::LogicalCoordinates);
+ QRectF vrect = painter->clipPath().boundingRect();
+
+ if (vrect.intersects(irect)) {
+ QRectF newVisibleRect = irect.intersected(vrect);
+ QPixmap pixmap;
+
+ if (!QPixmapCache::find(m_cacheKey, &pixmap) ||
+ m_visibleRect.toRect() != newVisibleRect.toRect()) {
+ //qDebug() << "ListItemCache: caching" << m_visibleRect
+ // << "->" << newVisibleRect;
+
+ pixmap = QPixmap(sourceBoundingRect().toRect().size());
+ pixmap.fill(Qt::transparent);
+
+ QPainter pixmapPainter(&pixmap);
+ drawSource(&pixmapPainter);
+ pixmapPainter.end();
+ m_cacheKey = QPixmapCache::insert(pixmap);
+
+ m_visibleRect = newVisibleRect;
+ }
+
+ //qDebug() << "ListItemCache: blitting" << m_visibleRect;
+ painter->drawPixmap(0, 0, pixmap);
+ }
+}
+
+void ListItemCache::sourceChanged(ChangeFlags)
+{
+ QPixmapCache::remove(m_cacheKey);
+}
+
+
+
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcache.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcache.h
new file mode 100644
index 0000000000..ba35023bbc
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcache.h
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef LISTITEMCACHE_H
+#define LISTITEMCACHE_H
+
+#include <QGraphicsEffect>
+#include <QPixmapCache>
+
+class ListItemCache : public QGraphicsEffect
+{
+ Q_OBJECT
+
+public:
+
+ ListItemCache();
+ ~ListItemCache();
+
+public: // QGraphicsEffect
+
+ void draw(QPainter *painter);
+ void sourceChanged(ChangeFlags flags);
+
+private:
+
+ QPixmapCache::Key m_cacheKey;
+ QRectF m_visibleRect;
+};
+
+#endif // LISTITEMCACHE_H
+
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcontainer.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcontainer.cpp
new file mode 100644
index 0000000000..496919214d
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcontainer.cpp
@@ -0,0 +1,182 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qmath.h>
+#include <QGraphicsLinearLayout>
+#include <QGraphicsScene>
+
+#include "listitemcontainer.h"
+#include "abstractviewitem.h"
+
+#include "recycledlistitem.h"
+#include "listitemcache.h"
+#include "itemrecyclinglist.h"
+
+ListItemContainer::ListItemContainer(int bufferSize, ItemRecyclingList *view, QGraphicsWidget *parent)
+ : AbstractItemContainer(bufferSize, parent)
+ , m_view(view)
+ , m_layout(new QGraphicsLinearLayout(Qt::Vertical))
+ , m_listItemCaching(false)
+{
+ setContentsMargins(0,0,0,0);
+ m_layout->setContentsMargins(0,0,0,0);
+ m_layout->setSpacing(0);
+ setLayout(m_layout);
+}
+
+/*virtual*/
+ListItemContainer::~ListItemContainer()
+{
+ setListItemCaching(false);
+ for (int i = 0; i < m_items.count(); ++i) {
+ m_layout->removeItem(m_items.at(i));
+ m_items.at(i)->setParentItem(0);
+ }
+ qDeleteAll(m_items);
+ m_items.clear();
+}
+
+bool ListItemContainer::listItemCaching() const
+{
+ return m_listItemCaching;
+}
+
+void ListItemContainer::setListItemCaching(const bool enabled)
+{
+ if (m_listItemCaching == enabled)
+ return;
+
+ m_listItemCaching = enabled;
+
+ const int itemCount = m_layout->count();
+
+ for (int i = 0; i < itemCount; ++i)
+ setListItemCaching(enabled, i);
+}
+
+/*virtual*/
+void ListItemContainer::adjustVisibleContainerSize(const QSizeF &size)
+{
+ m_layout->setPreferredWidth(size.width());
+}
+
+/*virtual*/
+void ListItemContainer::addItemToVisibleLayout(int index, AbstractViewItem *item)
+{
+ m_layout->insertItem(index,item);
+
+ setListItemCaching(m_listItemCaching, index);
+}
+
+/*virtual*/
+void ListItemContainer::removeItemFromVisibleLayout(AbstractViewItem *item)
+{
+ m_layout->removeItem(item);
+
+ RecycledListItem *recycledItem = static_cast<RecycledListItem*>(item);
+
+ if (!recycledItem)
+ return;
+
+ ListItem *listItem = recycledItem->item();
+
+ setListItemCaching(false, listItem);
+}
+
+/*virtual*/
+int ListItemContainer::maxItemCountInItemBuffer() const
+{
+ int count = AbstractItemContainer::maxItemCountInItemBuffer();
+
+ if (count > 0) {
+ int currentItemCount = m_items.count();
+ qreal heightOfOneItem = 0;
+ if (currentItemCount > 0)
+ {
+ heightOfOneItem = m_layout->effectiveSizeHint(Qt::PreferredSize).height() / currentItemCount;
+ }
+ int guess = 0;
+ if( heightOfOneItem <= 0 ) {
+ if (m_prototype) {
+ heightOfOneItem = m_prototype->effectiveSizeHint(Qt::PreferredSize).height();
+ }
+ else
+ heightOfOneItem = 50; // TODO magic number, do we have better guess if prototype is not set?
+ }
+ if (heightOfOneItem > 0) {
+ guess = qCeil(m_itemView->boundingRect().height() / heightOfOneItem) + m_bufferSize;
+
+ if (guess < currentItemCount) {
+ if( guess > currentItemCount-2) { // TODO magic number here, Can we use buffer size?
+ guess = currentItemCount;
+ }
+ }
+ }
+ count = qMin(guess, count);
+ }
+ return count;
+}
+
+void ListItemContainer::setListItemCaching(const bool enabled, const int index)
+{
+ RecycledListItem *recycledItem = static_cast<RecycledListItem*>(m_layout->itemAt(index));
+
+ if (!recycledItem)
+ return;
+
+ ListItem *listItem = recycledItem->item();
+
+ if (!listItem)
+ return;
+
+ setListItemCaching(enabled, listItem);
+}
+
+void ListItemContainer::setListItemCaching(const bool enabled, ListItem *listItem)
+{
+ if (!listItem)
+ return;
+
+ // Deletes the effect.
+ listItem->setGraphicsEffect(0);
+
+ if (enabled) {
+ ListItemCache* cache = new ListItemCache;
+ Q_ASSERT(!listItem->graphicsEffect());
+ listItem->setGraphicsEffect(cache);
+ }
+}
+
+void ListItemContainer::setTwoColumns(const bool twoColumns)
+{
+ AbstractItemContainer::setTwoColumns(twoColumns);
+
+ if (!m_layout->isActivated())
+ m_layout->activate();
+}
+
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcontainer.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcontainer.h
new file mode 100644
index 0000000000..62c9450c38
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcontainer.h
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef LISTITEMCONTAINER_H
+#define LISTITEMCONTAINER_H
+
+#include <QGraphicsWidget>
+#include <QColor>
+
+#include "abstractitemcontainer.h"
+
+class QGraphicsLinearLayout;
+class AbstractViewItem;
+class ListItemCache;
+class ListItem;
+class ItemRecyclingList;
+
+class ListItemContainer : public AbstractItemContainer
+{
+ Q_OBJECT
+
+public:
+ ListItemContainer(int bufferSize, ItemRecyclingList *view, QGraphicsWidget *parent=0);
+ virtual ~ListItemContainer();
+
+ virtual void setTwoColumns(const bool twoColumns);
+
+ bool listItemCaching() const;
+ void setListItemCaching(const bool enabled);
+ virtual void setListItemCaching(const bool enabled, const int index);
+
+protected:
+
+ virtual void addItemToVisibleLayout(int index, AbstractViewItem *item);
+ virtual void removeItemFromVisibleLayout(AbstractViewItem *item);
+
+ virtual void adjustVisibleContainerSize(const QSizeF &size);
+ virtual int maxItemCountInItemBuffer() const;
+
+private:
+ Q_DISABLE_COPY(ListItemContainer)
+
+ ItemRecyclingList *m_view;
+ QGraphicsLinearLayout *m_layout;
+
+ void setListItemCaching(const bool enabled, ListItem *listItem);
+ bool m_listItemCaching;
+};
+
+#endif // LISTITEMCONTAINER_H
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listmodel.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listmodel.cpp
new file mode 100644
index 0000000000..fe87a2abc4
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listmodel.cpp
@@ -0,0 +1,133 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "listmodel.h"
+#include "recycledlistitem.h"
+
+ListModel::ListModel(QObject *parent)
+ : QAbstractListModel(parent)
+ , m_items()
+{
+
+}
+
+ListModel::~ListModel()
+{
+ qDeleteAll(m_items);
+ m_items.clear();
+}
+
+int ListModel::rowCount(const QModelIndex &parent) const
+{
+ if (parent.isValid())
+ return 0;
+ return m_items.count();
+}
+
+QVariant ListModel::data(const QModelIndex &index, int role) const
+{
+ if (!index.isValid())
+ return QVariant();
+
+ if (index.row() >= m_items.size() || index.row() < 0)
+ return QVariant();
+
+ switch (role)
+ {
+ case Qt::DisplayRole:
+ return QVariant::fromValue(m_items.at(index.row())->data(role));
+ default:
+ return QVariant();
+ }
+}
+
+bool ListModel::setData(const QModelIndex &index, const QVariant &value, int role)
+{
+ // TODO implement if we like to edit list items
+ Q_UNUSED(index)
+ Q_UNUSED(value)
+ Q_UNUSED(role)
+ return false;
+}
+
+void ListModel::clear()
+{
+ m_items.clear();
+ reset();
+}
+
+QModelIndex ListModel::index(int row, int column, const QModelIndex &parent) const
+{
+ if (hasIndex(row, column, parent))
+ return createIndex(row, column, m_items.at(row));
+
+ return QModelIndex();
+}
+
+void ListModel::insert(int row, RecycledListItem *item)
+{
+ if (item)
+ item->setModel(this);
+ if (!item || m_items.contains(item) ) {
+ return;
+ }
+ if (row < 0)
+ row = 0;
+ else if (row > m_items.count())
+ row = m_items.count();
+ beginInsertRows(QModelIndex(), row, row);
+ m_items.insert(row, item);
+ endInsertRows();
+}
+
+void ListModel::appendRow(RecycledListItem *item)
+{
+ if (!item) return;
+ item->setModel(this);
+ insert(rowCount(),item);
+}
+
+RecycledListItem *ListModel::item(const int row) const
+{
+ if (row < 0 || row > m_items.count())
+ return 0;
+ return m_items.at(row);
+}
+
+RecycledListItem *ListModel::takeItem(const int row)
+{
+ if (row < 0 || row >= m_items.count())
+ return 0;
+
+ beginRemoveRows(QModelIndex(), row, row);
+ RecycledListItem *item = m_items.takeAt(row);
+ endRemoveRows();
+
+ return item;
+}
+
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listmodel.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listmodel.h
new file mode 100644
index 0000000000..623c90dedc
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listmodel.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef LISTMODEL_H
+#define LISTMODEL_H
+
+#include <QAbstractListModel>
+
+class RecycledListItem;
+class ListItemCache;
+
+class ListModel : public QAbstractListModel
+{
+ Q_OBJECT
+
+public:
+
+ ListModel(QObject *parent = 0);
+ ~ListModel();
+
+public:
+
+ int rowCount(const QModelIndex &parent = QModelIndex()) const;
+
+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole ) const;
+ bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
+
+ QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
+
+ void insert(const int row, RecycledListItem *item);
+ void appendRow(RecycledListItem *item);
+
+ void clear();
+
+ RecycledListItem *item(const int row) const;
+
+ RecycledListItem *takeItem(const int row);
+
+private:
+ Q_DISABLE_COPY(ListModel)
+ QList<RecycledListItem *> m_items;
+};
+
+#endif // LISTMODEL_H
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listwidget.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listwidget.cpp
new file mode 100644
index 0000000000..6e09a09d81
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listwidget.cpp
@@ -0,0 +1,117 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QGraphicsSceneResizeEvent>
+#include <QGraphicsGridLayout>
+#include <QGraphicsLinearLayout>
+#include <QTimer>
+#include "listwidget.h"
+
+ListWidget::ListWidget(QGraphicsWidget * parent)
+ : GvbWidget(parent),
+ m_layout(new QGraphicsLinearLayout(Qt::Vertical)),
+ m_listView(new SimpleListView(this))
+{
+ //listView->setViewport(listView->content());
+ //listView->content()->setParentItem(listView);
+ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ setContentsMargins(0,0,0,0);
+ m_layout->setContentsMargins(0,0,0,0);
+ m_listView->setContentsMargins(0,0,0,0);
+ m_layout->addItem(m_listView);
+ setLayout(m_layout);
+
+ m_scroller.setScrollable(m_listView);
+ m_listView->installEventFilter(&m_scroller);
+ m_listView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+}
+
+ListWidget::~ListWidget()
+{
+
+}
+
+void ListWidget::addItem(QGraphicsWidget *item)
+{
+ m_listView->addItem(item);
+}
+
+void ListWidget::insertItem(int index, QGraphicsWidget *item)
+{
+ m_listView->insertItem(index, item);
+}
+
+QGraphicsWidget* ListWidget::takeItem(int row)
+{
+ return m_listView->takeItem(row);
+}
+
+QGraphicsWidget* ListWidget::itemAt(int row)
+{
+ return m_listView->itemAt(row);
+}
+
+/* virtual */
+void ListWidget::resizeEvent( QGraphicsSceneResizeEvent * event )
+{
+ QGraphicsWidget::resizeEvent(event);
+}
+
+int ListWidget::itemCount() const
+{
+ if (m_listView)
+ return m_listView->itemCount();
+ return 0;
+}
+
+ScrollBar* ListWidget::verticalScrollBar() const
+{
+ if (m_listView)
+ return m_listView->verticalScrollBar();
+ return 0;
+}
+
+bool ListWidget::listItemCaching() const
+{
+ return m_listView->listItemCaching();
+}
+
+void ListWidget::setListItemCaching(bool enable)
+{
+ m_listView->setListItemCaching(enable);
+}
+
+void ListWidget::setTwoColumns(const bool twoColumns)
+{
+ m_listView->setTwoColumns(twoColumns);
+}
+
+bool ListWidget::twoColumns()
+{
+ return m_listView->twoColumns();
+}
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listwidget.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listwidget.h
new file mode 100644
index 0000000000..0dfd41a1c3
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/listwidget.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef LISTWIDGET_H
+#define LISTWIDGET_H
+
+#include <QGraphicsWidget>
+#include "simplelistview.h"
+#include "scroller.h"
+#include "gvbwidget.h"
+
+class AbstractViewItem;
+class QGraphicsSceneResizeEvent;
+class QGraphicsGridLayout;
+class QGraphicsLinearLayout;
+
+class ListWidget : public GvbWidget
+{
+ Q_OBJECT
+
+public:
+ ListWidget(QGraphicsWidget * parent = 0);
+ virtual ~ListWidget();
+ void addItem(QGraphicsWidget *item);
+ void insertItem(int index, QGraphicsWidget *item);
+ QGraphicsWidget* takeItem(int row);
+ QGraphicsWidget* itemAt(int row);
+ int itemCount() const;
+ bool listItemCaching() const;
+ void setListItemCaching(bool enable);
+ ScrollBar* verticalScrollBar() const;
+
+ void setTwoColumns(const bool twoColumns);
+ bool twoColumns();
+
+protected:
+ virtual void resizeEvent( QGraphicsSceneResizeEvent * event );
+
+private:
+ Q_DISABLE_COPY(ListWidget)
+
+ QGraphicsLinearLayout *m_layout;
+ SimpleListView *m_listView;
+ Scroller m_scroller;
+};
+
+#endif
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/mainview.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/mainview.cpp
new file mode 100644
index 0000000000..c8ccb60dbb
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/mainview.cpp
@@ -0,0 +1,331 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QDebug>
+#include <QApplication>
+#include <QGraphicsLinearLayout>
+#ifndef QT_NO_OPENGL
+#include <QGLWidget>
+#endif
+#include <QObject>
+
+#include "button.h"
+#include "label.h"
+#include "menu.h"
+#include "topbar.h"
+#include "backgrounditem.h"
+#include "theme.h"
+#include "mainview.h"
+#include "gvbwidget.h"
+
+MainView::MainView(const bool enableOpenGL, const bool outputFps, const bool imageRendering, QWidget *parent)
+ : QGraphicsView(parent)
+ , m_scene(0)
+ , m_mainLayout(0)
+ , m_mainWidget(0)
+ , m_testWidget(0)
+ , m_imageBasedRendering(imageRendering)
+ , m_pixmapToRender(0)
+ , m_OutputFps(outputFps)
+ , m_fpsUpdated()
+ , m_Fpss()
+ , m_angle(0)
+ , m_enableOpenGL(enableOpenGL)
+{
+ construct();
+}
+
+MainView::~MainView()
+{
+ if (!m_scene->parent())
+ delete m_scene;
+
+ delete m_pixmapToRender;
+}
+
+void MainView::setTestWidget(QGraphicsWidget *testWidget)
+{
+ if (!testWidget)
+ return;
+
+ if (m_testWidget) {
+ m_mainLayout->removeItem(m_testWidget);
+ if (!m_testWidget->parent() && !m_testWidget->parentLayoutItem())
+ delete m_testWidget;
+ }
+ m_testWidget = testWidget;
+ m_mainLayout->addItem(m_testWidget);
+ resizeContent(size());
+}
+
+QGraphicsWidget *MainView::takeTestWidget()
+{
+ if (m_testWidget) {
+ m_mainLayout->removeItem(m_testWidget);
+ QGraphicsWidget *tmp = m_testWidget;
+ m_testWidget = 0;
+ return tmp;
+ }
+ return 0;
+}
+
+QGraphicsWidget *MainView::testWidget()
+{
+ return m_testWidget;
+}
+
+void MainView::setImageBasedRendering(const bool imageBasedRendering)
+{
+ m_imageBasedRendering = imageBasedRendering;
+ delete m_pixmapToRender;
+ m_pixmapToRender = 0;
+ viewport()->update();
+}
+
+bool MainView::imageBasedRendering() const
+{
+ return m_imageBasedRendering;
+}
+
+qreal MainView::fps()
+{
+ if (m_Fpss.count() <= 0)
+ updateFps();
+
+ if (m_Fpss.count() <= 0)
+ return 0.0;
+
+ qreal sum = 0;
+ int count = m_Fpss.count();
+ for (int i = 0; i<count; ++i)
+ sum += m_Fpss.at(i);
+ m_Fpss.clear();
+ fpsReset();
+ return sum/qreal(count);
+}
+
+void MainView::fpsReset()
+{
+ m_frameCount = 0;
+ m_fpsFirstTs.start();
+ m_fpsLatestTs = m_fpsFirstTs;
+ m_fpsUpdated.start();
+}
+
+void MainView::rotateContent(int angle)
+{
+ bool portrait = ((m_angle+angle)%90 == 0) && ((m_angle+angle)%180 != 0);
+ bool landscape = ((m_angle+angle)%180 == 0);
+ if (!portrait && !landscape)
+ return;
+
+ m_angle = (m_angle + angle)%360;
+
+ rotate(angle);
+
+ resizeContent(size());
+}
+
+int MainView::rotationAngle() const
+{
+ return m_angle;
+}
+
+void MainView::resizeContent(const QSize &s)
+{
+ QSizeF l_size(s);
+ QSizeF p_size(l_size.height(), l_size.width());
+ bool portrait = (m_angle%90 == 0) && (m_angle%180 != 0);
+ if (portrait) {
+ m_mainWidget->resize(p_size);
+ m_backGround->resize(p_size);
+ }
+ else {
+ m_mainWidget->resize(l_size);
+ m_backGround->resize(l_size);
+ }
+ m_menu->setPos(m_topBar->getStatusBarLocation());
+ setSceneRect(QRectF(m_mainWidget->pos(), m_mainWidget->size()));
+}
+
+void MainView::resizeEvent(QResizeEvent * event)
+{
+ QGraphicsView::resizeEvent(event);
+ resizeContent(event->size());
+}
+
+void MainView::paintEvent (QPaintEvent *event)
+{
+ if (m_imageBasedRendering) {
+ if (!m_pixmapToRender)
+ m_pixmapToRender = new QPixmap(size());
+
+ if (m_pixmapToRender->size() != size()) {
+ delete m_pixmapToRender;
+ m_pixmapToRender = new QPixmap(size());
+ }
+ QPainter p(m_pixmapToRender);
+ render(&p);
+ p.end();
+ }
+ else {
+ QGraphicsView::paintEvent(event);
+ }
+
+ if (!m_OutputFps)
+ emit repainted();
+
+ m_frameCount++;
+ m_fpsLatestTs.start();
+ if(m_fpsUpdated.elapsed() > 2000) {
+ updateFps();
+ m_fpsUpdated.start();
+ }
+}
+
+void MainView::keyPressEvent(QKeyEvent *event)
+{
+ if (event->key() == Qt::Key_F) {
+ if (isFullScreen())
+ showNormal();
+ else
+ showFullScreen();
+ }
+
+ //S60 3.x specific
+ if(m_menu->menuVisible()) {
+ m_menu->keyPressEvent(event);
+ return;
+ }
+
+ if(event->key() == 16777235 ) { //Up Arrow
+ GvbWidget* widget = qobject_cast<GvbWidget*>(m_testWidget);
+ if(widget)
+ widget->keyPressEvent(event);
+ }
+
+ if(event->key() == 16777237 ) { //Down Arrow
+ GvbWidget* widget = qobject_cast<GvbWidget*>(m_testWidget);
+ if(widget)
+ widget->keyPressEvent(event);
+ }
+
+ if(event->key() == 17825792 ) { //LSK
+ if(!m_menu->menuVisible())
+ m_menu->menuShowHide();
+ }
+
+ if(event->key() == 17825793 ) { //RSK
+ QApplication::quit();
+ }
+}
+
+void MainView::construct()
+{
+ m_scene = new QGraphicsScene;
+
+#ifndef QT_NO_OPENGL
+ if (m_enableOpenGL) {
+ qDebug() << "OpenGL enabled";
+ m_scene->setSortCacheEnabled(false);
+ setViewport(new QGLWidget);
+
+ // Qt doc says: This is the preferred update mode for
+ // viewports that do not support partial updates, such as QGLWidget...
+ setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
+ } else
+#endif
+ setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
+
+ setScene(m_scene);
+ m_scene->setItemIndexMethod(QGraphicsScene::NoIndex);
+
+ //setCacheMode(QGraphicsView::CacheBackground);
+ setAlignment(Qt::AlignLeft | Qt::AlignTop);
+
+ // Turn off automatic background
+ setAttribute(Qt::WA_OpaquePaintEvent);
+ setAttribute(Qt::WA_NoBackground);
+ setAttribute(Qt::WA_NoSystemBackground);
+ setAutoFillBackground(false);
+
+ //Background
+ m_backGround = new BackgroundItem("background.svg");
+ m_scene->addItem(m_backGround);
+ m_backGround->setZValue(0);
+
+ //Menu
+ m_menu = new Menu(this);
+ m_scene->addItem(m_menu); //Add menu to the scene directly
+ m_menu->setZValue(10); //Bring to front
+
+ m_mainLayout = new QGraphicsLinearLayout(Qt::Vertical);
+ m_mainLayout->setContentsMargins(0,0,0,0);
+ m_mainLayout->setSpacing(0);
+
+ m_mainWidget = new QGraphicsWidget;
+ m_mainWidget->setLayout(m_mainLayout);
+ m_mainWidget->setZValue(1);
+ m_scene->addItem(m_mainWidget);
+
+ //Topbar
+ m_topBar = new TopBar(this, 0);
+ m_mainLayout->addItem(m_topBar);
+ m_topBar->setZValue(1);
+ connect(m_topBar, SIGNAL(clicked(bool)), m_menu, SLOT(menuShowHide()));
+
+ setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ setContentsMargins(0,0,0,0);
+ setViewportMargins(0,0,0,0);
+ setFrameShape(QFrame::NoFrame);
+
+ fpsReset();
+ m_fpsUpdated.start();
+}
+
+void MainView::updateFps()
+{
+ int msecs = m_fpsFirstTs.msecsTo(m_fpsLatestTs);
+ qreal fps = 0;
+ if (msecs > 0) {
+ fps = m_frameCount * 1000.0 / msecs;
+
+ if (m_OutputFps)
+ qDebug() << "FPS: " << fps;
+
+ m_Fpss.append(fps);
+ }
+ m_fpsFirstTs = m_fpsLatestTs;
+ m_frameCount = 0;
+}
+
+Menu *MainView::menu()
+{
+ return m_menu;
+}
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/mainview.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/mainview.h
new file mode 100644
index 0000000000..d7fe404023
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/mainview.h
@@ -0,0 +1,110 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef __MAINWINDOW_H__
+#define __MAINWINDOW_H__
+
+#include <QGraphicsView>
+#include <QTime>
+#include <QTimer>
+
+#include "settings.h"
+
+class QGraphicsScene;
+class QGraphicsLinearLayout;
+class QResizeEvent;
+class Label;
+class Menu;
+class BackgroundItem;
+class TopBar;
+
+class MainView : public QGraphicsView {
+
+Q_OBJECT
+
+public:
+ MainView(const bool enableOpenGL, const bool outputFps, const bool imageBasedRendering = false, QWidget *parent = 0);
+ ~MainView();
+
+ void setTestWidget(QGraphicsWidget *testWidget);
+ QGraphicsWidget *takeTestWidget();
+ QGraphicsWidget *testWidget();
+
+ qreal fps();
+ void fpsReset();
+ void setImageBasedRendering(const bool imageBasedRendering);
+ bool imageBasedRendering() const;
+ Menu *menu();
+ int rotationAngle() const;
+
+signals:
+ void repainted();
+
+public slots:
+ void rotateContent(int angle);
+
+protected:
+
+ virtual void resizeEvent(QResizeEvent * event);
+ virtual void paintEvent(QPaintEvent *event);
+ virtual void keyPressEvent(QKeyEvent *event);
+ virtual void wheelEvent(QWheelEvent *event) { Q_UNUSED (event); };
+
+private slots:
+ void updateFps();
+
+private:
+ void construct();
+ void resizeContent(const QSize &s);
+
+private:
+ Q_DISABLE_COPY(MainView)
+
+ QGraphicsScene *m_scene;
+ QGraphicsLinearLayout *m_mainLayout;
+ QGraphicsWidget *m_mainWidget;
+ QGraphicsWidget *m_testWidget;
+ Menu* m_menu;
+ BackgroundItem* m_backGround;
+ TopBar* m_topBar;
+
+ bool m_imageBasedRendering;
+ QPixmap *m_pixmapToRender;
+ // Used for FPS
+ int m_frameCount;
+ QTime m_fpsFirstTs;
+ QTime m_fpsLatestTs;
+ bool m_OutputFps;
+ QTime m_fpsUpdated;
+ QList<qreal> m_Fpss;
+
+ int m_angle;
+ bool m_enableOpenGL;
+};
+
+#endif //__MAINWINDOW_H__
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/menu.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/menu.cpp
new file mode 100644
index 0000000000..1cc75d569b
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/menu.cpp
@@ -0,0 +1,189 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QGraphicsView>
+#include <QGraphicsWidget>
+#include <QGraphicsLinearLayout>
+#include <QList>
+
+#include "button.h"
+#include "menu.h"
+#include "themeevent.h"
+#include "theme.h"
+
+static const int MinMenuItemWidth = 150;
+static const int MinMenuItemHeight = 40;
+
+Menu::Menu(QGraphicsView* parent) : QGraphicsWidget(),
+ m_Parent(parent), m_Layout(new QGraphicsLinearLayout(Qt::Vertical, this)),
+ m_ButtonContainer(0), m_isMenuVisible(false), m_currentSelectedIndex(-1)
+{
+ init();
+}
+
+Menu::~Menu()
+{
+ for(int i = 0; i < m_ButtonContainer->count(); i++ ) {
+ delete m_ButtonContainer->at(i);
+ }
+ m_ButtonContainer->clear();
+
+ delete m_ButtonContainer;
+ m_ButtonContainer = 0;
+}
+
+void Menu::init()
+{
+ m_ButtonContainer = new QList<Button*>;
+
+ m_Layout->setContentsMargins(0,0,0,0);
+ m_Layout->setSpacing(0);
+
+ setMinimumWidth(150);
+
+ setLayout(m_Layout);
+
+ connect(Theme::p(), SIGNAL(themeChanged()), this, SLOT(themeChange()));
+}
+
+Button* Menu::addMenuItem(const QString itemName, QObject* receiver, const char* member)
+{
+ Button* button = new Button(itemName ,this);
+ button->setVisible(m_isMenuVisible);
+ connect(button, SIGNAL(clicked(bool)), receiver, member);
+ connect(button, SIGNAL(clicked(bool)), this, SLOT(menuShowHide()));
+ m_ButtonContainer->append(button);
+ button->setMinimumWidth(MinMenuItemWidth);
+ button->setMinimumHeight(MinMenuItemHeight);
+ return button;
+}
+
+void Menu::menuShowHide()
+{
+ m_isMenuVisible ? menuHide() : menuShow();
+ m_isMenuVisible = !m_isMenuVisible;
+}
+
+void Menu::menuShow()
+{
+ for(int i = 0; i < m_ButtonContainer->count(); i++) {
+ Button* button = m_ButtonContainer->at(i);
+ m_Layout->addItem(button);
+ button->show();
+ }
+}
+
+void Menu::menuHide()
+{
+ for(int i = 0; i < m_ButtonContainer->count(); i++) {
+ Button* button = m_ButtonContainer->at(i);
+ button->select(false);
+ button->hide();
+ m_Layout->removeItem(button);
+ }
+ m_currentSelectedIndex = -1;
+}
+
+void Menu::themeChange()
+{
+ QPixmap pixmap = Theme::p()->pixmap("status_field_middle.svg",
+ QSize(MinMenuItemWidth, MinMenuItemHeight));
+
+ for(int i = 0; i < m_ButtonContainer->count(); i++) {
+ Button* button = m_ButtonContainer->at(i);
+ button->setBackground(pixmap);
+ }
+ update();
+}
+
+void Menu::keyPressEvent(QKeyEvent *event)
+{
+ //S60 3.x specific
+ if(event->key() == 16777235 ) { //Up Arrow
+ if(m_currentSelectedIndex > 0) { //One step up
+ Button* button = m_ButtonContainer->at(m_currentSelectedIndex);
+ button->select(false);
+ button->update();
+
+ m_currentSelectedIndex--;
+ button = m_ButtonContainer->at(m_currentSelectedIndex);
+ button->select(true);
+ button->update();
+ }
+ else { //Jump to bottom
+ if(m_currentSelectedIndex >= 0) {
+ Button* button = m_ButtonContainer->at(m_currentSelectedIndex);
+ button->select(false);
+ button->update();
+ }
+ m_currentSelectedIndex = m_ButtonContainer->count() -1;
+ if(m_currentSelectedIndex >= 0) {
+ Button* button = m_ButtonContainer->at(m_currentSelectedIndex);
+ button->select(true);
+ button->update();
+ }
+ }
+ }
+
+ if(event->key() == 16777237 ) { //Down Arrow
+ if (m_currentSelectedIndex < m_ButtonContainer->count()-1) { //One step down
+ if(m_currentSelectedIndex >= 0) {
+ Button* button = m_ButtonContainer->at(m_currentSelectedIndex);
+ button->select(false);
+ button->update();
+ }
+ m_currentSelectedIndex++;
+ Button* button = m_ButtonContainer->at(m_currentSelectedIndex);
+ button->select(true);
+ button->update();
+ }
+ else { //Jump to top
+ if(m_currentSelectedIndex >= 0) {
+ Button* button = m_ButtonContainer->at(m_currentSelectedIndex);
+ button->select(false);
+ button->update();
+ m_currentSelectedIndex = 0;
+ button = m_ButtonContainer->at(m_currentSelectedIndex);
+ button->select(true);
+ button->update();
+ }
+ }
+ }
+
+ if(event->key() == 17825792 || event->key() == 16842752 || //LSK, center key or enter
+ event->key() == 16777221 ) {
+ if(m_currentSelectedIndex >= 0) {
+ Button* button = m_ButtonContainer->at(m_currentSelectedIndex);
+ button->click();
+ }
+ }
+
+ if(event->key() == 17825793 ) { //RSK
+ menuShowHide();
+ }
+}
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/menu.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/menu.h
new file mode 100644
index 0000000000..074d5b9d95
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/menu.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef __MENU_H__
+#define __MENU_H__
+
+#include <QGraphicsWidget>
+#include <QList>
+
+class QGraphicsView;
+class QGraphicsLinearLayout;
+class Button;
+
+class Menu : public QGraphicsWidget
+{
+ Q_OBJECT
+public:
+ Menu(QGraphicsView* parent);
+ ~Menu();
+
+public:
+ Button* addMenuItem(const QString itemName, QObject* receiver, const char* member);
+ inline bool menuVisible() { return m_isMenuVisible; }
+ virtual void keyPressEvent(QKeyEvent *event);
+
+public slots:
+ void themeChange();
+
+public slots:
+ void menuShowHide();
+
+private:
+ void init();
+ void menuShow();
+ void menuHide();
+
+private:
+ Q_DISABLE_COPY(Menu)
+ QGraphicsView* m_Parent;
+ QGraphicsLinearLayout* m_Layout;
+ QList<Button*>* m_ButtonContainer;
+ bool m_isMenuVisible;
+ int m_currentSelectedIndex;
+};
+
+#endif // __MENU_H__
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/recycledlistitem.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/recycledlistitem.cpp
new file mode 100644
index 0000000000..c0aed25abb
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/recycledlistitem.cpp
@@ -0,0 +1,134 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QGraphicsGridLayout>
+#include <QDebug>
+
+#include "recycledlistitem.h"
+#include "listmodel.h"
+
+static const int MinItemHeight = 70;
+static const int MinItemWidth = 276;
+
+RecycledListItem::RecycledListItem(QGraphicsWidget *parent)
+ : AbstractViewItem(parent),
+ m_item(new ListItem(this)),
+ m_item2(0),
+ m_model(0),
+ m_layout(new QGraphicsGridLayout())
+{
+ m_item->setMinimumWidth(MinItemWidth);
+ setContentsMargins(0,0,0,0);
+ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ m_layout->addItem(m_item, 0, 0);
+ setLayout(m_layout);
+ m_layout->setContentsMargins(0,0,0,0);
+ m_layout->setSpacing(0);
+ m_layout->setHorizontalSpacing(0.0);
+ m_layout->setVerticalSpacing(0.0);
+}
+
+RecycledListItem::~RecycledListItem()
+{
+}
+
+void RecycledListItem::setModel(QAbstractItemModel *model)
+{
+ m_model = model;
+}
+
+/*virtual*/
+AbstractViewItem *RecycledListItem::newItemInstance()
+{
+ RecycledListItem* item = new RecycledListItem();
+ return item;
+}
+
+QSizeF RecycledListItem::effectiveSizeHint(Qt::SizeHint which, const QSizeF &constraint) const
+{
+ QSizeF s = m_item->effectiveSizeHint(which,constraint);
+ if (m_item2)
+ s.setWidth(s.width()*2);
+ if (s.height()<MinItemHeight)
+ s.setHeight(MinItemHeight);
+ return s;
+}
+
+QVariant RecycledListItem::data(int role) const
+{
+ if (m_item && role == Qt::DisplayRole)
+ return m_item->data();
+
+ return QVariant();
+}
+
+void RecycledListItem::setData(const QVariant &value, int role)
+{
+ if (m_item && role == Qt::DisplayRole) {
+ m_item->setData(value);
+ if (m_item2) {
+ m_item2->setData(value);
+ }
+ }
+}
+
+/*virtual*/
+void RecycledListItem::resizeEvent(QGraphicsSceneResizeEvent *event)
+{
+ AbstractViewItem::resizeEvent(event);
+}
+
+void RecycledListItem::updateItemContents()
+{
+ AbstractViewItem::updateItemContents();
+ if (m_model && m_index.isValid())
+ setData(m_model->data(m_index,Qt::DisplayRole), Qt::DisplayRole);
+}
+
+void RecycledListItem::setTwoColumns(const bool enabled)
+{
+ if (m_item2 && enabled)
+ return;
+
+ if (enabled) {
+ m_item2 = new ListItem();
+ m_item2->setMinimumWidth(MinItemWidth);
+ m_layout->addItem(m_item2, 0, 1);
+ updateItemContents();
+ }
+ else {
+ if (m_layout->count() > 1) {
+ m_layout->removeAt(1);
+ }
+ delete m_item2;
+ m_item2 = 0;
+ }
+
+ if (!m_layout->isActivated())
+ m_layout->activate();
+}
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/recycledlistitem.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/recycledlistitem.h
new file mode 100644
index 0000000000..021a8b8902
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/recycledlistitem.h
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef RECYCLEDLISTITEM_H
+#define RECYCLEDLISTITEM_H
+
+#include "abstractviewitem.h"
+
+class ListItem;
+class QGraphicsWidget;
+class QGraphicsGridLayout;
+
+class RecycledListItem : public AbstractViewItem
+{
+ Q_OBJECT
+public:
+ RecycledListItem(QGraphicsWidget *parent=0);
+ virtual ~RecycledListItem();
+
+ virtual void setModel(QAbstractItemModel *model);
+
+ virtual AbstractViewItem *newItemInstance();
+ virtual void updateItemContents();
+
+ virtual QVariant data(int role) const;
+ virtual void setData(const QVariant &value, int role = Qt::DisplayRole);
+
+ ListItem *item() { return m_item; }
+
+ void setTwoColumns(const bool enabled);
+
+protected:
+ virtual QSizeF effectiveSizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const;
+ virtual void resizeEvent(QGraphicsSceneResizeEvent *event);
+
+private:
+ Q_DISABLE_COPY(RecycledListItem)
+
+ ListItem *m_item;
+ ListItem *m_item2;
+ QAbstractItemModel *m_model;
+ QGraphicsGridLayout *m_layout;
+};
+
+#endif // RECYCLEDLISTITEM_H
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/resourcemoninterface.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/resourcemoninterface.h
new file mode 100644
index 0000000000..b03f09048a
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/resourcemoninterface.h
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef __RESOURCEMONINTERFACE_H__
+#define __RESOURCEMONINTERFACE_H__
+
+class ResourceMonitorInterface
+{
+public:
+ struct MemoryAllocation
+ {
+ int allocatedInAppThread;
+ int numberOfAllocatedCellsInAppThread;
+ int availableMemoryInAppThreadHeap;
+ qint64 availableMemoryInSystem;
+ qint64 totalMemoryInSystem;
+ MemoryAllocation() :
+ allocatedInAppThread(0),
+ numberOfAllocatedCellsInAppThread(0),
+ availableMemoryInAppThreadHeap(0),
+ availableMemoryInSystem(0),
+ totalMemoryInSystem(0)
+ {}
+ };
+
+ struct CpuUsage
+ {
+ qreal systemUsage;
+ qreal appTreadUsage;
+ CpuUsage() :
+ systemUsage(0.0),
+ appTreadUsage(0.0)
+ {}
+ };
+
+public:
+ virtual ~ResourceMonitorInterface() {}
+
+public:
+ //for symbian, prepares the resource monitor for data capture, opens handle to ekern null
+ //thread and sets initial values
+ virtual bool Prepare(QString applicationThreadName) = 0;
+
+ //functions for CPU load and memory - Call Prepare before calling these
+ virtual CpuUsage CPULoad()=0;
+ virtual MemoryAllocation MemoryLoad()=0;
+
+ virtual void BeginMeasureMemoryLoad()=0;
+ virtual MemoryAllocation EndMeasureMemoryLoad()=0;
+
+ virtual void BeginMeasureCPULoad()=0;
+ virtual CpuUsage EndMeasureCPULoad()=0;
+
+};
+
+Q_DECLARE_INTERFACE(ResourceMonitorInterface,
+ "com.trolltech.Plugin.ResourceMonitorInterface/1.0");
+
+#endif //__RESOURCEMONINTERFACE_H__
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scrollbar.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scrollbar.cpp
new file mode 100644
index 0000000000..81f123e2b7
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scrollbar.cpp
@@ -0,0 +1,286 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QGraphicsWidget>
+#include <QPainter>
+#include <QGraphicsSceneMouseEvent>
+#include <QDebug>
+
+#include "scrollbar.h"
+#include "theme.h"
+
+class ScrollBarPrivate {
+ Q_DECLARE_PUBLIC(ScrollBar)
+
+public:
+
+ ScrollBarPrivate(Qt::Orientation orientation, ScrollBar *scrollBar)
+ : orientation(orientation)
+ , sliderPosition(0.0)
+ , sliderSize(0.0)
+ , sliderDown(false)
+ , q_ptr(scrollBar)
+ {
+ construct();
+ }
+
+ void themeChange()
+ {
+ construct();
+ updateSlider();
+ }
+
+ void construct()
+ {
+ scrollerPixmap = Theme::p()->pixmap("scroll.svg");
+ scrollBarPixmap = Theme::p()->pixmap("scrollbar.svg");
+
+ if (orientation == Qt::Horizontal) {
+ scrollerPixmap = scrollerPixmap.transformed(QTransform().rotate(90));
+ scrollBarPixmap = scrollBarPixmap.transformed(QTransform().rotate(90));
+ }
+ }
+
+ void setSliderPosition(qreal pos)
+ {
+ if (pos < 0.0)
+ pos = 0.0;
+
+ if (pos > sliderSize)
+ pos = sliderSize;
+
+ sliderPosition = pos;
+
+ if (!qFuzzyCompare(pos, sliderPosition))
+ updateSlider();
+ }
+
+ void updateSlider()
+ {
+ QRectF oldSlider = slider;
+ slider = q_func()->boundingRect();
+
+ qreal x = 0;
+ qreal y = 0;
+ qreal w = scrollerPixmap.width();
+ qreal h = scrollerPixmap.height();
+
+ //Adjust the scrollBar in relation to the scroller
+
+ if (orientation == Qt::Horizontal) {
+ qreal scrollBarHeight = scrollBarPixmap.height();
+
+ if (h > scrollBarHeight) {
+ slider.setTop((h - scrollBarHeight)/2.0);
+ slider.setHeight(scrollBarHeight);
+ }
+ } else {
+ qreal scrollBarWidth = scrollBarPixmap.width();
+
+ if (w > scrollBarWidth) {
+ slider.setLeft((w - scrollBarWidth)/2.0);
+ }
+ slider.setWidth(scrollBarWidth);
+ }
+
+ if(oldSlider != slider && (slider.size().width() > 0 &&slider.size().height() > 0 )) {
+ scrollBarPixmap = Theme::p()->pixmap("scrollbar.svg", slider.size().toSize());
+ }
+ cursor = QRectF(x, y, w, h);
+
+ if (orientation == Qt::Horizontal) {
+ qreal dx = qreal(int(sliderPosition)) * (slider.width() - cursor.width()) / sliderSize;
+ cursor.translate(dx, 0.0);
+ } else {
+ qreal dy = qreal(int(sliderPosition)) * (slider.height() - cursor.height()) / sliderSize;
+ cursor.translate(0.0, dy);
+ }
+ }
+
+ Qt::Orientation orientation;
+ qreal sliderPosition;
+ qreal sliderSize;
+
+ QPointF pressPos;
+ bool sliderDown;
+
+ QRectF slider;
+ QRectF cursor;
+ QPixmap scrollerPixmap;
+ QPixmap scrollBarPixmap;
+
+ ScrollBar *q_ptr;
+};
+
+ScrollBar::ScrollBar(Qt::Orientation orientation, QGraphicsWidget *parent)
+ : QGraphicsWidget(parent)
+ , d_ptr(new ScrollBarPrivate(orientation, this))
+{
+ setSizePolicy(QSizePolicy::Fixed, QSizePolicy::MinimumExpanding);
+ setContentsMargins(0, 0, 0, 0);
+
+ connect(Theme::p(), SIGNAL(themeChanged()), this, SLOT(themeChange()));
+}
+
+ScrollBar::~ScrollBar()
+{
+ delete d_ptr;
+}
+
+qreal ScrollBar::sliderSize() const
+{
+ Q_D(const ScrollBar);
+ return d->sliderSize;
+}
+
+void ScrollBar::setSliderSize(const qreal s)
+{
+ Q_D(ScrollBar);
+ d->sliderSize = s;
+}
+
+void ScrollBar::setSliderPosition(qreal pos)
+{
+ Q_D(ScrollBar);
+
+ d->setSliderPosition(pos);
+ prepareGeometryChange();
+ emit sliderPositionChange(d->sliderPosition);
+}
+
+qreal ScrollBar::sliderPosition() const
+{
+ Q_D(const ScrollBar);
+ return d->sliderPosition;
+}
+
+bool ScrollBar::sliderDown() const
+{
+ Q_D(const ScrollBar);
+ return d->sliderDown;
+}
+
+void ScrollBar::paint(QPainter *painter,
+ const QStyleOptionGraphicsItem *option,
+ QWidget *widget)
+{
+ Q_D(ScrollBar);
+ Q_UNUSED(widget);
+ Q_UNUSED(option);
+
+ d->updateSlider();
+
+ QRect sliderRect = d->slider.toRect();
+ painter->drawPixmap(sliderRect.topLeft(), d->scrollBarPixmap);
+
+ QRect cursorRect = d->cursor.toRect();
+ painter->drawPixmap(cursorRect.topLeft(), d->scrollerPixmap);
+}
+
+QSizeF ScrollBar::sizeHint(Qt::SizeHint which,
+ const QSizeF &constraint) const
+{
+ Q_D(const ScrollBar);
+
+ QSizeF s;
+
+ if (d->orientation == Qt::Horizontal)
+ s = QSizeF(-1, qMax(d->scrollBarPixmap.height(), d->scrollerPixmap.height()));
+ else
+ s = QSizeF(qMax(d->scrollBarPixmap.width(), d->scrollerPixmap.width()), -1);
+
+ switch (which)
+ {
+ case Qt::MinimumSize:
+ return s;
+
+ case Qt::MaximumSize:
+ return s;
+
+ default:
+ return QGraphicsWidget::sizeHint(which, constraint);
+ }
+}
+
+void ScrollBar::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+ Q_D(ScrollBar);
+
+ d->updateSlider();
+
+ if (d->cursor.contains(event->pos())) {
+ d->sliderDown = true;
+ d->pressPos = event->pos();
+ emit sliderPressed();
+ }
+}
+
+void ScrollBar::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+ Q_D(ScrollBar);
+ Q_UNUSED(event);
+
+ d->sliderDown = false;
+}
+
+void ScrollBar::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+ Q_D(ScrollBar);
+
+ if (!d->sliderDown)
+ return;
+
+ if (d->orientation == Qt::Horizontal) {
+ qreal f = (event->pos().x() - d->pressPos.x())/(d->slider.width() - d->cursor.width());
+ qreal dx = f * d->sliderSize;
+
+ d->setSliderPosition(d->sliderPosition + dx);
+ } else {
+ qreal f = (event->pos().y() - d->pressPos.y())/(d->slider.height() - d->cursor.height());
+ qreal dy = f * d->sliderSize;
+
+ d->setSliderPosition(d->sliderPosition + dy);
+ }
+
+ d->pressPos = event->pos();
+
+ prepareGeometryChange();
+ emit sliderPositionChange(d->sliderPosition);
+}
+
+void ScrollBar::resizeEvent(QGraphicsSceneResizeEvent *event)
+{
+ QGraphicsWidget::resizeEvent(event);
+}
+
+void ScrollBar::themeChange()
+{
+ Q_D(ScrollBar);
+ d->themeChange();
+}
+
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scrollbar.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scrollbar.h
new file mode 100644
index 0000000000..966052676c
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scrollbar.h
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SCROLLBAR_H
+#define SCROLLBAR_H
+
+#include <QGraphicsWidget>
+#include <QPixmap>
+
+class ScrollBarPrivate;
+
+class ScrollBar : public QGraphicsWidget
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(ScrollBar)
+
+public:
+
+ ScrollBar(Qt::Orientation orientation, QGraphicsWidget *parent=0);
+ virtual ~ScrollBar();
+
+public:
+
+ bool sliderDown() const;
+ qreal sliderPosition() const;
+ qreal sliderSize() const;
+ void setSliderSize(const qreal s);
+
+signals:
+
+ void sliderPressed();
+
+ void sliderPositionChange(qreal position);
+
+public slots:
+
+ void setSliderPosition(qreal pos);
+ void themeChange();
+
+private:
+
+ void paint(QPainter *painter,
+ const QStyleOptionGraphicsItem *option,
+ QWidget *widget);
+
+ QSizeF sizeHint(Qt::SizeHint which,
+ const QSizeF &constraint = QSizeF()) const;
+
+ void mousePressEvent(QGraphicsSceneMouseEvent *event);
+ void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+ void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+ void resizeEvent(QGraphicsSceneResizeEvent *event);
+
+private:
+ Q_DISABLE_COPY(ScrollBar)
+ ScrollBarPrivate *d_ptr;
+};
+
+#endif // SCROLLBAR_H
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller.cpp
new file mode 100644
index 0000000000..203ea7e046
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller.cpp
@@ -0,0 +1,292 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QScrollBar>
+#include <QEvent>
+#include <QGraphicsSceneMouseEvent>
+#include <QGraphicsView>
+#include <QDebug>
+
+#include "scroller.h"
+#include "scroller_p.h"
+#include "abstractscrollarea.h"
+#include "scrollbar.h"
+
+const int ScrollStep = 1;
+const int UpdateScrollingInterval = 55;
+const int UpdateScrollingSmoothInterval = 0;
+static const qreal MaxScrollingSpeed = 48.0;
+
+ScrollerPrivate::ScrollerPrivate(Scroller *scroller)
+ : m_scrollArea(0)
+ , m_scrollFactor(1.0)
+ , m_state(Stopped)
+ , q_ptr(scroller)
+ , m_eventViewport(0)
+{
+}
+
+ScrollerPrivate::~ScrollerPrivate()
+{
+}
+
+void ScrollerPrivate::stopScrolling()
+{
+ m_state = ScrollerPrivate::Started;
+ m_cursorPos = QCursor::pos();
+ m_speed = QPoint(0, 0);
+
+ if (m_scrollTimer.isActive())
+ m_scrollTimer.stop();
+}
+
+//Maps screen coordinates to scrollArea coordinates though current m_eventViewport widget
+QPointF ScrollerPrivate::mapToScrollArea(const QPoint &point)
+{
+ if (!m_scrollArea || !m_eventViewport)
+ return point;
+
+ QObject *vparent = m_eventViewport->parent();
+ if (!vparent)
+ return point;
+
+ QGraphicsView *view = qobject_cast<QGraphicsView*>(vparent);
+ if (!view)
+ return point;
+
+ QPoint pt = view->mapFromGlobal(point);
+ return m_scrollArea->mapFromScene(view->mapToScene(pt));
+}
+
+bool ScrollerPrivate::eventFilter(QObject *obj, QEvent *event)
+{
+ if (obj != m_scrollArea
+ || (event->type() != QEvent::GraphicsSceneMouseMove
+ && event->type() != QEvent::GraphicsSceneMousePress
+ && event->type() != QEvent::GraphicsSceneMouseRelease
+ /*&& event->type() != QEvent::GraphicsSceneKeyPressed
+ && event->type() != QEvent::GraphicsSceneKeyReleased*/))
+ return false;
+
+ QGraphicsSceneMouseEvent* mouseEvent =
+ static_cast<QGraphicsSceneMouseEvent*>(event);
+
+ m_eventViewport = mouseEvent->widget();
+
+ bool eventConsumed = false;
+
+ switch (m_state) {
+ case ScrollerPrivate::Stopped:
+ if (mouseEvent->type() == QEvent::GraphicsSceneMousePress &&
+ mouseEvent->buttons() == Qt::LeftButton) {
+ m_cursorPos = QCursor::pos();
+ m_speed = QPointF(0.0, 0.0);
+ m_state = Started;
+ }
+
+ eventConsumed = true;
+ break;
+
+ case ScrollerPrivate::Started:
+ if (mouseEvent->type() == QEvent::GraphicsSceneMouseMove) {
+ m_cursorPos = QCursor::pos();
+ m_state = ManualScrolling;
+
+ if (!m_scrollTimer.isActive())
+ m_scrollTimer.start(UpdateScrollingInterval);
+ else {
+ m_scrollTimer.stop();
+ m_scrollTimer.start(UpdateScrollingInterval);
+ }
+
+ } else if (mouseEvent->type() == QEvent::MouseButtonRelease) {
+ m_speed = QPoint(0, 0);
+ m_state = Stopped;
+
+ if (m_scrollTimer.isActive())
+ m_scrollTimer.stop();
+ }
+ eventConsumed = true;
+ break;
+
+ case ScrollerPrivate::ManualScrolling:
+ if (mouseEvent->type() == QEvent::GraphicsSceneMouseMove &&
+ m_scrollArea->viewport()->boundingRect().contains(mouseEvent->pos()) ) {
+
+ ScrollBar *hscroll = m_scrollArea->horizontalScrollBar();
+ ScrollBar *vscroll = m_scrollArea->verticalScrollBar();
+
+ QPointF d = m_scrollFactor * (mapToScrollArea(QCursor::pos()) - mapToScrollArea(m_cursorPos));
+
+ hscroll->setSliderPosition(hscroll->sliderPosition() - d.x());
+ vscroll->setSliderPosition(vscroll->sliderPosition() - d.y());
+
+ if (m_lastCursorTime.elapsed() > UpdateScrollingInterval) {
+ m_speed = mapToScrollArea(QCursor::pos()) - mapToScrollArea(m_cursorPos);
+ m_lastCursorTime.restart();
+ }
+
+ m_lastFrameTime.restart();
+
+ m_cursorPos = QCursor::pos();
+ } else if (mouseEvent->type() == QEvent::GraphicsSceneMouseRelease) {
+ m_state = AutoScrolling;
+ m_scrollSlowAccum = 0;
+ if (m_scrollTimer.isActive()) {
+ m_scrollTimer.stop();
+ m_scrollTimer.start(UpdateScrollingSmoothInterval);
+ }
+ }
+ eventConsumed = true;
+ break;
+
+ case ScrollerPrivate::AutoScrolling:
+ if (mouseEvent->type() == QEvent::GraphicsSceneMousePress) {
+ stopScrolling();
+ } else if (mouseEvent->type() == QEvent::MouseButtonRelease) {
+ m_state = Stopped;
+ }
+ eventConsumed = true;
+ break;
+
+ default:
+ break;
+ }
+
+ return eventConsumed;
+}
+
+void ScrollerPrivate::updateScrolling()
+{
+ bool scrollOngoing = false;
+
+ if (!m_scrollArea) {
+ m_scrollTimer.stop();
+ return;
+ }
+
+ if (m_state == ManualScrolling) {
+ scrollOngoing = true;
+ m_speed = mapToScrollArea(QCursor::pos()) - mapToScrollArea(m_cursorPos);
+ m_cursorPos = QCursor::pos();
+ } else if (m_state == AutoScrolling) {
+ scrollOngoing = true;
+
+
+ qreal x = qMax(-MaxScrollingSpeed, qMin(m_speed.x(), MaxScrollingSpeed));
+ qreal y = qMax(-MaxScrollingSpeed, qMin(m_speed.y(), MaxScrollingSpeed));
+
+ int sinceLast = m_lastFrameTime.elapsed();
+ int slowdown = (ScrollStep * sinceLast) + m_scrollSlowAccum;
+ m_scrollSlowAccum = slowdown & 0x3F;
+ slowdown >>= 6;
+
+ if (x > 0)
+ x= qMax(qreal(0.0), x - slowdown);
+ else
+ x = qMin(qreal(0.0), x + slowdown);
+
+ if (y > 0)
+ y = qMax(qreal(0.0), y - slowdown);
+ else
+ y = qMin(qreal(0.0), y + slowdown);
+
+ m_speed = QPoint(x,y);
+
+ if (m_speed != QPoint(0,0)) {
+ QPointF d;
+
+ int xstep = (int(m_speed.x()) * sinceLast)>>6; // >>6 ~= *60 /1000 (==*64 /1024)
+ int ystep = (int(m_speed.y()) * sinceLast)>>6;
+ //qDebug() << sinceLast << "speedy" << speed.y()<<"ystep" << ystep;
+ QPoint step = QPoint(xstep,ystep);
+
+ if (ystep > 0)
+ d = (m_scrollArea->pos() + step);
+ else
+ d = -(m_scrollArea->pos() - step);
+
+ ScrollBar *hscroll = m_scrollArea->horizontalScrollBar();
+ ScrollBar *vscroll = m_scrollArea->verticalScrollBar();
+
+ hscroll->setSliderPosition(hscroll->sliderPosition() - m_scrollFactor * d.x());
+ vscroll->setSliderPosition(vscroll->sliderPosition() - m_scrollFactor * d.y());
+ } else {
+ m_state = Stopped;
+ scrollOngoing = false;
+ }
+ }
+
+ m_lastFrameTime.restart();
+
+ if (!scrollOngoing)
+ m_scrollTimer.stop();
+}
+
+
+Scroller::Scroller(QObject *parent)
+ : QObject(parent), d_ptr(new ScrollerPrivate(this))
+{
+ Q_D(Scroller);
+ connect(&d->m_scrollTimer, SIGNAL(timeout()), this, SLOT(updateScrolling()));
+}
+
+Scroller::~Scroller()
+{
+ delete d_ptr;
+}
+
+void Scroller::setScrollable(AbstractScrollArea *area)
+{
+ Q_D(Scroller);
+
+ if (!area)
+ return;
+
+ d->m_scrollArea = area;
+}
+
+void Scroller::setScrollFactor(qreal scrollFactor)
+{
+ Q_D(Scroller);
+
+ d->m_scrollFactor = scrollFactor;
+}
+
+bool Scroller::eventFilter(QObject *obj, QEvent *event)
+{
+ Q_D(Scroller);
+ return d->eventFilter(obj, event);
+}
+
+void Scroller::stopScrolling()
+{
+ Q_D(Scroller);
+ d->stopScrolling();
+}
+#include "moc_scroller.cpp"
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller.h
new file mode 100644
index 0000000000..8f40dcfd16
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller.h
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SCROLLER_H
+#define SCROLLER_H
+
+#include <QObject>
+
+class ScrollerPrivate;
+class AbstractScrollArea;
+
+class Scroller : public QObject
+{
+ Q_OBJECT
+
+public:
+
+ Scroller(QObject *parent = 0);
+ virtual ~Scroller();
+
+public:
+
+ void setScrollable(AbstractScrollArea *area);
+ void setScrollFactor(qreal scrollFactor);
+ void stopScrolling();
+
+private:
+
+ bool eventFilter(QObject *obj, QEvent *ev);
+
+private:
+
+ Q_DECLARE_PRIVATE(Scroller)
+ Q_DISABLE_COPY(Scroller)
+
+ Q_PRIVATE_SLOT(d_ptr, void updateScrolling())
+
+ ScrollerPrivate * const d_ptr;
+};
+
+#endif // SCROLLER_H
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller_p.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller_p.h
new file mode 100644
index 0000000000..cf11c7fa02
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller_p.h
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SCROLLER_P_H
+#define SCROLLER_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QPoint>
+#include <QTimer>
+#include <QTime>
+
+#include "scroller.h"
+
+class AbstractScrollArea;
+
+class ScrollerPrivate
+{
+ Q_DECLARE_PUBLIC(Scroller)
+
+public:
+ enum State {
+ Stopped,
+ Started,
+ ManualScrolling,
+ AutoScrolling
+ };
+
+ ScrollerPrivate(Scroller *scroller);
+ ~ScrollerPrivate();
+ void stopScrolling();
+ bool eventFilter(QObject *obj, QEvent *ev);
+
+ AbstractScrollArea *m_scrollArea;
+ qreal m_scrollFactor;
+ QPoint m_cursorPos;
+ QPointF m_speed;
+ State m_state;
+ QTime m_lastCursorTime;
+ QTime m_lastFrameTime;
+ QTimer m_scrollTimer;
+ int m_scrollSlowAccum;
+
+private Q_SLOTS:
+
+ void updateScrolling();
+
+private:
+
+ Q_DISABLE_COPY(ScrollerPrivate)
+ Scroller * const q_ptr;
+ QPointF mapToScrollArea(const QPoint &point);
+ QWidget *m_eventViewport;
+};
+
+#endif // SCROLLER_P_H
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/settings.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/settings.cpp
new file mode 100644
index 0000000000..9cb44882a6
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/settings.cpp
@@ -0,0 +1,46 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "settings.h"
+
+
+Settings::Settings()
+ : QObject(),
+ m_scriptName(),
+ m_outputFileName(),
+ m_resultFormat(0),
+ m_size(0,0),
+ m_angle(0),
+ m_listItemCount(200),
+ m_options()
+{
+}
+
+Settings::~Settings()
+{
+}
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/settings.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/settings.h
new file mode 100644
index 0000000000..dc228162c4
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/settings.h
@@ -0,0 +1,103 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SETTINGS_H
+#define SETTINGS_H
+
+#include <QObject>
+#include <QSize>
+#include <QString>
+#include <QFlags>
+
+class Settings : public QObject {
+ Q_OBJECT
+
+public:
+ enum Option {
+ NoOptions = 0x1,
+ UseListItemCache = 0x2,
+ UseOpenGL = 0x4,
+ OutputFps = 0x8,
+ NoResourceUsage = 0x10,
+ ManualTest = 0x20
+ };
+ Q_DECLARE_FLAGS(Options, Option)
+
+ Settings();
+ ~Settings();
+
+ const QString &scriptName() const
+ { return m_scriptName; }
+ void setScriptName(const QString& scriptName)
+ { m_scriptName = scriptName; }
+
+ const QString &outputFileName() const
+ { return m_outputFileName; }
+ void setOutputFileName(const QString& outputFileName)
+ { m_outputFileName = outputFileName; }
+
+ int resultFormat() const
+ { return m_resultFormat; }
+ void setResultFormat(int resultFormat)
+ { m_resultFormat = resultFormat; }
+
+ const QSize& size() const
+ { return m_size; }
+ void setSize(const QSize& size)
+ { m_size = size; }
+
+ int angle() const
+ { return m_angle; }
+ void setAngle(int angle)
+ { m_angle = angle; }
+
+ const Options& options() const
+ { return m_options; }
+ void setOptions(Options options)
+ { m_options = options; }
+
+ int listItemCount()
+ { return m_listItemCount; }
+
+ void setListItemCount(int items)
+ { m_listItemCount = items; }
+
+private:
+
+ QString m_scriptName;
+ QString m_outputFileName;
+ int m_resultFormat;
+ QSize m_size;
+ int m_angle;
+ int m_listItemCount;
+ Options m_options;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(Settings::Options)
+
+#endif
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelist.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelist.cpp
new file mode 100644
index 0000000000..941cab8c21
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelist.cpp
@@ -0,0 +1,143 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QDebug>
+#include <QGraphicsLinearLayout>
+#include <QFont>
+#include <QTime>
+
+#include "simplelist.h"
+static const int MinItemWidth = 276;
+
+SimpleList::SimpleList(QGraphicsWidget *parent)
+ : GvbWidget(parent),
+ m_list(new ListWidget(this))
+{
+ QGraphicsLinearLayout *layout = new QGraphicsLinearLayout();
+ layout->setContentsMargins(0,0,0,0);
+ setContentsMargins(0,0,0,0);
+ setLayout(layout);
+ layout->addItem(m_list);
+ setObjectName("SimpleList");
+}
+
+/*virtual*/
+SimpleList::~SimpleList()
+{
+}
+
+void SimpleList::addItem(ListItem *item)
+{
+ item->setMinimumWidth(MinItemWidth);
+ m_list->addItem(item);
+}
+
+void SimpleList::insertItem(int index, ListItem *item)
+{
+ item->setMinimumWidth(MinItemWidth);
+ m_list->insertItem(index, item);
+}
+
+ListItem* SimpleList::takeItem(int row)
+{
+ return static_cast<ListItem*>(m_list->takeItem(row));
+}
+
+ListItem* SimpleList::itemAt(int row)
+{
+ return static_cast<ListItem*>(m_list->itemAt(row));
+}
+
+int SimpleList::itemCount() const
+{
+ if (m_list)
+ return m_list->itemCount();
+ return 0;
+}
+
+ScrollBar* SimpleList::verticalScrollBar() const
+{
+ if (m_list)
+ return m_list->verticalScrollBar();
+ return 0;
+}
+
+bool SimpleList::listItemCaching() const
+{
+ return m_list->listItemCaching();
+}
+
+void SimpleList::setListItemCaching(bool enable)
+{
+ m_list->setListItemCaching(enable);
+}
+
+void SimpleList::keyPressEvent(QKeyEvent *event)
+{
+ static QTime keyPressInterval = QTime::currentTime();
+ static qreal step = 0.0;
+ static bool repeat = false;
+ int interval = keyPressInterval.elapsed();
+
+ ScrollBar* sb = verticalScrollBar();
+ qreal currentValue = sb->sliderPosition();
+
+ if(interval < 250 ) {
+ if(!repeat) step = 0.0;
+ step = step + 2.0;
+ if(step > 100) step = 100;
+ repeat = true;
+ }
+ else {
+ step = 1.0;
+ if(itemAt(0))
+ step = itemAt(0)->size().height();
+ repeat = false;
+ }
+
+ if(event->key() == Qt::Key_Up ) { //Up Arrow
+ sb->setSliderPosition(currentValue - step);
+ }
+
+ if(event->key() == Qt::Key_Down ) { //Down Arrow
+ sb->setSliderPosition(currentValue + step);
+ }
+ keyPressInterval.start();
+}
+
+
+void SimpleList::setTwoColumns(const bool twoColumns)
+{
+ m_list->setTwoColumns(twoColumns);
+}
+
+bool SimpleList::twoColumns()
+{
+ return m_list->twoColumns();
+}
+
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelist.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelist.h
new file mode 100644
index 0000000000..3c1ec4f82a
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelist.h
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SIMPLELIST_H_
+#define SIMPLELIST_H_
+
+
+#include "gvbwidget.h"
+#include "listitem.h"
+#include "listwidget.h"
+
+class QGraphicsWidget;
+
+class SimpleList : public GvbWidget
+{
+ Q_OBJECT
+
+public:
+ SimpleList(QGraphicsWidget *parent=0);
+ virtual ~SimpleList();
+ void addItem(ListItem *item);
+ void insertItem(int index, ListItem *item);
+ ListItem* takeItem(int row);
+ ListItem* itemAt(int row);
+ int itemCount() const;
+ virtual void keyPressEvent(QKeyEvent *event);
+ bool listItemCaching() const;
+ void setListItemCaching(bool enable);
+
+ void setTwoColumns(const bool twoColumns);
+ bool twoColumns();
+
+public slots:
+ ScrollBar* verticalScrollBar() const;
+
+private:
+ Q_DISABLE_COPY(SimpleList)
+
+ ListWidget *m_list;
+};
+
+#endif /* LISTTEST_H_ */
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelistview.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelistview.cpp
new file mode 100644
index 0000000000..67f34859c1
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelistview.cpp
@@ -0,0 +1,463 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui>
+
+#include "simplelistview.h"
+#include "scrollbar.h"
+#include "simplelistview.h"
+#include "scrollbar.h"
+#include "listitem.h"
+#include "listitemcache.h"
+#include "theme.h"
+
+class SimpleListViewPrivate
+{
+ Q_DECLARE_PUBLIC(SimpleListView)
+
+public:
+
+ SimpleListViewPrivate(SimpleListView *button)
+ : m_content(0)
+ , m_layout(0)
+ , m_twoColumns(false)
+ , q_ptr(button)
+ , m_listItemCaching(false)
+ {
+ Q_Q(SimpleListView);
+
+ m_layout = new QGraphicsGridLayout();
+ m_layout->setContentsMargins(0, 0, 0, 0);
+ m_layout->setSpacing(0);
+ m_layout->setColumnSpacing(0,0);
+ m_layout->setColumnSpacing(1,0);
+ m_layout->setRowSpacing(0,0);
+ m_layout->setRowSpacing(1,0);
+ m_content = new QGraphicsWidget;
+ m_content->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ m_content->setParentItem(q->viewport());
+ m_content->setLayout(m_layout);
+
+ q->horizontalScrollBar()->setSliderSize(0.0);
+
+ QObject::connect(Theme::p(), SIGNAL(themeChanged()), q, SLOT(themeChange()));
+ }
+
+ ~SimpleListViewPrivate()
+ {
+ if (!m_content->parentItem() && !m_content->parent())
+ delete m_content;
+ }
+
+ void resizeContents(QSizeF s)
+ {
+ Q_UNUSED(s);
+ Q_Q(SimpleListView);
+
+ if (!m_content)
+ return;
+
+ const bool caching = q->listItemCaching();
+ q->setListItemCaching(false);
+
+ m_content->resize(q->viewport()->size().width(),
+ m_layout->preferredHeight());
+ const bool clip =
+ m_content->size().width() > q->viewport()->size().width()
+ || m_content->size().height() > q->viewport()->size().height();
+
+ q->viewport()->setFlag(
+ QGraphicsItem::ItemClipsChildrenToShape, clip);
+
+ q->setListItemCaching(caching);
+ }
+
+ void resizeScrollBars()
+ {
+ Q_Q(SimpleListView);
+
+ if (!m_content)
+ return;
+
+ m_content->resize(m_content->size().width(),
+ m_layout->preferredHeight());
+
+ QRectF contentRect = m_content->boundingRect();
+ QRectF listRect = q->boundingRect();
+
+ // List do not have horizontal scroll bar visible.
+ q->horizontalScrollBar()->setSliderSize(0.0);
+
+ if (contentRect.height()-q->boundingRect().height() > 0) {
+ q->verticalScrollBar()->setSliderSize(contentRect.height()-q->boundingRect().height());
+ if (q->verticalScrollBarPolicy() != Qt::ScrollBarAlwaysOff &&
+ !q->verticalScrollBar()->isVisible()) {
+ q->verticalScrollBar()->show();
+ }
+ }
+ else if (q->verticalScrollBarPolicy() == Qt::ScrollBarAsNeeded ||
+ q->verticalScrollBarPolicy() == Qt::ScrollBarAlwaysOff) {
+ q->verticalScrollBar()->setSliderSize(0.0);
+ q->verticalScrollBar()->hide();
+ }
+ else {
+ q->verticalScrollBar()->setSliderSize(0.0);
+ }
+
+ qreal pos = 0.0;
+ if ((m_content->boundingRect().height() - q->boundingRect().height()) != 0) {
+ qreal min = qMin(-contentRect.top(), m_content->pos().y());
+ qreal diff = contentRect.height() - listRect.height();
+ pos = qAbs(contentRect.top() + min) / diff;
+ }
+
+ q->verticalScrollBar()->setSliderPosition(pos);
+ }
+
+ void updateListContents()
+ {
+ Q_Q(SimpleListView);
+
+ const bool caching = q->listItemCaching();
+ q->setListItemCaching(false);
+
+ const QString defaultIcon = Theme::p()->pixmapPath()+"contact_default_icon.svg";
+ const int itemCount = m_layout->count();
+
+ for (int i=0; i<itemCount; ++i) {
+ ListItem* item = static_cast<ListItem*>(m_layout->itemAt(i));
+
+ // Update default icons
+ const QString filename = item->icon(ListItem::LeftIcon)->fileName();
+ if (filename.contains("contact_default_icon")) {
+ item->icon(ListItem::LeftIcon)->setFileName(defaultIcon);
+ }
+
+ // Update status icons
+ QString statusIcon = item->icon(ListItem::RightIcon)->fileName();
+ const int index = statusIcon.indexOf("contact_status");
+ if (index != -1) {
+ statusIcon.remove(0, index);
+ item->icon(ListItem::RightIcon)->setFileName(Theme::p()->pixmapPath()+statusIcon);
+ }
+
+ // Update fonts
+ item->setFont(Theme::p()->font(Theme::ContactName), ListItem::FirstPos);
+ item->setFont(Theme::p()->font(Theme::ContactNumber), ListItem::SecondPos);
+ item->setFont(Theme::p()->font(Theme::ContactEmail), ListItem::ThirdPos);
+
+ // Update list dividers
+ if (i%2) {
+ item->setBackgroundBrush(Theme::p()->listItemBackgroundBrushOdd());
+ item->setBackgroundOpacity(Theme::p()->listItemBackgroundOpacityOdd());
+ }
+ else {
+ item->setBackgroundBrush(Theme::p()->listItemBackgroundBrushEven());
+ item->setBackgroundOpacity(Theme::p()->listItemBackgroundOpacityEven());
+ }
+
+ // Update borders
+ item->setBorderPen(Theme::p()->listItemBorderPen());
+ item->setRounding(Theme::p()->listItemRounding());
+
+ // Update icons
+ item->icon(ListItem::LeftIcon)->setRotation(Theme::p()->iconRotation(ListItem::LeftIcon));
+ item->icon(ListItem::RightIcon)->setRotation(Theme::p()->iconRotation(ListItem::RightIcon));
+ item->icon(ListItem::LeftIcon)->setOpacityEffectEnabled(Theme::p()->isIconOpacityEffectEnabled(ListItem::LeftIcon));
+ item->icon(ListItem::RightIcon)->setOpacityEffectEnabled(Theme::p()->isIconOpacityEffectEnabled(ListItem::RightIcon));
+ item->icon(ListItem::LeftIcon)->setSmoothTransformationEnabled(Theme::p()->isIconSmoothTransformationEnabled(ListItem::LeftIcon));
+ item->icon(ListItem::RightIcon)->setSmoothTransformationEnabled(Theme::p()->isIconSmoothTransformationEnabled(ListItem::RightIcon));
+ }
+ q->setListItemCaching(caching);
+ }
+
+ void updateListItemBackgrounds(int index)
+ {
+ Q_Q(SimpleListView);
+
+ const bool caching = q->listItemCaching();
+ q->setListItemCaching(false);
+
+ const int itemCount = m_layout->count();
+
+ for (int i=index; i<itemCount; ++i) {
+ ListItem* item = static_cast<ListItem*>(m_layout->itemAt(i));
+ if (i%2) {
+ item->setBackgroundBrush(Theme::p()->listItemBackgroundBrushOdd());
+ item->setBackgroundOpacity(Theme::p()->listItemBackgroundOpacityOdd());
+ }
+ else {
+ item->setBackgroundBrush(Theme::p()->listItemBackgroundBrushEven());
+ item->setBackgroundOpacity(Theme::p()->listItemBackgroundOpacityEven());
+ }
+ }
+
+ q->setListItemCaching(caching);
+ }
+
+ void setTwoColumns(const bool twoColumns)
+ {
+ if(twoColumns == m_twoColumns)
+ return;
+
+ Q_Q(SimpleListView);
+ m_twoColumns = twoColumns;
+
+ bool cache = q->listItemCaching();
+ q->setListItemCaching(false);
+
+ QList<QGraphicsLayoutItem *> moveditems;
+ if(twoColumns) {
+ int half = m_layout->count()/2;
+ for (int i = m_layout->count()-1; i>=half; --i) {
+ QGraphicsLayoutItem *item = m_layout->itemAt(i);
+ m_layout->removeAt(i);
+ moveditems.append(item);
+ }
+ for ( int i = 0; i < moveditems.count(); ++i)
+ m_layout->addItem(moveditems.at(i), i, 1);
+
+ m_layout->setColumnSpacing(0,0);
+ m_layout->setColumnSpacing(1,0);
+ m_layout->setRowSpacing(0,0);
+ m_layout->setRowSpacing(1,0);
+ }
+ else {
+ int count = m_layout->count()/2;
+ for (int i = m_layout->count()-1; i>=0; --i) {
+ if (i >= count)
+ moveditems.append(m_layout->itemAt(i));
+ else
+ moveditems.insert(moveditems.begin(), m_layout->itemAt(i));
+ m_layout->removeAt(i);
+ }
+ for (int i = 0; i<moveditems.count(); ++i) {
+ m_layout->addItem(moveditems.at(i), m_layout->count(), 0);
+ }
+ }
+
+ resizeContents(q->size());
+ resizeScrollBars();
+
+ q->setListItemCaching(cache);
+ }
+
+ bool twoColumns()
+ {
+ return m_twoColumns;
+ }
+
+ QGraphicsWidget *m_content;
+ QGraphicsGridLayout *m_layout;
+ bool m_twoColumns;
+ SimpleListView *q_ptr;
+ bool m_listItemCaching;
+};
+
+SimpleListView::SimpleListView(QGraphicsWidget *parent)
+ : AbstractScrollArea(parent)
+ , d_ptr(new SimpleListViewPrivate(this))
+{
+ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ setContentsMargins(0, 0, 0, 0);
+ verticalScrollBar()->hide();
+ horizontalScrollBar()->hide();
+}
+
+SimpleListView::~SimpleListView()
+{
+ Q_D(SimpleListView);
+
+ if (d->m_content) {
+ d->m_content->setParentItem(0);
+ }
+
+ delete d_ptr;
+}
+
+void SimpleListView::addItem(QGraphicsWidget *item)
+{
+ Q_D(SimpleListView);
+
+ Q_ASSERT(item);
+
+ insertItem(d->m_layout->count(), item);
+}
+
+void SimpleListView::insertItem(int index, QGraphicsWidget *item)
+{
+ Q_D(SimpleListView);
+
+ // Grid layout doe not have insert item method.
+ // We need to first remove all items, add new item and
+ // append old items to layout.
+ QList<QGraphicsLayoutItem *> moveditems;
+
+ for (int i = d->m_layout->count()-1; i >= index; --i) {
+ moveditems.append(d->m_layout->itemAt(i));
+ d->m_layout->removeAt(i);
+ }
+ moveditems.append(item);
+
+ for (int i = moveditems.count()-1; i>=0; --i) {
+ d->m_layout->addItem(moveditems.at(i), d->m_layout->count(), 0);
+ }
+
+ ListItemCache *cache = new ListItemCache;
+ item->setGraphicsEffect(cache);
+ cache->setEnabled(listItemCaching());
+
+ d->resizeScrollBars();
+ d->updateListItemBackgrounds(index);
+}
+
+QGraphicsWidget *SimpleListView::takeItem(int index)
+{
+ Q_D(SimpleListView);
+
+ QGraphicsWidget *item = 0;
+
+ if (index >= 0 && d->m_layout->count() > index) {
+ QList<QGraphicsLayoutItem *> moveditems;
+ for (int i = d->m_layout->count()-1; i >=0; --i) {
+ if (index != i)
+ moveditems.insert(moveditems.begin(), d->m_layout->itemAt(i));
+ else {
+ item = static_cast<QGraphicsWidget*>(d->m_layout->itemAt(index));
+ item->setGraphicsEffect(0);
+ }
+
+ d->m_layout->removeAt(i);
+ }
+
+ for (int i = 0; i < moveditems.count(); ++i)
+ d->m_layout->addItem(moveditems.at(i), d->m_layout->count(), 0);
+ }
+ d->resizeScrollBars();
+ return item;
+}
+
+QGraphicsWidget *SimpleListView::itemAt(int row)
+{
+ Q_D(SimpleListView);
+
+ QGraphicsWidget *item = 0;
+
+ if (row >= 0 && d->m_layout->count() > row) {
+ item = static_cast<QGraphicsWidget*>(d->m_layout->itemAt(row));
+ }
+
+ return item;
+}
+
+int SimpleListView::itemCount()
+{
+ Q_D(SimpleListView);
+ return d->m_layout->count();
+}
+
+bool SimpleListView::listItemCaching() const
+{
+ Q_D(const SimpleListView);
+ return d->m_listItemCaching;
+}
+
+void SimpleListView::setListItemCaching(bool enabled)
+{
+ Q_D(SimpleListView);
+
+ if (d->m_listItemCaching == enabled)
+ return;
+
+ d->m_listItemCaching = enabled;
+
+ for (int i = 0; i < d->m_layout->count(); ++i) {
+ ListItem *item = static_cast<ListItem*>(d->m_layout->itemAt(i));
+ ListItemCache *cache = static_cast<ListItemCache *>(
+ item->graphicsEffect());
+ cache->setEnabled(enabled);
+ }
+}
+
+void SimpleListView::scrollContentsBy(qreal dx, qreal dy)
+{
+ Q_D(SimpleListView);
+ Q_UNUSED(dx)
+ QRectF contentRect = d->m_content->boundingRect();
+ QRectF viewportRect = viewport()->boundingRect();
+ QPointF contentPos = d->m_content->pos();
+
+ qreal newy = contentPos.y() - dy;
+ qreal miny = qMin(qreal(0.0), -(contentRect.height() - viewportRect.height()));
+
+ if (newy < miny)
+ newy = miny;
+ else if (newy > 0)
+ newy = 0.0;
+
+ d->m_content->setPos(contentPos.x(), newy);
+}
+
+void SimpleListView::resizeEvent(QGraphicsSceneResizeEvent *event)
+{
+ Q_D(SimpleListView);
+
+ AbstractScrollArea::resizeEvent(event);
+ d->resizeContents(event->newSize());
+ d->resizeScrollBars();
+}
+
+QSizeF SimpleListView::sizeHint(Qt::SizeHint which, const QSizeF & constraint) const
+{
+ Q_D(const SimpleListView);
+
+ if (which == Qt::PreferredSize)
+ return d->m_content->size();
+
+ return AbstractScrollArea::sizeHint(which, constraint);
+}
+
+void SimpleListView::themeChange()
+{
+ Q_D(SimpleListView);
+
+ d->updateListContents();
+ d->resizeScrollBars();
+}
+
+void SimpleListView::setTwoColumns(const bool twoColumns)
+{
+ Q_D(SimpleListView);
+ d->setTwoColumns(twoColumns);
+}
+
+bool SimpleListView::twoColumns()
+{
+ Q_D(SimpleListView);
+ return d->twoColumns();
+}
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelistview.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelistview.h
new file mode 100644
index 0000000000..ad606cda8f
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelistview.h
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SIMPLELISTVIEW_H
+#define SIMPLELISTVIEW_H
+
+#include "scrollbar.h"
+#include "abstractscrollarea.h"
+
+class SimpleListViewPrivate;
+
+class SimpleListView : public AbstractScrollArea
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(SimpleListView)
+
+public:
+
+ SimpleListView(QGraphicsWidget *parent = 0);
+ virtual ~SimpleListView();
+
+public:
+
+ void addItem(QGraphicsWidget *item);
+ void insertItem(int index, QGraphicsWidget *item);
+ QGraphicsWidget* takeItem(int row);
+ QGraphicsWidget* itemAt(int row);
+ int itemCount();
+ void updateListContents();
+
+ void setTwoColumns(const bool twoColumns);
+ bool twoColumns();
+
+public slots:
+
+ void themeChange();
+ bool listItemCaching() const;
+ void setListItemCaching(bool enabled);
+
+protected:
+
+ virtual void scrollContentsBy(qreal dx, qreal dy);
+ void resizeEvent(QGraphicsSceneResizeEvent *event);
+ QSizeF sizeHint(Qt::SizeHint which,
+ const QSizeF & constraint) const;
+
+private:
+
+ SimpleListViewPrivate *d_ptr;
+};
+
+#endif
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/theme.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/theme.cpp
new file mode 100644
index 0000000000..06851b0fd8
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/theme.cpp
@@ -0,0 +1,223 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QDebug>
+#include <QPainter>
+#include <QPixmapCache>
+#include <QSvgRenderer>
+
+#include "theme.h"
+
+Q_DECLARE_METATYPE(Theme::Themes*)
+
+Theme::Theme(QObject *parent)
+ : QObject(parent)
+ , m_currentTheme()
+ , m_availableThemes()
+ , m_fonts()
+ , m_pixmapPath()
+ , m_listItemBackgroundBrushEven()
+ , m_listItemBackgroundOpacityEven()
+ , m_listItemBackgroundBrushOdd()
+ , m_listItemBackgroundOpacityOdd()
+ , m_listItemBorderPen(QPen())
+ , m_listItemRounding()
+ , m_iconOpacityEffectEnabled()
+ , m_iconRotation()
+ , m_iconSmoothTransformation()
+{
+ m_availableThemes << "Blue" << "Lime";
+
+ // Set blue theme as a default theme without emiting themeChanged() signal
+ setBlueTheme();
+}
+
+Theme::~Theme()
+{
+}
+
+Theme* Theme::p()
+{
+ static Theme t;
+ return &t;
+}
+
+void Theme::setTheme(const QString theme)
+{
+ if (theme.compare("blue", Qt::CaseInsensitive) == 0)
+ {
+ setTheme(Theme::Blue);
+ }
+ else if (theme.compare("lime", Qt::CaseInsensitive) == 0)
+ {
+ setTheme(Theme::Lime);
+ }
+ else
+ {
+ qDebug() << "Unknown theme";
+ }
+}
+
+void Theme::setTheme(const Themes theme)
+{
+ if (m_currentTheme == theme)
+ return;
+
+ switch (theme)
+ {
+ case Theme::Blue:
+ setBlueTheme();
+ emit themeChanged();
+ break;
+
+ case Theme::Lime:
+ setLimeTheme();
+ emit themeChanged();
+ break;
+ }
+}
+
+void Theme::setBlueTheme()
+{
+ m_currentTheme = Theme::Blue;
+
+ m_fonts[ContactName].setFamily("Arial");
+ m_fonts[ContactName].setPixelSize(16);
+ m_fonts[ContactName].setStyle(QFont::StyleNormal);
+ m_fonts[ContactName].setWeight(QFont::Normal);
+
+ m_fonts[ContactNumber].setFamily("Arial");
+ m_fonts[ContactNumber].setPixelSize(14);
+ m_fonts[ContactNumber].setStyle(QFont::StyleNormal);
+
+ m_fonts[ContactEmail].setFamily("Arial");
+ m_fonts[ContactEmail].setPixelSize(14);
+ m_fonts[ContactEmail].setStyle(QFont::StyleNormal);
+
+ m_fonts[TitleBar].setFamily("Arial");
+ m_fonts[TitleBar].setPixelSize(36);
+ m_fonts[TitleBar].setStyle(QFont::StyleNormal);
+
+ m_fonts[StatusBar].setFamily("Arial");
+ m_fonts[StatusBar].setPixelSize(16);
+ m_fonts[StatusBar].setStyle(QFont::StyleNormal);
+
+ m_fonts[MenuItem].setFamily("Arial");
+ m_fonts[MenuItem].setPixelSize(14);
+ m_fonts[MenuItem].setStyle(QFont::StyleNormal);
+
+ m_pixmapPath = ":/themes/blue/";
+
+ m_listItemBackgroundBrushEven = QBrush(Qt::NoBrush);
+ m_listItemBackgroundOpacityEven = 1.0;
+ m_listItemBackgroundBrushOdd = QBrush(QColor(44,214,250), Qt::SolidPattern);
+ m_listItemBackgroundOpacityOdd = 1.0;
+
+ m_listItemBorderPen = QPen(Qt::NoPen);
+ m_listItemRounding = QSize(0.0, 0.0);
+
+ m_iconOpacityEffectEnabled[ListItem::LeftIcon] = false;
+ m_iconOpacityEffectEnabled[ListItem::RightIcon] = false;
+
+ m_iconRotation[ListItem::LeftIcon] = 0.0;
+ m_iconRotation[ListItem::RightIcon] = 0.0;
+
+ m_iconSmoothTransformation[ListItem::LeftIcon] = false;
+ m_iconSmoothTransformation[ListItem::RightIcon] = false;
+}
+
+void Theme::setLimeTheme()
+{
+ m_currentTheme = Theme::Lime;
+
+ m_fonts[ContactName].setFamily("Arial");
+ m_fonts[ContactName].setPixelSize(16);
+ m_fonts[ContactName].setStyle(QFont::StyleItalic);
+ m_fonts[ContactName].setWeight(QFont::Bold);
+
+ m_fonts[ContactNumber].setFamily("Arial");
+ m_fonts[ContactNumber].setPixelSize(14);
+ m_fonts[ContactNumber].setStyle(QFont::StyleItalic);
+
+ m_fonts[ContactEmail].setFamily("Arial");
+ m_fonts[ContactEmail].setPixelSize(14);
+ m_fonts[ContactEmail].setStyle(QFont::StyleItalic);
+
+ m_fonts[TitleBar].setFamily("Arial");
+ m_fonts[TitleBar].setPixelSize(36);
+ m_fonts[TitleBar].setStyle(QFont::StyleItalic);
+
+ m_fonts[StatusBar].setFamily("Arial");
+ m_fonts[StatusBar].setPixelSize(16);
+ m_fonts[StatusBar].setStyle(QFont::StyleItalic);
+
+ m_fonts[MenuItem].setFamily("Arial");
+ m_fonts[MenuItem].setPixelSize(14);
+ m_fonts[MenuItem].setStyle(QFont::StyleItalic);
+
+ m_pixmapPath = ":/themes/lime/";
+
+ m_listItemBackgroundBrushEven = QBrush(QPixmap(":/avatars/avatar_014.png"));
+ m_listItemBackgroundOpacityEven = 0.05;
+
+ m_listItemBackgroundBrushOdd = QBrush(QPixmap(":/avatars/avatar_012.png"));
+ m_listItemBackgroundOpacityOdd = 0.15;
+
+ m_listItemBorderPen = QPen(QColor(0,0,0,55), 3, Qt::SolidLine);
+ m_listItemRounding = QSize(12.0, 12.0);
+
+ m_iconOpacityEffectEnabled[ListItem::LeftIcon] = true;
+ m_iconOpacityEffectEnabled[ListItem::RightIcon] = false;
+
+ m_iconRotation[ListItem::LeftIcon] = -4.0;
+ m_iconRotation[ListItem::RightIcon] = 0.0;
+
+ m_iconSmoothTransformation[ListItem::LeftIcon] = true;
+ m_iconSmoothTransformation[ListItem::RightIcon] = false;
+}
+
+QPixmap Theme::pixmap(const QString filename, QSize size)
+{
+ if (filename.endsWith(".svg", Qt::CaseInsensitive))
+ {
+ QSvgRenderer doc(m_pixmapPath+filename);
+ if (size == QSize(0,0))
+ size = doc.defaultSize();
+ QPixmap pix(size.width(),size.height());
+ pix.fill(Qt::transparent);
+ QPainter painter(&pix);
+ painter.setViewport(0, 0, size.width(), size.height());
+ doc.render(&painter);
+ return pix;
+ }
+ else
+ {
+ QPixmap pix(m_pixmapPath+filename);
+ return pix.scaled(size);
+ }
+}
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/theme.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/theme.h
new file mode 100644
index 0000000000..4aafd0c288
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/theme.h
@@ -0,0 +1,118 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef THEME_H
+#define THEME_H
+
+#include <QPen>
+#include <QPainter>
+
+#include "gvbwidget.h"
+#include "listitem.h"
+
+class Theme : public QObject
+{
+ Q_OBJECT
+
+public:
+ enum Themes
+ {
+ Blue = 0,
+ Lime = 1,
+ };
+
+ enum Fonts
+ {
+ ContactName,
+ ContactNumber,
+ ContactEmail,
+ TitleBar,
+ StatusBar,
+ MenuItem,
+ };
+
+ virtual ~Theme();
+
+ static Theme* p();
+
+ void setTheme(const QString theme);
+ void setTheme(const Themes theme);
+
+ Themes theme() const { return m_currentTheme; }
+ QString currentThemeName() { return m_availableThemes.at(m_currentTheme); }
+ QStringList themes() const { return m_availableThemes; }
+ int themesCount() const { return m_availableThemes.count(); }
+
+ QPixmap pixmap(const QString filename = "", QSize size = QSize(0,0));
+ QFont font(Fonts type) const { return m_fonts[type]; }
+ QString pixmapPath() const { return m_pixmapPath; }
+
+ QBrush listItemBackgroundBrushEven() const { return m_listItemBackgroundBrushEven; }
+ QBrush listItemBackgroundBrushOdd() const { return m_listItemBackgroundBrushOdd; }
+ qreal listItemBackgroundOpacityEven() const { return m_listItemBackgroundOpacityEven; }
+ qreal listItemBackgroundOpacityOdd() const { return m_listItemBackgroundOpacityOdd; }
+
+ QPen listItemBorderPen() const { return m_listItemBorderPen; }
+ QSize listItemRounding() const { return m_listItemRounding; }
+
+ bool isIconOpacityEffectEnabled(const ListItem::IconItemPos iconPos) const { return m_iconOpacityEffectEnabled[iconPos]; }
+
+ qreal iconRotation(const ListItem::IconItemPos iconPos) const { return m_iconRotation[iconPos]; }
+ bool isIconSmoothTransformationEnabled(const ListItem::IconItemPos iconPos) const { return m_iconSmoothTransformation[iconPos]; }
+
+signals:
+ void themeChanged();
+
+private:
+ Theme(QObject *parent = 0);
+
+ void setBlueTheme();
+ void setLimeTheme();
+
+private:
+ Q_DISABLE_COPY(Theme)
+
+ Themes m_currentTheme;
+ QStringList m_availableThemes;
+ QHash<Fonts, QFont> m_fonts;
+ QString m_pixmapPath;
+
+ QBrush m_listItemBackgroundBrushEven;
+ qreal m_listItemBackgroundOpacityEven;
+ QBrush m_listItemBackgroundBrushOdd;
+ qreal m_listItemBackgroundOpacityOdd;
+
+ QPen m_listItemBorderPen;
+ QSize m_listItemRounding;
+
+ QHash<ListItem::IconItemPos, bool> m_iconOpacityEffectEnabled;
+ QHash<ListItem::IconItemPos, qreal> m_iconRotation;
+ QHash<ListItem::IconItemPos, bool> m_iconSmoothTransformation;
+};
+
+#endif // THEME_H
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/themeevent.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/themeevent.cpp
new file mode 100644
index 0000000000..1209b4a0f7
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/themeevent.cpp
@@ -0,0 +1,40 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "themeevent.h"
+
+ThemeEvent::ThemeEvent( const QString &newTheme, Type type) : QEvent(type),
+ m_theme(newTheme)
+{
+
+}
+
+ThemeEvent::~ThemeEvent()
+{
+
+}
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/themeevent.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/themeevent.h
new file mode 100644
index 0000000000..4ae63d8755
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/themeevent.h
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef __THEMEEVENT_H__
+#define __THEMEEVENT_H__
+
+#include <QEvent>
+#include <QString>
+
+static QEvent::Type ThemeEventType = (QEvent::Type) 1010;
+
+class ThemeEvent : public QEvent
+{
+public:
+ explicit ThemeEvent(const QString &newTheme, QEvent::Type type = ThemeEventType );
+ ~ThemeEvent();
+
+public:
+ inline QString getTheme() { return m_theme; }
+
+private:
+ QString m_theme;
+};
+
+
+#endif /* __THEMEEVENT_H__ */
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/topbar.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/topbar.cpp
new file mode 100644
index 0000000000..7c3d97b859
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/topbar.cpp
@@ -0,0 +1,346 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QGraphicsView>
+#include <QStyleOptionGraphicsItem>
+#include <QGraphicsSceneResizeEvent>
+#include <QPixmap>
+#include <QFont>
+
+#include "themeevent.h"
+#include "theme.h"
+#include "topbar.h"
+#include "mainview.h"
+
+TopBar::TopBar(QGraphicsView* mainView, QGraphicsWidget* parent) :
+ GvbWidget(parent), m_mainView(mainView), m_isLimeTheme(false),
+ m_orientation(TopBar::None), m_topBarPixmap(), m_sizesBlue(), m_sizesLime()
+{
+ setDefaultSizes();
+
+ m_titleFont = Theme::p()->font(Theme::TitleBar);
+ m_statusFont = Theme::p()->font(Theme::StatusBar);
+
+ connect(Theme::p(), SIGNAL(themeChanged()), this, SLOT(themeChange()));
+}
+
+TopBar::~TopBar()
+{
+}
+
+void TopBar::resizeEvent(QGraphicsSceneResizeEvent* /*event*/)
+{
+ //Check orientation
+ QString topbarName;
+ QSize mainViewSize = m_mainView->size();
+ int rotationAngle = static_cast<MainView*>(m_mainView)->rotationAngle();
+ if(rotationAngle == 90 || rotationAngle == 270 ) {
+ int wd = mainViewSize.width();
+ int ht = mainViewSize.height();
+ mainViewSize.setWidth(ht);
+ mainViewSize.setHeight(wd);
+ }
+ bool m_orientationChanged = false;
+ if(mainViewSize.height() >= mainViewSize.width()) {
+ if(m_orientation == TopBar::Landscape)
+ m_orientationChanged = true;
+ m_orientation = TopBar::Portrait;
+ topbarName = "topbar.svg";
+ }
+ else {
+ if(m_orientation == TopBar::Portrait)
+ m_orientationChanged = true;
+ m_orientation = TopBar::Landscape;
+ topbarName = "topbar_horisontal.svg";
+ }
+
+ //Calculate new size, resize by height, don't make it wider than the screen
+ QHash<QString, QSize>sizes = (Theme::p()->theme() == Theme::Blue) ?
+ m_sizesBlue : m_sizesLime;
+
+ //Get current size for topbarpixmap
+ QSize currentSize = !m_topBarPixmap.isNull() && !m_orientationChanged ?
+ m_topBarPixmap.size() : sizes[topbarName];
+ QSize newSize = !m_orientationChanged ? QSize(currentSize) : sizes[topbarName];
+
+ //Scale according to aspect ratio
+ newSize.scale(size().toSize(), Qt::KeepAspectRatio);
+
+ //fix width to window widht if previous scaling produced too narrow image
+ if(newSize.width() < size().width()) {
+ newSize.scale(size().toSize(), Qt::KeepAspectRatioByExpanding);
+ }
+
+ //Calculate scaling factor for rest of the graphics scaling
+ qreal scaleFactor = (newSize.width() *1.0) / (currentSize.width() * 1.0);
+
+ //Scale graphics, if the scalefactor applies
+ //This is really heavy since the SVG graphics are read again from the resource
+ if(scaleFactor != 1 || m_topBarPixmap.isNull() ) {
+ m_topBarPixmap = Theme::p()->pixmap(topbarName, newSize );
+ m_topBarUserIcon = Theme::p()->pixmap("user_default_icon.svg",
+ !m_topBarUserIcon.isNull() && !m_orientationChanged ? m_topBarUserIcon.size()* scaleFactor : sizes["user_default_icon.svg"] * scaleFactor);
+
+ m_topBarUserStatus = Theme::p()->pixmap("user_status_online.svg",
+ !m_topBarUserStatus.isNull() && !m_orientationChanged ? m_topBarUserStatus.size() * scaleFactor : sizes["user_status_online.svg"] * scaleFactor);
+
+ m_topBarStatusBarLeft = Theme::p()->pixmap("status_field_left.svg",
+ !m_topBarStatusBarLeft.isNull() && !m_orientationChanged ? m_topBarStatusBarLeft.size()* scaleFactor : sizes["status_field_left.svg"] * scaleFactor);
+
+ m_topBarStatusBarRight = Theme::p()->pixmap("status_field_right.svg",
+ !m_topBarStatusBarRight.isNull() && !m_orientationChanged ? m_topBarStatusBarRight.size()* scaleFactor : sizes["status_field_right.svg"] * scaleFactor);
+
+ m_topBarStatusBarMiddle = Theme::p()->pixmap("status_field_middle.svg",
+ !m_topBarStatusBarMiddle.isNull() && !m_orientationChanged ? m_topBarStatusBarMiddle.size() * scaleFactor : QSize(185, sizes["status_field_middle.svg"].height()) * scaleFactor);
+
+ //Update the sizeHint to match the size of the scaled m_topBarPixmap
+ updateGeometry();
+
+ //Point Update - Positions relative to the Top Bar "Backgroud" size.
+ //TODO: consider some layout instead of calculating relative locations
+ QSize topBarPixmapSize = m_topBarPixmap.size();
+ QSize topBarUserIconSize = m_topBarUserIcon.size();
+ QSize topBarUserStatusSize = m_topBarUserStatus.size();
+ QSize topBarStatusBarLeftSize = m_topBarStatusBarLeft.size();
+ QSize topBarStatusBarMiddleSize = m_topBarStatusBarMiddle.size();
+
+ //Location for Title text 5% width, 35% height of the background pixmap
+ m_topBarTitlePoint = QPoint(topBarPixmapSize.width()* 0.05,
+ topBarPixmapSize.height() * 0.35);
+
+ //User Icon location
+ //Placing 70% of the width and 10% of the height of the top bar background
+ m_topBarUserIconPoint = QPoint((topBarPixmapSize.width() * 0.7), (topBarPixmapSize.height() * 0.1));
+
+ //If Blue theme is in use - position user status icon on the right side of the user icon
+ if(!m_isLimeTheme) {
+ //Place the status icon on top of the right edge of the user icon, lower it by 35% of the height of the user icon
+ m_topBarUserStatusPoint = QPoint( ( (m_topBarUserIconPoint.x()+topBarUserIconSize.width() ) -
+ ( topBarUserStatusSize.width()/2 )),
+ (m_topBarUserIconPoint.y() + (topBarUserIconSize.height() * 0.35 )));
+ }
+ //If Lime theme is in use - position user status icon on the left side of the user icon
+ else {
+ //Place the status icon on top of the left side of the user icon, lower it by 50% of the height of the user icon
+ //and move left by 5% of the icon
+ m_topBarUserStatusPoint = QPoint( m_topBarUserIconPoint.x() + ( topBarUserIconSize.width() * 0.05),
+ (m_topBarUserIconPoint.y() + (topBarUserIconSize.height() * 0.5 )));
+ }
+
+ //Status bar
+ //Placing the left side of the status bar 5% of the width, 50% of the height of the top bar background
+ //Set the text baseline 80% of the height of the status bar
+ m_topBarStatusBarLeftPoint = QPoint( (topBarPixmapSize.width()* 0.05),
+ (topBarPixmapSize.height() * 0.5));
+ m_topBarStatusBarMiddlePoint = QPoint( (m_topBarStatusBarLeftPoint.x() + topBarStatusBarLeftSize.width()),
+ (m_topBarStatusBarLeftPoint.y()));
+ m_topBarStatusBarRightPoint = QPoint( (m_topBarStatusBarMiddlePoint.x() + topBarStatusBarMiddleSize.width()),
+ (m_topBarStatusBarMiddlePoint.y() ) );
+ m_topBarStatusBarTextPoint = QPoint(m_topBarStatusBarMiddlePoint.x(),
+ m_topBarStatusBarMiddlePoint.y() + (topBarStatusBarMiddleSize.height()*0.8) );
+ } //if scalefactor
+}
+
+void TopBar::paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget */*widget*/ )
+{
+ //Topbar background
+ painter->drawPixmap(option->exposedRect, m_topBarPixmap, option->exposedRect);
+
+ //User Icon
+ painter->drawPixmap(m_topBarUserIconPoint, m_topBarUserIcon);
+
+ //User Status
+ painter->drawPixmap(m_topBarUserStatusPoint, m_topBarUserStatus);
+
+ //Status bar
+ painter->drawPixmap(m_topBarStatusBarLeftPoint, m_topBarStatusBarLeft);
+ painter->drawPixmap(m_topBarStatusBarMiddlePoint, m_topBarStatusBarMiddle);
+ painter->drawPixmap(m_topBarStatusBarRightPoint, m_topBarStatusBarRight);
+
+ //Title text
+ painter->save();
+ painter->setFont(m_titleFont);
+ painter->setOpacity(0.7);
+ painter->setPen(Qt::white);
+ painter->drawText(m_topBarTitlePoint, QString("Contacts") );
+ //Status text
+ painter->setFont(m_statusFont);
+ painter->setOpacity(1.0);
+ painter->drawText(m_topBarStatusBarTextPoint, QString("My Status (fixed)") );
+ painter->restore();
+}
+
+QRectF TopBar::boundingRect() const
+{
+ //It's possible that m_topBarPixmap is not allocated yet,
+ //in this case default size is used for setting boundingRect
+ QHash<QString, QSize>sizes = (Theme::p()->theme() == Theme::Blue) ?
+ m_sizesBlue : m_sizesLime;
+
+ if (!m_topBarPixmap.isNull())
+ return QRectF(0, 0, m_topBarPixmap.size().width(), m_topBarPixmap.size().height());
+ else
+ return QRectF(0, 0, sizes["topbar.svg"].width(), sizes["topbar.svg"].height());
+}
+
+void TopBar::themeChange()
+{
+ m_titleFont = Theme::p()->font(Theme::TitleBar);
+ m_statusFont = Theme::p()->font(Theme::StatusBar);
+
+ //Calculate the scaling factor
+ QHash<QString, QSize>sizes = (Theme::p()->theme() == Theme::Blue) ?
+ m_sizesBlue : m_sizesLime;
+
+ QString topbarString= m_orientation == TopBar::Portrait ?
+ "topbar.svg" : "topbar_horisontal.svg";
+
+ QSize topBarSize = sizes[topbarString];
+ QSize newSize = QSize(topBarSize);
+
+ //Scale according to aspect ratio
+ newSize.scale(size().toSize(), Qt::KeepAspectRatio);
+
+ //fix width to window widht if previous scaling produced too narrow image
+ if(newSize.width() < size().width()) {
+ newSize.scale(size().toSize(), Qt::KeepAspectRatioByExpanding);
+ }
+
+ //Calculate scaling factor for rest of the graphics scaling
+ qreal scaleFactor = (newSize.width() *1.0) / (topBarSize.width() * 1.0);
+
+ //Background
+ m_topBarPixmap = Theme::p()->pixmap(topbarString, sizes[topbarString] * scaleFactor);
+
+ //User Icon
+ m_topBarUserIcon = Theme::p()->pixmap("user_default_icon.svg", sizes["user_default_icon.svg"] * scaleFactor);
+
+ //User Status
+ m_topBarUserStatus = Theme::p()->pixmap("user_status_online.svg", sizes["user_status_online.svg"] * scaleFactor);
+
+ //Status Bar
+ m_topBarStatusBarLeft = Theme::p()->pixmap("status_field_left.svg", sizes["status_field_left.svg"] * scaleFactor);
+ m_topBarStatusBarRight = Theme::p()->pixmap("status_field_right.svg", sizes["status_field_right.svg"] * scaleFactor);
+ m_topBarStatusBarMiddle = Theme::p()->pixmap("status_field_middle.svg",
+ QSize(185, sizes["status_field_middle.svg"].height())* scaleFactor);
+
+ //Update Drawing points for Top Bar elements, points are relative to the top bar background size
+ QSize topBarPixmapSize = m_topBarPixmap.size();
+ QSize topBarUserIconSize = m_topBarUserIcon.size();
+ QSize topBarUserStatusSize = m_topBarUserStatus.size();
+ QSize topBarStatusBarLeftSize = m_topBarStatusBarLeft.size();
+ QSize topBarStatusBarMiddleSize = m_topBarStatusBarMiddle.size();
+
+ //Theme Check
+ (Theme::p()->theme() == Theme::Lime) ? m_isLimeTheme = true : m_isLimeTheme = false;
+
+ //User Icon location
+ //Placing 70% of the width and 10% of the height of the top bar background
+ m_topBarUserIconPoint = QPoint((0.7*topBarPixmapSize.width()), (0.1*topBarPixmapSize.height()));
+
+ //If Blue theme is in use - position user status icon on the right side of the user icon
+ if(!m_isLimeTheme) {
+ //Place the status icon on top of the right edge of the user icon, lower it by 35% of the height of the user icon
+ m_topBarUserStatusPoint = QPoint( ( (m_topBarUserIconPoint.x()+topBarUserIconSize.width() ) - ( topBarUserStatusSize.width()/2 )),
+ (m_topBarUserIconPoint.y() + (topBarUserIconSize.height() * 0.35 )));
+ }
+ //If Lime theme is in use - position user status icon on the left side of the user icon
+ else {
+ //Place the status icon on top of the left side of the user icon, lower it by 50% of the height of the user icon
+ //and move left by 5% of the icon
+ m_topBarUserStatusPoint = QPoint( m_topBarUserIconPoint.x() + ( topBarUserIconSize.width() * 0.05),
+ (m_topBarUserIconPoint.y() + (topBarUserIconSize.height() * 0.5 )));
+ }
+
+ //Status bar
+ //Placing the left side of the status bar 5% of the width, 50% of the height of the top bar background
+ //Set the text baseline 80% of the height of the status bar
+ m_topBarStatusBarLeftPoint = QPoint( (topBarPixmapSize.width()* 0.05),
+ (topBarPixmapSize.height() * 0.5));
+ m_topBarStatusBarMiddlePoint = QPoint( (m_topBarStatusBarLeftPoint.x() + topBarStatusBarLeftSize.width()),
+ (m_topBarStatusBarLeftPoint.y()));
+ m_topBarStatusBarRightPoint = QPoint( (m_topBarStatusBarMiddlePoint.x() + topBarStatusBarMiddleSize.width()),
+ (m_topBarStatusBarMiddlePoint.y() ) );
+ m_topBarStatusBarTextPoint = QPoint(m_topBarStatusBarMiddlePoint.x(),
+ m_topBarStatusBarMiddlePoint.y() + (topBarStatusBarMiddleSize.height()*0.8) );
+
+ update();
+}
+
+QSizeF TopBar::sizeHint(Qt::SizeHint which,
+ const QSizeF &constraint) const
+{
+ //It's possible that m_topBarPixmap is not allocated yet,
+ //in this case default size is used for setting size hint
+ QHash<QString, QSize>sizes = (Theme::p()->theme() == Theme::Blue) ?
+ m_sizesBlue : m_sizesLime;
+
+ int height = !m_topBarPixmap.isNull() ?
+ m_topBarPixmap.height() : sizes["topbar.svg"].height();
+
+ switch (which)
+ {
+ case Qt::MinimumSize:
+ return QSizeF(-1, height);
+
+ case Qt::MaximumSize:
+ return QSizeF(-1, height);
+
+ default:
+ return QGraphicsWidget::sizeHint(which, constraint);
+ }
+}
+
+void TopBar::setDefaultSizes()
+{
+ m_sizesBlue["topbar.svg"] = QSize(356,96);
+ m_sizesBlue["topbar_horisontal.svg"] = QSize(636,96);
+ m_sizesBlue["user_default_icon.svg"] = QSize(68,68);
+ m_sizesBlue["user_status_online.svg"] = QSize(38,38);
+ m_sizesBlue["status_field_left.svg"] = QSize(14,24);
+ m_sizesBlue["status_field_right.svg"] = QSize(10,24);
+ m_sizesBlue["status_field_middle.svg"] = QSize(14,24);
+
+ m_sizesLime["topbar.svg"] = QSize(356,96);
+ m_sizesLime["topbar_horisontal.svg"] = QSize(636,96);
+ m_sizesLime["user_default_icon.svg"] = QSize(84,68);
+ m_sizesLime["user_status_online.svg"] = QSize(24,24);
+ m_sizesLime["status_field_left.svg"] = QSize(14,24);
+ m_sizesLime["status_field_right.svg"] = QSize(10,24);
+ m_sizesLime["status_field_middle.svg"] = QSize(14,24);
+}
+
+void TopBar::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+ QRect rect = m_topBarStatusBarMiddle.rect();
+ rect.moveTopLeft(m_topBarStatusBarMiddlePoint);
+ QPointF scenePoint = event->scenePos();
+ if(rect.contains(scenePoint.toPoint())) {
+ emit clicked();
+ }
+}
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/topbar.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/topbar.h
new file mode 100644
index 0000000000..53750ca706
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/topbar.h
@@ -0,0 +1,114 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef __TOPBAR_H__
+#define __TOPBAR_H__
+
+#include <QObject>
+#include <QHash>
+
+#include "gvbwidget.h"
+
+class QPixmap;
+class QPoint;
+class QGraphicsView;
+class QFont;
+
+class TopBar : public GvbWidget
+{
+ Q_OBJECT
+
+public:
+ enum Orientation
+ {
+ Portrait,
+ Landscape,
+ None
+ };
+
+public:
+ TopBar(QGraphicsView* mainView, QGraphicsWidget* parent);
+ ~TopBar();
+
+public:
+ void paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0 );
+ QRectF boundingRect() const;
+ void resizeEvent(QGraphicsSceneResizeEvent *event);
+ inline QPoint getStatusBarLocation()
+ {
+ return m_topBarStatusBarMiddlePoint + m_topBarStatusBarMiddle.rect().bottomLeft();
+ }
+
+public slots:
+ void themeChange();
+
+protected:
+ void mousePressEvent(QGraphicsSceneMouseEvent *event);
+
+signals:
+ void clicked(bool checked = false);
+
+private:
+ QSizeF sizeHint(Qt::SizeHint which,
+ const QSizeF &constraint = QSizeF()) const;
+ void setDefaultSizes();
+
+private:
+ Q_DISABLE_COPY(TopBar)
+
+ QGraphicsView* m_mainView;
+ bool m_isLimeTheme;
+ Orientation m_orientation;
+
+ //Fonts
+ QFont m_titleFont;
+ QFont m_statusFont;
+
+ //Pixmaps
+ QPixmap m_topBarPixmap;
+ QPixmap m_topBarUserIcon;
+ QPixmap m_topBarUserStatus;
+ QPixmap m_topBarStatusBarLeft;
+ QPixmap m_topBarStatusBarRight;
+ QPixmap m_topBarStatusBarMiddle;
+
+ //Drawing points
+ QPoint m_topBarUserIconPoint;
+ QPoint m_topBarUserStatusPoint;
+ QPoint m_topBarStatusBarLeftPoint;
+ QPoint m_topBarStatusBarRightPoint;
+ QPoint m_topBarStatusBarMiddlePoint;
+ QPoint m_topBarStatusBarTextPoint;
+ QPoint m_topBarTitlePoint;
+
+ //Sizes
+ QHash<QString, QSize> m_sizesBlue;
+ QHash<QString, QSize> m_sizesLime;
+};
+
+#endif // __TOPBAR_H__
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/webview.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/webview.cpp
new file mode 100644
index 0000000000..59ed50157b
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/webview.cpp
@@ -0,0 +1,289 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "webview.h"
+#include "webview_p.h"
+#include <QtGui>
+
+static const int MotionEndWaitTime = 2000;
+static const int TileSideLength = 128;
+
+WebViewPrivate::WebViewPrivate(WebView *w)
+ : q(w)
+ , cache(0)
+{
+ web = new QGraphicsWebView;
+
+ web->setParentItem(q->viewport());
+
+ web->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ web->page()->mainFrame()->setScrollBarPolicy(
+ Qt::Horizontal, Qt::ScrollBarAlwaysOff);
+ web->page()->mainFrame()->setScrollBarPolicy(
+ Qt::Vertical, Qt::ScrollBarAlwaysOff);
+ web->setZValue(3);
+
+// cache = new WebViewCache(web);
+// web->setGraphicsEffect(cache);
+
+ adjustSize();
+}
+
+void WebViewPrivate::adjustSize()
+{
+ QSizeF contentSize = web->page()->mainFrame()->contentsSize();
+ QPointF pos = web->pos();
+
+ qreal w = qMax(contentSize.width(), q->viewport()->boundingRect().width());
+ qreal h = qMax(contentSize.height(), q->viewport()->boundingRect().height());
+
+ if (web->boundingRect().size() != QSizeF(w, h)) {
+ //qDebug() << "WebView: adjustSize:" << QSizeF(w, h);
+
+ web->resize(w, h);
+ web->setPos(pos);
+
+ if (w > q->viewport()->boundingRect().width())
+ q->horizontalScrollBar()->setSliderSize(w);
+ else
+ q->horizontalScrollBar()->setSliderSize(0.0);
+
+ if (h > q->viewport()->boundingRect().height())
+ q->verticalScrollBar()->setSliderSize(h);
+ else
+ q->verticalScrollBar()->setSliderSize(0.0);
+ }
+}
+
+void WebViewPrivate::_q_loadStarted()
+{
+ qDebug() << "WebView: load started";
+ adjustSize();
+}
+
+void WebViewPrivate::_q_loadProgress(int progress)
+{
+ Q_UNUSED(progress)
+// qDebug() << "WebView: load progress" << progress;
+ adjustSize();
+}
+
+void WebViewPrivate::_q_loadFinished(bool ok)
+{
+ qDebug() << "WebView: load finished" << (ok ? "ok" : "not ok");
+ adjustSize();
+}
+
+void WebViewPrivate::_q_viewportChanged(QGraphicsWidget* viewport)
+{
+ web->setParentItem(viewport);
+ viewport->setFlag(QGraphicsItem::ItemClipsChildrenToShape,
+ true);
+ adjustSize();
+}
+
+void WebViewPrivate::_q_motionEnded()
+{
+ motionTimer.stop();
+ qDebug() << "Motion ended";
+ q->prepareGeometryChange();
+}
+
+WebViewCache::WebViewCache(QGraphicsWebView *webView)
+ : m_webView(webView)
+{
+}
+
+WebViewCache::~WebViewCache()
+{
+}
+
+void WebViewCache::draw(QPainter * painter, QGraphicsEffectSource * source)
+{
+ const QGraphicsItem *item = source->graphicsItem();
+
+ QSizeF itemSize = item->boundingRect().size();
+
+ if (!qFuzzyCompare(itemSize.width(), m_itemSize.width()) ||
+ !qFuzzyCompare(itemSize.height(), m_itemSize.height())) {
+ qDebug() << "Refresh tile cache, for new size" << itemSize;
+
+ for (int i = 0; i < m_tilePixmaps.size(); i++) {
+ QPixmapCache::remove(m_tilePixmaps[i]);
+ }
+
+ m_tilePixmaps.clear();
+ m_tileRects.clear();
+
+ int itemWidth = itemSize.width() + 0.5;
+ int itemHeight = itemSize.height() + 0.5;
+
+ int tilesX = itemWidth / TileSideLength;
+ int tilesY = itemHeight / TileSideLength;
+
+ if ((itemWidth % TileSideLength) != 0) {
+ ++tilesX;
+ }
+
+ if ((itemHeight % TileSideLength) != 0) {
+ ++tilesY;
+ }
+
+ int tilesCount = tilesX * tilesY;
+
+ m_tilePixmaps.resize(tilesCount);
+ m_tileRects.resize(tilesCount);
+
+ for (int i = 0; i < tilesX; i++) {
+ for (int j = 0; j < tilesY; j++) {
+ int x = i * TileSideLength;
+ int y = j * TileSideLength;
+
+ m_tileRects[i + j * tilesX]
+ = QRectF(x, y, TileSideLength, TileSideLength);
+ }
+ }
+
+ m_itemSize = itemSize;
+ }
+
+ const QGraphicsItem *parentItem = item->parentItem();
+ QPointF itemPos = item->pos();
+ QRectF parentRect = parentItem->boundingRect();
+
+ for (int i = 0; i < m_tileRects.size(); i++) {
+ QRectF tileRect = m_tileRects[i].translated(itemPos);
+
+ if (!tileRect.intersects(parentRect) && !tileRect.contains(parentRect)) {
+ continue;
+ }
+
+ QPixmap tilePixmap;
+
+ if (!QPixmapCache::find(m_tilePixmaps[i], &tilePixmap)) {
+ tilePixmap = QPixmap(TileSideLength, TileSideLength);
+
+ QWebFrame *webFrame = m_webView->page()->mainFrame();
+
+ QPainter tilePainter(&tilePixmap);
+ tilePainter.translate(-m_tileRects[i].left(), -m_tileRects[i].top());
+ webFrame->render(&tilePainter, m_tileRects[i].toRect());
+ tilePainter.end();
+
+ m_tilePixmaps[i] = QPixmapCache::insert(tilePixmap);
+ }
+
+ tileRect = tileRect.translated(-itemPos);
+
+ painter->drawPixmap(tileRect.topLeft(), tilePixmap);
+ }
+}
+
+WebView::WebView(QGraphicsWidget *parent)
+ : AbstractScrollArea(parent)
+ , d(new WebViewPrivate(this))
+{
+ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ setContentsMargins(0, 0, 0, 0);
+ connect(d->web->page(), SIGNAL(loadStarted()),
+ this, SLOT(_q_loadStarted()));
+ connect(d->web->page(), SIGNAL(loadProgress(int)),
+ this, SLOT(_q_loadProgress(int)));
+ connect(d->web->page(), SIGNAL(loadFinished(bool)),
+ this, SLOT(_q_loadFinished(bool)));
+ connect(this, SIGNAL(viewportChanged(QGraphicsWidget*)),
+ this, SLOT(_q_viewportChanged(QGraphicsWidget*)));
+ connect(&d->motionTimer, SIGNAL(timeout()),
+ this, SLOT(_q_motionEnded()));
+}
+
+WebView::~WebView()
+{
+ d->web->setGraphicsEffect(0);
+ delete d->cache;
+}
+
+void WebView::setUrl(const QUrl& url)
+{
+ d->adjustSize();
+ d->web->setUrl(url);
+}
+
+void WebView::scrollContentsBy(qreal dx, qreal dy)
+{
+ if (qFuzzyCompare((float)dy, 0.0f) && qFuzzyCompare((float)dx, 0.0f))
+ return;
+
+ if (!d->motionTimer.isActive()) {
+ d->motionTimer.start(MotionEndWaitTime);
+ }
+
+ QSizeF contentSize = d->web->page()->mainFrame()->contentsSize();
+ QRectF viewportRect = viewport()->boundingRect();
+ QPointF pos = d->web->pos();
+
+ qreal w = qMax(contentSize.width(), viewportRect.width());
+ qreal h = qMax(contentSize.height(), viewportRect.height());
+
+ qreal minx = qMin(0.0f, (float) -(w - viewportRect.width()));
+ qreal miny = qMin(0.0f, (float) -(h - viewportRect.height()));
+
+ qreal x = d->web->pos().x() - dx;
+
+ if (x < minx)
+ x = minx;
+ else if (x > 0)
+ x = 0.0;
+
+ qreal y = d->web->pos().y() - dy;
+
+ if (y < miny)
+ y = miny;
+ else if (y > 0)
+ y = 0.0;
+
+ d->web->setPos(x, y);
+}
+
+QSizeF WebView::sizeHint(Qt::SizeHint which, const QSizeF & constraint) const
+{
+ if (which == Qt::PreferredSize) {
+ QSizeF contentSize = d->web->page()->mainFrame()->contentsSize();
+ return contentSize;
+ }
+
+ return AbstractScrollArea::sizeHint(which, constraint);
+}
+
+void WebView::resizeEvent(QGraphicsSceneResizeEvent *event)
+{
+ AbstractScrollArea::resizeEvent(event);
+ d->adjustSize();
+}
+
+#include "moc_webview.cpp"
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/webview.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/webview.h
new file mode 100644
index 0000000000..a18df35957
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/webview.h
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef WEBVIEW_H
+#define WEBVIEW_H
+
+#include "scrollbar.h"
+#include "abstractscrollarea.h"
+
+class WebViewPrivate;
+
+class WebView : public AbstractScrollArea
+{
+ Q_OBJECT
+
+public:
+
+ WebView(QGraphicsWidget *parent = 0);
+ ~WebView();
+
+public:
+
+ void setUrl(const QUrl& url);
+
+private:
+
+ void scrollContentsBy(qreal dx, qreal dy);
+ void resizeEvent(QGraphicsSceneResizeEvent *event);
+ QSizeF sizeHint(Qt::SizeHint which, const QSizeF & constraint) const;
+
+private:
+
+ Q_PRIVATE_SLOT(d, void _q_loadStarted())
+ Q_PRIVATE_SLOT(d, void _q_loadProgress(int))
+ Q_PRIVATE_SLOT(d, void _q_loadFinished(bool))
+ Q_PRIVATE_SLOT(d, void _q_viewportChanged(QGraphicsWidget*))
+ Q_PRIVATE_SLOT(d, void _q_motionEnded())
+
+ WebViewPrivate *d;
+ friend class WebViewPrivate;
+};
+
+#endif // WEBVIEW_H
diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/webview_p.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/webview_p.h
new file mode 100644
index 0000000000..bd4047c134
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/webview_p.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef WEBVIEW_P_H
+#define WEBVIEW_P_H
+
+#include "webview.h"
+#include <QtWebKit/qgraphicswebview.h>
+#include <QtWebKit/qwebpage.h>
+#include <QtWebKit/qwebframe.h>
+#include <QGraphicsEffect>
+#include <QPainter>
+#include <QPixmapCache>
+#include <QTimer>
+#include <QDebug>
+
+class WebViewCache;
+
+class WebViewPrivate {
+public:
+
+ WebViewPrivate(WebView *w);
+ void adjustSize();
+ void _q_loadStarted();
+ void _q_loadProgress(int);
+ void _q_loadFinished(bool);
+ void _q_viewportChanged(QGraphicsWidget*);
+ void _q_motionEnded();
+
+ WebView *q;
+ QGraphicsWebView *web;
+ WebViewCache *cache;
+ QTimer motionTimer;
+};
+
+class WebViewCache : public QGraphicsEffect
+{
+ Q_OBJECT
+
+public:
+
+ WebViewCache(QGraphicsWebView *webView);
+ virtual ~WebViewCache();
+
+public:
+
+ void refresh();
+
+ void draw(QPainter * painter, QGraphicsEffectSource * source);
+
+private:
+
+ QVector<QRectF> m_tileRects;
+ QVector<QPixmapCache::Key> m_tilePixmaps;
+ QSizeF m_itemSize;
+ QGraphicsWebView *m_webView;
+
+ friend class WebViewPrivate;
+};
+
+#endif // WEBVIEW_P_H
diff --git a/tests/benchmarks/widgets/graphicsview/functional/functional.pro b/tests/benchmarks/widgets/graphicsview/functional/functional.pro
new file mode 100644
index 0000000000..3c2979448b
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/functional/functional.pro
@@ -0,0 +1,4 @@
+TEMPLATE = subdirs
+SUBDIRS = \
+ #GraphicsViewBenchmark # FIXME: cannot be compiled by default as part of qtbase,
+ # since it depends on qtsvg
diff --git a/tests/benchmarks/widgets/graphicsview/graphicsview.pro b/tests/benchmarks/widgets/graphicsview/graphicsview.pro
new file mode 100644
index 0000000000..5a4722ca62
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/graphicsview.pro
@@ -0,0 +1,10 @@
+TEMPLATE = subdirs
+SUBDIRS = \
+ functional \
+ qgraphicsanchorlayout \
+ qgraphicsitem \
+ #qgraphicslayout \ # FIXME: broken
+ #qgraphicslinearlayout \ # FIXME: broken?
+ qgraphicsscene \
+ qgraphicsview \
+ qgraphicswidget
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsanchorlayout/qgraphicsanchorlayout.pro b/tests/benchmarks/widgets/graphicsview/qgraphicsanchorlayout/qgraphicsanchorlayout.pro
new file mode 100644
index 0000000000..01c0dbd653
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsanchorlayout/qgraphicsanchorlayout.pro
@@ -0,0 +1,7 @@
+QT += widgets testlib
+
+TEMPLATE = app
+TARGET = tst_bench_qgraphicsanchorlayout
+
+SOURCES += tst_qgraphicsanchorlayout.cpp
+
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsanchorlayout/tst_qgraphicsanchorlayout.cpp b/tests/benchmarks/widgets/graphicsview/qgraphicsanchorlayout/tst_qgraphicsanchorlayout.cpp
new file mode 100644
index 0000000000..b15aad04cd
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsanchorlayout/tst_qgraphicsanchorlayout.cpp
@@ -0,0 +1,420 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+#include <QtWidgets/qgraphicsanchorlayout.h>
+#include <QtWidgets/qgraphicslinearlayout.h>
+#include <QtWidgets/qgraphicswidget.h>
+#include <QtWidgets/qgraphicsview.h>
+
+class tst_QGraphicsAnchorLayout : public QObject
+{
+ Q_OBJECT
+public:
+ tst_QGraphicsAnchorLayout() {}
+ ~tst_QGraphicsAnchorLayout() {}
+
+private slots:
+ void hard_complex_data();
+ void hard_complex();
+ void linearVsAnchorSizeHints_data();
+ void linearVsAnchorSizeHints();
+ void linearVsAnchorSetGeometry_data();
+ void linearVsAnchorSetGeometry();
+ void linearVsAnchorNested_data();
+ void linearVsAnchorNested();
+};
+
+
+class RectWidget : public QGraphicsWidget
+{
+public:
+ RectWidget(QGraphicsItem *parent = 0) : QGraphicsWidget(parent){}
+
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+ {
+ Q_UNUSED(option);
+ Q_UNUSED(widget);
+ painter->drawRoundRect(rect());
+ painter->drawLine(rect().topLeft(), rect().bottomRight());
+ painter->drawLine(rect().bottomLeft(), rect().topRight());
+ }
+};
+
+static QGraphicsWidget *createItem(const QSizeF &minimum = QSizeF(100.0, 100.0),
+ const QSizeF &preferred = QSize(150.0, 100.0),
+ const QSizeF &maximum = QSizeF(200.0, 100.0),
+ const QString &name = QString())
+{
+ QGraphicsWidget *w = new RectWidget;
+ w->setMinimumSize(minimum);
+ w->setPreferredSize(preferred);
+ w->setMaximumSize(maximum);
+ w->setData(0, name);
+ return w;
+}
+
+static void setAnchor(QGraphicsAnchorLayout *l,
+ QGraphicsLayoutItem *firstItem,
+ Qt::AnchorPoint firstEdge,
+ QGraphicsLayoutItem *secondItem,
+ Qt::AnchorPoint secondEdge,
+ qreal spacing)
+{
+ QGraphicsAnchor *anchor = l->addAnchor(firstItem, firstEdge, secondItem, secondEdge);
+ anchor->setSpacing(spacing);
+}
+
+void tst_QGraphicsAnchorLayout::hard_complex_data()
+{
+ QTest::addColumn<int>("whichSizeHint");
+ QTest::newRow("minimumSizeHint")
+ << int(Qt::MinimumSize);
+ QTest::newRow("preferredSizeHint")
+ << int(Qt::PreferredSize);
+ QTest::newRow("maximumSizeHint")
+ << int(Qt::MaximumSize);
+ // Add it as a reference to see how much overhead the body of effectiveSizeHint takes.
+ QTest::newRow("noSizeHint")
+ << -1;
+}
+
+void tst_QGraphicsAnchorLayout::hard_complex()
+{
+ QFETCH(int, whichSizeHint);
+
+ // Test for "hard" complex case, taken from wiki
+ // https://cwiki.nokia.com/S60QTUI/AnchorLayoutComplexCases
+ QSizeF min(0, 10);
+ QSizeF pref(50, 10);
+ QSizeF max(100, 10);
+
+ QGraphicsWidget *a = createItem(min, pref, max, "a");
+ QGraphicsWidget *b = createItem(min, pref, max, "b");
+ QGraphicsWidget *c = createItem(min, pref, max, "c");
+ QGraphicsWidget *d = createItem(min, pref, max, "d");
+ QGraphicsWidget *e = createItem(min, pref, max, "e");
+ QGraphicsWidget *f = createItem(min, pref, max, "f");
+ QGraphicsWidget *g = createItem(min, pref, max, "g");
+
+ QGraphicsAnchorLayout *l = new QGraphicsAnchorLayout;
+ l->setContentsMargins(0, 0, 0, 0);
+
+ //<!-- Trunk -->
+ setAnchor(l, l, Qt::AnchorLeft, a, Qt::AnchorLeft, 10);
+ setAnchor(l, a, Qt::AnchorRight, b, Qt::AnchorLeft, 10);
+ setAnchor(l, b, Qt::AnchorRight, c, Qt::AnchorLeft, 10);
+ setAnchor(l, c, Qt::AnchorRight, d, Qt::AnchorLeft, 10);
+ setAnchor(l, d, Qt::AnchorRight, l, Qt::AnchorRight, 10);
+
+ //<!-- Above trunk -->
+ setAnchor(l, b, Qt::AnchorLeft, e, Qt::AnchorLeft, 10);
+ setAnchor(l, e, Qt::AnchorRight, d, Qt::AnchorLeft, 10);
+
+ //<!-- Below trunk -->
+ setAnchor(l, a, Qt::AnchorHorizontalCenter, g, Qt::AnchorLeft, 10);
+ setAnchor(l, g, Qt::AnchorRight, f, Qt::AnchorHorizontalCenter, 10);
+ setAnchor(l, c, Qt::AnchorLeft, f, Qt::AnchorLeft, 10);
+ setAnchor(l, f, Qt::AnchorRight, d, Qt::AnchorRight, 10);
+
+ //<!-- vertical is simpler -->
+ setAnchor(l, l, Qt::AnchorTop, e, Qt::AnchorTop, 0);
+ setAnchor(l, e, Qt::AnchorBottom, a, Qt::AnchorTop, 0);
+ setAnchor(l, e, Qt::AnchorBottom, b, Qt::AnchorTop, 0);
+ setAnchor(l, e, Qt::AnchorBottom, c, Qt::AnchorTop, 0);
+ setAnchor(l, e, Qt::AnchorBottom, d, Qt::AnchorTop, 0);
+ setAnchor(l, a, Qt::AnchorBottom, f, Qt::AnchorTop, 0);
+ setAnchor(l, a, Qt::AnchorBottom, b, Qt::AnchorBottom, 0);
+ setAnchor(l, a, Qt::AnchorBottom, c, Qt::AnchorBottom, 0);
+ setAnchor(l, a, Qt::AnchorBottom, d, Qt::AnchorBottom, 0);
+ setAnchor(l, f, Qt::AnchorBottom, g, Qt::AnchorTop, 0);
+ setAnchor(l, g, Qt::AnchorBottom, l, Qt::AnchorBottom, 0);
+
+ // It won't query the size hint if it already has a size set.
+ // If only one of the sizes is unset it will query sizeHint only of for that hint type.
+ l->setMinimumSize(60,40);
+ l->setPreferredSize(220,40);
+ l->setMaximumSize(240,40);
+
+ switch (whichSizeHint) {
+ case Qt::MinimumSize:
+ l->setMinimumSize(-1, -1);
+ break;
+ case Qt::PreferredSize:
+ l->setPreferredSize(-1, -1);
+ break;
+ case Qt::MaximumSize:
+ l->setMaximumSize(-1, -1);
+ break;
+ default:
+ break;
+ }
+
+ QSizeF sizeHint;
+ // warm up instruction cache
+ l->invalidate();
+ sizeHint = l->effectiveSizeHint((Qt::SizeHint)whichSizeHint);
+ // ...then measure...
+ QBENCHMARK {
+ l->invalidate();
+ sizeHint = l->effectiveSizeHint((Qt::SizeHint)whichSizeHint);
+ }
+}
+
+static QGraphicsLayout* createLayouts(int whichLayout)
+{
+ QSizeF min(0, 10);
+ QSizeF pref(50, 10);
+ QSizeF max(100, 10);
+
+ QGraphicsWidget *a = createItem(min, pref, max, "a");
+ QGraphicsWidget *b = createItem(min, pref, max, "b");
+ QGraphicsWidget *c = createItem(min, pref, max, "c");
+ QGraphicsWidget *d = createItem(min, pref, max, "d");
+
+ QGraphicsLayout *l;
+ if (whichLayout == 0) {
+ l = new QGraphicsLinearLayout;
+ QGraphicsLinearLayout *linear = static_cast<QGraphicsLinearLayout *>(l);
+ linear->setContentsMargins(0, 0, 0, 0);
+
+ linear->addItem(a);
+ linear->addItem(b);
+ linear->addItem(c);
+ linear->addItem(d);
+ } else {
+ l = new QGraphicsAnchorLayout;
+ QGraphicsAnchorLayout *anchor = static_cast<QGraphicsAnchorLayout *>(l);
+ anchor->setContentsMargins(0, 0, 0, 0);
+
+ // Horizontal
+ setAnchor(anchor, anchor, Qt::AnchorLeft, a, Qt::AnchorLeft, 0);
+ setAnchor(anchor, a, Qt::AnchorRight, b, Qt::AnchorLeft, 0);
+ setAnchor(anchor, b, Qt::AnchorRight, c, Qt::AnchorLeft, 0);
+ setAnchor(anchor, c, Qt::AnchorRight, d, Qt::AnchorLeft, 0);
+ setAnchor(anchor, d, Qt::AnchorRight, anchor, Qt::AnchorRight, 0);
+
+ // Vertical
+ anchor->addAnchors(anchor, a, Qt::Vertical);
+ anchor->addAnchors(anchor, b, Qt::Vertical);
+ anchor->addAnchors(anchor, c, Qt::Vertical);
+ anchor->addAnchors(anchor, d, Qt::Vertical);
+ }
+
+ return l;
+}
+
+void tst_QGraphicsAnchorLayout::linearVsAnchorSizeHints_data()
+{
+ QTest::addColumn<int>("whichLayout");
+ QTest::addColumn<int>("whichSizeHint");
+
+ QTest::newRow("QGraphicsLinearLayout::minimum")
+ << 0 << int(Qt::MinimumSize);
+ QTest::newRow("QGraphicsLinearLayout::preferred")
+ << 0 << int(Qt::PreferredSize);
+ QTest::newRow("QGraphicsLinearLayout::maximum")
+ << 0 << int(Qt::MaximumSize);
+ QTest::newRow("QGraphicsLinearLayout::noSizeHint")
+ << 0 << -1;
+
+ QTest::newRow("QGraphicsAnchorLayout::minimum")
+ << 1 << int(Qt::MinimumSize);
+ QTest::newRow("QGraphicsAnchorLayout::preferred")
+ << 1 << int(Qt::PreferredSize);
+ QTest::newRow("QGraphicsAnchorLayout::maximum")
+ << 1 << int(Qt::MaximumSize);
+ QTest::newRow("QGraphicsAnchorLayout::noSizeHint")
+ << 1 << -1;
+}
+
+void tst_QGraphicsAnchorLayout::linearVsAnchorSizeHints()
+{
+ QFETCH(int, whichSizeHint);
+ QFETCH(int, whichLayout);
+
+ QGraphicsLayout *l = createLayouts(whichLayout);
+
+ QSizeF sizeHint;
+ // warm up instruction cache
+ l->invalidate();
+ sizeHint = l->effectiveSizeHint((Qt::SizeHint)whichSizeHint);
+ // ...then measure...
+
+ QBENCHMARK {
+ l->invalidate();
+ sizeHint = l->effectiveSizeHint((Qt::SizeHint)whichSizeHint);
+ }
+}
+
+void tst_QGraphicsAnchorLayout::linearVsAnchorSetGeometry_data()
+{
+ QTest::addColumn<int>("whichLayout");
+
+ QTest::newRow("QGraphicsLinearLayout")
+ << 0;
+ QTest::newRow("QGraphicsAnchorLayout")
+ << 1;
+}
+
+void tst_QGraphicsAnchorLayout::linearVsAnchorSetGeometry()
+{
+ QFETCH(int, whichLayout);
+
+ QGraphicsLayout *l = createLayouts(whichLayout);
+
+ QRectF sizeHint;
+ qreal maxWidth;
+ qreal increment;
+ // warm up instruction cache
+ l->invalidate();
+ sizeHint.setSize(l->effectiveSizeHint(Qt::MinimumSize));
+ maxWidth = l->effectiveSizeHint(Qt::MaximumSize).width();
+ increment = (maxWidth - sizeHint.width()) / 100;
+ l->setGeometry(sizeHint);
+ // ...then measure...
+
+ QBENCHMARK {
+ l->invalidate();
+ for (qreal width = sizeHint.width(); width <= maxWidth; width += increment) {
+ sizeHint.setWidth(width);
+ l->setGeometry(sizeHint);
+ }
+ }
+}
+
+void tst_QGraphicsAnchorLayout::linearVsAnchorNested_data()
+{
+ QTest::addColumn<int>("whichLayout");
+ QTest::newRow("LinearLayout")
+ << 0;
+ QTest::newRow("AnchorLayout setup with null-anchors knot")
+ << 1;
+ QTest::newRow("AnchorLayout setup easy to simplificate")
+ << 2;
+}
+
+void tst_QGraphicsAnchorLayout::linearVsAnchorNested()
+{
+ QFETCH(int, whichLayout);
+
+ QSizeF min(10, 10);
+ QSizeF pref(80, 80);
+ QSizeF max(150, 150);
+
+ QGraphicsWidget *a = createItem(min, pref, max, "a");
+ QGraphicsWidget *b = createItem(min, pref, max, "b");
+ QGraphicsWidget *c = createItem(min, pref, max, "c");
+ QGraphicsWidget *d = createItem(min, pref, max, "d");
+
+ QGraphicsLayout *layout;
+
+ if (whichLayout == 0) {
+ QGraphicsLinearLayout *linear1 = new QGraphicsLinearLayout;
+ QGraphicsLinearLayout *linear2 = new QGraphicsLinearLayout(Qt::Vertical);
+ QGraphicsLinearLayout *linear3 = new QGraphicsLinearLayout;
+
+ linear1->addItem(a);
+ linear1->addItem(linear2);
+ linear2->addItem(b);
+ linear2->addItem(linear3);
+ linear3->addItem(c);
+ linear3->addItem(d);
+
+ layout = linear1;
+ } else if (whichLayout == 1) {
+ QGraphicsAnchorLayout *anchor = new QGraphicsAnchorLayout;
+
+ // A
+ anchor->addCornerAnchors(a, Qt::TopLeftCorner, anchor, Qt::TopLeftCorner);
+ anchor->addCornerAnchors(a, Qt::TopRightCorner, b, Qt::TopLeftCorner);
+ anchor->addCornerAnchors(a, Qt::BottomLeftCorner, anchor, Qt::BottomLeftCorner);
+ anchor->addCornerAnchors(a, Qt::BottomRightCorner, c, Qt::BottomLeftCorner);
+
+ // B
+ anchor->addCornerAnchors(b, Qt::TopRightCorner, anchor, Qt::TopRightCorner);
+ anchor->addCornerAnchors(b, Qt::BottomLeftCorner, c, Qt::TopLeftCorner);
+ anchor->addCornerAnchors(b, Qt::BottomRightCorner, d, Qt::TopRightCorner);
+
+ // C
+ anchor->addCornerAnchors(c, Qt::TopRightCorner, d, Qt::TopLeftCorner);
+ anchor->addCornerAnchors(c, Qt::BottomRightCorner, d, Qt::BottomLeftCorner);
+
+ // D
+ anchor->addCornerAnchors(d, Qt::BottomRightCorner, anchor, Qt::BottomRightCorner);
+
+ layout = anchor;
+ } else {
+ QGraphicsAnchorLayout *anchor = new QGraphicsAnchorLayout;
+
+ // A
+ anchor->addAnchor(a, Qt::AnchorLeft, anchor, Qt::AnchorLeft);
+ anchor->addAnchors(a, anchor, Qt::Vertical);
+ anchor->addAnchor(a, Qt::AnchorRight, b, Qt::AnchorLeft);
+ anchor->addAnchor(a, Qt::AnchorRight, c, Qt::AnchorLeft);
+
+ // B
+ anchor->addAnchor(b, Qt::AnchorTop, anchor, Qt::AnchorTop);
+ anchor->addAnchor(b, Qt::AnchorRight, anchor, Qt::AnchorRight);
+ anchor->addAnchor(b, Qt::AnchorBottom, c, Qt::AnchorTop);
+ anchor->addAnchor(b, Qt::AnchorBottom, d, Qt::AnchorTop);
+
+ // C
+ anchor->addAnchor(c, Qt::AnchorRight, d, Qt::AnchorLeft);
+ anchor->addAnchor(c, Qt::AnchorBottom, anchor, Qt::AnchorBottom);
+
+ // D
+ anchor->addAnchor(d, Qt::AnchorRight, anchor, Qt::AnchorRight);
+ anchor->addAnchor(d, Qt::AnchorBottom, anchor, Qt::AnchorBottom);
+
+ layout = anchor;
+ }
+
+ QSizeF sizeHint;
+ // warm up instruction cache
+ layout->invalidate();
+ sizeHint = layout->effectiveSizeHint(Qt::PreferredSize);
+
+ // ...then measure...
+ QBENCHMARK {
+ // To ensure that all sizeHints caches are invalidated in
+ // the LinearLayout setup, we must call updateGeometry on the
+ // children. If we didn't, only the top level layout would be
+ // re-calculated.
+ static_cast<QGraphicsLayoutItem *>(a)->updateGeometry();
+ static_cast<QGraphicsLayoutItem *>(b)->updateGeometry();
+ static_cast<QGraphicsLayoutItem *>(c)->updateGeometry();
+ static_cast<QGraphicsLayoutItem *>(d)->updateGeometry();
+ layout->invalidate();
+ sizeHint = layout->effectiveSizeHint(Qt::PreferredSize);
+ }
+}
+
+QTEST_MAIN(tst_QGraphicsAnchorLayout)
+
+#include "tst_qgraphicsanchorlayout.moc"
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsitem/qgraphicsitem.pro b/tests/benchmarks/widgets/graphicsview/qgraphicsitem/qgraphicsitem.pro
new file mode 100644
index 0000000000..461ec13263
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsitem/qgraphicsitem.pro
@@ -0,0 +1,6 @@
+QT += widgets testlib
+
+TEMPLATE = app
+TARGET = tst_bench_qgraphicsitem
+
+SOURCES += tst_qgraphicsitem.cpp
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/benchmarks/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
new file mode 100644
index 0000000000..313cc56b0b
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
@@ -0,0 +1,234 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qtest.h>
+#include <QGraphicsItem>
+#include <QGraphicsScene>
+#include <QGraphicsView>
+
+class tst_QGraphicsItem : public QObject
+{
+ Q_OBJECT
+
+public:
+ tst_QGraphicsItem();
+ virtual ~tst_QGraphicsItem();
+
+public slots:
+ void initTestCase();
+ void init();
+ void cleanup();
+
+private slots:
+ void setParentItem();
+ void setParentItem_deep();
+ void setParentItem_deep_reversed();
+ void deleteItemWithManyChildren();
+ void setPos_data();
+ void setPos();
+ void setTransform_data();
+ void setTransform();
+ void rotate();
+ void scale();
+ void shear();
+ void translate();
+};
+
+tst_QGraphicsItem::tst_QGraphicsItem()
+{
+}
+
+tst_QGraphicsItem::~tst_QGraphicsItem()
+{
+}
+
+static inline void processEvents()
+{
+ QApplication::processEvents();
+ QApplication::processEvents();
+}
+
+void tst_QGraphicsItem::initTestCase()
+{
+ processEvents();
+ QTest::qWait(1500);
+ processEvents();
+}
+
+void tst_QGraphicsItem::init()
+{
+ processEvents();
+}
+
+void tst_QGraphicsItem::cleanup()
+{
+}
+
+void tst_QGraphicsItem::setParentItem()
+{
+ QBENCHMARK {
+ QGraphicsRectItem rect;
+ QGraphicsRectItem *childRect = new QGraphicsRectItem;
+ childRect->setParentItem(&rect);
+ }
+}
+
+void tst_QGraphicsItem::setParentItem_deep()
+{
+ QBENCHMARK {
+ QGraphicsRectItem rect;
+ QGraphicsRectItem *lastRect = &rect;
+ for (int i = 0; i < 10; ++i) {
+ QGraphicsRectItem *childRect = new QGraphicsRectItem;
+ childRect->setParentItem(lastRect);
+ lastRect = childRect;
+ }
+ QGraphicsItem *first = rect.childItems().first();
+ first->setParentItem(0);
+ }
+}
+
+void tst_QGraphicsItem::setParentItem_deep_reversed()
+{
+ QBENCHMARK {
+ QGraphicsRectItem *lastRect = new QGraphicsRectItem;
+ for (int i = 0; i < 100; ++i) {
+ QGraphicsRectItem *parentRect = new QGraphicsRectItem;
+ lastRect->setParentItem(parentRect);
+ lastRect = parentRect;
+ }
+ delete lastRect;
+ }
+}
+
+void tst_QGraphicsItem::deleteItemWithManyChildren()
+{
+ QBENCHMARK {
+ QGraphicsRectItem *rect = new QGraphicsRectItem;
+ for (int i = 0; i < 1000; ++i)
+ new QGraphicsRectItem(rect);
+ delete rect;
+ }
+}
+
+void tst_QGraphicsItem::setPos_data()
+{
+ QTest::addColumn<QPointF>("pos");
+
+ QTest::newRow("0, 0") << QPointF(0, 0);
+ QTest::newRow("10, 10") << QPointF(10, 10);
+ QTest::newRow("-10, -10") << QPointF(-10, -10);
+}
+
+void tst_QGraphicsItem::setPos()
+{
+ QFETCH(QPointF, pos);
+
+ QGraphicsScene scene;
+ QGraphicsRectItem *rect = scene.addRect(QRectF(0, 0, 100, 100));
+ processEvents();
+
+ QBENCHMARK {
+ rect->setPos(10, 10);
+ }
+}
+
+void tst_QGraphicsItem::setTransform_data()
+{
+ QTest::addColumn<QTransform>("transform");
+
+ QTest::newRow("rotate 45z") << QTransform().rotate(45);
+ QTest::newRow("scale 2x2") << QTransform().scale(2, 2);
+ QTest::newRow("translate 100, 100") << QTransform().translate(100, 100);
+ QTest::newRow("rotate 45x 45y 45z") << QTransform().rotate(45, Qt::XAxis)
+ .rotate(45, Qt::YAxis).rotate(45, Qt::ZAxis);
+}
+
+void tst_QGraphicsItem::setTransform()
+{
+ QFETCH(QTransform, transform);
+
+ QGraphicsScene scene;
+ QGraphicsRectItem *item = scene.addRect(QRectF(0, 0, 100, 100));
+ processEvents();
+
+ QBENCHMARK {
+ item->setTransform(transform);
+ }
+}
+
+void tst_QGraphicsItem::rotate()
+{
+ QGraphicsScene scene;
+ QGraphicsItem *item = scene.addRect(QRectF(0, 0, 100, 100));
+ processEvents();
+
+ const QTransform rotate(QTransform().rotate(45));
+ QBENCHMARK {
+ item->setTransform(rotate, true);
+ }
+}
+
+void tst_QGraphicsItem::scale()
+{
+ QGraphicsScene scene;
+ QGraphicsItem *item = scene.addRect(QRectF(0, 0, 100, 100));
+ processEvents();
+
+ const QTransform scale(QTransform::fromScale(2, 2));
+ QBENCHMARK {
+ item->setTransform(scale, true);
+ }
+}
+
+void tst_QGraphicsItem::shear()
+{
+ QGraphicsScene scene;
+ QGraphicsItem *item = scene.addRect(QRectF(0, 0, 100, 100));
+ processEvents();
+
+ const QTransform shear = QTransform().shear(1.5, 1.5);
+ QBENCHMARK {
+ item->setTransform(shear, true);
+ }
+}
+
+void tst_QGraphicsItem::translate()
+{
+ QGraphicsScene scene;
+ QGraphicsItem *item = scene.addRect(QRectF(0, 0, 100, 100));
+ processEvents();
+
+ const QTransform translate = QTransform::fromTranslate(100, 100);
+ QBENCHMARK {
+ item->setTransform(translate, true);
+ }
+}
+
+QTEST_MAIN(tst_QGraphicsItem)
+#include "tst_qgraphicsitem.moc"
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicslayout/qgraphicslayout.pro b/tests/benchmarks/widgets/graphicsview/qgraphicslayout/qgraphicslayout.pro
new file mode 100644
index 0000000000..9026fb37d8
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicslayout/qgraphicslayout.pro
@@ -0,0 +1,5 @@
+TEMPLATE = app
+TARGET = tst_bench_qgraphicslayout
+QT += testlib
+SOURCES += tst_qgraphicslayout.cpp
+
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicslayout/tst_qgraphicslayout.cpp b/tests/benchmarks/widgets/graphicsview/qgraphicslayout/tst_qgraphicslayout.cpp
new file mode 100644
index 0000000000..1db130203a
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicslayout/tst_qgraphicslayout.cpp
@@ -0,0 +1,140 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+#include <QtGui/qgraphicslayout.h>
+#include <QtGui/qgraphicslinearlayout.h>
+#include <QtGui/qgraphicswidget.h>
+#include <QtGui/qgraphicsview.h>
+
+class tst_QGraphicsLayout : public QObject
+{
+ Q_OBJECT
+public:
+ tst_QGraphicsLayout() {}
+ ~tst_QGraphicsLayout() {}
+
+private slots:
+ void invalidate();
+};
+
+
+class RectWidget : public QGraphicsWidget
+{
+public:
+ RectWidget(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0) : QGraphicsWidget(parent, wFlags), setGeometryCalls(0) {}
+
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+ {
+ Q_UNUSED(option);
+ Q_UNUSED(widget);
+ painter->drawRoundRect(rect());
+ painter->drawLine(rect().topLeft(), rect().bottomRight());
+ painter->drawLine(rect().bottomLeft(), rect().topRight());
+ }
+
+ void setGeometry(const QRectF &rect)
+ {
+ //qDebug() << "setGeometry():" << this->data(0).toString();
+ setGeometryCalls->insert(this, rect);
+ QGraphicsWidget::setGeometry(rect);
+ }
+
+ void callUpdateGeometry() {
+ QGraphicsWidget::updateGeometry();
+ }
+
+ QMap<RectWidget*, QRectF> *setGeometryCalls;
+};
+
+/**
+ * Test to see how much time is needed to resize all widgets in a
+ * layout-widget-layout-widget-.... hierarchy from the point where a
+ * leaf widget changes its size hint. (updateGeometry() is called).
+ *
+ * If you run the test for 4.7 you'll get some really high numbers, but
+ * that's because they also include painting (and possible processing of
+ * some other events).
+ */
+void tst_QGraphicsLayout::invalidate()
+{
+ QGraphicsLayout::setInstantInvalidatePropagation(true);
+ QGraphicsScene scene;
+ QGraphicsView *view = new QGraphicsView(&scene);
+ QMap<RectWidget*, QRectF> setGeometryCalls;
+
+ RectWidget *window = new RectWidget(0, Qt::Window);
+ window->setGeometryCalls = &setGeometryCalls;
+ window->setData(0, QString(QChar('a')));
+
+ scene.addItem(window);
+ RectWidget *leaf = 0;
+ const int depth = 100;
+ RectWidget *parent = window;
+ for (int i = 1; i < depth; ++i) {
+ QGraphicsLinearLayout *l = new QGraphicsLinearLayout(parent);
+ l->setContentsMargins(0,0,0,0);
+ RectWidget *child = new RectWidget;
+ child->setData(0, QString(QChar('a' + i)));
+ child->setGeometryCalls = &setGeometryCalls;
+ l->addItem(child);
+ parent = child;
+ }
+ leaf = parent;
+ leaf->setMinimumSize(QSizeF(1,1));
+
+ view->show();
+
+ QVERIFY(QTest::qWaitForWindowShown(view));
+
+ // ...then measure...
+
+ int pass = 1;
+
+ // should be as small as possible, to reduce overhead of painting
+ QSizeF size(1, 1);
+ setGeometryCalls.clear();
+ QBENCHMARK {
+ leaf->setMinimumSize(size);
+ leaf->setMaximumSize(size);
+ while (setGeometryCalls.count() < depth) {
+ QApplication::sendPostedEvents();
+ }
+ // force a resize on each widget, this will ensure
+ // that each iteration will resize all 50 widgets
+ int w = int(size.width());
+ w^=2;
+ size.setWidth(w);
+ }
+ delete view;
+ QGraphicsLayout::setInstantInvalidatePropagation(false);
+}
+
+QTEST_MAIN(tst_QGraphicsLayout)
+
+#include "tst_qgraphicslayout.moc"
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro b/tests/benchmarks/widgets/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro
new file mode 100644
index 0000000000..7126c8ecd6
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro
@@ -0,0 +1,5 @@
+TEMPLATE = app
+TARGET = tst_bench_qgraphicslinearlayout
+QT += testlib
+SOURCES += tst_qgraphicslinearlayout.cpp
+
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp b/tests/benchmarks/widgets/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
new file mode 100644
index 0000000000..325fcfbb09
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
@@ -0,0 +1,120 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+#include <QtGui/qgraphicslinearlayout.h>
+#include <QtGui/qgraphicswidget.h>
+#include <QtGui/qgraphicsview.h>
+
+class tst_QGraphicsLinearLayout : public QObject
+{
+ Q_OBJECT
+public:
+ tst_QGraphicsLinearLayout() {}
+ ~tst_QGraphicsLinearLayout() {}
+
+private slots:
+ void heightForWidth_data();
+ void heightForWidth();
+};
+
+
+struct MySquareWidget : public QGraphicsWidget
+{
+ MySquareWidget() {}
+ virtual QSizeF sizeHint ( Qt::SizeHint which, const QSizeF & constraint = QSizeF() ) const
+ {
+ if (which != Qt::PreferredSize)
+ return QGraphicsWidget::sizeHint(which, constraint);
+ if (constraint.width() < 0)
+ return QGraphicsWidget::sizeHint(which, constraint);
+ return QSizeF(constraint.width(), constraint.width());
+ }
+};
+
+void tst_QGraphicsLinearLayout::heightForWidth_data()
+{
+ QTest::addColumn<bool>("hfw");
+ QTest::addColumn<bool>("nested");
+
+ QTest::newRow("hfw") << true << false;
+ QTest::newRow("hfw, nested") << true << true;
+ QTest::newRow("not hfw") << false << false;
+ QTest::newRow("not hfw, nested") << false << true;
+}
+
+void tst_QGraphicsLinearLayout::heightForWidth()
+{
+ QFETCH(bool, hfw);
+ QFETCH(bool, nested);
+
+ QGraphicsScene scene;
+ QGraphicsWidget *form = new QGraphicsWidget;
+ scene.addItem(form);
+
+ QGraphicsLinearLayout *outerlayout = 0;
+ if (nested) {
+ outerlayout = new QGraphicsLinearLayout(form);
+ for (int i = 0; i < 8; i++) {
+ QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical);
+ outerlayout->addItem(layout);
+ outerlayout = layout;
+ }
+ }
+
+ QGraphicsLinearLayout *qlayout = 0;
+ qlayout = new QGraphicsLinearLayout(Qt::Vertical);
+ if (nested)
+ outerlayout->addItem(qlayout);
+ else
+ form->setLayout(qlayout);
+
+ MySquareWidget *widget = new MySquareWidget;
+ for (int i = 0; i < 1; i++) {
+ widget = new MySquareWidget;
+ QSizePolicy sizepolicy = widget->sizePolicy();
+ sizepolicy.setHeightForWidth(hfw);
+ widget->setSizePolicy(sizepolicy);
+ qlayout->addItem(widget);
+ }
+ // make sure only one iteration is done.
+ // run with tst_QGraphicsLinearLayout.exe "heightForWidth" -tickcounter -iterations 6
+ // this will iterate 6 times the whole test, (not only the benchmark)
+ // which should reduce warmup time and give a realistic picture of the performance of
+ // effectiveSizeHint()
+ QSizeF constraint(hfw ? 100 : -1, -1);
+ QBENCHMARK {
+ (void)form->effectiveSizeHint(Qt::PreferredSize, constraint);
+ }
+
+}
+
+
+QTEST_MAIN(tst_QGraphicsLinearLayout)
+
+#include "tst_qgraphicslinearlayout.moc"
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro b/tests/benchmarks/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro
new file mode 100644
index 0000000000..769f84423e
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro
@@ -0,0 +1,7 @@
+QT += widgets testlib
+
+TEMPLATE = app
+TARGET = tst_bench_qgraphicsscene
+
+SOURCES += tst_qgraphicsscene.cpp
+
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp b/tests/benchmarks/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp
new file mode 100644
index 0000000000..6145fabbf8
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp
@@ -0,0 +1,243 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qtest.h>
+#include <QGraphicsItem>
+#include <QGraphicsScene>
+#include <QGraphicsView>
+
+class tst_QGraphicsScene : public QObject
+{
+ Q_OBJECT
+
+public:
+ tst_QGraphicsScene();
+ virtual ~tst_QGraphicsScene();
+
+public slots:
+ void init();
+ void cleanup();
+
+private slots:
+ void construct();
+ void addItem_data();
+ void addItem();
+ void itemAt_data();
+ void itemAt();
+ void initialShow();
+};
+
+tst_QGraphicsScene::tst_QGraphicsScene()
+{
+}
+
+tst_QGraphicsScene::~tst_QGraphicsScene()
+{
+}
+
+static inline void processEvents()
+{
+ QApplication::processEvents();
+ QApplication::processEvents();
+}
+
+void tst_QGraphicsScene::init()
+{
+ processEvents();
+}
+
+void tst_QGraphicsScene::cleanup()
+{
+}
+
+void tst_QGraphicsScene::construct()
+{
+ QBENCHMARK {
+ QGraphicsScene scene;
+ }
+}
+
+void tst_QGraphicsScene::addItem_data()
+{
+ QTest::addColumn<int>("indexMethod");
+ QTest::addColumn<QRectF>("sceneRect");
+ QTest::addColumn<int>("numItems_X");
+ QTest::addColumn<int>("numItems_Y");
+ QTest::addColumn<int>("itemType");
+ QTest::addColumn<QRectF>("itemRect");
+
+ QTest::newRow("null") << 0 << QRectF() << 0 << 0 << 0 << QRectF();
+ QTest::newRow("0 QRectF() 10 x 10 QGraphicsRectItem (0,0,10,10)") << 0 << QRectF() << 10 << 10 << int(QGraphicsRectItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("0 QRectF() 25 x 25 QGraphicsRectItem (0,0,10,10)") << 0 << QRectF() << 25 << 25 << int(QGraphicsRectItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("0 QRectF() 100 x 100 QGraphicsRectItem (0,0,10,10)") << 0 << QRectF() << 100 << 100 << int(QGraphicsRectItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("0 QRectF() 250 x 250 QGraphicsRectItem (0,0,10,10)") << 0 << QRectF() << 250 << 250 << int(QGraphicsRectItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("0 QRectF() 10 x 10 QGraphicsEllipseItem (0,0,10,10)") << 0 << QRectF() << 10 << 10 << int(QGraphicsEllipseItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("0 QRectF() 25 x 25 QGraphicsEllipseItem (0,0,10,10)") << 0 << QRectF() << 25 << 25 << int(QGraphicsEllipseItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("0 QRectF() 100 x 100 QGraphicsEllipseItem (0,0,10,0)") << 0 << QRectF() << 100 << 100 << int(QGraphicsEllipseItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("0 QRectF() 250 x 250 QGraphicsEllipseItem (0,0,10,10)") << 0 << QRectF() << 250 << 250 << int(QGraphicsEllipseItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("0 QRectF() 10 x 10 QGraphicsRectItem (0,0,10,10)") << 0 << QRectF(0, 0, 100, 100) << 10 << 10 << int(QGraphicsRectItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("0 QRectF() 25 x 25 QGraphicsRectItem (0,0,10,10)") << 0 << QRectF(0, 0, 250, 250) << 25 << 25 << int(QGraphicsRectItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("0 QRectF() 100 x 100 QGraphicsRectItem (0,0,10,10)") << 0 << QRectF(0, 0, 1000, 1000) << 100 << 100 << int(QGraphicsRectItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("0 QRectF() 250 x 250 QGraphicsRectItem (0,0,10,10)") << 0 << QRectF(0, 0, 2500, 2500) << 250 << 250 << int(QGraphicsRectItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("0 QRectF() 10 x 10 QGraphicsEllipseItem (0,0,10,10)") << 0 << QRectF(0, 0, 100, 100) << 10 << 10 << int(QGraphicsEllipseItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("0 QRectF() 25 x 25 QGraphicsEllipseItem (0,0,10,10)") << 0 << QRectF(0, 0, 250, 250) << 25 << 25 << int(QGraphicsEllipseItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("0 QRectF() 100 x 100 QGraphicsEllipseItem (0,0,10,10)") << 0 << QRectF(0, 0, 1000, 1000) << 100 << 100 << int(QGraphicsEllipseItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("0 QRectF() 250 x 250 QGraphicsEllipseItem (0,0,10,10)") << 0 << QRectF(0, 0, 2500, 2500) << 250 << 250 << int(QGraphicsEllipseItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("1 QRectF() 10 x 10 QGraphicsRectItem (0,0,10,10)") << 1 << QRectF() << 10 << 10 << int(QGraphicsRectItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("1 QRectF() 25 x 25 QGraphicsRectItem (0,0,10,10)") << 1 << QRectF() << 25 << 25 << int(QGraphicsRectItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("1 QRectF() 100 x 100 QGraphicsRectItem (0,0,10,10)") << 1 << QRectF() << 100 << 100 << int(QGraphicsRectItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("1 QRectF() 250 x 250 QGraphicsRectItem (0,0,10,10)") << 1 << QRectF() << 250 << 250 << int(QGraphicsRectItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("1 QRectF() 10 x 10 QGraphicsEllipseItem (0,0,10,10)") << 1 << QRectF() << 10 << 10 << int(QGraphicsEllipseItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("1 QRectF() 25 x 25 QGraphicsEllipseItem (0,0,10,10)") << 1 << QRectF() << 25 << 25 << int(QGraphicsEllipseItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("1 QRectF() 100 x 100 QGraphicsEllipseItem (0,0,10,10)") << 1 << QRectF() << 100 << 100 << int(QGraphicsEllipseItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("1 QRectF() 250 x 250 QGraphicsEllipseItem (0,0,10,10)") << 1 << QRectF() << 250 << 250 << int(QGraphicsEllipseItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("1 QRectF() 10 x 10 QGraphicsRectItem (0,0,10,10)") << 1 << QRectF(0, 0, 100, 100) << 10 << 10 << int(QGraphicsRectItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("1 QRectF() 25 x 25 QGraphicsRectItem (0,0,10,10)") << 1 << QRectF(0, 0, 250, 250) << 25 << 25 << int(QGraphicsRectItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("1 QRectF() 100 x 100 QGraphicsRectItem (0,0,10,10)") << 1 << QRectF(0, 0, 1000, 1000) << 100 << 100 << int(QGraphicsRectItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("1 QRectF() 250 x 250 QGraphicsRectItem (0,0,10,10)") << 1 << QRectF(0, 0, 2500, 2500) << 250 << 250 << int(QGraphicsRectItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("1 QRectF() 10 x 10 QGraphicsEllipseItem (0,0,10,10)") << 1 << QRectF(0, 0, 100, 100) << 10 << 10 << int(QGraphicsEllipseItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("1 QRectF() 25 x 25 QGraphicsEllipseItem (0,0,10,10)") << 1 << QRectF(0, 0, 250, 250) << 25 << 25 << int(QGraphicsEllipseItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("1 QRectF() 100 x 100 QGraphicsEllipseItem (0,0,10,10)") << 1 << QRectF(0, 0, 1000, 1000) << 100 << 100 << int(QGraphicsEllipseItem::Type) << QRectF(0, 0, 10, 10);
+ QTest::newRow("1 QRectF() 250 x 250 QGraphicsEllipseItem (0,0,10,10)") << 1 << QRectF(0, 0, 2500, 2500) << 250 << 250 << int(QGraphicsEllipseItem::Type) << QRectF(0, 0, 10, 10);
+}
+
+void tst_QGraphicsScene::addItem()
+{
+ QFETCH(int, indexMethod);
+ QFETCH(QRectF, sceneRect);
+ QFETCH(int, numItems_X);
+ QFETCH(int, numItems_Y);
+ QFETCH(int, itemType);
+ QFETCH(QRectF, itemRect);
+
+ QGraphicsScene scene;
+ scene.setItemIndexMethod(indexMethod ? QGraphicsScene::BspTreeIndex : QGraphicsScene::NoIndex);
+ if (!sceneRect.isNull())
+ scene.setSceneRect(sceneRect);
+
+ processEvents();
+
+ QBENCHMARK {
+ QGraphicsItem *item = 0;
+ for (int y = 0; y < numItems_Y; ++y) {
+ for (int x = 0; x < numItems_X; ++x) {
+ switch (itemType) {
+ case QGraphicsRectItem::Type:
+ item = new QGraphicsRectItem(itemRect);
+ break;
+ case QGraphicsEllipseItem::Type:
+ default:
+ item = new QGraphicsEllipseItem(itemRect);
+ break;
+ }
+ item->setPos(x * itemRect.width(), y * itemRect.height());
+ scene.addItem(item);
+ }
+ }
+ scene.items(QPointF(0, 0));
+ }
+ //let QGraphicsScene::_q_polishItems be called so ~QGraphicsItem doesn't spend all his time cleaning the unpolished list
+ qApp->processEvents();
+}
+
+void tst_QGraphicsScene::itemAt_data()
+{
+ QTest::addColumn<int>("bspTreeDepth");
+ QTest::addColumn<QRectF>("sceneRect");
+ QTest::addColumn<int>("numItems_X");
+ QTest::addColumn<int>("numItems_Y");
+ QTest::addColumn<QRectF>("itemRect");
+
+ QTest::newRow("null") << 0 << QRectF() << 0 << 0 << QRectF();
+ QTest::newRow("NoIndex 10x10") << -1 << QRectF() << 10 << 10 << QRectF(-10, -10, 20, 20);
+ QTest::newRow("NoIndex 25x25") << -1 << QRectF() << 25 << 25 << QRectF(-10, -10, 20, 20);
+ QTest::newRow("NoIndex 100x100") << -1 << QRectF() << 100 << 100 << QRectF(-10, -10, 20, 20);
+ QTest::newRow("NoIndex 250x250") << -1 << QRectF() << 250 << 250 << QRectF(-10, -10, 20, 20);
+ QTest::newRow("BspTreeIndex depth=auto 10x10") << 0 << QRectF() << 10 << 10 << QRectF(-10, -10, 20, 20);
+ QTest::newRow("BspTreeIndex depth=auto 25x25") << 0 << QRectF() << 25 << 25 << QRectF(-10, -10, 20, 20);
+ QTest::newRow("BspTreeIndex depth=auto 100x100") << 0 << QRectF() << 100 << 100 << QRectF(-10, -10, 20, 20);
+ QTest::newRow("BspTreeIndex depth=auto 250x250") << 0 << QRectF() << 250 << 250 << QRectF(-10, -10, 20, 20);
+ QTest::newRow("BspTreeIndex depth=16 10x10") << 16 << QRectF() << 10 << 10 << QRectF(-10, -10, 20, 20);
+ QTest::newRow("BspTreeIndex depth=16 25x25") << 16 << QRectF() << 25 << 25 << QRectF(-10, -10, 20, 20);
+ QTest::newRow("BspTreeIndex depth=16 100x100") << 16 << QRectF() << 100 << 100 << QRectF(-10, -10, 20, 20);
+ QTest::newRow("BspTreeIndex depth=16 250x250") << 16 << QRectF() << 250 << 250 << QRectF(-10, -10, 20, 20);
+}
+
+void tst_QGraphicsScene::itemAt()
+{
+ QFETCH(int, bspTreeDepth);
+ QFETCH(QRectF, sceneRect);
+ QFETCH(int, numItems_X);
+ QFETCH(int, numItems_Y);
+ QFETCH(QRectF, itemRect);
+
+ QGraphicsScene scene;
+ scene.setItemIndexMethod(bspTreeDepth >= 0 ? QGraphicsScene::BspTreeIndex : QGraphicsScene::NoIndex);
+ if (bspTreeDepth > 0)
+ scene.setBspTreeDepth(bspTreeDepth);
+ if (!sceneRect.isNull())
+ scene.setSceneRect(sceneRect);
+
+ for (int y = 0; y < numItems_Y; ++y) {
+ for (int x = 0; x < numItems_X; ++x) {
+ QGraphicsRectItem *item = new QGraphicsRectItem(itemRect);
+ item->setPos((x - numItems_X/2) * itemRect.width(), (y - numItems_Y/2) * itemRect.height());
+ scene.addItem(item);
+ }
+ }
+
+ scene.items(QPointF(0, 0)); // triggers indexing
+ processEvents();
+
+ QGraphicsItem *item = 0;
+ QBENCHMARK {
+ item = scene.items(QPointF(0, 0)).value(0, nullptr);
+ }
+
+ //let QGraphicsScene::_q_polishItems be called so ~QGraphicsItem doesn't spend all his time cleaning the unpolished list
+ qApp->processEvents();
+}
+
+void tst_QGraphicsScene::initialShow()
+{
+ QGraphicsScene scene;
+
+ QBENCHMARK {
+ for (int y = 0; y < 30000; ++y) {
+ QGraphicsRectItem *item = new QGraphicsRectItem(0, 0, 50, 50);
+ item->setPos((y/2) * item->rect().width(), (y/2) * item->rect().height());
+ scene.addItem(item);
+ }
+ scene.items(QPointF(0, 0)); // triggers indexing
+ //This call polish the items so we bench their processing too.
+ qApp->processEvents();
+ }
+}
+
+QTEST_MAIN(tst_QGraphicsScene)
+#include "tst_qgraphicsscene.moc"
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/chip.cpp b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/chip.cpp
new file mode 100644
index 0000000000..57ab62b1c3
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/chip.cpp
@@ -0,0 +1,163 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "chip.h"
+
+#include <QtGui>
+
+Chip::Chip(const QColor &color, int x, int y)
+{
+ this->x = x;
+ this->y = y;
+ this->color = color;
+ setZValue((x + y) % 2);
+
+ setFlags(ItemIsSelectable | ItemIsMovable);
+ setAcceptsHoverEvents(true);
+}
+
+QRectF Chip::boundingRect() const
+{
+ return QRectF(0, 0, 110, 70);
+}
+
+QPainterPath Chip::shape() const
+{
+ QPainterPath path;
+ path.addRect(14, 14, 82, 42);
+ return path;
+}
+
+void Chip::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+{
+ Q_UNUSED(widget);
+
+ QColor fillColor = (option->state & QStyle::State_Selected) ? color.dark(150) : color;
+ if (option->state & QStyle::State_MouseOver)
+ fillColor = fillColor.light(125);
+
+ if (option->levelOfDetail < 0.2) {
+ if (option->levelOfDetail < 0.125) {
+ painter->fillRect(QRectF(0, 0, 110, 70), fillColor);
+ return;
+ }
+
+ painter->setPen(QPen(Qt::black, 0));
+ painter->setBrush(fillColor);
+ painter->drawRect(13, 13, 97, 57);
+ return;
+ }
+
+ QPen oldPen = painter->pen();
+ QPen pen = oldPen;
+ int width = 0;
+ if (option->state & QStyle::State_Selected)
+ width += 2;
+
+ pen.setWidth(width);
+ painter->setBrush(QBrush(fillColor.dark(option->state & QStyle::State_Sunken ? 120 : 100)));
+
+ painter->drawRect(QRect(14, 14, 79, 39));
+ if (option->levelOfDetail >= 1) {
+ painter->setPen(QPen(Qt::gray, 1));
+ painter->drawLine(15, 54, 94, 54);
+ painter->drawLine(94, 53, 94, 15);
+ painter->setPen(QPen(Qt::black, 0));
+ }
+
+ // Draw text
+ if (option->levelOfDetail >= 2) {
+ QFont font("Times", 10);
+ font.setStyleStrategy(QFont::ForceOutline);
+ painter->setFont(font);
+ painter->save();
+ painter->scale(0.1, 0.1);
+ painter->drawText(170, 180, QString("Model: VSC-2000 (Very Small Chip) at %1x%2").arg(x).arg(y));
+ painter->drawText(170, 200, QString("Serial number: DLWR-WEER-123L-ZZ33-SDSJ"));
+ painter->drawText(170, 220, QString("Manufacturer: Chip Manufacturer"));
+ painter->restore();
+ }
+
+ // Draw lines
+ QVarLengthArray<QLineF, 36> lines;
+ if (option->levelOfDetail >= 0.5) {
+ for (int i = 0; i <= 10; i += (option->levelOfDetail > 0.5 ? 1 : 2)) {
+ lines.append(QLineF(18 + 7 * i, 13, 18 + 7 * i, 5));
+ lines.append(QLineF(18 + 7 * i, 54, 18 + 7 * i, 62));
+ }
+ for (int i = 0; i <= 6; i += (option->levelOfDetail > 0.5 ? 1 : 2)) {
+ lines.append(QLineF(5, 18 + i * 5, 13, 18 + i * 5));
+ lines.append(QLineF(94, 18 + i * 5, 102, 18 + i * 5));
+ }
+ }
+ if (option->levelOfDetail >= 0.4) {
+ const QLineF lineData[] = {
+ QLineF(25, 35, 35, 35),
+ QLineF(35, 30, 35, 40),
+ QLineF(35, 30, 45, 35),
+ QLineF(35, 40, 45, 35),
+ QLineF(45, 30, 45, 40),
+ QLineF(45, 35, 55, 35)
+ };
+ lines.append(lineData, 6);
+ }
+ painter->drawLines(lines.data(), lines.size());
+
+ // Draw red ink
+ if (stuff.size() > 1) {
+ painter->setPen(QPen(Qt::red, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
+ painter->setBrush(Qt::NoBrush);
+ QPainterPath path;
+ path.moveTo(stuff.first());
+ for (int i = 1; i < stuff.size(); ++i)
+ path.lineTo(stuff.at(i));
+ painter->drawPath(path);
+ }
+}
+
+void Chip::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+ QGraphicsItem::mousePressEvent(event);
+ update();
+}
+
+void Chip::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+ if (event->modifiers() & Qt::ShiftModifier) {
+ stuff << event->pos();
+ update();
+ return;
+ }
+ QGraphicsItem::mouseMoveEvent(event);
+}
+
+void Chip::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+ QGraphicsItem::mouseReleaseEvent(event);
+ update();
+}
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/chip.debug b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/chip.debug
new file mode 100644
index 0000000000..8fe1e5b0f1
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/chip.debug
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/chip.h b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/chip.h
new file mode 100644
index 0000000000..c14f8c41de
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/chip.h
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef CHIP_H
+#define CHIP_H
+
+#include <QtGui/QColor>
+#include <QtGui/QGraphicsItem>
+
+class Chip : public QGraphicsItem
+{
+public:
+ Chip(const QColor &color, int x, int y);
+
+ QRectF boundingRect() const;
+ QPainterPath shape() const;
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *item, QWidget *widget);
+
+protected:
+ void mousePressEvent(QGraphicsSceneMouseEvent *event);
+ void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+ void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+
+private:
+ int x, y;
+ QColor color;
+ QVector<QPointF> stuff;
+};
+
+#endif
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/chip.pro b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/chip.pro
new file mode 100644
index 0000000000..8ef79cef23
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/chip.pro
@@ -0,0 +1,19 @@
+RESOURCES += images.qrc
+
+HEADERS += mainwindow.h view.h chip.h
+SOURCES += main.cpp
+SOURCES += mainwindow.cpp view.cpp chip.cpp
+
+qtHaveModule(opengl): QT += opengl
+
+build_all:!build_pass {
+ CONFIG -= build_all
+ CONFIG += release
+}
+
+# install
+target.path = $$[QT_INSTALL_EXAMPLES]/graphicsview/chip
+sources.files = $$SOURCES $$HEADERS $$RESOURCES *.png *.pro *.html *.doc images
+sources.path = $$[QT_INSTALL_EXAMPLES]/graphicsview/chip
+INSTALLS += target sources
+
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/fileprint.png b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/fileprint.png
new file mode 100644
index 0000000000..ba7c02dc18
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/fileprint.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/images.qrc b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/images.qrc
new file mode 100644
index 0000000000..c7cdf0c4c0
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/images.qrc
@@ -0,0 +1,10 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>qt4logo.png</file>
+ <file>zoomin.png</file>
+ <file>zoomout.png</file>
+ <file>rotateleft.png</file>
+ <file>rotateright.png</file>
+ <file>fileprint.png</file>
+</qresource>
+</RCC>
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/main.cpp b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/main.cpp
new file mode 100644
index 0000000000..53fcfa7192
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/main.cpp
@@ -0,0 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "mainwindow.h"
+
+#include <QApplication>
+
+int main(int argc, char **argv)
+{
+ Q_INIT_RESOURCE(images);
+
+ QApplication app(argc, argv);
+ app.setAttribute(Qt::AA_DontCreateNativeWidgetSiblings);
+
+ MainWindow window;
+ window.show();
+
+ return app.exec();
+}
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/mainwindow.cpp b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/mainwindow.cpp
new file mode 100644
index 0000000000..b162461403
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/mainwindow.cpp
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "mainwindow.h"
+#include "view.h"
+#include "chip.h"
+
+#include <QtGui>
+
+MainWindow::MainWindow(QWidget *parent)
+ : QWidget(parent)
+{
+ populateScene();
+
+ View *view = new View("Top left view");
+ view->view()->setScene(scene);
+ QHBoxLayout *layout = new QHBoxLayout;
+ layout->addWidget(view);
+ setLayout(layout);
+
+ setWindowTitle(tr("Chip Example"));
+}
+
+void MainWindow::populateScene()
+{
+ scene = new QGraphicsScene;
+
+ QImage image(":/qt4logo.png");
+
+ // Populate scene
+ int xx = 0;
+ int nitems = 0;
+ for (int i = -11000; i < 11000; i += 110) {
+ ++xx;
+ int yy = 0;
+ for (int j = -7000; j < 7000; j += 70) {
+ ++yy;
+ qreal x = (i + 11000) / 22000.0;
+ qreal y = (j + 7000) / 14000.0;
+
+ QColor color(image.pixel(int(image.width() * x), int(image.height() * y)));
+ QGraphicsItem *item = new Chip(color, xx, yy);
+ item->setPos(QPointF(i, j));
+ scene->addItem(item);
+
+ ++nitems;
+ }
+ }
+}
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/mainwindow.h b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/mainwindow.h
new file mode 100644
index 0000000000..b0e12b448a
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/mainwindow.h
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <QtGui/qwidget.h>
+
+QT_FORWARD_DECLARE_CLASS(QGraphicsScene)
+QT_FORWARD_DECLARE_CLASS(QGraphicsView)
+QT_FORWARD_DECLARE_CLASS(QLabel)
+QT_FORWARD_DECLARE_CLASS(QSlider)
+QT_FORWARD_DECLARE_CLASS(QSplitter)
+
+class MainWindow : public QWidget
+{
+ Q_OBJECT
+public:
+ MainWindow(QWidget *parent = 0);
+
+private:
+ void setupMatrix();
+ void populateScene();
+
+ QGraphicsScene *scene;
+};
+
+#endif
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/qt4logo.png b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/qt4logo.png
new file mode 100644
index 0000000000..157e86ed64
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/qt4logo.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/rotateleft.png b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/rotateleft.png
new file mode 100644
index 0000000000..8cfa931986
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/rotateleft.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/rotateright.png b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/rotateright.png
new file mode 100644
index 0000000000..ec5e8664a1
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/rotateright.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/view.cpp b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/view.cpp
new file mode 100644
index 0000000000..de4e9e5ad7
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/view.cpp
@@ -0,0 +1,251 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "view.h"
+
+#include <QtGui>
+
+#if 0 // Used to be included in Qt4 for Q_WS_WIN
+#define CALLGRIND_START_INSTRUMENTATION {}
+#define CALLGRIND_STOP_INSTRUMENTATION {}
+#else
+#include "valgrind/callgrind.h"
+#endif
+
+#ifndef QT_NO_OPENGL
+#include <QtOpenGL>
+#endif
+
+#include <qmath.h>
+
+class CountView : public QGraphicsView
+{
+protected:
+ void paintEvent(QPaintEvent *event)
+ {
+ static int n = 0;
+ if (n)
+ CALLGRIND_START_INSTRUMENTATION
+ QGraphicsView::paintEvent(event);
+ if (n)
+ CALLGRIND_STOP_INSTRUMENTATION
+ if (++n == 500)
+ qApp->quit();
+ }
+};
+
+View::View(const QString &name, QWidget *parent)
+ : QFrame(parent)
+{
+ setFrameStyle(Sunken | StyledPanel);
+ graphicsView = new CountView;
+ graphicsView->setRenderHint(QPainter::Antialiasing, false);
+ graphicsView->setDragMode(QGraphicsView::RubberBandDrag);
+ graphicsView->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
+
+ int size = style()->pixelMetric(QStyle::PM_ToolBarIconSize);
+ QSize iconSize(size, size);
+
+ QToolButton *zoomInIcon = new QToolButton;
+ zoomInIcon->setAutoRepeat(true);
+ zoomInIcon->setAutoRepeatInterval(33);
+ zoomInIcon->setAutoRepeatDelay(0);
+ zoomInIcon->setIcon(QPixmap(":/zoomin.png"));
+ zoomInIcon->setIconSize(iconSize);
+ QToolButton *zoomOutIcon = new QToolButton;
+ zoomOutIcon->setAutoRepeat(true);
+ zoomOutIcon->setAutoRepeatInterval(33);
+ zoomOutIcon->setAutoRepeatDelay(0);
+ zoomOutIcon->setIcon(QPixmap(":/zoomout.png"));
+ zoomOutIcon->setIconSize(iconSize);
+ zoomSlider = new QSlider;
+ zoomSlider->setMinimum(0);
+ zoomSlider->setMaximum(500);
+ zoomSlider->setValue(250);
+ zoomSlider->setTickPosition(QSlider::TicksRight);
+
+ // Zoom slider layout
+ QVBoxLayout *zoomSliderLayout = new QVBoxLayout;
+ zoomSliderLayout->addWidget(zoomInIcon);
+ zoomSliderLayout->addWidget(zoomSlider);
+ zoomSliderLayout->addWidget(zoomOutIcon);
+
+ QToolButton *rotateLeftIcon = new QToolButton;
+ rotateLeftIcon->setIcon(QPixmap(":/rotateleft.png"));
+ rotateLeftIcon->setIconSize(iconSize);
+ QToolButton *rotateRightIcon = new QToolButton;
+ rotateRightIcon->setIcon(QPixmap(":/rotateright.png"));
+ rotateRightIcon->setIconSize(iconSize);
+ rotateSlider = new QSlider;
+ rotateSlider->setOrientation(Qt::Horizontal);
+ rotateSlider->setMinimum(-360);
+ rotateSlider->setMaximum(360);
+ rotateSlider->setValue(0);
+ rotateSlider->setTickPosition(QSlider::TicksBelow);
+
+ // Rotate slider layout
+ QHBoxLayout *rotateSliderLayout = new QHBoxLayout;
+ rotateSliderLayout->addWidget(rotateLeftIcon);
+ rotateSliderLayout->addWidget(rotateSlider);
+ rotateSliderLayout->addWidget(rotateRightIcon);
+
+ resetButton = new QToolButton;
+ resetButton->setText(tr("0"));
+ resetButton->setEnabled(false);
+
+ // Label layout
+ QHBoxLayout *labelLayout = new QHBoxLayout;
+ label = new QLabel(name);
+ antialiasButton = new QToolButton;
+ antialiasButton->setText(tr("Antialiasing"));
+ antialiasButton->setCheckable(true);
+ antialiasButton->setChecked(false);
+ openGlButton = new QToolButton;
+ openGlButton->setText(tr("OpenGL"));
+ openGlButton->setCheckable(true);
+#ifndef QT_NO_OPENGL
+ openGlButton->setEnabled(QGLFormat::hasOpenGL());
+#else
+ openGlButton->setEnabled(false);
+#endif
+ printButton = new QToolButton;
+ printButton->setIcon(QIcon(QPixmap(":/fileprint.png")));
+
+ labelLayout->addWidget(label);
+ labelLayout->addStretch();
+ labelLayout->addWidget(antialiasButton);
+ labelLayout->addWidget(openGlButton);
+ labelLayout->addWidget(printButton);
+
+ QGridLayout *topLayout = new QGridLayout;
+ topLayout->addLayout(labelLayout, 0, 0);
+ topLayout->addWidget(graphicsView, 1, 0);
+ topLayout->addLayout(zoomSliderLayout, 1, 1);
+ topLayout->addLayout(rotateSliderLayout, 2, 0);
+ topLayout->addWidget(resetButton, 2, 1);
+ setLayout(topLayout);
+
+ connect(resetButton, SIGNAL(clicked()), this, SLOT(resetView()));
+ connect(zoomSlider, SIGNAL(valueChanged(int)), this, SLOT(setupMatrix()));
+ connect(rotateSlider, SIGNAL(valueChanged(int)), this, SLOT(setupMatrix()));
+ connect(graphicsView->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(setResetButtonEnabled()));
+ connect(graphicsView->horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(setResetButtonEnabled()));
+ connect(antialiasButton, SIGNAL(toggled(bool)), this, SLOT(toggleAntialiasing()));
+ connect(openGlButton, SIGNAL(toggled(bool)), this, SLOT(toggleOpenGL()));
+ connect(rotateLeftIcon, SIGNAL(clicked()), this, SLOT(rotateLeft()));
+ connect(rotateRightIcon, SIGNAL(clicked()), this, SLOT(rotateRight()));
+ connect(zoomInIcon, SIGNAL(clicked()), this, SLOT(zoomIn()));
+ connect(zoomOutIcon, SIGNAL(clicked()), this, SLOT(zoomOut()));
+ connect(printButton, SIGNAL(clicked()), this, SLOT(print()));
+
+ setupMatrix();
+
+ startTimer(0);
+}
+
+QGraphicsView *View::view() const
+{
+ return graphicsView;
+}
+
+void View::resetView()
+{
+ zoomSlider->setValue(250);
+ rotateSlider->setValue(0);
+ setupMatrix();
+ graphicsView->ensureVisible(QRectF(0, 0, 0, 0));
+
+ resetButton->setEnabled(false);
+}
+
+void View::setResetButtonEnabled()
+{
+ resetButton->setEnabled(true);
+}
+
+void View::setupMatrix()
+{
+ qreal scale = qPow(qreal(2), (zoomSlider->value() - 250) / qreal(50));
+
+ QMatrix matrix;
+ matrix.scale(scale, scale);
+ matrix.rotate(rotateSlider->value());
+
+ graphicsView->setMatrix(matrix);
+ setResetButtonEnabled();
+}
+
+void View::toggleOpenGL()
+{
+#ifndef QT_NO_OPENGL
+ graphicsView->setViewport(openGlButton->isChecked() ? new QGLWidget(QGLFormat(QGL::SampleBuffers)) : new QWidget);
+#endif
+}
+
+void View::toggleAntialiasing()
+{
+ graphicsView->setRenderHint(QPainter::Antialiasing, antialiasButton->isChecked());
+}
+
+void View::print()
+{
+#ifndef QT_NO_PRINTER
+ QPrinter printer;
+ QPrintDialog dialog(&printer, this);
+ if (dialog.exec() == QDialog::Accepted) {
+ QPainter painter(&printer);
+ graphicsView->render(&painter);
+ }
+#endif
+}
+
+void View::zoomIn()
+{
+ zoomSlider->setValue(zoomSlider->value() + 1);
+}
+
+void View::zoomOut()
+{
+ zoomSlider->setValue(zoomSlider->value() - 1);
+}
+
+void View::rotateLeft()
+{
+ rotateSlider->setValue(rotateSlider->value() - 10);
+}
+
+void View::rotateRight()
+{
+ rotateSlider->setValue(rotateSlider->value() + 10);
+}
+
+void View::timerEvent(QTimerEvent *)
+{
+ graphicsView->horizontalScrollBar()->setValue(graphicsView->horizontalScrollBar()->value() + 1);
+}
+
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/view.h b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/view.h
new file mode 100644
index 0000000000..e20543858b
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/view.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef VIEW_H
+#define VIEW_H
+
+#include <QFrame>
+
+QT_FORWARD_DECLARE_CLASS(QGraphicsView)
+QT_FORWARD_DECLARE_CLASS(QLabel)
+QT_FORWARD_DECLARE_CLASS(QSlider)
+QT_FORWARD_DECLARE_CLASS(QToolButton)
+
+class View : public QFrame
+{
+ Q_OBJECT
+public:
+ View(const QString &name, QWidget *parent = 0);
+
+ QGraphicsView *view() const;
+
+private slots:
+ void resetView();
+ void setResetButtonEnabled();
+ void setupMatrix();
+ void toggleOpenGL();
+ void toggleAntialiasing();
+ void print();
+
+ void zoomIn();
+ void zoomOut();
+ void rotateLeft();
+ void rotateRight();
+
+ void timerEvent(QTimerEvent *);
+
+private:
+ QGraphicsView *graphicsView;
+ QLabel *label;
+ QToolButton *openGlButton;
+ QToolButton *antialiasButton;
+ QToolButton *printButton;
+ QToolButton *resetButton;
+ QSlider *zoomSlider;
+ QSlider *rotateSlider;
+};
+
+#endif
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/zoomin.png b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/zoomin.png
new file mode 100644
index 0000000000..8b0daeea48
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/zoomin.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/zoomout.png b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/zoomout.png
new file mode 100644
index 0000000000..1575dd24f6
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/chipTest/zoomout.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/moveItems/main.cpp b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/moveItems/main.cpp
new file mode 100644
index 0000000000..e0cc0f8eb4
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/moveItems/main.cpp
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtGui>
+
+#if 0 // Used to be included in Qt4 for Q_WS_WIN
+#define CALLGRIND_START_INSTRUMENTATION {}
+#define CALLGRIND_STOP_INSTRUMENTATION {}
+#else
+#include "valgrind/callgrind.h"
+#endif
+
+#if 0 // Used to be included in Qt4 for Q_WS_X11
+extern void qt_x11_wait_for_window_manager(QWidget *);
+#endif
+
+class View : public QGraphicsView
+{
+ Q_OBJECT
+public:
+ View(QGraphicsScene *scene, QGraphicsItem *item)
+ : QGraphicsView(scene), _item(item)
+ {
+ }
+
+protected:
+ void paintEvent(QPaintEvent *event)
+ {
+ static int n = 0;
+ if (n)
+ CALLGRIND_START_INSTRUMENTATION
+ QGraphicsView::paintEvent(event);
+ _item->moveBy(1, 1);
+ if (n)
+ CALLGRIND_STOP_INSTRUMENTATION
+ if (++n == 200)
+ qApp->quit();
+ }
+
+private:
+ QGraphicsItem *_item;
+};
+
+int main(int argc, char *argv[])
+{
+ QApplication app(argc, argv);
+
+ if (argc < 2) {
+ qDebug("usage: ./%s <numItems>", argv[0]);
+ return 1;
+ }
+
+ QGraphicsScene scene(-150, -150, 300, 300);
+ scene.setItemIndexMethod(QGraphicsScene::NoIndex);
+
+ QGraphicsRectItem *item = scene.addRect(-50, -50, 100, 100, QPen(Qt::NoPen), QBrush(Qt::blue));
+ item->setFlag(QGraphicsItem::ItemIsMovable);
+
+ for (int i = 0; i < atoi(argv[1]); ++i) {
+ QGraphicsRectItem *child = scene.addRect(-5, -5, 10, 10, QPen(Qt::NoPen), QBrush(Qt::blue));
+ child->setPos(-50 + QRandomGenerator::global()->bounded(100), -50 + QRandomGenerator::global()->bounded(100));
+ child->setParentItem(item);
+ }
+
+ View view(&scene, item);
+ view.resize(300, 300);
+ view.show();
+#if 0 // Used to be included in Qt4 for Q_WS_X11
+ qt_x11_wait_for_window_manager(&view);
+#endif
+
+ return app.exec();
+}
+
+#include "main.moc"
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/moveItems/moveItems.pro b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/moveItems/moveItems.pro
new file mode 100644
index 0000000000..28dcadcbfa
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/moveItems/moveItems.pro
@@ -0,0 +1 @@
+SOURCES += main.cpp
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/scrolltest/main.cpp b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/scrolltest/main.cpp
new file mode 100644
index 0000000000..1fbb229cd8
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/scrolltest/main.cpp
@@ -0,0 +1,139 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtGui>
+
+#if 0 // Used to be included in Qt4 for Q_WS_WIN
+#define CALLGRIND_START_INSTRUMENTATION {}
+#define CALLGRIND_STOP_INSTRUMENTATION {}
+#else
+#include "valgrind/callgrind.h"
+#endif
+
+class ItemMover : public QObject
+{
+ Q_OBJECT
+public:
+ ItemMover(QGraphicsItem *item)
+ : _item(item)
+ {
+ startTimer(0);
+ }
+
+protected:
+ void timerEvent(QTimerEvent *event)
+ {
+ _item->moveBy(-1, 0);
+ }
+
+private:
+ QGraphicsItem *_item;
+};
+
+class ClipItem : public QGraphicsRectItem
+{
+public:
+ ClipItem(qreal x, qreal y, qreal w, qreal h, const QPen &pen, const QBrush &brush)
+ : QGraphicsRectItem(x, y, w, h)
+ {
+ setPen(pen);
+ setBrush(brush);
+ }
+
+ QPainterPath shape() const
+ {
+ QPainterPath path;
+ path.addRect(rect());
+ return path;
+ }
+};
+
+class CountView : public QGraphicsView
+{
+protected:
+ void paintEvent(QPaintEvent *event)
+ {
+ static int n = 0;
+ if (n)
+ CALLGRIND_START_INSTRUMENTATION
+ QGraphicsView::paintEvent(event);
+ if (n)
+ CALLGRIND_STOP_INSTRUMENTATION
+ if (++n == 500)
+ qApp->quit();
+ }
+};
+
+int main(int argc, char *argv[])
+{
+ QApplication app(argc, argv);
+
+ QGraphicsScene scene;
+ scene.setItemIndexMethod(QGraphicsScene::NoIndex);
+
+ ClipItem *clipItem = new ClipItem(0, 0, 100, 100, QPen(), QBrush(Qt::blue));
+ clipItem->setFlag(QGraphicsItem::ItemClipsChildrenToShape);
+ clipItem->setData(0, "clipItem");
+ scene.addItem(clipItem);
+
+ QGraphicsRectItem *scrollItem = scene.addRect(0, 0, 10, 10, QPen(Qt::NoPen), QBrush(Qt::NoBrush));
+ scrollItem->setParentItem(clipItem);
+ scrollItem->setFlag(QGraphicsItem::ItemIsMovable);
+ scrollItem->setData(0, "scrollItem");
+
+ for (int y = 0; y < 25; ++y) {
+ for (int x = 0; x < 25; ++x) {
+ ClipItem *rect = new ClipItem(0, 0, 90, 20, QPen(Qt::NoPen), QBrush(Qt::green));
+ rect->setParentItem(scrollItem);
+ rect->setPos(x * 95, y * 25);
+ rect->setData(0, qPrintable(QString("rect %1 %2").arg(x).arg(y)));
+ rect->setFlag(QGraphicsItem::ItemClipsChildrenToShape);
+
+ QGraphicsEllipseItem *ellipse = new QGraphicsEllipseItem(-5, -5, 10, 10);
+ ellipse->setPen(QPen(Qt::NoPen));
+ ellipse->setBrush(QBrush(Qt::yellow));
+ ellipse->setParentItem(rect);
+ ellipse->setData(0, qPrintable(QString("ellipse %1 %2").arg(x).arg(y)));
+ }
+ }
+
+ scrollItem->setRect(scrollItem->childrenBoundingRect());
+
+#if 0
+ ItemMover mover(scrollItem);
+#endif
+
+ CountView view;
+ view.setScene(&scene);
+ view.setSceneRect(-25, -25, 150, 150);
+ view.resize(300, 300);
+ view.show();
+
+ return app.exec();
+}
+
+#include "main.moc"
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/scrolltest/scrolltest.pro b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/scrolltest/scrolltest.pro
new file mode 100644
index 0000000000..28dcadcbfa
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/benchapps/scrolltest/scrolltest.pro
@@ -0,0 +1 @@
+SOURCES += main.cpp
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chip.cpp b/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chip.cpp
new file mode 100644
index 0000000000..cf82282bfe
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chip.cpp
@@ -0,0 +1,169 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "chip.h"
+
+#include <QtWidgets>
+
+Chip::Chip(const QColor &color, int x, int y)
+{
+ this->x = x;
+ this->y = y;
+ this->color = color;
+ setZValue((x + y) % 2);
+
+ setFlags(ItemIsSelectable | ItemIsMovable);
+ setAcceptHoverEvents(true);
+}
+
+QRectF Chip::boundingRect() const
+{
+ return QRectF(0, 0, 110, 70);
+}
+
+QPainterPath Chip::shape() const
+{
+ QPainterPath path;
+ path.addRect(14, 14, 82, 42);
+ return path;
+}
+
+void Chip::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+{
+ Q_UNUSED(widget);
+
+ QColor fillColor = (option->state & QStyle::State_Selected) ? color.dark(150) : color;
+ if (option->state & QStyle::State_MouseOver)
+ fillColor = fillColor.light(125);
+
+ if (option->levelOfDetail < 0.2) {
+ if (option->levelOfDetail < 0.125) {
+ painter->fillRect(QRectF(0, 0, 110, 70), fillColor);
+ return;
+ }
+
+ QBrush b = painter->brush();
+ painter->setBrush(fillColor);
+ painter->drawRect(13, 13, 97, 57);
+ painter->setBrush(b);
+ return;
+ }
+
+ QPen oldPen = painter->pen();
+ QPen pen = oldPen;
+ int width = 0;
+ if (option->state & QStyle::State_Selected)
+ width += 2;
+
+ pen.setWidth(width);
+ QBrush b = painter->brush();
+ painter->setBrush(QBrush(fillColor.dark(option->state & QStyle::State_Sunken ? 120 : 100)));
+
+ painter->drawRect(QRect(14, 14, 79, 39));
+ painter->setBrush(b);
+
+ if (option->levelOfDetail >= 1) {
+ painter->setPen(QPen(Qt::gray, 1));
+ painter->drawLine(15, 54, 94, 54);
+ painter->drawLine(94, 53, 94, 15);
+ painter->setPen(QPen(Qt::black, 0));
+ }
+
+ // Draw text
+ if (option->levelOfDetail >= 2) {
+ QFont font("Times", 10);
+ font.setStyleStrategy(QFont::ForceOutline);
+ painter->setFont(font);
+ painter->save();
+ painter->scale(0.1, 0.1);
+ painter->drawText(170, 180, QString("Model: VSC-2000 (Very Small Chip) at %1x%2").arg(x).arg(y));
+ painter->drawText(170, 200, QString("Serial number: DLWR-WEER-123L-ZZ33-SDSJ"));
+ painter->drawText(170, 220, QString("Manufacturer: Chip Manufacturer"));
+ painter->restore();
+ }
+
+ // Draw lines
+ QVarLengthArray<QLineF, 36> lines;
+ if (option->levelOfDetail >= 0.5) {
+ for (int i = 0; i <= 10; i += (option->levelOfDetail > 0.5 ? 1 : 2)) {
+ lines.append(QLineF(18 + 7 * i, 13, 18 + 7 * i, 5));
+ lines.append(QLineF(18 + 7 * i, 54, 18 + 7 * i, 62));
+ }
+ for (int i = 0; i <= 6; i += (option->levelOfDetail > 0.5 ? 1 : 2)) {
+ lines.append(QLineF(5, 18 + i * 5, 13, 18 + i * 5));
+ lines.append(QLineF(94, 18 + i * 5, 102, 18 + i * 5));
+ }
+ }
+ if (option->levelOfDetail >= 0.4) {
+ const QLineF lineData[] = {
+ QLineF(25, 35, 35, 35),
+ QLineF(35, 30, 35, 40),
+ QLineF(35, 30, 45, 35),
+ QLineF(35, 40, 45, 35),
+ QLineF(45, 30, 45, 40),
+ QLineF(45, 35, 55, 35)
+ };
+ lines.append(lineData, 6);
+ }
+ painter->drawLines(lines.data(), lines.size());
+
+ // Draw red ink
+ if (stuff.size() > 1) {
+ QPen p = painter->pen();
+ painter->setPen(QPen(Qt::red, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
+ painter->setBrush(Qt::NoBrush);
+ QPainterPath path;
+ path.moveTo(stuff.first());
+ for (int i = 1; i < stuff.size(); ++i)
+ path.lineTo(stuff.at(i));
+ painter->drawPath(path);
+ painter->setPen(p);
+ }
+}
+
+void Chip::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+ QGraphicsItem::mousePressEvent(event);
+ update();
+}
+
+void Chip::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+ if (event->modifiers() & Qt::ShiftModifier) {
+ stuff << event->pos();
+ update();
+ return;
+ }
+ QGraphicsItem::mouseMoveEvent(event);
+}
+
+void Chip::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+ QGraphicsItem::mouseReleaseEvent(event);
+ update();
+}
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chip.h b/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chip.h
new file mode 100644
index 0000000000..d991f771e2
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chip.h
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef CHIP_H
+#define CHIP_H
+
+#include <QtGui/QColor>
+#include <QtWidgets/QGraphicsItem>
+
+class Chip : public QGraphicsItem
+{
+public:
+ Chip(const QColor &color, int x, int y);
+
+ QRectF boundingRect() const;
+ QPainterPath shape() const;
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *item, QWidget *widget);
+
+protected:
+ void mousePressEvent(QGraphicsSceneMouseEvent *event);
+ void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+ void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+
+private:
+ int x, y;
+ QColor color;
+ QVector<QPointF> stuff;
+};
+
+#endif
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.cpp b/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.cpp
new file mode 100644
index 0000000000..dfa08b6869
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.cpp
@@ -0,0 +1,132 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "chiptester.h"
+#include "chip.h"
+
+#include <QtGui>
+#include <QScrollBar>
+#ifndef QT_NO_OPENGL
+#include <QtOpenGL>
+#endif
+
+ChipTester::ChipTester(QWidget *parent)
+ : QGraphicsView(parent),
+ npaints(0)
+{
+ resize(400, 300);
+ setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ setFrameStyle(0);
+ setTransformationAnchor(NoAnchor);
+
+ populateScene();
+ setScene(scene);
+
+ setWindowTitle(tr("Chip Example"));
+}
+
+void ChipTester::setAntialias(bool enabled)
+{
+ setRenderHint(QPainter::Antialiasing, enabled);
+}
+
+void ChipTester::setOpenGL(bool enabled)
+{
+#ifndef QT_NO_OPENGL
+ setViewport(enabled ? new QGLWidget(QGLFormat(QGL::SampleBuffers)) : 0);
+#endif
+}
+
+void ChipTester::setOperation(Operation operation)
+{
+ this->operation = operation;
+}
+
+void ChipTester::runBenchmark()
+{
+ npaints = 0;
+ timerId = startTimer(0);
+ stopWatch.start();
+ eventLoop.exec();
+ killTimer(timerId);
+}
+
+void ChipTester::paintEvent(QPaintEvent *event)
+{
+ QGraphicsView::paintEvent(event);
+ if (++npaints == 50)
+ eventLoop.quit();
+}
+
+void ChipTester::timerEvent(QTimerEvent *)
+{
+ switch (operation) {
+ case Rotate360:
+ rotate(1);
+ break;
+ case ZoomInOut: {
+ qreal s = 0.05 + (npaints / 20.0);
+ setTransform(QTransform().scale(s, s));
+ break;
+ }
+ case Translate: {
+ int offset = horizontalScrollBar()->minimum()
+ + (npaints % (horizontalScrollBar()->maximum() - horizontalScrollBar()->minimum()));
+ horizontalScrollBar()->setValue(offset);
+ break;
+ }
+ }
+}
+
+void ChipTester::populateScene()
+{
+ scene = new QGraphicsScene;
+
+ QImage image(":/qt4logo.png");
+
+ // Populate scene
+ int xx = 0;
+ int nitems = 0;
+ for (int i = -1100; i < 1100; i += 110) {
+ ++xx;
+ int yy = 0;
+ for (int j = -700; j < 700; j += 70) {
+ ++yy;
+ qreal x = (i + 1100) / 2200.0;
+ qreal y = (j + 700) / 1400.0;
+
+ QColor color(image.pixel(int(image.width() * x), int(image.height() * y)));
+ QGraphicsItem *item = new Chip(color, xx, yy);
+ item->setPos(QPointF(i, j));
+ scene->addItem(item);
+
+ ++nitems;
+ }
+ }
+}
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.h b/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.h
new file mode 100644
index 0000000000..d85686c94e
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.h
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef CHIPTESTER_H
+#define CHIPTESTER_H
+
+#include <QtWidgets/QGraphicsView>
+#include <QtCore/QEventLoop>
+#include <QtCore/QTime>
+
+QT_FORWARD_DECLARE_CLASS(QGraphicsScene)
+QT_FORWARD_DECLARE_CLASS(QGraphicsView)
+QT_FORWARD_DECLARE_CLASS(QLabel)
+QT_FORWARD_DECLARE_CLASS(QSlider)
+QT_FORWARD_DECLARE_CLASS(QSplitter)
+
+class ChipTester : public QGraphicsView
+{
+ Q_OBJECT
+public:
+ enum Operation {
+ Rotate360,
+ ZoomInOut,
+ Translate
+ };
+ ChipTester(QWidget *parent = 0);
+
+ void setAntialias(bool enabled);
+ void setOpenGL(bool enabled);
+ void runBenchmark();
+ void setOperation(Operation operation);
+
+protected:
+ void paintEvent(QPaintEvent *event);
+ void timerEvent(QTimerEvent *event);
+
+private:
+ void populateScene();
+
+ QGraphicsView *view;
+ QGraphicsScene *scene;
+ int npaints;
+ int timerId;
+ QEventLoop eventLoop;
+ QTime stopWatch;
+ Operation operation;
+};
+
+#endif
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.pri b/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.pri
new file mode 100644
index 0000000000..105117de30
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.pri
@@ -0,0 +1,13 @@
+SOURCES += \
+ chiptester/chiptester.cpp \
+ chiptester/chip.cpp
+
+HEADERS += \
+ chiptester/chiptester.h \
+ chiptester/chip.h
+
+RESOURCES += \
+ chiptester/images.qrc
+
+QT += widgets
+qtHaveModule(opengl): QT += opengl
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/images.qrc b/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/images.qrc
new file mode 100644
index 0000000000..73e8620b25
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/images.qrc
@@ -0,0 +1,5 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>qt4logo.png</file>
+</qresource>
+</RCC>
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/qt4logo.png b/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/qt4logo.png
new file mode 100644
index 0000000000..157e86ed64
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/qt4logo.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/images/designer.png b/tests/benchmarks/widgets/graphicsview/qgraphicsview/images/designer.png
new file mode 100644
index 0000000000..0988fcee3f
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/images/designer.png
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/images/wine-big.jpeg b/tests/benchmarks/widgets/graphicsview/qgraphicsview/images/wine-big.jpeg
new file mode 100644
index 0000000000..9900a50f94
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/images/wine-big.jpeg
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/images/wine.jpeg b/tests/benchmarks/widgets/graphicsview/qgraphicsview/images/wine.jpeg
new file mode 100644
index 0000000000..8fe1d3a67d
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/images/wine.jpeg
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/qgraphicsview.pro b/tests/benchmarks/widgets/graphicsview/qgraphicsview/qgraphicsview.pro
new file mode 100644
index 0000000000..3d48959f3c
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/qgraphicsview.pro
@@ -0,0 +1,9 @@
+QT += widgets testlib
+
+TEMPLATE = app
+TARGET = tst_bench_qgraphicsview
+
+SOURCES += tst_qgraphicsview.cpp
+RESOURCES += qgraphicsview.qrc
+
+include(chiptester/chiptester.pri)
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/qgraphicsview.qrc b/tests/benchmarks/widgets/graphicsview/qgraphicsview/qgraphicsview.qrc
new file mode 100644
index 0000000000..3681648f56
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/qgraphicsview.qrc
@@ -0,0 +1,9 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>images/designer.png</file>
+ <file>images/wine.jpeg</file>
+ <file>images/wine-big.jpeg</file>
+ <file>random.data</file>
+</qresource>
+</RCC>
+
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/random.data b/tests/benchmarks/widgets/graphicsview/qgraphicsview/random.data
new file mode 100644
index 0000000000..190a36c707
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/random.data
Binary files differ
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp b/tests/benchmarks/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
new file mode 100644
index 0000000000..9bb5231528
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
@@ -0,0 +1,901 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qtest.h>
+#include <QtCore/QDebug>
+#include <QtWidgets/QGraphicsItem>
+#include <QtWidgets/QGraphicsScene>
+#include <QtWidgets/QGraphicsView>
+#include <QtGui/QImage>
+#include <QtGui/QPixmapCache>
+#include <QtWidgets/QDesktopWidget>
+
+#include "chiptester/chiptester.h"
+//#define CALLGRIND_DEBUG
+#ifdef CALLGRIND_DEBUG
+#include "valgrind/callgrind.h"
+#endif
+
+static inline void processEvents()
+{
+ QPixmapCache::clear();
+ QApplication::processEvents();
+ QApplication::processEvents();
+}
+
+class TestView : public QGraphicsView
+{
+ Q_OBJECT
+public:
+ TestView() : QGraphicsView(), waiting(false), timerId(-1)
+ {}
+
+ void waitForPaintEvent(int timeout = 4000)
+ {
+ if (waiting)
+ return;
+ waiting = true;
+ timerId = startTimer(timeout);
+ eventLoop.exec();
+ killTimer(timerId);
+ timerId = -1;
+ waiting = false;
+ }
+
+ void tryResize(int width, int height)
+ {
+ QDesktopWidget *desktop = QApplication::desktop();
+ if (desktop->width() < width)
+ width = desktop->width();
+ if (desktop->height() < height)
+ height = desktop->height();
+ if (size() != QSize(width, height)) {
+ resize(width, height);
+ QTest::qWait(250);
+ processEvents();
+ }
+ }
+
+protected:
+ void paintEvent(QPaintEvent *event)
+ {
+ QGraphicsView::paintEvent(event);
+ if (waiting)
+ eventLoop.exit();
+ }
+
+ void timerEvent(QTimerEvent *event)
+ {
+ if (event->timerId() == timerId)
+ eventLoop.exit();
+ }
+
+private:
+ QEventLoop eventLoop;
+ bool waiting;
+ int timerId;
+};
+
+class tst_QGraphicsView : public QObject
+{
+ Q_OBJECT
+
+public:
+ tst_QGraphicsView();
+ virtual ~tst_QGraphicsView();
+
+public slots:
+ void initTestCase();
+ void init();
+ void cleanup();
+
+private slots:
+ void construct();
+ void paintSingleItem();
+ void paintDeepStackingItems();
+ void paintDeepStackingItems_clipped();
+ void moveSingleItem();
+ void mapPointToScene_data();
+ void mapPointToScene();
+ void mapPointFromScene_data();
+ void mapPointFromScene();
+ void mapRectToScene_data();
+ void mapRectToScene();
+ void mapRectFromScene_data();
+ void mapRectFromScene();
+ void chipTester_data();
+ void chipTester();
+ void deepNesting_data();
+ void deepNesting();
+ void imageRiver_data();
+ void imageRiver();
+ void textRiver_data();
+ void textRiver();
+ void moveItemCache_data();
+ void moveItemCache();
+ void paintItemCache_data();
+ void paintItemCache();
+
+private:
+ TestView mView;
+};
+
+tst_QGraphicsView::tst_QGraphicsView()
+{
+}
+
+tst_QGraphicsView::~tst_QGraphicsView()
+{
+}
+
+void tst_QGraphicsView::initTestCase()
+{
+ mView.setFrameStyle(0);
+ mView.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ mView.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ mView.tryResize(100, 100);
+ mView.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&mView));
+ QTest::qWait(300);
+ processEvents();
+}
+
+void tst_QGraphicsView::init()
+{
+ mView.setRenderHints(QPainter::RenderHints(0));
+ mView.viewport()->setMouseTracking(false);
+ mView.setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
+ for (int i = 0; i < 3; ++i)
+ processEvents();
+}
+
+void tst_QGraphicsView::cleanup()
+{
+}
+
+void tst_QGraphicsView::construct()
+{
+ QBENCHMARK {
+ QGraphicsView view;
+ }
+}
+
+void tst_QGraphicsView::paintSingleItem()
+{
+ QGraphicsScene scene(0, 0, 100, 100);
+ scene.addRect(0, 0, 10, 10);
+
+ mView.setScene(&scene);
+ mView.tryResize(100, 100);
+ processEvents();
+
+ QImage image(100, 100, QImage::Format_ARGB32_Premultiplied);
+ QPainter painter(&image);
+ QBENCHMARK {
+ mView.viewport()->render(&painter);
+ }
+}
+
+#define DEEP_STACKING_COUNT 85
+
+void tst_QGraphicsView::paintDeepStackingItems()
+{
+ QGraphicsScene scene(0, 0, 100, 100);
+ QGraphicsRectItem *item = scene.addRect(0, 0, 10, 10);
+ QGraphicsRectItem *lastRect = item;
+ for (int i = 0; i < DEEP_STACKING_COUNT; ++i) {
+ QGraphicsRectItem *rect = scene.addRect(0, 0, 10, 10);
+ rect->setPos(1, 1);
+ rect->setParentItem(lastRect);
+ lastRect = rect;
+ }
+
+ mView.setScene(&scene);
+ mView.tryResize(100, 100);
+ processEvents();
+
+ QImage image(100, 100, QImage::Format_ARGB32_Premultiplied);
+ QPainter painter(&image);
+ QBENCHMARK {
+ mView.viewport()->render(&painter);
+ }
+}
+
+void tst_QGraphicsView::paintDeepStackingItems_clipped()
+{
+ QGraphicsScene scene(0, 0, 100, 100);
+ QGraphicsRectItem *item = scene.addRect(0, 0, 10, 10);
+ item->setFlag(QGraphicsItem::ItemClipsChildrenToShape);
+ QGraphicsRectItem *lastRect = item;
+ for (int i = 0; i < DEEP_STACKING_COUNT; ++i) {
+ QGraphicsRectItem *rect = scene.addRect(0, 0, 10, 10);
+ rect->setPos(1, 1);
+ rect->setParentItem(lastRect);
+ lastRect = rect;
+ }
+
+ mView.setScene(&scene);
+ mView.tryResize(100, 100);
+ processEvents();
+
+ QImage image(100, 100, QImage::Format_ARGB32_Premultiplied);
+ QPainter painter(&image);
+ QBENCHMARK {
+ mView.viewport()->render(&painter);
+ }
+}
+
+void tst_QGraphicsView::moveSingleItem()
+{
+ QGraphicsScene scene(0, 0, 100, 100);
+ QGraphicsRectItem *item = scene.addRect(0, 0, 10, 10);
+
+ mView.setScene(&scene);
+ mView.tryResize(100, 100);
+ processEvents();
+
+ int n = 1;
+ QBENCHMARK {
+ item->setPos(25 * n, 25 * n);
+ mView.waitForPaintEvent();
+ n = n ? 0 : 1;
+ }
+}
+
+void tst_QGraphicsView::mapPointToScene_data()
+{
+ QTest::addColumn<QTransform>("transform");
+ QTest::addColumn<QPoint>("point");
+
+ QTest::newRow("null") << QTransform() << QPoint();
+ QTest::newRow("identity QPoint(100, 100)") << QTransform() << QPoint(100, 100);
+ QTest::newRow("rotate QPoint(100, 100)") << QTransform().rotate(90) << QPoint(100, 100);
+ QTest::newRow("scale QPoint(100, 100)") << QTransform().scale(5, 5) << QPoint(100, 100);
+ QTest::newRow("translate QPoint(100, 100)") << QTransform().translate(5, 5) << QPoint(100, 100);
+ QTest::newRow("shear QPoint(100, 100)") << QTransform().shear(1.5, 1.5) << QPoint(100, 100);
+ QTest::newRow("perspect QPoint(100, 100)") << QTransform().rotate(45, Qt::XAxis) << QPoint(100, 100);
+}
+
+void tst_QGraphicsView::mapPointToScene()
+{
+ QFETCH(QTransform, transform);
+ QFETCH(QPoint, point);
+
+ QGraphicsView view;
+ view.setTransform(transform);
+ processEvents();
+
+ QBENCHMARK {
+ view.mapToScene(point);
+ }
+}
+
+void tst_QGraphicsView::mapPointFromScene_data()
+{
+ QTest::addColumn<QTransform>("transform");
+ QTest::addColumn<QPointF>("point");
+
+ QTest::newRow("null") << QTransform() << QPointF();
+ QTest::newRow("identity QPointF(100, 100)") << QTransform() << QPointF(100, 100);
+ QTest::newRow("rotate QPointF(100, 100)") << QTransform().rotate(90) << QPointF(100, 100);
+ QTest::newRow("scale QPointF(100, 100)") << QTransform().scale(5, 5) << QPointF(100, 100);
+ QTest::newRow("translate QPointF(100, 100)") << QTransform().translate(5, 5) << QPointF(100, 100);
+ QTest::newRow("shear QPointF(100, 100)") << QTransform().shear(1.5, 1.5) << QPointF(100, 100);
+ QTest::newRow("perspect QPointF(100, 100)") << QTransform().rotate(45, Qt::XAxis) << QPointF(100, 100);
+}
+
+void tst_QGraphicsView::mapPointFromScene()
+{
+ QFETCH(QTransform, transform);
+ QFETCH(QPointF, point);
+
+ QGraphicsView view;
+ view.setTransform(transform);
+ processEvents();
+
+ QBENCHMARK {
+ view.mapFromScene(point);
+ }
+}
+
+void tst_QGraphicsView::mapRectToScene_data()
+{
+ QTest::addColumn<QTransform>("transform");
+ QTest::addColumn<QRect>("rect");
+
+ QTest::newRow("null") << QTransform() << QRect();
+ QTest::newRow("identity QRect(0, 0, 100, 100)") << QTransform() << QRect(0, 0, 100, 100);
+ QTest::newRow("rotate QRect(0, 0, 100, 100)") << QTransform().rotate(90) << QRect(0, 0, 100, 100);
+ QTest::newRow("scale QRect(0, 0, 100, 100)") << QTransform().scale(5, 5) << QRect(0, 0, 100, 100);
+ QTest::newRow("translate QRect(0, 0, 100, 100)") << QTransform().translate(5, 5) << QRect(0, 0, 100, 100);
+ QTest::newRow("shear QRect(0, 0, 100, 100)") << QTransform().shear(1.5, 1.5) << QRect(0, 0, 100, 100);
+ QTest::newRow("perspect QRect(0, 0, 100, 100)") << QTransform().rotate(45, Qt::XAxis) << QRect(0, 0, 100, 100);
+}
+
+void tst_QGraphicsView::mapRectToScene()
+{
+ QFETCH(QTransform, transform);
+ QFETCH(QRect, rect);
+
+ QGraphicsView view;
+ view.setTransform(transform);
+ processEvents();
+
+ QBENCHMARK {
+ view.mapToScene(rect);
+ }
+}
+
+void tst_QGraphicsView::mapRectFromScene_data()
+{
+ QTest::addColumn<QTransform>("transform");
+ QTest::addColumn<QRectF>("rect");
+
+ QTest::newRow("null") << QTransform() << QRectF();
+ QTest::newRow("identity QRectF(0, 0, 100, 100)") << QTransform() << QRectF(0, 0, 100, 100);
+ QTest::newRow("rotate QRectF(0, 0, 100, 100)") << QTransform().rotate(90) << QRectF(0, 0, 100, 100);
+ QTest::newRow("scale QRectF(0, 0, 100, 100)") << QTransform().scale(5, 5) << QRectF(0, 0, 100, 100);
+ QTest::newRow("translate QRectF(0, 0, 100, 100)") << QTransform().translate(5, 5) << QRectF(0, 0, 100, 100);
+ QTest::newRow("shear QRectF(0, 0, 100, 100)") << QTransform().shear(1.5, 1.5) << QRectF(0, 0, 100, 100);
+ QTest::newRow("perspect QRectF(0, 0, 100, 100)") << QTransform().rotate(45, Qt::XAxis) << QRectF(0, 0, 100, 100);
+}
+
+void tst_QGraphicsView::mapRectFromScene()
+{
+ QFETCH(QTransform, transform);
+ QFETCH(QRectF, rect);
+
+ QGraphicsView view;
+ view.setTransform(transform);
+ processEvents();
+
+ QBENCHMARK {
+ view.mapFromScene(rect);
+ }
+}
+
+void tst_QGraphicsView::chipTester_data()
+{
+ QTest::addColumn<bool>("antialias");
+ QTest::addColumn<bool>("opengl");
+ QTest::addColumn<int>("operation");
+ QTest::newRow("rotate, normal") << false << false << 0;
+ QTest::newRow("rotate, normal, antialias") << true << false << 0;
+ QTest::newRow("rotate, opengl") << false << true << 0;
+ QTest::newRow("rotate, opengl, antialias") << true << true << 0;
+ QTest::newRow("zoom, normal") << false << false << 1;
+ QTest::newRow("zoom, normal, antialias") << true << false << 1;
+ QTest::newRow("zoom, opengl") << false << true << 1;
+ QTest::newRow("zoom, opengl, antialias") << true << true << 1;
+ QTest::newRow("translate, normal") << false << false << 2;
+ QTest::newRow("translate, normal, antialias") << true << false << 2;
+ QTest::newRow("translate, opengl") << false << true << 2;
+ QTest::newRow("translate, opengl, antialias") << true << true << 2;
+}
+
+void tst_QGraphicsView::chipTester()
+{
+ QFETCH(bool, antialias);
+ QFETCH(bool, opengl);
+ QFETCH(int, operation);
+
+ ChipTester tester;
+ tester.setAntialias(antialias);
+ tester.setOpenGL(opengl);
+ tester.setOperation(ChipTester::Operation(operation));
+ tester.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&tester));
+ QTest::qWait(250);
+ processEvents();
+
+ QBENCHMARK {
+ tester.runBenchmark();
+ }
+}
+
+static void addChildHelper(QGraphicsItem *parent, int n, bool rotate)
+{
+ if (!n)
+ return;
+ QGraphicsRectItem *item = new QGraphicsRectItem(QRectF(0, 0, 50, 50), parent);
+ item->setPos(10, 10);
+ if (rotate)
+ item->setTransform(QTransform().rotate(10), true);
+ addChildHelper(item, n - 1, rotate);
+}
+
+void tst_QGraphicsView::deepNesting_data()
+{
+ QTest::addColumn<bool>("rotate");
+ QTest::addColumn<bool>("sortCache");
+ QTest::addColumn<bool>("bsp");
+
+ QTest::newRow("bsp, no transform") << false << false << true;
+ QTest::newRow("bsp, rotation") << true << false << true;
+ QTest::newRow("bsp, no transform, sort cache") << false << true << true;
+ QTest::newRow("bsp, rotation, sort cache") << true << true << true;
+ QTest::newRow("no transform") << false << false << false;
+ QTest::newRow("rotation") << true << false << false;
+ QTest::newRow("no transform, sort cache") << false << true << false;
+ QTest::newRow("rotation, sort cache") << true << true << false;
+}
+
+void tst_QGraphicsView::deepNesting()
+{
+ QFETCH(bool, rotate);
+ QFETCH(bool, sortCache);
+ QFETCH(bool, bsp);
+
+ QGraphicsScene scene;
+ for (int y = 0; y < 15; ++y) {
+ for (int x = 0; x < 15; ++x) {
+ QGraphicsItem *item1 = scene.addRect(QRectF(0, 0, 50, 50));
+ if (rotate)
+ item1->setTransform(QTransform().rotate(10), true);
+ item1->setPos(x * 25, y * 25);
+ addChildHelper(item1, 30, rotate);
+ }
+ }
+ scene.setItemIndexMethod(bsp ? QGraphicsScene::BspTreeIndex : QGraphicsScene::NoIndex);
+ scene.setSortCacheEnabled(sortCache);
+ scene.setSceneRect(scene.sceneRect());
+
+ mView.setRenderHint(QPainter::Antialiasing);
+ mView.setScene(&scene);
+ mView.tryResize(600, 600);
+ (void)scene.items(QPointF(0, 0));
+ processEvents();
+
+ QBENCHMARK {
+#ifdef CALLGRIND_DEBUG
+ CALLGRIND_START_INSTRUMENTATION
+#endif
+ mView.viewport()->update();
+ mView.waitForPaintEvent();
+#ifdef CALLGRIND_DEBUG
+ CALLGRIND_STOP_INSTRUMENTATION
+#endif
+ }
+}
+
+class AnimatedPixmapItem : public QGraphicsPixmapItem
+{
+public:
+ AnimatedPixmapItem(int x, int y, bool rot, bool scal, QGraphicsItem *parent = 0)
+ : QGraphicsPixmapItem(parent), rotateFactor(0), scaleFactor(0)
+ {
+ rotate = rot;
+ scale = scal;
+ xspeed = x;
+ yspeed = y;
+ }
+
+protected:
+ void advance(int i)
+ {
+ if (!i)
+ return;
+ int x = int(pos().x()) + pixmap().width();
+ x += xspeed;
+ x = (x % (300 + pixmap().width() * 2)) - pixmap().width();
+ int y = int(pos().y()) + pixmap().width();
+ y += yspeed;
+ y = (y % (300 + pixmap().width() * 2)) - pixmap().width();
+ setPos(x, y);
+
+ int rot = rotateFactor;
+ int sca = scaleFactor;
+ if (rotate)
+ rotateFactor = 1 + (rot + xspeed) % 360;
+ if (scale)
+ scaleFactor = 1 + (sca + yspeed) % 50;
+
+ if (rotate || scale) {
+ qreal s = 0.5 + scaleFactor / 50.0;
+ setTransform(QTransform().rotate(rotateFactor).scale(s, s));
+ }
+ }
+
+private:
+ int xspeed;
+ int yspeed;
+ int rotateFactor;
+ int scaleFactor;
+ bool rotate;
+ bool scale;
+};
+
+void tst_QGraphicsView::imageRiver_data()
+{
+ QTest::addColumn<int>("direction");
+ QTest::addColumn<bool>("rotation");
+ QTest::addColumn<bool>("scale");
+ QTest::newRow("horizontal") << 0 << false << false;
+ QTest::newRow("vertical") << 1 << false << false;
+ QTest::newRow("both") << 2 << false << false;
+ QTest::newRow("horizontal rot") << 0 << true << false;
+ QTest::newRow("horizontal scale") << 0 << false << true;
+ QTest::newRow("horizontal rot + scale") << 0 << true << true;
+}
+
+void tst_QGraphicsView::imageRiver()
+{
+ QFETCH(int, direction);
+ QFETCH(bool, rotation);
+ QFETCH(bool, scale);
+
+ QGraphicsScene scene(0, 0, 300, 300);
+
+ QPixmap pix(":/images/designer.png");
+ QVERIFY(!pix.isNull());
+
+ QList<QGraphicsItem *> items;
+ QFile file(":/random.data");
+ QVERIFY(file.open(QIODevice::ReadOnly));
+ QDataStream str(&file);
+ for (int i = 0; i < 50; ++i) {
+ AnimatedPixmapItem *item = 0;
+ if (direction == 0) item = new AnimatedPixmapItem((i % 4) + 1, 0, rotation, scale);
+ if (direction == 1) item = new AnimatedPixmapItem(0, (i % 4) + 1, rotation, scale);
+ if (direction == 2) item = new AnimatedPixmapItem((i % 4) + 1, (i % 4) + 1, rotation, scale);
+ item->setPixmap(pix);
+ int rnd1, rnd2;
+ str >> rnd1 >> rnd2;
+ item->setPos(-pix.width() + rnd1 % (300 + pix.width()),
+ -pix.height() + rnd2 % (300 + pix.height()));
+ scene.addItem(item);
+ }
+ scene.setSceneRect(0, 0, 300, 300);
+
+ mView.setScene(&scene);
+ mView.tryResize(300, 300);
+ processEvents();
+
+ QBENCHMARK {
+#ifdef CALLGRIND_DEBUG
+ CALLGRIND_START_INSTRUMENTATION
+#endif
+ for (int i = 0; i < 50; ++i) {
+ scene.advance();
+ mView.waitForPaintEvent();
+ }
+#ifdef CALLGRIND_DEBUG
+ CALLGRIND_STOP_INSTRUMENTATION
+#endif
+ }
+}
+
+class AnimatedTextItem : public QGraphicsSimpleTextItem
+{
+public:
+ AnimatedTextItem(int x, int y, bool rot, bool scal, QGraphicsItem *parent = 0)
+ : QGraphicsSimpleTextItem(parent), rotateFactor(0), scaleFactor(25)
+ {
+ setText("River of text");
+ rotate = rot;
+ scale = scal;
+ xspeed = x;
+ yspeed = y;
+ }
+
+protected:
+ void advance(int i)
+ {
+ if (!i)
+ return;
+ QRect r = boundingRect().toRect();
+ int x = int(pos().x()) + r.width();
+ x += xspeed;
+ x = (x % (300 + r.width() * 2)) - r.width();
+ int y = int(pos().y()) + r.width();
+ y += yspeed;
+ y = (y % (300 + r.width() * 2)) - r.width();
+ setPos(x, y);
+
+ int rot = rotateFactor;
+ int sca = scaleFactor;
+ if (rotate)
+ rotateFactor = 1 + (rot + xspeed) % 360;
+ if (scale)
+ scaleFactor = 1 + (sca + yspeed) % 50;
+
+ if (rotate || scale) {
+ qreal s = 0.5 + scaleFactor / 50.0;
+ setTransform(QTransform().rotate(rotateFactor).scale(s, s));
+ }
+ }
+
+private:
+ int xspeed;
+ int yspeed;
+ int rotateFactor;
+ int scaleFactor;
+ bool rotate;
+ bool scale;
+};
+
+void tst_QGraphicsView::textRiver_data()
+{
+ QTest::addColumn<int>("direction");
+ QTest::addColumn<bool>("rotation");
+ QTest::addColumn<bool>("scale");
+ QTest::newRow("horizontal") << 0 << false << false;
+ QTest::newRow("vertical") << 1 << false << false;
+ QTest::newRow("both") << 2 << false << false;
+ QTest::newRow("horizontal rot") << 0 << true << false;
+ QTest::newRow("horizontal scale") << 0 << false << true;
+ QTest::newRow("horizontal rot + scale") << 0 << true << true;
+}
+
+void tst_QGraphicsView::textRiver()
+{
+ QFETCH(int, direction);
+ QFETCH(bool, rotation);
+ QFETCH(bool, scale);
+
+ QGraphicsScene scene(0, 0, 300, 300);
+
+ QPixmap pix(":/images/designer.png");
+ QVERIFY(!pix.isNull());
+
+ QList<QGraphicsItem *> items;
+ QFile file(":/random.data");
+ QVERIFY(file.open(QIODevice::ReadOnly));
+ QDataStream str(&file);
+ for (int i = 0; i < 50; ++i) {
+ AnimatedTextItem *item = 0;
+ if (direction == 0) item = new AnimatedTextItem((i % 4) + 1, 0, rotation, scale);
+ if (direction == 1) item = new AnimatedTextItem(0, (i % 4) + 1, rotation, scale);
+ if (direction == 2) item = new AnimatedTextItem((i % 4) + 1, (i % 4) + 1, rotation, scale);
+ int rnd1, rnd2;
+ str >> rnd1 >> rnd2;
+ item->setPos(-pix.width() + rnd1 % (300 + pix.width()),
+ -pix.height() + rnd2 % (300 + pix.height()));
+ item->setAcceptDrops(false);
+ item->setAcceptHoverEvents(false);
+ scene.addItem(item);
+ }
+ scene.setSceneRect(0, 0, 300, 300);
+
+ mView.setScene(&scene);
+ mView.tryResize(300, 300);
+ processEvents();
+
+ QBENCHMARK {
+#ifdef CALLGRIND_DEBUG
+ CALLGRIND_START_INSTRUMENTATION
+#endif
+ for (int i = 0; i < 50; ++i) {
+ scene.advance();
+ mView.waitForPaintEvent();
+ }
+#ifdef CALLGRIND_DEBUG
+ CALLGRIND_STOP_INSTRUMENTATION
+#endif
+ }
+}
+
+class AnimatedPixmapCacheItem : public QGraphicsPixmapItem
+{
+public:
+ AnimatedPixmapCacheItem(int x, int y, QGraphicsItem *parent = 0)
+ : QGraphicsPixmapItem(parent)
+ {
+ xspeed = x;
+ yspeed = y;
+ }
+
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0)
+ {
+ QGraphicsPixmapItem::paint(painter,option,widget);
+ //We just want to wait, and we don't want to process the event loop with qWait
+ QTest::qSleep(3);
+ }
+protected:
+ void advance(int i)
+ {
+ if (!i)
+ return;
+ int x = int(pos().x()) + pixmap().width();
+ x += xspeed;
+ x = (x % (300 + pixmap().width() * 2)) - pixmap().width();
+ int y = int(pos().y()) + pixmap().width();
+ y += yspeed;
+ y = (y % (300 + pixmap().width() * 2)) - pixmap().width();
+ setPos(x, y);
+ }
+
+private:
+ int xspeed;
+ int yspeed;
+};
+
+void tst_QGraphicsView::moveItemCache_data()
+{
+ QTest::addColumn<int>("direction");
+ QTest::addColumn<bool>("rotation");
+ QTest::addColumn<int>("cacheMode");
+ QTest::newRow("Horizontal movement : ItemCoordinate Cache") << 0 << false << (int)QGraphicsItem::ItemCoordinateCache;
+ QTest::newRow("Horizontal movement : DeviceCoordinate Cache") << 0 << false << (int)QGraphicsItem::DeviceCoordinateCache;
+ QTest::newRow("Horizontal movement : No Cache") << 0 << false << (int)QGraphicsItem::NoCache;
+ QTest::newRow("Vertical + Horizontal movement : ItemCoordinate Cache") << 2 << false << (int)QGraphicsItem::ItemCoordinateCache;
+ QTest::newRow("Vertical + Horizontal movement : DeviceCoordinate Cache") << 2 << false << (int)QGraphicsItem::DeviceCoordinateCache;
+ QTest::newRow("Vertical + Horizontal movement : No Cache") << 2 << false << (int)QGraphicsItem::NoCache;
+ QTest::newRow("Horizontal movement + Rotation : ItemCoordinate Cache") << 0 << true << (int)QGraphicsItem::ItemCoordinateCache;
+ QTest::newRow("Horizontal movement + Rotation : DeviceCoordinate Cache") << 0 << true << (int)QGraphicsItem::DeviceCoordinateCache;
+ QTest::newRow("Horizontal movement + Rotation : No Cache") << 0 << true << (int)QGraphicsItem::NoCache;
+}
+
+void tst_QGraphicsView::moveItemCache()
+{
+ QFETCH(int, direction);
+ QFETCH(bool, rotation);
+ QFETCH(int, cacheMode);
+
+ QGraphicsScene scene(0, 0, 300, 300);
+
+ QPixmap pix(":/images/wine.jpeg");
+ QVERIFY(!pix.isNull());
+
+ QList<QGraphicsItem *> items;
+ QFile file(":/random.data");
+ QVERIFY(file.open(QIODevice::ReadOnly));
+ QDataStream str(&file);
+ for (int i = 0; i < 5; ++i) {
+ AnimatedPixmapCacheItem *item = 0;
+ if (direction == 0) item = new AnimatedPixmapCacheItem((i % 4) + 1, 0);
+ if (direction == 1) item = new AnimatedPixmapCacheItem(0, (i % 4) + 1);
+ if (direction == 2) item = new AnimatedPixmapCacheItem((i % 4) + 1, (i % 4) + 1);
+ item->setPixmap(pix);
+ item->setCacheMode((QGraphicsItem::CacheMode)cacheMode);
+ if (rotation)
+ item->setTransform(QTransform().rotate(45));
+ int rnd1, rnd2;
+ str >> rnd1 >> rnd2;
+ item->setPos(-pix.width() + rnd1 % (400 + pix.width()),
+ -pix.height() + rnd2 % (400 + pix.height()));
+ scene.addItem(item);
+ }
+ scene.setSceneRect(0, 0, 400, 400);
+
+ mView.setScene(&scene);
+ mView.tryResize(400, 400);
+ processEvents();
+
+ QBENCHMARK {
+#ifdef CALLGRIND_DEBUG
+ CALLGRIND_START_INSTRUMENTATION
+#endif
+ for (int i = 0; i < 5; ++i) {
+ scene.advance();
+ mView.waitForPaintEvent();
+ }
+#ifdef CALLGRIND_DEBUG
+ CALLGRIND_STOP_INSTRUMENTATION
+#endif
+ }
+}
+
+class UpdatedPixmapCacheItem : public QGraphicsPixmapItem
+{
+public:
+ UpdatedPixmapCacheItem(bool partial, QGraphicsItem *parent = 0)
+ : QGraphicsPixmapItem(parent), partial(partial)
+ {
+ }
+
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0)
+ {
+ QGraphicsPixmapItem::paint(painter,option,widget);
+ }
+protected:
+ void advance(int i)
+ {
+ Q_UNUSED(i);
+ if (partial)
+ update(QRectF(boundingRect().center().x(), boundingRect().center().x(), 30, 30));
+ else
+ update();
+ }
+
+private:
+ bool partial;
+};
+
+void tst_QGraphicsView::paintItemCache_data()
+{
+ QTest::addColumn<bool>("updatePartial");
+ QTest::addColumn<bool>("rotation");
+ QTest::addColumn<int>("cacheMode");
+ QTest::newRow("Partial Update : ItemCoordinate Cache") << true << false << (int)QGraphicsItem::ItemCoordinateCache;
+ QTest::newRow("Partial Update : DeviceCoordinate Cache") << true << false << (int)QGraphicsItem::DeviceCoordinateCache;
+ QTest::newRow("Partial Update : No Cache") << true << false << (int)QGraphicsItem::NoCache;
+ QTest::newRow("Full Update : ItemCoordinate Cache") << false << false << (int)QGraphicsItem::ItemCoordinateCache;
+ QTest::newRow("Full Update : DeviceCoordinate Cache") << false << false << (int)QGraphicsItem::DeviceCoordinateCache;
+ QTest::newRow("Full Update : No Cache") << false << false << (int)QGraphicsItem::NoCache;
+ QTest::newRow("Partial Update : ItemCoordinate Cache item rotated") << true << true << (int)QGraphicsItem::ItemCoordinateCache;
+ QTest::newRow("Partial Update : DeviceCoordinate Cache item rotated") << true << true << (int)QGraphicsItem::DeviceCoordinateCache;
+ QTest::newRow("Partial Update : No Cache item rotated") << true << true << (int)QGraphicsItem::NoCache;
+ QTest::newRow("Full Update : ItemCoordinate Cache item rotated") << false << true << (int)QGraphicsItem::ItemCoordinateCache;
+ QTest::newRow("Full Update : DeviceCoordinate Cache item rotated") << false << true << (int)QGraphicsItem::DeviceCoordinateCache;
+ QTest::newRow("Full Update : No Cache item rotated") << false << true <<(int)QGraphicsItem::NoCache;
+}
+
+void tst_QGraphicsView::paintItemCache()
+{
+ QFETCH(bool, updatePartial);
+ QFETCH(bool, rotation);
+ QFETCH(int, cacheMode);
+
+ QGraphicsScene scene(0, 0, 300, 300);
+
+ QPixmap pix(":/images/wine.jpeg");
+ QVERIFY(!pix.isNull());
+
+ QList<QGraphicsItem *> items;
+ QFile file(":/random.data");
+ QVERIFY(file.open(QIODevice::ReadOnly));
+ QDataStream str(&file);
+ UpdatedPixmapCacheItem *item = new UpdatedPixmapCacheItem(updatePartial);
+ item->setPixmap(pix);
+ item->setCacheMode((QGraphicsItem::CacheMode)cacheMode);
+ if (rotation)
+ item->setTransform(QTransform().rotate(45));
+ item->setPos(-100, -100);
+ scene.addItem(item);
+
+ QPixmap pix2(":/images/wine-big.jpeg");
+ item = new UpdatedPixmapCacheItem(updatePartial);
+ item->setPixmap(pix2);
+ item->setCacheMode((QGraphicsItem::CacheMode)cacheMode);
+ if (rotation)
+ item->setTransform(QTransform().rotate(45));
+ item->setPos(0, 0);
+ scene.addItem(item);
+ scene.setSceneRect(-100, -100, 600, 600);
+
+ mView.tryResize(600, 600);
+ mView.setScene(&scene);
+ processEvents();
+
+ QBENCHMARK {
+#ifdef CALLGRIND_DEBUG
+ CALLGRIND_START_INSTRUMENTATION
+#endif
+ for (int i = 0; i < 5; ++i) {
+ scene.advance();
+ mView.waitForPaintEvent();
+ }
+#ifdef CALLGRIND_DEBUG
+ CALLGRIND_STOP_INSTRUMENTATION
+#endif
+ }
+}
+
+QTEST_MAIN(tst_QGraphicsView)
+#include "tst_qgraphicsview.moc"
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicswidget/qgraphicswidget.pro b/tests/benchmarks/widgets/graphicsview/qgraphicswidget/qgraphicswidget.pro
new file mode 100644
index 0000000000..00becec216
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicswidget/qgraphicswidget.pro
@@ -0,0 +1,6 @@
+QT += widgets testlib
+
+TEMPLATE = app
+TARGET = tst_bench_qgraphicswidget
+
+SOURCES += tst_qgraphicswidget.cpp
diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp b/tests/benchmarks/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp
new file mode 100644
index 0000000000..d9bc7f21b6
--- /dev/null
+++ b/tests/benchmarks/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qtest.h>
+#include <QGraphicsItem>
+#include <QGraphicsScene>
+#include <QGraphicsView>
+#include <QGraphicsWidget>
+#include <QRandomGenerator>
+
+class tst_QGraphicsWidget : public QObject
+{
+ Q_OBJECT
+
+public:
+ tst_QGraphicsWidget();
+ virtual ~tst_QGraphicsWidget();
+
+public slots:
+ void init();
+ void cleanup();
+
+private slots:
+ void move();
+};
+
+tst_QGraphicsWidget::tst_QGraphicsWidget()
+{
+}
+
+tst_QGraphicsWidget::~tst_QGraphicsWidget()
+{
+}
+
+void tst_QGraphicsWidget::init()
+{
+}
+
+void tst_QGraphicsWidget::cleanup()
+{
+}
+
+void tst_QGraphicsWidget::move()
+{
+ QGraphicsScene scene;
+ QGraphicsWidget *widget = new QGraphicsWidget();
+ scene.addItem(widget);
+ QGraphicsView view(&scene);
+ view.show();
+ QBENCHMARK {
+ // truncate the random values to 24 bits to
+ // avoid overflowing
+ widget->setPos(QRandomGenerator::global()->generate() & 0xffffff, QRandomGenerator::global()->generate() & 0xffffff);
+ }
+}
+
+QTEST_MAIN(tst_QGraphicsWidget)
+#include "tst_qgraphicswidget.moc"
diff --git a/tests/benchmarks/widgets/itemviews/itemviews.pro b/tests/benchmarks/widgets/itemviews/itemviews.pro
new file mode 100644
index 0000000000..a23cdf7b97
--- /dev/null
+++ b/tests/benchmarks/widgets/itemviews/itemviews.pro
@@ -0,0 +1,4 @@
+TEMPLATE = subdirs
+SUBDIRS = \
+ qtableview \
+ qheaderview
diff --git a/tests/benchmarks/widgets/itemviews/qheaderview/qheaderview.pro b/tests/benchmarks/widgets/itemviews/qheaderview/qheaderview.pro
new file mode 100644
index 0000000000..7e8415e495
--- /dev/null
+++ b/tests/benchmarks/widgets/itemviews/qheaderview/qheaderview.pro
@@ -0,0 +1,7 @@
+QT += widgets testlib
+
+TEMPLATE = app
+TARGET = tst_bench_qheaderview
+
+SOURCES += qheaderviewbench.cpp
+
diff --git a/tests/benchmarks/widgets/itemviews/qheaderview/qheaderviewbench.cpp b/tests/benchmarks/widgets/itemviews/qheaderview/qheaderviewbench.cpp
new file mode 100644
index 0000000000..49ce060580
--- /dev/null
+++ b/tests/benchmarks/widgets/itemviews/qheaderview/qheaderviewbench.cpp
@@ -0,0 +1,251 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Thorbjørn Lund Martsum - tmartsum[at]gmail.com
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+#include <QtWidgets/QtWidgets>
+
+class BenchQHeaderView : public QObject
+{
+ Q_OBJECT
+public:
+ BenchQHeaderView() : QObject() {m_tv = 0; m_hv = 0; m_model = 0;}
+
+protected:
+ QTableView *m_tv;
+ QHeaderView *m_hv;
+ QStandardItemModel *m_model;
+ QStandardItemModel m_normalmodel;
+ QElapsedTimer t;
+ bool m_worst_case;
+ void setupTestData();
+
+ bool m_blockSomeSignals;
+ bool m_updatesEnabled;
+ int m_rowcount;
+ int m_colcount;
+
+
+private slots:
+ void init();
+ void cleanupTestCase();
+ void initTestCase();
+ void cleanup();
+ void visualIndexAtSpecial_data() {setupTestData();}
+ void visualIndexAt_data() {setupTestData();}
+ void hideShowBench_data() {setupTestData();}
+ void swapSectionsBench_data() {setupTestData();}
+ void moveSectionBench_data() {setupTestData();}
+ void defaultSizeBench_data() {setupTestData();}
+ void removeBench_data() {setupTestData();}
+ void insertBench_data() {setupTestData();}
+ void truncBench_data() {setupTestData();}
+
+ void visualIndexAtSpecial();
+ void visualIndexAt();
+ void hideShowBench();
+ void swapSectionsBench();
+ void moveSectionBench();
+ void defaultSizeBench();
+ void removeBench();
+ void insertBench();
+ void truncBench();
+};
+
+void BenchQHeaderView::setupTestData()
+{
+ QTest::addColumn<bool>("worst_case");
+ QTest::newRow("Less relevant best case") << false;
+ QTest::newRow("__* More important worst case *__") << true;
+}
+
+void BenchQHeaderView::initTestCase()
+{
+ m_tv = new QTableView();
+ m_hv = m_tv->verticalHeader();
+ m_model = &m_normalmodel;
+ m_tv->setModel(m_model);
+ m_tv->show();
+}
+
+void BenchQHeaderView::cleanupTestCase()
+{
+ delete m_tv;
+ m_tv = 0;
+ m_hv = 0;
+}
+
+void BenchQHeaderView::init()
+{
+ QFETCH(bool, worst_case);
+
+ m_blockSomeSignals = true;
+ m_updatesEnabled = false;
+ m_rowcount = 2500;
+ m_colcount = 10;
+
+ m_worst_case = worst_case;
+ m_model->clear();
+ if (worst_case) {
+ for (int u = 0; u <= m_rowcount; ++u) // ensures fragment in Qt 4.x
+ m_model->setRowCount(u);
+ m_model->setColumnCount(m_colcount);
+ m_hv->swapSections(0, m_rowcount - 1);
+ m_hv->hideSection(m_rowcount / 2);
+ } else {
+ m_model->setColumnCount(m_colcount);
+ m_model->setRowCount(m_rowcount);
+ }
+
+ QString s;
+ for (int i = 0; i < m_model->rowCount(); ++i) {
+ m_model->setData(m_model->index(i, 0), QVariant(i));
+ s.setNum(i);
+ s += QLatin1Char('.');
+ s += 'a' + (i % 25);
+ m_model->setData(m_model->index(i, 1), QVariant(s));
+ }
+ m_tv->setUpdatesEnabled(m_updatesEnabled);
+ m_hv->blockSignals(m_blockSomeSignals);
+
+ const int default_section_size = 25;
+ m_hv->setDefaultSectionSize(default_section_size);
+}
+
+void BenchQHeaderView::cleanup()
+{
+ m_tv->setUpdatesEnabled(true);
+ m_hv->blockSignals(false);
+}
+
+void BenchQHeaderView::visualIndexAtSpecial()
+{
+ int lookup_pos = m_hv->length() - 50;
+ int testnum = 0;
+
+ QBENCHMARK {
+ ++testnum;
+ m_hv->resizeSection(0, testnum % 47);
+ m_hv->visualIndexAt(lookup_pos);
+ }
+}
+
+void BenchQHeaderView::visualIndexAt()
+{
+ const int center_pos = m_hv->length() / 2;
+ const int maxpos = m_hv->length() - 1;
+
+ QBENCHMARK {
+ m_hv->visualIndexAt(0);
+ m_hv->visualIndexAt(center_pos);
+ m_hv->visualIndexAt(maxpos);
+ }
+}
+
+void BenchQHeaderView::hideShowBench()
+{
+ int n = 0;
+ bool hide_set = true;
+
+ QBENCHMARK {
+ m_hv->setSectionHidden(n, hide_set);
+ if (n >= m_hv->count()) {
+ n = -1;
+ hide_set = !hide_set;
+ }
+ ++n;
+ }
+}
+
+void BenchQHeaderView::swapSectionsBench()
+{
+ int n = 0;
+ QBENCHMARK {
+ m_hv->swapSections(n, n + 1);
+ if (++n >= m_hv->count())
+ n = 0;
+ }
+}
+
+void BenchQHeaderView::moveSectionBench()
+{
+ QBENCHMARK {
+ m_hv->moveSection(0, m_hv->count() - 2);
+ }
+}
+
+void BenchQHeaderView::defaultSizeBench()
+{
+ int n = 1;
+ QBENCHMARK {
+ m_hv->setDefaultSectionSize(n);
+ ++n;
+ }
+}
+
+void BenchQHeaderView::removeBench()
+{
+ QBENCHMARK {
+ m_model->removeRows(0, 1);
+ if (m_hv->count() == 0) { // setup a new hard model
+ m_model->setRowCount(m_rowcount);
+ if (m_worst_case) {
+ m_hv->swapSections(0, m_rowcount - 1);
+ m_hv->hideSection(m_rowcount / 2);
+ }
+ }
+ }
+}
+
+void BenchQHeaderView::insertBench()
+{
+ QBENCHMARK {
+ m_model->insertRows(1, 1);
+ if (m_hv->count() == 10000000) { // setup a new hard model
+ m_model->setRowCount(m_rowcount);
+ if (m_worst_case) {
+ m_hv->swapSections(0, m_rowcount - 1);
+ m_hv->hideSection(m_rowcount / 2);
+ }
+ }
+ }
+}
+
+void BenchQHeaderView::truncBench()
+{
+ QBENCHMARK {
+ m_model->setRowCount(1);
+ m_model->setRowCount(m_rowcount);
+ if (m_worst_case) {
+ m_hv->swapSections(0, m_rowcount - 1);
+ m_hv->hideSection(m_rowcount / 2);
+ }
+ }
+}
+
+QTEST_MAIN(BenchQHeaderView)
+#include "qheaderviewbench.moc"
diff --git a/tests/benchmarks/widgets/itemviews/qtableview/qtableview.pro b/tests/benchmarks/widgets/itemviews/qtableview/qtableview.pro
new file mode 100644
index 0000000000..bd2306d646
--- /dev/null
+++ b/tests/benchmarks/widgets/itemviews/qtableview/qtableview.pro
@@ -0,0 +1,7 @@
+QT += widgets testlib
+
+TEMPLATE = app
+TARGET = tst_bench_qtableview
+
+SOURCES += tst_qtableview.cpp
+
diff --git a/tests/benchmarks/widgets/itemviews/qtableview/tst_qtableview.cpp b/tests/benchmarks/widgets/itemviews/qtableview/tst_qtableview.cpp
new file mode 100644
index 0000000000..9ce214e5ff
--- /dev/null
+++ b/tests/benchmarks/widgets/itemviews/qtableview/tst_qtableview.cpp
@@ -0,0 +1,373 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qtest.h>
+#include <QDebug>
+#include <QTableView>
+#include <QImage>
+#include <QPainter>
+#include <QHeaderView>
+#include <QStandardItemModel>
+
+class QtTestTableModel: public QAbstractTableModel
+{
+ Q_OBJECT
+
+
+public:
+ QtTestTableModel(int rows = 0, int columns = 0, QObject *parent = 0)
+ : QAbstractTableModel(parent),
+ row_count(rows),
+ column_count(columns) {}
+
+ int rowCount(const QModelIndex& = QModelIndex()) const { return row_count; }
+ int columnCount(const QModelIndex& = QModelIndex()) const { return column_count; }
+ bool isEditable(const QModelIndex &) const { return true; }
+
+ QVariant data(const QModelIndex &idx, int role) const
+ {
+ if (!idx.isValid() || idx.row() >= row_count || idx.column() >= column_count) {
+ qWarning() << "Invalid modelIndex [%d,%d,%p]" << idx;
+ return QVariant();
+ }
+
+ if (role == Qt::DisplayRole || role == Qt::EditRole)
+ return QString("[%1,%2,%3]").arg(idx.row()).arg(idx.column()).arg(0);
+
+ return QVariant();
+ }
+
+ bool insertRows(int start, int count, const QModelIndex &parent = QModelIndex())
+ {
+ if (start < 0 || start > row_count)
+ return false;
+
+ beginInsertRows(parent, start, start + count - 1);
+ row_count += count;
+ endInsertRows();
+ return true;
+ }
+
+ bool removeRows(int start, int count, const QModelIndex &parent = QModelIndex())
+ {
+ if (start < 0 || start >= row_count || row_count < count)
+ return false;
+
+ beginRemoveRows(parent, start, start + count - 1);
+ row_count -= count;
+ endRemoveRows();
+ return true;
+ }
+
+ bool insertColumns(int start, int count, const QModelIndex &parent = QModelIndex())
+ {
+ if (start < 0 || start > column_count)
+ return false;
+
+ beginInsertColumns(parent, start, start + count - 1);
+ column_count += count;
+ endInsertColumns();
+ return true;
+ }
+
+ bool removeColumns(int start, int count, const QModelIndex &parent = QModelIndex())
+ {
+ if (start < 0 || start >= column_count || column_count < count)
+ return false;
+
+ beginRemoveColumns(parent, start, start + count - 1);
+ column_count -= count;
+ endRemoveColumns();
+ return true;
+ }
+
+ int row_count;
+ int column_count;
+};
+
+
+
+
+class tst_QTableView : public QObject
+{
+ Q_OBJECT
+
+public:
+ tst_QTableView();
+ virtual ~tst_QTableView();
+
+public slots:
+ void init();
+ void cleanup();
+
+private slots:
+ void spanInit();
+ void spanDraw();
+ void spanSelectColumn();
+ void spanSelectAll();
+ void rowInsertion_data();
+ void rowInsertion();
+ void rowRemoval_data();
+ void rowRemoval();
+ void columnInsertion_data();
+ void columnInsertion();
+ void columnRemoval_data();
+ void columnRemoval();
+ void sizeHintForColumnWhenHidden();
+private:
+ static inline void spanInit_helper(QTableView *);
+};
+
+tst_QTableView::tst_QTableView()
+{
+}
+
+tst_QTableView::~tst_QTableView()
+{
+}
+
+void tst_QTableView::init()
+{
+}
+
+void tst_QTableView::cleanup()
+{
+}
+
+void tst_QTableView::spanInit_helper(QTableView *view)
+{
+ for (int i=0; i < 40; i++) {
+ view->setSpan(1+i%2, 1+4*i, 1+i%3, 2);
+ }
+
+ for (int i=1; i < 40; i++) {
+ view->setSpan(6 + i*7, 4, 4, 50);
+ }
+}
+
+void tst_QTableView::spanInit()
+{
+ QtTestTableModel model(500, 500);
+ QTableView v;
+ v.setModel(&model);
+
+ QBENCHMARK {
+ spanInit_helper(&v);
+ }
+}
+
+void tst_QTableView::spanDraw()
+{
+ QtTestTableModel model(500, 500);
+ QTableView v;
+ v.setModel(&model);
+
+ spanInit_helper(&v);
+ v.show();
+ v.resize(500,500);
+ QTest::qWait(30);
+
+ QImage image(500, 500, QImage::Format_ARGB32_Premultiplied);
+ QPainter painter(&image);
+ QBENCHMARK {
+ v.render(&painter);
+ }
+}
+
+void tst_QTableView::spanSelectAll()
+{
+ QtTestTableModel model(500, 500);
+ QTableView v;
+ v.setModel(&model);
+
+ spanInit_helper(&v);
+ v.show();
+ QTest::qWait(30);
+
+ QBENCHMARK {
+ v.selectAll();
+ }
+}
+
+void tst_QTableView::spanSelectColumn()
+{
+ QtTestTableModel model(500, 500);
+ QTableView v;
+ v.setModel(&model);
+
+ spanInit_helper(&v);
+ v.show();
+ QTest::qWait(30);
+
+ QBENCHMARK {
+ v.selectColumn(22);
+ }
+}
+
+typedef QVector<QRect> SpanList;
+Q_DECLARE_METATYPE(SpanList)
+
+void spansData()
+{
+ QTest::addColumn<SpanList>("spans");
+
+ QTest::newRow("Without spans")
+ << SpanList();
+
+ QTest::newRow("With spans")
+ << (SpanList()
+ << QRect(0, 1, 1, 2)
+ << QRect(1, 2, 1, 2)
+ << QRect(2, 2, 1, 5)
+ << QRect(2, 8, 1, 2)
+ << QRect(3, 4, 1, 2)
+ << QRect(4, 4, 1, 4)
+ << QRect(5, 6, 1, 3)
+ << QRect(6, 7, 1, 3));
+}
+
+void tst_QTableView::rowInsertion_data()
+{
+ spansData();
+}
+
+void tst_QTableView::rowInsertion()
+{
+ QFETCH(SpanList, spans);
+
+ QtTestTableModel model(10, 10);
+ QTableView view;
+ view.setModel(&model);
+
+ foreach (QRect span, spans)
+ view.setSpan(span.top(), span.left(), span.height(), span.width());
+ view.show();
+ QTest::qWait(50);
+
+ QBENCHMARK_ONCE {
+ view.model()->insertRows(0, 2);
+ view.model()->insertRows(5, 2);
+ view.model()->insertRows(8, 2);
+ view.model()->insertRows(12, 2);
+ }
+}
+
+void tst_QTableView::rowRemoval_data()
+{
+ spansData();
+}
+
+void tst_QTableView::rowRemoval()
+{
+ QFETCH(SpanList, spans);
+
+ QtTestTableModel model(10, 10);
+ QTableView view;
+ view.setModel(&model);
+
+ foreach (QRect span, spans)
+ view.setSpan(span.top(), span.left(), span.height(), span.width());
+ view.show();
+ QTest::qWait(50);
+
+ QBENCHMARK_ONCE {
+ view.model()->removeRows(3, 3);
+ }
+}
+
+void tst_QTableView::columnInsertion_data()
+{
+ spansData();
+}
+
+void tst_QTableView::columnInsertion()
+{
+ QFETCH(SpanList, spans);
+
+ QtTestTableModel model(10, 10);
+ QTableView view;
+ view.setModel(&model);
+
+ // Same set as for rowInsertion, just swapping columns and rows.
+ foreach (QRect span, spans)
+ view.setSpan(span.left(), span.top(), span.width(), span.height());
+ view.show();
+ QTest::qWait(50);
+
+ QBENCHMARK_ONCE {
+ view.model()->insertColumns(0, 2);
+ view.model()->insertColumns(5, 2);
+ view.model()->insertColumns(8, 2);
+ view.model()->insertColumns(12, 2);
+ }
+}
+
+void tst_QTableView::columnRemoval_data()
+{
+ spansData();
+}
+
+void tst_QTableView::columnRemoval()
+{
+ QFETCH(SpanList, spans);
+
+ QtTestTableModel model(10, 10);
+ QTableView view;
+ view.setModel(&model);
+
+ // Same set as for rowRemoval, just swapping columns and rows.
+ foreach (QRect span, spans)
+ view.setSpan(span.left(), span.top(), span.width(), span.height());
+ view.show();
+ QTest::qWait(50);
+
+ QBENCHMARK_ONCE {
+ view.model()->removeColumns(3, 3);
+ }
+}
+
+void tst_QTableView::sizeHintForColumnWhenHidden()
+{
+ QTableView view;
+ QStandardItemModel model(12500, 6);
+ for (int r = 0; r < model.rowCount(); ++r)
+ for (int c = 0; c < model.columnCount(); ++c) {
+ QStandardItem *item = new QStandardItem(QString("row %0, column %1").arg(r).arg(c));
+ model.setItem(r, c, item);
+ }
+
+ view.horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
+ view.setModel(&model);
+ QBENCHMARK_ONCE {
+ view.horizontalHeader()->resizeSection(0, 10); // this force resizeSections - on a hidden view.
+ }
+
+}
+
+QTEST_MAIN(tst_QTableView)
+#include "tst_qtableview.moc"
diff --git a/tests/benchmarks/widgets/kernel/kernel.pro b/tests/benchmarks/widgets/kernel/kernel.pro
new file mode 100644
index 0000000000..a50aad2014
--- /dev/null
+++ b/tests/benchmarks/widgets/kernel/kernel.pro
@@ -0,0 +1,4 @@
+TEMPLATE = subdirs
+SUBDIRS = \
+ qapplication \
+ qwidget
diff --git a/tests/benchmarks/widgets/kernel/qapplication/main.cpp b/tests/benchmarks/widgets/kernel/qapplication/main.cpp
new file mode 100644
index 0000000000..49de765ef0
--- /dev/null
+++ b/tests/benchmarks/widgets/kernel/qapplication/main.cpp
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QApplication>
+
+#include <qtest.h>
+
+
+class tst_qapplication : public QObject
+{
+ Q_OBJECT
+private slots:
+ void ctor();
+};
+
+/*
+ Test the performance of the QApplication constructor.
+
+ Note: results from the second start on can be misleading,
+ since all global statics are already initialized.
+*/
+void tst_qapplication::ctor()
+{
+ // simulate reasonable argc, argv
+ int argc = 1;
+ char *argv[] = { const_cast<char*>("tst_qapplication") };
+ QBENCHMARK {
+ QApplication app(argc, argv);
+ }
+}
+
+QTEST_APPLESS_MAIN(tst_qapplication)
+
+#include "main.moc"
diff --git a/tests/benchmarks/widgets/kernel/qapplication/qapplication.pro b/tests/benchmarks/widgets/kernel/qapplication/qapplication.pro
new file mode 100644
index 0000000000..86a016d42e
--- /dev/null
+++ b/tests/benchmarks/widgets/kernel/qapplication/qapplication.pro
@@ -0,0 +1,8 @@
+QT += widgets testlib
+
+TEMPLATE = app
+TARGET = tst_bench_qapplication
+
+CONFIG += release
+
+SOURCES += main.cpp
diff --git a/tests/benchmarks/widgets/kernel/qwidget/qwidget.pro b/tests/benchmarks/widgets/kernel/qwidget/qwidget.pro
new file mode 100644
index 0000000000..758c9c5b98
--- /dev/null
+++ b/tests/benchmarks/widgets/kernel/qwidget/qwidget.pro
@@ -0,0 +1,4 @@
+QT += widgets testlib
+
+TARGET = tst_bench_qwidget
+SOURCES += tst_qwidget.cpp
diff --git a/tests/benchmarks/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/benchmarks/widgets/kernel/qwidget/tst_qwidget.cpp
new file mode 100644
index 0000000000..b9af7a55cd
--- /dev/null
+++ b/tests/benchmarks/widgets/kernel/qwidget/tst_qwidget.cpp
@@ -0,0 +1,243 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qtest.h>
+
+#include <QtWidgets/QLayout>
+#include <QtGui/QPainter>
+
+static void processEvents()
+{
+ QApplication::processEvents();
+ QApplication::processEvents();
+}
+
+class UpdateWidget : public QWidget
+{
+public:
+ UpdateWidget(int rows, int columns)
+ : QWidget(0), rowCount(0), columnCount(0), opaqueChildren(false)
+ {
+ fill(rows, columns);
+ }
+
+ UpdateWidget(QWidget *parent = 0)
+ : QWidget(parent), rowCount(0), columnCount(0), opaqueChildren(false) {}
+
+ void fill(int rows, int columns)
+ {
+ if (rows == rowCount && columns == columnCount)
+ return;
+ delete layout();
+ QGridLayout *layout = new QGridLayout;
+ rowCount = rows;
+ columnCount = columns;
+ for (int row = 0; row < rowCount; ++row) {
+ for (int column = 0; column < columnCount; ++column) {
+ UpdateWidget *widget = new UpdateWidget;
+ widget->setFixedSize(20, 20);
+ layout->addWidget(widget, row, column);
+ children.append(widget);
+ }
+ }
+ setLayout(layout);
+ adjustSize();
+ QTest::qWait(250);
+ processEvents();
+ }
+
+ void setOpaqueChildren(bool enable)
+ {
+ if (opaqueChildren != enable) {
+ foreach (QWidget *w, children)
+ w->setAttribute(Qt::WA_OpaquePaintEvent, enable);
+ opaqueChildren = enable;
+ processEvents();
+ }
+ }
+
+ void paintEvent(QPaintEvent *)
+ {
+ static int color = Qt::black;
+
+ QPainter painter(this);
+ painter.fillRect(rect(), Qt::GlobalColor(color));
+
+ if (++color > Qt::darkYellow)
+ color = Qt::black;
+ }
+
+ QRegion updateRegion;
+ QList<UpdateWidget*> children;
+ int rowCount;
+ int columnCount;
+ bool opaqueChildren;
+};
+
+class tst_QWidget : public QObject
+{
+ Q_OBJECT
+
+public slots:
+ void initTestCase();
+ void init();
+
+private slots:
+ void update_data();
+ void update();
+ void updatePartial_data();
+ void updatePartial();
+ void updateComplex_data();
+ void updateComplex();
+
+private:
+ UpdateWidget widget;
+};
+
+void tst_QWidget::initTestCase()
+{
+ widget.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&widget));
+ QTest::qWait(300);
+ processEvents();
+}
+
+void tst_QWidget::init()
+{
+ QVERIFY(widget.isVisible());
+ for (int i = 0; i < 3; ++i)
+ processEvents();
+}
+
+void tst_QWidget::update_data()
+{
+ QTest::addColumn<int>("rows");
+ QTest::addColumn<int>("columns");
+ QTest::addColumn<int>("numUpdates");
+ QTest::addColumn<bool>("opaque");
+
+ QTest::newRow("10x10x1 transparent") << 10 << 10 << 1 << false;
+ QTest::newRow("10x10x10 transparent") << 10 << 10 << 10 << false;
+ QTest::newRow("10x10x100 transparent") << 10 << 10 << 100 << false;
+ QTest::newRow("10x10x1 opaque") << 10 << 10 << 1 << true;
+ QTest::newRow("10x10x10 opaque") << 10 << 10 << 10 << true;
+ QTest::newRow("10x10x100 opaque") << 10 << 10 << 100 << true;
+ QTest::newRow("25x25x1 transparent ") << 25 << 25 << 1 << false;
+ QTest::newRow("25x25x10 transparent") << 25 << 25 << 10 << false;
+ QTest::newRow("25x25x100 transparent") << 25 << 25 << 100 << false;
+ QTest::newRow("25x25x1 opaque") << 25 << 25 << 1 << true;
+ QTest::newRow("25x25x10 opaque") << 25 << 25 << 10 << true;
+ QTest::newRow("25x25x100 opaque") << 25 << 25 << 100 << true;
+}
+
+void tst_QWidget::update()
+{
+ QFETCH(int, rows);
+ QFETCH(int, columns);
+ QFETCH(int, numUpdates);
+ QFETCH(bool, opaque);
+
+ widget.fill(rows, columns);
+ widget.setOpaqueChildren(opaque);
+
+ QBENCHMARK {
+ for (int i = 0; i < widget.children.size(); ++i) {
+ for (int j = 0; j < numUpdates; ++j)
+ widget.children.at(i)->update();
+ QApplication::processEvents();
+ }
+ }
+
+ QApplication::processEvents();
+}
+
+void tst_QWidget::updatePartial_data()
+{
+ update_data();
+}
+
+void tst_QWidget::updatePartial()
+{
+ QFETCH(int, rows);
+ QFETCH(int, columns);
+ QFETCH(int, numUpdates);
+ QFETCH(bool, opaque);
+
+ widget.fill(rows, columns);
+ widget.setOpaqueChildren(opaque);
+
+ QBENCHMARK {
+ for (int i = 0; i < widget.children.size(); ++i) {
+ QWidget *w = widget.children[i];
+ const int x = w->width() / 2;
+ const int y = w->height() / 2;
+ for (int j = 0; j < numUpdates; ++j) {
+ w->update(0, 0, x, y);
+ w->update(x, 0, x, y);
+ w->update(0, y, x, y);
+ w->update(x, y, x, y);
+ }
+ QApplication::processEvents();
+ }
+ }
+}
+
+void tst_QWidget::updateComplex_data()
+{
+ update_data();
+}
+
+void tst_QWidget::updateComplex()
+{
+ QFETCH(int, rows);
+ QFETCH(int, columns);
+ QFETCH(int, numUpdates);
+ QFETCH(bool, opaque);
+
+ widget.fill(rows, columns);
+ widget.setOpaqueChildren(opaque);
+
+ QBENCHMARK {
+ for (int i = 0; i < widget.children.size(); ++i) {
+ QWidget *w = widget.children[i];
+ const int x = w->width() / 2;
+ const int y = w->height() / 2;
+ QRegion r1(0, 0, x, y, QRegion::Ellipse);
+ QRegion r2(x, y, x, y, QRegion::Ellipse);
+ for (int j = 0; j < numUpdates; ++j) {
+ w->update(r1);
+ w->update(r2);
+ }
+ QApplication::processEvents();
+ }
+ }
+}
+
+QTEST_MAIN(tst_QWidget)
+
+#include "tst_qwidget.moc"
diff --git a/tests/benchmarks/widgets/styles/qstylesheetstyle/main.cpp b/tests/benchmarks/widgets/styles/qstylesheetstyle/main.cpp
new file mode 100644
index 0000000000..9dbf618dd9
--- /dev/null
+++ b/tests/benchmarks/widgets/styles/qstylesheetstyle/main.cpp
@@ -0,0 +1,189 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+// This file contains benchmarks for QRect/QRectF functions.
+
+#include <QtWidgets/QWidget>
+#include <QtWidgets/QGridLayout>
+#include <QtWidgets/QPushButton>
+#include <QtWidgets/QComboBox>
+#include <QtWidgets/QSpinBox>
+#include <QtWidgets/QCheckBox>
+#include <QtWidgets/QRadioButton>
+#include <QtWidgets/QLabel>
+#include <QtWidgets/QProgressBar>
+#include <QtWidgets/QLineEdit>
+#include <qtest.h>
+
+class tst_qstylesheetstyle : public QObject
+{
+ Q_OBJECT
+private slots:
+ void empty();
+ void empty_events();
+
+ void simple();
+ void simple_events();
+
+ void grid_data();
+ void grid();
+
+private:
+ QWidget *buildSimpleWidgets();
+
+};
+
+
+QWidget *tst_qstylesheetstyle::buildSimpleWidgets()
+{
+ QWidget *w = new QWidget();
+ QGridLayout *layout = new QGridLayout(w);
+ w->setLayout(layout);
+ layout->addWidget(new QPushButton("pushButton") ,0,0);
+ layout->addWidget(new QComboBox() ,0,1);
+ layout->addWidget(new QCheckBox("checkBox") ,0,2);
+ layout->addWidget(new QRadioButton("radioButton") ,0,3);
+ layout->addWidget(new QLineEdit() ,1,0);
+ layout->addWidget(new QLabel("label") ,1,1);
+ layout->addWidget(new QSpinBox() ,1,2);
+ layout->addWidget(new QProgressBar() ,1,3);
+ return w;
+}
+
+void tst_qstylesheetstyle::empty()
+{
+ QWidget *w = buildSimpleWidgets();
+ w->setStyleSheet("/* */");
+ QApplication::processEvents();
+ int i = 0;
+ QBENCHMARK {
+ w->setStyleSheet("/*" + QString::number(i) + "*/");
+ i++; // we want a different string in case we have severals iterations
+ }
+ delete w;
+}
+
+void tst_qstylesheetstyle::empty_events()
+{
+ QWidget *w = buildSimpleWidgets();
+ w->setStyleSheet("/* */");
+ QApplication::processEvents();
+ int i = 0;
+ QBENCHMARK {
+ w->setStyleSheet("/*" + QString::number(i) + "*/");
+ i++; // we want a different string in case we have severals iterations
+ qApp->processEvents();
+ }
+ delete w;
+}
+
+static const char *simple_css =
+ " QLineEdit { background: red; } QPushButton { border: 1px solid yellow; color: pink; } \n"
+ " QCheckBox { margin: 3px 5px; background-color:red; } QAbstractButton { background-color: #456; } \n"
+ " QFrame { padding: 3px; } QLabel { color: black } QSpinBox:hover { background-color:blue; } ";
+
+void tst_qstylesheetstyle::simple()
+{
+ QWidget *w = buildSimpleWidgets();
+ w->setStyleSheet("/* */");
+ QApplication::processEvents();
+ int i = 0;
+ QBENCHMARK {
+ w->setStyleSheet(QString(simple_css) + "/*" + QString::number(i) + "*/");
+ i++; // we want a different string in case we have severals iterations
+ }
+ delete w;
+}
+
+void tst_qstylesheetstyle::simple_events()
+{
+ QWidget *w = buildSimpleWidgets();
+ w->setStyleSheet("/* */");
+ QApplication::processEvents();
+ int i = 0;
+ QBENCHMARK {
+ w->setStyleSheet(QString(simple_css) + "/*" + QString::number(i) + "*/");
+ i++; // we want a different string in case we have severals iterations
+ qApp->processEvents();
+ }
+ delete w;
+}
+
+void tst_qstylesheetstyle::grid_data()
+{
+ QTest::addColumn<bool>("events");
+ QTest::addColumn<bool>("show");
+ QTest::addColumn<int>("N");
+ for (int n = 5; n <= 25; n += 5) {
+ const QByteArray nString = QByteArray::number(n*n);
+ QTest::newRow(QByteArray("simple--" + nString).constData()) << false << false << n;
+ QTest::newRow(QByteArray("events--" + nString).constData()) << true << false << n;
+ QTest::newRow(QByteArray("show--" + nString).constData()) << true << true << n;
+ }
+}
+
+
+void tst_qstylesheetstyle::grid()
+{
+ QFETCH(bool, events);
+ QFETCH(bool, show);
+ QFETCH(int, N);
+
+ QWidget *w = new QWidget();
+ QGridLayout *layout = new QGridLayout(w);
+ w->setLayout(layout);
+ QString stylesheet;
+ for(int x=0; x<N ;x++)
+ for(int y=0; y<N ;y++) {
+ QLabel *label = new QLabel(QString::number(y * N + x));
+ layout->addWidget(label ,x,y);
+ label->setObjectName(QString("label%1").arg(y * N + x));
+ stylesheet += QString("#label%1 { background-color: rgb(0,%2,%3); color: rgb(%2,%3,255); } ").arg(y*N+x).arg(y*255/N).arg(x*255/N);
+ }
+
+ w->setStyleSheet("/* */");
+ if(show) {
+ w->show();
+ QVERIFY(QTest::qWaitForWindowExposed(w));
+ QApplication::processEvents();
+ QTest::qWait(30);
+ QApplication::processEvents();
+ }
+ QApplication::processEvents();
+ int i = 0;
+ QBENCHMARK {
+ w->setStyleSheet(stylesheet + "/*" + QString::number(i) + "*/");
+ i++; // we want a different string in case we have severals iterations
+ if(events)
+ qApp->processEvents();
+ }
+ delete w;
+}
+
+QTEST_MAIN(tst_qstylesheetstyle)
+
+#include "main.moc"
diff --git a/tests/benchmarks/widgets/styles/qstylesheetstyle/qstylesheetstyle.pro b/tests/benchmarks/widgets/styles/qstylesheetstyle/qstylesheetstyle.pro
new file mode 100644
index 0000000000..5aef3520c0
--- /dev/null
+++ b/tests/benchmarks/widgets/styles/qstylesheetstyle/qstylesheetstyle.pro
@@ -0,0 +1,7 @@
+TEMPLATE = app
+QT += widgets testlib
+TARGET = tst_bench_qstylesheetstyle
+
+CONFIG += release
+
+SOURCES += main.cpp
diff --git a/tests/benchmarks/widgets/styles/styles.pro b/tests/benchmarks/widgets/styles/styles.pro
new file mode 100644
index 0000000000..2c1d10b48c
--- /dev/null
+++ b/tests/benchmarks/widgets/styles/styles.pro
@@ -0,0 +1,3 @@
+TEMPLATE = subdirs
+qtHaveModule(widgets): SUBDIRS = \
+ qstylesheetstyle
diff --git a/tests/benchmarks/widgets/widgets.pro b/tests/benchmarks/widgets/widgets.pro
index 8fe49ff2c6..d241e31d0b 100644
--- a/tests/benchmarks/widgets/widgets.pro
+++ b/tests/benchmarks/widgets/widgets.pro
@@ -1,3 +1,13 @@
TEMPLATE = subdirs
SUBDIRS = \
+ graphicsview \
+ itemviews \
+ kernel \
+ styles \
widgets \
+
+TRUSTED_BENCHMARKS += \
+ graphicsview/functional/GraphicsViewBenchmark \
+ graphicsview/qgraphicsview
+
+include(../trusted-benchmarks.pri)