geokernel-electron 1.1.41 → 1.1.43

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.
package/README.md CHANGED
@@ -11,7 +11,12 @@ const { app } = require("electron");
11
11
  const { ViewerTool, ViewerWindow } = require("geokernel-electron");
12
12
 
13
13
  app.whenReady().then(() => {
14
- const viewer = new ViewerWindow({ title: "HelloMap", width: 1200, height: 800 });
14
+ const viewer = new ViewerWindow({
15
+ title: "HelloMap",
16
+ width: 1200,
17
+ height: 800,
18
+ iconDirectory: "D:\\my-app\\Images",
19
+ });
15
20
  viewer.setActivationType("Developer");
16
21
  viewer.addLayer("D:\\data\\world_4326.shp");
17
22
  viewer.setMapStyle("midnight-blue");
@@ -22,6 +27,12 @@ app.whenReady().then(() => {
22
27
  });
23
28
  ```
24
29
 
30
+ `iconDirectory` points to an application-owned directory containing the
31
+ GeoKernel toolbar icons and `GeoKernelAppIcon.ico`. Icons are intentionally
32
+ not bundled in this package, so applications can ship and customize their own
33
+ icon set. The same directory can alternatively be supplied through the
34
+ `GEOKERNEL_ICON_DIR` environment variable before creating a `ViewerWindow`.
35
+
25
36
  ## Public API
26
37
 
27
38
  The package exposes both a convenient `ViewerWindow` API and the raw native binding layer.
Binary file
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "geokernel-electron",
3
- "version": "1.1.41",
3
+ "version": "1.1.43",
4
4
  "description": "Electron bindings for the GeoKernel GIS SDK.",
5
5
  "main": "src/index.js",
6
6
  "type": "commonjs",
@@ -17,7 +17,6 @@
17
17
  "files": [
18
18
  "src",
19
19
  "bin",
20
- "assets",
21
20
  "README.md",
22
21
  "LICENSE"
23
22
  ],
package/src/runtime.js CHANGED
@@ -55,11 +55,6 @@ function firstExistingDirectory(candidates) {
55
55
  function configureRuntimeEnvironment(binDir) {
56
56
  prependPath(binDir);
57
57
 
58
- const assetsDir = path.join(packageRoot(), "assets", "images");
59
- if (fs.existsSync(assetsDir)) {
60
- process.env.GEOKERNEL_ICON_DIR = assetsDir;
61
- }
62
-
63
58
  const gdalData = path.join(binDir, "gdal-data");
64
59
  if (fs.existsSync(gdalData)) {
65
60
  process.env.GDAL_DATA = gdalData;
package/src/types.js CHANGED
@@ -44,6 +44,12 @@ const ViewerEventType = Object.freeze({
44
44
  RENDER_BACKEND_CHANGED: 28,
45
45
  });
46
46
 
47
+ const TopologyFixOperation = Object.freeze({
48
+ FIX_SHAPE: 0,
49
+ FIX_SHAPE_EX: 1,
50
+ CLEAR_SHAPE: 2,
51
+ });
52
+
47
53
  const ShapeType = Object.freeze({
48
54
  UNKNOWN: 0,
49
55
  POINT: 1,
@@ -130,6 +136,29 @@ function extent(xMin, yMin, xMax, yMax) {
130
136
  return Object.freeze({ xMin, yMin, xMax, yMax });
131
137
  }
132
138
 
139
+ function extentExpand(left, right) {
140
+ return extent(
141
+ Math.min(left.xMin, right.xMin),
142
+ Math.min(left.yMin, right.yMin),
143
+ Math.max(left.xMax, right.xMax),
144
+ Math.max(left.yMax, right.yMax),
145
+ );
146
+ }
147
+
148
+ function extentInflate(value, dx, dy) {
149
+ return extent(value.xMin - dx, value.yMin - dy, value.xMax + dx, value.yMax + dy);
150
+ }
151
+
152
+ function extentIntersects(left, right) {
153
+ return left.xMin <= right.xMax && left.xMax >= right.xMin &&
154
+ left.yMin <= right.yMax && left.yMax >= right.yMin;
155
+ }
156
+
157
+ function extentContains(value, target) {
158
+ return target.x >= value.xMin && target.x <= value.xMax &&
159
+ target.y >= value.yMin && target.y <= value.yMax;
160
+ }
161
+
133
162
  function routeSummary(value) {
134
163
  return Object.freeze({
135
164
  succeeded: Boolean(value.succeeded),
@@ -153,9 +182,14 @@ module.exports = {
153
182
  ShapeType,
154
183
  SpatialIndexType,
155
184
  SymbolStyleTarget,
185
+ TopologyFixOperation,
156
186
  ViewerTool,
157
187
  ViewerEventType,
158
188
  extent,
189
+ extentContains,
190
+ extentExpand,
191
+ extentInflate,
192
+ extentIntersects,
159
193
  point,
160
194
  routeSummary,
161
195
  };
@@ -47,6 +47,23 @@ function readWideJson(fn, handle, ...args) {
47
47
  return readWideText(fn, handle, ...args);
48
48
  }
49
49
 
50
+ function readBytes(fn, handle, ...args) {
51
+ const required = fn(handle, ...args, null, 0);
52
+ if (required < 0) {
53
+ throw new Error(`GeoKernel byte call failed with result ${required}.`);
54
+ }
55
+ if (required === 0) {
56
+ return Buffer.alloc(0);
57
+ }
58
+
59
+ const buffer = Buffer.alloc(required);
60
+ const written = fn(handle, ...args, buffer, buffer.length);
61
+ if (written < 0) {
62
+ throw new Error(`GeoKernel byte call failed with result ${written}.`);
63
+ }
64
+ return buffer.subarray(0, Math.min(written, buffer.length));
65
+ }
66
+
50
67
  function xyArray(points) {
51
68
  if (points instanceof Float64Array) {
52
69
  return points;
@@ -120,5 +137,6 @@ module.exports = {
120
137
  partsArrays,
121
138
  readWideJson,
122
139
  readWideText,
140
+ readBytes,
123
141
  xyArray,
124
142
  };
package/src/viewer.js CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  const fs = require("fs");
4
4
  const koffi = require("koffi");
5
+ const path = require("path");
5
6
  const { GeoKernelViewerEventData, TYPES } = require("./native-types");
6
7
 
7
8
  const { createNativeLibrary } = require("./native");
@@ -16,6 +17,7 @@ const {
16
17
  jsonText,
17
18
  parseJson,
18
19
  partsArrays,
20
+ readBytes,
19
21
  readWideJson,
20
22
  readWideText,
21
23
  xyArray,
@@ -56,6 +58,10 @@ class GeoKernelLibrary {
56
58
 
57
59
  class ViewerWindow {
58
60
  constructor(options = {}) {
61
+ if (options.iconDirectory) {
62
+ process.env.GEOKERNEL_ICON_DIR = path.resolve(options.iconDirectory);
63
+ }
64
+
59
65
  const width = options.width ?? 1200;
60
66
  const height = options.height ?? 800;
61
67
  const title = options.title ?? "GeoKernel";
@@ -578,6 +584,14 @@ class ViewerWindow {
578
584
  return this._call("GeoKernelViewer_AddPolygonLayer", name, arrays.xy, arrays.counts, arrays.counts.length, jsonText(style));
579
585
  }
580
586
 
587
+ writeLayerLastShapeGeoJson(index) {
588
+ return this._readText("GeoKernelViewer_WriteLayerLastShapeGeoJson", Number(index));
589
+ }
590
+
591
+ writeLayerLastShapeWkb(index) {
592
+ return this._readBytes("GeoKernelViewer_WriteLayerLastShapeWkb", Number(index));
593
+ }
594
+
581
595
  setBackground(color) {
582
596
  this.library.setMapBackgroundColor(this.viewerHandle, argb(color));
583
597
  }
@@ -785,6 +799,96 @@ class ViewerWindow {
785
799
  return ok ? point(transformedX[0], transformedY[0]) : null;
786
800
  }
787
801
 
802
+ readWktPoint(wkt) {
803
+ const x = [0];
804
+ const y = [0];
805
+ const ok = this.library.function("GeoKernelViewer_ReadWktPoint")(
806
+ this.viewerHandle,
807
+ String(wkt),
808
+ x,
809
+ y,
810
+ );
811
+ return ok ? point(x[0], y[0]) : null;
812
+ }
813
+
814
+ readGeoJsonGeometry(geoJson) {
815
+ return this._readJson("GeoKernelViewer_ReadGeoJsonGeometryJson", {}, String(geoJson));
816
+ }
817
+
818
+ writeWktPoint(x, y) {
819
+ return this._readText("GeoKernelViewer_WriteWktPoint", Number(x), Number(y));
820
+ }
821
+
822
+ writeWkbPoint(x, y) {
823
+ return this._readBytes("GeoKernelViewer_WriteWkbPoint", Number(x), Number(y));
824
+ }
825
+
826
+ writeWkbLineString(points) {
827
+ const xy = xyArray(points);
828
+ return this._readBytes("GeoKernelViewer_WriteWkbLineString", xy, xy.length / 2);
829
+ }
830
+
831
+ writeWkbPolygon(rings) {
832
+ const arrays = partsArrays(rings);
833
+ return this._readBytes(
834
+ "GeoKernelViewer_WriteWkbPolygon",
835
+ arrays.xy,
836
+ arrays.counts,
837
+ arrays.counts.length,
838
+ );
839
+ }
840
+
841
+ readWkbGeometry(bytes) {
842
+ const buffer = Buffer.isBuffer(bytes) ? bytes : Buffer.from(bytes);
843
+ return this._readJson("GeoKernelViewer_ReadWkbGeometryJson", {}, buffer, buffer.length);
844
+ }
845
+
846
+ readWkbPoint(bytes) {
847
+ const buffer = Buffer.isBuffer(bytes) ? bytes : Buffer.from(bytes);
848
+ const x = [0];
849
+ const y = [0];
850
+ const ok = this._call("GeoKernelViewer_ReadWkbPoint", buffer, buffer.length, x, y);
851
+ return ok ? point(x[0], y[0]) : null;
852
+ }
853
+
854
+ readWkbLineString(bytes) {
855
+ const buffer = Buffer.isBuffer(bytes) ? bytes : Buffer.from(bytes);
856
+ return this._readJson("GeoKernelViewer_ReadWkbLineStringJson", [], buffer, buffer.length);
857
+ }
858
+
859
+ readWkbPolygon(bytes, multiPolygon = false) {
860
+ const buffer = Buffer.isBuffer(bytes) ? bytes : Buffer.from(bytes);
861
+ return this._readJson("GeoKernelViewer_ReadWkbPolygonJson", [], buffer, buffer.length, Boolean(multiPolygon));
862
+ }
863
+
864
+ readWktLineString(wkt) {
865
+ return this._readJson("GeoKernelViewer_ReadWktLineStringJson", [], String(wkt));
866
+ }
867
+
868
+ writeWktLineString(points) {
869
+ const xy = xyArray(points);
870
+ return this._readText("GeoKernelViewer_WriteWktLineString", xy, xy.length / 2);
871
+ }
872
+
873
+ readWktPolygon(wkt, multiPolygon = false) {
874
+ return this._readJson(
875
+ "GeoKernelViewer_ReadWktPolygonJson",
876
+ [],
877
+ String(wkt),
878
+ Boolean(multiPolygon),
879
+ );
880
+ }
881
+
882
+ writeWktPolygon(rings) {
883
+ const arrays = partsArrays(rings);
884
+ return this._readText(
885
+ "GeoKernelViewer_WriteWktPolygon",
886
+ arrays.xy,
887
+ arrays.counts,
888
+ arrays.counts.length,
889
+ );
890
+ }
891
+
788
892
  coordinateSystemFromAuthority(authority, code) {
789
893
  return this._readStaticJson(
790
894
  "GeoKernelViewer_CoordinateSystemFromAuthorityJson",
@@ -852,6 +956,25 @@ class ViewerWindow {
852
956
  return this._readJson("GeoKernelViewer_GetLayerInfoJson", {}, Number(index));
853
957
  }
854
958
 
959
+ rasterWorldTransform(index, pixelX = 0, pixelY = 0) {
960
+ return this._readJson(
961
+ "GeoKernelViewer_GetRasterWorldTransformJson",
962
+ {},
963
+ Number(index),
964
+ Number(pixelX),
965
+ Number(pixelY),
966
+ );
967
+ }
968
+
969
+ rasterOverviewDiagnostics(index, runBenchmark = false) {
970
+ return this._readJson(
971
+ "GeoKernelViewer_GetRasterOverviewDiagnosticsJson",
972
+ {},
973
+ Number(index),
974
+ Boolean(runBenchmark),
975
+ );
976
+ }
977
+
855
978
  layerInfoByName(name) {
856
979
  return this._readJson("GeoKernelViewer_GetLayerInfoByNameJson", {}, name);
857
980
  }
@@ -989,6 +1112,284 @@ class ViewerWindow {
989
1112
  this._call("GeoKernelViewer_ClearShapes");
990
1113
  }
991
1114
 
1115
+ addPointShape(x, y, style = {}) {
1116
+ return this._call("GeoKernelViewer_AddPointShape", Number(x), Number(y), jsonText(style));
1117
+ }
1118
+
1119
+ addPointBufferShape(x, y, distance, pointsPerQuadrant = 16, style = {}) {
1120
+ return this._call(
1121
+ "GeoKernelViewer_AddPointBufferShape",
1122
+ Number(x),
1123
+ Number(y),
1124
+ Number(distance),
1125
+ Number(pointsPerQuadrant),
1126
+ jsonText(style),
1127
+ );
1128
+ }
1129
+
1130
+ addPolylineShape(points, style = {}) {
1131
+ const xy = xyArray(points);
1132
+ return this._call("GeoKernelViewer_AddPolylineShape", xy, xy.length / 2, jsonText(style));
1133
+ }
1134
+
1135
+ addPolylineBufferShape(points, distance, pointsPerQuadrant = 12, style = {}) {
1136
+ const xy = xyArray(points);
1137
+ return this._call(
1138
+ "GeoKernelViewer_AddPolylineBufferShape",
1139
+ xy,
1140
+ xy.length / 2,
1141
+ Number(distance),
1142
+ Number(pointsPerQuadrant),
1143
+ jsonText(style),
1144
+ );
1145
+ }
1146
+
1147
+ addPolygonShape(points, style = {}) {
1148
+ const xy = xyArray(points);
1149
+ return this._call("GeoKernelViewer_AddPolygonShape", xy, xy.length / 2, jsonText(style));
1150
+ }
1151
+
1152
+ addPolygonBufferShape(points, distance, pointsPerQuadrant = 12, style = {}) {
1153
+ const xy = xyArray(points);
1154
+ return this._call(
1155
+ "GeoKernelViewer_AddPolygonBufferShape",
1156
+ xy,
1157
+ xy.length / 2,
1158
+ Number(distance),
1159
+ Number(pointsPerQuadrant),
1160
+ jsonText(style),
1161
+ );
1162
+ }
1163
+
1164
+ unionPolygons(left, right) {
1165
+ const leftXy = xyArray(left);
1166
+ const rightXy = xyArray(right);
1167
+ return this._readJson(
1168
+ "GeoKernelViewer_UnionPolygonsJson", [],
1169
+ leftXy, leftXy.length / 2,
1170
+ rightXy, rightXy.length / 2,
1171
+ );
1172
+ }
1173
+
1174
+ unionPolygonsOnList(polygons) {
1175
+ const arrays = partsArrays(polygons);
1176
+ return this._readJson(
1177
+ "GeoKernelViewer_UnionPolygonsOnListJson", [],
1178
+ arrays.xy, arrays.counts, arrays.counts.length,
1179
+ );
1180
+ }
1181
+
1182
+ intersectionPolygons(left, right) {
1183
+ const leftXy = xyArray(left);
1184
+ const rightXy = xyArray(right);
1185
+ return this._readJson(
1186
+ "GeoKernelViewer_IntersectionPolygonsJson", [],
1187
+ leftXy, leftXy.length / 2,
1188
+ rightXy, rightXy.length / 2,
1189
+ );
1190
+ }
1191
+
1192
+ differencePolygons(left, right) {
1193
+ const leftXy = xyArray(left);
1194
+ const rightXy = xyArray(right);
1195
+ return this._readJson(
1196
+ "GeoKernelViewer_DifferencePolygonsJson", [],
1197
+ leftXy, leftXy.length / 2,
1198
+ rightXy, rightXy.length / 2,
1199
+ );
1200
+ }
1201
+
1202
+ symmetricalDifferencePolygons(left, right) {
1203
+ const leftXy = xyArray(left);
1204
+ const rightXy = xyArray(right);
1205
+ return this._readJson(
1206
+ "GeoKernelViewer_SymmetricalDifferencePolygonsJson", [],
1207
+ leftXy, leftXy.length / 2,
1208
+ rightXy, rightXy.length / 2,
1209
+ );
1210
+ }
1211
+
1212
+ addPolygonPartsShape(parts, style = {}) {
1213
+ const arrays = partsArrays(parts);
1214
+ return this._call(
1215
+ "GeoKernelViewer_AddPolygonPartsShape",
1216
+ arrays.xy, arrays.counts, arrays.counts.length, jsonText(style),
1217
+ );
1218
+ }
1219
+
1220
+ convexHullPolygon(points) {
1221
+ const xy = xyArray(points);
1222
+ return this._readJson(
1223
+ "GeoKernelViewer_ConvexHullPolygonJson", [],
1224
+ xy, xy.length / 2,
1225
+ );
1226
+ }
1227
+
1228
+ convexHullTwoPolygons(left, right) {
1229
+ const leftXy = xyArray(left);
1230
+ const rightXy = xyArray(right);
1231
+ return this._readJson(
1232
+ "GeoKernelViewer_ConvexHullTwoPolygonsJson", [],
1233
+ leftXy, leftXy.length / 2,
1234
+ rightXy, rightXy.length / 2,
1235
+ );
1236
+ }
1237
+
1238
+ splitPolygonByArc(polygon, arc) {
1239
+ const polygonXy = xyArray(polygon);
1240
+ const arcXy = xyArray(arc);
1241
+ return this._readJson(
1242
+ "GeoKernelViewer_SplitPolygonByArcJson", [],
1243
+ polygonXy, polygonXy.length / 2,
1244
+ arcXy, arcXy.length / 2,
1245
+ );
1246
+ }
1247
+
1248
+ findMatchingArcIndex(query, candidates) {
1249
+ const queryXy = xyArray(query);
1250
+ const arrays = partsArrays(candidates);
1251
+ return this._call(
1252
+ "GeoKernelViewer_FindMatchingArcIndex",
1253
+ queryXy, queryXy.length / 2,
1254
+ arrays.xy, arrays.counts, arrays.counts.length,
1255
+ );
1256
+ }
1257
+
1258
+ arcMakeConnected(base, continuations) {
1259
+ const baseXy = xyArray(base);
1260
+ const arrays = partsArrays(continuations);
1261
+ return this._readJson(
1262
+ "GeoKernelViewer_ArcMakeConnectedJson", [],
1263
+ baseXy, baseXy.length / 2,
1264
+ arrays.xy, arrays.counts, arrays.counts.length,
1265
+ );
1266
+ }
1267
+
1268
+ arcSplitOnCross(arc, cutters) {
1269
+ const arcXy = xyArray(arc);
1270
+ const arrays = partsArrays(cutters);
1271
+ return this._readJson(
1272
+ "GeoKernelViewer_ArcSplitOnCrossJson", [],
1273
+ arcXy, arcXy.length / 2,
1274
+ arrays.xy, arrays.counts, arrays.counts.length,
1275
+ );
1276
+ }
1277
+
1278
+ checkPolygonRing(points) {
1279
+ const xy = xyArray(points);
1280
+ return this._call("GeoKernelViewer_CheckPolygonRing", xy, xy.length / 2);
1281
+ }
1282
+
1283
+ fixPolygon(points) {
1284
+ const xy = xyArray(points);
1285
+ return this._readJson(
1286
+ "GeoKernelViewer_FixPolygonJson", [],
1287
+ xy, xy.length / 2,
1288
+ );
1289
+ }
1290
+
1291
+ relatePolygonRings(left, right) {
1292
+ const leftXy = xyArray(left);
1293
+ const rightXy = xyArray(right);
1294
+ return this._readText(
1295
+ "GeoKernelViewer_RelatePolygonRings",
1296
+ leftXy, leftXy.length / 2,
1297
+ rightXy, rightXy.length / 2,
1298
+ );
1299
+ }
1300
+
1301
+ relatePolygonRingsPattern(left, right, pattern) {
1302
+ const leftXy = xyArray(left);
1303
+ const rightXy = xyArray(right);
1304
+ return this._call(
1305
+ "GeoKernelViewer_RelatePolygonRingsPattern",
1306
+ leftXy, leftXy.length / 2,
1307
+ rightXy, rightXy.length / 2,
1308
+ String(pattern),
1309
+ );
1310
+ }
1311
+
1312
+ relatePolylines(left, right) {
1313
+ const leftXy = xyArray(left);
1314
+ const rightXy = xyArray(right);
1315
+ return this._readText(
1316
+ "GeoKernelViewer_RelatePolylines",
1317
+ leftXy, leftXy.length / 2,
1318
+ rightXy, rightXy.length / 2,
1319
+ );
1320
+ }
1321
+
1322
+ relatePolylinesPattern(left, right, pattern) {
1323
+ const leftXy = xyArray(left);
1324
+ const rightXy = xyArray(right);
1325
+ return this._call(
1326
+ "GeoKernelViewer_RelatePolylinesPattern",
1327
+ leftXy, leftXy.length / 2,
1328
+ rightXy, rightXy.length / 2,
1329
+ String(pattern),
1330
+ );
1331
+ }
1332
+
1333
+ polylineCrossings(left, right) {
1334
+ const leftXy = xyArray(left);
1335
+ const rightXy = xyArray(right);
1336
+ return this._readJson(
1337
+ "GeoKernelViewer_GetPolylineCrossingsJson", [],
1338
+ leftXy, leftXy.length / 2,
1339
+ rightXy, rightXy.length / 2,
1340
+ );
1341
+ }
1342
+
1343
+ simplifyPolygonRing(points, tolerance) {
1344
+ const xy = xyArray(points);
1345
+ return this._readJson(
1346
+ "GeoKernelViewer_SimplifyPolygonRingJson", [],
1347
+ xy, xy.length / 2, Number(tolerance),
1348
+ );
1349
+ }
1350
+
1351
+ linePointToleranceInfo(line, pointX, pointY, tolerance) {
1352
+ const xy = xyArray(line);
1353
+ return this._readJson(
1354
+ "GeoKernelViewer_GetLinePointToleranceInfoJson", {},
1355
+ xy, xy.length / 2,
1356
+ Number(pointX), Number(pointY), Number(tolerance),
1357
+ );
1358
+ }
1359
+
1360
+ addPolygonShapeWithAttributes(points, attributes, style = {}) {
1361
+ const xy = xyArray(points);
1362
+ return this._call(
1363
+ "GeoKernelViewer_AddPolygonShapeWithAttributes",
1364
+ xy, xy.length / 2, jsonText(attributes), jsonText(style),
1365
+ );
1366
+ }
1367
+
1368
+ fixPolyline(parts, operation = 0) {
1369
+ const arrays = partsArrays(parts);
1370
+ return this._readJson(
1371
+ "GeoKernelViewer_FixPolylineJson", [],
1372
+ arrays.xy, arrays.counts, arrays.counts.length, Number(operation),
1373
+ );
1374
+ }
1375
+
1376
+ findAndDeleteLoops(parts) {
1377
+ const arrays = partsArrays(parts);
1378
+ return this._readJson(
1379
+ "GeoKernelViewer_FindAndDeleteLoopsJson", [],
1380
+ arrays.xy, arrays.counts, arrays.counts.length,
1381
+ );
1382
+ }
1383
+
1384
+ addPolygonPartsShapeWithAttributes(parts, attributes, style = {}) {
1385
+ const arrays = partsArrays(parts);
1386
+ return this._call(
1387
+ "GeoKernelViewer_AddPolygonPartsShapeWithAttributes",
1388
+ arrays.xy, arrays.counts, arrays.counts.length,
1389
+ jsonText(attributes), jsonText(style),
1390
+ );
1391
+ }
1392
+
992
1393
  clearSelectedFeatures() {
993
1394
  this._call("GeoKernelViewer_ClearSelectedFeatures");
994
1395
  }
@@ -1104,6 +1505,11 @@ class ViewerWindow {
1104
1505
  return readWideText(this.library.function(name), this.viewerHandle, ...args);
1105
1506
  }
1106
1507
 
1508
+ _readBytes(name, ...args) {
1509
+ this._requireViewer();
1510
+ return readBytes(this.library.function(name), this.viewerHandle, ...args);
1511
+ }
1512
+
1107
1513
  _readJson(name, fallback, ...args) {
1108
1514
  this._requireViewer();
1109
1515
  return parseJson(readWideJson(this.library.function(name), this.viewerHandle, ...args), fallback);
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path fill="none" stroke="#1b1f23" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" d="M14 18h36M24 18v-6h16v6m-21 0 3 36h20l3-36M28 27v18m8-18v18"/></svg>
@@ -1,29 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="67.19 924.79 55.82 55.55">
3
- <path fill="none" stroke="#d0e8e4" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 83.23,942.53 Q 81.94,946.42 82.15,950.0 Q 82.75,960.4 82.85,963.6"/>
4
- <path fill="none" stroke="#898b8d" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 82.85,963.6 Q 82.57,964.29 82.79,964.69 Q 83.03,965.13 83.75,965.01 Q 84.49,964.88 84.9,964.42"/>
5
- <path fill="none" stroke="#d0e8e4" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 84.9,964.42 Q 94.05,965.66 103.0,965.11 C 104.03,965.05 104.88,964.53 105.91,964.41"/>
6
- <path fill="none" stroke="#898b8d" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 105.91,964.41 L 106.61,964.42 A 0.53,0.53 0.0 0,0 107.15,963.84 Q 107.09,963.22 106.47,962.62"/>
7
- <path fill="none" stroke="#d0e8e4" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 106.47,962.62 L 107.01,962.33 A 0.95,0.92 78.3 0,0 107.49,961.58 Q 108.18,952.5 106.66,943.19"/>
8
- <path fill="none" stroke="#898b8d" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 106.66,943.19 L 114.1,935.53 A 0.43,0.43 0.0 0,1 114.84,935.83 L 114.84,939.23 A 0.62,0.61 -90.0 0,0 115.45,939.85 L 115.79,939.85 A 1.08,1.08 0.0 0,0 116.87,938.77 L 116.87,932.0 A 0.61,0.61 0.0 0,0 116.26,931.39 L 108.75,931.37 A 0.92,0.91 -88.4 0,0 107.83,932.25 L 107.82,932.29 A 0.84,0.83 -0.0 0,0 108.66,933.12 L 113.52,933.09 A 0.47,0.47 0.0 0,1 113.84,933.9 L 104.76,942.46"/>
9
- <path fill="none" stroke="#d0e8e4" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 104.76,942.46 C 102.0,940.68 100.29,941.05 97.3,941.13 Q 91.7,941.28 85.85,942.19"/>
10
- <path fill="none" stroke="#898b8d" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 85.85,942.19 L 81.6,938.91 A 1.3,1.29 -79.8 0,1 81.16,938.27 C 80.68,936.7 79.21,935.66 76.95,933.7 A 0.34,0.34 0.0 0,1 77.17,933.11 L 83.07,933.11 A 0.79,0.78 -90.0 0,0 83.85,932.32 L 83.85,931.94 A 1.16,1.15 -0.0 0,0 82.69,930.79 L 73.86,930.79 A 0.65,0.64 -0.0 0,0 73.21,931.43 L 73.21,940.28 A 0.75,0.75 0.0 0,0 73.96,941.03 L 74.25,941.03 A 1.01,1.0 0.0 0,0 75.26,940.03 L 75.26,935.17 A 0.42,0.42 0.0 0,1 76.03,934.93 Q 77.92,937.63 80.21,938.69 A 2.65,2.6 85.0 0,1 81.24,939.57 L 83.23,942.53"/>
11
- <path fill="none" stroke="#627c7a" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 85.85,942.19 Q 89.87,946.21 92.59,949.5 A 0.85,0.84 -13.0 0,1 91.74,950.86 Q 91.36,950.76 90.93,950.32 Q 87.32,946.54 83.23,942.53"/>
12
- <path fill="none" stroke="#627c7a" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 106.47,962.62 L 98.9,955.13 A 0.72,0.71 -52.0 0,0 97.8,955.27 L 97.77,955.31 A 1.19,1.19 0.0 0,0 97.85,956.71 Q 101.37,961.06 105.91,964.41"/>
13
- <path fill="none" stroke="#627c7a" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 84.9,964.42 Q 88.7,960.3 92.21,957.22 A 1.01,1.0 -54.2 0,0 91.94,955.54 Q 91.26,955.26 90.52,956.03 Q 86.84,959.89 82.85,963.6"/>
14
- <path fill="none" stroke="#627c7a" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 106.66,943.19 L 98.79,950.47 A 0.69,0.68 -44.7 0,1 97.86,950.47 L 97.67,950.28 A 0.41,0.4 -46.5 0,1 97.66,949.7 L 104.76,942.46"/>
15
- <path fill="none" stroke="#898b8d" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 101.5015,932.1305 A 0.88,0.88 0.0 0,0 100.6354,931.2368 L 90.8766,931.0835 A 0.88,0.88 0.0 0,0 89.9829,931.9495 L 89.9785,932.2295 A 0.88,0.88 0.0 0,0 90.8446,933.1232 L 100.6034,933.2765 A 0.88,0.88 0.0 0,0 101.4971,932.4105 L 101.5015,932.1305"/>
16
- <path fill="none" stroke="#898b8d" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 116.9234,946.9247 A 0.89,0.89 0.0 0,0 116.0287,946.0393 L 115.7487,946.0408 A 0.89,0.89 0.0 0,0 114.8634,946.9355 L 114.9166,957.0953 A 0.89,0.89 0.0 0,0 115.8113,957.9807 L 116.0913,957.9792 A 0.89,0.89 0.0 0,0 116.9766,957.0845 L 116.9234,946.9247"/>
17
- <path fill="none" stroke="#898b8d" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 75.19,947.62 A 0.85,0.85 0.0 0,0 74.34,946.77 L 74.04,946.77 A 0.85,0.85 0.0 0,0 73.19,947.62 L 73.19,957.58 A 0.85,0.85 0.0 0,0 74.04,958.43 L 74.34,958.43 A 0.85,0.85 0.0 0,0 75.19,957.58 L 75.19,947.62"/>
18
- <path fill="none" stroke="#898b8d" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 108.42,965.88 Q 107.68,966.64 113.05,971.73 A 0.27,0.26 66.3 0,1 112.88,972.19 L 107.43,972.31 A 1.04,1.04 0.0 0,0 106.41,973.31 L 106.41,973.35 A 0.96,0.96 0.0 0,0 107.38,974.34 Q 111.86,974.33 116.55,974.27 Q 116.7,974.27 116.86,974.11 Q 117.01,973.95 117.01,973.8 Q 116.95,969.11 116.84,964.63 A 0.96,0.96 0.0 0,0 115.83,963.68 L 115.79,963.69 A 1.04,1.04 0.0 0,0 114.82,964.73 L 114.84,970.18 A 0.27,0.26 22.3 0,1 114.38,970.37 Q 109.15,965.13 108.42,965.88"/>
19
- <path fill="none" stroke="#898b8d" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 75.34,971.43 L 75.34,966.17 A 0.91,0.91 0.0 0,0 74.43,965.26 L 73.99,965.26 A 0.76,0.75 0.0 0,0 73.23,966.01 L 73.23,973.71 A 0.53,0.52 0.0 0,0 73.76,974.23 L 82.48,974.23 A 0.73,0.73 0.0 0,0 83.21,973.53 L 83.23,973.11 A 0.7,0.7 0.0 0,0 82.53,972.38 L 77.87,972.38 A 0.47,0.47 0.0 0,1 77.51,971.62 L 80.7,967.71 A 0.42,0.42 0.0 0,0 80.15,967.09 Q 77.03,968.98 75.61,971.5 A 0.14,0.14 0.0 0,1 75.34,971.43"/>
20
- <path fill="none" stroke="#898b8d" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 100.6397,973.0597 A 0.71,0.71 0.0 0,0 99.9284,972.351 L 89.5684,972.369 A 0.71,0.71 0.0 0,0 88.8597,973.0803 L 88.8603,973.4603 A 0.71,0.71 0.0 0,0 89.5716,974.169 L 99.9316,974.151 A 0.71,0.71 0.0 0,0 100.6403,973.4397 L 100.6397,973.0597"/>
21
- <path fill="#f7f7f7" d="M 83.23,942.53 Q 81.94,946.42 82.15,950.0 Q 82.75,960.4 82.85,963.6 Q 82.57,964.29 82.79,964.69 Q 83.03,965.13 83.75,965.01 Q 84.49,964.88 84.9,964.42 Q 94.05,965.66 103.0,965.11 C 104.03,965.05 104.88,964.53 105.91,964.41 L 106.61,964.42 A 0.53,0.53 0.0 0,0 107.15,963.84 Q 107.09,963.22 106.47,962.62 L 107.01,962.33 A 0.95,0.92 78.3 0,0 107.49,961.58 Q 108.18,952.5 106.66,943.19 L 114.1,935.53 A 0.43,0.43 0.0 0,1 114.84,935.83 L 114.84,939.23 A 0.62,0.61 -90.0 0,0 115.45,939.85 L 115.79,939.85 A 1.08,1.08 0.0 0,0 116.87,938.77 L 116.87,932.0 A 0.61,0.61 0.0 0,0 116.26,931.39 L 108.75,931.37 A 0.92,0.91 -88.4 0,0 107.83,932.25 L 107.82,932.29 A 0.84,0.83 -0.0 0,0 108.66,933.12 L 113.52,933.09 A 0.47,0.47 0.0 0,1 113.84,933.9 L 104.76,942.46 C 102.0,940.68 100.29,941.05 97.3,941.13 Q 91.7,941.28 85.85,942.19 L 81.6,938.91 A 1.3,1.29 -79.8 0,1 81.16,938.27 C 80.68,936.7 79.21,935.66 76.95,933.7 A 0.34,0.34 0.0 0,1 77.17,933.11 L 83.07,933.11 A 0.79,0.78 -90.0 0,0 83.85,932.32 L 83.85,931.94 A 1.16,1.15 -0.0 0,0 82.69,930.79 L 73.86,930.79 A 0.65,0.64 -0.0 0,0 73.21,931.43 L 73.21,940.28 A 0.75,0.75 0.0 0,0 73.96,941.03 L 74.25,941.03 A 1.01,1.0 0.0 0,0 75.26,940.03 L 75.26,935.17 A 0.42,0.42 0.0 0,1 76.03,934.93 Q 77.92,937.63 80.21,938.69 A 2.65,2.6 85.0 0,1 81.24,939.57 L 83.23,942.53 M 101.5015,932.1305 A 0.88,0.88 0.0 0,0 100.6354,931.2368 L 90.8766,931.0835 A 0.88,0.88 0.0 0,0 89.9829,931.9495 L 89.9785,932.2295 A 0.88,0.88 0.0 0,0 90.8446,933.1232 L 100.6034,933.2765 A 0.88,0.88 0.0 0,0 101.4971,932.4105 L 101.5015,932.1305 M 116.9234,946.9247 A 0.89,0.89 0.0 0,0 116.0287,946.0393 L 115.7487,946.0408 A 0.89,0.89 0.0 0,0 114.8634,946.9355 L 114.9166,957.0953 A 0.89,0.89 0.0 0,0 115.8113,957.9807 L 116.0913,957.9792 A 0.89,0.89 0.0 0,0 116.9766,957.0845 L 116.9234,946.9247 M 75.19,947.62 A 0.85,0.85 0.0 0,0 74.34,946.77 L 74.04,946.77 A 0.85,0.85 0.0 0,0 73.19,947.62 L 73.19,957.58 A 0.85,0.85 0.0 0,0 74.04,958.43 L 74.34,958.43 A 0.85,0.85 0.0 0,0 75.19,957.58 L 75.19,947.62 M 108.42,965.88 Q 107.68,966.64 113.05,971.73 A 0.27,0.26 66.3 0,1 112.88,972.19 L 107.43,972.31 A 1.04,1.04 0.0 0,0 106.41,973.31 L 106.41,973.35 A 0.96,0.96 0.0 0,0 107.38,974.34 Q 111.86,974.33 116.55,974.27 Q 116.7,974.27 116.86,974.11 Q 117.01,973.95 117.01,973.8 Q 116.95,969.11 116.84,964.63 A 0.96,0.96 0.0 0,0 115.83,963.68 L 115.79,963.69 A 1.04,1.04 0.0 0,0 114.82,964.73 L 114.84,970.18 A 0.27,0.26 22.3 0,1 114.38,970.37 Q 109.15,965.13 108.42,965.88 M 75.34,971.43 L 75.34,966.17 A 0.91,0.91 0.0 0,0 74.43,965.26 L 73.99,965.26 A 0.76,0.75 0.0 0,0 73.23,966.01 L 73.23,973.71 A 0.53,0.52 0.0 0,0 73.76,974.23 L 82.48,974.23 A 0.73,0.73 0.0 0,0 83.21,973.53 L 83.23,973.11 A 0.7,0.7 0.0 0,0 82.53,972.38 L 77.87,972.38 A 0.47,0.47 0.0 0,1 77.51,971.62 L 80.7,967.71 A 0.42,0.42 0.0 0,0 80.15,967.09 Q 77.03,968.98 75.61,971.5 A 0.14,0.14 0.0 0,1 75.34,971.43 M 100.6397,973.0597 A 0.71,0.71 0.0 0,0 99.9284,972.351 L 89.5684,972.369 A 0.71,0.71 0.0 0,0 88.8597,973.0803 L 88.8603,973.4603 A 0.71,0.71 0.0 0,0 89.5716,974.169 L 99.9316,974.151 A 0.71,0.71 0.0 0,0 100.6403,973.4397 L 100.6397,973.0597"/>
22
- <path fill="#1b1f23" d="M 85.85,942.19 Q 89.87,946.21 92.59,949.5 A 0.85,0.84 -13.0 0,1 91.74,950.86 Q 91.36,950.76 90.93,950.32 Q 87.32,946.54 83.23,942.53 L 81.24,939.57 A 2.65,2.6 85.0 0,0 80.21,938.69 Q 77.92,937.63 76.03,934.93 A 0.42,0.42 0.0 0,0 75.26,935.17 L 75.26,940.03 A 1.01,1.0 0.0 0,1 74.25,941.03 L 73.96,941.03 A 0.75,0.75 0.0 0,1 73.21,940.28 L 73.21,931.43 A 0.65,0.64 0.0 0,1 73.86,930.79 L 82.69,930.79 A 1.16,1.15 -0.0 0,1 83.85,931.94 L 83.85,932.32 A 0.79,0.78 -90.0 0,1 83.07,933.11 L 77.17,933.11 A 0.34,0.34 0.0 0,0 76.95,933.7 C 79.21,935.66 80.68,936.7 81.16,938.27 A 1.3,1.29 -79.8 0,0 81.6,938.91 L 85.85,942.19"/>
23
- <path fill="#1b1f23" d="M 106.66,943.19 L 98.79,950.47 A 0.69,0.68 -44.7 0,1 97.86,950.47 L 97.67,950.28 A 0.41,0.4 -46.5 0,1 97.66,949.7 L 104.76,942.46 L 113.84,933.9 A 0.47,0.47 0.0 0,0 113.52,933.09 L 108.66,933.12 A 0.84,0.83 -0.0 0,1 107.82,932.29 L 107.83,932.25 A 0.92,0.91 -88.4 0,1 108.75,931.37 L 116.26,931.39 A 0.61,0.61 0.0 0,1 116.87,932.0 L 116.87,938.77 A 1.08,1.08 0.0 0,1 115.79,939.85 L 115.45,939.85 A 0.62,0.61 -90.0 0,1 114.84,939.23 L 114.84,935.83 A 0.43,0.43 0.0 0,0 114.1,935.53 L 106.66,943.19"/>
24
- <path fill="#a8d8d0" d="M 104.76,942.46 L 97.66,949.7 A 0.41,0.4 -46.5 0,0 97.67,950.28 L 97.86,950.47 A 0.69,0.68 -44.7 0,0 98.79,950.47 L 106.66,943.19 Q 108.18,952.5 107.49,961.58 A 0.95,0.92 78.3 0,1 107.01,962.33 L 106.47,962.62 L 98.9,955.13 A 0.72,0.71 -52.0 0,0 97.8,955.27 L 97.77,955.31 A 1.19,1.19 0.0 0,0 97.85,956.71 Q 101.37,961.06 105.91,964.41 C 104.88,964.53 104.03,965.05 103.0,965.11 Q 94.05,965.66 84.9,964.42 Q 88.7,960.3 92.21,957.22 A 1.01,1.0 -54.2 0,0 91.94,955.54 Q 91.26,955.26 90.52,956.03 Q 86.84,959.89 82.85,963.6 Q 82.75,960.4 82.15,950.0 Q 81.94,946.42 83.23,942.53 Q 87.32,946.54 90.93,950.32 Q 91.36,950.76 91.74,950.86 A 0.85,0.84 -13.0 0,0 92.59,949.5 Q 89.87,946.21 85.85,942.19 Q 91.7,941.28 97.3,941.13 C 100.29,941.05 102.0,940.68 104.76,942.46"/>
25
- <path fill="#1b1f23" d="M 106.47,962.62 Q 107.09,963.22 107.15,963.84 A 0.53,0.53 0.0 0,1 106.61,964.42 L 105.91,964.41 Q 101.37,961.06 97.85,956.71 A 1.19,1.19 0.0 0,1 97.77,955.31 L 97.8,955.27 A 0.72,0.71 -52.0 0,1 98.9,955.13 L 106.47,962.62"/>
26
- <path fill="#1b1f23" d="M 84.9,964.42 Q 84.49,964.88 83.75,965.01 Q 83.03,965.13 82.79,964.69 Q 82.57,964.29 82.85,963.6 Q 86.84,959.89 90.52,956.03 Q 91.26,955.26 91.94,955.54 A 1.01,1.0 -54.2 0,1 92.21,957.22 Q 88.7,960.3 84.9,964.42"/>
27
- <path fill="#1b1f23" d="M 116.86,974.11 Q 116.7,974.27 116.55,974.27 Q 111.86,974.33 107.38,974.34 A 0.96,0.96 0.0 0,1 106.41,973.35 L 106.41,973.31 A 1.04,1.04 0.0 0,1 107.43,972.31 L 112.88,972.19 A 0.27,0.26 66.3 0,0 113.05,971.73 Q 107.68,966.64 108.42,965.88 Q 109.15,965.13 114.38,970.37 A 0.27,0.26 22.3 0,0 114.84,970.18 L 114.82,964.73 A 1.04,1.04 0.0 0,1 115.79,963.69 L 115.83,963.68 A 0.96,0.96 0.0 0,1 116.84,964.63 Q 116.95,969.11 117.01,973.8 Q 117.01,973.95 116.86,974.11"/>
28
- <path fill="#1b1f23" d="M 75.61,971.5 Q 77.03,968.98 80.15,967.09 A 0.42,0.42 0.0 0,1 80.7,967.71 L 77.51,971.62 A 0.47,0.47 0.0 0,0 77.87,972.38 L 82.53,972.38 A 0.7,0.7 0.0 0,1 83.23,973.11 L 83.21,973.53 A 0.73,0.73 0.0 0,1 82.48,974.23 L 73.76,974.23 A 0.53,0.52 0.0 0,1 73.23,973.71 L 73.23,966.01 A 0.76,0.75 -0.0 0,1 73.99,965.26 L 74.43,965.26 A 0.91,0.91 0.0 0,1 75.34,966.17 L 75.34,971.43 A 0.14,0.14 0.0 0,0 75.61,971.5"/>
29
- </svg>
Binary file
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path fill="#a8d8d0" stroke="#1b1f23" stroke-width="4" stroke-linejoin="round" d="M12 48 18 16 39 10 54 29 45 53Z"/><circle cx="18" cy="16" r="4"/><circle cx="54" cy="29" r="4"/><circle cx="45" cy="53" r="4"/><circle cx="12" cy="48" r="4"/></svg>
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path fill="none" stroke="#1b1f23" stroke-width="4" d="M10 16v32m44-32v32M14 32h36M20 26l-6 6 6 6m24-12 6 6-6 6"/></svg>
@@ -1,6 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="848.65 362.57 56.57 69.59">
3
- <path fill="none" stroke="#898b8d" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 891.55,378.49 Q 891.73,375.88 891.22,375.07 Q 888.38,370.64 884.45,373.25 A 0.47,0.47 0.0 0,1 883.72,372.94 C 882.66,366.92 875.17,367.33 873.8,372.89 A 0.57,0.56 19.1 0,1 873.01,373.27 Q 872.92,373.22 872.26,372.75 C 870.42,371.41 867.61,372.86 866.49,374.44 Q 865.49,375.84 865.55,379.13 Q 865.8,393.02 865.51,398.69 A 0.35,0.35 0.0 0,1 864.86,398.84 C 863.83,396.99 862.84,395.06 860.71,394.55 C 856.19,393.47 853.41,397.46 855.2,401.57 Q 858.78,409.79 861.92,415.59 C 864.67,420.67 868.42,425.41 874.46,425.96 A 0.58,0.57 -79.6 0,0 875.06,425.54 L 875.14,425.26 A 0.82,0.82 0.0 0,0 874.57,424.26 L 872.43,423.68 A 4.31,4.16 69.2 0,1 871.18,423.09 Q 865.58,419.13 863.17,414.07 Q 861.81,411.23 856.64,399.78 C 855.42,397.07 859.01,395.8 860.96,396.66 A 2.29,2.26 86.8 0,1 862.0,397.6 L 866.37,405.17 A 0.69,0.69 0.0 0,0 867.66,404.82 L 867.66,377.15 A 2.83,2.83 0.0 0,1 870.49,374.32 L 870.93,374.32 A 2.63,2.63 0.0 0,1 873.56,376.95 L 873.56,394.71 A 0.94,0.94 0.0 0,0 874.5,395.65 L 874.76,395.65 A 0.81,0.8 -90.0 0,0 875.56,394.84 L 875.56,373.77 A 3.06,3.05 88.1 0,1 878.41,370.72 L 878.86,370.69 A 2.6,2.6 0.0 0,1 881.62,373.28 L 881.62,394.85 A 0.91,0.91 0.0 0,0 882.52,395.76 L 882.86,395.77 A 0.84,0.84 0.0 0,0 883.71,394.93 L 883.71,377.65 A 3.27,3.27 0.0 0,1 886.42,374.43 L 886.85,374.36 A 2.34,2.34 0.0 0,1 889.59,376.66 L 889.59,395.21 A 1.03,1.01 -82.7 0,0 890.34,396.2 L 890.72,396.31 A 0.73,0.73 0.0 0,0 891.64,395.6 L 891.64,382.76 A 2.46,2.46 0.0 0,1 894.2,380.3 L 894.49,380.31 A 2.69,2.69 0.0 0,1 897.11,383.0 Q 897.1,407.15 897.11,407.35 C 897.43,415.77 894.71,421.57 886.93,424.42 A 0.75,0.75 0.0 0,0 886.56,425.52 L 886.58,425.55 A 1.3,1.29 66.9 0,0 887.98,426.12 C 892.83,424.97 896.54,420.35 898.23,415.91 Q 899.24,413.24 899.22,407.12 Q 899.14,387.19 899.22,382.16 A 3.07,2.99 36.7 0,0 899.07,381.22 C 898.38,379.19 895.5,377.04 893.21,378.45 Q 892.42,378.93 892.12,378.99 A 0.48,0.48 0.0 0,1 891.55,378.49"/>
4
- <path fill="#f7f7f7" d="M 891.55,378.49 Q 891.73,375.88 891.22,375.07 Q 888.38,370.64 884.45,373.25 A 0.47,0.47 0.0 0,1 883.72,372.94 C 882.66,366.92 875.17,367.33 873.8,372.89 A 0.57,0.56 19.1 0,1 873.01,373.27 Q 872.92,373.22 872.26,372.75 C 870.42,371.41 867.61,372.86 866.49,374.44 Q 865.49,375.84 865.55,379.13 Q 865.8,393.02 865.51,398.69 A 0.35,0.35 0.0 0,1 864.86,398.84 C 863.83,396.99 862.84,395.06 860.71,394.55 C 856.19,393.47 853.41,397.46 855.2,401.57 Q 858.78,409.79 861.92,415.59 C 864.67,420.67 868.42,425.41 874.46,425.96 A 0.58,0.57 -79.6 0,0 875.06,425.54 L 875.14,425.26 A 0.82,0.82 0.0 0,0 874.57,424.26 L 872.43,423.68 A 4.31,4.16 69.2 0,1 871.18,423.09 Q 865.58,419.13 863.17,414.07 Q 861.81,411.23 856.64,399.78 C 855.42,397.07 859.01,395.8 860.96,396.66 A 2.29,2.26 86.8 0,1 862.0,397.6 L 866.37,405.17 A 0.69,0.69 0.0 0,0 867.66,404.82 L 867.66,377.15 A 2.83,2.83 0.0 0,1 870.49,374.32 L 870.93,374.32 A 2.63,2.63 0.0 0,1 873.56,376.95 L 873.56,394.71 A 0.94,0.94 0.0 0,0 874.5,395.65 L 874.76,395.65 A 0.81,0.8 -90.0 0,0 875.56,394.84 L 875.56,373.77 A 3.06,3.05 88.1 0,1 878.41,370.72 L 878.86,370.69 A 2.6,2.6 0.0 0,1 881.62,373.28 L 881.62,394.85 A 0.91,0.91 0.0 0,0 882.52,395.76 L 882.86,395.77 A 0.84,0.84 0.0 0,0 883.71,394.93 L 883.71,377.65 A 3.27,3.27 0.0 0,1 886.42,374.43 L 886.85,374.36 A 2.34,2.34 0.0 0,1 889.59,376.66 L 889.59,395.21 A 1.03,1.01 -82.7 0,0 890.34,396.2 L 890.72,396.31 A 0.73,0.73 0.0 0,0 891.64,395.6 L 891.64,382.76 A 2.46,2.46 0.0 0,1 894.2,380.3 L 894.49,380.31 A 2.69,2.69 0.0 0,1 897.11,383.0 Q 897.1,407.15 897.11,407.35 C 897.43,415.77 894.71,421.57 886.93,424.42 A 0.75,0.75 0.0 0,0 886.56,425.52 L 886.58,425.55 A 1.3,1.29 66.9 0,0 887.98,426.12 C 892.83,424.97 896.54,420.35 898.23,415.91 Q 899.24,413.24 899.22,407.12 Q 899.14,387.19 899.22,382.16 A 3.07,2.99 36.7 0,0 899.07,381.22 C 898.38,379.19 895.5,377.04 893.21,378.45 Q 892.42,378.93 892.12,378.99 A 0.48,0.48 0.0 0,1 891.55,378.49"/>
5
- <path fill="#1b1f23" d="M 892.12,378.99 Q 892.42,378.93 893.21,378.45 C 895.5,377.04 898.38,379.19 899.07,381.22 A 3.07,2.99 36.7 0,1 899.22,382.16 Q 899.14,387.19 899.22,407.12 Q 899.24,413.24 898.23,415.91 C 896.54,420.35 892.83,424.97 887.98,426.12 A 1.3,1.29 66.9 0,1 886.58,425.55 L 886.56,425.52 A 0.75,0.75 0.0 0,1 886.93,424.42 C 894.71,421.57 897.43,415.77 897.11,407.35 Q 897.1,407.15 897.11,383.0 A 2.69,2.69 0.0 0,0 894.49,380.31 L 894.2,380.3 A 2.46,2.46 0.0 0,0 891.64,382.76 L 891.64,395.6 A 0.73,0.73 0.0 0,1 890.72,396.31 L 890.34,396.2 A 1.03,1.01 -82.7 0,1 889.59,395.21 L 889.59,376.66 A 2.34,2.34 0.0 0,0 886.85,374.36 L 886.42,374.43 A 3.27,3.27 0.0 0,0 883.71,377.65 L 883.71,394.93 A 0.84,0.84 0.0 0,1 882.86,395.77 L 882.52,395.76 A 0.91,0.91 0.0 0,1 881.62,394.85 L 881.62,373.28 A 2.6,2.6 0.0 0,0 878.86,370.69 L 878.41,370.72 A 3.06,3.05 88.1 0,0 875.56,373.77 L 875.56,394.84 A 0.81,0.8 90.0 0,1 874.76,395.65 L 874.5,395.65 A 0.94,0.94 0.0 0,1 873.56,394.71 L 873.56,376.95 A 2.63,2.63 0.0 0,0 870.93,374.32 L 870.49,374.32 A 2.83,2.83 0.0 0,0 867.66,377.15 L 867.66,404.82 A 0.69,0.69 0.0 0,1 866.37,405.17 L 862.0,397.6 A 2.29,2.26 86.8 0,0 860.96,396.66 C 859.01,395.8 855.42,397.07 856.64,399.78 Q 861.81,411.23 863.17,414.07 Q 865.58,419.13 871.18,423.09 A 4.31,4.16 69.2 0,0 872.43,423.68 L 874.57,424.26 A 0.82,0.82 0.0 0,1 875.14,425.26 L 875.06,425.54 A 0.58,0.57 -79.6 0,1 874.46,425.96 C 868.42,425.41 864.67,420.67 861.92,415.59 Q 858.78,409.79 855.2,401.57 C 853.41,397.46 856.19,393.47 860.71,394.55 C 862.84,395.06 863.83,396.99 864.86,398.84 A 0.35,0.35 0.0 0,0 865.51,398.69 Q 865.8,393.02 865.55,379.13 Q 865.49,375.84 866.49,374.44 C 867.61,372.86 870.42,371.41 872.26,372.75 Q 872.92,373.22 873.01,373.27 A 0.57,0.56 19.1 0,0 873.8,372.89 C 875.17,367.33 882.66,366.92 883.72,372.94 A 0.47,0.47 0.0 0,0 884.45,373.25 Q 888.38,370.64 891.22,375.07 Q 891.73,375.88 891.55,378.49 A 0.48,0.48 0.0 0,0 892.12,378.99"/>
6
- </svg>
@@ -1,82 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <svg
3
- version="1.1"
4
- viewBox="0 0 64 64"
5
- id="svg5"
6
- sodipodi:docname="RectangularZoom.svg"
7
- inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
8
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
9
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
10
- xmlns="http://www.w3.org/2000/svg"
11
- xmlns:svg="http://www.w3.org/2000/svg">
12
- <defs
13
- id="defs5" />
14
- <sodipodi:namedview
15
- id="namedview5"
16
- pagecolor="#ffffff"
17
- bordercolor="#000000"
18
- borderopacity="0.25"
19
- inkscape:showpageshadow="2"
20
- inkscape:pageopacity="0.0"
21
- inkscape:pagecheckerboard="0"
22
- inkscape:deskcolor="#d1d1d1"
23
- inkscape:zoom="12.734375"
24
- inkscape:cx="32"
25
- inkscape:cy="32"
26
- inkscape:window-width="1920"
27
- inkscape:window-height="1017"
28
- inkscape:window-x="1912"
29
- inkscape:window-y="-8"
30
- inkscape:window-maximized="1"
31
- inkscape:current-layer="svg5" />
32
- <title
33
- id="title1">Rectangular Zoom</title>
34
- <desc
35
- id="desc1">GeoKernel style rectangular zoom toolbar icon</desc>
36
- <!-- selection rectangle shadow/outline -->
37
- <!-- selection rectangle body -->
38
- <rect
39
- x="9.1931248"
40
- y="10.742818"
41
- width="32.969578"
42
- height="24.948719"
43
- rx="1.8190112"
44
- fill="#a8d8d0"
45
- stroke="#627c7a"
46
- stroke-width="2.27091"
47
- stroke-linejoin="round"
48
- vector-effect="non-scaling-stroke"
49
- id="rect2" />
50
- <!-- inner dashed zoom target -->
51
- <!-- magnifier handle outer -->
52
- <path
53
- d="M 42.9 42.1 L 56.2 55.1"
54
- fill="none"
55
- stroke="#1b1f23"
56
- stroke-width="7"
57
- stroke-linecap="round"
58
- vector-effect="non-scaling-stroke"
59
- id="path3" />
60
- <!-- magnifier handle highlight -->
61
- <path
62
- d="M 42.9 42.1 L 56.2 55.1"
63
- fill="none"
64
- stroke="#f7f7f7"
65
- stroke-width="3.2"
66
- stroke-linecap="round"
67
- vector-effect="non-scaling-stroke"
68
- id="path4" />
69
- <!-- magnifier ring outer -->
70
- <circle
71
- cx="35.5"
72
- cy="35.5"
73
- r="13.2"
74
- fill="#f7f7f7"
75
- stroke="#1b1f23"
76
- stroke-width="3"
77
- vector-effect="non-scaling-stroke"
78
- id="circle4" />
79
- <!-- magnifier lens -->
80
- <!-- small rectangle inside lens to indicate rectangular zoom -->
81
- <!-- subtle top-left accent, matching existing set cyan/gray strokes -->
82
- </svg>
@@ -1,10 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="946.36 368.53 64.59 63.66">
3
- <path fill="none" stroke="#898b8d" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 957.75,380.31 C 949.99,388.3 950.73,401.04 959.17,408.29 C 966.4,414.5 976.53,414.2 983.96,408.15 A 0.73,0.72 47.8 0,1 984.92,408.2 Q 992.47,415.74 1003.02,425.81 Q 1003.45,426.23 1003.77,426.19 Q 1004.01,426.17 1004.48,425.69 Q 1004.93,425.22 1004.95,424.99 Q 1004.97,424.66 1004.54,424.24 Q 994.17,413.99 986.41,406.66 A 0.73,0.72 40.5 0,1 986.34,405.7 C 992.17,398.1 992.17,387.97 985.76,380.92 C 978.27,372.7 965.51,372.33 957.75,380.31"/>
4
- <path fill="none" stroke="#898b8d" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 988.7759,392.535 A 17.28,17.01 -3.6 0,0 970.4619,376.6436 A 17.28,17.01 -3.6 0,0 954.2841,394.705 A 17.28,17.01 -3.6 0,0 972.5981,410.5964 A 17.28,17.01 -3.6 0,0 988.7759,392.535"/>
5
- <path fill="none" stroke="#898b8d" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 970.28,392.38 Q 970.15,392.51 970.13,392.52 Q 969.95,392.61 969.93,392.61 C 966.45,392.59 963.22,392.4 962.65,392.92 Q 962.39,393.17 962.39,393.59 Q 962.39,394.0 962.66,394.25 C 963.22,394.77 966.45,394.57 969.93,394.55 Q 969.95,394.55 970.13,394.63 Q 970.15,394.64 970.28,394.77 Q 970.41,394.9 970.42,394.92 Q 970.51,395.1 970.51,395.12 C 970.49,398.6 970.3,401.83 970.82,402.4 Q 971.07,402.67 971.48,402.66 Q 971.9,402.66 972.15,402.4 C 972.67,401.83 972.47,398.6 972.44,395.12 Q 972.44,395.1 972.53,394.92 Q 972.54,394.9 972.67,394.77 Q 972.8,394.64 972.82,394.63 Q 973.0,394.54 973.02,394.54 C 976.5,394.56 979.73,394.75 980.3,394.23 Q 980.56,393.98 980.56,393.57 Q 980.56,393.15 980.29,392.9 C 979.73,392.38 976.5,392.58 973.02,392.61 Q 973.0,392.61 972.82,392.52 Q 972.8,392.51 972.67,392.38 Q 972.54,392.25 972.53,392.23 Q 972.44,392.05 972.44,392.03 C 972.46,388.55 972.65,385.32 972.13,384.76 Q 971.88,384.49 971.47,384.49 Q 971.05,384.49 970.8,384.76 C 970.28,385.32 970.48,388.55 970.51,392.03 Q 970.51,392.05 970.42,392.23 Q 970.41,392.25 970.28,392.38"/>
6
- <path fill="#f7f7f7" d="M 957.75,380.31 C 949.99,388.3 950.73,401.04 959.17,408.29 C 966.4,414.5 976.53,414.2 983.96,408.15 A 0.73,0.72 47.8 0,1 984.92,408.2 Q 992.47,415.74 1003.02,425.81 Q 1003.45,426.23 1003.77,426.19 Q 1004.01,426.17 1004.48,425.69 Q 1004.93,425.22 1004.95,424.99 Q 1004.97,424.66 1004.54,424.24 Q 994.17,413.99 986.41,406.66 A 0.73,0.72 40.5 0,1 986.34,405.7 C 992.17,398.1 992.17,387.97 985.76,380.92 C 978.27,372.7 965.51,372.33 957.75,380.31"/>
7
- <path fill="#1b1f23" d="M 1004.48,425.69 Q 1004.01,426.17 1003.77,426.19 Q 1003.45,426.23 1003.02,425.81 Q 992.47,415.74 984.92,408.2 A 0.73,0.72 47.8 0,0 983.96,408.15 C 976.53,414.2 966.4,414.5 959.17,408.29 C 950.73,401.04 949.99,388.3 957.75,380.31 C 965.51,372.33 978.27,372.7 985.76,380.92 C 992.17,387.97 992.17,398.1 986.34,405.7 A 0.73,0.72 40.5 0,0 986.41,406.66 Q 994.17,413.99 1004.54,424.24 Q 1004.97,424.66 1004.95,424.99 Q 1004.93,425.22 1004.48,425.69 M 988.7759,392.535 A 17.28,17.01 -3.6 0,0 970.4619,376.6436 A 17.28,17.01 -3.6 0,0 954.2841,394.705 A 17.28,17.01 -3.6 0,0 972.5981,410.5964 A 17.28,17.01 -3.6 0,0 988.7759,392.535"/>
8
- <path fill="#f7f7f7" d="M 988.7759,392.535 A 17.28,17.01 -3.6 0,1 972.5981,410.5964 A 17.28,17.01 -3.6 0,1 954.2841,394.705 A 17.28,17.01 -3.6 0,1 970.4619,376.6436 A 17.28,17.01 -3.6 0,1 988.7759,392.535 M 970.28,392.38 Q 970.15,392.51 970.13,392.52 Q 969.95,392.61 969.93,392.61 C 966.45,392.59 963.22,392.4 962.65,392.92 Q 962.39,393.17 962.39,393.59 Q 962.39,394.0 962.66,394.25 C 963.22,394.77 966.45,394.57 969.93,394.55 Q 969.95,394.55 970.13,394.63 Q 970.15,394.64 970.28,394.77 Q 970.41,394.9 970.42,394.92 Q 970.51,395.1 970.51,395.12 C 970.49,398.6 970.3,401.83 970.82,402.4 Q 971.07,402.67 971.48,402.66 Q 971.9,402.66 972.15,402.4 C 972.67,401.83 972.47,398.6 972.44,395.12 Q 972.44,395.1 972.53,394.92 Q 972.54,394.9 972.67,394.77 Q 972.8,394.64 972.82,394.63 Q 973.0,394.54 973.02,394.54 C 976.5,394.56 979.73,394.75 980.3,394.23 Q 980.56,393.98 980.56,393.57 Q 980.56,393.15 980.29,392.9 C 979.73,392.38 976.5,392.58 973.02,392.61 Q 973.0,392.61 972.82,392.52 Q 972.8,392.51 972.67,392.38 Q 972.54,392.25 972.53,392.23 Q 972.44,392.05 972.44,392.03 C 972.46,388.55 972.65,385.32 972.13,384.76 Q 971.88,384.49 971.47,384.49 Q 971.05,384.49 970.8,384.76 C 970.28,385.32 970.48,388.55 970.51,392.03 Q 970.51,392.05 970.42,392.23 Q 970.41,392.25 970.28,392.38"/>
9
- <path fill="#1b1f23" d="M 971.47,384.49 Q 971.88,384.49 972.13,384.76 C 972.65,385.32 972.46,388.55 972.44,392.03 Q 972.44,392.05 972.53,392.23 Q 972.54,392.25 972.67,392.38 Q 972.8,392.51 972.82,392.52 Q 973.0,392.61 973.02,392.61 C 976.5,392.58 979.73,392.38 980.29,392.9 Q 980.56,393.15 980.56,393.57 Q 980.56,393.98 980.3,394.23 C 979.73,394.75 976.5,394.56 973.02,394.54 Q 973.0,394.54 972.82,394.63 Q 972.8,394.64 972.67,394.77 Q 972.54,394.9 972.53,394.92 Q 972.44,395.1 972.44,395.12 C 972.47,398.6 972.67,401.83 972.15,402.4 Q 971.9,402.66 971.48,402.66 Q 971.07,402.67 970.82,402.4 C 970.3,401.83 970.49,398.6 970.51,395.12 Q 970.51,395.1 970.42,394.92 Q 970.41,394.9 970.28,394.77 Q 970.15,394.64 970.13,394.63 Q 969.95,394.55 969.93,394.55 C 966.45,394.57 963.22,394.77 962.66,394.25 Q 962.39,394.0 962.39,393.59 Q 962.39,393.17 962.65,392.92 C 963.22,392.4 966.45,392.59 969.93,392.61 Q 969.95,392.61 970.13,392.52 Q 970.15,392.51 970.28,392.38 Q 970.41,392.25 970.42,392.23 Q 970.51,392.05 970.51,392.03 C 970.48,388.55 970.28,385.32 970.8,384.76 Q 971.05,384.49 971.47,384.49"/>
10
- </svg>
@@ -1,10 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="946.36 368.53 64.59 63.66">
3
- <path fill="none" stroke="#898b8d" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 957.75,380.31 C 949.99,388.3 950.73,401.04 959.17,408.29 C 966.4,414.5 976.53,414.2 983.96,408.15 A 0.73,0.72 47.8 0,1 984.92,408.2 Q 992.47,415.74 1003.02,425.81 Q 1003.45,426.23 1003.77,426.19 Q 1004.01,426.17 1004.48,425.69 Q 1004.93,425.22 1004.95,424.99 Q 1004.97,424.66 1004.54,424.24 Q 994.17,413.99 986.41,406.66 A 0.73,0.72 40.5 0,1 986.34,405.7 C 992.17,398.1 992.17,387.97 985.76,380.92 C 978.27,372.7 965.51,372.33 957.75,380.31"/>
4
- <path fill="none" stroke="#898b8d" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 988.7759,392.535 A 17.28,17.01 -3.6 0,0 970.4619,376.6436 A 17.28,17.01 -3.6 0,0 954.2841,394.705 A 17.28,17.01 -3.6 0,0 972.5981,410.5964 A 17.28,17.01 -3.6 0,0 988.7759,392.535"/>
5
- <path fill="none" stroke="#898b8d" stroke-width="2.00" stroke-linecap="butt" vector-effect="non-scaling-stroke" d="M 970.28,392.38 Q 970.15,392.51 970.13,392.52 Q 969.95,392.61 969.93,392.61 C 966.45,392.59 963.22,392.4 962.65,392.92 Q 962.39,393.17 962.39,393.59 Q 962.39,394.0 962.66,394.25 C 963.22,394.77 966.45,394.57 969.93,394.55 Q 969.95,394.55 970.13,394.63 Q 970.15,394.64 970.28,394.77 Q 970.41,394.9 970.42,394.92 Q 970.51,395.1 970.51,395.12 C 970.49,398.6 970.3,401.83 970.82,402.4 Q 971.07,402.67 971.48,402.66 Q 971.9,402.66 972.15,402.4 C 972.67,401.83 972.47,398.6 972.44,395.12 Q 972.44,395.1 972.53,394.92 Q 972.54,394.9 972.67,394.77 Q 972.8,394.64 972.82,394.63 Q 973.0,394.54 973.02,394.54 C 976.5,394.56 979.73,394.75 980.3,394.23 Q 980.56,393.98 980.56,393.57 Q 980.56,393.15 980.29,392.9 C 979.73,392.38 976.5,392.58 973.02,392.61 Q 973.0,392.61 972.82,392.52 Q 972.8,392.51 972.67,392.38 Q 972.54,392.25 972.53,392.23 Q 972.44,392.05 972.44,392.03 C 972.46,388.55 972.65,385.32 972.13,384.76 Q 971.88,384.49 971.47,384.49 Q 971.05,384.49 970.8,384.76 C 970.28,385.32 970.48,388.55 970.51,392.03 Q 970.51,392.05 970.42,392.23 Q 970.41,392.25 970.28,392.38"/>
6
- <path fill="#f7f7f7" d="M 957.75,380.31 C 949.99,388.3 950.73,401.04 959.17,408.29 C 966.4,414.5 976.53,414.2 983.96,408.15 A 0.73,0.72 47.8 0,1 984.92,408.2 Q 992.47,415.74 1003.02,425.81 Q 1003.45,426.23 1003.77,426.19 Q 1004.01,426.17 1004.48,425.69 Q 1004.93,425.22 1004.95,424.99 Q 1004.97,424.66 1004.54,424.24 Q 994.17,413.99 986.41,406.66 A 0.73,0.72 40.5 0,1 986.34,405.7 C 992.17,398.1 992.17,387.97 985.76,380.92 C 978.27,372.7 965.51,372.33 957.75,380.31"/>
7
- <path fill="#1b1f23" d="M 1004.48,425.69 Q 1004.01,426.17 1003.77,426.19 Q 1003.45,426.23 1003.02,425.81 Q 992.47,415.74 984.92,408.2 A 0.73,0.72 47.8 0,0 983.96,408.15 C 976.53,414.2 966.4,414.5 959.17,408.29 C 950.73,401.04 949.99,388.3 957.75,380.31 C 965.51,372.33 978.27,372.7 985.76,380.92 C 992.17,387.97 992.17,398.1 986.34,405.7 A 0.73,0.72 40.5 0,0 986.41,406.66 Q 994.17,413.99 1004.54,424.24 Q 1004.97,424.66 1004.95,424.99 Q 1004.93,425.22 1004.48,425.69 M 988.7759,392.535 A 17.28,17.01 -3.6 0,0 970.4619,376.6436 A 17.28,17.01 -3.6 0,0 954.2841,394.705 A 17.28,17.01 -3.6 0,0 972.5981,410.5964 A 17.28,17.01 -3.6 0,0 988.7759,392.535"/>
8
- <path fill="#f7f7f7" d="M 988.7759,392.535 A 17.28,17.01 -3.6 0,1 972.5981,410.5964 A 17.28,17.01 -3.6 0,1 954.2841,394.705 A 17.28,17.01 -3.6 0,1 970.4619,376.6436 A 17.28,17.01 -3.6 0,1 988.7759,392.535 M 970.28,392.38 Q 970.15,392.51 970.13,392.52 Q 969.95,392.61 969.93,392.61 C 966.45,392.59 963.22,392.4 962.65,392.92 Q 962.39,393.17 962.39,393.59 Q 962.39,394.0 962.66,394.25 C 963.22,394.77 966.45,394.57 969.93,394.55 Q 969.95,394.55 970.13,394.63 Q 970.15,394.64 970.28,394.77 Q 970.41,394.9 970.42,394.92 Q 970.51,395.1 970.51,395.12 C 970.49,398.6 970.3,401.83 970.82,402.4 Q 971.07,402.67 971.48,402.66 Q 971.9,402.66 972.15,402.4 C 972.67,401.83 972.47,398.6 972.44,395.12 Q 972.44,395.1 972.53,394.92 Q 972.54,394.9 972.67,394.77 Q 972.8,394.64 972.82,394.63 Q 973.0,394.54 973.02,394.54 C 976.5,394.56 979.73,394.75 980.3,394.23 Q 980.56,393.98 980.56,393.57 Q 980.56,393.15 980.29,392.9 C 979.73,392.38 976.5,392.58 973.02,392.61 Q 973.0,392.61 972.82,392.52 Q 972.8,392.51 972.67,392.38 Q 972.54,392.25 972.53,392.23 Q 972.44,392.05 972.44,392.03 C 972.46,388.55 972.65,385.32 972.13,384.76 Q 971.88,384.49 971.47,384.49 Q 971.05,384.49 970.8,384.76 C 970.28,385.32 970.48,388.55 970.51,392.03 Q 970.51,392.05 970.42,392.23 Q 970.41,392.25 970.28,392.38"/>
9
- <rect x="962.39" y="392.38" width="18.17" height="2.39" rx="1.19" ry="1.19" fill="#1b1f23"/>
10
- </svg>