From 49d09caf1b3c614d3fe0507726b2d640cbb05c4f Mon Sep 17 00:00:00 2001 From: powerivq Date: Tue, 28 May 2024 18:16:55 -0700 Subject: [PATCH] WIP Upgrade dependencies for security issues --- package-lock.json | 562 +++++++++++++++--- package.json | 2 +- packages/cli/spec/cmds/lintSpec.js | 8 +- packages/cli/spec/cmds/versionSpec.js | 12 +- packages/linter/package.json | 2 +- packages/linter/src/rules/AmpImgUsesSrcSet.ts | 2 +- packages/optimizer/demo/cheerio/package.json | 2 +- packages/optimizer/spec/assets/validator.json | 1 + .../optimizer/spec/end-to-end/EndToEndSpec.js | 17 + .../spec/helpers/validatorInstance.js | 1 - .../page-experience/lib/PageDataGatherer.js | 21 +- .../lib/PageExperienceGuide.test.js | 17 +- packages/page-experience/package.json | 2 +- packages/page-experience/tests/Checks.test.js | 10 +- 14 files changed, 560 insertions(+), 99 deletions(-) create mode 100644 packages/optimizer/spec/assets/validator.json diff --git a/package-lock.json b/package-lock.json index 6a3774ebf..7bbfab43b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "devDependencies": { "@ampproject/rollup-plugin-closure-compiler": "0.27.0", "@babel/core": "7.13.10", - "@types/cheerio": "0.22.28", + "@types/cheerio": "0.22.35", "@types/debug": "4.1.5", "@types/diff": "5.0.0", "@types/escape-html": "1.0.0", @@ -5527,9 +5527,10 @@ } }, "node_modules/@types/cheerio": { - "version": "0.22.28", + "version": "0.22.35", + "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.35.tgz", + "integrity": "sha512-yD57BchKRvTV+JD53UZ6PD8KWY5g5rvvMLRnZR3EQBCZXiDT/HR+pKpMzFGlWNhFrXlo7VPZXtKvIEwZkAWOIA==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -6818,7 +6819,8 @@ }, "node_modules/boolbase": { "version": "1.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/brace-expansion": { "version": "1.1.11", @@ -7208,42 +7210,166 @@ "dev": true }, "node_modules/cheerio": { - "version": "1.0.0-rc.5", - "license": "MIT", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", "dependencies": { - "cheerio-select-tmp": "^0.1.0", - "dom-serializer": "~1.2.0", - "domhandler": "^4.0.0", - "entities": "~2.1.0", - "htmlparser2": "^6.0.0", - "parse5": "^6.0.0", - "parse5-htmlparser2-tree-adapter": "^6.0.0" + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" }, "engines": { - "node": ">= 0.12" + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" } }, - "node_modules/cheerio-select-tmp": { - "version": "0.1.1", - "license": "BSD-2-Clause", + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "dependencies": { - "css-select": "^3.1.2", - "css-what": "^4.0.0", - "domelementtype": "^2.1.0", - "domhandler": "^4.0.0", - "domutils": "^2.4.4" + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" }, "funding": { "url": "https://github.com/sponsors/fb55" } }, + "node_modules/cheerio-select/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/cheerio/node_modules/entities": { - "version": "2.1.0", - "license": "BSD-2-Clause", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/cheerio/node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/chokidar": { "version": "3.5.1", "dev": true, @@ -8196,22 +8322,75 @@ "license": "BSD-2-Clause" }, "node_modules/css-select": { - "version": "3.1.2", - "license": "BSD-2-Clause", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dependencies": { "boolbase": "^1.0.0", - "css-what": "^4.0.0", - "domhandler": "^4.0.0", - "domutils": "^2.4.3", - "nth-check": "^2.0.0" + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" }, "funding": { "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css-select/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/css-select/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/css-what": { - "version": "4.0.0", - "license": "BSD-2-Clause", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "engines": { "node": ">= 6" }, @@ -8548,14 +8727,15 @@ "dev": true }, "node_modules/domelementtype": { - "version": "2.2.0", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } - ], - "license": "BSD-2-Clause" + ] }, "node_modules/domhandler": { "version": "4.2.2", @@ -10769,7 +10949,9 @@ } }, "node_modules/htmlparser2": { - "version": "6.0.0", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -10777,12 +10959,62 @@ "url": "https://github.com/sponsors/fb55" } ], - "license": "MIT", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.4.4", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/htmlparser2/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/htmlparser2/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/htmlparser2/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/http-cache-semantics": { @@ -18106,7 +18338,8 @@ }, "node_modules/nth-check": { "version": "2.1.1", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dependencies": { "boolbase": "^1.0.0" }, @@ -18731,10 +18964,12 @@ }, "node_modules/parse5": { "version": "6.0.1", + "dev": true, "license": "MIT" }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "6.0.1", + "dev": true, "license": "MIT", "dependencies": { "parse5": "^6.0.1" @@ -23243,7 +23478,7 @@ "@ampproject/toolbox-validator-rules": "2.9.0", "amphtml-validator": "1.0.35", "chalk": "4.1.0", - "cheerio": "1.0.0-rc.5", + "cheerio": "1.0.0-rc.12", "commander": "9.3.0", "cross-fetch": "3.1.5", "debug": "4.3.1", @@ -23501,7 +23736,7 @@ "license": "Apache-2.0", "dependencies": { "@ampproject/toolbox-linter": "2.9.0", - "cheerio": "1.0.0-rc.5", + "cheerio": "1.0.0-rc.12", "css-font-face-src": "1.0.0", "postcss": "8.2.8", "postcss-safe-parser": "5.0.2", @@ -23694,7 +23929,7 @@ "@ampproject/toolbox-validator-rules": "2.9.0", "amphtml-validator": "1.0.35", "chalk": "4.1.0", - "cheerio": "1.0.0-rc.5", + "cheerio": "1.0.0-rc.12", "commander": "9.3.0", "cross-fetch": "3.1.5", "debug": "4.3.1", @@ -23852,7 +24087,7 @@ "version": "file:packages/page-experience", "requires": { "@ampproject/toolbox-linter": "2.9.0", - "cheerio": "1.0.0-rc.5", + "cheerio": "1.0.0-rc.12", "css-font-face-src": "1.0.0", "postcss": "8.2.8", "postcss-safe-parser": "5.0.2", @@ -27808,7 +28043,9 @@ } }, "@types/cheerio": { - "version": "0.22.28", + "version": "0.22.35", + "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.35.tgz", + "integrity": "sha512-yD57BchKRvTV+JD53UZ6PD8KWY5g5rvvMLRnZR3EQBCZXiDT/HR+pKpMzFGlWNhFrXlo7VPZXtKvIEwZkAWOIA==", "dev": true, "requires": { "@types/node": "*" @@ -28751,7 +28988,9 @@ } }, "boolbase": { - "version": "1.0.0" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "brace-expansion": { "version": "1.1.11", @@ -29003,30 +29242,117 @@ "dev": true }, "cheerio": { - "version": "1.0.0-rc.5", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", "requires": { - "cheerio-select-tmp": "^0.1.0", - "dom-serializer": "~1.2.0", - "domhandler": "^4.0.0", - "entities": "~2.1.0", - "htmlparser2": "^6.0.0", - "parse5": "^6.0.0", - "parse5-htmlparser2-tree-adapter": "^6.0.0" + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" }, "dependencies": { + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, "entities": { - "version": "2.1.0" + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + }, + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "requires": { + "entities": "^4.4.0" + } + }, + "parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "requires": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + } } } }, - "cheerio-select-tmp": { - "version": "0.1.1", + "cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "requires": { - "css-select": "^3.1.2", - "css-what": "^4.0.0", - "domelementtype": "^2.1.0", - "domhandler": "^4.0.0", - "domutils": "^2.4.4" + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "dependencies": { + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + } } }, "chokidar": { @@ -29702,17 +30028,56 @@ "version": "1.0.0" }, "css-select": { - "version": "3.1.2", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "requires": { "boolbase": "^1.0.0", - "css-what": "^4.0.0", - "domhandler": "^4.0.0", - "domutils": "^2.4.3", - "nth-check": "^2.0.0" + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "dependencies": { + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + } } }, "css-what": { - "version": "4.0.0" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" }, "cssnano-preset-simple": { "version": "2.0.0", @@ -29937,7 +30302,9 @@ "dev": true }, "domelementtype": { - "version": "2.2.0" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" }, "domhandler": { "version": "4.2.2", @@ -31406,12 +31773,49 @@ } }, "htmlparser2": { - "version": "6.0.0", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.4.4", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + }, + "dependencies": { + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + } } }, "http-cache-semantics": { @@ -36718,6 +37122,8 @@ }, "nth-check": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "requires": { "boolbase": "^1.0.0" } @@ -37150,10 +37556,12 @@ } }, "parse5": { - "version": "6.0.1" + "version": "6.0.1", + "dev": true }, "parse5-htmlparser2-tree-adapter": { "version": "6.0.1", + "dev": true, "requires": { "parse5": "^6.0.1" } diff --git a/package.json b/package.json index 6090b2fe7..40c003d80 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "devDependencies": { "@ampproject/rollup-plugin-closure-compiler": "0.27.0", "@babel/core": "7.13.10", - "@types/cheerio": "0.22.28", + "@types/cheerio": "0.22.35", "@types/debug": "4.1.5", "@types/diff": "5.0.0", "@types/escape-html": "1.0.0", diff --git a/packages/cli/spec/cmds/lintSpec.js b/packages/cli/spec/cmds/lintSpec.js index 029192de9..4eed12aba 100644 --- a/packages/cli/spec/cmds/lintSpec.js +++ b/packages/cli/spec/cmds/lintSpec.js @@ -16,17 +16,23 @@ 'use strict'; -const lintCmd = require('../../lib/cmds/lint.js'); const MockLogger = require('../helpers/MockLogger'); +const nock = require('nock'); describe('lint', () => { const mockLogger = new MockLogger(); + beforeEach(() => { + nock('https://cdn.ampproject.org').get('/caches.json').reply(200, '{"caches": []}'); + }); + afterEach(() => { mockLogger.clear(); + nock.cleanAll(); }); it('runs at least one successful test', async () => { + const lintCmd = require('../../lib/cmds/lint.js'); await lintCmd( ['lint', 'https://preview.amp.dev/documentation/examples/introduction/hello_world'], mockLogger diff --git a/packages/cli/spec/cmds/versionSpec.js b/packages/cli/spec/cmds/versionSpec.js index a95d2e8c0..5d5d06b12 100644 --- a/packages/cli/spec/cmds/versionSpec.js +++ b/packages/cli/spec/cmds/versionSpec.js @@ -16,15 +16,25 @@ 'use strict'; -const versionCmd = require('../../lib/cmds/version'); const packageInfo = require('../../package.json'); const MockLogger = require('../helpers/MockLogger'); +const nock = require('nock'); describe('Version', () => { const mockLogger = new MockLogger(); + beforeEach(() => { + nock('https://cdn.ampproject.org') + .get('/rtv/metadata') + .reply( + 200, + '{"ampRuntimeVersion":"012405160547000","ampCssUrl":"https://cdn.ampproject.org/rtv/012405160547000/v0.css","canaryPercentage":"0.005","diversions":["002405231944000","022405160547000","032405231944000","042405281751000","052405160547000"],"ltsRuntimeVersion":"012404230718000","ltsCssUrl":"https://cdn.ampproject.org/rtv/012404230718000/v0.css"}' + ); + }); + it('prints the version', () => { mockLogger.clear(); + const versionCmd = require('../../lib/cmds/version'); return versionCmd({}, mockLogger).then(() => { const output = mockLogger.getLogs(); expect(output).toBe(`v${packageInfo.version}`); diff --git a/packages/linter/package.json b/packages/linter/package.json index 86584e80d..2af76965e 100644 --- a/packages/linter/package.json +++ b/packages/linter/package.json @@ -17,7 +17,7 @@ "@ampproject/toolbox-validator-rules": "2.9.0", "amphtml-validator": "1.0.35", "chalk": "4.1.0", - "cheerio": "1.0.0-rc.5", + "cheerio": "1.0.0-rc.12", "commander": "9.3.0", "cross-fetch": "3.1.5", "debug": "4.3.1", diff --git a/packages/linter/src/rules/AmpImgUsesSrcSet.ts b/packages/linter/src/rules/AmpImgUsesSrcSet.ts index 44de1fd99..4e5d99ee8 100644 --- a/packages/linter/src/rules/AmpImgUsesSrcSet.ts +++ b/packages/linter/src/rules/AmpImgUsesSrcSet.ts @@ -15,7 +15,7 @@ export class AmpImgUsesSrcSet extends Rule { let layout = $(e).attr('layout'); const srcset = $(e).attr('srcset'); const parent = $(e).parent(); - if (parent.prop('tagName').startsWith('AMP-')) { + if (parent.prop('tagName')?.startsWith('AMP-')) { const parentLayout = $(parent).attr('layout'); if (parentLayout) { layout = parentLayout; diff --git a/packages/optimizer/demo/cheerio/package.json b/packages/optimizer/demo/cheerio/package.json index 94d6ae63e..e022ba39e 100644 --- a/packages/optimizer/demo/cheerio/package.json +++ b/packages/optimizer/demo/cheerio/package.json @@ -9,7 +9,7 @@ "author": "AMPHTML team", "license": "Apache-2.0", "dependencies": { - "cheerio": "^1.0.0-rc.2" + "cheerio": "^1.0.0-rc.22" }, "devDependencies": { "@ampproject/toolbox-optimizer": "2.5.14" diff --git a/packages/optimizer/spec/assets/validator.json b/packages/optimizer/spec/assets/validator.json new file mode 100644 index 000000000..955738afb --- /dev/null +++ b/packages/optimizer/spec/assets/validator.json @@ -0,0 +1 @@ +{"tags":[{"tagName":"!DOCTYPE","specName":"html doctype","mandatory":true,"unique":true,"mandatoryParent":"$ROOT","attrs":[{"name":"html","mandatory":true,"value":[""]},{"name":"lang","deprecation":"html","deprecationUrl":"https://github.com/ampproject/amphtml/issues/25926"}],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup","htmlFormat":["AMP","AMP4EMAIL"],"explicitAttrsOnly":true,"descriptiveName":"html !doctype"},{"tagName":"!DOCTYPE","specName":"html doctype (AMP4ADS)","mandatory":true,"unique":true,"mandatoryParent":"$ROOT","attrs":[{"name":"html","mandatory":true,"value":[""]}],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup","htmlFormat":["AMP4ADS"],"descriptiveName":"html !doctype"},{"tagName":"HTML","mandatory":true,"unique":true,"mandatoryParent":"!DOCTYPE","specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"],"disabledBy":["transformed"]},{"tagName":"HTML","specName":"html (transformed)","mandatory":true,"unique":true,"mandatoryParent":"!DOCTYPE","attrs":[{"name":"i-amphtml-layout","value":[""]},{"name":"i-amphtml-no-boilerplate","value":[""]}],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup","htmlFormat":["AMP"],"enabledBy":["transformed"]},{"tagName":"HEAD","mandatory":true,"unique":true,"mandatoryParent":"HTML","specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"TITLE","specName":"title","attrs":[{"name":"[text]"}],"htmlFormat":["AMP","AMP4ADS"]},{"tagName":"TITLE","specName":"title [AMP4EMAIL]","attrs":[{"name":"[text]"}],"deprecation":"Title tags in email have no meaning. This tag may become invalid in the future.","deprecationUrl":"https://github.com/ampproject/amphtml/issues/22318","htmlFormat":["AMP4EMAIL"]},{"tagName":"BASE","unique":true,"mandatoryParent":"HEAD","attrs":[{"name":"href","value":["/"]},{"name":"target","valueCasei":["_blank","_self","_top"]}],"htmlFormat":["AMP","AMP4ADS"]},{"tagName":"LINK","specName":"link rel=","attrs":[{"name":"href"},{"name":"rel","mandatory":true,"disallowedValueRegex":"(^|\\s)(canonical|components|import|manifest|modulepreload|preload|serviceworker|stylesheet|subresource)(\\s|$)"}],"attrLists":["common-link-attrs"],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#html-tags","disallowedAncestor":["TEMPLATE"],"htmlFormat":["AMP","AMP4ADS"]},{"tagName":"LINK","specName":"link rel=canonical","mandatory":true,"unique":true,"mandatoryParent":"HEAD","attrs":[{"name":"href","mandatory":true,"disallowedValueRegex":"__amp_source_origin","valueUrl":{"protocol":["http","https"]}},{"name":"rel","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["canonical"]}],"attrLists":["common-link-attrs"],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup","htmlFormat":["AMP"],"descriptiveName":"link rel=canonical"},{"tagName":"LINK","specName":"link rel=manifest","mandatoryParent":"HEAD","attrs":[{"name":"href","mandatory":true,"disallowedValueRegex":"__amp_source_origin","valueUrl":{"protocol":["https"]}},{"name":"rel","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["manifest"]}],"attrLists":["common-link-attrs"],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#html-tags","htmlFormat":["AMP","AMP4ADS"],"satisfiesCondition":["amp-app-banner data source"],"descriptiveName":"link rel=manifest"},{"tagName":"LINK","specName":"link rel=modulepreload","mandatoryParent":"HEAD","attrs":[{"name":"as","mandatory":true,"value":["script"]},{"name":"crossorigin","mandatory":true,"value":["anonymous"]},{"name":"href","mandatory":true,"valueRegex":".*\\.mjs$"},{"name":"rel","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["modulepreload"]}],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#html-tags","htmlFormat":["AMP"],"descriptiveName":"link rel=modulepreload"},{"tagName":"LINK","specName":"link rel=preload","attrs":[{"name":"as"},{"name":"href"},{"name":"rel","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["preload"]},{"name":"imagesrcset","disallowedValueRegex":"__amp_source_origin","valueUrl":{"protocol":["http","https"]}},{"name":"imagesizes"}],"attrLists":["common-link-attrs"],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#html-tags","disallowedAncestor":["TEMPLATE"],"htmlFormat":["AMP","AMP4ADS"],"descriptiveName":"link rel=preload"},{"tagName":"LINK","specName":"link rel=stylesheet for amp-story-1.0 css","mandatoryParent":"HEAD","attrs":[{"name":"crossorigin"},{"name":"href","mandatory":true,"value":["https://cdn.ampproject.org/v0/amp-story-1.0.css","https://cdn.ampproject.org/lts/v0/amp-story-1.0.css","https://ampjs.org/v0/amp-story-1.0.css","https://ampjs.org/lts/v0/amp-story-1.0.css"]},{"name":"integrity"},{"name":"media"},{"name":"rel","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["stylesheet"]},{"name":"type","valueCasei":["text/css"]},{"name":"amp-extension","mandatory":true,"valueCasei":["amp-story"]}],"attrLists":["nonce-attr"],"htmlFormat":["AMP"],"enabledBy":["transformed"],"descriptiveName":"link rel=stylesheet for amp-story-1.0 css"},{"tagName":"LINK","specName":"link rel=stylesheet for fonts","mandatoryParent":"HEAD","attrs":[{"name":"async"},{"name":"crossorigin"},{"name":"href","mandatory":true,"valueRegex":"https://cdn\\.materialdesignicons\\.com/([0-9]+\\.?)+/css/materialdesignicons\\.min\\.css|https://cloud\\.typography\\.com/[0-9]*/[0-9]*/css/fonts\\.css|https://fast\\.fonts\\.net/.*|https://fonts\\.googleapis\\.com/css2?\\?.*|https://fonts\\.googleapis\\.com/icon\\?.*|https://fonts\\.googleapis\\.com/earlyaccess/.*\\.css|https://maxcdn\\.bootstrapcdn\\.com/font-awesome/([0-9]+\\.?)+/css/font-awesome\\.min\\.css(\\?.*)?|https://(use|pro|kit)\\.fontawesome\\.com/releases/v([0-9]+\\.?)+/css/[0-9a-zA-Z-]+\\.css|https://(use|pro|kit)\\.fontawesome\\.com/[0-9a-zA-Z-]+\\.css|https://use\\.typekit\\.net/[\\w\\p{L}\\p{N}_]+\\.css|https://cdnjs\\.cloudflare\\.com/ajax/libs/font-awesome/([0-9]+\\.?)+/css/[0-9a-zA-Z-]+\\.min\\.css"},{"name":"integrity"},{"name":"media"},{"name":"rel","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["stylesheet"]},{"name":"type","valueCasei":["text/css"]}],"attrLists":["nonce-attr"],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#custom-fonts","htmlFormat":["AMP","AMP4ADS"],"namedId":"LINK_FONT_STYLESHEET","descriptiveName":"link rel=stylesheet for fonts"},{"tagName":"LINK","specName":"link itemprop=sameAs","attrs":[{"name":"href","mandatory":true},{"name":"itemprop","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["sameas"]}],"attrLists":["common-link-attrs"],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#html-tags","htmlFormat":["AMP","AMP4ADS"],"descriptiveName":"link itemprop=sameAs"},{"tagName":"LINK","specName":"link itemprop=","attrs":[{"name":"href","mandatory":true},{"name":"itemprop","mandatory":true}],"attrLists":["common-link-attrs"],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#html-tags","htmlFormat":["AMP","AMP4ADS"],"descriptiveName":"link itemprop="},{"tagName":"LINK","specName":"link property=","attrs":[{"name":"href","mandatory":true},{"name":"property","mandatory":true}],"attrLists":["common-link-attrs"],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#html-tags","htmlFormat":["AMP","AMP4ADS"],"descriptiveName":"link property="},{"tagName":"META","specName":"meta charset=utf-8","mandatory":true,"unique":true,"mandatoryParent":"HEAD","attrs":[{"name":"charset","mandatory":true,"dispatchKey":"NAME_DISPATCH","valueCasei":["utf-8"]}],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"],"descriptiveName":"meta charset=utf-8"},{"tagName":"META","specName":"meta name=viewport","mandatory":true,"unique":true,"mandatoryParent":"HEAD","attrs":[{"name":"content","mandatory":true,"valueProperties":{"properties":[{"name":"width","mandatory":true,"value":"device-width"},{"name":"height"},{"name":"initial-scale"},{"name":"minimum-scale"},{"name":"maximum-scale"},{"name":"shrink-to-fit"},{"name":"user-scalable"},{"name":"viewport-fit"}]}},{"name":"name","mandatory":true,"value":["viewport"],"dispatchKey":"NAME_VALUE_DISPATCH"}],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup","htmlFormat":["AMP","AMP4ADS"],"descriptiveName":"meta name=viewport"},{"tagName":"META","specName":"meta http-equiv=X-UA-Compatible","attrs":[{"name":"content","mandatory":true,"valueProperties":{"properties":[{"name":"ie","value":"edge"},{"name":"chrome","value":"1"}]}},{"name":"http-equiv","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["x-ua-compatible"]}],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#html-tags","mandatoryAncestor":"HEAD","htmlFormat":["AMP","AMP4ADS"],"descriptiveName":"meta http-equiv=X-UA-Compatible"},{"tagName":"META","specName":"meta name=apple-itunes-app","mandatoryParent":"HEAD","attrs":[{"name":"content","mandatory":true,"valueRegex":".*app-id=.*"},{"name":"name","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["apple-itunes-app"]}],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#html-tags","htmlFormat":["AMP","AMP4ADS"],"satisfiesCondition":["amp-app-banner data source"]},{"tagName":"META","specName":"meta name=amp-experiments-opt-in","mandatoryParent":"HEAD","attrs":[{"name":"content","mandatory":true},{"name":"name","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["amp-experiments-opt-in"]}],"htmlFormat":["AMP","AMP4ADS"]},{"tagName":"META","specName":"meta name=amp-3p-iframe-src","mandatoryParent":"HEAD","attrs":[{"name":"content","mandatory":true,"valueUrl":{"protocol":["https"]}},{"name":"name","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["amp-3p-iframe-src"]}],"specUrl":"https://amp.dev/documentation/components/amp-ad/","htmlFormat":["AMP"]},{"tagName":"META","specName":"meta name=amp-consent-blocking","unique":true,"mandatoryParent":"HEAD","attrs":[{"name":"content","mandatory":true},{"name":"name","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["amp-consent-blocking"]}],"htmlFormat":["AMP"],"satisfiesCondition":["meta name=amp-consent-blocking"]},{"tagName":"META","specName":"meta name=amp-experiment-token","mandatoryParent":"HEAD","attrs":[{"name":"content","mandatory":true},{"name":"name","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["amp-experiment-token"]}],"htmlFormat":["AMP"]},{"tagName":"META","specName":"meta name=amp-link-variable-allowed-origin","mandatoryParent":"HEAD","attrs":[{"name":"content","mandatory":true},{"name":"name","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["amp-link-variable-allowed-origin"]}],"htmlFormat":["AMP"]},{"tagName":"META","specName":"meta name=amp-google-clientid-id-api","mandatoryParent":"HEAD","attrs":[{"name":"content","mandatory":true},{"name":"name","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["amp-google-client-id-api"]}],"htmlFormat":["AMP"]},{"tagName":"META","specName":"meta name=amp-ad-doubleclick-sra","mandatoryParent":"HEAD","attrs":[{"name":"name","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["amp-ad-doubleclick-sra"]}],"htmlFormat":["AMP"]},{"tagName":"META","specName":"meta name=amp-list-load-more","mandatoryParent":"HEAD","attrs":[{"name":"content","mandatory":true},{"name":"name","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["amp-list-load-more"]}],"htmlFormat":["AMP"]},{"tagName":"META","specName":"meta name=amp-recaptcha-input","mandatoryParent":"HEAD","attrs":[{"name":"content","mandatory":true},{"name":"name","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["amp-recaptcha-input"]}],"htmlFormat":["AMP"]},{"tagName":"META","specName":"meta name=amp-script-src","mandatoryParent":"HEAD","attrs":[{"name":"content","mandatory":true},{"name":"name","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["amp-script-src"]}],"htmlFormat":["AMP"]},{"tagName":"META","specName":"meta name=amp4ads-id","mandatoryParent":"HEAD","attrs":[{"name":"content","mandatory":true},{"name":"name","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["amp4ads-id"]}],"htmlFormat":["AMP4ADS"]},{"tagName":"META","specName":"meta name= and content=","attrs":[{"name":"content"},{"name":"itemprop"},{"name":"name","disallowedValueRegex":"(^|\\s)(amp-.*|amp4ads-.*|apple-itunes-app|content-disposition|revisit-after|viewport)(\\s|$)"},{"name":"media"},{"name":"property"},{"name":"scheme"}],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"META","specName":"meta http-equiv=Content-Type","attrs":[{"name":"content","mandatory":true,"valueCasei":["text/html; charset=utf-8"]},{"name":"http-equiv","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["content-type"]}],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#html-tags","mandatoryAncestor":"HEAD","htmlFormat":["AMP","AMP4ADS"]},{"tagName":"META","specName":"meta http-equiv=content-language","attrs":[{"name":"content","mandatory":true},{"name":"http-equiv","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["content-language"]}],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#html-tags","mandatoryAncestor":"HEAD","htmlFormat":["AMP","AMP4ADS"]},{"tagName":"META","specName":"meta http-equiv=pics-label","attrs":[{"name":"content","mandatory":true},{"name":"http-equiv","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["pics-label"]}],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#html-tags","mandatoryAncestor":"HEAD","htmlFormat":["AMP","AMP4ADS"]},{"tagName":"META","specName":"meta http-equiv=imagetoolbar","attrs":[{"name":"content","mandatory":true},{"name":"http-equiv","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["imagetoolbar"]}],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#html-tags","mandatoryAncestor":"HEAD","htmlFormat":["AMP","AMP4ADS"]},{"tagName":"META","specName":"meta http-equiv=Content-Style-Type","attrs":[{"name":"content","mandatory":true,"valueCasei":["text/css"]},{"name":"http-equiv","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["content-style-type"]}],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#html-tags","mandatoryAncestor":"HEAD","htmlFormat":["AMP","AMP4ADS"]},{"tagName":"META","specName":"meta http-equiv=Content-Script-Type","attrs":[{"name":"content","mandatory":true,"valueCasei":["text/javascript"]},{"name":"http-equiv","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["content-script-type"]}],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#html-tags","mandatoryAncestor":"HEAD","htmlFormat":["AMP","AMP4ADS"]},{"tagName":"META","specName":"meta http-equiv=origin-trial","attrs":[{"name":"content","mandatory":true},{"name":"http-equiv","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["origin-trial"]}],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#html-tags","mandatoryAncestor":"HEAD","htmlFormat":["AMP","AMP4ADS"]},{"tagName":"META","specName":"meta http-equiv=resource-type","attrs":[{"name":"content","mandatory":true},{"name":"http-equiv","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["resource-type"]}],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#html-tags","mandatoryAncestor":"HEAD","htmlFormat":["AMP","AMP4ADS"]},{"tagName":"META","specName":"meta http-equiv=x-dns-prefetch-control","attrs":[{"name":"content","mandatory":true,"valueCasei":["off","on"]},{"name":"http-equiv","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["x-dns-prefetch-control"]}],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#html-tags","mandatoryAncestor":"HEAD","htmlFormat":["AMP"]},{"tagName":"META","specName":"meta name=amp-ad-enable-refresh","attrs":[{"name":"content","mandatory":true},{"name":"name","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["amp-ad-enable-refresh"]}],"mandatoryAncestor":"HEAD","htmlFormat":["AMP","AMP4ADS"]},{"tagName":"META","specName":"meta name=amp-to-amp-navigation","unique":true,"mandatoryParent":"HEAD","attrs":[{"name":"content","mandatory":true},{"name":"name","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["amp-to-amp-navigation"]}],"htmlFormat":["AMP"]},{"tagName":"META","specName":"meta name=amp-cta-type","unique":true,"mandatoryParent":"HEAD","attrs":[{"name":"content","mandatory":true},{"name":"name","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["amp-cta-type"]}],"htmlFormat":["AMP4ADS"]},{"tagName":"META","specName":"meta name=amp-cta-url","unique":true,"mandatoryParent":"HEAD","attrs":[{"name":"content","mandatory":true},{"name":"name","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["amp-cta-url"]}],"htmlFormat":["AMP4ADS"]},{"tagName":"META","specName":"meta name=amp-cta-landing-page-type","unique":true,"mandatoryParent":"HEAD","attrs":[{"name":"content","mandatory":true,"valueCasei":["amp","nonamp","story"]},{"name":"name","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["amp-cta-landing-page-type"]}],"htmlFormat":["AMP4ADS"]},{"tagName":"META","specName":"meta name=amp4ads-vars-*","mandatoryParent":"HEAD","attrs":[{"name":"content","mandatory":true},{"name":"name","mandatory":true,"valueRegex":"amp4ads-vars-.+"}],"htmlFormat":["AMP4ADS"]},{"tagName":"BODY","mandatory":true,"unique":true,"mandatoryParent":"HTML","specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"ARTICLE","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"SECTION","attrLists":["poool-access-attrs"],"disallowedAncestor":["AMP-ACCORDION"],"htmlFormat":["AMP","AMP4ADS"]},{"tagName":"SECTION","specName":"section (AMP4EMAIL)","disallowedAncestor":["AMP-ACCORDION"],"htmlFormat":["AMP4EMAIL"]},{"tagName":"NAV","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"ASIDE","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"H1","attrs":[{"name":"align"}],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"H2","attrs":[{"name":"align"}],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"H3","attrs":[{"name":"align"}],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"H4","attrs":[{"name":"align"}],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"H5","attrs":[{"name":"align"}],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"H6","attrs":[{"name":"align"}],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"HEADER","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"FOOTER","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"ADDRESS","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"P","attrs":[{"name":"align"}],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"HR","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"PRE","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"BLOCKQUOTE","attrs":[{"name":"align"}],"attrLists":["cite-attr"],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"OL","attrs":[{"name":"reversed","value":[""]},{"name":"start","valueRegex":"[0-9]*"},{"name":"type","valueRegex":"[1AaIi]"}],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"UL","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"LI","attrs":[{"name":"value","valueRegex":"[0-9]*"}],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"DL","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"DT","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"DD","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"FIGURE","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"FIGCAPTION","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"DIV","attrs":[{"name":"align"}],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"MAIN","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"A","attrs":[{"name":"attributionsrc","valueUrl":{"protocol":["https"],"allowEmpty":true}},{"name":"border"},{"name":"download"},{"name":"href","disallowedValueRegex":"__amp_source_origin","valueUrl":{"protocol":["ftp","geo","http","https","mailto","maps","bip","bbmi","chrome","itms-services","facetime","fb-me","fb-messenger","feed","intent","line","microsoft-edge","skype","sms","snapchat","tel","tg","threema","twitter","viber","webcal","web+mastodon","wh","whatsapp"],"allowEmpty":true}},{"name":"hreflang"},{"name":"media"},{"name":"referrerpolicy"},{"name":"rel","disallowedValueRegex":"(^|\\s)(components|dns-prefetch|import|manifest|preconnect|prefetch|preload|prerender|serviceworker|stylesheet|subresource)(\\s|$)"},{"name":"role","implicit":true},{"name":"show-tooltip","value":["auto","true"]},{"name":"tabindex","implicit":true},{"name":"target","value":["_blank","_self","_top"]},{"name":"type","valueCasei":["text/html","application/rss+xml"]},{"name":"[href]"}],"attrLists":["click-attributions","name-attr","private-click-measurement-attributes"],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#links","htmlFormat":["AMP","AMP4ADS"]},{"tagName":"A","specName":"A (AMP4EMAIL)","attrs":[{"name":"border"},{"name":"href","disallowedValueRegex":"__amp_source_origin|(.|\\s){{|}}(.|\\s)|^{{.*[^}][^}]$|^[^{][^{].*}}$|^}}|{{$|{{#|{{/|{{\\^","valueUrl":{"protocol":["http","https","mailto","tel"],"allowRelative":false}},{"name":"hreflang"},{"name":"media"},{"name":"role","implicit":true},{"name":"tabindex","implicit":true},{"name":"target","value":["_blank"]},{"name":"type","valueCasei":["text/html"]}],"htmlFormat":["AMP4EMAIL"]},{"tagName":"EM","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"STRONG","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"SMALL","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"S","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"CITE","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"Q","attrLists":["cite-attr"],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"DFN","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"ABBR","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"DATA","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"TIME","attrs":[{"name":"datetime"},{"name":"pubdate","value":[""]}],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"CODE","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"VAR","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"SAMP","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"KBD","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"SUB","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"SUP","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"I","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"B","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"U","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"MARK","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"RUBY","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"RB","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"RT","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"RTC","htmlFormat":["AMP","AMP4ADS"]},{"tagName":"RP","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"BDI","htmlFormat":["AMP","AMP4ADS"]},{"tagName":"BDO","attrs":[{"name":"dir"}],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"SPAN","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"BR","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"WBR","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"INS","attrs":[{"name":"datetime"}],"attrLists":["cite-attr"],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"DEL","attrs":[{"name":"datetime"}],"attrLists":["cite-attr"],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"IMG","specName":"Standard Img","attrs":[{"name":"decoding","valueCasei":["async"]}],"attrLists":["img-attrs","mandatory-src-or-srcset"],"disallowedAncestor":["AMP-IMG","AMP-STORY"],"htmlFormat":["AMP"],"descriptiveName":"img"},{"tagName":"IMG","specName":"Hero Img","attrs":[{"name":"data-hero","mandatory":true,"dispatchKey":"NAME_DISPATCH"},{"name":"decoding","valueCasei":["async"]},{"name":"sizes"}],"attrLists":["img-attrs","mandatory-src-or-srcset"],"disallowedAncestor":["AMP-IMG","AMP-STORY"],"htmlFormat":["AMP"],"descriptiveName":"img"},{"tagName":"IMG","specName":"Img using srcset","attrs":[{"name":"decoding","valueCasei":["async"]},{"name":"sizes"}],"attrLists":["img-attrs","mandatory-src-or-srcset"],"disallowedAncestor":["AMP-IMG","AMP-STORY"],"htmlFormat":["AMP"],"descriptiveName":"img"},{"tagName":"IMAGE","specName":"Standard Image","attrs":[{"name":"decoding","valueCasei":["async"]}],"attrLists":["img-attrs","mandatory-src-or-srcset"],"disallowedAncestor":["AMP-IMG","AMP-STORY"],"htmlFormat":["AMP"],"descriptiveName":"img"},{"tagName":"IMAGE","specName":"Hero Image","attrs":[{"name":"data-hero","mandatory":true,"dispatchKey":"NAME_DISPATCH"},{"name":"decoding","valueCasei":["async"]},{"name":"sizes"}],"attrLists":["img-attrs","mandatory-src-or-srcset"],"disallowedAncestor":["AMP-IMG","AMP-STORY"],"htmlFormat":["AMP"],"descriptiveName":"img"},{"tagName":"IMAGE","specName":"Image using srcset","attrs":[{"name":"decoding","valueCasei":["async"]},{"name":"sizes"}],"attrLists":["img-attrs","mandatory-src-or-srcset"],"disallowedAncestor":["AMP-IMG","AMP-STORY"],"htmlFormat":["AMP"],"descriptiveName":"img"},{"tagName":"IMG","specName":"noscript > img","attrs":[{"name":"attribution"},{"name":"decoding","valueCasei":["async","auto","sync"]},{"name":"intrinsicsize"},{"name":"sizes"}],"attrLists":["img-attrs","mandatory-src-or-srcset"],"specUrl":"https://amp.dev/documentation/components/amp-img/","mandatoryAncestor":"NOSCRIPT","mandatoryAncestorSuggestedAlternative":"AMP-IMG","htmlFormat":["AMP"],"descriptiveName":"img"},{"tagName":"IFRAME","attrs":[{"name":"frameborder","value":["0","1"]},{"name":"height"},{"name":"referrerpolicy"},{"name":"resizable","value":[""]},{"name":"sandbox"},{"name":"scrolling","value":["auto","yes","no"]},{"name":"src","disallowedValueRegex":"__amp_source_origin","mandatoryOneof":"['src', 'srcdoc']","valueUrl":{"protocol":["data","https"],"allowRelative":false}},{"name":"srcdoc","mandatoryOneof":"['src', 'srcdoc']"},{"name":"width"}],"attrLists":["name-attr"],"specUrl":"https://amp.dev/documentation/components/amp-iframe/","mandatoryAncestor":"NOSCRIPT","mandatoryAncestorSuggestedAlternative":"AMP-IFRAME","htmlFormat":["AMP"]},{"tagName":"VIDEO","attrs":[{"name":"autoplay"},{"name":"controls"},{"name":"height"},{"name":"loop"},{"name":"muted","deprecation":"autoplay","deprecationUrl":"https://amp.dev/documentation/components/amp-video/"},{"name":"playsinline"},{"name":"poster"},{"name":"preload"},{"name":"src","disallowedValueRegex":"__amp_source_origin","valueUrl":{"protocol":["data","https"],"allowRelative":false}},{"name":"width"}],"specUrl":"https://amp.dev/documentation/components/amp-video/","mandatoryAncestor":"NOSCRIPT","mandatoryAncestorSuggestedAlternative":"AMP-VIDEO","htmlFormat":["AMP"]},{"tagName":"AUDIO","attrs":[{"name":"autoplay"},{"name":"controls"},{"name":"loop"},{"name":"muted"},{"name":"preload"},{"name":"src","disallowedValueRegex":"__amp_source_origin","valueUrl":{"protocol":["data","https"],"allowRelative":false}}],"specUrl":"https://amp.dev/documentation/components/amp-audio/","mandatoryAncestor":"NOSCRIPT","mandatoryAncestorSuggestedAlternative":"AMP-AUDIO","htmlFormat":["AMP"]},{"tagName":"AUDIO","specName":"amp-audio > audio","attrs":[{"name":"controls"}],"specUrl":"https://amp.dev/documentation/components/amp-audio/","mandatoryAncestor":"AMP-AUDIO","htmlFormat":["AMP"]},{"tagName":"PICTURE","mandatoryParent":"NOSCRIPT","specUrl":"https://amp.dev/documentation/components/amp-img/","htmlFormat":["AMP"]},{"tagName":"SOURCE","specName":"picture > source","mandatoryParent":"PICTURE","attrs":[{"name":"media"},{"name":"sizes"},{"name":"srcset","disallowedValueRegex":"__amp_source_origin","valueUrl":{"protocol":["data","http","https"],"allowRelative":true}},{"name":"type"}],"specUrl":"https://amp.dev/documentation/components/amp-img/","htmlFormat":["AMP"]},{"tagName":"SOURCE","specName":"amp-video > source","mandatoryParent":"AMP-VIDEO","attrs":[{"name":"media"},{"name":"src","disallowedValueRegex":"__amp_source_origin","valueUrl":{"protocol":["https"],"allowRelative":true}},{"name":"type"},{"name":"[src]"},{"name":"[type]"}],"specUrl":"https://amp.dev/documentation/components/amp-video/","htmlFormat":["AMP","AMP4ADS"]},{"tagName":"SOURCE","specName":"amp-audio > source","mandatoryParent":"AMP-AUDIO","attrs":[{"name":"media"},{"name":"src","disallowedValueRegex":"__amp_source_origin","valueUrl":{"protocol":["https"],"allowRelative":true}},{"name":"type"},{"name":"[src]"},{"name":"[type]"}],"specUrl":"https://amp.dev/documentation/components/amp-audio/","htmlFormat":["AMP","AMP4ADS"]},{"tagName":"SOURCE","specName":"audio > source","mandatoryParent":"AUDIO","attrs":[{"name":"media"},{"name":"src","mandatory":true,"disallowedValueRegex":"__amp_source_origin","valueUrl":{"protocol":["https"],"allowRelative":true}},{"name":"type","mandatory":true}],"specUrl":"https://amp.dev/documentation/components/amp-audio/","htmlFormat":["AMP","AMP4ADS"]},{"tagName":"SOURCE","specName":"video > source","mandatoryParent":"VIDEO","attrs":[{"name":"media"},{"name":"src","mandatory":true,"disallowedValueRegex":"__amp_source_origin","valueUrl":{"protocol":["https"],"allowRelative":true}},{"name":"type","mandatory":true}],"specUrl":"https://amp.dev/documentation/components/amp-video/","htmlFormat":["AMP","AMP4ADS"]},{"tagName":"SOURCE","specName":"amp-ima-video > source","mandatoryParent":"AMP-IMA-VIDEO","attrs":[{"name":"media"},{"name":"src","disallowedValueRegex":"__amp_source_origin","valueUrl":{"protocol":["https"],"allowRelative":true}},{"name":"type"},{"name":"[src]"},{"name":"[type]"}],"htmlFormat":["AMP","AMP4ADS"],"requiresExtension":["amp-ima-video"]},{"tagName":"TRACK","specName":"audio > track","mandatoryParent":"AUDIO","attrLists":["track-attrs-no-subtitles"],"htmlFormat":["AMP","AMP4ADS"]},{"tagName":"TRACK","specName":"audio > track[kind=subtitles]","mandatoryParent":"AUDIO","attrLists":["track-attrs-subtitles"],"htmlFormat":["AMP","AMP4ADS"]},{"tagName":"TRACK","specName":"video > track","mandatoryParent":"VIDEO","attrLists":["track-attrs-no-subtitles"],"htmlFormat":["AMP","AMP4ADS"]},{"tagName":"TRACK","specName":"video > track[kind=subtitles]","mandatoryParent":"VIDEO","attrLists":["track-attrs-subtitles"],"htmlFormat":["AMP","AMP4ADS"]},{"tagName":"TRACK","specName":"amp-audio > track","mandatoryParent":"AMP-AUDIO","attrs":[{"name":"[label]"},{"name":"[src]"},{"name":"[srclang]"}],"attrLists":["track-attrs-no-subtitles"],"htmlFormat":["AMP","AMP4ADS"]},{"tagName":"TRACK","specName":"amp-audio > track[kind=subtitles]","mandatoryParent":"AMP-AUDIO","attrs":[{"name":"[label]"},{"name":"[src]"},{"name":"[srclang]"}],"attrLists":["track-attrs-subtitles"],"htmlFormat":["AMP","AMP4ADS"]},{"tagName":"TRACK","specName":"amp-video > track","mandatoryParent":"AMP-VIDEO","attrs":[{"name":"[label]"},{"name":"[src]"},{"name":"[srclang]"}],"attrLists":["track-attrs-no-subtitles"],"htmlFormat":["AMP","AMP4ADS"]},{"tagName":"TRACK","specName":"amp-video > track[kind=subtitles]","mandatoryParent":"AMP-VIDEO","attrs":[{"name":"[label]"},{"name":"[src]"},{"name":"[srclang]"}],"attrLists":["track-attrs-subtitles"],"htmlFormat":["AMP","AMP4ADS"]},{"tagName":"TRACK","specName":"amp-ima-video > track","mandatoryParent":"AMP-IMA-VIDEO","attrs":[{"name":"[label]"},{"name":"[src]"},{"name":"[srclang]"}],"attrLists":["track-attrs-no-subtitles"],"htmlFormat":["AMP"]},{"tagName":"TRACK","specName":"amp-ima-video > track[kind=subtitles]","mandatoryParent":"AMP-IMA-VIDEO","attrs":[{"name":"[label]"},{"name":"[src]"},{"name":"[srclang]"}],"attrLists":["track-attrs-subtitles"],"specUrl":"https://amp.dev/documentation/components/amp-ima-video/","htmlFormat":["AMP"]},{"tagName":"TABLE","attrs":[{"name":"align"},{"name":"bgcolor"},{"name":"border","value":["0","1"]},{"name":"cellpadding"},{"name":"cellspacing"},{"name":"sortable","disabledBy":["amp4email"]},{"name":"width"}],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"CAPTION","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"COLGROUP","attrs":[{"name":"span"}],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"COL","attrs":[{"name":"span"}],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"TBODY","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"THEAD","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"TFOOT","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"TR","attrs":[{"name":"align"},{"name":"bgcolor"},{"name":"height"},{"name":"valign"}],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"TD","attrs":[{"name":"align"},{"name":"bgcolor"},{"name":"colspan"},{"name":"headers"},{"name":"height"},{"name":"rowspan"},{"name":"valign"},{"name":"width"}],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"TH","attrs":[{"name":"abbr"},{"name":"align"},{"name":"bgcolor"},{"name":"colspan"},{"name":"headers"},{"name":"height"},{"name":"rowspan"},{"name":"scope"},{"name":"sorted","disabledBy":["amp4email"]},{"name":"valign"},{"name":"width"}],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"FORM","specName":"FORM [method=GET]","attrs":[{"name":"accept"},{"name":"accept-charset"},{"name":"action","mandatory":true,"disallowedValueRegex":"__amp_source_origin","valueUrl":{"protocol":["https"]}},{"name":"action-xhr","disallowedValueRegex":"__amp_source_origin","valueUrl":{"protocol":["https"]}},{"name":"autocomplete"},{"name":"custom-validation-reporting","value":["as-you-go","interact-and-submit","show-all-on-submit","show-first-on-submit"]},{"name":"enctype"},{"name":"method","valueCasei":["get"]},{"name":"novalidate"},{"name":"target","mandatory":true,"valueCasei":["_blank","_top"]},{"name":"verify-xhr","disallowedValueRegex":"__amp_source_origin","valueUrl":{"protocol":["https"]}},{"name":"xssi-prefix"}],"attrLists":["form-name-attr"],"disallowedAncestor":["AMP-APP-BANNER"],"htmlFormat":["AMP","AMP4ADS"],"requiresExtension":["amp-form"]},{"tagName":"FORM","specName":"FORM [method=POST]","attrs":[{"name":"accept"},{"name":"accept-charset"},{"name":"action-xhr","mandatory":true,"disallowedValueRegex":"__amp_source_origin","valueUrl":{"protocol":["https"]}},{"name":"autocomplete"},{"name":"custom-validation-reporting","value":["as-you-go","interact-and-submit","show-all-on-submit","show-first-on-submit"]},{"name":"enctype"},{"name":"method","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["post"]},{"name":"novalidate"},{"name":"target","valueCasei":["_blank","_top"]},{"name":"verify-xhr","disallowedValueRegex":"__amp_source_origin","valueUrl":{"protocol":["https"]}},{"name":"xssi-prefix"}],"attrLists":["form-name-attr"],"disallowedAncestor":["AMP-APP-BANNER"],"htmlFormat":["AMP","AMP4ADS"],"requiresExtension":["amp-form"]},{"tagName":"FORM","specName":"FORM [method=GET] (AMP4EMAIL)","attrs":[{"name":"accept"},{"name":"accept-charset"},{"name":"action-xhr","disallowedValueRegex":"__amp_source_origin|{{|}}","valueUrl":{"protocol":["https"],"allowRelative":false}},{"name":"autocomplete"},{"name":"custom-validation-reporting","value":["as-you-go","interact-and-submit","show-all-on-submit","show-first-on-submit"]},{"name":"enctype"},{"name":"method","valueCasei":["get"]},{"name":"novalidate"},{"name":"xssi-prefix"}],"htmlFormat":["AMP4EMAIL"],"requiresExtension":["amp-form"]},{"tagName":"FORM","specName":"FORM [method=POST] (AMP4EMAIL)","attrs":[{"name":"accept"},{"name":"accept-charset"},{"name":"action-xhr","mandatory":true,"disallowedValueRegex":"__amp_source_origin|{{|}}","valueUrl":{"protocol":["https"],"allowRelative":false}},{"name":"autocomplete"},{"name":"custom-validation-reporting","value":["as-you-go","interact-and-submit","show-all-on-submit","show-first-on-submit"]},{"name":"enctype"},{"name":"method","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["post"]},{"name":"novalidate"},{"name":"xssi-prefix"}],"htmlFormat":["AMP4EMAIL"],"requiresExtension":["amp-form"]},{"tagName":"DIV","specName":"FORM DIV [verify-error]","attrs":[{"name":"align"},{"name":"verify-error","mandatory":true}],"mandatoryAncestor":"FORM","htmlFormat":["AMP","AMP4ADS"]},{"tagName":"DIV","specName":"FORM DIV [verify-error][template]","attrs":[{"name":"align"},{"name":"verify-error","mandatory":true},{"name":"template","mandatory":true}],"mandatoryAncestor":"FORM","htmlFormat":["AMP","AMP4ADS"]},{"tagName":"DIV","specName":"FORM DIV [submitting]","attrs":[{"name":"align"},{"name":"submitting","mandatory":true}],"mandatoryAncestor":"FORM","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"DIV","specName":"FORM DIV [submitting][template]","attrs":[{"name":"align"},{"name":"submitting","mandatory":true},{"name":"template","mandatory":true}],"mandatoryAncestor":"FORM","htmlFormat":["AMP","AMP4ADS"]},{"tagName":"DIV","specName":"FORM DIV [submit-success]","attrs":[{"name":"align"},{"name":"submit-success","mandatory":true}],"mandatoryAncestor":"FORM","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"DIV","specName":"FORM DIV [submit-success][template]","attrs":[{"name":"align"},{"name":"submit-success","mandatory":true},{"name":"template","mandatory":true}],"mandatoryAncestor":"FORM","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"DIV","specName":"FORM DIV [submit-error]","attrs":[{"name":"align"},{"name":"submit-error","mandatory":true}],"mandatoryAncestor":"FORM","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"DIV","specName":"FORM DIV [submit-error][template]","attrs":[{"name":"align"},{"name":"submit-error","mandatory":true},{"name":"template","mandatory":true}],"mandatoryAncestor":"FORM","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"LABEL","attrs":[{"name":"for"}],"specUrl":"https://amp.dev/documentation/components/amp-form/","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"INPUT","attrs":[{"name":"no-verify","value":[""],"disabledBy":["amp4email"]},{"name":"type","disallowedValueRegex":"(^|\\s)(file|image|password|)(\\s|$)"},{"name":"[type]","disabledBy":["amp4email"]}],"attrLists":["input-common-attr","name-attr"],"specUrl":"https://amp.dev/documentation/components/amp-form/","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"INPUT","specName":"INPUT [type=file]","attrs":[{"name":"capture","value":[""],"disabledBy":["amp4email"]},{"name":"no-verify","value":[""],"disabledBy":["amp4email"]},{"name":"type","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["file"]},{"name":"[type]","disabledBy":["amp4email"]}],"attrLists":["input-common-attr","name-attr"],"specUrl":"https://amp.dev/documentation/components/amp-form/","mandatoryAncestor":"FORM [method=POST]","htmlFormat":["AMP"]},{"tagName":"INPUT","specName":"INPUT [type=password]","attrs":[{"name":"type","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["password"]},{"name":"[type]","disabledBy":["amp4email"]}],"attrLists":["input-common-attr","name-attr"],"specUrl":"https://amp.dev/documentation/components/amp-form/","mandatoryAncestor":"FORM [method=POST]","htmlFormat":["AMP"]},{"tagName":"INPUT","specName":"INPUT [type=image]","attrs":[{"name":"type","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["image"]},{"name":"[type]","disabledBy":["amp4email"]},{"name":"src","mandatory":true,"disallowedValueRegex":"__amp_source_origin","valueUrl":{"protocol":["data","http","https"]}}],"attrLists":["input-common-attr","name-attr"],"specUrl":"https://amp.dev/documentation/components/amp-form/","mandatoryAncestor":"FORM [method=POST]","htmlFormat":["AMP"]},{"tagName":"BUTTON","attrs":[{"name":"disabled","value":[""]},{"name":"role","implicit":true},{"name":"tabindex","implicit":true},{"name":"type"},{"name":"value"},{"name":"[disabled]"},{"name":"[type]","disabledBy":["amp4email"]},{"name":"[value]"}],"attrLists":["name-attr"],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"BUTTON","specName":"amp-app-banner button[open-button]","attrs":[{"name":"open-button","value":[""]},{"name":"role","implicit":true},{"name":"tabindex","implicit":true},{"name":"type"},{"name":"value"}],"attrLists":["name-attr"],"mandatoryAncestor":"AMP-APP-BANNER","htmlFormat":["AMP","AMP4ADS"],"satisfiesCondition":["amp-app-banner button[open-button]"]},{"tagName":"SELECT","attrs":[{"name":"autofocus","disabledBy":["amp4email"]},{"name":"disabled"},{"name":"multiple"},{"name":"no-verify","value":[""],"disabledBy":["amp4email"]},{"name":"required"},{"name":"size"},{"name":"[autofocus]","disabledBy":["amp4email"]},{"name":"[disabled]"},{"name":"[multiple]"},{"name":"[required]"},{"name":"[size]"}],"attrLists":["name-attr"],"specUrl":"https://amp.dev/documentation/components/amp-form/","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"DATALIST","specUrl":"https://amp.dev/documentation/components/amp-form/","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"OPTGROUP","mandatoryParent":"SELECT","attrs":[{"name":"disabled"},{"name":"label"},{"name":"[disabled]"},{"name":"[label]"}],"specUrl":"https://amp.dev/documentation/components/amp-form/","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"OPTION","attrs":[{"name":"disabled"},{"name":"label"},{"name":"selected"},{"name":"value"},{"name":"[disabled]"},{"name":"[label]"},{"name":"[selected]"},{"name":"[value]"}],"specUrl":"https://amp.dev/documentation/components/amp-form/","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"TEXTAREA","attrs":[{"name":"autocomplete"},{"name":"autoexpand","requiresExtension":["amp-form"]},{"name":"autofocus","disabledBy":["amp4email"]},{"name":"cols"},{"name":"disabled"},{"name":"maxlength"},{"name":"minlength"},{"name":"no-verify","value":[""],"disabledBy":["amp4email"]},{"name":"pattern"},{"name":"placeholder"},{"name":"readonly"},{"name":"required"},{"name":"rows"},{"name":"selectiondirection","disabledBy":["amp4email"]},{"name":"selectionend","disabledBy":["amp4email"]},{"name":"selectionstart","disabledBy":["amp4email"]},{"name":"spellcheck"},{"name":"wrap"},{"name":"[autocomplete]"},{"name":"[autofocus]","disabledBy":["amp4email"]},{"name":"[cols]"},{"name":"[defaulttext]"},{"name":"[disabled]"},{"name":"[maxlength]"},{"name":"[minlength]"},{"name":"[pattern]"},{"name":"[placeholder]"},{"name":"[readonly]"},{"name":"[required]"},{"name":"[rows]"},{"name":"[selectiondirection]","disabledBy":["amp4email"]},{"name":"[selectionend]","disabledBy":["amp4email"]},{"name":"[selectionstart]","disabledBy":["amp4email"]},{"name":"[spellcheck]"},{"name":"[wrap]"}],"attrLists":["name-attr"],"specUrl":"https://amp.dev/documentation/components/amp-form/","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"OUTPUT","attrs":[{"name":"for"},{"name":"form"}],"attrLists":["name-attr"],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"PROGRESS","attrs":[{"name":"max"},{"name":"value"}],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"METER","attrs":[{"name":"high"},{"name":"low"},{"name":"max"},{"name":"min"},{"name":"optimum"},{"name":"value"}],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"FIELDSET","attrs":[{"name":"disabled"},{"name":"[disabled]"}],"attrLists":["name-attr"],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"LEGEND","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"DETAILS","attrs":[{"name":"open","value":[""]},{"name":"[open]"}],"htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"SUMMARY","mandatoryParent":"DETAILS","htmlFormat":["AMP","AMP4ADS","AMP4EMAIL"]},{"tagName":"SCRIPT","specName":"amphtml engine script","unique":true,"mandatoryParent":"HEAD","attrs":[{"name":"src","mandatory":true,"value":["https://cdn.ampproject.org/v0.js","https://ampjs.org/v0.js"]}],"attrLists":["nonce-attr","amphtml-engine-attrs"],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup","cdata":{"disallowedCdataRegex":[{"regex":".","errorMessage":"contents"}]},"htmlFormat":["AMP"],"satisfiesCondition":["amphtml javascript runtime (v0.js)"],"requiresCondition":["style[amp-boilerplate]","noscript > style[amp-boilerplate]"],"disabledBy":["transformed"],"descriptiveName":"amphtml engine script"},{"tagName":"SCRIPT","specName":"amphtml engine script (transformed)","unique":true,"mandatoryParent":"HEAD","attrs":[{"name":"src","mandatory":true,"value":["https://cdn.ampproject.org/v0.js","https://ampjs.org/v0.js"],"dispatchKey":"NAME_VALUE_DISPATCH"}],"attrLists":["nonce-attr","amphtml-engine-attrs"],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup","cdata":{"disallowedCdataRegex":[{"regex":".","errorMessage":"contents"}]},"htmlFormat":["AMP"],"satisfiesCondition":["amphtml javascript runtime (v0.js)"],"enabledBy":["transformed"],"descriptiveName":"amphtml engine script"},{"tagName":"SCRIPT","specName":"amphtml engine script (LTS)","unique":true,"mandatoryParent":"HEAD","attrs":[{"name":"src","mandatory":true,"value":["https://cdn.ampproject.org/lts/v0.js","https://ampjs.org/lts/v0.js"],"dispatchKey":"NAME_VALUE_DISPATCH"}],"attrLists":["nonce-attr","amphtml-engine-attrs"],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup","cdata":{"disallowedCdataRegex":[{"regex":".","errorMessage":"contents"}]},"htmlFormat":["AMP"],"satisfiesCondition":["amphtml javascript runtime (v0.js)"],"requiresCondition":["style[amp-boilerplate]","noscript > style[amp-boilerplate]"],"disabledBy":["transformed"],"descriptiveName":"amphtml engine script"},{"tagName":"SCRIPT","specName":"amphtml engine script (LTS) (transformed)","unique":true,"mandatoryParent":"HEAD","attrs":[{"name":"src","mandatory":true,"value":["https://cdn.ampproject.org/lts/v0.js","https://ampjs.org/lts/v0.js"],"dispatchKey":"NAME_VALUE_DISPATCH"}],"attrLists":["nonce-attr","amphtml-engine-attrs"],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup","cdata":{"disallowedCdataRegex":[{"regex":".","errorMessage":"contents"}]},"htmlFormat":["AMP"],"satisfiesCondition":["amphtml javascript runtime (v0.js)"],"enabledBy":["transformed"],"descriptiveName":"amphtml engine script"},{"tagName":"SCRIPT","specName":"amphtml module engine script","unique":true,"mandatoryParent":"HEAD","attrs":[{"name":"src","mandatory":true,"value":["https://cdn.ampproject.org/v0.mjs"],"dispatchKey":"NAME_VALUE_DISPATCH"}],"attrLists":["nonce-attr","amphtml-module-engine-attrs"],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup","cdata":{"whitespaceOnly":true},"htmlFormat":["AMP"],"satisfiesCondition":["amphtml javascript runtime (v0.js)","amphtml module engine script"],"requiresCondition":["amphtml nomodule engine script"],"enabledBy":["transformed"],"descriptiveName":"amphtml module engine script"},{"tagName":"SCRIPT","specName":"amphtml nomodule engine script","unique":true,"mandatoryParent":"HEAD","attrs":[{"name":"src","mandatory":true,"value":["https://cdn.ampproject.org/v0.js"],"dispatchKey":"NAME_VALUE_DISPATCH"}],"attrLists":["nonce-attr","amphtml-nomodule-engine-attrs"],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup","cdata":{"whitespaceOnly":true},"htmlFormat":["AMP"],"satisfiesCondition":["amphtml javascript runtime (v0.js)","amphtml nomodule engine script"],"requiresCondition":["amphtml module engine script"],"enabledBy":["transformed"],"descriptiveName":"amphtml nomodule engine script"},{"tagName":"SCRIPT","specName":"amphtml module LTS engine script","unique":true,"mandatoryParent":"HEAD","attrs":[{"name":"src","mandatory":true,"value":["https://cdn.ampproject.org/lts/v0.mjs","https://ampjs.org/lts/v0.mjs"],"dispatchKey":"NAME_VALUE_DISPATCH"}],"attrLists":["nonce-attr","amphtml-module-engine-attrs"],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup","cdata":{"whitespaceOnly":true},"htmlFormat":["AMP"],"satisfiesCondition":["amphtml javascript runtime (v0.js)","amphtml module LTS engine script"],"requiresCondition":["amphtml nomodule LTS engine script"],"enabledBy":["transformed"],"descriptiveName":"amphtml module LTS engine script"},{"tagName":"SCRIPT","specName":"amphtml nomodule LTS engine script","unique":true,"mandatoryParent":"HEAD","attrs":[{"name":"src","mandatory":true,"value":["https://cdn.ampproject.org/lts/v0.js","https://ampjs.org/lts/v0.js"],"dispatchKey":"NAME_VALUE_DISPATCH"}],"attrLists":["nonce-attr","amphtml-nomodule-engine-attrs"],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup","cdata":{"whitespaceOnly":true},"htmlFormat":["AMP"],"satisfiesCondition":["amphtml javascript runtime (v0.js)","amphtml nomodule LTS engine script"],"requiresCondition":["amphtml module LTS engine script"],"enabledBy":["transformed"],"descriptiveName":"amphtml nomdule LTS engine script"},{"tagName":"SCRIPT","specName":"amphtml engine script [AMP4EMAIL]","mandatory":true,"unique":true,"mandatoryParent":"HEAD","attrs":[{"name":"src","mandatory":true,"value":["https://cdn.ampproject.org/v0.js"],"dispatchKey":"NAME_VALUE_DISPATCH"}],"attrLists":["nonce-attr","amphtml-engine-attrs"],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup","cdata":{"disallowedCdataRegex":[{"regex":".","errorMessage":"contents"}]},"htmlFormat":["AMP4EMAIL"],"satisfiesCondition":["amphtml javascript runtime (v0.js)"],"requiresCondition":["style[amp-boilerplate]"],"descriptiveName":"amphtml engine script"},{"tagName":"SCRIPT","specName":"amp4ads engine script","mandatory":true,"unique":true,"mandatoryParent":"HEAD","attrs":[{"name":"src","mandatory":true,"value":["https://cdn.ampproject.org/amp4ads-v0.js"],"dispatchKey":"NAME_VALUE_DISPATCH"}],"attrLists":["nonce-attr","amphtml-engine-attrs"],"specUrl":"https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup","cdata":{"disallowedCdataRegex":[{"regex":".","errorMessage":"contents"}]},"htmlFormat":["AMP4ADS"],"satisfiesCondition":["amphtml javascript runtime (v0.js)"],"requiresCondition":["style[amp-boilerplate]"],"descriptiveName":"amphtml engine script"},{"tagName":"SCRIPT","specName":"script type=application/ld+json","attrs":[{"name":"type","mandatory":true,"dispatchKey":"NAME_VALUE_DISPATCH","valueCasei":["application/ld+json"]}],"attrLists":["nonce-attr"],"cdata":{"disallowedCdataRegex":[{"regex":"