@wbce/projen-d9 0.0.28 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +202 -45
- package/API.md +167 -37
- package/CHANGELOG.md +19 -0
- package/README.md +10 -3
- package/docs/D9-plumbing.md +194 -0
- package/lib/cli/atlas.d.ts +10 -0
- package/lib/cli/atlas.js +65 -0
- package/lib/cli/commands/cedar/cedar-format.d.ts +7 -0
- package/lib/cli/commands/cedar/cedar-format.js +75 -0
- package/lib/cli/commands/cedar/cedar-to-d9-translations.d.ts +12 -0
- package/lib/cli/commands/cedar/cedar-to-d9-translations.js +130 -0
- package/lib/cli/commands/cedar/cedar-to-d9.d.ts +57 -0
- package/lib/cli/commands/cedar/cedar-to-d9.js +221 -0
- package/lib/cli/commands/cedar/cedar-translations.d.ts +9 -0
- package/lib/cli/commands/cedar/cedar-translations.js +213 -0
- package/lib/cli/commands/cedar/d9-permission.d.ts +27 -0
- package/lib/cli/commands/cedar/d9-permission.js +45 -0
- package/lib/cli/commands/cedar/d9-to-cedar.d.ts +33 -0
- package/lib/cli/commands/cedar/d9-to-cedar.js +157 -0
- package/lib/cli/commands/cedar/roles-table.d.ts +14 -0
- package/lib/cli/commands/cedar/roles-table.js +29 -0
- package/lib/cli/commands/save/apply-snapshot.d.ts +2 -7
- package/lib/cli/commands/save/apply-snapshot.js +41 -31
- package/lib/cli/commands/save/check-unsaved.d.ts +9 -0
- package/lib/cli/commands/save/check-unsaved.js +81 -0
- package/lib/cli/commands/save/env.d.ts +37 -0
- package/lib/cli/commands/save/env.js +111 -0
- package/lib/cli/commands/save/save-snapshot.d.ts +4 -0
- package/lib/cli/commands/save/save-snapshot.js +233 -0
- package/lib/cli/commands/save/sync-files.d.ts +5 -0
- package/lib/cli/commands/save/sync-files.js +46 -0
- package/lib/cli/commands/save/transfer.d.ts +18 -0
- package/lib/cli/commands/save/transfer.js +97 -0
- package/lib/cli/commands/save/utils.d.ts +5 -0
- package/lib/cli/commands/save/utils.js +33 -3
- package/lib/cli/commands/sync.js +4 -3
- package/lib/cli/index.js +67 -25
- package/lib/cli/logger.d.ts +2 -0
- package/lib/cli/logger.js +10 -0
- package/lib/cli/plumbing-config.d.ts +12 -0
- package/lib/cli/plumbing-config.js +13 -0
- package/lib/index.d.ts +49 -5
- package/lib/index.js +54 -41
- package/node_modules/@cedar-policy/cedar-wasm/README.md +181 -0
- package/node_modules/@cedar-policy/cedar-wasm/esm/README.md +181 -0
- package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm.d.ts +427 -0
- package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm.js +9 -0
- package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm_bg.js +434 -0
- package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm_bg.wasm +0 -0
- package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm_bg.wasm.d.ts +34 -0
- package/node_modules/@cedar-policy/cedar-wasm/esm/package.json +23 -0
- package/node_modules/@cedar-policy/cedar-wasm/nodejs/README.md +181 -0
- package/node_modules/@cedar-policy/cedar-wasm/nodejs/cedar_wasm.d.ts +427 -0
- package/node_modules/@cedar-policy/cedar-wasm/nodejs/cedar_wasm.js +463 -0
- package/node_modules/@cedar-policy/cedar-wasm/nodejs/cedar_wasm_bg.wasm +0 -0
- package/node_modules/@cedar-policy/cedar-wasm/nodejs/cedar_wasm_bg.wasm.d.ts +34 -0
- package/node_modules/@cedar-policy/cedar-wasm/nodejs/package.json +18 -0
- package/node_modules/@cedar-policy/cedar-wasm/package.json +53 -0
- package/node_modules/@cedar-policy/cedar-wasm/web/README.md +181 -0
- package/node_modules/@cedar-policy/cedar-wasm/web/cedar_wasm.d.ts +486 -0
- package/node_modules/@cedar-policy/cedar-wasm/web/cedar_wasm.js +534 -0
- package/node_modules/@cedar-policy/cedar-wasm/web/cedar_wasm_bg.wasm +0 -0
- package/node_modules/@cedar-policy/cedar-wasm/web/cedar_wasm_bg.wasm.d.ts +34 -0
- package/node_modules/@cedar-policy/cedar-wasm/web/package.json +21 -0
- package/node_modules/@types/node/README.md +5 -6
- package/node_modules/@types/node/assert/strict.d.ts +111 -0
- package/node_modules/@types/node/assert.d.ts +1040 -79
- package/node_modules/@types/node/async_hooks.d.ts +476 -119
- package/node_modules/@types/node/buffer.buffer.d.ts +472 -0
- package/node_modules/@types/node/buffer.d.ts +1925 -13
- package/node_modules/@types/node/child_process.d.ts +1204 -235
- package/node_modules/@types/node/cluster.d.ts +455 -137
- package/node_modules/@types/node/compatibility/disposable.d.ts +14 -0
- package/node_modules/@types/node/compatibility/index.d.ts +9 -0
- package/node_modules/@types/node/compatibility/indexable.d.ts +20 -0
- package/node_modules/@types/node/compatibility/iterators.d.ts +20 -0
- package/node_modules/@types/node/console.d.ts +450 -1
- package/node_modules/@types/node/constants.d.ts +20 -447
- package/node_modules/@types/node/crypto.d.ts +3962 -600
- package/node_modules/@types/node/dgram.d.ts +515 -33
- package/node_modules/@types/node/diagnostics_channel.d.ts +578 -0
- package/node_modules/@types/node/dns/promises.d.ts +503 -0
- package/node_modules/@types/node/dns.d.ts +798 -247
- package/node_modules/@types/node/domain.d.ts +164 -10
- package/node_modules/@types/node/events.d.ts +954 -25
- package/node_modules/@types/node/fs/promises.d.ts +1295 -0
- package/node_modules/@types/node/fs.d.ts +3463 -1569
- package/node_modules/@types/node/globals.d.ts +98 -1277
- package/node_modules/@types/node/globals.typedarray.d.ts +38 -0
- package/node_modules/@types/node/http.d.ts +1933 -300
- package/node_modules/@types/node/http2.d.ts +1946 -254
- package/node_modules/@types/node/https.d.ts +557 -134
- package/node_modules/@types/node/index.d.ts +54 -48
- package/node_modules/@types/node/inspector.d.ts +227 -3014
- package/node_modules/@types/node/inspector.generated.d.ts +4052 -0
- package/node_modules/@types/node/module.d.ts +890 -2
- package/node_modules/@types/node/net.d.ts +872 -105
- package/node_modules/@types/node/os.d.ts +452 -209
- package/node_modules/@types/node/package.json +78 -128
- package/node_modules/@types/node/path.d.ts +196 -155
- package/node_modules/@types/node/perf_hooks.d.ts +829 -120
- package/node_modules/@types/node/process.d.ts +2072 -3
- package/node_modules/@types/node/punycode.d.ts +69 -27
- package/node_modules/@types/node/querystring.d.ts +132 -9
- package/node_modules/@types/node/readline/promises.d.ts +161 -0
- package/node_modules/@types/node/readline.d.ts +485 -49
- package/node_modules/@types/node/repl.d.ts +121 -83
- package/node_modules/@types/node/sea.d.ts +153 -0
- package/node_modules/@types/node/sqlite.d.ts +721 -0
- package/node_modules/@types/node/stream/consumers.d.ts +38 -0
- package/node_modules/@types/node/stream/promises.d.ts +90 -0
- package/node_modules/@types/node/stream/web.d.ts +622 -0
- package/node_modules/@types/node/stream.d.ts +1470 -140
- package/node_modules/@types/node/string_decoder.d.ts +64 -4
- package/node_modules/@types/node/test.d.ts +2163 -0
- package/node_modules/@types/node/timers/promises.d.ts +108 -0
- package/node_modules/@types/node/timers.d.ts +284 -13
- package/node_modules/@types/node/tls.d.ts +850 -244
- package/node_modules/@types/node/trace_events.d.ts +147 -11
- package/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +468 -0
- package/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +34 -0
- package/node_modules/@types/node/ts5.6/index.d.ts +97 -0
- package/node_modules/@types/node/tty.d.ts +160 -18
- package/node_modules/@types/node/url.d.ts +890 -53
- package/node_modules/@types/node/util.d.ts +2566 -160
- package/node_modules/@types/node/v8.d.ts +806 -83
- package/node_modules/@types/node/vm.d.ts +932 -44
- package/node_modules/@types/node/wasi.d.ts +148 -22
- package/node_modules/@types/node/web-globals/abortcontroller.d.ts +34 -0
- package/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
- package/node_modules/@types/node/web-globals/events.d.ts +97 -0
- package/node_modules/@types/node/web-globals/fetch.d.ts +55 -0
- package/node_modules/@types/node/web-globals/navigator.d.ts +22 -0
- package/node_modules/@types/node/web-globals/storage.d.ts +24 -0
- package/node_modules/@types/node/worker_threads.d.ts +657 -80
- package/node_modules/@types/node/zlib.d.ts +510 -119
- package/node_modules/pino/.nojekyll +0 -0
- package/node_modules/pino/.prettierignore +1 -0
- package/node_modules/pino/CNAME +1 -0
- package/node_modules/pino/CONTRIBUTING.md +34 -0
- package/node_modules/pino/LICENSE +21 -0
- package/node_modules/pino/README.md +177 -0
- package/node_modules/pino/SECURITY.md +103 -0
- package/node_modules/pino/benchmarks/basic.bench.js +95 -0
- package/node_modules/pino/benchmarks/child-child.bench.js +52 -0
- package/node_modules/pino/benchmarks/child-creation.bench.js +73 -0
- package/node_modules/pino/benchmarks/child.bench.js +62 -0
- package/node_modules/pino/benchmarks/deep-object.bench.js +88 -0
- package/node_modules/pino/benchmarks/formatters.bench.js +50 -0
- package/node_modules/pino/benchmarks/internal/custom-levels.js +67 -0
- package/node_modules/pino/benchmarks/internal/just-pino-heavy.bench.js +76 -0
- package/node_modules/pino/benchmarks/internal/just-pino.bench.js +182 -0
- package/node_modules/pino/benchmarks/internal/parent-vs-child.bench.js +75 -0
- package/node_modules/pino/benchmarks/internal/redact.bench.js +86 -0
- package/node_modules/pino/benchmarks/long-string.bench.js +81 -0
- package/node_modules/pino/benchmarks/multi-arg.bench.js +193 -0
- package/node_modules/pino/benchmarks/multistream.js +98 -0
- package/node_modules/pino/benchmarks/object.bench.js +82 -0
- package/node_modules/pino/benchmarks/utils/generate-benchmark-doc.js +36 -0
- package/node_modules/pino/benchmarks/utils/runbench.js +138 -0
- package/node_modules/pino/benchmarks/utils/wrap-log-level.js +55 -0
- package/node_modules/pino/bin.js +6 -0
- package/node_modules/pino/browser.js +607 -0
- package/node_modules/pino/build/sync-version.js +25 -0
- package/node_modules/pino/docs/api.md +1664 -0
- package/node_modules/pino/docs/asynchronous.md +55 -0
- package/node_modules/pino/docs/benchmarks.md +55 -0
- package/node_modules/pino/docs/browser.md +341 -0
- package/node_modules/pino/docs/bundling.md +40 -0
- package/node_modules/pino/docs/child-loggers.md +116 -0
- package/node_modules/pino/docs/diagnostics.md +16 -0
- package/node_modules/pino/docs/ecosystem.md +87 -0
- package/node_modules/pino/docs/help.md +353 -0
- package/node_modules/pino/docs/lts.md +93 -0
- package/node_modules/pino/docs/pretty.md +38 -0
- package/node_modules/pino/docs/redaction.md +130 -0
- package/node_modules/pino/docs/transports.md +1447 -0
- package/node_modules/pino/docs/web.md +306 -0
- package/node_modules/pino/eslint.config.js +36 -0
- package/node_modules/pino/examples/basic.js +43 -0
- package/node_modules/pino/examples/transport.js +68 -0
- package/node_modules/pino/favicon.ico +0 -0
- package/node_modules/pino/file.js +12 -0
- package/node_modules/pino/inc-version.sh +42 -0
- package/node_modules/pino/index.html +55 -0
- package/node_modules/pino/lib/caller.js +40 -0
- package/node_modules/pino/lib/constants.js +28 -0
- package/node_modules/pino/lib/deprecations.js +8 -0
- package/node_modules/pino/lib/levels.js +241 -0
- package/node_modules/pino/lib/meta.js +3 -0
- package/node_modules/pino/lib/multistream.js +211 -0
- package/node_modules/pino/lib/proto.js +256 -0
- package/node_modules/pino/lib/redaction.js +119 -0
- package/node_modules/pino/lib/symbols.js +76 -0
- package/node_modules/pino/lib/time.js +39 -0
- package/node_modules/pino/lib/tools.js +427 -0
- package/node_modules/pino/lib/transport-stream.js +56 -0
- package/node_modules/pino/lib/transport.js +302 -0
- package/node_modules/pino/lib/worker.js +197 -0
- package/node_modules/pino/package.json +112 -0
- package/node_modules/pino/pino.d.ts +881 -0
- package/node_modules/pino/pino.js +259 -0
- package/node_modules/pino/test/basic.test.js +952 -0
- package/node_modules/pino/test/broken-pipe.test.js +59 -0
- package/node_modules/pino/test/browser-bindings.test.js +114 -0
- package/node_modules/pino/test/browser-child.test.js +132 -0
- package/node_modules/pino/test/browser-disabled.test.js +87 -0
- package/node_modules/pino/test/browser-early-console-freeze.test.js +12 -0
- package/node_modules/pino/test/browser-is-level-enabled.test.js +101 -0
- package/node_modules/pino/test/browser-levels.test.js +241 -0
- package/node_modules/pino/test/browser-redaction.test.js +264 -0
- package/node_modules/pino/test/browser-serializers.test.js +352 -0
- package/node_modules/pino/test/browser-set-bindings.test.js +99 -0
- package/node_modules/pino/test/browser-timestamp.test.js +88 -0
- package/node_modules/pino/test/browser-transmit.test.js +417 -0
- package/node_modules/pino/test/browser.test.js +698 -0
- package/node_modules/pino/test/caller.test.js +20 -0
- package/node_modules/pino/test/complex-objects.test.js +36 -0
- package/node_modules/pino/test/crlf.test.js +34 -0
- package/node_modules/pino/test/custom-levels.test.js +267 -0
- package/node_modules/pino/test/diagnostics.test.js +107 -0
- package/node_modules/pino/test/error-key.test.js +37 -0
- package/node_modules/pino/test/error.test.js +403 -0
- package/node_modules/pino/test/escaping.test.js +110 -0
- package/node_modules/pino/test/esm/esm.mjs +14 -0
- package/node_modules/pino/test/esm/index.test.js +21 -0
- package/node_modules/pino/test/esm/named-exports.mjs +29 -0
- package/node_modules/pino/test/exit.test.js +79 -0
- package/node_modules/pino/test/fixtures/broken-pipe/basic.js +9 -0
- package/node_modules/pino/test/fixtures/broken-pipe/destination.js +10 -0
- package/node_modules/pino/test/fixtures/broken-pipe/syncfalse.js +12 -0
- package/node_modules/pino/test/fixtures/caller-loop.js +6 -0
- package/node_modules/pino/test/fixtures/console-transport.js +13 -0
- package/node_modules/pino/test/fixtures/crashing-transport.js +13 -0
- package/node_modules/pino/test/fixtures/default-exit.js +8 -0
- package/node_modules/pino/test/fixtures/destination-exit.js +8 -0
- package/node_modules/pino/test/fixtures/eval/index.js +13 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/14-files.js +3 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/2-files.js +3 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file1.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file10.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file11.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file12.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file13.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file14.js +11 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file2.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file3.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file4.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file5.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file6.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file7.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file8.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file9.js +5 -0
- package/node_modules/pino/test/fixtures/noop-transport.js +10 -0
- package/node_modules/pino/test/fixtures/pretty/null-prototype.js +8 -0
- package/node_modules/pino/test/fixtures/stdout-hack-protection.js +11 -0
- package/node_modules/pino/test/fixtures/syncfalse-child.js +6 -0
- package/node_modules/pino/test/fixtures/syncfalse-exit.js +9 -0
- package/node_modules/pino/test/fixtures/syncfalse-flush-exit.js +10 -0
- package/node_modules/pino/test/fixtures/syncfalse.js +6 -0
- package/node_modules/pino/test/fixtures/syntax-error-esm.mjs +2 -0
- package/node_modules/pino/test/fixtures/to-file-transport-with-transform.js +20 -0
- package/node_modules/pino/test/fixtures/to-file-transport.js +13 -0
- package/node_modules/pino/test/fixtures/to-file-transport.mjs +8 -0
- package/node_modules/pino/test/fixtures/transport/index.js +12 -0
- package/node_modules/pino/test/fixtures/transport/package.json +5 -0
- package/node_modules/pino/test/fixtures/transport-exit-immediately-with-async-dest.js +16 -0
- package/node_modules/pino/test/fixtures/transport-exit-immediately.js +11 -0
- package/node_modules/pino/test/fixtures/transport-exit-on-ready.js +12 -0
- package/node_modules/pino/test/fixtures/transport-invalid-node-options.js +26 -0
- package/node_modules/pino/test/fixtures/transport-main.js +9 -0
- package/node_modules/pino/test/fixtures/transport-many-lines.js +29 -0
- package/node_modules/pino/test/fixtures/transport-preload-main.mjs +13 -0
- package/node_modules/pino/test/fixtures/transport-preload.mjs +13 -0
- package/node_modules/pino/test/fixtures/transport-string-stdout.js +9 -0
- package/node_modules/pino/test/fixtures/transport-transform.js +21 -0
- package/node_modules/pino/test/fixtures/transport-uses-pino-config.js +33 -0
- package/node_modules/pino/test/fixtures/transport-with-on-exit.js +12 -0
- package/node_modules/pino/test/fixtures/transport-worker-data.js +19 -0
- package/node_modules/pino/test/fixtures/transport-worker-name.js +24 -0
- package/node_modules/pino/test/fixtures/transport-worker.js +15 -0
- package/node_modules/pino/test/fixtures/transport-wrong-export-type.js +3 -0
- package/node_modules/pino/test/fixtures/ts/to-file-transport-native.mts +15 -0
- package/node_modules/pino/test/fixtures/ts/to-file-transport-with-transform.ts +18 -0
- package/node_modules/pino/test/fixtures/ts/to-file-transport.ts +11 -0
- package/node_modules/pino/test/fixtures/ts/transpile.cjs +36 -0
- package/node_modules/pino/test/fixtures/ts/transport-exit-immediately-with-async-dest.ts +15 -0
- package/node_modules/pino/test/fixtures/ts/transport-exit-immediately.ts +10 -0
- package/node_modules/pino/test/fixtures/ts/transport-exit-on-ready.ts +11 -0
- package/node_modules/pino/test/fixtures/ts/transport-main.ts +8 -0
- package/node_modules/pino/test/fixtures/ts/transport-string-stdout.ts +8 -0
- package/node_modules/pino/test/fixtures/ts/transport-worker.ts +14 -0
- package/node_modules/pino/test/formatters.test.js +364 -0
- package/node_modules/pino/test/helper.d.ts +4 -0
- package/node_modules/pino/test/helper.js +159 -0
- package/node_modules/pino/test/hooks.test.js +114 -0
- package/node_modules/pino/test/http.test.js +214 -0
- package/node_modules/pino/test/internals/version.test.js +17 -0
- package/node_modules/pino/test/is-level-enabled.test.js +179 -0
- package/node_modules/pino/test/jest/basic.spec.js +10 -0
- package/node_modules/pino/test/levels.test.js +810 -0
- package/node_modules/pino/test/metadata.test.js +120 -0
- package/node_modules/pino/test/mixin-merge-strategy.test.js +57 -0
- package/node_modules/pino/test/mixin.test.js +241 -0
- package/node_modules/pino/test/multistream.test.js +793 -0
- package/node_modules/pino/test/redact.test.js +923 -0
- package/node_modules/pino/test/serializers.test.js +257 -0
- package/node_modules/pino/test/smoke.js +59 -0
- package/node_modules/pino/test/stdout-protection.test.js +41 -0
- package/node_modules/pino/test/syncfalse.test.js +186 -0
- package/node_modules/pino/test/timestamp-nano.test.js +37 -0
- package/node_modules/pino/test/timestamp.test.js +124 -0
- package/node_modules/pino/test/transport/big.test.js +42 -0
- package/node_modules/pino/test/transport/bundlers-support.test.js +99 -0
- package/node_modules/pino/test/transport/caller.test.js +24 -0
- package/node_modules/pino/test/transport/core.test.js +818 -0
- package/node_modules/pino/test/transport/core.transpiled.test.ts +114 -0
- package/node_modules/pino/test/transport/crash.test.js +36 -0
- package/node_modules/pino/test/transport/module-link.test.js +241 -0
- package/node_modules/pino/test/transport/native-type-stripping.test.mjs +151 -0
- package/node_modules/pino/test/transport/node-options.test.js +116 -0
- package/node_modules/pino/test/transport/pipeline.test.js +137 -0
- package/node_modules/pino/test/transport/preload.test.js +54 -0
- package/node_modules/pino/test/transport/repl.test.js +15 -0
- package/node_modules/pino/test/transport/sync-false.test.js +79 -0
- package/node_modules/pino/test/transport/sync-true.test.js +57 -0
- package/node_modules/pino/test/transport/targets.test.js +48 -0
- package/node_modules/pino/test/transport/uses-pino-config.test.js +166 -0
- package/node_modules/pino/test/transport-stream.test.js +40 -0
- package/node_modules/pino/test/types/pino-import.tst.cts +30 -0
- package/node_modules/pino/test/types/pino-import.tst.js +73 -0
- package/node_modules/pino/test/types/pino-multistream.tst.ts +49 -0
- package/node_modules/pino/test/types/pino-top-export.tst.ts +32 -0
- package/node_modules/pino/test/types/pino-transport.tst.ts +171 -0
- package/node_modules/pino/test/types/pino-type-only.tst.ts +77 -0
- package/node_modules/pino/test/types/pino.ts +98 -0
- package/node_modules/pino/test/types/pino.tst.ts +681 -0
- package/node_modules/pino/test/types/tsconfig.json +10 -0
- package/node_modules/pino/tsconfig.json +14 -0
- package/node_modules/pino-pretty/.borp.yaml +6 -0
- package/node_modules/pino-pretty/.editorconfig +13 -0
- package/node_modules/pino-pretty/.github/dependabot.yml +13 -0
- package/node_modules/pino-pretty/.github/workflows/ci.yml +83 -0
- package/node_modules/pino-pretty/LICENSE +21 -0
- package/node_modules/pino-pretty/Readme.md +425 -0
- package/node_modules/pino-pretty/SECURITY.md +146 -0
- package/node_modules/pino-pretty/benchmark.js +105 -0
- package/node_modules/pino-pretty/bin.js +113 -0
- package/node_modules/pino-pretty/demo.png +0 -0
- package/node_modules/pino-pretty/docs/help.md +24 -0
- package/node_modules/pino-pretty/eslint.config.js +5 -0
- package/node_modules/pino-pretty/help/help.txt +68 -0
- package/node_modules/pino-pretty/index.d.ts +227 -0
- package/node_modules/pino-pretty/index.js +234 -0
- package/node_modules/pino-pretty/lib/colors.js +134 -0
- package/node_modules/pino-pretty/lib/colors.test.js +132 -0
- package/node_modules/pino-pretty/lib/constants.js +55 -0
- package/node_modules/pino-pretty/lib/pretty.js +171 -0
- package/node_modules/pino-pretty/lib/utils/build-safe-sonic-boom.js +69 -0
- package/node_modules/pino-pretty/lib/utils/build-safe-sonic-boom.test.js +84 -0
- package/node_modules/pino-pretty/lib/utils/create-date.js +26 -0
- package/node_modules/pino-pretty/lib/utils/create-date.test.js +20 -0
- package/node_modules/pino-pretty/lib/utils/delete-log-property.js +28 -0
- package/node_modules/pino-pretty/lib/utils/delete-log-property.test.js +31 -0
- package/node_modules/pino-pretty/lib/utils/filter-log.js +99 -0
- package/node_modules/pino-pretty/lib/utils/filter-log.test.js +265 -0
- package/node_modules/pino-pretty/lib/utils/format-time.js +66 -0
- package/node_modules/pino-pretty/lib/utils/format-time.test.js +71 -0
- package/node_modules/pino-pretty/lib/utils/get-level-label-data.js +29 -0
- package/node_modules/pino-pretty/lib/utils/get-property-value.js +30 -0
- package/node_modules/pino-pretty/lib/utils/get-property-value.test.js +31 -0
- package/node_modules/pino-pretty/lib/utils/handle-custom-levels-names-opts.js +38 -0
- package/node_modules/pino-pretty/lib/utils/handle-custom-levels-names-opts.test.js +45 -0
- package/node_modules/pino-pretty/lib/utils/handle-custom-levels-opts.js +39 -0
- package/node_modules/pino-pretty/lib/utils/handle-custom-levels-opts.test.js +47 -0
- package/node_modules/pino-pretty/lib/utils/index.js +108 -0
- package/node_modules/pino-pretty/lib/utils/index.test.js +37 -0
- package/node_modules/pino-pretty/lib/utils/interpret-conditionals.js +41 -0
- package/node_modules/pino-pretty/lib/utils/interpret-conditionals.test.js +84 -0
- package/node_modules/pino-pretty/lib/utils/is-object.js +7 -0
- package/node_modules/pino-pretty/lib/utils/is-object.test.js +10 -0
- package/node_modules/pino-pretty/lib/utils/is-valid-date.js +14 -0
- package/node_modules/pino-pretty/lib/utils/is-valid-date.test.js +16 -0
- package/node_modules/pino-pretty/lib/utils/join-lines-with-indentation.js +29 -0
- package/node_modules/pino-pretty/lib/utils/join-lines-with-indentation.test.js +16 -0
- package/node_modules/pino-pretty/lib/utils/noop.js +3 -0
- package/node_modules/pino-pretty/lib/utils/noop.test.js +12 -0
- package/node_modules/pino-pretty/lib/utils/parse-factory-options.js +171 -0
- package/node_modules/pino-pretty/lib/utils/prettify-error-log.js +76 -0
- package/node_modules/pino-pretty/lib/utils/prettify-error-log.test.js +143 -0
- package/node_modules/pino-pretty/lib/utils/prettify-error.js +54 -0
- package/node_modules/pino-pretty/lib/utils/prettify-error.test.js +25 -0
- package/node_modules/pino-pretty/lib/utils/prettify-level.js +41 -0
- package/node_modules/pino-pretty/lib/utils/prettify-level.test.js +70 -0
- package/node_modules/pino-pretty/lib/utils/prettify-message.js +65 -0
- package/node_modules/pino-pretty/lib/utils/prettify-message.test.js +287 -0
- package/node_modules/pino-pretty/lib/utils/prettify-metadata.js +75 -0
- package/node_modules/pino-pretty/lib/utils/prettify-metadata.test.js +170 -0
- package/node_modules/pino-pretty/lib/utils/prettify-object.js +115 -0
- package/node_modules/pino-pretty/lib/utils/prettify-object.test.js +217 -0
- package/node_modules/pino-pretty/lib/utils/prettify-time.js +43 -0
- package/node_modules/pino-pretty/lib/utils/prettify-time.test.js +264 -0
- package/node_modules/pino-pretty/lib/utils/split-property-key.js +49 -0
- package/node_modules/pino-pretty/lib/utils/split-property-key.test.js +29 -0
- package/node_modules/pino-pretty/lib/utils/strip-unsafe-control-chars.js +18 -0
- package/node_modules/pino-pretty/lib/utils/strip-unsafe-control-chars.test.js +9 -0
- package/node_modules/pino-pretty/package.json +64 -0
- package/node_modules/pino-pretty/test/basic.test.js +1305 -0
- package/node_modules/pino-pretty/test/boolean-options.test.js +228 -0
- package/node_modules/pino-pretty/test/cli-rc.test.js +275 -0
- package/node_modules/pino-pretty/test/cli.test.js +360 -0
- package/node_modules/pino-pretty/test/crlf.test.js +33 -0
- package/node_modules/pino-pretty/test/error-objects.test.js +494 -0
- package/node_modules/pino-pretty/test/example/example.js +33 -0
- package/node_modules/pino-pretty/test/helper.js +19 -0
- package/node_modules/pino-pretty/test/types/exports.tst.ts +15 -0
- package/node_modules/pino-pretty/test/types/pino-pretty.tst.ts +140 -0
- package/node_modules/pino-pretty/test/types/tsconfig.json +9 -0
- package/package.json +12 -5
- package/lib/cli/commands/init.d.ts +0 -1
- package/lib/cli/commands/init.js +0 -8
- package/node_modules/@types/node/globals.global.d.ts +0 -1
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CedarManager = void 0;
|
|
4
|
+
exports.d9ToCedar = d9ToCedar;
|
|
5
|
+
const promises_1 = require("fs/promises");
|
|
6
|
+
const cedar = require("@cedar-policy/cedar-wasm/nodejs");
|
|
7
|
+
const cedar_format_1 = require("./cedar-format");
|
|
8
|
+
const cedar_translations_1 = require("./cedar-translations");
|
|
9
|
+
const d9_permission_1 = require("./d9-permission");
|
|
10
|
+
const roles_table_1 = require("./roles-table");
|
|
11
|
+
const logger_1 = require("../../logger");
|
|
12
|
+
const utils_1 = require("../save/utils");
|
|
13
|
+
class CedarManager {
|
|
14
|
+
constructor(opts) {
|
|
15
|
+
this.fieldsPolicies = new Map();
|
|
16
|
+
this.mainPolicies = new Map();
|
|
17
|
+
this.validationPolicies = new Map();
|
|
18
|
+
this.d9Permissions = [];
|
|
19
|
+
this.permissionPath = opts?.permissionPath || './permissions';
|
|
20
|
+
this.sqlPath = opts?.sqlPath || './sql/data';
|
|
21
|
+
}
|
|
22
|
+
async readPermissionFile() {
|
|
23
|
+
const permissions = await (0, utils_1.readCsvFile)(`${this.sqlPath}/directus_permissions.csv`);
|
|
24
|
+
this.d9Permissions = permissions.map((p) => new d9_permission_1.D9Permission(p));
|
|
25
|
+
}
|
|
26
|
+
async readRoleFile() {
|
|
27
|
+
this.roles = await roles_table_1.RolesTable.load(this.sqlPath);
|
|
28
|
+
for (const permission of this.d9Permissions) {
|
|
29
|
+
permission.roleName = permission.role
|
|
30
|
+
? this.roles.getNameFromId(permission.role)
|
|
31
|
+
: 'Public';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
refactoPolicies(policyKey) {
|
|
35
|
+
for (const [groupName, policies] of this[policyKey]) {
|
|
36
|
+
const groupedPolicies = new Map();
|
|
37
|
+
for (const policy of policies) {
|
|
38
|
+
const conditionsKey = JSON.stringify(policy.conditions.map((c) => c.body));
|
|
39
|
+
if (!groupedPolicies.has(conditionsKey)) {
|
|
40
|
+
groupedPolicies.set(conditionsKey, []);
|
|
41
|
+
}
|
|
42
|
+
groupedPolicies.get(conditionsKey).push(policy);
|
|
43
|
+
}
|
|
44
|
+
// Combine policies in each group
|
|
45
|
+
const refactored = [];
|
|
46
|
+
for (const group of groupedPolicies.values()) {
|
|
47
|
+
if (group.length === 1) {
|
|
48
|
+
// No optimization needed for single policy
|
|
49
|
+
refactored.push(group[0]);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Multiple policies with same conditions - combine actions
|
|
53
|
+
const actions = group
|
|
54
|
+
.map((p) => p.action.entity)
|
|
55
|
+
.sort((a, b) => `${a.id}${a.type}`.localeCompare(`${b.id}${b.type}`));
|
|
56
|
+
// Create combined policy with "action in [...]"
|
|
57
|
+
const combinedPolicy = {
|
|
58
|
+
effect: group[0].effect,
|
|
59
|
+
principal: group[0].principal,
|
|
60
|
+
action: {
|
|
61
|
+
op: 'in',
|
|
62
|
+
entities: actions,
|
|
63
|
+
},
|
|
64
|
+
resource: group[0].resource,
|
|
65
|
+
conditions: group[0].conditions,
|
|
66
|
+
};
|
|
67
|
+
refactored.push(combinedPolicy);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
this[policyKey].set(groupName, refactored);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
sortPolicies(policyKey) {
|
|
74
|
+
for (const [groupName, policies] of this[policyKey]) {
|
|
75
|
+
this[policyKey].set(groupName, policies.sort((p1, p2) => {
|
|
76
|
+
const a1 = p1.action;
|
|
77
|
+
const a2 = p2.action;
|
|
78
|
+
const t1 = (a1.entities?.[0] || a1.entity).type;
|
|
79
|
+
const t2 = (a2.entities?.[0] || a2.entity).type;
|
|
80
|
+
return t1.localeCompare(t2);
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async translateAndSortPermission() {
|
|
85
|
+
for (const permission of this.d9Permissions) {
|
|
86
|
+
const cedarPolicies = await (0, cedar_translations_1.translateToCedar)(permission);
|
|
87
|
+
const mainPolicies = this.mainPolicies.get(permission.roleName) || [];
|
|
88
|
+
this.mainPolicies.set(permission.roleName, [
|
|
89
|
+
...mainPolicies,
|
|
90
|
+
cedarPolicies.mainPolicy,
|
|
91
|
+
]);
|
|
92
|
+
if (cedarPolicies.fieldPolicy) {
|
|
93
|
+
const fieldPolicies = this.fieldsPolicies.get(permission.roleName) || [];
|
|
94
|
+
this.fieldsPolicies.set(permission.roleName, [
|
|
95
|
+
...fieldPolicies,
|
|
96
|
+
cedarPolicies.fieldPolicy,
|
|
97
|
+
]);
|
|
98
|
+
}
|
|
99
|
+
if (cedarPolicies.validationPolicy) {
|
|
100
|
+
const validationPolicies = this.validationPolicies.get(permission.roleName) || [];
|
|
101
|
+
this.validationPolicies.set(permission.roleName, [
|
|
102
|
+
...validationPolicies,
|
|
103
|
+
cedarPolicies.validationPolicy,
|
|
104
|
+
]);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const policyKeys = ['mainPolicies', 'fieldsPolicies', 'validationPolicies'];
|
|
108
|
+
for (const pKey of policyKeys) {
|
|
109
|
+
this.refactoPolicies(pKey);
|
|
110
|
+
this.sortPolicies(pKey);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async writePoliciesToFile(roleName, fileTitle, policies) {
|
|
114
|
+
await (0, promises_1.mkdir)(`${this.permissionPath}/${roleName}`, { recursive: true });
|
|
115
|
+
const policiesText = policies.map(cedar_format_1.policyToCedarText).join('\n\n') + '\n';
|
|
116
|
+
// Our own condition layout must still be valid Cedar.
|
|
117
|
+
const parsed = cedar.policySetTextToParts(policiesText);
|
|
118
|
+
if (parsed.type === 'failure') {
|
|
119
|
+
logger_1.logger.error({ policiesText }, 'generated policies are not valid Cedar');
|
|
120
|
+
throw new Error(parsed.errors);
|
|
121
|
+
}
|
|
122
|
+
await (0, promises_1.writeFile)(`${this.permissionPath}/${roleName}/${fileTitle}`, policiesText);
|
|
123
|
+
}
|
|
124
|
+
async writePolicies(policyKey, fileName) {
|
|
125
|
+
for (const [group, policies] of this[policyKey]) {
|
|
126
|
+
await this.writePoliciesToFile(group, fileName, policies);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async readCsvAndWriteAllFiles() {
|
|
130
|
+
logger_1.logger.info('read permission file');
|
|
131
|
+
await this.readPermissionFile();
|
|
132
|
+
logger_1.logger.info(`found ${this.d9Permissions.length} permissions`);
|
|
133
|
+
logger_1.logger.info('read role file');
|
|
134
|
+
await this.readRoleFile();
|
|
135
|
+
logger_1.logger.info('roles imported');
|
|
136
|
+
logger_1.logger.info('grouping and sorting permissions');
|
|
137
|
+
await this.translateAndSortPermission();
|
|
138
|
+
logger_1.logger.info(`having ${this.mainPolicies.size} main policies and ${this.fieldsPolicies.size} fields policies`);
|
|
139
|
+
logger_1.logger.info('writing cedar policies files');
|
|
140
|
+
await this.writePolicies('mainPolicies', 'authorize.cedar');
|
|
141
|
+
await this.writePolicies('fieldsPolicies', 'check-fields.cedar');
|
|
142
|
+
await this.writePolicies('validationPolicies', 'validate.cedar');
|
|
143
|
+
logger_1.logger.info('files wroten');
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
exports.CedarManager = CedarManager;
|
|
147
|
+
/**
|
|
148
|
+
* CLI action: regenerate the Cedar policy folders from directus_permissions.csv.
|
|
149
|
+
* The folder is wiped first, reproducing what `formatePermission` does in app-api2,
|
|
150
|
+
* so a role removed from the CSV leaves no orphan files.
|
|
151
|
+
*/
|
|
152
|
+
async function d9ToCedar(options) {
|
|
153
|
+
const manager = new CedarManager(options);
|
|
154
|
+
await (0, promises_1.rm)(manager.permissionPath, { recursive: true, force: true });
|
|
155
|
+
await manager.readCsvAndWriteAllFiles();
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZDktdG8tY2VkYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL2NlZGFyL2Q5LXRvLWNlZGFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQThMQSw4QkFPQztBQXJNRCwwQ0FBbUQ7QUFDbkQseURBQXlEO0FBRXpELGlEQUFtRDtBQUNuRCw2REFBd0Q7QUFDeEQsbURBQStDO0FBQy9DLCtDQUEyQztBQUMzQyx5Q0FBc0M7QUFDdEMseUNBQTRDO0FBRTVDLE1BQWEsWUFBWTtJQVd2QixZQUFZLElBQW9EO1FBUHpELG1CQUFjLEdBQThCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdEQsaUJBQVksR0FBOEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNwRCx1QkFBa0IsR0FBOEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUcxRCxrQkFBYSxHQUFtQixFQUFFLENBQUM7UUFHeEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLEVBQUUsY0FBYyxJQUFJLGVBQWUsQ0FBQztRQUM5RCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksRUFBRSxPQUFPLElBQUksWUFBWSxDQUFDO0lBQy9DLENBQUM7SUFFTSxLQUFLLENBQUMsa0JBQWtCO1FBQzdCLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBQSxtQkFBVyxFQUNuQyxHQUFHLElBQUksQ0FBQyxPQUFPLDJCQUEyQixDQUMzQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLDRCQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVk7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLHdCQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqRCxLQUFLLE1BQU0sVUFBVSxJQUFJ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QUFVLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxzQkFBc0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLGtCQUFrQixDQUNqRyxDQUFDO1FBQ0YsZUFBTSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUM1RCxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUNqRSxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUNqRSxlQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7Q0FDRjtBQTdLRCxvQ0E2S0M7QUFFRDs7OztHQUlHO0FBQ0ksS0FBSyxVQUFVLFNBQVMsQ0FBQyxPQUcvQjtJQUNDLE1BQU0sT0FBTyxHQUFHLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLE1BQU0sSUFBQSxhQUFFLEVBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbkUsTUFBTSxPQUFPLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztBQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWtkaXIsIHJtLCB3cml0ZUZpbGUgfSBmcm9tICdmcy9wcm9taXNlcyc7XG5pbXBvcnQgKiBhcyBjZWRhciBmcm9tICdAY2VkYXItcG9saWN5L2NlZGFyLXdhc20vbm9kZWpzJztcbmltcG9ydCB0eXBlIHsgUG9saWN5SnNvbiB9IGZyb20gJ0BjZWRhci1wb2xpY3kvY2VkYXItd2FzbS9ub2RlanMnO1xuaW1wb3J0IHsgcG9saWN5VG9DZWRhclRleHQgfSBmcm9tICcuL2NlZGFyLWZvcm1hdCc7XG5pbXBvcnQgeyB0cmFuc2xhdGVUb0NlZGFyIH0gZnJvbSAnLi9jZWRhci10cmFuc2xhdGlvbnMnO1xuaW1wb3J0IHsgRDlQZXJtaXNzaW9uIH0gZnJvbSAnLi9kOS1wZXJtaXNzaW9uJztcbmltcG9ydCB7IFJvbGVzVGFibGUgfSBmcm9tICcuL3JvbGVzLXRhYmxlJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL2xvZ2dlcic7XG5pbXBvcnQgeyByZWFkQ3N2RmlsZSB9IGZyb20gJy4uL3NhdmUvdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQ2VkYXJNYW5hZ2VyIHtcbiAgcHVibGljIHBlcm1pc3Npb25QYXRoOiBzdHJpbmc7XG4gIHB1YmxpYyBzcWxQYXRoOiBzdHJpbmc7XG5cbiAgcHVibGljIGZpZWxkc1BvbGljaWVzOiBNYXA8c3RyaW5nLCBQb2xpY3lKc29uW10+ID0gbmV3IE1hcCgpO1xuICBwdWJsaWMgbWFpblBvbGljaWVzOiBNYXA8c3RyaW5nLCBQb2xpY3lKc29uW10+ID0gbmV3IE1hcCgpO1xuICBwdWJsaWMgdmFsaWRhdGlvblBvbGljaWVzOiBNYXA8c3RyaW5nLCBQb2xpY3lKc29uW10+ID0gbmV3IE1hcCgpO1xuXG4gIHB1YmxpYyByb2xlcyE6IFJvbGVzVGFibGU7XG4gIHB1YmxpYyBkOVBlcm1pc3Npb25zOiBEOVBlcm1pc3Npb25bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKG9wdHM/OiB7IHBlcm1pc3Npb25QYXRoPzogc3RyaW5nOyBzcWxQYXRoPzogc3RyaW5nIH0pIHtcbiAgICB0aGlzLnBlcm1pc3Npb25QYXRoID0gb3B0cz8ucGVybWlzc2lvblBhdGggfHwgJy4vcGVybWlzc2lvbnMnO1xuICAgIHRoaXMuc3FsUGF0aCA9IG9wdHM/LnNxbFBhdGggfHwgJy4vc3FsL2RhdGEnO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlYWRQZXJtaXNzaW9uRmlsZSgpIHtcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IGF3YWl0IHJlYWRDc3ZGaWxlKFxuICAgICAgYCR7dGhpcy5zcWxQYXRofS9kaXJlY3R1c19wZXJtaXNzaW9ucy5jc3ZgLFxuICAgICk7XG4gICAgdGhpcy5kOVBlcm1pc3Npb25zID0gcGVybWlzc2lvbnMubWFwKChwKSA9PiBuZXcgRDlQZXJtaXNzaW9uKHApKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZWFkUm9sZUZpbGUoKSB7XG4gICAgdGhpcy5yb2xlcyA9IGF3YWl0IFJvbGVzVGFibGUubG9hZCh0aGlzLnNxbFBhdGgpO1xuICAgIGZvciAoY29uc3QgcGVybWlzc2lvbiBvZiB0aGlzLmQ5UGVybWlzc2lvbnMpIHtcbiAgICAgIHBlcm1pc3Npb24ucm9sZU5hbWUgPSBwZXJtaXNzaW9uLnJvbGVcbiAgICAgICAgPyB0aGlzLnJvbGVzLmdldE5hbWVGcm9tSWQocGVybWlzc2lvbi5yb2xlKSFcbiAgICAgICAgOiAnUHVibGljJztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVmYWN0b1BvbGljaWVzKFxuICAgIHBvbGljeUtleTogJ21haW5Qb2xpY2llcycgfCAnZmllbGRzUG9saWNpZXMnIHwgJ3ZhbGlkYXRpb25Qb2xpY2llcycsXG4gICkge1xuICAgIGZvciAoY29uc3QgW2dyb3VwTmFtZSwgcG9saWNpZXNdIG9mIHRoaXNbcG9saWN5S2V5XSkge1xuICAgICAgY29uc3QgZ3JvdXBlZFBvbGljaWVzID0gbmV3IE1hcDxzdHJpbmcsIGFueVtdPigpO1xuICAgICAgZm9yIChjb25zdCBwb2xpY3kgb2YgcG9saWNpZXMpIHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uc0tleSA9IEpTT04uc3RyaW5naWZ5KHBvbGljeS5jb25kaXRpb25zLm1hcCgoYykgPT4gYy5ib2R5KSk7XG4gICAgICAgIGlmICghZ3JvdXBlZFBvbGljaWVzLmhhcyhjb25kaXRpb25zS2V5KSkge1xuICAgICAgICAgIGdyb3VwZWRQb2xpY2llcy5zZXQoY29uZGl0aW9uc0tleSwgW10pO1xuICAgICAgICB9XG4gICAgICAgIGdyb3VwZWRQb2xpY2llcy5nZXQoY29uZGl0aW9uc0tleSkhLnB1c2gocG9saWN5KTtcbiAgICAgIH1cbiAgICAgIC8vIENvbWJpbmUgcG9saWNpZXMgaW4gZWFjaCBncm91cFxuICAgICAgY29uc3QgcmVmYWN0b3JlZDogYW55W10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBncm91cCBvZiBncm91cGVkUG9saWNpZXMudmFsdWVzKCkpIHtcbiAgICAgICAgaWYgKGdyb3VwLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIC8vIE5vIG9wdGltaXphdGlvbiBuZWVkZWQgZm9yIHNpbmdsZSBwb2xpY3lcbiAgICAgICAgICByZWZhY3RvcmVkLnB1c2goZ3JvdXBbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE11bHRpcGxlIHBvbGljaWVzIHdpdGggc2FtZSBjb25kaXRpb25zIC0gY29tYmluZSBhY3Rpb25zXG4gICAgICAgICAgY29uc3QgYWN0aW9ucyA9IGdyb3VwXG4gICAgICAgICAgICAubWFwKChwKSA9PiBwLmFjdGlvbi5lbnRpdHkpXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYCR7YS5pZH0ke2EudHlwZX1gLmxvY2FsZUNvbXBhcmUoYCR7Yi5pZH0ke2IudHlwZX1gKSk7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgY29tYmluZWQgcG9saWN5IHdpdGggXCJhY3Rpb24gaW4gWy4uLl1cIlxuICAgICAgICAgIGNvbnN0IGNvbWJpbmVkUG9saWN5ID0ge1xuICAgICAgICAgICAgZWZmZWN0OiBncm91cFswXS5lZmZlY3QsXG4gICAgICAgICAgICBwcmluY2lwYWw6IGdyb3VwWzBdLnByaW5jaXBhbCxcbiAgICAgICAgICAgIGFjdGlvbjoge1xuICAgICAgICAgICAgICBvcDogJ2luJyxcbiAgICAgICAgICAgICAgZW50aXRpZXM6IGFjdGlvbnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzb3VyY2U6IGdyb3VwWzBdLnJlc291cmNlLFxuICAgICAgICAgICAgY29uZGl0aW9uczogZ3JvdXBbMF0uY29uZGl0aW9ucyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJlZmFjdG9yZWQucHVzaChjb21iaW5lZFBvbGljeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXNbcG9saWN5S2V5XS5zZXQoZ3JvdXBOYW1lLCByZWZhY3RvcmVkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc29ydFBvbGljaWVzKFxuICAgIHBvbGljeUtleTogJ21haW5Qb2xpY2llcycgfCAnZmllbGRzUG9saWNpZXMnIHwgJ3ZhbGlkYXRpb25Qb2xpY2llcycsXG4gICkge1xuICAgIGZvciAoY29uc3QgW2dyb3VwTmFtZSwgcG9saWNpZXNdIG9mIHRoaXNbcG9saWN5S2V5XSkge1xuICAgICAgdGhpc1twb2xpY3lLZXldLnNldChcbiAgICAgICAgZ3JvdXBOYW1lLFxuICAgICAgICBwb2xpY2llcy5zb3J0KChwMSwgcDIpID0+IHtcbiAgICAgICAgICBjb25zdCBhMSA9IHAxLmFjdGlvbiBhcyBhbnk7XG4gICAgICAgICAgY29uc3QgYTIgPSBwMi5hY3Rpb24gYXMgYW55O1xuICAgICAgICAgIGNvbnN0IHQxID0gKGExLmVudGl0aWVzPy5bMF0gfHwgYTEuZW50aXR5KS50eXBlO1xuICAgICAgICAgIGNvbnN0IHQyID0gKGEyLmVudGl0aWVzPy5bMF0gfHwgYTIuZW50aXR5KS50eXBlO1xuICAgICAgICAgIHJldHVybiB0MS5sb2NhbGVDb21wYXJlKHQyKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB0cmFuc2xhdGVBbmRTb3J0UGVybWlzc2lvbigpIHtcbiAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb24gb2YgdGhpcy5kOVBlcm1pc3Npb25zKSB7XG4gICAgICBjb25zdCBjZWRhclBvbGljaWVzID0gYXdhaXQgdHJhbnNsYXRlVG9DZWRhcihwZXJtaXNzaW9uKTtcbiAgICAgIGNvbnN0IG1haW5Qb2xpY2llcyA9IHRoaXMubWFpblBvbGljaWVzLmdldChwZXJtaXNzaW9uLnJvbGVOYW1lKSB8fCBbXTtcbiAgICAgIHRoaXMubWFpblBvbGljaWVzLnNldChwZXJtaXNzaW9uLnJvbGVOYW1lLCBbXG4gICAgICAgIC4uLm1haW5Qb2xpY2llcyxcbiAgICAgICAgY2VkYXJQb2xpY2llcy5tYWluUG9saWN5LFxuICAgICAgXSk7XG4gICAgICBpZiAoY2VkYXJQb2xpY2llcy5maWVsZFBvbGljeSkge1xuICAgICAgICBjb25zdCBmaWVsZFBvbGljaWVzID0gdGhpcy5maWVsZHNQb2xpY2llcy5nZXQocGVybWlzc2lvbi5yb2xlTmFtZSkgfHwgW107XG4gICAgICAgIHRoaXMuZmllbGRzUG9saWNpZXMuc2V0KHBlcm1pc3Npb24ucm9sZU5hbWUsIFtcbiAgICAgICAgICAuLi5maWVsZFBvbGljaWVzLFxuICAgICAgICAgIGNlZGFyUG9saWNpZXMuZmllbGRQb2xpY3ksXG4gICAgICAgIF0pO1xuICAgICAgfVxuICAgICAgaWYgKGNlZGFyUG9saWNpZXMudmFsaWRhdGlvblBvbGljeSkge1xuICAgICAgICBjb25zdCB2YWxpZGF0aW9uUG9saWNpZXMgPVxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvblBvbGljaWVzLmdldChwZXJtaXNzaW9uLnJvbGVOYW1lKSB8fCBbXTtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uUG9saWNpZXMuc2V0KHBlcm1pc3Npb24ucm9sZU5hbWUsIFtcbiAgICAgICAgICAuLi52YWxpZGF0aW9uUG9saWNpZXMsXG4gICAgICAgICAgY2VkYXJQb2xpY2llcy52YWxpZGF0aW9uUG9saWN5LFxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcG9saWN5S2V5czogKFxuICAgICAgfCAnbWFpblBvbGljaWVzJ1xuICAgICAgfCAnZmllbGRzUG9saWNpZXMnXG4gICAgICB8ICd2YWxpZGF0aW9uUG9saWNpZXMnXG4gICAgKVtdID0gWydtYWluUG9saWNpZXMnLCAnZmllbGRzUG9saWNpZXMnLCAndmFsaWRhdGlvblBvbGljaWVzJ107XG4gICAgZm9yIChjb25zdCBwS2V5IG9mIHBvbGljeUtleXMpIHtcbiAgICAgIHRoaXMucmVmYWN0b1BvbGljaWVzKHBLZXkpO1xuICAgICAgdGhpcy5zb3J0UG9saWNpZXMocEtleSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHdyaXRlUG9saWNpZXNUb0ZpbGUoXG4gICAgcm9sZU5hbWU6IHN0cmluZyxcbiAgICBmaWxlVGl0bGU6IHN0cmluZyxcbiAgICBwb2xpY2llczogUG9saWN5SnNvbltdLFxuICApIHtcbiAgICBhd2FpdCBta2RpcihgJHt0aGlzLnBlcm1pc3Npb25QYXRofS8ke3JvbGVOYW1lfWAsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGNvbnN0IHBvbGljaWVzVGV4dCA9IHBvbGljaWVzLm1hcChwb2xpY3lUb0NlZGFyVGV4dCkuam9pbignXFxuXFxuJykgKyAnXFxuJztcbiAgICAvLyBPdXIgb3duIGNvbmRpdGlvbiBsYXlvdXQgbXVzdCBzdGlsbCBiZSB2YWxpZCBDZWRhci5cbiAgICBjb25zdCBwYXJzZWQgPSBjZWRhci5wb2xpY3lTZXRUZXh0VG9QYXJ0cyhwb2xpY2llc1RleHQpO1xuICAgIGlmIChwYXJzZWQudHlwZSA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoeyBwb2xpY2llc1RleHQgfSwgJ2dlbmVyYXRlZCBwb2xpY2llcyBhcmUgbm90IHZhbGlkIENlZGFyJyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocGFyc2VkLmVycm9ycyBhcyBhbnkpO1xuICAgIH1cbiAgICBhd2FpdCB3cml0ZUZpbGUoXG4gICAgICBgJHt0aGlzLnBlcm1pc3Npb25QYXRofS8ke3JvbGVOYW1lfS8ke2ZpbGVUaXRsZX1gLFxuICAgICAgcG9saWNpZXNUZXh0LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgd3JpdGVQb2xpY2llcyhcbiAgICBwb2xpY3lLZXk6ICdtYWluUG9saWNpZXMnIHwgJ2ZpZWxkc1BvbGljaWVzJyB8ICd2YWxpZGF0aW9uUG9saWNpZXMnLFxuICAgIGZpbGVOYW1lOiBzdHJpbmcsXG4gICkge1xuICAgIGZvciAoY29uc3QgW2dyb3VwLCBwb2xpY2llc10gb2YgdGhpc1twb2xpY3lLZXldKSB7XG4gICAgICBhd2FpdCB0aGlzLndyaXRlUG9saWNpZXNUb0ZpbGUoZ3JvdXAsIGZpbGVOYW1lLCBwb2xpY2llcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlYWRDc3ZBbmRXcml0ZUFsbEZpbGVzKCkge1xuICAgIGxvZ2dlci5pbmZvKCdyZWFkIHBlcm1pc3Npb24gZmlsZScpO1xuICAgIGF3YWl0IHRoaXMucmVhZFBlcm1pc3Npb25GaWxlKCk7XG4gICAgbG9nZ2VyLmluZm8oYGZvdW5kICR7dGhpcy5kOVBlcm1pc3Npb25zLmxlbmd0aH0gcGVybWlzc2lvbnNgKTtcbiAgICBsb2dnZXIuaW5mbygncmVhZCByb2xlIGZpbGUnKTtcbiAgICBhd2FpdCB0aGlzLnJlYWRSb2xlRmlsZSgpO1xuICAgIGxvZ2dlci5pbmZvKCdyb2xlcyBpbXBvcnRlZCcpO1xuICAgIGxvZ2dlci5pbmZvKCdncm91cGluZyBhbmQgc29ydGluZyBwZXJtaXNzaW9ucycpO1xuICAgIGF3YWl0IHRoaXMudHJhbnNsYXRlQW5kU29ydFBlcm1pc3Npb24oKTtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBoYXZpbmcgJHt0aGlzLm1haW5Qb2xpY2llcy5zaXplfSBtYWluIHBvbGljaWVzIGFuZCAke3RoaXMuZmllbGRzUG9saWNpZXMuc2l6ZX0gZmllbGRzIHBvbGljaWVzYCxcbiAgICApO1xuICAgIGxvZ2dlci5pbmZvKCd3cml0aW5nIGNlZGFyIHBvbGljaWVzIGZpbGVzJyk7XG4gICAgYXdhaXQgdGhpcy53cml0ZVBvbGljaWVzKCdtYWluUG9saWNpZXMnLCAnYXV0aG9yaXplLmNlZGFyJyk7XG4gICAgYXdhaXQgdGhpcy53cml0ZVBvbGljaWVzKCdmaWVsZHNQb2xpY2llcycsICdjaGVjay1maWVsZHMuY2VkYXInKTtcbiAgICBhd2FpdCB0aGlzLndyaXRlUG9saWNpZXMoJ3ZhbGlkYXRpb25Qb2xpY2llcycsICd2YWxpZGF0ZS5jZWRhcicpO1xuICAgIGxvZ2dlci5pbmZvKCdmaWxlcyB3cm90ZW4nKTtcbiAgfVxufVxuXG4vKipcbiAqIENMSSBhY3Rpb246IHJlZ2VuZXJhdGUgdGhlIENlZGFyIHBvbGljeSBmb2xkZXJzIGZyb20gZGlyZWN0dXNfcGVybWlzc2lvbnMuY3N2LlxuICogVGhlIGZvbGRlciBpcyB3aXBlZCBmaXJzdCwgcmVwcm9kdWNpbmcgd2hhdCBgZm9ybWF0ZVBlcm1pc3Npb25gIGRvZXMgaW4gYXBwLWFwaTIsXG4gKiBzbyBhIHJvbGUgcmVtb3ZlZCBmcm9tIHRoZSBDU1YgbGVhdmVzIG5vIG9ycGhhbiBmaWxlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGQ5VG9DZWRhcihvcHRpb25zPzoge1xuICBwZXJtaXNzaW9uUGF0aD86IHN0cmluZztcbiAgc3FsUGF0aD86IHN0cmluZztcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbWFuYWdlciA9IG5ldyBDZWRhck1hbmFnZXIob3B0aW9ucyk7XG4gIGF3YWl0IHJtKG1hbmFnZXIucGVybWlzc2lvblBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgYXdhaXQgbWFuYWdlci5yZWFkQ3N2QW5kV3JpdGVBbGxGaWxlcygpO1xufVxuIl19
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface Role {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
}
|
|
5
|
+
/** Lookup over `directus_roles.csv`, shared by the d9<->cedar managers. */
|
|
6
|
+
export declare class RolesTable {
|
|
7
|
+
static load(sqlPath: string): Promise<RolesTable>;
|
|
8
|
+
byId: Map<string, Role>;
|
|
9
|
+
byName: Map<string, Role>;
|
|
10
|
+
getNameFromId(id: string): string | undefined;
|
|
11
|
+
/** Role UUID for a role name; `''` for the implicit `Public` role. */
|
|
12
|
+
getIdFromName(roleName: string): string | undefined;
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RolesTable = void 0;
|
|
4
|
+
const utils_1 = require("../save/utils");
|
|
5
|
+
/** Lookup over `directus_roles.csv`, shared by the d9<->cedar managers. */
|
|
6
|
+
class RolesTable {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.byId = new Map();
|
|
9
|
+
this.byName = new Map();
|
|
10
|
+
}
|
|
11
|
+
static async load(sqlPath) {
|
|
12
|
+
const table = new RolesTable();
|
|
13
|
+
const roles = (await (0, utils_1.readCsvFile)(`${sqlPath}/directus_roles.csv`));
|
|
14
|
+
for (const role of roles) {
|
|
15
|
+
table.byId.set(role.id, role);
|
|
16
|
+
table.byName.set(role.name, role);
|
|
17
|
+
}
|
|
18
|
+
return table;
|
|
19
|
+
}
|
|
20
|
+
getNameFromId(id) {
|
|
21
|
+
return this.byId.get(id)?.name;
|
|
22
|
+
}
|
|
23
|
+
/** Role UUID for a role name; `''` for the implicit `Public` role. */
|
|
24
|
+
getIdFromName(roleName) {
|
|
25
|
+
return roleName === 'Public' ? '' : this.byName.get(roleName)?.id;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.RolesTable = RolesTable;
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZXMtdGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL2NlZGFyL3JvbGVzLXRhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUE0QztBQU81QywyRUFBMkU7QUFDM0UsTUFBYSxVQUFVO0lBQXZCO1FBWVMsU0FBSSxHQUFzQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3BDLFdBQU0sR0FBc0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQVUvQyxDQUFDO0lBdEJRLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQWU7UUFDdEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUMvQixNQUFNLEtBQUssR0FBRyxDQUFDLE1BQU0sSUFBQSxtQkFBVyxFQUFDLEdBQUcsT0FBTyxxQkFBcUIsQ0FBQyxDQUN0QyxDQUFDO1FBQzVCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM5QixLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFLTSxhQUFhLENBQUMsRUFBVTtRQUM3QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQztJQUNqQyxDQUFDO0lBRUQsc0VBQXNFO0lBQy9ELGFBQWEsQ0FBQyxRQUFnQjtRQUNuQyxPQUFPLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ3BFLENBQUM7Q0FDRjtBQXZCRCxnQ0F1QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkQ3N2RmlsZSB9IGZyb20gJy4uL3NhdmUvdXRpbHMnO1xuXG5pbnRlcmZhY2UgUm9sZSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuLyoqIExvb2t1cCBvdmVyIGBkaXJlY3R1c19yb2xlcy5jc3ZgLCBzaGFyZWQgYnkgdGhlIGQ5PC0+Y2VkYXIgbWFuYWdlcnMuICovXG5leHBvcnQgY2xhc3MgUm9sZXNUYWJsZSB7XG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgbG9hZChzcWxQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFJvbGVzVGFibGU+IHtcbiAgICBjb25zdCB0YWJsZSA9IG5ldyBSb2xlc1RhYmxlKCk7XG4gICAgY29uc3Qgcm9sZXMgPSAoYXdhaXQgcmVhZENzdkZpbGUoYCR7c3FsUGF0aH0vZGlyZWN0dXNfcm9sZXMuY3N2YCkpIGFzIChSb2xlICZcbiAgICAgIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pW107XG4gICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgICB0YWJsZS5ieUlkLnNldChyb2xlLmlkLCByb2xlKTtcbiAgICAgIHRhYmxlLmJ5TmFtZS5zZXQocm9sZS5uYW1lLCByb2xlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhYmxlO1xuICB9XG5cbiAgcHVibGljIGJ5SWQ6IE1hcDxzdHJpbmcsIFJvbGU+ID0gbmV3IE1hcCgpO1xuICBwdWJsaWMgYnlOYW1lOiBNYXA8c3RyaW5nLCBSb2xlPiA9IG5ldyBNYXAoKTtcblxuICBwdWJsaWMgZ2V0TmFtZUZyb21JZChpZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuYnlJZC5nZXQoaWQpPy5uYW1lO1xuICB9XG5cbiAgLyoqIFJvbGUgVVVJRCBmb3IgYSByb2xlIG5hbWU7IGAnJ2AgZm9yIHRoZSBpbXBsaWNpdCBgUHVibGljYCByb2xlLiAqL1xuICBwdWJsaWMgZ2V0SWRGcm9tTmFtZShyb2xlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHJvbGVOYW1lID09PSAnUHVibGljJyA/ICcnIDogdGhpcy5ieU5hbWUuZ2V0KHJvbGVOYW1lKT8uaWQ7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,7 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
user: string;
|
|
4
|
-
pwd: string;
|
|
5
|
-
database: string;
|
|
6
|
-
ssl?: boolean;
|
|
7
|
-
}): Promise<void>;
|
|
1
|
+
import { DbConfig } from './env';
|
|
2
|
+
export declare function applySQLSnapshot(dbConfig: DbConfig): Promise<void>;
|
|
@@ -8,6 +8,8 @@ const pg = require("pg");
|
|
|
8
8
|
const pg_copy_streams_1 = require("pg-copy-streams");
|
|
9
9
|
const cli_1 = require("./cli");
|
|
10
10
|
const utils_1 = require("./utils");
|
|
11
|
+
const atlas_1 = require("../../atlas");
|
|
12
|
+
const logger_1 = require("../../logger");
|
|
11
13
|
const readdir = (0, util_1.promisify)(fs.readdir);
|
|
12
14
|
const pipeline = (0, util_1.promisify)(stream_1.pipeline);
|
|
13
15
|
async function applySQLSnapshot(dbConfig) {
|
|
@@ -15,6 +17,7 @@ async function applySQLSnapshot(dbConfig) {
|
|
|
15
17
|
const connectionProps = {
|
|
16
18
|
user: dbConfig.user,
|
|
17
19
|
host: dbConfig.host,
|
|
20
|
+
port: dbConfig.port,
|
|
18
21
|
password: dbConfig.pwd,
|
|
19
22
|
database: 'postgres',
|
|
20
23
|
...(dbConfig.ssl ? { ssl: { rejectUnauthorized: false } } : {}),
|
|
@@ -24,7 +27,7 @@ async function applySQLSnapshot(dbConfig) {
|
|
|
24
27
|
//2. we populate with the schema
|
|
25
28
|
//3. we calculate the diff
|
|
26
29
|
pgClient = new pg.Client(connectionProps);
|
|
27
|
-
|
|
30
|
+
logger_1.logger.info(`Creating the temporary database ${dbConfig.database}_tmp_bis`);
|
|
28
31
|
await pgClient.connect();
|
|
29
32
|
try {
|
|
30
33
|
await pgClient.query(`DROP DATABASE IF EXISTS ${dbConfig.database}_tmp_bis`);
|
|
@@ -42,7 +45,7 @@ async function applySQLSnapshot(dbConfig) {
|
|
|
42
45
|
await Promise.all([pgClient.connect(), endDbClient.connect()]);
|
|
43
46
|
let sqlMigration = '';
|
|
44
47
|
try {
|
|
45
|
-
|
|
48
|
+
logger_1.logger.info('Loading the target schema into the temporary database');
|
|
46
49
|
//we manually install postgis and some extensions. We should do a dump of sql extensions but we are waiting for atlasgo to support this (time of writing : 19/03 - atlasgo released extensions support but not in the community version)
|
|
47
50
|
let extensionQuery = `
|
|
48
51
|
create extension if not exists postgis;
|
|
@@ -60,7 +63,7 @@ async function applySQLSnapshot(dbConfig) {
|
|
|
60
63
|
CREATE TABLE`) //only first occurrence will be replaced
|
|
61
64
|
.replace(/CREATE SCHEMA IF NOT EXISTS/g, 'CREATE SCHEMA')
|
|
62
65
|
.replace(/CREATE SCHEMA/g, 'CREATE SCHEMA IF NOT EXISTS'); //ensure all create schema use "if not exists"
|
|
63
|
-
//if target database does not contain any
|
|
66
|
+
//if target database does not contain any d9 tables we just need to populate the base schema.
|
|
64
67
|
const countTablesReq = `
|
|
65
68
|
SELECT COUNT(*)
|
|
66
69
|
FROM information_schema.tables
|
|
@@ -68,8 +71,8 @@ async function applySQLSnapshot(dbConfig) {
|
|
|
68
71
|
`;
|
|
69
72
|
const countTables = await endDbClient.query(countTablesReq);
|
|
70
73
|
if (Number(countTables.rows[0].count) === 0) {
|
|
71
|
-
//we drop the extension and reapply the schema with
|
|
72
|
-
|
|
74
|
+
//we drop the extension and reapply the schema with d9
|
|
75
|
+
logger_1.logger.info('Target database has no d9 tables: creating the schema directly');
|
|
73
76
|
//note that finally block will be executed, even if we return
|
|
74
77
|
await endDbClient.query(sqlSchemaWithExtension);
|
|
75
78
|
}
|
|
@@ -86,16 +89,15 @@ async function applySQLSnapshot(dbConfig) {
|
|
|
86
89
|
next();
|
|
87
90
|
},
|
|
88
91
|
});
|
|
89
|
-
|
|
92
|
+
logger_1.logger.info('Computing the schema diff with atlas');
|
|
90
93
|
const cli = new cli_1.Cli();
|
|
91
|
-
await cli.command(
|
|
92
|
-
'atlas',
|
|
94
|
+
await cli.command(await (0, atlas_1.ensureAtlas)(), [
|
|
93
95
|
'schema',
|
|
94
96
|
'diff',
|
|
95
97
|
'--from',
|
|
96
|
-
`postgres://${dbConfig.user}:${dbConfig.pwd}@${dbConfig.host}/${dbConfig.database}?sslmode=${dbConfig.ssl ? 'require' : 'disable'}`,
|
|
98
|
+
`postgres://${encodeURIComponent(dbConfig.user)}:${encodeURIComponent(dbConfig.pwd)}@${dbConfig.host}:${dbConfig.port}/${dbConfig.database}?sslmode=${dbConfig.ssl ? 'require' : 'disable'}`,
|
|
97
99
|
'--to',
|
|
98
|
-
`postgres://${dbConfig.user}:${dbConfig.pwd}@${dbConfig.host}/${dbConfig.database}_tmp_bis?sslmode=${dbConfig.ssl ? 'require' : 'disable'}`,
|
|
100
|
+
`postgres://${encodeURIComponent(dbConfig.user)}:${encodeURIComponent(dbConfig.pwd)}@${dbConfig.host}:${dbConfig.port}/${dbConfig.database}_tmp_bis?sslmode=${dbConfig.ssl ? 'require' : 'disable'}`,
|
|
99
101
|
], {
|
|
100
102
|
env: {
|
|
101
103
|
...process.env,
|
|
@@ -106,6 +108,14 @@ async function applySQLSnapshot(dbConfig) {
|
|
|
106
108
|
if (sqlMigration.includes('no changes to be made')) {
|
|
107
109
|
sqlMigration = '';
|
|
108
110
|
}
|
|
111
|
+
if (sqlMigration.trim()) {
|
|
112
|
+
const statements = sqlMigration.split('\n').filter((line) => line.trim().endsWith(';')).length;
|
|
113
|
+
logger_1.logger.info(`Schema migration: ${statements} statements`);
|
|
114
|
+
logger_1.logger.debug(sqlMigration);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
logger_1.logger.info('Schema is up to date');
|
|
118
|
+
}
|
|
109
119
|
//we apply the diffs in schema and data in one transaction
|
|
110
120
|
const pgTmpClient = new pg.Client(connectionProps);
|
|
111
121
|
connectionProps.database = dbConfig.database;
|
|
@@ -113,9 +123,8 @@ async function applySQLSnapshot(dbConfig) {
|
|
|
113
123
|
await Promise.all([pgClient.connect(), pgTmpClient.connect()]);
|
|
114
124
|
try {
|
|
115
125
|
await pgClient.query('BEGIN');
|
|
116
|
-
|
|
126
|
+
logger_1.logger.info('Applying the schema migration');
|
|
117
127
|
await pgClient.query(sqlMigration);
|
|
118
|
-
console.info('apply data');
|
|
119
128
|
//strategy to apply data :
|
|
120
129
|
//- remove the constraint
|
|
121
130
|
//- upsert the data
|
|
@@ -123,13 +132,12 @@ async function applySQLSnapshot(dbConfig) {
|
|
|
123
132
|
//always be sure the ci user exists
|
|
124
133
|
await pgClient.query(`
|
|
125
134
|
INSERT INTO public.directus_users (id, first_name, last_name, email)
|
|
126
|
-
VALUES ('49bcde5d-90aa-4be8-ab10-f9ae1a07546f', 'CI', '
|
|
135
|
+
VALUES ('49bcde5d-90aa-4be8-ab10-f9ae1a07546f', 'CI', 'D9-plumbing', 'd9@webcapsule.io')
|
|
127
136
|
ON CONFLICT DO NOTHING
|
|
128
137
|
`);
|
|
129
138
|
//for constraints see this :
|
|
130
139
|
//https://confluence.atlassian.com/kb/how-to-drop-and-recreate-the-database-constraints-on-postgresql-776812450.html
|
|
131
140
|
//we get all the constraints except the primary keys
|
|
132
|
-
console.info('remove the constraints on the table');
|
|
133
141
|
const constraints = await pgClient.query(`
|
|
134
142
|
SELECT nspname, relname, conname, pg_get_constraintdef(pg_constraint.oid)
|
|
135
143
|
FROM pg_constraint
|
|
@@ -139,6 +147,7 @@ async function applySQLSnapshot(dbConfig) {
|
|
|
139
147
|
ORDER BY CASE WHEN contype='f' THEN 0 ELSE 1 END DESC,contype DESC,nspname DESC,relname DESC,conname DESC
|
|
140
148
|
`);
|
|
141
149
|
//remove the constraints
|
|
150
|
+
logger_1.logger.info(`Dropping ${constraints.rows.length} constraints`);
|
|
142
151
|
//the query above is both for adding or dropping order. For dropping, we need to reverse the order
|
|
143
152
|
for (let i = 0; i < constraints.rows.length; i++) {
|
|
144
153
|
const constraint = constraints.rows[constraints.rows.length - 1 - i];
|
|
@@ -147,9 +156,8 @@ async function applySQLSnapshot(dbConfig) {
|
|
|
147
156
|
`);
|
|
148
157
|
}
|
|
149
158
|
//replace data
|
|
150
|
-
console.info('replacing with data');
|
|
151
159
|
const csvFiles = await readdir('./sql/data');
|
|
152
|
-
|
|
160
|
+
logger_1.logger.info(`Importing ${csvFiles.filter((file) => file.endsWith('.csv')).length} CSV files from ./sql/data`);
|
|
153
161
|
for (const file of csvFiles) {
|
|
154
162
|
if (file.endsWith('.csv')) {
|
|
155
163
|
const nonParsedTableName = file.slice(0, -4);
|
|
@@ -157,18 +165,18 @@ async function applySQLSnapshot(dbConfig) {
|
|
|
157
165
|
let copyTableName = originalTableName;
|
|
158
166
|
let existingRowsCanCauseConflict = false;
|
|
159
167
|
if (['directus_files', 'directus_folders'].includes(nonParsedTableName)) {
|
|
160
|
-
//delete all files and folders that are inside the "common" folder
|
|
161
|
-
const commonFolderName =
|
|
168
|
+
//delete all files and folders that are inside the "d9-plumbing-common" folder
|
|
169
|
+
const commonFolderName = pg.escapeLiteral(dbConfig.commonFolderName);
|
|
162
170
|
const folderKey = {
|
|
163
171
|
directus_files: 'folder',
|
|
164
172
|
directus_folders: 'parent',
|
|
165
173
|
};
|
|
166
174
|
await pgClient.query(`
|
|
167
175
|
WITH RECURSIVE folder_tree AS (
|
|
168
|
-
-- Anchor: the "common" folder
|
|
176
|
+
-- Anchor: the "d9-plumbing-common" folder
|
|
169
177
|
SELECT id
|
|
170
178
|
FROM directus_folders
|
|
171
|
-
WHERE name =
|
|
179
|
+
WHERE name = ${commonFolderName}
|
|
172
180
|
UNION
|
|
173
181
|
-- Recursive step: find subfolders
|
|
174
182
|
SELECT f.id
|
|
@@ -199,9 +207,9 @@ async function applySQLSnapshot(dbConfig) {
|
|
|
199
207
|
const ingestStream = pgClient.query((0, pg_copy_streams_1.from)(`COPY ${copyTableName} (${firstLine}) FROM STDIN DELIMITER ',' CSV HEADER`));
|
|
200
208
|
const sourceStream = fs.createReadStream(`./sql/data/${file}`);
|
|
201
209
|
ingestStream.on('close', () => {
|
|
202
|
-
|
|
210
|
+
logger_1.logger.debug(`ingested ${file}`);
|
|
203
211
|
});
|
|
204
|
-
|
|
212
|
+
logger_1.logger.debug(`ingesting ${file}`);
|
|
205
213
|
await pipeline(sourceStream, ingestStream);
|
|
206
214
|
if (existingRowsCanCauseConflict) {
|
|
207
215
|
await pgClient.query(`
|
|
@@ -216,7 +224,7 @@ async function applySQLSnapshot(dbConfig) {
|
|
|
216
224
|
}
|
|
217
225
|
}
|
|
218
226
|
//reestablish the constraints
|
|
219
|
-
|
|
227
|
+
logger_1.logger.info(`Restoring ${constraints.rows.length} constraints`);
|
|
220
228
|
for (const constraint of constraints.rows) {
|
|
221
229
|
await pgClient.query(`
|
|
222
230
|
ALTER TABLE ${constraint.nspname}."${constraint.relname}" ADD CONSTRAINT "${constraint.conname}" ${constraint.pg_get_constraintdef}
|
|
@@ -225,7 +233,6 @@ async function applySQLSnapshot(dbConfig) {
|
|
|
225
233
|
//update the sequences
|
|
226
234
|
//when adding with COPY, all sequences are not up to date
|
|
227
235
|
//we need to find all sequences and then to find the max on the managed column and then to update the sequence
|
|
228
|
-
console.info('find sequences');
|
|
229
236
|
const sequences = await pgClient.query(`
|
|
230
237
|
SELECT n.nspname as "schema",
|
|
231
238
|
c.relname as "name",
|
|
@@ -240,8 +247,9 @@ async function applySQLSnapshot(dbConfig) {
|
|
|
240
247
|
AND pg_catalog.pg_table_is_visible(c.oid)
|
|
241
248
|
ORDER BY 1,2;
|
|
242
249
|
`);
|
|
250
|
+
logger_1.logger.info(`Resetting ${sequences.rows.length} sequences`);
|
|
243
251
|
for (const seq of sequences.rows) {
|
|
244
|
-
|
|
252
|
+
logger_1.logger.debug(`find column managed by ${seq.name}`);
|
|
245
253
|
const relation = await pgClient.query(`
|
|
246
254
|
SELECT d.refobjid::regclass as "table", a.attname as "field"
|
|
247
255
|
FROM pg_depend d
|
|
@@ -251,28 +259,30 @@ async function applySQLSnapshot(dbConfig) {
|
|
|
251
259
|
AND d.refobjsubid > 0
|
|
252
260
|
AND d.classid = 'pg_class'::regclass;
|
|
253
261
|
`);
|
|
254
|
-
|
|
262
|
+
logger_1.logger.debug(`find max of ${relation.rows[0].table} ${relation.rows[0].field}`);
|
|
255
263
|
const max = await pgClient.query(`
|
|
256
264
|
SELECT MAX(${relation.rows[0].field})
|
|
257
265
|
FROM ${relation.rows[0].table}
|
|
258
266
|
`);
|
|
259
267
|
if (max.rows[0].max !== null) {
|
|
260
|
-
|
|
268
|
+
logger_1.logger.debug(`restart ${seq.name} at ${max.rows[0].max + 1}`);
|
|
261
269
|
await pgClient.query(`alter sequence ${seq.schema}."${seq.name}" restart with ${max.rows[0].max + 1};`);
|
|
262
270
|
}
|
|
263
271
|
}
|
|
264
272
|
await pgClient.query('COMMIT');
|
|
265
|
-
|
|
273
|
+
logger_1.logger.info('Transaction committed');
|
|
266
274
|
}
|
|
267
275
|
catch (e) {
|
|
276
|
+
logger_1.logger.error('Error while applying the snapshot, rolling back the transaction');
|
|
268
277
|
await pgClient.query('ROLLBACK');
|
|
269
|
-
console.log('error');
|
|
270
278
|
throw e;
|
|
271
279
|
}
|
|
272
280
|
finally {
|
|
273
281
|
await pgClient.end();
|
|
274
282
|
await pgTmpClient.end();
|
|
275
|
-
console.log('end of the query');
|
|
276
283
|
}
|
|
284
|
+
//schema (collections, fields, relations) is always cached (CACHE_SCHEMA), permissions only when CACHE_ENABLED: a purge is enough.
|
|
285
|
+
//flows, operations and webhooks are loaded in memory at startup and only reloaded by their own services: a restart is needed.
|
|
286
|
+
logger_1.logger.warn('Purge the d9 cache (POST /utils/cache/clear) to take the new schema (and permissions, if CACHE_ENABLED) into account. If flows, operations or webhooks changed, also restart d9.');
|
|
277
287
|
}
|
|
278
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHktc25hcHNob3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL3NhdmUvYXBwbHktc25hcHNob3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFZQSw0Q0E0U0M7QUF4VEQseUJBQXlCO0FBQ3pCLG1DQUE4RDtBQUM5RCwrQkFBaUM7QUFDakMseUJBQXlCO0FBQ3pCLHFEQUFtRDtBQUNuRCwrQkFBNEI7QUFDNUIsbUNBQThDO0FBRTlDLE1BQU0sT0FBTyxHQUFHLElBQUEsZ0JBQVMsRUFBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEMsTUFBTSxRQUFRLEdBQUcsSUFBQSxnQkFBUyxFQUFDLGlCQUFjLENBQUMsQ0FBQztBQUdwQyxLQUFLLFVBQVUsZ0JBQWdCLENBQUMsUUFNdEM7SUFDQyxJQUFJLFFBQW1CLENBQUM7SUFDeEIsTUFBTSxlQUFlLEdBQW9CO1FBQ3ZDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtRQUNuQixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7UUFDbkIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxHQUFHO1FBQ3RCLFFBQVEsRUFBRSxVQUFVO1FBQ3BCLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNoRSxDQUFDO0lBQ0EsUUFBUTtJQUNSLDBCQUEwQjtJQUMxQixnQ0FBZ0M7SUFDaEMsMEJBQTBCO0lBQzVCLFFBQVEsR0FBRyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDMUMsT0FBTyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3pCLElBQUksQ0FBQztRQUNILE1BQU0sUUFBUSxD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QUFDLENBQUM7Z0JBQ25DLE1BQU0sUUFBUSxDQUFDLEtBQUssQ0FDbEIsa0JBQWtCLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUNsRixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUV6QixDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLE1BQU0sUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXJCLE1BQU0sQ0FBQyxDQUFDO0lBQ1YsQ0FBQztZQUFTLENBQUM7UUFDVCxNQUFNLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixNQUFNLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDbEMsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBwaXBlbGluZSBhcyBzdHJlYW1QaXBlbGluZSwgV3JpdGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAndXRpbCc7XG5pbXBvcnQgKiBhcyBwZyBmcm9tICdwZyc7XG5pbXBvcnQgeyBmcm9tIGFzIGNvcHlGcm9tIH0gZnJvbSAncGctY29weS1zdHJlYW1zJztcbmltcG9ydCB7IENsaSB9IGZyb20gJy4vY2xpJztcbmltcG9ydCB7IHJlYWRGaXJzdExpbmVPZkZpbGUgfSBmcm9tICcuL3V0aWxzJztcblxuY29uc3QgcmVhZGRpciA9IHByb21pc2lmeShmcy5yZWFkZGlyKTtcbmNvbnN0IHBpcGVsaW5lID0gcHJvbWlzaWZ5KHN0cmVhbVBpcGVsaW5lKTtcblxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlTUUxTbmFwc2hvdChkYkNvbmZpZzoge1xuICBob3N0OiBzdHJpbmc7XG4gIHVzZXI6IHN0cmluZztcbiAgcHdkOiBzdHJpbmc7XG4gIGRhdGFiYXNlOiBzdHJpbmc7XG4gIHNzbD86IGJvb2xlYW47XG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBwZ0NsaWVudDogcGcuQ2xpZW50O1xuICBjb25zdCBjb25uZWN0aW9uUHJvcHM6IHBnLkNsaWVudENvbmZpZyA9IHtcbiAgICB1c2VyOiBkYkNvbmZpZy51c2VyLFxuICAgIGhvc3Q6IGRiQ29uZmlnLmhvc3QsXG4gICAgcGFzc3dvcmQ6IGRiQ29uZmlnLnB3ZCxcbiAgICBkYXRhYmFzZTogJ3Bvc3RncmVzJyxcbiAgICAuLi4oZGJDb25maWcuc3NsID8geyBzc2w6IHsgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZSB9IH0gOiB7fSksXG4gIH07XG4gICAgLy9TQ0hFTUFcbiAgICAvLzEuIHdlIGNyZWF0ZSBhbiBlbXB0eSBkYlxuICAgIC8vMi4gd2UgcG9wdWxhdGUgd2l0aCB0aGUgc2NoZW1hXG4gICAgLy8zLiB3ZSBjYWxjdWxhdGUgdGhlIGRpZmZcbiAgcGdDbGllbnQgPSBuZXcgcGcuQ2xpZW50KGNvbm5lY3Rpb25Qcm9wcyk7XG4gIGNvbnNvbGUuaW5mbygnY3JlYXRpbmcgZW1wdHkgdG1wIGRhdGFiYXNlJyk7XG4gIGF3YWl0IHBnQ2xpZW50LmNvbm5lY3QoKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShgRFJPUCBEQVRBQkFTRSBJRiBFWElTVFMgJHtkYkNvbmZpZy5kYXRhYmFzZX1fdG1wX2Jpc2ApO1xuICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KGBDUkVBVEUgREFUQUJBU0UgJHtkYkNvbmZpZy5kYXRhYmFzZX1fdG1wX2JpcztgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBwZ0NsaWVudC5lbmQoKTtcbiAgfVxuICBjb25uZWN0aW9uUHJvcHMuZGF0YWJhc2UgPSBgJHtkYkNvbmZpZy5kYXRhYmFzZX1fdG1wX2Jpc2A7XG4gIHBnQ2xpZW50ID0gbmV3IHBnLkNsaWVudChjb25uZWN0aW9uUHJvcHMpO1xuXG4gIGNvbnN0IGVuZERiQ2xpZW50ID0gbmV3IHBnLkNsaWVudCh7XG4gICAgLi4uY29ubmVjdGlvblByb3BzLFxuICAgIGRhdGFiYXNlOiBkYkNvbmZpZy5kYXRhYmFzZSxcbiAgfSk7XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoW3BnQ2xpZW50LmNvbm5lY3QoKSwgZW5kRGJDbGllbnQuY29ubmVjdCgpXSk7XG5cbiAgbGV0IHNxbE1pZ3JhdGlvbiA9ICcnO1xuICB0cnkge1xuICAgIGNvbnNvbGUuaW5mbygncG9wdWxhdGluZyB3aXRoIHRhcmdldCBzY2hlbWEnKTtcbiAgICAvL3dlIG1hbnVhbGx5IGluc3RhbGwgcG9zdGdpcyBhbmQgc29tZSBleHRlbnNpb25zLiBXZSBzaG91bGQgZG8gYSBkdW1wIG9mIHNxbCBleHRlbnNpb25zIGJ1dCB3ZSBhcmUgd2FpdGluZyBmb3IgYXRsYXNnbyB0byBzdXBwb3J0IHRoaXMgKHRpbWUgb2Ygd3JpdGluZyA6IDE5LzAzIC0gYXRsYXNnbyByZWxlYXNlZCBleHRlbnNpb25zIHN1cHBvcnQgYnV0IG5vdCBpbiB0aGUgY29tbXVuaXR5IHZlcnNpb24pXG4gICAgbGV0IGV4dGVuc2lvblF1ZXJ5ID0gYFxuICAgICAgICAgICAgY3JlYXRlIGV4dGVuc2lvbiBpZiBub3QgZXhpc3RzIHBvc3RnaXM7XG4gICAgICAgICAgICBjcmVhdGUgZXh0ZW5zaW9uIGlmIG5vdCBleGlzdHMgZnV6enlzdHJtYXRjaDtcbiAgICAgICAgICAgIGNyZWF0ZSBleHRlbnNpb24gaWYgbm90IGV4aXN0cyBwb3N0Z2lzX3RpZ2VyX2dlb2NvZGVyIDtcbiAgICAgICAgICAgIGNyZWF0ZSBleHRlbnNpb24gaWYgbm90IGV4aXN0cyBwb3N0Z2lzX3Jhc3RlciA7XG4gICAgICAgICAgICBjcmVhdGUgZXh0ZW5zaW9uIGlmIG5vdCBleGlzdHMgcG9zdGdpc190b3BvbG9neSA7XG4gICAgICAgICAgICBjcmVhdGUgZXh0ZW5zaW9uIGlmIG5vdCBleGlzdHMgYWRkcmVzc19zdGFuZGFyZGl6ZXIgO1xuICAgICAgICBgO1xuICAgIC8vdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIGR1bXAgaW4gYXRsYXMgOiBzY2hlbWEgYXJlIGNyZWF0ZWQgd2l0aCBDUkVBVEUgYW5kIG5vdCBjcmVhdGUgaWYgbm90IGV4aXRzLi4uXG4gICAgLy9zbyB3ZSBpbnNlcnQgZXh0ZW5zaW9uIGNyZWF0aW9uIGFmdGVyIHNjaGVtYSBjcmVhdGlvbiBpbiBvcmRlciB0byBhdm9pZCBnZXR0aW5nIFwic2NoZW1hIGFscmVhZHkgZXhpc3RzXCJcbiAgICBjb25zdCBzcWxTY2hlbWEgPSBmcy5yZWFkRmlsZVN5bmMoJy4vc3FsL3NjaGVtYS5zcWwnKS50b1N0cmluZygpO1xuICAgIGNvbnN0IHNxbFNjaGVtYVdpdGhFeHRlbnNpb24gPSBzcWxTY2hlbWFcbiAgICAgIC5yZXBsYWNlKFxuICAgICAgICAnQ1JFQVRFIFRBQkxFJyxcbiAgICAgICAgYCR7ZXh0ZW5zaW9uUXVlcnl9XG4gICAgICAgICAgICBDUkVBVEUgVEFCTEVgLFxuICAgICAgKSAvL29ubHkgZmlyc3Qgb2NjdXJyZW5jZSB3aWxsIGJlIHJlcGxhY2VkXG4gICAgICAucmVwbGFjZSgvQ1JFQVRFIFNDSEVNQSBJRiBOT1QgRVhJU1RTL2csICdDUkVBVEUgU0NIRU1BJylcbiAgICAgIC5yZXBsYWNlKC9DUkVBVEUgU0NIRU1BL2csICdDUkVBVEUgU0NIRU1BIElGIE5PVCBFWElTVFMnKTsgLy9lbnN1cmUgYWxsIGNyZWF0ZSBzY2hlbWEgdXNlIFwiaWYgbm90IGV4aXN0c1wiXG4gICAgLy9pZiB0YXJnZXQgZGF0YWJhc2UgZG9lcyBub3QgY29udGFpbiBhbnkgZGlyZWN0dXMgdGFibGVzIHdlIGp1c3QgbmVlZCB0byBwb3B1bGF0ZSB0aGUgYmFzZSBzY2hlbWEuXG4gICAgY29uc3QgY291bnRUYWJsZXNSZXEgPSBgXG4gICAgICAgICAgICBTRUxFQ1QgQ09VTlQoKikgXG4gICAgICAgICAgICBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgXG4gICAgICAgICAgICBXSEVSRSB0YWJsZV9zY2hlbWEgPSAncHVibGljJyBBTkQgdGFibGVfbmFtZSBMSUtFICdkaXJlY3R1c18lJztcbiAgICAgICAgYDtcbiAgICBjb25zdCBjb3VudFRhYmxlcyA9IGF3YWl0IGVuZERiQ2xpZW50LnF1ZXJ5KGNvdW50VGFibGVzUmVxKTtcbiAgICBpZiAoTnVtYmVyKGNvdW50VGFibGVzLnJvd3NbMF0uY291bnQpID09PSAwKSB7XG4gICAgICAvL3dlIGRyb3AgdGhlIGV4dGVuc2lvbiBhbmQgcmVhcHBseSB0aGUgc2NoZW1hIHdpdGggZGlyZWN0dXNcbiAgICAgIGNvbnNvbGUuaW5mbygnVGFyZ2V0IGRhdGFiYXNlIGlzIGVtcHR5IDsgcG9wdWxhdGluZyBpdCBhbmQgZXhpdGluZy4nKTtcbiAgICAgIC8vbm90ZSB0aGF0IGZpbmFsbHkgYmxvY2sgd2lsbCBiZSBleGVjdXRlZCwgZXZlbiBpZiB3ZSByZXR1cm5cbiAgICAgIGF3YWl0IGVuZERiQ2xpZW50LnF1ZXJ5KHNxbFNjaGVtYVdpdGhFeHRlbnNpb24pO1xuICAgIH1cblxuICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KHNxbFNjaGVtYVdpdGhFeHRlbnNpb24pO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IHBnQ2xpZW50LmVuZCgpO1xuICAgIGF3YWl0IGVuZERiQ2xpZW50LmVuZCgpO1xuICB9XG5cbiAgLy93ZSBjYWxjdWxhdGUgdGhlIGRpZmZcbiAgY29uc3QgbWlncmF0aW9uU3RyZWFtID0gbmV3IFdyaXRhYmxlKHtcbiAgICB3cml0ZTogKGNodW5rLCBfZW5jb2RpbmcsIG5leHQpID0+IHtcbiAgICAgIHNxbE1pZ3JhdGlvbiArPSBjaHVuay50b1N0cmluZygpO1xuICAgICAgbmV4dCgpO1xuICAgIH0sXG4gIH0pO1xuICBjb25zb2xlLmluZm8oJ2NhbGN1bGF0aW5nIG1pZ3JhdGlvbiBkaWZmJyk7XG4gIGNvbnN0IGNsaSA9IG5ldyBDbGkoKTtcbiAgYXdhaXQgY2xpLmNvbW1hbmQoXG4gICAgJ25weCcsXG4gICAgW1xuICAgICAgJ2F0bGFzJyxcbiAgICAgICdzY2hlbWEnLFxuICAgICAgJ2RpZmYnLFxuICAgICAgJy0tZnJvbScsXG4gICAgICBgcG9zdGdyZXM6Ly8ke2RiQ29uZmlnLnVzZXJ9OiR7ZGJDb25maWcucHdkfUAke2RiQ29uZmlnLmhvc3R9LyR7ZGJDb25maWcuZGF0YWJhc2V9P3NzbG1vZGU9JHtkYkNvbmZpZy5zc2wgPyAncmVxdWlyZScgOiAnZGlzYWJsZSd9YCxcbiAgICAgICctLXRvJyxcbiAgICAgIGBwb3N0Z3JlczovLyR7ZGJDb25maWcudXNlcn06JHtkYkNvbmZpZy5wd2R9QCR7ZGJDb25maWcuaG9zdH0vJHtkYkNvbmZpZy5kYXRhYmFzZX1fdG1wX2Jpcz9zc2xtb2RlPSR7ZGJDb25maWcuc3NsID8gJ3JlcXVpcmUnIDogJ2Rpc2FibGUnfWAsXG4gICAgXSxcbiAgICB7XG4gICAgICBlbnY6IHtcbiAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgIEFUTEFTX05PX1VQREFURV9OT1RJRklFUjogJ3RydWUnLCAvL2lmIG5vdCBzZXQsIGF0bGFzIGVuZCBhIGZpbmFsIGxpbmUgd2l0aCBcImEgbmV3IHZlcnNpb24gb2YgYXRsYXMgaXMgYXZhaWxhYmxlXCJcbiAgICAgIH0sXG4gICAgICBzdGRvdXQ6IG1pZ3JhdGlvblN0cmVhbSxcbiAgICB9LFxuICApO1xuICBpZiAoc3FsTWlncmF0aW9uLmluY2x1ZGVzKCdubyBjaGFuZ2VzIHRvIGJlIG1hZGUnKSkge1xuICAgIHNxbE1pZ3JhdGlvbiA9ICcnO1xuICB9XG4gIC8vd2UgYXBwbHkgdGhlIGRpZmZzIGluIHNjaGVtYSBhbmQgZGF0YSBpbiBvbmUgdHJhbnNhY3Rpb25cbiAgY29uc3QgcGdUbXBDbGllbnQgPSBuZXcgcGcuQ2xpZW50KGNvbm5lY3Rpb25Qcm9wcyk7XG4gIGNvbm5lY3Rpb25Qcm9wcy5kYXRhYmFzZSA9IGRiQ29uZmlnLmRhdGFiYXNlO1xuICBwZ0NsaWVudCA9IG5ldyBwZy5DbGllbnQoY29ubmVjdGlvblByb3BzKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoW3BnQ2xpZW50LmNvbm5lY3QoKSwgcGdUbXBDbGllbnQuY29ubmVjdCgpXSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgcGdDbGllbnQucXVlcnkoJ0JFR0lOJyk7XG4gICAgY29uc29sZS5pbmZvKCdhcHBseSBzY2hlbWEnKTtcbiAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShzcWxNaWdyYXRpb24pO1xuICAgIGNvbnNvbGUuaW5mbygnYXBwbHkgZGF0YScpO1xuICAgIC8vc3RyYXRlZ3kgdG8gYXBwbHkgZGF0YSA6XG4gICAgLy8tIHJlbW92ZSB0aGUgY29uc3RyYWludFxuICAgIC8vLSB1cHNlcnQgdGhlIGRhdGFcbiAgICAvLy0gYXBwbHkgdGhlIGNvbnN0cmFpbnRcblxuICAgIC8vYWx3YXlzIGJlIHN1cmUgdGhlIGNpIHVzZXIgZXhpc3RzXG4gICAgYXdhaXQgcGdDbGllbnQucXVlcnkoYFxuICAgICAgICAgICAgSU5TRVJUIElOVE8gcHVibGljLmRpcmVjdHVzX3VzZXJzIChpZCwgZmlyc3RfbmFtZSwgbGFzdF9uYW1lLCBlbWFpbClcbiAgICAgICAgICAgIFZBTFVFUyAoJzQ5YmNkZTVkLTkwYWEtNGJlOC1hYjEwLWY5YWUxYTA3NTQ2ZicsICdDSScsICdXZWJjYXBzdWxlJywgJ2NpQHdlYmNhcHN1bGUuaW8nKVxuICAgICAgICAgICAgT04gQ09ORkxJQ1QgRE8gTk9USElOR1xuICAgICAgICBgKTtcblxuICAgIC8vZm9yIGNvbnN0cmFpbnRzIHNlZSB0aGlzIDpcbiAgICAvL2h0dHBzOi8vY29uZmx1ZW5jZS5hdGxhc3NpYW4uY29tL2tiL2hvdy10by1kcm9wLWFuZC1yZWNyZWF0ZS10aGUtZGF0YWJhc2UtY29uc3RyYWludHMtb24tcG9zdGdyZXNxbC03NzY4MTI0NTAuaHRtbFxuICAgIC8vd2UgZ2V0IGFsbCB0aGUgY29uc3RyYWludHMgZXhjZXB0IHRoZSBwcmltYXJ5IGtleXNcbiAgICBjb25zb2xlLmluZm8oJ3JlbW92ZSB0aGUgY29uc3RyYWludHMgb24gdGhlIHRhYmxlJyk7XG4gICAgY29uc3QgY29uc3RyYWludHMgPSBhd2FpdCBwZ0NsaWVudC5xdWVyeShgXG4gICAgICAgICAgICBTRUxFQ1QgbnNwbmFtZSwgcmVsbmFtZSwgY29ubmFtZSwgcGdfZ2V0X2NvbnN0cmFpbnRkZWYocGdfY29uc3RyYWludC5vaWQpXG4gICAgICAgICAgICBGUk9NIHBnX2NvbnN0cmFpbnRcbiAgICAgICAgICAgIElOTkVSIEpPSU4gcGdfY2xhc3MgT04gY29ucmVsaWQ9cGdfY2xhc3Mub2lkXG4gICAgICAgICAgICBJTk5FUiBKT0lOIHBnX25hbWVzcGFjZSBPTiBwZ19uYW1lc3BhY2Uub2lkPXBnX2NsYXNzLnJlbG5hbWVzcGFjZVxuICAgICAgICAgICAgV0hFUkUgTk9UIG5zcG5hbWUgPSAncGdfY2F0YWxvZycgQU5EIE5PVCBjb250eXBlID0gJ3AnXG4gICAgICAgICAgICBPUkRFUiBCWSBDQVNFIFdIRU4gY29udHlwZT0nZicgVEhFTiAwIEVMU0UgMSBFTkQgREVTQyxjb250eXBlIERFU0MsbnNwbmFtZSBERVNDLHJlbG5hbWUgREVTQyxjb25uYW1lIERFU0NcbiAgICAgICAgYCk7XG5cbiAgICAvL3JlbW92ZSB0aGUgY29uc3RyYWludHNcbiAgICAvL3RoZSBxdWVyeSBhYm92ZSBpcyBib3RoIGZvciBhZGRpbmcgb3IgZHJvcHBpbmcgb3JkZXIuIEZvciBkcm9wcGluZywgd2UgbmVlZCB0byByZXZlcnNlIHRoZSBvcmRlclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uc3RyYWludHMucm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY29uc3RyYWludCA9IGNvbnN0cmFpbnRzLnJvd3NbY29uc3RyYWludHMucm93cy5sZW5ndGggLSAxIC0gaV07XG4gICAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShgXG4gICAgICAgICAgICAgICAgQUxURVIgVEFCTEUgJHtjb25zdHJhaW50Lm5zcG5hbWV9LlwiJHtjb25zdHJhaW50LnJlbG5hbWV9XCIgRFJPUCBDT05TVFJBSU5UIFwiJHtjb25zdHJhaW50LmNvbm5hbWV9XCJcbiAgICAgICAgICAgIGApO1xuICAgIH1cblxuICAgIC8vcmVwbGFjZSBkYXRhXG4gICAgY29uc29sZS5pbmZvKCdyZXBsYWNpbmcgd2l0aCBkYXRhJyk7XG4gICAgY29uc3QgY3N2RmlsZXMgPSBhd2FpdCByZWFkZGlyKCcuL3NxbC9kYXRhJyk7XG4gICAgY29uc29sZS5sb2coY3N2RmlsZXMpO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBjc3ZGaWxlcykge1xuICAgICAgaWYgKGZpbGUuZW5kc1dpdGgoJy5jc3YnKSkge1xuICAgICAgICBjb25zdCBub25QYXJzZWRUYWJsZU5hbWUgPSBmaWxlLnNsaWNlKDAsIC00KTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxUYWJsZU5hbWUgPSBwZy5lc2NhcGVJZGVudGlmaWVyKG5vblBhcnNlZFRhYmxlTmFtZSk7XG4gICAgICAgIGxldCBjb3B5VGFibGVOYW1lID0gb3JpZ2luYWxUYWJsZU5hbWU7XG4gICAgICAgIGxldCBleGlzdGluZ1Jvd3NDYW5DYXVzZUNvbmZsaWN0ID0gZmFsc2U7XG4gICAgICAgIGlmIChbJ2RpcmVjdHVzX2ZpbGVzJywgJ2RpcmVjdHVzX2ZvbGRlcnMnXS5pbmNsdWRlcyhub25QYXJzZWRUYWJsZU5hbWUpKSB7XG4gICAgICAgICAgLy9kZWxldGUgYWxsIGZpbGVzIGFuZCBmb2xkZXJzIHRoYXQgYXJlIGluc2lkZSB0aGUgXCJjb21tb25cIiBmb2xkZXJcbiAgICAgICAgICBjb25zdCBjb21tb25Gb2xkZXJOYW1lID0gJ2NvbW1vbic7XG4gICAgICAgICAgY29uc3QgZm9sZGVyS2V5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgZGlyZWN0dXNfZmlsZXM6ICdmb2xkZXInLFxuICAgICAgICAgICAgZGlyZWN0dXNfZm9sZGVyczogJ3BhcmVudCcsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShgIFxuICAgICAgICAgICAgICAgICAgICAgICAgV0lUSCBSRUNVUlNJVkUgZm9sZGVyX3RyZWUgQVMgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gQW5jaG9yOiB0aGUgXCJjb21tb25cIiBmb2xkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NIGRpcmVjdHVzX2ZvbGRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSBuYW1lID0gJyR7Y29tbW9uRm9sZGVyTmFtZX0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTklPTlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIFJlY3Vyc2l2ZSBzdGVwOiBmaW5kIHN1YmZvbGRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgZi5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gZGlyZWN0dXNfZm9sZGVycyBmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSk9JTiBmb2xkZXJfdHJlZSBmdCBPTiBmLnBhcmVudCA9IGZ0LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBERUxFVEUgRlJPTSBwdWJsaWMuJHtjb3B5VGFibGVOYW1lfSBBUyB0XG4gICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSB0LiR7Zm9sZGVyS2V5W25vblBhcnNlZFRhYmxlTmFtZV19IElOIChTRUxFQ1QgaWQgRlJPTSBmb2xkZXJfdHJlZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBgKTtcbiAgICAgICAgICBpZiAobm9uUGFyc2VkVGFibGVOYW1lID09PSAnZGlyZWN0dXNfZm9sZGVycycpIHtcbiAgICAgICAgICAgIGV4aXN0aW5nUm93c0NhbkNhdXNlQ29uZmxpY3QgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShgREVMRVRFIEZST00gcHVibGljLiR7Y29weVRhYmxlTmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhpc3RpbmdSb3dzQ2FuQ2F1c2VDb25mbGljdCkge1xuICAgICAgICAgIC8vd2Ugd2lsbCBpbXBvcnQgZGF0YSBpbiBhIHRlbXBvcmFyeSB0YWJsZSwgdGhlbiBkbyB0aGUgaW5zZXJ0XG4gICAgICAgICAgY29weVRhYmxlTmFtZSA9IHBnLmVzY2FwZUlkZW50aWZpZXIoYCR7bm9uUGFyc2VkVGFibGVOYW1lfV93YmNlX3RtcGApO1xuICAgICAgICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KFxuICAgICAgICAgICAgYENSRUFURSBURU1QIFRBQkxFICR7Y29weVRhYmxlTmFtZX0gT04gQ09NTUlUIERST1AgQVMgU0VMRUNUICogRlJPTSBwdWJsaWMuJHtvcmlnaW5hbFRhYmxlTmFtZX0gV0lUSCBOTyBEQVRBYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vcmVhZCBmaXJzdCBsaW5lXG4gICAgICAgIGxldCBmaXJzdExpbmUgPSBhd2FpdCByZWFkRmlyc3RMaW5lT2ZGaWxlKGAuL3NxbC9kYXRhLyR7ZmlsZX1gKTtcbiAgICAgICAgZmlyc3RMaW5lID0gZmlyc3RMaW5lXG4gICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAubWFwKChjKSA9PiBgXCIke2N9XCJgKVxuICAgICAgICAgIC5qb2luKCcsJyk7XG4gICAgICAgIGNvbnN0IGluZ2VzdFN0cmVhbSA9IHBnQ2xpZW50LnF1ZXJ5KFxuICAgICAgICAgIGNvcHlGcm9tKFxuICAgICAgICAgICAgYENPUFkgJHtjb3B5VGFibGVOYW1lfSAoJHtmaXJzdExpbmV9KSAgRlJPTSBTVERJTiAgREVMSU1JVEVSICcsJyBDU1YgSEVBREVSYCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzb3VyY2VTdHJlYW0gPSBmcy5jcmVhdGVSZWFkU3RyZWFtKGAuL3NxbC9kYXRhLyR7ZmlsZX1gKTtcbiAgICAgICAgaW5nZXN0U3RyZWFtLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYGluZ2VzdGVkICR7ZmlsZX1gKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgaW5nZXN0aW5nICR7ZmlsZX1gKTtcblxuICAgICAgICBhd2FpdCBwaXBlbGluZShzb3VyY2VTdHJlYW0sIGluZ2VzdFN0cmVhbSk7XG4gICAgICAgIGlmIChleGlzdGluZ1Jvd3NDYW5DYXVzZUNvbmZsaWN0KSB7XG4gICAgICAgICAgYXdhaXQgcGdDbGllbnQucXVlcnkoYFxuXHRcdFx0XHRcdFx0XHRERUxFVEUgRlJPTSBwdWJsaWMuJHtvcmlnaW5hbFRhYmxlTmFtZX1cblx0XHRcdFx0XHRcdFx0V0hFUkUgaWQgSU4gKFNFTEVDVCBpZCBGUk9NICR7Y29weVRhYmxlTmFtZX0pO1xuXHRcdFx0XHRcdFx0YCk7XG4gICAgICAgICAgYXdhaXQgcGdDbGllbnQucXVlcnkoYFxuXHRcdFx0XHRcdFx0XHRJTlNFUlQgSU5UTyBwdWJsaWMuJHtvcmlnaW5hbFRhYmxlTmFtZX1cblx0XHRcdFx0XHRcdFx0U0VMRUNUICogRlJPTSAke2NvcHlUYWJsZU5hbWV9O1xuXHRcdFx0XHRcdFx0YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL3JlZXN0YWJsaXNoIHRoZSBjb25zdHJhaW50c1xuICAgIGNvbnNvbGUuaW5mbygncmVlc3RhYmxpc2ggdGhlIGNvbnN0cmFpbnRzJyk7XG4gICAgZm9yIChjb25zdCBjb25zdHJhaW50IG9mIGNvbnN0cmFpbnRzLnJvd3MpIHtcbiAgICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KGBcbiAgICAgICAgICAgICAgICBBTFRFUiBUQUJMRSAke2NvbnN0cmFpbnQubnNwbmFtZX0uXCIke2NvbnN0cmFpbnQucmVsbmFtZX1cIiBBREQgQ09OU1RSQUlOVCBcIiR7Y29uc3RyYWludC5jb25uYW1lfVwiICAke2NvbnN0cmFpbnQucGdfZ2V0X2NvbnN0cmFpbnRkZWZ9XG4gICAgICAgICAgICBgKTtcbiAgICB9XG5cbiAgICAvL3VwZGF0ZSB0aGUgc2VxdWVuY2VzXG4gICAgLy93aGVuIGFkZGluZyB3aXRoIENPUFksIGFsbCBzZXF1ZW5jZXMgYXJlIG5vdCB1cCB0byBkYXRlXG4gICAgLy93ZSBuZWVkIHRvIGZpbmQgYWxsIHNlcXVlbmNlcyBhbmQgdGhlbiB0byBmaW5kIHRoZSBtYXggb24gdGhlIG1hbmFnZWQgY29sdW1uIGFuZCB0aGVuIHRvIHVwZGF0ZSB0aGUgc2VxdWVuY2VcblxuICAgIGNvbnNvbGUuaW5mbygnZmluZCBzZXF1ZW5jZXMnKTtcbiAgICBjb25zdCBzZXF1ZW5jZXMgPSBhd2FpdCBwZ0NsaWVudC5xdWVyeShgXG4gICAgICAgICAgICBTRUxFQ1Qgbi5uc3BuYW1lIGFzIFwic2NoZW1hXCIsXG4gICAgICAgICAgICAgICAgYy5yZWxuYW1lIGFzIFwibmFtZVwiLFxuICAgICAgICAgICAgICAgIENBU0UgYy5yZWxraW5kIFdIRU4gJ3InIFRIRU4gJ3RhYmxlJyBXSEVOICd2JyBUSEVOICd2aWV3JyBXSEVOICdtJyBUSEVOICdtYXRlcmlhbGl6ZWQgdmlldycgV0hFTiAnaScgVEhFTiAnaW5kZXgnIFdIRU4gJ1MnIFRIRU4gJ3NlcXVlbmNlJyBXSEVOICdzJyBUSEVOICdzcGVjaWFsJyBXSEVOICd0JyBUSEVOICdUT0FTVCB0YWJsZScgV0hFTiAnZicgVEhFTiAnZm9yZWlnbiB0YWJsZScgV0hFTiAncCcgVEhFTiAncGFydGl0aW9uZWQgdGFibGUnIFdIRU4gJ0knIFRIRU4gJ3BhcnRpdGlvbmVkIGluZGV4JyBFTkQgYXMgXCJUeXBlXCIsXG4gICAgICAgICAgICAgICAgcGdfY2F0YWxvZy5wZ19nZXRfdXNlcmJ5aWQoYy5yZWxvd25lcikgYXMgXCJPd25lclwiXG4gICAgICAgICAgICBGUk9NIHBnX2NhdGFsb2cucGdfY2xhc3MgY1xuICAgICAgICAgICAgICAgIExFRlQgSk9JTiBwZ19jYXRhbG9nLnBnX25hbWVzcGFjZSBuIE9OIG4ub2lkID0gYy5yZWxuYW1lc3BhY2VcbiAgICAgICAgICAgIFdIRVJFIGMucmVsa2luZCBJTiAoJ1MnLCcnKVxuICAgICAgICAgICAgICAgIEFORCBuLm5zcG5hbWUgPD4gJ3BnX2NhdGFsb2cnXG4gICAgICAgICAgICAgICAgQU5EIG4ubnNwbmFtZSAhfiAnXnBnX3RvYXN0J1xuICAgICAgICAgICAgICAgIEFORCBuLm5zcG5hbWUgPD4gJ2luZm9ybWF0aW9uX3NjaGVtYSdcbiAgICAgICAgICAgIEFORCBwZ19jYXRhbG9nLnBnX3RhYmxlX2lzX3Zpc2libGUoYy5vaWQpXG4gICAgICAgICAgICBPUkRFUiBCWSAxLDI7XG4gICAgICAgIGApO1xuXG4gICAgZm9yIChjb25zdCBzZXEgb2Ygc2VxdWVuY2VzLnJvd3MpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgZmluZCBjb2x1bW4gbWFuYWdlZCBieSAke3NlcS5uYW1lfWApO1xuICAgICAgY29uc3QgcmVsYXRpb24gPSBhd2FpdCBwZ0NsaWVudC5xdWVyeShgXG4gICAgICAgICAgICAgICAgU0VMRUNUIGQucmVmb2JqaWQ6OnJlZ2NsYXNzIGFzIFwidGFibGVcIiwgYS5hdHRuYW1lIGFzIFwiZmllbGRcIlxuICAgICAgICAgICAgICAgIEZST00gICBwZ19kZXBlbmQgICAgZFxuICAgICAgICAgICAgICAgIEpPSU4gICBwZ19hdHRyaWJ1dGUgYSBPTiBhLmF0dHJlbGlkID0gZC5yZWZvYmppZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EIGEuYXR0bnVtICAgPSBkLnJlZm9ianN1YmlkXG4gICAgICAgICAgICAgICAgV0hFUkUgIGQub2JqaWQgPSAnJHtzZXEuc2NoZW1hfS5cIiR7c2VxLm5hbWV9XCInOjpyZWdjbGFzc1xuICAgICAgICAgICAgICAgIEFORCAgICBkLnJlZm9ianN1YmlkID4gMFxuICAgICAgICAgICAgICAgIEFORCAgICBkLmNsYXNzaWQgPSAncGdfY2xhc3MnOjpyZWdjbGFzcztcbiAgICAgICAgICAgIGApO1xuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBgZmluZCBtYXggb2YgJHtyZWxhdGlvbi5yb3dzWzBdLnRhYmxlfSAke3JlbGF0aW9uLnJvd3NbMF0uZmllbGR9YCxcbiAgICAgICk7XG4gICAgICBjb25zdCBtYXggPSBhd2FpdCBwZ0NsaWVudC5xdWVyeShgXG4gICAgICAgICAgICAgICAgU0VMRUNUIE1BWCgke3JlbGF0aW9uLnJvd3NbMF0uZmllbGR9KVxuICAgICAgICAgICAgICAgIEZST00gJHtyZWxhdGlvbi5yb3dzWzBdLnRhYmxlfVxuICAgICAgICAgICAgYCk7XG5cbiAgICAgIGlmIChtYXgucm93c1swXS5tYXggIT09IG51bGwpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKCdhbHRlciB0aGUgc2VxdWVuY2UnKTtcbiAgICAgICAgYXdhaXQgcGdDbGllbnQucXVlcnkoXG4gICAgICAgICAgYGFsdGVyIHNlcXVlbmNlICR7c2VxLnNjaGVtYX0uXCIke3NlcS5uYW1lfVwiIHJlc3RhcnQgd2l0aCAke21heC5yb3dzWzBdLm1heCArIDF9O2AsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcGdDbGllbnQucXVlcnkoJ0NPTU1JVCcpO1xuICAgIGNvbnNvbGUubG9nKCdzdWNjZXNzJyk7XG5cbiAgfSBjYXRjaCAoZSkge1xuICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KCdST0xMQkFDSycpO1xuICAgIGNvbnNvbGUubG9nKCdlcnJvcicpO1xuXG4gICAgdGhyb3cgZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBwZ0NsaWVudC5lbmQoKTtcbiAgICBhd2FpdCBwZ1RtcENsaWVudC5lbmQoKTtcbiAgICBjb25zb2xlLmxvZygnZW5kIG9mIHRoZSBxdWVyeScpO1xuICB9XG59XG5cbiJdfQ==
|
|
288
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHktc25hcHNob3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL3NhdmUvYXBwbHktc25hcHNob3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFlQSw0Q0E2U0M7QUE1VEQseUJBQXlCO0FBQ3pCLG1DQUE4RDtBQUM5RCwrQkFBaUM7QUFDakMseUJBQXlCO0FBQ3pCLHFEQUFtRDtBQUNuRCwrQkFBNEI7QUFFNUIsbUNBQThDO0FBQzlDLHVDQUEwQztBQUMxQyx5Q0FBc0M7QUFFdEMsTUFBTSxPQUFPLEdBQUcsSUFBQSxnQkFBUyxFQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN0QyxNQUFNLFFBQVEsR0FBRyxJQUFBLGdCQUFTLEVBQUMsaUJBQWMsQ0FBQyxDQUFDO0FBR3BDLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxRQUFrQjtJQUN2RCxJQUFJLFFBQW1CLENBQUM7SUFDeEIsTUFBTSxlQUFlLEdBQW9CO1FBQ3ZDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtRQUNuQixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7UUFDbkIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1FBQ25CLFFBQVEsRUFBRSxRQUFRLENBQUMsR0FBRztRQUN0QixRQUFRLEVBQUUsVUFBVTtRQUNwQixHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDaEUsQ0FBQztJQUNBLFFBQVE7SUFDUiwwQkFBMEI7SUFDMUIsZ0NBQWdDO0lBQ2hDLDBCQUEwQjtJQUM1QixRQUFRLEdBQUcsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzFDLGVBQU0sQ0FBQyxJQUFJLENBQUMsbUNBQW1DLFFBQVEsQ0FBQyxRQUFRLFVBQVUs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RyxDQUFDLEdBQUcsQ0FDbEYsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9CLGVBQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUV2QyxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLGVBQU0sQ0FBQyxLQUFLLENBQUMsaUVBQWlFLENBQUMsQ0FBQztRQUNoRixNQUFNLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFakMsTUFBTSxDQUFDLENBQUM7SUFDVixDQUFDO1lBQVMsQ0FBQztRQUNULE1BQU0sUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFDRCxrSUFBa0k7SUFDbEksOEhBQThIO0lBQzlILGVBQU0sQ0FBQyxJQUFJLENBQUMsa0xBQWtMLENBQUMsQ0FBQztBQUNsTSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgcGlwZWxpbmUgYXMgc3RyZWFtUGlwZWxpbmUsIFdyaXRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0ICogYXMgcGcgZnJvbSAncGcnO1xuaW1wb3J0IHsgZnJvbSBhcyBjb3B5RnJvbSB9IGZyb20gJ3BnLWNvcHktc3RyZWFtcyc7XG5pbXBvcnQgeyBDbGkgfSBmcm9tICcuL2NsaSc7XG5pbXBvcnQgeyBEYkNvbmZpZyB9IGZyb20gJy4vZW52JztcbmltcG9ydCB7IHJlYWRGaXJzdExpbmVPZkZpbGUgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IGVuc3VyZUF0bGFzIH0gZnJvbSAnLi4vLi4vYXRsYXMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vbG9nZ2VyJztcblxuY29uc3QgcmVhZGRpciA9IHByb21pc2lmeShmcy5yZWFkZGlyKTtcbmNvbnN0IHBpcGVsaW5lID0gcHJvbWlzaWZ5KHN0cmVhbVBpcGVsaW5lKTtcblxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlTUUxTbmFwc2hvdChkYkNvbmZpZzogRGJDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IHBnQ2xpZW50OiBwZy5DbGllbnQ7XG4gIGNvbnN0IGNvbm5lY3Rpb25Qcm9wczogcGcuQ2xpZW50Q29uZmlnID0ge1xuICAgIHVzZXI6IGRiQ29uZmlnLnVzZXIsXG4gICAgaG9zdDogZGJDb25maWcuaG9zdCxcbiAgICBwb3J0OiBkYkNvbmZpZy5wb3J0LFxuICAgIHBhc3N3b3JkOiBkYkNvbmZpZy5wd2QsXG4gICAgZGF0YWJhc2U6ICdwb3N0Z3JlcycsXG4gICAgLi4uKGRiQ29uZmlnLnNzbCA/IHsgc3NsOiB7IHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2UgfSB9IDoge30pLFxuICB9O1xuICAgIC8vU0NIRU1BXG4gICAgLy8xLiB3ZSBjcmVhdGUgYW4gZW1wdHkgZGJcbiAgICAvLzIuIHdlIHBvcHVsYXRlIHdpdGggdGhlIHNjaGVtYVxuICAgIC8vMy4gd2UgY2FsY3VsYXRlIHRoZSBkaWZmXG4gIHBnQ2xpZW50ID0gbmV3IHBnLkNsaWVudChjb25uZWN0aW9uUHJvcHMpO1xuICBsb2dnZXIuaW5mbyhgQ3JlYXRpbmcgdGhlIHRlbXBvcmFyeSBkYXRhYmFzZSAke2RiQ29uZmlnLmRhdGFiYXNlfV90bXBfYmlzYCk7XG4gIGF3YWl0IHBnQ2xpZW50LmNvbm5lY3QoKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShgRFJPUCBEQVRBQkFTRSBJRiBFWElTVFMgJHtkYkNvbmZpZy5kYXRhYmFzZX1fdG1wX2Jpc2ApO1xuICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KGBDUkVBVEUgREFUQUJBU0UgJHtkYkNvbmZpZy5kYXRhYmFzZX1fdG1wX2JpcztgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBwZ0NsaWVudC5lbmQoKTtcbiAgfVxuICBjb25uZWN0aW9uUHJvcHMuZGF0YWJhc2UgPSBgJHtkYkNvbmZpZy5kYXRhYmFzZX1fdG1wX2Jpc2A7XG4gIHBnQ2xpZW50ID0gbmV3IHBnLkNsaWVudChjb25uZWN0aW9uUHJvcHMpO1xuXG4gIGNvbnN0IGVuZERiQ2xpZW50ID0gbmV3IHBnLkNsaWVudCh7XG4gICAgLi4uY29ubmVjdGlvblByb3BzLFxuICAgIGRhdGFiYXNlOiBkYkNvbmZpZy5kYXRhYmFzZSxcbiAgfSk7XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoW3BnQ2xpZW50LmNvbm5lY3QoKSwgZW5kRGJDbGllbnQuY29ubmVjdCgpXSk7XG5cbiAgbGV0IHNxbE1pZ3JhdGlvbiA9ICcnO1xuICB0cnkge1xuICAgIGxvZ2dlci5pbmZvKCdMb2FkaW5nIHRoZSB0YXJnZXQgc2NoZW1hIGludG8gdGhlIHRlbXBvcmFyeSBkYXRhYmFzZScpO1xuICAgIC8vd2UgbWFudWFsbHkgaW5zdGFsbCBwb3N0Z2lzIGFuZCBzb21lIGV4dGVuc2lvbnMuIFdlIHNob3VsZCBkbyBhIGR1bXAgb2Ygc3FsIGV4dGVuc2lvbnMgYnV0IHdlIGFyZSB3YWl0aW5nIGZvciBhdGxhc2dvIHRvIHN1cHBvcnQgdGhpcyAodGltZSBvZiB3cml0aW5nIDogMTkvMDMgLSBhdGxhc2dvIHJlbGVhc2VkIGV4dGVuc2lvbnMgc3VwcG9ydCBidXQgbm90IGluIHRoZSBjb21tdW5pdHkgdmVyc2lvbilcbiAgICBsZXQgZXh0ZW5zaW9uUXVlcnkgPSBgXG4gICAgICAgICAgICBjcmVhdGUgZXh0ZW5zaW9uIGlmIG5vdCBleGlzdHMgcG9zdGdpcztcbiAgICAgICAgICAgIGNyZWF0ZSBleHRlbnNpb24gaWYgbm90IGV4aXN0cyBmdXp6eXN0cm1hdGNoO1xuICAgICAgICAgICAgY3JlYXRlIGV4dGVuc2lvbiBpZiBub3QgZXhpc3RzIHBvc3RnaXNfdGlnZXJfZ2VvY29kZXIgO1xuICAgICAgICAgICAgY3JlYXRlIGV4dGVuc2lvbiBpZiBub3QgZXhpc3RzIHBvc3RnaXNfcmFzdGVyIDtcbiAgICAgICAgICAgIGNyZWF0ZSBleHRlbnNpb24gaWYgbm90IGV4aXN0cyBwb3N0Z2lzX3RvcG9sb2d5IDtcbiAgICAgICAgICAgIGNyZWF0ZSBleHRlbnNpb24gaWYgbm90IGV4aXN0cyBhZGRyZXNzX3N0YW5kYXJkaXplciA7XG4gICAgICAgIGA7XG4gICAgLy90aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGUgZHVtcCBpbiBhdGxhcyA6IHNjaGVtYSBhcmUgY3JlYXRlZCB3aXRoIENSRUFURSBhbmQgbm90IGNyZWF0ZSBpZiBub3QgZXhpdHMuLi5cbiAgICAvL3NvIHdlIGluc2VydCBleHRlbnNpb24gY3JlYXRpb24gYWZ0ZXIgc2NoZW1hIGNyZWF0aW9uIGluIG9yZGVyIHRvIGF2b2lkIGdldHRpbmcgXCJzY2hlbWEgYWxyZWFkeSBleGlzdHNcIlxuICAgIGNvbnN0IHNxbFNjaGVtYSA9IGZzLnJlYWRGaWxlU3luYygnLi9zcWwvc2NoZW1hLnNxbCcpLnRvU3RyaW5nKCk7XG4gICAgY29uc3Qgc3FsU2NoZW1hV2l0aEV4dGVuc2lvbiA9IHNxbFNjaGVtYVxuICAgICAgLnJlcGxhY2UoXG4gICAgICAgICdDUkVBVEUgVEFCTEUnLFxuICAgICAgICBgJHtleHRlbnNpb25RdWVyeX1cbiAgICAgICAgICAgIENSRUFURSBUQUJMRWAsXG4gICAgICApIC8vb25seSBmaXJzdCBvY2N1cnJlbmNlIHdpbGwgYmUgcmVwbGFjZWRcbiAgICAgIC5yZXBsYWNlKC9DUkVBVEUgU0NIRU1BIElGIE5PVCBFWElTVFMvZywgJ0NSRUFURSBTQ0hFTUEnKVxuICAgICAgLnJlcGxhY2UoL0NSRUFURSBTQ0hFTUEvZywgJ0NSRUFURSBTQ0hFTUEgSUYgTk9UIEVYSVNUUycpOyAvL2Vuc3VyZSBhbGwgY3JlYXRlIHNjaGVtYSB1c2UgXCJpZiBub3QgZXhpc3RzXCJcbiAgICAvL2lmIHRhcmdldCBkYXRhYmFzZSBkb2VzIG5vdCBjb250YWluIGFueSBkOSB0YWJsZXMgd2UganVzdCBuZWVkIHRvIHBvcHVsYXRlIHRoZSBiYXNlIHNjaGVtYS5cbiAgICBjb25zdCBjb3VudFRhYmxlc1JlcSA9IGBcbiAgICAgICAgICAgIFNFTEVDVCBDT1VOVCgqKSBcbiAgICAgICAgICAgIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBcbiAgICAgICAgICAgIFdIRVJFIHRhYmxlX3NjaGVtYSA9ICdwdWJsaWMnIEFORCB0YWJsZV9uYW1lIExJS0UgJ2RpcmVjdHVzXyUnO1xuICAgICAgICBgO1xuICAgIGNvbnN0IGNvdW50VGFibGVzID0gYXdhaXQgZW5kRGJDbGllbnQucXVlcnkoY291bnRUYWJsZXNSZXEpO1xuICAgIGlmIChOdW1iZXIoY291bnRUYWJsZXMucm93c1swXS5jb3VudCkgPT09IDApIHtcbiAgICAgIC8vd2UgZHJvcCB0aGUgZXh0ZW5zaW9uIGFuZCByZWFwcGx5IHRoZSBzY2hlbWEgd2l0aCBkOVxuICAgICAgbG9nZ2VyLmluZm8oJ1RhcmdldCBkYXRhYmFzZSBoYXMgbm8gZDkgdGFibGVzOiBjcmVhdGluZyB0aGUgc2NoZW1hIGRpcmVjdGx5Jyk7XG4gICAgICAvL25vdGUgdGhhdCBmaW5hbGx5IGJsb2NrIHdpbGwgYmUgZXhlY3V0ZWQsIGV2ZW4gaWYgd2UgcmV0dXJuXG4gICAgICBhd2FpdCBlbmREYkNsaWVudC5xdWVyeShzcWxTY2hlbWFXaXRoRXh0ZW5zaW9uKTtcbiAgICB9XG5cbiAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShzcWxTY2hlbWFXaXRoRXh0ZW5zaW9uKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBwZ0NsaWVudC5lbmQoKTtcbiAgICBhd2FpdCBlbmREYkNsaWVudC5lbmQoKTtcbiAgfVxuXG4gIC8vd2UgY2FsY3VsYXRlIHRoZSBkaWZmXG4gIGNvbnN0IG1pZ3JhdGlvblN0cmVhbSA9IG5ldyBXcml0YWJsZSh7XG4gICAgd3JpdGU6IChjaHVuaywgX2VuY29kaW5nLCBuZXh0KSA9PiB7XG4gICAgICBzcWxNaWdyYXRpb24gKz0gY2h1bmsudG9TdHJpbmcoKTtcbiAgICAgIG5leHQoKTtcbiAgICB9LFxuICB9KTtcbiAgbG9nZ2VyLmluZm8oJ0NvbXB1dGluZyB0aGUgc2NoZW1hIGRpZmYgd2l0aCBhdGxhcycpO1xuICBjb25zdCBjbGkgPSBuZXcgQ2xpKCk7XG4gIGF3YWl0IGNsaS5jb21tYW5kKFxuICAgIGF3YWl0IGVuc3VyZUF0bGFzKCksXG4gICAgW1xuICAgICAgJ3NjaGVtYScsXG4gICAgICAnZGlmZicsXG4gICAgICAnLS1mcm9tJyxcbiAgICAgIGBwb3N0Z3JlczovLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGRiQ29uZmlnLnVzZXIpfToke2VuY29kZVVSSUNvbXBvbmVudChkYkNvbmZpZy5wd2QpfUAke2RiQ29uZmlnLmhvc3R9OiR7ZGJDb25maWcucG9ydH0vJHtkYkNvbmZpZy5kYXRhYmFzZX0/c3NsbW9kZT0ke2RiQ29uZmlnLnNzbCA/ICdyZXF1aXJlJyA6ICdkaXNhYmxlJ31gLFxuICAgICAgJy0tdG8nLFxuICAgICAgYHBvc3RncmVzOi8vJHtlbmNvZGVVUklDb21wb25lbnQoZGJDb25maWcudXNlcil9OiR7ZW5jb2RlVVJJQ29tcG9uZW50KGRiQ29uZmlnLnB3ZCl9QCR7ZGJDb25maWcuaG9zdH06JHtkYkNvbmZpZy5wb3J0fS8ke2RiQ29uZmlnLmRhdGFiYXNlfV90bXBfYmlzP3NzbG1vZGU9JHtkYkNvbmZpZy5zc2wgPyAncmVxdWlyZScgOiAnZGlzYWJsZSd9YCxcbiAgICBdLFxuICAgIHtcbiAgICAgIGVudjoge1xuICAgICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgICAgQVRMQVNfTk9fVVBEQVRFX05PVElGSUVSOiAndHJ1ZScsIC8vaWYgbm90IHNldCwgYXRsYXMgZW5kIGEgZmluYWwgbGluZSB3aXRoIFwiYSBuZXcgdmVyc2lvbiBvZiBhdGxhcyBpcyBhdmFpbGFibGVcIlxuICAgICAgfSxcbiAgICAgIHN0ZG91dDogbWlncmF0aW9uU3RyZWFtLFxuICAgIH0sXG4gICk7XG4gIGlmIChzcWxNaWdyYXRpb24uaW5jbHVkZXMoJ25vIGNoYW5nZXMgdG8gYmUgbWFkZScpKSB7XG4gICAgc3FsTWlncmF0aW9uID0gJyc7XG4gIH1cbiAgaWYgKHNxbE1pZ3JhdGlvbi50cmltKCkpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRzID0gc3FsTWlncmF0aW9uLnNwbGl0KCdcXG4nKS5maWx0ZXIoKGxpbmUpID0+IGxpbmUudHJpbSgpLmVuZHNXaXRoKCc7JykpLmxlbmd0aDtcbiAgICBsb2dnZXIuaW5mbyhgU2NoZW1hIG1pZ3JhdGlvbjogJHtzdGF0ZW1lbnRzfSBzdGF0ZW1lbnRzYCk7XG4gICAgbG9nZ2VyLmRlYnVnKHNxbE1pZ3JhdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmluZm8oJ1NjaGVtYSBpcyB1cCB0byBkYXRlJyk7XG4gIH1cbiAgLy93ZSBhcHBseSB0aGUgZGlmZnMgaW4gc2NoZW1hIGFuZCBkYXRhIGluIG9uZSB0cmFuc2FjdGlvblxuICBjb25zdCBwZ1RtcENsaWVudCA9IG5ldyBwZy5DbGllbnQoY29ubmVjdGlvblByb3BzKTtcbiAgY29ubmVjdGlvblByb3BzLmRhdGFiYXNlID0gZGJDb25maWcuZGF0YWJhc2U7XG4gIHBnQ2xpZW50ID0gbmV3IHBnLkNsaWVudChjb25uZWN0aW9uUHJvcHMpO1xuICBhd2FpdCBQcm9taXNlLmFsbChbcGdDbGllbnQuY29ubmVjdCgpLCBwZ1RtcENsaWVudC5jb25uZWN0KCldKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeSgnQkVHSU4nKTtcbiAgICBsb2dnZXIuaW5mbygnQXBwbHlpbmcgdGhlIHNjaGVtYSBtaWdyYXRpb24nKTtcbiAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShzcWxNaWdyYXRpb24pO1xuICAgIC8vc3RyYXRlZ3kgdG8gYXBwbHkgZGF0YSA6XG4gICAgLy8tIHJlbW92ZSB0aGUgY29uc3RyYWludFxuICAgIC8vLSB1cHNlcnQgdGhlIGRhdGFcbiAgICAvLy0gYXBwbHkgdGhlIGNvbnN0cmFpbnRcblxuICAgIC8vYWx3YXlzIGJlIHN1cmUgdGhlIGNpIHVzZXIgZXhpc3RzXG4gICAgYXdhaXQgcGdDbGllbnQucXVlcnkoYFxuICAgICAgICAgICAgSU5TRVJUIElOVE8gcHVibGljLmRpcmVjdHVzX3VzZXJzIChpZCwgZmlyc3RfbmFtZSwgbGFzdF9uYW1lLCBlbWFpbClcbiAgICAgICAgICAgIFZBTFVFUyAoJzQ5YmNkZTVkLTkwYWEtNGJlOC1hYjEwLWY5YWUxYTA3NTQ2ZicsICdDSScsICdEOS1wbHVtYmluZycsICdkOUB3ZWJjYXBzdWxlLmlvJylcbiAgICAgICAgICAgIE9OIENPTkZMSUNUIERPIE5PVEhJTkdcbiAgICAgICAgYCk7XG5cbiAgICAvL2ZvciBjb25zdHJhaW50cyBzZWUgdGhpcyA6XG4gICAgLy9odHRwczovL2NvbmZsdWVuY2UuYXRsYXNzaWFuLmNvbS9rYi9ob3ctdG8tZHJvcC1hbmQtcmVjcmVhdGUtdGhlLWRhdGFiYXNlLWNvbnN0cmFpbnRzLW9uLXBvc3RncmVzcWwtNzc2ODEyNDUwLmh0bWxcbiAgICAvL3dlIGdldCBhbGwgdGhlIGNvbnN0cmFpbnRzIGV4Y2VwdCB0aGUgcHJpbWFyeSBrZXlzXG4gICAgY29uc3QgY29uc3RyYWludHMgPSBhd2FpdCBwZ0NsaWVudC5xdWVyeShgXG4gICAgICAgICAgICBTRUxFQ1QgbnNwbmFtZSwgcmVsbmFtZSwgY29ubmFtZSwgcGdfZ2V0X2NvbnN0cmFpbnRkZWYocGdfY29uc3RyYWludC5vaWQpXG4gICAgICAgICAgICBGUk9NIHBnX2NvbnN0cmFpbnRcbiAgICAgICAgICAgIElOTkVSIEpPSU4gcGdfY2xhc3MgT04gY29ucmVsaWQ9cGdfY2xhc3Mub2lkXG4gICAgICAgICAgICBJTk5FUiBKT0lOIHBnX25hbWVzcGFjZSBPTiBwZ19uYW1lc3BhY2Uub2lkPXBnX2NsYXNzLnJlbG5hbWVzcGFjZVxuICAgICAgICAgICAgV0hFUkUgTk9UIG5zcG5hbWUgPSAncGdfY2F0YWxvZycgQU5EIE5PVCBjb250eXBlID0gJ3AnXG4gICAgICAgICAgICBPUkRFUiBCWSBDQVNFIFdIRU4gY29udHlwZT0nZicgVEhFTiAwIEVMU0UgMSBFTkQgREVTQyxjb250eXBlIERFU0MsbnNwbmFtZSBERVNDLHJlbG5hbWUgREVTQyxjb25uYW1lIERFU0NcbiAgICAgICAgYCk7XG5cbiAgICAvL3JlbW92ZSB0aGUgY29uc3RyYWludHNcbiAgICBsb2dnZXIuaW5mbyhgRHJvcHBpbmcgJHtjb25zdHJhaW50cy5yb3dzLmxlbmd0aH0gY29uc3RyYWludHNgKTtcbiAgICAvL3RoZSBxdWVyeSBhYm92ZSBpcyBib3RoIGZvciBhZGRpbmcgb3IgZHJvcHBpbmcgb3JkZXIuIEZvciBkcm9wcGluZywgd2UgbmVlZCB0byByZXZlcnNlIHRoZSBvcmRlclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uc3RyYWludHMucm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY29uc3RyYWludCA9IGNvbnN0cmFpbnRzLnJvd3NbY29uc3RyYWludHMucm93cy5sZW5ndGggLSAxIC0gaV07XG4gICAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShgXG4gICAgICAgICAgICAgICAgQUxURVIgVEFCTEUgJHtjb25zdHJhaW50Lm5zcG5hbWV9LlwiJHtjb25zdHJhaW50LnJlbG5hbWV9XCIgRFJPUCBDT05TVFJBSU5UIFwiJHtjb25zdHJhaW50LmNvbm5hbWV9XCJcbiAgICAgICAgICAgIGApO1xuICAgIH1cblxuICAgIC8vcmVwbGFjZSBkYXRhXG4gICAgY29uc3QgY3N2RmlsZXMgPSBhd2FpdCByZWFkZGlyKCcuL3NxbC9kYXRhJyk7XG4gICAgbG9nZ2VyLmluZm8oYEltcG9ydGluZyAke2NzdkZpbGVzLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5lbmRzV2l0aCgnLmNzdicpKS5sZW5ndGh9IENTViBmaWxlcyBmcm9tIC4vc3FsL2RhdGFgKTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgY3N2RmlsZXMpIHtcbiAgICAgIGlmIChmaWxlLmVuZHNXaXRoKCcuY3N2JykpIHtcbiAgICAgICAgY29uc3Qgbm9uUGFyc2VkVGFibGVOYW1lID0gZmlsZS5zbGljZSgwLCAtNCk7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVGFibGVOYW1lID0gcGcuZXNjYXBlSWRlbnRpZmllcihub25QYXJzZWRUYWJsZU5hbWUpO1xuICAgICAgICBsZXQgY29weVRhYmxlTmFtZSA9IG9yaWdpbmFsVGFibGVOYW1lO1xuICAgICAgICBsZXQgZXhpc3RpbmdSb3dzQ2FuQ2F1c2VDb25mbGljdCA9IGZhbHNlO1xuICAgICAgICBpZiAoWydkaXJlY3R1c19maWxlcycsICdkaXJlY3R1c19mb2xkZXJzJ10uaW5jbHVkZXMobm9uUGFyc2VkVGFibGVOYW1lKSkge1xuICAgICAgICAgIC8vZGVsZXRlIGFsbCBmaWxlcyBhbmQgZm9sZGVycyB0aGF0IGFyZSBpbnNpZGUgdGhlIFwiZDktcGx1bWJpbmctY29tbW9uXCIgZm9sZGVyXG4gICAgICAgICAgY29uc3QgY29tbW9uRm9sZGVyTmFtZSA9IHBnLmVzY2FwZUxpdGVyYWwoZGJDb25maWcuY29tbW9uRm9sZGVyTmFtZSk7XG4gICAgICAgICAgY29uc3QgZm9sZGVyS2V5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgZGlyZWN0dXNfZmlsZXM6ICdmb2xkZXInLFxuICAgICAgICAgICAgZGlyZWN0dXNfZm9sZGVyczogJ3BhcmVudCcsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShgIFxuICAgICAgICAgICAgICAgICAgICAgICAgV0lUSCBSRUNVUlNJVkUgZm9sZGVyX3RyZWUgQVMgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gQW5jaG9yOiB0aGUgXCJkOS1wbHVtYmluZy1jb21tb25cIiBmb2xkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NIGRpcmVjdHVzX2ZvbGRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSBuYW1lID0gJHtjb21tb25Gb2xkZXJOYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5JT05cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBSZWN1cnNpdmUgc3RlcDogZmluZCBzdWJmb2xkZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUIGYuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NIGRpcmVjdHVzX2ZvbGRlcnMgZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpPSU4gZm9sZGVyX3RyZWUgZnQgT04gZi5wYXJlbnQgPSBmdC5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgREVMRVRFIEZST00gcHVibGljLiR7Y29weVRhYmxlTmFtZX0gQVMgdFxuICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgdC4ke2ZvbGRlcktleVtub25QYXJzZWRUYWJsZU5hbWVdfSBJTiAoU0VMRUNUIGlkIEZST00gZm9sZGVyX3RyZWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYCk7XG4gICAgICAgICAgaWYgKG5vblBhcnNlZFRhYmxlTmFtZSA9PT0gJ2RpcmVjdHVzX2ZvbGRlcnMnKSB7XG4gICAgICAgICAgICBleGlzdGluZ1Jvd3NDYW5DYXVzZUNvbmZsaWN0ID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgcGdDbGllbnQucXVlcnkoYERFTEVURSBGUk9NIHB1YmxpYy4ke2NvcHlUYWJsZU5hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4aXN0aW5nUm93c0NhbkNhdXNlQ29uZmxpY3QpIHtcbiAgICAgICAgICAvL3dlIHdpbGwgaW1wb3J0IGRhdGEgaW4gYSB0ZW1wb3JhcnkgdGFibGUsIHRoZW4gZG8gdGhlIGluc2VydFxuICAgICAgICAgIGNvcHlUYWJsZU5hbWUgPSBwZy5lc2NhcGVJZGVudGlmaWVyKGAke25vblBhcnNlZFRhYmxlTmFtZX1fd2JjZV90bXBgKTtcbiAgICAgICAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShcbiAgICAgICAgICAgIGBDUkVBVEUgVEVNUCBUQUJMRSAke2NvcHlUYWJsZU5hbWV9IE9OIENPTU1JVCBEUk9QIEFTIFNFTEVDVCAqIEZST00gcHVibGljLiR7b3JpZ2luYWxUYWJsZU5hbWV9IFdJVEggTk8gREFUQWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvL3JlYWQgZmlyc3QgbGluZVxuICAgICAgICBsZXQgZmlyc3RMaW5lID0gYXdhaXQgcmVhZEZpcnN0TGluZU9mRmlsZShgLi9zcWwvZGF0YS8ke2ZpbGV9YCk7XG4gICAgICAgIGZpcnN0TGluZSA9IGZpcnN0TGluZVxuICAgICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgICAgLm1hcCgoYykgPT4gYFwiJHtjfVwiYClcbiAgICAgICAgICAuam9pbignLCcpO1xuICAgICAgICBjb25zdCBpbmdlc3RTdHJlYW0gPSBwZ0NsaWVudC5xdWVyeShcbiAgICAgICAgICBjb3B5RnJvbShcbiAgICAgICAgICAgIGBDT1BZICR7Y29weVRhYmxlTmFtZX0gKCR7Zmlyc3RMaW5lfSkgIEZST00gU1RESU4gIERFTElNSVRFUiAnLCcgQ1NWIEhFQURFUmAsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc291cmNlU3RyZWFtID0gZnMuY3JlYXRlUmVhZFN0cmVhbShgLi9zcWwvZGF0YS8ke2ZpbGV9YCk7XG4gICAgICAgIGluZ2VzdFN0cmVhbS5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBpbmdlc3RlZCAke2ZpbGV9YCk7XG4gICAgICAgIH0pO1xuICAgICAgICBsb2dnZXIuZGVidWcoYGluZ2VzdGluZyAke2ZpbGV9YCk7XG5cbiAgICAgICAgYXdhaXQgcGlwZWxpbmUoc291cmNlU3RyZWFtLCBpbmdlc3RTdHJlYW0pO1xuICAgICAgICBpZiAoZXhpc3RpbmdSb3dzQ2FuQ2F1c2VDb25mbGljdCkge1xuICAgICAgICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KGBcblx0XHRcdFx0XHRcdFx0REVMRVRFIEZST00gcHVibGljLiR7b3JpZ2luYWxUYWJsZU5hbWV9XG5cdFx0XHRcdFx0XHRcdFdIRVJFIGlkIElOIChTRUxFQ1QgaWQgRlJPTSAke2NvcHlUYWJsZU5hbWV9KTtcblx0XHRcdFx0XHRcdGApO1xuICAgICAgICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KGBcblx0XHRcdFx0XHRcdFx0SU5TRVJUIElOVE8gcHVibGljLiR7b3JpZ2luYWxUYWJsZU5hbWV9XG5cdFx0XHRcdFx0XHRcdFNFTEVDVCAqIEZST00gJHtjb3B5VGFibGVOYW1lfTtcblx0XHRcdFx0XHRcdGApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9yZWVzdGFibGlzaCB0aGUgY29uc3RyYWludHNcbiAgICBsb2dnZXIuaW5mbyhgUmVzdG9yaW5nICR7Y29uc3RyYWludHMucm93cy5sZW5ndGh9IGNvbnN0cmFpbnRzYCk7XG4gICAgZm9yIChjb25zdCBjb25zdHJhaW50IG9mIGNvbnN0cmFpbnRzLnJvd3MpIHtcbiAgICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KGBcbiAgICAgICAgICAgICAgICBBTFRFUiBUQUJMRSAke2NvbnN0cmFpbnQubnNwbmFtZX0uXCIke2NvbnN0cmFpbnQucmVsbmFtZX1cIiBBREQgQ09OU1RSQUlOVCBcIiR7Y29uc3RyYWludC5jb25uYW1lfVwiICAke2NvbnN0cmFpbnQucGdfZ2V0X2NvbnN0cmFpbnRkZWZ9XG4gICAgICAgICAgICBgKTtcbiAgICB9XG5cbiAgICAvL3VwZGF0ZSB0aGUgc2VxdWVuY2VzXG4gICAgLy93aGVuIGFkZGluZyB3aXRoIENPUFksIGFsbCBzZXF1ZW5jZXMgYXJlIG5vdCB1cCB0byBkYXRlXG4gICAgLy93ZSBuZWVkIHRvIGZpbmQgYWxsIHNlcXVlbmNlcyBhbmQgdGhlbiB0byBmaW5kIHRoZSBtYXggb24gdGhlIG1hbmFnZWQgY29sdW1uIGFuZCB0aGVuIHRvIHVwZGF0ZSB0aGUgc2VxdWVuY2VcblxuICAgIGNvbnN0IHNlcXVlbmNlcyA9IGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KGBcbiAgICAgICAgICAgIFNFTEVDVCBuLm5zcG5hbWUgYXMgXCJzY2hlbWFcIixcbiAgICAgICAgICAgICAgICBjLnJlbG5hbWUgYXMgXCJuYW1lXCIsXG4gICAgICAgICAgICAgICAgQ0FTRSBjLnJlbGtpbmQgV0hFTiAncicgVEhFTiAndGFibGUnIFdIRU4gJ3YnIFRIRU4gJ3ZpZXcnIFdIRU4gJ20nIFRIRU4gJ21hdGVyaWFsaXplZCB2aWV3JyBXSEVOICdpJyBUSEVOICdpbmRleCcgV0hFTiAnUycgVEhFTiAnc2VxdWVuY2UnIFdIRU4gJ3MnIFRIRU4gJ3NwZWNpYWwnIFdIRU4gJ3QnIFRIRU4gJ1RPQVNUIHRhYmxlJyBXSEVOICdmJyBUSEVOICdmb3JlaWduIHRhYmxlJyBXSEVOICdwJyBUSEVOICdwYXJ0aXRpb25lZCB0YWJsZScgV0hFTiAnSScgVEhFTiAncGFydGl0aW9uZWQgaW5kZXgnIEVORCBhcyBcIlR5cGVcIixcbiAgICAgICAgICAgICAgICBwZ19jYXRhbG9nLnBnX2dldF91c2VyYnlpZChjLnJlbG93bmVyKSBhcyBcIk93bmVyXCJcbiAgICAgICAgICAgIEZST00gcGdfY2F0YWxvZy5wZ19jbGFzcyBjXG4gICAgICAgICAgICAgICAgTEVGVCBKT0lOIHBnX2NhdGFsb2cucGdfbmFtZXNwYWNlIG4gT04gbi5vaWQgPSBjLnJlbG5hbWVzcGFjZVxuICAgICAgICAgICAgV0hFUkUgYy5yZWxraW5kIElOICgnUycsJycpXG4gICAgICAgICAgICAgICAgQU5EIG4ubnNwbmFtZSA8PiAncGdfY2F0YWxvZydcbiAgICAgICAgICAgICAgICBBTkQgbi5uc3BuYW1lICF+ICdecGdfdG9hc3QnXG4gICAgICAgICAgICAgICAgQU5EIG4ubnNwbmFtZSA8PiAnaW5mb3JtYXRpb25fc2NoZW1hJ1xuICAgICAgICAgICAgQU5EIHBnX2NhdGFsb2cucGdfdGFibGVfaXNfdmlzaWJsZShjLm9pZClcbiAgICAgICAgICAgIE9SREVSIEJZIDEsMjtcbiAgICAgICAgYCk7XG5cbiAgICBsb2dnZXIuaW5mbyhgUmVzZXR0aW5nICR7c2VxdWVuY2VzLnJvd3MubGVuZ3RofSBzZXF1ZW5jZXNgKTtcbiAgICBmb3IgKGNvbnN0IHNlcSBvZiBzZXF1ZW5jZXMucm93cykge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBmaW5kIGNvbHVtbiBtYW5hZ2VkIGJ5ICR7c2VxLm5hbWV9YCk7XG4gICAgICBjb25zdCByZWxhdGlvbiA9IGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KGBcbiAgICAgICAgICAgICAgICBTRUxFQ1QgZC5yZWZvYmppZDo6cmVnY2xhc3MgYXMgXCJ0YWJsZVwiLCBhLmF0dG5hbWUgYXMgXCJmaWVsZFwiXG4gICAgICAgICAgICAgICAgRlJPTSAgIHBnX2RlcGVuZCAgICBkXG4gICAgICAgICAgICAgICAgSk9JTiAgIHBnX2F0dHJpYnV0ZSBhIE9OIGEuYXR0cmVsaWQgPSBkLnJlZm9iamlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTkQgYS5hdHRudW0gICA9IGQucmVmb2Jqc3ViaWRcbiAgICAgICAgICAgICAgICBXSEVSRSAgZC5vYmppZCA9ICcke3NlcS5zY2hlbWF9LlwiJHtzZXEubmFtZX1cIic6OnJlZ2NsYXNzXG4gICAgICAgICAgICAgICAgQU5EICAgIGQucmVmb2Jqc3ViaWQgPiAwXG4gICAgICAgICAgICAgICAgQU5EICAgIGQuY2xhc3NpZCA9ICdwZ19jbGFzcyc6OnJlZ2NsYXNzO1xuICAgICAgICAgICAgYCk7XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIGBmaW5kIG1heCBvZiAke3JlbGF0aW9uLnJvd3NbMF0udGFibGV9ICR7cmVsYXRpb24ucm93c1swXS5maWVsZH1gLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG1heCA9IGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KGBcbiAgICAgICAgICAgICAgICBTRUxFQ1QgTUFYKCR7cmVsYXRpb24ucm93c1swXS5maWVsZH0pXG4gICAgICAgICAgICAgICAgRlJPTSAke3JlbGF0aW9uLnJvd3NbMF0udGFibGV9XG4gICAgICAgICAgICBgKTtcblxuICAgICAgaWYgKG1heC5yb3dzWzBdLm1heCAhPT0gbnVsbCkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYHJlc3RhcnQgJHtzZXEubmFtZX0gYXQgJHttYXgucm93c1swXS5tYXggKyAxfWApO1xuICAgICAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShcbiAgICAgICAgICBgYWx0ZXIgc2VxdWVuY2UgJHtzZXEuc2NoZW1hfS5cIiR7c2VxLm5hbWV9XCIgcmVzdGFydCB3aXRoICR7bWF4LnJvd3NbMF0ubWF4ICsgMX07YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeSgnQ09NTUlUJyk7XG4gICAgbG9nZ2VyLmluZm8oJ1RyYW5zYWN0aW9uIGNvbW1pdHRlZCcpO1xuXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIHdoaWxlIGFwcGx5aW5nIHRoZSBzbmFwc2hvdCwgcm9sbGluZyBiYWNrIHRoZSB0cmFuc2FjdGlvbicpO1xuICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KCdST0xMQkFDSycpO1xuXG4gICAgdGhyb3cgZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBwZ0NsaWVudC5lbmQoKTtcbiAgICBhd2FpdCBwZ1RtcENsaWVudC5lbmQoKTtcbiAgfVxuICAvL3NjaGVtYSAoY29sbGVjdGlvbnMsIGZpZWxkcywgcmVsYXRpb25zKSBpcyBhbHdheXMgY2FjaGVkIChDQUNIRV9TQ0hFTUEpLCBwZXJtaXNzaW9ucyBvbmx5IHdoZW4gQ0FDSEVfRU5BQkxFRDogYSBwdXJnZSBpcyBlbm91Z2guXG4gIC8vZmxvd3MsIG9wZXJhdGlvbnMgYW5kIHdlYmhvb2tzIGFyZSBsb2FkZWQgaW4gbWVtb3J5IGF0IHN0YXJ0dXAgYW5kIG9ubHkgcmVsb2FkZWQgYnkgdGhlaXIgb3duIHNlcnZpY2VzOiBhIHJlc3RhcnQgaXMgbmVlZGVkLlxuICBsb2dnZXIud2FybignUHVyZ2UgdGhlIGQ5IGNhY2hlIChQT1NUIC91dGlscy9jYWNoZS9jbGVhcikgdG8gdGFrZSB0aGUgbmV3IHNjaGVtYSAoYW5kIHBlcm1pc3Npb25zLCBpZiBDQUNIRV9FTkFCTEVEKSBpbnRvIGFjY291bnQuIElmIGZsb3dzLCBvcGVyYXRpb25zIG9yIHdlYmhvb2tzIGNoYW5nZWQsIGFsc28gcmVzdGFydCBkOS4nKTtcbn1cblxuIl19
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { DbConfig } from './env';
|
|
2
|
+
/**
|
|
3
|
+
* Dumps the destination into a worktree checked out at `lastSave`, and fails if the dump differs from that commit.
|
|
4
|
+
*/
|
|
5
|
+
export declare function checkUnsaved(opts: {
|
|
6
|
+
lastSave?: string | false;
|
|
7
|
+
yes: boolean;
|
|
8
|
+
db: DbConfig;
|
|
9
|
+
}): Promise<void>;
|