{"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"hide-openapi-specification-extensions","__idx":0},"children":["Hide OpenAPI specification extensions"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When you want to hide internal operations and properties, you can follow our ",{"$$mdtype":"Tag","name":"Link","attributes":{"href":"/docs/cli/v2/guides/hide-apis"},"children":["hide internal APIs"]}," guide."," ","However, this approach doesn't work if you use ",{"$$mdtype":"Tag","name":"Link","attributes":{"href":"https://redocly.com/docs/openapi-visual-reference/specification-extensions/"},"children":["specification extensions"]}," ","in your API and want to hide their details as well. For this purpose, you need a custom decorator."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"overview","__idx":1},"children":["Overview"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In this tutorial, see how to maintain a single source of truth (SSOT) OpenAPI description."," ","Then generate an internal and an external version of the API."]},{"$$mdtype":"Tag","name":"Diagram","attributes":{"data-language":"mermaid","diagramType":"mermaid","diagramSource":"graph TD\n    A[SSOT] -->|bundle| B(Internal)\n    A[SSOT] -->|bundle| C(External)\n","diagramHtml":"<svg id=\"diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e\" width=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" class=\"flowchart\" style=\"max-width: 238.078125px;\" viewBox=\"0 0 238.078125 198\" role=\"graphics-document document\" aria-roledescription=\"flowchart-v2\"><style>\n    #diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e foreignObject {\n      overflow: visible;\n    }\n  </style><style>#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e{font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .error-icon{fill:#552222;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .error-text{fill:#552222;stroke:#552222;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .edge-thickness-normal{stroke-width:1px;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .edge-thickness-thick{stroke-width:3.5px;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .edge-pattern-solid{stroke-dasharray:0;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .edge-thickness-invisible{stroke-width:0;fill:none;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .edge-pattern-dashed{stroke-dasharray:3;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .edge-pattern-dotted{stroke-dasharray:2;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .marker{fill:#333333;stroke:#333333;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .marker.cross{stroke:#333333;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e svg{font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;font-size:16px;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e p{margin:0;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .label{font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;color:#333;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .cluster-label text{fill:#333;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .cluster-label span{color:#333;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .cluster-label span p{background-color:transparent;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .label text,#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e span{fill:#333;color:#333;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .node rect,#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .node circle,#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .node ellipse,#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .node polygon,#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .rough-node .label text,#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .node .label text,#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .image-shape .label,#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .icon-shape .label{text-anchor:middle;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .rough-node .label,#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .node .label,#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .image-shape .label,#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .icon-shape .label{text-align:center;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .node.clickable{cursor:pointer;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .arrowheadPath{fill:#333333;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .edgePath .path{stroke:#333333;stroke-width:1px;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .flowchart-link{stroke:#333333;fill:none;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .cluster text{fill:#333;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .cluster span{color:#333;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e rect.text{fill:none;stroke-width:0;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .icon-shape,#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .icon-shape p,#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .icon-shape .label rect,#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e .node .neo-node{stroke:#9370DB;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e [data-look=\"neo\"].node rect,#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e [data-look=\"neo\"].cluster rect,#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e [data-look=\"neo\"].node polygon{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e [data-look=\"neo\"].swimlane.cluster rect{filter:none;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e [data-look=\"neo\"].node path{stroke:#9370DB;stroke-width:1px;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e [data-look=\"neo\"].node .outer-path{filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e [data-look=\"neo\"].node .neo-line path{stroke:#9370DB;filter:none;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e [data-look=\"neo\"].node circle{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e [data-look=\"neo\"].node circle .state-start{fill:#000000;}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e [data-look=\"neo\"].icon-shape .icon{fill:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e [data-look=\"neo\"].icon-shape .icon-neo path{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e :root{--mermaid-font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;}</style><g><marker id=\"diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e_flowchart-v2-pointEnd\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto\"><path d=\"M 0 0 L 10 5 L 0 10 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e_flowchart-v2-pointStart\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"4.5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto\"><path d=\"M 0 5 L 10 10 L 10 0 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e_flowchart-v2-pointEnd-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 11.5 14\" refX=\"11.5\" refY=\"7\" markerUnits=\"userSpaceOnUse\" markerWidth=\"10.5\" markerHeight=\"14\" orient=\"auto\"><path d=\"M 0 0 L 11.5 7 L 0 14 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e_flowchart-v2-pointStart-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 11.5 14\" refX=\"1\" refY=\"7\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11.5\" markerHeight=\"14\" orient=\"auto\"><polygon points=\"0,7 11.5,14 11.5,0\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></polygon></marker><marker id=\"diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e_flowchart-v2-circleEnd\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"11\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e_flowchart-v2-circleStart\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"-1\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e_flowchart-v2-circleEnd-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refY=\"5\" refX=\"12.25\" markerUnits=\"userSpaceOnUse\" markerWidth=\"14\" markerHeight=\"14\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e_flowchart-v2-circleStart-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"-2\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"14\" markerHeight=\"14\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e_flowchart-v2-crossEnd\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 11 11\" refX=\"12\" refY=\"5.2\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><path d=\"M 1,1 l 9,9 M 10,1 l -9,9\" class=\"arrowMarkerPath\" style=\"stroke-width: 2; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e_flowchart-v2-crossStart\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 11 11\" refX=\"-1\" refY=\"5.2\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><path d=\"M 1,1 l 9,9 M 10,1 l -9,9\" class=\"arrowMarkerPath\" style=\"stroke-width: 2; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e_flowchart-v2-crossEnd-margin\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 15 15\" refX=\"17.7\" refY=\"7.5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto\"><path d=\"M 1,1 L 14,14 M 1,14 L 14,1\" class=\"arrowMarkerPath\" style=\"stroke-width: 2.5;\"></path></marker><marker id=\"diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e_flowchart-v2-crossStart-margin\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 15 15\" refX=\"-3.5\" refY=\"7.5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto\"><path d=\"M 1,1 L 14,14 M 1,14 L 14,1\" class=\"arrowMarkerPath\" style=\"stroke-width: 2.5; stroke-dasharray: 1, 0;\"></path></marker><g class=\"root\"><g class=\"clusters\"></g><g class=\"edgePaths\"><path d=\"M89.011,62L82.457,68.167C75.903,74.333,62.795,86.667,56.241,98.333C49.688,110,49.688,121,49.688,126.5L49.688,132\" id=\"diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e-L_A_B_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_A_B_0\" data-points=\"W3sieCI6ODkuMDExMjkxNTAzOTA2MjUsInkiOjYyfSx7IngiOjQ5LjY4NzUsInkiOjk5fSx7IngiOjQ5LjY4NzUsInkiOjEzNn1d\" data-look=\"classic\" marker-end=\"url(#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e_flowchart-v2-pointEnd)\"></path><path d=\"M146.403,62L152.957,68.167C159.511,74.333,172.619,86.667,179.173,98.333C185.727,110,185.727,121,185.727,126.5L185.727,132\" id=\"diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e-L_A_C_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_A_C_0\" data-points=\"W3sieCI6MTQ2LjQwMjc3MDk5NjA5Mzc1LCJ5Ijo2Mn0seyJ4IjoxODUuNzI2NTYyNSwieSI6OTl9LHsieCI6MTg1LjcyNjU2MjUsInkiOjEzNn1d\" data-look=\"classic\" marker-end=\"url(#diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e_flowchart-v2-pointEnd)\"></path></g><g class=\"edgeLabels\"><g class=\"edgeLabel\" transform=\"translate(49.6875, 99)\"><g class=\"label\" data-id=\"L_A_B_0\" transform=\"translate(-24.0234375, -12)\"><foreignObject width=\"48.046875\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"><p>bundle</p></span></div></foreignObject></g></g><g class=\"edgeLabel\" transform=\"translate(185.7265625, 99)\"><g class=\"label\" data-id=\"L_A_C_0\" transform=\"translate(-24.0234375, -12)\"><foreignObject width=\"48.046875\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"><p>bundle</p></span></div></foreignObject></g></g></g><g class=\"nodes\"><g class=\"node default\" id=\"diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e-flowchart-A-0\" data-look=\"classic\" transform=\"translate(117.70703125, 35)\"><rect class=\"basic label-container\" style=\"\" x=\"-51.78125\" y=\"-27\" width=\"103.5625\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-21.78125, -12)\"><rect></rect><foreignObject width=\"43.5625\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>SSOT</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e-flowchart-B-1\" data-look=\"classic\" transform=\"translate(49.6875, 163)\"><rect class=\"basic label-container\" style=\"\" rx=\"5\" ry=\"5\" x=\"-41.6875\" y=\"-27\" width=\"83.375\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-26.6875, -12)\"><rect></rect><foreignObject width=\"53.375\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Internal</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e-flowchart-C-3\" data-look=\"classic\" transform=\"translate(185.7265625, 163)\"><rect class=\"basic label-container\" style=\"\" rx=\"5\" ry=\"5\" x=\"-44.3515625\" y=\"-27\" width=\"88.703125\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-29.3515625, -12)\"><rect></rect><foreignObject width=\"58.703125\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>External</p></span></div></foreignObject></g></g></g></g></g><defs><filter id=\"diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e-drop-shadow\" height=\"130%\" width=\"130%\"><feDropShadow dx=\"4\" dy=\"4\" stdDeviation=\"0\" flood-opacity=\"0.06\" flood-color=\"#000000\"></feDropShadow></filter></defs><defs><filter id=\"diagram-3a2d951496b053118810a9744899aff59dab68b3658e43d38aabd19f5f88cf9e-drop-shadow-small\" height=\"150%\" width=\"150%\"><feDropShadow dx=\"2\" dy=\"2\" stdDeviation=\"0\" flood-opacity=\"0.06\" flood-color=\"#000000\"></feDropShadow></filter></defs></svg>","diagramHtmlDark":"<svg id=\"diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6\" width=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" class=\"flowchart\" style=\"max-width: 238.078125px;\" viewBox=\"0 0 238.078125 198\" role=\"graphics-document document\" aria-roledescription=\"flowchart-v2\"><style>\n    #diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 foreignObject {\n      overflow: visible;\n    }\n  </style><style>#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6{font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .error-icon{fill:#a44141;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .error-text{fill:#ddd;stroke:#ddd;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .edge-thickness-normal{stroke-width:1px;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .edge-thickness-thick{stroke-width:3.5px;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .edge-pattern-solid{stroke-dasharray:0;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .edge-thickness-invisible{stroke-width:0;fill:none;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .edge-pattern-dashed{stroke-dasharray:3;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .edge-pattern-dotted{stroke-dasharray:2;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .marker{fill:lightgrey;stroke:lightgrey;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .marker.cross{stroke:lightgrey;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 svg{font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;font-size:16px;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 p{margin:0;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .label{font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;color:#ccc;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .cluster-label text{fill:#F9FFFE;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .cluster-label span{color:#F9FFFE;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .cluster-label span p{background-color:transparent;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .label text,#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 span{fill:#ccc;color:#ccc;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .node rect,#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .node circle,#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .node ellipse,#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .node polygon,#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .rough-node .label text,#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .node .label text,#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .image-shape .label,#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .icon-shape .label{text-anchor:middle;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .rough-node .label,#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .node .label,#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .image-shape .label,#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .icon-shape .label{text-align:center;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .node.clickable{cursor:pointer;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .arrowheadPath{fill:lightgrey;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .edgePath .path{stroke:lightgrey;stroke-width:1px;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .flowchart-link{stroke:lightgrey;fill:none;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .cluster text{fill:#F9FFFE;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .cluster span{color:#F9FFFE;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 rect.text{fill:none;stroke-width:0;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .icon-shape,#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .icon-shape p,#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .icon-shape .label rect,#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .image-shape .label rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 .node .neo-node{stroke:#ccc;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 [data-look=\"neo\"].node rect,#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 [data-look=\"neo\"].cluster rect,#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 [data-look=\"neo\"].node polygon{stroke:url(#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 [data-look=\"neo\"].swimlane.cluster rect{filter:none;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 [data-look=\"neo\"].node path{stroke:url(#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6-gradient);stroke-width:1px;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 [data-look=\"neo\"].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 [data-look=\"neo\"].node .neo-line path{stroke:#ccc;filter:none;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 [data-look=\"neo\"].node circle{stroke:url(#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 [data-look=\"neo\"].node circle .state-start{fill:#000000;}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 [data-look=\"neo\"].icon-shape .icon{fill:url(#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 [data-look=\"neo\"].icon-shape .icon-neo path{stroke:url(#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6 :root{--mermaid-font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;}</style><g><marker id=\"diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6_flowchart-v2-pointEnd\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto\"><path d=\"M 0 0 L 10 5 L 0 10 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6_flowchart-v2-pointStart\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"4.5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto\"><path d=\"M 0 5 L 10 10 L 10 0 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6_flowchart-v2-pointEnd-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 11.5 14\" refX=\"11.5\" refY=\"7\" markerUnits=\"userSpaceOnUse\" markerWidth=\"10.5\" markerHeight=\"14\" orient=\"auto\"><path d=\"M 0 0 L 11.5 7 L 0 14 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6_flowchart-v2-pointStart-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 11.5 14\" refX=\"1\" refY=\"7\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11.5\" markerHeight=\"14\" orient=\"auto\"><polygon points=\"0,7 11.5,14 11.5,0\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></polygon></marker><marker id=\"diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6_flowchart-v2-circleEnd\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"11\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6_flowchart-v2-circleStart\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"-1\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6_flowchart-v2-circleEnd-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refY=\"5\" refX=\"12.25\" markerUnits=\"userSpaceOnUse\" markerWidth=\"14\" markerHeight=\"14\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6_flowchart-v2-circleStart-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"-2\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"14\" markerHeight=\"14\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6_flowchart-v2-crossEnd\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 11 11\" refX=\"12\" refY=\"5.2\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><path d=\"M 1,1 l 9,9 M 10,1 l -9,9\" class=\"arrowMarkerPath\" style=\"stroke-width: 2; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6_flowchart-v2-crossStart\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 11 11\" refX=\"-1\" refY=\"5.2\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><path d=\"M 1,1 l 9,9 M 10,1 l -9,9\" class=\"arrowMarkerPath\" style=\"stroke-width: 2; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6_flowchart-v2-crossEnd-margin\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 15 15\" refX=\"17.7\" refY=\"7.5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto\"><path d=\"M 1,1 L 14,14 M 1,14 L 14,1\" class=\"arrowMarkerPath\" style=\"stroke-width: 2.5;\"></path></marker><marker id=\"diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6_flowchart-v2-crossStart-margin\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 15 15\" refX=\"-3.5\" refY=\"7.5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto\"><path d=\"M 1,1 L 14,14 M 1,14 L 14,1\" class=\"arrowMarkerPath\" style=\"stroke-width: 2.5; stroke-dasharray: 1, 0;\"></path></marker><g class=\"root\"><g class=\"clusters\"></g><g class=\"edgePaths\"><path d=\"M89.011,62L82.457,68.167C75.903,74.333,62.795,86.667,56.241,98.333C49.688,110,49.688,121,49.688,126.5L49.688,132\" id=\"diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6-L_A_B_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_A_B_0\" data-points=\"W3sieCI6ODkuMDExMjkxNTAzOTA2MjUsInkiOjYyfSx7IngiOjQ5LjY4NzUsInkiOjk5fSx7IngiOjQ5LjY4NzUsInkiOjEzNn1d\" data-look=\"classic\" marker-end=\"url(#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6_flowchart-v2-pointEnd)\"></path><path d=\"M146.403,62L152.957,68.167C159.511,74.333,172.619,86.667,179.173,98.333C185.727,110,185.727,121,185.727,126.5L185.727,132\" id=\"diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6-L_A_C_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_A_C_0\" data-points=\"W3sieCI6MTQ2LjQwMjc3MDk5NjA5Mzc1LCJ5Ijo2Mn0seyJ4IjoxODUuNzI2NTYyNSwieSI6OTl9LHsieCI6MTg1LjcyNjU2MjUsInkiOjEzNn1d\" data-look=\"classic\" marker-end=\"url(#diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6_flowchart-v2-pointEnd)\"></path></g><g class=\"edgeLabels\"><g class=\"edgeLabel\" transform=\"translate(49.6875, 99)\"><g class=\"label\" data-id=\"L_A_B_0\" transform=\"translate(-24.0234375, -12)\"><foreignObject width=\"48.046875\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"><p>bundle</p></span></div></foreignObject></g></g><g class=\"edgeLabel\" transform=\"translate(185.7265625, 99)\"><g class=\"label\" data-id=\"L_A_C_0\" transform=\"translate(-24.0234375, -12)\"><foreignObject width=\"48.046875\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"><p>bundle</p></span></div></foreignObject></g></g></g><g class=\"nodes\"><g class=\"node default\" id=\"diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6-flowchart-A-0\" data-look=\"classic\" transform=\"translate(117.70703125, 35)\"><rect class=\"basic label-container\" style=\"\" x=\"-51.78125\" y=\"-27\" width=\"103.5625\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-21.78125, -12)\"><rect></rect><foreignObject width=\"43.5625\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>SSOT</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6-flowchart-B-1\" data-look=\"classic\" transform=\"translate(49.6875, 163)\"><rect class=\"basic label-container\" style=\"\" rx=\"5\" ry=\"5\" x=\"-41.6875\" y=\"-27\" width=\"83.375\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-26.6875, -12)\"><rect></rect><foreignObject width=\"53.375\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Internal</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6-flowchart-C-3\" data-look=\"classic\" transform=\"translate(185.7265625, 163)\"><rect class=\"basic label-container\" style=\"\" rx=\"5\" ry=\"5\" x=\"-44.3515625\" y=\"-27\" width=\"88.703125\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-29.3515625, -12)\"><rect></rect><foreignObject width=\"58.703125\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>External</p></span></div></foreignObject></g></g></g></g></g><defs><filter id=\"diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6-drop-shadow\" height=\"130%\" width=\"130%\"><feDropShadow dx=\"4\" dy=\"4\" stdDeviation=\"0\" flood-opacity=\"0.06\" flood-color=\"#FFFFFF\"></feDropShadow></filter></defs><defs><filter id=\"diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6-drop-shadow-small\" height=\"150%\" width=\"150%\"><feDropShadow dx=\"2\" dy=\"2\" stdDeviation=\"0\" flood-opacity=\"0.06\" flood-color=\"#FFFFFF\"></feDropShadow></filter></defs><linearGradient id=\"diagram-7b6c835133ee34e3ae0231481162e61731259305b0a5d85a38b07e09ac7d06c6-gradient\" gradientUnits=\"objectBoundingBox\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"><stop offset=\"0%\" stop-color=\"#cccccc\" stop-opacity=\"1\"></stop><stop offset=\"100%\" stop-color=\"hsl(180, 0%, 18.3529411765%)\" stop-opacity=\"1\"></stop></linearGradient></svg>"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For this tutorial, we've prepared a sample containing OpenAPI specification extensions starting with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["x-amazon-apigateway"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"prerequisites","__idx":2},"children":["Prerequisites"]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"We do, You do"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This tutorial is most effective when you follow along and complete the steps."]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"Link","attributes":{"href":"/docs/cli/v2/installation"},"children":["Install @redocly/cli"]}," with version 1.0.0-beta.117 or later (we use 1.0.0-beta.117 in this tutorial)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Download the ",{"$$mdtype":"Tag","name":"Link","attributes":{"href":"https://gist.github.com/bandantonio/e1331ba5afd24485de5e6229c91d25ed"},"children":["sample.yaml"]}," file into a new directory named ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["hide-openapi-extensions"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Use your favorite IDE for editing the YAML file (we use VS Code and have the ",{"$$mdtype":"Tag","name":"Link","attributes":{"href":"https://redocly.com/docs/redocly-openapi/"},"children":["Redocly extension"]}," installed)."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-1-create-a-custom-plugin","__idx":3},"children":["Step 1: Create a custom plugin"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In this step, create a custom plugin and define the decorator dependency."]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Create a new directory called ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["plugins"]},"."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["plugins"]}," directory, create a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["plugin.js"]}," file with the following code:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"js","header":{"controls":{"copy":{}}},"source":"import hideOpenapiExtensions from './decorators/hide-openapi-extensions.js';\n\nconst decorators = {\n  oas3: {\n    'hide-openapi-extensions': hideOpenapiExtensions,\n  },\n};\n\nexport default function hideExtensionsPlugin() {\n  return {\n    id: 'plugin',\n    decorators,\n  };\n}\n","lang":"js"},"children":[]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Save the file."]}]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can name the plugins directory and the file anything you want. Make sure you use the correct name in the Redocly configuration file (Step 3 below)."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-2-add-a-decorator-and-associate-it-with-an-environment-variable","__idx":4},"children":["Step 2: Add a decorator and associate it with an environment variable"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["plugins"]}," directory, create a new directory called ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["decorators"]},"."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["decorators"]}," directory, create a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["hide-openapi-extensions.js"]}," file with the following code:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"js","header":{"controls":{"copy":{}}},"source":"/** @type {import('@redocly/cli').OasDecorator} */\nexport default function hideOpenapiExtensions({ pattern }) {\n  return {\n    any: {\n      enter: (node) => {\n        pattern.forEach((item) => {\n          Object.keys(node).forEach((key) => {\n            const regex = new RegExp(item, 'i');\n            if (regex.test(key)) {\n              delete node[key];\n            }\n          });\n        });\n      },\n    },\n  };\n}\n","lang":"js"},"children":[]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Save the file."]}]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can name the decorators directory anything you want. Make sure you use the correct directory name in the line 1 of the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["plugin.js"]}," file (Step 1 above)."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-3-configure-the-plugin-for-use","__idx":5},"children":["Step 3: Configure the plugin for use"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To use the decorator, register your plugin in your Redocly configuration file ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["redocly.yaml"]},". Register your ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["plugins"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["decorators"]},"."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"yaml","header":{"controls":{"copy":{}}},"source":"apis:\n  internal@latest:\n    root: ./sample.yaml\n  external@latest:\n    root: ./sample.yaml\n    decorators:\n      plugin/hide-openapi-extensions:\n        pattern:\n          - x-amazon-apigateway\nplugins:\n  - ./plugins/plugin.js\nextends:\n  - recommended\n","lang":"yaml"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Make sure your ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["hide-openapi-extensions"]}," looks as follows:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":".\n├── plugins\n│   ├── decorators\n│   │   └── hide-openapi-extensions.js\n│   └── plugin.js\n├── redocly.yaml\n└── sample.yaml\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-4-output-internal-and-external-apis","__idx":6},"children":["Step 4: Output internal and external APIs"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In this step, two API snapshots are produced from the single source of truth. To do this, you can use the ",{"$$mdtype":"Tag","name":"Link","attributes":{"href":"/docs/cli/v2/commands/bundle"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["bundle"]}," command"]}," on your machine."]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Bundle the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["external@latest"]}," API."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"redocly bundle external@latest -o dist/bundle-external.yaml\n// or\nnpx @redocly/cli@latest bundle external@latest -o dist/bundle-external.yaml\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Inspect the file at ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["dist/external.yaml"]},"."," ","Confirm that all the occurrences of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["x-amazon-apigateway"]}," are removed."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Bundle the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["internal@latest"]}," API."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"redocly bundle internal@latest -o dist/bundle-internal.yaml\n// or\nnpx @redocly/cli@latest bundle internal@latest -o dist/bundle-internal.yaml\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Inspect the file at ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["dist/internal.yaml"]},"."," ","Confirm that all the occurrences of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["x-amazon-apigateway"]}," are ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["not"]}," removed."]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"advanced-usage","__idx":7},"children":["Advanced usage"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you want to hide multiple specification extensions, open the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["redocly.yaml"]}," and add the corresponding extension names"," ","to the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pattern"]}," list (after the line 9):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"yaml","header":{"controls":{"copy":{}}},"source":"decorators:\n  plugin/hide-openapi-extensions:\n    pattern:\n      - x-amazon-apigateway\n      - x-another-custom-extension\n","lang":"yaml"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"next-steps","__idx":8},"children":["Next steps"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you enjoyed this tutorial, please share it with a colleague, or on the social networks."," ","Be sure to tag ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["@Redocly"]}," as it lets us know how we're doing and where we can improve."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Try this technique with your own APIs to accomplish the use case demonstrated above."]}]},"frontmatter":{},"tagList":["admonition"],"title":"Hide OpenAPI specification extensions","lastModified":"2026-05-18T14:03:00.000Z"}