UNPKG

aws-cdk-neuronx-patterns

Version:
287 lines 36.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const aws_cdk_lib_1 = require("aws-cdk-lib"); const batch = require("aws-cdk-lib/aws-batch"); const aws_secretsmanager_1 = require("aws-cdk-lib/aws-secretsmanager"); const vllm_engine_argments_1 = require("./vllm-engine-argments"); describe("VllmEngineArgumentsToConfig", () => { const app = new aws_cdk_lib_1.App(); const stack = new aws_cdk_lib_1.Stack(app); const secret = aws_secretsmanager_1.Secret.fromSecretNameV2(stack, "DummySecret", "huggingface-token"); it("should convert all camelCase properties to kebab-case", () => { const testObj = { host: "localhost", port: 8080, uvicornLogLevel: vllm_engine_argments_1.UvicornLogLevel.INFO, disableUvicornAccessLog: true, allowCredentials: true, allowedOrigins: ["*"], allowedMethods: ["GET"], allowedHeaders: ["Authorization"], apiKey: "secret", loraModules: { name: "name", path: "lora_path", base_model_name: "id" }, promptAdapters: ["adapter=path"], chatTemplate: "template.json", chatTemplateContentFormat: vllm_engine_argments_1.ChatTemplateContentFormat.AUTO, responseRole: "assistant", sslKeyfile: "key.pem", sslCertfile: "cert.pem", sslCaCerts: "ca.pem", enableSslRefresh: true, sslCertReqs: 1, rootPath: "/api", middleware: ["middleware1"], returnTokensAsTokenIds: true, disableFrontendMultiprocessing: true, enableRequestIdHeaders: true, enableAutoToolChoice: true, toolCallParser: vllm_engine_argments_1.ToolCallParser.GRANITE, toolParserPlugin: "plugin", model: "model-name", task: vllm_engine_argments_1.VllmTask.GENERATE, tokenizer: "tokenizer-name", hfConfigPath: "config.json", skipTokenizerInit: true, revision: "v1.0", codeRevision: "v2.0", tokenizerRevision: "v1.5", tokenizerMode: vllm_engine_argments_1.TokenizerMode.AUTO, trustRemoteCode: true, allowedLocalMediaPath: "/media", configFormat: vllm_engine_argments_1.ConfigFormat.HF, dtype: vllm_engine_argments_1.DataType.FLOAT16, maxModelLen: 2048, logitsProcessorPattern: "pattern", modelImpl: vllm_engine_argments_1.ModelImpl.VLLM, disableSlidingWindow: true, useV2BlockManager: true, seed: 42, maxLogprobs: 10, disableLogStats: true, quantization: vllm_engine_argments_1.Quantization.AWQ, ropeScaling: {}, ropeTheta: 1.0, hfToken: batch.Secret.fromSecretsManager(secret), hfOverrides: {}, enforceEager: true, maxSeqLenToCapture: 4096, mmProcessorKwargs: {}, disableMmPreprocessorCache: true, enableLora: true, enableLoraBias: true, maxLoras: 2, maxLoraRank: 32, loraExtraVocabSize: 512, loraDtype: vllm_engine_argments_1.LoraDtype.FLOAT16, longLoraScalingFactors: 1, maxCpuLoras: 4, fullyShardedLoras: true, enablePromptAdapter: true, maxPromptAdapters: 2, maxPromptAdapterToken: 256, numSchedulerSteps: 2, speculativeConfig: {}, ignorePatterns: ["pattern"], preemptionMode: vllm_engine_argments_1.PreemptionMode.SWAP, servedModelName: ["model1"], qloraAdapterNameOrPath: "qlora", showHiddenMetricsForVersion: "0.5", otlpTracesEndpoint: "http://localhost", collectDetailedTraces: "modules", disableAsyncOutputProc: true, maxNumBatchedTokens: 512, maxNumSeqs: 16, maxNumPartialPrefills: 4, maxLongPartialPrefills: 2, longPrefillTokenThreshold: 256, numLookaheadSlots: 4, schedulerDelayFactor: 0.5, enableChunkedPrefill: true, multiStepStreamOutputs: false, schedulingPolicy: vllm_engine_argments_1.SchedulingPolicy.PRIORITY, disableChunkedMmInput: true, schedulerCls: "custom.Scheduler", overrideNeuronConfig: {}, overridePoolerConfig: {}, compilationConfig: {}, kvTransferConfig: {}, workerCls: "CustomWorker", workerExtensionCls: "Extension", generationConfig: "config", overrideGenerationConfig: {}, enableSleepMode: true, additionalConfig: {}, enableReasoning: true, disableCascadeAttn: true, disableLogRequests: true, maxLogLen: 100, disableFastApiDocs: true, enablePromptTokensDetails: true, enableServerLoadTracking: true, loadFormat: vllm_engine_argments_1.LoadFormat.SAFETENSORS, downloadDir: "/downloads", modelLoaderExtraConfig: {}, useTqdmOnLoad: false, guidedDecodingBackend: vllm_engine_argments_1.GuidedDecodingBackend.OUTLINES, reasoningParser: vllm_engine_argments_1.ReasoningParser.DEEPSEEK_R1, distributedExecutorBackend: vllm_engine_argments_1.DistributedExecutorBackend.RAY, pipelineParallelSize: 2, tensorParallelSize: 2, dataParallelSize: 2, enableExpertParallel: true, maxParallelLoadingWorkers: 4, rayWorkersUseNsight: true, disableCustomAllReduce: true, blockSize: 16, gpuMemoryUtilization: 0.8, swapSpace: 8, kvCacheDtype: vllm_engine_argments_1.KvCacheDtype.FP8, numGpuBlocksOverride: 16, enablePrefixCaching: true, prefixCachingHashAlgo: vllm_engine_argments_1.PrefixCachingHashAlgo.SHA256, cpuOffloadGb: 2, calculateKvScales: true, limitMmPerPrompt: {}, device: vllm_engine_argments_1.Device.NEURON, }; const result = vllm_engine_argments_1.VllmEngineArgumentsParser.config(testObj); expect(result).toMatchObject({ host: "localhost", port: 8080, "uvicorn-log-level": "info", "disable-uvicorn-access-log": true, "allow-credentials": true, "allowed-origins": '["*"]', "allowed-methods": '["GET"]', "allowed-headers": '["Authorization"]', "api-key": "secret", "lora-modules": '{"name":"name","path":"lora_path","base_model_name":"id"}', "prompt-adapters": ["adapter=path"], "chat-template": "template.json", "chat-template-content-format": "auto", "response-role": "assistant", "ssl-keyfile": "key.pem", "ssl-certfile": "cert.pem", "ssl-ca-certs": "ca.pem", "enable-ssl-refresh": true, "ssl-cert-reqs": 1, "root-path": "/api", middleware: ["middleware1"], "return-tokens-as-token-ids": true, "disable-frontend-multiprocessing": true, "enable-request-id-headers": true, "enable-auto-tool-choice": true, "tool-call-parser": "granite", "tool-parser-plugin": "plugin", // should ignore the model property // model: "model-name", task: "generate", tokenizer: "tokenizer-name", // should ignore the hf-token property // "hf-token": "dummy", "hf-config-path": "config.json", "skip-tokenizer-init": true, revision: "v1.0", "code-revision": "v2.0", "tokenizer-revision": "v1.5", "tokenizer-mode": "auto", "trust-remote-code": true, "allowed-local-media-path": "/media", "config-format": "hf", dtype: "float16", "max-model-len": 2048, "logits-processor-pattern": "pattern", "model-impl": "vllm", "disable-sliding-window": true, "use-v2-block-manager": true, seed: 42, "max-logprobs": 10, "disable-log-stats": true, quantization: "awq", "rope-scaling": "{}", "rope-theta": 1.0, "hf-overrides": "{}", "enforce-eager": true, "max-seq-len-to-capture": 4096, "mm-processor-kwargs": "{}", "disable-mm-preprocessor-cache": true, "enable-lora": true, "enable-lora-bias": true, "max-loras": 2, "max-lora-rank": 32, "lora-extra-vocab-size": 512, "lora-dtype": "float16", "long-lora-scaling-factors": 1, "max-cpu-loras": 4, "fully-sharded-loras": true, "enable-prompt-adapter": true, "max-prompt-adapters": 2, "max-prompt-adapter-token": 256, "num-scheduler-steps": 2, "speculative-config": "{}", "ignore-patterns": ["pattern"], "preemption-mode": "swap", "served-model-name": ["model1"], "qlora-adapter-name-or-path": "qlora", "show-hidden-metrics-for-version": "0.5", "otlp-traces-endpoint": "http://localhost", "collect-detailed-traces": "modules", "disable-async-output-proc": true, "max-num-batched-tokens": 512, "max-num-seqs": 16, "max-num-partial-prefills": 4, "max-long-partial-prefills": 2, "long-prefill-token-threshold": 256, "num-lookahead-slots": 4, "scheduler-delay-factor": 0.5, "enable-chunked-prefill": true, "multi-step-stream-outputs": false, "scheduling-policy": "priority", "disable-chunked-mm-input": true, "scheduler-cls": "custom.Scheduler", "override-neuron-config": "{}", "override-pooler-config": "{}", "compilation-config": "{}", "kv-transfer-config": "{}", "worker-cls": "CustomWorker", "worker-extension-cls": "Extension", "generation-config": "config", "override-generation-config": "{}", "enable-sleep-mode": true, "additional-config": "{}", "enable-reasoning": true, "disable-cascade-attn": true, "disable-log-requests": true, "max-log-len": 100, "disable-fast-api-docs": true, "enable-prompt-tokens-details": true, "enable-server-load-tracking": true, "load-format": "safetensors", "download-dir": "/downloads", "model-loader-extra-config": "{}", "use-tqdm-on-load": false, "guided-decoding-backend": "outlines", "reasoning-parser": "deepseek_r1", "distributed-executor-backend": "ray", "pipeline-parallel-size": 2, "tensor-parallel-size": 2, "data-parallel-size": 2, "enable-expert-parallel": true, "max-parallel-loading-workers": 4, "ray-workers-use-nsight": true, "disable-custom-all-reduce": true, "block-size": 16, "gpu-memory-utilization": 0.8, "swap-space": 8, "kv-cache-dtype": "fp8", "num-gpu-blocks-override": 16, "enable-prefix-caching": true, "prefix-caching-hash-algo": "sha256", "cpu-offload-gb": 2, "calculate-kv-scales": true, "limit-mm-per-prompt": "{}", device: "neuron", }); }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmxsbS1lbmdpbmUtYXJnbWVudHMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iYXNlL3NlcnZlci1lbmdpbmUvdmxsbS1lbmdpbmUvdmxsbS1lbmdpbmUtYXJnbWVudHMudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUF5QztBQUN6QywrQ0FBK0M7QUFDL0MsdUVBQXdEO0FBQ3hELGlFQXNCZ0M7QUFFaEMsUUFBUSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtJQUMzQyxNQUFNLEdBQUcsR0FBRyxJQUFJLGlCQUFHLEVBQUUsQ0FBQztJQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsTUFBTSxNQUFNLEdBQUcsMkJBQU0sQ0FBQyxnQkFBZ0IsQ0FDcEMsS0FBSyxFQUNMLGFBQWEsRUFDYixtQkFBbUIsQ0FDcEIsQ0FBQztJQUNGLEVBQUUsQ0FBQyx1REFBdUQsRUFBRSxHQUFHLEVBQUU7UUFDL0QsTUFBTSxPQUFPLEdBQXdCO1lBQ25DLElBQUksRUFBRSxXQUFXO1lBQ2pCLElBQUksRUFBRSxJQUFJO1lBQ1YsZUFBZSxFQUFFLHNDQUFlLENBQUMsSUFBSTtZQUNyQyx1QkFBdUIsRUFBRSxJQUFJO1lBQzdCLGdCQUFnQixFQUFFLElBQUk7WUFDdEIsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDO1lBQ3JCLGNBQWMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUN2QixjQUFjLEVBQUUsQ0FBQyxlQUFlLENBQUM7WUFDakMsTUFBTSxFQUFFLFFBQVE7WUFDaEIsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUU7WUFDdkUsY0FBYyxFQUFFLENBQUMsY0FBYyxDQUFDO1lBQ2hDLFlBQVksRUFBRSxlQUFlO1lBQzdCLHlCQUF5QixFQUFFLGdEQUF5QixD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NUIsYUFBYSxFQUFFLEdBQUc7WUFDbEIsdUJBQXVCLEVBQUUsSUFBSTtZQUM3Qiw4QkFBOEIsRUFBRSxJQUFJO1lBQ3BDLDZCQUE2QixFQUFFLElBQUk7WUFDbkMsYUFBYSxFQUFFLGFBQWE7WUFDNUIsY0FBYyxFQUFFLFlBQVk7WUFDNUIsMkJBQTJCLEVBQUUsSUFBSTtZQUNqQyxrQkFBa0IsRUFBRSxLQUFLO1lBQ3pCLHlCQUF5QixFQUFFLFVBQVU7WUFDckMsa0JBQWtCLEVBQUUsYUFBYTtZQUNqQyw4QkFBOEIsRUFBRSxLQUFLO1lBQ3JDLHdCQUF3QixFQUFFLENBQUM7WUFDM0Isc0JBQXNCLEVBQUUsQ0FBQztZQUN6QixvQkFBb0IsRUFBRSxDQUFDO1lBQ3ZCLHdCQUF3QixFQUFFLElBQUk7WUFDOUIsOEJBQThCLEVBQUUsQ0FBQztZQUNqQyx3QkFBd0IsRUFBRSxJQUFJO1lBQzlCLDJCQUEyQixFQUFFLElBQUk7WUFDakMsWUFBWSxFQUFFLEVBQUU7WUFDaEIsd0JBQXdCLEVBQUUsR0FBRztZQUM3QixZQUFZLEVBQUUsQ0FBQztZQUNmLGdCQUFnQixFQUFFLEtBQUs7WUFDdkIseUJBQXlCLEVBQUUsRUFBRTtZQUM3Qix1QkFBdUIsRUFBRSxJQUFJO1lBQzdCLDBCQUEwQixFQUFFLFFBQVE7WUFDcEMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNuQixxQkFBcUIsRUFBRSxJQUFJO1lBQzNCLHFCQUFxQixFQUFFLElBQUk7WUFDM0IsTUFBTSxFQUFFLFFBQVE7U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcCwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGJhdGNoIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYmF0Y2hcIjtcbmltcG9ydCB7IFNlY3JldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcIjtcbmltcG9ydCB7XG4gIENoYXRUZW1wbGF0ZUNvbnRlbnRGb3JtYXQsXG4gIENvbmZpZ0Zvcm1hdCxcbiAgRGF0YVR5cGUsXG4gIERldmljZSxcbiAgRGlzdHJpYnV0ZWRFeGVjdXRvckJhY2tlbmQsXG4gIEd1aWRlZERlY29kaW5nQmFja2VuZCxcbiAgS3ZDYWNoZUR0eXBlLFxuICBMb2FkRm9ybWF0LFxuICBMb3JhRHR5cGUsXG4gIE1vZGVsSW1wbCxcbiAgUHJlZW1wdGlvbk1vZGUsXG4gIFByZWZpeENhY2hpbmdIYXNoQWxnbyxcbiAgUXVhbnRpemF0aW9uLFxuICBSZWFzb25pbmdQYXJzZXIsXG4gIFNjaGVkdWxpbmdQb2xpY3ksXG4gIFRva2VuaXplck1vZGUsXG4gIFRvb2xDYWxsUGFyc2VyLFxuICBVdmljb3JuTG9nTGV2ZWwsXG4gIFZsbG1FbmdpbmVBcmd1bWVudHMsXG4gIFZsbG1FbmdpbmVBcmd1bWVudHNQYXJzZXIsXG4gIFZsbG1UYXNrLFxufSBmcm9tIFwiLi92bGxtLWVuZ2luZS1hcmdtZW50c1wiO1xuXG5kZXNjcmliZShcIlZsbG1FbmdpbmVBcmd1bWVudHNUb0NvbmZpZ1wiLCAoKSA9PiB7XG4gIGNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwKTtcbiAgY29uc3Qgc2VjcmV0ID0gU2VjcmV0LmZyb21TZWNyZXROYW1lVjIoXG4gICAgc3RhY2ssXG4gICAgXCJEdW1teVNlY3JldFwiLFxuICAgIFwiaHVnZ2luZ2ZhY2UtdG9rZW5cIixcbiAgKTtcbiAgaXQoXCJzaG91bGQgY29udmVydCBhbGwgY2FtZWxDYXNlIHByb3BlcnRpZXMgdG8ga2ViYWItY2FzZVwiLCAoKSA9PiB7XG4gICAgY29uc3QgdGVzdE9iajogVmxsbUVuZ2luZUFyZ3VtZW50cyA9IHtcbiAgICAgIGhvc3Q6IFwibG9jYWxob3N0XCIsXG4gICAgICBwb3J0OiA4MDgwLFxuICAgICAgdXZpY29ybkxvZ0xldmVsOiBVdmljb3JuTG9nTGV2ZWwuSU5GTyxcbiAgICAgIGRpc2FibGVVdmljb3JuQWNjZXNzTG9nOiB0cnVlLFxuICAgICAgYWxsb3dDcmVkZW50aWFsczogdHJ1ZSxcbiAgICAgIGFsbG93ZWRPcmlnaW5zOiBbXCIqXCJdLFxuICAgICAgYWxsb3dlZE1ldGhvZHM6IFtcIkdFVFwiXSxcbiAgICAgIGFsbG93ZWRIZWFkZXJzOiBbXCJBdXRob3JpemF0aW9uXCJdLFxuICAgICAgYXBpS2V5OiBcInNlY3JldFwiLFxuICAgICAgbG9yYU1vZHVsZXM6IHsgbmFtZTogXCJuYW1lXCIsIHBhdGg6IFwibG9yYV9wYXRoXCIsIGJhc2VfbW9kZWxfbmFtZTogXCJpZFwiIH0sXG4gICAgICBwcm9tcHRBZGFwdGVyczogW1wiYWRhcHRlcj1wYXRoXCJdLFxuICAgICAgY2hhdFRlbXBsYXRlOiBcInRlbXBsYXRlLmpzb25cIixcbiAgICAgIGNoYXRUZW1wbGF0ZUNvbnRlbnRGb3JtYXQ6IENoYXRUZW1wbGF0ZUNvbnRlbnRGb3JtYXQuQVVUTyxcbiAgICAgIHJlc3BvbnNlUm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgIHNzbEtleWZpbGU6IFwia2V5LnBlbVwiLFxuICAgICAgc3NsQ2VydGZpbGU6IFwiY2VydC5wZW1cIixcbiAgICAgIHNzbENhQ2VydHM6IFwiY2EucGVtXCIsXG4gICAgICBlbmFibGVTc2xSZWZyZXNoOiB0cnVlLFxuICAgICAgc3NsQ2VydFJlcXM6IDEsXG4gICAgICByb290UGF0aDogXCIvYXBpXCIsXG4gICAgICBtaWRkbGV3YXJlOiBbXCJtaWRkbGV3YXJlMVwiXSxcbiAgICAgIHJldHVyblRva2Vuc0FzVG9rZW5JZHM6IHRydWUsXG4gICAgICBkaXNhYmxlRnJvbnRlbmRNdWx0aXByb2Nlc3Npbmc6IHRydWUsXG4gICAgICBlbmFibGVSZXF1ZXN0SWRIZWFkZXJzOiB0cnVlLFxuICAgICAgZW5hYmxlQXV0b1Rvb2xDaG9pY2U6IHRydWUsXG4gICAgICB0b29sQ2FsbFBhcnNlcjogVG9vbENhbGxQYXJzZXIuR1JBTklURSxcbiAgICAgIHRvb2xQYXJzZXJQbHVnaW46IFwicGx1Z2luXCIsXG4gICAgICBtb2RlbDogXCJtb2RlbC1uYW1lXCIsXG4gICAgICB0YXNrOiBWbGxtVGFzay5HRU5FUkFURSxcbiAgICAgIHRva2VuaXplcjogXCJ0b2tlbml6ZXItbmFtZVwiLFxuICAgICAgaGZDb25maWdQYXRoOiBcImNvbmZpZy5qc29uXCIsXG4gICAgICBza2lwVG9rZW5pemVySW5pdDogdHJ1ZSxcbiAgICAgIHJldmlzaW9uOiBcInYxLjBcIixcbiAgICAgIGNvZGVSZXZpc2lvbjogXCJ2Mi4wXCIsXG4gICAgICB0b2tlbml6ZXJSZXZpc2lvbjogXCJ2MS41XCIsXG4gICAgICB0b2tlbml6ZXJNb2RlOiBUb2tlbml6ZXJNb2RlLkFVVE8sXG4gICAgICB0cnVzdFJlbW90ZUNvZGU6IHRydWUsXG4gICAgICBhbGxvd2VkTG9jYWxNZWRpYVBhdGg6IFwiL21lZGlhXCIsXG4gICAgICBjb25maWdGb3JtYXQ6IENvbmZpZ0Zvcm1hdC5IRixcbiAgICAgIGR0eXBlOiBEYXRhVHlwZS5GTE9BVDE2LFxuICAgICAgbWF4TW9kZWxMZW46IDIwNDgsXG4gICAgICBsb2dpdHNQcm9jZXNzb3JQYXR0ZXJuOiBcInBhdHRlcm5cIixcbiAgICAgIG1vZGVsSW1wbDogTW9kZWxJbXBsLlZMTE0sXG4gICAgICBkaXNhYmxlU2xpZGluZ1dpbmRvdzogdHJ1ZSxcbiAgICAgIHVzZVYyQmxvY2tNYW5hZ2VyOiB0cnVlLFxuICAgICAgc2VlZDogNDIsXG4gICAgICBtYXhMb2dwcm9iczogMTAsXG4gICAgICBkaXNhYmxlTG9nU3RhdHM6IHRydWUsXG4gICAgICBxdWFudGl6YXRpb246IFF1YW50aXphdGlvbi5BV1EsXG4gICAgICByb3BlU2NhbGluZzoge30sXG4gICAgICByb3BlVGhldGE6IDEuMCxcbiAgICAgIGhmVG9rZW46IGJhdGNoLlNlY3JldC5mcm9tU2VjcmV0c01hbmFnZXIoc2VjcmV0KSxcbiAgICAgIGhmT3ZlcnJpZGVzOiB7fSxcbiAgICAgIGVuZm9yY2VFYWdlcjogdHJ1ZSxcbiAgICAgIG1heFNlcUxlblRvQ2FwdHVyZTogNDA5NixcbiAgICAgIG1tUHJvY2Vzc29yS3dhcmdzOiB7fSxcbiAgICAgIGRpc2FibGVNbVByZXByb2Nlc3NvckNhY2hlOiB0cnVlLFxuICAgICAgZW5hYmxlTG9yYTogdHJ1ZSxcbiAgICAgIGVuYWJsZUxvcmFCaWFzOiB0cnVlLFxuICAgICAgbWF4TG9yYXM6IDIsXG4gICAgICBtYXhMb3JhUmFuazogMzIsXG4gICAgICBsb3JhRXh0cmFWb2NhYlNpemU6IDUxMixcbiAgICAgIGxvcmFEdHlwZTogTG9yYUR0eXBlLkZMT0FUMTYsXG4gICAgICBsb25nTG9yYVNjYWxpbmdGYWN0b3JzOiAxLFxuICAgICAgbWF4Q3B1TG9yYXM6IDQsXG4gICAgICBmdWxseVNoYXJkZWRMb3JhczogdHJ1ZSxcbiAgICAgIGVuYWJsZVByb21wdEFkYXB0ZXI6IHRydWUsXG4gICAgICBtYXhQcm9tcHRBZGFwdGVyczogMixcbiAgICAgIG1heFByb21wdEFkYXB0ZXJUb2tlbjogMjU2LFxuICAgICAgbnVtU2NoZWR1bGVyU3RlcHM6IDIsXG4gICAgICBzcGVjdWxhdGl2ZUNvbmZpZzoge30sXG4gICAgICBpZ25vcmVQYXR0ZXJuczogW1wicGF0dGVyblwiXSxcbiAgICAgIHByZWVtcHRpb25Nb2RlOiBQcmVlbXB0aW9uTW9kZS5TV0FQLFxuICAgICAgc2VydmVkTW9kZWxOYW1lOiBbXCJtb2RlbDFcIl0sXG4gICAgICBxbG9yYUFkYXB0ZXJOYW1lT3JQYXRoOiBcInFsb3JhXCIsXG4gICAgICBzaG93SGlkZGVuTWV0cmljc0ZvclZlcnNpb246IFwiMC41XCIsXG4gICAgICBvdGxwVHJhY2VzRW5kcG9pbnQ6IFwiaHR0cDovL2xvY2FsaG9zdFwiLFxuICAgICAgY29sbGVjdERldGFpbGVkVHJhY2VzOiBcIm1vZHVsZXNcIixcbiAgICAgIGRpc2FibGVBc3luY091dHB1dFByb2M6IHRydWUsXG4gICAgICBtYXhOdW1CYXRjaGVkVG9rZW5zOiA1MTIsXG4gICAgICBtYXhOdW1TZXFzOiAxNixcbiAgICAgIG1heE51bVBhcnRpYWxQcmVmaWxsczogNCxcbiAgICAgIG1heExvbmdQYXJ0aWFsUHJlZmlsbHM6IDIsXG4gICAgICBsb25nUHJlZmlsbFRva2VuVGhyZXNob2xkOiAyNTYsXG4gICAgICBudW1Mb29rYWhlYWRTbG90czogNCxcbiAgICAgIHNjaGVkdWxlckRlbGF5RmFjdG9yOiAwLjUsXG4gICAgICBlbmFibGVDaHVua2VkUHJlZmlsbDogdHJ1ZSxcbiAgICAgIG11bHRpU3RlcFN0cmVhbU91dHB1dHM6IGZhbHNlLFxuICAgICAgc2NoZWR1bGluZ1BvbGljeTogU2NoZWR1bGluZ1BvbGljeS5QUklPUklUWSxcbiAgICAgIGRpc2FibGVDaHVua2VkTW1JbnB1dDogdHJ1ZSxcbiAgICAgIHNjaGVkdWxlckNsczogXCJjdXN0b20uU2NoZWR1bGVyXCIsXG4gICAgICBvdmVycmlkZU5ldXJvbkNvbmZpZzoge30sXG4gICAgICBvdmVycmlkZVBvb2xlckNvbmZpZzoge30sXG4gICAgICBjb21waWxhdGlvbkNvbmZpZzoge30sXG4gICAgICBrdlRyYW5zZmVyQ29uZmlnOiB7fSxcbiAgICAgIHdvcmtlckNsczogXCJDdXN0b21Xb3JrZXJcIixcbiAgICAgIHdvcmtlckV4dGVuc2lvbkNsczogXCJFeHRlbnNpb25cIixcbiAgICAgIGdlbmVyYXRpb25Db25maWc6IFwiY29uZmlnXCIsXG4gICAgICBvdmVycmlkZUdlbmVyYXRpb25Db25maWc6IHt9LFxuICAgICAgZW5hYmxlU2xlZXBNb2RlOiB0cnVlLFxuICAgICAgYWRkaXRpb25hbENvbmZpZzoge30sXG4gICAgICBlbmFibGVSZWFzb25pbmc6IHRydWUsXG4gICAgICBkaXNhYmxlQ2FzY2FkZUF0dG46IHRydWUsXG4gICAgICBkaXNhYmxlTG9nUmVxdWVzdHM6IHRydWUsXG4gICAgICBtYXhMb2dMZW46IDEwMCxcbiAgICAgIGRpc2FibGVGYXN0QXBpRG9jczogdHJ1ZSxcbiAgICAgIGVuYWJsZVByb21wdFRva2Vuc0RldGFpbHM6IHRydWUsXG4gICAgICBlbmFibGVTZXJ2ZXJMb2FkVHJhY2tpbmc6IHRydWUsXG4gICAgICBsb2FkRm9ybWF0OiBMb2FkRm9ybWF0LlNBRkVURU5TT1JTLFxuICAgICAgZG93bmxvYWREaXI6IFwiL2Rvd25sb2Fkc1wiLFxuICAgICAgbW9kZWxMb2FkZXJFeHRyYUNvbmZpZzoge30sXG4gICAgICB1c2VUcWRtT25Mb2FkOiBmYWxzZSxcbiAgICAgIGd1aWRlZERlY29kaW5nQmFja2VuZDogR3VpZGVkRGVjb2RpbmdCYWNrZW5kLk9VVExJTkVTLFxuICAgICAgcmVhc29uaW5nUGFyc2VyOiBSZWFzb25pbmdQYXJzZXIuREVFUFNFRUtfUjEsXG4gICAgICBkaXN0cmlidXRlZEV4ZWN1dG9yQmFja2VuZDogRGlzdHJpYnV0ZWRFeGVjdXRvckJhY2tlbmQuUkFZLFxuICAgICAgcGlwZWxpbmVQYXJhbGxlbFNpemU6IDIsXG4gICAgICB0ZW5zb3JQYXJhbGxlbFNpemU6IDIsXG4gICAgICBkYXRhUGFyYWxsZWxTaXplOiAyLFxuICAgICAgZW5hYmxlRXhwZXJ0UGFyYWxsZWw6IHRydWUsXG4gICAgICBtYXhQYXJhbGxlbExvYWRpbmdXb3JrZXJzOiA0LFxuICAgICAgcmF5V29ya2Vyc1VzZU5zaWdodDogdHJ1ZSxcbiAgICAgIGRpc2FibGVDdXN0b21BbGxSZWR1Y2U6IHRydWUsXG4gICAgICBibG9ja1NpemU6IDE2LFxuICAgICAgZ3B1TWVtb3J5VXRpbGl6YXRpb246IDAuOCxcbiAgICAgIHN3YXBTcGFjZTogOCxcbiAgICAgIGt2Q2FjaGVEdHlwZTogS3ZDYWNoZUR0eXBlLkZQOCxcbiAgICAgIG51bUdwdUJsb2Nrc092ZXJyaWRlOiAxNixcbiAgICAgIGVuYWJsZVByZWZpeENhY2hpbmc6IHRydWUsXG4gICAgICBwcmVmaXhDYWNoaW5nSGFzaEFsZ286IFByZWZpeENhY2hpbmdIYXNoQWxnby5TSEEyNTYsXG4gICAgICBjcHVPZmZsb2FkR2I6IDIsXG4gICAgICBjYWxjdWxhdGVLdlNjYWxlczogdHJ1ZSxcbiAgICAgIGxpbWl0TW1QZXJQcm9tcHQ6IHt9LFxuICAgICAgZGV2aWNlOiBEZXZpY2UuTkVVUk9OLFxuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBWbGxtRW5naW5lQXJndW1lbnRzUGFyc2VyLmNvbmZpZyh0ZXN0T2JqKTtcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgaG9zdDogXCJsb2NhbGhvc3RcIixcbiAgICAgIHBvcnQ6IDgwODAsXG4gICAgICBcInV2aWNvcm4tbG9nLWxldmVsXCI6IFwiaW5mb1wiLFxuICAgICAgXCJkaXNhYmxlLXV2aWNvcm4tYWNjZXNzLWxvZ1wiOiB0cnVlLFxuICAgICAgXCJhbGxvdy1jcmVkZW50aWFsc1wiOiB0cnVlLFxuICAgICAgXCJhbGxvd2VkLW9yaWdpbnNcIjogJ1tcIipcIl0nLFxuICAgICAgXCJhbGxvd2VkLW1ldGhvZHNcIjogJ1tcIkdFVFwiXScsXG4gICAgICBcImFsbG93ZWQtaGVhZGVyc1wiOiAnW1wiQXV0aG9yaXphdGlvblwiXScsXG4gICAgICBcImFwaS1rZXlcIjogXCJzZWNyZXRcIixcbiAgICAgIFwibG9yYS1tb2R1bGVzXCI6XG4gICAgICAgICd7XCJuYW1lXCI6XCJuYW1lXCIsXCJwYXRoXCI6XCJsb3JhX3BhdGhcIixcImJhc2VfbW9kZWxfbmFtZVwiOlwiaWRcIn0nLFxuICAgICAgXCJwcm9tcHQtYWRhcHRlcnNcIjogW1wiYWRhcHRlcj1wYXRoXCJdLFxuICAgICAgXCJjaGF0LXRlbXBsYXRlXCI6IFwidGVtcGxhdGUuanNvblwiLFxuICAgICAgXCJjaGF0LXRlbXBsYXRlLWNvbnRlbnQtZm9ybWF0XCI6IFwiYXV0b1wiLFxuICAgICAgXCJyZXNwb25zZS1yb2xlXCI6IFwiYXNzaXN0YW50XCIsXG4gICAgICBcInNzbC1rZXlmaWxlXCI6IFwia2V5LnBlbVwiLFxuICAgICAgXCJzc2wtY2VydGZpbGVcIjogXCJjZXJ0LnBlbVwiLFxuICAgICAgXCJzc2wtY2EtY2VydHNcIjogXCJjYS5wZW1cIixcbiAgICAgIFwiZW5hYmxlLXNzbC1yZWZyZXNoXCI6IHRydWUsXG4gICAgICBcInNzbC1jZXJ0LXJlcXNcIjogMSxcbiAgICAgIFwicm9vdC1wYXRoXCI6IFwiL2FwaVwiLFxuICAgICAgbWlkZGxld2FyZTogW1wibWlkZGxld2FyZTFcIl0sXG4gICAgICBcInJldHVybi10b2tlbnMtYXMtdG9rZW4taWRzXCI6IHRydWUsXG4gICAgICBcImRpc2FibGUtZnJvbnRlbmQtbXVsdGlwcm9jZXNzaW5nXCI6IHRydWUsXG4gICAgICBcImVuYWJsZS1yZXF1ZXN0LWlkLWhlYWRlcnNcIjogdHJ1ZSxcbiAgICAgIFwiZW5hYmxlLWF1dG8tdG9vbC1jaG9pY2VcIjogdHJ1ZSxcbiAgICAgIFwidG9vbC1jYWxsLXBhcnNlclwiOiBcImdyYW5pdGVcIixcbiAgICAgIFwidG9vbC1wYXJzZXItcGx1Z2luXCI6IFwicGx1Z2luXCIsXG4gICAgICAvLyBzaG91bGQgaWdub3JlIHRoZSBtb2RlbCBwcm9wZXJ0eVxuICAgICAgLy8gbW9kZWw6IFwibW9kZWwtbmFtZVwiLFxuICAgICAgdGFzazogXCJnZW5lcmF0ZVwiLFxuICAgICAgdG9rZW5pemVyOiBcInRva2VuaXplci1uYW1lXCIsXG4gICAgICAvLyBzaG91bGQgaWdub3JlIHRoZSBoZi10b2tlbiBwcm9wZXJ0eVxuICAgICAgLy8gXCJoZi10b2tlblwiOiBcImR1bW15XCIsXG4gICAgICBcImhmLWNvbmZpZy1wYXRoXCI6IFwiY29uZmlnLmpzb25cIixcbiAgICAgIFwic2tpcC10b2tlbml6ZXItaW5pdFwiOiB0cnVlLFxuICAgICAgcmV2aXNpb246IFwidjEuMFwiLFxuICAgICAgXCJjb2RlLXJldmlzaW9uXCI6IFwidjIuMFwiLFxuICAgICAgXCJ0b2tlbml6ZXItcmV2aXNpb25cIjogXCJ2MS41XCIsXG4gICAgICBcInRva2VuaXplci1tb2RlXCI6IFwiYXV0b1wiLFxuICAgICAgXCJ0cnVzdC1yZW1vdGUtY29kZVwiOiB0cnVlLFxuICAgICAgXCJhbGxvd2VkLWxvY2FsLW1lZGlhLXBhdGhcIjogXCIvbWVkaWFcIixcbiAgICAgIFwiY29uZmlnLWZvcm1hdFwiOiBcImhmXCIsXG4gICAgICBkdHlwZTogXCJmbG9hdDE2XCIsXG4gICAgICBcIm1heC1tb2RlbC1sZW5cIjogMjA0OCxcbiAgICAgIFwibG9naXRzLXByb2Nlc3Nvci1wYXR0ZXJuXCI6IFwicGF0dGVyblwiLFxuICAgICAgXCJtb2RlbC1pbXBsXCI6IFwidmxsbVwiLFxuICAgICAgXCJkaXNhYmxlLXNsaWRpbmctd2luZG93XCI6IHRydWUsXG4gICAgICBcInVzZS12Mi1ibG9jay1tYW5hZ2VyXCI6IHRydWUsXG4gICAgICBzZWVkOiA0MixcbiAgICAgIFwibWF4LWxvZ3Byb2JzXCI6IDEwLFxuICAgICAgXCJkaXNhYmxlLWxvZy1zdGF0c1wiOiB0cnVlLFxuICAgICAgcXVhbnRpemF0aW9uOiBcImF3cVwiLFxuICAgICAgXCJyb3BlLXNjYWxpbmdcIjogXCJ7fVwiLFxuICAgICAgXCJyb3BlLXRoZXRhXCI6IDEuMCxcbiAgICAgIFwiaGYtb3ZlcnJpZGVzXCI6IFwie31cIixcbiAgICAgIFwiZW5mb3JjZS1lYWdlclwiOiB0cnVlLFxuICAgICAgXCJtYXgtc2VxLWxlbi10by1jYXB0dXJlXCI6IDQwOTYsXG4gICAgICBcIm1tLXByb2Nlc3Nvci1rd2FyZ3NcIjogXCJ7fVwiLFxuICAgICAgXCJkaXNhYmxlLW1tLXByZXByb2Nlc3Nvci1jYWNoZVwiOiB0cnVlLFxuICAgICAgXCJlbmFibGUtbG9yYVwiOiB0cnVlLFxuICAgICAgXCJlbmFibGUtbG9yYS1iaWFzXCI6IHRydWUsXG4gICAgICBcIm1heC1sb3Jhc1wiOiAyLFxuICAgICAgXCJtYXgtbG9yYS1yYW5rXCI6IDMyLFxuICAgICAgXCJsb3JhLWV4dHJhLXZvY2FiLXNpemVcIjogNTEyLFxuICAgICAgXCJsb3JhLWR0eXBlXCI6IFwiZmxvYXQxNlwiLFxuICAgICAgXCJsb25nLWxvcmEtc2NhbGluZy1mYWN0b3JzXCI6IDEsXG4gICAgICBcIm1heC1jcHUtbG9yYXNcIjogNCxcbiAgICAgIFwiZnVsbHktc2hhcmRlZC1sb3Jhc1wiOiB0cnVlLFxuICAgICAgXCJlbmFibGUtcHJvbXB0LWFkYXB0ZXJcIjogdHJ1ZSxcbiAgICAgIFwibWF4LXByb21wdC1hZGFwdGVyc1wiOiAyLFxuICAgICAgXCJtYXgtcHJvbXB0LWFkYXB0ZXItdG9rZW5cIjogMjU2LFxuICAgICAgXCJudW0tc2NoZWR1bGVyLXN0ZXBzXCI6IDIsXG4gICAgICBcInNwZWN1bGF0aXZlLWNvbmZpZ1wiOiBcInt9XCIsXG4gICAgICBcImlnbm9yZS1wYXR0ZXJuc1wiOiBbXCJwYXR0ZXJuXCJdLFxuICAgICAgXCJwcmVlbXB0aW9uLW1vZGVcIjogXCJzd2FwXCIsXG4gICAgICBcInNlcnZlZC1tb2RlbC1uYW1lXCI6IFtcIm1vZGVsMVwiXSxcbiAgICAgIFwicWxvcmEtYWRhcHRlci1uYW1lLW9yLXBhdGhcIjogXCJxbG9yYVwiLFxuICAgICAgXCJzaG93LWhpZGRlbi1tZXRyaWNzLWZvci12ZXJzaW9uXCI6IFwiMC41XCIsXG4gICAgICBcIm90bHAtdHJhY2VzLWVuZHBvaW50XCI6IFwiaHR0cDovL2xvY2FsaG9zdFwiLFxuICAgICAgXCJjb2xsZWN0LWRldGFpbGVkLXRyYWNlc1wiOiBcIm1vZHVsZXNcIixcbiAgICAgIFwiZGlzYWJsZS1hc3luYy1vdXRwdXQtcHJvY1wiOiB0cnVlLFxuICAgICAgXCJtYXgtbnVtLWJhdGNoZWQtdG9rZW5zXCI6IDUxMixcbiAgICAgIFwibWF4LW51bS1zZXFzXCI6IDE2LFxuICAgICAgXCJtYXgtbnVtLXBhcnRpYWwtcHJlZmlsbHNcIjogNCxcbiAgICAgIFwibWF4LWxvbmctcGFydGlhbC1wcmVmaWxsc1wiOiAyLFxuICAgICAgXCJsb25nLXByZWZpbGwtdG9rZW4tdGhyZXNob2xkXCI6IDI1NixcbiAgICAgIFwibnVtLWxvb2thaGVhZC1zbG90c1wiOiA0LFxuICAgICAgXCJzY2hlZHVsZXItZGVsYXktZmFjdG9yXCI6IDAuNSxcbiAgICAgIFwiZW5hYmxlLWNodW5rZWQtcHJlZmlsbFwiOiB0cnVlLFxuICAgICAgXCJtdWx0aS1zdGVwLXN0cmVhbS1vdXRwdXRzXCI6IGZhbHNlLFxuICAgICAgXCJzY2hlZHVsaW5nLXBvbGljeVwiOiBcInByaW9yaXR5XCIsXG4gICAgICBcImRpc2FibGUtY2h1bmtlZC1tbS1pbnB1dFwiOiB0cnVlLFxuICAgICAgXCJzY2hlZHVsZXItY2xzXCI6IFwiY3VzdG9tLlNjaGVkdWxlclwiLFxuICAgICAgXCJvdmVycmlkZS1uZXVyb24tY29uZmlnXCI6IFwie31cIixcbiAgICAgIFwib3ZlcnJpZGUtcG9vbGVyLWNvbmZpZ1wiOiBcInt9XCIsXG4gICAgICBcImNvbXBpbGF0aW9uLWNvbmZpZ1wiOiBcInt9XCIsXG4gICAgICBcImt2LXRyYW5zZmVyLWNvbmZpZ1wiOiBcInt9XCIsXG4gICAgICBcIndvcmtlci1jbHNcIjogXCJDdXN0b21Xb3JrZXJcIixcbiAgICAgIFwid29ya2VyLWV4dGVuc2lvbi1jbHNcIjogXCJFeHRlbnNpb25cIixcbiAgICAgIFwiZ2VuZXJhdGlvbi1jb25maWdcIjogXCJjb25maWdcIixcbiAgICAgIFwib3ZlcnJpZGUtZ2VuZXJhdGlvbi1jb25maWdcIjogXCJ7fVwiLFxuICAgICAgXCJlbmFibGUtc2xlZXAtbW9kZVwiOiB0cnVlLFxuICAgICAgXCJhZGRpdGlvbmFsLWNvbmZpZ1wiOiBcInt9XCIsXG4gICAgICBcImVuYWJsZS1yZWFzb25pbmdcIjogdHJ1ZSxcbiAgICAgIFwiZGlzYWJsZS1jYXNjYWRlLWF0dG5cIjogdHJ1ZSxcbiAgICAgIFwiZGlzYWJsZS1sb2ctcmVxdWVzdHNcIjogdHJ1ZSxcbiAgICAgIFwibWF4LWxvZy1sZW5cIjogMTAwLFxuICAgICAgXCJkaXNhYmxlLWZhc3QtYXBpLWRvY3NcIjogdHJ1ZSxcbiAgICAgIFwiZW5hYmxlLXByb21wdC10b2tlbnMtZGV0YWlsc1wiOiB0cnVlLFxuICAgICAgXCJlbmFibGUtc2VydmVyLWxvYWQtdHJhY2tpbmdcIjogdHJ1ZSxcbiAgICAgIFwibG9hZC1mb3JtYXRcIjogXCJzYWZldGVuc29yc1wiLFxuICAgICAgXCJkb3dubG9hZC1kaXJcIjogXCIvZG93bmxvYWRzXCIsXG4gICAgICBcIm1vZGVsLWxvYWRlci1leHRyYS1jb25maWdcIjogXCJ7fVwiLFxuICAgICAgXCJ1c2UtdHFkbS1vbi1sb2FkXCI6IGZhbHNlLFxuICAgICAgXCJndWlkZWQtZGVjb2RpbmctYmFja2VuZFwiOiBcIm91dGxpbmVzXCIsXG4gICAgICBcInJlYXNvbmluZy1wYXJzZXJcIjogXCJkZWVwc2Vla19yMVwiLFxuICAgICAgXCJkaXN0cmlidXRlZC1leGVjdXRvci1iYWNrZW5kXCI6IFwicmF5XCIsXG4gICAgICBcInBpcGVsaW5lLXBhcmFsbGVsLXNpemVcIjogMixcbiAgICAgIFwidGVuc29yLXBhcmFsbGVsLXNpemVcIjogMixcbiAgICAgIFwiZGF0YS1wYXJhbGxlbC1zaXplXCI6IDIsXG4gICAgICBcImVuYWJsZS1leHBlcnQtcGFyYWxsZWxcIjogdHJ1ZSxcbiAgICAgIFwibWF4LXBhcmFsbGVsLWxvYWRpbmctd29ya2Vyc1wiOiA0LFxuICAgICAgXCJyYXktd29ya2Vycy11c2UtbnNpZ2h0XCI6IHRydWUsXG4gICAgICBcImRpc2FibGUtY3VzdG9tLWFsbC1yZWR1Y2VcIjogdHJ1ZSxcbiAgICAgIFwiYmxvY2stc2l6ZVwiOiAxNixcbiAgICAgIFwiZ3B1LW1lbW9yeS11dGlsaXphdGlvblwiOiAwLjgsXG4gICAgICBcInN3YXAtc3BhY2VcIjogOCxcbiAgICAgIFwia3YtY2FjaGUtZHR5cGVcIjogXCJmcDhcIixcbiAgICAgIFwibnVtLWdwdS1ibG9ja3Mtb3ZlcnJpZGVcIjogMTYsXG4gICAgICBcImVuYWJsZS1wcmVmaXgtY2FjaGluZ1wiOiB0cnVlLFxuICAgICAgXCJwcmVmaXgtY2FjaGluZy1oYXNoLWFsZ29cIjogXCJzaGEyNTZcIixcbiAgICAgIFwiY3B1LW9mZmxvYWQtZ2JcIjogMixcbiAgICAgIFwiY2FsY3VsYXRlLWt2LXNjYWxlc1wiOiB0cnVlLFxuICAgICAgXCJsaW1pdC1tbS1wZXItcHJvbXB0XCI6IFwie31cIixcbiAgICAgIGRldmljZTogXCJuZXVyb25cIixcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==