@ng-formworks/core 17.6.5 → 17.6.7
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/esm2022/lib/json-schema-form.component.mjs +1 -1
- package/esm2022/lib/json-schema-form.service.mjs +25 -17
- package/esm2022/lib/shared/form-group.functions.mjs +52 -3
- package/esm2022/lib/shared/layout.functions.mjs +32 -9
- package/esm2022/lib/widget-library/add-reference.component.mjs +13 -6
- package/esm2022/lib/widget-library/button.component.mjs +9 -4
- package/esm2022/lib/widget-library/checkbox.component.mjs +2 -1
- package/esm2022/lib/widget-library/index.mjs +2 -1
- package/esm2022/lib/widget-library/input.component.mjs +9 -4
- package/esm2022/lib/widget-library/number.component.mjs +9 -6
- package/esm2022/lib/widget-library/root.component.mjs +167 -124
- package/esm2022/lib/widget-library/section.component.mjs +2 -2
- package/esm2022/lib/widget-library/select-framework.component.mjs +9 -5
- package/esm2022/lib/widget-library/select-widget.component.mjs +5 -4
- package/esm2022/lib/widget-library/stop-propagation.directive.mjs +42 -0
- package/esm2022/lib/widget-library/submit.component.mjs +9 -4
- package/esm2022/lib/widget-library/tab.component.mjs +1 -1
- package/esm2022/lib/widget-library/widget-library.module.mjs +9 -32
- package/fesm2022/ng-formworks-core.mjs +500 -334
- package/fesm2022/ng-formworks-core.mjs.map +1 -1
- package/lib/json-schema-form.service.d.ts +0 -3
- package/lib/widget-library/index.d.ts +1 -0
- package/lib/widget-library/root.component.d.ts +25 -7
- package/lib/widget-library/select-framework.component.d.ts +2 -1
- package/lib/widget-library/select-widget.component.d.ts +2 -2
- package/lib/widget-library/stop-propagation.directive.d.ts +13 -0
- package/lib/widget-library/widget-library.module.d.ts +5 -4
- package/package.json +3 -4
|
@@ -304,14 +304,24 @@ export function buildFormGroupTemplate(jsf, nodeValue = null, setValues = true,
|
|
|
304
304
|
const schemaRefPointer = removeRecursiveReferences(schemaPointer + '/items/' + i, jsf.schemaRecursiveRefMap);
|
|
305
305
|
const itemRefPointer = removeRecursiveReferences(shortDataPointer + '/' + i, jsf.dataRecursiveRefMap, jsf.arrayMap);
|
|
306
306
|
const itemRecursive = itemRefPointer !== shortDataPointer + '/' + i;
|
|
307
|
+
//if is in templateLibrary then need to check if its a conditional
|
|
308
|
+
//and conditional pointers match orthewise create a new ref
|
|
309
|
+
let conditionalRefPointer = `${itemRefPointer}@${schemaPointer}`;
|
|
310
|
+
let templateRefToUse = itemRefPointer;
|
|
311
|
+
if (hasOwn(jsf.templateRefLibrary, itemRefPointer)
|
|
312
|
+
&& !hasOwn(jsf.templateRefLibrary, conditionalRefPointer)) {
|
|
313
|
+
jsf.templateRefLibrary[conditionalRefPointer] = buildFormGroupTemplate(jsf, null, setValues, schemaRefPointer, itemRefPointer, templatePointer + '/controls/' + i);
|
|
314
|
+
templateRefToUse = conditionalRefPointer;
|
|
315
|
+
}
|
|
307
316
|
if (!hasOwn(jsf.templateRefLibrary, itemRefPointer)) {
|
|
308
317
|
jsf.templateRefLibrary[itemRefPointer] = null;
|
|
309
318
|
jsf.templateRefLibrary[itemRefPointer] = buildFormGroupTemplate(jsf, null, setValues, schemaRefPointer, itemRefPointer, templatePointer + '/controls/' + i);
|
|
319
|
+
jsf.templateRefLibrary[conditionalRefPointer] = jsf.templateRefLibrary[itemRefPointer];
|
|
310
320
|
}
|
|
311
321
|
controls.push(isArray(nodeValue) ?
|
|
312
322
|
buildFormGroupTemplate(jsf, nodeValue[i], setValues, schemaPointer + '/items/' + i, dataPointer + '/' + i, templatePointer + '/controls/' + i) :
|
|
313
323
|
itemRecursive ?
|
|
314
|
-
null : cloneDeep(jsf.templateRefLibrary[
|
|
324
|
+
null : cloneDeep(jsf.templateRefLibrary[templateRefToUse]));
|
|
315
325
|
}
|
|
316
326
|
}
|
|
317
327
|
// If 'additionalItems' is an object = additional list items (after tuple items)
|
|
@@ -327,9 +337,19 @@ export function buildFormGroupTemplate(jsf, nodeValue = null, setValues = true,
|
|
|
327
337
|
const schemaRefPointer = removeRecursiveReferences(additionalItemsPointer, jsf.schemaRecursiveRefMap);
|
|
328
338
|
const itemRefPointer = removeRecursiveReferences(shortDataPointer + '/-', jsf.dataRecursiveRefMap, jsf.arrayMap);
|
|
329
339
|
const itemRecursive = itemRefPointer !== shortDataPointer + '/-';
|
|
340
|
+
//if is in templateLibrary then need to check if its a conditional
|
|
341
|
+
//and conditional pointers match orthewise create a new ref
|
|
342
|
+
let conditionalRefPointer = `${itemRefPointer}@${schemaPointer}`;
|
|
343
|
+
let templateRefToUse = itemRefPointer;
|
|
344
|
+
if (hasOwn(jsf.templateRefLibrary, itemRefPointer)
|
|
345
|
+
&& !hasOwn(jsf.templateRefLibrary, conditionalRefPointer)) {
|
|
346
|
+
jsf.templateRefLibrary[conditionalRefPointer] = buildFormGroupTemplate(jsf, null, setValues, schemaRefPointer, itemRefPointer, templatePointer + '/controls/-');
|
|
347
|
+
templateRefToUse = conditionalRefPointer;
|
|
348
|
+
}
|
|
330
349
|
if (!hasOwn(jsf.templateRefLibrary, itemRefPointer)) {
|
|
331
350
|
jsf.templateRefLibrary[itemRefPointer] = null;
|
|
332
351
|
jsf.templateRefLibrary[itemRefPointer] = buildFormGroupTemplate(jsf, null, setValues, schemaRefPointer, itemRefPointer, templatePointer + '/controls/-');
|
|
352
|
+
jsf.templateRefLibrary[conditionalRefPointer] = jsf.templateRefLibrary[itemRefPointer];
|
|
333
353
|
}
|
|
334
354
|
// const itemOptions = jsf.dataMap.get(itemRefPointer) || new Map();
|
|
335
355
|
const itemOptions = nodeOptions;
|
|
@@ -340,7 +360,7 @@ export function buildFormGroupTemplate(jsf, nodeValue = null, setValues = true,
|
|
|
340
360
|
controls.push(isArray(nodeValue) ?
|
|
341
361
|
buildFormGroupTemplate(jsf, nodeValue[i], setValues, schemaRefPointer, dataPointer + '/-', templatePointer + '/controls/-') :
|
|
342
362
|
itemRecursive ?
|
|
343
|
-
null : cloneDeep(jsf.templateRefLibrary[
|
|
363
|
+
null : cloneDeep(jsf.templateRefLibrary[templateRefToUse]));
|
|
344
364
|
}
|
|
345
365
|
}
|
|
346
366
|
}
|
|
@@ -659,6 +679,35 @@ export function getControl(formGroup, dataPointer, returnGroup = false, schemaPo
|
|
|
659
679
|
// or formGroup.get() failed to return the control,
|
|
660
680
|
// search the formGroup object for dataPointer's control
|
|
661
681
|
let subGroup = formGroup;
|
|
682
|
+
//if schemapointer provided but no control matched
|
|
683
|
+
//it could mean the schema pointer is a nested child
|
|
684
|
+
//for example this could be in form group
|
|
685
|
+
//formGroup.controls.$allOf$0$then$properties$foo
|
|
686
|
+
//but schemapointer provided is '/allOf/0/then/properties/foo/items/properties/name'
|
|
687
|
+
//and dataPointer is '/foo/0/name'
|
|
688
|
+
//then need to look in formGroup.controls.$allOf$0$then$properties$foo
|
|
689
|
+
//for control path /0/name
|
|
690
|
+
if (schemaPointer) {
|
|
691
|
+
let controlPointer = JsonPointer.toControlPointer(dataPointer, {});
|
|
692
|
+
let schemaPointerArray = schemaPointer.split('/');
|
|
693
|
+
let controlPointerArray = JsonPointer.parse(dataPointer);
|
|
694
|
+
//controlPointer.split('/').splice(1);
|
|
695
|
+
let currSPAKey;
|
|
696
|
+
let spFormGroup;
|
|
697
|
+
while (schemaPointerArray.length > 0) {
|
|
698
|
+
currSPAKey = schemaPointerArray.pop();
|
|
699
|
+
let ckey = path2ControlKey(schemaPointerArray.join("/"));
|
|
700
|
+
spFormGroup = formGroup.get(ckey);
|
|
701
|
+
if (controlPointerArray[0] == schemaPointerArray[schemaPointerArray.length - 1]) {
|
|
702
|
+
controlPointerArray.shift();
|
|
703
|
+
}
|
|
704
|
+
if (spFormGroup) {
|
|
705
|
+
break;
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
subGroup = spFormGroup || subGroup;
|
|
709
|
+
dataPointerArray = spFormGroup ? controlPointerArray : dataPointerArray;
|
|
710
|
+
}
|
|
662
711
|
for (const key of dataPointerArray) {
|
|
663
712
|
if (hasOwn(subGroup, 'controls')) {
|
|
664
713
|
subGroup = subGroup.controls;
|
|
@@ -744,4 +793,4 @@ export function setControl(formGroup, dataPointer, control, targetKey) {
|
|
|
744
793
|
return subGroup;
|
|
745
794
|
*/
|
|
746
795
|
}
|
|
747
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1ncm91cC5mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1mb3Jtd29ya3MtY29yZS9zcmMvbGliL3NoYXJlZC9mb3JtLWdyb3VwLmZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFFakIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLFNBQVMsTUFBTSxrQkFBa0IsQ0FBQztBQUN6QyxPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzFGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFXLE1BQU0seUJBQXlCLENBQUM7QUFDL0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBRUwsUUFBUSxFQUNSLE9BQU8sRUFDUCxPQUFPLEVBQ1AsTUFBTSxFQUNOLFNBQVMsRUFDVCxPQUFPLEVBQ1AsUUFBUSxFQUNSLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsWUFBWSxFQUNiLE1BQU0sdUJBQXVCLENBQUM7QUFFL0I7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBWTtJQUMxQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFBO0FBQ2pDLENBQUM7QUFHRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUg7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxHQUFRLEVBQUUsWUFBaUIsSUFBSSxFQUFFLFNBQVMsR0FBRyxJQUFJLEVBQ2pELGFBQWEsR0FBRyxFQUFFLEVBQUUsV0FBVyxHQUFHLEVBQUUsRUFBRSxlQUFlLEdBQUcsRUFBRTtJQUUxRCxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDMUQsSUFBSSxTQUFTLEVBQUU7UUFDYixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQzNCLEdBQUcsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEtBQUssSUFBSTtZQUMxQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEtBQUssTUFBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FDMUUsRUFBRTtZQUNELFNBQVMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsYUFBYSxHQUFHLFVBQVUsQ0FBQyxDQUFDO1NBQ3JFO0tBQ0Y7U0FBTTtRQUNMLFNBQVMsR0FBRyxJQUFJLENBQUM7S0FDbEI7SUFDRCxtRUFBbUU7SUFDbkUsTUFBTSxVQUFVLEdBQXNCLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzlGLE1BQU0sV0FBVyxHQUFHLFlBQVksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUQsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsc0JBQXNCLENBQUMsQ0FFdEU7WUFDQyxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN2QyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2dCQUM1RCxVQUFVLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDdEMsQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7SUFDckUsTUFBTSxnQkFBZ0IsR0FDcEIseUJBQXlCLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUU7UUFDdEMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0tBQzlDO0lBQ0QsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN0RCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRTtRQUNsQyxXQUFXLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNoRCxXQUFXLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQ2pCLFdBQVcsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRTtnQkFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQzthQUFFO1NBQy9EO1FBQ0QsSUFBSSxXQUFXLEVBQUU7WUFDZixXQUFXLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQ3BELFdBQVcsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1NBQzlDO0tBQ0Y7SUFDRCxJQUFJLFFBQWEsQ0FBQztJQUNsQixNQUFNLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoRCxRQUFRLFdBQVcsRUFBRTtRQUVuQixLQUFLLFdBQVc7WUFDZCxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ2QsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLEVBQUU7Z0JBQzlELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDMUUsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLEVBQUU7b0JBQ2pFLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQzt5QkFDL0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQzlDLEtBQUssSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDakQsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFOzRCQUMzQixZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxXQUFXLENBQUMsQ0FBQzt5QkFDM0M7cUJBQ0Y7aUJBQ0Y7Z0JBQ0QsWUFBWTtxQkFDVCxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUM7b0JBQzNDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsc0JBQXNCLENBQUMsQ0FDdkM7cUJBQ0EsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUNYLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxzQkFBc0IsQ0FDdEMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQ3pELGFBQWEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBQy9DLGNBQWMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUMvQyxFQUNELFdBQVcsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUN2QixlQUFlLEdBQUcsWUFBWSxHQUFHLEdBQUcsQ0FDckMsQ0FBQztvQkFDRixxQ0FBcUM7b0JBQ3JDLDhEQUE4RDtvQkFDOUQsc0JBQXNCO29CQUN0QixDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO3dCQUMxQyxJQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDLEVBQUM7NEJBQ2hFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFBLEVBQUU7Z0NBQzlELFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQ0FDMUQsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUN0QyxDQUFDLENBQUMsQ0FBQTs0QkFDRixPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQyxDQUFBO3lCQUM1QztvQkFDSCxDQUFDLENBQUMsQ0FBQTtnQkFDSixDQUFDLENBQ0YsQ0FBQztnQkFFRixJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUU7b0JBQ3hCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTt3QkFDN0IsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFOzRCQUN2QixNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7NEJBRW5DLElBQUksY0FBYyxHQUFHLHNCQUFzQixDQUN6QyxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBQyxrRUFBa0U7NEJBQzVGLGFBQWEsR0FBRyxnQkFBZ0IsRUFDaEMsV0FBVyxFQUNYLGVBQWUsR0FBRyxhQUFhLEdBQUcsRUFBRSxDQUNyQyxDQUFDOzRCQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQzt5QkFDbEQ7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7Z0JBRUs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztZQTZDSjtnQkFHRixJQUFJLGFBQWEsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3JHLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7b0JBQzFDLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUU7d0JBQ3JELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUU7NEJBQ3JDLElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7NEJBQ3JDLElBQUksU0FBUyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDM0MsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FDM0IsQ0FBQzs0QkFDRixJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQ0FDckMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztnQ0FDN0MsMkNBQTJDO2dDQUMzQyxJQUFJLFlBQVksR0FBQyxTQUFTLENBQUM7Z0NBQzNCLDBDQUEwQztnQ0FDMUMsK0NBQStDO2dDQUMvQyxJQUFHLE1BQU0sSUFBRSxPQUFPLEVBQUM7b0NBQ2pCLFlBQVksR0FBQyxTQUFTLENBQUM7aUNBQ3hCO2dDQUNELElBQUksZUFBZSxHQUFHLHNCQUFzQixDQUMxQyxHQUFHLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFDNUIsYUFBYSxHQUFHLGdCQUFnQixFQUNoQyxXQUFXLEVBQ1gsZUFBZSxHQUFHLFlBQVksR0FBRyxHQUFHLENBQ3JDLENBQUM7Z0NBQ0YsSUFBSSxlQUFlLENBQUMsUUFBUSxFQUFFO29DQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7d0NBQ2xELE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQzs0Q0FDckQsY0FBYyxHQUFFLEdBQUcsQ0FBQSxDQUFDLENBQUEsR0FBRyxDQUFDO3dDQUN4QixJQUFJLFVBQVUsR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsSUFBSSxHQUFHLGFBQWEsR0FBRyxnQkFBZ0IsR0FBRyxlQUFlLEVBQUUsQ0FBQzt3Q0FDeEgsVUFBVSxHQUFHLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQzt3Q0FDekM7Ozs7OzswQ0FNRTt3Q0FFRixJQUFJLFdBQVcsR0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO3dDQUN6RCxXQUFXLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQzt3Q0FDdEIsV0FBVyxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUMsYUFBYSxJQUFHLEdBQUcsYUFBYSxHQUFHLGdCQUFnQixHQUFHLGVBQWUsRUFBRSxDQUFDO3dDQUVoSCxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUMsV0FBVyxDQUFBO3dDQUNoQyx1Q0FBdUM7d0NBQ3ZDLDJEQUEyRDt3Q0FDM0QseUVBQXlFO3dDQUN6RSxzREFBc0Q7d0NBQ3RELE1BQU0sV0FBVyxHQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUEsQ0FBQyxDQUFBLFdBQVcsQ0FBQyxhQUFhLENBQUEsQ0FBQyxDQUFBLGdCQUFnQixDQUFBO3dDQUNyRixJQUFJLGVBQWUsR0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO3dDQUMxRSxzQ0FBc0M7d0NBQ3RDLElBQUksUUFBUSxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLG9DQUFvQyxFQUFFLEVBQUUsQ0FBQzs2Q0FDekYsT0FBTyxDQUFDLDhCQUE4QixFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUMsS0FBSyxDQUFDLENBQUM7d0NBQ3pFLFFBQVEsR0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFFLENBQUM7NENBQ3pDLENBQUMsQ0FBQSxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQSxDQUFDLENBQUEsUUFBUSxDQUFDO3dDQUNqRCxvRUFBb0U7d0NBQ3BFLCtFQUErRTt3Q0FDL0UsNkVBQTZFO3dDQUM3RSxrRUFBa0U7d0NBQ2xFLGlFQUFpRTt3Q0FDakUsSUFBSSxJQUFJLEdBQUMsMkNBQTJDO3lDQUNwRCxXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBQyxRQUFRLENBQUMsQ0FBQzt3Q0FDcEMsSUFBSSxJQUFJLEdBQUMsR0FBRyxDQUFDO3dDQUNiLElBQUksY0FBYyxHQUFDLElBQUksQ0FBQzt3Q0FDeEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs0Q0F3Qkk7d0NBQ0osSUFBRyxNQUFNLENBQUMsV0FBVyxFQUFDLE9BQU8sQ0FBQyxFQUFDOzRDQUM3QixJQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFDLGNBQWMsQ0FBQyxFQUFDO2dEQUNuRCxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBQyxJQUFJLENBQUM7NkNBQzlCO2lEQUFJO2dEQUNILGdEQUFnRDtnREFDaEQsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQSxDQUFDLENBQUEsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFBLENBQUMsQ0FBQSxjQUFjLENBQUM7NkNBQ3hGO3lDQUNGO3dDQUVELHFDQUFxQzt3Q0FFckMsNkZBQTZGO3dDQUM3RixrRkFBa0Y7d0NBRWxGLGdFQUFnRTt3Q0FDaEUsNEJBQTRCO3dDQUM1QixrQ0FBa0M7d0NBQ2xDLFFBQVEsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDLEdBQUMsUUFBUSxDQUFDLElBQUksTUFBTSxFQUFFLENBQUMsSUFBRSxFQUFFLENBQUM7d0NBQ2xELFFBQVEsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUMsV0FBVyxDQUFBO3dDQUM5QyxnQ0FBZ0M7b0NBQ2xDLENBQUMsQ0FBQyxDQUFBO2lDQUNIOzZCQUVGO3dCQUVILENBQUMsQ0FBQyxDQUFBO3FCQUNIO2dCQUNILENBQUMsQ0FBQyxDQUFBO2dCQUlGLEdBQUcsQ0FBQyxXQUFXLENBQUMsY0FBYyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQzthQUN0RTtZQUNELE9BQU8sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBQyxhQUFhLEVBQUUsQ0FBQztRQUU3RCxLQUFLLFdBQVc7WUFDZCxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ2QsTUFBTSxRQUFRLEdBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ25FLE1BQU0sUUFBUSxHQUNaLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztZQUN6RSxJQUFJLHNCQUFzQixHQUFXLElBQUksQ0FBQztZQUMxQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxvQ0FBb0M7Z0JBQy9ELE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO29CQUM5QyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUNuQyxJQUFJLENBQUMsR0FBRyxRQUFRLEVBQUU7d0JBQ2hCLFFBQVEsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQ2xDLEdBQUcsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFDN0QsYUFBYSxHQUFHLFNBQVMsR0FBRyxDQUFDLEVBQzdCLFdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUNyQixlQUFlLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FDbkMsQ0FBQyxDQUFDO3FCQUNKO3lCQUFNO3dCQUNMLE1BQU0sZ0JBQWdCLEdBQUcseUJBQXlCLENBQ2hELGFBQWEsR0FBRyxTQUFTLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxxQkFBcUIsQ0FDekQsQ0FBQzt3QkFDRixNQUFNLGNBQWMsR0FBRyx5QkFBeUIsQ0FDOUMsZ0JBQWdCLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FDbEUsQ0FBQzt3QkFDRixNQUFNLGFBQWEsR0FBRyxjQUFjLEtBQUssZ0JBQWdCLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQzt3QkFDcEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxDQUFDLEVBQUU7NEJBQ25ELEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsR0FBRyxJQUFJLENBQUM7NEJBQzlDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsR0FBRyxzQkFBc0IsQ0FDN0QsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQ3BCLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsZUFBZSxHQUFHLFlBQVksR0FBRyxDQUFDLENBQ25DLENBQUM7eUJBQ0g7d0JBQ0QsUUFBUSxDQUFDLElBQUksQ0FDWCxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzs0QkFDbEIsc0JBQXNCLENBQ3BCLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUM1QixhQUFhLEdBQUcsU0FBUyxHQUFHLENBQUMsRUFDN0IsV0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQ3JCLGVBQWUsR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUNuQyxDQUFDLENBQUM7NEJBQ0gsYUFBYSxDQUFDLENBQUM7Z0NBQ2IsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQzdELENBQUM7cUJBQ0g7aUJBQ0Y7Z0JBRUQsZ0ZBQWdGO2dCQUNoRixJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUFFO29CQUN0RSxzQkFBc0IsR0FBRyxhQUFhLEdBQUcsa0JBQWtCLENBQUM7aUJBQzdEO2dCQUVELDZEQUE2RDthQUM5RDtpQkFBTTtnQkFDTCxzQkFBc0IsR0FBRyxhQUFhLEdBQUcsUUFBUSxDQUFDO2FBQ25EO1lBRUQsSUFBSSxzQkFBc0IsRUFBRTtnQkFDMUIsTUFBTSxnQkFBZ0IsR0FBRyx5QkFBeUIsQ0FDaEQsc0JBQXNCLEVBQUUsR0FBRyxDQUFDLHFCQUFxQixDQUNsRCxDQUFDO2dCQUNGLE1BQU0sY0FBYyxHQUFHLHlCQUF5QixDQUM5QyxnQkFBZ0IsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQy9ELENBQUM7Z0JBQ0YsTUFBTSxhQUFhLEdBQUcsY0FBYyxLQUFLLGdCQUFnQixHQUFHLElBQUksQ0FBQztnQkFDakUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxDQUFDLEVBQUU7b0JBQ25ELEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsR0FBRyxJQUFJLENBQUM7b0JBQzlDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsR0FBRyxzQkFBc0IsQ0FDN0QsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQ3BCLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsZUFBZSxHQUFHLGFBQWEsQ0FDaEMsQ0FBQztpQkFDSDtnQkFDRCxvRUFBb0U7Z0JBQ3BFLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLGFBQWEsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxFQUFFO29CQUNwRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ25DLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ2pCLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUNyRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDMUMsRUFBRSxRQUFRLENBQUMsQ0FBQztvQkFDYixLQUFLLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDbEQsUUFBUSxDQUFDLElBQUksQ0FDWCxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzs0QkFDbEIsc0JBQXNCLENBQ3BCLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUM1QixnQkFBZ0IsRUFDaEIsV0FBVyxHQUFHLElBQUksRUFDbEIsZUFBZSxHQUFHLGFBQWEsQ0FDaEMsQ0FBQyxDQUFDOzRCQUNILGFBQWEsQ0FBQyxDQUFDO2dDQUNiLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUM3RCxDQUFDO3FCQUNIO2lCQUNGO2FBQ0Y7WUFDRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUMsYUFBYSxFQUFFLENBQUM7UUFFN0QsS0FBSyxNQUFNO1lBQ1QsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkQsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDN0QsTUFBTSxVQUFVLEdBQUcseUJBQXlCLENBQzFDLE9BQU8sRUFBRSxHQUFHLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FDL0MsQ0FBQztZQUNGLElBQUksVUFBVSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLENBQUMsRUFBRTtnQkFDN0QsNkVBQTZFO2dCQUM3RSxHQUFHLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDO2dCQUMxQyxNQUFNLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDakYsSUFBSSxXQUFXLEVBQUU7b0JBQ2YsR0FBRyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxHQUFHLFdBQVcsQ0FBQztpQkFDbEQ7cUJBQU07b0JBQ0wsT0FBTyxHQUFHLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQzNDO2FBQ0Y7WUFDRCxPQUFPLElBQUksQ0FBQztRQUVkLEtBQUssYUFBYTtZQUNoQixNQUFNLEtBQUssR0FBRztnQkFDWixLQUFLLEVBQUUsU0FBUyxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJO2dCQUM3RCxRQUFRLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLO2FBQy9DLENBQUM7WUFDRixPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUMsYUFBYSxFQUFFLENBQUM7UUFFMUQscUVBQXFFO1FBQ3JFLFVBQVU7UUFDVixLQUFLLFlBQVk7WUFDZixRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ2QsSUFBSSxhQUFhLENBQUM7WUFDbEIsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUN4QixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQzdCLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRTt3QkFDdkIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO3dCQUNuQyxJQUFJLGVBQWUsR0FBRyxzQkFBc0IsQ0FDMUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUMsUUFBUTt3QkFDbEMsYUFBYSxHQUFHLGdCQUFnQixFQUNoQyxXQUFXLEVBQ1gsZUFBZSxHQUFHLGFBQWEsR0FBRyxFQUFFLENBQ3JDLENBQUM7d0JBQ0YsK0NBQStDO3dCQUMvQywyQ0FBMkM7d0JBRTNDLDREQUE0RDt3QkFDNUQsa0JBQWtCO3dCQUNsQixJQUFHLE1BQU0sQ0FBQyxlQUFlLEVBQUMsVUFBVSxDQUFDLEVBQUM7NEJBQ3BDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQ0FDbEQsSUFBSSxVQUFVLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUM7Z0NBQzdELElBQUcsVUFBVSxFQUFDO29DQUNaLFVBQVUsR0FBRyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7b0NBQ3pDLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLGVBQWUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQ0FFN0QsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEtBQUssQ0FBQztpQ0FDOUI7NEJBQ0gsQ0FBQyxDQUFDLENBQUE7eUJBQ0g7cUJBRUY7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7YUFDSjtZQUNELE9BQU8sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBQyxhQUFhLEVBQUUsQ0FBQztRQUM3RDtZQUNFLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7QUFDSCxDQUFDO0FBRUQ7Ozs7O0VBS0U7QUFDRixNQUFNLFVBQVUsY0FBYyxDQUFDLFFBQWE7SUFDMUMsTUFBTSxZQUFZLEdBQWtCLEVBQUUsQ0FBQztJQUN2QyxJQUFJLFdBQVcsR0FBZ0IsSUFBSSxDQUFDO0lBQ3BDLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsRUFBRTtRQUNsQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsRUFBRTtZQUNyRCxJQUFJLE9BQU8sY0FBYyxDQUFDLFNBQVMsQ0FBQyxLQUFLLFVBQVUsRUFBRTtnQkFDbkQsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO2FBQ3RFO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLFlBQVksQ0FBQyxNQUFNO1lBQ3JCLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQ3pEO1lBQ0EsV0FBVyxHQUFHLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLGNBQWMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMxRDtLQUNGO0lBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxFQUFFO1FBQ25DLFFBQVEsUUFBUSxDQUFDLFdBQVcsRUFBRTtZQUM1QixLQUFLLFdBQVc7Z0JBRWQsTUFBTSxhQUFhLEdBQXVDLEVBQUUsQ0FBQztnQkFDN0QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLEVBQUU7b0JBQzNDLE1BQU0sVUFBVSxHQUFvQixjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzdELHNEQUFzRDtvQkFDdEQsSUFBSSxVQUFVLEVBQUU7d0JBRWQ7Ozs7Ozs7Ozs7Ozs7OzBCQWNFO3dCQUNGLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUM7cUJBQ2pDO2dCQUNILENBQUMsQ0FBQyxDQUFDO2dCQUNILE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDMUQsS0FBSyxXQUFXO2dCQUNkLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQ3RELFFBQVEsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUNyQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDbkIsS0FBSyxhQUFhO2dCQUNoQixPQUFPLElBQUksa0JBQWtCLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztTQUMvRDtLQUNGO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLEdBQUcsYUFBYTtJQUMxQyxJQUFJLFlBQVksR0FBUSxJQUFJLENBQUM7SUFDN0IsS0FBSyxNQUFNLFlBQVksSUFBSSxhQUFhLEVBQUU7UUFDeEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUMxQixJQUFJLE9BQU8sWUFBWSxLQUFLLFFBQVE7Z0JBQ2xDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLE9BQU8sWUFBWSxLQUFLLFFBQVEsQ0FBQyxFQUMzRDtnQkFDQSxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRTtvQkFDekIsWUFBWSxHQUFHLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQztpQkFDbEM7cUJBQU0sSUFBSSxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUU7b0JBQ2pDLFlBQVksR0FBRyxFQUFFLEdBQUcsWUFBWSxFQUFFLENBQUM7aUJBQ3BDO2FBQ0Y7aUJBQU0sSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRLEVBQUU7Z0JBQzNDLFlBQVksR0FBRyxZQUFZLENBQUM7YUFDN0I7aUJBQU0sSUFBSSxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUMzRCxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQzthQUMzQztpQkFBTSxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUU7Z0JBQzFELE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztnQkFDckIsS0FBSyxNQUFNLEtBQUssSUFBSSxZQUFZLEVBQUU7b0JBQ2hDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO2lCQUNsRDtnQkFDRCxZQUFZLEdBQUcsU0FBUyxDQUFDO2FBQzFCO2lCQUFNLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDMUQsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO2dCQUNyQixLQUFLLE1BQU0sS0FBSyxJQUFJLFlBQVksRUFBRTtvQkFDaEMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7aUJBQ2xEO2dCQUNELFlBQVksR0FBRyxTQUFTLENBQUM7YUFDMUI7aUJBQU0sSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUN6RCxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7Z0JBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUMzRSxJQUFJLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFO3dCQUN0RCxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDL0Q7eUJBQU0sSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRTt3QkFDbEMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDakM7eUJBQU0sSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRTt3QkFDbEMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDakM7aUJBQ0Y7Z0JBQ0QsWUFBWSxHQUFHLFNBQVMsQ0FBQzthQUMxQjtTQUNGO0tBQ0Y7SUFDRCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE1BQVcsRUFBRSxtQkFBd0I7SUFDckUsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQzNCLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUU7UUFDM0QsY0FBYyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLGFBQWEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRixhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsRUFDbkMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsc0JBQXNCLEVBQUUsRUFBRSxDQUFDLENBQ3BGLENBQUM7S0FDSDtJQUNELE9BQU8sY0FBYyxDQUFDO0lBRXRCLDBDQUEwQztJQUMxQyxzR0FBc0c7QUFDeEcsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQzVCLFFBQWEsRUFBRSxPQUF5QixFQUN4QyxlQUFvQyxFQUFFLFFBQTZCLEVBQ25FLGlCQUFpQixHQUFHLEtBQUssRUFBRSxTQUFTLEdBQUcsS0FBSztJQUU1QyxJQUFJLFFBQVEsS0FBSyxJQUFJLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFO1FBQUUsT0FBTyxRQUFRLENBQUM7S0FBRTtJQUMzRSxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2xELFdBQVcsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxFQUFFO1FBRXZELGlDQUFpQztRQUNqQyxtREFBbUQ7UUFDbkQsSUFBSSxpQkFBaUIsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdkMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ2pEO2FBQU0sSUFBSSxpQkFBaUIsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDakUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ2pEO2FBQU07WUFDTCxNQUFNLGNBQWMsR0FDbEIsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ25FLHlCQUF5QixDQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdEUsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLGNBQWMsRUFBRSxZQUFZLENBQUMsQ0FBQyxFQUFFO2dCQUM1RCxNQUFNLFVBQVUsR0FDZCxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDaEQsSUFBSSxVQUFVLEtBQUssTUFBTSxFQUFFO29CQUN6QixXQUFXLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQ25EO3FCQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksaUJBQWlCLENBQUM7b0JBQy9DLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUMvRDtvQkFDQSxNQUFNLFFBQVEsR0FBRyxDQUFDLFNBQVMsSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3JFLFlBQVksQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFDeEUsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksaUJBQWlCLEVBQUU7d0JBQzVDLFdBQVcsQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztxQkFDdkQ7aUJBQ0Y7Z0JBR0QsaUVBQWlFO2dCQUVqRSx3Q0FBd0M7Z0JBQ3hDLHlFQUF5RTtnQkFFekUsb0VBQW9FO2dCQUNwRSwrQ0FBK0M7Z0JBQy9DLHlFQUF5RTtnQkFDekUsMkZBQTJGO2dCQUMzRixnRUFBZ0U7Z0JBQ2hFLG1FQUFtRTtnQkFDbkUsZ0ZBQWdGO2dCQUNoRixtRUFBbUU7Z0JBQ25FLG1FQUFtRTtnQkFDbkUseUVBQXlFO2dCQUN6RSx5RUFBeUU7Z0JBQ3pFLE1BQU07Z0JBQ04sT0FBTztnQkFDUCw2REFBNkQ7Z0JBQzdELElBQUk7YUFDTDtpQkFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUNuRCxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksaUJBQWlCLENBQUMsRUFDckM7Z0JBQ0EsSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFFLENBQUMsRUFBRTtvQkFDbkMsT0FBTyxhQUFhLENBQUM7aUJBQ3RCO2dCQUNELE9BQU8sQ0FBQyxLQUFLLENBQUMsd0JBQXdCO29CQUNwQywyQ0FBMkMsY0FBYyxFQUFFLENBQUMsQ0FBQztnQkFDL0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2xDLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLENBQUM7Z0JBQ2xELE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLENBQUM7YUFDakQ7U0FDRjtJQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxhQUFhLENBQUM7QUFDdkIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQ3hCLFNBQWMsRUFBRSxXQUFvQixFQUFFLFdBQVcsR0FBRyxLQUFLLEVBQUUsYUFBc0I7SUFFakYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEVBQUU7UUFDbkUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDM0MsNkRBQTZEO1lBQzdELDhEQUE4RDtZQUM5RCxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsRUFBRTtnQkFDbkMsTUFBTSxXQUFXLEdBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQSxDQUFDLENBQUEsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFBLENBQUMsQ0FBQSxXQUFXLENBQUE7Z0JBQzVFLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQy9DLElBQUksV0FBVyxFQUFFO29CQUFFLE9BQU8sV0FBVyxDQUFDO2lCQUFFO2FBQ3pDO1lBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsV0FBVyxFQUFFLENBQUMsQ0FBQztTQUN6RTtRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDeEIsT0FBTyxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsU0FBUyxFQUFFLENBQUMsQ0FBQztTQUNwRTtRQUNELE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFDRCxJQUFJLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdEQsSUFBSSxXQUFXLEVBQUU7UUFBRSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FBRTtJQUV0RSxvRUFBb0U7SUFDcEUsa0RBQWtEO0lBQ2xELElBQUksT0FBTyxTQUFTLENBQUMsR0FBRyxLQUFLLFVBQVU7UUFDckMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUN0RDtRQUNBLE1BQU0sV0FBVyxHQUFDLENBQUMsQ0FBQyxhQUFhLENBQUEsQ0FBQyxDQUFBLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQSxDQUFDLENBQUEsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVGLE1BQU0sV0FBVyxHQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEQsSUFBSSxXQUFXLEVBQUU7WUFBRSxPQUFPLFdBQVcsQ0FBQztTQUFFO0tBQ3pDO0lBRUQsOENBQThDO0lBQzlDLG1EQUFtRDtJQUNuRCx3REFBd0Q7SUFDeEQsSUFBSSxRQUFRLEdBQUcsU0FBUyxDQUFDO0lBQ3pCLEtBQUssTUFBTSxHQUFHLElBQUksZ0JBQWdCLEVBQUU7UUFDbEMsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxFQUFFO1lBQUUsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7U0FBRTtRQUNuRSxJQUFJLGFBQWEsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxhQUFhLENBQUUsQ0FBQyxFQUFFO1lBQ3RFLFFBQVEsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBRSxDQUFDLENBQUM7WUFDckQsT0FBTyxRQUFRLENBQUM7U0FDakI7YUFBTSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsRUFBRTtZQUM3QyxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDMUM7YUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDaEMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUMxQjthQUFNO1lBQ0wsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDO1lBQzlFLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDM0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN6QixPQUFPO1NBQ1I7S0FDRjtJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFHRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQ3hCLFNBQWMsRUFBRSxXQUFvQixFQUFFLE9BQXdCLEVBQUUsU0FBa0I7SUFHbEYsSUFBSSxnQkFBZ0IsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBR3RELG9FQUFvRTtJQUNwRSxrREFBa0Q7SUFDbEQ7Ozs7Ozs7TUFPRTtJQUNGLElBQUksWUFBWSxHQUFPLFNBQVMsQ0FBQztJQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNwRCx3RUFBd0U7UUFDeEUsWUFBWSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVyRCwwRkFBMEY7UUFDMUYsSUFBSSxDQUFDLENBQUMsT0FBTyxZQUFZLENBQUMsVUFBVSxLQUFJLFVBQVUsQ0FBRSxFQUFFO1lBQ3BELE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsMkNBQTJDLENBQUMsQ0FBQztTQUMxRjtLQUNGO0lBRUQsbUZBQW1GO0lBQ25GLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUUvRCxpRUFBaUU7SUFDakUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFJN0MsOENBQThDO0lBQzlDLG1EQUFtRDtJQUNuRCx3REFBd0Q7SUFDeEQsd0NBQXdDO0lBQ3hDOzs7Ozs7Ozs7Ozs7Ozs7O01BZ0JFO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWJzdHJhY3RDb250cm9sLFxyXG4gIFVudHlwZWRGb3JtQXJyYXksXHJcbiAgVW50eXBlZEZvcm1Db250cm9sLFxyXG4gIFVudHlwZWRGb3JtR3JvdXAsXHJcbiAgVmFsaWRhdG9yRm5cclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoL2Nsb25lRGVlcCc7XHJcbmltcG9ydCBmaWx0ZXIgZnJvbSAnbG9kYXNoL2ZpbHRlcic7XHJcbmltcG9ydCBtYXAgZnJvbSAnbG9kYXNoL21hcCc7XHJcbmltcG9ydCB7IGdldENvbnRyb2xWYWxpZGF0b3JzLCByZW1vdmVSZWN1cnNpdmVSZWZlcmVuY2VzIH0gZnJvbSAnLi9qc29uLXNjaGVtYS5mdW5jdGlvbnMnO1xyXG5pbXBvcnQgeyBKc29uVmFsaWRhdG9ycyB9IGZyb20gJy4vanNvbi52YWxpZGF0b3JzJztcclxuaW1wb3J0IHsgSnNvblBvaW50ZXIsIFBvaW50ZXIgfSBmcm9tICcuL2pzb25wb2ludGVyLmZ1bmN0aW9ucyc7XHJcbmltcG9ydCB7IGZvckVhY2gsIGhhc093biB9IGZyb20gJy4vdXRpbGl0eS5mdW5jdGlvbnMnO1xyXG5pbXBvcnQge1xyXG4gIFNjaGVtYVByaW1pdGl2ZVR5cGUsXHJcbiAgaGFzVmFsdWUsXHJcbiAgaW5BcnJheSxcclxuICBpc0FycmF5LFxyXG4gIGlzRGF0ZSxcclxuICBpc0RlZmluZWQsXHJcbiAgaXNFbXB0eSxcclxuICBpc09iamVjdCxcclxuICBpc1ByaW1pdGl2ZSxcclxuICB0b0phdmFTY3JpcHRUeXBlLFxyXG4gIHRvU2NoZW1hVHlwZVxyXG59IGZyb20gJy4vdmFsaWRhdG9yLmZ1bmN0aW9ucyc7XHJcblxyXG4vKipcclxuICogcGF0aDJDb250cm9sS2V5IHRha2VzIGEgZGF0YXBvaW50ZXIgcGF0aCBsaWtlIC9zb21lL3BvaW50ZXIvcGF0aFxyXG4gKiBhbmQgcmV0dXJucyBzb21ldGhpbmcgbGlrZSAkc29tZSRwb2ludGVyJHBhdGhcclxuICogdXNlZCBtYWlubHkgdG8gY29udmVydCBwYXRocyBzbyBpdCBjYW4gYmUgdXNlZCBhcyBrZXlzIGluIEZvcm1Hcm91cHNcclxuICogZm90IElURSBzY2VuYXJpb3NcclxuICogQHBhcmFtIHBhdGggXHJcbiAqIEByZXR1cm5zIHN0cmluZ1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHBhdGgyQ29udHJvbEtleShwYXRoOiBzdHJpbmcpIHtcclxuICByZXR1cm4gcGF0aC5yZXBsYWNlKC9cXC8vZywgXCIkXCIpXHJcbn1cclxuXHJcblxyXG4vKipcclxuICogRm9ybUdyb3VwIGZ1bmN0aW9uIGxpYnJhcnk6XHJcbiAqXHJcbiAqIGJ1aWxkRm9ybUdyb3VwVGVtcGxhdGU6ICBCdWlsZHMgYSBGb3JtR3JvdXBUZW1wbGF0ZSBmcm9tIHNjaGVtYVxyXG4gKlxyXG4gKiBidWlsZEZvcm1Hcm91cDogICAgICAgICAgQnVpbGRzIGFuIEFuZ3VsYXIgRm9ybUdyb3VwIGZyb20gYSBGb3JtR3JvdXBUZW1wbGF0ZVxyXG4gKlxyXG4gKiBtZXJnZVZhbHVlczpcclxuICpcclxuICogc2V0UmVxdWlyZWRGaWVsZHM6XHJcbiAqXHJcbiAqIGZvcm1hdEZvcm1EYXRhOlxyXG4gKlxyXG4gKiBnZXRDb250cm9sOlxyXG4gKlxyXG4gKiAtLS0tIFRPRE86IC0tLS1cclxuICogVE9ETzogYWRkIGJ1aWxkRm9ybUdyb3VwVGVtcGxhdGVGcm9tTGF5b3V0IGZ1bmN0aW9uXHJcbiAqIGJ1aWxkRm9ybUdyb3VwVGVtcGxhdGVGcm9tTGF5b3V0OiBCdWlsZHMgYSBGb3JtR3JvdXBUZW1wbGF0ZSBmcm9tIGEgZm9ybSBsYXlvdXRcclxuICovXHJcblxyXG4vKipcclxuICogJ2J1aWxkRm9ybUdyb3VwVGVtcGxhdGUnIGZ1bmN0aW9uXHJcbiAqXHJcbiAqIEJ1aWxkcyBhIHRlbXBsYXRlIGZvciBhbiBBbmd1bGFyIEZvcm1Hcm91cCBmcm9tIGEgSlNPTiBTY2hlbWEuXHJcbiAqXHJcbiAqIFRPRE86IGFkZCBzdXBwb3J0IGZvciBwYXR0ZXJuIHByb3BlcnRpZXNcclxuICogaHR0cHM6Ly9zcGFjZXRlbGVzY29wZS5naXRodWIuaW8vdW5kZXJzdGFuZGluZy1qc29uLXNjaGVtYS9yZWZlcmVuY2Uvb2JqZWN0Lmh0bWxcclxuICpcclxuICogLy8gIHthbnl9IGpzZiAtXHJcbiAqIC8vICB7YW55ID0gbnVsbH0gbm9kZVZhbHVlIC1cclxuICogLy8gIHtib29sZWFuID0gdHJ1ZX0gbWFwQXJyYXlzIC1cclxuICogLy8gIHtzdHJpbmcgPSAnJ30gc2NoZW1hUG9pbnRlciAtXHJcbiAqIC8vICB7c3RyaW5nID0gJyd9IGRhdGFQb2ludGVyIC1cclxuICogLy8gIHthbnkgPSAnJ30gdGVtcGxhdGVQb2ludGVyIC1cclxuICogLy8ge2FueX0gLVxyXG4gKi9cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZEZvcm1Hcm91cFRlbXBsYXRlKFxyXG4gIGpzZjogYW55LCBub2RlVmFsdWU6IGFueSA9IG51bGwsIHNldFZhbHVlcyA9IHRydWUsXHJcbiAgc2NoZW1hUG9pbnRlciA9ICcnLCBkYXRhUG9pbnRlciA9ICcnLCB0ZW1wbGF0ZVBvaW50ZXIgPSAnJ1xyXG4pIHtcclxuICBjb25zdCBzY2hlbWEgPSBKc29uUG9pbnRlci5nZXQoanNmLnNjaGVtYSwgc2NoZW1hUG9pbnRlcik7XHJcbiAgaWYgKHNldFZhbHVlcykge1xyXG4gICAgaWYgKCFpc0RlZmluZWQobm9kZVZhbHVlKSAmJiAoXHJcbiAgICAgIGpzZi5mb3JtT3B0aW9ucy5zZXRTY2hlbWFEZWZhdWx0cyA9PT0gdHJ1ZSB8fFxyXG4gICAgICAoanNmLmZvcm1PcHRpb25zLnNldFNjaGVtYURlZmF1bHRzID09PSAnYXV0bycgJiYgaXNFbXB0eShqc2YuZm9ybVZhbHVlcykpXHJcbiAgICApKSB7XHJcbiAgICAgIG5vZGVWYWx1ZSA9IEpzb25Qb2ludGVyLmdldChqc2Yuc2NoZW1hLCBzY2hlbWFQb2ludGVyICsgJy9kZWZhdWx0Jyk7XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIG5vZGVWYWx1ZSA9IG51bGw7XHJcbiAgfVxyXG4gIC8vIFRPRE86IElmIG5vZGVWYWx1ZSBzdGlsbCBub3Qgc2V0LCBjaGVjayBsYXlvdXQgZm9yIGRlZmF1bHQgdmFsdWVcclxuICBjb25zdCBzY2hlbWFUeXBlOiBzdHJpbmcgfCBzdHJpbmdbXSA9IEpzb25Qb2ludGVyLmdldChzY2hlbWEsICcvdHlwZScpO1xyXG4gIGNvbnN0IGlzSWZUaGVuRWxzZSA9IGhhc093bihzY2hlbWEsICdpZicpIHx8IGhhc093bihzY2hlbWEsICd0aGVuJykgfHwgaGFzT3duKHNjaGVtYSwgJ2Vsc2UnKTtcclxuICBjb25zdCBjb250cm9sVHlwZSA9IGlzSWZUaGVuRWxzZSAmJiAhc2NoZW1hVHlwZSA/ICdJZlRoZW5FbHNlJyA6XHJcbiAgICAoaGFzT3duKHNjaGVtYSwgJ3Byb3BlcnRpZXMnKSB8fCBoYXNPd24oc2NoZW1hLCAnYWRkaXRpb25hbFByb3BlcnRpZXMnKVxyXG5cclxuICAgICkgJiZcclxuICAgICAgc2NoZW1hVHlwZSA9PT0gJ29iamVjdCcgPyAnRm9ybUdyb3VwJyA6XHJcbiAgICAgIChoYXNPd24oc2NoZW1hLCAnaXRlbXMnKSB8fCBoYXNPd24oc2NoZW1hLCAnYWRkaXRpb25hbEl0ZW1zJykpICYmXHJcbiAgICAgICAgc2NoZW1hVHlwZSA9PT0gJ2FycmF5JyA/ICdGb3JtQXJyYXknIDpcclxuICAgICAgICAhc2NoZW1hVHlwZSAmJiBoYXNPd24oc2NoZW1hLCAnJHJlZicpID8gJyRyZWYnIDogJ0Zvcm1Db250cm9sJztcclxuICBjb25zdCBzaG9ydERhdGFQb2ludGVyID1cclxuICAgIHJlbW92ZVJlY3Vyc2l2ZVJlZmVyZW5jZXMoZGF0YVBvaW50ZXIsIGpzZi5kYXRhUmVjdXJzaXZlUmVmTWFwLCBqc2YuYXJyYXlNYXApO1xyXG4gIGlmICghanNmLmRhdGFNYXAuaGFzKHNob3J0RGF0YVBvaW50ZXIpKSB7XHJcbiAgICBqc2YuZGF0YU1hcC5zZXQoc2hvcnREYXRhUG9pbnRlciwgbmV3IE1hcCgpKTtcclxuICB9XHJcbiAgY29uc3Qgbm9kZU9wdGlvbnMgPSBqc2YuZGF0YU1hcC5nZXQoc2hvcnREYXRhUG9pbnRlcik7XHJcbiAgaWYgKCFub2RlT3B0aW9ucy5oYXMoJ3NjaGVtYVR5cGUnKSkge1xyXG4gICAgbm9kZU9wdGlvbnMuc2V0KCdzY2hlbWFQb2ludGVyJywgc2NoZW1hUG9pbnRlcik7XHJcbiAgICBub2RlT3B0aW9ucy5zZXQoJ3NjaGVtYVR5cGUnLCBzY2hlbWEudHlwZSk7XHJcbiAgICBpZiAoc2NoZW1hLmZvcm1hdCkge1xyXG4gICAgICBub2RlT3B0aW9ucy5zZXQoJ3NjaGVtYUZvcm1hdCcsIHNjaGVtYS5mb3JtYXQpO1xyXG4gICAgICBpZiAoIXNjaGVtYS50eXBlKSB7IG5vZGVPcHRpb25zLnNldCgnc2NoZW1hVHlwZScsICdzdHJpbmcnKTsgfVxyXG4gICAgfVxyXG4gICAgaWYgKGNvbnRyb2xUeXBlKSB7XHJcbiAgICAgIG5vZGVPcHRpb25zLnNldCgndGVtcGxhdGVQb2ludGVyJywgdGVtcGxhdGVQb2ludGVyKTtcclxuICAgICAgbm9kZU9wdGlvbnMuc2V0KCd0ZW1wbGF0ZVR5cGUnLCBjb250cm9sVHlwZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGxldCBjb250cm9sczogYW55O1xyXG4gIGNvbnN0IHZhbGlkYXRvcnMgPSBnZXRDb250cm9sVmFsaWRhdG9ycyhzY2hlbWEpO1xyXG4gIHN3aXRjaCAoY29udHJvbFR5cGUpIHtcclxuXHJcbiAgICBjYXNlICdGb3JtR3JvdXAnOlxyXG4gICAgICBjb250cm9scyA9IHt9O1xyXG4gICAgICBpZiAoaGFzT3duKHNjaGVtYSwgJ3VpOm9yZGVyJykgfHwgaGFzT3duKHNjaGVtYSwgJ3Byb3BlcnRpZXMnKSkge1xyXG4gICAgICAgIGNvbnN0IHByb3BlcnR5S2V5cyA9IHNjaGVtYVsndWk6b3JkZXInXSB8fCBPYmplY3Qua2V5cyhzY2hlbWEucHJvcGVydGllcyk7XHJcbiAgICAgICAgaWYgKHByb3BlcnR5S2V5cy5pbmNsdWRlcygnKicpICYmICFoYXNPd24oc2NoZW1hLnByb3BlcnRpZXMsICcqJykpIHtcclxuICAgICAgICAgIGNvbnN0IHVubmFtZWRLZXlzID0gT2JqZWN0LmtleXMoc2NoZW1hLnByb3BlcnRpZXMpXHJcbiAgICAgICAgICAgIC5maWx0ZXIoa2V5ID0+ICFwcm9wZXJ0eUtleXMuaW5jbHVkZXMoa2V5KSk7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gcHJvcGVydHlLZXlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eUtleXNbaV0gPT09ICcqJykge1xyXG4gICAgICAgICAgICAgIHByb3BlcnR5S2V5cy5zcGxpY2UoaSwgMSwgLi4udW5uYW1lZEtleXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHByb3BlcnR5S2V5c1xyXG4gICAgICAgICAgLmZpbHRlcihrZXkgPT4gaGFzT3duKHNjaGVtYS5wcm9wZXJ0aWVzLCBrZXkpIHx8XHJcbiAgICAgICAgICAgIGhhc093bihzY2hlbWEsICdhZGRpdGlvbmFsUHJvcGVydGllcycpXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICAuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnRyb2xzW2tleV0gPSBidWlsZEZvcm1Hcm91cFRlbXBsYXRlKFxyXG4gICAgICAgICAgICAgIGpzZiwgSnNvblBvaW50ZXIuZ2V0KG5vZGVWYWx1ZSwgWzxzdHJpbmc+a2V5XSksIHNldFZhbHVlcyxcclxuICAgICAgICAgICAgICBzY2hlbWFQb2ludGVyICsgKGhhc093bihzY2hlbWEucHJvcGVydGllcywga2V5KSA/XHJcbiAgICAgICAgICAgICAgICAnL3Byb3BlcnRpZXMvJyArIGtleSA6ICcvYWRkaXRpb25hbFByb3BlcnRpZXMnXHJcbiAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICBkYXRhUG9pbnRlciArICcvJyArIGtleSxcclxuICAgICAgICAgICAgICB0ZW1wbGF0ZVBvaW50ZXIgKyAnL2NvbnRyb2xzLycgKyBrZXlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgLy9hZGQgdGhlICQ8Y29udHJvbD4gdHlwZSB0byB0aGUgcm9vdFxyXG4gICAgICAgICAgICAvL3NvIGl0IGNhbiBiZSBmbGF0dGVuZWQgYW5kIGFjY2VzZXMgZGlyZWN0bHkgaW4gdGhlIGZvcm1ncm91cFxyXG4gICAgICAgICAgICAvL2J5IGl0cyBmdWxsICckJyBwYXRoXHJcbiAgICAgICAgICAgIFtcImFsbE9mXCIsIFwiYW55T2ZcIixcIm9uZU9mXCJdLmZvckVhY2gob2ZUeXBlID0+IHtcclxuICAgICAgICAgICAgICBpZihjb250cm9sc1trZXldLmNvbnRyb2xzICYmIGNvbnRyb2xzW2tleV0uY29udHJvbHNbYF8ke29mVHlwZX1gXSl7XHJcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhjb250cm9sc1trZXldLmNvbnRyb2xzW2BfJHtvZlR5cGV9YF0pLmZvckVhY2goJGtleT0+e1xyXG4gICAgICAgICAgICAgICAgICBjb250cm9sc1ska2V5XT1jb250cm9sc1trZXldLmNvbnRyb2xzW2BfJHtvZlR5cGV9YF1bJGtleV07XHJcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjb250cm9sc1trZXldLmNvbnRyb2xzWyRrZXldO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBjb250cm9sc1trZXldLmNvbnRyb2xzW2BfJHtvZlR5cGV9YF1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9IFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGlmIChoYXNPd24oc2NoZW1hLCBcImlmXCIpKSB7XHJcbiAgICAgICAgICBbXCJ0aGVuXCIsIFwiZWxzZVwiXS5mb3JFYWNoKGNvbiA9PiB7XHJcbiAgICAgICAgICAgIGlmIChoYXNPd24oc2NoZW1hLCBjb24pKSB7XHJcbiAgICAgICAgICAgICAgY29uc3Qga2V5U2NoZW1hUG9pbnRlciA9IGAvJHtjb259YDtcclxuXHJcbiAgICAgICAgICAgICAgbGV0IHRoZW5GR1RlbXBsYXRlID0gYnVpbGRGb3JtR3JvdXBUZW1wbGF0ZShcclxuICAgICAgICAgICAgICAgIGpzZiwgbm9kZVZhbHVlLCBzZXRWYWx1ZXMsLy9mYWxzZSwvL0pzb25Qb2ludGVyLmdldChub2RlVmFsdWUsIGtleVNjaGVtYVBvaW50ZXIpLCBzZXRWYWx1ZXMsXHJcbiAgICAgICAgICAgICAgICBzY2hlbWFQb2ludGVyICsga2V5U2NoZW1hUG9pbnRlcixcclxuICAgICAgICAgICAgICAgIGRhdGFQb2ludGVyLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVQb2ludGVyICsgYC9jb250cm9scy8ke2Nvbn1gXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGNvbnRyb2xzLCB0aGVuRkdUZW1wbGF0ZS5jb250cm9scyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgLyogIHRyZWF0IGFsbE9mIHRoZSBzYW1lIGFzIGFueSBvZiBidXQgbmVlZCB0byBhZGQgYW4gZXh0cmFcclxuICAgICAgY29uZGl0aW9uIGZvciB3aGljaCBhbnlPZiBpdGVtIGlzIHRvIGJlIHJlbmRlcmVkIFxyXG4gICAgICAgIGxldCBhbGxPZkNvbnRyb2xzID0ge31cclxuICAgICAgICBsZXQgYWxsT2ZBbGxvd2VkS2V5cyA9IFtcImFsbE9mXCIsIFwiYW55T2ZcIiwgXCJvbmVPZlwiLCBcImlmXCIsIFwidGhlblwiLCBcImVsc2VcIiwgXCJ0eXBlXCIsIFwicHJvcGVydGllc1wiLCBcIml0ZW1zXCJdO1xyXG4gICAgICAgIGlmIChoYXNPd24oc2NoZW1hLCBcImFsbE9mXCIpICYmIGlzQXJyYXkoc2NoZW1hLmFsbE9mKSkge1xyXG4gICAgICAgICAgc2NoZW1hLmFsbE9mLmZvckVhY2goKGFsbE9mSXRlbSwgaW5kKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBhb0l0ZW1LZXlzID0gT2JqZWN0LmtleXMoYWxsT2ZJdGVtKTtcclxuICAgICAgICAgICAgbGV0IGZvdW5kS2V5cyA9IGFsbE9mQWxsb3dlZEtleXMuZmlsdGVyKHZhbHVlID0+XHJcbiAgICAgICAgICAgICAgYW9JdGVtS2V5cy5pbmNsdWRlcyh2YWx1ZSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaWYgKGZvdW5kS2V5cyAmJiBmb3VuZEtleXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGtleVNjaGVtYVBvaW50ZXIgPSBgL2FsbE9mLyR7aW5kfWA7XHJcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhgZm91bmQ6JHtrZXlTY2hlbWFQb2ludGVyfWApO1xyXG4gICAgICAgICAgICAgIGxldCBhbGxPZkZHVGVtcGxhdGUgPSBidWlsZEZvcm1Hcm91cFRlbXBsYXRlKFxyXG4gICAgICAgICAgICAgICAganNmLCBKc29uUG9pbnRlci5nZXQobm9kZVZhbHVlLCBrZXlTY2hlbWFQb2ludGVyKSwgc2V0VmFsdWVzLFxyXG4gICAgICAgICAgICAgICAgc2NoZW1hUG9pbnRlciArIGtleVNjaGVtYVBvaW50ZXIsXHJcbiAgICAgICAgICAgICAgICBkYXRhUG9pbnRlcixcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlUG9pbnRlciArICcvY29udHJvbHMvJyArIGluZFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgaWYgKGFsbE9mRkdUZW1wbGF0ZS5jb250cm9scykge1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoYWxsT2ZGR1RlbXBsYXRlLmNvbnRyb2xzKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBjb250cm9sS2V5ID0gYWxsT2ZGR1RlbXBsYXRlLmNvbnRyb2xzW2tleV0uc2NoZW1hUG9pbnRlciB8fCBgJHtzY2hlbWFQb2ludGVyfSR7a2V5U2NoZW1hUG9pbnRlcn0vJHtrZXl9YDtcclxuICAgICAgICAgICAgICAgICAgY29udHJvbEtleSA9IHBhdGgyQ29udHJvbEtleShjb250cm9sS2V5KTtcclxuICAgICAgICAgICAgICAgICAgY29udHJvbHNbY29udHJvbEtleV0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBrZXksXHJcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hUG9pbnRlcjogc2NoZW1hUG9pbnRlciArIGtleVNjaGVtYVBvaW50ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbHM6IGFsbE9mRkdUZW1wbGF0ZS5jb250cm9sc1trZXldXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgY29udHJvbHNbY29udHJvbEtleV0gPSBhbGxPZkZHVGVtcGxhdGUuY29udHJvbHNba2V5XTtcclxuICAgICAgICAgICAgICAgICAgY29udHJvbHNbY29udHJvbEtleV0ua2V5ID0ga2V5O1xyXG4gICAgICAgICAgICAgICAgICBjb250cm9sc1tjb250cm9sS2V5XS5zY2hlbWFQb2ludGVyID0gYWxsT2ZGR1RlbXBsYXRlLmNvbnRyb2xzW2tleV0uc2NoZW1hUG9pbnRlciB8fCBzY2hlbWFQb2ludGVyICsga2V5U2NoZW1hUG9pbnRlcjtcclxuXHJcbiAgICAgICAgICAgICAgICAgIGNvbnRyb2xzW2tleV0gPSBhbGxPZkZHVGVtcGxhdGUuY29udHJvbHNba2V5XTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIC8vYWRkIHVpIHR5cGUgaXRlbXMgdG8gY29udHJvbHNcclxuICAgICAgICAgICAgICBpZiAoYWxsT2ZJdGVtW1widHlwZVwiXSB8fCBhbGxPZkl0ZW1bXCJwcm9wZXJ0aWVzXCJdIHx8IGFsbE9mSXRlbVtcIml0ZW1zXCJdKSB7XHJcbiAgICAgICAgICAgICAgICBhbGxPZkNvbnRyb2xzW2luZF0gPSBhbGxPZkZHVGVtcGxhdGVcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGNvbnRyb2xzW1wiYWxsT2ZcIl0gPSBhbGxPZkNvbnRyb2xzO1xyXG4gICAgICAgIH1cclxuICAgICAgICAqL1xyXG5cclxuXHJcbiAgICAgICAgbGV0IG9mQWxsb3dlZEtleXMgPSBbXCJhbGxPZlwiLCBcImFueU9mXCIsIFwib25lT2ZcIiwgXCJpZlwiLCBcInRoZW5cIiwgXCJlbHNlXCIsIFwidHlwZVwiLCBcInByb3BlcnRpZXNcIiwgXCJpdGVtc1wiXTtcclxuICAgICAgICBbXCJhbGxPZlwiLCBcImFueU9mXCIsXCJvbmVPZlwiXS5mb3JFYWNoKG9mVHlwZSA9PiB7XHJcbiAgICAgICAgICBpZiAoaGFzT3duKHNjaGVtYSwgb2ZUeXBlKSAmJiBpc0FycmF5KHNjaGVtYVtvZlR5cGVdKSkge1xyXG4gICAgICAgICAgICBzY2hlbWFbb2ZUeXBlXS5mb3JFYWNoKChvZkl0ZW0sIGluZCkgPT4ge1xyXG4gICAgICAgICAgICAgIGxldCBhb0l0ZW1LZXlzID0gT2JqZWN0LmtleXMob2ZJdGVtKTtcclxuICAgICAgICAgICAgICBsZXQgZm91bmRLZXlzID0gb2ZBbGxvd2VkS2V5cy5maWx0ZXIodmFsdWUgPT5cclxuICAgICAgICAgICAgICAgIGFvSXRlbUtleXMuaW5jbHVkZXModmFsdWUpXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBpZiAoZm91bmRLZXlzICYmIGZvdW5kS2V5cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlTY2hlbWFQb2ludGVyID0gYC8ke29mVHlwZX0vJHtpbmR9YDtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coYGZvdW5kOiR7a2V5U2NoZW1hUG9pbnRlcn1gKTtcclxuICAgICAgICAgICAgICAgIGxldCBuZXdOb2RlVmFsdWU9bm9kZVZhbHVlO1xyXG4gICAgICAgICAgICAgICAgLy9Kc29uUG9pbnRlci5nZXQobm9kZVZhbHVlLCBkYXRhUG9pbnRlcik7XHJcbiAgICAgICAgICAgICAgICAvL0pzb25Qb2ludGVyLmdldChub2RlVmFsdWUsIGtleVNjaGVtYVBvaW50ZXIpO1xyXG4gICAgICAgICAgICAgICAgaWYob2ZUeXBlPT1cIm9uZU9mXCIpe1xyXG4gICAgICAgICAgICAgICAgICBuZXdOb2RlVmFsdWU9bm9kZVZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IGFsbE9mRkdUZW1wbGF0ZSA9IGJ1aWxkRm9ybUdyb3VwVGVtcGxhdGUoXHJcbiAgICAgICAgICAgICAgICAgIGpzZiwgbmV3Tm9kZVZhbHVlLCBzZXRWYWx1ZXMsXHJcbiAgICAgICAgICAgICAgICAgIHNjaGVtYVBvaW50ZXIgKyBrZXlTY2hlbWFQb2ludGVyLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhUG9pbnRlcixcclxuICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQb2ludGVyICsgJy9jb250cm9scy8nICsgaW5kXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFsbE9mRkdUZW1wbGF0ZS5jb250cm9scykge1xyXG4gICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhhbGxPZkZHVGVtcGxhdGUuY29udHJvbHMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsMlNjaGVtYVBvaW50ZXIgPSBoYXNPd24oc2NoZW1hLCdwcm9wZXJ0aWVzJykgP1xyXG4gICAgICAgICAgICAgICAgICAgICcvcHJvcGVydGllcy8nICtrZXk6a2V5O1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb250cm9sS2V5ID0gYWxsT2ZGR1RlbXBsYXRlLmNvbnRyb2xzW2tleV0uc2NoZW1hUG9pbnRlciB8fCBgJHtzY2hlbWFQb2ludGVyfSR7a2V5U2NoZW1hUG9pbnRlcn0ke2wyU2NoZW1hUG9pbnRlcn1gO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xLZXkgPSBwYXRoMkNvbnRyb2xLZXkoY29udHJvbEtleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sc1tjb250cm9sS2V5XSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgIGtleToga2V5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgc2NoZW1hUG9pbnRlcjogIGAke3NjaGVtYVBvaW50ZXJ9JHtrZXlTY2hlbWFQb2ludGVyfS8ke2tleX1gLC8vc2NoZW1hUG9pbnRlciArIGtleVNjaGVtYVBvaW50ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICBjb250cm9sczogYWxsT2ZGR1RlbXBsYXRlLmNvbnRyb2xzW2tleV1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRyb2xJdGVtPWNsb25lRGVlcChhbGxPZkZHVGVtcGxhdGUuY29udHJvbHNba2V5XSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbEl0ZW0ua2V5ID0ga2V5O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xJdGVtLnNjaGVtYVBvaW50ZXIgPSBjb250cm9sSXRlbS5zY2hlbWFQb2ludGVyfHwgYCR7c2NoZW1hUG9pbnRlcn0ke2tleVNjaGVtYVBvaW50ZXJ9JHtsMlNjaGVtYVBvaW50ZXJ9YDtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sc1tjb250cm9sS2V5XT1jb250cm9sSXRlbVxyXG4gICAgICAgICAgICAgICAgICAgIC8vbmVlZCB0byB0ZXN0IGlmIHZhbHVlIG1hdGNoZXMgc2NoZW1hLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vYXMgdGhlIHNhbWUgb25lT2YgaXRlbSB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBzYW1lIHZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgLy9pZiBrZXkgaXMgYSAkb25lT2Yga2V5IHRoZW4gaXQgd2FzIGluc2VydGVkIGF0IHRoZSByb290IG9mIHRoZSBjb250cm9sc1xyXG4gICAgICAgICAgICAgICAgICAgIC8vYXMgZm9ybSBjb250cm9sIG5hbWUgd2lsbCBiZSB0aGUgZnVsbChlc2NhcGVkKSBwYXRoIFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50ZXJQYXRoPWtleS5zdGFydHNXaXRoKCckb25lT2YnKT9jb250cm9sSXRlbS5zY2hlbWFQb2ludGVyOmtleVNjaGVtYVBvaW50ZXJcclxuICAgICAgICAgICAgICAgICAgICBsZXQgb25lT2ZJdGVtU2NoZW1hPUpzb25Qb2ludGVyLmdldChqc2Yuc2NoZW1hLGNvbnRyb2xJdGVtLnNjaGVtYVBvaW50ZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vSnNvblBvaW50ZXIuZ2V0KHNjaGVtYSxwb2ludGVyUGF0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRQb2ludGVyPSAgY29udHJvbEl0ZW0uc2NoZW1hUG9pbnRlci5yZXBsYWNlKC8oYW55T2Z8YWxsT2Z8b25lT2Z8bm9uZSlcXC9bXFxkXStcXC8vZywgJycpXHJcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyhpZnx0aGVufGVsc2V8cHJvcGVydGllcylcXC8vZywgJycpLnJlcGxhY2UoL1xcL2l0ZW1zXFwvL2csJy8tLycpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRQb2ludGVyPWRQb2ludGVyLmluZGV4T2YoZGF0YVBvaW50ZXIpPT0wXHJcbiAgICAgICAgICAgICAgICAgICAgP2RQb2ludGVyLnN1YnN0cmluZyhkYXRhUG9pbnRlci5sZW5ndGgpOmRQb2ludGVyO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vZGF0YVBvaW50ZXIrXCIvXCIrY29udHJvbEl0ZW0uc2NoZW1hUG9pbnRlci5zcGxpdChcIi9cIikuc2xpY2UoLTEpWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vLy9jb250cm9sSXRlbS5zY2hlbWFQb2ludGVyLnJlcGxhY2UoLyhhbnlPZnxhbGxPZnxvbmVPZnxub25lKVxcL1tcXGRdK1xcLy9nLCAnJylcclxuICAgICAgICAgICAgICAgICAgICAvLy8vLnJlcGxhY2UoLyhpZnx0aGVufGVsc2V8cHJvcGVydGllcylcXC8vZywgJycpLnJlcGxhY2UoL1xcL2l0ZW1zXFwvL2csJy8tLycpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vSnNvblBvaW50ZXIudG9EYXRhUG9pbnRlcihjb250cm9sSXRlbS5zY2hlbWFQb2ludGVyLGpzZi5zY2hlbWEpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coYGRhdGFQb2ludGVyOiR7ZGF0YVBvaW50ZXJ9XFxuZFBvaW50ZXI6JHtkUG9pbnRlcn1gKVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBkVmFsPS8vSnNvblBvaW50ZXIuZ2V0KGpzZi5mb3JtVmFsdWVzLGRQb2ludGVyKTtcclxuICAgICAgICAgICAgICAgICAgICBKc29uUG9pbnRlci5nZXQobm9kZVZhbHVlLGRQb2ludGVyKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZmtleT1rZXk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9uZU9mSXRlbVZhbHVlPWRWYWw7XHJcbiAgICAgICAgICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgICAgICAgICBpZihoYXNPd24ob25lT2ZJdGVtU2NoZW1hLFwiaWZcIikgJiYgY29udHJvbEl0ZW0uc2NoZW1hUG9pbnRlclxyXG4gICAgICAgICAgICAgICAgICAgICYmIGNvbnRyb2xJdGVtLnNjaGVtYVBvaW50ZXIuaW5kZXhPZihrZXlTY2hlbWFQb2ludGVyKT09MCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFydHM9Y29udHJvbEl0ZW0uc2NoZW1hUG9pbnRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgLnNwbGl0KGtleVNjaGVtYVBvaW50ZXIpLmpvaW4oJycpLnNwbGl0KFwiL1wiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHRoZW5PckVsc2U9cGFydHNbMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICBma2V5PXBhcnRzW3BhcnRzLmxlbmd0aC0xXTtcclxuICAgICAgICAgICAgICAgICAgICAgIG9uZU9mSXRlbVNjaGVtYT1vbmVPZkl0ZW1TY2hlbWFbdGhlbk9yRWxzZV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYob25lT2ZJdGVtU2NoZW1hLnByb3BlcnRpZXMgJiYganNmLmZvcm1WYWx1ZXM9PT11bmRlZmluZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBpZiBubyBmb3JtIGRhdGEgdmFsdWVzIHdlcmUgc3VwcGxpZWRcclxuICAgICAgICAgICAgICAgICAgICAgIC8vdGhlbiBzZXQgaXQgdG8gZGVmYXVsdCBvdGhlcndpc2UgdG8gaXRzIG5vZGV2YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgb25lT2ZJdGVtVmFsdWU9b25lT2ZJdGVtU2NoZW1hLmRlZmF1bHRcclxuICAgICAgICAgICAgICAgICAgICAgIG9uZU9mSXRlbVZhbHVlW2ZrZXldPW9uZU9mSXRlbVNjaGVtYS5wcm9wZXJ0aWVzW2ZrZXldPy5kZWZhdWx0O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZihvbmVPZkl0ZW1TY2hlbWEucHJvcGVydGllcyAmJiBqc2YuZm9ybVZhbHVlcyE9dW5kZWZpbmVkKXtcclxuICAgICAgICAgICAgICAgICAgICAgIG9uZU9mSXRlbVZhbHVlID17fTtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vbm9kZVZhbHVlfHx7fTtcclxuICAgICAgICAgICAgICAgICAgICAgIG9uZU9mSXRlbVZhbHVlW2ZrZXldPW5vZGVWYWx1ZSYmbm9kZVZhbHVlW2ZrZXldO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZighb25lT2ZJdGVtU2NoZW1hLnByb3BlcnRpZXMgJiYganNmLmZvcm1WYWx1ZXM9PXVuZGVmaW5lZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICBvbmVPZkl0ZW1WYWx1ZT1vbmVPZkl0ZW1TY2hlbWEuZGVmYXVsdDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGhhc093bihjb250cm9sSXRlbSxcInZhbHVlXCIpKXtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmKCFqc2YuYWp2LnZhbGlkYXRlKG9uZU9mSXRlbVNjaGVtYSxvbmVPZkl0ZW1WYWx1ZSkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sSXRlbS52YWx1ZS52YWx1ZT1udWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vL2NvbnRyb2xJdGVtLnZhbHVlLnZhbHVlPW9uZU9mSXRlbVZhbHVlW2ZrZXldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sSXRlbS52YWx1ZS52YWx1ZT1vbmVPZkl0ZW1TY2hlbWEucHJvcGVydGllcz9vbmVPZkl0ZW1WYWx1ZVtma2V5XTpvbmVPZkl0ZW1WYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgIH0gICBcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vY29udHJvbHNbY29udHJvbEtleV0gPSBjb250cm9sSXRlbTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy9hbGxPZkZHVGVtcGxhdGUuY29udHJvbHNba2V5XS5zY2hlbWFQb2ludGVyIHx8YCR7c2NoZW1hUG9pbnRlcn0ke2tleVNjaGVtYVBvaW50ZXJ9LyR7a2V5fWA7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9hbGxPZkZHVGVtcGxhdGUuY29udHJvbHNba2V5XS5zY2hlbWFQb2ludGVyIHx8IHNjaGVtYVBvaW50ZXIgKyBrZXlTY2hlbWFQb2ludGVyO1xyXG4gIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vLy8vLy9jb250cm9sc1trZXldID0gY2xvbmVEZWVwKGFsbE9mRkdUZW1wbGF0ZS5jb250cm9sc1trZXldKTtcclxuICAgICAgICAgICAgICAgICAgICAvL2FkZCBzY2hlbWFjb250cm9sIHRvIHJvb3QgXHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb250cm9sc1tjb250cm9sS2V5XT1jb250cm9sSXRlbVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzW2BfJHtvZlR5cGV9YF09Y29udHJvbHNbYF8ke29mVHlwZX1gXXx8e307XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbHNbYF8ke29mVHlwZX1gXVtjb250cm9sS2V5XT1jb250cm9sSXRlbVxyXG4gICAgICAgICAgICAgICAgICAgIC8vYWxsT2ZGR1RlbXBsYXRlLmNvbnRyb2xzW2tleV07XHJcbiAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgXHJcbiAgICAgICAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcblxyXG5cclxuXHJcbiAgICAgICAganNmLmZvcm1PcHRpb25zLmZpZWxkc1JlcXVpcmVkID0gc2V0UmVxdWlyZWRGaWVsZHMoc2NoZW1hLCBjb250cm9scyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHsgY29udHJvbFR5cGUsIGNvbnRyb2xzLCB2YWxpZGF0b3JzLHNjaGVtYVBvaW50ZXIgfTtcclxuXHJcbiAgICBjYXNlICdGb3JtQXJyYXknOlxyXG4gICAgICBjb250cm9scyA9IFtdO1xyXG4gICAgICBjb25zdCBtaW5JdGVtcyA9XHJcbiAgICAgICAgTWF0aC5tYXgoc2NoZW1hLm1pbkl0ZW1zIHx8IDAsIG5vZGVPcHRpb25zLmdldCgnbWluSXRlbXMnKSB8fCAwKTtcclxuICAgICAgY29uc3QgbWF4SXRlbXMgPVxyXG4gICAgICAgIE1hdGgubWluKHNjaGVtYS5tYXhJdGVtcyB8fCAxMDAwLCBub2RlT3B0aW9ucy5nZXQoJ21heEl0ZW1zJykgfHwgMTAwMCk7XHJcbiAgICAgIGxldCBhZGRpdGlvbmFsSXRlbXNQb2ludGVyOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgICBpZiAoaXNBcnJheShzY2hlbWEuaXRlbXMpKSB7IC8vICdpdGVtcycgaXMgYW4gYXJyYXkgPSB0dXBsZSBpdGVtc1xyXG4gICAgICAgIGNvbnN0IHR1cGxlSXRlbXMgPSBub2RlT3B0aW9ucy5nZXQoJ3R1cGxlSXRlbXMnKSB8fFxyXG4gICAgICAgICAgKGlzQXJyYXkoc2NoZW1hLml0ZW1zKSA/IE1hdGgubWluKHNjaGVtYS5pdGVtcy5sZW5ndGgsIG1heEl0ZW1zKSA6IDApO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHVwbGVJdGVtczsgaSsrKSB7XHJcbiAgICAgICAgICBpZiAoaSA8IG1pbkl0ZW1zKSB7XHJcbiAgICAgICAgICAgIGNvbnRyb2xzLnB1c2goYnVpbGRGb3JtR3JvdXBUZW1wbGF0ZShcclxuICAgICAgICAgICAgICBqc2YsIGlzQXJyYXkobm9kZVZhbHVlKSA/IG5vZGVWYWx1ZVtpXSA6IG5vZGVWYWx1ZSwgc2V0VmFsdWVzLFxyXG4gICAgICAgICAgICAgIHNjaGVtYVBvaW50ZXIgKyAnL2l0ZW1zLycgKyBpLFxyXG4gICAgICAgICAgICAgIGRhdGFQb2ludGVyICsgJy8nICsgaSxcclxuICAgICAgICAgICAgICB0ZW1wbGF0ZVBvaW50ZXIgKyAnL2NvbnRyb2xzLycgKyBpXHJcbiAgICAgICAgICAgICkpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgc2NoZW1hUmVmUG9pbnRlciA9IHJlbW92ZVJlY3Vyc2l2ZVJlZmVyZW5jZXMoXHJcbiAgICAgICAgICAgICAgc2NoZW1hUG9pbnRlciArICcvaXRlbXMvJyArIGksIGpzZi5zY2hlbWFSZWN1cnNpdmVSZWZNYXBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgY29uc3QgaXRlbVJlZlBvaW50ZXIgPSByZW1vdmVSZWN1cnNpdmVSZWZlcmVuY2VzKFxyXG4gICAgICAgICAgICAgIHNob3J0RGF0YVBvaW50ZXIgKyAnLycgKyBpLCBqc2YuZGF0YVJlY3Vyc2l2ZVJlZk1hcCwganNmLmFycmF5TWFwXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1SZWN1cnNpdmUgPSBpdGVtUmVmUG9pbnRlciAhPT0gc2hvcnREYXRhUG9pbnRlciArICcvJyArIGk7XHJcbiAgICAgICAgICAgIGlmICghaGFzT3duKGpzZi50ZW1wbGF0ZVJlZkxpYnJhcnksIGl0ZW1SZWZQb2ludGVyKSkge1xyXG4gICAgICAgICAgICAgIGpzZi50ZW1wbGF0ZVJlZkxpYnJhcnlbaXRlbVJlZlBvaW50ZXJdID0gbnVsbDtcclxuICAgICAgICAgICAgICBqc2YudGVtcGxhdGVSZWZMaWJyYXJ5W2l0ZW1SZWZQb2ludGVyXSA9IGJ1aWxkRm9ybUdyb3VwVGVtcGxhdGUoXHJcbiAgICAgICAgICAgICAgICBqc2YsIG51bGwsIHNldFZhbHVlcyxcclxuICAgICAgICAgICAgICAgIHNjaGVtYVJlZlBvaW50ZXIsXHJcbiAgICAgICAgICAgICAgICBpdGVtUmVmUG9pbnRlcixcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlUG9pbnRlciArICcvY29udHJvbHMvJyArIGlcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnRyb2xzLnB1c2goXHJcbiAgICAgICAgICAgICAgaXNBcnJheShub2RlVmFsdWUpID9cclxuICAgICAgICAgICAgICAgIGJ1aWxkRm9ybUdyb3VwVGVtcGxhdGUoXHJcbiAgICAgICAgICAgICAgICAgIGpzZiwgbm9kZVZhbHVlW2ldLCBzZXRWYWx1ZXMsXHJcbiAgICAgICAgICAgICAgICAgIHNjaGVtYVBvaW50ZXIgKyAnL2l0ZW1zLycgKyBpLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhUG9pbnRlciArICcvJyArIGksXHJcbiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUG9pbnRlciArICcvY29udHJvbHMvJyArIGlcclxuICAgICAgICAgICAgICAgICkgOlxyXG4gICAgICAgICAgICAgICAgaXRlbVJlY3Vyc2l2ZSA/XHJcbiAgICAgICAgICAgICAgICAgIG51bGwgOiBjbG9uZURlZXAoanNmLnRlbXBsYXRlUmVmTGlicmFyeVtpdGVtUmVmUG9pbnRlcl0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiAnYWRkaXRpb25hbEl0ZW1zJyBpcyBhbiBvYmplY3QgPSBhZGRpdGlvbmFsIGxpc3QgaXRlbXMgKGFmdGVyIHR1cGxlIGl0ZW1zKVxyXG4gICAgICAgIGlmIChzY2hlbWEuaXRlbXMubGVuZ3RoIDwgbWF4SXRlbXMgJiYgaXNPYmplY3Qoc2NoZW1hLmFkZGl0aW9uYWxJdGVtcykpIHtcclxuICAgICAgICAgIGFkZGl0aW9uYWxJdGVtc1BvaW50ZXIgPSBzY2hlbWFQb2ludGVyICsgJy9hZGRpdGlvbmFsSXRlbXMnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgJ2l0ZW1zJyBpcyBhbiBvYmplY3QgPSBsaXN0IGl0ZW1zIG9ubHkgKG5vIHR1cGxlIGl0ZW1zKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGFkZGl0aW9uYWxJdGVtc1BvaW50ZXIgPSBzY2hlbWFQb2ludGVyICsgJy9pdGVtcyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChhZGRpdGlvbmFsSXRlbXNQb2ludGVyKSB7XHJcbiAgICAgICAgY29uc3Qgc2NoZW1hUmVmUG9pbnRlciA9IHJlbW92ZVJlY3Vyc2l2ZVJlZmVyZW5jZXMoXHJcbiAgICAgICAgICBhZGRpdGlvbmFsSXRlbXNQb2ludGVyLCBqc2Yuc2NoZW1hUmVjdXJzaXZlUmVmTWFwXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBpdGVtUmVmUG9pbnRlciA9IHJlbW92ZVJlY3Vyc2l2ZVJlZmVyZW5jZXMoXHJcbiAgICAgICAgICBzaG9ydERhdGFQb2ludGVyICsgJy8tJywganNmLmRhdGFSZWN1cnNpdmVSZWZNYXAsIGpzZi5hcnJheU1hcFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgaXRlbVJlY3Vyc2l2ZSA9IGl0ZW1SZWZQb2ludGVyICE9PSBzaG9ydERhdGFQb2ludGVyICsgJy8tJztcclxuICAgICAgICBpZiAoIWhhc093bihqc2YudGVtcGxhdGVSZWZMaWJyYXJ5LCBpdGVtUmVmUG9pbnRlcikpIHtcclxuICAgICAgICAgIGpzZi50ZW1wbGF0ZVJlZkxpYnJhcnlbaXRlbVJlZlBvaW50ZXJdID0gbnVsbDtcclxuICAgICAgICAgIGpzZi50ZW1wbGF0ZVJlZkxpYnJhcnlbaXRlbVJlZlBvaW50ZXJdID0gYnVpbGRGb3JtR3JvdXBUZW1wbGF0ZShcclxuICAgICAgICAgICAganNmLCBudWxsLCBzZXRWYWx1ZXMsXHJcbiAgICAgICAgICAgIHNjaGVtYVJlZlBvaW50ZXIsXHJcbiAgICAgICAgICAgIGl0ZW1SZWZQb2ludGVyLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVBvaW50ZXIgKyAnL2NvbnRyb2xzLy0nXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjb25zdCBpdGVtT3B0aW9ucyA9IGpzZi5kYXRhTWFwLmdldChpdGVtUmVmUG9pbnRlcikgfHwgbmV3IE1hcCgpO1xyXG4gICAgICAgIGNvbnN0IGl0ZW1PcHRpb25zID0gbm9kZU9wdGlvbnM7XHJcbiAgICAgICAgaWYgKCFpdGVtUmVjdXJzaXZlIHx8IGhhc093bih2YWxpZGF0b3JzLCAncmVxdWlyZWQnKSkge1xyXG4gICAgICAgICAgY29uc3QgYXJyYXlMZW5ndGggPSBNYXRoLm1pbihNYXRoLm1heChcclxuICAgICAgICAgICAgaXRlbVJlY3Vyc2l2ZSA/IDAgOlxyXG4gICAgICAgICAgICAgIChpdGVtT3B0aW9ucy5nZXQoJ3R1cGxlSXRlbXMnKSArIGl0ZW1PcHRpb25zLmdldCgnbGlzdEl0ZW1zJykpIHx8IDAsXHJcbiAgICAgICAgICAgIGlzQXJyYXkobm9kZVZhbHVlKSA/IG5vZGVWYWx1ZS5sZW5ndGggOiAwXHJcbiAgICAgICAgICApLCBtYXhJdGVtcyk7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gY29udHJvbHMubGVuZ3RoOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb250cm9scy5wdXNoKFxyXG4gICAgICAgICAgICAgIGlzQXJyYXkobm9kZVZhbHVlKSA/XHJcbiAgICAgICAgICAgICAgICBidWlsZEZvcm1Hcm91cFRlbXBsYXRlKFxyXG4gICAgICAgICAgICAgICAgICBqc2YsIG5vZGVWYWx1ZVtpXSwgc2V0VmFsdWVzLFxyXG4gICAgICAgICAgICAgICAgICBzY2hlbWFSZWZQb2ludGVyLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhUG9pbnRlciArICcvLScsXHJcbiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUG9pbnRlciArICcvY29udHJvbHMvLSdcclxuICAgICAgICAgICAgICAgICkgOlxyXG4gICAgICAgICAgICAgICAgaXRlbVJlY3Vyc2l2ZSA/XHJcbiAgICAgICAgICAgICAgICAgIG51bGwgOiBjbG9uZURlZXAoanNmLnRlbXBsYXRlUmVmTGlicmFyeVtpdGVtUmVmUG9pbnRlcl0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB7IGNvbnRyb2xUeXBlLCBjb250cm9scywgdmFsaWRhdG9ycyxzY2hlbWFQb2ludGVyIH07XHJcblxyXG4gICAgY2FzZSAnJHJlZic6XHJcbiAgICAgIGNvbnN0IHNjaGVtYVJlZiA9IEpzb25Qb2ludGVyLmNvbXBpbGUoc2NoZW1hLiRyZWYpO1xyXG4gICAgICBjb25zdCBkYXRhUmVmID0gSnNvblBvaW50ZXIudG9EYXRhUG9pbnRlcihzY2hlbWFSZWYsIHNjaGVtYSk7XHJcbiAgICAgIGNvbnN0IHJlZlBvaW50ZXIgPSByZW1vdmVSZWN1cnNpdmVSZWZlcmVuY2VzKFxyXG4gICAgICAgIGRhdGFSZWYsIGpzZi5kYXRhUmVjdXJzaXZlUmVmTWFwLCBqc2YuYXJyYXlNYXBcclxuICAgICAgKTtcclxuICAgICAgaWYgKHJlZlBvaW50ZXIgJiYgIWhhc093bihqc2YudGVtcGxhdGVSZWZMaWJyYXJ5LCByZWZQb2ludGVyKSkge1xyXG4gICAgICAgIC8vIFNldCB0byBudWxsIGZpcnN0IHRvIHByZXZlbnQgcmVjdXJzaXZlIHJlZmVyZW5jZSBmcm9tIGNhdXNpbmcgZW5kbGVzcyBsb29wXHJcbiAgICAgICAganNmLnRlbXBsYXRlUmVmTGlicmFyeVtyZWZQb2ludGVyXSA9IG51bGw7XHJcbiAgICAgICAgY29uc3QgbmV3VGVtcGxhdGUgPSBidWlsZEZvcm1Hcm91cFRlbXBsYXRlKGpzZiwgc2V0VmFsdWVzLCBzZXRWYWx1ZXMsIHNjaGVtYVJlZik7XHJcbiAgICAgICAgaWYgKG5ld1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICBqc2YudGVtcGxhdGVSZWZMaWJyYXJ5W3JlZlBvaW50ZXJdID0gbmV3VGVtcGxhdGU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGRlbGV0ZSBqc2YudGVtcGxhdGVSZWZMaWJyYXJ5W3JlZlBvaW50ZXJdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBjYXNlICdGb3JtQ29udHJvbCc6XHJcbiAgICAgIGNvbnN0IHZhbHVlID0ge1xyXG4gICAgICAgIHZhbHVlOiBzZXRWYWx1ZXMgJiYgaXNQcmltaXRpdmUobm9kZVZhbHVlKSA/IG5vZGVWYWx1ZSA6IG51bGwsXHJcbiAgICAgICAgZGlzYWJsZWQ6IG5vZGVPcHRpb25zLmdldCgnZGlzYWJsZWQnKSB8fCBmYWxzZVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4geyBjb250cm9sVHlwZSwgdmFsdWUsIHZhbGlkYXRvcnMsc2NoZW1hUG9pbnRlciB9O1xyXG5cclxuICAgIC8vVE9ETyBtYXkgbWFrZSBhbiBJRlRoZW5FbHNlIHdpZGdldCBvciBpbnRlZ3JhdGUgaXQgd2l0aCB0aGUgc2VjdGlvblxyXG4gICAgLy93aWRnZXQgIFxyXG4gICAgY2FzZSAnSWZUaGVuRWxzZSc6XHJcbiAgICAgIGNvbnRyb2xzID0ge307XHJcbiAgICAgIGxldCBjb25kaXRpb25UeXBlO1xyXG4gICAgICBpZiAoaGFzT3duKHNjaGVtYSwgXCJpZlwiKSkge1xyXG4gICAgICAgIFtcInRoZW5cIiwgXCJlbHNlXCJdLmZvckVhY2goY29uID0+IHtcclxuICAgICAgICAgIGlmIChoYXNPd24oc2NoZW1hLCBjb24pKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleVNjaGVtYVBvaW50ZXIgPSBgLyR7Y29ufWA7XHJcbiAgICAgICAgICAgIGxldCB0aGVuVEZHVGVtcGxhdGUgPSBidWlsZEZvcm1Hcm91cFRlbXBsYXRlKFxyXG4gICAgICAgICAgICAgIGpzZiwgbm9kZVZhbHVlLCBzZXRWYWx1ZXMsLy9mYWxzZSxcclxuICAgICAgICAgICAgICBzY2hlbWFQb2ludGVyICsga2V5U2NoZW1hUG9pbnRlcixcclxuICAgICAgICAgICAgICBkYXRhUG9pbnRlcixcclxuICAgICAgICAgICAgICB0ZW1wbGF0ZVBvaW50ZXIgKyBgL2NvbnRyb2xzLyR7Y29ufWBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgLy9OQiBzYW1lIHByb3BlcnR5IGNhbiBiZSBpbiBib3RoIHRoZW4gYW5kIGVsc2VcclxuICAgICAgICAgICAgLy9zbyBrZXkgbXVzdCBiZSB0aGUgdW5pcXVlIHBhdGggdG8gY29udHJvbFxyXG4gICAgICAgICAgIFxyXG4gICAgICAgICAgICAvL2xldCBpZkl0ZW1TY2hlbWE9SnNvblBvaW50ZXIuZ2V0KHNjaGVtYSxrZXlTY2hlbWFQb2ludGVyKTtcclxuICAgICAgICAgICAgLy9sZXQgaWZJdGVtVmFsdWU7XHJcbiAgICAgICAgICAgIGlmKGhhc093bih0aGVuVEZHVGVtcGxhdGUsJ2NvbnRyb2xzJykpe1xyXG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoZW5URkdUZW1wbGF0ZS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvbnRyb2xLZXkgPSB0aGVuVEZHVGVtcGxhdGUuY29udHJvbHNba2V5XS5zY2hlbWFQb2ludGVyO1xyXG4gICAgICAgICAgICAgICAgaWYoY29udHJvbEtleSl7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnRyb2xLZXkgPSBwYXRoMkNvbnRyb2xLZXkoY29udHJvbEtleSk7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBjSXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIHRoZW5URkdUZW1wbGF0ZS5jb250cm9sc1trZXldKTtcclxuICBcclxuICAgICAgICAgICAgICAgICAgY29udHJvbHNbY29udHJvbEtleV0gPSBjSXRlbTtcclxuICAgICAgICAgICAgICAgIH0gIFxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHsgY29udHJvbFR5cGUsIGNvbnRyb2xzLCB2YWxpZGF0b3JzLHNjaGVtYVBvaW50ZXIgfTtcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqICdidWlsZEZvcm1Hcm91cCcgZnVuY3Rpb25cclxuICpcclxuICogLy8ge2FueX0gdGVtcGxhdGUgLVxyXG4gKiAvLyB7QWJzdHJhY3RDb250cm9sfVxyXG4qL1xyXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRGb3JtR3JvdXAodGVtcGxhdGU6IGFueSk6IEFic3RyYWN0Q29udHJvbCB7XHJcbiAgY29uc3QgdmFsaWRhdG9yRm5zOiBWYWxpZGF0b3JGbltdID0gW107XHJcbiAgbGV0IHZhbGlkYXRvckZuOiBWYWxpZGF0b3JGbiA9IG51bGw7XHJcbiAgaWYgKGhhc093bih0ZW1wbGF0ZSwgJ3ZhbGlkYXRvcnMnKSkge1xyXG4gICAgZm9yRWFjaCh0ZW1wbGF0ZS52YWxpZGF0b3JzLCAocGFyYW1ldGVycywgdmFsaWRhdG9yKSA9PiB7XHJcbiAgICAgIGlmICh0eXBlb2YgSnNvblZhbGlkYXRvcnNbdmFsaWRhdG9yXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIHZhbGlkYXRvckZucy5wdXNoKEpzb25WYWxpZGF0b3JzW3ZhbGlkYXRvcl0uYXBwbHkobnVsbCwgcGFyYW1ldGVycykpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmICh2YWxpZGF0b3JGbnMubGVuZ3RoICYmXHJcbiAgICAgIGluQXJyYXkodGVtcGxhdGUuY29udHJvbFR5cGUsIFsnRm9ybUdyb3VwJywgJ0Zvcm1BcnJheSddKVxyXG4gICAgKSB7XHJcbiAgICAgIHZhbGlkYXRvckZuID0gdmFsaWRhdG9yRm5zLmxlbmd0aCA+IDEgP1xyXG4gICAgICAgIEpzb25WYWxpZGF0b3JzLmNvbXBvc2UodmFsaWRhdG9yRm5zKSA6IHZhbGlkYXRvckZuc1swXTtcclxuICAgIH1cclxuICB9XHJcbiAgaWYgKGhhc093bih0ZW1wbGF0ZSwgJ2NvbnRyb2xUeXBlJykpIHtcclxuICAgIHN3aXRjaCAodGVtcGxhdGUuY29udHJvbFR5cGUpIHtcclxuICAgICAgY2FzZSAnRm9ybUdyb3VwJzpcclxuXHJcbiAgICAgICAgY29uc3QgZ3JvdXBDb250cm9sczogeyBba2V5OiBzdHJpbmddOiBBYnN0cmFjdENvbnRyb2wgfSA9IHt9O1xyXG4gICAgICAgIGZvckVhY2godGVtcGxhdGUuY29udHJvbHMsIChjb250cm9scywga2V5KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBuZXdDb250cm9sOiBBYnN0cmFjdENvbnRyb2wgPSBidWlsZEZvcm1Hcm91cChjb250cm9scyk7XHJcbiAgICAgICAgICAvL2lmIChuZXdDb250cm9sKSB7IGdyb3VwQ29udHJvbHNba2V5XSA9IG5ld0NvbnRyb2w7IH1cclxuICAgICAgICAgIGlmIChuZXdDb250cm9sKSB7XHJcblxyXG4gICAgICAgICAgICAvKiBleHBlcmltZW50YWwgaWRlYSB3YXMgdG8gdHJ5IHRvIGJlIGFibGUgdG8gc3dpdGNoXHJcbiAgICAgICAgICAgIGNvbmRpdGlvbmFsIGNvbnRyb2xzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZWlyIHNjaGVtYSBwb2ludGVyXHJcbiAgICAgICAgICAgIChub3QgZGF0YXBvaW50ZXIgYXMgdGhhdCBvbmx5IG1hcHMgdG8gb25lIGNvbnRyb2wpXHJcbiAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShncm91cENvbnRyb2xzLCBrZXksIHtcclxuICAgICAgICAgICAgICAgICAgICBnZXQ6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coYEFjY2Vzc2VkIGNvbnRyb2w6ICR7a2V5fWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy9hZGQgc3dpdGNoIGxvZ2ljIGhlcmVcclxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuY29udHJvbDsgXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBzZXQ6KHZhbHVlKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgbmNvbnRyb2w9dmFsdWVcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcclxuICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgZ3JvdXBDb250cm9sc1trZXldID0gbmV3Q29udHJvbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gbmV3IFVudHlwZWRGb3JtR3JvdXAoZ3JvdXBDb250cm9scywgdmFsaWRhdG9yRm4pO1xyXG4gICAgICBjYXNlICdGb3JtQXJyYXknOlxyXG4gICAgICAgIHJldHVybiBuZXcgVW50eXBlZEZvcm1BcnJheShmaWx0ZXIobWFwKHRlbXBsYXRlLmNvbnRyb2xzLFxyXG4gICAgICAgICAgY29udHJvbHMgPT4gYnVpbGRGb3JtR3JvdXAoY29udHJvbHMpXHJcbiAgICAgICAgKSksIHZhbGlkYXRvckZuKTtcclxuICAgICAgY2FzZSAnRm9ybUNvbnRyb2wnOlxyXG4gICAgICAgIHJldHVybiBuZXcgVW50eXBlZEZvcm1Db250cm9sKHRlbXBsYXRlLnZhbHVlLCB2YWxpZGF0b3JGbnMpO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gbnVsbDtcclxufVxyXG5cclxuLyoqXHJcbiAqICdtZXJnZVZhbHVlcycgZnVuY3Rpb25cclxuICpcclxuICogLy8gIHthbnlbXX0gLi4udmFsdWVzVG9NZXJnZSAtIE11bHRpcGxlIHZhbHVlcyB0byBtZXJnZVxyXG4gKiAvLyB7YW55fSAtIE1lcmdlZCB2YWx1ZXNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVZhbHVlcyguLi52YWx1ZXNUb01lcmdlKSB7XHJcbiAgbGV0IG1lcmdlZFZhbHVlczogYW55ID0gbnVsbDtcclxuICBmb3IgKGNvbnN0IGN1cnJlbnRWYWx1ZSBvZiB2YWx1ZXNUb01lcmdlKSB7XHJcbiAgICBpZiAoIWlzRW1wdHkoY3VycmVudFZhbHVlKSkge1xyXG4gICAgICBpZiAodHlwZW9mIGN1cnJlbnRWYWx1ZSA9PT0gJ29iamVjdCcgJiZcclxuICAgICAgICAoaXNFbXB0eShtZXJnZWRWYWx1ZXMpIHx8IHR5cGVvZiBtZXJnZWRWYWx1ZXMgIT09ICdvYmplY3QnKVxyXG4gICAgICApIHtcclxuICAgICAgICBpZiAoaXNBcnJheShjdXJyZW50VmFsdWUpKSB7XHJcbiAgICAgICAgICBtZXJnZWRWYWx1ZXMgPSBbLi4uY3VycmVudFZhbHVlXTtcclxuICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGN1cnJlbnRWYWx1ZSkpIHtcclxuICAgICAgICAgIG1lcmdlZFZhbHVlcyA9IHsgLi4uY3VycmVudFZhbHVlIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjdXJyZW50VmFsdWUgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgbWVyZ2VkVmFsdWVzID0gY3VycmVudFZhbHVlO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KG1lcmdlZFZhbHVlcykgJiYgaXNPYmplY3QoY3VycmVudFZhbHVlKSkge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24obWVyZ2VkVmFsdWVzLCBjdXJyZW50VmFsdWUpO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KG1lcmdlZFZhbHVlcykgJiYgaXNBcnJheShjdXJyZW50VmFsdWUpKSB7XHJcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBjdXJyZW50VmFsdWUpIHtcclxuICAgICAgICAgIG5ld1ZhbHVlcy5wdXNoKG1lcmdlVmFsdWVzKG1lcmdlZFZhbHVlcywgdmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbWVyZ2VkVmFsdWVzID0gbmV3VmFsdWVzO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzQXJyYXkobWVyZ2VkVmFsdWVzKSAmJiBpc09iamVjdChjdXJyZW50VmFsdWUpKSB7XHJcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBtZXJnZWRWYWx1ZXMpIHtcclxuICAgICAgICAgIG5ld1ZhbHVlcy5wdXNoKG1lcmdlVmFsdWVzKHZhbHVlLCBjdXJyZW50VmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbWVyZ2VkVmFsdWVzID0gbmV3VmFsdWVzO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzQXJyYXkobWVyZ2VkVmFsdWVzKSAmJiBpc0FycmF5KGN1cnJlbnRWYWx1ZSkpIHtcclxuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWF4KG1lcmdlZFZhbHVlcy5sZW5ndGgsIGN1cnJlbnRWYWx1ZS5sZW5ndGgpOyBpKyspIHtcclxuICAgICAgICAgIGlmIChpIDwgbWVyZ2VkVmFsdWVzLmxlbmd0aCAmJiBpIDwgY3VycmVudFZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBuZXdWYWx1ZXMucHVzaChtZXJnZVZhbHVlcyhtZXJnZWRWYWx1ZXNbaV0sIGN1cnJlbnRWYWx1ZVtpXSkpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChpIDwgbWVyZ2VkVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBuZXdWYWx1ZXMucHVzaChtZXJnZWRWYWx1ZXNbaV0pO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChpIDwgY3VycmVudFZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBuZXdWYWx1ZXMucHVzaChjdXJyZW50VmFsdWVbaV0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBtZXJnZWRWYWx1ZXMgPSBuZXdWYWx1ZXM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIG1lcmdlZFZhbHVlcztcclxufVxyXG5cclxuLyoqXHJcbiAqICdzZXRSZXF1aXJlZEZpZWxkcycgZnVuY3Rpb25cclxuICpcclxuICogLy8ge3NjaGVtYX0gc2NoZW1hIC0gSlNPTiBTY2hlbWFcclxuICogLy8ge29iamVjdH0gZm9ybUNvbnRyb2xUZW1wbGF0ZSAtIEZvcm0gQ29udHJvbCBUZW1wbGF0ZSBvYmplY3RcclxuICogLy8ge2Jvb2xlYW59IC0gdHJ1ZSBpZiBhbnkgZmllbGRzIGhhdmUgYmVlbiBzZXQgdG8gcmVxdWlyZWQsIGZhbHNlIGlmIG5vdFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFJlcXVpcmVkRmllbGRzKHNjaGVtYTogYW55LCBmb3JtQ29udHJvbFRlbXBsYXRlOiBhbnkpOiBib29sZWFuIHtcclxuICBsZXQgZmllbGRzUmVxdWlyZWQgPSBmYWxzZTtcclxuICBpZiAoaGFzT3duKHNjaGVtYSwgJ3JlcXVpcmVkJykgJiYgIWlzRW1wdHkoc2NoZW1hLnJlcXVpcmVkKSkge1xyXG4gICAgZmllbGRzUmVxdWlyZWQgPSB0cnVlO1xyXG4gICAgbGV0IHJlcXVpcmVkQXJyYXkgPSBpc0FycmF5KHNjaGVtYS5yZXF1aXJlZCkgPyBzY2hlbWEucmVxdWlyZWQgOiBbc2NoZW1hLnJlcXVpcmVkXTtcclxuICAgIHJlcXVpcmVkQXJyYXkgPSBmb3JFYWNoKHJlcXVpcmVkQXJyYXksXHJcbiAgICAgIGtleSA9PiBKc29uUG9pbnRlci5zZXQoZm9ybUNvbnRyb2xUZW1wbGF0ZSwgJy8nICsga2V5ICsgJy92YWxpZGF0b3JzL3JlcXVpcmVkJywgW10pXHJcbiAgICApO1xyXG4gIH1cclxuICByZXR1cm4gZmllbGRzUmVxdWlyZWQ7XHJcblxyXG4gIC8vIFRPRE86IEFkZCBzdXBwb3J0IGZvciBwYXR0ZXJuUHJvcGVydGllc1xyXG4gIC8vIGh0dHBzOi8vc3BhY2V0ZWxlc2NvcGUuZ2l0aHViLmlvL3VuZGVyc3RhbmRpbmctanNvbi1zY2hlbWEvcmVmZXJlbmNlL29iamVjdC5odG1sI3BhdHRlcm4tcHJvcGVydGllc1xyXG59XHJcblxyXG4vKipcclxuICogJ2Zvcm1hdEZvcm1EYXRhJyBmdW5jdGlvblxyXG4gKlxyXG4gKiAvLyB7YW55fSBmb3JtRGF0YSAtIEFuZ3VsYXIgRm9ybUdyb3VwIGRhdGEgb2JqZWN0XHJcbiAqIC8vIHtNYXA8c3RyaW5nLCBhbnk+fSBkYXRhTWFwIC1cclxuICogLy8ge01hcDxzdHJpbmcsIHN0cmluZz59IHJlY3Vyc2l2ZVJlZk1hcCAtXHJcbiAqIC8vIHtNYXA8c3RyaW5nLCBudW1iZXI+fSBhcnJheU1hcCAtXHJcbiAqIC8vIHtib29sZWFuID0gZmFsc2V9IGZpeEVycm9ycyAtIGlmIFRSVUUsIHRyaWVzIHRvIGZpeCBkYXRhXHJcbiAqIC8vIHthbnl9IC0gZm9ybWF0dGVkIGRhdGEgb2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0Rm9ybURhdGEoXHJcbiAgZm9ybURhdGE6IGFueSwgZGF0YU1hcDogTWFwPHN0cmluZywgYW55PixcclxuICByZWN1cnNpdmVSZWZNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4sIGFycmF5TWFwOiBNYXA8c3RyaW5nLCBudW1iZXI+LFxyXG4gIHJldHVybkVtcHR5RmllbGRzID0gZmFsc2UsIGZpeEVycm9ycyA9IGZhbHNlXHJcbik6IGFueSB7XHJcbiAgaWYgKGZvcm1EYXRhID09PSBudWxsIHx8IHR5cGVvZiBmb3JtRGF0YSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZvcm1EYXRhOyB9XHJcbiAgY29uc3QgZm9ybWF0dGVkRGF0YSA9IGlzQXJyYXkoZm9ybURhdGEpID8gW10gOiB7fTtcclxuICBKc29uUG9pbnRlci5mb3JFYWNoRGVlcChmb3JtRGF0YSwgKHZhbHVlLCBkYXRhUG9pbnRlcikgPT4ge1xyXG5cclxuICAgIC8vIElmIHJldHVybkVtcHR5RmllbGRzID09PSB0cnVlLFxyXG4gICAgLy8gYWRkIGVtcHR5IGFycmF5cyBhbmQgb2JqZWN0cyB0byBhbGwgYWxsb3dlZCBrZXlzXHJcbiAgICBpZiAocmV0dXJuRW1wdHlGaWVsZHMgJiYgaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgSnNvblBvaW50ZXIuc2V0KGZvcm1hdHRlZERhdGEsIGRhdGFQb2ludGVyLCBbXSk7XHJcbiAgICB9IGVsc2UgaWYgKHJldHVybkVtcHR5RmllbGRzICYmIGlzT2JqZWN0KHZhbHVlKSAmJiAhaXNEYXRlKHZhbHVlKSkge1xyXG4gICAgICBKc29uUG9pbnRlci5zZXQoZm9ybWF0dGVkRGF0YSwgZGF0YVBvaW50ZXIsIHt9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGdlbmVyaWNQb2ludGVyID1cclxuICAgICAgICBKc29uUG9pbnRlci5oYXMoZGF0YU1hcCwgW2RhdGFQb2ludGVyLCAnc2NoZW1hVHlwZSddKSA/IGRhdGFQb2ludGVyIDpcclxuICAgICAgICAgIHJlbW92ZVJlY3Vyc2l2ZVJlZmVyZW5jZXMoZGF0YVBvaW50ZXIsIHJlY3Vyc2l2ZVJlZk1hcCwgYXJyYXlNYXApO1xyXG4gICAgICBpZiAoSnNvblBvaW50ZXIuaGFzKGRhdGFNYXAsIFtnZW5lcmljUG9pbnRlciwgJ3NjaGVtYVR5cGUnXSkpIHtcclxuICAgICAgICBjb25zdCBzY2hlbWFUeXBlOiBTY2hlbWFQcmltaXRpdmVUeXBlIHwgU2NoZW1hUHJpbWl0aXZlVHlwZVtdID1cclxuICAgICAgICAgIGRhdGFNYXAuZ2V0KGdlbmVyaWNQb2ludGVyKS5nZXQoJ3NjaGVtYVR5cGUnKTtcclxuICAgICAgICBpZiAoc2NoZW1hVHlwZSA9PT0gJ251bGwnKSB7XHJcbiAgICAgICAgICBKc29uUG9pbnRlci5zZXQoZm9ybWF0dGVkRGF0YSwgZGF0YVBvaW50ZXIsIG51bGwpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoKGhhc1ZhbHVlKHZhbHVlKSB8fCByZXR1cm5FbXB0eUZpZWxkcykgJiZcclxuICAgICAgICAgIGluQXJyYXkoc2NoZW1hVHlwZSwgWydzdHJpbmcnLCAnaW50ZWdlcicsICdudW1iZXInLCAnYm9vbGVhbiddKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSAoZml4RXJyb3JzIHx8ICh2YWx1ZSA9PT0gbnVsbCAmJiByZXR1cm5FbXB0eUZpZWxkcykpID9cclxuICAgICAgICAgICAgdG9TY2hlbWFUeXBlKHZhbHVlLCBzY2hlbWFUeXBlKSA6IHRvSmF2YVNjcmlwdFR5cGUodmFsdWUsIHNjaGVtYVR5cGUpO1xyXG4gICAgICAgICAgaWYgKGlzRGVmaW5lZChuZXdWYWx1ZSkgfHwgcmV0dXJuRW1wdHlGaWVsZHMpIHtcclxuICAgICAgICAgICAgSnNvblBvaW50ZXIuc2V0KGZvcm1hdHRlZERhdGEsIGRhdGFQb2ludGVyLCBuZXdWYWx1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgLy8gY29tbWVudGVkIG91dCBjb21wbGV0ZWx5IGFzIHZhbHVlIGNhbiBiZSAnbnVsbCcgaWYgbm90IGVudGVyZWRcclxuXHJcbiAgICAgICAgLy8gRmluaXNoIGluY29tcGxldGUgJ2RhdGUtdGltZScgZW50cmllc1xyXG4gICAgICAgIC8vIGlmIChkYXRhTWFwLmdldChnZW5lcmljUG9pbnRlcikuZ2V0KCdzY2hlbWFGb3JtYXQnKSA9PT0gJ2RhdGUtdGltZScpIHtcclxuXHJcbiAgICAgICAgLy8gICAvKiBjb21tZW50ZWQgb3V0LXNob3VsZCB1c2Ugc2FtZSBmb3JtYXQgYXMgZGF0ZXRpbWUtbG9jYWwgaW5wdXRcclxuICAgICAgICAvLyAgIGZvciBpbml0aWFsIGRhdGEgdG8gYmluZCBiYWNrIHRvIHRoZSBpbnB1dFxyXG4gICAgICAgIC8vICAgLy8gXCIyMDAwLTAzLTE0VDAxOjU5OjI2LjUzNVwiIC0+IFwiMjAwMC0wMy0xNFQwMTo1OToyNi41MzVaXCIgKGFkZCBcIlpcIilcclxuICAgICAgICAvLyAgIGlmICgvXlxcZFxcZFxcZFxcZC1bMC0xXVxcZC1bMC0zXVxcZFt0XFxzXVswLTJdXFxkOlswLTVdXFxkOlswLTVdXFxkKD86XFwuXFxkKyk/JC9pLnRlc3QodmFsdWUpKSB7XHJcbiAgICAgICAgLy8gICAgIEpzb25Qb2ludGVyLnNldChmb3JtYXR0ZWREYXRhLCBkYXRhUG9pbnRlciwgYCR7dmFsdWV9WmApO1xyXG4gICAgICAgIC8vICAgICAvLyBcIjIwMDAtMDMtMTRUMDE6NTlcIiAtPiBcIjIwMDAtMDMtMTRUMDE6NTk6MDBaXCIgKGFkZCBcIjowMFpcIilcclxuICAgICAgICAvLyAgIH0gZWxzZSBpZiAoL15cXGRcXGRcXGRcXGQtWzAtMV1cXGQtWzAtM11cXGRbdFxcc11bMC0yXVxcZDpbMC01XVxcZCQvaS50ZXN0KHZhbHVlKSkge1xyXG4gICAgICAgIC8vICAgICBKc29uUG9pbnRlci5zZXQoZm9ybWF0dGVkRGF0YSwgZGF0YVBvaW50ZXIsIGAke3ZhbHVlfTowMFpgKTtcclxuICAgICAgICAvLyAgICAgLy8gXCIyMDAwLTAzLTE0XCIgLT4gXCIyMDAwLTAzLTE0VDAwOjAwOjAwWlwiIChhZGQgXCJUMDA6MDA6MDBaXCIpXHJcbiAgICAgICAgLy8gICB9IGVsc2UgaWYgKGZpeEVycm9ycyAmJiAvXlxcZFxcZFxcZFxcZC1bMC0xXVxcZC1bMC0zXVxcZCQvaS50ZXN0KHZhbHVlKSkge1xyXG4gICAgICAgIC8vICAgICBKc29uUG9pbnRlci5zZXQoZm9ybWF0dGVkRGF0YSwgZGF0YVBvaW50ZXIsIGAke3ZhbHVlfTowMDowMDowMFpgKTtcclxuICAgICAgICAvLyAgIH1cclxuICAgICAgICAvLyAgICovXHJcbiAgICAgICAgLy8gICBKc29uUG9pbnRlci5zZXQoZm9ybWF0dGVkRGF0YSwgZGF0YVBvaW50ZXIsIGAke3ZhbHVlfWApO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IGlzRGF0ZSh2YWx1ZSkgfHxcclxuICAgICAgICAodmFsdWUgPT09IG51bGwgJiYgcmV0dXJuRW1wdHlGaWVsZHMpXHJcbiAgICAgICkge1xyXG4gICAgICAgIGlmIChnZW5lcmljUG9pbnRlci5pbmRleE9mKFwiLyRcIik+PTApIHtcclxuICAgICAgICAgIHJldHVybiBmb3JtYXR0ZWREYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zb2xlLmVycm9yKCdmb3JtYXRGb3JtRGF0YSBlcnJvcjogJyArXHJcbiAgICAgICAgICBgU2NoZW1hIHR5cGUgbm90IGZvdW5kIGZvciBmb3JtIHZhbHVlIGF0ICR7Z2VuZXJpY1BvaW50ZXJ9YCk7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignZGF0YU1hcCcsIGRhdGFNYXApO1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3JlY3Vyc2l2ZVJlZk1hcCcsIHJlY3Vyc2l2ZVJlZk1hcCk7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignZ2VuZXJpY1BvaW50ZXInLCBnZW5lcmljUG9pbnRlcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxuICByZXR1cm4gZm9ybWF0dGVkRGF0YTtcclxufVxyXG5cclxuLyoqXHJcbiAqICdnZXRDb250cm9sJyBmdW5jdGlvblxyXG4gKlxyXG4gKiBVc2VzIGEgSlNPTiBQb2ludGVyIGZvciBhIGRhdGEgb2JqZWN0IHRvIHJldHJpZXZlIGEgY29udHJvbCBmcm9tXHJcbiAqIGFuIEFuZ3VsYXIgZm9ybUdyb3VwIG9yIGZvcm1Hcm91cCB0ZW1wbGF0ZS4gKE5vdGU6IHRob3VnaCBhIGZvcm1Hcm91cFxyXG4gKiB0ZW1wbGF0ZSBpcyBtdWNoIHNpbXBsZXIsIGl0cyBiYXNpYyBzdHJ1Y3R1cmUgaXMgaWRlbnRpYWwgdG8gYSBmb3JtR3JvdXApLlxyXG4gKlxyXG4gKiBJZiB0aGUgb3B0aW9uYWwgdGhpcmQgcGFyYW1ldGVyICdyZXR1cm5Hcm91cCcgaXMgc2V0IHRvIFRSVUUsIHRoZSBncm91cFxyXG4gKiBjb250YWluaW5nIHRoZSBjb250cm9sIGlzIHJldHVybmVkLCByYXRoZXIgdGhhbiB0aGUgY29udHJvbCBpdHNlbGYuXHJcbiAqXHJcbiAqIC8vIHtGb3JtR3JvdXB9IGZvcm1Hcm91cCAtIEFuZ3VsYXIgRm9ybUdyb3VwIHRvIGdldCB2YWx1ZSBmcm9tXHJcbiAqIC8vIHtQb2ludGVyfSBkYXRhUG9pbnRlciAtIEpTT04gUG9pbnRlciAoc3RyaW5nIG9yIGFycmF5KVxyXG4gKiAvLyB7Ym9vbGVhbiA9IGZhbHNlfSByZXR1cm5Hcm91cCAtIElmIHRydWUsIHJldHVybiBncm91cCBjb250YWluaW5nIGNvbnRyb2xcclxuICogLy8ge2dyb3VwfSAtIExvY2F0ZWQgdmFsdWUgKG9yIG51bGwsIGlmIG5vIGNvbnRyb2wgZm91bmQpXHJcbiAqIC8vIHtzdHJpbmd9IHNjaGVtYVBvaW50ZXIgLSBzdHJpbmcgdXNlZCBmb3IgY29uZGl0aW9uYWwgY29udHJvbHMgY29taW5nIGZyb20gc2NoZW1hIGlmL3RoZW4vZWxzZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRyb2woXHJcbiAgZm9ybUdyb3VwOiBhbnksIGRhdGFQb2ludGVyOiBQb2ludGVyLCByZXR1cm5Hcm91cCA9IGZhbHNlLCBzY2hlbWFQb2ludGVyPzogc3RyaW5nXHJcbik6IGFueSB7XHJcbiAgaWYgKCFpc09iamVjdChmb3JtR3JvdXApIHx8ICFKc29uUG9pbnRlci5pc0pzb25Qb2ludGVyKGRhdGFQb2ludGVyKSkge1xyXG4gICAgaWYgKCFKc29uUG9pbnRlci5pc0pzb25Qb2ludGVyKGRhdGFQb2ludGVyKSkge1xyXG4gICAgICAvLyBJZiBkYXRhUG9pbnRlciBpbnB1dCBpcyBub3QgYSB2YWxpZCBKU09OIHBvaW50ZXIsIGNoZWNrIHRvXHJcbiAgICAgIC8vIHNlZSBpZiBpdCBpcyBpbnN0ZWFkIGEgdmFsaWQgb2JqZWN0IHBhdGgsIHVzaW5nIGRvdCBub3RhaW9uXHJcbiAgICAgIGlmICh0eXBlb2YgZGF0YVBvaW50ZXIgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29uc3QgY29udHJvbFBhdGg9ISFzY2hlbWFQb2ludGVyP3BhdGgyQ29udHJvbEtleShzY2hlbWFQb2ludGVyKTpkYXRhUG9pbnRlclxyXG4gICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gZm9ybUdyb3VwLmdldChjb250cm9sUGF0aCk7XHJcbiAgICAgICAgaWYgKGZvcm1Db250cm9sKSB7IHJldHVybiBmb3JtQ29udHJvbDsgfVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoYGdldENvbnRyb2wgZXJyb3I6IEludmFsaWQgSlNPTiBQb2ludGVyOiAke2RhdGFQb2ludGVyfWApO1xyXG4gICAgfVxyXG4gICAgaWYgKCFpc09iamVjdChmb3JtR3JvdXApKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoYGdldENvbnRyb2wgZXJyb3I6IEludmFsaWQgZm9ybUdyb3VwOiAke2Zvcm1Hcm91cH1gKTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICBsZXQgZGF0YVBvaW50ZXJBcnJheSA9IEpzb25Qb2ludGVyLnBhcnNlKGRhdGFQb2ludGVyKTtcclxuICBpZiAocmV0dXJuR3JvdXApIHsgZGF0YVBvaW50ZXJBcnJheSA9IGRhdGFQb2ludGVyQXJyYXkuc2xpY2UoMCwgLTEpOyB9XHJcblxyXG4gIC8vIElmIGZvcm1Hcm91cCBpbnB1dCBpcyBhIHJlYWwgZm9ybUdyb3VwIChub3QgYSBmb3JtR3JvdXAgdGVtcGxhdGUpXHJcbiAgLy8gdHJ5IHVzaW5nIGZvcm1Hcm91cC5nZXQoKSB0byByZXR1cm4gdGhlIGNvbnRyb2xcclxuICBpZiAodHlwZW9mIGZvcm1Hcm91cC5nZXQgPT09ICdmdW5jdGlvbicgJiZcclxuICAgIGRhdGFQb2ludGVyQXJyYXkuZXZlcnkoa2V5ID0+IGtleS5pbmRleE9mKCcuJykgPT09IC0xKVxyXG4gICkge1xyXG4gICAgY29uc3QgY29udHJvbFBhdGg9ISFzY2hlbWFQb2ludGVyP3BhdGgyQ29udHJvbEtleShzY2hlbWFQb2ludGVyKTpkYXRhUG9pbnRlckFycmF5LmpvaW4oJy4nKTtcclxuICAgIGNvbnN0IGZvcm1Db250cm9sID0gIGZvcm1Hcm91cC5nZXQoY29udHJvbFBhdGgpO1xyXG4gICAgaWYgKGZvcm1Db250cm9sKSB7IHJldHVybiBmb3JtQ29udHJvbDsgfVxyXG4gIH1cclxuXHJcbiAgLy8gSWYgZm9ybUdyb3VwIGlucHV0IGlzIGEgZm9ybUdyb3VwIHRlbXBsYXRlLFxyXG4gIC8vIG9yIGZvcm1Hcm91cC5nZXQoKSBmYWlsZWQgdG8gcmV0dXJuIHRoZSBjb250cm9sLFxyXG4gIC8vIHNlYXJjaCB0aGUgZm9ybUdyb3VwIG9iamVjdCBmb3IgZGF0YVBvaW50ZXIncyBjb250cm9sXHJcbiAgbGV0IHN1Ykdyb3VwID0gZm9ybUdyb3VwO1xyXG4gIGZvciAoY29uc3Qga2V5IG9mIGRhdGFQb2ludGVyQXJyYXkpIHtcclxuICAgIGlmIChoYXNPd24oc3ViR3JvdXAsICdjb250cm9scycpKSB7IHN1Ykdyb3VwID0gc3ViR3JvdXAuY29udHJvbHM7IH1cclxuICAgIGlmIChzY2hlbWFQb2ludGVyICYmIGhhc093bihzdWJHcm91cCwgcGF0aDJDb250cm9sS2V5KHNjaGVtYVBvaW50ZXIgKSkpIHtcclxuICAgICAgc3ViR3JvdXAgPSBzdWJHcm91cFtwYXRoMkNvbnRyb2xLZXkoc2NoZW1hUG9pbnRlciApXTtcclxuICAgICAgcmV0dXJuIHN1Ykdyb3VwO1xyXG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHN1Ykdyb3VwKSAmJiAoa2V5ID09PSAnLScpKSB7XHJcbiAgICAgIHN1Ykdyb3VwID0gc3ViR3JvdXBbc3ViR3JvdXAubGVuZ3RoIC0gMV07XHJcbiAgICB9IGVsc2UgaWYgKGhhc093bihzdWJHcm91cCwga2V5KSkge1xyXG4gICAgICBzdWJHcm91cCA9IHN1Ykdyb3VwW2tleV07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGBnZXRDb250cm9sIGVycm9yOiBVbmFibGUgdG8gZmluZCBcIiR7a2V5fVwiIGl0ZW0gaW4gRm9ybUdyb3VwLmApO1xyXG4gICAgICBjb25zb2xlLmVycm9yKGRhdGFQb2ludGVyKTtcclxuICAgICAgY29uc29sZS5lcnJvcihmb3JtR3JvdXApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBzdWJHcm91cDtcclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiAnc2V0Q29udHJvbCcgZnVuY3Rpb25cclxuICpcclxuICogVXNlcyBhIEpTT04gUG9pbnRlciBmb3IgYSBkYXRhIG9iamVjdCB0byByZXRyaWV2ZSBhIGNvbnRyb2wgZnJvbVxyXG4gKiBhbiBBbmd1bGFyIGZvcm1Hcm91cCBvciBmb3JtR3JvdXAgdGVtcGxhdGUuIChOb3RlOiB0aG91Z2ggYSBmb3JtR3JvdXBcclxuICogdGVtcGxhdGUgaXMgbXVjaCBzaW1wbGVyLCBpdHMgYmFzaWMgc3RydWN0dXJlIGlzIGlkZW50aWFsIHRvIGEgZm9ybUdyb3VwKS5cclxuICpcclxuICogSWYgdGhlIG9wdGlvbmFsIHRoaXJkIHBhcmFtZXRlciAncmV0dXJuR3JvdXAnIGlzIHNldCB0byBUUlVFLCB0aGUgZ3JvdXBcclxuICogY29udGFpbmluZyB0aGUgY29udHJvbCBpcyByZXR1cm5lZCwgcmF0aGVyIHRoYW4gdGhlIGNvbnRyb2wgaXRzZWxmLlxyXG4gKlxyXG4gKiAvLyB7Rm9ybUdyb3VwfSBmb3JtR3JvdXAgLSBBbmd1bGFyIEZvcm1Hcm91cCB0byBnZXQgdmFsdWUgZnJvbVxyXG4gKiAvLyB7UG9pbnRlcn0gZGF0YVBvaW50ZXIgLSBKU09OIFBvaW50ZXIgKHN0cmluZyBvciBhcnJheSlcclxuICogLy8ge0Fic3RyYWN0Q29udHJvbH0gY29udHJvbCAtIGNvbnRyb2wgdXNlZCB0byByZXBsYWNlIGV4aXN0aW5nIG9yIGFkZFxyXG4gKiAvLyB7dGFyZ2V0S2V5fSAtIG9wdGlvbmFsIHN0cmluZyB1c2VkIGFzIHRoZSBuZXcga2V5LW5vdCBpbXBsZW1lbnRlZCBhcyB5ZXRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRDb250cm9sKFxyXG4gIGZvcm1Hcm91cDogYW55LCBkYXRhUG9pbnRlcjogUG9pbnRlciwgY29udHJvbDogQWJzdHJhY3RDb250cm9sLCB0YXJnZXRLZXk/OiBzdHJpbmcsXHJcbik6IGFueSB7XHJcblxyXG4gIGxldCBkYXRhUG9pbnRlckFycmF5ID0gSnNvblBvaW50ZXIucGFyc2UoZGF0YVBvaW50ZXIpO1xyXG5cclxuXHJcbiAgLy8gSWYgZm9ybUdyb3VwIGlucHV0IGlzIGEgcmVhbCBmb3JtR3JvdXAgKG5vdCBhIGZvcm1Hcm91cCB0ZW1wbGF0ZSlcclxuICAvLyB0cnkgdXNpbmcgZm9ybUdyb3VwLmdldCgpIHRvIHJldHVybiB0aGUgY29udHJvbFxyXG4gIC8qXHJcbiAgaWYgKHR5cGVvZiBmb3JtR3JvdXAuZ2V0ID09PSAnZnVuY3Rpb24nICYmXHJcbiAgICBkYXRhUG9pbnRlckFycmF5LmV2ZXJ5KGtleSA9PiBrZXkuaW5kZXhPZignLicpID09PSAtMSlcclxuICApIHtcclxuICAgIGZvcm1Hcm91cC5zZXRDb250cm9sKGRhdGFQb2ludGVyQXJyYXkuam9pbignLicpLCBjb250cm9sKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcbiAgKi9cclxuICBsZXQgY3VycmVudEdyb3VwOiBhbnk9IGZvcm1Hcm91cDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YVBvaW50ZXJBcnJheS5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgLy8gTmF2aWdhdGUgZG93biB0aGUgZm9ybSBzdHJ1Y3R1cmUgdG8gZmluZCB0aGUgY29ycmVjdCBuZXN0ZWQgRm9ybUdyb3VwXHJcbiAgICAgIGN1cnJlbnRHcm91cCA9IGN1cnJlbnRHcm91cC5nZXQoZGF0YVBvaW50ZXJBcnJheVtpXSk7XHJcbiAgXHJcbiAgICAgIC8vIElmIGl0J3Mgbm90IGEgRm9ybUdyb3VwLCB3ZSB0aHJvdyBhbiBlcnJvciBzaW5jZSB3ZSBjYW4ndCBzZXQgYSBjb250cm9sIGluIGEgbm9uLWdyb3VwLlxyXG4gICAgICBpZiAoISh0eXBlb2YgY3VycmVudEdyb3VwLnNldENvbnRyb2w9PT0gJ2Z1bmN0aW9uJyApKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoICcke2RhdGFQb2ludGVyQXJyYXlbaV19JyBpcyBub3QgYSB2YWxpZCBGb3JtR3JvdXAgb3IgIEZvcm1BcnJheS5gKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIFxyXG4gICAgLy8gTm93IHdlIGFyZSBhdCB0aGUgcGFyZW50IEZvcm1Hcm91cCwgc2V0IHRoZSBjb250cm9sIGF0IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHBhdGhcclxuICAgIGNvbnN0IGxhc3RQYXJ0ID0gZGF0YVBvaW50ZXJBcnJheVtkYXRhUG9pbnRlckFycmF5Lmxlbmd0aCAtIDFdO1xyXG4gIFxyXG4gICAgLy8gU2V0IHRoZSBjb250cm9sIGF0IHRoZSBmaW5hbCBwYXRoIChsaWtlICduYW1lJyBpbnNpZGUgJ3N0YXRlJylcclxuICAgIGN1cnJlbnRHcm91cC5zZXRDb250cm9sKGxhc3RQYXJ0LCBjb250cm9sKTtcclxuICBcclxuICBcclxuXHJcbiAgLy8gSWYgZm9ybUdyb3VwIGlucHV0IGlzIGEgZm9ybUdyb3VwIHRlbXBsYXRlLFxyXG4gIC8vIG9yIGZvcm1Hcm91cC5nZXQoKSBmYWlsZWQgdG8gcmV0dXJuIHRoZSBjb250cm9sLFxyXG4gIC8vIHNlYXJjaCB0aGUgZm9ybUdyb3VwIG9iamVjdCBmb3IgZGF0YVBvaW50ZXIncyBjb250cm9sXHJcbiAgLy9UT0RPIG5lZWRzIHRvIGJlIGFkYXB0ZWQgdG8gc2V0Q29udHJvbFxyXG4gIC8qXHJcbiAgbGV0IHN1Ykdyb3VwID0gZm9ybUdyb3VwO1xyXG4gIGZvciAoY29uc3Qga2V5IG9mIGRhdGFQb2ludGVyQXJyYXkpIHtcclxuICAgIGlmIChoYXNPd24oc3ViR3JvdXAsICdjb250cm9scycpKSB7IHN1Ykdyb3VwID0gc3ViR3JvdXAuY29udHJvbHM7IH1cclxuICAgIGlmIChpc0FycmF5KHN1Ykdyb3VwKSAmJiAoa2V5ID09PSAnLScpKSB7XHJcbiAgICAgIHN1Ykdyb3VwID0gc3ViR3JvdXBbc3ViR3JvdXAubGVuZ3RoIC0gMV07XHJcbiAgICB9IGVsc2UgaWYgKGhhc093bihzdWJHcm91cCwga2V5KSkge1xyXG4gICAgICBzdWJHcm91cCA9IHN1Ykdyb3VwW2tleV07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGBnZXRDb250cm9sIGVycm9yOiBVbmFibGUgdG8gZmluZCBcIiR7a2V5fVwiIGl0ZW0gaW4gRm9ybUdyb3VwLmApO1xyXG4gICAgICBjb25zb2xlLmVycm9yKGRhdGFQb2ludGVyKTtcclxuICAgICAgY29uc29sZS5lcnJvcihmb3JtR3JvdXApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBzdWJHcm91cDtcclxuICAqL1xyXG59XHJcbiJdfQ==
|
|
796
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1ncm91cC5mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1mb3Jtd29ya3MtY29yZS9zcmMvbGliL3NoYXJlZC9mb3JtLWdyb3VwLmZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFFakIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLFNBQVMsTUFBTSxrQkFBa0IsQ0FBQztBQUN6QyxPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzFGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFXLE1BQU0seUJBQXlCLENBQUM7QUFDL0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBRUwsUUFBUSxFQUNSLE9BQU8sRUFDUCxPQUFPLEVBQ1AsTUFBTSxFQUNOLFNBQVMsRUFDVCxPQUFPLEVBQ1AsUUFBUSxFQUNSLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsWUFBWSxFQUNiLE1BQU0sdUJBQXVCLENBQUM7QUFFL0I7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBWTtJQUMxQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFBO0FBQ2pDLENBQUM7QUFHRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUg7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxHQUFRLEVBQUUsWUFBaUIsSUFBSSxFQUFF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QW9CLEVBQUUsT0FBd0IsRUFBRSxTQUFrQjtJQUdsRixJQUFJLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7SUFHdEQsb0VBQW9FO0lBQ3BFLGtEQUFrRDtJQUNsRDs7Ozs7OztNQU9FO0lBQ0YsSUFBSSxZQUFZLEdBQU8sU0FBUyxDQUFDO0lBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3BELHdFQUF3RTtRQUN4RSxZQUFZLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXJELDBGQUEwRjtRQUMxRixJQUFJLENBQUMsQ0FBQyxPQUFPLFlBQVksQ0FBQyxVQUFVLEtBQUksVUFBVSxDQUFFLEVBQUU7WUFDcEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1NBQzFGO0tBQ0Y7SUFFRCxtRkFBbUY7SUFDbkYsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRS9ELGlFQUFpRTtJQUNqRSxZQUFZLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUk3Qyw4Q0FBOEM7SUFDOUMsbURBQW1EO0lBQ25ELHdEQUF3RDtJQUN4RCx3Q0FBd0M7SUFDeEM7Ozs7Ozs7Ozs7Ozs7Ozs7TUFnQkU7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBYnN0cmFjdENvbnRyb2wsXHJcbiAgVW50eXBlZEZvcm1BcnJheSxcclxuICBVbnR5cGVkRm9ybUNvbnRyb2wsXHJcbiAgVW50eXBlZEZvcm1Hcm91cCxcclxuICBWYWxpZGF0b3JGblxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2gvY2xvbmVEZWVwJztcclxuaW1wb3J0IGZpbHRlciBmcm9tICdsb2Rhc2gvZmlsdGVyJztcclxuaW1wb3J0IG1hcCBmcm9tICdsb2Rhc2gvbWFwJztcclxuaW1wb3J0IHsgZ2V0Q29udHJvbFZhbGlkYXRvcnMsIHJlbW92ZVJlY3Vyc2l2ZVJlZmVyZW5jZXMgfSBmcm9tICcuL2pzb24tc2NoZW1hLmZ1bmN0aW9ucyc7XHJcbmltcG9ydCB7IEpzb25WYWxpZGF0b3JzIH0gZnJvbSAnLi9qc29uLnZhbGlkYXRvcnMnO1xyXG5pbXBvcnQgeyBKc29uUG9pbnRlciwgUG9pbnRlciB9IGZyb20gJy4vanNvbnBvaW50ZXIuZnVuY3Rpb25zJztcclxuaW1wb3J0IHsgZm9yRWFjaCwgaGFzT3duIH0gZnJvbSAnLi91dGlsaXR5LmZ1bmN0aW9ucyc7XHJcbmltcG9ydCB7XHJcbiAgU2NoZW1hUHJpbWl0aXZlVHlwZSxcclxuICBoYXNWYWx1ZSxcclxuICBpbkFycmF5LFxyXG4gIGlzQXJyYXksXHJcbiAgaXNEYXRlLFxyXG4gIGlzRGVmaW5lZCxcclxuICBpc0VtcHR5LFxyXG4gIGlzT2JqZWN0LFxyXG4gIGlzUHJpbWl0aXZlLFxyXG4gIHRvSmF2YVNjcmlwdFR5cGUsXHJcbiAgdG9TY2hlbWFUeXBlXHJcbn0gZnJvbSAnLi92YWxpZGF0b3IuZnVuY3Rpb25zJztcclxuXHJcbi8qKlxyXG4gKiBwYXRoMkNvbnRyb2xLZXkgdGFrZXMgYSBkYXRhcG9pbnRlciBwYXRoIGxpa2UgL3NvbWUvcG9pbnRlci9wYXRoXHJcbiAqIGFuZCByZXR1cm5zIHNvbWV0aGluZyBsaWtlICRzb21lJHBvaW50ZXIkcGF0aFxyXG4gKiB1c2VkIG1haW5seSB0byBjb252ZXJ0IHBhdGhzIHNvIGl0IGNhbiBiZSB1c2VkIGFzIGtleXMgaW4gRm9ybUdyb3Vwc1xyXG4gKiBmb3QgSVRFIHNjZW5hcmlvc1xyXG4gKiBAcGFyYW0gcGF0aCBcclxuICogQHJldHVybnMgc3RyaW5nXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcGF0aDJDb250cm9sS2V5KHBhdGg6IHN0cmluZykge1xyXG4gIHJldHVybiBwYXRoLnJlcGxhY2UoL1xcLy9nLCBcIiRcIilcclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBGb3JtR3JvdXAgZnVuY3Rpb24gbGlicmFyeTpcclxuICpcclxuICogYnVpbGRGb3JtR3JvdXBUZW1wbGF0ZTogIEJ1aWxkcyBhIEZvcm1Hcm91cFRlbXBsYXRlIGZyb20gc2NoZW1hXHJcbiAqXHJcbiAqIGJ1aWxkRm9ybUdyb3VwOiAgICAgICAgICBCdWlsZHMgYW4gQW5ndWxhciBGb3JtR3JvdXAgZnJvbSBhIEZvcm1Hcm91cFRlbXBsYXRlXHJcbiAqXHJcbiAqIG1lcmdlVmFsdWVzOlxyXG4gKlxyXG4gKiBzZXRSZXF1aXJlZEZpZWxkczpcclxuICpcclxuICogZm9ybWF0Rm9ybURhdGE6XHJcbiAqXHJcbiAqIGdldENvbnRyb2w6XHJcbiAqXHJcbiAqIC0tLS0gVE9ETzogLS0tLVxyXG4gKiBUT0RPOiBhZGQgYnVpbGRGb3JtR3JvdXBUZW1wbGF0ZUZyb21MYXlvdXQgZnVuY3Rpb25cclxuICogYnVpbGRGb3JtR3JvdXBUZW1wbGF0ZUZyb21MYXlvdXQ6IEJ1aWxkcyBhIEZvcm1Hcm91cFRlbXBsYXRlIGZyb20gYSBmb3JtIGxheW91dFxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiAnYnVpbGRGb3JtR3JvdXBUZW1wbGF0ZScgZnVuY3Rpb25cclxuICpcclxuICogQnVpbGRzIGEgdGVtcGxhdGUgZm9yIGFuIEFuZ3VsYXIgRm9ybUdyb3VwIGZyb20gYSBKU09OIFNjaGVtYS5cclxuICpcclxuICogVE9ETzogYWRkIHN1cHBvcnQgZm9yIHBhdHRlcm4gcHJvcGVydGllc1xyXG4gKiBodHRwczovL3NwYWNldGVsZXNjb3BlLmdpdGh1Yi5pby91bmRlcnN0YW5kaW5nLWpzb24tc2NoZW1hL3JlZmVyZW5jZS9vYmplY3QuaHRtbFxyXG4gKlxyXG4gKiAvLyAge2FueX0ganNmIC1cclxuICogLy8gIHthbnkgPSBudWxsfSBub2RlVmFsdWUgLVxyXG4gKiAvLyAge2Jvb2xlYW4gPSB0cnVlfSBtYXBBcnJheXMgLVxyXG4gKiAvLyAge3N0cmluZyA9ICcnfSBzY2hlbWFQb2ludGVyIC1cclxuICogLy8gIHtzdHJpbmcgPSAnJ30gZGF0YVBvaW50ZXIgLVxyXG4gKiAvLyAge2FueSA9ICcnfSB0ZW1wbGF0ZVBvaW50ZXIgLVxyXG4gKiAvLyB7YW55fSAtXHJcbiAqL1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRm9ybUdyb3VwVGVtcGxhdGUoXHJcbiAganNmOiBhbnksIG5vZGVWYWx1ZTogYW55ID0gbnVsbCwgc2V0VmFsdWVzID0gdHJ1ZSxcclxuICBzY2hlbWFQb2ludGVyID0gJycsIGRhdGFQb2ludGVyID0gJycsIHRlbXBsYXRlUG9pbnRlciA9ICcnXHJcbikge1xyXG4gIGNvbnN0IHNjaGVtYSA9IEpzb25Qb2ludGVyLmdldChqc2Yuc2NoZW1hLCBzY2hlbWFQb2ludGVyKTtcclxuICBpZiAoc2V0VmFsdWVzKSB7XHJcbiAgICBpZiAoIWlzRGVmaW5lZChub2RlVmFsdWUpICYmIChcclxuICAgICAganNmLmZvcm1PcHRpb25zLnNldFNjaGVtYURlZmF1bHRzID09PSB0cnVlIHx8XHJcbiAgICAgIChqc2YuZm9ybU9wdGlvbnMuc2V0U2NoZW1hRGVmYXVsdHMgPT09ICdhdXRvJyAmJiBpc0VtcHR5KGpzZi5mb3JtVmFsdWVzKSlcclxuICAgICkpIHtcclxuICAgICAgbm9kZVZhbHVlID0gSnNvblBvaW50ZXIuZ2V0KGpzZi5zY2hlbWEsIHNjaGVtYVBvaW50ZXIgKyAnL2RlZmF1bHQnKTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgbm9kZVZhbHVlID0gbnVsbDtcclxuICB9XHJcbiAgLy8gVE9ETzogSWYgbm9kZVZhbHVlIHN0aWxsIG5vdCBzZXQsIGNoZWNrIGxheW91dCBmb3IgZGVmYXVsdCB2YWx1ZVxyXG4gIGNvbnN0IHNjaGVtYVR5cGU6IHN0cmluZyB8IHN0cmluZ1tdID0gSnNvblBvaW50ZXIuZ2V0KHNjaGVtYSwgJy90eXBlJyk7XHJcbiAgY29uc3QgaXNJZlRoZW5FbHNlID0gaGFzT3duKHNjaGVtYSwgJ2lmJykgfHwgaGFzT3duKHNjaGVtYSwgJ3RoZW4nKSB8fCBoYXNPd24oc2NoZW1hLCAnZWxzZScpO1xyXG4gIGNvbnN0IGNvbnRyb2xUeXBlID0gaXNJZlRoZW5FbHNlICYmICFzY2hlbWFUeXBlID8gJ0lmVGhlbkVsc2UnIDpcclxuICAgIChoYXNPd24oc2NoZW1hLCAncHJvcGVydGllcycpIHx8IGhhc093bihzY2hlbWEsICdhZGRpdGlvbmFsUHJvcGVydGllcycpXHJcblxyXG4gICAgKSAmJlxyXG4gICAgICBzY2hlbWFUeXBlID09PSAnb2JqZWN0JyA/ICdGb3JtR3JvdXAnIDpcclxuICAgICAgKGhhc093bihzY2hlbWEsICdpdGVtcycpIHx8IGhhc093bihzY2hlbWEsICdhZGRpdGlvbmFsSXRlbXMnKSkgJiZcclxuICAgICAgICBzY2hlbWFUeXBlID09PSAnYXJyYXknID8gJ0Zvcm1BcnJheScgOlxyXG4gICAgICAgICFzY2hlbWFUeXBlICYmIGhhc093bihzY2hlbWEsICckcmVmJykgPyAnJHJlZicgOiAnRm9ybUNvbnRyb2wnO1xyXG4gIGNvbnN0IHNob3J0RGF0YVBvaW50ZXIgPVxyXG4gICAgcmVtb3ZlUmVjdXJzaXZlUmVmZXJlbmNlcyhkYXRhUG9pbnRlciwganNmLmRhdGFSZWN1cnNpdmVSZWZNYXAsIGpzZi5hcnJheU1hcCk7XHJcbiAgaWYgKCFqc2YuZGF0YU1hcC5oYXMoc2hvcnREYXRhUG9pbnRlcikpIHtcclxuICAgIGpzZi5kYXRhTWFwLnNldChzaG9ydERhdGFQb2ludGVyLCBuZXcgTWFwKCkpO1xyXG4gIH1cclxuICBjb25zdCBub2RlT3B0aW9ucyA9IGpzZi5kYXRhTWFwLmdldChzaG9ydERhdGFQb2ludGVyKTtcclxuICBpZiAoIW5vZGVPcHRpb25zLmhhcygnc2NoZW1hVHlwZScpKSB7XHJcbiAgICBub2RlT3B0aW9ucy5zZXQoJ3NjaGVtYVBvaW50ZXInLCBzY2hlbWFQb2ludGVyKTtcclxuICAgIG5vZGVPcHRpb25zLnNldCgnc2NoZW1hVHlwZScsIHNjaGVtYS50eXBlKTtcclxuICAgIGlmIChzY2hlbWEuZm9ybWF0KSB7XHJcbiAgICAgIG5vZGVPcHRpb25zLnNldCgnc2NoZW1hRm9ybWF0Jywgc2NoZW1hLmZvcm1hdCk7XHJcbiAgICAgIGlmICghc2NoZW1hLnR5cGUpIHsgbm9kZU9wdGlvbnMuc2V0KCdzY2hlbWFUeXBlJywgJ3N0cmluZycpOyB9XHJcbiAgICB9XHJcbiAgICBpZiAoY29udHJvbFR5cGUpIHtcclxuICAgICAgbm9kZU9wdGlvbnMuc2V0KCd0ZW1wbGF0ZVBvaW50ZXInLCB0ZW1wbGF0ZVBvaW50ZXIpO1xyXG4gICAgICBub2RlT3B0aW9ucy5zZXQoJ3RlbXBsYXRlVHlwZScsIGNvbnRyb2xUeXBlKTtcclxuICAgIH1cclxuICB9XHJcbiAgbGV0IGNvbnRyb2xzOiBhbnk7XHJcbiAgY29uc3QgdmFsaWRhdG9ycyA9IGdldENvbnRyb2xWYWxpZGF0b3JzKHNjaGVtYSk7XHJcbiAgc3dpdGNoIChjb250cm9sVHlwZSkge1xyXG5cclxuICAgIGNhc2UgJ0Zvcm1Hcm91cCc6XHJcbiAgICAgIGNvbnRyb2xzID0ge307XHJcbiAgICAgIGlmIChoYXNPd24oc2NoZW1hLCAndWk6b3JkZXInKSB8fCBoYXNPd24oc2NoZW1hLCAncHJvcGVydGllcycpKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcGVydHlLZXlzID0gc2NoZW1hWyd1aTpvcmRlciddIHx8IE9iamVjdC5rZXlzKHNjaGVtYS5wcm9wZXJ0aWVzKTtcclxuICAgICAgICBpZiAocHJvcGVydHlLZXlzLmluY2x1ZGVzKCcqJykgJiYgIWhhc093bihzY2hlbWEucHJvcGVydGllcywgJyonKSkge1xyXG4gICAgICAgICAgY29uc3QgdW5uYW1lZEtleXMgPSBPYmplY3Qua2V5cyhzY2hlbWEucHJvcGVydGllcylcclxuICAgICAgICAgICAgLmZpbHRlcihrZXkgPT4gIXByb3BlcnR5S2V5cy5pbmNsdWRlcyhrZXkpKTtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSBwcm9wZXJ0eUtleXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgaWYgKHByb3BlcnR5S2V5c1tpXSA9PT0gJyonKSB7XHJcbiAgICAgICAgICAgICAgcHJvcGVydHlLZXlzLnNwbGljZShpLCAxLCAuLi51bm5hbWVkS2V5cyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcHJvcGVydHlLZXlzXHJcbiAgICAgICAgICAuZmlsdGVyKGtleSA9PiBoYXNPd24oc2NoZW1hLnByb3BlcnRpZXMsIGtleSkgfHxcclxuICAgICAgICAgICAgaGFzT3duKHNjaGVtYSwgJ2FkZGl0aW9uYWxQcm9wZXJ0aWVzJylcclxuICAgICAgICAgIClcclxuICAgICAgICAgIC5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgICAgY29udHJvbHNba2V5XSA9IGJ1aWxkRm9ybUdyb3VwVGVtcGxhdGUoXHJcbiAgICAgICAgICAgICAganNmLCBKc29uUG9pbnRlci5nZXQobm9kZVZhbHVlLCBbPHN0cmluZz5rZXldKSwgc2V0VmFsdWVzLFxyXG4gICAgICAgICAgICAgIHNjaGVtYVBvaW50ZXIgKyAoaGFzT3duKHNjaGVtYS5wcm9wZXJ0aWVzLCBrZXkpID9cclxuICAgICAgICAgICAgICAgICcvcHJvcGVydGllcy8nICsga2V5IDogJy9hZGRpdGlvbmFsUHJvcGVydGllcydcclxuICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgIGRhdGFQb2ludGVyICsgJy8nICsga2V5LFxyXG4gICAgICAgICAgICAgIHRlbXBsYXRlUG9pbnRlciArICcvY29udHJvbHMvJyArIGtleVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAvL2FkZCB0aGUgJDxjb250cm9sPiB0eXBlIHRvIHRoZSByb290XHJcbiAgICAgICAgICAgIC8vc28gaXQgY2FuIGJlIGZsYXR0ZW5lZCBhbmQgYWNjZXNlcyBkaXJlY3RseSBpbiB0aGUgZm9ybWdyb3VwXHJcbiAgICAgICAgICAgIC8vYnkgaXRzIGZ1bGwgJyQnIHBhdGhcclxuICAgICAgICAgICAgW1wiYWxsT2ZcIiwgXCJhbnlPZlwiLFwib25lT2ZcIl0uZm9yRWFjaChvZlR5cGUgPT4ge1xyXG4gICAgICAgICAgICAgIGlmKGNvbnRyb2xzW2tleV0uY29udHJvbHMgJiYgY29udHJvbHNba2V5XS5jb250cm9sc1tgXyR7b2ZUeXBlfWBdKXtcclxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGNvbnRyb2xzW2tleV0uY29udHJvbHNbYF8ke29mVHlwZX1gXSkuZm9yRWFjaCgka2V5PT57XHJcbiAgICAgICAgICAgICAgICAgIGNvbnRyb2xzWyRrZXldPWNvbnRyb2xzW2tleV0uY29udHJvbHNbYF8ke29mVHlwZX1gXVska2V5XTtcclxuICAgICAgICAgICAgICAgICAgZGVsZXRlIGNvbnRyb2xzW2tleV0uY29udHJvbHNbJGtleV07XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGNvbnRyb2xzW2tleV0uY29udHJvbHNbYF8ke29mVHlwZX1gXVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH0gXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKGhhc093bihzY2hlbWEsIFwiaWZcIikpIHtcclxuICAgICAgICAgIFtcInRoZW5cIiwgXCJlbHNlXCJdLmZvckVhY2goY29uID0+IHtcclxuICAgICAgICAgICAgaWYgKGhhc093bihzY2hlbWEsIGNvbikpIHtcclxuICAgICAgICAgICAgICBjb25zdCBrZXlTY2hlbWFQb2ludGVyID0gYC8ke2Nvbn1gO1xyXG5cclxuICAgICAgICAgICAgICBsZXQgdGhlbkZHVGVtcGxhdGUgPSBidWlsZEZvcm1Hcm91cFRlbXBsYXRlKFxyXG4gICAgICAgICAgICAgICAganNmLCBub2RlVmFsdWUsIHNldFZhbHVlcywvL2ZhbHNlLC8vSnNvblBvaW50ZXIuZ2V0KG5vZGVWYWx1ZSwga2V5U2NoZW1hUG9pbnRlciksIHNldFZhbHVlcyxcclxuICAgICAgICAgICAgICAgIHNjaGVtYVBvaW50ZXIgKyBrZXlTY2hlbWFQb2ludGVyLFxyXG4gICAgICAgICAgICAgICAgZGF0YVBvaW50ZXIsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBvaW50ZXIgKyBgL2NvbnRyb2xzLyR7Y29ufWBcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29udHJvbHMsIHRoZW5GR1RlbXBsYXRlLmNvbnRyb2xzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAvKiAgdHJlYXQgYWxsT2YgdGhlIHNhbWUgYXMgYW55IG9mIGJ1dCBuZWVkIHRvIGFkZCBhbiBleHRyYVxyXG4gICAgICBjb25kaXRpb24gZm9yIHdoaWNoIGFueU9mIGl0ZW0gaXMgdG8gYmUgcmVuZGVyZWQgXHJcbiAgICAgICAgbGV0IGFsbE9mQ29udHJvbHMgPSB7fVxyXG4gICAgICAgIGxldCBhbGxPZkFsbG93ZWRLZXlzID0gW1wiYWxsT2ZcIiwgXCJhbnlPZlwiLCBcIm9uZU9mXCIsIFwiaWZcIiwgXCJ0aGVuXCIsIFwiZWxzZVwiLCBcInR5cGVcIiwgXCJwcm9wZXJ0aWVzXCIsIFwiaXRlbXNcIl07XHJcbiAgICAgICAgaWYgKGhhc093bihzY2hlbWEsIFwiYWxsT2ZcIikgJiYgaXNBcnJheShzY2hlbWEuYWxsT2YpKSB7XHJcbiAgICAgICAgICBzY2hlbWEuYWxsT2YuZm9yRWFjaCgoYWxsT2ZJdGVtLCBpbmQpID0+IHtcclxuICAgICAgICAgICAgbGV0IGFvSXRlbUtleXMgPSBPYmplY3Qua2V5cyhhbGxPZkl0ZW0pO1xyXG4gICAgICAgICAgICBsZXQgZm91bmRLZXlzID0gYWxsT2ZBbGxvd2VkS2V5cy5maWx0ZXIodmFsdWUgPT5cclxuICAgICAgICAgICAgICBhb0l0ZW1LZXlzLmluY2x1ZGVzKHZhbHVlKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAoZm91bmRLZXlzICYmIGZvdW5kS2V5cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgY29uc3Qga2V5U2NoZW1hUG9pbnRlciA9IGAvYWxsT2YvJHtpbmR9YDtcclxuICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGBmb3VuZDoke2tleVNjaGVtYVBvaW50ZXJ9YCk7XHJcbiAgICAgICAgICAgICAgbGV0IGFsbE9mRkdUZW1wbGF0ZSA9IGJ1aWxkRm9ybUdyb3VwVGVtcGxhdGUoXHJcbiAgICAgICAgICAgICAgICBqc2YsIEpzb25Qb2ludGVyLmdldChub2RlVmFsdWUsIGtleVNjaGVtYVBvaW50ZXIpLCBzZXRWYWx1ZXMsXHJcbiAgICAgICAgICAgICAgICBzY2hlbWFQb2ludGVyICsga2V5U2NoZW1hUG9pbnRlcixcclxuICAgICAgICAgICAgICAgIGRhdGFQb2ludGVyLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVQb2ludGVyICsgJy9jb250cm9scy8nICsgaW5kXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBpZiAoYWxsT2ZGR1RlbXBsYXRlLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhhbGxPZkZHVGVtcGxhdGUuY29udHJvbHMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgbGV0IGNvbnRyb2xLZXkgPSBhbGxPZkZHVGVtcGxhdGUuY29udHJvbHNba2V5XS5zY2hlbWFQb2ludGVyIHx8IGAke3NjaGVtYVBvaW50ZXJ9JHtrZXlTY2hlbWFQb2ludGVyfS8ke2tleX1gO1xyXG4gICAgICAgICAgICAgICAgICBjb250cm9sS2V5ID0gcGF0aDJDb250cm9sS2V5KGNvbnRyb2xLZXkpO1xyXG4gICAgICAgICAgICAgICAgICBjb250cm9sc1tjb250cm9sS2V5XSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IGtleSxcclxuICAgICAgICAgICAgICAgICAgICBzY2hlbWFQb2ludGVyOiBzY2hlbWFQb2ludGVyICsga2V5U2NoZW1hUG9pbnRlcixcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sczogYWxsT2ZGR1RlbXBsYXRlLmNvbnRyb2xzW2tleV1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBjb250cm9sc1tjb250cm9sS2V5XSA9IGFsbE9mRkdUZW1wbGF0ZS5jb250cm9sc1trZXldO1xyXG4gICAgICAgICAgICAgICAgICBjb250cm9sc1tjb250cm9sS2V5XS5rZXkgPSBrZXk7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnRyb2xzW2NvbnRyb2xLZXldLnNjaGVtYVBvaW50ZXIgPSBhbGxPZkZHVGVtcGxhdGUuY29udHJvbHNba2V5XS5zY2hlbWFQb2ludGVyIHx8IHNjaGVtYVBvaW50ZXIgKyBrZXlTY2hlbWFQb2ludGVyO1xyXG5cclxuICAgICAgICAgICAgICAgICAgY29udHJvbHNba2V5XSA9IGFsbE9mRkdUZW1wbGF0ZS5jb250cm9sc1trZXldO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgLy9hZGQgdWkgdHlwZSBpdGVtcyB0byBjb250cm9sc1xyXG4gICAgICAgICAgICAgIGlmIChhbGxPZkl0ZW1bXCJ0eXBlXCJdIHx8IGFsbE9mSXRlbVtcInByb3BlcnRpZXNcIl0gfHwgYWxsT2ZJdGVtW1wiaXRlbXNcIl0pIHtcclxuICAgICAgICAgICAgICAgIGFsbE9mQ29udHJvbHNbaW5kXSA9IGFsbE9mRkdUZW1wbGF0ZVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgY29udHJvbHNbXCJhbGxPZlwiXSA9IGFsbE9mQ29udHJvbHM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICovXHJcblxyXG5cclxuICAgICAgICBsZXQgb2ZBbGxvd2VkS2V5cyA9IFtcImFsbE9mXCIsIFwiYW55T2ZcIiwgXCJvbmVPZlwiLCBcImlmXCIsIFwidGhlblwiLCBcImVsc2VcIiwgXCJ0eXBlXCIsIFwicHJvcGVydGllc1wiLCBcIml0ZW1zXCJdO1xyXG4gICAgICAgIFtcImFsbE9mXCIsIFwiYW55T2ZcIixcIm9uZU9mXCJdLmZvckVhY2gob2ZUeXBlID0+IHtcclxuICAgICAgICAgIGlmIChoYXNPd24oc2NoZW1hLCBvZlR5cGUpICYmIGlzQXJyYXkoc2NoZW1hW29mVHlwZV0pKSB7XHJcbiAgICAgICAgICAgIHNjaGVtYVtvZlR5cGVdLmZvckVhY2goKG9mSXRlbSwgaW5kKSA9PiB7XHJcbiAgICAgICAgICAgICAgbGV0IGFvSXRlbUtleXMgPSBPYmplY3Qua2V5cyhvZkl0ZW0pO1xyXG4gICAgICAgICAgICAgIGxldCBmb3VuZEtleXMgPSBvZkFsbG93ZWRLZXlzLmZpbHRlcih2YWx1ZSA9PlxyXG4gICAgICAgICAgICAgICAgYW9JdGVtS2V5cy5pbmNsdWRlcyh2YWx1ZSlcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIGlmIChmb3VuZEtleXMgJiYgZm91bmRLZXlzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGtleVNjaGVtYVBvaW50ZXIgPSBgLyR7b2ZUeXBlfS8ke2luZH1gO1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhgZm91bmQ6JHtrZXlTY2hlbWFQb2ludGVyfWApO1xyXG4gICAgICAgICAgICAgICAgbGV0IG5ld05vZGVWYWx1ZT1ub2RlVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAvL0pzb25Qb2ludGVyLmdldChub2RlVmFsdWUsIGRhdGFQb2ludGVyKTtcclxuICAgICAgICAgICAgICAgIC8vSnNvblBvaW50ZXIuZ2V0KG5vZGVWYWx1ZSwga2V5U2NoZW1hUG9pbnRlcik7XHJcbiAgICAgICAgICAgICAgICBpZihvZlR5cGU9PVwib25lT2ZcIil7XHJcbiAgICAgICAgICAgICAgICAgIG5ld05vZGVWYWx1ZT1ub2RlVmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgYWxsT2ZGR1RlbXBsYXRlID0gYnVpbGRGb3JtR3JvdXBUZW1wbGF0ZShcclxuICAgICAgICAgICAgICAgICAganNmLCBuZXdOb2RlVmFsdWUsIHNldFZhbHVlcyxcclxuICAgICAgICAgICAgICAgICAgc2NoZW1hUG9pbnRlciArIGtleVNjaGVtYVBvaW50ZXIsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFQb2ludGVyLFxyXG4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBvaW50ZXIgKyAnL2NvbnRyb2xzLycgKyBpbmRcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWxsT2ZGR1RlbXBsYXRlLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGFsbE9mRkdUZW1wbGF0ZS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGwyU2NoZW1hUG9pbnRlciA9IGhhc093bihzY2hlbWEsJ3Byb3BlcnRpZXMnKSA/XHJcbiAgICAgICAgICAgICAgICAgICAgJy9wcm9wZXJ0aWVzLycgK2tleTprZXk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRyb2xLZXkgPSBhbGxPZkZHVGVtcGxhdGUuY29udHJvbHNba2V5XS5zY2hlbWFQb2ludGVyIHx8IGAke3NjaGVtYVBvaW50ZXJ9JHtrZXlTY2hlbWFQb2ludGVyfSR7bDJTY2hlbWFQb2ludGVyfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbEtleSA9IHBhdGgyQ29udHJvbEtleShjb250cm9sS2V5KTtcclxuICAgICAgICAgICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzW2NvbnRyb2xLZXldID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAga2V5OiBrZXksXHJcbiAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFQb2ludGVyOiAgYCR7c2NoZW1hUG9pbnRlcn0ke2tleVNjaGVtYVBvaW50ZXJ9LyR7a2V5fWAsLy9zY2hlbWFQb2ludGVyICsga2V5U2NoZW1hUG9pbnRlcixcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzOiBhbGxPZkZHVGVtcGxhdGUuY29udHJvbHNba2V5XVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY29udHJvbEl0ZW09Y2xvbmVEZWVwKGFsbE9mRkdUZW1wbGF0ZS5jb250cm9sc1trZXldKTtcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sSXRlbS5rZXkgPSBrZXk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbEl0ZW0uc2NoZW1hUG9pbnRlciA9IGNvbnRyb2xJdGVtLnNjaGVtYVBvaW50ZXJ8fCBgJHtzY2hlbWFQb2ludGVyfSR7a2V5U2NoZW1hUG9pbnRlcn0ke2wyU2NoZW1hUG9pbnRlcn1gO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzW2NvbnRyb2xLZXldPWNvbnRyb2xJdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgLy9uZWVkIHRvIHRlc3QgaWYgdmFsdWUgbWF0Y2hlcyBzY2hlbWEsXHJcbiAgICAgICAgICAgICAgICAgICAgLy9hcyB0aGUgc2FtZSBvbmVPZiBpdGVtIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIHNhbWUgdmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAvL2lmIGtleSBpcyBhICRvbmVPZiBrZXkgdGhlbiBpdCB3YXMgaW5zZXJ0ZWQgYXQgdGhlIHJvb3Qgb2YgdGhlIGNvbnRyb2xzXHJcbiAgICAgICAgICAgICAgICAgICAgLy9hcyBmb3JtIGNvbnRyb2wgbmFtZSB3aWxsIGJlIHRoZSBmdWxsKGVzY2FwZWQpIHBhdGggXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRlclBhdGg9a2V5LnN0YXJ0c1dpdGgoJyRvbmVPZicpP2NvbnRyb2xJdGVtLnNjaGVtYVBvaW50ZXI6a2V5U2NoZW1hUG9pbnRlclxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBvbmVPZkl0ZW1TY2hlbWE9SnNvblBvaW50ZXIuZ2V0KGpzZi5zY2hlbWEsY29udHJvbEl0ZW0uc2NoZW1hUG9pbnRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9Kc29uUG9pbnRlci5nZXQoc2NoZW1hLHBvaW50ZXJQYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZFBvaW50ZXI9ICBjb250cm9sSXRlbS5zY2hlbWFQb2ludGVyLnJlcGxhY2UoLyhhbnlPZnxhbGxPZnxvbmVPZnxub25lKVxcL1tcXGRdK1xcLy9nLCAnJylcclxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKGlmfHRoZW58ZWxzZXxwcm9wZXJ0aWVzKVxcLy9nLCAnJykucmVwbGFjZSgvXFwvaXRlbXNcXC8vZywnLy0vJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZFBvaW50ZXI9ZFBvaW50ZXIuaW5kZXhPZihkYXRhUG9pbnRlcik9PTBcclxuICAgICAgICAgICAgICAgICAgICA/ZFBvaW50ZXIuc3Vic3RyaW5nKGRhdGFQb2ludGVyLmxlbmd0aCk6ZFBvaW50ZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9kYXRhUG9pbnRlcitcIi9cIitjb250cm9sSXRlbS5zY2hlbWFQb2ludGVyLnNwbGl0KFwiL1wiKS5zbGljZSgtMSlbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgLy8vL2NvbnRyb2xJdGVtLnNjaGVtYVBvaW50ZXIucmVwbGFjZSgvKGFueU9mfGFsbE9mfG9uZU9mfG5vbmUpXFwvW1xcZF0rXFwvL2csICcnKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vLy8ucmVwbGFjZSgvKGlmfHRoZW58ZWxzZXxwcm9wZXJ0aWVzKVxcLy9nLCAnJykucmVwbGFjZSgvXFwvaXRlbXNcXC8vZywnLy0vJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9Kc29uUG9pbnRlci50b0RhdGFQb2ludGVyKGNvbnRyb2xJdGVtLnNjaGVtYVBvaW50ZXIsanNmLnNjaGVtYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhgZGF0YVBvaW50ZXI6JHtkYXRhUG9pbnRlcn1cXG5kUG9pbnRlcjoke2RQb2ludGVyfWApXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRWYWw9Ly9Kc29uUG9pbnRlci5nZXQoanNmLmZvcm1WYWx1ZXMsZFBvaW50ZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIEpzb25Qb2ludGVyLmdldChub2RlVmFsdWUsZFBvaW50ZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBma2V5PWtleTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgb25lT2ZJdGVtVmFsdWU9ZFZhbDtcclxuICAgICAgICAgICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgICAgICAgIGlmKGhhc093bihvbmVPZkl0ZW1TY2hlbWEsXCJpZlwiKSAmJiBjb250cm9sSXRlbS5zY2hlbWFQb2ludGVyXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgY29udHJvbEl0ZW0uc2NoZW1hUG9pbnRlci5pbmRleE9mKGtleVNjaGVtYVBvaW50ZXIpPT0wKXtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJ0cz1jb250cm9sSXRlbS5zY2hlbWFQb2ludGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoa2V5U2NoZW1hUG9pbnRlcikuam9pbignJykuc3BsaXQoXCIvXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgdGhlbk9yRWxzZT1wYXJ0c1sxXTtcclxuICAgICAgICAgICAgICAgICAgICAgIGZrZXk9cGFydHNbcGFydHMubGVuZ3RoLTFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgb25lT2ZJdGVtU2NoZW1hPW9uZU9mSXRlbVNjaGVtYVt0aGVuT3JFbHNlXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBpZihvbmVPZkl0ZW1TY2hlbWEucHJvcGVydGllcyAmJiBqc2YuZm9ybVZhbHVlcz09PXVuZGVmaW5lZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIG5vIGZvcm0gZGF0YSB2YWx1ZXMgd2VyZSBzdXBwbGllZFxyXG4gICAgICAgICAgICAgICAgICAgICAgLy90aGVuIHNldCBpdCB0byBkZWZhdWx0IG90aGVyd2lzZSB0byBpdHMgbm9kZXZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgICBvbmVPZkl0ZW1WYWx1ZT1vbmVPZkl0ZW1TY2hlbWEuZGVmYXVsdFxyXG4gICAgICAgICAgICAgICAgICAgICAgb25lT2ZJdGVtVmFsdWVbZmtleV09b25lT2ZJdGVtU2NoZW1hLnByb3BlcnRpZXNbZmtleV0/LmRlZmF1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKG9uZU9mSXRlbVNjaGVtYS5wcm9wZXJ0aWVzICYmIGpzZi5mb3JtVmFsdWVzIT11bmRlZmluZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgb25lT2ZJdGVtVmFsdWUgPXt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy9ub2RlVmFsdWV8fHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgb25lT2ZJdGVtVmFsdWVbZmtleV09bm9kZVZhbHVlJiZub2RlVmFsdWVbZmtleV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKCFvbmVPZkl0ZW1TY2hlbWEucHJvcGVydGllcyAmJiBqc2YuZm9ybVZhbHVlcz09dW5kZWZpbmVkKXtcclxuICAgICAgICAgICAgICAgICAgICAgIG9uZU9mSXRlbVZhbHVlPW9uZU9mSXRlbVNjaGVtYS5kZWZhdWx0O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoaGFzT3duKGNvbnRyb2xJdGVtLFwidmFsdWVcIikpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYoIWpzZi5hanYudmFsaWRhdGUob25lT2ZJdGVtU2NoZW1hLG9uZU9mSXRlbVZhbHVlKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xJdGVtLnZhbHVlLnZhbHVlPW51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8vY29udHJvbEl0ZW0udmFsdWUudmFsdWU9b25lT2ZJdGVtVmFsdWVbZmtleV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xJdGVtLnZhbHVlLnZhbHVlPW9uZU9mSXRlbVNjaGVtYS5wcm9wZXJ0aWVzP29uZU9mSXRlbVZhbHVlW2ZrZXldOm9uZU9mSXRlbVZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfSAgIFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb250cm9sc1tjb250cm9sS2V5XSA9IGNvbnRyb2xJdGVtO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL2FsbE9mRkdUZW1wbGF0ZS5jb250cm9sc1trZXldLnNjaGVtYVBvaW50ZXIgfHxgJHtzY2hlbWFQb2ludGVyfSR7a2V5U2NoZW1hUG9pbnRlcn0vJHtrZXl9YDtcclxuICAgICAgICAgICAgICAgICAgICAvL2FsbE9mRkdUZW1wbGF0ZS5jb250cm9sc1trZXldLnNjaGVtYVBvaW50ZXIgfHwgc2NoZW1hUG9pbnRlciArIGtleVNjaGVtYVBvaW50ZXI7XHJcbiAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8vLy8vL2NvbnRyb2xzW2tleV0gPSBjbG9uZURlZXAoYWxsT2ZGR1RlbXBsYXRlLmNvbnRyb2xzW2tleV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vYWRkIHNjaGVtYWNvbnRyb2wgdG8gcm9vdCBcclxuICAgICAgICAgICAgICAgICAgICAvL2NvbnRyb2xzW2NvbnRyb2xLZXldPWNvbnRyb2xJdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbHNbYF8ke29mVHlwZX1gXT1jb250cm9sc1tgXyR7b2ZUeXBlfWBdfHx7fTtcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sc1tgXyR7b2ZUeXBlfWBdW2NvbnRyb2xLZXldPWNvbnRyb2xJdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgLy9hbGxPZkZHVGVtcGxhdGUuY29udHJvbHNba2V5XTtcclxuICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH1cclxuICBcclxuICAgICAgICAgICAgICB9XHJcbiAgXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuXHJcblxyXG5cclxuICAgICAgICBqc2YuZm9ybU9wdGlvbnMuZmllbGRzUmVxdWlyZWQgPSBzZXRSZXF1aXJlZEZpZWxkcyhzY2hlbWEsIGNvbnRyb2xzKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4geyBjb250cm9sVHlwZSwgY29udHJvbHMsIHZhbGlkYXRvcnMsc2NoZW1hUG9pbnRlciB9O1xyXG5cclxuICAgIGNhc2UgJ0Zvcm1BcnJheSc6XHJcbiAgICAgIGNvbnRyb2xzID0gW107XHJcbiAgICAgIGNvbnN0IG1pbkl0ZW1zID1cclxuICAgICAgICBNYXRoLm1heChzY2hlbWEubWluSXRlbXMgfHwgMCwgbm9kZU9wdGlvbnMuZ2V0KCdtaW5JdGVtcycpIHx8IDApO1xyXG4gICAgICBjb25zdCBtYXhJdGVtcyA9XHJcbiAgICAgICAgTWF0aC5taW4oc2NoZW1hLm1heEl0ZW1zIHx8IDEwMDAsIG5vZGVPcHRpb25zLmdldCgnbWF4SXRlbXMnKSB8fCAxMDAwKTtcclxuICAgICAgbGV0IGFkZGl0aW9uYWxJdGVtc1BvaW50ZXI6IHN0cmluZyA9IG51bGw7XHJcbiAgICAgIGlmIChpc0FycmF5KHNjaGVtYS5pdGVtcykpIHsgLy8gJ2l0ZW1zJyBpcyBhbiBhcnJheSA9IHR1cGxlIGl0ZW1zXHJcbiAgICAgICAgY29uc3QgdHVwbGVJdGVtcyA9IG5vZGVPcHRpb25zLmdldCgndHVwbGVJdGVtcycpIHx8XHJcbiAgICAgICAgICAoaXNBcnJheShzY2hlbWEuaXRlbXMpID8gTWF0aC5taW4oc2NoZW1hLml0ZW1zLmxlbmd0aCwgbWF4SXRlbXMpIDogMCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0dXBsZUl0ZW1zOyBpKyspIHtcclxuICAgICAgICAgIGlmIChpIDwgbWluSXRlbXMpIHtcclxuICAgICAgICAgICAgY29udHJvbHMucHVzaChidWlsZEZvcm1Hcm91cFRlbXBsYXRlKFxyXG4gICAgICAgICAgICAgIGpzZiwgaXNBcnJheShub2RlVmFsdWUpID8gbm9kZVZhbHVlW2ldIDogbm9kZVZhbHVlLCBzZXRWYWx1ZXMsXHJcbiAgICAgICAgICAgICAgc2NoZW1hUG9pbnRlciArICcvaXRlbXMvJyArIGksXHJcbiAgICAgICAgICAgICAgZGF0YVBvaW50ZXIgKyAnLycgKyBpLFxyXG4gICAgICAgICAgICAgIHRlbXBsYXRlUG9pbnRlciArICcvY29udHJvbHMvJyArIGlcclxuICAgICAgICAgICAgKSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBzY2hlbWFSZWZQb2ludGVyID0gcmVtb3ZlUmVjdXJzaXZlUmVmZXJlbmNlcyhcclxuICAgICAgICAgICAgICBzY2hlbWFQb2ludGVyICsgJy9pdGVtcy8nICsgaSwganNmLnNjaGVtYVJlY3Vyc2l2ZVJlZk1hcFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtUmVmUG9pbnRlciA9IHJlbW92ZVJlY3Vyc2l2ZVJlZmVyZW5jZXMoXHJcbiAgICAgICAgICAgICAgc2hvcnREYXRhUG9pbnRlciArICcvJyArIGksIGpzZi5kYXRhUmVjdXJzaXZlUmVmTWFwLCBqc2YuYXJyYXlNYXBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgY29uc3QgaXRlbVJlY3Vyc2l2ZSA9IGl0ZW1SZWZQb2ludGVyICE9PSBzaG9ydERhdGFQb2ludGVyICsgJy8nICsgaTtcclxuICAgICAgICAgICAvL2lmIGlzIGluIHRlbXBsYXRlTGlicmFyeSB0aGVuIG5lZWQgdG8gY2hlY2sgaWYgaXRzIGEgY29uZGl0aW9uYWxcclxuICAgICAgICAgICAvL2FuZCBjb25kaXRpb25hbCBwb2ludGVycyBtYXRjaCBvcnRoZXdpc2UgY3JlYXRlIGEgbmV3IHJlZlxyXG4gICAgICAgICAgICBsZXQgY29uZGl0aW9uYWxSZWZQb2ludGVyPWAke2l0ZW1SZWZQb2ludGVyfUAke3NjaGVtYVBvaW50ZXJ9YDtcclxuICAgICAgICAgICAgbGV0IHRlbXBsYXRlUmVmVG9Vc2U9aXRlbVJlZlBvaW50ZXI7XHJcbiAgICAgICAgICAgIGlmKGhhc093bihqc2YudGVtcGxhdGVSZWZMaWJyYXJ5LCBpdGVtUmVmUG9pbnRlcilcclxuICAgICAgICAgICAgICAgJiYgIWhhc093bihqc2YudGVtcGxhdGVSZWZMaWJyYXJ5LCBjb25kaXRpb25hbFJlZlBvaW50ZXIpKXtcclxuICAgICAgICAgICAgICAgIGpzZi50ZW1wbGF0ZVJlZkxpYnJhcnlbY29uZGl0aW9uYWxSZWZQb2ludGVyXT1idWlsZEZvcm1Hcm91cFRlbXBsYXRlKFxyXG4gICAgICAgICAgICAgICAgICBqc2YsIG51bGwsIHNldFZhbHVlcyxcclxuICAgICAgICAgICAgICAgICAgc2NoZW1hUmVmUG9pbnRlcixcclxuICAgICAgICAgICAgICAgICAgaXRlbVJlZlBvaW50ZXIsXHJcbiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUG9pbnRlciArICcvY29udHJvbHMvJyArIGlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVJlZlRvVXNlPWNvbmRpdGlvbmFsUmVmUG9pbnRlcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWhhc093bihqc2YudGVtcGxhdGVSZWZMaWJyYXJ5LCBpdGVtUmVmUG9pbnRlcikpIHtcclxuICAgICAgICAgICAgICBqc2YudGVtcGxhdGVSZWZMaWJyYXJ5W2l0ZW1SZWZQb2ludGVyXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAganNmLnRlbXBsYXRlUmVmTGlicmFyeVtpdGVtUmVmUG9pbnRlcl0gPSBidWlsZEZvcm1Hcm91cFRlbXBsYXRlKFxyXG4gICAgICAgICAgICAgICAganNmLCBudWxsLCBzZXRWYWx1ZXMsXHJcbiAgICAgICAgICAgICAgICBzY2hlbWFSZWZQb2ludGVyLFxyXG4gICAgICAgICAgICAgICAgaXRlbVJlZlBvaW50ZXIsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBvaW50ZXIgKyAnL2NvbnRyb2xzLycgKyBpXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBqc2YudGVtcGxhdGVSZWZMaWJyYXJ5W2NvbmRpdGlvbmFsUmVmUG9pbnRlcl09anNmLnRlbXBsYXRlUmVmTGlicmFyeVtpdGVtUmVmUG9pbnRlcl07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29udHJvbHMucHVzaChcclxuICAgICAgICAgICAgICBpc0FycmF5KG5vZGVWYWx1ZSkgP1xyXG4gICAgICAgICAgICAgICAgYnVpbGRGb3JtR3JvdXBUZW1wbGF0ZShcclxuICAgICAgICAgICAgICAgICAganNmLCBub2RlVmFsdWVbaV0sIHNldFZhbHVlcyxcclxuICAgICAgICAgICAgICAgICAgc2NoZW1hUG9pbnRlciArICcvaXRlbXMvJyArIGksXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFQb2ludGVyICsgJy8nICsgaSxcclxuICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQb2ludGVyICsgJy9jb250cm9scy8nICsgaVxyXG4gICAgICAgICAgICAgICAgKSA6XHJcbiAgICAgICAgICAgICAgICBpdGVtUmVjdXJzaXZlID9cclxuICAgICAgICAgICAgICAgICAgbnVsbCA6IGNsb25lRGVlcChqc2YudGVtcGxhdGVSZWZMaWJyYXJ5W3RlbXBsYXRlUmVmVG9Vc2VdKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgJ2FkZGl0aW9uYWxJdGVtcycgaXMgYW4gb2JqZWN0ID0gYWRkaXRpb25hbCBsaXN0IGl0ZW1zIChhZnRlciB0dXBsZSBpdGVtcylcclxuICAgICAgICBpZiAoc2NoZW1hLml0ZW1zLmxlbmd0aCA8IG1heEl0ZW1zICYmIGlzT2JqZWN0KHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMpKSB7XHJcbiAgICAgICAgICBhZGRpdGlvbmFsSXRlbXNQb2ludGVyID0gc2NoZW1hUG9pbnRlciArICcvYWRkaXRpb25hbEl0ZW1zJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmICdpdGVtcycgaXMgYW4gb2JqZWN0ID0gbGlzdCBpdGVtcyBvbmx5IChubyB0dXBsZSBpdGVtcylcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhZGRpdGlvbmFsSXRlbXNQb2ludGVyID0gc2NoZW1hUG9pbnRlciArICcvaXRlbXMnO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoYWRkaXRpb25hbEl0ZW1zUG9pbnRlcikge1xyXG4gICAgICAgIGNvbnN0IHNjaGVtYVJlZlBvaW50ZXIgPSByZW1vdmVSZWN1cnNpdmVSZWZlcmVuY2VzKFxyXG4gICAgICAgICAgYWRkaXRpb25hbEl0ZW1zUG9pbnRlciwganNmLnNjaGVtYVJlY3Vyc2l2ZVJlZk1hcFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgaXRlbVJlZlBvaW50ZXIgPSByZW1vdmVSZWN1cnNpdmVSZWZlcmVuY2VzKFxyXG4gICAgICAgICAgc2hvcnREYXRhUG9pbnRlciArICcvLScsIGpzZi5kYXRhUmVjdXJzaXZlUmVmTWFwLCBqc2YuYXJyYXlNYXBcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IGl0ZW1SZWN1cnNpdmUgPSBpdGVtUmVmUG9pbnRlciAhPT0gc2hvcnREYXRhUG9pbnRlciArICcvLSc7XHJcbiAgICAgICAgLy9pZiBpcyBpbiB0ZW1wbGF0ZUxpYnJhcnkgdGhlbiBuZWVkIHRvIGNoZWNrIGlmIGl0cyBhIGNvbmRpdGlvbmFsXHJcbiAgICAgICAgLy9hbmQgY29uZGl0aW9uYWwgcG9pbnRlcnMgbWF0Y2ggb3J0aGV3aXNlIGNyZWF0ZSBhIG5ldyByZWZcclxuICAgICAgICAgICBsZXQgY29uZGl0aW9uYWxSZWZQb2ludGVyPWAke2l0ZW1SZWZQb2ludGVyfUAke3NjaGVtYVBvaW50ZXJ9YDtcclxuICAgICAgICAgICBsZXQgdGVtcGxhdGVSZWZUb1VzZT1pdGVtUmVmUG9pbnRlcjtcclxuICAgICAgICAgICBpZihoYXNPd24oanNmLnRlbXBsYXRlUmVmTGlicmFyeSwgaXRlbVJlZlBvaW50ZXIpXHJcbiAgICAgICAgICAgICAgJiYgIWhhc093bihqc2YudGVtcGxhdGVSZWZMaWJyYXJ5LCBjb25kaXRpb25hbFJlZlBvaW50ZXIpKXtcclxuICAgICAgICAgICAgICAganNmLnRlbXBsYXRlUmVmTGlicmFyeVtjb25kaXRpb25hbFJlZlBvaW50ZXJdPWJ1aWxkRm9ybUdyb3VwVGVtcGxhdGUoXHJcbiAgICAgICAgICAgICAgICAganNmLCBudWxsLCBzZXRWYWx1ZXMsXHJcbiAgICAgICAgICAgICAgICAgc2NoZW1hUmVmUG9pbnRlcixcclxuICAgICAgICAgICAgICAgICBpdGVtUmVmUG9pbnRlcixcclxuICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBvaW50ZXIgKyAnL2NvbnRyb2xzLy0nIFxyXG4gICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICB0ZW1wbGF0ZVJlZlRvVXNlPWNvbmRpdGlvbmFsUmVmUG9pbnRlcjtcclxuICAgICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFoYXNPd24oanNmLnRlbXBsYXRlUmVmTGlicmFyeSwgaXRlbVJlZlBvaW50ZXIpKSB7XHJcbiAgICAgICAgICBqc2YudGVtcGxhdGVSZWZMaWJyYXJ5W2l0ZW1SZWZQb2ludGVyXSA9IG51bGw7XHJcbiAgICAgICAgICBqc2YudGVtcGxhdGVSZWZMaWJyYXJ5W2l0ZW1SZWZQb2ludGVyXSA9IGJ1aWxkRm9ybUdyb3VwVGVtcGxhdGUoXHJcbiAgICAgICAgICAgIGpzZiwgbnVsbCwgc2V0VmFsdWVzLFxyXG4gICAgICAgICAgICBzY2hlbWFSZWZQb2ludGVyLFxyXG4gICAgICAgICAgICBpdGVtUmVmUG9pbnRlcixcclxuICAgICAgICAgICAgdGVtcGxhdGVQb2ludGVyICsgJy9jb250cm9scy8tJ1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGpzZi50ZW1wbGF0ZVJlZkxpYnJhcnlbY29uZGl0aW9uYWxSZWZQb2ludGVyXT1qc2YudGVtcGxhdGVSZWZMaWJyYXJ5W2l0ZW1SZWZQb2ludGVyXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY29uc3QgaXRlbU9wdGlvbnMgPSBqc2YuZGF0YU1hcC5nZXQoaXRlbVJlZlBvaW50ZXIpIHx8IG5ldyBNYXAoKTtcclxuICAgICAgICBjb25zdCBpdGVtT3B0aW9ucyA9IG5vZGVPcHRpb25zO1xyXG4gICAgICAgIGlmICghaXRlbVJlY3Vyc2l2ZSB8fCBoYXNPd24odmFsaWRhdG9ycywgJ3JlcXVpcmVkJykpIHtcclxuICAgICAgICAgIGNvbnN0IGFycmF5TGVuZ3RoID0gTWF0aC5taW4oTWF0aC5tYXgoXHJcbiAgICAgICAgICAgIGl0ZW1SZWN1cnNpdmUgPyAwIDpcclxuICAgICAgICAgICAgICAoaXRlbU9wdGlvbnMuZ2V0KCd0dXBsZUl0ZW1zJykgKyBpdGVtT3B0aW9ucy5nZXQoJ2xpc3RJdGVtcycpKSB8fCAwLFxyXG4gICAgICAgICAgICBpc0FycmF5KG5vZGVWYWx1ZSkgPyBub2RlVmFsdWUubGVuZ3RoIDogMFxyXG4gICAgICAgICAgKSwgbWF4SXRlbXMpO1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IGNvbnRyb2xzLmxlbmd0aDsgaSA8IGFycmF5TGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29udHJvbHMucHVzaChcclxuICAgICAgICAgICAgICBpc0FycmF5KG5vZGVWYWx1ZSkgP1xyXG4gICAgICAgICAgICAgICAgYnVpbGRGb3JtR3JvdXBUZW1wbGF0ZShcclxuICAgICAgICAgICAgICAgICAganNmLCBub2RlVmFsdWVbaV0sIHNldFZhbHVlcyxcclxuICAgICAgICAgICAgICAgICAgc2NoZW1hUmVmUG9pbnRlcixcclxuICAgICAgICAgICAgICAgICAgZGF0YVBvaW50ZXIgKyAnLy0nLFxyXG4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBvaW50ZXIgKyAnL2NvbnRyb2xzLy0nXHJcbiAgICAgICAgICAgICAgICApIDpcclxuICAgICAgICAgICAgICAgIGl0ZW1SZWN1cnNpdmUgP1xyXG4gICAgICAgICAgICAgICAgICBudWxsIDogY2xvbmVEZWVwKGpzZi50ZW1wbGF0ZVJlZkxpYnJhcnlbdGVtcGxhdGVSZWZUb1VzZV0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB7IGNvbnRyb2xUeXBlLCBjb250cm9scywgdmFsaWRhdG9ycyxzY2hlbWFQb2ludGVyIH07XHJcblxyXG4gICAgY2FzZSAnJHJlZic6XHJcbiAgICAgIGNvbnN0IHNjaGVtYVJlZiA9IEpzb25Qb2ludGVyLmNvbXBpbGUoc2NoZW1hLiRyZWYpO1xyXG4gICAgICBjb25zdCBkYXRhUmVmID0gSnNvblBvaW50ZXIudG9EYXRhUG9pbnRlcihzY2hlbWFSZWYsIHNjaGVtYSk7XHJcbiAgICAgIGNvbnN0IHJlZlBvaW50ZXIgPSByZW1vdmVSZWN1cnNpdmVSZWZlcmVuY2VzKFxyXG4gICAgICAgIGRhdGFSZWYsIGpzZi5kYXRhUmVjdXJzaXZlUmVmTWFwLCBqc2YuYXJyYXlNYXBcclxuICAgICAgKTtcclxuICAgICAgaWYgKHJlZlBvaW50ZXIgJiYgIWhhc093bihqc2YudGVtcGxhdGVSZWZMaWJyYXJ5LCByZWZQb2ludGVyKSkge1xyXG4gICAgICAgIC8vIFNldCB0byBudWxsIGZpcnN0IHRvIHByZXZlbnQgcmVjdXJzaXZlIHJlZmVyZW5jZSBmcm9tIGNhdXNpbmcgZW5kbGVzcyBsb29wXHJcbiAgICAgICAganNmLnRlbXBsYXRlUmVmTGlicmFyeVtyZWZQb2ludGVyXSA9IG51bGw7XHJcbiAgICAgICAgY29uc3QgbmV3VGVtcGxhdGUgPSBidWlsZEZvcm1Hcm91cFRlbXBsYXRlKGpzZiwgc2V0VmFsdWVzLCBzZXRWYWx1ZXMsIHNjaGVtYVJlZik7XHJcbiAgICAgICAgaWYgKG5ld1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICBqc2YudGVtcGxhdGVSZWZMaWJyYXJ5W3JlZlBvaW50ZXJdID0gbmV3VGVtcGxhdGU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGRlbGV0ZSBqc2YudGVtcGxhdGVSZWZMaWJyYXJ5W3JlZlBvaW50ZXJdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBjYXNlICdGb3JtQ29udHJvbCc6XHJcbiAgICAgIGNvbnN0IHZhbHVlID0ge1xyXG4gICAgICAgIHZhbHVlOiBzZXRWYWx1ZXMgJiYgaXNQcmltaXRpdmUobm9kZVZhbHVlKSA/IG5vZGVWYWx1ZSA6IG51bGwsXHJcbiAgICAgICAgZGlzYWJsZWQ6IG5vZGVPcHRpb25zLmdldCgnZGlzYWJsZWQnKSB8fCBmYWxzZVxyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4geyBjb250cm9sVHlwZSwgdmFsdWUsIHZhbGlkYXRvcnMsc2NoZW1hUG9pbnRlciB9O1xyXG5cclxuICAgIC8vVE9ETyBtYXkgbWFrZSBhbiBJRlRoZW5FbHNlIHdpZGdldCBvciBpbnRlZ3JhdGUgaXQgd2l0aCB0aGUgc2VjdGlvblxyXG4gICAgLy93aWRnZXQgIFxyXG4gICAgY2FzZSAnSWZUaGVuRWxzZSc6XHJcbiAgICAgIGNvbnRyb2xzID0ge307XHJcbiAgICAgIGxldCBjb25kaXRpb25UeXBlO1xyXG4gICAgICBpZiAoaGFzT3duKHNjaGVtYSwgXCJpZlwiKSkge1xyXG4gICAgICAgIFtcInRoZW5cIiwgXCJlbHNlXCJdLmZvckVhY2goY29uID0+IHtcclxuICAgICAgICAgIGlmIChoYXNPd24oc2NoZW1hLCBjb24pKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleVNjaGVtYVBvaW50ZXIgPSBgLyR7Y29ufWA7XHJcbiAgICAgICAgICAgIGxldCB0aGVuVEZHVGVtcGxhdGUgPSBidWlsZEZvcm1Hcm91cFRlbXBsYXRlKFxyXG4gICAgICAgICAgICAgIGpzZiwgbm9kZVZhbHVlLCBzZXRWYWx1ZXMsLy9mYWxzZSxcclxuICAgICAgICAgICAgICBzY2hlbWFQb2ludGVyICsga2V5U2NoZW1hUG9pbnRlcixcclxuICAgICAgICAgICAgICBkYXRhUG9pbnRlcixcclxuICAgICAgICAgICAgICB0ZW1wbGF0ZVBvaW50ZXIgKyBgL2NvbnRyb2xzLyR7Y29ufWBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgLy9OQiBzYW1lIHByb3BlcnR5IGNhbiBiZSBpbiBib3RoIHRoZW4gYW5kIGVsc2VcclxuICAgICAgICAgICAgLy9zbyBrZXkgbXVzdCBiZSB0aGUgdW5pcXVlIHBhdGggdG8gY29udHJvbFxyXG4gICAgICAgICAgIFxyXG4gICAgICAgICAgICAvL2xldCBpZkl0ZW1TY2hlbWE9SnNvblBvaW50ZXIuZ2V0KHNjaGVtYSxrZXlTY2hlbWFQb2ludGVyKTtcclxuICAgICAgICAgICAgLy9sZXQgaWZJdGVtVmFsdWU7XHJcbiAgICAgICAgICAgIGlmKGhhc093bih0aGVuVEZHVGVtcGxhdGUsJ2NvbnRyb2xzJykpe1xyXG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoZW5URkdUZW1wbGF0ZS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvbnRyb2xLZXkgPSB0aGVuVEZHVGVtcGxhdGUuY29udHJvbHNba2V5XS5zY2hlbWFQb2ludGVyO1xyXG4gICAgICAgICAgICAgICAgaWYoY29udHJvbEtleSl7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnRyb2xLZXkgPSBwYXRoMkNvbnRyb2xLZXkoY29udHJvbEtleSk7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBjSXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIHRoZW5URkdUZW1wbGF0ZS5jb250cm9sc1trZXldKTtcclxuICBcclxuICAgICAgICAgICAgICAgICAgY29udHJvbHNbY29udHJvbEtleV0gPSBjSXRlbTtcclxuICAgICAgICAgICAgICAgIH0gIFxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHsgY29udHJvbFR5cGUsIGNvbnRyb2xzLCB2YWxpZGF0b3JzLHNjaGVtYVBvaW50ZXIgfTtcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqICdidWlsZEZvcm1Hcm91cCcgZnVuY3Rpb25cclxuICpcclxuICogLy8ge2FueX0gdGVtcGxhdGUgLVxyXG4gKiAvLyB7QWJzdHJhY3RDb250cm9sfVxyXG4qL1xyXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRGb3JtR3JvdXAodGVtcGxhdGU6IGFueSk6IEFic3RyYWN0Q29udHJvbCB7XHJcbiAgY29uc3QgdmFsaWRhdG9yRm5zOiBWYWxpZGF0b3JGbltdID0gW107XHJcbiAgbGV0IHZhbGlkYXRvckZuOiBWYWxpZGF0b3JGbiA9IG51bGw7XHJcbiAgaWYgKGhhc093bih0ZW1wbGF0ZSwgJ3ZhbGlkYXRvcnMnKSkge1xyXG4gICAgZm9yRWFjaCh0ZW1wbGF0ZS52YWxpZGF0b3JzLCAocGFyYW1ldGVycywgdmFsaWRhdG9yKSA9PiB7XHJcbiAgICAgIGlmICh0eXBlb2YgSnNvblZhbGlkYXRvcnNbdmFsaWRhdG9yXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIHZhbGlkYXRvckZucy5wdXNoKEpzb25WYWxpZGF0b3JzW3ZhbGlkYXRvcl0uYXBwbHkobnVsbCwgcGFyYW1ldGVycykpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmICh2YWxpZGF0b3JGbnMubGVuZ3RoICYmXHJcbiAgICAgIGluQXJyYXkodGVtcGxhdGUuY29udHJvbFR5cGUsIFsnRm9ybUdyb3VwJywgJ0Zvcm1BcnJheSddKVxyXG4gICAgKSB7XHJcbiAgICAgIHZhbGlkYXRvckZuID0gdmFsaWRhdG9yRm5zLmxlbmd0aCA+IDEgP1xyXG4gICAgICAgIEpzb25WYWxpZGF0b3JzLmNvbXBvc2UodmFsaWRhdG9yRm5zKSA6IHZhbGlkYXRvckZuc1swXTtcclxuICAgIH1cclxuICB9XHJcbiAgaWYgKGhhc093bih0ZW1wbGF0ZSwgJ2NvbnRyb2xUeXBlJykpIHtcclxuICAgIHN3aXRjaCAodGVtcGxhdGUuY29udHJvbFR5cGUpIHtcclxuICAgICAgY2FzZSAnRm9ybUdyb3VwJzpcclxuXHJcbiAgICAgICAgY29uc3QgZ3JvdXBDb250cm9sczogeyBba2V5OiBzdHJpbmddOiBBYnN0cmFjdENvbnRyb2wgfSA9IHt9O1xyXG4gICAgICAgIGZvckVhY2godGVtcGxhdGUuY29udHJvbHMsIChjb250cm9scywga2V5KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBuZXdDb250cm9sOiBBYnN0cmFjdENvbnRyb2wgPSBidWlsZEZvcm1Hcm91cChjb250cm9scyk7XHJcbiAgICAgICAgICAvL2lmIChuZXdDb250cm9sKSB7IGdyb3VwQ29udHJvbHNba2V5XSA9IG5ld0NvbnRyb2w7IH1cclxuICAgICAgICAgIGlmIChuZXdDb250cm9sKSB7XHJcblxyXG4gICAgICAgICAgICAvKiBleHBlcmltZW50YWwgaWRlYSB3YXMgdG8gdHJ5IHRvIGJlIGFibGUgdG8gc3dpdGNoXHJcbiAgICAgICAgICAgIGNvbmRpdGlvbmFsIGNvbnRyb2xzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZWlyIHNjaGVtYSBwb2ludGVyXHJcbiAgICAgICAgICAgIChub3QgZGF0YXBvaW50ZXIgYXMgdGhhdCBvbmx5IG1hcHMgdG8gb25lIGNvbnRyb2wpXHJcbiAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShncm91cENvbnRyb2xzLCBrZXksIHtcclxuICAgICAgICAgICAgICAgICAgICBnZXQ6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coYEFjY2Vzc2VkIGNvbnRyb2w6ICR7a2V5fWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy9hZGQgc3dpdGNoIGxvZ2ljIGhlcmVcclxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuY29udHJvbDsgXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBzZXQ6KHZhbHVlKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgbmNvbnRyb2w9dmFsdWVcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcclxuICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgZ3JvdXBDb250cm9sc1trZXldID0gbmV3Q29udHJvbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gbmV3IFVudHlwZWRGb3JtR3JvdXAoZ3JvdXBDb250cm9scywgdmFsaWRhdG9yRm4pO1xyXG4gICAgICBjYXNlICdGb3JtQXJyYXknOlxyXG4gICAgICAgIHJldHVybiBuZXcgVW50eXBlZEZvcm1BcnJheShmaWx0ZXIobWFwKHRlbXBsYXRlLmNvbnRyb2xzLFxyXG4gICAgICAgICAgY29udHJvbHMgPT4gYnVpbGRGb3JtR3JvdXAoY29udHJvbHMpXHJcbiAgICAgICAgKSksIHZhbGlkYXRvckZuKTtcclxuICAgICAgY2FzZSAnRm9ybUNvbnRyb2wnOlxyXG4gICAgICAgIHJldHVybiBuZXcgVW50eXBlZEZvcm1Db250cm9sKHRlbXBsYXRlLnZhbHVlLCB2YWxpZGF0b3JGbnMpO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gbnVsbDtcclxufVxyXG5cclxuLyoqXHJcbiAqICdtZXJnZVZhbHVlcycgZnVuY3Rpb25cclxuICpcclxuICogLy8gIHthbnlbXX0gLi4udmFsdWVzVG9NZXJnZSAtIE11bHRpcGxlIHZhbHVlcyB0byBtZXJnZVxyXG4gKiAvLyB7YW55fSAtIE1lcmdlZCB2YWx1ZXNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVZhbHVlcyguLi52YWx1ZXNUb01lcmdlKSB7XHJcbiAgbGV0IG1lcmdlZFZhbHVlczogYW55ID0gbnVsbDtcclxuICBmb3IgKGNvbnN0IGN1cnJlbnRWYWx1ZSBvZiB2YWx1ZXNUb01lcmdlKSB7XHJcbiAgICBpZiAoIWlzRW1wdHkoY3VycmVudFZhbHVlKSkge1xyXG4gICAgICBpZiAodHlwZW9mIGN1cnJlbnRWYWx1ZSA9PT0gJ29iamVjdCcgJiZcclxuICAgICAgICAoaXNFbXB0eShtZXJnZWRWYWx1ZXMpIHx8IHR5cGVvZiBtZXJnZWRWYWx1ZXMgIT09ICdvYmplY3QnKVxyXG4gICAgICApIHtcclxuICAgICAgICBpZiAoaXNBcnJheShjdXJyZW50VmFsdWUpKSB7XHJcbiAgICAgICAgICBtZXJnZWRWYWx1ZXMgPSBbLi4uY3VycmVudFZhbHVlXTtcclxuICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGN1cnJlbnRWYWx1ZSkpIHtcclxuICAgICAgICAgIG1lcmdlZFZhbHVlcyA9IHsgLi4uY3VycmVudFZhbHVlIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjdXJyZW50VmFsdWUgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgbWVyZ2VkVmFsdWVzID0gY3VycmVudFZhbHVlO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KG1lcmdlZFZhbHVlcykgJiYgaXNPYmplY3QoY3VycmVudFZhbHVlKSkge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24obWVyZ2VkVmFsdWVzLCBjdXJyZW50VmFsdWUpO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KG1lcmdlZFZhbHVlcykgJiYgaXNBcnJheShjdXJyZW50VmFsdWUpKSB7XHJcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBjdXJyZW50VmFsdWUpIHtcclxuICAgICAgICAgIG5ld1ZhbHVlcy5wdXNoKG1lcmdlVmFsdWVzKG1lcmdlZFZhbHVlcywgdmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbWVyZ2VkVmFsdWVzID0gbmV3VmFsdWVzO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzQXJyYXkobWVyZ2VkVmFsdWVzKSAmJiBpc09iamVjdChjdXJyZW50VmFsdWUpKSB7XHJcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBtZXJnZWRWYWx1ZXMpIHtcclxuICAgICAgICAgIG5ld1ZhbHVlcy5wdXNoKG1lcmdlVmFsdWVzKHZhbHVlLCBjdXJyZW50VmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbWVyZ2VkVmFsdWVzID0gbmV3VmFsdWVzO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzQXJyYXkobWVyZ2VkVmFsdWVzKSAmJiBpc0FycmF5KGN1cnJlbnRWYWx1ZSkpIHtcclxuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWF4KG1lcmdlZFZhbHVlcy5sZW5ndGgsIGN1cnJlbnRWYWx1ZS5sZW5ndGgpOyBpKyspIHtcclxuICAgICAgICAgIGlmIChpIDwgbWVyZ2VkVmFsdWVzLmxlbmd0aCAmJiBpIDwgY3VycmVudFZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBuZXdWYWx1ZXMucHVzaChtZXJnZVZhbHVlcyhtZXJnZWRWYWx1ZXNbaV0sIGN1cnJlbnRWYWx1ZVtpXSkpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChpIDwgbWVyZ2VkVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBuZXdWYWx1ZXMucHVzaChtZXJnZWRWYWx1ZXNbaV0pO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChpIDwgY3VycmVudFZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBuZXdWYWx1ZXMucHVzaChjdXJyZW50VmFsdWVbaV0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBtZXJnZWRWYWx1ZXMgPSBuZXdWYWx1ZXM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIG1lcmdlZFZhbHVlcztcclxufVxyXG5cclxuLyoqXHJcbiAqICdzZXRSZXF1aXJlZEZpZWxkcycgZnVuY3Rpb25cclxuICpcclxuICogLy8ge3NjaGVtYX0gc2NoZW1hIC0gSlNPTiBTY2hlbWFcclxuICogLy8ge29iamVjdH0gZm9ybUNvbnRyb2xUZW1wbGF0ZSAtIEZvcm0gQ29udHJvbCBUZW1wbGF0ZSBvYmplY3RcclxuICogLy8ge2Jvb2xlYW59IC0gdHJ1ZSBpZiBhbnkgZmllbGRzIGhhdmUgYmVlbiBzZXQgdG8gcmVxdWlyZWQsIGZhbHNlIGlmIG5vdFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFJlcXVpcmVkRmllbGRzKHNjaGVtYTogYW55LCBmb3JtQ29udHJvbFRlbXBsYXRlOiBhbnkpOiBib29sZWFuIHtcclxuICBsZXQgZmllbGRzUmVxdWlyZWQgPSBmYWxzZTtcclxuICBpZiAoaGFzT3duKHNjaGVtYSwgJ3JlcXVpcmVkJykgJiYgIWlzRW1wdHkoc2NoZW1hLnJlcXVpcmVkKSkge1xyXG4gICAgZmllbGRzUmVxdWlyZWQgPSB0cnVlO1xyXG4gICAgbGV0IHJlcXVpcmVkQXJyYXkgPSBpc0FycmF5KHNjaGVtYS5yZXF1aXJlZCkgPyBzY2hlbWEucmVxdWlyZWQgOiBbc2NoZW1hLnJlcXVpcmVkXTtcclxuICAgIHJlcXVpcmVkQXJyYXkgPSBmb3JFYWNoKHJlcXVpcmVkQXJyYXksXHJcbiAgICAgIGtleSA9PiBKc29uUG9pbnRlci5zZXQoZm9ybUNvbnRyb2xUZW1wbGF0ZSwgJy8nICsga2V5ICsgJy92YWxpZGF0b3JzL3JlcXVpcmVkJywgW10pXHJcbiAgICApO1xyXG4gIH1cclxuICByZXR1cm4gZmllbGRzUmVxdWlyZWQ7XHJcblxyXG4gIC8vIFRPRE86IEFkZCBzdXBwb3J0IGZvciBwYXR0ZXJuUHJvcGVydGllc1xyXG4gIC8vIGh0dHBzOi8vc3BhY2V0ZWxlc2NvcGUuZ2l0aHViLmlvL3VuZGVyc3RhbmRpbmctanNvbi1zY2hlbWEvcmVmZXJlbmNlL29iamVjdC5odG1sI3BhdHRlcm4tcHJvcGVydGllc1xyXG59XHJcblxyXG4vKipcclxuICogJ2Zvcm1hdEZvcm1EYXRhJyBmdW5jdGlvblxyXG4gKlxyXG4gKiAvLyB7YW55fSBmb3JtRGF0YSAtIEFuZ3VsYXIgRm9ybUdyb3VwIGRhdGEgb2JqZWN0XHJcbiAqIC8vIHtNYXA8c3RyaW5nLCBhbnk+fSBkYXRhTWFwIC1cclxuICogLy8ge01hcDxzdHJpbmcsIHN0cmluZz59IHJlY3Vyc2l2ZVJlZk1hcCAtXHJcbiAqIC8vIHtNYXA8c3RyaW5nLCBudW1iZXI+fSBhcnJheU1hcCAtXHJcbiAqIC8vIHtib29sZWFuID0gZmFsc2V9IGZpeEVycm9ycyAtIGlmIFRSVUUsIHRyaWVzIHRvIGZpeCBkYXRhXHJcbiAqIC8vIHthbnl9IC0gZm9ybWF0dGVkIGRhdGEgb2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0Rm9ybURhdGEoXHJcbiAgZm9ybURhdGE6IGFueSwgZGF0YU1hcDogTWFwPHN0cmluZywgYW55PixcclxuICByZWN1cnNpdmVSZWZNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4sIGFycmF5TWFwOiBNYXA8c3RyaW5nLCBudW1iZXI+LFxyXG4gIHJldHVybkVtcHR5RmllbGRzID0gZmFsc2UsIGZpeEVycm9ycyA9IGZhbHNlXHJcbik6IGFueSB7XHJcbiAgaWYgKGZvcm1EYXRhID09PSBudWxsIHx8IHR5cGVvZiBmb3JtRGF0YSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZvcm1EYXRhOyB9XHJcbiAgY29uc3QgZm9ybWF0dGVkRGF0YSA9IGlzQXJyYXkoZm9ybURhdGEpID8gW10gOiB7fTtcclxuICBKc29uUG9pbnRlci5mb3JFYWNoRGVlcChmb3JtRGF0YSwgKHZhbHVlLCBkYXRhUG9pbnRlcikgPT4ge1xyXG5cclxuICAgIC8vIElmIHJldHVybkVtcHR5RmllbGRzID09PSB0cnVlLFxyXG4gICAgLy8gYWRkIGVtcHR5IGFycmF5cyBhbmQgb2JqZWN0cyB0byBhbGwgYWxsb3dlZCBrZXlzXHJcbiAgICBpZiAocmV0dXJuRW1wdHlGaWVsZHMgJiYgaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgSnNvblBvaW50ZXIuc2V0KGZvcm1hdHRlZERhdGEsIGRhdGFQb2ludGVyLCBbXSk7XHJcbiAgICB9IGVsc2UgaWYgKHJldHVybkVtcHR5RmllbGRzICYmIGlzT2JqZWN0KHZhbHVlKSAmJiAhaXNEYXRlKHZhbHVlKSkge1xyXG4gICAgICBKc29uUG9pbnRlci5zZXQoZm9ybWF0dGVkRGF0YSwgZGF0YVBvaW50ZXIsIHt9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGdlbmVyaWNQb2ludGVyID1cclxuICAgICAgICBKc29uUG9pbnRlci5oYXMoZGF0YU1hcCwgW2RhdGFQb2ludGVyLCAnc2NoZW1hVHlwZSddKSA/IGRhdGFQb2ludGVyIDpcclxuICAgICAgICAgIHJlbW92ZVJlY3Vyc2l2ZVJlZmVyZW5jZXMoZGF0YVBvaW50ZXIsIHJlY3Vyc2l2ZVJlZk1hcCwgYXJyYXlNYXApO1xyXG4gICAgICBpZiAoSnNvblBvaW50ZXIuaGFzKGRhdGFNYXAsIFtnZW5lcmljUG9pbnRlciwgJ3NjaGVtYVR5cGUnXSkpIHtcclxuICAgICAgICBjb25zdCBzY2hlbWFUeXBlOiBTY2hlbWFQcmltaXRpdmVUeXBlIHwgU2NoZW1hUHJpbWl0aXZlVHlwZVtdID1cclxuICAgICAgICAgIGRhdGFNYXAuZ2V0KGdlbmVyaWNQb2ludGVyKS5nZXQoJ3NjaGVtYVR5cGUnKTtcclxuICAgICAgICBpZiAoc2NoZW1hVHlwZSA9PT0gJ251bGwnKSB7XHJcbiAgICAgICAgICBKc29uUG9pbnRlci5zZXQoZm9ybWF0dGVkRGF0YSwgZGF0YVBvaW50ZXIsIG51bGwpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoKGhhc1ZhbHVlKHZhbHVlKSB8fCByZXR1cm5FbXB0eUZpZWxkcykgJiZcclxuICAgICAgICAgIGluQXJyYXkoc2NoZW1hVHlwZSwgWydzdHJpbmcnLCAnaW50ZWdlcicsICdudW1iZXInLCAnYm9vbGVhbiddKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSAoZml4RXJyb3JzIHx8ICh2YWx1ZSA9PT0gbnVsbCAmJiByZXR1cm5FbXB0eUZpZWxkcykpID9cclxuICAgICAgICAgICAgdG9TY2hlbWFUeXBlKHZhbHVlLCBzY2hlbWFUeXBlKSA6IHRvSmF2YVNjcmlwdFR5cGUodmFsdWUsIHNjaGVtYVR5cGUpO1xyXG4gICAgICAgICAgaWYgKGlzRGVmaW5lZChuZXdWYWx1ZSkgfHwgcmV0dXJuRW1wdHlGaWVsZHMpIHtcclxuICAgICAgICAgICAgSnNvblBvaW50ZXIuc2V0KGZvcm1hdHRlZERhdGEsIGRhdGFQb2ludGVyLCBuZXdWYWx1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgLy8gY29tbWVudGVkIG91dCBjb21wbGV0ZWx5IGFzIHZhbHVlIGNhbiBiZSAnbnVsbCcgaWYgbm90IGVudGVyZWRcclxuXHJcbiAgICAgICAgLy8gRmluaXNoIGluY29tcGxldGUgJ2RhdGUtdGltZScgZW50cmllc1xyXG4gICAgICAgIC8vIGlmIChkYXRhTWFwLmdldChnZW5lcmljUG9pbnRlcikuZ2V0KCdzY2hlbWFGb3JtYXQnKSA9PT0gJ2RhdGUtdGltZScpIHtcclxuXHJcbiAgICAgICAgLy8gICAvKiBjb21tZW50ZWQgb3V0LXNob3VsZCB1c2Ugc2FtZSBmb3JtYXQgYXMgZGF0ZXRpbWUtbG9jYWwgaW5wdXRcclxuICAgICAgICAvLyAgIGZvciBpbml0aWFsIGRhdGEgdG8gYmluZCBiYWNrIHRvIHRoZSBpbnB1dFxyXG4gICAgICAgIC8vICAgLy8gXCIyMDAwLTAzLTE0VDAxOjU5OjI2LjUzNVwiIC0+IFwiMjAwMC0wMy0xNFQwMTo1OToyNi41MzVaXCIgKGFkZCBcIlpcIilcclxuICAgICAgICAvLyAgIGlmICgvXlxcZFxcZFxcZFxcZC1bMC0xXVxcZC1bMC0zXVxcZFt0XFxzXVswLTJdXFxkOlswLTVdXFxkOlswLTVdXFxkKD86XFwuXFxkKyk/JC9pLnRlc3QodmFsdWUpKSB7XHJcbiAgICAgICAgLy8gICAgIEpzb25Qb2ludGVyLnNldChmb3JtYXR0ZWREYXRhLCBkYXRhUG9pbnRlciwgYCR7dmFsdWV9WmApO1xyXG4gICAgICAgIC8vICAgICAvLyBcIjIwMDAtMDMtMTRUMDE6NTlcIiAtPiBcIjIwMDAtMDMtMTRUMDE6NTk6MDBaXCIgKGFkZCBcIjowMFpcIilcclxuICAgICAgICAvLyAgIH0gZWxzZSBpZiAoL15cXGRcXGRcXGRcXGQtWzAtMV1cXGQtWzAtM11cXGRbdFxcc11bMC0yXVxcZDpbMC01XVxcZCQvaS50ZXN0KHZhbHVlKSkge1xyXG4gICAgICAgIC8vICAgICBKc29uUG9pbnRlci5zZXQoZm9ybWF0dGVkRGF0YSwgZGF0YVBvaW50ZXIsIGAke3ZhbHVlfTowMFpgKTtcclxuICAgICAgICAvLyAgICAgLy8gXCIyMDAwLTAzLTE0XCIgLT4gXCIyMDAwLTAzLTE0VDAwOjAwOjAwWlwiIChhZGQgXCJUMDA6MDA6MDBaXCIpXHJcbiAgICAgICAgLy8gICB9IGVsc2UgaWYgKGZpeEVycm9ycyAmJiAvXlxcZFxcZFxcZFxcZC1bMC0xXVxcZC1bMC0zXVxcZCQvaS50ZXN0KHZhbHVlKSkge1xyXG4gICAgICAgIC8vICAgICBKc29uUG9pbnRlci5zZXQoZm9ybWF0dGVkRGF0YSwgZGF0YVBvaW50ZXIsIGAke3ZhbHVlfTowMDowMDowMFpgKTtcclxuICAgICAgICAvLyAgIH1cclxuICAgICAgICAvLyAgICovXHJcbiAgICAgICAgLy8gICBKc29uUG9pbnRlci5zZXQoZm9ybWF0dGVkRGF0YSwgZGF0YVBvaW50ZXIsIGAke3ZhbHVlfWApO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IGlzRGF0ZSh2YWx1ZSkgfHxcclxuICAgICAgICAodmFsdWUgPT09IG51bGwgJiYgcmV0dXJuRW1wdHlGaWVsZHMpXHJcbiAgICAgICkge1xyXG4gICAgICAgIGlmIChnZW5lcmljUG9pbnRlci5pbmRleE9mKFwiLyRcIik+PTApIHtcclxuICAgICAgICAgIHJldHVybiBmb3JtYXR0ZWREYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zb2xlLmVycm9yKCdmb3JtYXRGb3JtRGF0YSBlcnJvcjogJyArXHJcbiAgICAgICAgICBgU2NoZW1hIHR5cGUgbm90IGZvdW5kIGZvciBmb3JtIHZhbHVlIGF0ICR7Z2VuZXJpY1BvaW50ZXJ9YCk7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignZGF0YU1hcCcsIGRhdGFNYXApO1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3JlY3Vyc2l2ZVJlZk1hcCcsIHJlY3Vyc2l2ZVJlZk1hcCk7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignZ2VuZXJpY1BvaW50ZXInLCBnZW5lcmljUG9pbnRlcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxuICByZXR1cm4gZm9ybWF0dGVkRGF0YTtcclxufVxyXG5cclxuLyoqXHJcbiAqICdnZXRDb250cm9sJyBmdW5jdGlvblxyXG4gKlxyXG4gKiBVc2VzIGEgSlNPTiBQb2ludGVyIGZvciBhIGRhdGEgb2JqZWN0IHRvIHJldHJpZXZlIGEgY29udHJvbCBmcm9tXHJcbiAqIGFuIEFuZ3VsYXIgZm9ybUdyb3VwIG9yIGZvcm1Hcm91cCB0ZW1wbGF0ZS4gKE5vdGU6IHRob3VnaCBhIGZvcm1Hcm91cFxyXG4gKiB0ZW1wbGF0ZSBpcyBtdWNoIHNpbXBsZXIsIGl0cyBiYXNpYyBzdHJ1Y3R1cmUgaXMgaWRlbnRpYWwgdG8gYSBmb3JtR3JvdXApLlxyXG4gKlxyXG4gKiBJZiB0aGUgb3B0aW9uYWwgdGhpcmQgcGFyYW1ldGVyICdyZXR1cm5Hcm91cCcgaXMgc2V0IHRvIFRSVUUsIHRoZSBncm91cFxyXG4gKiBjb250YWluaW5nIHRoZSBjb250cm9sIGlzIHJldHVybmVkLCByYXRoZXIgdGhhbiB0aGUgY29udHJvbCBpdHNlbGYuXHJcbiAqXHJcbiAqIC8vIHtGb3JtR3JvdXB9IGZvcm1Hcm91cCAtIEFuZ3VsYXIgRm9ybUdyb3VwIHRvIGdldCB2YWx1ZSBmcm9tXHJcbiAqIC8vIHtQb2ludGVyfSBkYXRhUG9pbnRlciAtIEpTT04gUG9pbnRlciAoc3RyaW5nIG9yIGFycmF5KVxyXG4gKiAvLyB7Ym9vbGVhbiA9IGZhbHNlfSByZXR1cm5Hcm91cCAtIElmIHRydWUsIHJldHVybiBncm91cCBjb250YWluaW5nIGNvbnRyb2xcclxuICogLy8ge2dyb3VwfSAtIExvY2F0ZWQgdmFsdWUgKG9yIG51bGwsIGlmIG5vIGNvbnRyb2wgZm91bmQpXHJcbiAqIC8vIHtzdHJpbmd9IHNjaGVtYVBvaW50ZXIgLSBzdHJpbmcgdXNlZCBmb3IgY29uZGl0aW9uYWwgY29udHJvbHMgY29taW5nIGZyb20gc2NoZW1hIGlmL3RoZW4vZWxzZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRyb2woXHJcbiAgZm9ybUdyb3VwOiBhbnksIGRhdGFQb2ludGVyOiBQb2ludGVyLCByZXR1cm5Hcm91cCA9IGZhbHNlLCBzY2hlbWFQb2ludGVyPzogc3RyaW5nXHJcbik6IGFueSB7XHJcbiAgaWYgKCFpc09iamVjdChmb3JtR3JvdXApIHx8ICFKc29uUG9pbnRlci5pc0pzb25Qb2ludGVyKGRhdGFQb2ludGVyKSkge1xyXG4gICAgaWYgKCFKc29uUG9pbnRlci5pc0pzb25Qb2ludGVyKGRhdGFQb2ludGVyKSkge1xyXG4gICAgICAvLyBJZiBkYXRhUG9pbnRlciBpbnB1dCBpcyBub3QgYSB2YWxpZCBKU09OIHBvaW50ZXIsIGNoZWNrIHRvXHJcbiAgICAgIC8vIHNlZSBpZiBpdCBpcyBpbnN0ZWFkIGEgdmFsaWQgb2JqZWN0IHBhdGgsIHVzaW5nIGRvdCBub3RhaW9uXHJcbiAgICAgIGlmICh0eXBlb2YgZGF0YVBvaW50ZXIgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29uc3QgY29udHJvbFBhdGg9ISFzY2hlbWFQb2ludGVyP3BhdGgyQ29udHJvbEtleShzY2hlbWFQb2ludGVyKTpkYXRhUG9pbnRlclxyXG4gICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gZm9ybUdyb3VwLmdldChjb250cm9sUGF0aCk7XHJcbiAgICAgICAgaWYgKGZvcm1Db250cm9sKSB7IHJldHVybiBmb3JtQ29udHJvbDsgfVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoYGdldENvbnRyb2wgZXJyb3I6IEludmFsaWQgSlNPTiBQb2ludGVyOiAke2RhdGFQb2ludGVyfWApO1xyXG4gICAgfVxyXG4gICAgaWYgKCFpc09iamVjdChmb3JtR3JvdXApKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoYGdldENvbnRyb2wgZXJyb3I6IEludmFsaWQgZm9ybUdyb3VwOiAke2Zvcm1Hcm91cH1gKTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICBsZXQgZGF0YVBvaW50ZXJBcnJheSA9IEpzb25Qb2ludGVyLnBhcnNlKGRhdGFQb2ludGVyKTtcclxuICBpZiAocmV0dXJuR3JvdXApIHsgZGF0YVBvaW50ZXJBcnJheSA9IGRhdGFQb2ludGVyQXJyYXkuc2xpY2UoMCwgLTEpOyB9XHJcblxyXG4gIC8vIElmIGZvcm1Hcm91cCBpbnB1dCBpcyBhIHJlYWwgZm9ybUdyb3VwIChub3QgYSBmb3JtR3JvdXAgdGVtcGxhdGUpXHJcbiAgLy8gdHJ5IHVzaW5nIGZvcm1Hcm91cC5nZXQoKSB0byByZXR1cm4gdGhlIGNvbnRyb2xcclxuICBpZiAodHlwZW9mIGZvcm1Hcm91cC5nZXQgPT09ICdmdW5jdGlvbicgJiZcclxuICAgIGRhdGFQb2ludGVyQXJyYXkuZXZlcnkoa2V5ID0+IGtleS5pbmRleE9mKCcuJykgPT09IC0xKVxyXG4gICkge1xyXG4gICAgY29uc3QgY29udHJvbFBhdGg9ISFzY2hlbWFQb2ludGVyP3BhdGgyQ29udHJvbEtleShzY2hlbWFQb2ludGVyKTpkYXRhUG9pbnRlckFycmF5LmpvaW4oJy4nKTtcclxuICAgIGNvbnN0IGZvcm1Db250cm9sID0gIGZvcm1Hcm91cC5nZXQoY29udHJvbFBhdGgpO1xyXG4gICAgaWYgKGZvcm1Db250cm9sKSB7IHJldHVybiBmb3JtQ29udHJvbDsgfVxyXG4gIH1cclxuXHJcbiAgLy8gSWYgZm9ybUdyb3VwIGlucHV0IGlzIGEgZm9ybUdyb3VwIHRlbXBsYXRlLFxyXG4gIC8vIG9yIGZvcm1Hcm91cC5nZXQoKSBmYWlsZWQgdG8gcmV0dXJuIHRoZSBjb250cm9sLFxyXG4gIC8vIHNlYXJjaCB0aGUgZm9ybUdyb3VwIG9iamVjdCBmb3IgZGF0YVBvaW50ZXIncyBjb250cm9sXHJcblxyXG4gIGxldCBzdWJHcm91cCA9IGZvcm1Hcm91cDtcclxuICAvL2lmIHNjaGVtYXBvaW50ZXIgcHJvdmlkZWQgYnV0IG5vIGNvbnRyb2wgbWF0Y2hlZFxyXG4gIC8vaXQgY291bGQgbWVhbiB0aGUgc2NoZW1hIHBvaW50ZXIgaXMgYSBuZXN0ZWQgY2hpbGRcclxuICAvL2ZvciBleGFtcGxlIHRoaXMgY291bGQgYmUgaW4gZm9ybSBncm91cFxyXG4gIC8vZm9ybUdyb3VwLmNvbnRyb2xzLiRhbGxPZiQwJHRoZW4kcHJvcGVydGllcyRmb29cclxuICAvL2J1dCBzY2hlbWFwb2ludGVyIHByb3ZpZGVkIGlzICcvYWxsT2YvMC90aGVuL3Byb3BlcnRpZXMvZm9vL2l0ZW1zL3Byb3BlcnRpZXMvbmFtZSdcclxuICAvL2FuZCBkYXRhUG9pbnRlciBpcyAnL2Zvby8wL25hbWUnXHJcbiAgLy90aGVuIG5lZWQgdG8gbG9vayBpbiBmb3JtR3JvdXAuY29udHJvbHMuJGFsbE9mJDAkdGhlbiRwcm9wZXJ0aWVzJGZvb1xyXG4gIC8vZm9yIGNvbnRyb2wgcGF0aCAvMC9uYW1lXHJcbiAgaWYoc2NoZW1hUG9pbnRlcil7XHJcbiAgICBsZXQgY29udHJvbFBvaW50ZXI9SnNvblBvaW50ZXIudG9Db250cm9sUG9pbnRlcihkYXRhUG9pbnRlcix7fSk7XHJcbiAgICBsZXQgc2NoZW1hUG9pbnRlckFycmF5PXNjaGVtYVBvaW50ZXIuc3BsaXQoJy8nKVxyXG4gICAgbGV0IGNvbnRyb2xQb2ludGVyQXJyYXk9SnNvblBvaW50ZXIucGFyc2UoZGF0YVBvaW50ZXIpO1xyXG4gICAgLy9jb250cm9sUG9pbnRlci5zcGxpdCgnLycpLnNwbGljZSgxKTtcclxuXHJcbiAgICBsZXQgY3VyclNQQUtleTtcclxuICAgIGxldCBzcEZvcm1Hcm91cDtcclxuICAgIHdoaWxlKHNjaGVtYVBvaW50ZXJBcnJheS5sZW5ndGg+MCl7XHJcbiAgICAgIGN1cnJTUEFLZXk9c2NoZW1hUG9pbnRlckFycmF5LnBvcCgpO1xyXG4gICAgICBsZXQgY2tleT1wYXRoMkNvbnRyb2xLZXkoc2NoZW1hUG9pbnRlckFycmF5LmpvaW4oXCIvXCIpKTtcclxuICAgICAgc3BGb3JtR3JvdXA9Zm9ybUdyb3VwLmdldChja2V5KTtcclxuICAgICAgaWYoY29udHJvbFBvaW50ZXJBcnJheVswXT09c2NoZW1hUG9pbnRlckFycmF5W3NjaGVtYVBvaW50ZXJBcnJheS5sZW5ndGgtMV0pe1xyXG4gICAgICAgIGNvbnRyb2xQb2ludGVyQXJyYXkuc2hpZnQoKTtcclxuICAgICAgfVxyXG4gICAgICBpZihzcEZvcm1Hcm91cCl7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHN1Ykdyb3VwPXNwRm9ybUdyb3VwfHxzdWJHcm91cDtcclxuICAgIGRhdGFQb2ludGVyQXJyYXk9c3BGb3JtR3JvdXA/Y29udHJvbFBvaW50ZXJBcnJheTpkYXRhUG9pbnRlckFycmF5O1xyXG5cclxuICB9XHJcbiAgZm9yIChjb25zdCBrZXkgb2YgZGF0YVBvaW50ZXJBcnJheSkge1xyXG4gICAgaWYgKGhhc093bihzdWJHcm91cCwgJ2NvbnRyb2xzJykpIHsgc3ViR3JvdXAgPSBzdWJHcm91cC5jb250cm9sczsgfVxyXG4gICAgaWYgKHNjaGVtYVBvaW50ZXIgJiYgaGFzT3duKHN1Ykdyb3VwLCBwYXRoMkNvbnRyb2xLZXkoc2NoZW1hUG9pbnRlciApKSkge1xyXG4gICAgICBzdWJHcm91cCA9IHN1Ykdyb3VwW3BhdGgyQ29udHJvbEtleShzY2hlbWFQb2ludGVyICldO1xyXG4gICAgICByZXR1cm4gc3ViR3JvdXA7XHJcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkoc3ViR3JvdXApICYmIChrZXkgPT09ICctJykpIHtcclxuICAgICAgc3ViR3JvdXAgPSBzdWJHcm91cFtzdWJHcm91cC5sZW5ndGggLSAxXTtcclxuICAgIH0gZWxzZSBpZiAoaGFzT3duKHN1Ykdyb3VwLCBrZXkpKSB7XHJcbiAgICAgIHN1Ykdyb3VwID0gc3ViR3JvdXBba2V5XTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoYGdldENvbnRyb2wgZXJyb3I6IFVuYWJsZSB0byBmaW5kIFwiJHtrZXl9XCIgaXRlbSBpbiBGb3JtR3JvdXAuYCk7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZGF0YVBvaW50ZXIpO1xyXG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1Hcm91cCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIHN1Ykdyb3VwO1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqICdzZXRDb250cm9sJyBmdW5jdGlvblxyXG4gKlxyXG4gKiBVc2VzIGEgSlNPTiBQb2ludGVyIGZvciBhIGRhdGEgb2JqZWN0IHRvIHJldHJpZXZlIGEgY29udHJvbCBmcm9tXHJcbiAqIGFuIEFuZ3VsYXIgZm9ybUdyb3VwIG9yIGZvcm1Hcm91cCB0ZW1wbGF0ZS4gKE5vdGU6IHRob3VnaCBhIGZvcm1Hcm91cFxyXG4gKiB0ZW1wbGF0ZSBpcyBtdWNoIHNpbXBsZXIsIGl0cyBiYXNpYyBzdHJ1Y3R1cmUgaXMgaWRlbnRpYWwgdG8gYSBmb3JtR3JvdXApLlxyXG4gKlxyXG4gKiBJZiB0aGUgb3B0aW9uYWwgdGhpcmQgcGFyYW1ldGVyICdyZXR1cm5Hcm91cCcgaXMgc2V0IHRvIFRSVUUsIHRoZSBncm91cFxyXG4gKiBjb250YWluaW5nIHRoZSBjb250cm9sIGlzIHJldHVybmVkLCByYXRoZXIgdGhhbiB0aGUgY29udHJvbCBpdHNlbGYuXHJcbiAqXHJcbiAqIC8vIHtGb3JtR3JvdXB9IGZvcm1Hcm91cCAtIEFuZ3VsYXIgRm9ybUdyb3VwIHRvIGdldCB2YWx1ZSBmcm9tXHJcbiAqIC8vIHtQb2ludGVyfSBkYXRhUG9pbnRlciAtIEpTT04gUG9pbnRlciAoc3RyaW5nIG9yIGFycmF5KVxyXG4gKiAvLyB7QWJzdHJhY3RDb250cm9sfSBjb250cm9sIC0gY29udHJvbCB1c2VkIHRvIHJlcGxhY2UgZXhpc3Rpbmcgb3IgYWRkXHJcbiAqIC8vIHt0YXJnZXRLZXl9IC0gb3B0aW9uYWwgc3RyaW5nIHVzZWQgYXMgdGhlIG5ldyBrZXktbm90IGltcGxlbWVudGVkIGFzIHlldFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNldENvbnRyb2woXHJcbiAgZm9ybUdyb3VwOiBhbnksIGRhdGFQb2ludGVyOiBQb2ludGVyLCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIHRhcmdldEtleT86IHN0cmluZyxcclxuKTogYW55IHtcclxuXHJcbiAgbGV0IGRhdGFQb2ludGVyQXJyYXkgPSBKc29uUG9pbnRlci5wYXJzZShkYXRhUG9pbnRlcik7XHJcblxyXG5cclxuICAvLyBJZiBmb3JtR3JvdXAgaW5wdXQgaXMgYSByZWFsIGZvcm1Hcm91cCAobm90IGEgZm9ybUdyb3VwIHRlbXBsYXRlKVxyXG4gIC8vIHRyeSB1c2luZyBmb3JtR3JvdXAuZ2V0KCkgdG8gcmV0dXJuIHRoZSBjb250cm9sXHJcbiAgLypcclxuICBpZiAodHlwZW9mIGZvcm1Hcm91cC5nZXQgPT09ICdmdW5jdGlvbicgJiZcclxuICAgIGRhdGFQb2ludGVyQXJyYXkuZXZlcnkoa2V5ID0+IGtleS5pbmRleE9mKCcuJykgPT09IC0xKVxyXG4gICkge1xyXG4gICAgZm9ybUdyb3VwLnNldENvbnRyb2woZGF0YVBvaW50ZXJBcnJheS5qb2luKCcuJyksIGNvbnRyb2wpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuICAqL1xyXG4gIGxldCBjdXJyZW50R3JvdXA6IGFueT0gZm9ybUdyb3VwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhUG9pbnRlckFycmF5Lmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICAvLyBOYXZpZ2F0ZSBkb3duIHRoZSBmb3JtIHN0cnVjdHVyZSB0byBmaW5kIHRoZSBjb3JyZWN0IG5lc3RlZCBGb3JtR3JvdXBcclxuICAgICAgY3VycmVudEdyb3VwID0gY3VycmVudEdyb3VwLmdldChkYXRhUG9pbnRlckFycmF5W2ldKTtcclxuICBcclxuICAgICAgLy8gSWYgaXQncyBub3QgYSBGb3JtR3JvdXAsIHdlIHRocm93IGFuIGVycm9yIHNpbmNlIHdlIGNhbid0IHNldCBhIGNvbnRyb2wgaW4gYSBub24tZ3JvdXAuXHJcbiAgICAgIGlmICghKHR5cGVvZiBjdXJyZW50R3JvdXAuc2V0Q29udHJvbD09PSAnZnVuY3Rpb24nICkpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggJyR7ZGF0YVBvaW50ZXJBcnJheVtpXX0nIGlzIG5vdCBhIHZhbGlkIEZvcm1Hcm91cCBvciAgRm9ybUFycmF5LmApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgXHJcbiAgICAvLyBOb3cgd2UgYXJlIGF0IHRoZSBwYXJlbnQgRm9ybUdyb3VwLCBzZXQgdGhlIGNvbnRyb2wgYXQgdGhlIGxhc3QgcGFydCBvZiB0aGUgcGF0aFxyXG4gICAgY29uc3QgbGFzdFBhcnQgPSBkYXRhUG9pbnRlckFycmF5W2RhdGFQb2ludGVyQXJyYXkubGVuZ3RoIC0gMV07XHJcbiAgXHJcbiAgICAvLyBTZXQgdGhlIGNvbnRyb2wgYXQgdGhlIGZpbmFsIHBhdGggKGxpa2UgJ25hbWUnIGluc2lkZSAnc3RhdGUnKVxyXG4gICAgY3VycmVudEdyb3VwLnNldENvbnRyb2wobGFzdFBhcnQsIGNvbnRyb2wpO1xyXG4gIFxyXG4gIFxyXG5cclxuICAvLyBJZiBmb3JtR3JvdXAgaW5wdXQgaXMgYSBmb3JtR3JvdXAgdGVtcGxhdGUsXHJcbiAgLy8gb3IgZm9ybUdyb3VwLmdldCgpIGZhaWxlZCB0byByZXR1cm4gdGhlIGNvbnRyb2wsXHJcbiAgLy8gc2VhcmNoIHRoZSBmb3JtR3JvdXAgb2JqZWN0IGZvciBkYXRhUG9pbnRlcidzIGNvbnRyb2xcclxuICAvL1RPRE8gbmVlZHMgdG8gYmUgYWRhcHRlZCB0byBzZXRDb250cm9sXHJcbiAgLypcclxuICBsZXQgc3ViR3JvdXAgPSBmb3JtR3JvdXA7XHJcbiAgZm9yIChjb25zdCBrZXkgb2YgZGF0YVBvaW50ZXJBcnJheSkge1xyXG4gICAgaWYgKGhhc093bihzdWJHcm91cCwgJ2NvbnRyb2xzJykpIHsgc3ViR3JvdXAgPSBzdWJHcm91cC5jb250cm9sczsgfVxyXG4gICAgaWYgKGlzQXJyYXkoc3ViR3JvdXApICYmIChrZXkgPT09ICctJykpIHtcclxuICAgICAgc3ViR3JvdXAgPSBzdWJHcm91cFtzdWJHcm91cC5sZW5ndGggLSAxXTtcclxuICAgIH0gZWxzZSBpZiAoaGFzT3duKHN1Ykdyb3VwLCBrZXkpKSB7XHJcbiAgICAgIHN1Ykdyb3VwID0gc3ViR3JvdXBba2V5XTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoYGdldENvbnRyb2wgZXJyb3I6IFVuYWJsZSB0byBmaW5kIFwiJHtrZXl9XCIgaXRlbSBpbiBGb3JtR3JvdXAuYCk7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZGF0YVBvaW50ZXIpO1xyXG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1Hcm91cCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIHN1Ykdyb3VwO1xyXG4gICovXHJcbn1cclxuIl19
|