@camstack/addon-waste-collections 0.1.14 → 0.1.15
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.
|
@@ -5554,7 +5554,7 @@ var ZodIssueCode = {
|
|
|
5554
5554
|
var ZodFirstPartyTypeKind;
|
|
5555
5555
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5556
5556
|
//#endregion
|
|
5557
|
-
//#region ../types/dist/sleep-
|
|
5557
|
+
//#region ../types/dist/sleep-CSuN0thG.mjs
|
|
5558
5558
|
/**
|
|
5559
5559
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5560
5560
|
* window to float samples (D455).
|
|
@@ -8182,7 +8182,13 @@ var RecordKindDeclarationSchema = object({
|
|
|
8182
8182
|
secretPaths: array(string().min(1)).default([]),
|
|
8183
8183
|
/** The id key of each array that carries a secret (`{ headers: 'name' }`). */
|
|
8184
8184
|
secretArrayKeys: record(string(), string()).default({}),
|
|
8185
|
-
/**
|
|
8185
|
+
/**
|
|
8186
|
+
* RETIRED (D900): the legacy table a kind adopted from during the records
|
|
8187
|
+
* migration. Nothing declares it any more and nothing reads it; the schema
|
|
8188
|
+
* still ACCEPTS it because the catalog rows the migration wrote carry it
|
|
8189
|
+
* (an orphaned kind is never redeclared) and an addon built before the
|
|
8190
|
+
* removal still sends it. Never set it.
|
|
8191
|
+
*/
|
|
8186
8192
|
adoptsFrom: string().min(1).optional(),
|
|
8187
8193
|
/** Kinds that must agree through `transact` sit in one file under one family name. */
|
|
8188
8194
|
transactFamily: string().min(1).optional(),
|
|
@@ -8257,7 +8263,6 @@ function defineRecordKinds(specs) {
|
|
|
8257
8263
|
maxDataBytes: spec.maxDataBytes,
|
|
8258
8264
|
secretPaths: [...secretPaths],
|
|
8259
8265
|
secretArrayKeys: spec.secretArrayKeys === void 0 ? void 0 : { ...spec.secretArrayKeys },
|
|
8260
|
-
adoptsFrom: spec.adoptsFrom,
|
|
8261
8266
|
transactFamily: spec.transactFamily,
|
|
8262
8267
|
entry: spec.entry === void 0 ? void 0 : {
|
|
8263
8268
|
title: spec.entry.title,
|
|
@@ -8301,7 +8306,6 @@ function defineEntryKind(name, spec) {
|
|
|
8301
8306
|
...spec.database === void 0 ? {} : { database: spec.database },
|
|
8302
8307
|
...spec.indexes === void 0 ? {} : { indexes: spec.indexes },
|
|
8303
8308
|
...spec.secretArrayKeys === void 0 ? {} : { secretArrayKeys: spec.secretArrayKeys },
|
|
8304
|
-
...spec.adoptsFrom === void 0 ? {} : { adoptsFrom: spec.adoptsFrom },
|
|
8305
8309
|
entry: {
|
|
8306
8310
|
title: spec.title,
|
|
8307
8311
|
...spec.nameField === void 0 ? {} : { nameField: spec.nameField }
|
|
@@ -8310,15 +8314,6 @@ function defineEntryKind(name, spec) {
|
|
|
8310
8314
|
if (defined === void 0) throw new DeclarationRefusedError(`entry kind "${name}" was not built`);
|
|
8311
8315
|
return defined;
|
|
8312
8316
|
}
|
|
8313
|
-
/**
|
|
8314
|
-
* Legacy source for entry adoption (B3): a list stored under addon-settings
|
|
8315
|
-
* `<addonId>.<key>` until records-adopt copies rows into the entry kind.
|
|
8316
|
-
*/
|
|
8317
|
-
var SETTINGS_ARRAY_ADOPTS_PREFIX = "@settings-array/";
|
|
8318
|
-
/** The `adoptsFrom` value for an addon-settings array field. */
|
|
8319
|
-
function settingsArrayAdoptsFrom(addonId, settingsKey) {
|
|
8320
|
-
return `${SETTINGS_ARRAY_ADOPTS_PREFIX}${addonId}/${settingsKey}`;
|
|
8321
|
-
}
|
|
8322
8317
|
/** Shared Zod schemas used across streaming capabilities. */
|
|
8323
8318
|
var CamProfileSchema = _enum([
|
|
8324
8319
|
"high",
|
|
@@ -16885,11 +16880,12 @@ var DeclareKindResultSchema = object({
|
|
|
16885
16880
|
kindId: number().int(),
|
|
16886
16881
|
state: RecordKindStateSchema,
|
|
16887
16882
|
createdIndexes: array(string()),
|
|
16888
|
-
/**
|
|
16889
|
-
|
|
16890
|
-
|
|
16891
|
-
|
|
16892
|
-
|
|
16883
|
+
/**
|
|
16884
|
+
* RETIRED (D900): always `null`. It carried the records-migration boot guard;
|
|
16885
|
+
* it stays on the wire, null, because an addon built before the removal reads
|
|
16886
|
+
* an ABSENT field as "adoption pending" and refuses to start.
|
|
16887
|
+
*/
|
|
16888
|
+
adoptionPending: _null()
|
|
16893
16889
|
});
|
|
16894
16890
|
/** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
|
|
16895
16891
|
var SecretRefsList = array(string());
|
|
@@ -17062,26 +17058,7 @@ method(object({ ownerPrefix: string().min(1).optional() }), object({ tables: arr
|
|
|
17062
17058
|
}), object({ kinds: array(StorageKindSchema) }), { auth: "admin" }), method(RecordQueryInputSchema.extend({
|
|
17063
17059
|
owner: string().min(1),
|
|
17064
17060
|
kind: RecordKindNameSchema
|
|
17065
|
-
}), RecordQueryResultSchema, { auth: "admin" })
|
|
17066
|
-
owner: string().min(1),
|
|
17067
|
-
kind: RecordKindNameSchema,
|
|
17068
|
-
records: array(RecordInputSchema).max(RECORD_BATCH_MAX),
|
|
17069
|
-
/** The LAST batch: the copy is complete, the boot guard stops asking. */
|
|
17070
|
-
complete: boolean().optional()
|
|
17071
|
-
}).refine((input) => input.records.length > 0 || input.complete === true, { message: "records must be non-empty unless complete is true" }), object({ adopted: number().int() }), {
|
|
17072
|
-
kind: "mutation",
|
|
17073
|
-
auth: "admin"
|
|
17074
|
-
}), method(object({
|
|
17075
|
-
collection: string().min(1),
|
|
17076
|
-
cursor: string().optional(),
|
|
17077
|
-
limit: number().int().min(1).max(1e3).optional()
|
|
17078
|
-
}), object({
|
|
17079
|
-
rows: array(object({
|
|
17080
|
-
id: string(),
|
|
17081
|
-
data: record(string(), unknown())
|
|
17082
|
-
})),
|
|
17083
|
-
nextCursor: string().nullable()
|
|
17084
|
-
}), { auth: "admin" }), method(object({ collection: string().min(1) }), object({ adopted: boolean() }), { auth: "admin" });
|
|
17061
|
+
}), RecordQueryResultSchema, { auth: "admin" });
|
|
17085
17062
|
/**
|
|
17086
17063
|
* record-entries - the ONE admin surface for every list of user-created entries
|
|
17087
17064
|
* (D881): notification targets, brokers, LLM profiles, anything an addon
|
|
@@ -64270,6 +64247,12 @@ Object.freeze({
|
|
|
64270
64247
|
addonId: null,
|
|
64271
64248
|
access: "view"
|
|
64272
64249
|
},
|
|
64250
|
+
"deviceHistory.queryMany": {
|
|
64251
|
+
capName: "device-history",
|
|
64252
|
+
capScope: "system",
|
|
64253
|
+
addonId: null,
|
|
64254
|
+
access: "view"
|
|
64255
|
+
},
|
|
64273
64256
|
"deviceHistory.queryNode": {
|
|
64274
64257
|
capName: "device-history",
|
|
64275
64258
|
capScope: "system",
|
|
@@ -69490,24 +69473,12 @@ Object.freeze({
|
|
|
69490
69473
|
addonId: null,
|
|
69491
69474
|
access: "create"
|
|
69492
69475
|
},
|
|
69493
|
-
"storageAdmin.adoptRecords": {
|
|
69494
|
-
capName: "storage-admin",
|
|
69495
|
-
capScope: "system",
|
|
69496
|
-
addonId: null,
|
|
69497
|
-
access: "create"
|
|
69498
|
-
},
|
|
69499
69476
|
"storageAdmin.dropCollection": {
|
|
69500
69477
|
capName: "storage-admin",
|
|
69501
69478
|
capScope: "system",
|
|
69502
69479
|
addonId: null,
|
|
69503
69480
|
access: "delete"
|
|
69504
69481
|
},
|
|
69505
|
-
"storageAdmin.isAdoptedLegacyTable": {
|
|
69506
|
-
capName: "storage-admin",
|
|
69507
|
-
capScope: "system",
|
|
69508
|
-
addonId: null,
|
|
69509
|
-
access: "view"
|
|
69510
|
-
},
|
|
69511
69482
|
"storageAdmin.listKinds": {
|
|
69512
69483
|
capName: "storage-admin",
|
|
69513
69484
|
capScope: "system",
|
|
@@ -69520,12 +69491,6 @@ Object.freeze({
|
|
|
69520
69491
|
addonId: null,
|
|
69521
69492
|
access: "view"
|
|
69522
69493
|
},
|
|
69523
|
-
"storageAdmin.readLegacyCollection": {
|
|
69524
|
-
capName: "storage-admin",
|
|
69525
|
-
capScope: "system",
|
|
69526
|
-
addonId: null,
|
|
69527
|
-
access: "view"
|
|
69528
|
-
},
|
|
69529
69494
|
"storageAdmin.readRecords": {
|
|
69530
69495
|
capName: "storage-admin",
|
|
69531
69496
|
capScope: "system",
|
|
@@ -73340,12 +73305,6 @@ Object.freeze({
|
|
|
73340
73305
|
form: "single",
|
|
73341
73306
|
optional: false
|
|
73342
73307
|
}],
|
|
73343
|
-
"storageAdmin.adoptRecords": [{
|
|
73344
|
-
name: "records",
|
|
73345
|
-
form: "object-array",
|
|
73346
|
-
optional: false,
|
|
73347
|
-
itemField: "deviceId"
|
|
73348
|
-
}],
|
|
73349
73308
|
"storageAdmin.readRecords": [{
|
|
73350
73309
|
name: "deviceId",
|
|
73351
73310
|
form: "single",
|
|
@@ -161237,7 +161196,6 @@ function allocateSourceId(label, existingIds) {
|
|
|
161237
161196
|
}
|
|
161238
161197
|
//#endregion
|
|
161239
161198
|
//#region src/waste-source-record-kinds.ts
|
|
161240
|
-
var WASTE_COLLECTIONS_OWNER = "waste-collections";
|
|
161241
161199
|
var WasteSourceBodySchema = entryBody({
|
|
161242
161200
|
module: string().min(1),
|
|
161243
161201
|
args: preprocess((v) => v ?? {}, record(string(), WasteArgValueSchema)),
|
|
@@ -161246,8 +161204,7 @@ var WasteSourceBodySchema = entryBody({
|
|
|
161246
161204
|
var wasteSourceEntryKind = defineEntryKind("waste-source", {
|
|
161247
161205
|
title: "Waste collection sources",
|
|
161248
161206
|
schema: WasteSourceBodySchema,
|
|
161249
|
-
writeTrigger: "an operator adds or edits a municipal waste calendar source"
|
|
161250
|
-
adoptsFrom: settingsArrayAdoptsFrom(WASTE_COLLECTIONS_OWNER, "sources")
|
|
161207
|
+
writeTrigger: "an operator adds or edits a municipal waste calendar source"
|
|
161251
161208
|
});
|
|
161252
161209
|
//#endregion
|
|
161253
161210
|
//#region src/waste-source-store.ts
|
|
@@ -5550,7 +5550,7 @@ var ZodIssueCode = {
|
|
|
5550
5550
|
var ZodFirstPartyTypeKind;
|
|
5551
5551
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5552
5552
|
//#endregion
|
|
5553
|
-
//#region ../types/dist/sleep-
|
|
5553
|
+
//#region ../types/dist/sleep-CSuN0thG.mjs
|
|
5554
5554
|
/**
|
|
5555
5555
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5556
5556
|
* window to float samples (D455).
|
|
@@ -8178,7 +8178,13 @@ var RecordKindDeclarationSchema = object({
|
|
|
8178
8178
|
secretPaths: array(string().min(1)).default([]),
|
|
8179
8179
|
/** The id key of each array that carries a secret (`{ headers: 'name' }`). */
|
|
8180
8180
|
secretArrayKeys: record(string(), string()).default({}),
|
|
8181
|
-
/**
|
|
8181
|
+
/**
|
|
8182
|
+
* RETIRED (D900): the legacy table a kind adopted from during the records
|
|
8183
|
+
* migration. Nothing declares it any more and nothing reads it; the schema
|
|
8184
|
+
* still ACCEPTS it because the catalog rows the migration wrote carry it
|
|
8185
|
+
* (an orphaned kind is never redeclared) and an addon built before the
|
|
8186
|
+
* removal still sends it. Never set it.
|
|
8187
|
+
*/
|
|
8182
8188
|
adoptsFrom: string().min(1).optional(),
|
|
8183
8189
|
/** Kinds that must agree through `transact` sit in one file under one family name. */
|
|
8184
8190
|
transactFamily: string().min(1).optional(),
|
|
@@ -8253,7 +8259,6 @@ function defineRecordKinds(specs) {
|
|
|
8253
8259
|
maxDataBytes: spec.maxDataBytes,
|
|
8254
8260
|
secretPaths: [...secretPaths],
|
|
8255
8261
|
secretArrayKeys: spec.secretArrayKeys === void 0 ? void 0 : { ...spec.secretArrayKeys },
|
|
8256
|
-
adoptsFrom: spec.adoptsFrom,
|
|
8257
8262
|
transactFamily: spec.transactFamily,
|
|
8258
8263
|
entry: spec.entry === void 0 ? void 0 : {
|
|
8259
8264
|
title: spec.entry.title,
|
|
@@ -8297,7 +8302,6 @@ function defineEntryKind(name, spec) {
|
|
|
8297
8302
|
...spec.database === void 0 ? {} : { database: spec.database },
|
|
8298
8303
|
...spec.indexes === void 0 ? {} : { indexes: spec.indexes },
|
|
8299
8304
|
...spec.secretArrayKeys === void 0 ? {} : { secretArrayKeys: spec.secretArrayKeys },
|
|
8300
|
-
...spec.adoptsFrom === void 0 ? {} : { adoptsFrom: spec.adoptsFrom },
|
|
8301
8305
|
entry: {
|
|
8302
8306
|
title: spec.title,
|
|
8303
8307
|
...spec.nameField === void 0 ? {} : { nameField: spec.nameField }
|
|
@@ -8306,15 +8310,6 @@ function defineEntryKind(name, spec) {
|
|
|
8306
8310
|
if (defined === void 0) throw new DeclarationRefusedError(`entry kind "${name}" was not built`);
|
|
8307
8311
|
return defined;
|
|
8308
8312
|
}
|
|
8309
|
-
/**
|
|
8310
|
-
* Legacy source for entry adoption (B3): a list stored under addon-settings
|
|
8311
|
-
* `<addonId>.<key>` until records-adopt copies rows into the entry kind.
|
|
8312
|
-
*/
|
|
8313
|
-
var SETTINGS_ARRAY_ADOPTS_PREFIX = "@settings-array/";
|
|
8314
|
-
/** The `adoptsFrom` value for an addon-settings array field. */
|
|
8315
|
-
function settingsArrayAdoptsFrom(addonId, settingsKey) {
|
|
8316
|
-
return `${SETTINGS_ARRAY_ADOPTS_PREFIX}${addonId}/${settingsKey}`;
|
|
8317
|
-
}
|
|
8318
8313
|
/** Shared Zod schemas used across streaming capabilities. */
|
|
8319
8314
|
var CamProfileSchema = _enum([
|
|
8320
8315
|
"high",
|
|
@@ -16881,11 +16876,12 @@ var DeclareKindResultSchema = object({
|
|
|
16881
16876
|
kindId: number().int(),
|
|
16882
16877
|
state: RecordKindStateSchema,
|
|
16883
16878
|
createdIndexes: array(string()),
|
|
16884
|
-
/**
|
|
16885
|
-
|
|
16886
|
-
|
|
16887
|
-
|
|
16888
|
-
|
|
16879
|
+
/**
|
|
16880
|
+
* RETIRED (D900): always `null`. It carried the records-migration boot guard;
|
|
16881
|
+
* it stays on the wire, null, because an addon built before the removal reads
|
|
16882
|
+
* an ABSENT field as "adoption pending" and refuses to start.
|
|
16883
|
+
*/
|
|
16884
|
+
adoptionPending: _null()
|
|
16889
16885
|
});
|
|
16890
16886
|
/** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
|
|
16891
16887
|
var SecretRefsList = array(string());
|
|
@@ -17058,26 +17054,7 @@ method(object({ ownerPrefix: string().min(1).optional() }), object({ tables: arr
|
|
|
17058
17054
|
}), object({ kinds: array(StorageKindSchema) }), { auth: "admin" }), method(RecordQueryInputSchema.extend({
|
|
17059
17055
|
owner: string().min(1),
|
|
17060
17056
|
kind: RecordKindNameSchema
|
|
17061
|
-
}), RecordQueryResultSchema, { auth: "admin" })
|
|
17062
|
-
owner: string().min(1),
|
|
17063
|
-
kind: RecordKindNameSchema,
|
|
17064
|
-
records: array(RecordInputSchema).max(RECORD_BATCH_MAX),
|
|
17065
|
-
/** The LAST batch: the copy is complete, the boot guard stops asking. */
|
|
17066
|
-
complete: boolean().optional()
|
|
17067
|
-
}).refine((input) => input.records.length > 0 || input.complete === true, { message: "records must be non-empty unless complete is true" }), object({ adopted: number().int() }), {
|
|
17068
|
-
kind: "mutation",
|
|
17069
|
-
auth: "admin"
|
|
17070
|
-
}), method(object({
|
|
17071
|
-
collection: string().min(1),
|
|
17072
|
-
cursor: string().optional(),
|
|
17073
|
-
limit: number().int().min(1).max(1e3).optional()
|
|
17074
|
-
}), object({
|
|
17075
|
-
rows: array(object({
|
|
17076
|
-
id: string(),
|
|
17077
|
-
data: record(string(), unknown())
|
|
17078
|
-
})),
|
|
17079
|
-
nextCursor: string().nullable()
|
|
17080
|
-
}), { auth: "admin" }), method(object({ collection: string().min(1) }), object({ adopted: boolean() }), { auth: "admin" });
|
|
17057
|
+
}), RecordQueryResultSchema, { auth: "admin" });
|
|
17081
17058
|
/**
|
|
17082
17059
|
* record-entries - the ONE admin surface for every list of user-created entries
|
|
17083
17060
|
* (D881): notification targets, brokers, LLM profiles, anything an addon
|
|
@@ -64266,6 +64243,12 @@ Object.freeze({
|
|
|
64266
64243
|
addonId: null,
|
|
64267
64244
|
access: "view"
|
|
64268
64245
|
},
|
|
64246
|
+
"deviceHistory.queryMany": {
|
|
64247
|
+
capName: "device-history",
|
|
64248
|
+
capScope: "system",
|
|
64249
|
+
addonId: null,
|
|
64250
|
+
access: "view"
|
|
64251
|
+
},
|
|
64269
64252
|
"deviceHistory.queryNode": {
|
|
64270
64253
|
capName: "device-history",
|
|
64271
64254
|
capScope: "system",
|
|
@@ -69486,24 +69469,12 @@ Object.freeze({
|
|
|
69486
69469
|
addonId: null,
|
|
69487
69470
|
access: "create"
|
|
69488
69471
|
},
|
|
69489
|
-
"storageAdmin.adoptRecords": {
|
|
69490
|
-
capName: "storage-admin",
|
|
69491
|
-
capScope: "system",
|
|
69492
|
-
addonId: null,
|
|
69493
|
-
access: "create"
|
|
69494
|
-
},
|
|
69495
69472
|
"storageAdmin.dropCollection": {
|
|
69496
69473
|
capName: "storage-admin",
|
|
69497
69474
|
capScope: "system",
|
|
69498
69475
|
addonId: null,
|
|
69499
69476
|
access: "delete"
|
|
69500
69477
|
},
|
|
69501
|
-
"storageAdmin.isAdoptedLegacyTable": {
|
|
69502
|
-
capName: "storage-admin",
|
|
69503
|
-
capScope: "system",
|
|
69504
|
-
addonId: null,
|
|
69505
|
-
access: "view"
|
|
69506
|
-
},
|
|
69507
69478
|
"storageAdmin.listKinds": {
|
|
69508
69479
|
capName: "storage-admin",
|
|
69509
69480
|
capScope: "system",
|
|
@@ -69516,12 +69487,6 @@ Object.freeze({
|
|
|
69516
69487
|
addonId: null,
|
|
69517
69488
|
access: "view"
|
|
69518
69489
|
},
|
|
69519
|
-
"storageAdmin.readLegacyCollection": {
|
|
69520
|
-
capName: "storage-admin",
|
|
69521
|
-
capScope: "system",
|
|
69522
|
-
addonId: null,
|
|
69523
|
-
access: "view"
|
|
69524
|
-
},
|
|
69525
69490
|
"storageAdmin.readRecords": {
|
|
69526
69491
|
capName: "storage-admin",
|
|
69527
69492
|
capScope: "system",
|
|
@@ -73336,12 +73301,6 @@ Object.freeze({
|
|
|
73336
73301
|
form: "single",
|
|
73337
73302
|
optional: false
|
|
73338
73303
|
}],
|
|
73339
|
-
"storageAdmin.adoptRecords": [{
|
|
73340
|
-
name: "records",
|
|
73341
|
-
form: "object-array",
|
|
73342
|
-
optional: false,
|
|
73343
|
-
itemField: "deviceId"
|
|
73344
|
-
}],
|
|
73345
73304
|
"storageAdmin.readRecords": [{
|
|
73346
73305
|
name: "deviceId",
|
|
73347
73306
|
form: "single",
|
|
@@ -161233,7 +161192,6 @@ function allocateSourceId(label, existingIds) {
|
|
|
161233
161192
|
}
|
|
161234
161193
|
//#endregion
|
|
161235
161194
|
//#region src/waste-source-record-kinds.ts
|
|
161236
|
-
var WASTE_COLLECTIONS_OWNER = "waste-collections";
|
|
161237
161195
|
var WasteSourceBodySchema = entryBody({
|
|
161238
161196
|
module: string().min(1),
|
|
161239
161197
|
args: preprocess((v) => v ?? {}, record(string(), WasteArgValueSchema)),
|
|
@@ -161242,8 +161200,7 @@ var WasteSourceBodySchema = entryBody({
|
|
|
161242
161200
|
var wasteSourceEntryKind = defineEntryKind("waste-source", {
|
|
161243
161201
|
title: "Waste collection sources",
|
|
161244
161202
|
schema: WasteSourceBodySchema,
|
|
161245
|
-
writeTrigger: "an operator adds or edits a municipal waste calendar source"
|
|
161246
|
-
adoptsFrom: settingsArrayAdoptsFrom(WASTE_COLLECTIONS_OWNER, "sources")
|
|
161203
|
+
writeTrigger: "an operator adds or edits a municipal waste calendar source"
|
|
161247
161204
|
});
|
|
161248
161205
|
//#endregion
|
|
161249
161206
|
//#region src/waste-source-store.ts
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-waste-collections",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.15",
|
|
4
4
|
"description": "Waste collection schedules via the vendored HACS waste_collection_schedule Python core — full source catalog as calendar-source.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|