qcanvas 1.0.12.dev3__py3-none-any.whl → 1.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. qcanvas/app_start/__init__.py +6 -1
  2. qcanvas/icons/__init__.py +55 -6
  3. qcanvas/icons/_icon_type.py +42 -0
  4. qcanvas/icons/_update_icons.py +89 -0
  5. qcanvas/icons/dark/actions/exit.svg +3 -0
  6. qcanvas/icons/dark/actions/mark_all_read.svg +3 -0
  7. qcanvas/icons/dark/actions/open_downloads.svg +3 -0
  8. qcanvas/icons/dark/actions/quick_login.svg +3 -0
  9. qcanvas/icons/dark/actions/sync.svg +3 -0
  10. qcanvas/icons/dark/branding/logo_transparent.svg +303 -0
  11. qcanvas/icons/dark/options/auto_download.svg +3 -0
  12. qcanvas/icons/dark/options/theme.svg +3 -0
  13. qcanvas/icons/dark/tabs/assignments.svg +3 -0
  14. qcanvas/icons/dark/tabs/mail.svg +3 -0
  15. qcanvas/icons/dark/tabs/pages.svg +3 -0
  16. qcanvas/icons/dark/tree_items/assignment.svg +3 -0
  17. qcanvas/icons/dark/tree_items/mail.svg +3 -0
  18. qcanvas/icons/dark/tree_items/module.svg +3 -0
  19. qcanvas/icons/dark/tree_items/page.svg +3 -0
  20. qcanvas/icons/icons.qrc +44 -8
  21. qcanvas/icons/light/actions/exit.svg +3 -0
  22. qcanvas/icons/light/actions/mark_all_read.svg +3 -0
  23. qcanvas/icons/light/actions/open_downloads.svg +3 -0
  24. qcanvas/icons/light/actions/quick_login.svg +3 -0
  25. qcanvas/icons/light/actions/sync.svg +3 -0
  26. qcanvas/icons/light/branding/logo_transparent.svg +304 -0
  27. qcanvas/icons/light/options/auto_download.svg +3 -0
  28. qcanvas/icons/light/options/ignore_old.svg +3 -0
  29. qcanvas/icons/light/options/include_videos.svg +3 -0
  30. qcanvas/icons/light/options/theme.svg +3 -0
  31. qcanvas/icons/light/tabs/assignments.svg +3 -0
  32. qcanvas/icons/light/tabs/mail.svg +3 -0
  33. qcanvas/icons/light/tabs/pages.svg +3 -0
  34. qcanvas/icons/light/tree_items/assignment.svg +3 -0
  35. qcanvas/icons/light/tree_items/mail.svg +3 -0
  36. qcanvas/icons/light/tree_items/module.svg +3 -0
  37. qcanvas/icons/light/tree_items/page.svg +3 -0
  38. qcanvas/icons/rc_icons.py +2165 -355
  39. qcanvas/icons/universal/downloads/download_failed.svg +23 -0
  40. qcanvas/icons/universal/downloads/downloaded.svg +23 -0
  41. qcanvas/icons/universal/downloads/not_downloaded.svg +23 -0
  42. qcanvas/icons/universal/tabs/assignments_new_content.svg +3 -0
  43. qcanvas/icons/universal/tabs/mail_new_content.svg +3 -0
  44. qcanvas/icons/universal/tabs/pages_new_content.svg +3 -0
  45. qcanvas/icons/universal/tree_items/semester.svg +108 -0
  46. qcanvas/run.py +24 -0
  47. qcanvas/ui/course_viewer/content_tree.py +28 -7
  48. qcanvas/ui/course_viewer/course_tree/__init__.py +1 -0
  49. qcanvas/ui/course_viewer/course_tree/_course_icon_generator.py +86 -0
  50. qcanvas/ui/course_viewer/{course_tree.py → course_tree/course_tree.py} +20 -6
  51. qcanvas/ui/course_viewer/course_viewer.py +71 -24
  52. qcanvas/ui/course_viewer/tabs/assignment_tab/assignment_tree.py +15 -14
  53. qcanvas/ui/course_viewer/tabs/file_tab/__init__.py +1 -0
  54. qcanvas/ui/course_viewer/tabs/file_tab/file_tab.py +46 -0
  55. qcanvas/ui/course_viewer/tabs/file_tab/file_tree.py +99 -0
  56. qcanvas/ui/course_viewer/tabs/file_tab/pages_file_tree.py +56 -0
  57. qcanvas/ui/course_viewer/tabs/mail_tab/mail_tree.py +11 -11
  58. qcanvas/ui/course_viewer/tabs/page_tab/page_tree.py +13 -11
  59. qcanvas/ui/course_viewer/tabs/resource_rich_browser.py +57 -56
  60. qcanvas/ui/course_viewer/tabs/util.py +10 -0
  61. qcanvas/ui/course_viewer/tree_widget_data_item.py +22 -0
  62. qcanvas/ui/main_ui/course_viewer_container.py +46 -3
  63. qcanvas/ui/main_ui/options/auto_download_resources_option.py +3 -1
  64. qcanvas/ui/main_ui/options/theme_selection_menu.py +2 -0
  65. qcanvas/ui/main_ui/qcanvas_window.py +18 -5
  66. qcanvas/ui/main_ui/status_bar_progress_display.py +17 -8
  67. qcanvas/ui/memory_tree/_tree_memory.py +1 -0
  68. qcanvas/ui/memory_tree/memory_tree_widget.py +2 -2
  69. qcanvas/ui/setup/setup_checker.py +2 -2
  70. qcanvas/ui/setup/setup_dialog.py +145 -66
  71. qcanvas/util/__init__.py +0 -2
  72. qcanvas/util/auto_downloader.py +1 -2
  73. qcanvas/util/file_icons.py +54 -0
  74. qcanvas/util/html_cleaner.py +2 -0
  75. qcanvas/util/layouts.py +5 -2
  76. qcanvas/util/paths.py +15 -26
  77. qcanvas/util/runtime.py +20 -0
  78. qcanvas/util/settings/_client_settings.py +11 -2
  79. qcanvas/util/settings/_mapped_setting.py +6 -1
  80. qcanvas/util/themes/__init__.py +2 -0
  81. qcanvas/util/themes/_colour_scheme_helper.py +38 -0
  82. qcanvas/util/themes/_selected_theme.py +10 -0
  83. qcanvas/util/themes/_theme_changed_event.py +17 -0
  84. qcanvas/util/themes/_theme_changer.py +86 -0
  85. qcanvas/util/ui_tools.py +5 -1
  86. {qcanvas-1.0.12.dev3.dist-info → qcanvas-1.2.0.dist-info}/METADATA +16 -6
  87. qcanvas-1.2.0.dist-info/RECORD +118 -0
  88. qcanvas/icons/file-download-failed.svg +0 -6
  89. qcanvas/icons/file-downloaded.svg +0 -6
  90. qcanvas/icons/file-not-downloaded.svg +0 -6
  91. qcanvas/icons/sync.svg +0 -7
  92. qcanvas/util/themes.py +0 -24
  93. qcanvas-1.0.12.dev3.dist-info/RECORD +0 -68
  94. /qcanvas/icons/{main_icon.svg → universal/branding/main_icon.svg} +0 -0
  95. /qcanvas/icons/{file-unknown.svg → universal/downloads/unknown.svg} +0 -0
  96. {qcanvas-1.0.12.dev3.dist-info → qcanvas-1.2.0.dist-info}/WHEEL +0 -0
  97. {qcanvas-1.0.12.dev3.dist-info → qcanvas-1.2.0.dist-info}/entry_points.txt +0 -0
