@polycode-projects/the-mechanical-code-talker 2.3.0 → 2.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.
Files changed (152) hide show
  1. package/README.md +127 -28
  2. package/ROADMAP.md +3 -2
  3. package/bin/tmct.mjs +17 -90
  4. package/corpus/LICENSES.json +19 -4
  5. package/corpus/README.md +48 -0
  6. package/corpus/generated/README.md +24 -9
  7. package/corpus/generated/ace-surface-variants.jsonl +4 -1
  8. package/corpus/generated/manifest.json +4 -4
  9. package/corpus/prose/manifest.json +512 -0
  10. package/corpus/prose/sqlite/LICENSE-NOTICE +53 -0
  11. package/corpus/prose/sqlite/arch.txt +213 -0
  12. package/corpus/prose/sqlite/atomiccommit.txt +1117 -0
  13. package/corpus/prose/sqlite/faq.txt +473 -0
  14. package/corpus/prose/sqlite/fileformat.txt +1589 -0
  15. package/corpus/prose/sqlite/lang_createtable.txt +1339 -0
  16. package/corpus/prose/sqlite/lang_insert.txt +580 -0
  17. package/corpus/prose/sqlite/lang_select.txt +3293 -0
  18. package/corpus/prose/sqlite/optoverview.txt +908 -0
  19. package/corpus/prose/sqlite/queryplanner.txt +447 -0
  20. package/corpus/prose/sqlite/transactional.txt +41 -0
  21. package/corpus/prose/sqlite/wal.txt +567 -0
  22. package/corpus/prose/sqlite/whentouse.txt +300 -0
  23. package/corpus/prose/wikipedia/Apple.txt +4 -0
  24. package/corpus/prose/wikipedia/Attempto_Controlled_English.txt +169 -0
  25. package/corpus/prose/wikipedia/Automated_planning_and_scheduling.txt +67 -0
  26. package/corpus/prose/wikipedia/Bee.txt +7 -0
  27. package/corpus/prose/wikipedia/Bird.txt +8 -0
  28. package/corpus/prose/wikipedia/Bone.txt +4 -0
  29. package/corpus/prose/wikipedia/Book.txt +7 -0
  30. package/corpus/prose/wikipedia/Bread.txt +6 -0
  31. package/corpus/prose/wikipedia/Butterfly.txt +6 -0
  32. package/corpus/prose/wikipedia/Car.txt +1 -0
  33. package/corpus/prose/wikipedia/Cat.txt +1 -0
  34. package/corpus/prose/wikipedia/Child.txt +3 -0
  35. package/corpus/prose/wikipedia/City.txt +2 -0
  36. package/corpus/prose/wikipedia/Clock.txt +2 -0
  37. package/corpus/prose/wikipedia/Cooking.txt +1 -0
  38. package/corpus/prose/wikipedia/Description_logic.txt +660 -0
  39. package/corpus/prose/wikipedia/Doctor.txt +6 -0
  40. package/corpus/prose/wikipedia/Dog.txt +4 -0
  41. package/corpus/prose/wikipedia/Eagle.txt +4 -0
  42. package/corpus/prose/wikipedia/Emotion.txt +9 -0
  43. package/corpus/prose/wikipedia/Eye.txt +5 -0
  44. package/corpus/prose/wikipedia/Family.txt +3 -0
  45. package/corpus/prose/wikipedia/Farm.txt +4 -0
  46. package/corpus/prose/wikipedia/Fear.txt +4 -0
  47. package/corpus/prose/wikipedia/First-order_logic.txt +1518 -0
  48. package/corpus/prose/wikipedia/Fish.txt +10 -0
  49. package/corpus/prose/wikipedia/Flower.txt +3 -0
  50. package/corpus/prose/wikipedia/Food.txt +10 -0
  51. package/corpus/prose/wikipedia/Grass.txt +9 -0
  52. package/corpus/prose/wikipedia/Hand.txt +2 -0
  53. package/corpus/prose/wikipedia/Happiness.txt +3 -0
  54. package/corpus/prose/wikipedia/Heart.txt +4 -0
  55. package/corpus/prose/wikipedia/Horse.txt +4 -0
  56. package/corpus/prose/wikipedia/House.txt +6 -0
  57. package/corpus/prose/wikipedia/Human.txt +4 -0
  58. package/corpus/prose/wikipedia/Insect.txt +6 -0
  59. package/corpus/prose/wikipedia/Interactive_fiction.txt +112 -0
  60. package/corpus/prose/wikipedia/Knowledge.txt +5 -0
  61. package/corpus/prose/wikipedia/Knowledge_representation_and_reasoning.txt +87 -0
  62. package/corpus/prose/wikipedia/LICENSE-NOTICE +94 -0
  63. package/corpus/prose/wikipedia/Language.txt +10 -0
  64. package/corpus/prose/wikipedia/Learning.txt +4 -0
  65. package/corpus/prose/wikipedia/Mammal.txt +3 -0
  66. package/corpus/prose/wikipedia/Memory.txt +5 -0
  67. package/corpus/prose/wikipedia/Milk.txt +1 -0
  68. package/corpus/prose/wikipedia/Mountain.txt +1 -0
  69. package/corpus/prose/wikipedia/Natural_language_processing.txt +211 -0
  70. package/corpus/prose/wikipedia/Ostrich.txt +2 -0
  71. package/corpus/prose/wikipedia/Owl.txt +2 -0
  72. package/corpus/prose/wikipedia/Penguin.txt +2 -0
  73. package/corpus/prose/wikipedia/Plant.txt +5 -0
  74. package/corpus/prose/wikipedia/Rain.txt +1 -0
  75. package/corpus/prose/wikipedia/Resource_Description_Framework.txt +184 -0
  76. package/corpus/prose/wikipedia/River.txt +1 -0
  77. package/corpus/prose/wikipedia/School.txt +8 -0
  78. package/corpus/prose/wikipedia/Sea.txt +1 -0
  79. package/corpus/prose/wikipedia/Semantic_Web.txt +114 -0
  80. package/corpus/prose/wikipedia/Semantic_reasoner.txt +29 -0
  81. package/corpus/prose/wikipedia/Snow.txt +5 -0
  82. package/corpus/prose/wikipedia/Sun.txt +5 -0
  83. package/corpus/prose/wikipedia/Teacher.txt +4 -0
  84. package/corpus/prose/wikipedia/Team.txt +3 -0
  85. package/corpus/prose/wikipedia/Text-based_game.txt +17 -0
  86. package/corpus/prose/wikipedia/Tool.txt +4 -0
  87. package/corpus/prose/wikipedia/Tree.txt +7 -0
  88. package/corpus/prose/wikipedia/Weather.txt +4 -0
  89. package/corpus/prose/wikipedia/Web_Ontology_Language.txt +133 -0
  90. package/corpus/prose/wikipedia/Wind.txt +8 -0
  91. package/corpus/prose/wikipedia/Writing.txt +5 -0
  92. package/corpus/seon/README.md +1 -0
  93. package/corpus/tier2/generate.mjs +18 -18
  94. package/corpus/tier2/manifest.json +3 -3
  95. package/data/games/hanoi-3.txt +8 -2
  96. package/package.json +24 -5
  97. package/src/adapters/corpus-lanes.mjs +13 -0
  98. package/src/adapters/graph-build.mjs +5 -7
  99. package/src/adapters/import-closure.mjs +28 -0
  100. package/src/adapters/memory/blocks.mjs +5 -4
  101. package/src/adapters/memory/core.mjs +78 -5
  102. package/src/adapters/memory/shacl.mjs +12 -0
  103. package/src/adapters/providers/graph-service.mjs +12 -5
  104. package/src/adapters/tracked-files.mjs +17 -0
  105. package/src/domain/ask-vocab.mjs +2 -0
  106. package/src/domain/ask.mjs +225 -13
  107. package/src/domain/cli-verbs.mjs +201 -0
  108. package/src/domain/codegraph.mjs +142 -56
  109. package/src/domain/completions/graph-adapter.mjs +1 -1
  110. package/src/domain/completions/group.mjs +3 -17
  111. package/src/domain/completions/infer.mjs +4 -13
  112. package/src/domain/completions/rank.mjs +6 -19
  113. package/src/domain/grammar/lexicon-core.json +1 -1
  114. package/src/domain/hash.mjs +36 -13
  115. package/src/domain/interpret/fuzzy.mjs +7 -2
  116. package/src/domain/interpret/normalize.mjs +9 -0
  117. package/src/domain/interpret/strategies/keywords.mjs +19 -9
  118. package/src/domain/memory/capability.mjs +22 -3
  119. package/src/domain/memory/touched-facts.mjs +17 -0
  120. package/src/domain/module-paths.mjs +9 -0
  121. package/src/domain/persona/tiers.mjs +1 -1
  122. package/src/domain/planning.mjs +37 -0
  123. package/src/domain/prose.mjs +10 -2
  124. package/src/domain/relative-specifiers.mjs +12 -0
  125. package/src/domain/router/registry.mjs +3 -2
  126. package/src/domain/router/results.mjs +5 -18
  127. package/src/domain/seeded-random.mjs +33 -0
  128. package/src/domain/syllogise.mjs +10 -7
  129. package/src/domain/text-stats.mjs +31 -0
  130. package/src/services/chat.mjs +720 -182
  131. package/src/services/extract-facts.mjs +155 -0
  132. package/src/services/import-file.mjs +2 -2
  133. package/src/services/ledger-viz.mjs +6 -1
  134. package/src/services/sentences.mjs +26 -0
  135. package/src/surfaces/web/memory-ask-browser.bundle.js +11390 -360
  136. package/src/tools/graph-load.mjs +7 -1
  137. package/src/tools/readme-docs.mjs +113 -0
  138. package/src/tools/schema-docs.mjs +2 -2
  139. package/corpus/namenet/generate.mjs +0 -309
  140. package/corpus/wordnet/generate.mjs +0 -332
  141. package/src/adapters/prose-tokens.mjs +0 -98
  142. package/src/adapters/wordnet-source.mjs +0 -70
  143. package/src/domain/corpus-matrix.mjs +0 -87
  144. package/src/domain/inflect.mjs +0 -67
  145. package/src/domain/licences.mjs +0 -68
  146. package/src/domain/markdown-links.mjs +0 -55
  147. package/src/domain/persona/codegen.mjs +0 -123
  148. package/src/domain/publish-gate.mjs +0 -41
  149. package/src/domain/schemaorg/turtle.mjs +0 -25
  150. package/src/domain/semcor/parse.mjs +0 -87
  151. package/src/domain/version-stamp.mjs +0 -36
  152. package/src/domain/wordnet/yaml.mjs +0 -133
