u8-mqtt 0.4.0 → 0.5.0
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 +3 -3
- package/cjs/basic-v4.cjs +107 -146
- package/cjs/basic-v4.cjs.map +1 -1
- package/cjs/basic-v5.cjs +106 -145
- package/cjs/basic-v5.cjs.map +1 -1
- package/cjs/index.cjs +163 -206
- package/cjs/index.cjs.map +1 -1
- package/cjs/v4.cjs +164 -207
- package/cjs/v4.cjs.map +1 -1
- package/cjs/v5.cjs +163 -206
- package/cjs/v5.cjs.map +1 -1
- package/code/_dispatch.jsy +16 -0
- package/code/base.jsy +72 -133
- package/code/core.jsy +15 -9
- package/code/router_path.jsy +38 -51
- package/code/with_topic_router.jsy +20 -11
- package/esm/basic-v4.js +1154 -0
- package/esm/basic-v4.js.map +1 -0
- package/esm/basic-v5.js +1416 -0
- package/esm/basic-v5.js.map +1 -0
- package/esm/deno/basic-v4.js +107 -146
- package/esm/deno/basic-v4.js.map +1 -1
- package/esm/deno/basic-v5.js +106 -145
- package/esm/deno/basic-v5.js.map +1 -1
- package/esm/deno/index.js +163 -206
- package/esm/deno/index.js.map +1 -1
- package/esm/deno/v4.js +164 -207
- package/esm/deno/v4.js.map +1 -1
- package/esm/deno/v5.js +163 -206
- package/esm/deno/v5.js.map +1 -1
- package/esm/index.js +1599 -0
- package/esm/index.js.map +1 -0
- package/esm/node/basic-v4.js +107 -146
- package/esm/node/basic-v4.js.map +1 -1
- package/esm/node/basic-v4.mjs +107 -146
- package/esm/node/basic-v4.mjs.map +1 -1
- package/esm/node/basic-v5.js +106 -145
- package/esm/node/basic-v5.js.map +1 -1
- package/esm/node/basic-v5.mjs +106 -145
- package/esm/node/basic-v5.mjs.map +1 -1
- package/esm/node/index.js +163 -206
- package/esm/node/index.js.map +1 -1
- package/esm/node/index.mjs +163 -206
- package/esm/node/index.mjs.map +1 -1
- package/esm/node/v4.js +164 -207
- package/esm/node/v4.js.map +1 -1
- package/esm/node/v4.mjs +164 -207
- package/esm/node/v4.mjs.map +1 -1
- package/esm/node/v5.js +163 -206
- package/esm/node/v5.js.map +1 -1
- package/esm/node/v5.mjs +163 -206
- package/esm/node/v5.mjs.map +1 -1
- package/esm/v4.js +1336 -0
- package/esm/v4.js.map +1 -0
- package/esm/v5.js +1599 -0
- package/esm/v5.js.map +1 -0
- package/esm/web/basic-v4.js +107 -146
- package/esm/web/basic-v4.js.map +1 -1
- package/esm/web/basic-v4.min.js +1 -1
- package/esm/web/basic-v4.min.js.br +0 -0
- package/esm/web/basic-v4.min.js.gz +0 -0
- package/esm/web/basic-v5.js +106 -145
- package/esm/web/basic-v5.js.map +1 -1
- package/esm/web/basic-v5.min.js +1 -1
- package/esm/web/basic-v5.min.js.br +0 -0
- package/esm/web/basic-v5.min.js.gz +0 -0
- package/esm/web/index.js +163 -206
- package/esm/web/index.js.map +1 -1
- package/esm/web/index.min.js +1 -1
- package/esm/web/index.min.js.br +0 -0
- package/esm/web/index.min.js.gz +0 -0
- package/esm/web/v4.js +164 -207
- package/esm/web/v4.js.map +1 -1
- package/esm/web/v4.min.js +1 -1
- package/esm/web/v4.min.js.br +0 -0
- package/esm/web/v4.min.js.gz +0 -0
- package/esm/web/v5.js +163 -206
- package/esm/web/v5.js.map +1 -1
- package/esm/web/v5.min.js +1 -1
- package/esm/web/v5.min.js.br +0 -0
- package/esm/web/v5.min.js.gz +0 -0
- package/package.json +7 -8
package/esm/web/basic-v5.js
CHANGED
|
@@ -147,7 +147,7 @@ class mqtt_reader_v4 {
|
|
|
147
147
|
|
|
148
148
|
}
|
|
149
149
|
|
|
150
|
-
|
|
150
|
+
let mqtt_reader_v5$1 = class mqtt_reader_v5 extends mqtt_reader_v4 {
|
|
151
151
|
props() {
|
|
152
152
|
let {buf, step} = this;
|
|
153
153
|
let [n, vi, vi0] = decode_varint$1(buf, step.k|0);
|
|
@@ -182,7 +182,7 @@ class mqtt_reader_v5$1 extends mqtt_reader_v4 {
|
|
|
182
182
|
: buf.subarray(vi, step.k|0)
|
|
183
183
|
}
|
|
184
184
|
*/
|
|
185
|
-
}
|
|
185
|
+
};
|
|
186
186
|
|
|
187
187
|
function mqtt_reader_info(mqtt_reader, ... info_fn_list) {
|
|
188
188
|
mqtt_reader = class extends mqtt_reader {
|
|
@@ -1027,6 +1027,22 @@ const _mqtt_cmdid_dispatch ={
|
|
|
1027
1027
|
|
|
1028
1028
|
await fn?.call(target, pkt, ctx);} })()) };
|
|
1029
1029
|
|
|
1030
|
+
/*
|
|
1031
|
+
on_mqtt_type = {
|
|
1032
|
+
mqtt_auth(pkt, ctx) ::
|
|
1033
|
+
mqtt_connect(pkt, ctx) ::
|
|
1034
|
+
mqtt_connack(pkt, ctx) ::
|
|
1035
|
+
mqtt_disconnect(pkt, ctx) ::
|
|
1036
|
+
|
|
1037
|
+
mqtt_publish(pkt, ctx)
|
|
1038
|
+
mqtt_subscribe(pkt, ctx) ::
|
|
1039
|
+
mqtt_unsubscribe(pkt, ctx) ::
|
|
1040
|
+
|
|
1041
|
+
mqtt_pingreq(pkt, ctx) ::
|
|
1042
|
+
mqtt_pingresp(pkt, ctx) ::
|
|
1043
|
+
}
|
|
1044
|
+
*/
|
|
1045
|
+
|
|
1030
1046
|
function _mqtt_dispatch(opt, target) {
|
|
1031
1047
|
let _disp_ = _mqtt_cmdid_dispatch.create(target);
|
|
1032
1048
|
let { cmdids } = _disp_;
|
|
@@ -1056,28 +1072,34 @@ class MQTTError extends Error {
|
|
|
1056
1072
|
|
|
1057
1073
|
class MQTTBase {
|
|
1058
1074
|
constructor(opt={}) {
|
|
1075
|
+
this.with(opt);
|
|
1059
1076
|
this._conn_ = _mqtt_conn(this,
|
|
1060
1077
|
this._init_dispatch(opt, this)); }
|
|
1061
1078
|
|
|
1079
|
+
with(fns_ns) {
|
|
1080
|
+
for (let [k,v] of Object.entries(fns_ns)) {
|
|
1081
|
+
if ('function' === typeof v) {this[k] = v;} }
|
|
1082
|
+
return this}
|
|
1083
|
+
|
|
1062
1084
|
async conn_emit(evt, arg, err_arg) {
|
|
1063
1085
|
this.log_conn?.(evt, arg, err_arg);
|
|
1064
1086
|
try {
|
|
1065
|
-
let fn_evt = this[await evt]; // microtask break
|
|
1087
|
+
let fn_evt = this[await evt]; // microtask break using `await evt`
|
|
1066
1088
|
if (fn_evt) {
|
|
1067
1089
|
await fn_evt.call(this, this, arg, err_arg);}
|
|
1068
|
-
else if (err_arg) {
|
|
1069
|
-
await this.on_error(err_arg, evt);} }
|
|
1090
|
+
else if (err_arg) {throw err_arg} }
|
|
1070
1091
|
catch (err) {
|
|
1071
1092
|
this.on_error(err, evt);} }
|
|
1072
1093
|
|
|
1073
|
-
on_error(err,
|
|
1074
|
-
console.warn('[[u8-mqtt error: %s]]',
|
|
1094
|
+
on_error(err, evt) {
|
|
1095
|
+
console.warn('[[u8-mqtt error: %s]]', evt, err); }
|
|
1075
1096
|
|
|
1076
1097
|
// Handshaking Packets
|
|
1077
1098
|
|
|
1078
1099
|
async connect(pkt={}) {
|
|
1079
|
-
let cid = pkt.client_id ||
|
|
1080
|
-
if (
|
|
1100
|
+
let cid = pkt.client_id || this.client_id;
|
|
1101
|
+
if ('string' !== typeof cid) {
|
|
1102
|
+
// see init_client_id implementation in core.jsy
|
|
1081
1103
|
pkt.client_id = cid = this.init_client_id(cid);}
|
|
1082
1104
|
this.client_id = cid;
|
|
1083
1105
|
|
|
@@ -1103,12 +1125,13 @@ class MQTTBase {
|
|
|
1103
1125
|
return this._send('auth', pkt, 'auth')}
|
|
1104
1126
|
|
|
1105
1127
|
ping() {return this._send('pingreq', null, 'pingresp')}
|
|
1106
|
-
|
|
1128
|
+
puback({pkt_id}) {return this._send('puback', {pkt_id})}
|
|
1107
1129
|
|
|
1108
1130
|
// alias: sub
|
|
1109
1131
|
subscribe(pkt, ex, topic_prefix) {
|
|
1110
1132
|
pkt = _as_topics(pkt, ex, topic_prefix);
|
|
1111
|
-
|
|
1133
|
+
let suback = this._send('subscribe', pkt, pkt);
|
|
1134
|
+
return this.on_sub?.(suback, pkt) ?? suback}
|
|
1112
1135
|
|
|
1113
1136
|
// alias: unsub
|
|
1114
1137
|
unsubscribe(pkt, ex, topic_prefix) {
|
|
@@ -1116,48 +1139,52 @@ class MQTTBase {
|
|
|
1116
1139
|
return this._send('unsubscribe', pkt, pkt)}
|
|
1117
1140
|
|
|
1118
1141
|
|
|
1119
|
-
//
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
store(topic, payload, pub_opt) {
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
obj_send(topic, msg, pub_opt) {
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1142
|
+
post(topic, payload, pub_opt) {// qos:0
|
|
1143
|
+
return this.pub({topic, payload, qos:0}, pub_opt)}
|
|
1144
|
+
send(topic, payload, pub_opt) {// qos:1
|
|
1145
|
+
return this.pub({topic, payload, qos:1}, pub_opt)}
|
|
1146
|
+
store(topic, payload, pub_opt) {// qos:1, retain: 1
|
|
1147
|
+
return this.pub({topic, payload, qos:1, retain: 1}, pub_opt)}
|
|
1148
|
+
|
|
1149
|
+
// alias: json_post
|
|
1150
|
+
obj_post(topic, msg, pub_opt) {// qos:0
|
|
1151
|
+
return this.pub({topic, msg, arg: 'msg', qos:0}, pub_opt)}
|
|
1152
|
+
// alias: json_send
|
|
1153
|
+
obj_send(topic, msg, pub_opt) {// qos:1
|
|
1154
|
+
return this.pub({topic, msg, arg: 'msg', qos:1}, pub_opt)}
|
|
1155
|
+
// alias: json_store
|
|
1156
|
+
obj_store(topic, msg, pub_opt) {// qos:1, retain: 1
|
|
1157
|
+
return this.pub({topic, msg, arg: 'msg', qos:1, retain: 1}, pub_opt)}
|
|
1158
|
+
|
|
1159
|
+
// alias: publish -- because 'pub' is shorter for semantic aliases above
|
|
1160
|
+
async pub(pkt, pub_opt) {
|
|
1161
|
+
if (undefined === pkt.payload) {
|
|
1162
|
+
if ('function' === typeof pub_opt) {
|
|
1163
|
+
pub_opt = {fn_encode: pub_opt};}
|
|
1164
|
+
|
|
1165
|
+
let {msg} = pkt;
|
|
1166
|
+
switch (typeof msg) {
|
|
1167
|
+
case 'function':
|
|
1168
|
+
pub_opt = {...pub_opt, fn_encode: msg};
|
|
1169
|
+
// flow into 'undefined' case
|
|
1170
|
+
case 'undefined':
|
|
1171
|
+
// return a single-value closure to publish packets
|
|
1172
|
+
return v => this.pub({...pkt, [pkt.arg || 'payload']: v}, pub_opt)}
|
|
1173
|
+
|
|
1174
|
+
// Encode payload from msg; fn_encode allows alternative to JSON.stringify
|
|
1175
|
+
let {fn_encode} = pub_opt || {};
|
|
1176
|
+
pkt.payload = fn_encode
|
|
1177
|
+
? await fn_encode(msg)
|
|
1178
|
+
: JSON.stringify(msg);}
|
|
1179
|
+
|
|
1180
|
+
if (pub_opt) {
|
|
1181
|
+
if (pub_opt.props) {
|
|
1182
|
+
pkt.props = pub_opt.props;}
|
|
1183
|
+
if (pub_opt.xform) {
|
|
1184
|
+
pkt = pub_opt.xform(pkt) || pkt;} }
|
|
1185
|
+
|
|
1186
|
+
return this._send('publish', pkt,
|
|
1187
|
+
pkt.qos ? pkt : void 0 ) }// key
|
|
1161
1188
|
|
|
1162
1189
|
|
|
1163
1190
|
// Internal API
|
|
@@ -1166,52 +1193,24 @@ class MQTTBase {
|
|
|
1166
1193
|
|
|
1167
1194
|
_init_dispatch(opt) {
|
|
1168
1195
|
this.constructor?._once_();
|
|
1169
|
-
let
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
__proto__: opt.on_mqtt_type || {}
|
|
1174
|
-
, router};
|
|
1175
|
-
|
|
1176
|
-
tgt.mqtt_publish ||= router?.invoke;
|
|
1177
|
-
return _mqtt_dispatch(this, tgt)}
|
|
1196
|
+
let target ={__proto__: opt.on_mqtt_type};
|
|
1197
|
+
target.mqtt_publish ||=
|
|
1198
|
+
this._init_router?.(opt, this, target);
|
|
1199
|
+
return _mqtt_dispatch(this, target)}
|
|
1178
1200
|
|
|
1179
1201
|
static _aliases() {
|
|
1180
|
-
return ' pub
|
|
1202
|
+
return ' publish:pub sub:subscribe unsub:unsubscribe json_post:obj_post json_send:obj_send json_store:obj_store'}
|
|
1181
1203
|
|
|
1182
1204
|
static _once_(self=this) {
|
|
1183
1205
|
self._once_ = _=>0;
|
|
1184
|
-
self.MQTTError = MQTTError;
|
|
1185
1206
|
let p = self.prototype;
|
|
1207
|
+
p.MQTTError = MQTTError;
|
|
1186
1208
|
for (let alias of self._aliases().split(/\s+/)) {
|
|
1187
1209
|
alias = alias.split(':');
|
|
1188
1210
|
let fn = alias[1] && p[alias[1]];
|
|
1189
1211
|
if (fn) {p[alias[0]] = fn;} } } }
|
|
1190
1212
|
|
|
1191
1213
|
|
|
1192
|
-
/*
|
|
1193
|
-
on_mqtt_type = {
|
|
1194
|
-
mqtt_auth(pkt, ctx) ::
|
|
1195
|
-
mqtt_connect(pkt, ctx) ::
|
|
1196
|
-
mqtt_connack(pkt, ctx) ::
|
|
1197
|
-
mqtt_disconnect(pkt, ctx) ::
|
|
1198
|
-
|
|
1199
|
-
mqtt_publish(pkt, ctx)
|
|
1200
|
-
mqtt_subscribe(pkt, ctx) ::
|
|
1201
|
-
mqtt_unsubscribe(pkt, ctx) ::
|
|
1202
|
-
|
|
1203
|
-
mqtt_pingreq(pkt, ctx) ::
|
|
1204
|
-
mqtt_pingresp(pkt, ctx) ::
|
|
1205
|
-
}
|
|
1206
|
-
*/
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
const _prefix_topics = (topic_prefix, iterable) =>
|
|
1210
|
-
Array.from(iterable, value =>(
|
|
1211
|
-
value.trim // string
|
|
1212
|
-
? _prefix_topics(topic_prefix, value)
|
|
1213
|
-
: topic_prefix + value) );
|
|
1214
|
-
|
|
1215
1214
|
function _as_topics(pkt, ex, topic_prefix) {
|
|
1216
1215
|
if (ex?.trim) {// string
|
|
1217
1216
|
topic_prefix = ex;
|
|
@@ -1228,55 +1227,11 @@ function _as_topics(pkt, ex, topic_prefix) {
|
|
|
1228
1227
|
if (topic_prefix) {
|
|
1229
1228
|
// particularly useful with shared queues, e.g.
|
|
1230
1229
|
// topic_prefix = '$share/some-queue-name/'
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1230
|
+
let _prefix_topics = v =>
|
|
1231
|
+
v.trim ? topic_prefix+v : v.map(_prefix_topics);
|
|
1234
1232
|
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
if ('function' === typeof pub_opt) {
|
|
1238
|
-
pub_opt = {fn_encode: pub_opt};}
|
|
1239
|
-
|
|
1240
|
-
let {msg} = pkt;
|
|
1241
|
-
switch (typeof msg) {
|
|
1242
|
-
case 'function':
|
|
1243
|
-
pub_opt = {...pub_opt, fn_encode: msg};
|
|
1244
|
-
// flow into 'undefined' case
|
|
1245
|
-
case 'undefined':
|
|
1246
|
-
// return a single-value closure to publish packets
|
|
1247
|
-
return v => _pub(self, {...pkt, [pkt.arg || 'payload']: v}, pub_opt)
|
|
1248
|
-
|
|
1249
|
-
default:
|
|
1250
|
-
// Encode payload from msg; fn_encode allows alternative to JSON.stringify
|
|
1251
|
-
let {fn_encode} = pub_opt || {};
|
|
1252
|
-
pkt.payload = fn_encode
|
|
1253
|
-
? await fn_encode(msg)
|
|
1254
|
-
: JSON.stringify(msg);} }
|
|
1255
|
-
|
|
1256
|
-
if (pub_opt) {
|
|
1257
|
-
if (pub_opt.props) {
|
|
1258
|
-
pkt.props = pub_opt.props;}
|
|
1259
|
-
if (pub_opt.xform) {
|
|
1260
|
-
pkt = pub_opt.xform(pkt) || pkt;} }
|
|
1261
|
-
|
|
1262
|
-
return self._send('publish', pkt,
|
|
1263
|
-
pkt.qos ? pkt : void 0 ) }// key
|
|
1264
|
-
|
|
1265
|
-
{
|
|
1266
|
-
Object.assign(_pub,{
|
|
1267
|
-
m: (self, topic, payload, pub_opt) =>
|
|
1268
|
-
_pub(self, {topic, payload, qos:0}, pub_opt)
|
|
1269
|
-
, mq: (self, topic, payload, pub_opt) =>
|
|
1270
|
-
_pub(self, {topic, payload, qos:1}, pub_opt)
|
|
1271
|
-
, mqr: (self, topic, payload, pub_opt) =>
|
|
1272
|
-
_pub(self, {topic, payload, qos:1, retain: 1}, pub_opt)
|
|
1273
|
-
|
|
1274
|
-
, o: (self, topic, msg, pub_opt) =>
|
|
1275
|
-
_pub(self, {topic, msg, arg: 'msg', qos:0}, pub_opt)
|
|
1276
|
-
, oq: (self, topic, msg, pub_opt) =>
|
|
1277
|
-
_pub(self, {topic, msg, arg: 'msg', qos:1}, pub_opt)
|
|
1278
|
-
, oqr: (self, topic, msg, pub_opt) =>
|
|
1279
|
-
_pub(self, {topic, msg, arg: 'msg', qos:1, retain: 1}, pub_opt)} ); }
|
|
1233
|
+
pkt.topics = pkt.topics.map(_prefix_topics);}
|
|
1234
|
+
return pkt}
|
|
1280
1235
|
|
|
1281
1236
|
const pkt_api = {
|
|
1282
1237
|
utf8(u8) { return new TextDecoder('utf-8').decode(u8 || this.payload ) },
|
|
@@ -1285,20 +1240,27 @@ const pkt_api = {
|
|
|
1285
1240
|
};
|
|
1286
1241
|
|
|
1287
1242
|
class MQTTCore extends MQTTBase {
|
|
1288
|
-
constructor(opt={}) {
|
|
1289
|
-
super(opt);
|
|
1290
|
-
this.with(opt);}
|
|
1291
|
-
|
|
1292
1243
|
static mqtt_ctx(mqtt_level, mqtt_opts, pkt_ctx=pkt_api) {
|
|
1293
1244
|
let self = class extends this {};
|
|
1294
1245
|
self.prototype.mqtt_ctx =
|
|
1295
1246
|
mqtt_pkt_ctx(mqtt_level, mqtt_opts, pkt_ctx);
|
|
1296
1247
|
return self}
|
|
1297
1248
|
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1249
|
+
|
|
1250
|
+
// automatic Client Id for connect()
|
|
1251
|
+
init_client_id(parts=['u8-mqtt--','']) {
|
|
1252
|
+
let sess_stg=this.sess_stg;
|
|
1253
|
+
let key, cid = sess_stg?.getItem(key=parts.join(' '));
|
|
1254
|
+
if (! cid) {
|
|
1255
|
+
cid = parts.join(Math.random().toString(36).slice(2));
|
|
1256
|
+
sess_stg?.setItem(key, cid);}
|
|
1257
|
+
return cid}
|
|
1258
|
+
|
|
1259
|
+
get sess_stg() {return globalThis.sessionStorage}
|
|
1260
|
+
|
|
1261
|
+
|
|
1262
|
+
//on_error(err, evt) ::
|
|
1263
|
+
// console.warn @ '[[u8-mqtt error: %s]]', evt, err
|
|
1302
1264
|
|
|
1303
1265
|
//log_conn(evt, arg, err_arg) ::
|
|
1304
1266
|
// console.info @ '[[u8-mqtt log: %s]]', evt, arg, err_arg
|
|
@@ -1374,7 +1336,6 @@ class MQTTCore extends MQTTBase {
|
|
|
1374
1336
|
|
|
1375
1337
|
|
|
1376
1338
|
|
|
1377
|
-
|
|
1378
1339
|
|
|
1379
1340
|
|
|
1380
1341
|
|
|
@@ -1437,7 +1398,7 @@ class MQTTCore extends MQTTBase {
|
|
|
1437
1398
|
|
|
1438
1399
|
return this} }
|
|
1439
1400
|
|
|
1440
|
-
const version = '0.
|
|
1401
|
+
const version = '0.5.0';
|
|
1441
1402
|
|
|
1442
1403
|
const MQTTClient_v4 = /* #__PURE__ */
|
|
1443
1404
|
MQTTCore.mqtt_ctx(4, mqtt_opts_v5);
|