@ruvector/ruvllm 2.5.6 → 2.6.0
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/README.md +282 -282
- package/bin/cli.js +1020 -1020
- package/dist/cjs/benchmarks/embedding-benchmark.js +1 -1
- package/dist/cjs/benchmarks/index.js +1 -1
- package/dist/cjs/benchmarks/model-comparison.js +1 -1
- package/dist/cjs/benchmarks/routing-benchmark.js +1 -1
- package/dist/cjs/contrastive.js +70 -70
- package/dist/cjs/engine.js +13 -13
- package/dist/cjs/export.js +31 -31
- package/dist/cjs/federated.js +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/intelligence.js +1 -1
- package/dist/cjs/lora.d.ts +11 -0
- package/dist/cjs/lora.d.ts.map +1 -1
- package/dist/cjs/lora.js +16 -1
- package/dist/cjs/models.js +1 -1
- package/dist/cjs/native.js +1 -1
- package/dist/cjs/session.js +1 -1
- package/dist/cjs/simd.js +1 -1
- package/dist/cjs/sona.js +1 -1
- package/dist/cjs/streaming.js +1 -1
- package/dist/cjs/training.d.ts +66 -8
- package/dist/cjs/training.d.ts.map +1 -1
- package/dist/cjs/training.js +145 -15
- package/dist/cjs/types.d.ts +7 -0
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/cjs/types.js +1 -1
- package/dist/esm/benchmarks/embedding-benchmark.js +1 -1
- package/dist/esm/benchmarks/index.js +1 -1
- package/dist/esm/benchmarks/model-comparison.js +1 -1
- package/dist/esm/benchmarks/routing-benchmark.js +1 -1
- package/dist/esm/contrastive.js +70 -70
- package/dist/esm/engine.js +13 -13
- package/dist/esm/export.js +31 -31
- package/dist/esm/federated.js +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/intelligence.js +1 -1
- package/dist/esm/lora.d.ts +11 -0
- package/dist/esm/lora.d.ts.map +1 -1
- package/dist/esm/lora.js +16 -1
- package/dist/esm/models.js +1 -1
- package/dist/esm/native.js +1 -1
- package/dist/esm/session.js +1 -1
- package/dist/esm/simd.js +1 -1
- package/dist/esm/sona.js +1 -1
- package/dist/esm/streaming.js +1 -1
- package/dist/esm/training.d.ts +66 -8
- package/dist/esm/training.d.ts.map +1 -1
- package/dist/esm/training.js +145 -15
- package/dist/esm/types.d.ts +7 -0
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/types.js +1 -1
- package/package.json +133 -133
- package/scripts/ensemble-model-compare.js +287 -287
- package/scripts/huggingface/README.md +537 -537
- package/scripts/huggingface/publish.sh +112 -112
- package/scripts/hybrid-model-compare.js +373 -373
- package/scripts/improved-model-compare.js +288 -288
- package/scripts/optimized-model-compare.js +364 -364
- package/scripts/real-model-compare.js +280 -280
- package/scripts/training/agentic-flow-capabilities.json +329 -329
- package/scripts/training/claude-code-synth.js +505 -505
- package/scripts/training/claude-flow-capabilities.json +1322 -1322
- package/scripts/training/claude-hard-negatives.js +222 -222
- package/scripts/training/contrastive-finetune.js +517 -517
- package/scripts/training/ecosystem-triplets.jsonl +1466 -1466
- package/scripts/training/generate-ecosystem-triplets.js +1324 -1324
- package/scripts/training/routing-dataset.js +634 -634
- package/scripts/training/ruvector-capabilities.json +798 -798
- package/scripts/training/validate-ecosystem.js +381 -381
- package/scripts/training/validation-results.json +22 -22
package/dist/esm/contrastive.js
CHANGED
|
@@ -251,75 +251,75 @@ export class ContrastiveTrainer {
|
|
|
251
251
|
*/
|
|
252
252
|
generateTrainingScript(outputPath) {
|
|
253
253
|
const outDir = outputPath || this.config.outputPath;
|
|
254
|
-
const script = `#!/bin/bash
|
|
255
|
-
# RuvLTRA Fine-tuning Script
|
|
256
|
-
# Prerequisites: pip install transformers peft accelerate
|
|
257
|
-
|
|
258
|
-
set -e
|
|
259
|
-
|
|
260
|
-
MODEL_PATH="${outDir}"
|
|
261
|
-
BASE_MODEL="Qwen/Qwen2.5-0.5B"
|
|
262
|
-
|
|
263
|
-
echo "=== RuvLTRA Contrastive Fine-tuning ==="
|
|
264
|
-
echo "Base model: $BASE_MODEL"
|
|
265
|
-
echo "Output: $MODEL_PATH"
|
|
266
|
-
|
|
267
|
-
# Check for training data
|
|
268
|
-
if [ ! -f "$MODEL_PATH/triplets.jsonl" ]; then
|
|
269
|
-
echo "Error: Training data not found at $MODEL_PATH/triplets.jsonl"
|
|
270
|
-
exit 1
|
|
271
|
-
fi
|
|
272
|
-
|
|
273
|
-
# Install dependencies if needed
|
|
274
|
-
python3 -c "import transformers, peft" 2>/dev/null || {
|
|
275
|
-
echo "Installing dependencies..."
|
|
276
|
-
pip install transformers peft accelerate sentencepiece
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
# Fine-tune with LoRA
|
|
280
|
-
python3 << 'PYTHON'
|
|
281
|
-
import json
|
|
282
|
-
import torch
|
|
283
|
-
from pathlib import Path
|
|
284
|
-
from transformers import AutoModelForCausalLM, AutoTokenizer
|
|
285
|
-
from peft import LoraConfig, get_peft_model, TaskType
|
|
286
|
-
|
|
287
|
-
# Load config
|
|
288
|
-
config_path = Path("${outDir}/lora_config.json")
|
|
289
|
-
with open(config_path) as f:
|
|
290
|
-
config = json.load(f)
|
|
291
|
-
|
|
292
|
-
print(f"Loading base model: {config['base_model']}")
|
|
293
|
-
|
|
294
|
-
# Load model and tokenizer
|
|
295
|
-
tokenizer = AutoTokenizer.from_pretrained(config['base_model'])
|
|
296
|
-
model = AutoModelForCausalLM.from_pretrained(
|
|
297
|
-
config['base_model'],
|
|
298
|
-
torch_dtype=torch.float16,
|
|
299
|
-
device_map='auto'
|
|
300
|
-
)
|
|
301
|
-
|
|
302
|
-
# Configure LoRA
|
|
303
|
-
lora_config = LoraConfig(
|
|
304
|
-
r=config['lora_r'],
|
|
305
|
-
lora_alpha=config['lora_alpha'],
|
|
306
|
-
lora_dropout=config['lora_dropout'],
|
|
307
|
-
target_modules=config['target_modules'],
|
|
308
|
-
task_type=TaskType.CAUSAL_LM,
|
|
309
|
-
)
|
|
310
|
-
|
|
311
|
-
model = get_peft_model(model, lora_config)
|
|
312
|
-
model.print_trainable_parameters()
|
|
313
|
-
|
|
314
|
-
print("Model ready for fine-tuning!")
|
|
315
|
-
print(f"Training data: {config['train_data']}")
|
|
316
|
-
print("Note: Full training requires GPU. This script validates the setup.")
|
|
317
|
-
PYTHON
|
|
318
|
-
|
|
319
|
-
echo ""
|
|
320
|
-
echo "=== Setup Complete ==="
|
|
321
|
-
echo "To train on GPU, run the full training pipeline."
|
|
322
|
-
echo "Training data exported to: $MODEL_PATH/triplets.jsonl"
|
|
254
|
+
const script = `#!/bin/bash
|
|
255
|
+
# RuvLTRA Fine-tuning Script
|
|
256
|
+
# Prerequisites: pip install transformers peft accelerate
|
|
257
|
+
|
|
258
|
+
set -e
|
|
259
|
+
|
|
260
|
+
MODEL_PATH="${outDir}"
|
|
261
|
+
BASE_MODEL="Qwen/Qwen2.5-0.5B"
|
|
262
|
+
|
|
263
|
+
echo "=== RuvLTRA Contrastive Fine-tuning ==="
|
|
264
|
+
echo "Base model: $BASE_MODEL"
|
|
265
|
+
echo "Output: $MODEL_PATH"
|
|
266
|
+
|
|
267
|
+
# Check for training data
|
|
268
|
+
if [ ! -f "$MODEL_PATH/triplets.jsonl" ]; then
|
|
269
|
+
echo "Error: Training data not found at $MODEL_PATH/triplets.jsonl"
|
|
270
|
+
exit 1
|
|
271
|
+
fi
|
|
272
|
+
|
|
273
|
+
# Install dependencies if needed
|
|
274
|
+
python3 -c "import transformers, peft" 2>/dev/null || {
|
|
275
|
+
echo "Installing dependencies..."
|
|
276
|
+
pip install transformers peft accelerate sentencepiece
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
# Fine-tune with LoRA
|
|
280
|
+
python3 << 'PYTHON'
|
|
281
|
+
import json
|
|
282
|
+
import torch
|
|
283
|
+
from pathlib import Path
|
|
284
|
+
from transformers import AutoModelForCausalLM, AutoTokenizer
|
|
285
|
+
from peft import LoraConfig, get_peft_model, TaskType
|
|
286
|
+
|
|
287
|
+
# Load config
|
|
288
|
+
config_path = Path("${outDir}/lora_config.json")
|
|
289
|
+
with open(config_path) as f:
|
|
290
|
+
config = json.load(f)
|
|
291
|
+
|
|
292
|
+
print(f"Loading base model: {config['base_model']}")
|
|
293
|
+
|
|
294
|
+
# Load model and tokenizer
|
|
295
|
+
tokenizer = AutoTokenizer.from_pretrained(config['base_model'])
|
|
296
|
+
model = AutoModelForCausalLM.from_pretrained(
|
|
297
|
+
config['base_model'],
|
|
298
|
+
torch_dtype=torch.float16,
|
|
299
|
+
device_map='auto'
|
|
300
|
+
)
|
|
301
|
+
|
|
302
|
+
# Configure LoRA
|
|
303
|
+
lora_config = LoraConfig(
|
|
304
|
+
r=config['lora_r'],
|
|
305
|
+
lora_alpha=config['lora_alpha'],
|
|
306
|
+
lora_dropout=config['lora_dropout'],
|
|
307
|
+
target_modules=config['target_modules'],
|
|
308
|
+
task_type=TaskType.CAUSAL_LM,
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
model = get_peft_model(model, lora_config)
|
|
312
|
+
model.print_trainable_parameters()
|
|
313
|
+
|
|
314
|
+
print("Model ready for fine-tuning!")
|
|
315
|
+
print(f"Training data: {config['train_data']}")
|
|
316
|
+
print("Note: Full training requires GPU. This script validates the setup.")
|
|
317
|
+
PYTHON
|
|
318
|
+
|
|
319
|
+
echo ""
|
|
320
|
+
echo "=== Setup Complete ==="
|
|
321
|
+
echo "To train on GPU, run the full training pipeline."
|
|
322
|
+
echo "Training data exported to: $MODEL_PATH/triplets.jsonl"
|
|
323
323
|
`;
|
|
324
324
|
if (!existsSync(outDir)) {
|
|
325
325
|
mkdirSync(outDir, { recursive: true });
|
|
@@ -575,4 +575,4 @@ export function getDatasetStats() {
|
|
|
575
575
|
agents,
|
|
576
576
|
};
|
|
577
577
|
}
|
|
578
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJhc3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udHJhc3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLElBQUksQ0FBQztBQUMxRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBeUY1Qjs7R0FFRztBQUNILE1BQU0sMEJBQTBCLEdBQWdDO0lBQzlELE1BQU0sRUFBRSxFQUFFO0lBQ1YsU0FBUyxFQUFFLEVBQUU7SUFDYixZQUFZLEVBQUUsTUFBTTtJQUNwQixNQUFNLEVBQUUsR0FBRztJQUNYLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLGlCQUFpQixFQUFFLEdBQUc7SUFDdEIsVUFBVSxFQUFFLG1CQUFtQjtDQUNoQyxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsQ0FBWSxFQUFFLENBQVk7SUFDekQsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEQsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNsQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2xDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25CLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FDekIsU0FBb0IsRUFDcEIsV0FBc0IsRUFDdEIsV0FBc0IsRUFDdEIsU0FBaUIsR0FBRztJQUVwQixNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzdELE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDN0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQ3pCLFNBQW9CLEVBQ3BCLFdBQXNCLEVBQ3RCLFlBQXlCLEVBQ3pCLGNBQXNCLElBQUk7SUFFMUIsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxHQUFHLFdBQVcsQ0FBQztJQUN0RSxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDO0lBRXhGLHNCQUFzQjtJQUN0QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzNELE1BQU0sV0FBVyxHQUFHLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVoRSxxQkFBcUI7SUFDckIsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQzdCLFNBQW9CLEVBQ3BCLFdBQXNCLEVBQ3RCLFdBQXNCLEVBQ3RCLEtBQWEsTUFBTTtJQUVuQixNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO0lBQzdCLE1BQU0sUUFBUSxHQUFhLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVsRCwrQkFBK0I7SUFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzdCLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELGlDQUFpQztJQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDN0IsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLGtCQUFrQjtJQU03QixZQUFZLE1BQTBCO1FBSjlCLGFBQVEsR0FBc0IsRUFBRSxDQUFDO1FBQ2pDLFlBQU8sR0FBMkIsRUFBRSxDQUFDO1FBQ3JDLG9CQUFlLEdBQTJCLElBQUksR0FBRyxFQUFFLENBQUM7UUFHMUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsMEJBQTBCLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQ1IsTUFBYyxFQUNkLFNBQW9CLEVBQ3BCLFFBQWdCLEVBQ2hCLFdBQXNCLEVBQ3RCLFFBQWdCLEVBQ2hCLFdBQXNCLEVBQ3RCLFNBQWtCLEtBQUs7UUFFdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDakIsTUFBTTtZQUNOLFNBQVM7WUFDVCxRQUFRO1lBQ1IsV0FBVztZQUNYLFFBQVE7WUFDUixXQUFXO1lBQ1gsTUFBTTtTQUNQLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILGlCQUFpQixDQUFDLFNBQWlCLEVBQUUsU0FBb0I7UUFDdkQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUs7UUFDSCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDN0IsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUVsRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9CLE9BQU87Z0JBQ0wsWUFBWSxFQUFFLENBQUM7Z0JBQ2YsU0FBUyxFQUFFLENBQUM7Z0JBQ1osV0FBVyxFQUFFLENBQUM7Z0JBQ2QsV0FBVyxFQUFFLENBQUM7Z0JBQ2QsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsVUFBVSxFQUFFLENBQUM7YUFDZCxDQUFDO1FBQ0osQ0FBQztRQUVELEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUM1QyxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDbEIsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1lBRW5CLG1CQUFtQjtZQUNuQixNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFFcEUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNwRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7Z0JBQy9DLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztnQkFFbEIsS0FBSyxNQUFNLE9BQU8sSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDNUIsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUN0QixPQUFPLENBQUMsU0FBUyxFQUNqQixPQUFPLENBQUMsV0FBVyxFQUNuQixPQUFPLENBQUMsV0FBVyxFQUNuQixNQUFNLENBQ1AsQ0FBQztvQkFDRixTQUFTLElBQUksSUFBSSxDQUFDO2dCQUNwQixDQUFDO2dCQUVELFNBQVMsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztnQkFDdEMsVUFBVSxFQUFFLENBQUM7WUFDZixDQUFDO1lBRUQsTUFBTSxPQUFPLEdBQUcsU0FBUyxHQUFHLFVBQVUsQ0FBQztZQUN2QyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLENBQUM7UUFDL0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ25FLE1BQU0sV0FBVyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsR0FBRyxXQUFXLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU5RSxPQUFPO1lBQ0wsWUFBWSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTTtZQUNsQyxTQUFTO1lBQ1QsV0FBVztZQUNYLFdBQVc7WUFDWCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTO1NBQ25DLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxrQkFBa0IsQ0FBQyxVQUFtQjtRQUNwQyxNQUFNLE1BQU0sR0FBRyxVQUFVLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFFcEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3hCLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsK0JBQStCO1FBQy9CLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4QyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07WUFDaEIsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRO1lBQ3BCLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUTtZQUNwQixNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07U0FDakIsQ0FBQyxDQUFDLENBQUM7UUFFSiwwQkFBMEI7UUFDMUIsTUFBTSxPQUFPLEdBQUc7WUFDZCxrQ0FBa0M7WUFDbEMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUN2QixJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUM1RTtTQUNGLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWIsdUNBQXVDO1FBQ3ZDLE1BQU0sYUFBYSxHQUFHO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDNUMsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztZQUNoRCxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1lBQ2hELE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7U0FDM0MsQ0FBQztRQUVGLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN0RyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyRCxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZGLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQixDQUFDLFVBQW1CO1FBQ3BDLE1BQU0sTUFBTSxHQUFHLFVBQVUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUVwRCxNQUFNLFVBQVUsR0FBcUI7WUFDbkMsVUFBVSxFQUFFLE9BQU87WUFDbkIsVUFBVSxFQUFFLG1CQUFtQjtZQUMvQixVQUFVLEVBQUUsTUFBTTtZQUNsQixNQUFNLEVBQUUsQ0FBQztZQUNULFVBQVUsRUFBRSxFQUFFO1lBQ2QsWUFBWSxFQUFFLElBQUk7WUFDbEIsY0FBYyxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDO1lBQ3hELGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVk7WUFDdkMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO1lBQ3BDLDJCQUEyQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUztZQUNsRCwyQkFBMkIsRUFBRSxDQUFDO1lBQzlCLFlBQVksRUFBRSxHQUFHO1lBQ2pCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07WUFDMUIsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVztZQUNwQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQztZQUMxQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUM7U0FDdEMsQ0FBQztRQUVGLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUN4QixTQUFTLENBQUMsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUVELGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckYsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsc0JBQXNCLENBQUMsVUFBbUI7UUFDeEMsTUFBTSxNQUFNLEdBQUcsVUFBVSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBRXBELE1BQU0sTUFBTSxHQUFHOzs7Ozs7Y0FNTCxNQUFNOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3NCQTRCRSxNQUFNOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQW1DM0IsQ0FBQztRQUVFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUN4QixTQUFTLENBQUMsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDNUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVsQyxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVO1FBQ1IsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUs7UUFDSCxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNwQixDQUFDO0NBQ0Y7QUFnQ0Q7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBc0M7SUFDcEUsS0FBSyxFQUFFO1FBQ0wsV0FBVyxFQUFFLGlJQUFpSTtRQUM5SSxRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUM7UUFDbkgsUUFBUSxFQUFFO1lBQ1Isb0NBQW9DO1lBQ3BDLCtDQUErQztZQUMvQyxvREFBb0Q7WUFDcEQsZ0RBQWdEO1NBQ2pEO1FBQ0QsY0FBYyxFQUFFLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQztLQUMzQztJQUNELE1BQU0sRUFBRTtRQUNOLFdBQVcsRUFBRSx3SUFBd0k7UUFDckosUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQztRQUM5RyxRQUFRLEVBQUU7WUFDUixnREFBZ0Q7WUFDaEQsK0NBQStDO1lBQy9DLDJDQUEyQztZQUMzQyx1Q0FBdUM7U0FDeEM7UUFDRCxjQUFjLEVBQUUsQ0FBQyxVQUFVLENBQUM7S0FDN0I7SUFDRCxRQUFRLEVBQUU7UUFDUixXQUFXLEVBQUUscUdBQXFHO1FBQ2xILFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUM7UUFDOUYsUUFBUSxFQUFFO1lBQ1IsMENBQTBDO1lBQzFDLHVEQUF1RDtZQUN2RCwrQ0FBK0M7WUFDL0MsZ0RBQWdEO1NBQ2pEO1FBQ0QsY0FBYyxFQUFFLENBQUMsUUFBUSxFQUFFLG9CQUFvQixDQUFDO0tBQ2pEO0lBQ0QsVUFBVSxFQUFFO1FBQ1YsV0FBVyxFQUFFLG1HQUFtRztRQUNoSCxRQUFRLEVBQUUsQ0FBQyxVQUFVLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDO1FBQ3BHLFFBQVEsRUFBRTtZQUNSLG9EQUFvRDtZQUNwRCxxREFBcUQ7WUFDckQsNkNBQTZDO1lBQzdDLHFEQUFxRDtTQUN0RDtRQUNELGNBQWMsRUFBRSxDQUFDLFNBQVMsQ0FBQztLQUM1QjtJQUNELFNBQVMsRUFBRTtRQUNULFdBQVcsRUFBRSxrSEFBa0g7UUFDL0gsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQztRQUM5RixRQUFRLEVBQUU7WUFDUiw4Q0FBOEM7WUFDOUMsbURBQW1EO1lBQ25ELHdEQUF3RDtZQUN4RCxzREFBc0Q7U0FDdkQ7UUFDRCxjQUFjLEVBQUUsQ0FBQyxTQUFTLENBQUM7S0FDNUI7SUFDRCxRQUFRLEVBQUU7UUFDUixXQUFXLEVBQUUsaUdBQWlHO1FBQzlHLFFBQVEsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxjQUFjLENBQUM7UUFDekYsUUFBUSxFQUFFO1lBQ1IscURBQXFEO1lBQ3JELGdEQUFnRDtZQUNoRCwwREFBMEQ7WUFDMUQsdURBQXVEO1NBQ3hEO1FBQ0QsY0FBYyxFQUFFLENBQUMsT0FBTyxDQUFDO0tBQzFCO0lBQ0Qsb0JBQW9CLEVBQUU7UUFDcEIsV0FBVyxFQUFFLGtIQUFrSDtRQUMvSCxRQUFRLEVBQUUsQ0FBQyxVQUFVLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDO1FBQzdHLFFBQVEsRUFBRTtZQUNSLGlEQUFpRDtZQUNqRCxvREFBb0Q7WUFDcEQsK0NBQStDO1lBQy9DLHVEQUF1RDtTQUN4RDtRQUNELGNBQWMsRUFBRSxDQUFDLFVBQVUsQ0FBQztLQUM3QjtJQUNELFVBQVUsRUFBRTtRQUNWLFdBQVcsRUFBRSx1RkFBdUY7UUFDcEcsUUFBUSxFQUFFLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztRQUMvRixRQUFRLEVBQUU7WUFDUixnREFBZ0Q7WUFDaEQsZ0RBQWdEO1lBQ2hELDBDQUEwQztZQUMxQyw4Q0FBOEM7U0FDL0M7UUFDRCxjQUFjLEVBQUUsQ0FBQyxVQUFVLENBQUM7S0FDN0I7SUFDRCxVQUFVLEVBQUU7UUFDVixXQUFXLEVBQUUsNkdBQTZHO1FBQzFILFFBQVEsRUFBRSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUM7UUFDdkcsUUFBUSxFQUFFO1lBQ1IsZ0RBQWdEO1lBQ2hELHlDQUF5QztZQUN6Qyw0Q0FBNEM7WUFDNUMsb0RBQW9EO1NBQ3JEO1FBQ0QsY0FBYyxFQUFFLENBQUMsT0FBTyxDQUFDO0tBQzFCO0lBQ0QsU0FBUyxFQUFFO1FBQ1QsV0FBVyxFQUFFLHlHQUF5RztRQUN0SCxRQUFRLEVBQUUsQ0FBQyxVQUFVLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDO1FBQzlGLFFBQVEsRUFBRTtZQUNSLGlEQUFpRDtZQUNqRCw2Q0FBNkM7WUFDN0MsMENBQTBDO1lBQzFDLHNEQUFzRDtTQUN2RDtRQUNELGNBQWMsRUFBRSxDQUFDLFlBQVksQ0FBQztLQUMvQjtJQUNELE1BQU0sRUFBRTtRQUNOLFdBQVcsRUFBRSw4RkFBOEY7UUFDM0csUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixDQUFDO1FBQ3ZHLFFBQVEsRUFBRTtZQUNSLGlEQUFpRDtZQUNqRCxpREFBaUQ7WUFDakQsbURBQW1EO1lBQ25ELHFEQUFxRDtTQUN0RDtRQUNELGNBQWMsRUFBRSxFQUFFO0tBQ25CO0lBQ0QsVUFBVSxFQUFFO1FBQ1YsV0FBVyxFQUFFLHFHQUFxRztRQUNsSCxRQUFRLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUM7UUFDM0YsUUFBUSxFQUFFO1lBQ1IsaURBQWlEO1lBQ2pELDZDQUE2QztZQUM3Qyw4Q0FBOEM7WUFDOUMsNkNBQTZDO1NBQzlDO1FBQ0QsY0FBYyxFQUFFLENBQUMsWUFBWSxDQUFDO0tBQy9CO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsV0FBVyxFQUFFLGdHQUFnRztRQUM3RyxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxDQUFDO1FBQ3ZHLFFBQVEsRUFBRTtZQUNSLDZDQUE2QztZQUM3QywyQ0FBMkM7WUFDM0MsK0NBQStDO1lBQy9DLDBDQUEwQztTQUMzQztRQUNELGNBQWMsRUFBRSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUM7S0FDNUM7Q0FDRixDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCO0lBQ3JDLE1BQU0sUUFBUSxHQUFzQixFQUFFLENBQUM7SUFFdkMsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO1FBQ2hFLHNCQUFzQjtRQUN0QixLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwQyxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUNaLElBQUksRUFBRSxPQUFPO2dCQUNiLEtBQUs7Z0JBQ0wsVUFBVSxFQUFFLFFBQVE7YUFDckIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELG9DQUFvQztRQUNwQyxLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwQyxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUNaLElBQUksRUFBRSxHQUFHLE9BQU8sMkNBQTJDO2dCQUMzRCxLQUFLO2dCQUNMLFVBQVUsRUFBRSxLQUFLO2FBQ2xCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCx5Q0FBeUM7UUFDekMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsS0FBSyxNQUFNLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ2pELEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ2hELFFBQVEsQ0FBQyxJQUFJLENBQUM7d0JBQ1osSUFBSSxFQUFFLE9BQU87d0JBQ2IsS0FBSzt3QkFDTCxVQUFVLEVBQUUsTUFBTTt3QkFDbEIsY0FBYyxFQUFFLGNBQWM7cUJBQy9CLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QjtJQU10QyxNQUFNLEtBQUssR0FBbUYsRUFBRSxDQUFDO0lBQ2pHLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUVoRCxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7UUFDaEUsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEMsdUNBQXVDO1lBQ3ZDLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN4QixLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDM0MsS0FBSyxDQUFDLElBQUksQ0FBQzt3QkFDVCxNQUFNLEVBQUUsT0FBTzt3QkFDZixRQUFRLEVBQUUsS0FBSzt3QkFDZixRQUFRLEVBQUUsUUFBUTt3QkFDbEIsTUFBTSxFQUFFLElBQUk7cUJBQ2IsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1lBRUQsbUJBQW1CO1lBQ25CLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMvRCxLQUFLLE1BQU0sUUFBUSxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNsQyxLQUFLLENBQUMsSUFBSSxDQUFDO29CQUNULE1BQU0sRUFBRSxPQUFPO29CQUNmLFFBQVEsRUFBRSxLQUFLO29CQUNmLFFBQVEsRUFBRSxRQUFRO29CQUNsQixNQUFNLEVBQUUsS0FBSztpQkFDZCxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxlQUFlO0lBQzdCLE1BQU0sUUFBUSxHQUFHLHVCQUF1QixFQUFFLENBQUM7SUFDM0MsTUFBTSxLQUFLLEdBQUcsd0JBQXdCLEVBQUUsQ0FBQztJQUN6QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFFaEQsT0FBTztRQUNMLGFBQWEsRUFBRSxRQUFRLENBQUMsTUFBTTtRQUM5QixnQkFBZ0IsRUFBRSxLQUFLLENBQUMsTUFBTTtRQUM5QixVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDekIsTUFBTTtLQUNQLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIENvbnRyYXN0aXZlIEZpbmUtdHVuaW5nIGZvciBSdXZMVFJBIENsYXVkZSBDb2RlIFJvdXRlclxyXG4gKlxyXG4gKiBVc2VzIHRyaXBsZXQgbG9zcyB0byBmaW5lLXR1bmUgZW1iZWRkaW5nczpcclxuICogLSBBbmNob3I6IHRhc2sgZGVzY3JpcHRpb25cclxuICogLSBQb3NpdGl2ZTogY29ycmVjdCBhZ2VudCBkZXNjcmlwdGlvblxyXG4gKiAtIE5lZ2F0aXZlOiB3cm9uZyBhZ2VudCBkZXNjcmlwdGlvbiAoaGFyZCBuZWdhdGl2ZSlcclxuICpcclxuICogR29hbDogbWluaW1pemUgZGlzdGFuY2UoYW5jaG9yLCBwb3NpdGl2ZSkgYW5kIG1heGltaXplIGRpc3RhbmNlKGFuY2hvciwgbmVnYXRpdmUpXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogaW1wb3J0IHsgQ29udHJhc3RpdmVUcmFpbmVyLCB0cmlwbGV0TG9zcywgaW5mb05DRUxvc3MgfSBmcm9tICdAcnV2ZWN0b3IvcnV2bGxtJztcclxuICpcclxuICogY29uc3QgdHJhaW5lciA9IG5ldyBDb250cmFzdGl2ZVRyYWluZXIoe1xyXG4gKiAgIGVwb2NoczogMTAsXHJcbiAqICAgYmF0Y2hTaXplOiAxNixcclxuICogICBtYXJnaW46IDAuNSxcclxuICogfSk7XHJcbiAqXHJcbiAqIC8vIEFkZCB0cmlwbGV0c1xyXG4gKiB0cmFpbmVyLmFkZFRyaXBsZXQoYW5jaG9yRW1iLCBwb3NpdGl2ZUVtYiwgbmVnYXRpdmVFbWIsIHRydWUpO1xyXG4gKlxyXG4gKiAvLyBUcmFpbiBhbmQgZXhwb3J0XHJcbiAqIGNvbnN0IHJlc3VsdHMgPSB0cmFpbmVyLnRyYWluKCk7XHJcbiAqIHRyYWluZXIuZXhwb3J0VHJhaW5pbmdEYXRhKCcuL291dHB1dCcpO1xyXG4gKiBgYGBcclxuICovXHJcblxyXG5pbXBvcnQgeyB3cml0ZUZpbGVTeW5jLCBta2RpclN5bmMsIGV4aXN0c1N5bmMgfSBmcm9tICdmcyc7XHJcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoJztcclxuaW1wb3J0IHsgRW1iZWRkaW5nIH0gZnJvbSAnLi90eXBlcyc7XHJcblxyXG4vKipcclxuICogQ29udHJhc3RpdmUgdHJhaW5pbmcgY29uZmlndXJhdGlvblxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBDb250cmFzdGl2ZUNvbmZpZyB7XHJcbiAgLyoqIE51bWJlciBvZiB0cmFpbmluZyBlcG9jaHMgKGRlZmF1bHQ6IDEwKSAqL1xyXG4gIGVwb2Nocz86IG51bWJlcjtcclxuICAvKiogQmF0Y2ggc2l6ZSAoZGVmYXVsdDogMTYpICovXHJcbiAgYmF0Y2hTaXplPzogbnVtYmVyO1xyXG4gIC8qKiBMZWFybmluZyByYXRlIChkZWZhdWx0OiAwLjAwMDEpICovXHJcbiAgbGVhcm5pbmdSYXRlPzogbnVtYmVyO1xyXG4gIC8qKiBUcmlwbGV0IGxvc3MgbWFyZ2luIChkZWZhdWx0OiAwLjUpICovXHJcbiAgbWFyZ2luPzogbnVtYmVyO1xyXG4gIC8qKiBJbmZvTkNFIHRlbXBlcmF0dXJlIChkZWZhdWx0OiAwLjA3KSAqL1xyXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyO1xyXG4gIC8qKiBSYXRpbyBvZiBoYXJkIG5lZ2F0aXZlcyAoZGVmYXVsdDogMC43KSAqL1xyXG4gIGhhcmROZWdhdGl2ZVJhdGlvPzogbnVtYmVyO1xyXG4gIC8qKiBPdXRwdXQgZGlyZWN0b3J5IGZvciB0cmFpbmluZyBkYXRhICovXHJcbiAgb3V0cHV0UGF0aD86IHN0cmluZztcclxufVxyXG5cclxuLyoqXHJcbiAqIFRyYWluaW5nIHRyaXBsZXRcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVHJhaW5pbmdUcmlwbGV0IHtcclxuICAvKiogQW5jaG9yIGVtYmVkZGluZyAodGFzaykgKi9cclxuICBhbmNob3I6IHN0cmluZztcclxuICBhbmNob3JFbWI6IEVtYmVkZGluZztcclxuICAvKiogUG9zaXRpdmUgZXhhbXBsZSAoY29ycmVjdCBhZ2VudCkgKi9cclxuICBwb3NpdGl2ZTogc3RyaW5nO1xyXG4gIHBvc2l0aXZlRW1iOiBFbWJlZGRpbmc7XHJcbiAgLyoqIE5lZ2F0aXZlIGV4YW1wbGUgKHdyb25nIGFnZW50KSAqL1xyXG4gIG5lZ2F0aXZlOiBzdHJpbmc7XHJcbiAgbmVnYXRpdmVFbWI6IEVtYmVkZGluZztcclxuICAvKiogV2hldGhlciB0aGlzIGlzIGEgaGFyZCBuZWdhdGl2ZSAqL1xyXG4gIGlzSGFyZDogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFRyYWluaW5nIGhpc3RvcnkgZW50cnlcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVHJhaW5pbmdIaXN0b3J5RW50cnkge1xyXG4gIGVwb2NoOiBudW1iZXI7XHJcbiAgbG9zczogbnVtYmVyO1xyXG59XHJcblxyXG4vKipcclxuICogQ29udHJhc3RpdmUgdHJhaW5pbmcgcmVzdWx0c1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBDb250cmFzdGl2ZVRyYWluaW5nUmVzdWx0IHtcclxuICAvKiogVG90YWwgdHJpcGxldHMgdHJhaW5lZCBvbiAqL1xyXG4gIHRyaXBsZXRDb3VudDogbnVtYmVyO1xyXG4gIC8qKiBGaW5hbCBsb3NzIHZhbHVlICovXHJcbiAgZmluYWxMb3NzOiBudW1iZXI7XHJcbiAgLyoqIEluaXRpYWwgbG9zcyB2YWx1ZSAqL1xyXG4gIGluaXRpYWxMb3NzOiBudW1iZXI7XHJcbiAgLyoqIEltcHJvdmVtZW50IHBlcmNlbnRhZ2UgKi9cclxuICBpbXByb3ZlbWVudDogbnVtYmVyO1xyXG4gIC8qKiBUcmFpbmluZyBoaXN0b3J5ICovXHJcbiAgaGlzdG9yeTogVHJhaW5pbmdIaXN0b3J5RW50cnlbXTtcclxuICAvKiogRHVyYXRpb24gaW4gbXMgKi9cclxuICBkdXJhdGlvbk1zOiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBMb1JBIGNvbmZpZ3VyYXRpb24gZm9yIGZpbmUtdHVuaW5nXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIExvUkFFeHBvcnRDb25maWcge1xyXG4gIG1vZGVsX3R5cGU6IHN0cmluZztcclxuICBiYXNlX21vZGVsOiBzdHJpbmc7XHJcbiAgb3V0cHV0X2Rpcjogc3RyaW5nO1xyXG4gIGxvcmFfcjogbnVtYmVyO1xyXG4gIGxvcmFfYWxwaGE6IG51bWJlcjtcclxuICBsb3JhX2Ryb3BvdXQ6IG51bWJlcjtcclxuICB0YXJnZXRfbW9kdWxlczogc3RyaW5nW107XHJcbiAgbGVhcm5pbmdfcmF0ZTogbnVtYmVyO1xyXG4gIG51bV90cmFpbl9lcG9jaHM6IG51bWJlcjtcclxuICBwZXJfZGV2aWNlX3RyYWluX2JhdGNoX3NpemU6IG51bWJlcjtcclxuICBncmFkaWVudF9hY2N1bXVsYXRpb25fc3RlcHM6IG51bWJlcjtcclxuICB3YXJtdXBfcmF0aW86IG51bWJlcjtcclxuICBsb3NzX3R5cGU6IHN0cmluZztcclxuICBtYXJnaW46IG51bWJlcjtcclxuICB0ZW1wZXJhdHVyZTogbnVtYmVyO1xyXG4gIHRyYWluX2RhdGE6IHN0cmluZztcclxuICBldmFsX2RhdGE6IHN0cmluZztcclxufVxyXG5cclxuLyoqXHJcbiAqIERlZmF1bHQgY29udHJhc3RpdmUgY29uZmlnXHJcbiAqL1xyXG5jb25zdCBERUZBVUxUX0NPTlRSQVNUSVZFX0NPTkZJRzogUmVxdWlyZWQ8Q29udHJhc3RpdmVDb25maWc+ID0ge1xyXG4gIGVwb2NoczogMTAsXHJcbiAgYmF0Y2hTaXplOiAxNixcclxuICBsZWFybmluZ1JhdGU6IDAuMDAwMSxcclxuICBtYXJnaW46IDAuNSxcclxuICB0ZW1wZXJhdHVyZTogMC4wNyxcclxuICBoYXJkTmVnYXRpdmVSYXRpbzogMC43LFxyXG4gIG91dHB1dFBhdGg6ICcuL3RyYWluaW5nLW91dHB1dCcsXHJcbn07XHJcblxyXG4vKipcclxuICogQ29tcHV0ZSBjb3NpbmUgc2ltaWxhcml0eSBiZXR3ZWVuIHR3byBlbWJlZGRpbmdzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY29zaW5lU2ltaWxhcml0eShhOiBFbWJlZGRpbmcsIGI6IEVtYmVkZGluZyk6IG51bWJlciB7XHJcbiAgaWYgKCFhIHx8ICFiIHx8IGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIDA7XHJcbiAgbGV0IGRvdCA9IDAsIG5vcm1BID0gMCwgbm9ybUIgPSAwO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xyXG4gICAgZG90ICs9IGFbaV0gKiBiW2ldO1xyXG4gICAgbm9ybUEgKz0gYVtpXSAqIGFbaV07XHJcbiAgICBub3JtQiArPSBiW2ldICogYltpXTtcclxuICB9XHJcbiAgcmV0dXJuIGRvdCAvIChNYXRoLnNxcnQobm9ybUEpICogTWF0aC5zcXJ0KG5vcm1CKSB8fCAxKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbXB1dGUgdHJpcGxldCBsb3NzXHJcbiAqIEwgPSBtYXgoMCwgbWFyZ2luICsgZChhbmNob3IsIHBvc2l0aXZlKSAtIGQoYW5jaG9yLCBuZWdhdGl2ZSkpXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdHJpcGxldExvc3MoXHJcbiAgYW5jaG9yRW1iOiBFbWJlZGRpbmcsXHJcbiAgcG9zaXRpdmVFbWI6IEVtYmVkZGluZyxcclxuICBuZWdhdGl2ZUVtYjogRW1iZWRkaW5nLFxyXG4gIG1hcmdpbjogbnVtYmVyID0gMC41XHJcbik6IG51bWJlciB7XHJcbiAgY29uc3QgcG9zRGlzdCA9IDEgLSBjb3NpbmVTaW1pbGFyaXR5KGFuY2hvckVtYiwgcG9zaXRpdmVFbWIpO1xyXG4gIGNvbnN0IG5lZ0Rpc3QgPSAxIC0gY29zaW5lU2ltaWxhcml0eShhbmNob3JFbWIsIG5lZ2F0aXZlRW1iKTtcclxuICByZXR1cm4gTWF0aC5tYXgoMCwgbWFyZ2luICsgcG9zRGlzdCAtIG5lZ0Rpc3QpO1xyXG59XHJcblxyXG4vKipcclxuICogQ29tcHV0ZSBJbmZvTkNFIGxvc3MgKGNvbnRyYXN0aXZlKVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGluZm9OQ0VMb3NzKFxyXG4gIGFuY2hvckVtYjogRW1iZWRkaW5nLFxyXG4gIHBvc2l0aXZlRW1iOiBFbWJlZGRpbmcsXHJcbiAgbmVnYXRpdmVFbWJzOiBFbWJlZGRpbmdbXSxcclxuICB0ZW1wZXJhdHVyZTogbnVtYmVyID0gMC4wN1xyXG4pOiBudW1iZXIge1xyXG4gIGNvbnN0IHBvc1NpbSA9IGNvc2luZVNpbWlsYXJpdHkoYW5jaG9yRW1iLCBwb3NpdGl2ZUVtYikgLyB0ZW1wZXJhdHVyZTtcclxuICBjb25zdCBuZWdTaW1zID0gbmVnYXRpdmVFbWJzLm1hcChuZWcgPT4gY29zaW5lU2ltaWxhcml0eShhbmNob3JFbWIsIG5lZykgLyB0ZW1wZXJhdHVyZSk7XHJcblxyXG4gIC8vIFNvZnRtYXggZGVub21pbmF0b3JcclxuICBjb25zdCBtYXhTaW0gPSBNYXRoLm1heChwb3NTaW0sIC4uLm5lZ1NpbXMpO1xyXG4gIGNvbnN0IGV4cFBvcyA9IE1hdGguZXhwKHBvc1NpbSAtIG1heFNpbSk7XHJcbiAgY29uc3QgZXhwTmVncyA9IG5lZ1NpbXMubWFwKHNpbSA9PiBNYXRoLmV4cChzaW0gLSBtYXhTaW0pKTtcclxuICBjb25zdCBkZW5vbWluYXRvciA9IGV4cFBvcyArIGV4cE5lZ3MucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XHJcblxyXG4gIC8vIENyb3NzLWVudHJvcHkgbG9zc1xyXG4gIHJldHVybiAtTWF0aC5sb2coZXhwUG9zIC8gZGVub21pbmF0b3IpO1xyXG59XHJcblxyXG4vKipcclxuICogQ29tcHV0ZSBncmFkaWVudCBmb3IgZW1iZWRkaW5nIHVwZGF0ZSAoc2ltcGxpZmllZClcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlR3JhZGllbnQoXHJcbiAgYW5jaG9yRW1iOiBFbWJlZGRpbmcsXHJcbiAgcG9zaXRpdmVFbWI6IEVtYmVkZGluZyxcclxuICBuZWdhdGl2ZUVtYjogRW1iZWRkaW5nLFxyXG4gIGxyOiBudW1iZXIgPSAwLjAwMDFcclxuKTogRW1iZWRkaW5nIHtcclxuICBjb25zdCBkaW0gPSBhbmNob3JFbWIubGVuZ3RoO1xyXG4gIGNvbnN0IGdyYWRpZW50OiBudW1iZXJbXSA9IG5ldyBBcnJheShkaW0pLmZpbGwoMCk7XHJcblxyXG4gIC8vIFB1bGwgYW5jaG9yIHRvd2FyZHMgcG9zaXRpdmVcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbTsgaSsrKSB7XHJcbiAgICBncmFkaWVudFtpXSArPSBsciAqIChwb3NpdGl2ZUVtYltpXSAtIGFuY2hvckVtYltpXSk7XHJcbiAgfVxyXG5cclxuICAvLyBQdXNoIGFuY2hvciBhd2F5IGZyb20gbmVnYXRpdmVcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbTsgaSsrKSB7XHJcbiAgICBncmFkaWVudFtpXSAtPSBsciAqIDAuNSAqIChuZWdhdGl2ZUVtYltpXSAtIGFuY2hvckVtYltpXSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZ3JhZGllbnQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb250cmFzdGl2ZSBUcmFpbmVyIGZvciBSdXZMVFJBIG1vZGVsc1xyXG4gKlxyXG4gKiBJbXBsZW1lbnRzIHRyaXBsZXQgbG9zcyBhbmQgSW5mb05DRSBsb3NzIGZvciBlbWJlZGRpbmcgZmluZS10dW5pbmcuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ29udHJhc3RpdmVUcmFpbmVyIHtcclxuICBwcml2YXRlIGNvbmZpZzogUmVxdWlyZWQ8Q29udHJhc3RpdmVDb25maWc+O1xyXG4gIHByaXZhdGUgdHJpcGxldHM6IFRyYWluaW5nVHJpcGxldFtdID0gW107XHJcbiAgcHJpdmF0ZSBoaXN0b3J5OiBUcmFpbmluZ0hpc3RvcnlFbnRyeVtdID0gW107XHJcbiAgcHJpdmF0ZSBhZ2VudEVtYmVkZGluZ3M6IE1hcDxzdHJpbmcsIEVtYmVkZGluZz4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbmZpZz86IENvbnRyYXN0aXZlQ29uZmlnKSB7XHJcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4uREVGQVVMVF9DT05UUkFTVElWRV9DT05GSUcsIC4uLmNvbmZpZyB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkIGEgdHJhaW5pbmcgdHJpcGxldFxyXG4gICAqL1xyXG4gIGFkZFRyaXBsZXQoXHJcbiAgICBhbmNob3I6IHN0cmluZyxcclxuICAgIGFuY2hvckVtYjogRW1iZWRkaW5nLFxyXG4gICAgcG9zaXRpdmU6IHN0cmluZyxcclxuICAgIHBvc2l0aXZlRW1iOiBFbWJlZGRpbmcsXHJcbiAgICBuZWdhdGl2ZTogc3RyaW5nLFxyXG4gICAgbmVnYXRpdmVFbWI6IEVtYmVkZGluZyxcclxuICAgIGlzSGFyZDogYm9vbGVhbiA9IGZhbHNlXHJcbiAgKTogdm9pZCB7XHJcbiAgICB0aGlzLnRyaXBsZXRzLnB1c2goe1xyXG4gICAgICBhbmNob3IsXHJcbiAgICAgIGFuY2hvckVtYixcclxuICAgICAgcG9zaXRpdmUsXHJcbiAgICAgIHBvc2l0aXZlRW1iLFxyXG4gICAgICBuZWdhdGl2ZSxcclxuICAgICAgbmVnYXRpdmVFbWIsXHJcbiAgICAgIGlzSGFyZCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkIGFnZW50IGVtYmVkZGluZyBmb3IgcmVmZXJlbmNlXHJcbiAgICovXHJcbiAgYWRkQWdlbnRFbWJlZGRpbmcoYWdlbnROYW1lOiBzdHJpbmcsIGVtYmVkZGluZzogRW1iZWRkaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmFnZW50RW1iZWRkaW5ncy5zZXQoYWdlbnROYW1lLCBlbWJlZGRpbmcpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGFsbCBhZ2VudCBlbWJlZGRpbmdzXHJcbiAgICovXHJcbiAgZ2V0QWdlbnRFbWJlZGRpbmdzKCk6IE1hcDxzdHJpbmcsIEVtYmVkZGluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWdlbnRFbWJlZGRpbmdzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRyaXBsZXQgY291bnRcclxuICAgKi9cclxuICBnZXRUcmlwbGV0Q291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnRyaXBsZXRzLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNpbXVsYXRlIHRyYWluaW5nIChjb21wdXRlIGxvc3NlcyB3aXRob3V0IGFjdHVhbCBiYWNrcHJvcClcclxuICAgKiBJbiBhIGZ1bGwgaW1wbGVtZW50YXRpb24sIHRoaXMgd291bGQgdXNlIHByb3BlciBncmFkaWVudCBkZXNjZW50XHJcbiAgICovXHJcbiAgdHJhaW4oKTogQ29udHJhc3RpdmVUcmFpbmluZ1Jlc3VsdCB7XHJcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xyXG4gICAgY29uc3QgeyBlcG9jaHMsIGJhdGNoU2l6ZSwgbWFyZ2luIH0gPSB0aGlzLmNvbmZpZztcclxuXHJcbiAgICBpZiAodGhpcy50cmlwbGV0cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0cmlwbGV0Q291bnQ6IDAsXHJcbiAgICAgICAgZmluYWxMb3NzOiAwLFxyXG4gICAgICAgIGluaXRpYWxMb3NzOiAwLFxyXG4gICAgICAgIGltcHJvdmVtZW50OiAwLFxyXG4gICAgICAgIGhpc3Rvcnk6IFtdLFxyXG4gICAgICAgIGR1cmF0aW9uTXM6IDAsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgZXBvY2ggPSAwOyBlcG9jaCA8IGVwb2NoczsgZXBvY2grKykge1xyXG4gICAgICBsZXQgZXBvY2hMb3NzID0gMDtcclxuICAgICAgbGV0IGJhdGNoQ291bnQgPSAwO1xyXG5cclxuICAgICAgLy8gU2h1ZmZsZSB0cmlwbGV0c1xyXG4gICAgICBjb25zdCBzaHVmZmxlZCA9IFsuLi50aGlzLnRyaXBsZXRzXS5zb3J0KCgpID0+IE1hdGgucmFuZG9tKCkgLSAwLjUpO1xyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaHVmZmxlZC5sZW5ndGg7IGkgKz0gYmF0Y2hTaXplKSB7XHJcbiAgICAgICAgY29uc3QgYmF0Y2ggPSBzaHVmZmxlZC5zbGljZShpLCBpICsgYmF0Y2hTaXplKTtcclxuICAgICAgICBsZXQgYmF0Y2hMb3NzID0gMDtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCB0cmlwbGV0IG9mIGJhdGNoKSB7XHJcbiAgICAgICAgICBjb25zdCBsb3NzID0gdHJpcGxldExvc3MoXHJcbiAgICAgICAgICAgIHRyaXBsZXQuYW5jaG9yRW1iLFxyXG4gICAgICAgICAgICB0cmlwbGV0LnBvc2l0aXZlRW1iLFxyXG4gICAgICAgICAgICB0cmlwbGV0Lm5lZ2F0aXZlRW1iLFxyXG4gICAgICAgICAgICBtYXJnaW5cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBiYXRjaExvc3MgKz0gbG9zcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVwb2NoTG9zcyArPSBiYXRjaExvc3MgLyBiYXRjaC5sZW5ndGg7XHJcbiAgICAgICAgYmF0Y2hDb3VudCsrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBhdmdMb3NzID0gZXBvY2hMb3NzIC8gYmF0Y2hDb3VudDtcclxuICAgICAgdGhpcy5oaXN0b3J5LnB1c2goeyBlcG9jaDogZXBvY2ggKyAxLCBsb3NzOiBhdmdMb3NzIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGluaXRpYWxMb3NzID0gdGhpcy5oaXN0b3J5WzBdPy5sb3NzIHx8IDA7XHJcbiAgICBjb25zdCBmaW5hbExvc3MgPSB0aGlzLmhpc3RvcnlbdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDFdPy5sb3NzIHx8IDA7XHJcbiAgICBjb25zdCBpbXByb3ZlbWVudCA9IGluaXRpYWxMb3NzID4gMCA/ICgxIC0gZmluYWxMb3NzIC8gaW5pdGlhbExvc3MpICogMTAwIDogMDtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0cmlwbGV0Q291bnQ6IHRoaXMudHJpcGxldHMubGVuZ3RoLFxyXG4gICAgICBmaW5hbExvc3MsXHJcbiAgICAgIGluaXRpYWxMb3NzLFxyXG4gICAgICBpbXByb3ZlbWVudCxcclxuICAgICAgaGlzdG9yeTogdGhpcy5oaXN0b3J5LFxyXG4gICAgICBkdXJhdGlvbk1zOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEV4cG9ydCB0cmFpbmluZyBkYXRhIGZvciBleHRlcm5hbCBmaW5lLXR1bmluZyB0b29sc1xyXG4gICAqL1xyXG4gIGV4cG9ydFRyYWluaW5nRGF0YShvdXRwdXRQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG91dERpciA9IG91dHB1dFBhdGggfHwgdGhpcy5jb25maWcub3V0cHV0UGF0aDtcclxuXHJcbiAgICBpZiAoIWV4aXN0c1N5bmMob3V0RGlyKSkge1xyXG4gICAgICBta2RpclN5bmMob3V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBKU09OTCBmb3JtYXQgZm9yIGZpbmUtdHVuaW5nXHJcbiAgICBjb25zdCBqc29ubERhdGEgPSB0aGlzLnRyaXBsZXRzLm1hcCh0ID0+ICh7XHJcbiAgICAgIGFuY2hvcjogdC5hbmNob3IsXHJcbiAgICAgIHBvc2l0aXZlOiB0LnBvc2l0aXZlLFxyXG4gICAgICBuZWdhdGl2ZTogdC5uZWdhdGl2ZSxcclxuICAgICAgaXNIYXJkOiB0LmlzSGFyZCxcclxuICAgIH0pKTtcclxuXHJcbiAgICAvLyBDU1YgZm9ybWF0IGZvciBhbmFseXNpc1xyXG4gICAgY29uc3QgY3N2RGF0YSA9IFtcclxuICAgICAgJ2FuY2hvcixwb3NpdGl2ZSxuZWdhdGl2ZSxpc19oYXJkJyxcclxuICAgICAgLi4udGhpcy50cmlwbGV0cy5tYXAodCA9PlxyXG4gICAgICAgIGBcIiR7dC5hbmNob3IucmVwbGFjZSgvXCIvZywgJ1wiXCInKX1cIiwke3QucG9zaXRpdmV9LCR7dC5uZWdhdGl2ZX0sJHt0LmlzSGFyZH1gXHJcbiAgICAgICksXHJcbiAgICBdLmpvaW4oJ1xcbicpO1xyXG5cclxuICAgIC8vIEVtYmVkZGluZyBtYXRyaXggZm9yIGRpcmVjdCB0cmFpbmluZ1xyXG4gICAgY29uc3QgZW1iZWRkaW5nRGF0YSA9IHtcclxuICAgICAgYW5jaG9yczogdGhpcy50cmlwbGV0cy5tYXAodCA9PiB0LmFuY2hvckVtYiksXHJcbiAgICAgIHBvc2l0aXZlczogdGhpcy50cmlwbGV0cy5tYXAodCA9PiB0LnBvc2l0aXZlRW1iKSxcclxuICAgICAgbmVnYXRpdmVzOiB0aGlzLnRyaXBsZXRzLm1hcCh0ID0+IHQubmVnYXRpdmVFbWIpLFxyXG4gICAgICBsYWJlbHM6IHRoaXMudHJpcGxldHMubWFwKHQgPT4gdC5wb3NpdGl2ZSksXHJcbiAgICB9O1xyXG5cclxuICAgIHdyaXRlRmlsZVN5bmMoam9pbihvdXREaXIsICd0cmlwbGV0cy5qc29ubCcpLCBqc29ubERhdGEubWFwKGl0ZW0gPT4gSlNPTi5zdHJpbmdpZnkoaXRlbSkpLmpvaW4oJ1xcbicpKTtcclxuICAgIHdyaXRlRmlsZVN5bmMoam9pbihvdXREaXIsICd0cmlwbGV0cy5jc3YnKSwgY3N2RGF0YSk7XHJcbiAgICB3cml0ZUZpbGVTeW5jKGpvaW4ob3V0RGlyLCAnZW1iZWRkaW5ncy5qc29uJyksIEpTT04uc3RyaW5naWZ5KGVtYmVkZGluZ0RhdGEsIG51bGwsIDIpKTtcclxuXHJcbiAgICByZXR1cm4gb3V0RGlyO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgTG9SQSBhZGFwdGVyIGNvbmZpZ3VyYXRpb25cclxuICAgKi9cclxuICBnZW5lcmF0ZUxvUkFDb25maWcob3V0cHV0UGF0aD86IHN0cmluZyk6IExvUkFFeHBvcnRDb25maWcge1xyXG4gICAgY29uc3Qgb3V0RGlyID0gb3V0cHV0UGF0aCB8fCB0aGlzLmNvbmZpZy5vdXRwdXRQYXRoO1xyXG5cclxuICAgIGNvbnN0IGxvcmFDb25maWc6IExvUkFFeHBvcnRDb25maWcgPSB7XHJcbiAgICAgIG1vZGVsX3R5cGU6ICdxd2VuMicsXHJcbiAgICAgIGJhc2VfbW9kZWw6ICdRd2VuL1F3ZW4yLjUtMC41QicsXHJcbiAgICAgIG91dHB1dF9kaXI6IG91dERpcixcclxuICAgICAgbG9yYV9yOiA4LFxyXG4gICAgICBsb3JhX2FscGhhOiAxNixcclxuICAgICAgbG9yYV9kcm9wb3V0OiAwLjA1LFxyXG4gICAgICB0YXJnZXRfbW9kdWxlczogWydxX3Byb2onLCAndl9wcm9qJywgJ2tfcHJvaicsICdvX3Byb2onXSxcclxuICAgICAgbGVhcm5pbmdfcmF0ZTogdGhpcy5jb25maWcubGVhcm5pbmdSYXRlLFxyXG4gICAgICBudW1fdHJhaW5fZXBvY2hzOiB0aGlzLmNvbmZpZy5lcG9jaHMsXHJcbiAgICAgIHBlcl9kZXZpY2VfdHJhaW5fYmF0Y2hfc2l6ZTogdGhpcy5jb25maWcuYmF0Y2hTaXplLFxyXG4gICAgICBncmFkaWVudF9hY2N1bXVsYXRpb25fc3RlcHM6IDQsXHJcbiAgICAgIHdhcm11cF9yYXRpbzogMC4xLFxyXG4gICAgICBsb3NzX3R5cGU6ICd0cmlwbGV0JyxcclxuICAgICAgbWFyZ2luOiB0aGlzLmNvbmZpZy5tYXJnaW4sXHJcbiAgICAgIHRlbXBlcmF0dXJlOiB0aGlzLmNvbmZpZy50ZW1wZXJhdHVyZSxcclxuICAgICAgdHJhaW5fZGF0YTogam9pbihvdXREaXIsICd0cmlwbGV0cy5qc29ubCcpLFxyXG4gICAgICBldmFsX2RhdGE6IGpvaW4ob3V0RGlyLCAnZXZhbC5qc29ubCcpLFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoIWV4aXN0c1N5bmMob3V0RGlyKSkge1xyXG4gICAgICBta2RpclN5bmMob3V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICB3cml0ZUZpbGVTeW5jKGpvaW4ob3V0RGlyLCAnbG9yYV9jb25maWcuanNvbicpLCBKU09OLnN0cmluZ2lmeShsb3JhQ29uZmlnLCBudWxsLCAyKSk7XHJcbiAgICByZXR1cm4gbG9yYUNvbmZpZztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIHRyYWluaW5nIHNjcmlwdCBmb3IgZXh0ZXJuYWwgdG9vbHNcclxuICAgKi9cclxuICBnZW5lcmF0ZVRyYWluaW5nU2NyaXB0KG91dHB1dFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgb3V0RGlyID0gb3V0cHV0UGF0aCB8fCB0aGlzLmNvbmZpZy5vdXRwdXRQYXRoO1xyXG5cclxuICAgIGNvbnN0IHNjcmlwdCA9IGAjIS9iaW4vYmFzaFxyXG4jIFJ1dkxUUkEgRmluZS10dW5pbmcgU2NyaXB0XHJcbiMgUHJlcmVxdWlzaXRlczogcGlwIGluc3RhbGwgdHJhbnNmb3JtZXJzIHBlZnQgYWNjZWxlcmF0ZVxyXG5cclxuc2V0IC1lXHJcblxyXG5NT0RFTF9QQVRIPVwiJHtvdXREaXJ9XCJcclxuQkFTRV9NT0RFTD1cIlF3ZW4vUXdlbjIuNS0wLjVCXCJcclxuXHJcbmVjaG8gXCI9PT0gUnV2TFRSQSBDb250cmFzdGl2ZSBGaW5lLXR1bmluZyA9PT1cIlxyXG5lY2hvIFwiQmFzZSBtb2RlbDogJEJBU0VfTU9ERUxcIlxyXG5lY2hvIFwiT3V0cHV0OiAkTU9ERUxfUEFUSFwiXHJcblxyXG4jIENoZWNrIGZvciB0cmFpbmluZyBkYXRhXHJcbmlmIFsgISAtZiBcIiRNT0RFTF9QQVRIL3RyaXBsZXRzLmpzb25sXCIgXTsgdGhlblxyXG4gIGVjaG8gXCJFcnJvcjogVHJhaW5pbmcgZGF0YSBub3QgZm91bmQgYXQgJE1PREVMX1BBVEgvdHJpcGxldHMuanNvbmxcIlxyXG4gIGV4aXQgMVxyXG5maVxyXG5cclxuIyBJbnN0YWxsIGRlcGVuZGVuY2llcyBpZiBuZWVkZWRcclxucHl0aG9uMyAtYyBcImltcG9ydCB0cmFuc2Zvcm1lcnMsIHBlZnRcIiAyPi9kZXYvbnVsbCB8fCB7XHJcbiAgZWNobyBcIkluc3RhbGxpbmcgZGVwZW5kZW5jaWVzLi4uXCJcclxuICBwaXAgaW5zdGFsbCB0cmFuc2Zvcm1lcnMgcGVmdCBhY2NlbGVyYXRlIHNlbnRlbmNlcGllY2VcclxufVxyXG5cclxuIyBGaW5lLXR1bmUgd2l0aCBMb1JBXHJcbnB5dGhvbjMgPDwgJ1BZVEhPTidcclxuaW1wb3J0IGpzb25cclxuaW1wb3J0IHRvcmNoXHJcbmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aFxyXG5mcm9tIHRyYW5zZm9ybWVycyBpbXBvcnQgQXV0b01vZGVsRm9yQ2F1c2FsTE0sIEF1dG9Ub2tlbml6ZXJcclxuZnJvbSBwZWZ0IGltcG9ydCBMb3JhQ29uZmlnLCBnZXRfcGVmdF9tb2RlbCwgVGFza1R5cGVcclxuXHJcbiMgTG9hZCBjb25maWdcclxuY29uZmlnX3BhdGggPSBQYXRoKFwiJHtvdXREaXJ9L2xvcmFfY29uZmlnLmpzb25cIilcclxud2l0aCBvcGVuKGNvbmZpZ19wYXRoKSBhcyBmOlxyXG4gICAgY29uZmlnID0ganNvbi5sb2FkKGYpXHJcblxyXG5wcmludChmXCJMb2FkaW5nIGJhc2UgbW9kZWw6IHtjb25maWdbJ2Jhc2VfbW9kZWwnXX1cIilcclxuXHJcbiMgTG9hZCBtb2RlbCBhbmQgdG9rZW5pemVyXHJcbnRva2VuaXplciA9IEF1dG9Ub2tlbml6ZXIuZnJvbV9wcmV0cmFpbmVkKGNvbmZpZ1snYmFzZV9tb2RlbCddKVxyXG5tb2RlbCA9IEF1dG9Nb2RlbEZvckNhdXNhbExNLmZyb21fcHJldHJhaW5lZChcclxuICAgIGNvbmZpZ1snYmFzZV9tb2RlbCddLFxyXG4gICAgdG9yY2hfZHR5cGU9dG9yY2guZmxvYXQxNixcclxuICAgIGRldmljZV9tYXA9J2F1dG8nXHJcbilcclxuXHJcbiMgQ29uZmlndXJlIExvUkFcclxubG9yYV9jb25maWcgPSBMb3JhQ29uZmlnKFxyXG4gICAgcj1jb25maWdbJ2xvcmFfciddLFxyXG4gICAgbG9yYV9hbHBoYT1jb25maWdbJ2xvcmFfYWxwaGEnXSxcclxuICAgIGxvcmFfZHJvcG91dD1jb25maWdbJ2xvcmFfZHJvcG91dCddLFxyXG4gICAgdGFyZ2V0X21vZHVsZXM9Y29uZmlnWyd0YXJnZXRfbW9kdWxlcyddLFxyXG4gICAgdGFza190eXBlPVRhc2tUeXBlLkNBVVNBTF9MTSxcclxuKVxyXG5cclxubW9kZWwgPSBnZXRfcGVmdF9tb2RlbChtb2RlbCwgbG9yYV9jb25maWcpXHJcbm1vZGVsLnByaW50X3RyYWluYWJsZV9wYXJhbWV0ZXJzKClcclxuXHJcbnByaW50KFwiTW9kZWwgcmVhZHkgZm9yIGZpbmUtdHVuaW5nIVwiKVxyXG5wcmludChmXCJUcmFpbmluZyBkYXRhOiB7Y29uZmlnWyd0cmFpbl9kYXRhJ119XCIpXHJcbnByaW50KFwiTm90ZTogRnVsbCB0cmFpbmluZyByZXF1aXJlcyBHUFUuIFRoaXMgc2NyaXB0IHZhbGlkYXRlcyB0aGUgc2V0dXAuXCIpXHJcblBZVEhPTlxyXG5cclxuZWNobyBcIlwiXHJcbmVjaG8gXCI9PT0gU2V0dXAgQ29tcGxldGUgPT09XCJcclxuZWNobyBcIlRvIHRyYWluIG9uIEdQVSwgcnVuIHRoZSBmdWxsIHRyYWluaW5nIHBpcGVsaW5lLlwiXHJcbmVjaG8gXCJUcmFpbmluZyBkYXRhIGV4cG9ydGVkIHRvOiAkTU9ERUxfUEFUSC90cmlwbGV0cy5qc29ubFwiXHJcbmA7XHJcblxyXG4gICAgaWYgKCFleGlzdHNTeW5jKG91dERpcikpIHtcclxuICAgICAgbWtkaXJTeW5jKG91dERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2NyaXB0UGF0aCA9IGpvaW4ob3V0RGlyLCAndHJhaW4uc2gnKTtcclxuICAgIHdyaXRlRmlsZVN5bmMoc2NyaXB0UGF0aCwgc2NyaXB0KTtcclxuXHJcbiAgICByZXR1cm4gc2NyaXB0UGF0aDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0cmFpbmluZyBoaXN0b3J5XHJcbiAgICovXHJcbiAgZ2V0SGlzdG9yeSgpOiBUcmFpbmluZ0hpc3RvcnlFbnRyeVtdIHtcclxuICAgIHJldHVybiBbLi4udGhpcy5oaXN0b3J5XTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IHRyYWluZXJcclxuICAgKi9cclxuICByZXNldCgpOiB2b2lkIHtcclxuICAgIHRoaXMudHJpcGxldHMgPSBbXTtcclxuICAgIHRoaXMuaGlzdG9yeSA9IFtdO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEFnZW50IFRyYWluaW5nIERhdGEgSW50ZXJmYWNlXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEFnZW50VHJhaW5pbmdEYXRhIHtcclxuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xyXG4gIGtleXdvcmRzOiBzdHJpbmdbXTtcclxuICBleGFtcGxlczogc3RyaW5nW107XHJcbiAgY29uZnVzaW5nX3dpdGg/OiBzdHJpbmdbXTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFRyYWluaW5nIEV4YW1wbGUgSW50ZXJmYWNlXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFRyYWluaW5nRXhhbXBsZSB7XHJcbiAgdGFzazogc3RyaW5nO1xyXG4gIGFnZW50OiBzdHJpbmc7XHJcbiAgY29tcGxleGl0eT86IHN0cmluZztcclxuICBjb25mdXNpbmdfd2l0aD86IHN0cmluZztcclxufVxyXG5cclxuLyoqXHJcbiAqIERhdGFzZXQgU3RhdGlzdGljc1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBEYXRhc2V0U3RhdHMge1xyXG4gIHRvdGFsRXhhbXBsZXM6IG51bWJlcjtcclxuICBjb250cmFzdGl2ZVBhaXJzOiBudW1iZXI7XHJcbiAgYWdlbnRUeXBlczogbnVtYmVyO1xyXG4gIGFnZW50czogc3RyaW5nW107XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBZ2VudCBUcmFpbmluZyBEYXRhIGZvciBDbGF1ZGUgQ29kZSBSb3V0ZXJcclxuICovXHJcbmV4cG9ydCBjb25zdCBBR0VOVF9UUkFJTklOR19EQVRBOiBSZWNvcmQ8c3RyaW5nLCBBZ2VudFRyYWluaW5nRGF0YT4gPSB7XHJcbiAgY29kZXI6IHtcclxuICAgIGRlc2NyaXB0aW9uOiAnSW1wbGVtZW50YXRpb24gc3BlY2lhbGlzdCBmb3Igd3JpdGluZyBjbGVhbiwgZWZmaWNpZW50IGNvZGUuIEhhbmRsZXMgY29kaW5nIHRhc2tzLCBmZWF0dXJlIGltcGxlbWVudGF0aW9uLCBhbmQgY29kZSBnZW5lcmF0aW9uLicsXHJcbiAgICBrZXl3b3JkczogWydpbXBsZW1lbnQnLCAnY29kZScsICd3cml0ZScsICdidWlsZCcsICdjcmVhdGUnLCAnZGV2ZWxvcCcsICdmdW5jdGlvbicsICdjbGFzcycsICdjb21wb25lbnQnLCAnZmVhdHVyZSddLFxyXG4gICAgZXhhbXBsZXM6IFtcclxuICAgICAgJ0ltcGxlbWVudCBhIGJpbmFyeSBzZWFyY2ggZnVuY3Rpb24nLFxyXG4gICAgICAnV3JpdGUgYSBSZWFjdCBjb21wb25lbnQgZm9yIHVzZXIgcmVnaXN0cmF0aW9uJyxcclxuICAgICAgJ0NyZWF0ZSBhIFJFU1QgQVBJIGVuZHBvaW50IGZvciB1c2VyIGF1dGhlbnRpY2F0aW9uJyxcclxuICAgICAgJ0J1aWxkIGEgY2FjaGluZyBsYXllciBmb3IgdGhlIGRhdGFiYXNlIHF1ZXJpZXMnLFxyXG4gICAgXSxcclxuICAgIGNvbmZ1c2luZ193aXRoOiBbJ3JlZmFjdG9yZXInLCAnZGVidWdnZXInXSxcclxuICB9LFxyXG4gIHRlc3Rlcjoge1xyXG4gICAgZGVzY3JpcHRpb246ICdUZXN0aW5nIHNwZWNpYWxpc3QgZm9yIHdyaXRpbmcgYW5kIG1haW50YWluaW5nIHRlc3RzLiBDcmVhdGVzIHVuaXQgdGVzdHMsIGludGVncmF0aW9uIHRlc3RzLCBhbmQgZW5zdXJlcyBjb2RlIHF1YWxpdHkgdGhyb3VnaCB0ZXN0aW5nLicsXHJcbiAgICBrZXl3b3JkczogWyd0ZXN0JywgJ3VuaXQgdGVzdCcsICdpbnRlZ3JhdGlvbiB0ZXN0JywgJ2NvdmVyYWdlJywgJ21vY2snLCAnYXNzZXJ0aW9uJywgJ3NwZWMnLCAnamVzdCcsICdweXRlc3QnXSxcclxuICAgIGV4YW1wbGVzOiBbXHJcbiAgICAgICdXcml0ZSB1bml0IHRlc3RzIGZvciB0aGUgYXV0aGVudGljYXRpb24gbW9kdWxlJyxcclxuICAgICAgJ0FkZCBpbnRlZ3JhdGlvbiB0ZXN0cyBmb3IgdGhlIHBheW1lbnQgZ2F0ZXdheScsXHJcbiAgICAgICdDcmVhdGUgdGVzdCBjb3ZlcmFnZSBmb3IgdGhlIHVzZXIgc2VydmljZScsXHJcbiAgICAgICdXcml0ZSBlMmUgdGVzdHMgZm9yIHRoZSBjaGVja291dCBmbG93JyxcclxuICAgIF0sXHJcbiAgICBjb25mdXNpbmdfd2l0aDogWydyZXZpZXdlciddLFxyXG4gIH0sXHJcbiAgcmV2aWV3ZXI6IHtcclxuICAgIGRlc2NyaXB0aW9uOiAnQ29kZSByZXZpZXcgc3BlY2lhbGlzdCBmb3IgYW5hbHl6aW5nIGNvZGUgcXVhbGl0eSwgaWRlbnRpZnlpbmcgaXNzdWVzLCBhbmQgc3VnZ2VzdGluZyBpbXByb3ZlbWVudHMuJyxcclxuICAgIGtleXdvcmRzOiBbJ3JldmlldycsICdhbmFseXplJywgJ2NoZWNrJywgJ2luc3BlY3QnLCAnYXVkaXQnLCAnZXZhbHVhdGUnLCAnYXNzZXNzJywgJ2NyaXRpcXVlJ10sXHJcbiAgICBleGFtcGxlczogW1xyXG4gICAgICAnUmV2aWV3IHRoZSBwdWxsIHJlcXVlc3QgZm9yIGNvZGUgcXVhbGl0eScsXHJcbiAgICAgICdDaGVjayB0aGUgY29kZSBmb3IgcG90ZW50aWFsIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcycsXHJcbiAgICAgICdBbmFseXplIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgYmVzdCBwcmFjdGljZXMnLFxyXG4gICAgICAnRXZhbHVhdGUgdGhlIGFyY2hpdGVjdHVyZSBkZWNpc2lvbnMgaW4gdGhpcyBQUicsXHJcbiAgICBdLFxyXG4gICAgY29uZnVzaW5nX3dpdGg6IFsndGVzdGVyJywgJ3NlY3VyaXR5LWFyY2hpdGVjdCddLFxyXG4gIH0sXHJcbiAgcmVzZWFyY2hlcjoge1xyXG4gICAgZGVzY3JpcHRpb246ICdSZXNlYXJjaCBzcGVjaWFsaXN0IGZvciBpbnZlc3RpZ2F0aW5nIHRlY2hub2xvZ2llcywgZ2F0aGVyaW5nIGluZm9ybWF0aW9uLCBhbmQgYW5hbHl6aW5nIG9wdGlvbnMuJyxcclxuICAgIGtleXdvcmRzOiBbJ3Jlc2VhcmNoJywgJ2ludmVzdGlnYXRlJywgJ2V4cGxvcmUnLCAnYW5hbHl6ZScsICdzdHVkeScsICdjb21wYXJlJywgJ2V2YWx1YXRlJywgJ2xlYXJuJ10sXHJcbiAgICBleGFtcGxlczogW1xyXG4gICAgICAnUmVzZWFyY2ggYmVzdCBwcmFjdGljZXMgZm9yIFJlYWN0IHN0YXRlIG1hbmFnZW1lbnQnLFxyXG4gICAgICAnSW52ZXN0aWdhdGUgdGhlIHBlcmZvcm1hbmNlIGlzc3VlcyBpbiB0aGUgZGFzaGJvYXJkJyxcclxuICAgICAgJ0NvbXBhcmUgZGlmZmVyZW50IGF1dGhlbnRpY2F0aW9uIHN0cmF0ZWdpZXMnLFxyXG4gICAgICAnU3R1ZHkgdGhlIGNvZGViYXNlIGFyY2hpdGVjdHVyZSBmb3IgdGhlIG5ldyBmZWF0dXJlJyxcclxuICAgIF0sXHJcbiAgICBjb25mdXNpbmdfd2l0aDogWydwbGFubmVyJ10sXHJcbiAgfSxcclxuICBhcmNoaXRlY3Q6IHtcclxuICAgIGRlc2NyaXB0aW9uOiAnU3lzdGVtIGFyY2hpdGVjdCBmb3IgZGVzaWduaW5nIHNvZnR3YXJlIGFyY2hpdGVjdHVyZSwgbWFraW5nIHRlY2huaWNhbCBkZWNpc2lvbnMsIGFuZCBwbGFubmluZyBzeXN0ZW0gc3RydWN0dXJlLicsXHJcbiAgICBrZXl3b3JkczogWydkZXNpZ24nLCAnYXJjaGl0ZWN0JywgJ3N0cnVjdHVyZScsICdwbGFuJywgJ3NjaGVtYScsICdtb2RlbCcsICdwYXR0ZXJuJywgJ3N5c3RlbSddLFxyXG4gICAgZXhhbXBsZXM6IFtcclxuICAgICAgJ0Rlc2lnbiB0aGUgZGF0YWJhc2Ugc2NoZW1hIGZvciB1c2VyIHByb2ZpbGVzJyxcclxuICAgICAgJ1BsYW4gdGhlIGFyY2hpdGVjdHVyZSBmb3IgcmVhbC10aW1lIG5vdGlmaWNhdGlvbnMnLFxyXG4gICAgICAnQ3JlYXRlIGEgc3lzdGVtIGRlc2lnbiBmb3IgdGhlIG1pY3Jvc2VydmljZXMgbWlncmF0aW9uJyxcclxuICAgICAgJ0Rlc2lnbiB0aGUgQVBJIHN0cnVjdHVyZSBmb3IgdGhlIG5ldyBwcm9kdWN0IGNhdGFsb2cnLFxyXG4gICAgXSxcclxuICAgIGNvbmZ1c2luZ193aXRoOiBbJ3BsYW5uZXInXSxcclxuICB9LFxyXG4gIGRlYnVnZ2VyOiB7XHJcbiAgICBkZXNjcmlwdGlvbjogJ0RlYnVnZ2luZyBzcGVjaWFsaXN0IGZvciBmaW5kaW5nIGFuZCBmaXhpbmcgYnVncywgYW5hbHl6aW5nIGVycm9ycywgYW5kIHRyb3VibGVzaG9vdGluZyBpc3N1ZXMuJyxcclxuICAgIGtleXdvcmRzOiBbJ2RlYnVnJywgJ2ZpeCcsICdidWcnLCAnZXJyb3InLCAnaXNzdWUnLCAnY3Jhc2gnLCAnZXhjZXB0aW9uJywgJ3Ryb3VibGVzaG9vdCddLFxyXG4gICAgZXhhbXBsZXM6IFtcclxuICAgICAgJ0ZpeCB0aGUgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbiBpbiB0aGUgbG9naW4gaGFuZGxlcicsXHJcbiAgICAgICdEZWJ1ZyB0aGUgbWVtb3J5IGxlYWsgaW4gdGhlIFdlYlNvY2tldCBoYW5kbGVyJyxcclxuICAgICAgJ1Ryb3VibGVzaG9vdCB0aGUgcmFjZSBjb25kaXRpb24gaW4gdGhlIHBheW1lbnQgcHJvY2Vzc29yJyxcclxuICAgICAgJ0ZpbmQgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGludGVybWl0dGVudCB0ZXN0IGZhaWx1cmVzJyxcclxuICAgIF0sXHJcbiAgICBjb25mdXNpbmdfd2l0aDogWydjb2RlciddLFxyXG4gIH0sXHJcbiAgJ3NlY3VyaXR5LWFyY2hpdGVjdCc6IHtcclxuICAgIGRlc2NyaXB0aW9uOiAnU2VjdXJpdHkgc3BlY2lhbGlzdCBmb3IgYXVkaXRpbmcgY29kZSBzZWN1cml0eSwgaWRlbnRpZnlpbmcgdnVsbmVyYWJpbGl0aWVzLCBhbmQgaW1wbGVtZW50aW5nIHNlY3VyaXR5IG1lYXN1cmVzLicsXHJcbiAgICBrZXl3b3JkczogWydzZWN1cml0eScsICd2dWxuZXJhYmlsaXR5JywgJ3hzcycsICdzcWwgaW5qZWN0aW9uJywgJ2F1dGgnLCAnZW5jcnlwdGlvbicsICdhdWRpdCcsICdwZW5ldHJhdGlvbiddLFxyXG4gICAgZXhhbXBsZXM6IFtcclxuICAgICAgJ0F1ZGl0IHRoZSBBUEkgZW5kcG9pbnRzIGZvciBYU1MgdnVsbmVyYWJpbGl0aWVzJyxcclxuICAgICAgJ1JldmlldyB0aGUgYXV0aGVudGljYXRpb24gZmxvdyBmb3Igc2VjdXJpdHkgaXNzdWVzJyxcclxuICAgICAgJ0ltcGxlbWVudCBpbnB1dCB2YWxpZGF0aW9uIGZvciB0aGUgdXNlciBmb3JtcycsXHJcbiAgICAgICdDaGVjayBmb3IgU1FMIGluamVjdGlvbiB2dWxuZXJhYmlsaXRpZXMgaW4gdGhlIHNlYXJjaCcsXHJcbiAgICBdLFxyXG4gICAgY29uZnVzaW5nX3dpdGg6IFsncmV2aWV3ZXInXSxcclxuICB9LFxyXG4gIGRvY3VtZW50ZXI6IHtcclxuICAgIGRlc2NyaXB0aW9uOiAnRG9jdW1lbnRhdGlvbiBzcGVjaWFsaXN0IGZvciB3cml0aW5nIHRlY2huaWNhbCBkb2N1bWVudGF0aW9uLCBjb21tZW50cywgYW5kIEFQSSBkb2NzLicsXHJcbiAgICBrZXl3b3JkczogWydkb2N1bWVudCcsICdjb21tZW50JywgJ2pzZG9jJywgJ3JlYWRtZScsICdkb2NzJywgJ2V4cGxhaW4nLCAnZGVzY3JpYmUnLCAnYW5ub3RhdGUnXSxcclxuICAgIGV4YW1wbGVzOiBbXHJcbiAgICAgICdXcml0ZSBKU0RvYyBjb21tZW50cyBmb3IgdGhlIHV0aWxpdHkgZnVuY3Rpb25zJyxcclxuICAgICAgJ0NyZWF0ZSBSRUFETUUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIG5ldyBtb2R1bGUnLFxyXG4gICAgICAnRG9jdW1lbnQgdGhlIEFQSSBlbmRwb2ludHMgd2l0aCBleGFtcGxlcycsXHJcbiAgICAgICdBZGQgaW5saW5lIGNvbW1lbnRzIGV4cGxhaW5pbmcgdGhlIGFsZ29yaXRobScsXHJcbiAgICBdLFxyXG4gICAgY29uZnVzaW5nX3dpdGg6IFsnYXBpLWRvY3MnXSxcclxuICB9LFxyXG4gIHJlZmFjdG9yZXI6IHtcclxuICAgIGRlc2NyaXB0aW9uOiAnUmVmYWN0b3Jpbmcgc3BlY2lhbGlzdCBmb3IgaW1wcm92aW5nIGNvZGUgc3RydWN0dXJlLCBjbGVhbmluZyB1cCB0ZWNobmljYWwgZGVidCwgYW5kIG1vZGVybml6aW5nIGNvZGViYXNlcy4nLFxyXG4gICAga2V5d29yZHM6IFsncmVmYWN0b3InLCAnY2xlYW4nLCAncmVzdHJ1Y3R1cmUnLCAnbW9kZXJuaXplJywgJ2ltcHJvdmUnLCAnc2ltcGxpZnknLCAnZXh0cmFjdCcsICdyZW5hbWUnXSxcclxuICAgIGV4YW1wbGVzOiBbXHJcbiAgICAgICdSZWZhY3RvciB0aGUgcGF5bWVudCBtb2R1bGUgdG8gdXNlIGFzeW5jL2F3YWl0JyxcclxuICAgICAgJ0NsZWFuIHVwIHRoZSBsZWdhY3kgYXV0aGVudGljYXRpb24gY29kZScsXHJcbiAgICAgICdFeHRyYWN0IGNvbW1vbiBsb2dpYyBpbnRvIGEgc2hhcmVkIHV0aWxpdHknLFxyXG4gICAgICAnU2ltcGxpZnkgdGhlIGNvbXBsZXggY29uZGl0aW9uYWwgbG9naWMgaW4gY2hlY2tvdXQnLFxyXG4gICAgXSxcclxuICAgIGNvbmZ1c2luZ193aXRoOiBbJ2NvZGVyJ10sXHJcbiAgfSxcclxuICBvcHRpbWl6ZXI6IHtcclxuICAgIGRlc2NyaXB0aW9uOiAnUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHNwZWNpYWxpc3QgZm9yIGltcHJvdmluZyBzcGVlZCwgcmVkdWNpbmcgbWVtb3J5IHVzYWdlLCBhbmQgb3B0aW1pemluZyBxdWVyaWVzLicsXHJcbiAgICBrZXl3b3JkczogWydvcHRpbWl6ZScsICdwZXJmb3JtYW5jZScsICdzcGVlZCcsICdtZW1vcnknLCAnY2FjaGUnLCAnaW5kZXgnLCAncXVlcnknLCAnbGF0ZW5jeSddLFxyXG4gICAgZXhhbXBsZXM6IFtcclxuICAgICAgJ09wdGltaXplIHRoZSBkYXRhYmFzZSBxdWVyaWVzIGZvciB0aGUgZGFzaGJvYXJkJyxcclxuICAgICAgJ0ltcHJvdmUgdGhlIHBhZ2UgbG9hZCB0aW1lIGZvciB0aGUgaG9tZXBhZ2UnLFxyXG4gICAgICAnQWRkIGNhY2hpbmcgdG8gcmVkdWNlIEFQSSByZXNwb25zZSB0aW1lcycsXHJcbiAgICAgICdSZWR1Y2UgbWVtb3J5IHVzYWdlIGluIHRoZSBpbWFnZSBwcm9jZXNzaW5nIHBpcGVsaW5lJyxcclxuICAgIF0sXHJcbiAgICBjb25mdXNpbmdfd2l0aDogWydyZXNlYXJjaGVyJ10sXHJcbiAgfSxcclxuICBkZXZvcHM6IHtcclxuICAgIGRlc2NyaXB0aW9uOiAnRGV2T3BzIHNwZWNpYWxpc3QgZm9yIENJL0NEIHBpcGVsaW5lcywgZGVwbG95bWVudCBhdXRvbWF0aW9uLCBhbmQgaW5mcmFzdHJ1Y3R1cmUgbWFuYWdlbWVudC4nLFxyXG4gICAga2V5d29yZHM6IFsnZGVwbG95JywgJ2NpL2NkJywgJ3BpcGVsaW5lJywgJ2RvY2tlcicsICdrdWJlcm5ldGVzJywgJ3RlcnJhZm9ybScsICdhd3MnLCAnaW5mcmFzdHJ1Y3R1cmUnXSxcclxuICAgIGV4YW1wbGVzOiBbXHJcbiAgICAgICdTZXQgdXAgdGhlIENJL0NEIHBpcGVsaW5lIGZvciB0aGUgbWljcm9zZXJ2aWNlcycsXHJcbiAgICAgICdDb25maWd1cmUgRG9ja2VyIGNvbnRhaW5lcnMgZm9yIHRoZSBhcHBsaWNhdGlvbicsXHJcbiAgICAgICdEZXBsb3kgdGhlIGFwcGxpY2F0aW9uIHRvIHRoZSBzdGFnaW5nIGVudmlyb25tZW50JyxcclxuICAgICAgJ0NyZWF0ZSBUZXJyYWZvcm0gc2NyaXB0cyBmb3IgdGhlIEFXUyBpbmZyYXN0cnVjdHVyZScsXHJcbiAgICBdLFxyXG4gICAgY29uZnVzaW5nX3dpdGg6IFtdLFxyXG4gIH0sXHJcbiAgJ2FwaS1kb2NzJzoge1xyXG4gICAgZGVzY3JpcHRpb246ICdBUEkgZG9jdW1lbnRhdGlvbiBzcGVjaWFsaXN0IGZvciBjcmVhdGluZyBPcGVuQVBJIHNwZWNzLCBTd2FnZ2VyIGRvY3VtZW50YXRpb24sIGFuZCBBUEkgcmVmZXJlbmNlcy4nLFxyXG4gICAga2V5d29yZHM6IFsnb3BlbmFwaScsICdzd2FnZ2VyJywgJ2FwaSBkb2NzJywgJ2VuZHBvaW50JywgJ3NwZWNpZmljYXRpb24nLCAnc2NoZW1hJywgJ3Jlc3QnXSxcclxuICAgIGV4YW1wbGVzOiBbXHJcbiAgICAgICdHZW5lcmF0ZSBPcGVuQVBJIGRvY3VtZW50YXRpb24gZm9yIHRoZSBSRVNUIEFQSScsXHJcbiAgICAgICdDcmVhdGUgU3dhZ2dlciBzcGVjcyBmb3IgdGhlIHVzZXIgZW5kcG9pbnRzJyxcclxuICAgICAgJ0RvY3VtZW50IHRoZSBBUEkgYXV0aGVudGljYXRpb24gcmVxdWlyZW1lbnRzJyxcclxuICAgICAgJ1VwZGF0ZSB0aGUgQVBJIHJlZmVyZW5jZSB3aXRoIG5ldyBlbmRwb2ludHMnLFxyXG4gICAgXSxcclxuICAgIGNvbmZ1c2luZ193aXRoOiBbJ2RvY3VtZW50ZXInXSxcclxuICB9LFxyXG4gIHBsYW5uZXI6IHtcclxuICAgIGRlc2NyaXB0aW9uOiAnUHJvamVjdCBwbGFubmluZyBzcGVjaWFsaXN0IGZvciBjcmVhdGluZyB0YXNrIHBsYW5zLCBzcHJpbnQgcGxhbm5pbmcsIGFuZCByb2FkbWFwIGRldmVsb3BtZW50LicsXHJcbiAgICBrZXl3b3JkczogWydwbGFuJywgJ3JvYWRtYXAnLCAnc3ByaW50JywgJ21pbGVzdG9uZScsICd0aW1lbGluZScsICdlc3RpbWF0ZScsICdicmVha2Rvd24nLCAncHJpb3JpdGl6ZSddLFxyXG4gICAgZXhhbXBsZXM6IFtcclxuICAgICAgJ0NyZWF0ZSBhIHNwcmludCBwbGFuIGZvciB0aGUgbmV4dCB0d28gd2Vla3MnLFxyXG4gICAgICAnQnJlYWsgZG93biB0aGUgZmVhdHVyZSBpbnRvIHNtYWxsZXIgdGFza3MnLFxyXG4gICAgICAnRXN0aW1hdGUgdGhlIGVmZm9ydCBmb3IgdGhlIG1pZ3JhdGlvbiBwcm9qZWN0JyxcclxuICAgICAgJ1ByaW9yaXRpemUgdGhlIGJ1ZyBmaXhlcyBmb3IgdGhlIHJlbGVhc2UnLFxyXG4gICAgXSxcclxuICAgIGNvbmZ1c2luZ193aXRoOiBbJ2FyY2hpdGVjdCcsICdyZXNlYXJjaGVyJ10sXHJcbiAgfSxcclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZSB0cmFpbmluZyBkYXRhc2V0IGZyb20gYWdlbnQgZGF0YVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlVHJhaW5pbmdEYXRhc2V0KCk6IFRyYWluaW5nRXhhbXBsZVtdIHtcclxuICBjb25zdCBleGFtcGxlczogVHJhaW5pbmdFeGFtcGxlW10gPSBbXTtcclxuXHJcbiAgZm9yIChjb25zdCBbYWdlbnQsIGRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKEFHRU5UX1RSQUlOSU5HX0RBVEEpKSB7XHJcbiAgICAvLyBBZGQgZGlyZWN0IGV4YW1wbGVzXHJcbiAgICBmb3IgKGNvbnN0IGV4YW1wbGUgb2YgZGF0YS5leGFtcGxlcykge1xyXG4gICAgICBleGFtcGxlcy5wdXNoKHtcclxuICAgICAgICB0YXNrOiBleGFtcGxlLFxyXG4gICAgICAgIGFnZW50LFxyXG4gICAgICAgIGNvbXBsZXhpdHk6ICdtZWRpdW0nLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBHZW5lcmF0ZSB2YXJpYXRpb25zIHdpdGgga2V5d29yZHNcclxuICAgIGZvciAoY29uc3Qga2V5d29yZCBvZiBkYXRhLmtleXdvcmRzKSB7XHJcbiAgICAgIGV4YW1wbGVzLnB1c2goe1xyXG4gICAgICAgIHRhc2s6IGAke2tleXdvcmR9IGEgc29sdXRpb24gZm9yIHRoZSBhdXRoZW50aWNhdGlvbiBzeXN0ZW1gLFxyXG4gICAgICAgIGFnZW50LFxyXG4gICAgICAgIGNvbXBsZXhpdHk6ICdsb3cnLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBZGQgY29uZnVzaW5nIHBhaXJzIGZvciBoYXJkIG5lZ2F0aXZlc1xyXG4gICAgaWYgKGRhdGEuY29uZnVzaW5nX3dpdGgpIHtcclxuICAgICAgZm9yIChjb25zdCBjb25mdXNpbmdBZ2VudCBvZiBkYXRhLmNvbmZ1c2luZ193aXRoKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBleGFtcGxlIG9mIGRhdGEuZXhhbXBsZXMuc2xpY2UoMCwgMikpIHtcclxuICAgICAgICAgIGV4YW1wbGVzLnB1c2goe1xyXG4gICAgICAgICAgICB0YXNrOiBleGFtcGxlLFxyXG4gICAgICAgICAgICBhZ2VudCxcclxuICAgICAgICAgICAgY29tcGxleGl0eTogJ2hhcmQnLFxyXG4gICAgICAgICAgICBjb25mdXNpbmdfd2l0aDogY29uZnVzaW5nQWdlbnQsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBleGFtcGxlcztcclxufVxyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlIGNvbnRyYXN0aXZlIHBhaXJzIGZvciB0cmFpbmluZ1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQ29udHJhc3RpdmVQYWlycygpOiBBcnJheTx7XHJcbiAgYW5jaG9yOiBzdHJpbmc7XHJcbiAgcG9zaXRpdmU6IHN0cmluZztcclxuICBuZWdhdGl2ZTogc3RyaW5nO1xyXG4gIGlzSGFyZDogYm9vbGVhbjtcclxufT4ge1xyXG4gIGNvbnN0IHBhaXJzOiBBcnJheTx7IGFuY2hvcjogc3RyaW5nOyBwb3NpdGl2ZTogc3RyaW5nOyBuZWdhdGl2ZTogc3RyaW5nOyBpc0hhcmQ6IGJvb2xlYW4gfT4gPSBbXTtcclxuICBjb25zdCBhZ2VudHMgPSBPYmplY3Qua2V5cyhBR0VOVF9UUkFJTklOR19EQVRBKTtcclxuXHJcbiAgZm9yIChjb25zdCBbYWdlbnQsIGRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKEFHRU5UX1RSQUlOSU5HX0RBVEEpKSB7XHJcbiAgICBmb3IgKGNvbnN0IGV4YW1wbGUgb2YgZGF0YS5leGFtcGxlcykge1xyXG4gICAgICAvLyBIYXJkIG5lZ2F0aXZlcyBmcm9tIGNvbmZ1c2luZyBhZ2VudHNcclxuICAgICAgaWYgKGRhdGEuY29uZnVzaW5nX3dpdGgpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IG5lZ0FnZW50IG9mIGRhdGEuY29uZnVzaW5nX3dpdGgpIHtcclxuICAgICAgICAgIHBhaXJzLnB1c2goe1xyXG4gICAgICAgICAgICBhbmNob3I6IGV4YW1wbGUsXHJcbiAgICAgICAgICAgIHBvc2l0aXZlOiBhZ2VudCxcclxuICAgICAgICAgICAgbmVnYXRpdmU6IG5lZ0FnZW50LFxyXG4gICAgICAgICAgICBpc0hhcmQ6IHRydWUsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFJhbmRvbSBuZWdhdGl2ZXNcclxuICAgICAgY29uc3QgcmFuZG9tTmVncyA9IGFnZW50cy5maWx0ZXIoYSA9PiBhICE9PSBhZ2VudCkuc2xpY2UoMCwgMik7XHJcbiAgICAgIGZvciAoY29uc3QgbmVnQWdlbnQgb2YgcmFuZG9tTmVncykge1xyXG4gICAgICAgIHBhaXJzLnB1c2goe1xyXG4gICAgICAgICAgYW5jaG9yOiBleGFtcGxlLFxyXG4gICAgICAgICAgcG9zaXRpdmU6IGFnZW50LFxyXG4gICAgICAgICAgbmVnYXRpdmU6IG5lZ0FnZW50LFxyXG4gICAgICAgICAgaXNIYXJkOiBmYWxzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHBhaXJzO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0IGRhdGFzZXQgc3RhdGlzdGljc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGFzZXRTdGF0cygpOiBEYXRhc2V0U3RhdHMge1xyXG4gIGNvbnN0IGV4YW1wbGVzID0gZ2VuZXJhdGVUcmFpbmluZ0RhdGFzZXQoKTtcclxuICBjb25zdCBwYWlycyA9IGdlbmVyYXRlQ29udHJhc3RpdmVQYWlycygpO1xyXG4gIGNvbnN0IGFnZW50cyA9IE9iamVjdC5rZXlzKEFHRU5UX1RSQUlOSU5HX0RBVEEpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgdG90YWxFeGFtcGxlczogZXhhbXBsZXMubGVuZ3RoLFxyXG4gICAgY29udHJhc3RpdmVQYWlyczogcGFpcnMubGVuZ3RoLFxyXG4gICAgYWdlbnRUeXBlczogYWdlbnRzLmxlbmd0aCxcclxuICAgIGFnZW50cyxcclxuICB9O1xyXG59XHJcbiJdfQ==
|
|
578
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJhc3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udHJhc3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLElBQUksQ0FBQztBQUMxRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBeUY1Qjs7R0FFRztBQUNILE1BQU0sMEJBQTBCLEdBQWdDO0lBQzlELE1BQU0sRUFBRSxFQUFFO0lBQ1YsU0FBUyxFQUFFLEVBQUU7SUFDYixZQUFZLEVBQUUsTUFBTTtJQUNwQixNQUFNLEVBQUUsR0FBRztJQUNYLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLGlCQUFpQixFQUFFLEdBQUc7SUFDdEIsVUFBVSxFQUFFLG1CQUFtQjtDQUNoQyxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsQ0FBWSxFQUFFLENBQVk7SUFDekQsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEQsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNsQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2xDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25CLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLEtBQUssSUFB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LENBQUM7SUFFaEQsT0FBTztRQUNMLGFBQWEsRUFBRSxRQUFRLENBQUMsTUFBTTtRQUM5QixnQkFBZ0IsRUFBRSxLQUFLLENBQUMsTUFBTTtRQUM5QixVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDekIsTUFBTTtLQUNQLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb250cmFzdGl2ZSBGaW5lLXR1bmluZyBmb3IgUnV2TFRSQSBDbGF1ZGUgQ29kZSBSb3V0ZXJcbiAqXG4gKiBVc2VzIHRyaXBsZXQgbG9zcyB0byBmaW5lLXR1bmUgZW1iZWRkaW5nczpcbiAqIC0gQW5jaG9yOiB0YXNrIGRlc2NyaXB0aW9uXG4gKiAtIFBvc2l0aXZlOiBjb3JyZWN0IGFnZW50IGRlc2NyaXB0aW9uXG4gKiAtIE5lZ2F0aXZlOiB3cm9uZyBhZ2VudCBkZXNjcmlwdGlvbiAoaGFyZCBuZWdhdGl2ZSlcbiAqXG4gKiBHb2FsOiBtaW5pbWl6ZSBkaXN0YW5jZShhbmNob3IsIHBvc2l0aXZlKSBhbmQgbWF4aW1pemUgZGlzdGFuY2UoYW5jaG9yLCBuZWdhdGl2ZSlcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQ29udHJhc3RpdmVUcmFpbmVyLCB0cmlwbGV0TG9zcywgaW5mb05DRUxvc3MgfSBmcm9tICdAcnV2ZWN0b3IvcnV2bGxtJztcbiAqXG4gKiBjb25zdCB0cmFpbmVyID0gbmV3IENvbnRyYXN0aXZlVHJhaW5lcih7XG4gKiAgIGVwb2NoczogMTAsXG4gKiAgIGJhdGNoU2l6ZTogMTYsXG4gKiAgIG1hcmdpbjogMC41LFxuICogfSk7XG4gKlxuICogLy8gQWRkIHRyaXBsZXRzXG4gKiB0cmFpbmVyLmFkZFRyaXBsZXQoYW5jaG9yRW1iLCBwb3NpdGl2ZUVtYiwgbmVnYXRpdmVFbWIsIHRydWUpO1xuICpcbiAqIC8vIFRyYWluIGFuZCBleHBvcnRcbiAqIGNvbnN0IHJlc3VsdHMgPSB0cmFpbmVyLnRyYWluKCk7XG4gKiB0cmFpbmVyLmV4cG9ydFRyYWluaW5nRGF0YSgnLi9vdXRwdXQnKTtcbiAqIGBgYFxuICovXG5cbmltcG9ydCB7IHdyaXRlRmlsZVN5bmMsIG1rZGlyU3luYywgZXhpc3RzU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IEVtYmVkZGluZyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIENvbnRyYXN0aXZlIHRyYWluaW5nIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250cmFzdGl2ZUNvbmZpZyB7XG4gIC8qKiBOdW1iZXIgb2YgdHJhaW5pbmcgZXBvY2hzIChkZWZhdWx0OiAxMCkgKi9cbiAgZXBvY2hzPzogbnVtYmVyO1xuICAvKiogQmF0Y2ggc2l6ZSAoZGVmYXVsdDogMTYpICovXG4gIGJhdGNoU2l6ZT86IG51bWJlcjtcbiAgLyoqIExlYXJuaW5nIHJhdGUgKGRlZmF1bHQ6IDAuMDAwMSkgKi9cbiAgbGVhcm5pbmdSYXRlPzogbnVtYmVyO1xuICAvKiogVHJpcGxldCBsb3NzIG1hcmdpbiAoZGVmYXVsdDogMC41KSAqL1xuICBtYXJnaW4/OiBudW1iZXI7XG4gIC8qKiBJbmZvTkNFIHRlbXBlcmF0dXJlIChkZWZhdWx0OiAwLjA3KSAqL1xuICB0ZW1wZXJhdHVyZT86IG51bWJlcjtcbiAgLyoqIFJhdGlvIG9mIGhhcmQgbmVnYXRpdmVzIChkZWZhdWx0OiAwLjcpICovXG4gIGhhcmROZWdhdGl2ZVJhdGlvPzogbnVtYmVyO1xuICAvKiogT3V0cHV0IGRpcmVjdG9yeSBmb3IgdHJhaW5pbmcgZGF0YSAqL1xuICBvdXRwdXRQYXRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRyYWluaW5nIHRyaXBsZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFpbmluZ1RyaXBsZXQge1xuICAvKiogQW5jaG9yIGVtYmVkZGluZyAodGFzaykgKi9cbiAgYW5jaG9yOiBzdHJpbmc7XG4gIGFuY2hvckVtYjogRW1iZWRkaW5nO1xuICAvKiogUG9zaXRpdmUgZXhhbXBsZSAoY29ycmVjdCBhZ2VudCkgKi9cbiAgcG9zaXRpdmU6IHN0cmluZztcbiAgcG9zaXRpdmVFbWI6IEVtYmVkZGluZztcbiAgLyoqIE5lZ2F0aXZlIGV4YW1wbGUgKHdyb25nIGFnZW50KSAqL1xuICBuZWdhdGl2ZTogc3RyaW5nO1xuICBuZWdhdGl2ZUVtYjogRW1iZWRkaW5nO1xuICAvKiogV2hldGhlciB0aGlzIGlzIGEgaGFyZCBuZWdhdGl2ZSAqL1xuICBpc0hhcmQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogVHJhaW5pbmcgaGlzdG9yeSBlbnRyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYWluaW5nSGlzdG9yeUVudHJ5IHtcbiAgZXBvY2g6IG51bWJlcjtcbiAgbG9zczogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnRyYXN0aXZlIHRyYWluaW5nIHJlc3VsdHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250cmFzdGl2ZVRyYWluaW5nUmVzdWx0IHtcbiAgLyoqIFRvdGFsIHRyaXBsZXRzIHRyYWluZWQgb24gKi9cbiAgdHJpcGxldENvdW50OiBudW1iZXI7XG4gIC8qKiBGaW5hbCBsb3NzIHZhbHVlICovXG4gIGZpbmFsTG9zczogbnVtYmVyO1xuICAvKiogSW5pdGlhbCBsb3NzIHZhbHVlICovXG4gIGluaXRpYWxMb3NzOiBudW1iZXI7XG4gIC8qKiBJbXByb3ZlbWVudCBwZXJjZW50YWdlICovXG4gIGltcHJvdmVtZW50OiBudW1iZXI7XG4gIC8qKiBUcmFpbmluZyBoaXN0b3J5ICovXG4gIGhpc3Rvcnk6IFRyYWluaW5nSGlzdG9yeUVudHJ5W107XG4gIC8qKiBEdXJhdGlvbiBpbiBtcyAqL1xuICBkdXJhdGlvbk1zOiBudW1iZXI7XG59XG5cbi8qKlxuICogTG9SQSBjb25maWd1cmF0aW9uIGZvciBmaW5lLXR1bmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExvUkFFeHBvcnRDb25maWcge1xuICBtb2RlbF90eXBlOiBzdHJpbmc7XG4gIGJhc2VfbW9kZWw6IHN0cmluZztcbiAgb3V0cHV0X2Rpcjogc3RyaW5nO1xuICBsb3JhX3I6IG51bWJlcjtcbiAgbG9yYV9hbHBoYTogbnVtYmVyO1xuICBsb3JhX2Ryb3BvdXQ6IG51bWJlcjtcbiAgdGFyZ2V0X21vZHVsZXM6IHN0cmluZ1tdO1xuICBsZWFybmluZ19yYXRlOiBudW1iZXI7XG4gIG51bV90cmFpbl9lcG9jaHM6IG51bWJlcjtcbiAgcGVyX2RldmljZV90cmFpbl9iYXRjaF9zaXplOiBudW1iZXI7XG4gIGdyYWRpZW50X2FjY3VtdWxhdGlvbl9zdGVwczogbnVtYmVyO1xuICB3YXJtdXBfcmF0aW86IG51bWJlcjtcbiAgbG9zc190eXBlOiBzdHJpbmc7XG4gIG1hcmdpbjogbnVtYmVyO1xuICB0ZW1wZXJhdHVyZTogbnVtYmVyO1xuICB0cmFpbl9kYXRhOiBzdHJpbmc7XG4gIGV2YWxfZGF0YTogc3RyaW5nO1xufVxuXG4vKipcbiAqIERlZmF1bHQgY29udHJhc3RpdmUgY29uZmlnXG4gKi9cbmNvbnN0IERFRkFVTFRfQ09OVFJBU1RJVkVfQ09ORklHOiBSZXF1aXJlZDxDb250cmFzdGl2ZUNvbmZpZz4gPSB7XG4gIGVwb2NoczogMTAsXG4gIGJhdGNoU2l6ZTogMTYsXG4gIGxlYXJuaW5nUmF0ZTogMC4wMDAxLFxuICBtYXJnaW46IDAuNSxcbiAgdGVtcGVyYXR1cmU6IDAuMDcsXG4gIGhhcmROZWdhdGl2ZVJhdGlvOiAwLjcsXG4gIG91dHB1dFBhdGg6ICcuL3RyYWluaW5nLW91dHB1dCcsXG59O1xuXG4vKipcbiAqIENvbXB1dGUgY29zaW5lIHNpbWlsYXJpdHkgYmV0d2VlbiB0d28gZW1iZWRkaW5nc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29zaW5lU2ltaWxhcml0eShhOiBFbWJlZGRpbmcsIGI6IEVtYmVkZGluZyk6IG51bWJlciB7XG4gIGlmICghYSB8fCAhYiB8fCBhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiAwO1xuICBsZXQgZG90ID0gMCwgbm9ybUEgPSAwLCBub3JtQiA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgIGRvdCArPSBhW2ldICogYltpXTtcbiAgICBub3JtQSArPSBhW2ldICogYVtpXTtcbiAgICBub3JtQiArPSBiW2ldICogYltpXTtcbiAgfVxuICByZXR1cm4gZG90IC8gKE1hdGguc3FydChub3JtQSkgKiBNYXRoLnNxcnQobm9ybUIpIHx8IDEpO1xufVxuXG4vKipcbiAqIENvbXB1dGUgdHJpcGxldCBsb3NzXG4gKiBMID0gbWF4KDAsIG1hcmdpbiArIGQoYW5jaG9yLCBwb3NpdGl2ZSkgLSBkKGFuY2hvciwgbmVnYXRpdmUpKVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpcGxldExvc3MoXG4gIGFuY2hvckVtYjogRW1iZWRkaW5nLFxuICBwb3NpdGl2ZUVtYjogRW1iZWRkaW5nLFxuICBuZWdhdGl2ZUVtYjogRW1iZWRkaW5nLFxuICBtYXJnaW46IG51bWJlciA9IDAuNVxuKTogbnVtYmVyIHtcbiAgY29uc3QgcG9zRGlzdCA9IDEgLSBjb3NpbmVTaW1pbGFyaXR5KGFuY2hvckVtYiwgcG9zaXRpdmVFbWIpO1xuICBjb25zdCBuZWdEaXN0ID0gMSAtIGNvc2luZVNpbWlsYXJpdHkoYW5jaG9yRW1iLCBuZWdhdGl2ZUVtYik7XG4gIHJldHVybiBNYXRoLm1heCgwLCBtYXJnaW4gKyBwb3NEaXN0IC0gbmVnRGlzdCk7XG59XG5cbi8qKlxuICogQ29tcHV0ZSBJbmZvTkNFIGxvc3MgKGNvbnRyYXN0aXZlKVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5mb05DRUxvc3MoXG4gIGFuY2hvckVtYjogRW1iZWRkaW5nLFxuICBwb3NpdGl2ZUVtYjogRW1iZWRkaW5nLFxuICBuZWdhdGl2ZUVtYnM6IEVtYmVkZGluZ1tdLFxuICB0ZW1wZXJhdHVyZTogbnVtYmVyID0gMC4wN1xuKTogbnVtYmVyIHtcbiAgY29uc3QgcG9zU2ltID0gY29zaW5lU2ltaWxhcml0eShhbmNob3JFbWIsIHBvc2l0aXZlRW1iKSAvIHRlbXBlcmF0dXJlO1xuICBjb25zdCBuZWdTaW1zID0gbmVnYXRpdmVFbWJzLm1hcChuZWcgPT4gY29zaW5lU2ltaWxhcml0eShhbmNob3JFbWIsIG5lZykgLyB0ZW1wZXJhdHVyZSk7XG5cbiAgLy8gU29mdG1heCBkZW5vbWluYXRvclxuICBjb25zdCBtYXhTaW0gPSBNYXRoLm1heChwb3NTaW0sIC4uLm5lZ1NpbXMpO1xuICBjb25zdCBleHBQb3MgPSBNYXRoLmV4cChwb3NTaW0gLSBtYXhTaW0pO1xuICBjb25zdCBleHBOZWdzID0gbmVnU2ltcy5tYXAoc2ltID0+IE1hdGguZXhwKHNpbSAtIG1heFNpbSkpO1xuICBjb25zdCBkZW5vbWluYXRvciA9IGV4cFBvcyArIGV4cE5lZ3MucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG5cbiAgLy8gQ3Jvc3MtZW50cm9weSBsb3NzXG4gIHJldHVybiAtTWF0aC5sb2coZXhwUG9zIC8gZGVub21pbmF0b3IpO1xufVxuXG4vKipcbiAqIENvbXB1dGUgZ3JhZGllbnQgZm9yIGVtYmVkZGluZyB1cGRhdGUgKHNpbXBsaWZpZWQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlR3JhZGllbnQoXG4gIGFuY2hvckVtYjogRW1iZWRkaW5nLFxuICBwb3NpdGl2ZUVtYjogRW1iZWRkaW5nLFxuICBuZWdhdGl2ZUVtYjogRW1iZWRkaW5nLFxuICBscjogbnVtYmVyID0gMC4wMDAxXG4pOiBFbWJlZGRpbmcge1xuICBjb25zdCBkaW0gPSBhbmNob3JFbWIubGVuZ3RoO1xuICBjb25zdCBncmFkaWVudDogbnVtYmVyW10gPSBuZXcgQXJyYXkoZGltKS5maWxsKDApO1xuXG4gIC8vIFB1bGwgYW5jaG9yIHRvd2FyZHMgcG9zaXRpdmVcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaW07IGkrKykge1xuICAgIGdyYWRpZW50W2ldICs9IGxyICogKHBvc2l0aXZlRW1iW2ldIC0gYW5jaG9yRW1iW2ldKTtcbiAgfVxuXG4gIC8vIFB1c2ggYW5jaG9yIGF3YXkgZnJvbSBuZWdhdGl2ZVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbTsgaSsrKSB7XG4gICAgZ3JhZGllbnRbaV0gLT0gbHIgKiAwLjUgKiAobmVnYXRpdmVFbWJbaV0gLSBhbmNob3JFbWJbaV0pO1xuICB9XG5cbiAgcmV0dXJuIGdyYWRpZW50O1xufVxuXG4vKipcbiAqIENvbnRyYXN0aXZlIFRyYWluZXIgZm9yIFJ1dkxUUkEgbW9kZWxzXG4gKlxuICogSW1wbGVtZW50cyB0cmlwbGV0IGxvc3MgYW5kIEluZm9OQ0UgbG9zcyBmb3IgZW1iZWRkaW5nIGZpbmUtdHVuaW5nLlxuICovXG5leHBvcnQgY2xhc3MgQ29udHJhc3RpdmVUcmFpbmVyIHtcbiAgcHJpdmF0ZSBjb25maWc6IFJlcXVpcmVkPENvbnRyYXN0aXZlQ29uZmlnPjtcbiAgcHJpdmF0ZSB0cmlwbGV0czogVHJhaW5pbmdUcmlwbGV0W10gPSBbXTtcbiAgcHJpdmF0ZSBoaXN0b3J5OiBUcmFpbmluZ0hpc3RvcnlFbnRyeVtdID0gW107XG4gIHByaXZhdGUgYWdlbnRFbWJlZGRpbmdzOiBNYXA8c3RyaW5nLCBFbWJlZGRpbmc+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZz86IENvbnRyYXN0aXZlQ29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSB7IC4uLkRFRkFVTFRfQ09OVFJBU1RJVkVfQ09ORklHLCAuLi5jb25maWcgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSB0cmFpbmluZyB0cmlwbGV0XG4gICAqL1xuICBhZGRUcmlwbGV0KFxuICAgIGFuY2hvcjogc3RyaW5nLFxuICAgIGFuY2hvckVtYjogRW1iZWRkaW5nLFxuICAgIHBvc2l0aXZlOiBzdHJpbmcsXG4gICAgcG9zaXRpdmVFbWI6IEVtYmVkZGluZyxcbiAgICBuZWdhdGl2ZTogc3RyaW5nLFxuICAgIG5lZ2F0aXZlRW1iOiBFbWJlZGRpbmcsXG4gICAgaXNIYXJkOiBib29sZWFuID0gZmFsc2VcbiAgKTogdm9pZCB7XG4gICAgdGhpcy50cmlwbGV0cy5wdXNoKHtcbiAgICAgIGFuY2hvcixcbiAgICAgIGFuY2hvckVtYixcbiAgICAgIHBvc2l0aXZlLFxuICAgICAgcG9zaXRpdmVFbWIsXG4gICAgICBuZWdhdGl2ZSxcbiAgICAgIG5lZ2F0aXZlRW1iLFxuICAgICAgaXNIYXJkLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhZ2VudCBlbWJlZGRpbmcgZm9yIHJlZmVyZW5jZVxuICAgKi9cbiAgYWRkQWdlbnRFbWJlZGRpbmcoYWdlbnROYW1lOiBzdHJpbmcsIGVtYmVkZGluZzogRW1iZWRkaW5nKTogdm9pZCB7XG4gICAgdGhpcy5hZ2VudEVtYmVkZGluZ3Muc2V0KGFnZW50TmFtZSwgZW1iZWRkaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGFnZW50IGVtYmVkZGluZ3NcbiAgICovXG4gIGdldEFnZW50RW1iZWRkaW5ncygpOiBNYXA8c3RyaW5nLCBFbWJlZGRpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5hZ2VudEVtYmVkZGluZ3M7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyaXBsZXQgY291bnRcbiAgICovXG4gIGdldFRyaXBsZXRDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRyaXBsZXRzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW11bGF0ZSB0cmFpbmluZyAoY29tcHV0ZSBsb3NzZXMgd2l0aG91dCBhY3R1YWwgYmFja3Byb3ApXG4gICAqIEluIGEgZnVsbCBpbXBsZW1lbnRhdGlvbiwgdGhpcyB3b3VsZCB1c2UgcHJvcGVyIGdyYWRpZW50IGRlc2NlbnRcbiAgICovXG4gIHRyYWluKCk6IENvbnRyYXN0aXZlVHJhaW5pbmdSZXN1bHQge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgeyBlcG9jaHMsIGJhdGNoU2l6ZSwgbWFyZ2luIH0gPSB0aGlzLmNvbmZpZztcblxuICAgIGlmICh0aGlzLnRyaXBsZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHJpcGxldENvdW50OiAwLFxuICAgICAgICBmaW5hbExvc3M6IDAsXG4gICAgICAgIGluaXRpYWxMb3NzOiAwLFxuICAgICAgICBpbXByb3ZlbWVudDogMCxcbiAgICAgICAgaGlzdG9yeTogW10sXG4gICAgICAgIGR1cmF0aW9uTXM6IDAsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGZvciAobGV0IGVwb2NoID0gMDsgZXBvY2ggPCBlcG9jaHM7IGVwb2NoKyspIHtcbiAgICAgIGxldCBlcG9jaExvc3MgPSAwO1xuICAgICAgbGV0IGJhdGNoQ291bnQgPSAwO1xuXG4gICAgICAvLyBTaHVmZmxlIHRyaXBsZXRzXG4gICAgICBjb25zdCBzaHVmZmxlZCA9IFsuLi50aGlzLnRyaXBsZXRzXS5zb3J0KCgpID0+IE1hdGgucmFuZG9tKCkgLSAwLjUpO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNodWZmbGVkLmxlbmd0aDsgaSArPSBiYXRjaFNpemUpIHtcbiAgICAgICAgY29uc3QgYmF0Y2ggPSBzaHVmZmxlZC5zbGljZShpLCBpICsgYmF0Y2hTaXplKTtcbiAgICAgICAgbGV0IGJhdGNoTG9zcyA9IDA7XG5cbiAgICAgICAgZm9yIChjb25zdCB0cmlwbGV0IG9mIGJhdGNoKSB7XG4gICAgICAgICAgY29uc3QgbG9zcyA9IHRyaXBsZXRMb3NzKFxuICAgICAgICAgICAgdHJpcGxldC5hbmNob3JFbWIsXG4gICAgICAgICAgICB0cmlwbGV0LnBvc2l0aXZlRW1iLFxuICAgICAgICAgICAgdHJpcGxldC5uZWdhdGl2ZUVtYixcbiAgICAgICAgICAgIG1hcmdpblxuICAgICAgICAgICk7XG4gICAgICAgICAgYmF0Y2hMb3NzICs9IGxvc3M7XG4gICAgICAgIH1cblxuICAgICAgICBlcG9jaExvc3MgKz0gYmF0Y2hMb3NzIC8gYmF0Y2gubGVuZ3RoO1xuICAgICAgICBiYXRjaENvdW50Kys7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGF2Z0xvc3MgPSBlcG9jaExvc3MgLyBiYXRjaENvdW50O1xuICAgICAgdGhpcy5oaXN0b3J5LnB1c2goeyBlcG9jaDogZXBvY2ggKyAxLCBsb3NzOiBhdmdMb3NzIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGluaXRpYWxMb3NzID0gdGhpcy5oaXN0b3J5WzBdPy5sb3NzIHx8IDA7XG4gICAgY29uc3QgZmluYWxMb3NzID0gdGhpcy5oaXN0b3J5W3RoaXMuaGlzdG9yeS5sZW5ndGggLSAxXT8ubG9zcyB8fCAwO1xuICAgIGNvbnN0IGltcHJvdmVtZW50ID0gaW5pdGlhbExvc3MgPiAwID8gKDEgLSBmaW5hbExvc3MgLyBpbml0aWFsTG9zcykgKiAxMDAgOiAwO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRyaXBsZXRDb3VudDogdGhpcy50cmlwbGV0cy5sZW5ndGgsXG4gICAgICBmaW5hbExvc3MsXG4gICAgICBpbml0aWFsTG9zcyxcbiAgICAgIGltcHJvdmVtZW50LFxuICAgICAgaGlzdG9yeTogdGhpcy5oaXN0b3J5LFxuICAgICAgZHVyYXRpb25NczogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCB0cmFpbmluZyBkYXRhIGZvciBleHRlcm5hbCBmaW5lLXR1bmluZyB0b29sc1xuICAgKi9cbiAgZXhwb3J0VHJhaW5pbmdEYXRhKG91dHB1dFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG91dERpciA9IG91dHB1dFBhdGggfHwgdGhpcy5jb25maWcub3V0cHV0UGF0aDtcblxuICAgIGlmICghZXhpc3RzU3luYyhvdXREaXIpKSB7XG4gICAgICBta2RpclN5bmMob3V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBKU09OTCBmb3JtYXQgZm9yIGZpbmUtdHVuaW5nXG4gICAgY29uc3QganNvbmxEYXRhID0gdGhpcy50cmlwbGV0cy5tYXAodCA9PiAoe1xuICAgICAgYW5jaG9yOiB0LmFuY2hvcixcbiAgICAgIHBvc2l0aXZlOiB0LnBvc2l0aXZlLFxuICAgICAgbmVnYXRpdmU6IHQubmVnYXRpdmUsXG4gICAgICBpc0hhcmQ6IHQuaXNIYXJkLFxuICAgIH0pKTtcblxuICAgIC8vIENTViBmb3JtYXQgZm9yIGFuYWx5c2lzXG4gICAgY29uc3QgY3N2RGF0YSA9IFtcbiAgICAgICdhbmNob3IscG9zaXRpdmUsbmVnYXRpdmUsaXNfaGFyZCcsXG4gICAgICAuLi50aGlzLnRyaXBsZXRzLm1hcCh0ID0+XG4gICAgICAgIGBcIiR7dC5hbmNob3IucmVwbGFjZSgvXCIvZywgJ1wiXCInKX1cIiwke3QucG9zaXRpdmV9LCR7dC5uZWdhdGl2ZX0sJHt0LmlzSGFyZH1gXG4gICAgICApLFxuICAgIF0uam9pbignXFxuJyk7XG5cbiAgICAvLyBFbWJlZGRpbmcgbWF0cml4IGZvciBkaXJlY3QgdHJhaW5pbmdcbiAgICBjb25zdCBlbWJlZGRpbmdEYXRhID0ge1xuICAgICAgYW5jaG9yczogdGhpcy50cmlwbGV0cy5tYXAodCA9PiB0LmFuY2hvckVtYiksXG4gICAgICBwb3NpdGl2ZXM6IHRoaXMudHJpcGxldHMubWFwKHQgPT4gdC5wb3NpdGl2ZUVtYiksXG4gICAgICBuZWdhdGl2ZXM6IHRoaXMudHJpcGxldHMubWFwKHQgPT4gdC5uZWdhdGl2ZUVtYiksXG4gICAgICBsYWJlbHM6IHRoaXMudHJpcGxldHMubWFwKHQgPT4gdC5wb3NpdGl2ZSksXG4gICAgfTtcblxuICAgIHdyaXRlRmlsZVN5bmMoam9pbihvdXREaXIsICd0cmlwbGV0cy5qc29ubCcpLCBqc29ubERhdGEubWFwKGl0ZW0gPT4gSlNPTi5zdHJpbmdpZnkoaXRlbSkpLmpvaW4oJ1xcbicpKTtcbiAgICB3cml0ZUZpbGVTeW5jKGpvaW4ob3V0RGlyLCAndHJpcGxldHMuY3N2JyksIGNzdkRhdGEpO1xuICAgIHdyaXRlRmlsZVN5bmMoam9pbihvdXREaXIsICdlbWJlZGRpbmdzLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkoZW1iZWRkaW5nRGF0YSwgbnVsbCwgMikpO1xuXG4gICAgcmV0dXJuIG91dERpcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBMb1JBIGFkYXB0ZXIgY29uZmlndXJhdGlvblxuICAgKi9cbiAgZ2VuZXJhdGVMb1JBQ29uZmlnKG91dHB1dFBhdGg/OiBzdHJpbmcpOiBMb1JBRXhwb3J0Q29uZmlnIHtcbiAgICBjb25zdCBvdXREaXIgPSBvdXRwdXRQYXRoIHx8IHRoaXMuY29uZmlnLm91dHB1dFBhdGg7XG5cbiAgICBjb25zdCBsb3JhQ29uZmlnOiBMb1JBRXhwb3J0Q29uZmlnID0ge1xuICAgICAgbW9kZWxfdHlwZTogJ3F3ZW4yJyxcbiAgICAgIGJhc2VfbW9kZWw6ICdRd2VuL1F3ZW4yLjUtMC41QicsXG4gICAgICBvdXRwdXRfZGlyOiBvdXREaXIsXG4gICAgICBsb3JhX3I6IDgsXG4gICAgICBsb3JhX2FscGhhOiAxNixcbiAgICAgIGxvcmFfZHJvcG91dDogMC4wNSxcbiAgICAgIHRhcmdldF9tb2R1bGVzOiBbJ3FfcHJvaicsICd2X3Byb2onLCAna19wcm9qJywgJ29fcHJvaiddLFxuICAgICAgbGVhcm5pbmdfcmF0ZTogdGhpcy5jb25maWcubGVhcm5pbmdSYXRlLFxuICAgICAgbnVtX3RyYWluX2Vwb2NoczogdGhpcy5jb25maWcuZXBvY2hzLFxuICAgICAgcGVyX2RldmljZV90cmFpbl9iYXRjaF9zaXplOiB0aGlzLmNvbmZpZy5iYXRjaFNpemUsXG4gICAgICBncmFkaWVudF9hY2N1bXVsYXRpb25fc3RlcHM6IDQsXG4gICAgICB3YXJtdXBfcmF0aW86IDAuMSxcbiAgICAgIGxvc3NfdHlwZTogJ3RyaXBsZXQnLFxuICAgICAgbWFyZ2luOiB0aGlzLmNvbmZpZy5tYXJnaW4sXG4gICAgICB0ZW1wZXJhdHVyZTogdGhpcy5jb25maWcudGVtcGVyYXR1cmUsXG4gICAgICB0cmFpbl9kYXRhOiBqb2luKG91dERpciwgJ3RyaXBsZXRzLmpzb25sJyksXG4gICAgICBldmFsX2RhdGE6IGpvaW4ob3V0RGlyLCAnZXZhbC5qc29ubCcpLFxuICAgIH07XG5cbiAgICBpZiAoIWV4aXN0c1N5bmMob3V0RGlyKSkge1xuICAgICAgbWtkaXJTeW5jKG91dERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgd3JpdGVGaWxlU3luYyhqb2luKG91dERpciwgJ2xvcmFfY29uZmlnLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkobG9yYUNvbmZpZywgbnVsbCwgMikpO1xuICAgIHJldHVybiBsb3JhQ29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHRyYWluaW5nIHNjcmlwdCBmb3IgZXh0ZXJuYWwgdG9vbHNcbiAgICovXG4gIGdlbmVyYXRlVHJhaW5pbmdTY3JpcHQob3V0cHV0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgb3V0RGlyID0gb3V0cHV0UGF0aCB8fCB0aGlzLmNvbmZpZy5vdXRwdXRQYXRoO1xuXG4gICAgY29uc3Qgc2NyaXB0ID0gYCMhL2Jpbi9iYXNoXG4jIFJ1dkxUUkEgRmluZS10dW5pbmcgU2NyaXB0XG4jIFByZXJlcXVpc2l0ZXM6IHBpcCBpbnN0YWxsIHRyYW5zZm9ybWVycyBwZWZ0IGFjY2VsZXJhdGVcblxuc2V0IC1lXG5cbk1PREVMX1BBVEg9XCIke291dERpcn1cIlxuQkFTRV9NT0RFTD1cIlF3ZW4vUXdlbjIuNS0wLjVCXCJcblxuZWNobyBcIj09PSBSdXZMVFJBIENvbnRyYXN0aXZlIEZpbmUtdHVuaW5nID09PVwiXG5lY2hvIFwiQmFzZSBtb2RlbDogJEJBU0VfTU9ERUxcIlxuZWNobyBcIk91dHB1dDogJE1PREVMX1BBVEhcIlxuXG4jIENoZWNrIGZvciB0cmFpbmluZyBkYXRhXG5pZiBbICEgLWYgXCIkTU9ERUxfUEFUSC90cmlwbGV0cy5qc29ubFwiIF07IHRoZW5cbiAgZWNobyBcIkVycm9yOiBUcmFpbmluZyBkYXRhIG5vdCBmb3VuZCBhdCAkTU9ERUxfUEFUSC90cmlwbGV0cy5qc29ubFwiXG4gIGV4aXQgMVxuZmlcblxuIyBJbnN0YWxsIGRlcGVuZGVuY2llcyBpZiBuZWVkZWRcbnB5dGhvbjMgLWMgXCJpbXBvcnQgdHJhbnNmb3JtZXJzLCBwZWZ0XCIgMj4vZGV2L251bGwgfHwge1xuICBlY2hvIFwiSW5zdGFsbGluZyBkZXBlbmRlbmNpZXMuLi5cIlxuICBwaXAgaW5zdGFsbCB0cmFuc2Zvcm1lcnMgcGVmdCBhY2NlbGVyYXRlIHNlbnRlbmNlcGllY2Vcbn1cblxuIyBGaW5lLXR1bmUgd2l0aCBMb1JBXG5weXRob24zIDw8ICdQWVRIT04nXG5pbXBvcnQganNvblxuaW1wb3J0IHRvcmNoXG5mcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGhcbmZyb20gdHJhbnNmb3JtZXJzIGltcG9ydCBBdXRvTW9kZWxGb3JDYXVzYWxMTSwgQXV0b1Rva2VuaXplclxuZnJvbSBwZWZ0IGltcG9ydCBMb3JhQ29uZmlnLCBnZXRfcGVmdF9tb2RlbCwgVGFza1R5cGVcblxuIyBMb2FkIGNvbmZpZ1xuY29uZmlnX3BhdGggPSBQYXRoKFwiJHtvdXREaXJ9L2xvcmFfY29uZmlnLmpzb25cIilcbndpdGggb3Blbihjb25maWdfcGF0aCkgYXMgZjpcbiAgICBjb25maWcgPSBqc29uLmxvYWQoZilcblxucHJpbnQoZlwiTG9hZGluZyBiYXNlIG1vZGVsOiB7Y29uZmlnWydiYXNlX21vZGVsJ119XCIpXG5cbiMgTG9hZCBtb2RlbCBhbmQgdG9rZW5pemVyXG50b2tlbml6ZXIgPSBBdXRvVG9rZW5pemVyLmZyb21fcHJldHJhaW5lZChjb25maWdbJ2Jhc2VfbW9kZWwnXSlcbm1vZGVsID0gQXV0b01vZGVsRm9yQ2F1c2FsTE0uZnJvbV9wcmV0cmFpbmVkKFxuICAgIGNvbmZpZ1snYmFzZV9tb2RlbCddLFxuICAgIHRvcmNoX2R0eXBlPXRvcmNoLmZsb2F0MTYsXG4gICAgZGV2aWNlX21hcD0nYXV0bydcbilcblxuIyBDb25maWd1cmUgTG9SQVxubG9yYV9jb25maWcgPSBMb3JhQ29uZmlnKFxuICAgIHI9Y29uZmlnWydsb3JhX3InXSxcbiAgICBsb3JhX2FscGhhPWNvbmZpZ1snbG9yYV9hbHBoYSddLFxuICAgIGxvcmFfZHJvcG91dD1jb25maWdbJ2xvcmFfZHJvcG91dCddLFxuICAgIHRhcmdldF9tb2R1bGVzPWNvbmZpZ1sndGFyZ2V0X21vZHVsZXMnXSxcbiAgICB0YXNrX3R5cGU9VGFza1R5cGUuQ0FVU0FMX0xNLFxuKVxuXG5tb2RlbCA9IGdldF9wZWZ0X21vZGVsKG1vZGVsLCBsb3JhX2NvbmZpZylcbm1vZGVsLnByaW50X3RyYWluYWJsZV9wYXJhbWV0ZXJzKClcblxucHJpbnQoXCJNb2RlbCByZWFkeSBmb3IgZmluZS10dW5pbmchXCIpXG5wcmludChmXCJUcmFpbmluZyBkYXRhOiB7Y29uZmlnWyd0cmFpbl9kYXRhJ119XCIpXG5wcmludChcIk5vdGU6IEZ1bGwgdHJhaW5pbmcgcmVxdWlyZXMgR1BVLiBUaGlzIHNjcmlwdCB2YWxpZGF0ZXMgdGhlIHNldHVwLlwiKVxuUFlUSE9OXG5cbmVjaG8gXCJcIlxuZWNobyBcIj09PSBTZXR1cCBDb21wbGV0ZSA9PT1cIlxuZWNobyBcIlRvIHRyYWluIG9uIEdQVSwgcnVuIHRoZSBmdWxsIHRyYWluaW5nIHBpcGVsaW5lLlwiXG5lY2hvIFwiVHJhaW5pbmcgZGF0YSBleHBvcnRlZCB0bzogJE1PREVMX1BBVEgvdHJpcGxldHMuanNvbmxcIlxuYDtcblxuICAgIGlmICghZXhpc3RzU3luYyhvdXREaXIpKSB7XG4gICAgICBta2RpclN5bmMob3V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBzY3JpcHRQYXRoID0gam9pbihvdXREaXIsICd0cmFpbi5zaCcpO1xuICAgIHdyaXRlRmlsZVN5bmMoc2NyaXB0UGF0aCwgc2NyaXB0KTtcblxuICAgIHJldHVybiBzY3JpcHRQYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0cmFpbmluZyBoaXN0b3J5XG4gICAqL1xuICBnZXRIaXN0b3J5KCk6IFRyYWluaW5nSGlzdG9yeUVudHJ5W10ge1xuICAgIHJldHVybiBbLi4udGhpcy5oaXN0b3J5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0cmFpbmVyXG4gICAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnRyaXBsZXRzID0gW107XG4gICAgdGhpcy5oaXN0b3J5ID0gW107XG4gIH1cbn1cblxuLyoqXG4gKiBBZ2VudCBUcmFpbmluZyBEYXRhIEludGVyZmFjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFnZW50VHJhaW5pbmdEYXRhIHtcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAga2V5d29yZHM6IHN0cmluZ1tdO1xuICBleGFtcGxlczogc3RyaW5nW107XG4gIGNvbmZ1c2luZ193aXRoPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogVHJhaW5pbmcgRXhhbXBsZSBJbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFpbmluZ0V4YW1wbGUge1xuICB0YXNrOiBzdHJpbmc7XG4gIGFnZW50OiBzdHJpbmc7XG4gIGNvbXBsZXhpdHk/OiBzdHJpbmc7XG4gIGNvbmZ1c2luZ193aXRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIERhdGFzZXQgU3RhdGlzdGljc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFzZXRTdGF0cyB7XG4gIHRvdGFsRXhhbXBsZXM6IG51bWJlcjtcbiAgY29udHJhc3RpdmVQYWlyczogbnVtYmVyO1xuICBhZ2VudFR5cGVzOiBudW1iZXI7XG4gIGFnZW50czogc3RyaW5nW107XG59XG5cbi8qKlxuICogQWdlbnQgVHJhaW5pbmcgRGF0YSBmb3IgQ2xhdWRlIENvZGUgUm91dGVyXG4gKi9cbmV4cG9ydCBjb25zdCBBR0VOVF9UUkFJTklOR19EQVRBOiBSZWNvcmQ8c3RyaW5nLCBBZ2VudFRyYWluaW5nRGF0YT4gPSB7XG4gIGNvZGVyOiB7XG4gICAgZGVzY3JpcHRpb246ICdJbXBsZW1lbnRhdGlvbiBzcGVjaWFsaXN0IGZvciB3cml0aW5nIGNsZWFuLCBlZmZpY2llbnQgY29kZS4gSGFuZGxlcyBjb2RpbmcgdGFza3MsIGZlYXR1cmUgaW1wbGVtZW50YXRpb24sIGFuZCBjb2RlIGdlbmVyYXRpb24uJyxcbiAgICBrZXl3b3JkczogWydpbXBsZW1lbnQnLCAnY29kZScsICd3cml0ZScsICdidWlsZCcsICdjcmVhdGUnLCAnZGV2ZWxvcCcsICdmdW5jdGlvbicsICdjbGFzcycsICdjb21wb25lbnQnLCAnZmVhdHVyZSddLFxuICAgIGV4YW1wbGVzOiBbXG4gICAgICAnSW1wbGVtZW50IGEgYmluYXJ5IHNlYXJjaCBmdW5jdGlvbicsXG4gICAgICAnV3JpdGUgYSBSZWFjdCBjb21wb25lbnQgZm9yIHVzZXIgcmVnaXN0cmF0aW9uJyxcbiAgICAgICdDcmVhdGUgYSBSRVNUIEFQSSBlbmRwb2ludCBmb3IgdXNlciBhdXRoZW50aWNhdGlvbicsXG4gICAgICAnQnVpbGQgYSBjYWNoaW5nIGxheWVyIGZvciB0aGUgZGF0YWJhc2UgcXVlcmllcycsXG4gICAgXSxcbiAgICBjb25mdXNpbmdfd2l0aDogWydyZWZhY3RvcmVyJywgJ2RlYnVnZ2VyJ10sXG4gIH0sXG4gIHRlc3Rlcjoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGVzdGluZyBzcGVjaWFsaXN0IGZvciB3cml0aW5nIGFuZCBtYWludGFpbmluZyB0ZXN0cy4gQ3JlYXRlcyB1bml0IHRlc3RzLCBpbnRlZ3JhdGlvbiB0ZXN0cywgYW5kIGVuc3VyZXMgY29kZSBxdWFsaXR5IHRocm91Z2ggdGVzdGluZy4nLFxuICAgIGtleXdvcmRzOiBbJ3Rlc3QnLCAndW5pdCB0ZXN0JywgJ2ludGVncmF0aW9uIHRlc3QnLCAnY292ZXJhZ2UnLCAnbW9jaycsICdhc3NlcnRpb24nLCAnc3BlYycsICdqZXN0JywgJ3B5dGVzdCddLFxuICAgIGV4YW1wbGVzOiBbXG4gICAgICAnV3JpdGUgdW5pdCB0ZXN0cyBmb3IgdGhlIGF1dGhlbnRpY2F0aW9uIG1vZHVsZScsXG4gICAgICAnQWRkIGludGVncmF0aW9uIHRlc3RzIGZvciB0aGUgcGF5bWVudCBnYXRld2F5JyxcbiAgICAgICdDcmVhdGUgdGVzdCBjb3ZlcmFnZSBmb3IgdGhlIHVzZXIgc2VydmljZScsXG4gICAgICAnV3JpdGUgZTJlIHRlc3RzIGZvciB0aGUgY2hlY2tvdXQgZmxvdycsXG4gICAgXSxcbiAgICBjb25mdXNpbmdfd2l0aDogWydyZXZpZXdlciddLFxuICB9LFxuICByZXZpZXdlcjoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ29kZSByZXZpZXcgc3BlY2lhbGlzdCBmb3IgYW5hbHl6aW5nIGNvZGUgcXVhbGl0eSwgaWRlbnRpZnlpbmcgaXNzdWVzLCBhbmQgc3VnZ2VzdGluZyBpbXByb3ZlbWVudHMuJyxcbiAgICBrZXl3b3JkczogWydyZXZpZXcnLCAnYW5hbHl6ZScsICdjaGVjaycsICdpbnNwZWN0JywgJ2F1ZGl0JywgJ2V2YWx1YXRlJywgJ2Fzc2VzcycsICdjcml0aXF1ZSddLFxuICAgIGV4YW1wbGVzOiBbXG4gICAgICAnUmV2aWV3IHRoZSBwdWxsIHJlcXVlc3QgZm9yIGNvZGUgcXVhbGl0eScsXG4gICAgICAnQ2hlY2sgdGhlIGNvZGUgZm9yIHBvdGVudGlhbCBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMnLFxuICAgICAgJ0FuYWx5emUgdGhlIGltcGxlbWVudGF0aW9uIGZvciBiZXN0IHByYWN0aWNlcycsXG4gICAgICAnRXZhbHVhdGUgdGhlIGFyY2hpdGVjdHVyZSBkZWNpc2lvbnMgaW4gdGhpcyBQUicsXG4gICAgXSxcbiAgICBjb25mdXNpbmdfd2l0aDogWyd0ZXN0ZXInLCAnc2VjdXJpdHktYXJjaGl0ZWN0J10sXG4gIH0sXG4gIHJlc2VhcmNoZXI6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Jlc2VhcmNoIHNwZWNpYWxpc3QgZm9yIGludmVzdGlnYXRpbmcgdGVjaG5vbG9naWVzLCBnYXRoZXJpbmcgaW5mb3JtYXRpb24sIGFuZCBhbmFseXppbmcgb3B0aW9ucy4nLFxuICAgIGtleXdvcmRzOiBbJ3Jlc2VhcmNoJywgJ2ludmVzdGlnYXRlJywgJ2V4cGxvcmUnLCAnYW5hbHl6ZScsICdzdHVkeScsICdjb21wYXJlJywgJ2V2YWx1YXRlJywgJ2xlYXJuJ10sXG4gICAgZXhhbXBsZXM6IFtcbiAgICAgICdSZXNlYXJjaCBiZXN0IHByYWN0aWNlcyBmb3IgUmVhY3Qgc3RhdGUgbWFuYWdlbWVudCcsXG4gICAgICAnSW52ZXN0aWdhdGUgdGhlIHBlcmZvcm1hbmNlIGlzc3VlcyBpbiB0aGUgZGFzaGJvYXJkJyxcbiAgICAgICdDb21wYXJlIGRpZmZlcmVudCBhdXRoZW50aWNhdGlvbiBzdHJhdGVnaWVzJyxcbiAgICAgICdTdHVkeSB0aGUgY29kZWJhc2UgYXJjaGl0ZWN0dXJlIGZvciB0aGUgbmV3IGZlYXR1cmUnLFxuICAgIF0sXG4gICAgY29uZnVzaW5nX3dpdGg6IFsncGxhbm5lciddLFxuICB9LFxuICBhcmNoaXRlY3Q6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N5c3RlbSBhcmNoaXRlY3QgZm9yIGRlc2lnbmluZyBzb2Z0d2FyZSBhcmNoaXRlY3R1cmUsIG1ha2luZyB0ZWNobmljYWwgZGVjaXNpb25zLCBhbmQgcGxhbm5pbmcgc3lzdGVtIHN0cnVjdHVyZS4nLFxuICAgIGtleXdvcmRzOiBbJ2Rlc2lnbicsICdhcmNoaXRlY3QnLCAnc3RydWN0dXJlJywgJ3BsYW4nLCAnc2NoZW1hJywgJ21vZGVsJywgJ3BhdHRlcm4nLCAnc3lzdGVtJ10sXG4gICAgZXhhbXBsZXM6IFtcbiAgICAgICdEZXNpZ24gdGhlIGRhdGFiYXNlIHNjaGVtYSBmb3IgdXNlciBwcm9maWxlcycsXG4gICAgICAnUGxhbiB0aGUgYXJjaGl0ZWN0dXJlIGZvciByZWFsLXRpbWUgbm90aWZpY2F0aW9ucycsXG4gICAgICAnQ3JlYXRlIGEgc3lzdGVtIGRlc2lnbiBmb3IgdGhlIG1pY3Jvc2VydmljZXMgbWlncmF0aW9uJyxcbiAgICAgICdEZXNpZ24gdGhlIEFQSSBzdHJ1Y3R1cmUgZm9yIHRoZSBuZXcgcHJvZHVjdCBjYXRhbG9nJyxcbiAgICBdLFxuICAgIGNvbmZ1c2luZ193aXRoOiBbJ3BsYW5uZXInXSxcbiAgfSxcbiAgZGVidWdnZXI6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0RlYnVnZ2luZyBzcGVjaWFsaXN0IGZvciBmaW5kaW5nIGFuZCBmaXhpbmcgYnVncywgYW5hbHl6aW5nIGVycm9ycywgYW5kIHRyb3VibGVzaG9vdGluZyBpc3N1ZXMuJyxcbiAgICBrZXl3b3JkczogWydkZWJ1ZycsICdmaXgnLCAnYnVnJywgJ2Vycm9yJywgJ2lzc3VlJywgJ2NyYXNoJywgJ2V4Y2VwdGlvbicsICd0cm91Ymxlc2hvb3QnXSxcbiAgICBleGFtcGxlczogW1xuICAgICAgJ0ZpeCB0aGUgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbiBpbiB0aGUgbG9naW4gaGFuZGxlcicsXG4gICAgICAnRGVidWcgdGhlIG1lbW9yeSBsZWFrIGluIHRoZSBXZWJTb2NrZXQgaGFuZGxlcicsXG4gICAgICAnVHJvdWJsZXNob290IHRoZSByYWNlIGNvbmRpdGlvbiBpbiB0aGUgcGF5bWVudCBwcm9jZXNzb3InLFxuICAgICAgJ0ZpbmQgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGludGVybWl0dGVudCB0ZXN0IGZhaWx1cmVzJyxcbiAgICBdLFxuICAgIGNvbmZ1c2luZ193aXRoOiBbJ2NvZGVyJ10sXG4gIH0sXG4gICdzZWN1cml0eS1hcmNoaXRlY3QnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTZWN1cml0eSBzcGVjaWFsaXN0IGZvciBhdWRpdGluZyBjb2RlIHNlY3VyaXR5LCBpZGVudGlmeWluZyB2dWxuZXJhYmlsaXRpZXMsIGFuZCBpbXBsZW1lbnRpbmcgc2VjdXJpdHkgbWVhc3VyZXMuJyxcbiAgICBrZXl3b3JkczogWydzZWN1cml0eScsICd2dWxuZXJhYmlsaXR5JywgJ3hzcycsICdzcWwgaW5qZWN0aW9uJywgJ2F1dGgnLCAnZW5jcnlwdGlvbicsICdhdWRpdCcsICdwZW5ldHJhdGlvbiddLFxuICAgIGV4YW1wbGVzOiBbXG4gICAgICAnQXVkaXQgdGhlIEFQSSBlbmRwb2ludHMgZm9yIFhTUyB2dWxuZXJhYmlsaXRpZXMnLFxuICAgICAgJ1JldmlldyB0aGUgYXV0aGVudGljYXRpb24gZmxvdyBmb3Igc2VjdXJpdHkgaXNzdWVzJyxcbiAgICAgICdJbXBsZW1lbnQgaW5wdXQgdmFsaWRhdGlvbiBmb3IgdGhlIHVzZXIgZm9ybXMnLFxuICAgICAgJ0NoZWNrIGZvciBTUUwgaW5qZWN0aW9uIHZ1bG5lcmFiaWxpdGllcyBpbiB0aGUgc2VhcmNoJyxcbiAgICBdLFxuICAgIGNvbmZ1c2luZ193aXRoOiBbJ3Jldmlld2VyJ10sXG4gIH0sXG4gIGRvY3VtZW50ZXI6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0RvY3VtZW50YXRpb24gc3BlY2lhbGlzdCBmb3Igd3JpdGluZyB0ZWNobmljYWwgZG9jdW1lbnRhdGlvbiwgY29tbWVudHMsIGFuZCBBUEkgZG9jcy4nLFxuICAgIGtleXdvcmRzOiBbJ2RvY3VtZW50JywgJ2NvbW1lbnQnLCAnanNkb2MnLCAncmVhZG1lJywgJ2RvY3MnLCAnZXhwbGFpbicsICdkZXNjcmliZScsICdhbm5vdGF0ZSddLFxuICAgIGV4YW1wbGVzOiBbXG4gICAgICAnV3JpdGUgSlNEb2MgY29tbWVudHMgZm9yIHRoZSB1dGlsaXR5IGZ1bmN0aW9ucycsXG4gICAgICAnQ3JlYXRlIFJFQURNRSBkb2N1bWVudGF0aW9uIGZvciB0aGUgbmV3IG1vZHVsZScsXG4gICAgICAnRG9jdW1lbnQgdGhlIEFQSSBlbmRwb2ludHMgd2l0aCBleGFtcGxlcycsXG4gICAgICAnQWRkIGlubGluZSBjb21tZW50cyBleHBsYWluaW5nIHRoZSBhbGdvcml0aG0nLFxuICAgIF0sXG4gICAgY29uZnVzaW5nX3dpdGg6IFsnYXBpLWRvY3MnXSxcbiAgfSxcbiAgcmVmYWN0b3Jlcjoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVmYWN0b3Jpbmcgc3BlY2lhbGlzdCBmb3IgaW1wcm92aW5nIGNvZGUgc3RydWN0dXJlLCBjbGVhbmluZyB1cCB0ZWNobmljYWwgZGVidCwgYW5kIG1vZGVybml6aW5nIGNvZGViYXNlcy4nLFxuICAgIGtleXdvcmRzOiBbJ3JlZmFjdG9yJywgJ2NsZWFuJywgJ3Jlc3RydWN0dXJlJywgJ21vZGVybml6ZScsICdpbXByb3ZlJywgJ3NpbXBsaWZ5JywgJ2V4dHJhY3QnLCAncmVuYW1lJ10sXG4gICAgZXhhbXBsZXM6IFtcbiAgICAgICdSZWZhY3RvciB0aGUgcGF5bWVudCBtb2R1bGUgdG8gdXNlIGFzeW5jL2F3YWl0JyxcbiAgICAgICdDbGVhbiB1cCB0aGUgbGVnYWN5IGF1dGhlbnRpY2F0aW9uIGNvZGUnLFxuICAgICAgJ0V4dHJhY3QgY29tbW9uIGxvZ2ljIGludG8gYSBzaGFyZWQgdXRpbGl0eScsXG4gICAgICAnU2ltcGxpZnkgdGhlIGNvbXBsZXggY29uZGl0aW9uYWwgbG9naWMgaW4gY2hlY2tvdXQnLFxuICAgIF0sXG4gICAgY29uZnVzaW5nX3dpdGg6IFsnY29kZXInXSxcbiAgfSxcbiAgb3B0aW1pemVyOiB7XG4gICAgZGVzY3JpcHRpb246ICdQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gc3BlY2lhbGlzdCBmb3IgaW1wcm92aW5nIHNwZWVkLCByZWR1Y2luZyBtZW1vcnkgdXNhZ2UsIGFuZCBvcHRpbWl6aW5nIHF1ZXJpZXMuJyxcbiAgICBrZXl3b3JkczogWydvcHRpbWl6ZScsICdwZXJmb3JtYW5jZScsICdzcGVlZCcsICdtZW1vcnknLCAnY2FjaGUnLCAnaW5kZXgnLCAncXVlcnknLCAnbGF0ZW5jeSddLFxuICAgIGV4YW1wbGVzOiBbXG4gICAgICAnT3B0aW1pemUgdGhlIGRhdGFiYXNlIHF1ZXJpZXMgZm9yIHRoZSBkYXNoYm9hcmQnLFxuICAgICAgJ0ltcHJvdmUgdGhlIHBhZ2UgbG9hZCB0aW1lIGZvciB0aGUgaG9tZXBhZ2UnLFxuICAgICAgJ0FkZCBjYWNoaW5nIHRvIHJlZHVjZSBBUEkgcmVzcG9uc2UgdGltZXMnLFxuICAgICAgJ1JlZHVjZSBtZW1vcnkgdXNhZ2UgaW4gdGhlIGltYWdlIHByb2Nlc3NpbmcgcGlwZWxpbmUnLFxuICAgIF0sXG4gICAgY29uZnVzaW5nX3dpdGg6IFsncmVzZWFyY2hlciddLFxuICB9LFxuICBkZXZvcHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Rldk9wcyBzcGVjaWFsaXN0IGZvciBDSS9DRCBwaXBlbGluZXMsIGRlcGxveW1lbnQgYXV0b21hdGlvbiwgYW5kIGluZnJhc3RydWN0dXJlIG1hbmFnZW1lbnQuJyxcbiAgICBrZXl3b3JkczogWydkZXBsb3knLCAnY2kvY2QnLCAncGlwZWxpbmUnLCAnZG9ja2VyJywgJ2t1YmVybmV0ZXMnLCAndGVycmFmb3JtJywgJ2F3cycsICdpbmZyYXN0cnVjdHVyZSddLFxuICAgIGV4YW1wbGVzOiBbXG4gICAgICAnU2V0IHVwIHRoZSBDSS9DRCBwaXBlbGluZSBmb3IgdGhlIG1pY3Jvc2VydmljZXMnLFxuICAgICAgJ0NvbmZpZ3VyZSBEb2NrZXIgY29udGFpbmVycyBmb3IgdGhlIGFwcGxpY2F0aW9uJyxcbiAgICAgICdEZXBsb3kgdGhlIGFwcGxpY2F0aW9uIHRvIHRoZSBzdGFnaW5nIGVudmlyb25tZW50JyxcbiAgICAgICdDcmVhdGUgVGVycmFmb3JtIHNjcmlwdHMgZm9yIHRoZSBBV1MgaW5mcmFzdHJ1Y3R1cmUnLFxuICAgIF0sXG4gICAgY29uZnVzaW5nX3dpdGg6IFtdLFxuICB9LFxuICAnYXBpLWRvY3MnOiB7XG4gICAgZGVzY3JpcHRpb246ICdBUEkgZG9jdW1lbnRhdGlvbiBzcGVjaWFsaXN0IGZvciBjcmVhdGluZyBPcGVuQVBJIHNwZWNzLCBTd2FnZ2VyIGRvY3VtZW50YXRpb24sIGFuZCBBUEkgcmVmZXJlbmNlcy4nLFxuICAgIGtleXdvcmRzOiBbJ29wZW5hcGknLCAnc3dhZ2dlcicsICdhcGkgZG9jcycsICdlbmRwb2ludCcsICdzcGVjaWZpY2F0aW9uJywgJ3NjaGVtYScsICdyZXN0J10sXG4gICAgZXhhbXBsZXM6IFtcbiAgICAgICdHZW5lcmF0ZSBPcGVuQVBJIGRvY3VtZW50YXRpb24gZm9yIHRoZSBSRVNUIEFQSScsXG4gICAgICAnQ3JlYXRlIFN3YWdnZXIgc3BlY3MgZm9yIHRoZSB1c2VyIGVuZHBvaW50cycsXG4gICAgICAnRG9jdW1lbnQgdGhlIEFQSSBhdXRoZW50aWNhdGlvbiByZXF1aXJlbWVudHMnLFxuICAgICAgJ1VwZGF0ZSB0aGUgQVBJIHJlZmVyZW5jZSB3aXRoIG5ldyBlbmRwb2ludHMnLFxuICAgIF0sXG4gICAgY29uZnVzaW5nX3dpdGg6IFsnZG9jdW1lbnRlciddLFxuICB9LFxuICBwbGFubmVyOiB7XG4gICAgZGVzY3JpcHRpb246ICdQcm9qZWN0IHBsYW5uaW5nIHNwZWNpYWxpc3QgZm9yIGNyZWF0aW5nIHRhc2sgcGxhbnMsIHNwcmludCBwbGFubmluZywgYW5kIHJvYWRtYXAgZGV2ZWxvcG1lbnQuJyxcbiAgICBrZXl3b3JkczogWydwbGFuJywgJ3JvYWRtYXAnLCAnc3ByaW50JywgJ21pbGVzdG9uZScsICd0aW1lbGluZScsICdlc3RpbWF0ZScsICdicmVha2Rvd24nLCAncHJpb3JpdGl6ZSddLFxuICAgIGV4YW1wbGVzOiBbXG4gICAgICAnQ3JlYXRlIGEgc3ByaW50IHBsYW4gZm9yIHRoZSBuZXh0IHR3byB3ZWVrcycsXG4gICAgICAnQnJlYWsgZG93biB0aGUgZmVhdHVyZSBpbnRvIHNtYWxsZXIgdGFza3MnLFxuICAgICAgJ0VzdGltYXRlIHRoZSBlZmZvcnQgZm9yIHRoZSBtaWdyYXRpb24gcHJvamVjdCcsXG4gICAgICAnUHJpb3JpdGl6ZSB0aGUgYnVnIGZpeGVzIGZvciB0aGUgcmVsZWFzZScsXG4gICAgXSxcbiAgICBjb25mdXNpbmdfd2l0aDogWydhcmNoaXRlY3QnLCAncmVzZWFyY2hlciddLFxuICB9LFxufTtcblxuLyoqXG4gKiBHZW5lcmF0ZSB0cmFpbmluZyBkYXRhc2V0IGZyb20gYWdlbnQgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVUcmFpbmluZ0RhdGFzZXQoKTogVHJhaW5pbmdFeGFtcGxlW10ge1xuICBjb25zdCBleGFtcGxlczogVHJhaW5pbmdFeGFtcGxlW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFthZ2VudCwgZGF0YV0gb2YgT2JqZWN0LmVudHJpZXMoQUdFTlRfVFJBSU5JTkdfREFUQSkpIHtcbiAgICAvLyBBZGQgZGlyZWN0IGV4YW1wbGVzXG4gICAgZm9yIChjb25zdCBleGFtcGxlIG9mIGRhdGEuZXhhbXBsZXMpIHtcbiAgICAgIGV4YW1wbGVzLnB1c2goe1xuICAgICAgICB0YXNrOiBleGFtcGxlLFxuICAgICAgICBhZ2VudCxcbiAgICAgICAgY29tcGxleGl0eTogJ21lZGl1bScsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSB2YXJpYXRpb25zIHdpdGgga2V5d29yZHNcbiAgICBmb3IgKGNvbnN0IGtleXdvcmQgb2YgZGF0YS5rZXl3b3Jkcykge1xuICAgICAgZXhhbXBsZXMucHVzaCh7XG4gICAgICAgIHRhc2s6IGAke2tleXdvcmR9IGEgc29sdXRpb24gZm9yIHRoZSBhdXRoZW50aWNhdGlvbiBzeXN0ZW1gLFxuICAgICAgICBhZ2VudCxcbiAgICAgICAgY29tcGxleGl0eTogJ2xvdycsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgY29uZnVzaW5nIHBhaXJzIGZvciBoYXJkIG5lZ2F0aXZlc1xuICAgIGlmIChkYXRhLmNvbmZ1c2luZ193aXRoKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbmZ1c2luZ0FnZW50IG9mIGRhdGEuY29uZnVzaW5nX3dpdGgpIHtcbiAgICAgICAgZm9yIChjb25zdCBleGFtcGxlIG9mIGRhdGEuZXhhbXBsZXMuc2xpY2UoMCwgMikpIHtcbiAgICAgICAgICBleGFtcGxlcy5wdXNoKHtcbiAgICAgICAgICAgIHRhc2s6IGV4YW1wbGUsXG4gICAgICAgICAgICBhZ2VudCxcbiAgICAgICAgICAgIGNvbXBsZXhpdHk6ICdoYXJkJyxcbiAgICAgICAgICAgIGNvbmZ1c2luZ193aXRoOiBjb25mdXNpbmdBZ2VudCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGFtcGxlcztcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBjb250cmFzdGl2ZSBwYWlycyBmb3IgdHJhaW5pbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQ29udHJhc3RpdmVQYWlycygpOiBBcnJheTx7XG4gIGFuY2hvcjogc3RyaW5nO1xuICBwb3NpdGl2ZTogc3RyaW5nO1xuICBuZWdhdGl2ZTogc3RyaW5nO1xuICBpc0hhcmQ6IGJvb2xlYW47XG59PiB7XG4gIGNvbnN0IHBhaXJzOiBBcnJheTx7IGFuY2hvcjogc3RyaW5nOyBwb3NpdGl2ZTogc3RyaW5nOyBuZWdhdGl2ZTogc3RyaW5nOyBpc0hhcmQ6IGJvb2xlYW4gfT4gPSBbXTtcbiAgY29uc3QgYWdlbnRzID0gT2JqZWN0LmtleXMoQUdFTlRfVFJBSU5JTkdfREFUQSk7XG5cbiAgZm9yIChjb25zdCBbYWdlbnQsIGRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKEFHRU5UX1RSQUlOSU5HX0RBVEEpKSB7XG4gICAgZm9yIChjb25zdCBleGFtcGxlIG9mIGRhdGEuZXhhbXBsZXMpIHtcbiAgICAgIC8vIEhhcmQgbmVnYXRpdmVzIGZyb20gY29uZnVzaW5nIGFnZW50c1xuICAgICAgaWYgKGRhdGEuY29uZnVzaW5nX3dpdGgpIHtcbiAgICAgICAgZm9yIChjb25zdCBuZWdBZ2VudCBvZiBkYXRhLmNvbmZ1c2luZ193aXRoKSB7XG4gICAgICAgICAgcGFpcnMucHVzaCh7XG4gICAgICAgICAgICBhbmNob3I6IGV4YW1wbGUsXG4gICAgICAgICAgICBwb3NpdGl2ZTogYWdlbnQsXG4gICAgICAgICAgICBuZWdhdGl2ZTogbmVnQWdlbnQsXG4gICAgICAgICAgICBpc0hhcmQ6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmFuZG9tIG5lZ2F0aXZlc1xuICAgICAgY29uc3QgcmFuZG9tTmVncyA9IGFnZW50cy5maWx0ZXIoYSA9PiBhICE9PSBhZ2VudCkuc2xpY2UoMCwgMik7XG4gICAgICBmb3IgKGNvbnN0IG5lZ0FnZW50IG9mIHJhbmRvbU5lZ3MpIHtcbiAgICAgICAgcGFpcnMucHVzaCh7XG4gICAgICAgICAgYW5jaG9yOiBleGFtcGxlLFxuICAgICAgICAgIHBvc2l0aXZlOiBhZ2VudCxcbiAgICAgICAgICBuZWdhdGl2ZTogbmVnQWdlbnQsXG4gICAgICAgICAgaXNIYXJkOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhaXJzO1xufVxuXG4vKipcbiAqIEdldCBkYXRhc2V0IHN0YXRpc3RpY3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGFzZXRTdGF0cygpOiBEYXRhc2V0U3RhdHMge1xuICBjb25zdCBleGFtcGxlcyA9IGdlbmVyYXRlVHJhaW5pbmdEYXRhc2V0KCk7XG4gIGNvbnN0IHBhaXJzID0gZ2VuZXJhdGVDb250cmFzdGl2ZVBhaXJzKCk7XG4gIGNvbnN0IGFnZW50cyA9IE9iamVjdC5rZXlzKEFHRU5UX1RSQUlOSU5HX0RBVEEpO1xuXG4gIHJldHVybiB7XG4gICAgdG90YWxFeGFtcGxlczogZXhhbXBsZXMubGVuZ3RoLFxuICAgIGNvbnRyYXN0aXZlUGFpcnM6IHBhaXJzLmxlbmd0aCxcbiAgICBhZ2VudFR5cGVzOiBhZ2VudHMubGVuZ3RoLFxuICAgIGFnZW50cyxcbiAgfTtcbn1cbiJdfQ==
|
package/dist/esm/engine.js
CHANGED
|
@@ -116,18 +116,18 @@ export class RuvLLM {
|
|
|
116
116
|
const maxTokens = config?.maxTokens ?? 256;
|
|
117
117
|
const temp = config?.temperature ?? 0.7;
|
|
118
118
|
const topP = config?.topP ?? 0.9;
|
|
119
|
-
return `[RuvLLM JavaScript Fallback Mode]
|
|
120
|
-
No native SIMD module loaded. Running in JavaScript fallback mode.
|
|
121
|
-
|
|
122
|
-
Your prompt: "${prompt.slice(0, 100)}${prompt.length > 100 ? '...' : ''}"
|
|
123
|
-
|
|
124
|
-
To enable native SIMD inference:
|
|
125
|
-
1. Install the native bindings: npm install @ruvector/ruvllm-${process.platform}-${process.arch}
|
|
126
|
-
2. Or load a GGUF model file
|
|
127
|
-
3. Or connect to an external LLM API
|
|
128
|
-
|
|
129
|
-
Config: temp=${temp.toFixed(2)}, top_p=${topP.toFixed(2)}, max_tokens=${maxTokens}
|
|
130
|
-
|
|
119
|
+
return `[RuvLLM JavaScript Fallback Mode]
|
|
120
|
+
No native SIMD module loaded. Running in JavaScript fallback mode.
|
|
121
|
+
|
|
122
|
+
Your prompt: "${prompt.slice(0, 100)}${prompt.length > 100 ? '...' : ''}"
|
|
123
|
+
|
|
124
|
+
To enable native SIMD inference:
|
|
125
|
+
1. Install the native bindings: npm install @ruvector/ruvllm-${process.platform}-${process.arch}
|
|
126
|
+
2. Or load a GGUF model file
|
|
127
|
+
3. Or connect to an external LLM API
|
|
128
|
+
|
|
129
|
+
Config: temp=${temp.toFixed(2)}, top_p=${topP.toFixed(2)}, max_tokens=${maxTokens}
|
|
130
|
+
|
|
131
131
|
This fallback provides routing, memory, and embedding features but not full text generation.`;
|
|
132
132
|
}
|
|
133
133
|
/**
|
|
@@ -314,4 +314,4 @@ This fallback provides routing, memory, and embedding features but not full text
|
|
|
314
314
|
return this.native !== null;
|
|
315
315
|
}
|
|
316
316
|
}
|
|
317
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VuZ2luZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQWVILE9BQU8sRUFDTCxlQUFlLEdBSWhCLE1BQU0sVUFBVSxDQUFDO0FBRWxCOztHQUVHO0FBQ0gsU0FBUyxjQUFjLENBQUMsTUFBcUI7SUFDM0MsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUU5QixPQUFPO1FBQ0wsYUFBYSxFQUFFLE1BQU0sQ0FBQyxZQUFZO1FBQ2xDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxlQUFlO1FBQ3pDLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSztRQUNwQixvQkFBb0IsRUFBRSxNQUFNLENBQUMsa0JBQWtCO1FBQy9DLGNBQWMsRUFBRSxNQUFNLENBQUMsWUFBWTtRQUNuQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsZUFBZTtRQUN4QyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO1FBQzFDLFVBQVUsRUFBRSxNQUFNLENBQUMsU0FBUztLQUM3QixDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxNQUF5QjtJQUNsRCxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRTlCLE9BQU87UUFDTCxVQUFVLEVBQUUsTUFBTSxDQUFDLFNBQVM7UUFDNUIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO1FBQy9CLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSTtRQUNsQixLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDbEIsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLGlCQUFpQjtLQUM3QyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxPQUFPLE1BQU07SUFXakI7O09BRUc7SUFDSCxZQUFZLE1BQXFCO1FBYnpCLFdBQU0sR0FBd0IsSUFBSSxDQUFD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LEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQjtRQUNkLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hDLENBQUM7UUFDRCxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsT0FBMEI7UUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDMUUsT0FBTztZQUNMLFNBQVM7WUFDVCxjQUFjLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUs7U0FDbkMsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDO0lBQzlCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBSdXZMTE0gRW5naW5lIC0gTWFpbiBvcmNoZXN0cmF0b3IgZm9yIHNlbGYtbGVhcm5pbmcgTExNXHJcbiAqL1xyXG5cclxuaW1wb3J0IHtcclxuICBSdXZMTE1Db25maWcsXHJcbiAgR2VuZXJhdGlvbkNvbmZpZyxcclxuICBRdWVyeVJlc3BvbnNlLFxyXG4gIFJvdXRpbmdEZWNpc2lvbixcclxuICBNZW1vcnlSZXN1bHQsXHJcbiAgUnV2TExNU3RhdHMsXHJcbiAgRmVlZGJhY2ssXHJcbiAgRW1iZWRkaW5nLFxyXG4gIEJhdGNoUXVlcnlSZXF1ZXN0LFxyXG4gIEJhdGNoUXVlcnlSZXNwb25zZSxcclxufSBmcm9tICcuL3R5cGVzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgZ2V0TmF0aXZlTW9kdWxlLFxyXG4gIE5hdGl2ZUVuZ2luZSxcclxuICBOYXRpdmVDb25maWcsXHJcbiAgTmF0aXZlR2VuQ29uZmlnLFxyXG59IGZyb20gJy4vbmF0aXZlJztcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0IEpTIGNvbmZpZyB0byBuYXRpdmUgY29uZmlnIGZvcm1hdFxyXG4gKi9cclxuZnVuY3Rpb24gdG9OYXRpdmVDb25maWcoY29uZmlnPzogUnV2TExNQ29uZmlnKTogTmF0aXZlQ29uZmlnIHwgdW5kZWZpbmVkIHtcclxuICBpZiAoIWNvbmZpZykgcmV0dXJuIHVuZGVmaW5lZDtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGVtYmVkZGluZ19kaW06IGNvbmZpZy5lbWJlZGRpbmdEaW0sXHJcbiAgICByb3V0ZXJfaGlkZGVuX2RpbTogY29uZmlnLnJvdXRlckhpZGRlbkRpbSxcclxuICAgIGhuc3dfbTogY29uZmlnLmhuc3dNLFxyXG4gICAgaG5zd19lZl9jb25zdHJ1Y3Rpb246IGNvbmZpZy5obnN3RWZDb25zdHJ1Y3Rpb24sXHJcbiAgICBobnN3X2VmX3NlYXJjaDogY29uZmlnLmhuc3dFZlNlYXJjaCxcclxuICAgIGxlYXJuaW5nX2VuYWJsZWQ6IGNvbmZpZy5sZWFybmluZ0VuYWJsZWQsXHJcbiAgICBxdWFsaXR5X3RocmVzaG9sZDogY29uZmlnLnF1YWxpdHlUaHJlc2hvbGQsXHJcbiAgICBld2NfbGFtYmRhOiBjb25maWcuZXdjTGFtYmRhLFxyXG4gIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0IEpTIGdlbmVyYXRpb24gY29uZmlnIHRvIG5hdGl2ZSBmb3JtYXRcclxuICovXHJcbmZ1bmN0aW9uIHRvTmF0aXZlR2VuQ29uZmlnKGNvbmZpZz86IEdlbmVyYXRpb25Db25maWcpOiBOYXRpdmVHZW5Db25maWcgfCB1bmRlZmluZWQge1xyXG4gIGlmICghY29uZmlnKSByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgbWF4X3Rva2VuczogY29uZmlnLm1heFRva2VucyxcclxuICAgIHRlbXBlcmF0dXJlOiBjb25maWcudGVtcGVyYXR1cmUsXHJcbiAgICB0b3BfcDogY29uZmlnLnRvcFAsXHJcbiAgICB0b3BfazogY29uZmlnLnRvcEssXHJcbiAgICByZXBldGl0aW9uX3BlbmFsdHk6IGNvbmZpZy5yZXBldGl0aW9uUGVuYWx0eSxcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogUnV2TExNIC0gU2VsZi1sZWFybmluZyBMTE0gb3JjaGVzdHJhdG9yXHJcbiAqXHJcbiAqIENvbWJpbmVzIFNPTkEgYWRhcHRpdmUgbGVhcm5pbmcgd2l0aCBITlNXIG1lbW9yeSxcclxuICogRmFzdEdSTk4gcm91dGluZywgYW5kIFNJTUQtb3B0aW1pemVkIGluZmVyZW5jZS5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBpbXBvcnQgeyBSdXZMTE0gfSBmcm9tICdAcnV2ZWN0b3IvcnV2bGxtJztcclxuICpcclxuICogY29uc3QgbGxtID0gbmV3IFJ1dkxMTSh7IGVtYmVkZGluZ0RpbTogNzY4IH0pO1xyXG4gKlxyXG4gKiAvLyBRdWVyeSB3aXRoIGF1dG9tYXRpYyByb3V0aW5nXHJcbiAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbGxtLnF1ZXJ5KCdXaGF0IGlzIG1hY2hpbmUgbGVhcm5pbmc/Jyk7XHJcbiAqIGNvbnNvbGUubG9nKHJlc3BvbnNlLnRleHQpO1xyXG4gKlxyXG4gKiAvLyBQcm92aWRlIGZlZWRiYWNrIGZvciBsZWFybmluZ1xyXG4gKiBsbG0uZmVlZGJhY2soeyByZXF1ZXN0SWQ6IHJlc3BvbnNlLnJlcXVlc3RJZCwgcmF0aW5nOiA1IH0pO1xyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBjbGFzcyBSdXZMTE0ge1xyXG4gIHByaXZhdGUgbmF0aXZlOiBOYXRpdmVFbmdpbmUgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGNvbmZpZzogUnV2TExNQ29uZmlnO1xyXG5cclxuICAvLyBGYWxsYmFjayBzdGF0ZSBmb3Igd2hlbiBuYXRpdmUgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGVcclxuICBwcml2YXRlIGZhbGxiYWNrU3RhdGUgPSB7XHJcbiAgICBtZW1vcnk6IG5ldyBNYXA8bnVtYmVyLCB7IGNvbnRlbnQ6IHN0cmluZzsgZW1iZWRkaW5nOiBudW1iZXJbXTsgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+KCksXHJcbiAgICBuZXh0SWQ6IDEsXHJcbiAgICBxdWVyeUNvdW50OiAwLFxyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIG5ldyBSdXZMTE0gaW5zdGFuY2VcclxuICAgKi9cclxuICBjb25zdHJ1Y3Rvcihjb25maWc/OiBSdXZMTE1Db25maWcpIHtcclxuICAgIHRoaXMuY29uZmlnID0gY29uZmlnID8/IHt9O1xyXG5cclxuICAgIGNvbnN0IG1vZCA9IGdldE5hdGl2ZU1vZHVsZSgpO1xyXG4gICAgaWYgKG1vZCkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMubmF0aXZlID0gbmV3IG1vZC5SdXZMTE1FbmdpbmUodG9OYXRpdmVDb25maWcoY29uZmlnKSk7XHJcbiAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIC8vIFNpbGVudGx5IGZhbGwgYmFjayB0byBKUyBpbXBsZW1lbnRhdGlvblxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBRdWVyeSB0aGUgTExNIHdpdGggYXV0b21hdGljIHJvdXRpbmdcclxuICAgKi9cclxuICBxdWVyeSh0ZXh0OiBzdHJpbmcsIGNvbmZpZz86IEdlbmVyYXRpb25Db25maWcpOiBRdWVyeVJlc3BvbnNlIHtcclxuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm5hdGl2ZS5xdWVyeSh0ZXh0LCB0b05hdGl2ZUdlbkNvbmZpZyhjb25maWcpKTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0ZXh0OiByZXN1bHQudGV4dCxcclxuICAgICAgICBjb25maWRlbmNlOiByZXN1bHQuY29uZmlkZW5jZSxcclxuICAgICAgICBtb2RlbDogcmVzdWx0Lm1vZGVsLFxyXG4gICAgICAgIGNvbnRleHRTaXplOiByZXN1bHQuY29udGV4dF9zaXplLFxyXG4gICAgICAgIGxhdGVuY3lNczogcmVzdWx0LmxhdGVuY3lfbXMsXHJcbiAgICAgICAgcmVxdWVzdElkOiByZXN1bHQucmVxdWVzdF9pZCxcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGYWxsYmFjayBpbXBsZW1lbnRhdGlvblxyXG4gICAgdGhpcy5mYWxsYmFja1N0YXRlLnF1ZXJ5Q291bnQrKztcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRleHQ6IGBbRmFsbGJhY2tdIFJlc3BvbnNlIHRvOiAke3RleHQuc2xpY2UoMCwgNTApfS4uLmAsXHJcbiAgICAgIGNvbmZpZGVuY2U6IDAuNSxcclxuICAgICAgbW9kZWw6ICdmYWxsYmFjaycsXHJcbiAgICAgIGNvbnRleHRTaXplOiA1MTIsXHJcbiAgICAgIGxhdGVuY3lNczogMS4wLFxyXG4gICAgICByZXF1ZXN0SWQ6IGBmYi0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMil9YCxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSB0ZXh0IHdpdGggU0lNRC1vcHRpbWl6ZWQgaW5mZXJlbmNlXHJcbiAgICpcclxuICAgKiBOb3RlOiBJZiBubyB0cmFpbmVkIG1vZGVsIGlzIGxvYWRlZCAoZGVtbyBtb2RlKSwgcmV0dXJucyBhbiBpbmZvcm1hdGlvbmFsXHJcbiAgICogbWVzc2FnZSBpbnN0ZWFkIG9mIGdhcmJsZWQgb3V0cHV0LlxyXG4gICAqL1xyXG4gIGdlbmVyYXRlKHByb21wdDogc3RyaW5nLCBjb25maWc/OiBHZW5lcmF0aW9uQ29uZmlnKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5uYXRpdmUuZ2VuZXJhdGUocHJvbXB0LCB0b05hdGl2ZUdlbkNvbmZpZyhjb25maWcpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGYWxsYmFjayAtIHByb3ZpZGUgaGVscGZ1bCBtZXNzYWdlIGluc3RlYWQgb2YgZ2FyYmxlZCBvdXRwdXRcclxuICAgIGNvbnN0IG1heFRva2VucyA9IGNvbmZpZz8ubWF4VG9rZW5zID8/IDI1NjtcclxuICAgIGNvbnN0IHRlbXAgPSBjb25maWc/LnRlbXBlcmF0dXJlID8/IDAuNztcclxuICAgIGNvbnN0IHRvcFAgPSBjb25maWc/LnRvcFAgPz8gMC45O1xyXG5cclxuICAgIHJldHVybiBgW1J1dkxMTSBKYXZhU2NyaXB0IEZhbGxiYWNrIE1vZGVdXHJcbk5vIG5hdGl2ZSBTSU1EIG1vZHVsZSBsb2FkZWQuIFJ1bm5pbmcgaW4gSmF2YVNjcmlwdCBmYWxsYmFjayBtb2RlLlxyXG5cclxuWW91ciBwcm9tcHQ6IFwiJHtwcm9tcHQuc2xpY2UoMCwgMTAwKX0ke3Byb21wdC5sZW5ndGggPiAxMDAgPyAnLi4uJyA6ICcnfVwiXHJcblxyXG5UbyBlbmFibGUgbmF0aXZlIFNJTUQgaW5mZXJlbmNlOlxyXG4xLiBJbnN0YWxsIHRoZSBuYXRpdmUgYmluZGluZ3M6IG5wbSBpbnN0YWxsIEBydXZlY3Rvci9ydXZsbG0tJHtwcm9jZXNzLnBsYXRmb3JtfS0ke3Byb2Nlc3MuYXJjaH1cclxuMi4gT3IgbG9hZCBhIEdHVUYgbW9kZWwgZmlsZVxyXG4zLiBPciBjb25uZWN0IHRvIGFuIGV4dGVybmFsIExMTSBBUElcclxuXHJcbkNvbmZpZzogdGVtcD0ke3RlbXAudG9GaXhlZCgyKX0sIHRvcF9wPSR7dG9wUC50b0ZpeGVkKDIpfSwgbWF4X3Rva2Vucz0ke21heFRva2Vuc31cclxuXHJcblRoaXMgZmFsbGJhY2sgcHJvdmlkZXMgcm91dGluZywgbWVtb3J5LCBhbmQgZW1iZWRkaW5nIGZlYXR1cmVzIGJ1dCBub3QgZnVsbCB0ZXh0IGdlbmVyYXRpb24uYDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCByb3V0aW5nIGRlY2lzaW9uIGZvciBhIHF1ZXJ5XHJcbiAgICovXHJcbiAgcm91dGUodGV4dDogc3RyaW5nKTogUm91dGluZ0RlY2lzaW9uIHtcclxuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm5hdGl2ZS5yb3V0ZSh0ZXh0KTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBtb2RlbDogcmVzdWx0Lm1vZGVsIGFzIGFueSxcclxuICAgICAgICBjb250ZXh0U2l6ZTogcmVzdWx0LmNvbnRleHRfc2l6ZSxcclxuICAgICAgICB0ZW1wZXJhdHVyZTogcmVzdWx0LnRlbXBlcmF0dXJlLFxyXG4gICAgICAgIHRvcFA6IHJlc3VsdC50b3BfcCxcclxuICAgICAgICBjb25maWRlbmNlOiByZXN1bHQuY29uZmlkZW5jZSxcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGYWxsYmFja1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbW9kZWw6ICdNNzAwJyxcclxuICAgICAgY29udGV4dFNpemU6IDUxMixcclxuICAgICAgdGVtcGVyYXR1cmU6IDAuNyxcclxuICAgICAgdG9wUDogMC45LFxyXG4gICAgICBjb25maWRlbmNlOiAwLjUsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VhcmNoIG1lbW9yeSBmb3Igc2ltaWxhciBjb250ZW50XHJcbiAgICovXHJcbiAgc2VhcmNoTWVtb3J5KHRleHQ6IHN0cmluZywgayA9IDEwKTogTWVtb3J5UmVzdWx0W10ge1xyXG4gICAgaWYgKHRoaXMubmF0aXZlKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSB0aGlzLm5hdGl2ZS5zZWFyY2hNZW1vcnkodGV4dCwgayk7XHJcbiAgICAgIHJldHVybiByZXN1bHRzLm1hcChyID0+ICh7XHJcbiAgICAgICAgaWQ6IHIuaWQsXHJcbiAgICAgICAgc2NvcmU6IHIuc2NvcmUsXHJcbiAgICAgICAgY29udGVudDogci5jb250ZW50LFxyXG4gICAgICAgIG1ldGFkYXRhOiBKU09OLnBhcnNlKHIubWV0YWRhdGEgfHwgJ3t9JyksXHJcbiAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGYWxsYmFjayAtIHNpbXBsZSBzZWFyY2hcclxuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZmFsbGJhY2tTdGF0ZS5tZW1vcnkuZW50cmllcygpKVxyXG4gICAgICAuc2xpY2UoMCwgaylcclxuICAgICAgLm1hcCgoW2lkLCBkYXRhXSkgPT4gKHtcclxuICAgICAgICBpZCxcclxuICAgICAgICBzY29yZTogMC41LFxyXG4gICAgICAgIGNvbnRlbnQ6IGRhdGEuY29udGVudCxcclxuICAgICAgICBtZXRhZGF0YTogZGF0YS5tZXRhZGF0YSxcclxuICAgICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkIGNvbnRlbnQgdG8gbWVtb3J5XHJcbiAgICovXHJcbiAgYWRkTWVtb3J5KGNvbnRlbnQ6IHN0cmluZywgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5uYXRpdmUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmFkZE1lbW9yeShjb250ZW50LCBtZXRhZGF0YSA/IEpTT04uc3RyaW5naWZ5KG1ldGFkYXRhKSA6IHVuZGVmaW5lZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRmFsbGJhY2tcclxuICAgIGNvbnN0IGlkID0gdGhpcy5mYWxsYmFja1N0YXRlLm5leHRJZCsrO1xyXG4gICAgdGhpcy5mYWxsYmFja1N0YXRlLm1lbW9yeS5zZXQoaWQsIHtcclxuICAgICAgY29udGVudCxcclxuICAgICAgZW1iZWRkaW5nOiB0aGlzLmVtYmVkKGNvbnRlbnQpLFxyXG4gICAgICBtZXRhZGF0YTogbWV0YWRhdGEgPz8ge30sXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBpZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFByb3ZpZGUgZmVlZGJhY2sgZm9yIGxlYXJuaW5nXHJcbiAgICovXHJcbiAgZmVlZGJhY2soZmI6IEZlZWRiYWNrKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5uYXRpdmUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmZlZWRiYWNrKGZiLnJlcXVlc3RJZCwgZmIucmF0aW5nLCBmYi5jb3JyZWN0aW9uKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBlbmdpbmUgc3RhdGlzdGljc1xyXG4gICAqL1xyXG4gIHN0YXRzKCk6IFJ1dkxMTVN0YXRzIHtcclxuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xyXG4gICAgICBjb25zdCBzID0gdGhpcy5uYXRpdmUuc3RhdHMoKTtcclxuICAgICAgLy8gTWFwIG5hdGl2ZSBzdGF0cyAoc25ha2VfY2FzZSkgdG8gVHlwZVNjcmlwdCBpbnRlcmZhY2UgKGNhbWVsQ2FzZSlcclxuICAgICAgLy8gSGFuZGxlIGJvdGggb2xkIGFuZCBuZXcgZmllbGQgbmFtZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0b3RhbFF1ZXJpZXM6IHMudG90YWxfcXVlcmllcyA/PyAwLFxyXG4gICAgICAgIG1lbW9yeU5vZGVzOiBzLm1lbW9yeV9ub2RlcyA/PyAwLFxyXG4gICAgICAgIHBhdHRlcm5zTGVhcm5lZDogcy5wYXR0ZXJuc19sZWFybmVkID8/IChzIGFzIGFueSkudHJhaW5pbmdfc3RlcHMgPz8gMCxcclxuICAgICAgICBhdmdMYXRlbmN5TXM6IHMuYXZnX2xhdGVuY3lfbXMgPz8gMCxcclxuICAgICAgICBjYWNoZUhpdFJhdGU6IHMuY2FjaGVfaGl0X3JhdGUgPz8gMCxcclxuICAgICAgICByb3V0ZXJBY2N1cmFjeTogcy5yb3V0ZXJfYWNjdXJhY3kgPz8gMC41LFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEZhbGxiYWNrXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0b3RhbFF1ZXJpZXM6IHRoaXMuZmFsbGJhY2tTdGF0ZS5xdWVyeUNvdW50LFxyXG4gICAgICBtZW1vcnlOb2RlczogdGhpcy5mYWxsYmFja1N0YXRlLm1lbW9yeS5zaXplLFxyXG4gICAgICBwYXR0ZXJuc0xlYXJuZWQ6IDAsXHJcbiAgICAgIGF2Z0xhdGVuY3lNczogMS4wLFxyXG4gICAgICBjYWNoZUhpdFJhdGU6IDAuMCxcclxuICAgICAgcm91dGVyQWNjdXJhY3k6IDAuNSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGb3JjZSByb3V0ZXIgbGVhcm5pbmcgY3ljbGVcclxuICAgKi9cclxuICBmb3JjZUxlYXJuKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5uYXRpdmUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmZvcmNlTGVhcm4oKTtcclxuICAgIH1cclxuICAgIHJldHVybiAnTGVhcm5pbmcgbm90IGF2YWlsYWJsZSBpbiBmYWxsYmFjayBtb2RlJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBlbWJlZGRpbmcgZm9yIHRleHRcclxuICAgKi9cclxuICBlbWJlZCh0ZXh0OiBzdHJpbmcpOiBFbWJlZGRpbmcge1xyXG4gICAgaWYgKHRoaXMubmF0aXZlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm5hdGl2ZS5lbWJlZCh0ZXh0KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGYWxsYmFjayAtIHNpbXBsZSBoYXNoLWJhc2VkIGVtYmVkZGluZ1xyXG4gICAgY29uc3QgZGltID0gdGhpcy5jb25maWcuZW1iZWRkaW5nRGltID8/IDc2ODtcclxuICAgIGNvbnN0IGVtYmVkZGluZyA9IG5ldyBBcnJheShkaW0pLmZpbGwoMCk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGlkeCA9ICh0ZXh0LmNoYXJDb2RlQXQoaSkgKiAoaSArIDEpKSAlIGRpbTtcclxuICAgICAgZW1iZWRkaW5nW2lkeF0gKz0gMC4xO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE5vcm1hbGl6ZVxyXG4gICAgY29uc3Qgbm9ybSA9IE1hdGguc3FydChlbWJlZGRpbmcucmVkdWNlKChzdW0sIHgpID0+IHN1bSArIHggKiB4LCAwKSkgfHwgMTtcclxuICAgIHJldHVybiBlbWJlZGRpbmcubWFwKHggPT4geCAvIG5vcm0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29tcHV0ZSBzaW1pbGFyaXR5IGJldHdlZW4gdHdvIHRleHRzXHJcbiAgICovXHJcbiAgc2ltaWxhcml0eSh0ZXh0MTogc3RyaW5nLCB0ZXh0Mjogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5uYXRpdmUuc2ltaWxhcml0eSh0ZXh0MSwgdGV4dDIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEZhbGxiYWNrIC0gY29zaW5lIHNpbWlsYXJpdHlcclxuICAgIGNvbnN0IGVtYjEgPSB0aGlzLmVtYmVkKHRleHQxKTtcclxuICAgIGNvbnN0IGVtYjIgPSB0aGlzLmVtYmVkKHRleHQyKTtcclxuXHJcbiAgICBsZXQgZG90ID0gMDtcclxuICAgIGxldCBub3JtMSA9IDA7XHJcbiAgICBsZXQgbm9ybTIgPSAwO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW1iMS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBkb3QgKz0gZW1iMVtpXSAqIGVtYjJbaV07XHJcbiAgICAgIG5vcm0xICs9IGVtYjFbaV0gKiBlbWIxW2ldO1xyXG4gICAgICBub3JtMiArPSBlbWIyW2ldICogZW1iMltpXTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkZW5vbSA9IE1hdGguc3FydChub3JtMSkgKiBNYXRoLnNxcnQobm9ybTIpO1xyXG4gICAgY29uc3Qgc2ltaWxhcml0eSA9IGRlbm9tID4gMCA/IGRvdCAvIGRlbm9tIDogMDtcclxuICAgIC8vIENsYW1wIHRvIFswLCAxXSB0byBoYW5kbGUgZmxvYXRpbmcgcG9pbnQgZXJyb3JzXHJcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgc2ltaWxhcml0eSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgU0lNRCBpcyBhdmFpbGFibGVcclxuICAgKi9cclxuICBoYXNTaW1kKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMubmF0aXZlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm5hdGl2ZS5oYXNTaW1kKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgU0lNRCBjYXBhYmlsaXRpZXNcclxuICAgKi9cclxuICBzaW1kQ2FwYWJpbGl0aWVzKCk6IHN0cmluZ1tdIHtcclxuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5uYXRpdmUuc2ltZENhcGFiaWxpdGllcygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFsnU2NhbGFyIChmYWxsYmFjayknXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJhdGNoIHF1ZXJ5IG11bHRpcGxlIHByb21wdHNcclxuICAgKi9cclxuICBiYXRjaFF1ZXJ5KHJlcXVlc3Q6IEJhdGNoUXVlcnlSZXF1ZXN0KTogQmF0Y2hRdWVyeVJlc3BvbnNlIHtcclxuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgIGNvbnN0IHJlc3BvbnNlcyA9IHJlcXVlc3QucXVlcmllcy5tYXAocSA9PiB0aGlzLnF1ZXJ5KHEsIHJlcXVlc3QuY29uZmlnKSk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICByZXNwb25zZXMsXHJcbiAgICAgIHRvdGFsTGF0ZW5jeU1zOiBEYXRlLm5vdygpIC0gc3RhcnQsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgbmF0aXZlIG1vZHVsZSBpcyBsb2FkZWRcclxuICAgKi9cclxuICBpc05hdGl2ZUxvYWRlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm5hdGl2ZSAhPT0gbnVsbDtcclxuICB9XHJcbn1cclxuIl19
|
|
317
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VuZ2luZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQWVILE9BQU8sRUFDTCxlQUFlLEdBSWhCLE1BQU0sVUFBVSxDQUFDO0FBRWxCOztHQUVHO0FBQ0gsU0FBUyxjQUFjLENBQUMsTUFBcUI7SUFDM0MsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUU5QixPQUFPO1FBQ0wsYUFBYSxFQUFFLE1BQU0sQ0FBQyxZQUFZO1FBQ2xDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxlQUFlO1FBQ3pDLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSztRQUNwQixvQkFBb0IsRUFBRSxNQUFNLENBQUMsa0JBQWtCO1FBQy9DLGNBQWMsRUFBRSxNQUFNLENBQUMsWUFBWTtRQUNuQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsZUFBZTtRQUN4QyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO1FBQzFDLFVBQVUsRUFBRSxNQUFNLENBQUMsU0FBUztLQUM3QixDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxNQUF5QjtJQUNsRCxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRTlCLE9BQU87UUFDTCxVQUFVLEVBQUUsTUFBTSxDQUFDLFNBQVM7UUFDNUIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO1FBQy9CLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSTtRQUNsQixLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDbEIsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLGlCQUFpQjtLQUM3QyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxPQUFPLE1BQU07SUFXakI7O09BRUc7SUFDSCxZQUFZLE1BQXFCO1FBYnpCLFdBQU0sR0FBd0IsSUFBSSxDQUFD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LEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQjtRQUNkLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hDLENBQUM7UUFDRCxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsT0FBMEI7UUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDMUUsT0FBTztZQUNMLFNBQVM7WUFDVCxjQUFjLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUs7U0FDbkMsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDO0lBQzlCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUnV2TExNIEVuZ2luZSAtIE1haW4gb3JjaGVzdHJhdG9yIGZvciBzZWxmLWxlYXJuaW5nIExMTVxuICovXG5cbmltcG9ydCB7XG4gIFJ1dkxMTUNvbmZpZyxcbiAgR2VuZXJhdGlvbkNvbmZpZyxcbiAgUXVlcnlSZXNwb25zZSxcbiAgUm91dGluZ0RlY2lzaW9uLFxuICBNZW1vcnlSZXN1bHQsXG4gIFJ1dkxMTVN0YXRzLFxuICBGZWVkYmFjayxcbiAgRW1iZWRkaW5nLFxuICBCYXRjaFF1ZXJ5UmVxdWVzdCxcbiAgQmF0Y2hRdWVyeVJlc3BvbnNlLFxufSBmcm9tICcuL3R5cGVzJztcblxuaW1wb3J0IHtcbiAgZ2V0TmF0aXZlTW9kdWxlLFxuICBOYXRpdmVFbmdpbmUsXG4gIE5hdGl2ZUNvbmZpZyxcbiAgTmF0aXZlR2VuQ29uZmlnLFxufSBmcm9tICcuL25hdGl2ZSc7XG5cbi8qKlxuICogQ29udmVydCBKUyBjb25maWcgdG8gbmF0aXZlIGNvbmZpZyBmb3JtYXRcbiAqL1xuZnVuY3Rpb24gdG9OYXRpdmVDb25maWcoY29uZmlnPzogUnV2TExNQ29uZmlnKTogTmF0aXZlQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb25maWcpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICBlbWJlZGRpbmdfZGltOiBjb25maWcuZW1iZWRkaW5nRGltLFxuICAgIHJvdXRlcl9oaWRkZW5fZGltOiBjb25maWcucm91dGVySGlkZGVuRGltLFxuICAgIGhuc3dfbTogY29uZmlnLmhuc3dNLFxuICAgIGhuc3dfZWZfY29uc3RydWN0aW9uOiBjb25maWcuaG5zd0VmQ29uc3RydWN0aW9uLFxuICAgIGhuc3dfZWZfc2VhcmNoOiBjb25maWcuaG5zd0VmU2VhcmNoLFxuICAgIGxlYXJuaW5nX2VuYWJsZWQ6IGNvbmZpZy5sZWFybmluZ0VuYWJsZWQsXG4gICAgcXVhbGl0eV90aHJlc2hvbGQ6IGNvbmZpZy5xdWFsaXR5VGhyZXNob2xkLFxuICAgIGV3Y19sYW1iZGE6IGNvbmZpZy5ld2NMYW1iZGEsXG4gIH07XG59XG5cbi8qKlxuICogQ29udmVydCBKUyBnZW5lcmF0aW9uIGNvbmZpZyB0byBuYXRpdmUgZm9ybWF0XG4gKi9cbmZ1bmN0aW9uIHRvTmF0aXZlR2VuQ29uZmlnKGNvbmZpZz86IEdlbmVyYXRpb25Db25maWcpOiBOYXRpdmVHZW5Db25maWcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbmZpZykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIG1heF90b2tlbnM6IGNvbmZpZy5tYXhUb2tlbnMsXG4gICAgdGVtcGVyYXR1cmU6IGNvbmZpZy50ZW1wZXJhdHVyZSxcbiAgICB0b3BfcDogY29uZmlnLnRvcFAsXG4gICAgdG9wX2s6IGNvbmZpZy50b3BLLFxuICAgIHJlcGV0aXRpb25fcGVuYWx0eTogY29uZmlnLnJlcGV0aXRpb25QZW5hbHR5LFxuICB9O1xufVxuXG4vKipcbiAqIFJ1dkxMTSAtIFNlbGYtbGVhcm5pbmcgTExNIG9yY2hlc3RyYXRvclxuICpcbiAqIENvbWJpbmVzIFNPTkEgYWRhcHRpdmUgbGVhcm5pbmcgd2l0aCBITlNXIG1lbW9yeSxcbiAqIEZhc3RHUk5OIHJvdXRpbmcsIGFuZCBTSU1ELW9wdGltaXplZCBpbmZlcmVuY2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IFJ1dkxMTSB9IGZyb20gJ0BydXZlY3Rvci9ydXZsbG0nO1xuICpcbiAqIGNvbnN0IGxsbSA9IG5ldyBSdXZMTE0oeyBlbWJlZGRpbmdEaW06IDc2OCB9KTtcbiAqXG4gKiAvLyBRdWVyeSB3aXRoIGF1dG9tYXRpYyByb3V0aW5nXG4gKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IGxsbS5xdWVyeSgnV2hhdCBpcyBtYWNoaW5lIGxlYXJuaW5nPycpO1xuICogY29uc29sZS5sb2cocmVzcG9uc2UudGV4dCk7XG4gKlxuICogLy8gUHJvdmlkZSBmZWVkYmFjayBmb3IgbGVhcm5pbmdcbiAqIGxsbS5mZWVkYmFjayh7IHJlcXVlc3RJZDogcmVzcG9uc2UucmVxdWVzdElkLCByYXRpbmc6IDUgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFJ1dkxMTSB7XG4gIHByaXZhdGUgbmF0aXZlOiBOYXRpdmVFbmdpbmUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb25maWc6IFJ1dkxMTUNvbmZpZztcblxuICAvLyBGYWxsYmFjayBzdGF0ZSBmb3Igd2hlbiBuYXRpdmUgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGVcbiAgcHJpdmF0ZSBmYWxsYmFja1N0YXRlID0ge1xuICAgIG1lbW9yeTogbmV3IE1hcDxudW1iZXIsIHsgY29udGVudDogc3RyaW5nOyBlbWJlZGRpbmc6IG51bWJlcltdOyBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfT4oKSxcbiAgICBuZXh0SWQ6IDEsXG4gICAgcXVlcnlDb3VudDogMCxcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IFJ1dkxMTSBpbnN0YW5jZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnPzogUnV2TExNQ29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWcgPz8ge307XG5cbiAgICBjb25zdCBtb2QgPSBnZXROYXRpdmVNb2R1bGUoKTtcbiAgICBpZiAobW9kKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLm5hdGl2ZSA9IG5ldyBtb2QuUnV2TExNRW5naW5lKHRvTmF0aXZlQ29uZmlnKGNvbmZpZykpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFNpbGVudGx5IGZhbGwgYmFjayB0byBKUyBpbXBsZW1lbnRhdGlvblxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBRdWVyeSB0aGUgTExNIHdpdGggYXV0b21hdGljIHJvdXRpbmdcbiAgICovXG4gIHF1ZXJ5KHRleHQ6IHN0cmluZywgY29uZmlnPzogR2VuZXJhdGlvbkNvbmZpZyk6IFF1ZXJ5UmVzcG9uc2Uge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5uYXRpdmUucXVlcnkodGV4dCwgdG9OYXRpdmVHZW5Db25maWcoY29uZmlnKSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0ZXh0OiByZXN1bHQudGV4dCxcbiAgICAgICAgY29uZmlkZW5jZTogcmVzdWx0LmNvbmZpZGVuY2UsXG4gICAgICAgIG1vZGVsOiByZXN1bHQubW9kZWwsXG4gICAgICAgIGNvbnRleHRTaXplOiByZXN1bHQuY29udGV4dF9zaXplLFxuICAgICAgICBsYXRlbmN5TXM6IHJlc3VsdC5sYXRlbmN5X21zLFxuICAgICAgICByZXF1ZXN0SWQ6IHJlc3VsdC5yZXF1ZXN0X2lkLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBpbXBsZW1lbnRhdGlvblxuICAgIHRoaXMuZmFsbGJhY2tTdGF0ZS5xdWVyeUNvdW50Kys7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHQ6IGBbRmFsbGJhY2tdIFJlc3BvbnNlIHRvOiAke3RleHQuc2xpY2UoMCwgNTApfS4uLmAsXG4gICAgICBjb25maWRlbmNlOiAwLjUsXG4gICAgICBtb2RlbDogJ2ZhbGxiYWNrJyxcbiAgICAgIGNvbnRleHRTaXplOiA1MTIsXG4gICAgICBsYXRlbmN5TXM6IDEuMCxcbiAgICAgIHJlcXVlc3RJZDogYGZiLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKX1gLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgdGV4dCB3aXRoIFNJTUQtb3B0aW1pemVkIGluZmVyZW5jZVxuICAgKlxuICAgKiBOb3RlOiBJZiBubyB0cmFpbmVkIG1vZGVsIGlzIGxvYWRlZCAoZGVtbyBtb2RlKSwgcmV0dXJucyBhbiBpbmZvcm1hdGlvbmFsXG4gICAqIG1lc3NhZ2UgaW5zdGVhZCBvZiBnYXJibGVkIG91dHB1dC5cbiAgICovXG4gIGdlbmVyYXRlKHByb21wdDogc3RyaW5nLCBjb25maWc/OiBHZW5lcmF0aW9uQ29uZmlnKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5uYXRpdmUpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hdGl2ZS5nZW5lcmF0ZShwcm9tcHQsIHRvTmF0aXZlR2VuQ29uZmlnKGNvbmZpZykpO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIC0gcHJvdmlkZSBoZWxwZnVsIG1lc3NhZ2UgaW5zdGVhZCBvZiBnYXJibGVkIG91dHB1dFxuICAgIGNvbnN0IG1heFRva2VucyA9IGNvbmZpZz8ubWF4VG9rZW5zID8/IDI1NjtcbiAgICBjb25zdCB0ZW1wID0gY29uZmlnPy50ZW1wZXJhdHVyZSA/PyAwLjc7XG4gICAgY29uc3QgdG9wUCA9IGNvbmZpZz8udG9wUCA/PyAwLjk7XG5cbiAgICByZXR1cm4gYFtSdXZMTE0gSmF2YVNjcmlwdCBGYWxsYmFjayBNb2RlXVxuTm8gbmF0aXZlIFNJTUQgbW9kdWxlIGxvYWRlZC4gUnVubmluZyBpbiBKYXZhU2NyaXB0IGZhbGxiYWNrIG1vZGUuXG5cbllvdXIgcHJvbXB0OiBcIiR7cHJvbXB0LnNsaWNlKDAsIDEwMCl9JHtwcm9tcHQubGVuZ3RoID4gMTAwID8gJy4uLicgOiAnJ31cIlxuXG5UbyBlbmFibGUgbmF0aXZlIFNJTUQgaW5mZXJlbmNlOlxuMS4gSW5zdGFsbCB0aGUgbmF0aXZlIGJpbmRpbmdzOiBucG0gaW5zdGFsbCBAcnV2ZWN0b3IvcnV2bGxtLSR7cHJvY2Vzcy5wbGF0Zm9ybX0tJHtwcm9jZXNzLmFyY2h9XG4yLiBPciBsb2FkIGEgR0dVRiBtb2RlbCBmaWxlXG4zLiBPciBjb25uZWN0IHRvIGFuIGV4dGVybmFsIExMTSBBUElcblxuQ29uZmlnOiB0ZW1wPSR7dGVtcC50b0ZpeGVkKDIpfSwgdG9wX3A9JHt0b3BQLnRvRml4ZWQoMil9LCBtYXhfdG9rZW5zPSR7bWF4VG9rZW5zfVxuXG5UaGlzIGZhbGxiYWNrIHByb3ZpZGVzIHJvdXRpbmcsIG1lbW9yeSwgYW5kIGVtYmVkZGluZyBmZWF0dXJlcyBidXQgbm90IGZ1bGwgdGV4dCBnZW5lcmF0aW9uLmA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJvdXRpbmcgZGVjaXNpb24gZm9yIGEgcXVlcnlcbiAgICovXG4gIHJvdXRlKHRleHQ6IHN0cmluZyk6IFJvdXRpbmdEZWNpc2lvbiB7XG4gICAgaWYgKHRoaXMubmF0aXZlKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm5hdGl2ZS5yb3V0ZSh0ZXh0KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1vZGVsOiByZXN1bHQubW9kZWwgYXMgYW55LFxuICAgICAgICBjb250ZXh0U2l6ZTogcmVzdWx0LmNvbnRleHRfc2l6ZSxcbiAgICAgICAgdGVtcGVyYXR1cmU6IHJlc3VsdC50ZW1wZXJhdHVyZSxcbiAgICAgICAgdG9wUDogcmVzdWx0LnRvcF9wLFxuICAgICAgICBjb25maWRlbmNlOiByZXN1bHQuY29uZmlkZW5jZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2tcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWw6ICdNNzAwJyxcbiAgICAgIGNvbnRleHRTaXplOiA1MTIsXG4gICAgICB0ZW1wZXJhdHVyZTogMC43LFxuICAgICAgdG9wUDogMC45LFxuICAgICAgY29uZmlkZW5jZTogMC41LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIG1lbW9yeSBmb3Igc2ltaWxhciBjb250ZW50XG4gICAqL1xuICBzZWFyY2hNZW1vcnkodGV4dDogc3RyaW5nLCBrID0gMTApOiBNZW1vcnlSZXN1bHRbXSB7XG4gICAgaWYgKHRoaXMubmF0aXZlKSB7XG4gICAgICBjb25zdCByZXN1bHRzID0gdGhpcy5uYXRpdmUuc2VhcmNoTWVtb3J5KHRleHQsIGspO1xuICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKHIgPT4gKHtcbiAgICAgICAgaWQ6IHIuaWQsXG4gICAgICAgIHNjb3JlOiByLnNjb3JlLFxuICAgICAgICBjb250ZW50OiByLmNvbnRlbnQsXG4gICAgICAgIG1ldGFkYXRhOiBKU09OLnBhcnNlKHIubWV0YWRhdGEgfHwgJ3t9JyksXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgLSBzaW1wbGUgc2VhcmNoXG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5mYWxsYmFja1N0YXRlLm1lbW9yeS5lbnRyaWVzKCkpXG4gICAgICAuc2xpY2UoMCwgaylcbiAgICAgIC5tYXAoKFtpZCwgZGF0YV0pID0+ICh7XG4gICAgICAgIGlkLFxuICAgICAgICBzY29yZTogMC41LFxuICAgICAgICBjb250ZW50OiBkYXRhLmNvbnRlbnQsXG4gICAgICAgIG1ldGFkYXRhOiBkYXRhLm1ldGFkYXRhLFxuICAgICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBjb250ZW50IHRvIG1lbW9yeVxuICAgKi9cbiAgYWRkTWVtb3J5KGNvbnRlbnQ6IHN0cmluZywgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IG51bWJlciB7XG4gICAgaWYgKHRoaXMubmF0aXZlKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXRpdmUuYWRkTWVtb3J5KGNvbnRlbnQsIG1ldGFkYXRhID8gSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEpIDogdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFja1xuICAgIGNvbnN0IGlkID0gdGhpcy5mYWxsYmFja1N0YXRlLm5leHRJZCsrO1xuICAgIHRoaXMuZmFsbGJhY2tTdGF0ZS5tZW1vcnkuc2V0KGlkLCB7XG4gICAgICBjb250ZW50LFxuICAgICAgZW1iZWRkaW5nOiB0aGlzLmVtYmVkKGNvbnRlbnQpLFxuICAgICAgbWV0YWRhdGE6IG1ldGFkYXRhID8/IHt9LFxuICAgIH0pO1xuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlIGZlZWRiYWNrIGZvciBsZWFybmluZ1xuICAgKi9cbiAgZmVlZGJhY2soZmI6IEZlZWRiYWNrKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubmF0aXZlKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXRpdmUuZmVlZGJhY2soZmIucmVxdWVzdElkLCBmYi5yYXRpbmcsIGZiLmNvcnJlY3Rpb24pO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGVuZ2luZSBzdGF0aXN0aWNzXG4gICAqL1xuICBzdGF0cygpOiBSdXZMTE1TdGF0cyB7XG4gICAgaWYgKHRoaXMubmF0aXZlKSB7XG4gICAgICBjb25zdCBzID0gdGhpcy5uYXRpdmUuc3RhdHMoKTtcbiAgICAgIC8vIE1hcCBuYXRpdmUgc3RhdHMgKHNuYWtlX2Nhc2UpIHRvIFR5cGVTY3JpcHQgaW50ZXJmYWNlIChjYW1lbENhc2UpXG4gICAgICAvLyBIYW5kbGUgYm90aCBvbGQgYW5kIG5ldyBmaWVsZCBuYW1lcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG90YWxRdWVyaWVzOiBzLnRvdGFsX3F1ZXJpZXMgPz8gMCxcbiAgICAgICAgbWVtb3J5Tm9kZXM6IHMubWVtb3J5X25vZGVzID8/IDAsXG4gICAgICAgIHBhdHRlcm5zTGVhcm5lZDogcy5wYXR0ZXJuc19sZWFybmVkID8/IChzIGFzIGFueSkudHJhaW5pbmdfc3RlcHMgPz8gMCxcbiAgICAgICAgYXZnTGF0ZW5jeU1zOiBzLmF2Z19sYXRlbmN5X21zID8/IDAsXG4gICAgICAgIGNhY2hlSGl0UmF0ZTogcy5jYWNoZV9oaXRfcmF0ZSA/PyAwLFxuICAgICAgICByb3V0ZXJBY2N1cmFjeTogcy5yb3V0ZXJfYWNjdXJhY3kgPz8gMC41LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFja1xuICAgIHJldHVybiB7XG4gICAgICB0b3RhbFF1ZXJpZXM6IHRoaXMuZmFsbGJhY2tTdGF0ZS5xdWVyeUNvdW50LFxuICAgICAgbWVtb3J5Tm9kZXM6IHRoaXMuZmFsbGJhY2tTdGF0ZS5tZW1vcnkuc2l6ZSxcbiAgICAgIHBhdHRlcm5zTGVhcm5lZDogMCxcbiAgICAgIGF2Z0xhdGVuY3lNczogMS4wLFxuICAgICAgY2FjaGVIaXRSYXRlOiAwLjAsXG4gICAgICByb3V0ZXJBY2N1cmFjeTogMC41LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRm9yY2Ugcm91dGVyIGxlYXJuaW5nIGN5Y2xlXG4gICAqL1xuICBmb3JjZUxlYXJuKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMubmF0aXZlKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXRpdmUuZm9yY2VMZWFybigpO1xuICAgIH1cbiAgICByZXR1cm4gJ0xlYXJuaW5nIG5vdCBhdmFpbGFibGUgaW4gZmFsbGJhY2sgbW9kZSc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGVtYmVkZGluZyBmb3IgdGV4dFxuICAgKi9cbiAgZW1iZWQodGV4dDogc3RyaW5nKTogRW1iZWRkaW5nIHtcbiAgICBpZiAodGhpcy5uYXRpdmUpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hdGl2ZS5lbWJlZCh0ZXh0KTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayAtIHNpbXBsZSBoYXNoLWJhc2VkIGVtYmVkZGluZ1xuICAgIGNvbnN0IGRpbSA9IHRoaXMuY29uZmlnLmVtYmVkZGluZ0RpbSA/PyA3Njg7XG4gICAgY29uc3QgZW1iZWRkaW5nID0gbmV3IEFycmF5KGRpbSkuZmlsbCgwKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaWR4ID0gKHRleHQuY2hhckNvZGVBdChpKSAqIChpICsgMSkpICUgZGltO1xuICAgICAgZW1iZWRkaW5nW2lkeF0gKz0gMC4xO1xuICAgIH1cblxuICAgIC8vIE5vcm1hbGl6ZVxuICAgIGNvbnN0IG5vcm0gPSBNYXRoLnNxcnQoZW1iZWRkaW5nLnJlZHVjZSgoc3VtLCB4KSA9PiBzdW0gKyB4ICogeCwgMCkpIHx8IDE7XG4gICAgcmV0dXJuIGVtYmVkZGluZy5tYXAoeCA9PiB4IC8gbm9ybSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZSBzaW1pbGFyaXR5IGJldHdlZW4gdHdvIHRleHRzXG4gICAqL1xuICBzaW1pbGFyaXR5KHRleHQxOiBzdHJpbmcsIHRleHQyOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLnNpbWlsYXJpdHkodGV4dDEsIHRleHQyKTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayAtIGNvc2luZSBzaW1pbGFyaXR5XG4gICAgY29uc3QgZW1iMSA9IHRoaXMuZW1iZWQodGV4dDEpO1xuICAgIGNvbnN0IGVtYjIgPSB0aGlzLmVtYmVkKHRleHQyKTtcblxuICAgIGxldCBkb3QgPSAwO1xuICAgIGxldCBub3JtMSA9IDA7XG4gICAgbGV0IG5vcm0yID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW1iMS5sZW5ndGg7IGkrKykge1xuICAgICAgZG90ICs9IGVtYjFbaV0gKiBlbWIyW2ldO1xuICAgICAgbm9ybTEgKz0gZW1iMVtpXSAqIGVtYjFbaV07XG4gICAgICBub3JtMiArPSBlbWIyW2ldICogZW1iMltpXTtcbiAgICB9XG5cbiAgICBjb25zdCBkZW5vbSA9IE1hdGguc3FydChub3JtMSkgKiBNYXRoLnNxcnQobm9ybTIpO1xuICAgIGNvbnN0IHNpbWlsYXJpdHkgPSBkZW5vbSA+IDAgPyBkb3QgLyBkZW5vbSA6IDA7XG4gICAgLy8gQ2xhbXAgdG8gWzAsIDFdIHRvIGhhbmRsZSBmbG9hdGluZyBwb2ludCBlcnJvcnNcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgc2ltaWxhcml0eSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIFNJTUQgaXMgYXZhaWxhYmxlXG4gICAqL1xuICBoYXNTaW1kKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmhhc1NpbWQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBTSU1EIGNhcGFiaWxpdGllc1xuICAgKi9cbiAgc2ltZENhcGFiaWxpdGllcygpOiBzdHJpbmdbXSB7XG4gICAgaWYgKHRoaXMubmF0aXZlKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXRpdmUuc2ltZENhcGFiaWxpdGllcygpO1xuICAgIH1cbiAgICByZXR1cm4gWydTY2FsYXIgKGZhbGxiYWNrKSddO1xuICB9XG5cbiAgLyoqXG4gICAqIEJhdGNoIHF1ZXJ5IG11bHRpcGxlIHByb21wdHNcbiAgICovXG4gIGJhdGNoUXVlcnkocmVxdWVzdDogQmF0Y2hRdWVyeVJlcXVlc3QpOiBCYXRjaFF1ZXJ5UmVzcG9uc2Uge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCByZXNwb25zZXMgPSByZXF1ZXN0LnF1ZXJpZXMubWFwKHEgPT4gdGhpcy5xdWVyeShxLCByZXF1ZXN0LmNvbmZpZykpO1xuICAgIHJldHVybiB7XG4gICAgICByZXNwb25zZXMsXG4gICAgICB0b3RhbExhdGVuY3lNczogRGF0ZS5ub3coKSAtIHN0YXJ0LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgbmF0aXZlIG1vZHVsZSBpcyBsb2FkZWRcbiAgICovXG4gIGlzTmF0aXZlTG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm5hdGl2ZSAhPT0gbnVsbDtcbiAgfVxufVxuIl19
|