@@ -4,12 +4,13 @@ import sys
4
4
 
5
5
  import qtpy
6
6
  from qasync import QEventLoop
7
+ from qtpy.QtGui import QGuiApplication
7
8
  from qtpy.QtWidgets import QApplication
8
9
 
9
10
  import qcanvas.backend_connectors.qcanvas_task_master as task_master
10
11
  from qcanvas.ui.main_ui.qcanvas_window import QCanvasWindow
11
12
  from qcanvas.ui.setup import SetupDialog, setup_checker
12
- from qcanvas.util import settings, themes
13
+ from qcanvas.util import runtime, settings, themes
13
14
 
14
15
  main_window = None
15
16
  setup_window = None
@@ -32,6 +33,10 @@ def launch():
32
33
  _show_qt_api_name()
33
34
 
34
35
  app = QApplication(sys.argv)
36
+
37
+ if runtime.is_running_as_flatpak:
38
+ QGuiApplication.setDesktopFileName("io.github.qcanvas.QCanvasApp")
39
+
35
40
  app.setApplicationName("QCanvas")
36
41
 
37
42
  task_master.register()
qcanvas/icons/__init__.py CHANGED
@@ -1,7 +1,56 @@
1
- from qcanvas.icons import rc_icons
1
+ from qtpy.QtGui import QIcon
2
2
 