@@ -0,0 +1,580 @@
1
+ INSERT
2
+ Small. Fast. Reliable.
3
+ Choose any three.
4
+ Home
5
+ Menu
6
+ About
7
+ Documentation
8
+ Download
9
+ License
10
+ Support
11
+ Purchase
12
+ Search
13
+ About
14
+ Documentation
15
+ Download
16
+ Support
17
+ Purchase
18
+ Search Documentation
19
+ Search Changelog
20
+ INSERT
21
+ 1. Overview
22
+ insert-stmt:
23
+ hide
24
+ WITH
25
+ RECURSIVE
26
+ common-table-expression
27
+ ,
28
+ REPLACE
29
+ INSERT
30
+ OR
31
+ ROLLBACK
32
+ INTO
33
+ ABORT
34
+ FAIL
35
+ IGNORE
36
+ REPLACE
37
+ schema-name
38
+ .
39
+ table-name
40
+ AS
41
+ alias
42
+ (
43
+ column-name
44
+ )
45
+ ,
46
+ VALUES
47
+ (
48
+ expr
49
+ )
50
+ ,
51
+ ,
52
+ upsert-clause
53
+ select-stmt
54
+ upsert-clause
55
+ DEFAULT
56
+ VALUES
57
+ returning-clause
58
+ common-table-expression:
59
+ show
60
+ table-name
61
+ (
62
+ column-name
63
+ )
64
+ AS
65
+ NOT
66
+ MATERIALIZED
67
+ (
68
+ select-stmt
69
+ )
70
+ ,
71
+ expr:
72
+ show
73
+ literal-value
74
+ bind-parameter
75
+ schema-name
76
+ .
77
+ table-name
78
+ .
79
+ column-name
80
+ unary-operator
81
+ expr
82
+ expr
83
+ binary-operator
84
+ expr
85
+ function-name
86
+ (
87
+ function-arguments
88
+ )
89
+ filter-clause
90
+ over-clause
91
+ (
92
+ expr
93
+ )
94
+ ,
95
+ CAST
96
+ (
97
+ expr
98
+ AS
99
+ type-name
100
+ )
101
+ expr
102
+ COLLATE
103
+ collation-name
104
+ expr
105
+ NOT
106
+ LIKE
107
+ GLOB
108
+ REGEXP
109
+ MATCH
110
+ expr
111
+ expr
112
+ ESCAPE
113
+ expr
114
+ expr
115
+ ISNULL
116
+ NOTNULL
117
+ NOT
118
+ NULL
119
+ expr
120
+ IS
121
+ NOT
122
+ DISTINCT
123
+ FROM
124
+ expr
125
+ expr
126
+ NOT
127
+ BETWEEN
128
+ expr
129
+ AND
130
+ expr
131
+ expr
132
+ NOT
133
+ IN
134
+ (
135
+ select-stmt
136
+ )
137
+ expr
138
+ ,
139
+ schema-name
140
+ .
141
+ table-function
142
+ (
143
+ expr
144
+ )
145
+ table-name
146
+ ,
147
+ NOT
148
+ EXISTS
149
+ (
150
+ select-stmt
151
+ )
152
+ CASE
153
+ expr
154
+ WHEN
155
+ expr
156
+ THEN
157
+ expr
158
+ ELSE
159
+ expr
160
+ END
161
+ raise-function
162
+ filter-clause:
163
+ show
164
+ FILTER
165
+ (
166
+ WHERE
167
+ expr
168
+ )
169
+ function-arguments:
170
+ show
171
+ DISTINCT
172
+ expr
173
+ ,
174
+ *
175
+ ORDER
176
+ BY
177
+ ordering-term
178
+ ,
179
+ ordering-term:
180
+ show
181
+ expr
182
+ COLLATE
183
+ collation-name
184
+ DESC
185
+ ASC
186
+ NULLS
187
+ FIRST
188
+ NULLS
189
+ LAST
190
+ literal-value:
191
+ show
192
+ CURRENT_TIMESTAMP
193
+ numeric-literal
194
+ string-literal
195
+ blob-literal
196
+ NULL
197
+ TRUE
198
+ FALSE
199
+ CURRENT_TIME
200
+ CURRENT_DATE
201
+ over-clause:
202
+ show
203
+ OVER
204
+ window-name
205
+ (
206
+ base-window-name
207
+ PARTITION
208
+ BY
209
+ expr
210
+ ,
211
+ ORDER
212
+ BY
213
+ ordering-term
214
+ ,
215
+ frame-spec
216
+ )
217
+ frame-spec:
218
+ show
219
+ GROUPS
220
+ BETWEEN
221
+ UNBOUNDED
222
+ PRECEDING
223
+ AND
224
+ UNBOUNDED
225
+ FOLLOWING
226
+ RANGE
227
+ ROWS
228
+ UNBOUNDED
229
+ PRECEDING
230
+ expr
231
+ PRECEDING
232
+ CURRENT
233
+ ROW
234
+ expr
235
+ PRECEDING
236
+ CURRENT
237
+ ROW
238
+ expr
239
+ FOLLOWING
240
+ expr
241
+ PRECEDING
242
+ CURRENT
243
+ ROW
244
+ expr
245
+ FOLLOWING
246
+ EXCLUDE
247
+ CURRENT
248
+ ROW
249
+ EXCLUDE
250
+ GROUP
251
+ EXCLUDE
252
+ TIES
253
+ EXCLUDE
254
+ NO
255
+ OTHERS
256
+ ordering-term:
257
+ show
258
+ expr
259
+ COLLATE
260
+ collation-name
261
+ DESC
262
+ ASC
263
+ NULLS
264
+ FIRST
265
+ NULLS
266
+ LAST
267
+ raise-function:
268
+ show
269
+ RAISE
270
+ (
271
+ ROLLBACK
272
+ ,
273
+ expr
274
+ )
275
+ IGNORE
276
+ ABORT
277
+ FAIL
278
+ type-name:
279
+ show
280
+ name
281
+ (
282
+ signed-number
283
+ ,
284
+ signed-number
285
+ )
286
+ (
287
+ signed-number
288
+ )
289
+ signed-number:
290
+ show
291
+ +
292
+ numeric-literal
293
+ -
294
+ returning-clause:
295
+ show
296
+ RETURNING
297
+ expr
298
+ AS
299
+ column-alias
300
+ *
301
+ ,
302
+ select-stmt:
303
+ show
304
+ WITH
305
+ RECURSIVE
306
+ common-table-expression
307
+ ,
308
+ SELECT
309
+ DISTINCT
310
+ result-column
311
+ ,
312
+ ALL
313
+ FROM
314
+ table-or-subquery
315
+ join-clause
316
+ ,
317
+ WHERE
318
+ expr
319
+ GROUP
320
+ BY
321
+ expr
322
+ HAVING
323
+ expr
324
+ ,
325
+ WINDOW
326
+ window-name
327
+ AS
328
+ window-defn
329
+ ,
330
+ VALUES
331
+ (
332
+ expr
333
+ )
334
+ ,
335
+ ,
336
+ compound-operator
337
+ select-core
338
+ ORDER
339
+ BY
340
+ LIMIT
341
+ expr
342
+ ordering-term
343
+ ,
344
+ OFFSET
345
+ expr
346
+ ,
347
+ expr
348
+ compound-operator:
349
+ show
350
+ UNION
351
+ UNION
352
+ INTERSECT
353
+ EXCEPT
354
+ ALL
355
+ join-clause:
356
+ show
357
+ table-or-subquery
358
+ join-operator
359
+ table-or-subquery
360
+ join-constraint
361
+ join-constraint:
362
+ show
363
+ USING
364
+ (
365
+ column-name
366
+ )
367
+ ,
368
+ ON
369
+ expr
370
+ join-operator:
371
+ show
372
+ NATURAL
373
+ LEFT
374
+ OUTER
375
+ JOIN
376
+ ,
377
+ RIGHT
378
+ FULL
379
+ INNER
380
+ CROSS
381
+ ordering-term:
382
+ show
383
+ expr
384
+ COLLATE
385
+ collation-name
386
+ DESC
387
+ ASC
388
+ NULLS
389
+ FIRST
390
+ NULLS
391
+ LAST
392
+ result-column:
393
+ show
394
+ expr
395
+ AS
396
+ column-alias
397
+ *
398
+ table-name
399
+ .
400
+ *
401
+ table-or-subquery:
402
+ show
403
+ schema-name
404
+ .
405
+ table-name
406
+ AS
407
+ table-alias
408
+ INDEXED
409
+ BY
410
+ index-name
411
+ NOT
412
+ INDEXED
413
+ table-function-name
414
+ (
415
+ expr
416
+ )
417
+ ,
418
+ AS
419
+ table-alias
420
+ (
421
+ select-stmt
422
+ )
423
+ (
424
+ table-or-subquery
425
+ )
426
+ ,
427
+ join-clause
428
+ window-defn:
429
+ show
430
+ (
431
+ base-window-name
432
+ PARTITION
433
+ BY
434
+ expr
435
+ ,
436
+ ORDER
437
+ BY
438
+ ordering-term
439
+ ,
440
+ frame-spec
441
+ )
442
+ frame-spec:
443
+ show
444
+ GROUPS
445
+ BETWEEN
446
+ UNBOUNDED
447
+ PRECEDING
448
+ AND
449
+ UNBOUNDED
450
+ FOLLOWING
451
+ RANGE
452
+ ROWS
453
+ UNBOUNDED
454
+ PRECEDING
455
+ expr
456
+ PRECEDING
457
+ CURRENT
458
+ ROW
459
+ expr
460
+ PRECEDING
461
+ CURRENT
462
+ ROW
463
+ expr
464
+ FOLLOWING
465
+ expr
466
+ PRECEDING
467
+ CURRENT
468
+ ROW
469
+ expr
470
+ FOLLOWING
471
+ EXCLUDE
472
+ CURRENT
473
+ ROW
474
+ EXCLUDE
475
+ GROUP
476
+ EXCLUDE
477
+ TIES
478
+ EXCLUDE
479
+ NO
480
+ OTHERS
481
+ upsert-clause:
482
+ show
483
+ ON
484
+ CONFLICT
485
+ (
486
+ indexed-column
487
+ )
488
+ WHERE
489
+ expr
490
+ DO
491
+ ,
492
+ conflict target
493
+ UPDATE
494
+ SET
495
+ column-name-list
496
+ =
497
+ expr
498
+ WHERE
499
+ expr
500
+ NOTHING
501
+ ,
502
+ column-name
503
+ column-name-list:
504
+ show
505
+ (
506
+ column-name
507
+ )
508
+ ,
509
+ indexed-column:
510
+ show
511
+ column-name
512
+ COLLATE
513
+ collation-name
514
+ DESC
515
+ expr
516
+ ASC
517
+ The INSERT statement comes in three basic forms.
518
+ INSERT INTO table VALUES(...);
519
+ The first form (with the "VALUES" keyword) creates one or more
520
+ new rows in
521
+ an existing table. If the column-name list after
522
+ table-name is omitted then the number
523
+ of values inserted into each row
524
+ must be the same as the number of columns in the table. In this case
525
+ the result of evaluating the left-most expression from each term of
526
+ the VALUES list is inserted into the left-most column of each new row,
527
+ and so forth for each subsequent expression. If a column-name
528
+ list is specified, then the number of values in each term of the
529
+ VALUE list must match the number of
530
+ specified columns. Each of the named columns of the new row is populated
531
+ with the results of evaluating the corresponding VALUES expression. Table
532
+ columns that do not appear in the column list are populated with the
533
+ default column value (specified as part of the CREATE TABLE statement), or
534
+ with NULL if no default value is specified.
535
+ INSERT INTO table SELECT ...;
536
+ The second form of the INSERT statement contains a SELECT statement
537
+ instead of a VALUES clause. A new entry is inserted into the table for each
538
+ row of data returned by executing the SELECT statement. If a column-list is
539
+ specified, the number of columns in the result of the SELECT must be the same
540
+ as the number of items in the column-list. Otherwise, if no column-list is
541
+ specified, the number of columns in the result of the SELECT must be the same
542
+ as the number of columns in the table. Any SELECT statement, including
543
+ compound SELECTs and SELECT statements with ORDER BY and/or LIMIT clauses,
544
+ may be used in an INSERT statement of this form.
545
+ To avoid a parsing ambiguity, the SELECT statement should always
546
+ contain a WHERE clause, even if that clause is simply "WHERE true",
547
+ if the upsert-clause is present. Without the WHERE clause, the
548
+ parser does not know if the token "ON" is part of a join constraint
549
+ on the SELECT, or the beginning of the upsert-clause .
550
+ INSERT INTO table DEFAULT VALUES;
551
+ The third form of an INSERT statement is with DEFAULT VALUES.
552
+ The INSERT ... DEFAULT VALUES statement inserts a single new row into the
553
+ named table. Each column of the new row is populated with its
554
+ default value , or with a NULL if no default value is specified
555
+ as part of the column definition in the CREATE TABLE statement.
556
+ The upsert-clause is not supported after DEFAULT VALUES.
557
+ The initial "INSERT" keyword can be replaced by
558
+ "REPLACE" or "INSERT OR action " to specify an alternative
559
+ constraint conflict resolution algorithm to use during
560
+ that one INSERT command.
561
+ For compatibility with MySQL, the parser allows the use of the
562
+ single keyword REPLACE as an
563
+ alias for "INSERT OR REPLACE".
564
+ The optional " schema-name . " prefix on the
565
+ table-name
566
+ is supported for top-level INSERT statements only. The table name must be
567
+ unqualified for INSERT statements that occur within CREATE TRIGGER statements.
568
+ Similarly, the "DEFAULT VALUES" form of the INSERT statement is supported for
569
+ top-level INSERT statements only and not for INSERT statements within
570
+ triggers.
571
+ The optional "AS alias " phrase provides an alternative
572
+ name for the table into which content is being inserted. The alias name
573
+ can be used within WHERE and SET clauses of the UPSERT . If there is no
574
+ upsert-clause , then the alias is pointless, but also
575
+ harmless.
576
+ See the separate UPSERT documentation for the additional trailing
577
+ syntax that can cause an INSERT to behave as an UPDATE if the INSERT would
578
+ otherwise violate a uniqueness constraint. The upsert clause is not
579
+ allowed on an "INSERT ... DEFAULT VALUES".
580
+ This page was last updated on 2026-05-14 15:13:28Z