@uwrl/qc-utils 0.0.15 → 0.0.18
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 +56 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.js +2951 -340
- package/dist/index.umd.cjs +15 -3
- package/dist/models/dataSource.d.ts +173 -0
- package/dist/models/index.d.ts +2 -0
- package/dist/models/payload.d.ts +24 -0
- package/dist/models/settings.d.ts +65 -0
- package/dist/models/timestamp.d.ts +150 -0
- package/dist/services/api.d.ts +147 -0
- package/dist/services/apiMethods.d.ts +8 -0
- package/dist/services/createPatchObject.d.ts +17 -0
- package/dist/services/getCSRFToken.d.ts +1 -0
- package/dist/services/index.d.ts +6 -0
- package/dist/services/requestInterceptor.d.ts +12 -0
- package/dist/services/responseInterceptor.d.ts +2 -0
- package/dist/types/index.d.ts +372 -0
- package/dist/utils/__tests__/observations.spec.d.ts +1 -0
- package/dist/utils/ellapsed-time.d.ts +4 -0
- package/dist/utils/format.d.ts +4 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/observations.d.ts +5 -0
- package/dist/utils/plotting/__tests__/calibration.spec.d.ts +16 -0
- package/dist/utils/plotting/__tests__/observation-record-paths.spec.d.ts +21 -0
- package/dist/utils/plotting/__tests__/observation-record.spec.d.ts +1 -0
- package/dist/utils/plotting/__tests__/operation-cores.spec.d.ts +12 -0
- package/dist/utils/plotting/__tests__/workerMocks.d.ts +119 -0
- package/dist/utils/plotting/__tests__/workers.spec.d.ts +18 -0
- package/dist/utils/plotting/add-data.worker.d.ts +1 -0
- package/dist/utils/plotting/calibration.d.ts +99 -0
- package/dist/utils/plotting/change-values.worker.d.ts +1 -0
- package/dist/utils/plotting/change.worker.d.ts +1 -0
- package/dist/utils/plotting/delete-data.worker.d.ts +1 -0
- package/dist/utils/plotting/drift-correction.worker.d.ts +1 -0
- package/dist/utils/plotting/fill-gaps.worker.d.ts +1 -0
- package/dist/utils/plotting/find-gaps.worker.d.ts +1 -0
- package/dist/utils/plotting/interpolate.worker.d.ts +1 -0
- package/dist/utils/plotting/observation-record.d.ts +281 -0
- package/dist/utils/plotting/operation-cores.d.ts +139 -0
- package/dist/utils/plotting/persistence.worker.d.ts +1 -0
- package/dist/utils/plotting/rate-of-change.worker.d.ts +1 -0
- package/dist/utils/plotting/shift-datetimes.worker.d.ts +1 -0
- package/dist/utils/plotting/value-threshold.worker.d.ts +1 -0
- package/package.json +61 -56
- package/dist/types.d.ts +0 -51
- package/dist/utils/ellapsedTime.d.ts +0 -0
- package/dist/utils/observationsUtils.d.ts +0 -0
- package/dist/utils/plotting/observationRecord.d.ts +0 -170
- /package/dist/{utils/__tests__/ellapsedTime.spec.d.ts → services/__tests__/createPatchObject.spec.d.ts} +0 -0
- /package/dist/{utils/__tests__/observationsUtils.spec.d.ts → services/__tests__/requestInterceptor.spec.d.ts} +0 -0
- /package/dist/{utils/plotting/__tests__/delete-data.worker.spec.d.ts → services/__tests__/responseInterceptor.spec.d.ts} +0 -0
- /package/dist/utils/{plotting/__tests__/observationRecord.spec.d.ts → __tests__/ellapsed-time.spec.d.ts} +0 -0
package/dist/index.js
CHANGED
|
@@ -1,122 +1,2073 @@
|
|
|
1
|
-
var
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
var D = /* @__PURE__ */ ((e) => (e.SECOND = "s", e.MINUTE = "m", e.HOUR = "h", e.DAY = "D", e.WEEK = "W", e.MONTH = "M", e.YEAR = "Y", e))(D || {}), E = /* @__PURE__ */ ((e) => (e.ADD_POINTS = "ADD_POINTS", e.CHANGE_VALUES = "CHANGE_VALUES", e.ASSIGN_VALUES_BULK = "ASSIGN_VALUES_BULK", e.DELETE_POINTS = "DELETE_POINTS", e.DRIFT_CORRECTION = "DRIFT_CORRECTION", e.INTERPOLATE = "INTERPOLATE", e.SHIFT_DATETIMES = "SHIFT_DATETIMES", e.ASSIGN_DATETIMES_BULK = "ASSIGN_DATETIMES_BULK", e.FILL_GAPS = "FILL_GAPS", e))(E || {}), v = /* @__PURE__ */ ((e) => (e.FIND_GAPS = "FIND_GAPS", e.PERSISTENCE = "PERSISTENCE", e.CHANGE = "CHANGE", e.RATE_OF_CHANGE = "RATE_OF_CHANGE", e.VALUE_THRESHOLD = "VALUE_THRESHOLD", e.DATETIME_RANGE = "DATETIME_RANGE", e.SELECTION = "SELECTION", e))(v || {}), q = /* @__PURE__ */ ((e) => (e.LT = "Less than", e.LTE = "Less than or equal to", e.GT = "Greater than", e.GTE = "Greater than or equal to", e.E = "Equal", e))(q || {}), Pt = /* @__PURE__ */ ((e) => (e.ADD = "ADD", e.SUB = "SUB", e.MULT = "MULT", e.DIV = "DIV", e.ASSIGN = "ASSIGN", e))(Pt || {}), Bt = /* @__PURE__ */ ((e) => (e.LT = "Less than", e.LTE = "Less than or equal to", e.GT = "Greater than", e.GTE = "Greater than or equal to", e.E = "Equal", e))(Bt || {});
|
|
2
|
+
class Nt {
|
|
3
|
+
id;
|
|
4
|
+
thingId;
|
|
5
|
+
link;
|
|
6
|
+
frequency;
|
|
7
|
+
path;
|
|
8
|
+
datastreamIds;
|
|
9
|
+
publicResource;
|
|
10
|
+
constructor() {
|
|
11
|
+
this.id = "", this.thingId = "", this.link = "", this.frequency = null, this.path = "HydroShare", this.datastreamIds = [], this.publicResource = !1;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
class Hr extends Nt {
|
|
15
|
+
resourceTitle;
|
|
16
|
+
resourceAbstract;
|
|
17
|
+
resourceKeywords;
|
|
18
|
+
constructor() {
|
|
19
|
+
super(), this.resourceTitle = void 0, this.resourceAbstract = void 0, this.resourceKeywords = void 0;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
class jt {
|
|
23
|
+
latitude;
|
|
24
|
+
longitude;
|
|
25
|
+
elevation_m;
|
|
26
|
+
elevationDatum;
|
|
27
|
+
state;
|
|
28
|
+
county;
|
|
29
|
+
country;
|
|
30
|
+
constructor() {
|
|
31
|
+
this.elevationDatum = "WGS84", this.state = "", this.county = "", this.country = "";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
class zr {
|
|
35
|
+
id;
|
|
36
|
+
workspaceId;
|
|
37
|
+
name;
|
|
38
|
+
location = new jt();
|
|
39
|
+
tags;
|
|
40
|
+
hydroShareArchive;
|
|
41
|
+
siteType;
|
|
42
|
+
samplingFeatureCode;
|
|
43
|
+
isPrivate;
|
|
44
|
+
description;
|
|
45
|
+
samplingFeatureType;
|
|
46
|
+
dataDisclaimer;
|
|
47
|
+
constructor() {
|
|
48
|
+
this.id = "", this.workspaceId = "", this.name = "", this.tags = [], this.siteType = "", this.samplingFeatureCode = "", this.isPrivate = !1, this.description = "", this.samplingFeatureType = "Site", this.dataDisclaimer = "";
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
class Xr {
|
|
52
|
+
id;
|
|
53
|
+
workspaceId;
|
|
54
|
+
name;
|
|
55
|
+
description;
|
|
56
|
+
thingId;
|
|
57
|
+
observationType;
|
|
58
|
+
resultType;
|
|
59
|
+
status;
|
|
60
|
+
sampledMedium;
|
|
61
|
+
noDataValue;
|
|
62
|
+
aggregationStatistic;
|
|
63
|
+
unitId;
|
|
64
|
+
observedPropertyId;
|
|
65
|
+
sensorId;
|
|
66
|
+
processingLevelId;
|
|
67
|
+
isPrivate;
|
|
68
|
+
isVisible;
|
|
69
|
+
phenomenonBeginTime;
|
|
70
|
+
phenomenonEndTime;
|
|
71
|
+
intendedTimeSpacing;
|
|
72
|
+
intendedTimeSpacingUnit;
|
|
73
|
+
timeAggregationInterval;
|
|
74
|
+
timeAggregationIntervalUnit;
|
|
75
|
+
dataSourceId;
|
|
76
|
+
valueCount;
|
|
77
|
+
constructor(t) {
|
|
78
|
+
this.id = "", this.workspaceId = "", this.name = "", this.description = "", this.thingId = t || "", this.observationType = "OM_Measurement", this.resultType = "Time Series Coverage", this.sampledMedium = "", this.noDataValue = -9999, this.aggregationStatistic = "", this.unitId = "", this.observedPropertyId = "", this.sensorId = "", this.processingLevelId = "", this.timeAggregationInterval = null, this.timeAggregationIntervalUnit = "seconds", this.isPrivate = !0, this.isVisible = !0, this.valueCount = 0;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
class Vr {
|
|
82
|
+
id;
|
|
83
|
+
workspaceId;
|
|
84
|
+
name;
|
|
85
|
+
symbol;
|
|
86
|
+
definition;
|
|
87
|
+
type;
|
|
88
|
+
constructor() {
|
|
89
|
+
this.id = "", this.workspaceId = "", this.name = "", this.symbol = "", this.definition = "", this.type = "";
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
class qr {
|
|
93
|
+
id;
|
|
94
|
+
workspaceId;
|
|
95
|
+
name;
|
|
96
|
+
description;
|
|
97
|
+
manufacturer;
|
|
98
|
+
model;
|
|
99
|
+
methodType;
|
|
100
|
+
methodCode;
|
|
101
|
+
methodLink;
|
|
102
|
+
encodingType;
|
|
103
|
+
modelLink;
|
|
104
|
+
constructor() {
|
|
105
|
+
this.id = "", this.workspaceId = "", this.name = "", this.description = "", this.manufacturer = "", this.model = "", this.methodType = "Instrument Deployment", this.methodCode = "", this.methodLink = "", this.encodingType = "application/json", this.modelLink = "";
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
class Jr {
|
|
109
|
+
id;
|
|
110
|
+
workspaceId;
|
|
111
|
+
name;
|
|
112
|
+
definition;
|
|
113
|
+
description;
|
|
114
|
+
type;
|
|
115
|
+
code;
|
|
116
|
+
constructor() {
|
|
117
|
+
this.id = "", this.workspaceId = "", this.name = "", this.definition = "", this.description = "", this.type = "Hydrology", this.code = "";
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
class Kr {
|
|
121
|
+
id;
|
|
122
|
+
workspaceId;
|
|
123
|
+
code;
|
|
124
|
+
definition;
|
|
125
|
+
explanation;
|
|
126
|
+
constructor() {
|
|
127
|
+
this.id = "", this.workspaceId = "", this.code = "", this.definition = "", this.explanation = "";
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
class Qr {
|
|
131
|
+
id;
|
|
132
|
+
workspaceId;
|
|
133
|
+
code;
|
|
134
|
+
description;
|
|
135
|
+
constructor() {
|
|
136
|
+
this.id = "", this.workspaceId = "", this.code = "", this.description = "";
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
class Zr {
|
|
140
|
+
name;
|
|
141
|
+
code;
|
|
142
|
+
type;
|
|
143
|
+
description;
|
|
144
|
+
link;
|
|
145
|
+
constructor() {
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
class en {
|
|
149
|
+
id;
|
|
150
|
+
email;
|
|
151
|
+
password;
|
|
152
|
+
firstName;
|
|
153
|
+
middleName;
|
|
154
|
+
lastName;
|
|
155
|
+
phone;
|
|
156
|
+
address;
|
|
157
|
+
organization;
|
|
158
|
+
type;
|
|
159
|
+
link;
|
|
160
|
+
accountType;
|
|
161
|
+
hydroShareConnected;
|
|
162
|
+
constructor() {
|
|
163
|
+
this.id = "", this.email = "", this.password = "", this.firstName = "", this.middleName = "", this.lastName = "", this.phone = "", this.address = "", this.type = "", this.link = "", this.accountType = "standard", this.hydroShareConnected = !1;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
class tn {
|
|
167
|
+
id;
|
|
168
|
+
name;
|
|
169
|
+
iconLink;
|
|
170
|
+
signupEnabled;
|
|
171
|
+
connectEnabled;
|
|
172
|
+
constructor() {
|
|
173
|
+
this.id = "", this.name = "", this.iconLink = "", this.signupEnabled = !0, this.connectEnabled = !0;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
var Wt = /* @__PURE__ */ ((e) => (e.Global = "*", e.View = "view", e.Create = "create", e.Edit = "edit", e.Delete = "delete", e))(Wt || {}), Gt = /* @__PURE__ */ ((e) => (e.Global = "*", e.Workspace = "Workspace", e.Collaborator = "Collaborator", e.Thing = "Thing", e.Datastream = "Datastream", e.Sensor = "Sensor", e.Unit = "Unit", e.ObservedProperty = "ObservedProperty", e.ProcessingLevel = "ProcessingLevel", e.Observation = "Observation", e))(Gt || {});
|
|
177
|
+
class rn {
|
|
178
|
+
id = "";
|
|
179
|
+
key = "";
|
|
180
|
+
name = "";
|
|
181
|
+
description = "";
|
|
182
|
+
isActive = !0;
|
|
183
|
+
expiresAt = "";
|
|
184
|
+
createdAt = "";
|
|
185
|
+
lastUsed = "";
|
|
186
|
+
workspaceId = "";
|
|
187
|
+
role = null;
|
|
188
|
+
constructor(t) {
|
|
189
|
+
Object.assign(this, t);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
class nn {
|
|
193
|
+
id;
|
|
194
|
+
name;
|
|
195
|
+
isPrivate;
|
|
196
|
+
owner;
|
|
197
|
+
collaboratorRole;
|
|
198
|
+
pendingTransferTo;
|
|
199
|
+
constructor() {
|
|
200
|
+
this.id = "", this.name = "", this.isPrivate = !1, this.owner = null, this.collaboratorRole = null, this.pendingTransferTo = null;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
class sn {
|
|
204
|
+
user;
|
|
205
|
+
role;
|
|
206
|
+
constructor() {
|
|
207
|
+
this.user = {
|
|
208
|
+
phone: "",
|
|
209
|
+
address: "",
|
|
210
|
+
link: "",
|
|
211
|
+
type: "",
|
|
212
|
+
name: "",
|
|
213
|
+
email: "",
|
|
214
|
+
organizationName: ""
|
|
215
|
+
}, this.role = {
|
|
216
|
+
name: "",
|
|
217
|
+
description: "",
|
|
218
|
+
id: "",
|
|
219
|
+
isApikeyRole: !1,
|
|
220
|
+
isUserRole: !1,
|
|
221
|
+
workspaceId: "",
|
|
222
|
+
permissions: []
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
function lt() {
|
|
227
|
+
const e = "csrftoken=", r = decodeURIComponent(document.cookie).split(";");
|
|
228
|
+
for (const n of r) {
|
|
229
|
+
const s = n.trim();
|
|
230
|
+
if (s.startsWith(e))
|
|
231
|
+
return s.substring(e.length);
|
|
232
|
+
}
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
function ut(e) {
|
|
236
|
+
let t = e.headers ? { ...e.headers } : {}, r;
|
|
237
|
+
return e.body !== void 0 && (r = typeof e.body == "string" || e.body instanceof FormData ? e.body : JSON.stringify(e.body)), t["X-CSRFToken"] = lt() || "", {
|
|
238
|
+
...e,
|
|
239
|
+
headers: t,
|
|
240
|
+
body: r,
|
|
241
|
+
credentials: "omit"
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
function Yt(e) {
|
|
245
|
+
if (Array.isArray(e?.errors) && e.errors.length && (e = e.errors[0]), typeof e != "object" || e === null)
|
|
246
|
+
return "An unknown error occurred.";
|
|
247
|
+
const t = ["message", "detail", "error"];
|
|
248
|
+
for (const r of t)
|
|
249
|
+
if (e[r]) return e[r];
|
|
250
|
+
return "An unknown error occurred.";
|
|
251
|
+
}
|
|
252
|
+
async function ht(e) {
|
|
253
|
+
if (e.headers.get("Content-Length") === "0" || e.statusText === "No Content")
|
|
254
|
+
return null;
|
|
255
|
+
const t = e.headers.get("content-type") || "";
|
|
256
|
+
let r = null;
|
|
257
|
+
if (t.includes("application/json"))
|
|
258
|
+
try {
|
|
259
|
+
r = await e.json();
|
|
260
|
+
} catch (s) {
|
|
261
|
+
console.error("Failed to parse error JSON:", s);
|
|
262
|
+
}
|
|
263
|
+
else if (t.includes("text/csv"))
|
|
264
|
+
try {
|
|
265
|
+
r = await e.blob();
|
|
266
|
+
} catch (s) {
|
|
267
|
+
console.error("Failed to parse error JSON:", s);
|
|
268
|
+
}
|
|
269
|
+
if (e.ok || e.status === 401) return r;
|
|
270
|
+
const n = {
|
|
271
|
+
status: e.status,
|
|
272
|
+
message: Yt(r)
|
|
273
|
+
};
|
|
274
|
+
throw console.error("API response not OK:", n.message), n;
|
|
275
|
+
}
|
|
276
|
+
var ke = function(e, t) {
|
|
277
|
+
return ke = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(r, n) {
|
|
278
|
+
r.__proto__ = n;
|
|
279
|
+
} || function(r, n) {
|
|
280
|
+
for (var s in n) Object.prototype.hasOwnProperty.call(n, s) && (r[s] = n[s]);
|
|
281
|
+
}, ke(e, t);
|
|
282
|
+
};
|
|
283
|
+
function le(e, t) {
|
|
284
|
+
if (typeof t != "function" && t !== null)
|
|
285
|
+
throw new TypeError("Class extends value " + String(t) + " is not a constructor or null");
|
|
286
|
+
ke(e, t);
|
|
287
|
+
function r() {
|
|
288
|
+
this.constructor = e;
|
|
289
|
+
}
|
|
290
|
+
e.prototype = t === null ? Object.create(t) : (r.prototype = t.prototype, new r());
|
|
291
|
+
}
|
|
292
|
+
function ve(e) {
|
|
293
|
+
var t = typeof Symbol == "function" && Symbol.iterator, r = t && e[t], n = 0;
|
|
294
|
+
if (r) return r.call(e);
|
|
295
|
+
if (e && typeof e.length == "number") return {
|
|
296
|
+
next: function() {
|
|
297
|
+
return e && n >= e.length && (e = void 0), { value: e && e[n++], done: !e };
|
|
298
|
+
}
|
|
299
|
+
};
|
|
300
|
+
throw new TypeError(t ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
301
|
+
}
|
|
302
|
+
function _e(e, t) {
|
|
303
|
+
var r = typeof Symbol == "function" && e[Symbol.iterator];
|
|
304
|
+
if (!r) return e;
|
|
305
|
+
var n = r.call(e), s, a = [], o;
|
|
306
|
+
try {
|
|
307
|
+
for (; (t === void 0 || t-- > 0) && !(s = n.next()).done; ) a.push(s.value);
|
|
308
|
+
} catch (i) {
|
|
309
|
+
o = { error: i };
|
|
310
|
+
} finally {
|
|
311
|
+
try {
|
|
312
|
+
s && !s.done && (r = n.return) && r.call(n);
|
|
313
|
+
} finally {
|
|
314
|
+
if (o) throw o.error;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return a;
|
|
318
|
+
}
|
|
319
|
+
function Ae(e, t, r) {
|
|
320
|
+
if (r || arguments.length === 2) for (var n = 0, s = t.length, a; n < s; n++)
|
|
321
|
+
(a || !(n in t)) && (a || (a = Array.prototype.slice.call(t, 0, n)), a[n] = t[n]);
|
|
322
|
+
return e.concat(a || Array.prototype.slice.call(t));
|
|
323
|
+
}
|
|
324
|
+
function P(e) {
|
|
325
|
+
return typeof e == "function";
|
|
326
|
+
}
|
|
327
|
+
function ft(e) {
|
|
328
|
+
var t = function(n) {
|
|
329
|
+
Error.call(n), n.stack = new Error().stack;
|
|
330
|
+
}, r = e(t);
|
|
331
|
+
return r.prototype = Object.create(Error.prototype), r.prototype.constructor = r, r;
|
|
332
|
+
}
|
|
333
|
+
var de = ft(function(e) {
|
|
334
|
+
return function(r) {
|
|
335
|
+
e(this), this.message = r ? r.length + ` errors occurred during unsubscription:
|
|
336
|
+
` + r.map(function(n, s) {
|
|
337
|
+
return s + 1 + ") " + n.toString();
|
|
338
|
+
}).join(`
|
|
339
|
+
`) : "", this.name = "UnsubscriptionError", this.errors = r;
|
|
340
|
+
};
|
|
341
|
+
});
|
|
342
|
+
function Le(e, t) {
|
|
343
|
+
if (e) {
|
|
344
|
+
var r = e.indexOf(t);
|
|
345
|
+
0 <= r && e.splice(r, 1);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
var ue = (function() {
|
|
349
|
+
function e(t) {
|
|
350
|
+
this.initialTeardown = t, this.closed = !1, this._parentage = null, this._finalizers = null;
|
|
351
|
+
}
|
|
352
|
+
return e.prototype.unsubscribe = function() {
|
|
353
|
+
var t, r, n, s, a;
|
|
354
|
+
if (!this.closed) {
|
|
355
|
+
this.closed = !0;
|
|
356
|
+
var o = this._parentage;
|
|
357
|
+
if (o)
|
|
358
|
+
if (this._parentage = null, Array.isArray(o))
|
|
359
|
+
try {
|
|
360
|
+
for (var i = ve(o), l = i.next(); !l.done; l = i.next()) {
|
|
361
|
+
var f = l.value;
|
|
362
|
+
f.remove(this);
|
|
363
|
+
}
|
|
364
|
+
} catch (h) {
|
|
365
|
+
t = { error: h };
|
|
366
|
+
} finally {
|
|
367
|
+
try {
|
|
368
|
+
l && !l.done && (r = i.return) && r.call(i);
|
|
369
|
+
} finally {
|
|
370
|
+
if (t) throw t.error;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
else
|
|
374
|
+
o.remove(this);
|
|
375
|
+
var u = this.initialTeardown;
|
|
376
|
+
if (P(u))
|
|
377
|
+
try {
|
|
378
|
+
u();
|
|
379
|
+
} catch (h) {
|
|
380
|
+
a = h instanceof de ? h.errors : [h];
|
|
381
|
+
}
|
|
382
|
+
var p = this._finalizers;
|
|
383
|
+
if (p) {
|
|
384
|
+
this._finalizers = null;
|
|
385
|
+
try {
|
|
386
|
+
for (var g = ve(p), y = g.next(); !y.done; y = g.next()) {
|
|
387
|
+
var d = y.value;
|
|
388
|
+
try {
|
|
389
|
+
Pe(d);
|
|
390
|
+
} catch (h) {
|
|
391
|
+
a = a ?? [], h instanceof de ? a = Ae(Ae([], _e(a)), _e(h.errors)) : a.push(h);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
} catch (h) {
|
|
395
|
+
n = { error: h };
|
|
396
|
+
} finally {
|
|
397
|
+
try {
|
|
398
|
+
y && !y.done && (s = g.return) && s.call(g);
|
|
399
|
+
} finally {
|
|
400
|
+
if (n) throw n.error;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
if (a)
|
|
405
|
+
throw new de(a);
|
|
406
|
+
}
|
|
407
|
+
}, e.prototype.add = function(t) {
|
|
408
|
+
var r;
|
|
409
|
+
if (t && t !== this)
|
|
410
|
+
if (this.closed)
|
|
411
|
+
Pe(t);
|
|
412
|
+
else {
|
|
413
|
+
if (t instanceof e) {
|
|
414
|
+
if (t.closed || t._hasParent(this))
|
|
415
|
+
return;
|
|
416
|
+
t._addParent(this);
|
|
417
|
+
}
|
|
418
|
+
(this._finalizers = (r = this._finalizers) !== null && r !== void 0 ? r : []).push(t);
|
|
419
|
+
}
|
|
420
|
+
}, e.prototype._hasParent = function(t) {
|
|
421
|
+
var r = this._parentage;
|
|
422
|
+
return r === t || Array.isArray(r) && r.includes(t);
|
|
423
|
+
}, e.prototype._addParent = function(t) {
|
|
424
|
+
var r = this._parentage;
|
|
425
|
+
this._parentage = Array.isArray(r) ? (r.push(t), r) : r ? [r, t] : t;
|
|
426
|
+
}, e.prototype._removeParent = function(t) {
|
|
427
|
+
var r = this._parentage;
|
|
428
|
+
r === t ? this._parentage = null : Array.isArray(r) && Le(r, t);
|
|
429
|
+
}, e.prototype.remove = function(t) {
|
|
430
|
+
var r = this._finalizers;
|
|
431
|
+
r && Le(r, t), t instanceof e && t._removeParent(this);
|
|
432
|
+
}, e.EMPTY = (function() {
|
|
433
|
+
var t = new e();
|
|
434
|
+
return t.closed = !0, t;
|
|
435
|
+
})(), e;
|
|
436
|
+
})(), dt = ue.EMPTY;
|
|
437
|
+
function pt(e) {
|
|
438
|
+
return e instanceof ue || e && "closed" in e && P(e.remove) && P(e.add) && P(e.unsubscribe);
|
|
439
|
+
}
|
|
440
|
+
function Pe(e) {
|
|
441
|
+
P(e) ? e() : e.unsubscribe();
|
|
442
|
+
}
|
|
443
|
+
var Ht = {
|
|
444
|
+
Promise: void 0
|
|
445
|
+
}, zt = {
|
|
446
|
+
setTimeout: function(e, t) {
|
|
447
|
+
for (var r = [], n = 2; n < arguments.length; n++)
|
|
448
|
+
r[n - 2] = arguments[n];
|
|
449
|
+
return setTimeout.apply(void 0, Ae([e, t], _e(r)));
|
|
450
|
+
},
|
|
451
|
+
clearTimeout: function(e) {
|
|
452
|
+
return clearTimeout(e);
|
|
453
|
+
},
|
|
454
|
+
delegate: void 0
|
|
455
|
+
};
|
|
456
|
+
function Xt(e) {
|
|
457
|
+
zt.setTimeout(function() {
|
|
458
|
+
throw e;
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
function Be() {
|
|
462
|
+
}
|
|
463
|
+
function oe(e) {
|
|
464
|
+
e();
|
|
465
|
+
}
|
|
466
|
+
var yt = (function(e) {
|
|
467
|
+
le(t, e);
|
|
468
|
+
function t(r) {
|
|
469
|
+
var n = e.call(this) || this;
|
|
470
|
+
return n.isStopped = !1, r ? (n.destination = r, pt(r) && r.add(n)) : n.destination = Jt, n;
|
|
471
|
+
}
|
|
472
|
+
return t.create = function(r, n, s) {
|
|
473
|
+
return new Te(r, n, s);
|
|
474
|
+
}, t.prototype.next = function(r) {
|
|
475
|
+
this.isStopped || this._next(r);
|
|
476
|
+
}, t.prototype.error = function(r) {
|
|
477
|
+
this.isStopped || (this.isStopped = !0, this._error(r));
|
|
478
|
+
}, t.prototype.complete = function() {
|
|
479
|
+
this.isStopped || (this.isStopped = !0, this._complete());
|
|
480
|
+
}, t.prototype.unsubscribe = function() {
|
|
481
|
+
this.closed || (this.isStopped = !0, e.prototype.unsubscribe.call(this), this.destination = null);
|
|
482
|
+
}, t.prototype._next = function(r) {
|
|
483
|
+
this.destination.next(r);
|
|
484
|
+
}, t.prototype._error = function(r) {
|
|
485
|
+
try {
|
|
486
|
+
this.destination.error(r);
|
|
487
|
+
} finally {
|
|
488
|
+
this.unsubscribe();
|
|
489
|
+
}
|
|
490
|
+
}, t.prototype._complete = function() {
|
|
491
|
+
try {
|
|
492
|
+
this.destination.complete();
|
|
493
|
+
} finally {
|
|
494
|
+
this.unsubscribe();
|
|
495
|
+
}
|
|
496
|
+
}, t;
|
|
497
|
+
})(ue), Vt = (function() {
|
|
498
|
+
function e(t) {
|
|
499
|
+
this.partialObserver = t;
|
|
500
|
+
}
|
|
501
|
+
return e.prototype.next = function(t) {
|
|
502
|
+
var r = this.partialObserver;
|
|
503
|
+
if (r.next)
|
|
504
|
+
try {
|
|
505
|
+
r.next(t);
|
|
506
|
+
} catch (n) {
|
|
507
|
+
ee(n);
|
|
508
|
+
}
|
|
509
|
+
}, e.prototype.error = function(t) {
|
|
510
|
+
var r = this.partialObserver;
|
|
511
|
+
if (r.error)
|
|
512
|
+
try {
|
|
513
|
+
r.error(t);
|
|
514
|
+
} catch (n) {
|
|
515
|
+
ee(n);
|
|
516
|
+
}
|
|
517
|
+
else
|
|
518
|
+
ee(t);
|
|
519
|
+
}, e.prototype.complete = function() {
|
|
520
|
+
var t = this.partialObserver;
|
|
521
|
+
if (t.complete)
|
|
522
|
+
try {
|
|
523
|
+
t.complete();
|
|
524
|
+
} catch (r) {
|
|
525
|
+
ee(r);
|
|
526
|
+
}
|
|
527
|
+
}, e;
|
|
528
|
+
})(), Te = (function(e) {
|
|
529
|
+
le(t, e);
|
|
530
|
+
function t(r, n, s) {
|
|
531
|
+
var a = e.call(this) || this, o;
|
|
532
|
+
return P(r) || !r ? o = {
|
|
533
|
+
next: r ?? void 0,
|
|
534
|
+
error: n ?? void 0,
|
|
535
|
+
complete: s ?? void 0
|
|
536
|
+
} : o = r, a.destination = new Vt(o), a;
|
|
537
|
+
}
|
|
538
|
+
return t;
|
|
539
|
+
})(yt);
|
|
540
|
+
function ee(e) {
|
|
541
|
+
Xt(e);
|
|
542
|
+
}
|
|
543
|
+
function qt(e) {
|
|
544
|
+
throw e;
|
|
545
|
+
}
|
|
546
|
+
var Jt = {
|
|
547
|
+
closed: !0,
|
|
548
|
+
next: Be,
|
|
549
|
+
error: qt,
|
|
550
|
+
complete: Be
|
|
551
|
+
}, Kt = (function() {
|
|
552
|
+
return typeof Symbol == "function" && Symbol.observable || "@@observable";
|
|
553
|
+
})();
|
|
554
|
+
function Qt(e) {
|
|
555
|
+
return e;
|
|
556
|
+
}
|
|
557
|
+
function Zt(e) {
|
|
558
|
+
return e.length === 0 ? Qt : e.length === 1 ? e[0] : function(r) {
|
|
559
|
+
return e.reduce(function(n, s) {
|
|
560
|
+
return s(n);
|
|
561
|
+
}, r);
|
|
562
|
+
};
|
|
563
|
+
}
|
|
564
|
+
var Ne = (function() {
|
|
565
|
+
function e(t) {
|
|
566
|
+
t && (this._subscribe = t);
|
|
567
|
+
}
|
|
568
|
+
return e.prototype.lift = function(t) {
|
|
569
|
+
var r = new e();
|
|
570
|
+
return r.source = this, r.operator = t, r;
|
|
571
|
+
}, e.prototype.subscribe = function(t, r, n) {
|
|
572
|
+
var s = this, a = tr(t) ? t : new Te(t, r, n);
|
|
573
|
+
return oe(function() {
|
|
574
|
+
var o = s, i = o.operator, l = o.source;
|
|
575
|
+
a.add(i ? i.call(a, l) : l ? s._subscribe(a) : s._trySubscribe(a));
|
|
576
|
+
}), a;
|
|
577
|
+
}, e.prototype._trySubscribe = function(t) {
|
|
578
|
+
try {
|
|
579
|
+
return this._subscribe(t);
|
|
580
|
+
} catch (r) {
|
|
581
|
+
t.error(r);
|
|
582
|
+
}
|
|
583
|
+
}, e.prototype.forEach = function(t, r) {
|
|
584
|
+
var n = this;
|
|
585
|
+
return r = je(r), new r(function(s, a) {
|
|
586
|
+
var o = new Te({
|
|
587
|
+
next: function(i) {
|
|
588
|
+
try {
|
|
589
|
+
t(i);
|
|
590
|
+
} catch (l) {
|
|
591
|
+
a(l), o.unsubscribe();
|
|
592
|
+
}
|
|
593
|
+
},
|
|
594
|
+
error: a,
|
|
595
|
+
complete: s
|
|
596
|
+
});
|
|
597
|
+
n.subscribe(o);
|
|
598
|
+
});
|
|
599
|
+
}, e.prototype._subscribe = function(t) {
|
|
600
|
+
var r;
|
|
601
|
+
return (r = this.source) === null || r === void 0 ? void 0 : r.subscribe(t);
|
|
602
|
+
}, e.prototype[Kt] = function() {
|
|
603
|
+
return this;
|
|
604
|
+
}, e.prototype.pipe = function() {
|
|
605
|
+
for (var t = [], r = 0; r < arguments.length; r++)
|
|
606
|
+
t[r] = arguments[r];
|
|
607
|
+
return Zt(t)(this);
|
|
608
|
+
}, e.prototype.toPromise = function(t) {
|
|
609
|
+
var r = this;
|
|
610
|
+
return t = je(t), new t(function(n, s) {
|
|
611
|
+
var a;
|
|
612
|
+
r.subscribe(function(o) {
|
|
613
|
+
return a = o;
|
|
614
|
+
}, function(o) {
|
|
615
|
+
return s(o);
|
|
616
|
+
}, function() {
|
|
617
|
+
return n(a);
|
|
618
|
+
});
|
|
619
|
+
});
|
|
620
|
+
}, e.create = function(t) {
|
|
621
|
+
return new e(t);
|
|
622
|
+
}, e;
|
|
623
|
+
})();
|
|
624
|
+
function je(e) {
|
|
625
|
+
var t;
|
|
626
|
+
return (t = e ?? Ht.Promise) !== null && t !== void 0 ? t : Promise;
|
|
627
|
+
}
|
|
628
|
+
function er(e) {
|
|
629
|
+
return e && P(e.next) && P(e.error) && P(e.complete);
|
|
630
|
+
}
|
|
631
|
+
function tr(e) {
|
|
632
|
+
return e && e instanceof yt || er(e) && pt(e);
|
|
633
|
+
}
|
|
634
|
+
var rr = ft(function(e) {
|
|
635
|
+
return function() {
|
|
636
|
+
e(this), this.name = "ObjectUnsubscribedError", this.message = "object unsubscribed";
|
|
637
|
+
};
|
|
638
|
+
}), gt = (function(e) {
|
|
639
|
+
le(t, e);
|
|
640
|
+
function t() {
|
|
641
|
+
var r = e.call(this) || this;
|
|
642
|
+
return r.closed = !1, r.currentObservers = null, r.observers = [], r.isStopped = !1, r.hasError = !1, r.thrownError = null, r;
|
|
643
|
+
}
|
|
644
|
+
return t.prototype.lift = function(r) {
|
|
645
|
+
var n = new We(this, this);
|
|
646
|
+
return n.operator = r, n;
|
|
647
|
+
}, t.prototype._throwIfClosed = function() {
|
|
648
|
+
if (this.closed)
|
|
649
|
+
throw new rr();
|
|
650
|
+
}, t.prototype.next = function(r) {
|
|
651
|
+
var n = this;
|
|
652
|
+
oe(function() {
|
|
653
|
+
var s, a;
|
|
654
|
+
if (n._throwIfClosed(), !n.isStopped) {
|
|
655
|
+
n.currentObservers || (n.currentObservers = Array.from(n.observers));
|
|
656
|
+
try {
|
|
657
|
+
for (var o = ve(n.currentObservers), i = o.next(); !i.done; i = o.next()) {
|
|
658
|
+
var l = i.value;
|
|
659
|
+
l.next(r);
|
|
660
|
+
}
|
|
661
|
+
} catch (f) {
|
|
662
|
+
s = { error: f };
|
|
663
|
+
} finally {
|
|
664
|
+
try {
|
|
665
|
+
i && !i.done && (a = o.return) && a.call(o);
|
|
666
|
+
} finally {
|
|
667
|
+
if (s) throw s.error;
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
});
|
|
672
|
+
}, t.prototype.error = function(r) {
|
|
673
|
+
var n = this;
|
|
674
|
+
oe(function() {
|
|
675
|
+
if (n._throwIfClosed(), !n.isStopped) {
|
|
676
|
+
n.hasError = n.isStopped = !0, n.thrownError = r;
|
|
677
|
+
for (var s = n.observers; s.length; )
|
|
678
|
+
s.shift().error(r);
|
|
679
|
+
}
|
|
680
|
+
});
|
|
681
|
+
}, t.prototype.complete = function() {
|
|
682
|
+
var r = this;
|
|
683
|
+
oe(function() {
|
|
684
|
+
if (r._throwIfClosed(), !r.isStopped) {
|
|
685
|
+
r.isStopped = !0;
|
|
686
|
+
for (var n = r.observers; n.length; )
|
|
687
|
+
n.shift().complete();
|
|
688
|
+
}
|
|
689
|
+
});
|
|
690
|
+
}, t.prototype.unsubscribe = function() {
|
|
691
|
+
this.isStopped = this.closed = !0, this.observers = this.currentObservers = null;
|
|
692
|
+
}, Object.defineProperty(t.prototype, "observed", {
|
|
693
|
+
get: function() {
|
|
694
|
+
var r;
|
|
695
|
+
return ((r = this.observers) === null || r === void 0 ? void 0 : r.length) > 0;
|
|
696
|
+
},
|
|
697
|
+
enumerable: !1,
|
|
698
|
+
configurable: !0
|
|
699
|
+
}), t.prototype._trySubscribe = function(r) {
|
|
700
|
+
return this._throwIfClosed(), e.prototype._trySubscribe.call(this, r);
|
|
701
|
+
}, t.prototype._subscribe = function(r) {
|
|
702
|
+
return this._throwIfClosed(), this._checkFinalizedStatuses(r), this._innerSubscribe(r);
|
|
703
|
+
}, t.prototype._innerSubscribe = function(r) {
|
|
704
|
+
var n = this, s = this, a = s.hasError, o = s.isStopped, i = s.observers;
|
|
705
|
+
return a || o ? dt : (this.currentObservers = null, i.push(r), new ue(function() {
|
|
706
|
+
n.currentObservers = null, Le(i, r);
|
|
707
|
+
}));
|
|
708
|
+
}, t.prototype._checkFinalizedStatuses = function(r) {
|
|
709
|
+
var n = this, s = n.hasError, a = n.thrownError, o = n.isStopped;
|
|
710
|
+
s ? r.error(a) : o && r.complete();
|
|
711
|
+
}, t.prototype.asObservable = function() {
|
|
712
|
+
var r = new Ne();
|
|
713
|
+
return r.source = this, r;
|
|
714
|
+
}, t.create = function(r, n) {
|
|
715
|
+
return new We(r, n);
|
|
716
|
+
}, t;
|
|
717
|
+
})(Ne), We = (function(e) {
|
|
718
|
+
le(t, e);
|
|
719
|
+
function t(r, n) {
|
|
720
|
+
var s = e.call(this) || this;
|
|
721
|
+
return s.destination = r, s.source = n, s;
|
|
722
|
+
}
|
|
723
|
+
return t.prototype.next = function(r) {
|
|
724
|
+
var n, s;
|
|
725
|
+
(s = (n = this.destination) === null || n === void 0 ? void 0 : n.next) === null || s === void 0 || s.call(n, r);
|
|
726
|
+
}, t.prototype.error = function(r) {
|
|
727
|
+
var n, s;
|
|
728
|
+
(s = (n = this.destination) === null || n === void 0 ? void 0 : n.error) === null || s === void 0 || s.call(n, r);
|
|
729
|
+
}, t.prototype.complete = function() {
|
|
730
|
+
var r, n;
|
|
731
|
+
(n = (r = this.destination) === null || r === void 0 ? void 0 : r.complete) === null || n === void 0 || n.call(r);
|
|
732
|
+
}, t.prototype._subscribe = function(r) {
|
|
733
|
+
var n, s;
|
|
734
|
+
return (s = (n = this.source) === null || n === void 0 ? void 0 : n.subscribe(r)) !== null && s !== void 0 ? s : dt;
|
|
735
|
+
}, t;
|
|
736
|
+
})(gt);
|
|
737
|
+
const mt = 3e3;
|
|
738
|
+
var wt = /* @__PURE__ */ ((e) => (e.Warning = "warning", e.Success = "success", e.Error = "error", e.Info = "info", e))(wt || {}), bt = /* @__PURE__ */ ((e) => (e.Success = "mdi-checkbox-marked-circle", e.Warning = "mdi-alert", e.Error = "mdi-alert-circle", e.Info = "mdi-information", e.None = "none", e))(bt || {}), St = /* @__PURE__ */ ((e) => (e.Warning = "Warning", e.Success = "Success", e.Error = "Error", e.Info = "Info", e))(St || {}), nr = /* @__PURE__ */ ((e) => (e.Center = "center", e.Left = "left", e.Right = "right", e.Bottom = "bottom", e.Top = "top", e))(nr || {});
|
|
739
|
+
class sr {
|
|
740
|
+
constructor(t = "", r = "info", n = "none", s = "Info", a = mt, o = "center", i = !1) {
|
|
741
|
+
this.message = t, this.color = r, this.icon = n, this.title = s, this.timeout = a, this.position = o, this.visible = i;
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
class or {
|
|
745
|
+
static subject = new gt();
|
|
746
|
+
static get snack$() {
|
|
747
|
+
return this.subject.asObservable();
|
|
748
|
+
}
|
|
749
|
+
static createSnackbar(t, r) {
|
|
750
|
+
this.subject.next(
|
|
751
|
+
new sr(
|
|
752
|
+
t,
|
|
753
|
+
wt[r],
|
|
754
|
+
bt[r],
|
|
755
|
+
St[r],
|
|
756
|
+
mt,
|
|
757
|
+
"bottom",
|
|
758
|
+
!0
|
|
759
|
+
)
|
|
760
|
+
);
|
|
761
|
+
}
|
|
762
|
+
static success(t) {
|
|
763
|
+
this.createSnackbar(
|
|
764
|
+
t,
|
|
765
|
+
"Success"
|
|
766
|
+
/* Success */
|
|
767
|
+
);
|
|
768
|
+
}
|
|
769
|
+
static warn(t) {
|
|
770
|
+
this.createSnackbar(
|
|
771
|
+
t,
|
|
772
|
+
"Warning"
|
|
773
|
+
/* Warning */
|
|
774
|
+
);
|
|
775
|
+
}
|
|
776
|
+
static error(t) {
|
|
777
|
+
this.createSnackbar(
|
|
778
|
+
t,
|
|
779
|
+
"Error"
|
|
780
|
+
/* Error */
|
|
781
|
+
);
|
|
782
|
+
}
|
|
783
|
+
static info(t) {
|
|
784
|
+
this.createSnackbar(
|
|
785
|
+
t,
|
|
786
|
+
"Info"
|
|
787
|
+
/* Info */
|
|
788
|
+
);
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
function Et(e, t) {
|
|
792
|
+
const r = {};
|
|
793
|
+
for (let n in t)
|
|
794
|
+
if (Array.isArray(t[n]))
|
|
795
|
+
JSON.stringify(e[n]) !== JSON.stringify(t[n]) && (r[n] = t[n]);
|
|
796
|
+
else if (e[n] && typeof e[n] == "object" && t[n] && typeof t[n] == "object") {
|
|
797
|
+
const s = Et(e[n], t[n]);
|
|
798
|
+
Object.keys(s).length > 0 && (r[n] = s);
|
|
799
|
+
} else JSON.stringify(e[n]) !== JSON.stringify(t[n]) && (r[n] = t[n]);
|
|
800
|
+
return r;
|
|
801
|
+
}
|
|
802
|
+
function ar(e) {
|
|
803
|
+
return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
|
|
804
|
+
}
|
|
805
|
+
var pe, Ge;
|
|
806
|
+
function ir() {
|
|
807
|
+
if (Ge) return pe;
|
|
808
|
+
Ge = 1;
|
|
809
|
+
class e {
|
|
810
|
+
/// value;
|
|
811
|
+
/// next;
|
|
812
|
+
constructor(n) {
|
|
813
|
+
this.value = n, this.next = void 0;
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
class t {
|
|
817
|
+
// TODO: Use private class fields when targeting Node.js 12.
|
|
818
|
+
// #_head;
|
|
819
|
+
// #_tail;
|
|
820
|
+
// #_size;
|
|
821
|
+
constructor() {
|
|
822
|
+
this.clear();
|
|
823
|
+
}
|
|
824
|
+
enqueue(n) {
|
|
825
|
+
const s = new e(n);
|
|
826
|
+
this._head ? (this._tail.next = s, this._tail = s) : (this._head = s, this._tail = s), this._size++;
|
|
827
|
+
}
|
|
828
|
+
dequeue() {
|
|
829
|
+
const n = this._head;
|
|
830
|
+
if (n)
|
|
831
|
+
return this._head = this._head.next, this._size--, n.value;
|
|
832
|
+
}
|
|
833
|
+
clear() {
|
|
834
|
+
this._head = void 0, this._tail = void 0, this._size = 0;
|
|
835
|
+
}
|
|
836
|
+
get size() {
|
|
837
|
+
return this._size;
|
|
838
|
+
}
|
|
839
|
+
*[Symbol.iterator]() {
|
|
840
|
+
let n = this._head;
|
|
841
|
+
for (; n; )
|
|
842
|
+
yield n.value, n = n.next;
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
return pe = t, pe;
|
|
846
|
+
}
|
|
847
|
+
var ye, Ye;
|
|
848
|
+
function cr() {
|
|
849
|
+
if (Ye) return ye;
|
|
850
|
+
Ye = 1;
|
|
851
|
+
const e = ir();
|
|
852
|
+
return ye = (r) => {
|
|
853
|
+
if (!((Number.isInteger(r) || r === 1 / 0) && r > 0))
|
|
854
|
+
throw new TypeError("Expected `concurrency` to be a number from 1 and up");
|
|
855
|
+
const n = new e();
|
|
856
|
+
let s = 0;
|
|
857
|
+
const a = () => {
|
|
858
|
+
s--, n.size > 0 && n.dequeue()();
|
|
859
|
+
}, o = async (f, u, ...p) => {
|
|
860
|
+
s++;
|
|
861
|
+
const g = (async () => f(...p))();
|
|
862
|
+
u(g);
|
|
863
|
+
try {
|
|
864
|
+
await g;
|
|
865
|
+
} catch {
|
|
866
|
+
}
|
|
867
|
+
a();
|
|
868
|
+
}, i = (f, u, ...p) => {
|
|
869
|
+
n.enqueue(o.bind(null, f, u, ...p)), (async () => (await Promise.resolve(), s < r && n.size > 0 && n.dequeue()()))();
|
|
870
|
+
}, l = (f, ...u) => new Promise((p) => {
|
|
871
|
+
i(f, p, ...u);
|
|
872
|
+
});
|
|
873
|
+
return Object.defineProperties(l, {
|
|
874
|
+
activeCount: {
|
|
875
|
+
get: () => s
|
|
876
|
+
},
|
|
877
|
+
pendingCount: {
|
|
878
|
+
get: () => n.size
|
|
879
|
+
},
|
|
880
|
+
clearQueue: {
|
|
881
|
+
value: () => {
|
|
882
|
+
n.clear();
|
|
883
|
+
}
|
|
884
|
+
}
|
|
885
|
+
}), l;
|
|
886
|
+
}, ye;
|
|
887
|
+
}
|
|
888
|
+
var lr = cr();
|
|
889
|
+
const ur = /* @__PURE__ */ ar(lr), G = ur(10), hr = 1e3;
|
|
890
|
+
async function z(e, t) {
|
|
891
|
+
const r = ut(t);
|
|
892
|
+
try {
|
|
893
|
+
const n = await fetch(e, r);
|
|
894
|
+
return await ht(n);
|
|
895
|
+
} catch (n) {
|
|
896
|
+
throw n instanceof TypeError && or.error("Network error. Please check your connection."), n;
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
const c = {
|
|
900
|
+
async fetch(e, t = {}) {
|
|
901
|
+
return t.method = "GET", await G(() => z(e, t));
|
|
902
|
+
},
|
|
903
|
+
async patch(e, t, r = null, n = {}) {
|
|
904
|
+
if (n.method = "PATCH", n.body = r ? Et(r, t) : t, Object.keys(n.body).length !== 0)
|
|
905
|
+
return await G(() => z(e, n));
|
|
906
|
+
},
|
|
907
|
+
async post(e, t = void 0, r = {}) {
|
|
908
|
+
return r.method = "POST", r.body = t, await G(() => z(e, r));
|
|
909
|
+
},
|
|
910
|
+
async put(e, t = void 0, r = {}) {
|
|
911
|
+
return r.method = "PUT", r.body = t, await G(() => z(e, r));
|
|
912
|
+
},
|
|
913
|
+
async delete(e, t = void 0, r = {}) {
|
|
914
|
+
return r.method = "DELETE", r.body = t, await G(() => z(e, r));
|
|
915
|
+
},
|
|
916
|
+
async paginatedFetch(e, t) {
|
|
917
|
+
const r = t ?? hr, n = e.includes("?") ? "&" : "?", s = `${e}${n}page_size=${r}&page=1`, a = ut({ method: "GET" }), o = await G(() => fetch(s, a)), i = Number(o.headers.get("x-total-pages")) || 1, f = [...await ht(o)];
|
|
918
|
+
for (let u = 2; u <= i; u++) {
|
|
919
|
+
const p = `${e}${n}page_size=${r}&page=${u}`, g = await G(() => z(p, { method: "GET" }));
|
|
920
|
+
f.push(...g);
|
|
921
|
+
}
|
|
922
|
+
return f;
|
|
923
|
+
}
|
|
924
|
+
}, He = {
|
|
925
|
+
HTTP: {
|
|
926
|
+
type: "HTTP",
|
|
927
|
+
sourceUri: "",
|
|
928
|
+
placeholderVariables: []
|
|
929
|
+
},
|
|
930
|
+
local: {
|
|
931
|
+
type: "local",
|
|
932
|
+
sourceUri: "",
|
|
933
|
+
placeholderVariables: []
|
|
934
|
+
}
|
|
935
|
+
}, ze = {
|
|
936
|
+
JSON: {
|
|
937
|
+
type: "JSON",
|
|
938
|
+
timestamp: {
|
|
939
|
+
key: "",
|
|
940
|
+
format: "ISO8601",
|
|
941
|
+
timezoneMode: "embeddedOffset"
|
|
942
|
+
},
|
|
943
|
+
JMESPath: ""
|
|
944
|
+
},
|
|
945
|
+
CSV: {
|
|
946
|
+
type: "CSV",
|
|
947
|
+
timestamp: {
|
|
948
|
+
key: "",
|
|
949
|
+
format: "ISO8601",
|
|
950
|
+
timezoneMode: "embeddedOffset"
|
|
951
|
+
},
|
|
952
|
+
headerRow: 1,
|
|
953
|
+
dataStartRow: 2,
|
|
954
|
+
delimiter: ",",
|
|
955
|
+
identifierType: "name"
|
|
956
|
+
/* Name */
|
|
957
|
+
}
|
|
958
|
+
}, Xe = {
|
|
959
|
+
HydroServer: {
|
|
960
|
+
type: "HydroServer"
|
|
961
|
+
}
|
|
962
|
+
};
|
|
963
|
+
class on {
|
|
964
|
+
name = "";
|
|
965
|
+
settings = {
|
|
966
|
+
type: "SDL",
|
|
967
|
+
extractor: JSON.parse(JSON.stringify(He.local)),
|
|
968
|
+
transformer: JSON.parse(JSON.stringify(ze.CSV)),
|
|
969
|
+
loader: JSON.parse(JSON.stringify(Xe.HydroServer)),
|
|
970
|
+
payloads: []
|
|
971
|
+
};
|
|
972
|
+
id = "";
|
|
973
|
+
workspaceId = "";
|
|
974
|
+
orchestrationSystem = {
|
|
975
|
+
id: "",
|
|
976
|
+
name: "",
|
|
977
|
+
workspaceId: "",
|
|
978
|
+
type: ""
|
|
979
|
+
};
|
|
980
|
+
schedule = {
|
|
981
|
+
interval: 15,
|
|
982
|
+
intervalUnits: "minutes"
|
|
983
|
+
};
|
|
984
|
+
status = { paused: !0 };
|
|
985
|
+
datastreams = [];
|
|
986
|
+
constructor(t) {
|
|
987
|
+
Object.assign(this, t);
|
|
988
|
+
}
|
|
989
|
+
switchExtractor(t) {
|
|
990
|
+
this.settings.extractor = JSON.parse(
|
|
991
|
+
JSON.stringify(He[t])
|
|
992
|
+
);
|
|
993
|
+
}
|
|
994
|
+
switchTransformer(t) {
|
|
995
|
+
this.settings.transformer = JSON.parse(
|
|
996
|
+
JSON.stringify(ze[t])
|
|
997
|
+
);
|
|
998
|
+
}
|
|
999
|
+
switchLoader(t) {
|
|
1000
|
+
this.settings.loader = JSON.parse(JSON.stringify(Xe[t]));
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
function Ve(e) {
|
|
1004
|
+
return {
|
|
1005
|
+
name: e.name,
|
|
1006
|
+
settings: e.settings,
|
|
1007
|
+
workspaceId: e.workspaceId,
|
|
1008
|
+
orchestrationSystemId: e.orchestrationSystem.id,
|
|
1009
|
+
schedule: e.schedule,
|
|
1010
|
+
status: e.status
|
|
1011
|
+
};
|
|
1012
|
+
}
|
|
1013
|
+
const O = "https://lro.hydroserver.org/api", Me = `${O}/auth`, x = `${Me}/browser/account`, ge = `${Me}/browser/session`, ae = `${Me}/browser/provider`, $ = `${O}/data/workspaces`, me = `${O}/data/roles`, R = `${O}/data/datastreams`, N = `${O}/data/sensors`, _ = `${O}/data/things`, qe = `${_}/tags`, X = `${O}/data/orchestration-systems`, F = `${O}/data/data-sources`, Y = `${O}/data/observed-properties`, V = `${O}/data/processing-levels`, J = `${O}/data/result-qualifiers`, H = `${O}/data/units`, an = (e, t, r, n, s) => {
|
|
1014
|
+
let a = `${R}/${e}/observations?format=column`;
|
|
1015
|
+
return a += `&order_by=phenomenonTime&page_size=${t}`, a += `&phenomenon_time_min=${encodeURIComponent(r)}`, n && (a += `&phenomenon_time_max=${encodeURIComponent(n)}`), s && (a += `&page=${s}`), a;
|
|
1016
|
+
}, fr = (e, t, r) => {
|
|
1017
|
+
const n = {
|
|
1018
|
+
provider: e,
|
|
1019
|
+
callback_url: t,
|
|
1020
|
+
process: r
|
|
1021
|
+
}, s = lt(), a = document.createElement("form");
|
|
1022
|
+
if (a.method = "POST", a.action = `${ae}/redirect`, s) {
|
|
1023
|
+
const o = document.createElement("input");
|
|
1024
|
+
o.type = "hidden", o.name = "csrfmiddlewaretoken", o.value = s, a.appendChild(o);
|
|
1025
|
+
}
|
|
1026
|
+
for (const o in n) {
|
|
1027
|
+
const i = document.createElement("input");
|
|
1028
|
+
i.type = "hidden", i.name = o, i.value = n[o] || "", a.appendChild(i);
|
|
1029
|
+
}
|
|
1030
|
+
document.body.appendChild(a), a.submit();
|
|
1031
|
+
}, cn = {
|
|
1032
|
+
fetchSession: async () => c.fetch(`${ge}`),
|
|
1033
|
+
login: async (e, t) => c.post(`${ge}`, { email: e, password: t }),
|
|
1034
|
+
logout: async () => c.delete(`${ge}`),
|
|
1035
|
+
fetchUser: async () => c.fetch(`${x}`),
|
|
1036
|
+
signup: async (e) => c.post(`${x}`, e),
|
|
1037
|
+
updateUser: async (e, t) => c.patch(`${x}`, e, t),
|
|
1038
|
+
deleteUser: async () => c.delete(`${x}`),
|
|
1039
|
+
sendVerificationEmail: async (e) => c.put(`${x}/email/verify`, {
|
|
1040
|
+
email: e
|
|
1041
|
+
}),
|
|
1042
|
+
verifyEmailWithCode: async (e) => c.post(`${x}/email/verify`, { key: e }),
|
|
1043
|
+
requestPasswordReset: async (e) => c.post(`${x}/password/request`, {
|
|
1044
|
+
email: e
|
|
1045
|
+
}),
|
|
1046
|
+
resetPassword: async (e, t) => c.post(`${x}/password/reset`, {
|
|
1047
|
+
key: e,
|
|
1048
|
+
password: t
|
|
1049
|
+
}),
|
|
1050
|
+
fetchWorkspaces: async () => c.paginatedFetch(`${$}`),
|
|
1051
|
+
fetchAssociatedWorkspaces: async () => c.paginatedFetch(`${$}?is_associated=true`),
|
|
1052
|
+
fetchWorkspace: async (e) => c.fetch(`${$}/${e}`),
|
|
1053
|
+
createWorkspace: async (e) => c.post($, e),
|
|
1054
|
+
updateWorkspace: async (e, t = null) => c.patch(
|
|
1055
|
+
`${$}/${e.id}`,
|
|
1056
|
+
e,
|
|
1057
|
+
t
|
|
1058
|
+
),
|
|
1059
|
+
deleteWorkspace: async (e) => c.delete(`${$}/${e}`),
|
|
1060
|
+
transferWorkspace: async (e, t) => c.post(`${$}/${e}/transfer`, { newOwner: t }),
|
|
1061
|
+
acceptWorkspaceTransfer: async (e) => c.put(`${$}/${e}/transfer`),
|
|
1062
|
+
rejectWorkspaceTransfer: async (e) => c.delete(`${$}/${e}/transfer`),
|
|
1063
|
+
getCollaboratorRoles: async (e) => c.paginatedFetch(`${me}?is_user_role=true`),
|
|
1064
|
+
getAPIKeyRoles: async (e) => c.paginatedFetch(`${me}?is_apikey_role=true`),
|
|
1065
|
+
getRole: async (e) => c.fetch(`${me}/${e}`),
|
|
1066
|
+
getCollaborators: async (e) => c.paginatedFetch(`${$}/${e}/collaborators`),
|
|
1067
|
+
addCollaborator: async (e, t, r) => c.post(`${$}/${e}/collaborators`, {
|
|
1068
|
+
email: t,
|
|
1069
|
+
roleId: r
|
|
1070
|
+
}),
|
|
1071
|
+
updateCollaboratorRole: async (e, t, r) => c.put(`${$}/${e}/collaborators`, {
|
|
1072
|
+
email: t,
|
|
1073
|
+
roleId: r
|
|
1074
|
+
}),
|
|
1075
|
+
removeCollaborator: async (e, t) => c.delete(`${$}/${e}/collaborators`, { email: t }),
|
|
1076
|
+
fetchApiKeys: async (e) => c.paginatedFetch(
|
|
1077
|
+
`${$}/${e}/api-keys?expand_related=true`
|
|
1078
|
+
),
|
|
1079
|
+
fetchApiKey: async (e, t) => c.fetch(
|
|
1080
|
+
`${$}/${e}/api-keys/${t}?expand_related=true`
|
|
1081
|
+
),
|
|
1082
|
+
createApiKey: async (e) => c.post(
|
|
1083
|
+
`${$}/${e.workspaceId}/api-keys?expand_related=true`,
|
|
1084
|
+
{
|
|
1085
|
+
name: e.name,
|
|
1086
|
+
description: e.description,
|
|
1087
|
+
isActive: !0,
|
|
1088
|
+
roleId: e.role.id
|
|
1089
|
+
}
|
|
1090
|
+
),
|
|
1091
|
+
updateApiKey: async (e, t) => c.patch(
|
|
1092
|
+
`${$}/${e.workspaceId}/api-keys/${e.id}?expand_related=true`,
|
|
1093
|
+
{
|
|
1094
|
+
name: e.name,
|
|
1095
|
+
description: e.description,
|
|
1096
|
+
isActive: !0,
|
|
1097
|
+
roleId: e.role.id
|
|
1098
|
+
},
|
|
1099
|
+
t && {
|
|
1100
|
+
name: t.name,
|
|
1101
|
+
description: t.description,
|
|
1102
|
+
isActive: !0,
|
|
1103
|
+
roleId: t.role.id
|
|
1104
|
+
}
|
|
1105
|
+
),
|
|
1106
|
+
regenerateApiKey: async (e, t) => c.put(
|
|
1107
|
+
`${$}/${e}/api-keys/${t}/regenerate?expand_related=true`
|
|
1108
|
+
),
|
|
1109
|
+
deleteApiKey: async (e, t) => c.delete(`${$}/${e}/api-keys/${t}`),
|
|
1110
|
+
fetchConnectedProviders: async () => c.fetch(`${ae}/connections`),
|
|
1111
|
+
providerRedirect: fr,
|
|
1112
|
+
providerSignup: async (e) => c.post(`${ae}/signup`, e),
|
|
1113
|
+
deleteProvider: async (e, t) => c.delete(`${ae}/connections`, {
|
|
1114
|
+
provider: e,
|
|
1115
|
+
account: t
|
|
1116
|
+
}),
|
|
1117
|
+
createUnit: async (e) => c.post(H, e),
|
|
1118
|
+
fetchUnits: async () => c.paginatedFetch(`${H}`),
|
|
1119
|
+
fetchWorkspaceUnits: async (e) => c.paginatedFetch(`${H}?workspace_id=${e}`),
|
|
1120
|
+
updateUnit: async (e, t = null) => c.patch(`${H}/${e.id}`, e, t),
|
|
1121
|
+
deleteUnit: async (e) => c.delete(`${H}/${e}`),
|
|
1122
|
+
getUnit: async (e) => c.fetch(`${H}/${e}`),
|
|
1123
|
+
removeThingOwner: async (e, t) => c.patch(`${_}/${e}/ownership`, {
|
|
1124
|
+
email: t,
|
|
1125
|
+
removeOwner: !0
|
|
1126
|
+
}),
|
|
1127
|
+
addSecondaryOwner: async (e, t) => c.patch(`${_}/${e}/ownership`, {
|
|
1128
|
+
email: t,
|
|
1129
|
+
makeOwner: !0
|
|
1130
|
+
}),
|
|
1131
|
+
transferPrimaryOwnership: async (e, t) => c.patch(`${_}/${e}/ownership`, {
|
|
1132
|
+
email: t,
|
|
1133
|
+
transferPrimary: !0
|
|
1134
|
+
}),
|
|
1135
|
+
createThing: async (e) => c.post(_, e),
|
|
1136
|
+
fetchThings: async () => c.paginatedFetch(`${_}`),
|
|
1137
|
+
fetchThingsForWorkspace: async (e) => c.paginatedFetch(`${_}?workspace_id=${e}`),
|
|
1138
|
+
fetchOwnedThings: async () => c.paginatedFetch(`${_}?owned_only=true`),
|
|
1139
|
+
fetchThing: async (e) => c.fetch(`${_}/${e}`),
|
|
1140
|
+
updateThing: async (e) => c.patch(`${_}/${e.id}`, e),
|
|
1141
|
+
updateThingPrivacy: async (e, t) => c.patch(`${_}/${e}`, { isPrivate: t }),
|
|
1142
|
+
deleteThing: async (e) => c.delete(`${_}/${e}`),
|
|
1143
|
+
fetchMetadataForThingOwner: async (e) => c.paginatedFetch(
|
|
1144
|
+
`${_}/${e}/metadata?include_assignable_metadata=true`
|
|
1145
|
+
),
|
|
1146
|
+
fetchMetadataForThing: async (e) => c.fetch(`${_}/${e}/metadata`),
|
|
1147
|
+
uploadSitePhotos: async (e, t) => c.post(`${_}/${e}/photos`, t),
|
|
1148
|
+
fetchSitePhotos: async (e) => c.paginatedFetch(`${_}/${e}/photos`),
|
|
1149
|
+
deleteSitePhoto: async (e, t) => c.delete(`${_}/${e}/photos`, { name: t }),
|
|
1150
|
+
createSiteTag: async (e, t) => c.post(`${_}/${e}/tags`, t),
|
|
1151
|
+
editSiteTag: async (e, t) => c.put(`${_}/${e}/tags`, t),
|
|
1152
|
+
fetchSiteTags: async (e) => c.fetch(`${_}/${e}/tags`),
|
|
1153
|
+
fetchUsersSiteTags: async () => c.fetch(`${qe}`),
|
|
1154
|
+
deleteSiteTag: async (e, t) => c.delete(`${_}/${e}/tags`, t),
|
|
1155
|
+
fetchWorkspaceTags: async (e) => c.fetch(`${qe}/keys?workspace_id=${e}`),
|
|
1156
|
+
createHydroShareArchive: async (e) => c.post(`${_}/${e.thingId}/archive`, e),
|
|
1157
|
+
updateHydroShareArchive: async (e, t) => c.patch(
|
|
1158
|
+
`${_}/${e.thingId}/archive`,
|
|
1159
|
+
e,
|
|
1160
|
+
t
|
|
1161
|
+
),
|
|
1162
|
+
fetchHydroShareArchive: async (e) => c.fetch(`${_}/${e}/archive`),
|
|
1163
|
+
deleteHydroShareArchive: async (e) => c.delete(`${_}/${e}/archive`),
|
|
1164
|
+
archiveToHydroShare: async (e) => c.post(`${_}/${e}/archive/trigger`),
|
|
1165
|
+
createDatastream: async (e) => c.post(R, e),
|
|
1166
|
+
fetchDatastreams: async (e) => {
|
|
1167
|
+
const t = [];
|
|
1168
|
+
if (e)
|
|
1169
|
+
for (const [n, s] of Object.entries(e))
|
|
1170
|
+
t.push(`${encodeURIComponent(n)}=${encodeURIComponent(s)}`);
|
|
1171
|
+
const r = t.length ? `?${t.join("&")}` : "";
|
|
1172
|
+
return c.paginatedFetch(`${R}${r}`);
|
|
1173
|
+
},
|
|
1174
|
+
fetchDatastreamsForThing: async (e) => c.paginatedFetch(`${R}?thing_id=${e}`),
|
|
1175
|
+
fetchExpandedDatastreamsForThing: async (e) => c.paginatedFetch(
|
|
1176
|
+
`${R}?thing_id=${e}&expand_related=true`
|
|
1177
|
+
),
|
|
1178
|
+
fetchDatastreamsForDataSource: async (e) => c.paginatedFetch(`${R}?data_source_id=${e}`),
|
|
1179
|
+
fetchDatastream: async (e) => c.fetch(`${R}/${e}`),
|
|
1180
|
+
fetchDatastreamExpanded: async (e) => c.fetch(`${R}/${e}?expand_related=true`),
|
|
1181
|
+
fetchUsersDatastreams: async () => c.paginatedFetch(`${R}?exclude_unowned=true`),
|
|
1182
|
+
updateDatastream: async (e, t = null) => c.patch(`${R}/${e.id}`, e, t),
|
|
1183
|
+
deleteDatastream: async (e) => c.delete(`${R}/${e}`),
|
|
1184
|
+
downloadDatastreamCSV: async (e) => c.fetch(`${R}/${e}/csv`),
|
|
1185
|
+
createObservedProperty: async (e) => c.post(Y, e),
|
|
1186
|
+
fetchObservedProperty: async (e) => c.fetch(`${Y}/${e}`),
|
|
1187
|
+
fetchObservedProperties: async () => c.paginatedFetch(`${Y}`),
|
|
1188
|
+
fetchWorkspaceObservedProperties: async (e) => c.paginatedFetch(`${Y}?workspace_id=${e}`),
|
|
1189
|
+
updateObservedProperty: async (e, t = null) => c.patch(`${Y}/${e.id}`, e, t),
|
|
1190
|
+
deleteObservedProperty: async (e) => c.delete(`${Y}/${e}`),
|
|
1191
|
+
createProcessingLevel: async (e) => c.post(V, e),
|
|
1192
|
+
fetchProcessingLevels: async () => c.paginatedFetch(`${V}`),
|
|
1193
|
+
fetchProcessingLevel: async (e) => c.fetch(`${V}/${e}`),
|
|
1194
|
+
fetchWorkspaceProcessingLevels: async (e) => c.paginatedFetch(`${V}?workspace_id=${e}`),
|
|
1195
|
+
updateProcessingLevel: async (e, t = null) => c.patch(`${V}/${e.id}`, e, t),
|
|
1196
|
+
deleteProcessingLevel: async (e) => c.delete(`${V}/${e}`),
|
|
1197
|
+
createSensor: async (e) => c.post(N, e),
|
|
1198
|
+
fetchSensors: async () => c.paginatedFetch(`${N}`),
|
|
1199
|
+
fetchSensor: async (e) => c.fetch(`${N}/${e}`),
|
|
1200
|
+
fetchWorkspaceSensors: async (e) => c.paginatedFetch(`${N}?workspace_id=${e}`),
|
|
1201
|
+
updateSensor: async (e, t = null) => c.patch(`${N}/${e.id}`, e, t),
|
|
1202
|
+
deleteSensor: async (e) => c.delete(`${N}/${e}`),
|
|
1203
|
+
createResultQualifier: async (e) => c.post(J, e),
|
|
1204
|
+
fetchResultQualifiers: async () => c.paginatedFetch(`${J}`),
|
|
1205
|
+
fetchWorkspaceResultQualifiers: async (e) => c.paginatedFetch(`${J}?workspace_id=${e}`),
|
|
1206
|
+
updateResultQualifier: async (e, t = null) => c.patch(
|
|
1207
|
+
`${J}/${e.id}`,
|
|
1208
|
+
e,
|
|
1209
|
+
t
|
|
1210
|
+
),
|
|
1211
|
+
deleteResultQualifier: async (e) => c.delete(`${J}/${e}`),
|
|
1212
|
+
createOrchestrationSystem: async (e) => c.post(X, e),
|
|
1213
|
+
fetchOrchestrationSystems: async () => c.paginatedFetch(X),
|
|
1214
|
+
fetchWorkspaceOrchestrationSystems: async (e) => c.paginatedFetch(`${X}?workspace_id=${e}`),
|
|
1215
|
+
fetchOrchestrationSystem: async (e) => c.fetch(`${X}/${e}`),
|
|
1216
|
+
updateOrchestrationSystem: async (e, t) => c.patch(`${X}/${e}`, t),
|
|
1217
|
+
deleteOrchestrationSystem: async (e) => c.delete(`${X}/${e}`),
|
|
1218
|
+
createDataSource: async (e) => c.post(
|
|
1219
|
+
`${F}?expand_related=true`,
|
|
1220
|
+
Ve(e)
|
|
1221
|
+
),
|
|
1222
|
+
fetchDataSources: async () => c.paginatedFetch(`${F}?expand_related=true`),
|
|
1223
|
+
fetchWorkspaceDataSources: async (e) => c.paginatedFetch(
|
|
1224
|
+
`${F}?workspace_id=${e}&expand_related=true`
|
|
1225
|
+
),
|
|
1226
|
+
fetchDataSource: async (e) => c.fetch(`${F}/${e}?expand_related=true`),
|
|
1227
|
+
updateDataSource: async (e) => c.patch(
|
|
1228
|
+
`${F}/${e.id}?expand_related=true`,
|
|
1229
|
+
Ve(e)
|
|
1230
|
+
),
|
|
1231
|
+
updateDataSourcePartial: async (e) => c.patch(
|
|
1232
|
+
`${F}/${e.id}?expand_related=true`,
|
|
1233
|
+
e
|
|
1234
|
+
),
|
|
1235
|
+
deleteDataSource: async (e) => c.delete(`${F}/${e}`),
|
|
1236
|
+
linkDatastreamToDataSource: async (e, t) => c.post(
|
|
1237
|
+
`${F}/${e}/datastreams/${t}`
|
|
1238
|
+
),
|
|
1239
|
+
unlinkDatastreamFromDataSource: async (e, t) => c.delete(
|
|
1240
|
+
`${F}/${e}/datastreams/${t}`
|
|
1241
|
+
),
|
|
1242
|
+
fetchObservations: async (e) => c.fetch(e),
|
|
1243
|
+
deleteObservationsForDatastream: async (e) => c.post(`${R}/${e}/observations/bulk-delete`, {
|
|
1244
|
+
phenomenonTimeStart: null,
|
|
1245
|
+
phenomenonTimeEnd: null
|
|
1246
|
+
}),
|
|
1247
|
+
fetchUserTypes: async () => c.fetch(`${x}/user-types`),
|
|
1248
|
+
fetchOrganizationTypes: async () => c.fetch(`${x}/organization-types`),
|
|
1249
|
+
fetchSiteTypes: async () => c.fetch(`${_}/site-types`),
|
|
1250
|
+
fetchSamplingFeatureTypes: async () => c.paginatedFetch(`${_}/sampling-feature-types`),
|
|
1251
|
+
fetchSensorEncodingTypes: async () => c.paginatedFetch(`${N}/encoding-types`),
|
|
1252
|
+
fetchMethodTypes: async () => c.paginatedFetch(`${N}/method-types`),
|
|
1253
|
+
fetchVariableTypes: async () => c.paginatedFetch(`${Y}/variable-types`),
|
|
1254
|
+
fetchUnitTypes: async () => c.paginatedFetch(`${H}/types`),
|
|
1255
|
+
fetchDatastreamStatuses: async () => c.paginatedFetch(`${R}/statuses`),
|
|
1256
|
+
fetchDatastreamAggregations: async () => c.paginatedFetch(`${R}/aggregation-statistics`),
|
|
1257
|
+
fetchSampledMediums: async () => c.paginatedFetch(`${R}/sampled-mediums`)
|
|
10
1258
|
};
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
|
|
1259
|
+
class ln {
|
|
1260
|
+
name = "";
|
|
1261
|
+
mappings = [];
|
|
1262
|
+
extractorVariables = {};
|
|
1263
|
+
constructor(t) {
|
|
1264
|
+
Object.assign(this, t);
|
|
1265
|
+
}
|
|
1266
|
+
}
|
|
1267
|
+
const kt = 1, ie = kt * 60, Ue = ie * 60, Oe = Ue * 24, dr = Oe * 7, pr = Ue * 30, yr = Oe * 365, te = {
|
|
1268
|
+
[D.SECOND]: kt,
|
|
1269
|
+
[D.MINUTE]: ie,
|
|
1270
|
+
[D.HOUR]: Ue,
|
|
1271
|
+
[D.DAY]: Oe,
|
|
1272
|
+
[D.WEEK]: dr,
|
|
1273
|
+
[D.MONTH]: pr,
|
|
1274
|
+
[D.YEAR]: yr
|
|
1275
|
+
}, un = (e) => e.toLocaleString(void 0, {
|
|
1276
|
+
year: "numeric",
|
|
1277
|
+
month: "short",
|
|
1278
|
+
day: "2-digit",
|
|
1279
|
+
hour: "2-digit",
|
|
1280
|
+
hour12: !1,
|
|
1281
|
+
minute: "2-digit",
|
|
1282
|
+
second: "2-digit"
|
|
1283
|
+
}), hn = (e) => {
|
|
1284
|
+
let t, r;
|
|
1285
|
+
e >= ie * 1e3 ? (t = e / (ie * 1e3), r = "m") : e >= 1e3 ? (t = e / 1e3, r = "s") : (t = e, r = "ms");
|
|
1286
|
+
let n;
|
|
1287
|
+
return r === "ms" ? n = Math.round(t).toString() : n = t.toFixed(2), `${n} ${r}`;
|
|
1288
|
+
}, we = async (e, t) => {
|
|
1289
|
+
t && console.info(t);
|
|
1290
|
+
const r = performance.now(), n = await e(), s = performance.now();
|
|
1291
|
+
console.info(` Done in ${(s - r).toFixed(2)} ms`);
|
|
1292
|
+
const a = +(s - r);
|
|
1293
|
+
return { response: n, duration: a };
|
|
1294
|
+
};
|
|
1295
|
+
function fn(e, t) {
|
|
1296
|
+
const r = new Date(e);
|
|
1297
|
+
return r.setHours(r.getHours() - t), r.toISOString();
|
|
1298
|
+
}
|
|
1299
|
+
const re = (e, t) => {
|
|
1300
|
+
let r = 0, n = e.length;
|
|
1301
|
+
for (; r < n; ) {
|
|
1302
|
+
const s = r + n >> 1;
|
|
1303
|
+
e[s] < t ? r = s + 1 : n = s;
|
|
1304
|
+
}
|
|
1305
|
+
return r;
|
|
1306
|
+
}, be = (e, t) => {
|
|
1307
|
+
let r = 0, n = e.length;
|
|
1308
|
+
for (; r < n; ) {
|
|
1309
|
+
const s = r + n >> 1;
|
|
1310
|
+
e[s] > t ? n = s : r = s + 1;
|
|
1311
|
+
}
|
|
1312
|
+
return r - 1;
|
|
1313
|
+
}, vt = `(function(){"use strict";function c(n,s,a,u,f,l,y,o){let r=0,e=o;for(let t=l;t<=y;t++)r<a.length&&t===a[r]?r++:(u[e]=n[t],f[e]=s[t],e++);return e-o}self.onmessage=n=>{const{bufferX:s,bufferY:a,outputBufferX:u,outputBufferY:f,start:l,end:y,deleteSegment:o,startTarget:r}=n.data,e=new Float64Array(s),t=new Float32Array(a),A=new Float64Array(u),g=new Float32Array(f);c(e,t,o,A,g,l,y,r),self.postMessage("Done")}})();
|
|
1314
|
+
`, Je = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", vt], { type: "text/javascript;charset=utf-8" });
|
|
1315
|
+
function gr(e) {
|
|
1316
|
+
let t;
|
|
1317
|
+
try {
|
|
1318
|
+
if (t = Je && (self.URL || self.webkitURL).createObjectURL(Je), !t) throw "";
|
|
1319
|
+
const r = new Worker(t, {
|
|
1320
|
+
name: e?.name
|
|
1321
|
+
});
|
|
1322
|
+
return r.addEventListener("error", () => {
|
|
1323
|
+
(self.URL || self.webkitURL).revokeObjectURL(t);
|
|
1324
|
+
}), r;
|
|
1325
|
+
} catch {
|
|
1326
|
+
return new Worker(
|
|
1327
|
+
"data:text/javascript;charset=utf-8," + encodeURIComponent(vt),
|
|
1328
|
+
{
|
|
1329
|
+
name: e?.name
|
|
1330
|
+
}
|
|
1331
|
+
);
|
|
1332
|
+
}
|
|
1333
|
+
}
|
|
1334
|
+
const _t = `(function(){"use strict";function F(n,l,a,o,s,y,g,f,i,w,A){let e=0,t=f;for(let r=y;r<=g;r++)if(o[t]=n[r],s[t]=l[r],t++,e<a.length&&r===a[e][0]){const u=a[e][0],c=a[e][1],d=n[u],h=n[c],m=l[u],D=l[c],x=h-d,P=D-m;let p=d+i;for(;p<h;)o[t]=p,s[t]=w?m+(p-d)*P/x:A,t++,p+=i;e++}return t-f}self.onmessage=n=>{const{bufferX:l,bufferY:a,outputBufferX:o,outputBufferY:s,start:y,end:g,gapsSegment:f,startTarget:i,fillDelta:w,interpolate:A,fillValue:e}=n.data,t=new Float64Array(l),r=new Float32Array(a),u=new Float64Array(o),c=new Float32Array(s);F(t,r,f,u,c,y,g,i,w,A,e),self.postMessage("Done")}})();
|
|
1335
|
+
`, Ke = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", _t], { type: "text/javascript;charset=utf-8" });
|
|
1336
|
+
function mr(e) {
|
|
1337
|
+
let t;
|
|
1338
|
+
try {
|
|
1339
|
+
if (t = Ke && (self.URL || self.webkitURL).createObjectURL(Ke), !t) throw "";
|
|
1340
|
+
const r = new Worker(t, {
|
|
1341
|
+
name: e?.name
|
|
1342
|
+
});
|
|
1343
|
+
return r.addEventListener("error", () => {
|
|
1344
|
+
(self.URL || self.webkitURL).revokeObjectURL(t);
|
|
1345
|
+
}), r;
|
|
1346
|
+
} catch {
|
|
1347
|
+
return new Worker(
|
|
1348
|
+
"data:text/javascript;charset=utf-8," + encodeURIComponent(_t),
|
|
1349
|
+
{
|
|
1350
|
+
name: e?.name
|
|
1351
|
+
}
|
|
1352
|
+
);
|
|
1353
|
+
}
|
|
1354
|
+
}
|
|
1355
|
+
const At = `(function(){"use strict";function g(o,n,c){for(let s=0;s<c.length;s++){const{indexes:t,lowerIdx:l,upperIdx:r}=c[s],i=o[l],f=n[l],a=o[r],d=n[r],p=a-i,w=d-f;if(p===0){for(let e=0;e<t.length;e++)n[t[e]]=f;continue}for(let e=0;e<t.length;e++){const u=t[e];n[u]=f+(o[u]-i)*w/p}}}self.onmessage=o=>{const{bufferX:n,bufferY:c,groups:s}=o.data,t=new Float64Array(n),l=new Float32Array(c);g(t,l,s),self.postMessage("Done")}})();
|
|
1356
|
+
`, Qe = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", At], { type: "text/javascript;charset=utf-8" });
|
|
1357
|
+
function wr(e) {
|
|
1358
|
+
let t;
|
|
1359
|
+
try {
|
|
1360
|
+
if (t = Qe && (self.URL || self.webkitURL).createObjectURL(Qe), !t) throw "";
|
|
1361
|
+
const r = new Worker(t, {
|
|
1362
|
+
name: e?.name
|
|
1363
|
+
});
|
|
1364
|
+
return r.addEventListener("error", () => {
|
|
1365
|
+
(self.URL || self.webkitURL).revokeObjectURL(t);
|
|
1366
|
+
}), r;
|
|
1367
|
+
} catch {
|
|
1368
|
+
return new Worker(
|
|
1369
|
+
"data:text/javascript;charset=utf-8," + encodeURIComponent(At),
|
|
1370
|
+
{
|
|
1371
|
+
name: e?.name
|
|
1372
|
+
}
|
|
1373
|
+
);
|
|
1374
|
+
}
|
|
1375
|
+
}
|
|
1376
|
+
const Lt = `(function(){"use strict";self.onmessage=r=>{const{bufferX:s,bufferY:o,jobs:a}=r.data,f=new Float64Array(s),n=new Float32Array(o);for(let e=0;e<a.length;e++){const{chunkStart:c,chunkEnd:l,startDatetime:u,value:i,extent:y}=a[e];for(let t=c;t<l;t++)n[t]=n[t]+i*((f[t]-u)/y)}self.postMessage("Done")}})();
|
|
1377
|
+
`, Ze = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", Lt], { type: "text/javascript;charset=utf-8" });
|
|
1378
|
+
function br(e) {
|
|
1379
|
+
let t;
|
|
1380
|
+
try {
|
|
1381
|
+
if (t = Ze && (self.URL || self.webkitURL).createObjectURL(Ze), !t) throw "";
|
|
1382
|
+
const r = new Worker(t, {
|
|
1383
|
+
name: e?.name
|
|
1384
|
+
});
|
|
1385
|
+
return r.addEventListener("error", () => {
|
|
1386
|
+
(self.URL || self.webkitURL).revokeObjectURL(t);
|
|
1387
|
+
}), r;
|
|
1388
|
+
} catch {
|
|
1389
|
+
return new Worker(
|
|
1390
|
+
"data:text/javascript;charset=utf-8," + encodeURIComponent(Lt),
|
|
1391
|
+
{
|
|
1392
|
+
name: e?.name
|
|
1393
|
+
}
|
|
1394
|
+
);
|
|
1395
|
+
}
|
|
1396
|
+
}
|
|
1397
|
+
const Tt = `(function(){"use strict";function u(f,o,a,n,l,c,s,i){let r=c,e=0,t=i;const w=a.length;for(;r<s&&e<w;){const y=a[e][0];f[r]<=y?(n[t]=f[r],l[t]=o[r],r++):(n[t]=y,l[t]=a[e][1],e++),t++}for(;r<s;)n[t]=f[r],l[t]=o[r],r++,t++;for(;e<w;)n[t]=a[e][0],l[t]=a[e][1],e++,t++;return t-i}self.onmessage=f=>{const{bufferX:o,bufferY:a,outputBufferX:n,outputBufferY:l,origStart:c,origEnd:s,insertions:i,outStart:r}=f.data,e=new Float64Array(o),t=new Float32Array(a),w=new Float64Array(n),y=new Float32Array(l);u(e,t,i,w,y,c,s,r),self.postMessage("Done")}})();
|
|
1398
|
+
`, et = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", Tt], { type: "text/javascript;charset=utf-8" });
|
|
1399
|
+
function Sr(e) {
|
|
1400
|
+
let t;
|
|
1401
|
+
try {
|
|
1402
|
+
if (t = et && (self.URL || self.webkitURL).createObjectURL(et), !t) throw "";
|
|
1403
|
+
const r = new Worker(t, {
|
|
1404
|
+
name: e?.name
|
|
1405
|
+
});
|
|
1406
|
+
return r.addEventListener("error", () => {
|
|
1407
|
+
(self.URL || self.webkitURL).revokeObjectURL(t);
|
|
1408
|
+
}), r;
|
|
1409
|
+
} catch {
|
|
1410
|
+
return new Worker(
|
|
1411
|
+
"data:text/javascript;charset=utf-8," + encodeURIComponent(Tt),
|
|
1412
|
+
{
|
|
1413
|
+
name: e?.name
|
|
1414
|
+
}
|
|
1415
|
+
);
|
|
1416
|
+
}
|
|
1417
|
+
}
|
|
1418
|
+
const $t = `(function(){"use strict";self.onmessage=i=>{const{bufferX:c,bufferY:g,outputBufferX:d,outputBufferY:y,indexes:n,outStart:r,amount:f,isMonth:Y,isYear:h,deltaMs:w}=i.data,s=new Float64Array(c),a=new Float32Array(g),l=new Float64Array(d),u=new Float32Array(y);if(Y)for(let t=0;t<n.length;t++){const e=n[t],o=new Date(s[e]);o.setMonth(o.getMonth()+f),l[r+t]=o.getTime(),u[r+t]=a[e]}else if(h)for(let t=0;t<n.length;t++){const e=n[t],o=new Date(s[e]);o.setFullYear(o.getFullYear()+f),l[r+t]=o.getTime(),u[r+t]=a[e]}else for(let t=0;t<n.length;t++){const e=n[t];l[r+t]=s[e]+w,u[r+t]=a[e]}self.postMessage("Done")}})();
|
|
1419
|
+
`, tt = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", $t], { type: "text/javascript;charset=utf-8" });
|
|
1420
|
+
function Er(e) {
|
|
1421
|
+
let t;
|
|
1422
|
+
try {
|
|
1423
|
+
if (t = tt && (self.URL || self.webkitURL).createObjectURL(tt), !t) throw "";
|
|
1424
|
+
const r = new Worker(t, {
|
|
1425
|
+
name: e?.name
|
|
1426
|
+
});
|
|
1427
|
+
return r.addEventListener("error", () => {
|
|
1428
|
+
(self.URL || self.webkitURL).revokeObjectURL(t);
|
|
1429
|
+
}), r;
|
|
1430
|
+
} catch {
|
|
1431
|
+
return new Worker(
|
|
1432
|
+
"data:text/javascript;charset=utf-8," + encodeURIComponent($t),
|
|
1433
|
+
{
|
|
1434
|
+
name: e?.name
|
|
1435
|
+
}
|
|
1436
|
+
);
|
|
1437
|
+
}
|
|
1438
|
+
}
|
|
1439
|
+
const Rt = `(function(){"use strict";function a(e,t,o,c){const n=[];let r=e[t];for(let s=t+1;s<=o;s++){const f=e[s];f-r>c&&n.push(s-1,s),r=f}return n}self.onmessage=e=>{const{bufferX:t,start:o,endInclusive:c,threshold:n}=e.data,r=new Float64Array(t);self.postMessage(a(r,o,c,n))}})();
|
|
1440
|
+
`, rt = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", Rt], { type: "text/javascript;charset=utf-8" });
|
|
1441
|
+
function kr(e) {
|
|
1442
|
+
let t;
|
|
1443
|
+
try {
|
|
1444
|
+
if (t = rt && (self.URL || self.webkitURL).createObjectURL(rt), !t) throw "";
|
|
1445
|
+
const r = new Worker(t, {
|
|
1446
|
+
name: e?.name
|
|
1447
|
+
});
|
|
1448
|
+
return r.addEventListener("error", () => {
|
|
1449
|
+
(self.URL || self.webkitURL).revokeObjectURL(t);
|
|
1450
|
+
}), r;
|
|
1451
|
+
} catch {
|
|
1452
|
+
return new Worker(
|
|
1453
|
+
"data:text/javascript;charset=utf-8," + encodeURIComponent(Rt),
|
|
1454
|
+
{
|
|
1455
|
+
name: e?.name
|
|
1456
|
+
}
|
|
1457
|
+
);
|
|
1458
|
+
}
|
|
1459
|
+
}
|
|
1460
|
+
const It = `(function(){"use strict";function c(u,s,t){const n=[];if(s>=t)return n;let e=s,o=u[s];for(let r=s+1;r<t;r++){const f=u[r];f!==o&&(n.push(e,r-e,o),e=r,o=f)}return n.push(e,t-e,o),n}self.onmessage=u=>{const{bufferY:s,start:t,end:n}=u.data,e=new Float32Array(s);self.postMessage(c(e,t,n))}})();
|
|
1461
|
+
`, nt = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", It], { type: "text/javascript;charset=utf-8" });
|
|
1462
|
+
function vr(e) {
|
|
1463
|
+
let t;
|
|
1464
|
+
try {
|
|
1465
|
+
if (t = nt && (self.URL || self.webkitURL).createObjectURL(nt), !t) throw "";
|
|
1466
|
+
const r = new Worker(t, {
|
|
1467
|
+
name: e?.name
|
|
1468
|
+
});
|
|
1469
|
+
return r.addEventListener("error", () => {
|
|
1470
|
+
(self.URL || self.webkitURL).revokeObjectURL(t);
|
|
1471
|
+
}), r;
|
|
1472
|
+
} catch {
|
|
1473
|
+
return new Worker(
|
|
1474
|
+
"data:text/javascript;charset=utf-8," + encodeURIComponent(It),
|
|
1475
|
+
{
|
|
1476
|
+
name: e?.name
|
|
1477
|
+
}
|
|
1478
|
+
);
|
|
1479
|
+
}
|
|
1480
|
+
}
|
|
1481
|
+
const Mt = `(function(){"use strict";function o(s,i,t,n,l){const f=[];if(n==="Less than")for(let e=i;e<t;e++)s[e]-s[e-1]<l&&f.push(e);else if(n==="Less than or equal to")for(let e=i;e<t;e++)s[e]-s[e-1]<=l&&f.push(e);else if(n==="Greater than")for(let e=i;e<t;e++)s[e]-s[e-1]>l&&f.push(e);else if(n==="Greater than or equal to")for(let e=i;e<t;e++)s[e]-s[e-1]>=l&&f.push(e);else if(n==="Equal")for(let e=i;e<t;e++)s[e]-s[e-1]==l&&f.push(e);return f}self.onmessage=s=>{const{bufferY:i,start:t,end:n,comparator:l,value:f}=s.data,e=new Float32Array(i);self.postMessage(o(e,t,n,l,f))}})();
|
|
1482
|
+
`, st = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", Mt], { type: "text/javascript;charset=utf-8" });
|
|
1483
|
+
function _r(e) {
|
|
1484
|
+
let t;
|
|
1485
|
+
try {
|
|
1486
|
+
if (t = st && (self.URL || self.webkitURL).createObjectURL(st), !t) throw "";
|
|
1487
|
+
const r = new Worker(t, {
|
|
1488
|
+
name: e?.name
|
|
1489
|
+
});
|
|
1490
|
+
return r.addEventListener("error", () => {
|
|
1491
|
+
(self.URL || self.webkitURL).revokeObjectURL(t);
|
|
1492
|
+
}), r;
|
|
1493
|
+
} catch {
|
|
1494
|
+
return new Worker(
|
|
1495
|
+
"data:text/javascript;charset=utf-8," + encodeURIComponent(Mt),
|
|
1496
|
+
{
|
|
1497
|
+
name: e?.name
|
|
1498
|
+
}
|
|
1499
|
+
);
|
|
1500
|
+
}
|
|
1501
|
+
}
|
|
1502
|
+
const Ut = `(function(){"use strict";function l(t,i,n,o,h){const f=[];if(o==="Less than")for(let e=i;e<n;e++){const s=t[e-1];(t[e]-s)/Math.abs(s)<h&&f.push(e)}else if(o==="Less than or equal to")for(let e=i;e<n;e++){const s=t[e-1];(t[e]-s)/Math.abs(s)<=h&&f.push(e)}else if(o==="Greater than")for(let e=i;e<n;e++){const s=t[e-1];(t[e]-s)/Math.abs(s)>h&&f.push(e)}else if(o==="Greater than or equal to")for(let e=i;e<n;e++){const s=t[e-1];(t[e]-s)/Math.abs(s)>=h&&f.push(e)}else if(o==="Equal")for(let e=i;e<n;e++){const s=t[e-1];(t[e]-s)/Math.abs(s)==h&&f.push(e)}return f}self.onmessage=t=>{const{bufferY:i,start:n,end:o,comparator:h,value:f}=t.data,e=new Float32Array(i);self.postMessage(l(e,n,o,h,f))}})();
|
|
1503
|
+
`, ot = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", Ut], { type: "text/javascript;charset=utf-8" });
|
|
1504
|
+
function Ar(e) {
|
|
21
1505
|
let t;
|
|
22
1506
|
try {
|
|
23
|
-
if (t =
|
|
24
|
-
const
|
|
25
|
-
name:
|
|
1507
|
+
if (t = ot && (self.URL || self.webkitURL).createObjectURL(ot), !t) throw "";
|
|
1508
|
+
const r = new Worker(t, {
|
|
1509
|
+
name: e?.name
|
|
26
1510
|
});
|
|
27
|
-
return
|
|
1511
|
+
return r.addEventListener("error", () => {
|
|
28
1512
|
(self.URL || self.webkitURL).revokeObjectURL(t);
|
|
29
|
-
}),
|
|
1513
|
+
}), r;
|
|
30
1514
|
} catch {
|
|
31
1515
|
return new Worker(
|
|
32
|
-
"data:text/javascript;charset=utf-8," + encodeURIComponent(
|
|
1516
|
+
"data:text/javascript;charset=utf-8," + encodeURIComponent(Ut),
|
|
33
1517
|
{
|
|
34
|
-
name:
|
|
1518
|
+
name: e?.name
|
|
35
1519
|
}
|
|
36
1520
|
);
|
|
37
|
-
} finally {
|
|
38
|
-
t && (self.URL || self.webkitURL).revokeObjectURL(t);
|
|
39
1521
|
}
|
|
40
1522
|
}
|
|
41
|
-
const
|
|
42
|
-
`,
|
|
43
|
-
function
|
|
1523
|
+
const Ot = `(function(){"use strict";function k(i,l,u,r,c){const f=[],b=r.length;for(let a=l;a<u;a++){const t=i[a];let e=!1;for(let n=0;n<b;n++){const o=r[n],s=c[n];if(o===0){if(t<s){e=!0;break}}else if(o===1){if(t<=s){e=!0;break}}else if(o===2){if(t>s){e=!0;break}}else if(o===3){if(t>=s){e=!0;break}}else if(t==s){e=!0;break}}e&&f.push(a)}return f}self.onmessage=i=>{const{bufferY:l,start:u,end:r,ops:c,values:f}=i.data,b=new Float32Array(l);self.postMessage(k(b,u,r,c,f))}})();
|
|
1524
|
+
`, at = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", Ot], { type: "text/javascript;charset=utf-8" });
|
|
1525
|
+
function $e(e) {
|
|
44
1526
|
let t;
|
|
45
1527
|
try {
|
|
46
|
-
if (t =
|
|
47
|
-
const
|
|
48
|
-
name:
|
|
1528
|
+
if (t = at && (self.URL || self.webkitURL).createObjectURL(at), !t) throw "";
|
|
1529
|
+
const r = new Worker(t, {
|
|
1530
|
+
name: e?.name
|
|
49
1531
|
});
|
|
50
|
-
return
|
|
1532
|
+
return r.addEventListener("error", () => {
|
|
51
1533
|
(self.URL || self.webkitURL).revokeObjectURL(t);
|
|
52
|
-
}),
|
|
1534
|
+
}), r;
|
|
53
1535
|
} catch {
|
|
54
1536
|
return new Worker(
|
|
55
|
-
"data:text/javascript;charset=utf-8," + encodeURIComponent(
|
|
1537
|
+
"data:text/javascript;charset=utf-8," + encodeURIComponent(Ot),
|
|
56
1538
|
{
|
|
57
|
-
name:
|
|
1539
|
+
name: e?.name
|
|
58
1540
|
}
|
|
59
1541
|
);
|
|
60
|
-
} finally {
|
|
61
|
-
t && (self.URL || self.webkitURL).revokeObjectURL(t);
|
|
62
1542
|
}
|
|
63
1543
|
}
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
1544
|
+
const xt = `(function(){"use strict";function e(l,t,o,s){const c=t.length;if(o==="ADD")for(let f=0;f<c;f++)l[t[f]]=l[t[f]]+s;else if(o==="SUB")for(let f=0;f<c;f++)l[t[f]]=l[t[f]]-s;else if(o==="MULT")for(let f=0;f<c;f++)l[t[f]]=l[t[f]]*s;else if(o==="DIV")for(let f=0;f<c;f++)l[t[f]]=l[t[f]]/s;else if(o==="ASSIGN")for(let f=0;f<c;f++)l[t[f]]=s}self.onmessage=l=>{const{bufferY:t,indexes:o,operator:s,value:c}=l.data,f=new Float32Array(t);e(f,o,s,c),self.postMessage("Done")}})();
|
|
1545
|
+
`, it = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", xt], { type: "text/javascript;charset=utf-8" });
|
|
1546
|
+
function Lr(e) {
|
|
1547
|
+
let t;
|
|
1548
|
+
try {
|
|
1549
|
+
if (t = it && (self.URL || self.webkitURL).createObjectURL(it), !t) throw "";
|
|
1550
|
+
const r = new Worker(t, {
|
|
1551
|
+
name: e?.name
|
|
1552
|
+
});
|
|
1553
|
+
return r.addEventListener("error", () => {
|
|
1554
|
+
(self.URL || self.webkitURL).revokeObjectURL(t);
|
|
1555
|
+
}), r;
|
|
1556
|
+
} catch {
|
|
1557
|
+
return new Worker(
|
|
1558
|
+
"data:text/javascript;charset=utf-8," + encodeURIComponent(xt),
|
|
1559
|
+
{
|
|
1560
|
+
name: e?.name
|
|
1561
|
+
}
|
|
1562
|
+
);
|
|
1563
|
+
}
|
|
1564
|
+
}
|
|
1565
|
+
function Dt(e, t, r, n, s) {
|
|
1566
|
+
const a = [], o = n.length;
|
|
1567
|
+
for (let i = t; i < r; i++) {
|
|
1568
|
+
const l = e[i];
|
|
1569
|
+
let f = !1;
|
|
1570
|
+
for (let u = 0; u < o; u++) {
|
|
1571
|
+
const p = n[u], g = s[u];
|
|
1572
|
+
if (p === 0) {
|
|
1573
|
+
if (l < g) {
|
|
1574
|
+
f = !0;
|
|
1575
|
+
break;
|
|
1576
|
+
}
|
|
1577
|
+
} else if (p === 1) {
|
|
1578
|
+
if (l <= g) {
|
|
1579
|
+
f = !0;
|
|
1580
|
+
break;
|
|
1581
|
+
}
|
|
1582
|
+
} else if (p === 2) {
|
|
1583
|
+
if (l > g) {
|
|
1584
|
+
f = !0;
|
|
1585
|
+
break;
|
|
1586
|
+
}
|
|
1587
|
+
} else if (p === 3) {
|
|
1588
|
+
if (l >= g) {
|
|
1589
|
+
f = !0;
|
|
1590
|
+
break;
|
|
1591
|
+
}
|
|
1592
|
+
} else if (l == g) {
|
|
1593
|
+
f = !0;
|
|
1594
|
+
break;
|
|
1595
|
+
}
|
|
1596
|
+
}
|
|
1597
|
+
f && a.push(i);
|
|
1598
|
+
}
|
|
1599
|
+
return a;
|
|
1600
|
+
}
|
|
1601
|
+
function Tr(e, t, r, n, s) {
|
|
1602
|
+
const a = [];
|
|
1603
|
+
if (n === "Less than")
|
|
1604
|
+
for (let o = t; o < r; o++)
|
|
1605
|
+
e[o] - e[o - 1] < s && a.push(o);
|
|
1606
|
+
else if (n === "Less than or equal to")
|
|
1607
|
+
for (let o = t; o < r; o++)
|
|
1608
|
+
e[o] - e[o - 1] <= s && a.push(o);
|
|
1609
|
+
else if (n === "Greater than")
|
|
1610
|
+
for (let o = t; o < r; o++)
|
|
1611
|
+
e[o] - e[o - 1] > s && a.push(o);
|
|
1612
|
+
else if (n === "Greater than or equal to")
|
|
1613
|
+
for (let o = t; o < r; o++)
|
|
1614
|
+
e[o] - e[o - 1] >= s && a.push(o);
|
|
1615
|
+
else if (n === "Equal")
|
|
1616
|
+
for (let o = t; o < r; o++)
|
|
1617
|
+
e[o] - e[o - 1] == s && a.push(o);
|
|
1618
|
+
return a;
|
|
1619
|
+
}
|
|
1620
|
+
function $r(e, t, r, n, s) {
|
|
1621
|
+
const a = [];
|
|
1622
|
+
if (n === "Less than")
|
|
1623
|
+
for (let o = t; o < r; o++) {
|
|
1624
|
+
const i = e[o - 1];
|
|
1625
|
+
(e[o] - i) / Math.abs(i) < s && a.push(o);
|
|
1626
|
+
}
|
|
1627
|
+
else if (n === "Less than or equal to")
|
|
1628
|
+
for (let o = t; o < r; o++) {
|
|
1629
|
+
const i = e[o - 1];
|
|
1630
|
+
(e[o] - i) / Math.abs(i) <= s && a.push(o);
|
|
1631
|
+
}
|
|
1632
|
+
else if (n === "Greater than")
|
|
1633
|
+
for (let o = t; o < r; o++) {
|
|
1634
|
+
const i = e[o - 1];
|
|
1635
|
+
(e[o] - i) / Math.abs(i) > s && a.push(o);
|
|
1636
|
+
}
|
|
1637
|
+
else if (n === "Greater than or equal to")
|
|
1638
|
+
for (let o = t; o < r; o++) {
|
|
1639
|
+
const i = e[o - 1];
|
|
1640
|
+
(e[o] - i) / Math.abs(i) >= s && a.push(o);
|
|
1641
|
+
}
|
|
1642
|
+
else if (n === "Equal")
|
|
1643
|
+
for (let o = t; o < r; o++) {
|
|
1644
|
+
const i = e[o - 1];
|
|
1645
|
+
(e[o] - i) / Math.abs(i) == s && a.push(o);
|
|
1646
|
+
}
|
|
1647
|
+
return a;
|
|
1648
|
+
}
|
|
1649
|
+
function Rr(e, t, r, n) {
|
|
1650
|
+
const s = [];
|
|
1651
|
+
let a = e[t];
|
|
1652
|
+
for (let o = t + 1; o <= r; o++) {
|
|
1653
|
+
const i = e[o];
|
|
1654
|
+
i - a > n && s.push(o - 1, o), a = i;
|
|
1655
|
+
}
|
|
1656
|
+
return s;
|
|
1657
|
+
}
|
|
1658
|
+
function Ir(e, t, r) {
|
|
1659
|
+
const n = [];
|
|
1660
|
+
if (t >= r) return n;
|
|
1661
|
+
let s = t, a = e[t];
|
|
1662
|
+
for (let o = t + 1; o < r; o++) {
|
|
1663
|
+
const i = e[o];
|
|
1664
|
+
i !== a && (n.push(s, o - s, a), s = o, a = i);
|
|
1665
|
+
}
|
|
1666
|
+
return n.push(s, r - s, a), n;
|
|
1667
|
+
}
|
|
1668
|
+
function Mr(e, t, r, n, s, a, o, i, l, f, u) {
|
|
1669
|
+
let p = 0, g = i;
|
|
1670
|
+
for (let y = a; y <= o; y++)
|
|
1671
|
+
if (n[g] = e[y], s[g] = t[y], g++, p < r.length && y === r[p][0]) {
|
|
1672
|
+
const d = r[p][0], h = r[p][1], b = e[d], w = e[h], m = t[d], S = t[h], A = w - b, L = S - m;
|
|
1673
|
+
let T = b + l;
|
|
1674
|
+
for (; T < w; )
|
|
1675
|
+
n[g] = T, s[g] = f ? m + (T - b) * L / A : u, g++, T += l;
|
|
1676
|
+
p++;
|
|
1677
|
+
}
|
|
1678
|
+
return g - i;
|
|
1679
|
+
}
|
|
1680
|
+
function Ur(e, t, r, n, s, a, o, i) {
|
|
1681
|
+
let l = a, f = 0, u = i;
|
|
1682
|
+
const p = r.length;
|
|
1683
|
+
for (; l < o && f < p; ) {
|
|
1684
|
+
const g = r[f][0];
|
|
1685
|
+
e[l] <= g ? (n[u] = e[l], s[u] = t[l], l++) : (n[u] = g, s[u] = r[f][1], f++), u++;
|
|
69
1686
|
}
|
|
1687
|
+
for (; l < o; )
|
|
1688
|
+
n[u] = e[l], s[u] = t[l], l++, u++;
|
|
1689
|
+
for (; f < p; )
|
|
1690
|
+
n[u] = r[f][0], s[u] = r[f][1], f++, u++;
|
|
1691
|
+
return u - i;
|
|
1692
|
+
}
|
|
1693
|
+
function Or(e, t, r, n, s, a, o, i) {
|
|
1694
|
+
let l = 0, f = i;
|
|
1695
|
+
for (let u = a; u <= o; u++)
|
|
1696
|
+
l < r.length && u === r[l] ? l++ : (n[f] = e[u], s[f] = t[u], f++);
|
|
1697
|
+
return f - i;
|
|
1698
|
+
}
|
|
1699
|
+
function xr(e, t, r, n) {
|
|
1700
|
+
const s = r.length, a = new Array(s);
|
|
1701
|
+
if (n.isMonth)
|
|
1702
|
+
for (let o = 0; o < s; o++) {
|
|
1703
|
+
const i = r[o], l = new Date(e[i]);
|
|
1704
|
+
l.setMonth(l.getMonth() + n.amount), a[o] = [l.getTime(), t[i]];
|
|
1705
|
+
}
|
|
1706
|
+
else if (n.isYear)
|
|
1707
|
+
for (let o = 0; o < s; o++) {
|
|
1708
|
+
const i = r[o], l = new Date(e[i]);
|
|
1709
|
+
l.setFullYear(l.getFullYear() + n.amount), a[o] = [l.getTime(), t[i]];
|
|
1710
|
+
}
|
|
1711
|
+
else
|
|
1712
|
+
for (let o = 0; o < s; o++) {
|
|
1713
|
+
const i = r[o];
|
|
1714
|
+
a[o] = [e[i] + n.deltaMs, t[i]];
|
|
1715
|
+
}
|
|
70
1716
|
return a;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
for (;
|
|
74
|
-
const n = a
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
1717
|
+
}
|
|
1718
|
+
function Dr(e, t, r) {
|
|
1719
|
+
for (let n = 0; n < r.length; n++) {
|
|
1720
|
+
const { indexes: s, lowerIdx: a, upperIdx: o } = r[n], i = e[a], l = t[a], f = e[o], u = t[o], p = f - i, g = u - l;
|
|
1721
|
+
if (p === 0) {
|
|
1722
|
+
for (let y = 0; y < s.length; y++) t[s[y]] = l;
|
|
1723
|
+
continue;
|
|
1724
|
+
}
|
|
1725
|
+
for (let y = 0; y < s.length; y++) {
|
|
1726
|
+
const d = s[y];
|
|
1727
|
+
t[d] = l + (e[d] - i) * g / p;
|
|
1728
|
+
}
|
|
1729
|
+
}
|
|
1730
|
+
}
|
|
1731
|
+
function Cr(e, t, r) {
|
|
1732
|
+
for (let n = 0; n < r.length; n++) {
|
|
1733
|
+
const s = r[n][0], a = r[n][1], o = r[n][2];
|
|
1734
|
+
if (a <= s) continue;
|
|
1735
|
+
const i = e[s], l = e[a] - i;
|
|
1736
|
+
if (l !== 0)
|
|
1737
|
+
for (let f = s; f < a; f++)
|
|
1738
|
+
t[f] = t[f] + o * ((e[f] - i) / l);
|
|
1739
|
+
}
|
|
1740
|
+
}
|
|
1741
|
+
function ct(e, t, r, n) {
|
|
1742
|
+
const s = t.length;
|
|
1743
|
+
if (r === "ADD")
|
|
1744
|
+
for (let a = 0; a < s; a++) e[t[a]] = e[t[a]] + n;
|
|
1745
|
+
else if (r === "SUB")
|
|
1746
|
+
for (let a = 0; a < s; a++) e[t[a]] = e[t[a]] - n;
|
|
1747
|
+
else if (r === "MULT")
|
|
1748
|
+
for (let a = 0; a < s; a++) e[t[a]] = e[t[a]] * n;
|
|
1749
|
+
else if (r === "DIV")
|
|
1750
|
+
for (let a = 0; a < s; a++) e[t[a]] = e[t[a]] / n;
|
|
1751
|
+
else if (r === "ASSIGN")
|
|
1752
|
+
for (let a = 0; a < s; a++) e[t[a]] = n;
|
|
1753
|
+
}
|
|
1754
|
+
const Fr = 1, xe = `qc-utils:calibration:v${Fr}`, Pr = 720 * 60 * 60 * 1e3, ne = 5e4, se = 2e5, ce = {
|
|
1755
|
+
spawnOverheadMs: 50,
|
|
1756
|
+
// worst-case Windows
|
|
1757
|
+
inlineThroughput: 5e4,
|
|
1758
|
+
// 50M elements/sec, conservative
|
|
1759
|
+
workerThroughput: 8e4,
|
|
1760
|
+
// workers slightly faster in-loop once spawned
|
|
1761
|
+
hwConcurrency: 4,
|
|
1762
|
+
measuredAt: 0,
|
|
1763
|
+
userAgent: "default"
|
|
1764
|
+
};
|
|
1765
|
+
let M = jr() ?? ce, De = null, K = null;
|
|
1766
|
+
const Re = /* @__PURE__ */ new Set(), Ie = {
|
|
1767
|
+
// Filter ops — read-only scans, cheap kernels
|
|
1768
|
+
[v.VALUE_THRESHOLD]: {
|
|
1769
|
+
mode: "calibrated",
|
|
1770
|
+
weight: 1,
|
|
1771
|
+
rationale: "O(n) single-pass scan; baseline reference"
|
|
1772
|
+
},
|
|
1773
|
+
[v.CHANGE]: {
|
|
1774
|
+
mode: "calibrated",
|
|
1775
|
+
weight: 1.1,
|
|
1776
|
+
rationale: "O(n) with one subtraction per step"
|
|
1777
|
+
},
|
|
1778
|
+
[v.RATE_OF_CHANGE]: {
|
|
1779
|
+
mode: "calibrated",
|
|
1780
|
+
weight: 1.4,
|
|
1781
|
+
rationale: "O(n) with division + abs per step"
|
|
1782
|
+
},
|
|
1783
|
+
[v.FIND_GAPS]: {
|
|
1784
|
+
mode: "calibrated",
|
|
1785
|
+
weight: 0.9,
|
|
1786
|
+
rationale: "O(n) on X only, mostly empty output"
|
|
1787
|
+
},
|
|
1788
|
+
[v.PERSISTENCE]: {
|
|
1789
|
+
mode: "calibrated",
|
|
1790
|
+
weight: 1.3,
|
|
1791
|
+
rationale: "O(n) + chunk-boundary stitch"
|
|
1792
|
+
},
|
|
1793
|
+
[v.DATETIME_RANGE]: {
|
|
1794
|
+
mode: "always-inline",
|
|
1795
|
+
weight: 0,
|
|
1796
|
+
rationale: "O(log n) binary search; never worth the worker hop"
|
|
1797
|
+
},
|
|
1798
|
+
[v.SELECTION]: {
|
|
1799
|
+
mode: "always-inline",
|
|
1800
|
+
weight: 0,
|
|
1801
|
+
rationale: "Pure history bookkeeping"
|
|
1802
|
+
},
|
|
1803
|
+
// Edit ops — mutate Y in place or rebuild arrays
|
|
1804
|
+
[E.CHANGE_VALUES]: {
|
|
1805
|
+
mode: "calibrated",
|
|
1806
|
+
weight: 0.7,
|
|
1807
|
+
rationale: "O(k) in-place arithmetic on selection"
|
|
1808
|
+
},
|
|
1809
|
+
[E.ASSIGN_VALUES_BULK]: {
|
|
1810
|
+
mode: "always-inline",
|
|
1811
|
+
weight: 0,
|
|
1812
|
+
rationale: "Single tight loop, already inline"
|
|
1813
|
+
},
|
|
1814
|
+
[E.ASSIGN_DATETIMES_BULK]: {
|
|
1815
|
+
mode: "always-inline",
|
|
1816
|
+
weight: 0,
|
|
1817
|
+
rationale: "Composes delete+add which handle their own dispatch"
|
|
1818
|
+
},
|
|
1819
|
+
[E.INTERPOLATE]: {
|
|
1820
|
+
mode: "calibrated",
|
|
1821
|
+
weight: 1.5,
|
|
1822
|
+
rationale: "Linear interp per consecutive group; in-place writes"
|
|
1823
|
+
},
|
|
1824
|
+
[E.DRIFT_CORRECTION]: {
|
|
1825
|
+
mode: "calibrated",
|
|
1826
|
+
weight: 1.2,
|
|
1827
|
+
rationale: "O(range total) in-place math; one pass per range"
|
|
1828
|
+
},
|
|
1829
|
+
[E.SHIFT_DATETIMES]: {
|
|
1830
|
+
mode: "calibrated",
|
|
1831
|
+
weight: 1.1,
|
|
1832
|
+
rationale: "O(k) per-point shift math; inline skips SAB allocation"
|
|
1833
|
+
},
|
|
1834
|
+
[E.ADD_POINTS]: {
|
|
1835
|
+
mode: "calibrated",
|
|
1836
|
+
weight: 1.8,
|
|
1837
|
+
rationale: "Single merge pass over Y/X + insertions; fresh SAB per call"
|
|
1838
|
+
},
|
|
1839
|
+
[E.DELETE_POINTS]: {
|
|
1840
|
+
mode: "calibrated",
|
|
1841
|
+
weight: 1.4,
|
|
1842
|
+
rationale: "Single skip-on-delete pass over Y/X; fresh SAB per call"
|
|
1843
|
+
},
|
|
1844
|
+
[E.FILL_GAPS]: {
|
|
1845
|
+
mode: "calibrated",
|
|
1846
|
+
weight: 1.3,
|
|
1847
|
+
rationale: "Single copy-with-fills pass; fresh SAB sized to newLength"
|
|
1848
|
+
}
|
|
1849
|
+
};
|
|
1850
|
+
function U(e, t) {
|
|
1851
|
+
const r = Ie[e];
|
|
1852
|
+
if (!r)
|
|
1853
|
+
return {
|
|
1854
|
+
useWorker: !0,
|
|
1855
|
+
predictedInlineMs: 1 / 0,
|
|
1856
|
+
predictedWorkerMs: 0,
|
|
1857
|
+
reason: "unknown op; keeping default worker path"
|
|
1858
|
+
};
|
|
1859
|
+
if (r.mode === "always-inline")
|
|
1860
|
+
return {
|
|
1861
|
+
useWorker: !1,
|
|
1862
|
+
predictedInlineMs: 0,
|
|
1863
|
+
predictedWorkerMs: 0,
|
|
1864
|
+
reason: r.rationale
|
|
1865
|
+
};
|
|
1866
|
+
if (typeof SharedArrayBuffer > "u")
|
|
1867
|
+
return {
|
|
1868
|
+
useWorker: !1,
|
|
1869
|
+
predictedInlineMs: 0,
|
|
1870
|
+
predictedWorkerMs: 1 / 0,
|
|
1871
|
+
reason: "SharedArrayBuffer unavailable; forced inline"
|
|
1872
|
+
};
|
|
1873
|
+
if (r.mode === "always-worker")
|
|
1874
|
+
return {
|
|
1875
|
+
useWorker: !0,
|
|
1876
|
+
predictedInlineMs: 1 / 0,
|
|
1877
|
+
predictedWorkerMs: 0,
|
|
1878
|
+
reason: r.rationale
|
|
1879
|
+
};
|
|
1880
|
+
const n = Br(e, t);
|
|
1881
|
+
if (n <= 0)
|
|
1882
|
+
return {
|
|
1883
|
+
useWorker: !1,
|
|
1884
|
+
predictedInlineMs: 0,
|
|
1885
|
+
predictedWorkerMs: M.spawnOverheadMs,
|
|
1886
|
+
reason: "zero work units"
|
|
1887
|
+
};
|
|
1888
|
+
const s = Math.max(
|
|
1889
|
+
1,
|
|
1890
|
+
Math.min(
|
|
1891
|
+
t.parallelism ?? M.hwConcurrency,
|
|
1892
|
+
M.hwConcurrency
|
|
1893
|
+
)
|
|
1894
|
+
), a = r.weight * n / M.inlineThroughput, o = M.spawnOverheadMs + r.weight * n / (M.workerThroughput * s), i = a > o;
|
|
1895
|
+
return {
|
|
1896
|
+
useWorker: i,
|
|
1897
|
+
predictedInlineMs: a,
|
|
1898
|
+
predictedWorkerMs: o,
|
|
1899
|
+
reason: i ? `worker faster (${o.toFixed(1)} vs ${a.toFixed(1)} ms)` : `inline faster (${a.toFixed(1)} vs ${o.toFixed(1)} ms)`
|
|
1900
|
+
};
|
|
1901
|
+
}
|
|
1902
|
+
function Br(e, t) {
|
|
1903
|
+
switch (e) {
|
|
1904
|
+
case E.CHANGE_VALUES:
|
|
1905
|
+
case E.INTERPOLATE:
|
|
1906
|
+
case E.SHIFT_DATETIMES:
|
|
1907
|
+
case E.DRIFT_CORRECTION:
|
|
1908
|
+
return t.selectionSize ?? 0;
|
|
1909
|
+
case E.DELETE_POINTS:
|
|
1910
|
+
return (t.selectionSize ?? 0) + t.datasetSize * 0.25;
|
|
1911
|
+
case E.ADD_POINTS: {
|
|
1912
|
+
const r = Math.max(1, Math.log2(Math.max(t.datasetSize, 2)));
|
|
1913
|
+
return t.datasetSize + (t.selectionSize ?? 0) * r;
|
|
1914
|
+
}
|
|
1915
|
+
default:
|
|
1916
|
+
return t.datasetSize;
|
|
1917
|
+
}
|
|
1918
|
+
}
|
|
1919
|
+
function dn(e) {
|
|
1920
|
+
return Re.add(e), () => Re.delete(e);
|
|
1921
|
+
}
|
|
1922
|
+
function pn() {
|
|
1923
|
+
return M;
|
|
1924
|
+
}
|
|
1925
|
+
function yn() {
|
|
1926
|
+
return De;
|
|
1927
|
+
}
|
|
1928
|
+
function gn() {
|
|
1929
|
+
return Object.keys(Ie).map((e) => ({ op: e, ...Ie[e] }));
|
|
1930
|
+
}
|
|
1931
|
+
function mn() {
|
|
1932
|
+
M = ce, De = null;
|
|
1933
|
+
try {
|
|
1934
|
+
localStorage.removeItem(xe);
|
|
1935
|
+
} catch {
|
|
1936
|
+
}
|
|
1937
|
+
}
|
|
1938
|
+
async function wn(e = {}) {
|
|
1939
|
+
if (typeof window > "u" || !(e.force || M.measuredAt === 0 || Date.now() - M.measuredAt > Pr)) return M;
|
|
1940
|
+
if (K) await K;
|
|
1941
|
+
else {
|
|
1942
|
+
K = Nr().finally(() => {
|
|
1943
|
+
K = null;
|
|
1944
|
+
});
|
|
1945
|
+
const r = await K;
|
|
1946
|
+
M = r, Wr(r), De = r;
|
|
1947
|
+
for (const n of Re) n(M);
|
|
1948
|
+
}
|
|
1949
|
+
return M;
|
|
1950
|
+
}
|
|
1951
|
+
async function Nr() {
|
|
1952
|
+
if (!(typeof SharedArrayBuffer < "u"))
|
|
1953
|
+
return {
|
|
1954
|
+
...ce,
|
|
1955
|
+
measuredAt: Date.now(),
|
|
1956
|
+
userAgent: navigator.userAgent,
|
|
1957
|
+
hwConcurrency: navigator.hardwareConcurrency || ce.hwConcurrency,
|
|
1958
|
+
sharedArrayBufferAvailable: !1,
|
|
1959
|
+
samples: { spawnRoundtripMs: [], inlineScanMs: [], workerScanMs: [] }
|
|
1960
|
+
};
|
|
1961
|
+
const t = navigator.hardwareConcurrency || 4, r = new Float32Array(ne);
|
|
1962
|
+
for (let h = 0; h < ne; h++) r[h] = Math.sin(h);
|
|
1963
|
+
const n = await Se(3, () => {
|
|
1964
|
+
const h = performance.now();
|
|
1965
|
+
return Dt(r, 0, ne, [2], [0.5]), performance.now() - h;
|
|
1966
|
+
}), s = Ee(n), a = ne / Math.max(s, 1e-3), o = new SharedArrayBuffer(256 * Float32Array.BYTES_PER_ELEMENT), i = await Se(3, async () => {
|
|
1967
|
+
const h = performance.now();
|
|
1968
|
+
return await new Promise((b) => {
|
|
1969
|
+
const w = new $e();
|
|
1970
|
+
w.onmessage = () => {
|
|
1971
|
+
w.terminate(), b();
|
|
1972
|
+
}, w.postMessage({
|
|
1973
|
+
bufferY: o,
|
|
1974
|
+
start: 0,
|
|
1975
|
+
end: 256,
|
|
1976
|
+
ops: [2],
|
|
1977
|
+
values: [0.5]
|
|
1978
|
+
});
|
|
1979
|
+
}), performance.now() - h;
|
|
1980
|
+
}), l = Ee(i), f = new SharedArrayBuffer(
|
|
1981
|
+
se * Float32Array.BYTES_PER_ELEMENT
|
|
1982
|
+
), u = new Float32Array(f);
|
|
1983
|
+
for (let h = 0; h < se; h++) u[h] = Math.sin(h);
|
|
1984
|
+
const p = await Se(3, async () => {
|
|
1985
|
+
const h = performance.now();
|
|
1986
|
+
return await new Promise((b) => {
|
|
1987
|
+
const w = new $e();
|
|
1988
|
+
w.onmessage = () => {
|
|
1989
|
+
w.terminate(), b();
|
|
1990
|
+
}, w.postMessage({
|
|
1991
|
+
bufferY: f,
|
|
1992
|
+
start: 0,
|
|
1993
|
+
end: se,
|
|
1994
|
+
ops: [2],
|
|
1995
|
+
values: [0.5]
|
|
1996
|
+
});
|
|
1997
|
+
}), performance.now() - h;
|
|
1998
|
+
}), g = Math.max(Ee(p) - l, 0.1), y = se / g;
|
|
1999
|
+
return {
|
|
2000
|
+
spawnOverheadMs: l,
|
|
2001
|
+
inlineThroughput: a,
|
|
2002
|
+
workerThroughput: y,
|
|
2003
|
+
hwConcurrency: t,
|
|
2004
|
+
measuredAt: Date.now(),
|
|
2005
|
+
userAgent: navigator.userAgent,
|
|
2006
|
+
sharedArrayBufferAvailable: !0,
|
|
2007
|
+
samples: {
|
|
2008
|
+
spawnRoundtripMs: i,
|
|
2009
|
+
inlineScanMs: n,
|
|
2010
|
+
workerScanMs: p
|
|
2011
|
+
}
|
|
2012
|
+
};
|
|
2013
|
+
}
|
|
2014
|
+
async function Se(e, t) {
|
|
2015
|
+
const r = [];
|
|
2016
|
+
for (let n = 0; n < e; n++)
|
|
2017
|
+
await new Promise((s) => setTimeout(s, 0)), r.push(await t());
|
|
2018
|
+
return r;
|
|
2019
|
+
}
|
|
2020
|
+
function Ee(e) {
|
|
2021
|
+
if (!e.length) return 0;
|
|
2022
|
+
const t = [...e].sort((n, s) => n - s), r = Math.floor(t.length / 2);
|
|
2023
|
+
return t.length % 2 ? t[r] : (t[r - 1] + t[r]) / 2;
|
|
2024
|
+
}
|
|
2025
|
+
function jr() {
|
|
2026
|
+
if (typeof localStorage > "u") return null;
|
|
2027
|
+
try {
|
|
2028
|
+
const e = localStorage.getItem(xe);
|
|
2029
|
+
if (!e) return null;
|
|
2030
|
+
const t = JSON.parse(e);
|
|
2031
|
+
return !t || typeof t.spawnOverheadMs != "number" ? null : t;
|
|
2032
|
+
} catch {
|
|
2033
|
+
return null;
|
|
2034
|
+
}
|
|
2035
|
+
}
|
|
2036
|
+
function Wr(e) {
|
|
2037
|
+
if (!(typeof localStorage > "u"))
|
|
2038
|
+
try {
|
|
2039
|
+
const t = {
|
|
2040
|
+
spawnOverheadMs: e.spawnOverheadMs,
|
|
2041
|
+
inlineThroughput: e.inlineThroughput,
|
|
2042
|
+
workerThroughput: e.workerThroughput,
|
|
2043
|
+
hwConcurrency: e.hwConcurrency,
|
|
2044
|
+
measuredAt: e.measuredAt,
|
|
2045
|
+
userAgent: e.userAgent
|
|
2046
|
+
};
|
|
2047
|
+
localStorage.setItem(xe, JSON.stringify(t));
|
|
2048
|
+
} catch {
|
|
2049
|
+
}
|
|
2050
|
+
}
|
|
2051
|
+
const Q = 20 * 1e3, Gr = 1024, Yr = ["date", "value", "qualifier"];
|
|
2052
|
+
class bn {
|
|
102
2053
|
/** The generated dataset to be used for plotting */
|
|
103
2054
|
dataset = {
|
|
104
|
-
dimensions:
|
|
2055
|
+
dimensions: Yr,
|
|
105
2056
|
source: {
|
|
106
2057
|
x: new Float64Array(
|
|
107
2058
|
new SharedArrayBuffer(
|
|
108
|
-
|
|
2059
|
+
Q * Float64Array.BYTES_PER_ELEMENT,
|
|
109
2060
|
{
|
|
110
|
-
maxByteLength:
|
|
2061
|
+
maxByteLength: Q * Float64Array.BYTES_PER_ELEMENT
|
|
111
2062
|
// Max size the array can reach
|
|
112
2063
|
}
|
|
113
2064
|
)
|
|
114
2065
|
),
|
|
115
2066
|
y: new Float32Array(
|
|
116
2067
|
new SharedArrayBuffer(
|
|
117
|
-
|
|
2068
|
+
Q * Float32Array.BYTES_PER_ELEMENT,
|
|
118
2069
|
{
|
|
119
|
-
maxByteLength:
|
|
2070
|
+
maxByteLength: Q * Float32Array.BYTES_PER_ELEMENT
|
|
120
2071
|
// Max size the array can reach
|
|
121
2072
|
}
|
|
122
2073
|
)
|
|
@@ -124,6 +2075,30 @@ class q {
|
|
|
124
2075
|
}
|
|
125
2076
|
};
|
|
126
2077
|
history = [];
|
|
2078
|
+
/**
|
|
2079
|
+
* Items popped off `history` by `undo()`, in undo order (top of stack
|
|
2080
|
+
* at the end). `redo()` re-dispatches the top. A fresh `dispatchAction`
|
|
2081
|
+
* / `dispatchFilter` call clears the stack — Word-style behavior where
|
|
2082
|
+
* a new edit invalidates the redo chain.
|
|
2083
|
+
*/
|
|
2084
|
+
redoStack = [];
|
|
2085
|
+
/**
|
|
2086
|
+
* True while `undo()` / `redo()` is replaying a captured history entry.
|
|
2087
|
+
* Suppresses the redo-stack clearing that otherwise fires on every new
|
|
2088
|
+
* dispatch, so the stack survives the internal replay.
|
|
2089
|
+
*/
|
|
2090
|
+
_isReplaying = !1;
|
|
2091
|
+
/**
|
|
2092
|
+
* Set by each operation handler (or any of its subroutines) to record
|
|
2093
|
+
* whether a worker was actually spawned during this dispatch. Sticky-
|
|
2094
|
+
* upgrade semantics: the wrapper resets it to `"inline"` before the
|
|
2095
|
+
* handler runs, and any code that spawns a worker flips it to
|
|
2096
|
+
* `"worker"`. Once flipped it stays flipped for the rest of the
|
|
2097
|
+
* dispatch — so an op whose top-level decision is "inline" but whose
|
|
2098
|
+
* sub-op (e.g. `_shift` → `_deleteDataPoints`) still spawns workers
|
|
2099
|
+
* will honestly show `"worker"` on its history entry.
|
|
2100
|
+
*/
|
|
2101
|
+
_pendingExecutionMode = "inline";
|
|
127
2102
|
loadingTime = null;
|
|
128
2103
|
isLoading = !0;
|
|
129
2104
|
rawData;
|
|
@@ -134,10 +2109,10 @@ class q {
|
|
|
134
2109
|
if (!t)
|
|
135
2110
|
return;
|
|
136
2111
|
this.isLoading = !0;
|
|
137
|
-
const
|
|
2112
|
+
const r = await we(() => {
|
|
138
2113
|
this._growBuffer(t.datetimes.length), this._resizeTo(t.datetimes.length), this.dataX.set(t.datetimes), this.dataY.set(t.dataValues);
|
|
139
2114
|
});
|
|
140
|
-
this.loadingTime =
|
|
2115
|
+
this.loadingTime = r.duration, this.history.length = 0, this.isLoading = !1;
|
|
141
2116
|
}
|
|
142
2117
|
get dataX() {
|
|
143
2118
|
return this.dataset.source.x;
|
|
@@ -162,22 +2137,22 @@ class q {
|
|
|
162
2137
|
* @param newLength The total number of elements that the view will contain
|
|
163
2138
|
*/
|
|
164
2139
|
_growBuffer(t) {
|
|
165
|
-
const
|
|
166
|
-
let
|
|
167
|
-
for (;
|
|
168
|
-
|
|
169
|
-
if (
|
|
170
|
-
const
|
|
2140
|
+
const r = t * Float64Array.BYTES_PER_ELEMENT;
|
|
2141
|
+
let n = this.dataX.buffer.byteLength;
|
|
2142
|
+
for (; r > n; )
|
|
2143
|
+
n += Q * Float64Array.BYTES_PER_ELEMENT;
|
|
2144
|
+
if (n * Float64Array.BYTES_PER_ELEMENT > this.dataX.buffer.maxByteLength) {
|
|
2145
|
+
const s = new SharedArrayBuffer(
|
|
171
2146
|
this.dataX.buffer.byteLength,
|
|
172
2147
|
{
|
|
173
|
-
maxByteLength:
|
|
2148
|
+
maxByteLength: n * Float64Array.BYTES_PER_ELEMENT
|
|
174
2149
|
}
|
|
175
|
-
),
|
|
2150
|
+
), a = new SharedArrayBuffer(
|
|
176
2151
|
this.dataY.buffer.byteLength,
|
|
177
2152
|
{
|
|
178
|
-
maxByteLength:
|
|
2153
|
+
maxByteLength: n * Float32Array.BYTES_PER_ELEMENT
|
|
179
2154
|
}
|
|
180
|
-
), o = new Float64Array(
|
|
2155
|
+
), o = new Float64Array(s), i = new Float32Array(a);
|
|
181
2156
|
o.set(this.dataX), i.set(this.dataY), this.dataset.source.x = o, this.dataset.source.y = i;
|
|
182
2157
|
}
|
|
183
2158
|
this.dataX.buffer.byteLength < t * Float64Array.BYTES_PER_ELEMENT && (this.dataX.buffer.grow(t * Float64Array.BYTES_PER_ELEMENT), this.dataY.buffer.grow(t * Float32Array.BYTES_PER_ELEMENT));
|
|
@@ -193,16 +2168,47 @@ class q {
|
|
|
193
2168
|
* @returns
|
|
194
2169
|
*/
|
|
195
2170
|
async reloadHistory(t) {
|
|
196
|
-
const
|
|
197
|
-
await this.reload(), await this.dispatch(
|
|
2171
|
+
const r = this.history.slice(0, t + 1);
|
|
2172
|
+
return this.redoStack.length = 0, await this.reload(), await this.dispatch(r.map((n) => [n.method, ...n.args || []]));
|
|
198
2173
|
}
|
|
199
2174
|
/**
|
|
200
2175
|
* Remove a history item
|
|
201
2176
|
* @param index
|
|
202
2177
|
*/
|
|
203
2178
|
async removeHistoryItem(t) {
|
|
204
|
-
const
|
|
205
|
-
|
|
2179
|
+
const r = [...this.history];
|
|
2180
|
+
return r.splice(t, 1), this.redoStack.length = 0, await this.reload(), await this.dispatch(r.map((n) => [n.method, ...n.args || []]));
|
|
2181
|
+
}
|
|
2182
|
+
/**
|
|
2183
|
+
* Undo the most recent history entry. Pushes it onto `redoStack` so a
|
|
2184
|
+
* subsequent `redo()` can re-apply it, then reloads from the raw
|
|
2185
|
+
* dataset and replays the remaining history in order.
|
|
2186
|
+
*/
|
|
2187
|
+
async undo() {
|
|
2188
|
+
if (!this.history.length) return [];
|
|
2189
|
+
const t = this.history[this.history.length - 1], r = this.history.slice(0, -1);
|
|
2190
|
+
await this.reload(), this.redoStack.push(t), this._isReplaying = !0;
|
|
2191
|
+
try {
|
|
2192
|
+
return await this.dispatch(r.map((n) => [n.method, ...n.args || []]));
|
|
2193
|
+
} finally {
|
|
2194
|
+
this._isReplaying = !1;
|
|
2195
|
+
}
|
|
2196
|
+
}
|
|
2197
|
+
/**
|
|
2198
|
+
* Re-apply the most recently undone entry from `redoStack`. The replay
|
|
2199
|
+
* runs through `dispatch`, which pushes a fresh history entry for it;
|
|
2200
|
+
* `_isReplaying` guards the redo stack from being wiped during the
|
|
2201
|
+
* dispatch.
|
|
2202
|
+
*/
|
|
2203
|
+
async redo() {
|
|
2204
|
+
if (!this.redoStack.length) return [];
|
|
2205
|
+
const t = this.redoStack.pop();
|
|
2206
|
+
this._isReplaying = !0;
|
|
2207
|
+
try {
|
|
2208
|
+
return await this.dispatch([[t.method, ...t.args || []]]);
|
|
2209
|
+
} finally {
|
|
2210
|
+
this._isReplaying = !1;
|
|
2211
|
+
}
|
|
206
2212
|
}
|
|
207
2213
|
get beginTime() {
|
|
208
2214
|
return this.dataset.source.x.length ? new Date(this.dataset.source.x[0]) : null;
|
|
@@ -211,135 +2217,255 @@ class q {
|
|
|
211
2217
|
return this.dataset.source.x.length ? new Date(this.dataset.source.x[this.dataset.source.x.length - 1]) : null;
|
|
212
2218
|
}
|
|
213
2219
|
/** Dispatch an operation and log its signature in hisotry */
|
|
214
|
-
async
|
|
215
|
-
const
|
|
216
|
-
[
|
|
217
|
-
[
|
|
218
|
-
[
|
|
219
|
-
[
|
|
220
|
-
[
|
|
221
|
-
[
|
|
222
|
-
[
|
|
223
|
-
|
|
224
|
-
[
|
|
225
|
-
|
|
226
|
-
[
|
|
227
|
-
[
|
|
228
|
-
[
|
|
229
|
-
[
|
|
230
|
-
[
|
|
2220
|
+
async dispatchAction(t, ...r) {
|
|
2221
|
+
const n = {
|
|
2222
|
+
[E.ADD_POINTS]: this._addDataPoints,
|
|
2223
|
+
[E.CHANGE_VALUES]: this._changeValues,
|
|
2224
|
+
[E.ASSIGN_VALUES_BULK]: this._assignValuesBulk,
|
|
2225
|
+
[E.DELETE_POINTS]: this._deleteDataPoints,
|
|
2226
|
+
[E.DRIFT_CORRECTION]: this._driftCorrection,
|
|
2227
|
+
[E.INTERPOLATE]: this._interpolate,
|
|
2228
|
+
[E.SHIFT_DATETIMES]: this._shift,
|
|
2229
|
+
[E.ASSIGN_DATETIMES_BULK]: this._assignDatetimesBulk,
|
|
2230
|
+
[E.FILL_GAPS]: this._fillGaps
|
|
2231
|
+
}, s = {
|
|
2232
|
+
[E.ADD_POINTS]: "mdi-plus",
|
|
2233
|
+
[E.CHANGE_VALUES]: "mdi-pencil",
|
|
2234
|
+
[E.ASSIGN_VALUES_BULK]: "mdi-pencil",
|
|
2235
|
+
[E.DELETE_POINTS]: "mdi-trash-can",
|
|
2236
|
+
[E.DRIFT_CORRECTION]: "mdi-chart-sankey",
|
|
2237
|
+
[E.INTERPOLATE]: "mdi-transit-connection-horizontal",
|
|
2238
|
+
[E.SHIFT_DATETIMES]: "mdi-calendar",
|
|
2239
|
+
[E.ASSIGN_DATETIMES_BULK]: "mdi-calendar",
|
|
2240
|
+
[E.FILL_GAPS]: "mdi-keyboard-space"
|
|
231
2241
|
};
|
|
232
|
-
let
|
|
2242
|
+
let a = [];
|
|
233
2243
|
try {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
this,
|
|
249
|
-
i.args
|
|
250
|
-
));
|
|
251
|
-
i.duration = h.duration, i.isLoading = !1, r.push(h.response);
|
|
252
|
-
}
|
|
253
|
-
} else {
|
|
254
|
-
const o = {
|
|
255
|
-
method: t,
|
|
256
|
-
args: a,
|
|
257
|
-
icon: n[t],
|
|
258
|
-
isLoading: !0
|
|
259
|
-
};
|
|
260
|
-
this.history.push(o);
|
|
261
|
-
const i = await p(async () => await e[t].apply(this, a));
|
|
262
|
-
r = i.response, o.duration = i.duration, o.isLoading = !1;
|
|
263
|
-
}
|
|
2244
|
+
this._isReplaying || (this.redoStack.length = 0);
|
|
2245
|
+
const o = {
|
|
2246
|
+
method: t,
|
|
2247
|
+
args: r,
|
|
2248
|
+
icon: s[t],
|
|
2249
|
+
isLoading: !0
|
|
2250
|
+
};
|
|
2251
|
+
this.history.push(o);
|
|
2252
|
+
const i = this.history.length - 1;
|
|
2253
|
+
this._pendingExecutionMode = "inline";
|
|
2254
|
+
const l = await we(async () => await n[t].apply(this, r));
|
|
2255
|
+
a = l.response;
|
|
2256
|
+
const f = this.history[i];
|
|
2257
|
+
f && (f.duration = l.duration, f.executionMode = this._pendingExecutionMode, f.isLoading = !1);
|
|
264
2258
|
} catch (o) {
|
|
265
2259
|
console.log(
|
|
266
2260
|
`Failed to execute operation: ${t} with arguments: `,
|
|
267
|
-
|
|
2261
|
+
r
|
|
268
2262
|
), console.log(o);
|
|
269
2263
|
}
|
|
270
|
-
return
|
|
2264
|
+
return a;
|
|
2265
|
+
}
|
|
2266
|
+
async dispatch(t, ...r) {
|
|
2267
|
+
const n = async (s, a) => v[s] ? await this.dispatchFilter(s, ...a) : await this.dispatchAction(s, ...a);
|
|
2268
|
+
if (Array.isArray(t)) {
|
|
2269
|
+
let s = [];
|
|
2270
|
+
for (let a = 0; a < t.length; a++) {
|
|
2271
|
+
const o = t[a][0], i = t[a].slice(1, t[a].length);
|
|
2272
|
+
s = await n(o, i);
|
|
2273
|
+
}
|
|
2274
|
+
return s;
|
|
2275
|
+
} else
|
|
2276
|
+
return await n(t, r);
|
|
271
2277
|
}
|
|
272
|
-
/** Filter operations do not transform the data and
|
|
273
|
-
async dispatchFilter(t, ...
|
|
274
|
-
const
|
|
275
|
-
[
|
|
276
|
-
[
|
|
277
|
-
[
|
|
278
|
-
[
|
|
2278
|
+
/** Filter operations do not transform the data and return a selection */
|
|
2279
|
+
async dispatchFilter(t, ...r) {
|
|
2280
|
+
const n = {
|
|
2281
|
+
[v.FIND_GAPS]: this._findGaps,
|
|
2282
|
+
[v.VALUE_THRESHOLD]: this._valueThreshold,
|
|
2283
|
+
[v.DATETIME_RANGE]: this._datetimeRange,
|
|
2284
|
+
[v.PERSISTENCE]: this._persistence,
|
|
2285
|
+
[v.CHANGE]: this._change,
|
|
2286
|
+
[v.RATE_OF_CHANGE]: this._rateOfChange,
|
|
2287
|
+
[v.SELECTION]: this._selection
|
|
2288
|
+
}, s = {
|
|
2289
|
+
[v.FIND_GAPS]: "mdi-plus",
|
|
2290
|
+
[v.PERSISTENCE]: "mdi-plus",
|
|
2291
|
+
[v.CHANGE]: "mdi-plus",
|
|
2292
|
+
[v.RATE_OF_CHANGE]: "mdi-plus",
|
|
2293
|
+
[v.VALUE_THRESHOLD]: "mdi-plus",
|
|
2294
|
+
[v.DATETIME_RANGE]: "mdi-plus",
|
|
2295
|
+
[v.SELECTION]: "mdi-plus"
|
|
279
2296
|
};
|
|
280
|
-
let
|
|
2297
|
+
let a = [];
|
|
281
2298
|
try {
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
2299
|
+
this._isReplaying || (this.redoStack.length = 0);
|
|
2300
|
+
const o = {
|
|
2301
|
+
method: t,
|
|
2302
|
+
args: r,
|
|
2303
|
+
icon: s[t],
|
|
2304
|
+
isLoading: !0
|
|
2305
|
+
}, i = this.history[this.history.length - 1];
|
|
2306
|
+
let l;
|
|
2307
|
+
v[i?.method] ? (l = this.history.length - 1, this.history[l] = o) : (this.history.push(o), l = this.history.length - 1), this._pendingExecutionMode = "inline";
|
|
2308
|
+
const f = await we(async () => await n[t].apply(this, r));
|
|
2309
|
+
a = f.response;
|
|
2310
|
+
const u = this.history[l];
|
|
2311
|
+
u && (u.duration = f.duration, u.executionMode = this._pendingExecutionMode, u.selected = f.response, u.isLoading = !1);
|
|
2312
|
+
} catch (o) {
|
|
290
2313
|
console.log(
|
|
291
2314
|
`Failed to execute filter operation: ${t} with arguments: `,
|
|
292
|
-
|
|
293
|
-
), console.log(
|
|
2315
|
+
r
|
|
2316
|
+
), console.log(o);
|
|
294
2317
|
}
|
|
295
|
-
return
|
|
2318
|
+
return a;
|
|
296
2319
|
}
|
|
297
2320
|
/**
|
|
298
2321
|
* @param index An array containing the list of index of values to perform the operations on.
|
|
299
2322
|
* @param operator The operator that will be applied
|
|
300
2323
|
* @param value The value to use in the operation
|
|
301
|
-
* @returns
|
|
302
|
-
*/
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
2324
|
+
* @returns an array of index values to keep selected in the plot
|
|
2325
|
+
*/
|
|
2326
|
+
/**
|
|
2327
|
+
* Multi-threaded apply of an arithmetic operator to Y at the previously-filtered selection.
|
|
2328
|
+
* 1. Selection is read from the previous history entry (the last entry is this operation itself).
|
|
2329
|
+
* 2. Selection indexes are sharded into disjoint chunks; workers write in place to shared Y.
|
|
2330
|
+
* 3. Writes are conflict-free because the selection carries distinct indexes.
|
|
2331
|
+
*/
|
|
2332
|
+
async _changeValues(t, r) {
|
|
2333
|
+
const n = this.history[this.history.length - 2]?.selected;
|
|
2334
|
+
if (!n || n.length === 0) return [];
|
|
2335
|
+
const s = n.length;
|
|
2336
|
+
if (!U(E.CHANGE_VALUES, {
|
|
2337
|
+
datasetSize: this.dataset.source.y.length,
|
|
2338
|
+
selectionSize: s
|
|
2339
|
+
}).useWorker || s < Gr)
|
|
2340
|
+
return ct(this.dataY, n, t, r), [];
|
|
2341
|
+
this._pendingExecutionMode = "worker";
|
|
2342
|
+
const o = Math.min(navigator.hardwareConcurrency || 1, s), i = Math.ceil(s / o), l = [], f = [];
|
|
2343
|
+
for (let u = 0; u < o; u++) {
|
|
2344
|
+
const p = u * i, g = Math.min((u + 1) * i, s);
|
|
2345
|
+
if (p >= g) break;
|
|
2346
|
+
const y = n.slice(p, g);
|
|
2347
|
+
f.push(
|
|
2348
|
+
new Promise((d) => {
|
|
2349
|
+
const h = new Lr();
|
|
2350
|
+
l.push(h), h.postMessage({
|
|
2351
|
+
bufferY: this.dataY.buffer,
|
|
2352
|
+
indexes: y,
|
|
2353
|
+
operator: t,
|
|
2354
|
+
value: r
|
|
2355
|
+
}), h.onmessage = (b) => {
|
|
2356
|
+
d(b.data);
|
|
2357
|
+
};
|
|
2358
|
+
})
|
|
2359
|
+
);
|
|
2360
|
+
}
|
|
2361
|
+
return await Promise.all(f), l.forEach((u) => u.terminate()), [];
|
|
323
2362
|
}
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
h[o],
|
|
333
|
-
l[o],
|
|
334
|
-
h[i],
|
|
335
|
-
l[i]
|
|
336
|
-
);
|
|
337
|
-
});
|
|
2363
|
+
/**
|
|
2364
|
+
* Apply an arithmetic operator to Y in-place on the main thread. Thin
|
|
2365
|
+
* wrapper around {@link changeValuesCore} kept so `_assignValuesBulk`
|
|
2366
|
+
* and callers outside this module can use the same routine the
|
|
2367
|
+
* CHANGE_VALUES fast path does.
|
|
2368
|
+
*/
|
|
2369
|
+
_applyOperatorInPlace(t, r, n) {
|
|
2370
|
+
ct(this.dataY, t, r, n);
|
|
338
2371
|
}
|
|
339
|
-
/**
|
|
340
|
-
|
|
341
|
-
|
|
2372
|
+
/**
|
|
2373
|
+
* One-shot assignment of distinct Y-values at the indices logged by the
|
|
2374
|
+
* previous SELECTION filter entry. Args: `(values: number[])`, where
|
|
2375
|
+
* `values[i]` is written to `dataY[selection[i]]`. Runs as a single
|
|
2376
|
+
* tight loop on the main thread — no workers, no per-row dispatch
|
|
2377
|
+
* ceremony. Intended for table-driven edits.
|
|
2378
|
+
*
|
|
2379
|
+
* Expected dispatch order (matches CHANGE_VALUES):
|
|
2380
|
+
* [[SELECTION, indices], [ASSIGN_VALUES_BULK, values]]
|
|
2381
|
+
* The SELECTION entry carries the indices for history, so this op does
|
|
2382
|
+
* not log them again.
|
|
2383
|
+
*/
|
|
2384
|
+
async _assignValuesBulk(t) {
|
|
2385
|
+
const r = this.history[this.history.length - 2]?.selected;
|
|
2386
|
+
if (!r || !r.length || !t?.length) return [];
|
|
2387
|
+
const n = Math.min(r.length, t.length), s = this.dataY;
|
|
2388
|
+
for (let a = 0; a < n; a++) s[r[a]] = t[a];
|
|
2389
|
+
return [];
|
|
2390
|
+
}
|
|
2391
|
+
/**
|
|
2392
|
+
* One-shot assignment of distinct datetimes (epoch-ms) at the indices
|
|
2393
|
+
* logged by the previous SELECTION filter entry. Internally: compute
|
|
2394
|
+
* the replacement (x, y) pairs, do a single delete + single add — so
|
|
2395
|
+
* the reindex-and-sort step runs once regardless of how many rows changed.
|
|
2396
|
+
*
|
|
2397
|
+
* Expected dispatch order (matches SHIFT_DATETIMES pattern):
|
|
2398
|
+
* [[SELECTION, indices], [ASSIGN_DATETIMES_BULK, datetimes]]
|
|
2399
|
+
*/
|
|
2400
|
+
async _assignDatetimesBulk(t) {
|
|
2401
|
+
const r = this.history[this.history.length - 2]?.selected;
|
|
2402
|
+
if (!r || !r.length || !t?.length) return [];
|
|
2403
|
+
const n = Math.min(r.length, t.length), s = new Array(n), a = new Array(n);
|
|
2404
|
+
for (let o = 0; o < n; o++)
|
|
2405
|
+
s[o] = [t[o], this.dataY[r[o]]], a[o] = r[o];
|
|
2406
|
+
return a.sort((o, i) => o - i), await this._deleteDataPoints(a), await this._addDataPoints(s), [];
|
|
2407
|
+
}
|
|
2408
|
+
/**
|
|
2409
|
+
* Multi-threaded linear interpolation over the selected indexes.
|
|
2410
|
+
* 1. Main thread partitions the selected indexes into consecutive groups and computes each group's lower/upper anchors.
|
|
2411
|
+
* 2. Groups are sharded across workers (disjoint by construction, so in-place writes are safe).
|
|
2412
|
+
* 3. Each worker writes interpolated Y values directly into the shared Y buffer — no output copy needed since only a subset of Y changes.
|
|
2413
|
+
*/
|
|
2414
|
+
async _interpolate(t) {
|
|
2415
|
+
const r = this._getConsecutiveGroups(t);
|
|
2416
|
+
if (r.length === 0 || r[0].length === 0) return;
|
|
2417
|
+
const n = this.dataset.source.y.length, s = r.map((u) => ({
|
|
2418
|
+
indexes: u,
|
|
2419
|
+
lowerIdx: Math.max(0, u[0] - 1),
|
|
2420
|
+
upperIdx: Math.min(n - 1, u[u.length - 1] + 1)
|
|
2421
|
+
}));
|
|
2422
|
+
if (!U(E.INTERPOLATE, {
|
|
2423
|
+
datasetSize: n,
|
|
2424
|
+
selectionSize: t.length
|
|
2425
|
+
}).useWorker) {
|
|
2426
|
+
Dr(this.dataX, this.dataY, s);
|
|
2427
|
+
return;
|
|
2428
|
+
}
|
|
2429
|
+
this._pendingExecutionMode = "worker";
|
|
2430
|
+
const o = Math.min(
|
|
2431
|
+
navigator.hardwareConcurrency || 1,
|
|
2432
|
+
s.length
|
|
2433
|
+
), i = Math.ceil(s.length / o), l = [], f = [];
|
|
2434
|
+
for (let u = 0; u < o; u++) {
|
|
2435
|
+
const p = s.slice(
|
|
2436
|
+
u * i,
|
|
2437
|
+
(u + 1) * i
|
|
2438
|
+
);
|
|
2439
|
+
if (p.length === 0) break;
|
|
2440
|
+
f.push(
|
|
2441
|
+
new Promise((g) => {
|
|
2442
|
+
const y = new wr();
|
|
2443
|
+
l.push(y), y.postMessage({
|
|
2444
|
+
bufferX: this.dataX.buffer,
|
|
2445
|
+
bufferY: this.dataY.buffer,
|
|
2446
|
+
groups: p
|
|
2447
|
+
}), y.onmessage = (d) => {
|
|
2448
|
+
g(d.data);
|
|
2449
|
+
};
|
|
2450
|
+
})
|
|
2451
|
+
);
|
|
2452
|
+
}
|
|
2453
|
+
await Promise.all(f), l.forEach((u) => u.terminate());
|
|
342
2454
|
}
|
|
2455
|
+
/** Interpolate existing values in the data source */
|
|
2456
|
+
// private _interpolateLinear(
|
|
2457
|
+
// datetime: number,
|
|
2458
|
+
// lowerDatetime: number,
|
|
2459
|
+
// lowerValue: number,
|
|
2460
|
+
// upperDatetime: number,
|
|
2461
|
+
// upperValue: number,
|
|
2462
|
+
// ) {
|
|
2463
|
+
// const interpolatedValue =
|
|
2464
|
+
// lowerValue +
|
|
2465
|
+
// ((datetime - lowerDatetime) * (upperValue - lowerValue)) /
|
|
2466
|
+
// (upperDatetime - lowerDatetime);
|
|
2467
|
+
// return interpolatedValue;
|
|
2468
|
+
// }
|
|
343
2469
|
/**
|
|
344
2470
|
* Shifts the selected indexes by specified amount of units. Elements are reinserted according to their datetime.
|
|
345
2471
|
* @param index The index of the elements to shift
|
|
@@ -347,60 +2473,141 @@ class q {
|
|
|
347
2473
|
* @param unit {@link TimeUnit}
|
|
348
2474
|
* @returns
|
|
349
2475
|
*/
|
|
350
|
-
async _shift(t,
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
2476
|
+
async _shift(t, r, n) {
|
|
2477
|
+
if (t.length === 0) return;
|
|
2478
|
+
const s = n === D.MONTH, a = n === D.YEAR, o = !s && !a ? r * te[n] * 1e3 : 0, i = t.length;
|
|
2479
|
+
if (!U(E.SHIFT_DATETIMES, {
|
|
2480
|
+
datasetSize: this.dataset.source.x.length,
|
|
2481
|
+
selectionSize: i
|
|
2482
|
+
}).useWorker) {
|
|
2483
|
+
const m = xr(
|
|
2484
|
+
this.dataX,
|
|
2485
|
+
this.dataY,
|
|
2486
|
+
t,
|
|
2487
|
+
{ amount: r, isMonth: s, isYear: a, deltaMs: o }
|
|
2488
|
+
);
|
|
2489
|
+
await this._deleteDataPoints(t), await this._addDataPoints(m);
|
|
2490
|
+
return;
|
|
2491
|
+
}
|
|
2492
|
+
this._pendingExecutionMode = "worker";
|
|
2493
|
+
const f = new SharedArrayBuffer(
|
|
2494
|
+
i * Float64Array.BYTES_PER_ELEMENT
|
|
2495
|
+
), u = new SharedArrayBuffer(
|
|
2496
|
+
i * Float32Array.BYTES_PER_ELEMENT
|
|
2497
|
+
), p = Math.min(navigator.hardwareConcurrency || 1, i), g = Math.ceil(i / p), y = [], d = [];
|
|
2498
|
+
for (let m = 0; m < p; m++) {
|
|
2499
|
+
const S = m * g, A = Math.min((m + 1) * g, i);
|
|
2500
|
+
if (S >= A) break;
|
|
2501
|
+
const L = t.slice(S, A);
|
|
2502
|
+
d.push(
|
|
2503
|
+
new Promise((T) => {
|
|
2504
|
+
const I = new Er();
|
|
2505
|
+
y.push(I), I.postMessage({
|
|
368
2506
|
bufferX: this.dataX.buffer,
|
|
369
2507
|
bufferY: this.dataY.buffer,
|
|
370
|
-
outputBufferX:
|
|
371
|
-
outputBufferY:
|
|
372
|
-
|
|
373
|
-
|
|
2508
|
+
outputBufferX: f,
|
|
2509
|
+
outputBufferY: u,
|
|
2510
|
+
indexes: L,
|
|
2511
|
+
outStart: S,
|
|
2512
|
+
amount: r,
|
|
2513
|
+
isMonth: s,
|
|
2514
|
+
isYear: a,
|
|
2515
|
+
deltaMs: o
|
|
2516
|
+
}), I.onmessage = (j) => {
|
|
2517
|
+
T(j.data);
|
|
374
2518
|
};
|
|
375
2519
|
})
|
|
376
2520
|
);
|
|
377
|
-
|
|
2521
|
+
}
|
|
2522
|
+
await Promise.all(d), y.forEach((m) => m.terminate());
|
|
2523
|
+
const h = new Float64Array(f), b = new Float32Array(u), w = new Array(i);
|
|
2524
|
+
for (let m = 0; m < i; m++)
|
|
2525
|
+
w[m] = [h[m], b[m]];
|
|
2526
|
+
await this._deleteDataPoints(t), await this._addDataPoints(w);
|
|
378
2527
|
}
|
|
379
2528
|
/**
|
|
380
|
-
*
|
|
381
|
-
*
|
|
382
|
-
*
|
|
383
|
-
*
|
|
384
|
-
*
|
|
2529
|
+
* Multi-threaded version of {@link _fillGaps}.
|
|
2530
|
+
* 1. The main thread scans once for gaps and computes the number of fill points per gap.
|
|
2531
|
+
* 2. The original array is split into equal segments; each gap is assigned to the segment containing its left index.
|
|
2532
|
+
* 3. Cumulative fill counts before each segment give each worker's output startTarget, ensuring no overlap.
|
|
2533
|
+
* 4. Each worker copies its segment to the output buffer and inserts its gap fills inline.
|
|
385
2534
|
*/
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
this.dataX[i[1]],
|
|
398
|
-
this.dataY[i[1]]
|
|
399
|
-
) : -9999;
|
|
400
|
-
c.push([d, E]), d += u;
|
|
2535
|
+
async _fillGaps(t, r, n, s) {
|
|
2536
|
+
const a = this.dataX.length;
|
|
2537
|
+
if (a === 0) return;
|
|
2538
|
+
const o = t[0] * te[t[1]] * 1e3, i = r[0] * te[r[1]] * 1e3, l = -9999, f = s?.[0] ?? 0, u = s?.[1] ?? a - 1, p = this.dataX, g = [], y = [];
|
|
2539
|
+
let d = 0;
|
|
2540
|
+
for (let k = f + 1; k <= u; k++)
|
|
2541
|
+
if (p[k] - p[k - 1] > o) {
|
|
2542
|
+
let C = 0, W = p[k - 1] + i;
|
|
2543
|
+
for (; W < p[k]; )
|
|
2544
|
+
C++, W += i;
|
|
2545
|
+
C > 0 && (g.push([k - 1, k]), y.push(C), d += C);
|
|
401
2546
|
}
|
|
402
|
-
|
|
2547
|
+
if (d === 0) return;
|
|
2548
|
+
const h = a + d, b = h * Float64Array.BYTES_PER_ELEMENT, w = h * Float32Array.BYTES_PER_ELEMENT, m = new SharedArrayBuffer(b, {
|
|
2549
|
+
maxByteLength: Math.max(this.dataX.buffer.maxByteLength, b)
|
|
2550
|
+
}), S = new SharedArrayBuffer(w, {
|
|
2551
|
+
maxByteLength: Math.max(this.dataY.buffer.maxByteLength, w)
|
|
2552
|
+
});
|
|
2553
|
+
if (!U(E.FILL_GAPS, {
|
|
2554
|
+
datasetSize: a,
|
|
2555
|
+
selectionSize: d
|
|
2556
|
+
}).useWorker) {
|
|
2557
|
+
const k = new Float64Array(m), B = new Float32Array(S);
|
|
2558
|
+
Mr(
|
|
2559
|
+
this.dataX,
|
|
2560
|
+
this.dataY,
|
|
2561
|
+
g,
|
|
2562
|
+
k,
|
|
2563
|
+
B,
|
|
2564
|
+
0,
|
|
2565
|
+
a - 1,
|
|
2566
|
+
0,
|
|
2567
|
+
i,
|
|
2568
|
+
n,
|
|
2569
|
+
l
|
|
2570
|
+
), this.dataset.source.x = k, this.dataset.source.y = B, this._resizeTo(h);
|
|
2571
|
+
return;
|
|
2572
|
+
}
|
|
2573
|
+
this._pendingExecutionMode = "worker";
|
|
2574
|
+
const L = navigator.hardwareConcurrency || 1, T = Math.ceil(a / L), I = [];
|
|
2575
|
+
let j = 0;
|
|
2576
|
+
for (let k = 0; k < L; k++) {
|
|
2577
|
+
const B = k * T, C = Math.min((k + 1) * T - 1, a - 1), W = [];
|
|
2578
|
+
let Z = 0;
|
|
2579
|
+
for (; j < g.length && g[j][0] <= C; )
|
|
2580
|
+
W.push(g[j]), Z += y[j], j++;
|
|
2581
|
+
I.push({ start: B, end: C, gapsSegment: W, fillsInSegment: Z });
|
|
2582
|
+
}
|
|
2583
|
+
const he = new Array(L).fill(0);
|
|
2584
|
+
for (let k = 1; k < L; k++)
|
|
2585
|
+
he[k] = he[k - 1] + I[k - 1].fillsInSegment;
|
|
2586
|
+
const Ce = [], Fe = [];
|
|
2587
|
+
for (let k = 0; k < L; k++) {
|
|
2588
|
+
const { start: B, end: C, gapsSegment: W } = I[k], Z = B + he[k];
|
|
2589
|
+
Fe.push(
|
|
2590
|
+
new Promise((Ct) => {
|
|
2591
|
+
const fe = new mr();
|
|
2592
|
+
Ce.push(fe), fe.postMessage({
|
|
2593
|
+
bufferX: this.dataX.buffer,
|
|
2594
|
+
bufferY: this.dataY.buffer,
|
|
2595
|
+
outputBufferX: m,
|
|
2596
|
+
outputBufferY: S,
|
|
2597
|
+
start: B,
|
|
2598
|
+
end: C,
|
|
2599
|
+
gapsSegment: W,
|
|
2600
|
+
startTarget: Z,
|
|
2601
|
+
fillDelta: i,
|
|
2602
|
+
interpolate: n,
|
|
2603
|
+
fillValue: l
|
|
2604
|
+
}), fe.onmessage = (Ft) => {
|
|
2605
|
+
Ct(Ft.data);
|
|
2606
|
+
};
|
|
2607
|
+
})
|
|
2608
|
+
);
|
|
403
2609
|
}
|
|
2610
|
+
await Promise.all(Fe), Ce.forEach((k) => k.terminate()), this.dataset.source.x = new Float64Array(m), this.dataset.source.y = new Float32Array(S), this._resizeTo(h);
|
|
404
2611
|
}
|
|
405
2612
|
/**
|
|
406
2613
|
Deletes data points from a large array using worker threads.
|
|
@@ -410,42 +2617,64 @@ class q {
|
|
|
410
2617
|
4. Each worker processes its segment linearly, skipping deletions and copying kept elements to their computed positions.
|
|
411
2618
|
* @param deleteIndices
|
|
412
2619
|
*/
|
|
413
|
-
// TODO: implement similar multithread solutions for other operations
|
|
414
2620
|
async _deleteDataPoints(t) {
|
|
415
|
-
const
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
2621
|
+
const r = this.dataX.length, n = r - t.length;
|
|
2622
|
+
if (!U(E.DELETE_POINTS, {
|
|
2623
|
+
datasetSize: r,
|
|
2624
|
+
selectionSize: t.length
|
|
2625
|
+
}).useWorker) {
|
|
2626
|
+
const y = new SharedArrayBuffer(this.dataX.buffer.byteLength, {
|
|
2627
|
+
maxByteLength: this.dataX.buffer.maxByteLength
|
|
2628
|
+
}), d = new SharedArrayBuffer(this.dataY.buffer.byteLength, {
|
|
2629
|
+
maxByteLength: this.dataY.buffer.maxByteLength
|
|
2630
|
+
}), h = new Float64Array(y), b = new Float32Array(d);
|
|
2631
|
+
Or(
|
|
2632
|
+
this.dataX,
|
|
2633
|
+
this.dataY,
|
|
2634
|
+
t,
|
|
2635
|
+
h,
|
|
2636
|
+
b,
|
|
2637
|
+
0,
|
|
2638
|
+
r - 1,
|
|
2639
|
+
0
|
|
2640
|
+
), this.dataset.source.x = h, this.dataset.source.y = b, this._resizeTo(n);
|
|
2641
|
+
return;
|
|
2642
|
+
}
|
|
2643
|
+
this._pendingExecutionMode = "worker";
|
|
2644
|
+
const a = navigator.hardwareConcurrency || 1, o = Math.ceil(this.dataX.length / a), i = [], l = [];
|
|
2645
|
+
for (let y = 0; y < a; y++) {
|
|
2646
|
+
const d = y * o, h = Math.min((y + 1) * o - 1, this.dataX.length - 1), b = re(t, d), w = be(t, h), m = t.slice(b, w + 1);
|
|
2647
|
+
l.push({ start: d, end: h, deleteSegment: m });
|
|
2648
|
+
}
|
|
2649
|
+
const f = new Array(a).fill(0);
|
|
2650
|
+
for (let y = 1; y < a; y++)
|
|
2651
|
+
f[y] = f[y - 1] + l[y - 1].deleteSegment.length;
|
|
2652
|
+
const u = [], p = new SharedArrayBuffer(this.dataX.buffer.byteLength, {
|
|
424
2653
|
maxByteLength: this.dataX.buffer.maxByteLength
|
|
425
|
-
}),
|
|
2654
|
+
}), g = new SharedArrayBuffer(this.dataY.buffer.byteLength, {
|
|
426
2655
|
maxByteLength: this.dataY.buffer.maxByteLength
|
|
427
2656
|
});
|
|
428
|
-
for (let
|
|
429
|
-
const { start: d, end:
|
|
430
|
-
|
|
2657
|
+
for (let y = 0; y < a; y++) {
|
|
2658
|
+
const { start: d, end: h, deleteSegment: b } = l[y], w = d - f[y];
|
|
2659
|
+
u.push(
|
|
431
2660
|
new Promise((m) => {
|
|
432
|
-
const
|
|
433
|
-
|
|
2661
|
+
const S = new gr();
|
|
2662
|
+
i.push(S), S.postMessage({
|
|
434
2663
|
bufferX: this.dataX.buffer,
|
|
435
2664
|
bufferY: this.dataY.buffer,
|
|
436
|
-
outputBufferX:
|
|
437
|
-
outputBufferY:
|
|
2665
|
+
outputBufferX: p,
|
|
2666
|
+
outputBufferY: g,
|
|
438
2667
|
start: d,
|
|
439
|
-
end:
|
|
440
|
-
deleteSegment:
|
|
441
|
-
startTarget:
|
|
442
|
-
}),
|
|
443
|
-
m(
|
|
2668
|
+
end: h,
|
|
2669
|
+
deleteSegment: b,
|
|
2670
|
+
startTarget: w
|
|
2671
|
+
}), S.onmessage = (A) => {
|
|
2672
|
+
m(A.data);
|
|
444
2673
|
};
|
|
445
2674
|
})
|
|
446
2675
|
);
|
|
447
2676
|
}
|
|
448
|
-
await Promise.all(
|
|
2677
|
+
await Promise.all(u), i.forEach((y) => y.terminate()), this.dataset.source.x = new Float64Array(p), this.dataset.source.y = new Float32Array(g), this._resizeTo(n);
|
|
449
2678
|
}
|
|
450
2679
|
/**
|
|
451
2680
|
*
|
|
@@ -453,10 +2682,63 @@ class q {
|
|
|
453
2682
|
* @param end The end index
|
|
454
2683
|
* @param value The drift amount
|
|
455
2684
|
*/
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
2685
|
+
/**
|
|
2686
|
+
* Multi-threaded drift correction over one or more [start, end, value] ranges.
|
|
2687
|
+
* 1. Main thread reads each range's anchors (startDatetime, extent) once and chunks the range.
|
|
2688
|
+
* 2. All chunks across all ranges are flattened into jobs and distributed round-robin across a fixed pool of workers.
|
|
2689
|
+
* 3. Each worker applies y_n = y_0 + value * ((x_i - startDatetime) / extent) in place on its jobs.
|
|
2690
|
+
* 4. Batching all ranges into a single call yields a single history entry.
|
|
2691
|
+
*/
|
|
2692
|
+
async _driftCorrection(t) {
|
|
2693
|
+
if (!t || t.length === 0) return;
|
|
2694
|
+
const r = this.dataset.source.x, n = navigator.hardwareConcurrency || 1;
|
|
2695
|
+
let s = 0;
|
|
2696
|
+
for (const [p, g] of t)
|
|
2697
|
+
g > p && (s += g - p);
|
|
2698
|
+
if (!U(E.DRIFT_CORRECTION, {
|
|
2699
|
+
datasetSize: r.length,
|
|
2700
|
+
selectionSize: s
|
|
2701
|
+
}).useWorker) {
|
|
2702
|
+
Cr(r, this.dataY, t);
|
|
2703
|
+
return;
|
|
2704
|
+
}
|
|
2705
|
+
this._pendingExecutionMode = "worker";
|
|
2706
|
+
const o = [];
|
|
2707
|
+
for (const [p, g, y] of t) {
|
|
2708
|
+
if (g <= p) continue;
|
|
2709
|
+
const d = r[p], h = r[g] - d;
|
|
2710
|
+
if (h === 0) continue;
|
|
2711
|
+
const b = g - p, w = Math.max(1, Math.ceil(b / n));
|
|
2712
|
+
for (let m = p; m < g; m += w)
|
|
2713
|
+
o.push({
|
|
2714
|
+
chunkStart: m,
|
|
2715
|
+
chunkEnd: Math.min(m + w, g),
|
|
2716
|
+
startDatetime: d,
|
|
2717
|
+
value: y,
|
|
2718
|
+
extent: h
|
|
2719
|
+
});
|
|
2720
|
+
}
|
|
2721
|
+
if (o.length === 0) return;
|
|
2722
|
+
const i = Math.min(n, o.length), l = Array.from(
|
|
2723
|
+
{ length: i },
|
|
2724
|
+
() => []
|
|
2725
|
+
);
|
|
2726
|
+
o.forEach((p, g) => l[g % i].push(p));
|
|
2727
|
+
const f = [], u = [];
|
|
2728
|
+
for (const p of l)
|
|
2729
|
+
p.length !== 0 && u.push(
|
|
2730
|
+
new Promise((g) => {
|
|
2731
|
+
const y = new br();
|
|
2732
|
+
f.push(y), y.postMessage({
|
|
2733
|
+
bufferX: this.dataX.buffer,
|
|
2734
|
+
bufferY: this.dataY.buffer,
|
|
2735
|
+
jobs: p
|
|
2736
|
+
}), y.onmessage = (d) => {
|
|
2737
|
+
g(d.data);
|
|
2738
|
+
};
|
|
2739
|
+
})
|
|
2740
|
+
);
|
|
2741
|
+
await Promise.all(u), f.forEach((p) => p.terminate());
|
|
460
2742
|
}
|
|
461
2743
|
/** Traverses the index array and returns groups of consecutive values.
|
|
462
2744
|
* i.e.: `[0, 1, 3, 4, 6] => [[0, 1], [3, 4], [6]]`
|
|
@@ -464,28 +2746,73 @@ class q {
|
|
|
464
2746
|
* @param index: the index array (sorted)
|
|
465
2747
|
*/
|
|
466
2748
|
_getConsecutiveGroups(t) {
|
|
467
|
-
const
|
|
468
|
-
return t.reduce((
|
|
469
|
-
const
|
|
470
|
-
return !
|
|
471
|
-
},
|
|
2749
|
+
const r = [[]];
|
|
2750
|
+
return t.reduce((n, s) => {
|
|
2751
|
+
const a = n[n.length - 1];
|
|
2752
|
+
return !a.length || s == a[a.length - 1] + 1 ? a.push(s) : n.push([s]), n;
|
|
2753
|
+
}, r), r;
|
|
472
2754
|
}
|
|
473
2755
|
/**
|
|
474
|
-
* Adds data points
|
|
475
|
-
*
|
|
2756
|
+
* Adds data points using worker threads.
|
|
2757
|
+
* 1. Main thread sorts insertions by datetime and computes each insertion's target index via binary search on the original X.
|
|
2758
|
+
* 2. The original array is split into equal chunks; each insertion is assigned to the chunk containing its target index.
|
|
2759
|
+
* 3. `firstIns` per chunk doubles as the prefix sum of insertions placed before the chunk, giving each worker its outStart in the output buffer without overlap.
|
|
2760
|
+
* 4. Each worker linearly merges its original slice with its insertion slice (both already sorted by datetime) into the output buffer. Originals win on datetime ties, matching the original `findLastLessOrEqual` semantics.
|
|
476
2761
|
*/
|
|
477
2762
|
async _addDataPoints(t) {
|
|
478
|
-
|
|
479
|
-
this.
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
2763
|
+
if (t.length === 0) return;
|
|
2764
|
+
const r = this.dataX.length, n = r + t.length;
|
|
2765
|
+
t.sort((d, h) => d[0] - h[0]);
|
|
2766
|
+
const s = n * Float64Array.BYTES_PER_ELEMENT, a = n * Float32Array.BYTES_PER_ELEMENT, o = new SharedArrayBuffer(s, {
|
|
2767
|
+
maxByteLength: Math.max(this.dataX.buffer.maxByteLength, s)
|
|
2768
|
+
}), i = new SharedArrayBuffer(a, {
|
|
2769
|
+
maxByteLength: Math.max(this.dataY.buffer.maxByteLength, a)
|
|
2770
|
+
});
|
|
2771
|
+
if (!U(E.ADD_POINTS, {
|
|
2772
|
+
datasetSize: r,
|
|
2773
|
+
selectionSize: t.length
|
|
2774
|
+
}).useWorker) {
|
|
2775
|
+
const d = new Float64Array(o), h = new Float32Array(i);
|
|
2776
|
+
Ur(
|
|
2777
|
+
this.dataX,
|
|
2778
|
+
this.dataY,
|
|
2779
|
+
t,
|
|
2780
|
+
d,
|
|
2781
|
+
h,
|
|
2782
|
+
0,
|
|
2783
|
+
r,
|
|
2784
|
+
0
|
|
2785
|
+
), this.dataset.source.x = d, this.dataset.source.y = h, this._resizeTo(n);
|
|
2786
|
+
return;
|
|
2787
|
+
}
|
|
2788
|
+
this._pendingExecutionMode = "worker";
|
|
2789
|
+
const f = t.map(
|
|
2790
|
+
(d) => be(this.dataX, d[0]) + 1
|
|
2791
|
+
), u = Math.max(
|
|
2792
|
+
1,
|
|
2793
|
+
Math.min(navigator.hardwareConcurrency || 1, Math.max(r, 1))
|
|
2794
|
+
), p = Math.ceil(Math.max(r, 1) / u), g = [], y = [];
|
|
2795
|
+
for (let d = 0; d < u; d++) {
|
|
2796
|
+
const h = d * p, b = Math.min((d + 1) * p, r), w = re(f, h), m = d === u - 1 ? t.length : re(f, b), S = t.slice(w, m), A = h + w;
|
|
2797
|
+
h >= b && S.length === 0 || y.push(
|
|
2798
|
+
new Promise((L) => {
|
|
2799
|
+
const T = new Sr();
|
|
2800
|
+
g.push(T), T.postMessage({
|
|
2801
|
+
bufferX: this.dataX.buffer,
|
|
2802
|
+
bufferY: this.dataY.buffer,
|
|
2803
|
+
outputBufferX: o,
|
|
2804
|
+
outputBufferY: i,
|
|
2805
|
+
origStart: h,
|
|
2806
|
+
origEnd: b,
|
|
2807
|
+
insertions: S,
|
|
2808
|
+
outStart: A
|
|
2809
|
+
}), T.onmessage = (I) => {
|
|
2810
|
+
L(I.data);
|
|
2811
|
+
};
|
|
2812
|
+
})
|
|
2813
|
+
);
|
|
488
2814
|
}
|
|
2815
|
+
await Promise.all(y), g.forEach((d) => d.terminate()), this.dataset.source.x = new Float64Array(o), this.dataset.source.y = new Float32Array(i), this._resizeTo(n);
|
|
489
2816
|
}
|
|
490
2817
|
// =======================
|
|
491
2818
|
// FILTER OPERATIONS
|
|
@@ -493,16 +2820,130 @@ class q {
|
|
|
493
2820
|
/**
|
|
494
2821
|
* Filter by applying a set of logical operations
|
|
495
2822
|
* @param appliedFilters
|
|
2823
|
+
* @returns an array of index values to select in the plot
|
|
2824
|
+
*/
|
|
2825
|
+
/**
|
|
2826
|
+
* Filter by applying a set of logical operations, using worker threads.
|
|
2827
|
+
* 1. Main thread encodes filters as numeric opcodes + thresholds (cheaper than string compares in the hot loop).
|
|
2828
|
+
* 2. Workers scan disjoint chunks of Y; an index is selected if ANY filter matches (short-circuit).
|
|
2829
|
+
* 3. Results from each chunk are concatenated in order to preserve ascending indexes.
|
|
2830
|
+
*
|
|
2831
|
+
* Opcodes: 0=LT, 1=LTE, 2=GT, 3=GTE, 4=E.
|
|
2832
|
+
*/
|
|
2833
|
+
async _valueThreshold(t) {
|
|
2834
|
+
const r = Object.keys(t);
|
|
2835
|
+
if (r.length === 0) return [];
|
|
2836
|
+
const n = {
|
|
2837
|
+
[q.LT]: 0,
|
|
2838
|
+
[q.LTE]: 1,
|
|
2839
|
+
[q.GT]: 2,
|
|
2840
|
+
[q.GTE]: 3,
|
|
2841
|
+
[q.E]: 4
|
|
2842
|
+
}, s = r.map((h) => n[h] ?? 4), a = r.map((h) => t[h]), o = this.dataset.source.y, i = o.length;
|
|
2843
|
+
if (i === 0) return [];
|
|
2844
|
+
if (!U(v.VALUE_THRESHOLD, {
|
|
2845
|
+
datasetSize: i
|
|
2846
|
+
}).useWorker)
|
|
2847
|
+
return Dt(o, 0, i, s, a);
|
|
2848
|
+
this._pendingExecutionMode = "worker";
|
|
2849
|
+
const f = Math.min(navigator.hardwareConcurrency || 1, i), u = Math.ceil(i / f), p = [], g = [];
|
|
2850
|
+
for (let h = 0; h < f; h++) {
|
|
2851
|
+
const b = h * u, w = Math.min((h + 1) * u, i);
|
|
2852
|
+
if (b >= w) break;
|
|
2853
|
+
g.push(
|
|
2854
|
+
new Promise((m) => {
|
|
2855
|
+
const S = new $e();
|
|
2856
|
+
p.push(S), S.postMessage({
|
|
2857
|
+
bufferY: this.dataY.buffer,
|
|
2858
|
+
start: b,
|
|
2859
|
+
end: w,
|
|
2860
|
+
ops: s,
|
|
2861
|
+
values: a
|
|
2862
|
+
}), S.onmessage = (A) => {
|
|
2863
|
+
m(A.data);
|
|
2864
|
+
};
|
|
2865
|
+
})
|
|
2866
|
+
);
|
|
2867
|
+
}
|
|
2868
|
+
const y = await Promise.all(g);
|
|
2869
|
+
p.forEach((h) => h.terminate());
|
|
2870
|
+
const d = [];
|
|
2871
|
+
for (let h = 0; h < y.length; h++) {
|
|
2872
|
+
const b = y[h];
|
|
2873
|
+
for (let w = 0; w < b.length; w++) d.push(b[w]);
|
|
2874
|
+
}
|
|
2875
|
+
return d;
|
|
2876
|
+
}
|
|
2877
|
+
/**
|
|
2878
|
+
*
|
|
2879
|
+
* @param comparator
|
|
2880
|
+
* @param value
|
|
496
2881
|
* @returns
|
|
497
2882
|
*/
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
2883
|
+
/**
|
|
2884
|
+
* Find points where the relative rate `(curr - prev) / |prev|` satisfies the comparator, using worker threads.
|
|
2885
|
+
* 1. Main thread partitions scan range [1, dataY.length) into chunks; `Y[i-1]` is safely read from the shared buffer across chunk boundaries.
|
|
2886
|
+
* 2. Each worker runs a hoisted branch matching the comparator and returns matching indexes in ascending order.
|
|
2887
|
+
* 3. Main thread concatenates results in chunk order, preserving ascending order.
|
|
2888
|
+
*/
|
|
2889
|
+
async _rateOfChange(t, r) {
|
|
2890
|
+
const n = this.dataset.source.y;
|
|
2891
|
+
if (n.length < 2) return [];
|
|
2892
|
+
const s = 1, a = n.length, o = a - s;
|
|
2893
|
+
if (!U(v.RATE_OF_CHANGE, {
|
|
2894
|
+
datasetSize: n.length
|
|
2895
|
+
}).useWorker)
|
|
2896
|
+
return $r(n, s, a, t, r);
|
|
2897
|
+
this._pendingExecutionMode = "worker";
|
|
2898
|
+
const l = Math.min(navigator.hardwareConcurrency || 1, o), f = Math.ceil(o / l), u = [], p = [];
|
|
2899
|
+
for (let d = 0; d < l; d++) {
|
|
2900
|
+
const h = s + d * f, b = Math.min(s + (d + 1) * f, a);
|
|
2901
|
+
if (h >= b) break;
|
|
2902
|
+
p.push(
|
|
2903
|
+
new Promise((w) => {
|
|
2904
|
+
const m = new Ar();
|
|
2905
|
+
u.push(m), m.postMessage({
|
|
2906
|
+
bufferY: this.dataY.buffer,
|
|
2907
|
+
start: h,
|
|
2908
|
+
end: b,
|
|
2909
|
+
comparator: t,
|
|
2910
|
+
value: r
|
|
2911
|
+
}), m.onmessage = (S) => {
|
|
2912
|
+
w(S.data);
|
|
2913
|
+
};
|
|
2914
|
+
})
|
|
2915
|
+
);
|
|
2916
|
+
}
|
|
2917
|
+
const g = await Promise.all(p);
|
|
2918
|
+
u.forEach((d) => d.terminate());
|
|
2919
|
+
const y = [];
|
|
2920
|
+
for (let d = 0; d < g.length; d++) {
|
|
2921
|
+
const h = g[d];
|
|
2922
|
+
for (let b = 0; b < h.length; b++) y.push(h[b]);
|
|
2923
|
+
}
|
|
2924
|
+
return y;
|
|
2925
|
+
}
|
|
2926
|
+
/**
|
|
2927
|
+
* Select all points whose datetime falls inside `[from, to]` (inclusive).
|
|
2928
|
+
* `dataX` is sorted ascending, so binary search bounds the range in
|
|
2929
|
+
* O(log n) — no workers required. Pass `undefined` for either bound to
|
|
2930
|
+
* leave that side unconstrained; omitting both selects the full series.
|
|
2931
|
+
*/
|
|
2932
|
+
async _datetimeRange(t, r) {
|
|
2933
|
+
const n = this.dataset.source.x, s = n.length;
|
|
2934
|
+
if (s === 0) return [];
|
|
2935
|
+
const a = t == null ? 0 : re(n, t), o = r == null ? s - 1 : be(n, r);
|
|
2936
|
+
if (a > o) return [];
|
|
2937
|
+
const i = new Array(o - a + 1);
|
|
2938
|
+
for (let l = a; l <= o; l++) i[l - a] = l;
|
|
2939
|
+
return i;
|
|
2940
|
+
}
|
|
2941
|
+
/**
|
|
2942
|
+
* @param index
|
|
2943
|
+
* @returns
|
|
2944
|
+
*/
|
|
2945
|
+
async _selection(t) {
|
|
2946
|
+
return (!t || !t.length) && this.history.pop(), t;
|
|
506
2947
|
}
|
|
507
2948
|
/**
|
|
508
2949
|
*
|
|
@@ -510,57 +2951,227 @@ class q {
|
|
|
510
2951
|
* @param value
|
|
511
2952
|
* @returns
|
|
512
2953
|
*/
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
2954
|
+
/**
|
|
2955
|
+
* Find points where the change from the previous value satisfies the comparator, using worker threads.
|
|
2956
|
+
* 1. Main thread partitions scan range [1, dataY.length) into chunks (each chunk's first index safely reads Y[i-1] from the shared buffer).
|
|
2957
|
+
* 2. Each worker runs a hoisted branch matching the comparator and returns matching indexes in ascending order.
|
|
2958
|
+
* 3. Main thread concatenates results in chunk order, preserving ascending order.
|
|
2959
|
+
*/
|
|
2960
|
+
async _change(t, r) {
|
|
2961
|
+
const n = this.dataset.source.y;
|
|
2962
|
+
if (n.length < 2) return [];
|
|
2963
|
+
const s = 1, a = n.length, o = a - s;
|
|
2964
|
+
if (!U(v.CHANGE, {
|
|
2965
|
+
datasetSize: n.length
|
|
2966
|
+
}).useWorker)
|
|
2967
|
+
return Tr(n, s, a, t, r);
|
|
2968
|
+
this._pendingExecutionMode = "worker";
|
|
2969
|
+
const l = Math.min(navigator.hardwareConcurrency || 1, o), f = Math.ceil(o / l), u = [], p = [];
|
|
2970
|
+
for (let d = 0; d < l; d++) {
|
|
2971
|
+
const h = s + d * f, b = Math.min(s + (d + 1) * f, a);
|
|
2972
|
+
if (h >= b) break;
|
|
2973
|
+
p.push(
|
|
2974
|
+
new Promise((w) => {
|
|
2975
|
+
const m = new _r();
|
|
2976
|
+
u.push(m), m.postMessage({
|
|
2977
|
+
bufferY: this.dataY.buffer,
|
|
2978
|
+
start: h,
|
|
2979
|
+
end: b,
|
|
2980
|
+
comparator: t,
|
|
2981
|
+
value: r
|
|
2982
|
+
}), m.onmessage = (S) => {
|
|
2983
|
+
w(S.data);
|
|
2984
|
+
};
|
|
2985
|
+
})
|
|
2986
|
+
);
|
|
2987
|
+
}
|
|
2988
|
+
const g = await Promise.all(p);
|
|
2989
|
+
u.forEach((d) => d.terminate());
|
|
2990
|
+
const y = [];
|
|
2991
|
+
for (let d = 0; d < g.length; d++) {
|
|
2992
|
+
const h = g[d];
|
|
2993
|
+
for (let b = 0; b < h.length; b++) y.push(h[b]);
|
|
521
2994
|
}
|
|
522
|
-
return
|
|
2995
|
+
return y;
|
|
523
2996
|
}
|
|
524
2997
|
/**
|
|
525
|
-
* Find gaps in the data
|
|
2998
|
+
* Find gaps in the data using worker threads.
|
|
2999
|
+
* 1. Main thread slices the scan range [start, end] into equal chunks with a 1-index overlap so adjacent workers observe the boundary delta correctly.
|
|
3000
|
+
* 2. Each worker scans its chunk and returns a flat list of [leftIdx, rightIdx] pairs for gaps whose delta exceeds the threshold.
|
|
3001
|
+
* 3. Main thread collects all pairs and dedups via Set — identical return shape to the original implementation.
|
|
526
3002
|
* @param value The time value
|
|
527
3003
|
* @param unit The time unit (TimeUnit)
|
|
528
3004
|
* @param range If specified, the gaps will be found only within the range
|
|
529
|
-
* @returns
|
|
530
3005
|
*/
|
|
531
|
-
_findGaps(t,
|
|
532
|
-
const
|
|
533
|
-
let
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
3006
|
+
async _findGaps(t, r, n) {
|
|
3007
|
+
const s = this.dataset.source.x;
|
|
3008
|
+
let a = 0, o = s.length;
|
|
3009
|
+
if (n?.[0] && n?.[1] && (a = n[0], o = n[1]), o <= a) return [];
|
|
3010
|
+
const i = t * te[r] * 1e3;
|
|
3011
|
+
if (!U(v.FIND_GAPS, {
|
|
3012
|
+
datasetSize: o - a
|
|
3013
|
+
}).useWorker) {
|
|
3014
|
+
const b = Rr(s, a, o - 1, i), w = /* @__PURE__ */ new Set();
|
|
3015
|
+
for (let m = 0; m < b.length; m++) w.add(b[m]);
|
|
3016
|
+
return [...w];
|
|
3017
|
+
}
|
|
3018
|
+
this._pendingExecutionMode = "worker";
|
|
3019
|
+
const f = o - a, u = Math.min(navigator.hardwareConcurrency || 1, f), p = Math.ceil(f / u), g = [], y = [];
|
|
3020
|
+
for (let b = 0; b < u; b++) {
|
|
3021
|
+
const w = a + b * p, m = Math.min(a + (b + 1) * p, o);
|
|
3022
|
+
if (w >= m) break;
|
|
3023
|
+
y.push(
|
|
3024
|
+
new Promise((S) => {
|
|
3025
|
+
const A = new kr();
|
|
3026
|
+
g.push(A), A.postMessage({
|
|
3027
|
+
bufferX: this.dataX.buffer,
|
|
3028
|
+
start: w,
|
|
3029
|
+
endInclusive: m,
|
|
3030
|
+
threshold: i
|
|
3031
|
+
}), A.onmessage = (L) => {
|
|
3032
|
+
S(L.data);
|
|
3033
|
+
};
|
|
3034
|
+
})
|
|
3035
|
+
);
|
|
539
3036
|
}
|
|
540
|
-
|
|
3037
|
+
const d = await Promise.all(y);
|
|
3038
|
+
g.forEach((b) => b.terminate());
|
|
3039
|
+
const h = /* @__PURE__ */ new Set();
|
|
3040
|
+
for (let b = 0; b < d.length; b++) {
|
|
3041
|
+
const w = d[b];
|
|
3042
|
+
for (let m = 0; m < w.length; m++) h.add(w[m]);
|
|
3043
|
+
}
|
|
3044
|
+
return [...h];
|
|
541
3045
|
}
|
|
542
3046
|
/**
|
|
543
|
-
* Find points where the values are the same at least
|
|
544
|
-
*
|
|
3047
|
+
* Find points where the values are the same at least `times` in a row, using worker threads.
|
|
3048
|
+
* 1. Main thread splits [start, end) into chunks and each worker emits its maximal runs of equal Y values as flat (startIndex, length, value) triplets.
|
|
3049
|
+
* 2. Main thread stitches runs that cross chunk boundaries (same value, adjacent indexes).
|
|
3050
|
+
* 3. Every run whose stitched length is >= `times` contributes all of its indexes to the selection.
|
|
3051
|
+
*
|
|
3052
|
+
* Matches the Python reference implementation in `edit_service.py::persistence` — every member of a qualifying run is selected (including the run's first index).
|
|
3053
|
+
* @param times The minimum run length to qualify
|
|
545
3054
|
* @param range If specified, the points will be found only within the range
|
|
546
|
-
* @returns
|
|
547
3055
|
*/
|
|
548
|
-
_persistence(t,
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
3056
|
+
async _persistence(t, r) {
|
|
3057
|
+
const n = this.dataset.source.y;
|
|
3058
|
+
let s = 0, a = n.length;
|
|
3059
|
+
if (r?.[0] && r?.[1] && (s = r[0], a = r[1]), a <= s) return [];
|
|
3060
|
+
const o = a - s;
|
|
3061
|
+
if (!U(v.PERSISTENCE, {
|
|
3062
|
+
datasetSize: o
|
|
3063
|
+
}).useWorker) {
|
|
3064
|
+
const w = Ir(n, s, a), m = [];
|
|
3065
|
+
for (let S = 0; S < w.length; S += 3) {
|
|
3066
|
+
const A = w[S], L = w[S + 1];
|
|
3067
|
+
if (L >= t)
|
|
3068
|
+
for (let T = 0; T < L; T++) m.push(A + T);
|
|
3069
|
+
}
|
|
3070
|
+
return m;
|
|
3071
|
+
}
|
|
3072
|
+
this._pendingExecutionMode = "worker";
|
|
3073
|
+
const l = Math.min(navigator.hardwareConcurrency || 1, o), f = Math.ceil(o / l), u = [], p = [];
|
|
3074
|
+
for (let w = 0; w < l; w++) {
|
|
3075
|
+
const m = s + w * f, S = Math.min(s + (w + 1) * f, a);
|
|
3076
|
+
if (m >= S) break;
|
|
3077
|
+
p.push(
|
|
3078
|
+
new Promise((A) => {
|
|
3079
|
+
const L = new vr();
|
|
3080
|
+
u.push(L), L.postMessage({
|
|
3081
|
+
bufferY: this.dataY.buffer,
|
|
3082
|
+
start: m,
|
|
3083
|
+
end: S
|
|
3084
|
+
}), L.onmessage = (T) => {
|
|
3085
|
+
A(T.data);
|
|
3086
|
+
};
|
|
3087
|
+
})
|
|
3088
|
+
);
|
|
3089
|
+
}
|
|
3090
|
+
const g = await Promise.all(p);
|
|
3091
|
+
u.forEach((w) => w.terminate());
|
|
3092
|
+
const y = [], d = [], h = [];
|
|
3093
|
+
for (let w = 0; w < g.length; w++) {
|
|
3094
|
+
const m = g[w];
|
|
3095
|
+
for (let S = 0; S < m.length; S += 3) {
|
|
3096
|
+
const A = m[S], L = m[S + 1], T = m[S + 2], I = y.length - 1;
|
|
3097
|
+
I >= 0 && h[I] === T && y[I] + d[I] === A ? d[I] += L : (y.push(A), d.push(L), h.push(T));
|
|
3098
|
+
}
|
|
3099
|
+
}
|
|
3100
|
+
const b = [];
|
|
3101
|
+
for (let w = 0; w < y.length; w++) {
|
|
3102
|
+
const m = d[w];
|
|
3103
|
+
if (m >= t) {
|
|
3104
|
+
const S = y[w];
|
|
3105
|
+
for (let A = 0; A < m; A++) b.push(S + A);
|
|
3106
|
+
}
|
|
3107
|
+
}
|
|
3108
|
+
return b;
|
|
555
3109
|
}
|
|
556
3110
|
}
|
|
557
3111
|
export {
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
3112
|
+
x as ACCOUNT_BASE,
|
|
3113
|
+
Me as AUTH_BASE,
|
|
3114
|
+
rn as ApiKey,
|
|
3115
|
+
O as BASE_URL,
|
|
3116
|
+
sn as Collaborator,
|
|
3117
|
+
mt as DEFAULT_SNACK_DURATION,
|
|
3118
|
+
on as DataSource,
|
|
3119
|
+
Xr as Datastream,
|
|
3120
|
+
E as EnumEditOperations,
|
|
3121
|
+
v as EnumFilterOperations,
|
|
3122
|
+
q as FilterOperation,
|
|
3123
|
+
Nt as HydroShareArchive,
|
|
3124
|
+
Q as INCREASE_AMOUNT,
|
|
3125
|
+
jt as Location,
|
|
3126
|
+
Bt as LogicalOperation,
|
|
3127
|
+
tn as OAuthProvider,
|
|
3128
|
+
bn as ObservationRecord,
|
|
3129
|
+
Jr as ObservedProperty,
|
|
3130
|
+
Pt as Operator,
|
|
3131
|
+
Zr as Organization,
|
|
3132
|
+
ae as PROVIDER_BASE,
|
|
3133
|
+
ln as Payload,
|
|
3134
|
+
Wt as PermissionAction,
|
|
3135
|
+
Gt as PermissionResource,
|
|
3136
|
+
nr as Position,
|
|
3137
|
+
Hr as PostHydroShareArchive,
|
|
3138
|
+
Kr as ProcessingLevel,
|
|
3139
|
+
Qr as ResultQualifier,
|
|
3140
|
+
ge as SESSION_BASE,
|
|
3141
|
+
qr as Sensor,
|
|
3142
|
+
sr as Snack,
|
|
3143
|
+
wt as SnackColor,
|
|
3144
|
+
bt as SnackIcon,
|
|
3145
|
+
St as SnackTitle,
|
|
3146
|
+
or as Snackbar,
|
|
3147
|
+
qe as TAG_BASE,
|
|
3148
|
+
_ as THINGS_BASE,
|
|
3149
|
+
zr as Thing,
|
|
3150
|
+
D as TimeUnit,
|
|
3151
|
+
Vr as Unit,
|
|
3152
|
+
en as User,
|
|
3153
|
+
nn as Workspace,
|
|
3154
|
+
cn as api,
|
|
3155
|
+
c as apiMethods,
|
|
3156
|
+
mn as clearCalibration,
|
|
3157
|
+
Et as createPatchObject,
|
|
3158
|
+
wn as ensureCalibration,
|
|
3159
|
+
Yt as extractErrorMessage,
|
|
3160
|
+
re as findFirstGreaterOrEqual,
|
|
3161
|
+
be as findLastLessOrEqual,
|
|
3162
|
+
un as formatDate,
|
|
3163
|
+
hn as formatDuration,
|
|
3164
|
+
lt as getCSRFToken,
|
|
3165
|
+
pn as getCalibration,
|
|
3166
|
+
yn as getLastBenchmarkDetail,
|
|
3167
|
+
an as getObservationsEndpoint,
|
|
3168
|
+
gn as getOperationTable,
|
|
3169
|
+
we as measureEllapsedTime,
|
|
3170
|
+
dn as onCalibrationChange,
|
|
3171
|
+
ut as requestInterceptor,
|
|
3172
|
+
ht as responseInterceptor,
|
|
3173
|
+
Nr as runBenchmarks,
|
|
3174
|
+
U as shouldUseWorker,
|
|
3175
|
+
fn as subtractHours,
|
|
3176
|
+
te as timeUnitMultipliers
|
|
566
3177
|
};
|