diff --git a/lib/attributes.js b/lib/attributes.js index bf54b992..45fe697d 100644 --- a/lib/attributes.js +++ b/lib/attributes.js @@ -401,12 +401,54 @@ attributes["Job Template"] = { "feed-orientation": keyword, "finishings": setof(enumeration), "finishings-col": collection({ - "finishing-template": name, + "baling": collection({ + "baling-type": _(keyword, name), + "baling-when": keyword + }), + "binding": collection({ + "binding-reference-edge": keyword, + "binding-type": _(keyword, name) + }), + "coating": collection({ + "coating-sides": keyword, + "coating-type": _(keyword, name) + }), + "covering": collection({ + "covering-name": _(keyword, name) + }), + "finishing-template": _(keyword, name), + "folding": setof(collection({ + "folding-direction": keyword, + "folding-offset": integer(0,MAX), + "folding-reference-edge": keyword + })), + "imposition-template": _(keyword, name), + "laminating": collection({ + "laminating-sides": keyword, + "laminating-type": _(keyword, name) + }), + "media-sheets-supported": rangeOfInteger(1, MAX), + "media-size": collection({ + "media-size-name": keyword + }), + "punching": collection({ + "punching-locations": setof(integer(0,MAX)), + "punching-offset": integer(0,MAX), + "punching-reference-edge": keyword + }), "stitching": collection({ + "stitching-angle": integer(0,359), "stitching-locations": setof(integer(0,MAX)), + "stitching-method": keyword, "stitching-offset": integer(0,MAX), "stitching-reference-edge": keyword - }) + }), + "trimming": setof(collection({ + "trimming-offset": integer(0,MAX), + "trimming-reference-edge": keyword, + "trimming-type": _(keyword, name), + "trimming-when": keyword, + })), }), "font-name-requested": name, "font-size-requested": integer(1,MAX), @@ -443,6 +485,7 @@ attributes["Job Template"] = { "job-hold-until": _(keyword, name), "job-hold-until-time": dateTime, "job-message-to-operator": text, + "job-pages-per-set": integer(1,MAX), "job-phone-number": uri, "job-priority": integer(1,100), "job-recipient-name": name, @@ -514,8 +557,8 @@ attributes["Job Template"] = { "print-content-optimize": keyword, "print-quality": enumeration, "print-rendering-intent": keyword, - "printer-resolution": resolution, "print-scaling": keyword, + "printer-resolution": resolution, "proof-print": collection({ "media": _(keyword, name), "media-col": collection("Job Template", "media-col"), @@ -593,9 +636,16 @@ attributes["Operation"] = { "requesting-user-uri": uri, "status-message": text(255), "which-jobs": keyword -};attributes["Printer Description"] = { +}; +attributes["Printer Description"] = { + "baling-type-supported": setof(keyword, name), + "baling-when-supported": setof(keyword), + "binding-reference-edge-supported": setof(keyword), + "binding-type-supported": setof(keyword), "charset-configured": charset, "charset-supported": setof(charset), + "coating-sides-supported": setof(keyword), + "coating-type-supported": setof(keyword, name), "color-supported": boolean, "compression-supported": setof(keyword), "copies-default": integer(1,MAX), @@ -604,6 +654,7 @@ attributes["Operation"] = { "cover-back-supported": setof(keyword), "cover-front-default": collection("Job Template","cover-front"), "cover-front-supported": setof(keyword), + "covering-name-supported": setof(keyword, name), "device-service-count": integer(1,MAX), "device-uuid": uri(45), "document-charset-default": charset, @@ -623,12 +674,17 @@ attributes["Operation"] = { "document-password-supported": integer(0,1023), "feed-orientation-default": keyword, "feed-orientation-supported": keyword, + "finishing-template-supported": setof(name, keyword), + "finishings-col-database": setof(collection("Job Template","finishings-col")), "finishings-col-default": collection("Job Template","finishings-col"), "finishings-col-ready": setof(collection("Job Template","finishings-col")), "finishings-col-supported": setof(keyword), "finishings-default": setof(enumeration), "finishings-ready": setof(enumeration), "finishings-supported": setof(enumeration), + "folding-direction-supported": setof(keyword), + "folding-offset-supported": setof(_(integer(0,MAX), rangeOfInteger(0,MAX))), + "folding-reference-edge-supported": setof(keyword), "font-name-requested-default": name, "font-name-requested-supported": setof(name), "font-size-requested-default": integer(1,MAX), @@ -683,6 +739,7 @@ attributes["Operation"] = { "job-media-sheets-supported": rangeOfInteger(0,MAX), "job-message-to-operator-default": text, "job-message-to-operator-supported": boolean, + "job-pages-per-set-supported": boolean, "job-password-encryption-supported": setof(_(keyword, name)), "job-password-supported": integer(0,255), "job-phone-number-default": _(uri, novalue), @@ -702,6 +759,8 @@ attributes["Operation"] = { "job-sheets-default": _(keyword, name), "job-sheets-supported": setof(_(keyword, name)), "job-spooling-supported": keyword, + "laminating-sides-supported": setof(keyword), + "laminating-type-supported": setof(_(keyword, name)), "max-save-info-supported": integer(1,MAX), "max-stitching-locations-supported": integer(1,MAX), "media-back-coating-supported": setof(_(keyword, name)), @@ -800,6 +859,10 @@ attributes["Operation"] = { "printer-detailed-status-messages": setof(text), "printer-device-id": text(1023), "printer-driver-installer": uri, + "printer-finisher": setof(octetString), + "printer-finisher-description": setof(text), + "printer-finisher-supplies": setof(octetString), + "printer-finisher-supplies-description": setof(text), "printer-geo-location": uri, "printer-get-attributes-supported": setof(keyword), "printer-icc-profiles": setof(collection({ @@ -841,6 +904,10 @@ attributes["Operation"] = { })), "proof-print-default": _(collection("Job Template", "proof-print"), novalue), "proof-print-supported": setof(keyword), + "punching-hole-diameter-configured": integer(0,MAX), + "punching-locations-supported": setof(_(integer(0,MAX), rangeOfInteger(0,MAX))), + "punching-offset-supported": setof(_(integer(0,MAX), rangeOfInteger(0,MAX))), + "punching-reference-edge-supported": setof(keyword), "pwg-raster-document-resolution-supported": setof(resolution), "pwg-raster-document-sheet-back": keyword, "pwg-raster-document-type-supported": setof(keyword), @@ -861,9 +928,15 @@ attributes["Operation"] = { "sheet-collate-supported": setof(keyword), "sides-default": keyword, "sides-supported": setof(keyword), + "stitching-angle-supported": setof(_(integer(0,359), rangeOfInteger(0,359))), "stitching-locations-supported": setof(_(integer(0,MAX), rangeOfInteger(0,MAX))), + "stitching-method-supported": setof(keyword), "stitching-offset-supported": setof(_(integer(0,MAX), rangeOfInteger(0,MAX))), "subordinate-printers-supported": setof(uri), + "trimming-offset-supported": setof(_(integer(0,MAX), rangeOfInteger(0,MAX))), + "trimming-reference-edge-supported": setof(keyword), + "trimming-type-supported": setof(keyword), + "trimming-when-supported": setof(keyword), "uri-authentication-supported": setof(keyword), "uri-security-supported": setof(keyword), "user-defined-values-supported": setof(keyword), diff --git a/lib/enums.js b/lib/enums.js index 96a378b3..dc468371 100644 --- a/lib/enums.js +++ b/lib/enums.js @@ -25,7 +25,9 @@ var enums = { "bale", // 0x0C ftp://ftp.pwg.org/pub/pwg/ipp/new_VAL/pwg5100.1.pdf "booklet-maker", // 0x0D ftp://ftp.pwg.org/pub/pwg/ipp/new_VAL/pwg5100.1.pdf "jog-offset", // 0x0E ftp://ftp.pwg.org/pub/pwg/ipp/new_VAL/pwg5100.1.pdf - ,,,,, // 0x0F - 0x13 reserved for future generic finishing enum values. + "coat", // 0x0F https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "laminate", // 0x10 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + ,,, // 0x11 - 0x13 reserved for future generic finishing enum values. "staple-top-left", // 0x14 http://tools.ietf.org/html/rfc2911#section-4.2.6 "staple-bottom-left", // 0x15 http://tools.ietf.org/html/rfc2911#section-4.2.6 "staple-top-right", // 0x16 http://tools.ietf.org/html/rfc2911#section-4.2.6 @@ -38,7 +40,11 @@ var enums = { "staple-dual-top", // 0x1D http://tools.ietf.org/html/rfc2911#section-4.2.6 "staple-dual-right", // 0x1E http://tools.ietf.org/html/rfc2911#section-4.2.6 "staple-dual-bottom", // 0x1F http://tools.ietf.org/html/rfc2911#section-4.2.6 - ,,,,,,,,,,,,,,,,,, // 0x20 - 0x31 reserved for future specific stapling and stitching enum values. + "staple-triple-left", // 0x20 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "staple-triple-top", // 0x21 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "staple-triple-right", // 0x22 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "staple-triple-bottom", // 0x23 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + ,,,,,,,,,,,,,, // 0x24 - 0x31 reserved for future specific stapling and stitching enum values. "bind-left", // 0x32 ftp://ftp.pwg.org/pub/pwg/ipp/new_VAL/pwg5100.1.pdf "bind-top", // 0x33 ftp://ftp.pwg.org/pub/pwg/ipp/new_VAL/pwg5100.1.pdf "bind-right", // 0x34 ftp://ftp.pwg.org/pub/pwg/ipp/new_VAL/pwg5100.1.pdf @@ -47,7 +53,40 @@ var enums = { "trim-after-pages", // 0x3C ftp://ftp.pwg.org/pub/pwg/candidates/cs-ippjobprinterext3v10-20120727-5100.13.pdf (IPP Everywhere) "trim-after-documents", // 0x3D ftp://ftp.pwg.org/pub/pwg/candidates/cs-ippjobprinterext3v10-20120727-5100.13.pdf (IPP Everywhere) "trim-after-copies", // 0x3E ftp://ftp.pwg.org/pub/pwg/candidates/cs-ippjobprinterext3v10-20120727-5100.13.pdf (IPP Everywhere) - "trim-after-job" // 0x3F ftp://ftp.pwg.org/pub/pwg/candidates/cs-ippjobprinterext3v10-20120727-5100.13.pdf (IPP Everywhere) + "trim-after-job", // 0x3F ftp://ftp.pwg.org/pub/pwg/candidates/cs-ippjobprinterext3v10-20120727-5100.13.pdf (IPP Everywhere) + ,,,,,, // 0x40 - 0x45 + "punch-top-left", // 0x46 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "punch-bottom-left", // 0x47 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "punch-top-right", // 0x48 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "punch-bottom-right", // 0x49 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "punch-dual-left", // 0x4A https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "punch-dual-top", // 0x4B https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "punch-dual-right", // 0x4C https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "punch-dual-bottom", // 0x4D https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "punch-triple-left", // 0x4E https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "punch-triple-top", // 0x4F https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "punch-triple-right", // 0x50 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "punch-triple-bottom", // 0x51 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "punch-quad-left", // 0x52 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "punch-quad-top", // 0x53 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "punch-quad-right", // 0x54 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "punch-quad-bottom", // 0x55 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "punch-multiple-left", // 0x56 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "punch-multiple-top", // 0x57 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "punch-multiple-right", // 0x58 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "punch-multiple-bottom", // 0x59 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "fold-accordion", // 0x5A https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "fold-double-gate", // 0x5B https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "fold-gate", // 0x5C https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "fold-half", // 0x5D https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "fold-half-z", // 0x5E https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "fold-left-gate", // 0x5F https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "fold-letter", // 0x60 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "fold-parallel", // 0x61 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "fold-poster", // 0x62 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "fold-right-gate", // 0x63 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "fold-z", // 0x64 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf + "fold-engineering-z", // 0x65 https://ftp.pwg.org/pub/pwg/candidates/cs-ippfinishings21-20170217-5100.1.pdf ]), "operations-supported": xref([ , // 0x00 diff --git a/lib/keywords.js b/lib/keywords.js index b68dd97f..8e923aea 100644 --- a/lib/keywords.js +++ b/lib/keywords.js @@ -552,6 +552,53 @@ var Printer_attribute_names = Object.keys(attributes["Job Template"]).concat(["n var media_name_or_size = media["media name"].concat(media["size name"]); var keywords = {}; +keywords["baling-type"] = keyword([ + "band", + "shrink-wrap", + "wrap" +]); +keywords["baling-type-supported"] = setof_keyword( + keywords["baling-type"] +); +keywords["baling-when"] = keyword([ + "after-sets", + "after-job" +]); +keywords["baling-when-supported"] = setof_keyword( + keywords["baling-when"] +); +keywords["binding-reference-edge"] = keyword([ + "bottom", + "left", + "right", + "top" +]); +keywords["binding-reference-edge-supported"] = setof_keyword( + keywords["binding-reference-edge"] +); +keywords["coating-sides"] = keyword([ + "back", + "both", + "front" +]); +keywords["coating-sides-supported"] = setof_keyword( + keywords["coating-sides"] +); +keywords["coating-type"] = keyword([ + "archival", + "archival-glossy", + "archival-matte", + "archival-semi-gloss", + "glossy", + "high-gloss", + "matte", + "semi-gloss", + "silicone", + "translucent" +]); +keywords["coating-type-supported"] = setof_keyword( + keywords["coating-type"] +); keywords["compression"] = keyword([ "compress", "deflate", @@ -576,6 +623,14 @@ keywords["cover-type"] = keyword([ "print-front", "print-none" ]); +keywords["covering-name"] = keyword([ + "plain", + "pre-cut", + "pre-painted" +]); +keywords["covering-name-supported"] = setof_keyword( + keywords["covering-name"] +); keywords["document-digital-signature"] = keyword([ "dss", "none", @@ -647,10 +702,189 @@ keywords["feed-orientation"] = keyword([ keywords["feed-orientation-supported"] = setof_keyword( keywords["feed-orientation"] ); +keywords["finishing-template"] = keyword([ + "bale", + "bind", + "bind-bottom", + "bind-left", + "bind-right", + "bind-top", + "booklet-maker", + "coat", + "cover", + "edge-stitch", + "edge-stitch-bottom", + "edge-stitch-left", + "edge-stitch-right", + "edge-stitch-top", + "fold", + "fold-accordion", + "fold-double-gate", + "fold-engineering-z", + "fold-gate", + "fold-half", + "fold-half-z", + "fold-left-gate", + "fold-letter", + "fold-parallel", + "fold-poster", + "fold-right-gate", + "fold-z", + "jdf-f2-1", + "jdf-f4-1", + "jdf-f4-2", + "jdf-f6-1", + "jdf-f6-2", + "jdf-f6-3", + "jdf-f6-4", + "jdf-f6-5", + "jdf-f6-6", + "jdf-f6-7", + "jdf-f6-8", + "jdf-f8-1", + "jdf-f8-2", + "jdf-f8-3", + "jdf-f8-4", + "jdf-f8-5", + "jdf-f8-6", + "jdf-f8-7", + "jdf-f10-1", + "jdf-f10-2", + "jdf-f10-3", + "jdf-f12-1", + "jdf-f12-2", + "jdf-f12-3", + "jdf-f12-4", + "jdf-f12-5", + "jdf-f12-6", + "jdf-f12-7", + "jdf-f12-8", + "jdf-f12-9", + "jdf-f12-10", + "jdf-f12-11", + "jdf-f12-12", + "jdf-f12-13", + "jdf-f12-14", + "jdf-f14-1", + "jdf-f16-1", + "jdf-f16-2", + "jdf-f16-3", + "jdf-f16-4", + "jdf-f16-5", + "jdf-f16-6", + "jdf-f16-7", + "jdf-f16-8", + "jdf-f16-9", + "jdf-f16-10", + "jdf-f16-11", + "jdf-f16-12", + "jdf-f16-13", + "jdf-f16-14", + "jdf-f18-1", + "jdf-f18-2", + "jdf-f18-3", + "jdf-f18-4", + "jdf-f18-5", + "jdf-f18-6", + "jdf-f18-7", + "jdf-f18-8", + "jdf-f18-9", + "jdf-f20-1", + "jdf-f20-2", + "jdf-f24-1", + "jdf-f24-2", + "jdf-f24-3", + "jdf-f24-4", + "jdf-f24-5", + "jdf-f24-6", + "jdf-f24-7", + "jdf-f24-8", + "jdf-f24-9", + "jdf-f24-10", + "jdf-f24-11", + "jdf-f28-1", + "jdf-f32-1", + "jdf-f32-2", + "jdf-f32-3", + "jdf-f32-4", + "jdf-f32-5", + "jdf-f32-6", + "jdf-f32-7", + "jdf-f32-8", + "jdf-f32-9", + "jdf-f36-1", + "jdf-f36-2", + "jdf-f40-1", + "jdf-f48-1", + "jdf-f48-2", + "jdf-f64-1", + "jdf-f64-2", + "jog-offset", + "laminate", + "punch", + "punch-bottom-left", + "punch-bottom-right", + "punch-dual-bottom", + "punch-dual-left", + "punch-dual-right", + "punch-dual-top", + "punch-multiple-bottom", + "punch-multiple-left", + "punch-multiple-right", + "punch-multiple-top", + "punch-quad-bottom", + "punch-quad-left", + "punch-quad-right", + "punch-quad-top", + "punch-top-left", + "punch-top-right", + "punch-triple-bottom", + "punch-triple-left", + "punch-triple-right", + "punch-triple-top", + "saddle-stitch", + "staple", + "staple-bottom-left", + "staple-bottom-right", + "staple-dual-bottom", + "staple-dual-left", + "staple-dual-right", + "staple-dual-top", + "staple-top-left", + "staple-top-right", + "staple-triple-bottom", + "staple-triple-left", + "staple-triple-right", + "staple-triple-top", + "trim", + "trim-after-copies", + "trim-after-documents", + "trim-after-job", + "trim-after-pages" +]); +keywords["finishing-template-supported"] = setof_keyword( + keywords["finishing-template"] +); keywords["finishings-col-supported"] = setof_keyword([ "finishing-template", "stitching" ]); +keywords["folding-direction"] = keyword([ + "inward", + "outward" +]); +keywords["folding-direction-supported"] = setof_keyword( + keywords["folding-direction"] +); +keywords["folding-reference-edge"] = keyword([ + "bottom", + "left", + "right", + "top" +]); +keywords["folding-reference-edge-supported"] = setof_keyword( + keywords["folding-reference-edge"] +); keywords["identify-actions"] = setof_keyword([ "display", "flash", @@ -837,6 +1071,25 @@ keywords["job-state-reasons"] = setof_keyword([ "unsupported-document-format", "warnings-detected" ]); +keywords["laminating-sides"] = keyword([ + "back", + "both", + "front" +]); +keywords["laminating-sides-supported"] = setof_keyword( + keywords["laminating-sides"] +); +keywords["laminating-type"] = keyword([ + "archival", + "glossy", + "high-gloss", + "matte", + "semi-gloss", + "translucent" +]); +keywords["laminating-type-supported"] = setof_keyword( + keywords["laminating-type"] +); keywords["media"] = keyword_name( [].concat(media["size name"], media["media name"], @@ -2046,6 +2299,15 @@ keywords["proof-print-supported"] = setof_keyword([ "media-col", "proof-print-copies" ]); +keywords["punching-reference-edge"] = keyword([ + "bottom", + "left", + "right", + "top" +]); +keywords["punching-reference-edge-supported"] = setof_keyword( + keywords["punching-reference-edge"] +); keywords["pwg-raster-document-sheet-back"] = keyword([ "flipped", "manual-tumble", @@ -2152,6 +2414,14 @@ keywords["sides-default"] = keyword( keywords["sides-supported"] = setof_keyword( keywords["sides"] ); +keywords["stitching-method"] = keyword([ + "auto", + "crimp", + "wire" +]); +keywords["stitching-method-supported"] = setof_keyword( + keywords["stitching-method"] +); keywords["stitching-reference-edge"] = keyword([ "bottom", "left", @@ -2166,6 +2436,35 @@ keywords["stitching-supported"] = setof_keyword([ "stitching-offset", "stitching-reference-edge" ]); +keywords["trimming-reference-edge"] = keyword([ + "bottom", + "left", + "right", + "top" +]); +keywords["trimming-reference-edge-supported"] = setof_keyword( + keywords["trimming-reference-edge"] +); +keywords["trimming-type"] = keyword([ + "draw-line", + "full", + "partial", + "perforate", + "score", + "tab" +]); +keywords["trimming-type-supported"] = setof_keyword( + keywords["trimming-type"] +); +keywords["trimming-when"] = keyword([ + "after-documents", + "after-job", + "after-sheets", + "after-sets" +]); +keywords["trimming-when-supported"] = setof_keyword( + keywords["trimming-when"] +); keywords["uri-authentication-supported"] = setof_keyword([ "basic", "certificate",