3
- main_icon = ":/main_icon.svg"
4
- file_downloaded = ":/file-downloaded.svg"
5
- file_not_downloaded = ":/file-not-downloaded.svg"
6
- file_download_failed = ":/file-download-failed.svg"
7
- file_unknown = ":/file-unknown.svg"
3
+ from ._icon_type import ThemeIcon, UniversalIcon
4
+ from .rc_icons import (
5
+ qt_resource_data as _, # Without this, icon data will not be loaded
6
+ )
7
+
8
+
9
+ # noinspection PyPep8Naming
10
+ class actions:
11
+ exit = QIcon.fromTheme("actions/exit")
12
+ mark_all_read = QIcon.fromTheme("actions/mark_all_read")
13
+ open_downloads = QIcon.fromTheme("actions/open_downloads")
14
+ quick_login = QIcon.fromTheme("actions/quick_login")
15
+ sync = QIcon.fromTheme("actions/sync")
16
+
17
+
18
+ # noinspection PyPep8Naming
19
+ class branding:
20
+ logo_transparent = QIcon.fromTheme("branding/logo_transparent")
21
+ main_icon = QIcon.fromTheme("branding/main_icon")
22
+
23
+
24
+ # noinspection PyPep8Naming
25
+ class options:
26
+ auto_download = QIcon.fromTheme("options/auto_download")
27
+ ignore_old = QIcon.fromTheme("options/ignore_old")
28
+ include_videos = QIcon.fromTheme("options/include_videos")
29
+ theme = QIcon.fromTheme("options/theme")
30
+
31
+
32
+ # noinspection PyPep8Naming
33
+ class tabs:
34
+ assignments = QIcon.fromTheme("tabs/assignments")
35
+ assignments_new_content = QIcon.fromTheme("tabs/assignments_new_content")
36
+ mail = QIcon.fromTheme("tabs/mail")
37
+ mail_new_content = QIcon.fromTheme("tabs/mail_new_content")
38
+ pages = QIcon.fromTheme("tabs/pages")
39
+ pages_new_content = QIcon.fromTheme("tabs/pages_new_content")
40
+
41
+
42
+ # noinspection PyPep8Naming
43
+ class tree_items:
44
+ assignment = QIcon.fromTheme("tree_items/assignment")
45
+ mail = QIcon.fromTheme("tree_items/mail")
46
+ module = QIcon.fromTheme("tree_items/module")
47
+ page = QIcon.fromTheme("tree_items/page")
48
+ semester = QIcon.fromTheme("tree_items/semester")
49
+
50
+
51
+ # noinspection PyPep8Naming
52
+ class downloads:
53
+ download_failed = QIcon.fromTheme("downloads/download_failed")
54
+ downloaded = QIcon.fromTheme("downloads/downloaded")
55
+ not_downloaded = QIcon.fromTheme("downloads/not_downloaded")
56
+ unknown = QIcon.fromTheme("downloads/unknown")
@@ -0,0 +1,42 @@
1
+ # Unused
2
+ import logging
3
+
4
+ from qtpy.QtGui import QIcon
5
+
6
+ _logger = logging.getLogger(__name__)
7
+
8
+
9
+ class ThemeIcon:
10
+ def __init__(self, theme_path: str):
11
+ self._theme_path = theme_path
12
+ self._icon = None
13
+
14
+ @property
15
+ def icon(self) -> QIcon:
16
+ if self._icon is None:
17
+ self._icon = QIcon.fromTheme(self._theme_path)
18
+
19
+ return self._icon
20
+
21
+ @property
22
+ def theme_path(self) -> str:
23
+ return self._theme_path
24
+
25
+ def __hash__(self) -> int:
26
+ return hash(self._theme_path)
27
+
28
+
29
+ class UniversalIcon(ThemeIcon):
30
+ def __init__(self, theme_path: str, full_path: str):
31
+ super().__init__(theme_path)
32
+ self._full_path = full_path
33
+
34
+ @property
35
+ def full_path(self) -> str:
36
+ return self._full_path
37
+
38
+ def __hash__(self) -> int:
39
+ return hash(self._theme_path) ^ hash(self.full_path)
40
+
41
+
42
+ AnyIcon = UniversalIcon | ThemeIcon
@@ -0,0 +1,89 @@
1
+ # This file regenerates icons.qrc, rc_icons.py and the icons definition file based on the icons in dark/, light/ and universal/
2
+
3
+ import glob
4
+ import logging
5
+ import os
6
+ import subprocess
7
+ from pathlib import Path
8
+
9
+ import xmltodict
10
+
11
+ _logger = logging.getLogger(__name__)
12
+
13
+
14
+ def remove_base_directory(path: str | Path) -> Path:
15
+ if isinstance(path, str):
16
+ path = Path(path)
17
+
18
+ return Path(*path.parts[1:])
19
+
20
+
21
+ def generate_xml(all_icons: list[Path]) -> str:
22
+ xml_dict = {
23
+ "RCC": {
24
+ "@version": "1.0",
25
+ "qresource": {"@prefix": "icons/", "file": all_icons},
26
+ }
27
+ }
28
+
29
+ return "<!DOCTYPE RCC>\n" + xmltodict.unparse(
30
+ xml_dict, pretty=True, full_document=False
31
+ )
32
+
33
+
34
+ def generate_icon_defs(icons: list[Path]) -> str:
35
+ icons_base_removed = [remove_base_directory(icon) for icon in icons]
36
+ groups = group_icons_by_category(icons_base_removed)
37
+ classes = [
38
+ generate_group_class(group_name, icons) for group_name, icons in groups.items()
39
+ ]
40
+
41
+ return f"""from .rc_icons import qt_resource_data as _ # Without this, icon data will not be loaded
42
+ from qtpy.QtGui import QIcon
43
+ from ._icon_type import UniversalIcon, ThemeIcon
44
+
45
+ """ + "\n\n".join(
46
+ classes
47
+ )
48
+
49
+
50
+ def group_icons_by_category(icons: list[Path]) -> dict[str, set[Path]]:
51
+ groups: dict[str, set[Path]] = {}
52
+
53
+ for icon in icons:
54
+ icon_category = icon.parts[0]
55
+ groups.setdefault(icon_category, set())
56
+ groups[icon_category].add(icon)
57
+
58
+ return groups
59
+
60
+
61
+ def generate_group_class(group_name: str, icons: set[Path]) -> str:
62
+ # pascal_case_class_name = "".join([part.title() for part in group_name.split("_")])
63
+ lines = ["# noinspection PyPep8Naming", f"class {group_name}:"]
64
+
65
+ for icon in sorted(icons):
66
+ path_no_ext = os.path.splitext(icon)[0]
67
+ lines.append(f' {icon.stem} = QIcon.fromTheme("{path_no_ext}")')
68
+
69
+ return "\n".join(lines)
70
+
71
+
72
+ def run_rcc() -> None:
73
+ subprocess.run(["pyside6-rcc", "icons.qrc", "-o", "rc_icons.py"])
74
+
75
+
76
+ def write(file_name: str, content: str) -> None:
77
+ with open(file_name, "w") as f:
78
+ f.write(content)
79
+
80
+
81
+ if __name__ == "__main__":
82
+ all_icons: list[Path] = [
83
+ Path(file) for file in glob.glob("**/*.svg", recursive=True)
84
+ ]
85
+ all_icons.sort()
86
+
87
+ write("icons.qrc", generate_xml(all_icons))
88
+ write("__init__.py", generate_icon_defs(all_icons))
89
+ run_rcc()
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed">
2
+ <path d="m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed">
2
+ <path d="M120-280v-80h560v80H120Zm80-160v-80h560v80H200Zm80-160v-80h560v80H280Z"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed">
2
+ <path d="M160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h240l80 80h320q33 0 56.5 23.5T880-640H447l-80-80H160v480l96-320h684L837-217q-8 26-29.5 41.5T760-160H160Zm84-80h516l72-240H316l-72 240Zm0 0 72-240-72 240Zm-84-400v-80 80Z"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed">
2
+ <path d="M480-80q-82 0-155-31.5t-127.5-86Q143-252 111.5-325T80-480q0-83 31.5-155.5t86-127Q252-817 325-848.5T480-880q83 0 155.5 31.5t127 86q54.5 54.5 86 127T880-480q0 82-31.5 155t-86 127.5q-54.5 54.5-127 86T480-80Zm0-82q26-36 45-75t31-83H404q12 44 31 83t45 75Zm-104-16q-18-33-31.5-68.5T322-320H204q29 50 72.5 87t99.5 55Zm208 0q56-18 99.5-55t72.5-87H638q-9 38-22.5 73.5T584-178ZM170-400h136q-3-20-4.5-39.5T300-480q0-21 1.5-40.5T306-560H170q-5 20-7.5 39.5T160-480q0 21 2.5 40.5T170-400Zm216 0h188q3-20 4.5-39.5T580-480q0-21-1.5-40.5T574-560H386q-3 20-4.5 39.5T380-480q0 21 1.5 40.5T386-400Zm268 0h136q5-20 7.5-39.5T800-480q0-21-2.5-40.5T790-560H654q3 20 4.5 39.5T660-480q0 21-1.5 40.5T654-400Zm-16-240h118q-29-50-72.5-87T584-782q18 33 31.5 68.5T638-640Zm-234 0h152q-12-44-31-83t-45-75q-26 36-45 75t-31 83Zm-200 0h118q9-38 22.5-73.5T376-782q-56 18-99.5 55T204-640Z"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed">
2
+ <path d="M160-160v-80h110l-16-14q-52-46-73-105t-21-119q0-111 66.5-197.5T400-790v84q-72 26-116 88.5T240-478q0 45 17 87.5t53 78.5l10 10v-98h80v240H160Zm400-10v-84q72-26 116-88.5T720-482q0-45-17-87.5T650-648l-10-10v98h-80v-240h240v80H690l16 14q49 49 71.5 106.5T800-482q0 111-66.5 197.5T560-170Z"/>
3
+ </svg>
@@ -0,0 +1,303 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
+
4
+ <svg
5
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
6
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
7
+ xmlns:xlink="http://www.w3.org/1999/xlink"
8
+ width="969.224"
9
+ height="256"
10
+ viewBox="0 0 256.44051 67.733333"
11
+ version="1.1"
12
+ id="svg1"
13
+ xml:space="preserve"
14
+ inkscape:version="1.3.2 (1:1.3.2+202311252150+091e20ef0f)"
15
+ sodipodi:docname="logo_light (copy).svg"
16
+ xmlns="http://www.w3.org/2000/svg"><sodipodi:namedview
17
+ id="namedview1"
18
+ pagecolor="#ffffff"
19
+ bordercolor="#000000"
20
+ borderopacity="0.25"
21
+ inkscape:showpageshadow="2"
22
+ inkscape:pageopacity="0.0"
23
+ inkscape:pagecheckerboard="0"
24
+ inkscape:deskcolor="#d1d1d1"
25
+ inkscape:document-units="mm"
26
+ inkscape:zoom="1.0343421"
27
+ inkscape:cx="518.68719"
28
+ inkscape:cy="294.39003"
29
+ inkscape:window-width="1920"
30
+ inkscape:window-height="1018"
31
+ inkscape:window-x="0"
32
+ inkscape:window-y="0"
33
+ inkscape:window-maximized="1"
34
+ inkscape:current-layer="layer6" />
35
+ <defs
36
+ id="defs1"><rect
37
+ x="237.99998"
38
+ y="25.636106"
39
+ width="760.78278"
40
+ height="230.36391"
41
+ id="rect2" />
42
+ <linearGradient
43
+ inkscape:collect="always"
44
+ xlink:href="#outerBackgroundGradient-2"
45
+ id="linearGradient4254"
46
+ x1="35"
47
+ y1="156"
48
+ x2="253"
49
+ y2="156"
50
+ gradientUnits="userSpaceOnUse"
51
+ gradientTransform="rotate(-90,144,156)"/>
52
+ <linearGradient
53
+ id="outerBackgroundGradient-2"><stop
54
+ style="stop-color:#e70a0a;stop-opacity:1;"
55
+ offset="0"
56
+ id="stop3864-8-6-00" />
57
+ <stop
58
+ style="stop-color:#fe0000;stop-opacity:1;"
59
+ offset="1"
60
+ id="stop3866-9-1-1"/></linearGradient>
61
+ <style
62
+ id="style1">.cls-1{fill:#fff;}</style></defs>
63
+ <g
64
+ inkscape:label="Layer 1"
65
+ inkscape:groupmode="layer"
66
+ id="layer1"><g
67
+ style="display:inline;enable-background:new"
68
+ id="g1"
69
+ transform="matrix(0.26458333,0,0,0.26458333,-1.3535254e-6,-0.13229302)"><g
70
+ style="display:inline"
71
+ inkscape:label="Icon"
72
+ id="layer1-3"
73
+ transform="translate(-16,-28)"><g
74
+ style="display:none"
75
+ inkscape:label="Baseplate"
76
+ id="layer7"
77
+ inkscape:groupmode="layer"><text
78
+ y="19.745117"
79
+ xml:space="preserve"
80
+ x="15.006836"
81
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none;enable-background:new"
82
+ inkscape:label="context"
83
+ id="context"><tspan
84
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18px;line-height:1.25;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'"
85
+ y="19.745117"
86
+ x="15.006836"
87
+ sodipodi:role="line"
88
+ id="tspan3933">apps</tspan></text><text
89
+ y="19.745117"
90
+ xml:space="preserve"
91
+ x="122.48828"
92
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none;enable-background:new"
93
+ inkscape:label="icon-name"
94
+ id="icon-name"><tspan
95
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18px;line-height:1.25;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans Bold'"
96
+ y="19.745117"
97
+ x="122.48828"
98
+ sodipodi:role="line"
99
+ id="tspan3937">amd</tspan></text><rect
100
+ style="display:inline;overflow:visible;visibility:visible;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
101
+ id="rect16x16"
102
+ width="16"
103
+ height="16"
104
+ x="416"
105
+ y="140"
106
+ inkscape:label="16x16"/><rect
107
+ style="display:inline;overflow:visible;visibility:visible;fill:#d4d4d4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
108
+ id="rect24x24"
109
+ width="24"
110
+ height="24"
111
+ x="416"
112
+ y="100"
113
+ inkscape:label="24x24"/><rect
114
+ style="display:inline;overflow:visible;visibility:visible;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
115
+ id="rect32x32"
116
+ width="32"
117
+ height="32"
118
+ x="416"
119
+ y="52"
120
+ inkscape:label="32x32"/><rect
121
+ inkscape:label="22x22"
122
+ y="101"
123
+ x="417"
124
+ height="22"
125
+ width="22"
126
+ id="rect22x22"
127
+ style="display:inline;overflow:visible;visibility:visible;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"/><rect
128
+ inkscape:label="48x48"
129
+ y="220"
130
+ x="288"
131
+ height="48"
132
+ width="48"
133
+ id="rect48x48"
134
+ style="display:inline;overflow:visible;visibility:visible;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"/><rect
135
+ style="display:inline;overflow:visible;visibility:visible;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
136
+ id="rect256x256"
137
+ width="256"
138
+ height="256"
139
+ x="16"
140
+ y="28"
141
+ inkscape:label="256x256"/><rect
142
+ style="display:inline;overflow:visible;visibility:visible;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
143
+ id="rect64x64"
144
+ width="64"
145
+ height="64"
146
+ x="288"
147
+ y="140"
148
+ inkscape:label="64x64"/><rect
149
+ style="display:inline;overflow:visible;visibility:visible;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
150
+ id="rect96x96"
151
+ width="96"
152
+ height="96"
153
+ x="288"
154
+ y="28"
155
+ inkscape:label="96x96"/><rect
156
+ style="display:inline;overflow:visible;visibility:visible;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
157
+ id="rect256x256-7"
158
+ width="256"
159
+ height="256"
160
+ x="16"
161
+ y="28"
162
+ inkscape:label="256x256"/></g><g
163
+ inkscape:groupmode="layer"
164
+ id="layer4"
165
+ inkscape:label="Shadow"
166
+ style="display:inline"
167
+ sodipodi:insensitive="true"><rect
168
+ ry="50"
169
+ y="47"
170
+ x="34"
171
+ height="220"
172
+ width="220"
173
+ id="rect4114"
174
+ style="color:#bebebe;display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;enable-background:accumulate" /></g><g
175
+ inkscape:groupmode="layer"
176
+ id="layer2"
177
+ inkscape:label="Background"
178
+ style="display:inline"/><g
179
+ inkscape:groupmode="layer"
180
+ id="layer6"
181
+ inkscape:label="Symbols"
182
+ style="display:inline"><g
183
+ id="g2"
184
+ style="opacity:0.3"><rect
185
+ style="fill:#f2f2f2;fill-opacity:0;stroke-width:2.98472"
186
+ id="rect1"
187
+ width="67.73333"
188
+ height="67.73333"
189
+ x="-7.1054274e-15"
190
+ y="-4.4408921e-16"
191
+ transform="matrix(3.7795276,0,0,3.7795276,16.000005,28.500005)" /><path
192
+ style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient4254);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
193
+ d="M 84,46.5 C 56.568735,46.5 34.5,68.568732 34.5,96 v 120 c 0,27.43127 22.068735,49.5 49.5,49.5 h 120 c 27.43127,0 49.5,-22.06873 49.5,-49.5 V 96 C 253.5,68.568732 231.43127,46.5 204,46.5 Z"
194
+ id="path4200"/><g
195
+ id="Layer_1-2"
196
+ data-name="Layer 1"
197
+ transform="matrix(1.322302,0,0,1.322302,59.921425,71.894979)"><path
198
+ class="cls-1"
199
+ d="M 18.45,63.47 A 18.4,18.4 0 0 0 2.31,45.23 73.13,73.13 0 0 0 2.31,81.7 18.38,18.38 0 0 0 18.45,63.47"
200
+ id="path1" />
201
+ <path
202
+ class="cls-1"
203
+ d="M 29.13,57.7 A 5.77,5.77 0 1 0 34.9,63.47 5.77,5.77 0 0 0 29.13,57.7"
204
+ id="path2"/>
205
+ <path
206
+ class="cls-1"
207
+ d="m 108.72,63.47 a 18.38,18.38 0 0 0 16.14,18.23 73.13,73.13 0 0 0 0,-36.47 18.4,18.4 0 0 0 -16.14,18.24"
208
+ id="path3"/>
209
+ <path
210
+ class="cls-1"
211
+ d="m 98,57.7 a 5.77,5.77 0 1 0 5.76,5.77 A 5.77,5.77 0 0 0 98,57.7"
212
+ id="path4"/>
213
+ <path
214
+ class="cls-1"
215
+ d="m 63.46,108.77 a 18.39,18.39 0 0 0 -18.23,16.13 73.13,73.13 0 0 0 36.47,0 18.38,18.38 0 0 0 -18.24,-16.13"
216
+ id="path5"/>
217
+ <path
218
+ class="cls-1"
219
+ d="m 63.47,92.31 a 5.77,5.77 0 1 0 5.76,5.77 5.77,5.77 0 0 0 -5.76,-5.77"
220
+ id="path6"/>
221
+ <path
222
+ class="cls-1"
223
+ d="M 63.47,18.44 A 18.37,18.37 0 0 0 81.7,2.31 a 73.13,73.13 0 0 0 -36.47,0 18.39,18.39 0 0 0 18.24,16.13"
224
+ id="path7"/>
225
+ <path
226
+ class="cls-1"
227
+ d="m 63.47,23.37 a 5.77,5.77 0 1 0 5.76,5.76 5.76,5.76 0 0 0 -5.76,-5.76"
228
+ id="path8"/>
229
+ <path
230
+ class="cls-1"
231
+ d="m 95.44,95.44 a 18.4,18.4 0 0 0 -1.5,24.29 73,73 0 0 0 25.78,-25.79 18.39,18.39 0 0 0 -24.28,1.5"
232
+ id="path9"/>
233
+ <path
234
+ class="cls-1"
235
+ d="m 83.8,83.8 a 5.77,5.77 0 1 0 8.16,0 5.78,5.78 0 0 0 -8.16,0"
236
+ id="path10"/>
237
+ <path
238
+ class="cls-1"
239
+ d="M 31.59,31.59 A 18.36,18.36 0 0 0 33.09,7.31 72.93,72.93 0 0 0 7.31,33.09 18.36,18.36 0 0 0 31.59,31.59"
240
+ id="path11"/>
241
+ <path
242
+ class="cls-1"
243
+ d="m 35.07,35.08 a 5.77,5.77 0 1 0 8.16,0 5.78,5.78 0 0 0 -8.16,0"
244
+ id="path12"/>
245
+ <path
246
+ class="cls-1"
247
+ d="M 95.4,31.53 A 18.39,18.39 0 0 0 119.69,33 72.88,72.88 0 0 0 93.9,7.25 18.39,18.39 0 0 0 95.4,31.53"
248
+ id="path13"/>
249
+ <path
250
+ class="cls-1"
251
+ d="m 91.92,43.17 a 5.76,5.76 0 1 0 -8.15,0 5.76,5.76 0 0 0 8.15,0"
252
+ id="path14"/>
253
+ <path
254
+ class="cls-1"
255
+ d="M 31.56,95.37 A 18.39,18.39 0 0 0 7.28,93.87 73,73 0 0 0 33.06,119.66 18.38,18.38 0 0 0 31.56,95.37"
256
+ id="path15"/>
257
+ <path
258
+ class="cls-1"
259
+ d="m 35,83.73 a 5.77,5.77 0 1 0 8.16,0 5.79,5.79 0 0 0 -8.16,0"
260
+ id="path16"/></g></g>
261
+ <g
262
+ id="g3"><rect
263
+ style="display:inline;fill:#178300;fill-opacity:0;stroke-width:10.3711;enable-background:new;opacity:0.3"
264
+ id="rect3"
265
+ width="713.224"
266
+ height="256"
267
+ x="272"
268
+ y="28.500006" />
269
+ <path
270
+ style="font-size:200px;font-family:Ramabhadra;-inkscape-font-specification:'Ramabhadra, Normal';white-space:pre;fill:#ffffff;stroke-width:10.762;opacity:0.3"
271
+ d="m 342.33735,140.96003 q 8.6747,6.26506 19.03614,9.87951 l -8.91566,16.62651 q -8.19277,-2.16867 -26.0241,-14.69879 -11.56626,5.06024 -25.54216,5.06024 -30.60241,0 -44.09639,-17.59037 -13.49398,-17.83132 -13.49398,-42.891561 0,-28.192772 14.93976,-44.33735 15.18073,-16.144578 42.16868,-16.144578 26.50602,0 41.44578,16.144578 14.93976,16.144578 14.93976,44.33735 0,26.746991 -14.45783,43.614461 z M 323.3012,127.70701 q 9.15663,-10.84337 9.15663,-30.361441 0,-40.481928 -32.28916,-40.481928 -15.66265,0 -24.09638,10.843373 -8.43374,10.843374 -8.43374,29.638555 0,16.626501 7.46988,28.915661 7.46988,12.04819 24.33735,12.04819 5.06024,0 9.63856,-1.68674 -7.22892,-4.81928 -14.6988,-7.46988 l 6.74699,-13.49398 q 11.56627,3.85542 22.16867,12.04819 z m 124.81893,-12.77108 22.89157,7.46988 q -10.60241,37.59036 -48.91566,37.59036 -27.22892,0 -40.24097,-17.83132 -13.01205,-18.07229 -13.01205,-41.68675 0,-27.951809 14.45783,-44.578315 14.45784,-16.867469 40.48193,-16.867469 37.10844,0 46.74699,34.216867 l -23.37349,5.542169 Q 442.57796,59.273279 422.337,59.273279 q -29.15663,0 -29.15663,39.518073 0,40.963858 28.6747,40.963858 20.48193,0 26.26506,-24.81928 z m 56.14433,-15.903614 -20.24097,-3.614458 q 6.74699,-24.096386 36.62651,-24.096386 20.96385,0 28.19277,7.228916 7.46988,7.228915 7.46988,25.542172 l -0.24096,26.02409 q 0,17.59036 5.06024,27.95181 h -22.16868 q -1.20482,-3.37349 -2.89156,-9.15663 -11.56627,11.08434 -26.26507,11.08434 -12.53012,0 -20.48192,-6.74699 -7.71085,-6.74698 -7.71085,-18.31325 0,-9.15663 5.06024,-15.90361 5.06025,-6.74699 25.78314,-10.84338 15.90361,-2.89156 21.92771,-5.3012 v -2.40964 q 0,-12.048194 -15.42169,-12.048194 -10.84337,0 -14.69879,10.60241 z m 30.12048,18.313254 q -10.84338,2.16867 -26.0241,7.22891 -4.33735,3.13253 -4.33735,7.95181 0,5.54217 3.85542,8.6747 3.85543,2.89157 8.6747,2.89157 17.83133,0 17.83133,-22.16868 z m 117.34936,41.20482 h -22.40964 v -43.3735 q 0,-14.93976 -2.89157,-20.481924 -2.6506,-5.783132 -11.08433,-5.783132 -7.46988,0 -13.01205,4.337349 -5.54217,4.337349 -5.54217,26.987947 v 38.31326 H 574.3849 V 73.731111 h 20.72289 v 12.53012 Q 606.43309,71.8034 623.30056,71.8034 q 28.43374,0 28.43374,33.9759 z m 43.13246,0 -34.21686,-84.819279 h 23.61445 l 20.48193,57.831329 20.96386,-57.831329 h 23.13253 l -33.73494,84.819279 z m 82.65055,-59.518074 -20.24096,-3.614458 q 6.74698,-24.096386 36.6265,-24.096386 20.96386,0 28.19277,7.228916 7.46988,7.228915 7.46988,25.542172 l -0.24096,26.02409 q 0,17.59036 5.06024,27.95181 H 812.2161 q -1.20481,-3.37349 -2.89156,-9.15663 -11.56627,11.08434 -26.26506,11.08434 -12.53012,0 -20.48193,-6.74699 -7.71084,-6.74698 -7.71084,-18.31325 0,-9.15663 5.06024,-15.90361 5.06024,-6.74699 25.78313,-10.84338 15.90362,-2.89156 21.92771,-5.3012 v -2.40964 q 0,-12.048194 -15.42169,-12.048194 -10.84337,0 -14.69879,10.60241 z m 30.12048,18.313254 q -10.84337,2.16867 -26.02409,7.22891 -4.33735,3.13253 -4.33735,7.95181 0,5.54217 3.85542,8.6747 3.85542,2.89157 8.6747,2.89157 17.83132,0 17.83132,-22.16868 z m 33.97588,16.6265 22.40964,-3.61445 q 3.13253,13.49397 18.31325,13.49397 16.14458,0 16.14458,-9.15662 0,-5.30121 -9.15662,-7.22892 -31.08434,-6.98795 -37.83133,-13.73494 -6.74699,-6.74699 -6.74699,-16.385541 0,-26.024097 35.66265,-26.024097 31.08434,0 37.59037,22.409639 L 896.7944,97.586532 Q 894.14379,87.46605 880.89078,87.46605 q -15.18072,0 -15.18072,6.987952 0,5.783128 23.85542,11.084338 17.59036,3.85542 24.33735,9.63855 6.98795,5.54217 6.98795,16.38555 0,13.9759 -11.3253,21.20482 -11.3253,7.22891 -27.22892,7.22891 -33.9759,0 -40.72289,-26.0241 z"
272
+ id="text2"
273
+ transform="translate(46.516006,54.33516)"
274
+ aria-label="QCanvas"/></g></g><g
275
+ inkscape:groupmode="layer"
276
+ id="layer5"
277
+ inkscape:label="Highlights"
278
+ style="display:inline"
279
+ sodipodi:insensitive="true"><path
280
+ style="color:#bebebe;display:inline;overflow:visible;visibility:visible;opacity:0.13;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;enable-background:accumulate"
281
+ d="M 84,47 C 56.836703,47 35,68.836703 35,96 v 1 C 35,69.836703 56.836703,48 84,48 h 120 c 27.1633,0 49,21.836703 49,49 V 96 C 253,68.836703 231.1633,47 204,47 Z"
282
+ id="rect3894"
283
+ inkscape:connector-curvature="0" />
284
+ <path
285
+ id="path4085"
286
+ d="m 204,266 c 27.1633,0 49,-21.8367 49,-49 v -1 c 0,27.1633 -21.8367,49 -49,49 H 84 C 56.8367,265 35,243.1633 35,216 v 1 c 0,27.1633 21.8367,49 49,49 z"
287
+ style="color:#bebebe;display:inline;overflow:visible;visibility:visible;opacity:0.41;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;enable-background:accumulate"
288
+ inkscape:connector-curvature="0"/>
289
+ <path
290
+ inkscape:connector-curvature="0"
291
+ id="path4280"
292
+ d="M 84,265 C 56.836703,265 35,243.1633 35,216 v -1 c 0,27.1633 21.836703,49 49,49 h 120 c 27.1633,0 49,-21.8367 49,-49 v 1 c 0,27.1633 -21.8367,49 -49,49 z"
293
+ style="color:#bebebe;display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;enable-background:accumulate"
294
+ inkscape:label="path4280"/></g><g
295
+ inkscape:groupmode="layer"
296
+ id="layer3"
297
+ inkscape:label="Border"
298
+ style="display:inline"
299
+ sodipodi:insensitive="true"><path
300
+ style="color:#bebebe;display:inline;overflow:visible;visibility:visible;opacity:0.41;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;enable-background:accumulate"
301
+ d="M 84,46 C 56.3,46 34,68.3 34,96 v 120 c 0,27.7 22.3,50 50,50 h 120 c 27.7,0 50,-22.3 50,-50 V 96 C 254,68.3 231.7,46 204,46 Z m 0,1 h 120 c 27.1633,0 49,21.836703 49,49 v 120 c 0,27.1633 -21.8367,49 -49,49 H 84 C 56.836703,265 35,243.1633 35,216 V 96 C 35,68.836703 56.836703,47 84,47 Z"
302
+ id="rect4040"
303
+ inkscape:connector-curvature="0" /></g></g></g></g></svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed">
2
+ <path d="M480-320 280-520l56-58 104 104v-326h80v326l104-104 56 58-200 200ZM240-160q-33 0-56.5-23.5T160-240v-120h80v120h480v-120h80v120q0 33-23.5 56.5T720-160H240Z"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed">
2
+ <path d="M480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm40-83q119-15 199.5-104.5T800-480q0-123-80.5-212.5T520-797v634Z"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed">
2
+ <path d="M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h168q13-36 43.5-58t68.5-22q38 0 68.5 22t43.5 58h168q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm80-80h280v-80H280v80Zm0-160h400v-80H280v80Zm0-160h400v-80H280v80Zm200-190q13 0 21.5-8.5T510-820q0-13-8.5-21.5T480-850q-13 0-21.5 8.5T450-820q0 13 8.5 21.5T480-790ZM200-200v-560 560Z"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed">
2
+ <path d="M160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160Zm320-280L160-640v400h640v-400L480-440Zm0-80 320-200H160l320 200ZM160-640v-80 480-400Z"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed">
2
+ <path d="M320-240h320v-80H320v80Zm0-160h320v-80H320v80ZM240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h320l240 240v480q0 33-23.5 56.5T720-80H240Zm280-520v-200H240v640h480v-440H520ZM240-800v200-200 640-640Z"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed">
2
+ <path d="M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h168q13-36 43.5-58t68.5-22q38 0 68.5 22t43.5 58h168q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm80-80h280v-80H280v80Zm0-160h400v-80H280v80Zm0-160h400v-80H280v80Zm200-190q13 0 21.5-8.5T510-820q0-13-8.5-21.5T480-850q-13 0-21.5 8.5T450-820q0 13 8.5 21.5T480-790ZM200-200v-560 560Z"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed">
2
+ <path d="M160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160Zm320-280L160-640v400h640v-400L480-440Zm0-80 320-200H160l320 200ZM160-640v-80 480-400Z"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed">
2
+ <path d="M560-564v-68q33-14 67.5-21t72.5-7q26 0 51 4t49 10v64q-24-9-48.5-13.5T700-600q-38 0-73 9.5T560-564Zm0 220v-68q33-14 67.5-21t72.5-7q26 0 51 4t49 10v64q-24-9-48.5-13.5T700-380q-38 0-73 9t-67 27Zm0-110v-68q33-14 67.5-21t72.5-7q26 0 51 4t49 10v64q-24-9-48.5-13.5T700-490q-38 0-73 9.5T560-454ZM260-320q47 0 91.5 10.5T440-278v-394q-41-24-87-36t-93-12q-36 0-71.5 7T120-692v396q35-12 69.5-18t70.5-6Zm260 42q44-21 88.5-31.5T700-320q36 0 70.5 6t69.5 18v-396q-33-14-68.5-21t-71.5-7q-47 0-93 12t-87 36v394Zm-40 118q-48-38-104-59t-116-21q-42 0-82.5 11T100-198q-21 11-40.5-1T40-234v-482q0-11 5.5-21T62-752q46-24 96-36t102-12q58 0 113.5 15T480-740q51-30 106.5-45T700-800q52 0 102 12t96 36q11 5 16.5 15t5.5 21v482q0 23-19.5 35t-40.5 1q-37-20-77.5-31T700-240q-60 0-116 21t-104 59ZM280-494Z"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed">
2
+ <path d="M280-280h280v-80H280v80Zm0-160h400v-80H280v80Zm0-160h400v-80H280v80Zm-80 480q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm0-560v560-560Z"/>
3
+ </svg>