@cdklabs/cdk-appmod-catalog-blueprints 1.16.1 → 1.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +963 -146
- package/lib/document-processing/adapter/queued-s3-adapter.js +39 -5
- package/lib/document-processing/agentic-document-processing.js +6 -4
- package/lib/document-processing/base-document-processing.js +16 -4
- package/lib/document-processing/bedrock-document-processing.d.ts +1 -0
- package/lib/document-processing/bedrock-document-processing.js +117 -70
- package/lib/document-processing/default-document-processing-config.js +3 -5
- package/lib/document-processing/index.d.ts +2 -0
- package/lib/document-processing/index.js +3 -1
- package/lib/document-processing/localstack-agentic-document-processing.d.ts +20 -0
- package/lib/document-processing/localstack-agentic-document-processing.js +99 -0
- package/lib/document-processing/localstack-bedrock-document-processing.d.ts +16 -0
- package/lib/document-processing/localstack-bedrock-document-processing.js +69 -0
- package/lib/document-processing/resources/cleanup/handler.py +16 -1
- package/lib/document-processing/resources/default-localstack-invoke/index.py +184 -0
- package/lib/document-processing/resources/default-localstack-invoke/provider_runtime.py +251 -0
- package/lib/document-processing/resources/default-localstack-invoke/requirements.txt +5 -0
- package/lib/document-processing/resources/default-sqs-consumer/index.py +17 -2
- package/lib/document-processing/resources/pdf-chunking/handler.py +16 -1
- package/lib/document-processing/tests/base-document-processing-nag.test.js +3 -1
- package/lib/document-processing/tests/base-document-processing-schema.test.js +6 -1
- package/lib/document-processing/tests/base-document-processing.test.js +12 -1
- package/lib/document-processing/tests/localstack-agentic-document-processing.test.d.ts +1 -0
- package/lib/document-processing/tests/localstack-agentic-document-processing.test.js +111 -0
- package/lib/document-processing/tests/localstack-document-processing.test.d.ts +1 -0
- package/lib/document-processing/tests/localstack-document-processing.test.js +149 -0
- package/lib/document-processing/tests/queued-s3-adapter-nag.test.js +3 -1
- package/lib/document-processing/tests/queued-s3-adapter.test.js +3 -1
- package/lib/framework/agents/base-agent.js +31 -4
- package/lib/framework/agents/batch-agent.d.ts +1 -0
- package/lib/framework/agents/batch-agent.js +42 -7
- package/lib/framework/agents/default-agent-config.js +3 -5
- package/lib/framework/agents/index.d.ts +1 -0
- package/lib/framework/agents/index.js +2 -1
- package/lib/framework/agents/interactive-agent.js +115 -23
- package/lib/framework/agents/knowledge-base/base-knowledge-base.js +30 -4
- package/lib/framework/agents/knowledge-base/bedrock-knowledge-base.js +81 -5
- package/lib/framework/agents/localstack-batch-agent.d.ts +15 -0
- package/lib/framework/agents/localstack-batch-agent.js +64 -0
- package/lib/framework/agents/resources/default-ollama-agent/batch.py +396 -0
- package/lib/framework/agents/resources/default-ollama-agent/models.py +7 -0
- package/lib/framework/agents/resources/default-ollama-agent/requirements.txt +9 -0
- package/lib/framework/agents/resources/default-ollama-agent/runtime_support.py +237 -0
- package/lib/framework/agents/resources/default-ollama-agent/utils.py +77 -0
- package/lib/framework/agents/tests/agent-knowledge-base-nag.test.js +35 -2
- package/lib/framework/bedrock/bedrock.d.ts +9 -0
- package/lib/framework/bedrock/bedrock.js +20 -12
- package/lib/framework/custom-resource/default-runtimes.js +20 -22
- package/lib/framework/foundation/access-log.js +50 -7
- package/lib/framework/foundation/eventbridge-broker.js +5 -4
- package/lib/framework/foundation/network.js +4 -4
- package/lib/framework/index.d.ts +1 -0
- package/lib/framework/index.js +2 -1
- package/lib/framework/localstack/index.d.ts +1 -0
- package/lib/framework/localstack/index.js +18 -0
- package/lib/framework/localstack/localstack-config.d.ts +79 -0
- package/lib/framework/localstack/localstack-config.js +47 -0
- package/lib/framework/tests/base-agent-knowledge-base.test.js +35 -2
- package/lib/framework/tests/batch-agent.test.js +35 -2
- package/lib/framework/tests/framework-nag.test.js +35 -2
- package/lib/framework/tests/interactive-agent-nag.test.js +35 -2
- package/lib/framework/tests/interactive-agent.test.js +35 -2
- package/lib/framework/tests/localstack-batch-agent.test.d.ts +1 -0
- package/lib/framework/tests/localstack-batch-agent.test.js +100 -0
- package/lib/utilities/data-loader.js +50 -5
- package/lib/utilities/lambda-iam-utils.js +38 -7
- package/lib/utilities/lambda_layers/data-masking/layer-construct.js +40 -3
- package/lib/utilities/observability/bedrock-observability.js +38 -2
- package/lib/utilities/observability/cloudfront-distribution-observability-property-injector.js +3 -4
- package/lib/utilities/observability/cloudwatch-transaction-search.js +36 -5
- package/lib/utilities/observability/default-observability-config.js +6 -8
- package/lib/utilities/observability/lambda-observability-property-injector.js +4 -4
- package/lib/utilities/observability/log-group-data-protection-utils.js +2 -4
- package/lib/utilities/observability/observability.js +47 -6
- package/lib/utilities/observability/powertools-config.js +2 -4
- package/lib/utilities/observability/state-machine-observability-property-injector.js +4 -4
- package/lib/webapp/frontend-construct.js +46 -5
- package/lib/webapp/tests/frontend-construct-nag.test.js +36 -3
- package/lib/webapp/tests/frontend-construct.test.js +36 -3
- package/package.json +60 -61
- package/lib/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
import os
|
|
4
|
+
import re
|
|
5
|
+
from typing import Any, Dict, Optional
|
|
6
|
+
from urllib import error as urllib_error
|
|
7
|
+
from urllib import request as urllib_request
|
|
8
|
+
|
|
9
|
+
import boto3
|
|
10
|
+
|
|
11
|
+
MODEL_PROVIDER_BEDROCK = 'bedrock'
|
|
12
|
+
MODEL_PROVIDER_OLLAMA = 'ollama'
|
|
13
|
+
DEFAULT_MODEL_PROVIDER = MODEL_PROVIDER_BEDROCK
|
|
14
|
+
DEFAULT_OLLAMA_BASE_URL = 'http://host.docker.internal:11434'
|
|
15
|
+
OLLAMA_CHAT_PATH = '/api/chat'
|
|
16
|
+
|
|
17
|
+
JSON_CODE_BLOCK_PATTERN = re.compile(r'```(?:json)?\s*({.*?})\s*```', re.DOTALL)
|
|
18
|
+
JSON_OBJECT_PATTERN = re.compile(r'({[^{}]*(?:{[^{}]*}[^{}]*)*})', re.DOTALL)
|
|
19
|
+
MAX_OLLAMA_DOCUMENT_CONTEXT_CHARS = 12000
|
|
20
|
+
MAX_DEBUG_PAYLOAD_CHARS = int(os.getenv('DEBUG_OLLAMA_MAX_CHARS', '4000'))
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _resolve_endpoint_url(*service_env_keys: str) -> Optional[str]:
|
|
24
|
+
for key in service_env_keys:
|
|
25
|
+
endpoint = os.getenv(key)
|
|
26
|
+
if endpoint:
|
|
27
|
+
return endpoint
|
|
28
|
+
return None
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def create_boto3_client(service_name: str, *service_env_keys: str):
|
|
32
|
+
endpoint_url = _resolve_endpoint_url(*service_env_keys, 'AWS_ENDPOINT_URL')
|
|
33
|
+
if endpoint_url:
|
|
34
|
+
return boto3.client(service_name, endpoint_url=endpoint_url)
|
|
35
|
+
return boto3.client(service_name)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _is_truthy_env(var_name: str) -> bool:
|
|
39
|
+
return os.getenv(var_name, '').strip().lower() in {'1', 'true', 'yes', 'on'}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _debug_ollama_enabled() -> bool:
|
|
43
|
+
return _is_truthy_env('DEBUG_OLLAMA_PAYLOAD')
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _truncate_for_debug(text: str, max_chars: int = MAX_DEBUG_PAYLOAD_CHARS) -> str:
|
|
47
|
+
if len(text) <= max_chars:
|
|
48
|
+
return text
|
|
49
|
+
return f'{text[:max_chars]}...[truncated]'
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def resolve_model_provider() -> str:
|
|
53
|
+
provider = os.getenv('MODEL_PROVIDER', DEFAULT_MODEL_PROVIDER).strip().lower()
|
|
54
|
+
if provider in {MODEL_PROVIDER_BEDROCK, MODEL_PROVIDER_OLLAMA}:
|
|
55
|
+
return provider
|
|
56
|
+
return DEFAULT_MODEL_PROVIDER
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _resolve_ollama_model_id(model_id: str) -> str:
|
|
60
|
+
explicit_model = os.getenv('OLLAMA_MODEL_ID')
|
|
61
|
+
if explicit_model:
|
|
62
|
+
return explicit_model
|
|
63
|
+
if model_id.startswith('ollama.'):
|
|
64
|
+
return model_id.split('ollama.', 1)[1]
|
|
65
|
+
if model_id.startswith('ollama/'):
|
|
66
|
+
return model_id.split('ollama/', 1)[1]
|
|
67
|
+
return model_id
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _extract_json_object(response_text: str) -> Optional[Dict[str, Any]]:
|
|
71
|
+
text = response_text.strip()
|
|
72
|
+
if not text:
|
|
73
|
+
return None
|
|
74
|
+
|
|
75
|
+
try:
|
|
76
|
+
parsed = json.loads(text)
|
|
77
|
+
if isinstance(parsed, dict):
|
|
78
|
+
return parsed
|
|
79
|
+
except json.JSONDecodeError:
|
|
80
|
+
pass
|
|
81
|
+
|
|
82
|
+
candidates: list[tuple[Dict[str, Any], int]] = []
|
|
83
|
+
|
|
84
|
+
for json_code_block in JSON_CODE_BLOCK_PATTERN.finditer(response_text):
|
|
85
|
+
try:
|
|
86
|
+
parsed = json.loads(json_code_block.group(1))
|
|
87
|
+
if isinstance(parsed, dict):
|
|
88
|
+
candidates.append((parsed, json_code_block.end()))
|
|
89
|
+
except json.JSONDecodeError:
|
|
90
|
+
pass
|
|
91
|
+
|
|
92
|
+
for raw_json in JSON_OBJECT_PATTERN.finditer(response_text):
|
|
93
|
+
try:
|
|
94
|
+
parsed = json.loads(raw_json.group(1))
|
|
95
|
+
if isinstance(parsed, dict):
|
|
96
|
+
candidates.append((parsed, raw_json.end()))
|
|
97
|
+
except json.JSONDecodeError:
|
|
98
|
+
pass
|
|
99
|
+
|
|
100
|
+
if candidates:
|
|
101
|
+
return max(candidates, key=lambda candidate: candidate[1])[0]
|
|
102
|
+
|
|
103
|
+
return None
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def normalize_model_response(response_text: str, invoke_type: str) -> Dict[str, Any]:
|
|
107
|
+
parsed = _extract_json_object(response_text)
|
|
108
|
+
if parsed is None:
|
|
109
|
+
if invoke_type == 'classification':
|
|
110
|
+
return {'documentClassification': 'UNKNOWN'}
|
|
111
|
+
return {'raw_response': response_text}
|
|
112
|
+
|
|
113
|
+
if invoke_type == 'classification' and 'documentClassification' not in parsed:
|
|
114
|
+
classification = parsed.get('classification') or parsed.get('document_type') or parsed.get('type')
|
|
115
|
+
parsed['documentClassification'] = classification or 'UNKNOWN'
|
|
116
|
+
|
|
117
|
+
return parsed
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def _build_ollama_prompt(content: list[Dict[str, Any]]) -> str:
|
|
121
|
+
prompt_parts = []
|
|
122
|
+
for item in content:
|
|
123
|
+
item_type = item.get('type')
|
|
124
|
+
if item_type == 'text':
|
|
125
|
+
prompt_parts.append(item.get('text', ''))
|
|
126
|
+
continue
|
|
127
|
+
|
|
128
|
+
if item_type in {'document', 'image'}:
|
|
129
|
+
source = item.get('source', {})
|
|
130
|
+
media_type = source.get('media_type', 'application/octet-stream')
|
|
131
|
+
prompt_parts.append(
|
|
132
|
+
f"[Attached {item_type} with media type '{media_type}' omitted in direct Ollama mode.]",
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
return '\n\n'.join(part for part in prompt_parts if part)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def extract_pdf_text_for_ollama(local_path: str) -> str:
|
|
139
|
+
"""Extract text from a PDF file for direct Ollama prompt mode."""
|
|
140
|
+
try:
|
|
141
|
+
from PyPDF2 import PdfReader
|
|
142
|
+
except ImportError:
|
|
143
|
+
return ''
|
|
144
|
+
|
|
145
|
+
text_parts: list[str] = []
|
|
146
|
+
try:
|
|
147
|
+
reader = PdfReader(local_path)
|
|
148
|
+
for page in reader.pages:
|
|
149
|
+
page_text = page.extract_text() or ''
|
|
150
|
+
if page_text:
|
|
151
|
+
text_parts.append(page_text.strip())
|
|
152
|
+
if sum(len(part) for part in text_parts) >= MAX_OLLAMA_DOCUMENT_CONTEXT_CHARS:
|
|
153
|
+
break
|
|
154
|
+
except Exception:
|
|
155
|
+
return ''
|
|
156
|
+
|
|
157
|
+
joined = '\n\n'.join(part for part in text_parts if part)
|
|
158
|
+
if len(joined) > MAX_OLLAMA_DOCUMENT_CONTEXT_CHARS:
|
|
159
|
+
return f'{joined[:MAX_OLLAMA_DOCUMENT_CONTEXT_CHARS]}\n\n[Document text truncated]'
|
|
160
|
+
return joined
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def _invoke_bedrock_model(content: list[Dict[str, Any]], max_tokens: int, model_id: str, bedrock_client) -> str:
|
|
164
|
+
response = bedrock_client.invoke_model(
|
|
165
|
+
modelId=model_id,
|
|
166
|
+
body=json.dumps({
|
|
167
|
+
'anthropic_version': 'bedrock-2023-05-31',
|
|
168
|
+
'max_tokens': max_tokens,
|
|
169
|
+
'messages': [{'role': 'user', 'content': content}],
|
|
170
|
+
}),
|
|
171
|
+
)
|
|
172
|
+
response_payload = response['body'].read()
|
|
173
|
+
parsed_response = json.loads(response_payload)
|
|
174
|
+
return parsed_response['content'][0]['text']
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def _invoke_ollama_model(content: list[Dict[str, Any]], max_tokens: int, model_id: str, logger: logging.Logger) -> str:
|
|
178
|
+
ollama_base_url = os.getenv('OLLAMA_BASE_URL', DEFAULT_OLLAMA_BASE_URL).rstrip('/')
|
|
179
|
+
ollama_model_id = _resolve_ollama_model_id(model_id)
|
|
180
|
+
ollama_prompt = _build_ollama_prompt(content)
|
|
181
|
+
ollama_num_ctx = os.getenv('OLLAMA_NUM_CTX')
|
|
182
|
+
|
|
183
|
+
options: Dict[str, Any] = {
|
|
184
|
+
'num_predict': max_tokens,
|
|
185
|
+
}
|
|
186
|
+
if ollama_num_ctx:
|
|
187
|
+
try:
|
|
188
|
+
options['num_ctx'] = int(ollama_num_ctx)
|
|
189
|
+
except ValueError:
|
|
190
|
+
logger.warning('Ignoring invalid OLLAMA_NUM_CTX value: %s', ollama_num_ctx)
|
|
191
|
+
|
|
192
|
+
request_payload: Dict[str, Any] = {
|
|
193
|
+
'model': ollama_model_id,
|
|
194
|
+
'messages': [{'role': 'user', 'content': ollama_prompt}],
|
|
195
|
+
'stream': False,
|
|
196
|
+
'options': options,
|
|
197
|
+
}
|
|
198
|
+
request_body = json.dumps(request_payload).encode('utf-8')
|
|
199
|
+
|
|
200
|
+
if _debug_ollama_enabled():
|
|
201
|
+
logger.info(
|
|
202
|
+
'Ollama request debug: model=%s base_url=%s prompt_len=%s request=%s',
|
|
203
|
+
ollama_model_id,
|
|
204
|
+
ollama_base_url,
|
|
205
|
+
len(ollama_prompt),
|
|
206
|
+
_truncate_for_debug(json.dumps(request_payload)),
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
request = urllib_request.Request(
|
|
210
|
+
f'{ollama_base_url}{OLLAMA_CHAT_PATH}',
|
|
211
|
+
data=request_body,
|
|
212
|
+
headers={'Content-Type': 'application/json'},
|
|
213
|
+
method='POST',
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
try:
|
|
217
|
+
with urllib_request.urlopen(request, timeout=120) as response:
|
|
218
|
+
raw_payload = response.read().decode('utf-8')
|
|
219
|
+
except urllib_error.HTTPError as error:
|
|
220
|
+
error_payload = error.read().decode('utf-8', errors='replace')
|
|
221
|
+
raise RuntimeError(f'Ollama HTTP error {error.code}: {error_payload}') from error
|
|
222
|
+
except urllib_error.URLError as error:
|
|
223
|
+
raise RuntimeError(f'Failed to connect to Ollama endpoint: {error}') from error
|
|
224
|
+
|
|
225
|
+
if _debug_ollama_enabled():
|
|
226
|
+
logger.info(
|
|
227
|
+
'Ollama raw response debug: %s',
|
|
228
|
+
_truncate_for_debug(raw_payload),
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
payload = json.loads(raw_payload)
|
|
232
|
+
message = payload.get('message', {})
|
|
233
|
+
if isinstance(message, dict) and isinstance(message.get('content'), str):
|
|
234
|
+
return message['content']
|
|
235
|
+
|
|
236
|
+
if isinstance(payload.get('response'), str):
|
|
237
|
+
return payload['response']
|
|
238
|
+
|
|
239
|
+
raise RuntimeError(f'Unexpected Ollama response format: {payload}')
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
def invoke_model(
|
|
243
|
+
content: list[Dict[str, Any]],
|
|
244
|
+
max_tokens: int,
|
|
245
|
+
model_id: str,
|
|
246
|
+
bedrock_client,
|
|
247
|
+
logger: logging.Logger,
|
|
248
|
+
) -> str:
|
|
249
|
+
if resolve_model_provider() == MODEL_PROVIDER_OLLAMA:
|
|
250
|
+
return _invoke_ollama_model(content, max_tokens, model_id, logger)
|
|
251
|
+
return _invoke_bedrock_model(content, max_tokens, model_id, bedrock_client)
|
|
@@ -7,7 +7,22 @@ import re
|
|
|
7
7
|
from aws_lambda_powertools import Metrics, Tracer
|
|
8
8
|
from aws_lambda_powertools.metrics import MetricUnit
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
def _resolve_endpoint_url(*service_env_keys):
|
|
11
|
+
for key in service_env_keys:
|
|
12
|
+
endpoint = os.getenv(key)
|
|
13
|
+
if endpoint:
|
|
14
|
+
return endpoint
|
|
15
|
+
return None
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _create_boto3_client(service_name, *service_env_keys):
|
|
19
|
+
endpoint_url = _resolve_endpoint_url(*service_env_keys, 'AWS_ENDPOINT_URL')
|
|
20
|
+
if endpoint_url:
|
|
21
|
+
return boto3.client(service_name, endpoint_url=endpoint_url)
|
|
22
|
+
return boto3.client(service_name)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
sfn_client = _create_boto3_client('stepfunctions', 'AWS_ENDPOINT_URL_STEPFUNCTIONS')
|
|
11
26
|
metrics = Metrics()
|
|
12
27
|
tracer = Tracer()
|
|
13
28
|
|
|
@@ -113,4 +128,4 @@ def handler(event, context):
|
|
|
113
128
|
'statusCode': 200,
|
|
114
129
|
'processedCount': len(results),
|
|
115
130
|
'results': results
|
|
116
|
-
}
|
|
131
|
+
}
|
|
@@ -68,8 +68,23 @@ structured_logger = get_logger(__name__)
|
|
|
68
68
|
logger = logging.getLogger()
|
|
69
69
|
logger.setLevel(os.environ.get('LOG_LEVEL', 'INFO'))
|
|
70
70
|
|
|
71
|
+
def _resolve_endpoint_url(*service_env_keys: str) -> Optional[str]:
|
|
72
|
+
for key in service_env_keys:
|
|
73
|
+
endpoint = os.getenv(key)
|
|
74
|
+
if endpoint:
|
|
75
|
+
return endpoint
|
|
76
|
+
return None
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def _create_boto3_client(service_name: str, *service_env_keys: str):
|
|
80
|
+
endpoint_url = _resolve_endpoint_url(*service_env_keys, 'AWS_ENDPOINT_URL')
|
|
81
|
+
if endpoint_url:
|
|
82
|
+
return boto3.client(service_name, endpoint_url=endpoint_url)
|
|
83
|
+
return boto3.client(service_name)
|
|
84
|
+
|
|
85
|
+
|
|
71
86
|
# Initialize AWS clients
|
|
72
|
-
s3_client =
|
|
87
|
+
s3_client = _create_boto3_client('s3', 'AWS_ENDPOINT_URL_S3')
|
|
73
88
|
|
|
74
89
|
# Get Powertools metrics instance
|
|
75
90
|
metrics = get_metrics()
|
|
@@ -13,6 +13,8 @@ const adapter_1 = require("../adapter");
|
|
|
13
13
|
const base_document_processing_1 = require("../base-document-processing");
|
|
14
14
|
// Concrete test implementation of BaseDocumentProcessing for CDK Nag testing
|
|
15
15
|
class TestDocumentProcessing extends base_document_processing_1.BaseDocumentProcessing {
|
|
16
|
+
classificationFn;
|
|
17
|
+
processingFn;
|
|
16
18
|
constructor(scope, id, props) {
|
|
17
19
|
super(scope, id, props);
|
|
18
20
|
this.classificationFn = new aws_lambda_1.Function(this, 'ClassificationFn', {
|
|
@@ -165,4 +167,4 @@ test('No unsuppressed errors', () => {
|
|
|
165
167
|
}
|
|
166
168
|
expect(errors).toHaveLength(0);
|
|
167
169
|
});
|
|
168
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLW5hZy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvdGVzdHMvYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLW5hZy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQTZDO0FBQzdDLHVEQUE0RDtBQUM1RCx1REFBaUU7QUFDakUsK0NBQTRDO0FBQzVDLGlGQUFtRTtBQUNuRSxxQ0FBOEQ7QUFDOUQsK0NBQTRDO0FBQzVDLHNGQUFrRjtBQUNsRiwyREFBMkQ7QUFDM0Qsd0NBQTZDO0FBQzdDLDBFQUFpRztBQUVqRyw2RUFBNkU7QUFDN0UsTUFBTSxzQkFBdUIsU0FBUSxpREFBc0I7SUFJekQsWUFBWSxLQUFVLEVBQUUsRUFBVSxFQUFFLEtBQVU7UUFDNUMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUkscUJBQVEsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7WUFDN0QsT0FBTyxFQUFFLG9CQUFPLENBQUMsV0FBVztZQUM1QixPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsaUJBQUksQ0FBQyxVQUFVLENBQUMscUVBQXFFLENBQUM7U0FDN0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLHFCQUFRLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRTtZQUNyRCxPQUFPLEVBQUUsb0JBQU8sQ0FBQyxXQUFXO1lBQzVCLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxpQkFBSSxDQUFDLFVBQVUsQ0FBQyxpREFBaUQsQ0FBQztTQUN6RSxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVMsa0JBQWtCO1FBQzFCLE9BQU8sSUFBSSxzQ0FBWSxDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFB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QUMsR0FBRyxFQUFFLGtCQUFLLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0FBQzFHLE1BQU0sTUFBTSxHQUFHLHdCQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsa0JBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7QUFFdEcsaUNBQWlDO0FBQ2pDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxHQUFHLEVBQUU7SUFDcEMsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNELE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQyxDQUFDLENBQUM7QUFFSCwrQkFBK0I7QUFDL0IsSUFBSSxDQUFDLHdCQUF3QixFQUFFLEdBQUcsRUFBRTtJQUNsQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0YWNrLCBBc3BlY3RzIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQW5ub3RhdGlvbnMsIE1hdGNoIH0gZnJvbSAnYXdzLWNkay1saWIvYXNzZXJ0aW9ucyc7XG5pbXBvcnQgeyBDb2RlLCBGdW5jdGlvbiwgUnVudGltZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQnVja2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IExhbWJkYUludm9rZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zdGVwZnVuY3Rpb25zLXRhc2tzJztcbmltcG9ydCB7IEF3c1NvbHV0aW9uc0NoZWNrcywgTmFnU3VwcHJlc3Npb25zIH0gZnJvbSAnY2RrLW5hZyc7XG5pbXBvcnQgeyBBY2Nlc3NMb2cgfSBmcm9tICcuLi8uLi9mcmFtZXdvcmsnO1xuaW1wb3J0IHsgRXZlbnRicmlkZ2VCcm9rZXIgfSBmcm9tICcuLi8uLi9mcmFtZXdvcmsvZm91bmRhdGlvbi9ldmVudGJyaWRnZS1icm9rZXInO1xuaW1wb3J0IHsgY3JlYXRlVGVzdEFwcCB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy90ZXN0LXV0aWxzJztcbmltcG9ydCB7IFF1ZXVlZFMzQWRhcHRlciB9IGZyb20gJy4uL2FkYXB0ZXInO1xuaW1wb3J0IHsgQmFzZURvY3VtZW50UHJvY2Vzc2luZywgRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfSBmcm9tICcuLi9iYXNlLWRvY3VtZW50LXByb2Nlc3NpbmcnO1xuXG4vLyBDb25jcmV0ZSB0ZXN0IGltcGxlbWVudGF0aW9uIG9mIEJhc2VEb2N1bWVudFByb2Nlc3NpbmcgZm9yIENESyBOYWcgdGVzdGluZ1xuY2xhc3MgVGVzdERvY3VtZW50UHJvY2Vzc2luZyBleHRlbmRzIEJhc2VEb2N1bWVudFByb2Nlc3Npbmcge1xuICBwcml2YXRlIGNsYXNzaWZpY2F0aW9uRm46IEZ1bmN0aW9uO1xuICBwcml2YXRlIHByb2Nlc3NpbmdGbjogRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IGFueSwgaWQ6IHN0cmluZywgcHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgdGhpcy5jbGFzc2lmaWNhdGlvbkZuID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdDbGFzc2lmaWNhdGlvbkZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgZG9jdW1lbnRDbGFzc2lmaWNhdGlvbjogXCJURVNUXCIgfSk7JyksXG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2Nlc3NpbmdGbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnUHJvY2Vzc2luZ0ZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgcmVzdWx0OiB7fSB9KTsnKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGFzc2lmaWNhdGlvblN0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUge1xuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsICdNb2NrQ2xhc3NpZmljYXRpb24nLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5jbGFzc2lmaWNhdGlvbkZuLFxuICAgICAgcmVzdWx0UGF0aDogJyQuY2xhc3NpZmljYXRpb25SZXN1bHQnLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnTW9ja1Byb2Nlc3NpbmcnLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5wcm9jZXNzaW5nRm4sXG4gICAgICByZXN1bHRQYXRoOiAnJC5wcm9jZXNzaW5nUmVzdWx0JyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbnJpY2htZW50U3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb3N0UHJvY2Vzc2luZ1N0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJlcHJvY2Vzc2luZ1N0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUHJvY2Vzc2luZ1dvcmtmbG93KCkge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVN0YW5kYXJkUHJvY2Vzc2luZ1dvcmtmbG93KCk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlU3RhdGVNYWNoaW5lKCkge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZVN0YXRlTWFjaGluZUNyZWF0aW9uKCd0ZXN0LXN0YXRlLW1hY2hpbmUnKTtcbiAgfVxufVxuXG4vLyBDcmVhdGUgYXBwIGFuZCBzdGFja1xuY29uc3QgYXBwID0gY3JlYXRlVGVzdEFwcCgpO1xuY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCAnVGVzdFN0YWNrJywge1xuICBlbnY6IHtcbiAgICBhY2NvdW50OiAnMTIzNDU2Nzg5MDEyJyxcbiAgICByZWdpb246ICd1cy1lYXN0LTEnLFxuICB9LFxufSk7XG5cbi8vIENyZWF0ZSBhY2Nlc3MgbG9nIGJ1Y2tldFxuY29uc3QgYWNjZXNzTG9nID0gbmV3IEFjY2Vzc0xvZyhzdGFjaywgJ0FjY2Vzc0xvZycpO1xuXG4vLyBDcmVhdGUgUzMgYnVja2V0IHdpdGggcHJvcGVyIGNvbmZpZ3VyYXRpb25cbmNvbnN0IGJ1Y2tldCA9IG5ldyBCdWNrZXQoc3RhY2ssICdCYXNlRG9jdW1lbnRQcm9jZXNzaW5nQnVja2V0Jywge1xuICBzZXJ2ZXJBY2Nlc3NMb2dzQnVja2V0OiBhY2Nlc3NMb2cuYnVja2V0LFxuICBzZXJ2ZXJBY2Nlc3NMb2dzUHJlZml4OiBhY2Nlc3NMb2cuYnVja2V0UHJlZml4LFxuICBlbmZvcmNlU1NMOiB0cnVlLFxufSk7XG5cbi8vIENyZWF0ZSBFdmVudEJyaWRnZSBicm9rZXJcbmNvbnN0IGJyb2tlciA9IG5ldyBFdmVudGJyaWRnZUJyb2tlcihzdGFjaywgJ1Rlc3RCcm9rZXInLCB7XG4gIG5hbWU6ICd0ZXN0LWJyb2tlcicsXG4gIGV2ZW50U291cmNlOiAndGVzdC1zb3VyY2UnLFxufSk7XG5cbi8vIENyZWF0ZSBhZGFwdGVyIHdpdGggY3VzdG9tIGJ1Y2tldFxuY29uc3QgYWRhcHRlciA9IG5ldyBRdWV1ZWRTM0FkYXB0ZXIoe1xuICBidWNrZXQsXG59KTtcblxuLy8gQ3JlYXRlIHRoZSBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nIGNvbnN0cnVjdFxuY29uc3QgY29uc3RydWN0ID0gbmV3IFRlc3REb2N1bWVudFByb2Nlc3Npbmcoc3RhY2ssICdCYXNlRG9jdW1lbnRQcm9jZXNzaW5nJywge1xuICBpbmdyZXNzQWRhcHRlcjogYWRhcHRlcixcbiAgZXZlbnRicmlkZ2VCcm9rZXI6IGJyb2tlcixcbiAgZW5hYmxlT2JzZXJ2YWJpbGl0eTogdHJ1ZSxcbn0pO1xuXG4vLyBDcmVhdGUgdGhlIHN0YXRlIG1hY2hpbmVcbmNvbnN0cnVjdC5jcmVhdGVTdGF0ZU1hY2hpbmUoKTtcblxuLy8gU3VwcHJlc3MgQ0RLLW1hbmFnZWQgQnVja2V0Tm90aWZpY2F0aW9uc0hhbmRsZXIgQVdTIG1hbmFnZWQgcG9saWN5XG5OYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnNCeVBhdGgoXG4gIHN0YWNrLFxuICAnL1Rlc3RTdGFjay9CdWNrZXROb3RpZmljYXRpb25zSGFuZGxlcjA1MGEwNTg3Yjc1NDQ1NDdiZjMyNWYwOTRhM2RiODM0L1JvbGUnLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNCcsXG4gICAgICByZWFzb246ICdDREstbWFuYWdlZCBCdWNrZXROb3RpZmljYXRpb25zSGFuZGxlciByZXF1aXJlcyBBV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGUgZm9yIFMzIGV2ZW50IHByb2Nlc3NpbmcnLFxuICAgICAgYXBwbGllc1RvOiBbJ1BvbGljeTo6YXJuOjxBV1M6OlBhcnRpdGlvbj46aWFtOjphd3M6cG9saWN5L3NlcnZpY2Utcm9sZS9BV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGUnXSxcbiAgICB9LFxuICBdLFxuKTtcblxuLy8gU3VwcHJlc3MgUzMgYnVja2V0IHdpbGRjYXJkIHBlcm1pc3Npb25zIGZvciBMYW1iZGEgcm9sZXNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgIHJlYXNvbjogJ0xhbWJkYSBmdW5jdGlvbnMgcmVxdWlyZSB3aWxkY2FyZCBhY2Nlc3MgdG8gUzMgYnVja2V0IG9iamVjdHMgZm9yIGRvY3VtZW50IHByb2Nlc3NpbmcnLFxuICAgICAgYXBwbGllc1RvOiBbJ1Jlc291cmNlOjo8QmFzZURvY3VtZW50UHJvY2Vzc2luZ0J1Y2tldEU4RTBGNkY1LkFybj4vKiddLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBTdXBwcmVzcyBTUVMgY29uc3VtZXIgTGFtYmRhIHdpbGRjYXJkIHBlcm1pc3Npb25zIGZvciBsb2cgc3RyZWFtc1xuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICBzdGFjayxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgcmVhc29uOiAnTGFtYmRhIGxvZyBzdHJlYW0gQVJOIGlzIG9ubHkga25vd24gYXQgcnVudGltZSwgd2lsZGNhcmQgcmVxdWlyZWQgZm9yIENsb3VkV2F0Y2ggTG9ncyBhY2Nlc3MnLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBTdXBwcmVzcyBTdGF0ZU1hY2hpbmVSb2xlIHdpbGRjYXJkIHBlcm1pc3Npb25zIGZvciBMYW1iZGEgaW52b2NhdGlvblxuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zQnlQYXRoKFxuICBzdGFjayxcbiAgJy9UZXN0U3RhY2svQmFzZURvY3VtZW50UHJvY2Vzc2luZy9TdGF0ZU1hY2hpbmVSb2xlL0RlZmF1bHRQb2xpY3knLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsXG4gICAgICByZWFzb246ICdTdGVwIEZ1bmN0aW9ucyByZXF1aXJlcyB3aWxkY2FyZCBwZXJtaXNzaW9ucyB0byBpbnZva2UgTGFtYmRhIGZ1bmN0aW9ucyB3aXRoIHZlcnNpb24tc3BlY2lmaWMgQVJOcycsXG4gICAgfSxcbiAgXSxcbik7XG5cbi8vIFN1cHByZXNzIExhbWJkYSBsb2cgZ3JvdXAgd2lsZGNhcmQgcGVybWlzc2lvbnNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgIHJlYXNvbjogJ0xhbWJkYSBsb2cgc3RyZWFtIG5hbWVzIGFyZSBnZW5lcmF0ZWQgYXQgcnVudGltZSwgd2lsZGNhcmQgcmVxdWlyZWQgZm9yIENsb3VkV2F0Y2ggTG9ncyBhY2Nlc3MnLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBTdXBwcmVzcyBMYW1iZGEgYmFzaWMgZXhlY3V0aW9uIHJvbGVcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU00JyxcbiAgICAgIHJlYXNvbjogJ1Rlc3QgTGFtYmRhIGZ1bmN0aW9ucyB1c2UgQVdTIG1hbmFnZWQgcG9saWNpZXMgZm9yIGJhc2ljIGV4ZWN1dGlvbicsXG4gICAgICBhcHBsaWVzVG86IFsnUG9saWN5Ojphcm46PEFXUzo6UGFydGl0aW9uPjppYW06OmF3czpwb2xpY3kvc2VydmljZS1yb2xlL0FXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZSddLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBTdXBwcmVzcyBMYW1iZGEgcnVudGltZSB2ZXJzaW9uIGZvciB0ZXN0IGZ1bmN0aW9uc1xuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICBzdGFjayxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUwxJyxcbiAgICAgIHJlYXNvbjogJ1Rlc3QgTGFtYmRhIGZ1bmN0aW9ucyB1c2UgTm9kZS5qcyAyMCB3aGljaCBpcyBhIHN1cHBvcnRlZCBydW50aW1lJyxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuLy8gU3VwcHJlc3MgS01TIGtleSByb3RhdGlvbiBmb3IgdGVzdCBlbmNyeXB0aW9uIGtleVxuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICBzdGFjayxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUtNUzUnLFxuICAgICAgcmVhc29uOiAnS01TIGtleSByb3RhdGlvbiBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgaW4gQmFzZURvY3VtZW50UHJvY2Vzc2luZyBjb25zdHJ1Y3QnLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBBcHBseSBDREsgTmFnIGNoZWNrc1xuQXNwZWN0cy5vZihhcHApLmFkZChuZXcgQXdzU29sdXRpb25zQ2hlY2tzKHsgdmVyYm9zZTogdHJ1ZSB9KSk7XG5cbi8vIFN5bnRoZXNpemUgdGhlIHN0YWNrIGFuZCBjaGVjayBmb3IgdW5zdXBwcmVzc2VkIHdhcm5pbmdzIGFuZCBlcnJvcnNcbmNvbnN0IHdhcm5pbmdzID0gQW5ub3RhdGlvbnMuZnJvbVN0YWNrKHN0YWNrKS5maW5kV2FybmluZygnKicsIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoJ0F3c1NvbHV0aW9ucy0uKicpKTtcbmNvbnN0IGVycm9ycyA9IEFubm90YXRpb25zLmZyb21TdGFjayhzdGFjaykuZmluZEVycm9yKCcqJywgTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cCgnQXdzU29sdXRpb25zLS4qJykpO1xuXG4vLyBUZXN0OiBObyB1bnN1cHByZXNzZWQgd2FybmluZ3NcbnRlc3QoJ05vIHVuc3VwcHJlc3NlZCB3YXJuaW5ncycsICgpID0+IHtcbiAgaWYgKHdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZygnQ0RLIE5hZyBXYXJuaW5nczonLCBKU09OLnN0cmluZ2lmeSh3YXJuaW5ncywgbnVsbCwgMikpO1xuICB9XG4gIGV4cGVjdCh3YXJuaW5ncykudG9IYXZlTGVuZ3RoKDApO1xufSk7XG5cbi8vIFRlc3Q6IE5vIHVuc3VwcHJlc3NlZCBlcnJvcnNcbnRlc3QoJ05vIHVuc3VwcHJlc3NlZCBlcnJvcnMnLCAoKSA9PiB7XG4gIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKCdDREsgTmFnIEVycm9yczonLCBKU09OLnN0cmluZ2lmeShlcnJvcnMsIG51bGwsIDIpKTtcbiAgfVxuICBleHBlY3QoZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG59KTtcbiJdfQ==
|
|
170
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLW5hZy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvdGVzdHMvYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLW5hZy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQTZDO0FBQzdDLHVEQUE0RDtBQUM1RCx1REFBaUU7QUFDakUsK0NBQTRDO0FBQzVDLGlGQUFtRTtBQUNuRSxxQ0FBOEQ7QUFDOUQsK0NBQTRDO0FBQzVDLHNGQUFrRjtBQUNsRiwyREFBMkQ7QUFDM0Qsd0NBQTZDO0FBQzdDLDBFQUFpRztBQUVqRyw2RUFBNkU7QUFDN0UsTUFBTSxzQkFBdUIsU0FBUSxpREFBc0I7SUFDakQsZ0JBQWdCLENBQVc7SUFDM0IsWUFBWSxDQUFXO0lBRS9CLFlBQVksS0FBVSxFQUFFLEVBQVUsRUFBRSxLQUFVO1FBQzVDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLHFCQUFRLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFO1lBQzdELE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7WUFDNUIsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLGlCQUFJLENBQUMsVUFBVSxDQUFDLHFFQUFxRSxDQUFDO1NBQzdGLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxxQkFBUSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7WUFDckQsT0FBTyxFQUFFLG9CQUFPLENBQUMsV0FBVztZQUM1QixPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsaUJBQUksQ0FBQyxVQUFVLENBQUMsaURBQWlELENBQUM7U0FDekUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLGtCQUFrQjtRQUMxQixPQUFPLElB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QyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxrQkFBSyxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztBQUMxRyxNQUFNLE1BQU0sR0FBRyx3QkFBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLGtCQUFLLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0FBRXRHLGlDQUFpQztBQUNqQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsR0FBRyxFQUFFO0lBQ3BDLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDRCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQyxDQUFDO0FBRUgsK0JBQStCO0FBQy9CLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUU7SUFDbEMsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFjaywgQXNwZWN0cyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEFubm90YXRpb25zLCBNYXRjaCB9IGZyb20gJ2F3cy1jZGstbGliL2Fzc2VydGlvbnMnO1xuaW1wb3J0IHsgQ29kZSwgRnVuY3Rpb24sIFJ1bnRpbWUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IEJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBMYW1iZGFJbnZva2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9ucy10YXNrcyc7XG5pbXBvcnQgeyBBd3NTb2x1dGlvbnNDaGVja3MsIE5hZ1N1cHByZXNzaW9ucyB9IGZyb20gJ2Nkay1uYWcnO1xuaW1wb3J0IHsgQWNjZXNzTG9nIH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrJztcbmltcG9ydCB7IEV2ZW50YnJpZGdlQnJva2VyIH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrL2ZvdW5kYXRpb24vZXZlbnRicmlkZ2UtYnJva2VyJztcbmltcG9ydCB7IGNyZWF0ZVRlc3RBcHAgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvdGVzdC11dGlscyc7XG5pbXBvcnQgeyBRdWV1ZWRTM0FkYXB0ZXIgfSBmcm9tICcuLi9hZGFwdGVyJztcbmltcG9ydCB7IEJhc2VEb2N1bWVudFByb2Nlc3NpbmcsIERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIH0gZnJvbSAnLi4vYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nJztcblxuLy8gQ29uY3JldGUgdGVzdCBpbXBsZW1lbnRhdGlvbiBvZiBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nIGZvciBDREsgTmFnIHRlc3RpbmdcbmNsYXNzIFRlc3REb2N1bWVudFByb2Nlc3NpbmcgZXh0ZW5kcyBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nIHtcbiAgcHJpdmF0ZSBjbGFzc2lmaWNhdGlvbkZuOiBGdW5jdGlvbjtcbiAgcHJpdmF0ZSBwcm9jZXNzaW5nRm46IEZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBhbnksIGlkOiBzdHJpbmcsIHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIHRoaXMuY2xhc3NpZmljYXRpb25GbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnQ2xhc3NpZmljYXRpb25GbicsIHtcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoJ2V4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+ICh7IGRvY3VtZW50Q2xhc3NpZmljYXRpb246IFwiVEVTVFwiIH0pOycpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9jZXNzaW5nRm4gPSBuZXcgRnVuY3Rpb24odGhpcywgJ1Byb2Nlc3NpbmdGbicsIHtcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoJ2V4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+ICh7IHJlc3VsdDoge30gfSk7JyksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xhc3NpZmljYXRpb25TdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnTW9ja0NsYXNzaWZpY2F0aW9uJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuY2xhc3NpZmljYXRpb25GbixcbiAgICAgIHJlc3VsdFBhdGg6ICckLmNsYXNzaWZpY2F0aW9uUmVzdWx0JyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB7XG4gICAgcmV0dXJuIG5ldyBMYW1iZGFJbnZva2UodGhpcywgJ01vY2tQcm9jZXNzaW5nJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMucHJvY2Vzc2luZ0ZuLFxuICAgICAgcmVzdWx0UGF0aDogJyQucHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW5yaWNobWVudFN0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9zdFByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByZXByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVByb2Nlc3NpbmdXb3JrZmxvdygpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTdGFuZGFyZFByb2Nlc3NpbmdXb3JrZmxvdygpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVN0YXRlTWFjaGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVTdGF0ZU1hY2hpbmVDcmVhdGlvbigndGVzdC1zdGF0ZS1tYWNoaW5lJyk7XG4gIH1cbn1cblxuLy8gQ3JlYXRlIGFwcCBhbmQgc3RhY2tcbmNvbnN0IGFwcCA9IGNyZWF0ZVRlc3RBcHAoKTtcbmNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ1Rlc3RTdGFjaycsIHtcbiAgZW52OiB7XG4gICAgYWNjb3VudDogJzEyMzQ1Njc4OTAxMicsXG4gICAgcmVnaW9uOiAndXMtZWFzdC0xJyxcbiAgfSxcbn0pO1xuXG4vLyBDcmVhdGUgYWNjZXNzIGxvZyBidWNrZXRcbmNvbnN0IGFjY2Vzc0xvZyA9IG5ldyBBY2Nlc3NMb2coc3RhY2ssICdBY2Nlc3NMb2cnKTtcblxuLy8gQ3JlYXRlIFMzIGJ1Y2tldCB3aXRoIHByb3BlciBjb25maWd1cmF0aW9uXG5jb25zdCBidWNrZXQgPSBuZXcgQnVja2V0KHN0YWNrLCAnQmFzZURvY3VtZW50UHJvY2Vzc2luZ0J1Y2tldCcsIHtcbiAgc2VydmVyQWNjZXNzTG9nc0J1Y2tldDogYWNjZXNzTG9nLmJ1Y2tldCxcbiAgc2VydmVyQWNjZXNzTG9nc1ByZWZpeDogYWNjZXNzTG9nLmJ1Y2tldFByZWZpeCxcbiAgZW5mb3JjZVNTTDogdHJ1ZSxcbn0pO1xuXG4vLyBDcmVhdGUgRXZlbnRCcmlkZ2UgYnJva2VyXG5jb25zdCBicm9rZXIgPSBuZXcgRXZlbnRicmlkZ2VCcm9rZXIoc3RhY2ssICdUZXN0QnJva2VyJywge1xuICBuYW1lOiAndGVzdC1icm9rZXInLFxuICBldmVudFNvdXJjZTogJ3Rlc3Qtc291cmNlJyxcbn0pO1xuXG4vLyBDcmVhdGUgYWRhcHRlciB3aXRoIGN1c3RvbSBidWNrZXRcbmNvbnN0IGFkYXB0ZXIgPSBuZXcgUXVldWVkUzNBZGFwdGVyKHtcbiAgYnVja2V0LFxufSk7XG5cbi8vIENyZWF0ZSB0aGUgQmFzZURvY3VtZW50UHJvY2Vzc2luZyBjb25zdHJ1Y3RcbmNvbnN0IGNvbnN0cnVjdCA9IG5ldyBUZXN0RG9jdW1lbnRQcm9jZXNzaW5nKHN0YWNrLCAnQmFzZURvY3VtZW50UHJvY2Vzc2luZycsIHtcbiAgaW5ncmVzc0FkYXB0ZXI6IGFkYXB0ZXIsXG4gIGV2ZW50YnJpZGdlQnJva2VyOiBicm9rZXIsXG4gIGVuYWJsZU9ic2VydmFiaWxpdHk6IHRydWUsXG59KTtcblxuLy8gQ3JlYXRlIHRoZSBzdGF0ZSBtYWNoaW5lXG5jb25zdHJ1Y3QuY3JlYXRlU3RhdGVNYWNoaW5lKCk7XG5cbi8vIFN1cHByZXNzIENESy1tYW5hZ2VkIEJ1Y2tldE5vdGlmaWNhdGlvbnNIYW5kbGVyIEFXUyBtYW5hZ2VkIHBvbGljeVxuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zQnlQYXRoKFxuICBzdGFjayxcbiAgJy9UZXN0U3RhY2svQnVja2V0Tm90aWZpY2F0aW9uc0hhbmRsZXIwNTBhMDU4N2I3NTQ0NTQ3YmYzMjVmMDk0YTNkYjgzNC9Sb2xlJyxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTQnLFxuICAgICAgcmVhc29uOiAnQ0RLLW1hbmFnZWQgQnVja2V0Tm90aWZpY2F0aW9uc0hhbmRsZXIgcmVxdWlyZXMgQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlIGZvciBTMyBldmVudCBwcm9jZXNzaW5nJyxcbiAgICAgIGFwcGxpZXNUbzogWydQb2xpY3k6OmFybjo8QVdTOjpQYXJ0aXRpb24+OmlhbTo6YXdzOnBvbGljeS9zZXJ2aWNlLXJvbGUvQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlJ10sXG4gICAgfSxcbiAgXSxcbik7XG5cbi8vIFN1cHByZXNzIFMzIGJ1Y2tldCB3aWxkY2FyZCBwZXJtaXNzaW9ucyBmb3IgTGFtYmRhIHJvbGVzXG5OYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gIHN0YWNrLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsXG4gICAgICByZWFzb246ICdMYW1iZGEgZnVuY3Rpb25zIHJlcXVpcmUgd2lsZGNhcmQgYWNjZXNzIHRvIFMzIGJ1Y2tldCBvYmplY3RzIGZvciBkb2N1bWVudCBwcm9jZXNzaW5nJyxcbiAgICAgIGFwcGxpZXNUbzogWydSZXNvdXJjZTo6PEJhc2VEb2N1bWVudFByb2Nlc3NpbmdCdWNrZXRFOEUwRjZGNS5Bcm4+LyonXSxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuLy8gU3VwcHJlc3MgU1FTIGNvbnN1bWVyIExhbWJkYSB3aWxkY2FyZCBwZXJtaXNzaW9ucyBmb3IgbG9nIHN0cmVhbXNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgIHJlYXNvbjogJ0xhbWJkYSBsb2cgc3RyZWFtIEFSTiBpcyBvbmx5IGtub3duIGF0IHJ1bnRpbWUsIHdpbGRjYXJkIHJlcXVpcmVkIGZvciBDbG91ZFdhdGNoIExvZ3MgYWNjZXNzJyxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuLy8gU3VwcHJlc3MgU3RhdGVNYWNoaW5lUm9sZSB3aWxkY2FyZCBwZXJtaXNzaW9ucyBmb3IgTGFtYmRhIGludm9jYXRpb25cbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9uc0J5UGF0aChcbiAgc3RhY2ssXG4gICcvVGVzdFN0YWNrL0Jhc2VEb2N1bWVudFByb2Nlc3NpbmcvU3RhdGVNYWNoaW5lUm9sZS9EZWZhdWx0UG9saWN5JyxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgcmVhc29uOiAnU3RlcCBGdW5jdGlvbnMgcmVxdWlyZXMgd2lsZGNhcmQgcGVybWlzc2lvbnMgdG8gaW52b2tlIExhbWJkYSBmdW5jdGlvbnMgd2l0aCB2ZXJzaW9uLXNwZWNpZmljIEFSTnMnLFxuICAgIH0sXG4gIF0sXG4pO1xuXG4vLyBTdXBwcmVzcyBMYW1iZGEgbG9nIGdyb3VwIHdpbGRjYXJkIHBlcm1pc3Npb25zXG5OYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gIHN0YWNrLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsXG4gICAgICByZWFzb246ICdMYW1iZGEgbG9nIHN0cmVhbSBuYW1lcyBhcmUgZ2VuZXJhdGVkIGF0IHJ1bnRpbWUsIHdpbGRjYXJkIHJlcXVpcmVkIGZvciBDbG91ZFdhdGNoIExvZ3MgYWNjZXNzJyxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuLy8gU3VwcHJlc3MgTGFtYmRhIGJhc2ljIGV4ZWN1dGlvbiByb2xlXG5OYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gIHN0YWNrLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNCcsXG4gICAgICByZWFzb246ICdUZXN0IExhbWJkYSBmdW5jdGlvbnMgdXNlIEFXUyBtYW5hZ2VkIHBvbGljaWVzIGZvciBiYXNpYyBleGVjdXRpb24nLFxuICAgICAgYXBwbGllc1RvOiBbJ1BvbGljeTo6YXJuOjxBV1M6OlBhcnRpdGlvbj46aWFtOjphd3M6cG9saWN5L3NlcnZpY2Utcm9sZS9BV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGUnXSxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuLy8gU3VwcHJlc3MgTGFtYmRhIHJ1bnRpbWUgdmVyc2lvbiBmb3IgdGVzdCBmdW5jdGlvbnNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1MMScsXG4gICAgICByZWFzb246ICdUZXN0IExhbWJkYSBmdW5jdGlvbnMgdXNlIE5vZGUuanMgMjAgd2hpY2ggaXMgYSBzdXBwb3J0ZWQgcnVudGltZScsXG4gICAgfSxcbiAgXSxcbiAgdHJ1ZSxcbik7XG5cbi8vIFN1cHByZXNzIEtNUyBrZXkgcm90YXRpb24gZm9yIHRlc3QgZW5jcnlwdGlvbiBrZXlcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1LTVM1JyxcbiAgICAgIHJlYXNvbjogJ0tNUyBrZXkgcm90YXRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0IGluIEJhc2VEb2N1bWVudFByb2Nlc3NpbmcgY29uc3RydWN0JyxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuLy8gQXBwbHkgQ0RLIE5hZyBjaGVja3NcbkFzcGVjdHMub2YoYXBwKS5hZGQobmV3IEF3c1NvbHV0aW9uc0NoZWNrcyh7IHZlcmJvc2U6IHRydWUgfSkpO1xuXG4vLyBTeW50aGVzaXplIHRoZSBzdGFjayBhbmQgY2hlY2sgZm9yIHVuc3VwcHJlc3NlZCB3YXJuaW5ncyBhbmQgZXJyb3JzXG5jb25zdCB3YXJuaW5ncyA9IEFubm90YXRpb25zLmZyb21TdGFjayhzdGFjaykuZmluZFdhcm5pbmcoJyonLCBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKCdBd3NTb2x1dGlvbnMtLionKSk7XG5jb25zdCBlcnJvcnMgPSBBbm5vdGF0aW9ucy5mcm9tU3RhY2soc3RhY2spLmZpbmRFcnJvcignKicsIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoJ0F3c1NvbHV0aW9ucy0uKicpKTtcblxuLy8gVGVzdDogTm8gdW5zdXBwcmVzc2VkIHdhcm5pbmdzXG50ZXN0KCdObyB1bnN1cHByZXNzZWQgd2FybmluZ3MnLCAoKSA9PiB7XG4gIGlmICh3YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5sb2coJ0NESyBOYWcgV2FybmluZ3M6JywgSlNPTi5zdHJpbmdpZnkod2FybmluZ3MsIG51bGwsIDIpKTtcbiAgfVxuICBleHBlY3Qod2FybmluZ3MpLnRvSGF2ZUxlbmd0aCgwKTtcbn0pO1xuXG4vLyBUZXN0OiBObyB1bnN1cHByZXNzZWQgZXJyb3JzXG50ZXN0KCdObyB1bnN1cHByZXNzZWQgZXJyb3JzJywgKCkgPT4ge1xuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZygnQ0RLIE5hZyBFcnJvcnM6JywgSlNPTi5zdHJpbmdpZnkoZXJyb3JzLCBudWxsLCAyKSk7XG4gIH1cbiAgZXhwZWN0KGVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xufSk7XG4iXX0=
|
|
@@ -12,6 +12,8 @@ const base_document_processing_1 = require("../base-document-processing");
|
|
|
12
12
|
* This simulates existing implementations that don't use any preprocessing
|
|
13
13
|
*/
|
|
14
14
|
class TestDocumentProcessingWithoutPreprocessing extends base_document_processing_1.BaseDocumentProcessing {
|
|
15
|
+
classificationFn;
|
|
16
|
+
processingFn;
|
|
15
17
|
constructor(scope, id, props) {
|
|
16
18
|
super(scope, id, props);
|
|
17
19
|
this.classificationFn = new aws_lambda_1.Function(this, 'ClassificationFn', {
|
|
@@ -61,6 +63,9 @@ class TestDocumentProcessingWithoutPreprocessing extends base_document_processin
|
|
|
61
63
|
* (e.g., chunking metadata) without the base class knowing about them
|
|
62
64
|
*/
|
|
63
65
|
class TestDocumentProcessingWithCustomMetadata extends base_document_processing_1.BaseDocumentProcessing {
|
|
66
|
+
preprocessingFn;
|
|
67
|
+
classificationFn;
|
|
68
|
+
processingFn;
|
|
64
69
|
constructor(scope, id, props) {
|
|
65
70
|
super(scope, id, props);
|
|
66
71
|
this.preprocessingFn = new aws_lambda_1.Function(this, 'PreprocessingFn', {
|
|
@@ -334,4 +339,4 @@ describe('BaseDocumentProcessing - DynamoDB Schema Extension Mechanism', () => {
|
|
|
334
339
|
});
|
|
335
340
|
});
|
|
336
341
|
});
|
|
337
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLXNjaGVtYS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvdGVzdHMvYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLXNjaGVtYS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQXlDO0FBQ3pDLHVEQUFrRDtBQUNsRCx1REFBaUU7QUFDakUscUVBQXlEO0FBQ3pELGlGQUF5RjtBQUN6RiwyREFBMkQ7QUFDM0QsMEVBQWlHO0FBRWpHOzs7R0FHRztBQUNILE1BQU0sMENBQTJDLFNBQVEsaURBQXNCO0lBSTdFLFlBQVksS0FBVSxFQUFFLEVBQVUsRUFBRSxLQUFVO1FBQzVDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLHFCQUFRLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFO1lBQzdELE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7WUFDNUIsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLGlCQUFJLENBQUMsVUFBVSxDQUFDLHFFQUFxRSxDQUFDO1NBQzdGLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxxQkFBUSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7WUFDckQsT0FBTyxFQUFFLG9CQUFPLENBQUMsV0FBVztZQUM1QixPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsaUJBQUksQ0FBQyxVQUFVLENBQUMsaURBQWlELENBQUM7U0FDekUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLGlCQUFpQjtRQUN6Qix5Q0FBeUM7UUFDekMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELGdFQUFnRTtJQUV0RCxrQkFBa0I7UUFDMUIsT0FBTyxJQUFJLHNDQUFZLENB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LENBQUMsTUFBVyxFQUFFLEVBQUUsQ0FDdEUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQzFELENBQUM7WUFFRixNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUV6QyxvREFBb0Q7WUFDcEQsTUFBTSxVQUFVLEdBQUksa0JBQTBCLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7WUFDbkYsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQ3BELElBQUksQ0FBQyxNQUFNLElBQUksQ0FDYixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBQzNFLElBQUksQ0FBQyxNQUFNLEtBQUsscUJBQXFCLENBQ3RDLENBQ0YsQ0FBQztZQUVGLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QyxNQUFNLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHAsIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbmltcG9ydCB7IENvZGUsIEZ1bmN0aW9uLCBSdW50aW1lIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBKc29uUGF0aCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zdGVwZnVuY3Rpb25zJztcbmltcG9ydCB7IER5bmFtb0F0dHJpYnV0ZVZhbHVlLCBMYW1iZGFJbnZva2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9ucy10YXNrcyc7XG5pbXBvcnQgeyBjcmVhdGVUZXN0QXBwIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Rlc3QtdXRpbHMnO1xuaW1wb3J0IHsgQmFzZURvY3VtZW50UHJvY2Vzc2luZywgRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfSBmcm9tICcuLi9iYXNlLWRvY3VtZW50LXByb2Nlc3NpbmcnO1xuXG4vKipcbiAqIFRlc3QgaW1wbGVtZW50YXRpb24gV0lUSE9VVCBwcmVwcm9jZXNzaW5nIChiYWNrd2FyZCBjb21wYXRpYmxlKVxuICogVGhpcyBzaW11bGF0ZXMgZXhpc3RpbmcgaW1wbGVtZW50YXRpb25zIHRoYXQgZG9uJ3QgdXNlIGFueSBwcmVwcm9jZXNzaW5nXG4gKi9cbmNsYXNzIFRlc3REb2N1bWVudFByb2Nlc3NpbmdXaXRob3V0UHJlcHJvY2Vzc2luZyBleHRlbmRzIEJhc2VEb2N1bWVudFByb2Nlc3Npbmcge1xuICBwcml2YXRlIGNsYXNzaWZpY2F0aW9uRm46IEZ1bmN0aW9uO1xuICBwcml2YXRlIHByb2Nlc3NpbmdGbjogRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IGFueSwgaWQ6IHN0cmluZywgcHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgdGhpcy5jbGFzc2lmaWNhdGlvbkZuID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdDbGFzc2lmaWNhdGlvbkZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgZG9jdW1lbnRDbGFzc2lmaWNhdGlvbjogXCJURVNUXCIgfSk7JyksXG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2Nlc3NpbmdGbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnUHJvY2Vzc2luZ0ZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgcmVzdWx0OiB7fSB9KTsnKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcmVwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgLy8gTm8gcHJlcHJvY2Vzc2luZyAtIGJhY2t3YXJkIGNvbXBhdGlibGVcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gTm8gb3ZlcnJpZGUgb2YgcHJlcHJvY2Vzc2luZ01ldGFkYXRhKCkgLSB1c2VzIGRlZmF1bHQgKGVtcHR5KVxuXG4gIHByb3RlY3RlZCBjbGFzc2lmaWNhdGlvblN0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUge1xuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsICdNb2NrQ2xhc3NpZmljYXRpb24nLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5jbGFzc2lmaWNhdGlvbkZuLFxuICAgICAgcmVzdWx0UGF0aDogJyQuY2xhc3NpZmljYXRpb25SZXN1bHQnLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnTW9ja1Byb2Nlc3NpbmcnLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5wcm9jZXNzaW5nRm4sXG4gICAgICByZXN1bHRQYXRoOiAnJC5wcm9jZXNzaW5nUmVzdWx0JyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbnJpY2htZW50U3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb3N0UHJvY2Vzc2luZ1N0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUHJvY2Vzc2luZ1dvcmtmbG93KCkge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVN0YW5kYXJkUHJvY2Vzc2luZ1dvcmtmbG93KCk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlU3RhdGVNYWNoaW5lKCkge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZVN0YXRlTWFjaGluZUNyZWF0aW9uKCd0ZXN0LXN0YXRlLW1hY2hpbmUtbm8tcHJlcHJvY2Vzc2luZycpO1xuICB9XG59XG5cbi8qKlxuICogVGVzdCBpbXBsZW1lbnRhdGlvbiBXSVRIIHByZXByb2Nlc3NpbmcgYW5kIGN1c3RvbSBtZXRhZGF0YVxuICogVGhpcyBzaW11bGF0ZXMgaW1wbGVtZW50YXRpb25zIHRoYXQgYWRkIHRoZWlyIG93biBwcmVwcm9jZXNzaW5nLXNwZWNpZmljIGZpZWxkc1xuICogKGUuZy4sIGNodW5raW5nIG1ldGFkYXRhKSB3aXRob3V0IHRoZSBiYXNlIGNsYXNzIGtub3dpbmcgYWJvdXQgdGhlbVxuICovXG5jbGFzcyBUZXN0RG9jdW1lbnRQcm9jZXNzaW5nV2l0aEN1c3RvbU1ldGFkYXRhIGV4dGVuZHMgQmFzZURvY3VtZW50UHJvY2Vzc2luZyB7XG4gIHByaXZhdGUgcHJlcHJvY2Vzc2luZ0ZuOiBGdW5jdGlvbjtcbiAgcHJpdmF0ZSBjbGFzc2lmaWNhdGlvbkZuOiBGdW5jdGlvbjtcbiAgcHJpdmF0ZSBwcm9jZXNzaW5nRm46IEZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBhbnksIGlkOiBzdHJpbmcsIHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIHRoaXMucHJlcHJvY2Vzc2luZ0ZuID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdQcmVwcm9jZXNzaW5nRm4nLCB7XG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKGBcbiAgICAgICAgZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgICBjdXN0b21GaWVsZDE6ICd2YWx1ZTEnLFxuICAgICAgICAgIGN1c3RvbUZpZWxkMjogeyBuZXN0ZWQ6ICdkYXRhJyB9LFxuICAgICAgICAgIGN1c3RvbUZpZWxkMzogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIGApLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jbGFzc2lmaWNhdGlvbkZuID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdDbGFzc2lmaWNhdGlvbkZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgZG9jdW1lbnRDbGFzc2lmaWNhdGlvbjogXCJURVNUXCIgfSk7JyksXG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2Nlc3NpbmdGbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnUHJvY2Vzc2luZ0ZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgcmVzdWx0OiB7fSB9KTsnKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcmVwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIG5ldyBMYW1iZGFJbnZva2UodGhpcywgJ01vY2tQcmVwcm9jZXNzaW5nJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMucHJlcHJvY2Vzc2luZ0ZuLFxuICAgICAgcmVzdWx0UGF0aDogJyQucHJlcHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICAvLyBPdmVycmlkZSB0byBhZGQgY3VzdG9tIG1ldGFkYXRhIGZpZWxkc1xuICBwcm90ZWN0ZWQgcHJlcHJvY2Vzc2luZ01ldGFkYXRhKCk6IFJlY29yZDxzdHJpbmcsIER5bmFtb0F0dHJpYnV0ZVZhbHVlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEN1c3RvbUZpZWxkMTogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5zdHJpbmdBdCgnJC5wcmVwcm9jZXNzaW5nUmVzdWx0LmN1c3RvbUZpZWxkMScpKSxcbiAgICAgIEN1c3RvbUZpZWxkMjogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5qc29uVG9TdHJpbmcoSnNvblBhdGgub2JqZWN0QXQoJyQucHJlcHJvY2Vzc2luZ1Jlc3VsdC5jdXN0b21GaWVsZDInKSkpLFxuICAgICAgQ3VzdG9tRmllbGQzOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5ib29sZWFuRnJvbUpzb25QYXRoKEpzb25QYXRoLnN0cmluZ0F0KCckLnByZXByb2Nlc3NpbmdSZXN1bHQuY3VzdG9tRmllbGQzJykpLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xhc3NpZmljYXRpb25TdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnTW9ja0NsYXNzaWZpY2F0aW9uJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuY2xhc3NpZmljYXRpb25GbixcbiAgICAgIHJlc3VsdFBhdGg6ICckLmNsYXNzaWZpY2F0aW9uUmVzdWx0JyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB7XG4gICAgcmV0dXJuIG5ldyBMYW1iZGFJbnZva2UodGhpcywgJ01vY2tQcm9jZXNzaW5nJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMucHJvY2Vzc2luZ0ZuLFxuICAgICAgcmVzdWx0UGF0aDogJyQucHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW5yaWNobWVudFN0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9zdFByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVByb2Nlc3NpbmdXb3JrZmxvdygpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTdGFuZGFyZFByb2Nlc3NpbmdXb3JrZmxvdygpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVN0YXRlTWFjaGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVTdGF0ZU1hY2hpbmVDcmVhdGlvbigndGVzdC1zdGF0ZS1tYWNoaW5lLXdpdGgtY3VzdG9tLW1ldGFkYXRhJyk7XG4gIH1cbn1cblxuZGVzY3JpYmUoJ0Jhc2VEb2N1bWVudFByb2Nlc3NpbmcgLSBEeW5hbW9EQiBTY2hlbWEgRXh0ZW5zaW9uIE1lY2hhbmlzbScsICgpID0+IHtcbiAgbGV0IGFwcDogQXBwO1xuICBsZXQgc3RhY2tXaXRob3V0UHJlcHJvY2Vzc2luZzogU3RhY2s7XG4gIGxldCBzdGFja1dpdGhDdXN0b21NZXRhZGF0YTogU3RhY2s7XG4gIGxldCB0ZW1wbGF0ZVdpdGhvdXRQcmVwcm9jZXNzaW5nOiBUZW1wbGF0ZTtcbiAgbGV0IHRlbXBsYXRlV2l0aEN1c3RvbU1ldGFkYXRhOiBUZW1wbGF0ZTtcblxuICBiZWZvcmVBbGwoKCkgPT4ge1xuICAgIC8vIFVzZSBjcmVhdGVUZXN0QXBwKCkgdG8gc2tpcCBidW5kbGluZyBhbmQgc3BlZWQgdXAgdGVzdHNcbiAgICBhcHAgPSBjcmVhdGVUZXN0QXBwKCk7XG5cbiAgICAvLyBTdGFjayB3aXRob3V0IHByZXByb2Nlc3NpbmcgKGJhY2t3YXJkIGNvbXBhdGlibGUpXG4gICAgc3RhY2tXaXRob3V0UHJlcHJvY2Vzc2luZyA9IG5ldyBTdGFjayhhcHAsICdXaXRob3V0UHJlcHJvY2Vzc2luZ1N0YWNrJyk7XG4gICAgY29uc3QgY29uc3RydWN0V2l0aG91dFByZXByb2Nlc3NpbmcgPSBuZXcgVGVzdERvY3VtZW50UHJvY2Vzc2luZ1dpdGhvdXRQcmVwcm9jZXNzaW5nKFxuICAgICAgc3RhY2tXaXRob3V0UHJlcHJvY2Vzc2luZyxcbiAgICAgICdUZXN0V2l0aG91dFByZXByb2Nlc3NpbmcnLFxuICAgICAge30sXG4gICAgKTtcbiAgICBjb25zdHJ1Y3RXaXRob3V0UHJlcHJvY2Vzc2luZy5jcmVhdGVTdGF0ZU1hY2hpbmUoKTtcblxuICAgIC8vIFN0YWNrIHdpdGggY3VzdG9tIG1ldGFkYXRhXG4gICAgc3RhY2tXaXRoQ3VzdG9tTWV0YWRhdGEgPSBuZXcgU3RhY2soYXBwLCAnV2l0aEN1c3RvbU1ldGFkYXRhU3RhY2snKTtcbiAgICBjb25zdCBjb25zdHJ1Y3RXaXRoQ3VzdG9tTWV0YWRhdGEgPSBuZXcgVGVzdERvY3VtZW50UHJvY2Vzc2luZ1dpdGhDdXN0b21NZXRhZGF0YShcbiAgICAgIHN0YWNrV2l0aEN1c3RvbU1ldGFkYXRhLFxuICAgICAgJ1Rlc3RXaXRoQ3VzdG9tTWV0YWRhdGEnLFxuICAgICAge30sXG4gICAgKTtcbiAgICBjb25zdHJ1Y3RXaXRoQ3VzdG9tTWV0YWRhdGEuY3JlYXRlU3RhdGVNYWNoaW5lKCk7XG5cbiAgICAvLyBHZW5lcmF0ZSB0ZW1wbGF0ZXNcbiAgICB0ZW1wbGF0ZVdpdGhvdXRQcmVwcm9jZXNzaW5nID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrV2l0aG91dFByZXByb2Nlc3NpbmcpO1xuICAgIHRlbXBsYXRlV2l0aEN1c3RvbU1ldGFkYXRhID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrV2l0aEN1c3RvbU1ldGFkYXRhKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0JhY2t3YXJkIENvbXBhdGliaWxpdHkgLSBEb2N1bWVudHMgd2l0aG91dCBwcmVwcm9jZXNzaW5nJywgKCkgPT4ge1xuICAgIHRlc3QoJ0luaXRNZXRhZGF0YSBvbmx5IGluY2x1ZGVzIGJhc2UgZmllbGRzIHdoZW4gbm8gcHJlcHJvY2Vzc2luZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRlTWFjaGluZXMgPSB0ZW1wbGF0ZVdpdGhvdXRQcmVwcm9jZXNzaW5nLmZpbmRSZXNvdXJjZXMoJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJyk7XG4gICAgICBjb25zdCBzdGF0ZU1hY2hpbmVLZXkgPSBPYmplY3Qua2V5cyhzdGF0ZU1hY2hpbmVzKVswXTtcbiAgICAgIGNvbnN0IGRlZmluaXRpb25TdHJpbmcgPSBzdGF0ZU1hY2hpbmVzW3N0YXRlTWFjaGluZUtleV0uUHJvcGVydGllcy5EZWZpbml0aW9uU3RyaW5nO1xuXG4gICAgICAvLyBQYXJzZSB0aGUgZGVmaW5pdGlvblxuICAgICAgY29uc3QgZGVmaW5pdGlvbiA9IEpTT04ucGFyc2UoZGVmaW5pdGlvblN0cmluZ1snRm46OkpvaW4nXVsxXS5qb2luKCcnKSk7XG5cbiAgICAgIC8vIEZpbmQgdGhlIEluaXRNZXRhZGF0YUVudHJ5IHN0YXRlIGJ5IG5hbWVcbiAgICAgIGNvbnN0IGluaXRNZXRhZGF0YVN0YXRlID0gZGVmaW5pdGlvbi5TdGF0ZXMuSW5pdE1ldGFkYXRhRW50cnk7XG5cbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZSkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5UeXBlKS50b0JlKCdUYXNrJyk7XG5cbiAgICAgIC8vIFZlcmlmeSBiYXNlIGZpZWxkcyBhcmUgcHJlc2VudFxuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5Eb2N1bWVudElkKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5Db250ZW50VHlwZSkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uQ29udGVudCkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uV29ya2Zsb3dTdGF0dXMpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLlN0YXRlTWFjaGluZUV4ZWNJZCkudG9CZURlZmluZWQoKTtcblxuICAgICAgLy8gVmVyaWZ5IE5PIGN1c3RvbSBmaWVsZHMgYXJlIHByZXNlbnQgKGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLkN1c3RvbUZpZWxkMSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5DdXN0b21GaWVsZDIpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uQ3VzdG9tRmllbGQzKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd3b3JrZmxvdyBzdGFydHMgd2l0aCBJbml0TWV0YWRhdGEgd2hlbiBubyBwcmVwcm9jZXNzaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdGVNYWNoaW5lcyA9IHRlbXBsYXRlV2l0aG91dFByZXByb2Nlc3NpbmcuZmluZFJlc291cmNlcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnKTtcbiAgICAgIGNvbnN0IHN0YXRlTWFjaGluZUtleSA9IE9iamVjdC5rZXlzKHN0YXRlTWFjaGluZXMpWzBdO1xuICAgICAgY29uc3QgZGVmaW5pdGlvblN0cmluZyA9IHN0YXRlTWFjaGluZXNbc3RhdGVNYWNoaW5lS2V5XS5Qcm9wZXJ0aWVzLkRlZmluaXRpb25TdHJpbmc7XG5cbiAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBKU09OLnBhcnNlKGRlZmluaXRpb25TdHJpbmdbJ0ZuOjpKb2luJ11bMV0uam9pbignJykpO1xuXG4gICAgICAvLyBTaG91bGQgc3RhcnQgd2l0aCBJbml0TWV0YWRhdGEgd2hlbiBubyBwcmVwcm9jZXNzaW5nXG4gICAgICBleHBlY3QoZGVmaW5pdGlvbi5TdGFydEF0KS50b01hdGNoKC9Jbml0TWV0YWRhdGEvKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ0R5bmFtb0RCIHRhYmxlIHNjaGVtYSByZW1haW5zIHVuY2hhbmdlZCcsICgpID0+IHtcbiAgICAgIC8vIFZlcmlmeSB0YWJsZSBpcyBjcmVhdGVkIHdpdGggc2FtZSBzY2hlbWEgYXMgYmVmb3JlXG4gICAgICB0ZW1wbGF0ZVdpdGhvdXRQcmVwcm9jZXNzaW5nLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpEeW5hbW9EQjo6VGFibGUnLCB7XG4gICAgICAgIEtleVNjaGVtYTogW3tcbiAgICAgICAgICBBdHRyaWJ1dGVOYW1lOiAnRG9jdW1lbnRJZCcsXG4gICAgICAgICAgS2V5VHlwZTogJ0hBU0gnLFxuICAgICAgICB9XSxcbiAgICAgICAgQmlsbGluZ01vZGU6ICdQQVlfUEVSX1JFUVVFU1QnLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTY2hlbWEgRXh0ZW5zaW9uIE1lY2hhbmlzbSAtIEdlbmVyaWMgcHJlcHJvY2Vzc2luZyBtZXRhZGF0YScsICgpID0+IHtcbiAgICB0ZXN0KCdwcmVwcm9jZXNzaW5nTWV0YWRhdGEoKSBob29rIGFsbG93cyBzdWJjbGFzc2VzIHRvIGV4dGVuZCBzY2hlbWEnLCAoKSA9PiB7XG4gICAgICAvLyBUaGUga2V5IGRlc2lnbiBwcmluY2lwbGU6IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHByZXByb2Nlc3NpbmdNZXRhZGF0YSgpXG4gICAgICAvLyB0byBhZGQgdGhlaXIgb3duIGZpZWxkcyB0byBJbml0TWV0YWRhdGEgd2l0aG91dCBiYXNlIGNsYXNzIGtub3dpbmcgdGhlIGRldGFpbHNcblxuICAgICAgLy8gVmVyaWZ5IHRoZSBjb25zdHJ1Y3Qgd2l0aCBjdXN0b20gbWV0YWRhdGEgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICBleHBlY3Qoc3RhY2tXaXRoQ3VzdG9tTWV0YWRhdGEpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICAgIC8vIFZlcmlmeSBpdCBoYXMgYSBzdGF0ZSBtYWNoaW5lXG4gICAgICB0ZW1wbGF0ZVdpdGhDdXN0b21NZXRhZGF0YS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJywgMSk7XG5cbiAgICAgIC8vIFZlcmlmeSBpdCBoYXMgdGhlIHNhbWUgRHluYW1vREIgdGFibGUgc3RydWN0dXJlIGFzIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uXG4gICAgICB0ZW1wbGF0ZVdpdGhDdXN0b21NZXRhZGF0YS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6RHluYW1vREI6OlRhYmxlJywge1xuICAgICAgICBLZXlTY2hlbWE6IFt7XG4gICAgICAgICAgQXR0cmlidXRlTmFtZTogJ0RvY3VtZW50SWQnLFxuICAgICAgICAgIEtleVR5cGU6ICdIQVNIJyxcbiAgICAgICAgfV0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3dvcmtmbG93IGluY2x1ZGVzIHByZXByb2Nlc3Npbmcgc3RlcCB3aGVuIHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdGVNYWNoaW5lcyA9IHRlbXBsYXRlV2l0aEN1c3RvbU1ldGFkYXRhLmZpbmRSZXNvdXJjZXMoJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJyk7XG4gICAgICBjb25zdCBzdGF0ZU1hY2hpbmVLZXkgPSBPYmplY3Qua2V5cyhzdGF0ZU1hY2hpbmVzKVswXTtcbiAgICAgIGNvbnN0IGRlZmluaXRpb25TdHJpbmcgPSBzdGF0ZU1hY2hpbmVzW3N0YXRlTWFjaGluZUtleV0uUHJvcGVydGllcy5EZWZpbml0aW9uU3RyaW5nO1xuXG4gICAgICBjb25zdCBkZWZpbml0aW9uID0gSlNPTi5wYXJzZShkZWZpbml0aW9uU3RyaW5nWydGbjo6Sm9pbiddWzFdLmpvaW4oJycpKTtcblxuICAgICAgLy8gVmVyaWZ5IEluaXRNZXRhZGF0YSBzdGVwIGV4aXN0cyAoY29yZSBmdW5jdGlvbmFsaXR5KVxuICAgICAgZXhwZWN0KGRlZmluaXRpb24uU3RhdGVzLkluaXRNZXRhZGF0YUVudHJ5KS50b0JlRGVmaW5lZCgpO1xuXG4gICAgICAvLyBXaGVuIHByZXByb2Nlc3NpbmcgaXMgcHJvdmlkZWQsIGl0IHNob3VsZCBiZSBpbiB0aGUgd29ya2Zsb3dcbiAgICAgIC8vIFRoZSBleGFjdCBzdHJ1Y3R1cmUgZGVwZW5kcyBvbiB0aGUgc3ViY2xhc3MgaW1wbGVtZW50YXRpb25cbiAgICAgIGV4cGVjdChkZWZpbml0aW9uLlN0YXRlcykudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChPYmplY3Qua2V5cyhkZWZpbml0aW9uLlN0YXRlcykubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdJbml0TWV0YWRhdGEgY2FuIGFjY2VwdCBhZGRpdGlvbmFsIGZpZWxkcyB2aWEgcHJlcHJvY2Vzc2luZ01ldGFkYXRhKCknLCAoKSA9PiB7XG4gICAgICBjb25zdCBzdGF0ZU1hY2hpbmVzID0gdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEuZmluZFJlc291cmNlcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnKTtcbiAgICAgIGNvbnN0IHN0YXRlTWFjaGluZUtleSA9IE9iamVjdC5rZXlzKHN0YXRlTWFjaGluZXMpWzBdO1xuICAgICAgY29uc3QgZGVmaW5pdGlvblN0cmluZyA9IHN0YXRlTWFjaGluZXNbc3RhdGVNYWNoaW5lS2V5XS5Qcm9wZXJ0aWVzLkRlZmluaXRpb25TdHJpbmc7XG5cbiAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBKU09OLnBhcnNlKGRlZmluaXRpb25TdHJpbmdbJ0ZuOjpKb2luJ11bMV0uam9pbignJykpO1xuXG4gICAgICBjb25zdCBpbml0TWV0YWRhdGFTdGF0ZSA9IGRlZmluaXRpb24uU3RhdGVzLkluaXRNZXRhZGF0YUVudHJ5O1xuXG4gICAgICAvLyBWZXJpZnkgYmFzZSBmaWVsZHMgYXJlIGFsd2F5cyBwcmVzZW50XG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLkRvY3VtZW50SWQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLkNvbnRlbnRUeXBlKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5Db250ZW50KS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5Xb3JrZmxvd1N0YXR1cykudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uU3RhdGVNYWNoaW5lRXhlY0lkKS50b0JlRGVmaW5lZCgpO1xuXG4gICAgICAvLyBUaGUgbWVjaGFuaXNtIGFsbG93cyBhZGRpbmcgY3VzdG9tIGZpZWxkcyAoaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIHN1YmNsYXNzKVxuICAgICAgLy8gRHluYW1vREIncyBzY2hlbWFsZXNzIG5hdHVyZSBtZWFucyBhbnkgZmllbGRzIGNhbiBiZSBhZGRlZCBhdCBydW50aW1lXG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTY2hlbWEgQ29tcGF0aWJpbGl0eScsICgpID0+IHtcbiAgICB0ZXN0KCdib3RoIGltcGxlbWVudGF0aW9ucyB1c2UgdGhlIHNhbWUgRHluYW1vREIgdGFibGUgc3RydWN0dXJlJywgKCkgPT4ge1xuICAgICAgLy8gQm90aCBzaG91bGQgY3JlYXRlIHRhYmxlcyB3aXRoIHNhbWUgcGFydGl0aW9uIGtleVxuICAgICAgdGVtcGxhdGVXaXRob3V0UHJlcHJvY2Vzc2luZy5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6RHluYW1vREI6OlRhYmxlJywge1xuICAgICAgICBLZXlTY2hlbWE6IFt7XG4gICAgICAgICAgQXR0cmlidXRlTmFtZTogJ0RvY3VtZW50SWQnLFxuICAgICAgICAgIEtleVR5cGU6ICdIQVNIJyxcbiAgICAgICAgfV0sXG4gICAgICB9KTtcblxuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgS2V5U2NoZW1hOiBbe1xuICAgICAgICAgIEF0dHJpYnV0ZU5hbWU6ICdEb2N1bWVudElkJyxcbiAgICAgICAgICBLZXlUeXBlOiAnSEFTSCcsXG4gICAgICAgIH1dLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdib3RoIGltcGxlbWVudGF0aW9ucyBjcmVhdGUgZW5jcnlwdGVkIHRhYmxlcycsICgpID0+IHtcbiAgICAgIHRlbXBsYXRlV2l0aG91dFByZXByb2Nlc3NpbmcuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgU1NFU3BlY2lmaWNhdGlvbjoge1xuICAgICAgICAgIFNTRUVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgU1NFVHlwZTogJ0tNUycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgU1NFU3BlY2lmaWNhdGlvbjoge1xuICAgICAgICAgIFNTRUVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgU1NFVHlwZTogJ0tNUycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2JvdGggaW1wbGVtZW50YXRpb25zIHVzZSBQQVlfUEVSX1JFUVVFU1QgYmlsbGluZycsICgpID0+IHtcbiAgICAgIHRlbXBsYXRlV2l0aG91dFByZXByb2Nlc3NpbmcuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgQmlsbGluZ01vZGU6ICdQQVlfUEVSX1JFUVVFU1QnLFxuICAgICAgfSk7XG5cbiAgICAgIHRlbXBsYXRlV2l0aEN1c3RvbU1ldGFkYXRhLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpEeW5hbW9EQjo6VGFibGUnLCB7XG4gICAgICAgIEJpbGxpbmdNb2RlOiAnUEFZX1BFUl9SRVFVRVNUJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRGVzaWduIFByaW5jaXBsZTogQmFzZSBjbGFzcyBoYXMgbm8ga25vd2xlZGdlIG9mIHByZXByb2Nlc3Npbmcgc3BlY2lmaWNzJywgKCkgPT4ge1xuICAgIHRlc3QoJ2Jhc2UgY2xhc3MgcHJvdmlkZXMgZ2VuZXJpYyBleHRlbnNpb24gbWVjaGFuaXNtIHZpYSBwcmVwcm9jZXNzaW5nTWV0YWRhdGEoKScsICgpID0+IHtcbiAgICAgIC8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGUgZGVzaWduIHByaW5jaXBsZTpcbiAgICAgIC8vIC0gQmFzZSBjbGFzcyBkb2Vzbid0IGtub3cgYWJvdXQgY2h1bmtpbmcsIHZhbGlkYXRpb24sIG9yIGFueSBzcGVjaWZpYyBwcmVwcm9jZXNzaW5nXG4gICAgICAvLyAtIEJhc2UgY2xhc3Mgb25seSBwcm92aWRlcyBhIGhvb2sgKHByZXByb2Nlc3NpbmdNZXRhZGF0YSkgZm9yIHN1YmNsYXNzZXMgdG8gZXh0ZW5kXG4gICAgICAvLyAtIFN1YmNsYXNzZXMgYXJlIHJlc3BvbnNpYmxlIGZvciB0aGVpciBvd24gbWV0YWRhdGEgZmllbGRzXG5cbiAgICAgIC8vIFZlcmlmeSB0aGF0IHdpdGhvdXQgb3ZlcnJpZGluZyBwcmVwcm9jZXNzaW5nTWV0YWRhdGEoKSwgd29ya2Zsb3cgd29ya3MgY29ycmVjdGx5XG4gICAgICBjb25zdCBzdGF0ZU1hY2hpbmVzID0gdGVtcGxhdGVXaXRob3V0UHJlcHJvY2Vzc2luZy5maW5kUmVzb3VyY2VzKCdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZScpO1xuICAgICAgY29uc3Qgc3RhdGVNYWNoaW5lS2V5ID0gT2JqZWN0LmtleXMoc3RhdGVNYWNoaW5lcylbMF07XG4gICAgICBjb25zdCBkZWZpbml0aW9uU3RyaW5nID0gc3RhdGVNYWNoaW5lc1tzdGF0ZU1hY2hpbmVLZXldLlByb3BlcnRpZXMuRGVmaW5pdGlvblN0cmluZztcbiAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBKU09OLnBhcnNlKGRlZmluaXRpb25TdHJpbmdbJ0ZuOjpKb2luJ11bMV0uam9pbignJykpO1xuXG4gICAgICBjb25zdCBpbml0TWV0YWRhdGFTdGF0ZSA9IGRlZmluaXRpb24uU3RhdGVzLkluaXRNZXRhZGF0YUVudHJ5O1xuXG4gICAgICAvLyBCYXNlIGZpZWxkcyBhcmUgYWx3YXlzIHByZXNlbnRcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uRG9jdW1lbnRJZCkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uQ29udGVudFR5cGUpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLkNvbnRlbnQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLldvcmtmbG93U3RhdHVzKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5TdGF0ZU1hY2hpbmVFeGVjSWQpLnRvQmVEZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdzdWJjbGFzc2VzIGNhbiBleHRlbmQgdmlhIHByZXByb2Nlc3NpbmdNZXRhZGF0YSgpIHdpdGhvdXQgYnJlYWtpbmcgYmFzZSBmdW5jdGlvbmFsaXR5JywgKCkgPT4ge1xuICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvbnN0cnVjdCB3aXRoIGN1c3RvbSBtZXRhZGF0YSBzdGlsbCBoYXMgYWxsIGJhc2UgZnVuY3Rpb25hbGl0eVxuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEucmVzb3VyY2VDb3VudElzKCdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZScsIDEpO1xuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEucmVzb3VyY2VDb3VudElzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIDEpO1xuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEucmVzb3VyY2VDb3VudElzKCdBV1M6OlMzOjpCdWNrZXQnLCAxKTtcblxuICAgICAgLy8gVmVyaWZ5IHN0YXRlIG1hY2hpbmUgaGFzIHRoZSBzYW1lIGJhc2Ugc3RydWN0dXJlXG4gICAgICBjb25zdCBzdGF0ZU1hY2hpbmVzID0gdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEuZmluZFJlc291cmNlcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnKTtcbiAgICAgIGNvbnN0IHN0YXRlTWFjaGluZUtleSA9IE9iamVjdC5rZXlzKHN0YXRlTWFjaGluZXMpWzBdO1xuICAgICAgY29uc3QgZGVmaW5pdGlvblN0cmluZyA9IHN0YXRlTWFjaGluZXNbc3RhdGVNYWNoaW5lS2V5XS5Qcm9wZXJ0aWVzLkRlZmluaXRpb25TdHJpbmc7XG4gICAgICBjb25zdCBkZWZpbml0aW9uID0gSlNPTi5wYXJzZShkZWZpbml0aW9uU3RyaW5nWydGbjo6Sm9pbiddWzFdLmpvaW4oJycpKTtcblxuICAgICAgLy8gQ29yZSBzdGF0ZXMgc2hvdWxkIGV4aXN0XG4gICAgICBleHBlY3QoZGVmaW5pdGlvbi5TdGF0ZXMuSW5pdE1ldGFkYXRhRW50cnkpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoZGVmaW5pdGlvbi5TdGF0ZXMuTW9ja0NsYXNzaWZpY2F0aW9uKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGRlZmluaXRpb24uU3RhdGVzLk1vY2tQcm9jZXNzaW5nKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRHluYW1vREIgc2NoZW1hbGVzcyBuYXR1cmUgc3VwcG9ydHMgcnVudGltZSBmaWVsZCBhZGRpdGlvbicsICgpID0+IHtcbiAgICB0ZXN0KCdEeW5hbW9EQiB0YWJsZSBzdXBwb3J0cyBhbnkgYWRkaXRpb25hbCBmaWVsZHMgYXQgcnVudGltZScsICgpID0+IHtcbiAgICAgIC8vIER5bmFtb0RCIGlzIHNjaGVtYWxlc3MsIHNvIGFueSBmaWVsZHMgY2FuIGJlIGFkZGVkIGF0IHJ1bnRpbWVcbiAgICAgIC8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGUgdGFibGUgaXMgY3JlYXRlZCBjb3JyZWN0bHkgYW5kIGNhbiBhY2NlcHQgYW55IGF0dHJpYnV0ZXNcblxuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgS2V5U2NoZW1hOiBbe1xuICAgICAgICAgIEF0dHJpYnV0ZU5hbWU6ICdEb2N1bWVudElkJyxcbiAgICAgICAgICBLZXlUeXBlOiAnSEFTSCcsXG4gICAgICAgIH1dLFxuICAgICAgICBCaWxsaW5nTW9kZTogJ1BBWV9QRVJfUkVRVUVTVCcsXG4gICAgICB9KTtcblxuICAgICAgLy8gTm8gYXR0cmlidXRlIGRlZmluaXRpb25zIG5lZWRlZCBmb3Igbm9uLWtleSBhdHRyaWJ1dGVzIGluIER5bmFtb0RCXG4gICAgICAvLyBGaWVsZHMgbGlrZSBBZ2dyZWdhdGVkUmVzdWx0IGNhbiBiZSBhZGRlZCB2aWEgRHluYW1vVXBkYXRlSXRlbSBkdXJpbmcgcHJvY2Vzc2luZ1xuICAgIH0pO1xuXG4gICAgdGVzdCgnc3RhdGUgbWFjaGluZSBoYXMgcGVybWlzc2lvbnMgdG8gdXBkYXRlIER5bmFtb0RCIGl0ZW1zJywgKCkgPT4ge1xuICAgICAgLy8gVmVyaWZ5IHRoZSBzdGF0ZSBtYWNoaW5lIHJvbGUgaGFzIFVwZGF0ZUl0ZW0gcGVybWlzc2lvbnNcbiAgICAgIC8vIFRoaXMgYWxsb3dzIGFkZGluZyBmaWVsZHMgbGlrZSBBZ2dyZWdhdGVkUmVzdWx0IGR1cmluZyBwcm9jZXNzaW5nXG4gICAgICBjb25zdCBwb2xpY2llcyA9IHRlbXBsYXRlV2l0aEN1c3RvbU1ldGFkYXRhLmZpbmRSZXNvdXJjZXMoJ0FXUzo6SUFNOjpQb2xpY3knKTtcblxuICAgICAgLy8gRmluZCB0aGUgc3RhdGUgbWFjaGluZSByb2xlIHBvbGljeVxuICAgICAgY29uc3Qgc3RhdGVNYWNoaW5lUG9saWN5ID0gT2JqZWN0LnZhbHVlcyhwb2xpY2llcykuZmluZCgocG9saWN5OiBhbnkpID0+XG4gICAgICAgIHBvbGljeS5Qcm9wZXJ0aWVzLlBvbGljeU5hbWUuaW5jbHVkZXMoJ1N0YXRlTWFjaGluZVJvbGUnKSxcbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChzdGF0ZU1hY2hpbmVQb2xpY3kpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICAgIC8vIENoZWNrIHRoYXQgaXQgaGFzIER5bmFtb0RCIFVwZGF0ZUl0ZW0gcGVybWlzc2lvbnNcbiAgICAgIGNvbnN0IHN0YXRlbWVudHMgPSAoc3RhdGVNYWNoaW5lUG9saWN5IGFzIGFueSkuUHJvcGVydGllcy5Qb2xpY3lEb2N1bWVudC5TdGF0ZW1lbnQ7XG4gICAgICBjb25zdCBkeW5hbW9TdGF0ZW1lbnQgPSBzdGF0ZW1lbnRzLmZpbmQoKHN0bXQ6IGFueSkgPT5cbiAgICAgICAgc3RtdC5BY3Rpb24gJiYgKFxuICAgICAgICAgIChBcnJheS5pc0FycmF5KHN0bXQuQWN0aW9uKSAmJiBzdG10LkFjdGlvbi5pbmNsdWRlcygnZHluYW1vZGI6VXBkYXRlSXRlbScpKSB8fFxuICAgICAgICAgIHN0bXQuQWN0aW9uID09PSAnZHluYW1vZGI6VXBkYXRlSXRlbSdcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChkeW5hbW9TdGF0ZW1lbnQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoZHluYW1vU3RhdGVtZW50LkVmZmVjdCkudG9CZSgnQWxsb3cnKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
342
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLXNjaGVtYS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvdGVzdHMvYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLXNjaGVtYS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQXlDO0FBQ3pDLHVEQUFrRDtBQUNsRCx1REFBaUU7QUFDakUscUVBQXlEO0FBQ3pELGlGQUF5RjtBQUN6RiwyREFBMkQ7QUFDM0QsMEVBQWlHO0FBRWpHOzs7R0FHRztBQUNILE1BQU0sMENBQTJDLFNBQVEsaURBQXNCO0lBQ3JFLGdCQUFnQixDQUFXO0lBQzNCLFlBQVksQ0FBVztJQUUvQixZQUFZLEtBQVUsRUFBRSxFQUFVLEVBQUUsS0FBVTtRQUM1QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxxQkFBUSxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUM3RCxPQUFPLEVBQUUsb0JBQU8sQ0FBQyxXQUFXO1lBQzVCLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxpQkFBSSxDQUFDLFVBQVUsQ0FBQyxxRUFBcUUsQ0FBQztTQUM3RixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUkscUJBQVEsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO1lBQ3JELE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7WUFDNUIsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLGlCQUFJLENBQUMsVUFBVSxDQUFDLGlEQUFpRCxDQUFDO1NBQ3pFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxpQkFBaUI7UUFDekIseUNBQXlDO1FBQ3pDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxnRUFBZ0U7SUFF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QUFDO1lBRTlFLHFDQUFxQztZQUNyQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUUsQ0FDdEUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQzFELENBQUM7WUFFRixNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUV6QyxvREFBb0Q7WUFDcEQsTUFBTSxVQUFVLEdBQUksa0JBQTBCLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7WUFDbkYsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQ3BELElBQUksQ0FBQyxNQUFNLElBQUksQ0FDYixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBQzNFLElBQUksQ0FBQyxNQUFNLEtBQUsscUJBQXFCLENBQ3RDLENBQ0YsQ0FBQztZQUVGLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QyxNQUFNLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHAsIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbmltcG9ydCB7IENvZGUsIEZ1bmN0aW9uLCBSdW50aW1lIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBKc29uUGF0aCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zdGVwZnVuY3Rpb25zJztcbmltcG9ydCB7IER5bmFtb0F0dHJpYnV0ZVZhbHVlLCBMYW1iZGFJbnZva2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9ucy10YXNrcyc7XG5pbXBvcnQgeyBjcmVhdGVUZXN0QXBwIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Rlc3QtdXRpbHMnO1xuaW1wb3J0IHsgQmFzZURvY3VtZW50UHJvY2Vzc2luZywgRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfSBmcm9tICcuLi9iYXNlLWRvY3VtZW50LXByb2Nlc3NpbmcnO1xuXG4vKipcbiAqIFRlc3QgaW1wbGVtZW50YXRpb24gV0lUSE9VVCBwcmVwcm9jZXNzaW5nIChiYWNrd2FyZCBjb21wYXRpYmxlKVxuICogVGhpcyBzaW11bGF0ZXMgZXhpc3RpbmcgaW1wbGVtZW50YXRpb25zIHRoYXQgZG9uJ3QgdXNlIGFueSBwcmVwcm9jZXNzaW5nXG4gKi9cbmNsYXNzIFRlc3REb2N1bWVudFByb2Nlc3NpbmdXaXRob3V0UHJlcHJvY2Vzc2luZyBleHRlbmRzIEJhc2VEb2N1bWVudFByb2Nlc3Npbmcge1xuICBwcml2YXRlIGNsYXNzaWZpY2F0aW9uRm46IEZ1bmN0aW9uO1xuICBwcml2YXRlIHByb2Nlc3NpbmdGbjogRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IGFueSwgaWQ6IHN0cmluZywgcHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgdGhpcy5jbGFzc2lmaWNhdGlvbkZuID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdDbGFzc2lmaWNhdGlvbkZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgZG9jdW1lbnRDbGFzc2lmaWNhdGlvbjogXCJURVNUXCIgfSk7JyksXG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2Nlc3NpbmdGbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnUHJvY2Vzc2luZ0ZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgcmVzdWx0OiB7fSB9KTsnKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcmVwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgLy8gTm8gcHJlcHJvY2Vzc2luZyAtIGJhY2t3YXJkIGNvbXBhdGlibGVcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gTm8gb3ZlcnJpZGUgb2YgcHJlcHJvY2Vzc2luZ01ldGFkYXRhKCkgLSB1c2VzIGRlZmF1bHQgKGVtcHR5KVxuXG4gIHByb3RlY3RlZCBjbGFzc2lmaWNhdGlvblN0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUge1xuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsICdNb2NrQ2xhc3NpZmljYXRpb24nLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5jbGFzc2lmaWNhdGlvbkZuLFxuICAgICAgcmVzdWx0UGF0aDogJyQuY2xhc3NpZmljYXRpb25SZXN1bHQnLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnTW9ja1Byb2Nlc3NpbmcnLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5wcm9jZXNzaW5nRm4sXG4gICAgICByZXN1bHRQYXRoOiAnJC5wcm9jZXNzaW5nUmVzdWx0JyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbnJpY2htZW50U3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb3N0UHJvY2Vzc2luZ1N0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUHJvY2Vzc2luZ1dvcmtmbG93KCkge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVN0YW5kYXJkUHJvY2Vzc2luZ1dvcmtmbG93KCk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlU3RhdGVNYWNoaW5lKCkge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZVN0YXRlTWFjaGluZUNyZWF0aW9uKCd0ZXN0LXN0YXRlLW1hY2hpbmUtbm8tcHJlcHJvY2Vzc2luZycpO1xuICB9XG59XG5cbi8qKlxuICogVGVzdCBpbXBsZW1lbnRhdGlvbiBXSVRIIHByZXByb2Nlc3NpbmcgYW5kIGN1c3RvbSBtZXRhZGF0YVxuICogVGhpcyBzaW11bGF0ZXMgaW1wbGVtZW50YXRpb25zIHRoYXQgYWRkIHRoZWlyIG93biBwcmVwcm9jZXNzaW5nLXNwZWNpZmljIGZpZWxkc1xuICogKGUuZy4sIGNodW5raW5nIG1ldGFkYXRhKSB3aXRob3V0IHRoZSBiYXNlIGNsYXNzIGtub3dpbmcgYWJvdXQgdGhlbVxuICovXG5jbGFzcyBUZXN0RG9jdW1lbnRQcm9jZXNzaW5nV2l0aEN1c3RvbU1ldGFkYXRhIGV4dGVuZHMgQmFzZURvY3VtZW50UHJvY2Vzc2luZyB7XG4gIHByaXZhdGUgcHJlcHJvY2Vzc2luZ0ZuOiBGdW5jdGlvbjtcbiAgcHJpdmF0ZSBjbGFzc2lmaWNhdGlvbkZuOiBGdW5jdGlvbjtcbiAgcHJpdmF0ZSBwcm9jZXNzaW5nRm46IEZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBhbnksIGlkOiBzdHJpbmcsIHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIHRoaXMucHJlcHJvY2Vzc2luZ0ZuID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdQcmVwcm9jZXNzaW5nRm4nLCB7XG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKGBcbiAgICAgICAgZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgICBjdXN0b21GaWVsZDE6ICd2YWx1ZTEnLFxuICAgICAgICAgIGN1c3RvbUZpZWxkMjogeyBuZXN0ZWQ6ICdkYXRhJyB9LFxuICAgICAgICAgIGN1c3RvbUZpZWxkMzogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIGApLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jbGFzc2lmaWNhdGlvbkZuID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdDbGFzc2lmaWNhdGlvbkZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgZG9jdW1lbnRDbGFzc2lmaWNhdGlvbjogXCJURVNUXCIgfSk7JyksXG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2Nlc3NpbmdGbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnUHJvY2Vzc2luZ0ZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgcmVzdWx0OiB7fSB9KTsnKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcmVwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIG5ldyBMYW1iZGFJbnZva2UodGhpcywgJ01vY2tQcmVwcm9jZXNzaW5nJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMucHJlcHJvY2Vzc2luZ0ZuLFxuICAgICAgcmVzdWx0UGF0aDogJyQucHJlcHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICAvLyBPdmVycmlkZSB0byBhZGQgY3VzdG9tIG1ldGFkYXRhIGZpZWxkc1xuICBwcm90ZWN0ZWQgcHJlcHJvY2Vzc2luZ01ldGFkYXRhKCk6IFJlY29yZDxzdHJpbmcsIER5bmFtb0F0dHJpYnV0ZVZhbHVlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEN1c3RvbUZpZWxkMTogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5zdHJpbmdBdCgnJC5wcmVwcm9jZXNzaW5nUmVzdWx0LmN1c3RvbUZpZWxkMScpKSxcbiAgICAgIEN1c3RvbUZpZWxkMjogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5qc29uVG9TdHJpbmcoSnNvblBhdGgub2JqZWN0QXQoJyQucHJlcHJvY2Vzc2luZ1Jlc3VsdC5jdXN0b21GaWVsZDInKSkpLFxuICAgICAgQ3VzdG9tRmllbGQzOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5ib29sZWFuRnJvbUpzb25QYXRoKEpzb25QYXRoLnN0cmluZ0F0KCckLnByZXByb2Nlc3NpbmdSZXN1bHQuY3VzdG9tRmllbGQzJykpLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xhc3NpZmljYXRpb25TdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnTW9ja0NsYXNzaWZpY2F0aW9uJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuY2xhc3NpZmljYXRpb25GbixcbiAgICAgIHJlc3VsdFBhdGg6ICckLmNsYXNzaWZpY2F0aW9uUmVzdWx0JyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB7XG4gICAgcmV0dXJuIG5ldyBMYW1iZGFJbnZva2UodGhpcywgJ01vY2tQcm9jZXNzaW5nJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMucHJvY2Vzc2luZ0ZuLFxuICAgICAgcmVzdWx0UGF0aDogJyQucHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW5yaWNobWVudFN0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9zdFByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVByb2Nlc3NpbmdXb3JrZmxvdygpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTdGFuZGFyZFByb2Nlc3NpbmdXb3JrZmxvdygpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVN0YXRlTWFjaGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVTdGF0ZU1hY2hpbmVDcmVhdGlvbigndGVzdC1zdGF0ZS1tYWNoaW5lLXdpdGgtY3VzdG9tLW1ldGFkYXRhJyk7XG4gIH1cbn1cblxuZGVzY3JpYmUoJ0Jhc2VEb2N1bWVudFByb2Nlc3NpbmcgLSBEeW5hbW9EQiBTY2hlbWEgRXh0ZW5zaW9uIE1lY2hhbmlzbScsICgpID0+IHtcbiAgbGV0IGFwcDogQXBwO1xuICBsZXQgc3RhY2tXaXRob3V0UHJlcHJvY2Vzc2luZzogU3RhY2s7XG4gIGxldCBzdGFja1dpdGhDdXN0b21NZXRhZGF0YTogU3RhY2s7XG4gIGxldCB0ZW1wbGF0ZVdpdGhvdXRQcmVwcm9jZXNzaW5nOiBUZW1wbGF0ZTtcbiAgbGV0IHRlbXBsYXRlV2l0aEN1c3RvbU1ldGFkYXRhOiBUZW1wbGF0ZTtcblxuICBiZWZvcmVBbGwoKCkgPT4ge1xuICAgIC8vIFVzZSBjcmVhdGVUZXN0QXBwKCkgdG8gc2tpcCBidW5kbGluZyBhbmQgc3BlZWQgdXAgdGVzdHNcbiAgICBhcHAgPSBjcmVhdGVUZXN0QXBwKCk7XG5cbiAgICAvLyBTdGFjayB3aXRob3V0IHByZXByb2Nlc3NpbmcgKGJhY2t3YXJkIGNvbXBhdGlibGUpXG4gICAgc3RhY2tXaXRob3V0UHJlcHJvY2Vzc2luZyA9IG5ldyBTdGFjayhhcHAsICdXaXRob3V0UHJlcHJvY2Vzc2luZ1N0YWNrJyk7XG4gICAgY29uc3QgY29uc3RydWN0V2l0aG91dFByZXByb2Nlc3NpbmcgPSBuZXcgVGVzdERvY3VtZW50UHJvY2Vzc2luZ1dpdGhvdXRQcmVwcm9jZXNzaW5nKFxuICAgICAgc3RhY2tXaXRob3V0UHJlcHJvY2Vzc2luZyxcbiAgICAgICdUZXN0V2l0aG91dFByZXByb2Nlc3NpbmcnLFxuICAgICAge30sXG4gICAgKTtcbiAgICBjb25zdHJ1Y3RXaXRob3V0UHJlcHJvY2Vzc2luZy5jcmVhdGVTdGF0ZU1hY2hpbmUoKTtcblxuICAgIC8vIFN0YWNrIHdpdGggY3VzdG9tIG1ldGFkYXRhXG4gICAgc3RhY2tXaXRoQ3VzdG9tTWV0YWRhdGEgPSBuZXcgU3RhY2soYXBwLCAnV2l0aEN1c3RvbU1ldGFkYXRhU3RhY2snKTtcbiAgICBjb25zdCBjb25zdHJ1Y3RXaXRoQ3VzdG9tTWV0YWRhdGEgPSBuZXcgVGVzdERvY3VtZW50UHJvY2Vzc2luZ1dpdGhDdXN0b21NZXRhZGF0YShcbiAgICAgIHN0YWNrV2l0aEN1c3RvbU1ldGFkYXRhLFxuICAgICAgJ1Rlc3RXaXRoQ3VzdG9tTWV0YWRhdGEnLFxuICAgICAge30sXG4gICAgKTtcbiAgICBjb25zdHJ1Y3RXaXRoQ3VzdG9tTWV0YWRhdGEuY3JlYXRlU3RhdGVNYWNoaW5lKCk7XG5cbiAgICAvLyBHZW5lcmF0ZSB0ZW1wbGF0ZXNcbiAgICB0ZW1wbGF0ZVdpdGhvdXRQcmVwcm9jZXNzaW5nID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrV2l0aG91dFByZXByb2Nlc3NpbmcpO1xuICAgIHRlbXBsYXRlV2l0aEN1c3RvbU1ldGFkYXRhID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrV2l0aEN1c3RvbU1ldGFkYXRhKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0JhY2t3YXJkIENvbXBhdGliaWxpdHkgLSBEb2N1bWVudHMgd2l0aG91dCBwcmVwcm9jZXNzaW5nJywgKCkgPT4ge1xuICAgIHRlc3QoJ0luaXRNZXRhZGF0YSBvbmx5IGluY2x1ZGVzIGJhc2UgZmllbGRzIHdoZW4gbm8gcHJlcHJvY2Vzc2luZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRlTWFjaGluZXMgPSB0ZW1wbGF0ZVdpdGhvdXRQcmVwcm9jZXNzaW5nLmZpbmRSZXNvdXJjZXMoJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJyk7XG4gICAgICBjb25zdCBzdGF0ZU1hY2hpbmVLZXkgPSBPYmplY3Qua2V5cyhzdGF0ZU1hY2hpbmVzKVswXTtcbiAgICAgIGNvbnN0IGRlZmluaXRpb25TdHJpbmcgPSBzdGF0ZU1hY2hpbmVzW3N0YXRlTWFjaGluZUtleV0uUHJvcGVydGllcy5EZWZpbml0aW9uU3RyaW5nO1xuXG4gICAgICAvLyBQYXJzZSB0aGUgZGVmaW5pdGlvblxuICAgICAgY29uc3QgZGVmaW5pdGlvbiA9IEpTT04ucGFyc2UoZGVmaW5pdGlvblN0cmluZ1snRm46OkpvaW4nXVsxXS5qb2luKCcnKSk7XG5cbiAgICAgIC8vIEZpbmQgdGhlIEluaXRNZXRhZGF0YUVudHJ5IHN0YXRlIGJ5IG5hbWVcbiAgICAgIGNvbnN0IGluaXRNZXRhZGF0YVN0YXRlID0gZGVmaW5pdGlvbi5TdGF0ZXMuSW5pdE1ldGFkYXRhRW50cnk7XG5cbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZSkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5UeXBlKS50b0JlKCdUYXNrJyk7XG5cbiAgICAgIC8vIFZlcmlmeSBiYXNlIGZpZWxkcyBhcmUgcHJlc2VudFxuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5Eb2N1bWVudElkKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5Db250ZW50VHlwZSkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uQ29udGVudCkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uV29ya2Zsb3dTdGF0dXMpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLlN0YXRlTWFjaGluZUV4ZWNJZCkudG9CZURlZmluZWQoKTtcblxuICAgICAgLy8gVmVyaWZ5IE5PIGN1c3RvbSBmaWVsZHMgYXJlIHByZXNlbnQgKGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLkN1c3RvbUZpZWxkMSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5DdXN0b21GaWVsZDIpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uQ3VzdG9tRmllbGQzKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd3b3JrZmxvdyBzdGFydHMgd2l0aCBJbml0TWV0YWRhdGEgd2hlbiBubyBwcmVwcm9jZXNzaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdGVNYWNoaW5lcyA9IHRlbXBsYXRlV2l0aG91dFByZXByb2Nlc3NpbmcuZmluZFJlc291cmNlcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnKTtcbiAgICAgIGNvbnN0IHN0YXRlTWFjaGluZUtleSA9IE9iamVjdC5rZXlzKHN0YXRlTWFjaGluZXMpWzBdO1xuICAgICAgY29uc3QgZGVmaW5pdGlvblN0cmluZyA9IHN0YXRlTWFjaGluZXNbc3RhdGVNYWNoaW5lS2V5XS5Qcm9wZXJ0aWVzLkRlZmluaXRpb25TdHJpbmc7XG5cbiAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBKU09OLnBhcnNlKGRlZmluaXRpb25TdHJpbmdbJ0ZuOjpKb2luJ11bMV0uam9pbignJykpO1xuXG4gICAgICAvLyBTaG91bGQgc3RhcnQgd2l0aCBJbml0TWV0YWRhdGEgd2hlbiBubyBwcmVwcm9jZXNzaW5nXG4gICAgICBleHBlY3QoZGVmaW5pdGlvbi5TdGFydEF0KS50b01hdGNoKC9Jbml0TWV0YWRhdGEvKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ0R5bmFtb0RCIHRhYmxlIHNjaGVtYSByZW1haW5zIHVuY2hhbmdlZCcsICgpID0+IHtcbiAgICAgIC8vIFZlcmlmeSB0YWJsZSBpcyBjcmVhdGVkIHdpdGggc2FtZSBzY2hlbWEgYXMgYmVmb3JlXG4gICAgICB0ZW1wbGF0ZVdpdGhvdXRQcmVwcm9jZXNzaW5nLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpEeW5hbW9EQjo6VGFibGUnLCB7XG4gICAgICAgIEtleVNjaGVtYTogW3tcbiAgICAgICAgICBBdHRyaWJ1dGVOYW1lOiAnRG9jdW1lbnRJZCcsXG4gICAgICAgICAgS2V5VHlwZTogJ0hBU0gnLFxuICAgICAgICB9XSxcbiAgICAgICAgQmlsbGluZ01vZGU6ICdQQVlfUEVSX1JFUVVFU1QnLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTY2hlbWEgRXh0ZW5zaW9uIE1lY2hhbmlzbSAtIEdlbmVyaWMgcHJlcHJvY2Vzc2luZyBtZXRhZGF0YScsICgpID0+IHtcbiAgICB0ZXN0KCdwcmVwcm9jZXNzaW5nTWV0YWRhdGEoKSBob29rIGFsbG93cyBzdWJjbGFzc2VzIHRvIGV4dGVuZCBzY2hlbWEnLCAoKSA9PiB7XG4gICAgICAvLyBUaGUga2V5IGRlc2lnbiBwcmluY2lwbGU6IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHByZXByb2Nlc3NpbmdNZXRhZGF0YSgpXG4gICAgICAvLyB0byBhZGQgdGhlaXIgb3duIGZpZWxkcyB0byBJbml0TWV0YWRhdGEgd2l0aG91dCBiYXNlIGNsYXNzIGtub3dpbmcgdGhlIGRldGFpbHNcblxuICAgICAgLy8gVmVyaWZ5IHRoZSBjb25zdHJ1Y3Qgd2l0aCBjdXN0b20gbWV0YWRhdGEgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICBleHBlY3Qoc3RhY2tXaXRoQ3VzdG9tTWV0YWRhdGEpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICAgIC8vIFZlcmlmeSBpdCBoYXMgYSBzdGF0ZSBtYWNoaW5lXG4gICAgICB0ZW1wbGF0ZVdpdGhDdXN0b21NZXRhZGF0YS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJywgMSk7XG5cbiAgICAgIC8vIFZlcmlmeSBpdCBoYXMgdGhlIHNhbWUgRHluYW1vREIgdGFibGUgc3RydWN0dXJlIGFzIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uXG4gICAgICB0ZW1wbGF0ZVdpdGhDdXN0b21NZXRhZGF0YS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6RHluYW1vREI6OlRhYmxlJywge1xuICAgICAgICBLZXlTY2hlbWE6IFt7XG4gICAgICAgICAgQXR0cmlidXRlTmFtZTogJ0RvY3VtZW50SWQnLFxuICAgICAgICAgIEtleVR5cGU6ICdIQVNIJyxcbiAgICAgICAgfV0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3dvcmtmbG93IGluY2x1ZGVzIHByZXByb2Nlc3Npbmcgc3RlcCB3aGVuIHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdGVNYWNoaW5lcyA9IHRlbXBsYXRlV2l0aEN1c3RvbU1ldGFkYXRhLmZpbmRSZXNvdXJjZXMoJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJyk7XG4gICAgICBjb25zdCBzdGF0ZU1hY2hpbmVLZXkgPSBPYmplY3Qua2V5cyhzdGF0ZU1hY2hpbmVzKVswXTtcbiAgICAgIGNvbnN0IGRlZmluaXRpb25TdHJpbmcgPSBzdGF0ZU1hY2hpbmVzW3N0YXRlTWFjaGluZUtleV0uUHJvcGVydGllcy5EZWZpbml0aW9uU3RyaW5nO1xuXG4gICAgICBjb25zdCBkZWZpbml0aW9uID0gSlNPTi5wYXJzZShkZWZpbml0aW9uU3RyaW5nWydGbjo6Sm9pbiddWzFdLmpvaW4oJycpKTtcblxuICAgICAgLy8gVmVyaWZ5IEluaXRNZXRhZGF0YSBzdGVwIGV4aXN0cyAoY29yZSBmdW5jdGlvbmFsaXR5KVxuICAgICAgZXhwZWN0KGRlZmluaXRpb24uU3RhdGVzLkluaXRNZXRhZGF0YUVudHJ5KS50b0JlRGVmaW5lZCgpO1xuXG4gICAgICAvLyBXaGVuIHByZXByb2Nlc3NpbmcgaXMgcHJvdmlkZWQsIGl0IHNob3VsZCBiZSBpbiB0aGUgd29ya2Zsb3dcbiAgICAgIC8vIFRoZSBleGFjdCBzdHJ1Y3R1cmUgZGVwZW5kcyBvbiB0aGUgc3ViY2xhc3MgaW1wbGVtZW50YXRpb25cbiAgICAgIGV4cGVjdChkZWZpbml0aW9uLlN0YXRlcykudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChPYmplY3Qua2V5cyhkZWZpbml0aW9uLlN0YXRlcykubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdJbml0TWV0YWRhdGEgY2FuIGFjY2VwdCBhZGRpdGlvbmFsIGZpZWxkcyB2aWEgcHJlcHJvY2Vzc2luZ01ldGFkYXRhKCknLCAoKSA9PiB7XG4gICAgICBjb25zdCBzdGF0ZU1hY2hpbmVzID0gdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEuZmluZFJlc291cmNlcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnKTtcbiAgICAgIGNvbnN0IHN0YXRlTWFjaGluZUtleSA9IE9iamVjdC5rZXlzKHN0YXRlTWFjaGluZXMpWzBdO1xuICAgICAgY29uc3QgZGVmaW5pdGlvblN0cmluZyA9IHN0YXRlTWFjaGluZXNbc3RhdGVNYWNoaW5lS2V5XS5Qcm9wZXJ0aWVzLkRlZmluaXRpb25TdHJpbmc7XG5cbiAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBKU09OLnBhcnNlKGRlZmluaXRpb25TdHJpbmdbJ0ZuOjpKb2luJ11bMV0uam9pbignJykpO1xuXG4gICAgICBjb25zdCBpbml0TWV0YWRhdGFTdGF0ZSA9IGRlZmluaXRpb24uU3RhdGVzLkluaXRNZXRhZGF0YUVudHJ5O1xuXG4gICAgICAvLyBWZXJpZnkgYmFzZSBmaWVsZHMgYXJlIGFsd2F5cyBwcmVzZW50XG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLkRvY3VtZW50SWQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLkNvbnRlbnRUeXBlKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5Db250ZW50KS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5Xb3JrZmxvd1N0YXR1cykudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uU3RhdGVNYWNoaW5lRXhlY0lkKS50b0JlRGVmaW5lZCgpO1xuXG4gICAgICAvLyBUaGUgbWVjaGFuaXNtIGFsbG93cyBhZGRpbmcgY3VzdG9tIGZpZWxkcyAoaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIHN1YmNsYXNzKVxuICAgICAgLy8gRHluYW1vREIncyBzY2hlbWFsZXNzIG5hdHVyZSBtZWFucyBhbnkgZmllbGRzIGNhbiBiZSBhZGRlZCBhdCBydW50aW1lXG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTY2hlbWEgQ29tcGF0aWJpbGl0eScsICgpID0+IHtcbiAgICB0ZXN0KCdib3RoIGltcGxlbWVudGF0aW9ucyB1c2UgdGhlIHNhbWUgRHluYW1vREIgdGFibGUgc3RydWN0dXJlJywgKCkgPT4ge1xuICAgICAgLy8gQm90aCBzaG91bGQgY3JlYXRlIHRhYmxlcyB3aXRoIHNhbWUgcGFydGl0aW9uIGtleVxuICAgICAgdGVtcGxhdGVXaXRob3V0UHJlcHJvY2Vzc2luZy5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6RHluYW1vREI6OlRhYmxlJywge1xuICAgICAgICBLZXlTY2hlbWE6IFt7XG4gICAgICAgICAgQXR0cmlidXRlTmFtZTogJ0RvY3VtZW50SWQnLFxuICAgICAgICAgIEtleVR5cGU6ICdIQVNIJyxcbiAgICAgICAgfV0sXG4gICAgICB9KTtcblxuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgS2V5U2NoZW1hOiBbe1xuICAgICAgICAgIEF0dHJpYnV0ZU5hbWU6ICdEb2N1bWVudElkJyxcbiAgICAgICAgICBLZXlUeXBlOiAnSEFTSCcsXG4gICAgICAgIH1dLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdib3RoIGltcGxlbWVudGF0aW9ucyBjcmVhdGUgZW5jcnlwdGVkIHRhYmxlcycsICgpID0+IHtcbiAgICAgIHRlbXBsYXRlV2l0aG91dFByZXByb2Nlc3NpbmcuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgU1NFU3BlY2lmaWNhdGlvbjoge1xuICAgICAgICAgIFNTRUVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgU1NFVHlwZTogJ0tNUycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgU1NFU3BlY2lmaWNhdGlvbjoge1xuICAgICAgICAgIFNTRUVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgU1NFVHlwZTogJ0tNUycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2JvdGggaW1wbGVtZW50YXRpb25zIHVzZSBQQVlfUEVSX1JFUVVFU1QgYmlsbGluZycsICgpID0+IHtcbiAgICAgIHRlbXBsYXRlV2l0aG91dFByZXByb2Nlc3NpbmcuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgQmlsbGluZ01vZGU6ICdQQVlfUEVSX1JFUVVFU1QnLFxuICAgICAgfSk7XG5cbiAgICAgIHRlbXBsYXRlV2l0aEN1c3RvbU1ldGFkYXRhLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpEeW5hbW9EQjo6VGFibGUnLCB7XG4gICAgICAgIEJpbGxpbmdNb2RlOiAnUEFZX1BFUl9SRVFVRVNUJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRGVzaWduIFByaW5jaXBsZTogQmFzZSBjbGFzcyBoYXMgbm8ga25vd2xlZGdlIG9mIHByZXByb2Nlc3Npbmcgc3BlY2lmaWNzJywgKCkgPT4ge1xuICAgIHRlc3QoJ2Jhc2UgY2xhc3MgcHJvdmlkZXMgZ2VuZXJpYyBleHRlbnNpb24gbWVjaGFuaXNtIHZpYSBwcmVwcm9jZXNzaW5nTWV0YWRhdGEoKScsICgpID0+IHtcbiAgICAgIC8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGUgZGVzaWduIHByaW5jaXBsZTpcbiAgICAgIC8vIC0gQmFzZSBjbGFzcyBkb2Vzbid0IGtub3cgYWJvdXQgY2h1bmtpbmcsIHZhbGlkYXRpb24sIG9yIGFueSBzcGVjaWZpYyBwcmVwcm9jZXNzaW5nXG4gICAgICAvLyAtIEJhc2UgY2xhc3Mgb25seSBwcm92aWRlcyBhIGhvb2sgKHByZXByb2Nlc3NpbmdNZXRhZGF0YSkgZm9yIHN1YmNsYXNzZXMgdG8gZXh0ZW5kXG4gICAgICAvLyAtIFN1YmNsYXNzZXMgYXJlIHJlc3BvbnNpYmxlIGZvciB0aGVpciBvd24gbWV0YWRhdGEgZmllbGRzXG5cbiAgICAgIC8vIFZlcmlmeSB0aGF0IHdpdGhvdXQgb3ZlcnJpZGluZyBwcmVwcm9jZXNzaW5nTWV0YWRhdGEoKSwgd29ya2Zsb3cgd29ya3MgY29ycmVjdGx5XG4gICAgICBjb25zdCBzdGF0ZU1hY2hpbmVzID0gdGVtcGxhdGVXaXRob3V0UHJlcHJvY2Vzc2luZy5maW5kUmVzb3VyY2VzKCdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZScpO1xuICAgICAgY29uc3Qgc3RhdGVNYWNoaW5lS2V5ID0gT2JqZWN0LmtleXMoc3RhdGVNYWNoaW5lcylbMF07XG4gICAgICBjb25zdCBkZWZpbml0aW9uU3RyaW5nID0gc3RhdGVNYWNoaW5lc1tzdGF0ZU1hY2hpbmVLZXldLlByb3BlcnRpZXMuRGVmaW5pdGlvblN0cmluZztcbiAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBKU09OLnBhcnNlKGRlZmluaXRpb25TdHJpbmdbJ0ZuOjpKb2luJ11bMV0uam9pbignJykpO1xuXG4gICAgICBjb25zdCBpbml0TWV0YWRhdGFTdGF0ZSA9IGRlZmluaXRpb24uU3RhdGVzLkluaXRNZXRhZGF0YUVudHJ5O1xuXG4gICAgICAvLyBCYXNlIGZpZWxkcyBhcmUgYWx3YXlzIHByZXNlbnRcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uRG9jdW1lbnRJZCkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChpbml0TWV0YWRhdGFTdGF0ZS5QYXJhbWV0ZXJzLkl0ZW0uQ29udGVudFR5cGUpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLkNvbnRlbnQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoaW5pdE1ldGFkYXRhU3RhdGUuUGFyYW1ldGVycy5JdGVtLldvcmtmbG93U3RhdHVzKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGluaXRNZXRhZGF0YVN0YXRlLlBhcmFtZXRlcnMuSXRlbS5TdGF0ZU1hY2hpbmVFeGVjSWQpLnRvQmVEZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdzdWJjbGFzc2VzIGNhbiBleHRlbmQgdmlhIHByZXByb2Nlc3NpbmdNZXRhZGF0YSgpIHdpdGhvdXQgYnJlYWtpbmcgYmFzZSBmdW5jdGlvbmFsaXR5JywgKCkgPT4ge1xuICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvbnN0cnVjdCB3aXRoIGN1c3RvbSBtZXRhZGF0YSBzdGlsbCBoYXMgYWxsIGJhc2UgZnVuY3Rpb25hbGl0eVxuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEucmVzb3VyY2VDb3VudElzKCdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZScsIDEpO1xuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEucmVzb3VyY2VDb3VudElzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIDEpO1xuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEucmVzb3VyY2VDb3VudElzKCdBV1M6OlMzOjpCdWNrZXQnLCAxKTtcblxuICAgICAgLy8gVmVyaWZ5IHN0YXRlIG1hY2hpbmUgaGFzIHRoZSBzYW1lIGJhc2Ugc3RydWN0dXJlXG4gICAgICBjb25zdCBzdGF0ZU1hY2hpbmVzID0gdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEuZmluZFJlc291cmNlcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnKTtcbiAgICAgIGNvbnN0IHN0YXRlTWFjaGluZUtleSA9IE9iamVjdC5rZXlzKHN0YXRlTWFjaGluZXMpWzBdO1xuICAgICAgY29uc3QgZGVmaW5pdGlvblN0cmluZyA9IHN0YXRlTWFjaGluZXNbc3RhdGVNYWNoaW5lS2V5XS5Qcm9wZXJ0aWVzLkRlZmluaXRpb25TdHJpbmc7XG4gICAgICBjb25zdCBkZWZpbml0aW9uID0gSlNPTi5wYXJzZShkZWZpbml0aW9uU3RyaW5nWydGbjo6Sm9pbiddWzFdLmpvaW4oJycpKTtcblxuICAgICAgLy8gQ29yZSBzdGF0ZXMgc2hvdWxkIGV4aXN0XG4gICAgICBleHBlY3QoZGVmaW5pdGlvbi5TdGF0ZXMuSW5pdE1ldGFkYXRhRW50cnkpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoZGVmaW5pdGlvbi5TdGF0ZXMuTW9ja0NsYXNzaWZpY2F0aW9uKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGRlZmluaXRpb24uU3RhdGVzLk1vY2tQcm9jZXNzaW5nKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRHluYW1vREIgc2NoZW1hbGVzcyBuYXR1cmUgc3VwcG9ydHMgcnVudGltZSBmaWVsZCBhZGRpdGlvbicsICgpID0+IHtcbiAgICB0ZXN0KCdEeW5hbW9EQiB0YWJsZSBzdXBwb3J0cyBhbnkgYWRkaXRpb25hbCBmaWVsZHMgYXQgcnVudGltZScsICgpID0+IHtcbiAgICAgIC8vIER5bmFtb0RCIGlzIHNjaGVtYWxlc3MsIHNvIGFueSBmaWVsZHMgY2FuIGJlIGFkZGVkIGF0IHJ1bnRpbWVcbiAgICAgIC8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGUgdGFibGUgaXMgY3JlYXRlZCBjb3JyZWN0bHkgYW5kIGNhbiBhY2NlcHQgYW55IGF0dHJpYnV0ZXNcblxuICAgICAgdGVtcGxhdGVXaXRoQ3VzdG9tTWV0YWRhdGEuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgS2V5U2NoZW1hOiBbe1xuICAgICAgICAgIEF0dHJpYnV0ZU5hbWU6ICdEb2N1bWVudElkJyxcbiAgICAgICAgICBLZXlUeXBlOiAnSEFTSCcsXG4gICAgICAgIH1dLFxuICAgICAgICBCaWxsaW5nTW9kZTogJ1BBWV9QRVJfUkVRVUVTVCcsXG4gICAgICB9KTtcblxuICAgICAgLy8gTm8gYXR0cmlidXRlIGRlZmluaXRpb25zIG5lZWRlZCBmb3Igbm9uLWtleSBhdHRyaWJ1dGVzIGluIER5bmFtb0RCXG4gICAgICAvLyBGaWVsZHMgbGlrZSBBZ2dyZWdhdGVkUmVzdWx0IGNhbiBiZSBhZGRlZCB2aWEgRHluYW1vVXBkYXRlSXRlbSBkdXJpbmcgcHJvY2Vzc2luZ1xuICAgIH0pO1xuXG4gICAgdGVzdCgnc3RhdGUgbWFjaGluZSBoYXMgcGVybWlzc2lvbnMgdG8gdXBkYXRlIER5bmFtb0RCIGl0ZW1zJywgKCkgPT4ge1xuICAgICAgLy8gVmVyaWZ5IHRoZSBzdGF0ZSBtYWNoaW5lIHJvbGUgaGFzIFVwZGF0ZUl0ZW0gcGVybWlzc2lvbnNcbiAgICAgIC8vIFRoaXMgYWxsb3dzIGFkZGluZyBmaWVsZHMgbGlrZSBBZ2dyZWdhdGVkUmVzdWx0IGR1cmluZyBwcm9jZXNzaW5nXG4gICAgICBjb25zdCBwb2xpY2llcyA9IHRlbXBsYXRlV2l0aEN1c3RvbU1ldGFkYXRhLmZpbmRSZXNvdXJjZXMoJ0FXUzo6SUFNOjpQb2xpY3knKTtcblxuICAgICAgLy8gRmluZCB0aGUgc3RhdGUgbWFjaGluZSByb2xlIHBvbGljeVxuICAgICAgY29uc3Qgc3RhdGVNYWNoaW5lUG9saWN5ID0gT2JqZWN0LnZhbHVlcyhwb2xpY2llcykuZmluZCgocG9saWN5OiBhbnkpID0+XG4gICAgICAgIHBvbGljeS5Qcm9wZXJ0aWVzLlBvbGljeU5hbWUuaW5jbHVkZXMoJ1N0YXRlTWFjaGluZVJvbGUnKSxcbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChzdGF0ZU1hY2hpbmVQb2xpY3kpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICAgIC8vIENoZWNrIHRoYXQgaXQgaGFzIER5bmFtb0RCIFVwZGF0ZUl0ZW0gcGVybWlzc2lvbnNcbiAgICAgIGNvbnN0IHN0YXRlbWVudHMgPSAoc3RhdGVNYWNoaW5lUG9saWN5IGFzIGFueSkuUHJvcGVydGllcy5Qb2xpY3lEb2N1bWVudC5TdGF0ZW1lbnQ7XG4gICAgICBjb25zdCBkeW5hbW9TdGF0ZW1lbnQgPSBzdGF0ZW1lbnRzLmZpbmQoKHN0bXQ6IGFueSkgPT5cbiAgICAgICAgc3RtdC5BY3Rpb24gJiYgKFxuICAgICAgICAgIChBcnJheS5pc0FycmF5KHN0bXQuQWN0aW9uKSAmJiBzdG10LkFjdGlvbi5pbmNsdWRlcygnZHluYW1vZGI6VXBkYXRlSXRlbScpKSB8fFxuICAgICAgICAgIHN0bXQuQWN0aW9uID09PSAnZHluYW1vZGI6VXBkYXRlSXRlbSdcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChkeW5hbW9TdGF0ZW1lbnQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoZHluYW1vU3RhdGVtZW50LkVmZmVjdCkudG9CZSgnQWxsb3cnKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|