@bryntum/grid-angular-thin 7.2.4 → 7.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +5 -5
  2. package/bundles/bryntum-grid-angular-thin.umd.js +773 -230
  3. package/bundles/bryntum-grid-angular-thin.umd.js.map +1 -1
  4. package/esm2015/lib/bryntum-a-i-filter-field.component.js +66 -14
  5. package/esm2015/lib/bryntum-checklist-filter-combo.component.js +66 -14
  6. package/esm2015/lib/bryntum-grid-base.component.js +78 -35
  7. package/esm2015/lib/bryntum-grid-chart-designer.component.js +61 -12
  8. package/esm2015/lib/bryntum-grid-field-filter-picker-group.component.js +65 -21
  9. package/esm2015/lib/bryntum-grid-field-filter-picker.component.js +65 -21
  10. package/esm2015/lib/bryntum-grid.component.js +78 -35
  11. package/esm2015/lib/bryntum-group-bar.component.js +61 -12
  12. package/esm2015/lib/bryntum-tree-combo.component.js +66 -14
  13. package/esm2015/lib/bryntum-tree-grid.component.js +78 -35
  14. package/esm2015/lib/grid.module.js +5 -4
  15. package/esm2015/lib/shadowdom.helper.js +82 -0
  16. package/fesm2015/bryntum-grid-angular-thin.js +750 -207
  17. package/fesm2015/bryntum-grid-angular-thin.js.map +1 -1
  18. package/lib/bryntum-a-i-filter-field.component.d.ts +97 -133
  19. package/lib/bryntum-checklist-filter-combo.component.d.ts +116 -166
  20. package/lib/bryntum-grid-base.component.d.ts +238 -303
  21. package/lib/bryntum-grid-chart-designer.component.d.ts +71 -108
  22. package/lib/bryntum-grid-field-filter-picker-group.component.d.ts +93 -143
  23. package/lib/bryntum-grid-field-filter-picker.component.d.ts +94 -145
  24. package/lib/bryntum-grid.component.d.ts +238 -303
  25. package/lib/bryntum-group-bar.component.d.ts +77 -118
  26. package/lib/bryntum-tree-combo.component.d.ts +117 -168
  27. package/lib/bryntum-tree-grid.component.d.ts +238 -303
  28. package/lib/grid.module.d.ts +2 -1
  29. package/lib/shadowdom.helper.d.ts +3 -0
  30. package/package.json +1 -1
  31. package/src/lib/bryntum-a-i-filter-field.component.ts +159 -142
  32. package/src/lib/bryntum-checklist-filter-combo.component.ts +179 -176
  33. package/src/lib/bryntum-grid-base.component.ts +300 -344
  34. package/src/lib/bryntum-grid-chart-designer.component.ts +127 -113
  35. package/src/lib/bryntum-grid-field-filter-picker-group.component.ts +154 -154
  36. package/src/lib/bryntum-grid-field-filter-picker.component.ts +153 -154
  37. package/src/lib/bryntum-grid.component.ts +300 -344
  38. package/src/lib/bryntum-group-bar.component.ts +134 -124
  39. package/src/lib/bryntum-theme-combo.component.ts +127 -0
  40. package/src/lib/bryntum-tree-combo.component.ts +179 -177
  41. package/src/lib/bryntum-tree-grid.component.ts +300 -344
  42. package/src/lib/grid.module.ts +2 -1
  43. package/src/lib/shadowdom.helper.ts +91 -0
@@ -6,6 +6,7 @@ import { Component, EventEmitter, Output, Input } from '@angular/core';
6
6
  import WrapperHelper from './wrapper.helper';
7
7
  import { Widget } from '@bryntum/core-thin';
8
8
  import { ChecklistFilterCombo } from '@bryntum/grid-thin';
9
+ import { initThemeInShadowRoots } from './shadowdom.helper';
9
10
  import * as i0 from "@angular/core";
10
11
  export class BryntumChecklistFilterComboComponent {
11
12
  constructor(element) {
@@ -48,8 +49,7 @@ export class BryntumChecklistFilterComboComponent {
48
49
  this.onBeforeShow = new EventEmitter();
49
50
  /**
50
51
  * Fires when any other event is fired from the object.
51
- * ...
52
- * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/widget/ChecklistFilterCombo#event-catchAll)
52
+ * [More...](https://bryntum.com/products/grid/docs/api/Grid/widget/ChecklistFilterCombo#event-catchAll)
53
53
  * @param {object} event Event object
54
54
  * @param {{[key: string]: any, type: string}} event.event The Object that contains event details
55
55
  * @param {string} event.event.type The type of the event which is caught by the listener
@@ -69,8 +69,7 @@ export class BryntumChecklistFilterComboComponent {
69
69
  this.onChange = new EventEmitter();
70
70
  /**
71
71
  * Fired when this field is [cleared](https://bryntum.com/products/grid/docs/api/Core/widget/Field#function-clear).
72
- * ...
73
- * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/widget/ChecklistFilterCombo#event-clear)
72
+ * [More...](https://bryntum.com/products/grid/docs/api/Grid/widget/ChecklistFilterCombo#event-clear)
74
73
  * @param {object} event Event object
75
74
  * @param {Core.widget.Field,any} event.source This Field
76
75
  */
@@ -129,8 +128,7 @@ export class BryntumChecklistFilterComboComponent {
129
128
  /**
130
129
  * Triggered when a widget which had been in a non-visible state for any reason
131
130
  * achieves visibility.
132
- * ...
133
- * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/widget/ChecklistFilterCombo#event-paint)
131
+ * [More...](https://bryntum.com/products/grid/docs/api/Grid/widget/ChecklistFilterCombo#event-paint)
134
132
  * @param {object} event Event object
135
133
  * @param {Core.widget.Widget} event.source The widget being painted.
136
134
  * @param {boolean} event.firstPaint `true` if this is the first paint.
@@ -225,9 +223,61 @@ export class BryntumChecklistFilterComboComponent {
225
223
  else {
226
224
  WrapperHelper.devWarningContainer(instanceName, containerParam);
227
225
  }
226
+ // In shadow DOM (e.g. Angular ViewEncapsulation.ShadowDom), theme CSS from document.head
227
+ // does not cascade into the shadow root. Inject a matching <link> so Bryntum's CSS check
228
+ // finds the theme. The @font-face rules from component styles are also extracted to
229
+ // document scope so document.fonts detects them (shadow-root @font-face is not reliably
230
+ // included in document.fonts across all browsers).
231
+ const shadowRoot = elementRef.nativeElement.getRootNode();
232
+ if (shadowRoot instanceof ShadowRoot) {
233
+ initThemeInShadowRoots();
234
+ BryntumChecklistFilterComboComponent.ensureFontsInDocument(shadowRoot);
235
+ }
228
236
  // @ts-ignore
229
237
  me.instance = instanceName === 'Widget' ? Widget.create(bryntumConfig) : new instanceClass(bryntumConfig);
230
238
  }
239
+ /**
240
+ * Extracts all @font-face declarations from a shadow root's stylesheets and adds them to
241
+ * document.head as a single <style> element. This is needed because @font-face rules inside
242
+ * a shadow root are not reliably included in document.fonts across all browsers, causing
243
+ * Bryntum's CSS compatibility check to incorrectly report missing fonts.
244
+ * Safe to call multiple times — the extraction runs only once per page.
245
+ */
246
+ static ensureFontsInDocument(shadowRoot) {
247
+ var _a;
248
+ if (document.querySelector('#b-shadow-root-fonts')) {
249
+ return;
250
+ }
251
+ const fontFaceRules = [];
252
+ const extractFromSheet = (sheet) => {
253
+ try {
254
+ const rules = sheet.cssRules;
255
+ for (let i = 0; i < rules.length; i++) {
256
+ if (rules[i].type === CSSRule.FONT_FACE_RULE) {
257
+ fontFaceRules.push(rules[i].cssText);
258
+ }
259
+ }
260
+ }
261
+ catch (_e) {
262
+ // Cross-origin access may throw; silently skip
263
+ }
264
+ };
265
+ // adoptedStyleSheets (Angular 14+ / modern browsers)
266
+ const adoptedSheets = (_a = shadowRoot.adoptedStyleSheets) !== null && _a !== void 0 ? _a : [];
267
+ adoptedSheets.forEach(sheet => extractFromSheet(sheet));
268
+ // <style> elements (older Angular or fallback)
269
+ shadowRoot.querySelectorAll('style').forEach(el => {
270
+ if (el.sheet) {
271
+ extractFromSheet(el.sheet);
272
+ }
273
+ });
274
+ if (fontFaceRules.length > 0) {
275
+ const style = document.createElement('style');
276
+ style.id = 'b-shadow-root-fonts';
277
+ style.textContent = fontFaceRules.join('\n');
278
+ document.head.appendChild(style);
279
+ }
280
+ }
231
281
  /**
232
282
  * Watch for changes
233
283
  * @param changes
@@ -301,6 +351,7 @@ BryntumChecklistFilterComboComponent.bryntumConfigs = BryntumChecklistFilterComb
301
351
  'caseSensitive',
302
352
  'catchEventHandlerExceptions',
303
353
  'centered',
354
+ 'checkValidity',
304
355
  'chipView',
305
356
  'clearable',
306
357
  'clearTextOnPickerHide',
@@ -398,6 +449,7 @@ BryntumChecklistFilterComboComponent.bryntumConfigs = BryntumChecklistFilterComb
398
449
  'required',
399
450
  'revertOnEscape',
400
451
  'ripple',
452
+ 'role',
401
453
  'rootElement',
402
454
  'rtl',
403
455
  'scrollAction',
@@ -441,6 +493,7 @@ BryntumChecklistFilterComboComponent.bryntumConfigsOnly = [
441
493
  'cacheLastResult',
442
494
  'caseSensitive',
443
495
  'centered',
496
+ 'checkValidity',
444
497
  'chipView',
445
498
  'clearable',
446
499
  'clearTextOnPickerHide',
@@ -511,6 +564,7 @@ BryntumChecklistFilterComboComponent.bryntumConfigsOnly = [
511
564
  'relayStoreEvents',
512
565
  'revertOnEscape',
513
566
  'ripple',
567
+ 'role',
514
568
  'rootElement',
515
569
  'scrollAction',
516
570
  'showAnimation',
@@ -531,7 +585,6 @@ BryntumChecklistFilterComboComponent.bryntumConfigsOnly = [
531
585
  ];
532
586
  BryntumChecklistFilterComboComponent.bryntumProps = BryntumChecklistFilterComboComponent.bryntumFeatureNames.concat([
533
587
  'alignSelf',
534
- 'anchorSize',
535
588
  'appendTo',
536
589
  'badge',
537
590
  'callOnFunctions',
@@ -545,7 +598,6 @@ BryntumChecklistFilterComboComponent.bryntumProps = BryntumChecklistFilterComboC
545
598
  'extraData',
546
599
  'filterOperator',
547
600
  'flex',
548
- 'focusVisible',
549
601
  'formula',
550
602
  'height',
551
603
  'hidden',
@@ -585,7 +637,7 @@ BryntumChecklistFilterComboComponent.bryntumProps = BryntumChecklistFilterComboC
585
637
  'y'
586
638
  ]);
587
639
  BryntumChecklistFilterComboComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumChecklistFilterComboComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
588
- BryntumChecklistFilterComboComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.0", type: BryntumChecklistFilterComboComponent, selector: "bryntum-checklist-filter-combo", inputs: { adopt: "adopt", align: "align", anchor: "anchor", ariaDescription: "ariaDescription", ariaLabel: "ariaLabel", autoComplete: "autoComplete", autoExpand: "autoExpand", autoSelect: "autoSelect", bubbleEvents: "bubbleEvents", cacheLastResult: "cacheLastResult", caseSensitive: "caseSensitive", centered: "centered", chipView: "chipView", clearable: "clearable", clearTextOnPickerHide: "clearTextOnPickerHide", clearTextOnSelection: "clearTextOnSelection", clearWhenInputEmpty: "clearWhenInputEmpty", color: "color", config: "config", constrainTo: "constrainTo", container: "container", containValues: "containValues", contentElementCls: "contentElementCls", createOnUnmatched: "createOnUnmatched", dataField: "dataField", defaultBindProperty: "defaultBindProperty", detectCSSCompatibilityIssues: "detectCSSCompatibilityIssues", displayField: "displayField", displayValueRenderer: "displayValueRenderer", dock: "dock", draggable: "draggable", elementAttributes: "elementAttributes", emptyText: "emptyText", encodeFilterParams: "encodeFilterParams", filterOnEnter: "filterOnEnter", filterParamName: "filterParamName", filterSelected: "filterSelected", floating: "floating", hideAnimation: "hideAnimation", hidePickerOnSelect: "hidePickerOnSelect", hideTrigger: "hideTrigger", highlightExternalChange: "highlightExternalChange", hint: "hint", hintHtml: "hintHtml", ignoreParentReadOnly: "ignoreParentReadOnly", inline: "inline", inlinePicker: "inlinePicker", inputAlign: "inputAlign", inputAttributes: "inputAttributes", inputTag: "inputTag", inputType: "inputType", inputWidth: "inputWidth", items: "items", keyStrokeChangeDelay: "keyStrokeChangeDelay", keyStrokeFilterDelay: "keyStrokeFilterDelay", labelCls: "labelCls", labelPosition: "labelPosition", labels: "labels", labelWidth: "labelWidth", listCls: "listCls", listeners: "listeners", listItemTpl: "listItemTpl", localeClass: "localeClass", localizable: "localizable", localizableProperties: "localizableProperties", maskDefaults: "maskDefaults", masked: "masked", maxLength: "maxLength", minChars: "minChars", minLength: "minLength", monitorResize: "monitorResize", multiValueSeparator: "multiValueSeparator", name: "name", overlayAnchor: "overlayAnchor", pickerAlignElement: "pickerAlignElement", pickerWidth: "pickerWidth", positioned: "positioned", preventTooltipOnTouch: "preventTooltipOnTouch", primaryFilter: "primaryFilter", relayStoreEvents: "relayStoreEvents", revertOnEscape: "revertOnEscape", ripple: "ripple", rootElement: "rootElement", scrollAction: "scrollAction", showAnimation: "showAnimation", showTooltipWhenDisabled: "showTooltipWhenDisabled", skipValidation: "skipValidation", spellCheck: "spellCheck", tab: "tab", tabIndex: "tabIndex", textAlign: "textAlign", title: "title", triggerAction: "triggerAction", type: "type", ui: "ui", validateFilter: "validateFilter", validateOnInput: "validateOnInput", valueField: "valueField", weight: "weight", alignSelf: "alignSelf", appendTo: "appendTo", badge: "badge", callOnFunctions: "callOnFunctions", catchEventHandlerExceptions: "catchEventHandlerExceptions", cls: "cls", column: "column", dataset: "dataset", disabled: "disabled", editable: "editable", extraData: "extraData", filterOperator: "filterOperator", flex: "flex", height: "height", hidden: "hidden", id: "id", insertBefore: "insertBefore", insertFirst: "insertFirst", keyMap: "keyMap", label: "label", listItemPillTpl: "listItemPillTpl", margin: "margin", maxHeight: "maxHeight", maximizeOnMobile: "maximizeOnMobile", maxWidth: "maxWidth", minHeight: "minHeight", minWidth: "minWidth", picker: "picker", placeholder: "placeholder", readOnly: "readOnly", rendition: "rendition", required: "required", rtl: "rtl", searchText: "searchText", showApplyButton: "showApplyButton", showRequiredIndicator: "showRequiredIndicator", span: "span", store: "store", tooltip: "tooltip", triggers: "triggers", value: "value", width: "width", x: "x", y: "y", anchorSize: "anchorSize", content: "content", focusVisible: "focusVisible", formula: "formula", html: "html", input: "input", multiSelect: "multiSelect", parent: "parent", scrollable: "scrollable" }, outputs: { onAction: "onAction", onBeforeDestroy: "onBeforeDestroy", onBeforeHide: "onBeforeHide", onBeforeShow: "onBeforeShow", onCatchAll: "onCatchAll", onChange: "onChange", onClear: "onClear", onDestroy: "onDestroy", onElementCreated: "onElementCreated", onFocusIn: "onFocusIn", onFocusOut: "onFocusOut", onHide: "onHide", onInput: "onInput", onPaint: "onPaint", onReadOnly: "onReadOnly", onRecompose: "onRecompose", onResize: "onResize", onSelect: "onSelect", onShow: "onShow", onTrigger: "onTrigger" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true });
640
+ BryntumChecklistFilterComboComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.0", type: BryntumChecklistFilterComboComponent, selector: "bryntum-checklist-filter-combo", inputs: { adopt: "adopt", align: "align", anchor: "anchor", ariaDescription: "ariaDescription", ariaLabel: "ariaLabel", autoComplete: "autoComplete", autoExpand: "autoExpand", autoSelect: "autoSelect", bubbleEvents: "bubbleEvents", cacheLastResult: "cacheLastResult", caseSensitive: "caseSensitive", centered: "centered", checkValidity: "checkValidity", chipView: "chipView", clearable: "clearable", clearTextOnPickerHide: "clearTextOnPickerHide", clearTextOnSelection: "clearTextOnSelection", clearWhenInputEmpty: "clearWhenInputEmpty", color: "color", config: "config", constrainTo: "constrainTo", container: "container", containValues: "containValues", contentElementCls: "contentElementCls", createOnUnmatched: "createOnUnmatched", dataField: "dataField", defaultBindProperty: "defaultBindProperty", detectCSSCompatibilityIssues: "detectCSSCompatibilityIssues", displayField: "displayField", displayValueRenderer: "displayValueRenderer", dock: "dock", draggable: "draggable", elementAttributes: "elementAttributes", emptyText: "emptyText", encodeFilterParams: "encodeFilterParams", filterOnEnter: "filterOnEnter", filterParamName: "filterParamName", filterSelected: "filterSelected", floating: "floating", hideAnimation: "hideAnimation", hidePickerOnSelect: "hidePickerOnSelect", hideTrigger: "hideTrigger", highlightExternalChange: "highlightExternalChange", hint: "hint", hintHtml: "hintHtml", ignoreParentReadOnly: "ignoreParentReadOnly", inline: "inline", inlinePicker: "inlinePicker", inputAlign: "inputAlign", inputAttributes: "inputAttributes", inputTag: "inputTag", inputType: "inputType", inputWidth: "inputWidth", items: "items", keyStrokeChangeDelay: "keyStrokeChangeDelay", keyStrokeFilterDelay: "keyStrokeFilterDelay", labelCls: "labelCls", labelPosition: "labelPosition", labels: "labels", labelWidth: "labelWidth", listCls: "listCls", listeners: "listeners", listItemTpl: "listItemTpl", localeClass: "localeClass", localizable: "localizable", localizableProperties: "localizableProperties", maskDefaults: "maskDefaults", masked: "masked", maxLength: "maxLength", minChars: "minChars", minLength: "minLength", monitorResize: "monitorResize", multiValueSeparator: "multiValueSeparator", name: "name", overlayAnchor: "overlayAnchor", pickerAlignElement: "pickerAlignElement", pickerWidth: "pickerWidth", positioned: "positioned", preventTooltipOnTouch: "preventTooltipOnTouch", primaryFilter: "primaryFilter", relayStoreEvents: "relayStoreEvents", revertOnEscape: "revertOnEscape", ripple: "ripple", role: "role", rootElement: "rootElement", scrollAction: "scrollAction", showAnimation: "showAnimation", showTooltipWhenDisabled: "showTooltipWhenDisabled", skipValidation: "skipValidation", spellCheck: "spellCheck", tab: "tab", tabIndex: "tabIndex", textAlign: "textAlign", title: "title", triggerAction: "triggerAction", type: "type", ui: "ui", validateFilter: "validateFilter", validateOnInput: "validateOnInput", valueField: "valueField", weight: "weight", alignSelf: "alignSelf", appendTo: "appendTo", badge: "badge", callOnFunctions: "callOnFunctions", catchEventHandlerExceptions: "catchEventHandlerExceptions", cls: "cls", column: "column", dataset: "dataset", disabled: "disabled", editable: "editable", extraData: "extraData", filterOperator: "filterOperator", flex: "flex", height: "height", hidden: "hidden", id: "id", insertBefore: "insertBefore", insertFirst: "insertFirst", keyMap: "keyMap", label: "label", listItemPillTpl: "listItemPillTpl", margin: "margin", maxHeight: "maxHeight", maximizeOnMobile: "maximizeOnMobile", maxWidth: "maxWidth", minHeight: "minHeight", minWidth: "minWidth", picker: "picker", placeholder: "placeholder", readOnly: "readOnly", rendition: "rendition", required: "required", rtl: "rtl", searchText: "searchText", showApplyButton: "showApplyButton", showRequiredIndicator: "showRequiredIndicator", span: "span", store: "store", tooltip: "tooltip", triggers: "triggers", value: "value", width: "width", x: "x", y: "y", content: "content", formula: "formula", html: "html", input: "input", multiSelect: "multiSelect", parent: "parent", scrollable: "scrollable" }, outputs: { onAction: "onAction", onBeforeDestroy: "onBeforeDestroy", onBeforeHide: "onBeforeHide", onBeforeShow: "onBeforeShow", onCatchAll: "onCatchAll", onChange: "onChange", onClear: "onClear", onDestroy: "onDestroy", onElementCreated: "onElementCreated", onFocusIn: "onFocusIn", onFocusOut: "onFocusOut", onHide: "onHide", onInput: "onInput", onPaint: "onPaint", onReadOnly: "onReadOnly", onRecompose: "onRecompose", onResize: "onResize", onSelect: "onSelect", onShow: "onShow", onTrigger: "onTrigger" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true });
589
641
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumChecklistFilterComboComponent, decorators: [{
590
642
  type: Component,
591
643
  args: [{
@@ -616,6 +668,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImpor
616
668
  type: Input
617
669
  }], centered: [{
618
670
  type: Input
671
+ }], checkValidity: [{
672
+ type: Input
619
673
  }], chipView: [{
620
674
  type: Input
621
675
  }], clearable: [{
@@ -756,6 +810,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImpor
756
810
  type: Input
757
811
  }], ripple: [{
758
812
  type: Input
813
+ }], role: [{
814
+ type: Input
759
815
  }], rootElement: [{
760
816
  type: Input
761
817
  }], scrollAction: [{
@@ -878,12 +934,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImpor
878
934
  type: Input
879
935
  }], y: [{
880
936
  type: Input
881
- }], anchorSize: [{
882
- type: Input
883
937
  }], content: [{
884
938
  type: Input
885
- }], focusVisible: [{
886
- type: Input
887
939
  }], formula: [{
888
940
  type: Input
889
941
  }], html: [{
@@ -937,4 +989,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImpor
937
989
  }], onTrigger: [{
938
990
  type: Output
939
991
  }] } });
940
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJ5bnR1bS1jaGVja2xpc3QtZmlsdGVyLWNvbWJvLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudC9zcmMvbGliL2JyeW50dW0tY2hlY2tsaXN0LWZpbHRlci1jb21iby5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0RBQXNEO0FBQ3REOztHQUVHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBa0QsTUFBTSxlQUFlLENBQUM7QUFFbkksT0FBTyxhQUFhLE1BQU0sa0JBQWtCLENBQUM7QUFFN0MsT0FBTyxFQUF1VixNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNqWSxPQUFPLEVBQUUsb0JBQW9CLEVBQTBELE1BQU0sb0JBQW9CLENBQUM7O0FBNDBCbEgsTUFBTSxPQUFPLG9DQUFvQztJQTZWN0MsWUFBWSxPQUFtQjtRQVR2QixrQkFBYSxHQUFHO1lBQ3BCLEtBQUssRUFBYyxTQUFTO1lBQzVCLFFBQVEsRUFBVyxTQUFTO1lBQzVCLElBQUksRUFBZSxTQUFTO1lBQzVCLGdCQUFnQixFQUFHLElBQUk7WUFDdkIsUUFBUSxFQUFXLEVBQUU7WUFDckIsU0FBUyxFQUFVLEVBQUU7U0FDeEIsQ0FBQztRQTZLRixrQkFBa0I7UUFDbEI7Ozs7Ozs7O1dBUUc7UUFDTyxhQUFRLEdBQVEsSUFBSSxZQUFZLEVBQWlILENBQUM7UUFDNUo7Ozs7V0FJRztRQUNPLG9CQUFlLEdBQVEsSUFBSSxZQUFZLEVBQThDLENBQUM7UUFDaEc7Ozs7V0FJRztRQUNPLGlCQUFZLEdBQVEsSUFBSSxZQUFZLEVBQXlFLENBQUM7UUFDeEg7Ozs7V0FJRztRQUNPLGlCQUFZLEdBQVEsSUFBSSxZQUFZLEVBQTZFLENBQUM7UUFDNUg7Ozs7Ozs7V0FPRztRQUNPLGVBQVUsR0FBUSxJQUFJLFlBQVksRUFBZ0UsQ0FBQztRQUM3Rzs7Ozs7Ozs7OztXQVVH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LFNBQVM7c0JBQWxCLE1BQU07Z0JBYUcsVUFBVTtzQkFBbkIsTUFBTTtnQkFNRyxNQUFNO3NCQUFmLE1BQU07Z0JBU0csT0FBTztzQkFBaEIsTUFBTTtnQkFVRyxPQUFPO3NCQUFoQixNQUFNO2dCQU1HLFVBQVU7c0JBQW5CLE1BQU07Z0JBS0csV0FBVztzQkFBcEIsTUFBTTtnQkFVRyxRQUFRO3NCQUFqQixNQUFNO2dCQVNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBTUcsTUFBTTtzQkFBZixNQUFNO2dCQU9HLFNBQVM7c0JBQWxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8qKlxuICogQW5ndWxhciB3cmFwcGVyIGZvciBCcnludHVtIENoZWNrbGlzdEZpbHRlckNvbWJvXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgSW5wdXQsIFNpbXBsZUNoYW5nZSwgU2ltcGxlQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IFdyYXBwZXJIZWxwZXIgZnJvbSAnLi93cmFwcGVyLmhlbHBlcic7XG5cbmltcG9ydCB7IEFsaWduU3BlYywgQmFzZSwgQ2hpcFZpZXdDb25maWcsIENvbGxlY3Rpb25Db21wYXJlT3BlcmF0b3IsIENvbGxlY3Rpb25GaWx0ZXJDb25maWcsIENvbG9yLCBDb21ibywgQ29tYm9Nb2RlbCwgRG9tQ29uZmlnLCBEdXJhdGlvbiwgRHVyYXRpb25Db25maWcsIEZpZWxkLCBGaWVsZENvbnRhaW5lciwgRmllbGRDb250YWluZXJDb25maWcsIEZpZWxkVHJpZ2dlckNvbmZpZywgS2V5TWFwQ29uZmlnLCBMaXN0LCBMaXN0Q29uZmlnLCBNYXNrQ29uZmlnLCBNb2RlbCwgUmVjdGFuZ2xlLCBTY3JvbGxlciwgU3RvcmUsIFN0b3JlQ29uZmlnLCBUYWJDb25maWcsIFRvb2x0aXBDb25maWcsIFZ1ZUNvbmZpZywgV2lkZ2V0IH0gZnJvbSAnQGJyeW50dW0vY29yZS10aGluJztcbmltcG9ydCB7IENoZWNrbGlzdEZpbHRlckNvbWJvLCBDaGVja2xpc3RGaWx0ZXJDb21ib0xpc3RlbmVycywgR3JpZENvbnRhaW5lckl0ZW1Db25maWcgfSBmcm9tICdAYnJ5bnR1bS9ncmlkLXRoaW4nO1xuXG5pbXBvcnQgeyBTdHJpbmdIZWxwZXIgfSBmcm9tICdAYnJ5bnR1bS9jb3JlLXRoaW4nO1xuXG5leHBvcnQgdHlwZSBCcnludHVtQ2hlY2tsaXN0RmlsdGVyQ29tYm9Qcm9wcyA9IHtcbiAgICAvLyBDb25maWdzXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgZWxlbWVudCBpZCkgdG8gYWRvcHQgYXMgdGhpcyBXaWRnZXQncyBlbmNhcHN1bGF0aW5nIGVsZW1lbnQuIFRoZSB3aWRnZXQnc1xuICAgICAqIGNvbnRlbnQgd2lsbCBiZSBwbGFjZWQgaW5zaWRlIHRoaXMgZWxlbWVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1hZG9wdClcbiAgICAgKi9cbiAgICBhZG9wdCA/IDogSFRNTEVsZW1lbnR8c3RyaW5nXG4gICAgLyoqXG4gICAgICogKk9ubHkgdmFsaWQgaWYgdGhpcyBXaWRnZXQgaXMgW2Zsb2F0aW5nXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykuKlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLWFsaWduKVxuICAgICAqL1xuICAgIGFsaWduID8gOiBBbGlnblNwZWN8c3RyaW5nXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGlzIHdpZGdldCBpcyBhIGNoaWxkIG9mIGEgW0NvbnRhaW5lcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbnRhaW5lciksIGl0IHdpbGwgYnkgZGVmYXVsdCBiZSBwYXJ0aWNpcGF0aW5nIGluIGFcbiAgICAgKiBmbGV4Ym94IGxheW91dC4gVGhpcyBjb25maWcgYWxsb3dzIHlvdSB0byBzZXQgdGhpcyB3aWRnZXQnc1xuICAgICAqIFthbGlnbi1zZWxmXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvYWxpZ24tc2VsZikgc3R5bGUuXG4gICAgICovXG4gICAgYWxpZ25TZWxmID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWZsb2F0aW5nKSBhbmQgYmVpbmcgc2hvd24gdGhyb3VnaCBbc2hvd0J5XSgjQ29yZS93aWRnZXQvV2lkZ2V0I2Z1bmN0aW9uLXNob3dCeSkuKlxuICAgICAqIGB0cnVlYCB0byBzaG93IGEgY29ubmVjdG9yIGFycm93IHBvaW50aW5nIHRvIHRoZSBhbGlnbiB0YXJnZXQuXG4gICAgICovXG4gICAgYW5jaG9yID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgdGhlIGlkIG9mIGFuIGVsZW1lbnQpIHRvIGFwcGVuZCB0aGlzIHdpZGdldCdzIGVsZW1lbnQgdG8uIENhbiBiZSBjb25maWd1cmVkLCBvciBzZXQgb25jZSBhdFxuICAgICAqIHJ1bnRpbWUuIFRvIGFjY2VzcyB0aGUgZWxlbWVudCBvZiBhIHJlbmRlcmVkIHdpZGdldCwgc2VlIFtlbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWVsZW1lbnQpLlxuICAgICAqL1xuICAgIGFwcGVuZFRvID8gOiBIVE1MRWxlbWVudHxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGxvY2FsaXphYmxlIHN0cmluZyAoTWF5IGNvbnRhaW4gYCdMe30nYCB0b2tlbnMgd2hpY2ggcmVzb2x2ZSBpbiB0aGUgbG9jYWxlIGZpbGUpIHRvIGluamVjdFxuICAgICAqIGludG8gYW4gZWxlbWVudCB3aGljaCB3aWxsIGJlIGxpbmtlZCB1c2luZyB0aGUgYGFyaWEtZGVzY3JpYmVkYnlgIGF0dHJpYnV0ZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1hcmlhRGVzY3JpcHRpb24pXG4gICAgICovXG4gICAgYXJpYURlc2NyaXB0aW9uID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGxvY2FsaXphYmxlIHN0cmluZyAoTWF5IGNvbnRhaW4gYCdMe30nYCB0b2tlbnMgd2hpY2ggcmVzb2x2ZSBpbiB0aGUgbG9jYWxlIGZpbGUpIHRvIGluamVjdCBhc1xuICAgICAqIHRoZSBgYXJpYS1sYWJlbGAgYXR0cmlidXRlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLWFyaWFMYWJlbClcbiAgICAgKi9cbiAgICBhcmlhTGFiZWwgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG5hdGl2ZSBgYXV0b2NvbXBsZXRlYCBwcm9wZXJ0eSBvZiB0aGUgdW5kZXJseWluZyBpbnB1dCBlbGVtZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlZmVyIHRvXG4gICAgICogW01ETl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9BdHRyaWJ1dGVzL2F1dG9jb21wbGV0ZSlcbiAgICAgKi9cbiAgICBhdXRvQ29tcGxldGUgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBhcyBgdHJ1ZWAgdG8gaGF2ZSB0aGUgcGlja2VyIGV4cGFuZCB1cG9uIGZvY3VzIGVudGVyLlxuICAgICAqL1xuICAgIGF1dG9FeHBhbmQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGB0cnVlYCB0byBhdXRvIHNlbGVjdCBmaWVsZCBjb250ZW50cyBvbiBmb2N1c1xuICAgICAqL1xuICAgIGF1dG9TZWxlY3QgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsIHRleHQgdG8gc2hvdyBpbiBiYWRnZS5cbiAgICAgKi9cbiAgICBiYWRnZSA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHdoZXJlIHByb3BlcnR5IG5hbWVzIHdpdGggYSB0cnV0aHkgdmFsdWUgaW5kaWNhdGUgd2hpY2ggZXZlbnRzIHNob3VsZCBidWJibGUgdXAgdGhlIG93bmVyc2hpcFxuICAgICAqIGhpZXJhcmNoeSB3aGVuIHRyaWdnZXJlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1idWJibGVFdmVudHMpXG4gICAgICovXG4gICAgYnViYmxlRXZlbnRzID8gOiBvYmplY3RcbiAgICAvKipcbiAgICAgKiBFbmFibGUgY2FjaGluZyBvZiB0aGUgbGFzdCByZXRyaWV2ZWQgcmVzdWx0IHVudGlsIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctY2FjaGVMYXN0UmVzdWx0KVxuICAgICAqL1xuICAgIGNhY2hlTGFzdFJlc3VsdCA/IDogbnVtYmVyfHN0cmluZ3xEdXJhdGlvbnxEdXJhdGlvbkNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIG5vdCBjYWxsIG9uWFhYIG1ldGhvZCBuYW1lcyAoZS5nLiBgb25TaG93YCwgYG9uQ2xpY2tgKSwgYXMgYW4gZWFzeSB3YXkgdG8gbGlzdGVuIGZvciBldmVudHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctY2FsbE9uRnVuY3Rpb25zKVxuICAgICAqL1xuICAgIGNhbGxPbkZ1bmN0aW9ucyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBhcyBgdHJ1ZWAgdG8gZm9yY2UgY2FzZSBtYXRjaGluZyB3aGVuIGZpbHRlcmluZyB0aGUgZHJvcGRvd24gbGlzdCBiYXNlZCB1cG9uIHRoZSB0eXBlZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBjYXNlU2Vuc2l0aXZlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgaWYgYW4gZXZlbnQgaGFuZGxlciB0aHJvd3MgYW4gZXhjZXB0aW9uLCB0aGUgZXJyb3IgcHJvcGFnYXRlcyB1cCB0aGUgc3RhY2sgYW5kIHRoZVxuICAgICAqIGFwcGxpY2F0aW9uIHN0YXRlIGlzIHVuZGVmaW5lZC4gQ29kZSB3aGljaCBmb2xsb3dzIHRoZSBldmVudCBoYW5kbGVyIHdpbGwgKm5vdCogYmUgZXhlY3V0ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zKVxuICAgICAqL1xuICAgIGNhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqICpPbmx5IHZhbGlkIGlmIHRoaXMgV2lkZ2V0IGlzIFtmbG9hdGluZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpLipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGNlbnRyZSB0aGUgV2lkZ2V0IGluIGJyb3dzZXIgdmlld3BvcnQgc3BhY2UuXG4gICAgICovXG4gICAgY2VudGVyZWQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBIGNvbmZpZyBvYmplY3QgdG8gY29uZmlndXJlIHRoZSBbQ2hpcFZpZXddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9DaGlwVmlldykgdG8gZGlzcGxheSB0aGVcbiAgICAgKiBzZWxlY3RlZCB2YWx1ZSBzZXQgd2hlbiBbbXVsdGlTZWxlY3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db21ibyNjb25maWctbXVsdGlTZWxlY3QpIGlzIGB0cnVlYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1jaGlwVmlldylcbiAgICAgKi9cbiAgICBjaGlwVmlldyA/IDogQ2hpcFZpZXdDb25maWdcbiAgICAvKipcbiAgICAgKiBTaG93IGEgdHJpZ2dlciB0byBjbGVhciBmaWVsZCwgaWYgdGhpcyBmaWVsZCBpcyBub3QgW3JlYWRPbmx5XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvRmllbGQjY29uZmlnLXJlYWRPbmx5KS4gVGhlIHRyaWdnZXIgaXMgYXZhaWxhYmxlXG4gICAgICogaW4gdGhlIFt0cmlnZ2Vyc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0ZpZWxkI3Byb3BlcnR5LXRyaWdnZXJzKSBvYmplY3QgdW5kZXIgdGhlIG5hbWUgYGNsZWFyYC4gTWF5IGFsc28gYmUgYW4gb2JqZWN0IHdoaWNoXG4gICAgICogY29uZmlndXJlcyB0aGUgYGNsZWFyYCBbdHJpZ2dlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0ZpZWxkI3Byb3BlcnR5LXRyaWdnZXJzKS5cbiAgICAgKi9cbiAgICBjbGVhcmFibGUgPyA6IGJvb2xlYW58RmllbGRUcmlnZ2VyQ29uZmlnXG4gICAgLyoqXG4gICAgICogYHRydWVgIHRvIGNsZWFyIHZhbHVlIHR5cGVkIHRvIGEgbXVsdGlzZWxlY3QgY29tYm8gd2hlbiBwaWNrZXIgaXMgY29sbGFwc2VkXG4gICAgICovXG4gICAgY2xlYXJUZXh0T25QaWNrZXJIaWRlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBgZmFsc2VgIHRvIG5vdCBjbGVhciB2YWx1ZSB0eXBlZCB0byBhIG11bHRpc2VsZWN0IGNvbWJvIHdoZW4gYW4gaXRlbSBpcyBzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBjbGVhclRleHRPblNlbGVjdGlvbiA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gY2xlYXIgdGhpcyBmaWVsZCB3aGVuIHVzZXIgZW1wdGllcyB0aGUgaW5wdXQgZWxlbWVudFxuICAgICAqL1xuICAgIGNsZWFyV2hlbklucHV0RW1wdHkgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDdXN0b20gQ1NTIGNsYXNzZXMgdG8gYWRkIHRvIGVsZW1lbnQuXG4gICAgICogTWF5IGJlIHNwZWNpZmllZCBhcyBhIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcsIG9yIGFzIGFuIG9iamVjdCBpbiB3aGljaCBwcm9wZXJ0eSBuYW1lc1xuICAgICAqIHdpdGggdHJ1dGh5IHZhbHVlcyBhcmUgdXNlZCBhcyB0aGUgY2xhc3MgbmFtZXM6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctY2xzKVxuICAgICAqL1xuICAgIGNscyA/IDogc3RyaW5nfG9iamVjdFxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgdGhlIHNwZWNpZmllZCBjb2xvciB0byB0aGUgd2lkZ2V0LCBieSBzZXR0aW5nIHRoZSBgLS1iLXByaW1hcnlgIENTUyB2YXJpYWJsZSBpbiB0aGUgd2lkZ2V0c1xuICAgICAqIGBzdHlsZWAgYmxvY2suXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctY29sb3IpXG4gICAgICovXG4gICAgY29sb3IgPyA6IENvbG9yXG4gICAgLyoqXG4gICAgICogUHJvZ3JhbW1hdGljIGNvbnRyb2wgb3ZlciB3aGljaCBjb2x1bW4gdG8gc3RhcnQgaW4gd2hlbiB1c2VkIGluIGEgZ3JpZCBsYXlvdXQuXG4gICAgICovXG4gICAgY29sdW1uID8gOiBudW1iZXJcbiAgICBjb25maWcgPyA6IG9iamVjdFxuICAgIC8qKlxuICAgICAqICpPbmx5IHZhbGlkIGlmIHRoaXMgV2lkZ2V0IGlzIFtmbG9hdGluZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpIG9yIFtwb3NpdGlvbmVkXSgjQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1wb3NpdGlvbmVkKS4qXG4gICAgICogRWxlbWVudCwgV2lkZ2V0IG9yIFJlY3RhbmdsZSB0byB3aGljaCB0aGlzIFdpZGdldCBpcyBjb25zdHJhaW5lZC5cbiAgICAgKi9cbiAgICBjb25zdHJhaW5UbyA/IDogSFRNTEVsZW1lbnR8V2lkZ2V0fFJlY3RhbmdsZVxuICAgIC8qKlxuICAgICAqIFRoZSBjb25maWd1cmF0aW9uIGZvciBhZGRpdGlvbmFsIGl0ZW1zIGFzc29jaWF0ZWQgdG8gdGhpcyBmaWVsZC4gVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCB0byBhZGQgY29udGV4dHVhbFxuICAgICAqIGZpZWxkcyByZWxhdGVkIHRvIGEgW2NoZWNrYm94XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ2hlY2tib3gpIG9yIFtyYWRpbyBidXR0b25dKCNDb3JlL3dpZGdldC9SYWRpbykuIFNlZVxuICAgICAqIHRoZXNlIGNsYXNzZXMgZm9yIGV4YW1wbGVzIG9mIG5lc3RlZCBmaWVsZHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctY29udGFpbmVyKVxuICAgICAqL1xuICAgIGNvbnRhaW5lciA/IDogUmVjb3JkPHN0cmluZywgR3JpZENvbnRhaW5lckl0ZW1Db25maWc+fEdyaWRDb250YWluZXJJdGVtQ29uZmlnW118RmllbGRDb250YWluZXJDb25maWd8RmllbGRDb250YWluZXJcbiAgICAvKipcbiAgICAgKiBUaGUgY29uZmlnIGNvbnRyb2xzIGhvdyB0aGUgdmFsdWUgb2YgbmVzdGVkIGl0ZW1zIGFyZSBoYW5kbGVkIHdoZW4gYSBwYXJlbnQgY29udGFpbmVyIGdldHMgb3Igc2V0cyBpdHNcbiAgICAgKiBbdmFsdWVzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyI3Byb3BlcnR5LXZhbHVlcykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctY29udGFpblZhbHVlcylcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LkZpZWxkfSBmaWVsZCBGaWVsZCBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGNvbnRhaW5WYWx1ZXMgPyA6IGJvb2xlYW58c3RyaW5nfCgoZmllbGQ6IEZpZWxkKSA9PiBib29sZWFuKVxuICAgIC8qKlxuICAgICAqIEN1c3RvbSBDU1MgY2xhc3NlcyB0byBhZGQgdG8gdGhlIFtjb250ZW50RWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1jb250ZW50RWxlbWVudCkuXG4gICAgICogTWF5IGJlIHNwZWNpZmllZCBhcyBhIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcsIG9yIGFzIGFuIG9iamVjdCBpbiB3aGljaCBwcm9wZXJ0eSBuYW1lc1xuICAgICAqIHdpdGggdHJ1dGh5IHZhbHVlcyBhcmUgdXNlZCBhcyB0aGUgY2xhc3MgbmFtZXM6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctY29udGVudEVsZW1lbnRDbHMpXG4gICAgICovXG4gICAgY29udGVudEVsZW1lbnRDbHMgPyA6IHN0cmluZ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiBJZiBjb25maWd1cmVkIGFzIGB0cnVlYCwgdGhpcyBtZWFucyB0aGF0IHdoZW4gYW4gdW5tYXRjaGVkIHN0cmluZyBpcyB0eXBlZCBpbnRvIHRoZVxuICAgICAqIGNvbWJvJ3MgaW5wdXQgZmllbGQsIGFuZCA8a2JkPkVudGVyPC9rYmQ+LCBvciB0aGUgW211bHRpVmFsdWVTZXBhcmF0b3JdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db21ibyNjb25maWctbXVsdGlWYWx1ZVNlcGFyYXRvcikgaXMgdHlwZWQsXG4gICAgICogYSBuZXcgcmVjb3JkIHdpbGwgYmUgY3JlYXRlZCB1c2luZyB0aGUgdHlwZWQgc3RyaW5nIGFzIHRoZSBbZGlzcGxheUZpZWxkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29tYm8jY29uZmlnLWRpc3BsYXlGaWVsZCkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctY3JlYXRlT25Vbm1hdGNoZWQpXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgUmVjb3JkIG5hbWVcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LkNvbWJvfSBjb21ibyBDb21ibyBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtDb3JlLmRhdGEuTW9kZWx9IE5ldyByZWNvcmRcbiAgICAgKi9cbiAgICBjcmVhdGVPblVubWF0Y2hlZCA/IDogKChuYW1lOiBzdHJpbmcsIGNvbWJvOiBDb21ibykgPT4gTW9kZWwpfHN0cmluZ3xib29sZWFuXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGlzIFdpZGdldCBjb25maWd1cmF0aW9uIGlzIHVzZWQgaW4gdGhlIEdyaWQncyBSb3dFeHBhbmRlciBmZWF0dXJlJ3MgYHdpZGdldGAgY29uZmlnLCBwcm92aWRlIHRoZVxuICAgICAqIGZpZWxkIG9uIHRoZSBleHBhbmRlZCByZWNvcmQgdG8gdXNlIGZvciBwb3B1bGF0aW5nIHRoaXMgd2lkZ2V0J3Mgc3RvcmUgKGlmIGFwcGxpY2FibGUpXG4gICAgICovXG4gICAgZGF0YUZpZWxkID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBPYmplY3QgdG8gYXBwbHkgdG8gZWxlbWVudHMgZGF0YXNldCAoZWFjaCBrZXkgd2lsbCBiZSB1c2VkIGFzIGEgZGF0YS1hdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQpXG4gICAgICovXG4gICAgZGF0YXNldCA/IDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQgd2hlbiBhIHNpbmdsZSB2YWx1ZSBpcyB0byBiZSBhcHBsaWVkIHRvIHRoaXMgV2lkZ2V0LiBTdWNoIGFzIHdoZW4gdXNlZFxuICAgICAqIGluIGEgZ3JpZCBXaWRnZXRDb2x1bW4sIHRoaXMgaXMgdGhlIHByb3BlcnR5IHRvIHdoaWNoIHRoZSBjb2x1bW4ncyBgZmllbGRgIGlzIGFwcGxpZWQuXG4gICAgICovXG4gICAgZGVmYXVsdEJpbmRQcm9wZXJ0eSA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQ2hlY2sgZm9yIENTUyBjb21wYXRpYmlsaXR5IGlzc3VlcyB3aGVuIHVwZ3JhZGluZyB0byB2Ny4gUGVyZm9ybXMgdGhlIGZvbGxvd2luZyBjaGVja3M6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctZGV0ZWN0Q1NTQ29tcGF0aWJpbGl0eUlzc3VlcylcbiAgICAgKi9cbiAgICBkZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZSBvciBlbmFibGUgdGhlIHdpZGdldC4gSXQgaXMgc2ltaWxhciB0byBbcmVhZE9ubHldKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLXJlYWRPbmx5KSBleGNlcHQgYSBkaXNhYmxlZCB3aWRnZXRcbiAgICAgKiBjYW5ub3QgYmUgZm9jdXNlZCwgdXNlcyBhIGRpZmZlcmVudCByZW5kaXRpb24gKHVzdWFsbHkgZ3JleWlzaCkgYW5kIGRvZXMgbm90IGFsbG93IHNlbGVjdGluZyBpdHMgdmFsdWUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctZGlzYWJsZWQpXG4gICAgICovXG4gICAgZGlzYWJsZWQgPyA6IGJvb2xlYW58J2luZXJ0J1xuICAgIC8qKlxuICAgICAqIEZpZWxkIHVzZWQgZm9yIGl0ZW0gdGV4dCB3aGVuIHBvcHVsYXRpbmcgZnJvbSBzdG9yZVxuICAgICAqL1xuICAgIGRpc3BsYXlGaWVsZCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGVtcGxhdGUgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBjdXN0b21pemUgdGhlIGRpc3BsYXllZCB2YWx1ZVxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSByZWNvcmQgVGhlIHJlY29yZCB0byBwcm92aWRlIGEgdGV4dHVhbCB2YWx1ZSBmb3JcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LkNvbWJvfSBjb21ibyBBIHJlZmVyZW5jZSB0byB0aGlzIENvbWJvXG4gICAgICogQHJldHVybnMge3N0cmluZyx2b2lkfVxuICAgICAqL1xuICAgIGRpc3BsYXlWYWx1ZVJlbmRlcmVyID8gOiAocmVjb3JkOiBNb2RlbHxDb21ib01vZGVsLCBjb21ibzogQ29tYm8pID0+IHN0cmluZ3x2b2lkXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgdGhlIHBsYWNlbWVudCBvZiB0aGlzIHdpZGdldCB3aGVuIGl0IGlzIGFkZGVkIHRvIGEgW3BhbmVsJ3MgXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwpXG4gICAgICogW3N0cmlwcyBjb2xsZWN0aW9uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLXN0cmlwcykuIFR5cGljYWwgdmFsdWVzIGZvciB0aGlzIGNvbmZpZyBhcmUgYCd0b3AnYCxcbiAgICAgKiBgJ2JvdHRvbSdgLCBgJ2xlZnQnYCwgb3IgYCdyaWdodCdgLCB3aGljaCBjYXVzZSB0aGUgd2lkZ2V0IHRvIGJlIHBsYWNlZCBvbiB0aGF0IHNpZGUgb2YgdGhlIHBhbmVsJ3NcbiAgICAgKiBib2R5LiBTdWNoIHdpZGdldHMgYXJlIGNhbGxlZCBcImVkZ2Ugc3RyaXBzXCIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctZG9jaylcbiAgICAgKi9cbiAgICBkb2NrID8gOiAndG9wJ3wnYm90dG9tJ3wnbGVmdCd8J3JpZ2h0J3wnc3RhcnQnfCdlbmQnfCdoZWFkZXInfCdwcmUtaGVhZGVyJ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWZsb2F0aW5nKS4qXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBiZSBhYmxlIHRvIGRyYWcgYSB3aWRnZXQgZnJlZWx5IG9uIHRoZSBwYWdlLiBPciBzZXQgdG8gYW4gb2JqZWN0IHdpdGggYSDCtGhhbmRsZVNlbGVjdG9ywrRcbiAgICAgKiBwcm9wZXJ0eSB3aGljaCBjb250cm9scyB3aGVuIGEgZHJhZyBzaG91bGQgc3RhcnQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctZHJhZ2dhYmxlKVxuICAgICAqL1xuICAgIGRyYWdnYWJsZSA/IDogYm9vbGVhbnx7XG4gICAgICAgIGhhbmRsZVNlbGVjdG9yPzogc3RyaW5nXG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVzZXIgY2FuIGVkaXQgdGV4dCBpbiB0ZXh0IGZpZWxkIChvdGhlcndpc2Ugb25seSBwaWNrIGZyb20gYXR0YWNoZWQgcGlja2VyKVxuICAgICAqL1xuICAgIGVkaXRhYmxlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHNwZWNpZnlpbmcgYXR0cmlidXRlcyB0byBhc3NpZ24gdG8gdGhlIHJvb3QgZWxlbWVudCBvZiB0aGlzIHdpZGdldC5cbiAgICAgKiBTZXQgYG51bGxgIHZhbHVlIHRvIGF0dHJpYnV0ZSB0byByZW1vdmUgaXQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctZWxlbWVudEF0dHJpYnV0ZXMpXG4gICAgICovXG4gICAgZWxlbWVudEF0dHJpYnV0ZXMgPyA6IFJlY29yZDxzdHJpbmcsIHN0cmluZ3xudWxsPlxuICAgIC8qKlxuICAgICAqIFRleHQgdG8gZGlzcGxheSBpbiB0aGUgZHJvcCBkb3duIHdoZW4gdGhlcmUgYXJlIG5vIGl0ZW1zIGluIHRoZSB1bmRlcmx5aW5nIHN0b3JlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLWVtcHR5VGV4dClcbiAgICAgKi9cbiAgICBlbXB0eVRleHQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEEgZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhbiBhcnJheSBvZiB2YWx1ZXMgZm9yIHRoZSBbZmlsdGVyUGFyYW1OYW1lXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29tYm8jY29uZmlnLWZpbHRlclBhcmFtTmFtZSkgdG8gcGFzc1xuICAgICAqIGFueSBmaWx0ZXJzIHRvIHRoZSBzZXJ2ZXIgdXBvbiBsb2FkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLWVuY29kZUZpbHRlclBhcmFtcylcbiAgICAgKiBAcGFyYW0ge29iamVjdFtdfSBmaWx0ZXJzIGZpbHRlcnNcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0W119IGFycmF5IG9mIHZhbHVlc1xuICAgICAqL1xuICAgIGVuY29kZUZpbHRlclBhcmFtcyA/IDogKGZpbHRlcnM6IG9iamVjdFtdKSA9PiBvYmplY3RbXVxuICAgIGV4dHJhRGF0YSA/IDogYW55XG4gICAgLyoqXG4gICAgICogSWYgYGZhbHNlYCwgZmlsdGVyaW5nIHdpbGwgYmUgdHJpZ2dlcmVkIG9uY2UgeW91IGV4Y2VlZCBbbWluQ2hhcnNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db21ibyNjb25maWctbWluQ2hhcnMpLiBUbyBmaWx0ZXIgb25seSB3aGVuXG4gICAgICogaGl0dGluZyBFbnRlciBrZXksIHNldCB0aGlzIHRvIGB0cnVlYDtcbiAgICAgKi9cbiAgICBmaWx0ZXJPbkVudGVyID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgYW4gb3BlcmF0b3IgdHlwZSBhcyBpbXBsZW1lbnRlZCBpbiBbb3BlcmF0b3JdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3V0aWwvQ29sbGVjdGlvbkZpbHRlciNjb25maWctb3BlcmF0b3IpXG4gICAgICogdG8gdXNlIHdoZW4gZmlsdGVyaW5nIHRoZSBkcm9wZG93biBsaXN0IGJhc2VkIHVwb24gdGhlIHR5cGVkIHZhbHVlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLWZpbHRlck9wZXJhdG9yKVxuICAgICAqL1xuICAgIGZpbHRlck9wZXJhdG9yID8gOiBDb2xsZWN0aW9uQ29tcGFyZU9wZXJhdG9yXG4gICAgLyoqXG4gICAgICogSWYgdGhlIGRyb3Bkb3duIGlzIHRvIGJlIHBvcHVsYXRlZCB3aXRoIGEgZmlsdGVyZWQgcXVlcnkgdG8gYSByZW1vdGUgc2VydmVyLCBzcGVjaWZ5IHRoZVxuICAgICAqIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0byBwYXNzIHRoZSB0eXBlZCBzdHJpbmcgaGVyZS4gQnkgZGVmYXVsdCwgdGhlIHN0cmluZyBpcyBzaW1wbHkgc2VudFxuICAgICAqIGFzIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLiBGb3Igc3BlY2lhbCBlbmNvZGluZywgY29uZmlndXJlIHRoZSBjb21ibyB3aXRoIFtlbmNvZGVGaWx0ZXJQYXJhbXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db21ibyNjb25maWctZW5jb2RlRmlsdGVyUGFyYW1zKVxuICAgICAqL1xuICAgIGZpbHRlclBhcmFtTmFtZSA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogV2hlbiBbbXVsdGlTZWxlY3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db21ibyNjb25maWctbXVsdGlTZWxlY3QpIGlzIGB0cnVlYCwgeW91IG1heSBjb25maWd1cmUgYGZpbHRlclNlbGVjdGVkYCBhc1xuICAgICAqIGB0cnVlYCB0byBoaWRlIGl0ZW1zIGluIHRoZSBkcm9wZG93biB3aGVuIHRoZXkgYXJlIGFkZGVkIHRvIHRoZSBzZWxlY3Rpb24uXG4gICAgICogSXQgd2lsbCBhcHBlYXIgYXMgaWYgdGhlIHJlcXVlc3RlZCBpdGVtIGhhcyBcIm1vdmVkXCIgaW50byB0aGUgZmllbGQnc1xuICAgICAqIFtDaGlwVmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbWJvI2NvbmZpZy1jaGlwVmlldykuXG4gICAgICovXG4gICAgZmlsdGVyU2VsZWN0ZWQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBXaGVuIHRoaXMgd2lkZ2V0IGlzIGEgY2hpbGQgb2YgYSBbQ29udGFpbmVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyKSwgaXQgd2lsbCBieSBkZWZhdWx0IGJlIHBhcnRpY2lwYXRpbmcgaW4gYVxuICAgICAqIGZsZXhib3ggbGF5b3V0LiBUaGlzIGNvbmZpZyBhbGxvd3MgeW91IHRvIHNldCB0aGlzIHdpZGdldCdzXG4gICAgICogW2ZsZXhdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9mbGV4KSBzdHlsZS5cbiAgICAgKiBUaGlzIG1heSBiZSBjb25maWd1cmVkIGFzIGEgc2luZ2xlIG51bWJlciBvciBhIGAmbHQ7ZmxleC1ncm93Jmd0OyAmbHQ7ZmxleC1zaHJpbmsmZ3Q7ICZsdDtmbGV4LWJhc2lzJmd0O2AgZm9ybWF0IHN0cmluZy5cbiAgICAgKiBudW1lcmljLW9ubHkgdmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyB0aGUgYGZsZXgtZ3Jvd2AgdmFsdWUuXG4gICAgICovXG4gICAgZmxleCA/IDogbnVtYmVyfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gbW92ZSB0aGUgd2lkZ2V0IG91dCBvZiB0aGUgZG9jdW1lbnQgZmxvdyBhbmQgcG9zaXRpb24gaXRcbiAgICAgKiBhYnNvbHV0ZWx5IGluIGJyb3dzZXIgdmlld3BvcnQgc3BhY2UuXG4gICAgICovXG4gICAgZmxvYXRpbmcgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBXaWRnZXQncyBoZWlnaHQsIHVzZWQgdG8gc2V0IGVsZW1lbnQgYHN0eWxlLmhlaWdodGAuIEVpdGhlciBzcGVjaWZ5IGEgdmFsaWQgaGVpZ2h0IHN0cmluZyBvciBhIG51bWJlcixcbiAgICAgKiB3aGljaCB3aWxsIGdldCAncHgnIGFwcGVuZGVkLiBXZSByZWNvbW1lbmQgdXNpbmcgQ1NTIGFzIHRoZSBwcmltYXJ5IHdheSB0byBjb250cm9sIGhlaWdodCwgYnV0IGluIHNvbWVcbiAgICAgKiBjYXNlcyB0aGlzIGNvbmZpZyBpcyBjb252ZW5pZW50LlxuICAgICAqL1xuICAgIGhlaWdodCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSB3aXRoIHRydWUgdG8gbWFrZSB3aWRnZXQgaW5pdGlhbGx5IGhpZGRlbi5cbiAgICAgKi9cbiAgICBoaWRkZW4gPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWZsb2F0aW5nKS4qXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctaGlkZUFuaW1hdGlvbilcbiAgICAgKi9cbiAgICBoaWRlQW5pbWF0aW9uID8gOiBib29sZWFufG9iamVjdFxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBwaWNrZXIgaXMgaGlkZGVuIG9uIHNlbGVjdGlvbiBpbiBzaW5nbGUgc2VsZWN0IG1vZGUsIGFuZFxuICAgICAqIHJlbWFpbnMgdG8gYWxsb3cgbW9yZSBzZWxlY3Rpb25zIHdoZW4gW211bHRpU2VsZWN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29tYm8jY29uZmlnLW11bHRpU2VsZWN0KSBpcyBgdHJ1ZWAuXG4gICAgICogU2V0dGluZyB0aGlzIHRvIGEgYEJvb2xlYW5gIHZhbHVlIGNhbiBvdmVycmlkZSB0aGF0IGRlZmF1bHQuXG4gICAgICovXG4gICAgaGlkZVBpY2tlck9uU2VsZWN0ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIGFzIGB0cnVlYCB0byBoaWRlIHRoZSBleHBhbmQgdHJpZ2dlci4gVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHNldCB0byBgdHJ1ZWAgaWZcbiAgICAgKiByZW1vdGUgZmlsdGVyaW5nIGlzIGVuYWJsZWQgYnkgc2V0dGluZyB0aGUgW2ZpbHRlclBhcmFtTmFtZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbWJvI2NvbmZpZy1maWx0ZXJQYXJhbU5hbWUpIGNvbmZpZy5cbiAgICAgKi9cbiAgICBoaWRlVHJpZ2dlciA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYHRydWVgIHRvIGhpZ2hsaWdodCBmaWVsZCBhZnRlciBleHRlcm5hbCB2YWx1ZSBjaGFuZ2VzXG4gICAgICovXG4gICAgaGlnaGxpZ2h0RXh0ZXJuYWxDaGFuZ2UgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBzdHJpbmcgdG8gZGlzcGxheSBpbnNpZGUgdGhlIGlucHV0IGZpZWxkIGFzIGFuIG92ZXJsYXkuIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgZGlzcGxheWluZ1xuICAgICAqIGEgZmllbGQncyB1bml0cy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1oaW50KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIEEgZGF0YSBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LkZpZWxkfSBkYXRhLnNvdXJjZSBBIHJlZmVyZW5jZSB0byB0aGUgZmllbGQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge2FueX0gZGF0YS52YWx1ZSBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZmllbGRcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIGhpbnQgPyA6IHN0cmluZ3woKGRhdGE6IHsgc291cmNlOiBGaWVsZCwgdmFsdWU6IGFueSB9KSA9PiBzdHJpbmcpXG4gICAgLyoqXG4gICAgICogVGhpcyBjb25maWcgaXMgc2ltaWxhciB0byBbaGludF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0ZpZWxkI2NvbmZpZy1oaW50KSBleGNlcHQgdGhhdCB0aGlzIGNvbmZpZyBpcyB1c2VkIHRvIGRpc3BsYXkgSFRNTCBjb250ZW50LlxuICAgICAqIFNpbmNlIHRoaXMgY2FuIGFsbG93IG1hbGljaW91cyBjb250ZW50IHRvIGJlIGV4ZWN1dGVkLCBiZSBzdXJlIG5vdCB0byBpbmNsdWRlIHVzZXItZW50ZXJlZCBkYXRhIG9yIHRvXG4gICAgICogZW5jb2RlIHN1Y2ggZGF0YSAoc2VlIFtlbmNvZGVIdG1sXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS9oZWxwZXIvU3RyaW5nSGVscGVyI2Z1bmN0aW9uLWVuY29kZUh0bWwtc3RhdGljKSkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctaGludEh0bWwpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgQSBkYXRhIG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuRmllbGR9IGRhdGEuc291cmNlIEEgcmVmZXJlbmNlIHRvIHRoZSBmaWVsZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7YW55fSBkYXRhLnZhbHVlIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmaWVsZFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgaGludEh0bWwgPyA6IHN0cmluZ3woKGRhdGE6IHsgc291cmNlOiBGaWVsZCwgdmFsdWU6IGFueSB9KSA9PiBzdHJpbmcpXG4gICAgLyoqXG4gICAgICogV2lkZ2V0IGlkLCBpZiBub3Qgc3BlY2lmaWVkIG9uZSB3aWxsIGJlIGdlbmVyYXRlZC4gQWxzbyB1c2VkIGZvciBsb29rdXBzIHRocm91Z2ggV2lkZ2V0LmdldEJ5SWRcbiAgICAgKi9cbiAgICBpZCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgd2lkZ2V0cyByZWFkLW9ubHkgc3RhdGUgc2hvdWxkIGJlIGNvbnRyb2xsZWQgYnkgaXRzIHBhcmVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1pZ25vcmVQYXJlbnRSZWFkT25seSlcbiAgICAgKi9cbiAgICBpZ25vcmVQYXJlbnRSZWFkT25seSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIGNvbmZpZyB0byBgdHJ1ZWAgdG8gYWx3YXlzIGRpc3BsYXkgaXRlbXMgaG9yaXpvbnRhbGx5IGFsb25nIHdpdGggdGhpcyBmaWVsZC4gVGhpcyBhc3NpZ25zIGFuXG4gICAgICogW2hib3hdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9sYXlvdXQvQm94KSBhcyB0aGUgW2xheW91dF0oI0NvcmUvd2lkZ2V0L0NvbnRhaW5lciNjb25maWctbGF5b3V0KSB0byB0aGVcbiAgICAgKiBbY29udGFpbmVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvRmllbGQjY29uZmlnLWNvbnRhaW5lcikuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctaW5saW5lKVxuICAgICAqL1xuICAgIGlubGluZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSB0aGlzIGFzIGB0cnVlYCB0byByZW5kZXIgdGhlIGRyb3Bkb3duIGxpc3QgYXMgYSBwZXJtYW5lbnRseSB2aXNpYmxlIGxpc3RcbiAgICAgKiBpbiB0aGUgZG9jdW1lbnQgZmxvdyBpbW1lZGlhdGVseSBiZWxvdyB0aGUgaW5wdXQgYXJlYSBpbnN0ZWFkIG9mIGFzIGEgcG9wdXAuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctaW5saW5lUGlja2VyKVxuICAgICAqL1xuICAgIGlubGluZVBpY2tlciA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRleHQgYWxpZ25tZW50IGZvciB0aGUgaW5wdXQgZmllbGQuXG4gICAgICovXG4gICAgaW5wdXRBbGlnbiA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogU2V0cyBjdXN0b20gYXR0cmlidXRlcyBvZiB0aGUgdW5kZXJseWluZyBpbnB1dCBlbGVtZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlZmVyIHRvXG4gICAgICogW01ETl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9BdHRyaWJ1dGVzKVxuICAgICAqL1xuICAgIGlucHV0QXR0cmlidXRlcyA/IDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgIC8qKlxuICAgICAqIElmIHlvdSBuZWVkIHRvIHVzZSBzb21ldGhpbmcgZWxzZSB0aGFuIGEgZGVmYXVsdCBgaW5wdXRgIGVsZW1lbnQsIGFzIHRoZSBpbnB1dCBlbGVtZW50LCBwcm92aWRlIHRoZSB0YWdcbiAgICAgKiBuYW1lIGhlcmUuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBpcyB1c2VkIGZvciBhZHZhbmNlZCB1c2FnZSBvbmx5LCBmb3IgZXhhbXBsZSB3aGVuIHVzaW5nIFdlYkNvbXBvbmVudHNcbiAgICAgKiAoY3VzdG9tIGVsZW1lbnRzKSwgYW5kIHRoYXQgdGhlIGNvbmZpZ3VyZWQgZWxlbWVudCBtdXN0IGZ1bGZpbCB0aGUgc2FtZSBjb250cmFjdCBhcyBhIHJlZ3VsYXIgaW5wdXRcbiAgICAgKiBlbGVtZW50LlxuICAgICAqL1xuICAgIGlucHV0VGFnID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgdHlwZWAgYXR0cmlidXRlIG9mIHRoZSB1bmRlcmx5aW5nIGlucHV0IGVsZW1lbnQgKHBhc3N3b3JkLCBoaWRkZW4sIGRhdGUsIGNvbG9yLCBldGMuKS5cbiAgICAgKi9cbiAgICBpbnB1dFR5cGUgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSB3aWR0aCB0byBhcHBseSB0byB0aGUgYC5iLWZpZWxkLWlubmVyYCBlbGVtZW50LCB3aGljaCBlbmNvbXBhc3NlcyB0aGUgYGlucHV0YCBlbGVtZW50IGFuZCBhbnlcbiAgICAgKiB0cmlnZ2Vycy4gSWYgYSBudW1iZXIgaXMgc3BlY2lmaWVkLCBgcHhgIHdpbGwgYmUgdXNlZC5cbiAgICAgKi9cbiAgICBpbnB1dFdpZHRoID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgZWxlbWVudCBpZCkgdG8gaW5zZXJ0IHRoaXMgd2lkZ2V0IGJlZm9yZS4gSWYgcHJvdmlkZWQsIFthcHBlbmRUb10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctYXBwZW5kVG8pIGNvbmZpZyBpcyBpZ25vcmVkLlxuICAgICAqL1xuICAgIGluc2VydEJlZm9yZSA/IDogSFRNTEVsZW1lbnR8c3RyaW5nXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgZWxlbWVudCBpZCkgdG8gYXBwZW5kIHRoaXMgd2lkZ2V0IGVsZW1lbnQgdG8sIGFzIGEgZmlyc3QgY2hpbGQuIElmIHByb3ZpZGVkLCBbYXBwZW5kVG9dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWFwcGVuZFRvKSBjb25maWcgaXMgaWdub3JlZC5cbiAgICAgKi9cbiAgICBpbnNlcnRGaXJzdCA/IDogSFRNTEVsZW1lbnR8c3RyaW5nXG4gICAgLyoqXG4gICAgICogUm93cyB0byBkaXNwbGF5IGluIHRoZSBkcm9wZG93biAobGlzdCBpdGVtcykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctaXRlbXMpXG4gICAgICovXG4gICAgaXRlbXMgPyA6IG9iamVjdFtdfHN0cmluZ1tdfG9iamVjdFxuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aG9zZSBrZXlzIGFyZSB0aGUgW2tleV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQva2V5KSBuYW1lXG4gICAgICogYW5kIG9wdGlvbmFsIG1vZGlmaWVyIHByZWZpeGVzOiBgJ0N0cmwrJ2AsIGAnQWx0KydgLCBgJ01ldGErJ2AsIGFuZCBgJ1NoaWZ0KydgIChjYXNlLWluc2Vuc2l0aXZlKS4gVGhlIHZhbHVlc1xuICAgICAqIGFyZSB0aGUgbmFtZSBvZiB0aGUgaW5zdGFuY2UgbWV0aG9kIHRvIGNhbGwgd2hlbiB0aGUga2V5c3Ryb2tlIGlzIHJlY2VpdmVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLWtleU1hcClcbiAgICAgKi9cbiAgICBrZXlNYXAgPyA6IFJlY29yZDxzdHJpbmcsIEtleU1hcENvbmZpZz5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgYWZ0ZXIgdGhlIGxhc3Qga2V5c3Ryb2tlIGJlZm9yZSB0cmlnZ2VyaW5nIGEgY2hhbmdlIGV2ZW50LlxuICAgICAqIFNldCB0byAwIHRvIG5vdCB0cmlnZ2VyIGNoYW5nZSBldmVudHMgZnJvbSBrZXlzdHJva2VzIChsaXN0ZW4gZm9yIGlucHV0IGV2ZW50IGluc3RlYWQgdG8gaGF2ZVxuICAgICAqIGltbWVkaWF0ZSBmZWVkYmFjaywgY2hhbmdlIHdpbGwgc3RpbGwgYmUgdHJpZ2dlcmVkIG9uIGJsdXIpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLWtleVN0cm9rZUNoYW5nZURlbGF5KVxuICAgICAqL1xuICAgIGtleVN0cm9rZUNoYW5nZURlbGF5ID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBUaGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgYWZ0ZXIgdGhlIGxhc3Qga2V5c3Ryb2tlIGJlZm9yZSBmaWx0ZXJpbmcgdGhlIGxpc3QuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWcta2V5U3Ryb2tlRmlsdGVyRGVsYXkpXG4gICAgICovXG4gICAga2V5U3Ryb2tlRmlsdGVyRGVsYXkgPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIExhYmVsLCBwcmVwZW5kZWQgdG8gZmllbGRcbiAgICAgKi9cbiAgICBsYWJlbCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQ1NTIGNsYXNzIG5hbWUgb3IgY2xhc3MgbmFtZXMgdG8gYWRkIHRvIGFueSBjb25maWd1cmVkIFtsYWJlbF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL0xhYmVsYWJsZSNjb25maWctbGFiZWwpXG4gICAgICovXG4gICAgbGFiZWxDbHMgPyA6IHN0cmluZ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiBMYWJlbCBwb3NpdGlvbiwgZWl0aGVyICdiZWZvcmUnIHRoZSBmaWVsZCBvciAnYWJvdmUnIHRoZSBmaWVsZFxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLWxhYmVsUG9zaXRpb24pXG4gICAgICovXG4gICAgbGFiZWxQb3NpdGlvbiA/IDogJ2JlZm9yZSd8J2Fib3ZlJ3xudWxsXG4gICAgLyoqXG4gICAgICogVGhlIGxhYmVscyB0byBhZGQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgaW5wdXQgZmllbGQuXG4gICAgICogRWFjaCBsYWJlbCBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctbGFiZWxzKVxuICAgICAqL1xuICAgIGxhYmVscyA/IDogb2JqZWN0W11cbiAgICAvKipcbiAgICAgKiBUaGUgd2lkdGggdG8gYXBwbHkgdG8gdGhlIGAmbHQ7bGFiZWwmZ3Q7YCBlbGVtZW50LiBJZiBhIG51bWJlciBpcyBzcGVjaWZpZWQsIGBweGAgd2lsbCBiZSB1c2VkLlxuICAgICAqL1xuICAgIGxhYmVsV2lkdGggPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiBDU1MgY2xhc3MgdG8gYWRkIHRvIHBpY2tlclxuICAgICAqL1xuICAgIGxpc3RDbHMgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0ZW5lciBzZXQgZm9yIHRoaXMgb2JqZWN0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLWxpc3RlbmVycylcbiAgICAgKi9cbiAgICBsaXN0ZW5lcnMgPyA6IENoZWNrbGlzdEZpbHRlckNvbWJvTGlzdGVuZXJzXG4gICAgLyoqXG4gICAgICogVGVtcGxhdGUgdG8gcmVuZGVyIG9wdGlvbmFsIGNvbnRlbnQgbmV4dCB0byBsaXN0IGl0ZW1zLlxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSByZWNvcmQgVGhlIGxpc3QgaXRlbSdzIGJhY2tpbmcgcmVjb3JkXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBsaXN0SXRlbVBpbGxUcGwgPyA6IChyZWNvcmQ6IE1vZGVsKSA9PiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUZW1wbGF0ZSBzdHJpbmcgdXNlZCB0byByZW5kZXIgdGhlIGxpc3QgaXRlbXMgaW4gdGhlIGRyb3Bkb3duIGxpc3RcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1saXN0SXRlbVRwbClcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gcmVjb3JkIFRoZSByZWNvcmQgcmVwcmVzZW50aW5nIHRoZSBpdGVtIGJlaW5nIHJlbmRlcmVkXG4gICAgICogQHJldHVybnMge3N0cmluZyx2b2lkfVxuICAgICAqL1xuICAgIGxpc3RJdGVtVHBsID8gOiAocmVjb3JkOiBNb2RlbHxDb21ib01vZGVsKSA9PiBzdHJpbmd8dm9pZFxuICAgIC8qKlxuICAgICAqIEEgY2xhc3MgdHJhbnNsYXRpb25zIG9mIHdoaWNoIGFyZSB1c2VkIGZvciB0cmFuc2xhdGluZyB0aGlzIGVudGl0eS5cbiAgICAgKiBUaGlzIGlzIG9mdGVuIHVzZWQgd2hlbiB0cmFuc2xhdGlvbnMgb2YgYW4gaXRlbSBhcmUgZGVmaW5lZCBvbiBpdHMgY29udGFpbmVyIGNsYXNzLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLWxvY2FsZUNsYXNzKVxuICAgICAqL1xuICAgIGxvY2FsZUNsYXNzID8gOiB0eXBlb2YgQmFzZVxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIGRpc2FibGUgbG9jYWxpemF0aW9uIG9mIHRoaXMgb2JqZWN0LlxuICAgICAqL1xuICAgIGxvY2FsaXphYmxlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBwcm9wZXJ0aWVzIHdoaWNoIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNsYXRlZCBhdXRvbWF0aWNhbGx5IHVwb24gYSBsb2NhbGUgYXBwbHlpbmcuXG4gICAgICogSW4gY2FzZSB0aGVyZSBpcyBhIG5lZWQgdG8gbG9jYWxpemUgbm90IHR5cGljYWwgdmFsdWUgKG5vdCBhIFN0cmluZyB2YWx1ZSBvciBhIGZpZWxkIHdpdGggcmUtZGVmaW5lZCBzZXR0ZXIvZ2V0dGVyKSxcbiAgICAgKiB5b3UgY291bGQgdXNlICdsb2NhbGVLZXknIG1ldGEgY29uZmlndXJhdGlvbi5cbiAgICAgKiBFeGFtcGxlOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLWxvY2FsaXphYmxlUHJvcGVydGllcylcbiAgICAgKi9cbiAgICBsb2NhbGl6YWJsZVByb3BlcnRpZXMgPyA6IHN0cmluZ1tdXG4gICAgLyoqXG4gICAgICogV2lkZ2V0J3MgbWFyZ2luLiBUaGlzIG1heSBiZSBjb25maWd1cmVkIGFzIGEgc2luZ2xlIG51bWJlciBvciBhIGBUUkJMYCBmb3JtYXQgc3RyaW5nLlxuICAgICAqIG51bWVyaWMtb25seSB2YWx1ZXMgYXJlIGludGVycHJldGVkIGFzIHBpeGVscy5cbiAgICAgKi9cbiAgICBtYXJnaW4gPyA6IG51bWJlcnxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGlzIGNvbmZpZyBvYmplY3QgY29udGFpbnMgdGhlIGRlZmF1bHRzIGZvciB0aGUgW01hc2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjcmVhdGVkIGZvciB0aGVcbiAgICAgKiBbbWFza2VkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1tYXNrZWQpIGNvbmZpZy4gQW55IHByb3BlcnRpZXMgc3BlY2lmaWVkIGluIHRoZSBgbWFza2VkYCBjb25maWcgd2lsbCBvdmVycmlkZSB0aGVzZVxuICAgICAqIHZhbHVlcy5cbiAgICAgKi9cbiAgICBtYXNrRGVmYXVsdHMgPyA6IE1hc2tDb25maWdcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGFwcGx5IHRoZSBkZWZhdWx0IG1hc2sgdG8gdGhlIHdpZGdldC4gQWx0ZXJuYXRpdmVseSwgdGhpcyBjYW4gYmUgdGhlIG1hc2sgbWVzc2FnZSBvciBhXG4gICAgICogW01hc2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjb25maWcgb2JqZWN0LlxuICAgICAqL1xuICAgIG1hc2tlZCA/IDogYm9vbGVhbnxzdHJpbmd8TWFza0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoZSBlbGVtZW50J3MgbWF4SGVpZ2h0LiBDYW4gYmUgZWl0aGVyIGEgU3RyaW5nIG9yIGEgTnVtYmVyICh3aGljaCB3aWxsIGhhdmUgJ3B4JyBhcHBlbmRlZCkuIE5vdGUgdGhhdFxuICAgICAqIGxpa2UgW2hlaWdodF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctaGVpZ2h0KSwgKnJlYWRpbmcqIHRoZSB2YWx1ZSB3aWxsIHJldHVybiB0aGUgbnVtZXJpYyB2YWx1ZSBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgbWF4SGVpZ2h0ID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogKk9ubHkgdmFsaWQgaWYgdGhpcyBXaWRnZXQgaXMgW2Zsb2F0aW5nXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykuKlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLW1heGltaXplT25Nb2JpbGUpXG4gICAgICovXG4gICAgbWF4aW1pemVPbk1vYmlsZSA/IDogbnVtYmVyfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXggbnVtYmVyIG9mIGNoYXJhY3RlcnMgZm9yIHRoZSBpbnB1dCBmaWVsZFxuICAgICAqL1xuICAgIG1heExlbmd0aCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIGVsZW1lbnRzIG1heFdpZHRoLiBDYW4gYmUgZWl0aGVyIGEgU3RyaW5nIG9yIGEgTnVtYmVyICh3aGljaCB3aWxsIGhhdmUgJ3B4JyBhcHBlbmRlZCkuIE5vdGUgdGhhdFxuICAgICAqIGxpa2UgW3dpZHRoXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy13aWR0aCksICpyZWFkaW5nKiB0aGUgdmFsdWUgd2lsbCByZXR1cm4gdGhlIG51bWVyaWMgdmFsdWUgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIG1heFdpZHRoID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIG1pbmltdW0gc3RyaW5nIGxlbmd0aCB0byB0cmlnZ2VyIHRoZSBmaWx0ZXJpbmcsIG9ubHkgcmVsZXZhbnQgd2hlbiBbZWRpdGFibGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db21ibyNjb25maWctZWRpdGFibGUpIGlzIGB0cnVlYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1taW5DaGFycylcbiAgICAgKi9cbiAgICBtaW5DaGFycyA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIGVsZW1lbnQncyBtaW5IZWlnaHQuIENhbiBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYSBOdW1iZXIgKHdoaWNoIHdpbGwgaGF2ZSAncHgnIGFwcGVuZGVkKS4gTm90ZSB0aGF0XG4gICAgICogbGlrZSBbaGVpZ2h0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1oZWlnaHQpLCAqcmVhZGluZyogdGhlIHZhbHVlIHdpbGwgcmV0dXJuIHRoZSBudW1lcmljIHZhbHVlIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBtaW5IZWlnaHQgPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiBUaGUgbWluIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZvciB0aGUgaW5wdXQgZmllbGRcbiAgICAgKi9cbiAgICBtaW5MZW5ndGggPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSBlbGVtZW50cyBtaW5XaWR0aC4gQ2FuIGJlIGVpdGhlciBhIFN0cmluZyBvciBhIE51bWJlciAod2hpY2ggd2lsbCBoYXZlICdweCcgYXBwZW5kZWQpLiBOb3RlIHRoYXRcbiAgICAgKiBsaWtlIFt3aWR0aF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctd2lkdGgpLCAqcmVhZGluZyogdGhlIHZhbHVlIHdpbGwgcmV0dXJuIHRoZSBudW1lcmljIHZhbHVlIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBtaW5XaWR0aCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyBpcyBjb25maWd1cmVkIGFzIGB0cnVlYCBhIFtSZXNpemVPYnNlcnZlcl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1Jlc2l6ZU9ic2VydmVyKVxuICAgICAqIGlzIHVzZWQgdG8gbW9uaXRvciB0aGlzIGVsZW1lbnQgZm9yIHNpemUgY2hhbmdlcyBjYXVzZWQgYnkgZWl0aGVyIHN0eWxlIG1hbmlwdWxhdGlvbiwgb3IgYnkgQ1NTXG4gICAgICogbGF5b3V0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLW1vbml0b3JSZXNpemUpXG4gICAgICovXG4gICAgbW9uaXRvclJlc2l6ZSA/IDogYm9vbGVhbnx7XG4gICAgICAgIGltbWVkaWF0ZT86IGJvb2xlYW5cbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBrZXkgdmFsdWUgd2hpY2gsIHdoZW4gdHlwZWQgaW4gYSBbbXVsdGlTZWxlY3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db21ibyNjb25maWctbXVsdGlTZWxlY3QpIENvbWJvLCBzZWxlY3RzIHRoZVxuICAgICAqIGN1cnJlbnRseSBhY3RpdmUgaXRlbSBpbiB0aGUgcGlja2VyLCBhbmQgY2xlYXJzIHRoZSBpbnB1dCBmaWVsZCByZWFkeSBmb3IgYW5vdGhlclxuICAgICAqIG1hdGNoIHRvIGJlIHR5cGVkLlxuICAgICAqL1xuICAgIG11bHRpVmFsdWVTZXBhcmF0b3IgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGZpZWxkIHdoaWNoIGlzIHVzZWQgYXMgYSBrZXkgdG8gZ2V0L3NldCB2YWx1ZXMgZnJvbS90byB0aGUgZmllbGQuXG4gICAgICogVXNlZCBwcmlvciB0byBbcmVmXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1yZWYpIGFuZCBbaWRdKCNDb3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWlkKSBpblxuICAgICAqIFtDb250YWluZXIudmFsdWVzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyI3Byb3BlcnR5LXZhbHVlcykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctbmFtZSlcbiAgICAgKi9cbiAgICBuYW1lID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGlzIGltcGxpZXMgdGhhdCB0aGUgcGlja2VyIHdpbGwgZGlzcGxheSBhbiBhbmNob3IgcG9pbnRlciwgYnV0IGFsc28gbWVhbnMgdGhhdCB0aGUgcGlja2VyIHdpbGwgYWxpZ24gY2xvc2VyXG4gICAgICogdG8gdGhlIGlucHV0IGZpZWxkIHNvIHRoYXQgdGhlIHBvaW50ZXIgcGllcmNlcyB0aGUgW3BpY2tlckFsaWduRWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbWJvI2NvbmZpZy1waWNrZXJBbGlnbkVsZW1lbnQpXG4gICAgICovXG4gICAgb3ZlcmxheUFuY2hvciA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGUgW3BpY2tlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0xpc3QpIG9uIGluaXRpYWxpemF0aW9uLiBSZXR1cm5zIHRoZVxuICAgICAqIFtwaWNrZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9MaXN0KSBpbnN0YW5jZSBhdCBydW50aW1lLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLXBpY2tlcilcbiAgICAgKi9cbiAgICBwaWNrZXIgPyA6IExpc3RDb25maWd8TGlzdFxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHByb3BlcnR5IHRvIHdoaWNoIHRoZSBwaWNrZXIgc2hvdWxkIHNpemUgYW5kIGFsaWduIGl0c2VsZi5cbiAgICAgKi9cbiAgICBwaWNrZXJBbGlnbkVsZW1lbnQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFdpZHRoIG9mIHBpY2tlciwgZGVmYXVsdHMgdG8gdGhpcyBjb21ibydzIFtwaWNrZXJBbGlnbkVsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db21ibyNjb25maWctcGlja2VyQWxpZ25FbGVtZW50KSB3aWR0aFxuICAgICAqL1xuICAgIHBpY2tlcldpZHRoID8gOiBudW1iZXJ8c3RyaW5nXG4gICAgLyoqXG4gICAgICogVGV4dCB0byBkaXNwbGF5IGluIGVtcHR5IGZpZWxkLlxuICAgICAqL1xuICAgIHBsYWNlaG9sZGVyID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHdoZW4gYSB3aWRnZXQgaXMgcmVuZGVyZWQgaW50byBhbm90aGVyIHdpZGdldCdzIFtjb250ZW50RWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1jb250ZW50RWxlbWVudCksIGJ1dCBtdXN0XG4gICAgICogbm90IHBhcnRpY2lwYXRlIGluIHRoZSBzdGFuZGFyZCBsYXlvdXQgb2YgdGhhdCB3aWRnZXQsIGFuZCBtdXN0IGJlIHBvc2l0aW9uZWQgcmVsYXRpdmVseSB0byB0aGF0XG4gICAgICogd2lkZ2V0J3MgW2NvbnRlbnRFbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWNvbnRlbnRFbGVtZW50KS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1wb3NpdGlvbmVkKVxuICAgICAqL1xuICAgIHBvc2l0aW9uZWQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBQcmV2ZW50IHRvb2x0aXAgZnJvbSBiZWluZyBkaXNwbGF5ZWQgb24gdG91Y2ggZGV2aWNlcy4gVXNlZnVsIGZvciBleGFtcGxlIGZvciBidXR0b25zIHRoYXQgZGlzcGxheSBhXG4gICAgICogbWVudSBvbiBjbGljayBldGMsIHNpbmNlIHRoZSB0b29sdGlwIHdvdWxkIGJlIGRpc3BsYXllZCBhdCB0aGUgc2FtZSB0aW1lLlxuICAgICAqL1xuICAgIHByZXZlbnRUb29sdGlwT25Ub3VjaCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsbHkgYSBbRmlsdGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS91dGlsL0NvbGxlY3Rpb25GaWx0ZXIpIGNvbmZpZyBvYmplY3Qgd2hpY2ggdGhlIGNvbWJvIHNob3VsZCB1c2UgZm9yXG4gICAgICogZmlsdGVyaW5nIHVzaW5nIHRoZSB0eXBlZCB2YWx1ZS5cbiAgICAgKiBUaGlzIG1heSB1c2UgYSBgZmlsdGVyQnlgIHByb3BlcnR5IHRvIHRlc3QgaXRzIGB2YWx1ZWAgYWdhaW5zdCBhbnkgZmllbGQgaW4gdGhlIHBhc3NlZCByZWNvcmQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctcHJpbWFyeUZpbHRlcilcbiAgICAgKi9cbiAgICBwcmltYXJ5RmlsdGVyID8gOiBDb2xsZWN0aW9uRmlsdGVyQ29uZmlnXG4gICAgLyoqXG4gICAgICogTWFrZXMgdGhlIGZpZWxkIHVubW9kaWZpYWJsZSBieSB1c2VyIGFjdGlvbi4gVGhlIGlucHV0IGFyZWEgaXMgbm90IGVkaXRhYmxlLCBhbmQgdHJpZ2dlcnNcbiAgICAgKiBhcmUgdW5yZXNwb25zaXZlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLXJlYWRPbmx5KVxuICAgICAqL1xuICAgIHJlYWRPbmx5ID8gOiBib29sZWFuXG4gICAgcmVsYXlTdG9yZUV2ZW50cyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFByZWRlZmluZWQgc3R5bGUgdG8gdXNlIGZvciB0aGUgZmllbGQuIFBvc3NpYmxlIHZhbHVlcyBhcmU6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctcmVuZGl0aW9uKVxuICAgICAqL1xuICAgIHJlbmRpdGlvbiA/IDogJ291dGxpbmVkJ3wnZmlsbGVkJ3xzdHJpbmdcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYHRydWVgIHRvIGluZGljYXRlIHRoYXQgYSBgbnVsbGAgZmllbGQgdmFsdWUgaXMgdG8gYmUgbWFya2VkIGFzIGludmFsaWQuIFRoaXMgd2lsbFxuICAgICAqIG9wdGlvbmFsbHkgYXBwZW5kIGEgKiB0byB0aGUgZmllbGQgbGFiZWwgaWYgW3Nob3dSZXF1aXJlZEluZGljYXRvcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0ZpZWxkI3Byb3BlcnR5LXNob3dSZXF1aXJlZEluZGljYXRvcikgaXMgc2V0LlxuICAgICAqL1xuICAgIHJlcXVpcmVkID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBmaWVsZCBpcyBub3QgW3JlYWRPbmx5XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvRmllbGQjY29uZmlnLXJlYWRPbmx5KSwgdGhlbiBzZXR0aW5nIHRoaXMgb3B0aW9uIG1lYW5zIHRoYXQgcHJlc3NpbmdcbiAgICAgKiB0aGUgPGtiZD5Fc2NhcGU8L2tiZD4ga2V5IGFmdGVyIGVkaXRpbmcgdGhlIGZpZWxkIHdpbGwgcmV2ZXJ0IHRoZSBmaWVsZCB0byB0aGUgdmFsdWUgaXQgaGFkIHdoZW5cbiAgICAgKiB0aGUgdXNlciBmb2N1c2VkIHRoZSBmaWVsZC4gSWYgdGhlIGZpZWxkIGlzICpub3QqIGNoYW5nZWQgZnJvbSB3aGVuIGZvY3VzZWQsIHRoZSBbY2xlYXJhYmxlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvRmllbGQjY29uZmlnLWNsZWFyYWJsZSlcbiAgICAgKiBiZWhhdmlvdXIgd2lsbCBiZSBhY3RpdmF0ZWQuXG4gICAgICovXG4gICAgcmV2ZXJ0T25Fc2NhcGUgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYHRydWVgIHRvIGhhdmUgdGhlIGNvbXBvbmVudCBkaXNwbGF5IGEgdHJhbnNsdWNlbnQgcmlwcGxlIHdoZW4gaXRzXG4gICAgICogW2ZvY3VzRWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1mb2N1c0VsZW1lbnQpLCBvciBbZWxlbWVudF0oI0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1lbGVtZW50KSBpcyB0YXBwZWQgPGVtPmlmIHRoZVxuICAgICAqIGN1cnJlbnQgdGhlbWUgc3VwcG9ydHMgcmlwcGxlczwvZW0+LiBPdXQgb2YgdGhlIGJveCwgb25seSB0aGUgTWF0ZXJpYWwgdGhlbWUgc3VwcG9ydHMgcmlwcGxlcy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1yaXBwbGUpXG4gICAgICovXG4gICAgcmlwcGxlID8gOiBib29sZWFufHtcbiAgICAgICAgZGVsZWdhdGU/OiBzdHJpbmdcbiAgICAgICAgY29sb3I/OiBzdHJpbmdcbiAgICAgICAgcmFkaXVzPzogbnVtYmVyXG4gICAgICAgIGNsaXA/OiBzdHJpbmdcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgeW91IGFyZSByZW5kZXJpbmcgdGhpcyB3aWRnZXQgdG8gYSBzaGFkb3cgcm9vdCBpbnNpZGUgYSB3ZWIgY29tcG9uZW50LCBzZXQgdGhpcyBjb25maWcgdG8gdGhlIHNoYWRvd1Jvb3QuIElmIG5vdCBpbnNpZGUgYSB3ZWIgY29tcG9uZW50LCBzZXQgaXQgdG8gYGRvY3VtZW50LmJvZHlgXG4gICAgICovXG4gICAgcm9vdEVsZW1lbnQgPyA6IFNoYWRvd1Jvb3R8SFRNTEVsZW1lbnRcbiAgICAvKipcbiAgICAgKiBUaGlzIG1heSBiZSBjb25maWd1cmVkIGFzIGB0cnVlYCB0byBtYWtlIHRoZSB3aWRnZXQncyBlbGVtZW50IHVzZSB0aGUgYGRpcmVjdGlvbjpydGxgIHN0eWxlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLXJ0bClcbiAgICAgKi9cbiAgICBydGwgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHdoYXQgdG8gZG8gaWYgZG9jdW1lbnQgaXMgc2Nyb2xsZWQgd2hpbGUgV2lkZ2V0IGlzIHZpc2libGUgKG9ubHkgcmVsZXZhbnQgd2hlbiBmbG9hdGluZyBpcyBzZXQgdG8gYHRydWVgKS5cbiAgICAgKiBWYWxpZCB2YWx1ZXM6IMK0bnVsbMK0OiBkbyBub3RoaW5nLCDCtGhpZGXCtDogaGlkZSB0aGUgd2lkZ2V0IG9yIMK0cmVhbGlnbsK0OiByZWFsaWduIHRvIHRoZSB0YXJnZXQgaWYgcG9zc2libGUuXG4gICAgICovXG4gICAgc2Nyb2xsQWN0aW9uID8gOiAnaGlkZSd8J3JlYWxpZ24nfG51bGxcbiAgICAvKipcbiAgICAgKiBUaGUgdGV4dCBpbiB0aGUgc2VhcmNoIGJveCwgd2hpY2ggd2lsbCBmaWx0ZXIgdGhlIGxpc3QgdG8gbWF0Y2hpbmcgcmVjb3JkcyBvbmx5LiBTZWUgYWxzbyBbZmlsdGVyT3BlcmF0b3JdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctZmlsdGVyT3BlcmF0b3IpLlxuICAgICAqL1xuICAgIHNlYXJjaFRleHQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqICpPbmx5IHZhbGlkIGlmIHRoaXMgV2lkZ2V0IGlzIFtmbG9hdGluZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpLipcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1zaG93QW5pbWF0aW9uKVxuICAgICAqL1xuICAgIHNob3dBbmltYXRpb24gPyA6IGJvb2xlYW58b2JqZWN0XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHNob3dzIGFuIFwiQXBwbHlcIiBidXR0b24gaW4gcGxhY2Ugb2YgdGhlIFwiU2VsZWN0IEFsbFwiIGJ1dHRvbiwgYW5kIGRvZXMgbm90XG4gICAgICogcmFpc2UgYGNoYW5nZWAgZXZlbnRzIHVudGlsIHRoZSBBcHBseSBidXR0b24gaXMgY2xpY2tlZC5cbiAgICAgKi9cbiAgICBzaG93QXBwbHlCdXR0b24gPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgdG8gYXV0b21hdGljYWxseSBkaXNwbGF5IGEgKiBhZnRlciB0aGUgbGFiZWwgZm9yIHRoaXMgZmllbGQgd2hlbiBpdCBpcyBbcmVxdWlyZWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9GaWVsZCNwcm9wZXJ0eS1yZXF1aXJlZCkuXG4gICAgICovXG4gICAgc2hvd1JlcXVpcmVkSW5kaWNhdG9yID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYGZhbHNlYCB0byBub3Qgc2hvdyB0aGUgdG9vbHRpcCB3aGVuIHRoaXMgd2lkZ2V0IGlzIFtkaXNhYmxlZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1kaXNhYmxlZClcbiAgICAgKi9cbiAgICBzaG93VG9vbHRpcFdoZW5EaXNhYmxlZCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAsIGNvbXBsZXRlbHkgYnlwYXNzZXMgdmFsaWRhdGlvbiBsb2dpYyAoY291bGQgYmUgdXNlcmZ1bCBpZiB5b3VyIGZpZWxkIGlzIG5vdCBgZWRpdGFibGVgXG4gICAgICogdG8gdGhlIHVzZXIpLlxuICAgICAqL1xuICAgIHNraXBWYWxpZGF0aW9uID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogUHJvZ3JhbW1hdGljIGNvbnRyb2wgb3ZlciBob3cgbWFueSBjb2x1bW5zIHRvIHNwYW4gd2hlbiB1c2VkIGluIGEgZ3JpZCBsYXlvdXQuXG4gICAgICovXG4gICAgc3BhbiA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbmF0aXZlIGBzcGVsbGNoZWNrYCBwcm9wZXJ0eSBvZiB0aGUgdW5kZXJseWluZyBpbnB1dCBlbGVtZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlZmVyIHRvXG4gICAgICogW01ETl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9HbG9iYWxfYXR0cmlidXRlcy9zcGVsbGNoZWNrKVxuICAgICAqL1xuICAgIHNwZWxsQ2hlY2sgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTdG9yZSB1c2VkIHRvIHBvcHVsYXRlIGl0ZW1zLiBBbHNvIGFjY2VwdHMgYSBTdG9yZSBjb25maWcgb2JqZWN0XG4gICAgICovXG4gICAgc3RvcmUgPyA6IFN0b3JlfFN0b3JlQ29uZmlnXG4gICAgLyoqXG4gICAgICogQSBjb25maWd1cmF0aW9uIGZvciB0aGUgW3RhYl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1RhYikgY3JlYXRlZCBmb3IgdGhpcyB3aWRnZXQgd2hlbiBpdCBpcyBwbGFjZWQgaW4gYVxuICAgICAqIFtUYWJQYW5lbF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1RhYlBhbmVsKS4gRm9yIGV4YW1wbGUsIHRoaXMgY29uZmlnIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGljb24gb2YgdGhlIGB0YWJgIGZvclxuICAgICAqIHRoaXMgd2lkZ2V0OlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLXRhYilcbiAgICAgKi9cbiAgICB0YWIgPyA6IGJvb2xlYW58VGFiQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhlIHRhYiBpbmRleCBvZiB0aGUgaW5wdXQgZmllbGQgb3IgZmllbGRzLCBvciBgbnVsbGAgZm9yIG5hdHVyYWwgdGFiIG9yZGVyIChyZWNvbW1lbmRlZCkuIFNldHRpbmcgdG8gYDBgXG4gICAgICogaXMgZXF1aXZhbGVudCB0byBuYXR1cmFsIHRhYiBvcmRlciwgYnV0IGlzIHVubmVjZXNzYXJ5IGZvciBmaWVsZHMgc2luY2UgdGhleSBhcmUgbmF0dXJhbGx5IHRhYmJhYmxlXG4gICAgICogKGkuZS4sIGFjY2Vzc2libGUgdmlhIHRoZSBUQUIga2V5KS4gU2V0dGluZyB0byBgLTFgIGRpc2FibGVzIHRhYmJhYmlsaXR5IGJ1dCBhbGxvd3MgZm9yIGZvY3VzIHRvIGJlIHNldFxuICAgICAqIHRvIHRoZSBlbGVtZW50IHByb2dyYW1tYXRpY2FsbHkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctdGFiSW5kZXgpXG4gICAgICovXG4gICAgdGFiSW5kZXggPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIFRleHQgYWxpZ25tZW50OiAnbGVmdCcsICdjZW50ZXInIG9yICdyaWdodCcuIEFsc28gYWNjZXB0cyBkaXJlY3Rpb24gbmV1dHJhbCAnc3RhcnQnIGFuZCAnZW5kJy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy10ZXh0QWxpZ24pXG4gICAgICovXG4gICAgdGV4dEFsaWduID8gOiAnbGVmdCd8J2NlbnRlcid8J3JpZ2h0J3wnc3RhcnQnfCdlbmQnXG4gICAgLyoqXG4gICAgICogQSB0aXRsZSB0byBkaXNwbGF5IGZvciB0aGUgd2lkZ2V0LiBPbmx5IGluIGVmZmVjdCB3aGVuIGluc2lkZSBhIGNvbnRhaW5lciB0aGF0IHVzZXMgaXQgKHN1Y2ggYXMgVGFiUGFuZWwpXG4gICAgICovXG4gICAgdGl0bGUgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRvb2x0aXAgZm9yIHRoZSB3aWRnZXQsIGVpdGhlciBhcyBhIHN0cmluZyBvciBhcyBhIFRvb2x0aXAgY29uZmlnIG9iamVjdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy10b29sdGlwKVxuICAgICAqL1xuICAgIHRvb2x0aXAgPyA6IHN0cmluZ3xUb29sdGlwQ29uZmlnfG51bGxcbiAgICAvKipcbiAgICAgKiBIb3cgdG8gcXVlcnkgdGhlIHN0b3JlIHVwb24gY2xpY2sgb2YgdGhlIGV4cGFuZCB0cmlnZ2VyLiBTcGVjaWZ5IG9uZSBvZiB0aGVzZSB2YWx1ZXM6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctdHJpZ2dlckFjdGlvbilcbiAgICAgKi9cbiAgICB0cmlnZ2VyQWN0aW9uID8gOiAnYWxsJ3wnbGFzdCd8bnVsbFxuICAgIC8qKlxuICAgICAqIFRoZSB0cmlnZ2VycyB0byBhZGQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgaW5wdXQgZmllbGQuIEVhY2ggcHJvcGVydHkgbmFtZSBpcyB0aGUgcmVmZXJlbmNlIGJ5IHdoaWNoXG4gICAgICogYW4gaW5zdGFudGlhdGVkIFRyaWdnZXIgV2lkZ2V0IG1heSBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgbGl2ZSBgdHJpZ2dlcnNgIHByb3BlcnR5LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLXRyaWdnZXJzKVxuICAgICAqL1xuICAgIHRyaWdnZXJzID8gOiBSZWNvcmQ8c3RyaW5nLCBGaWVsZFRyaWdnZXJDb25maWc+fFJlY29yZDxzdHJpbmcsIFdpZGdldD5cbiAgICB0eXBlID8gOiAnY2hlY2tsaXN0ZmlsdGVyY29tYm8nXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIENTUyBjbGFzcyBuYW1lIHN1ZmZpeGVzIHRvIGFwcGx5IHRvIHRoZSBlbGVtZW50cyByZW5kZXJlZCBieSB0aGlzIHdpZGdldC4gVGhpcyBtYXkgYmUgc3BlY2lmaWVkXG4gICAgICogYXMgYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nLCBhbiBhcnJheSBvZiBzdHJpbmdzLCBvciBhcyBhbiBvYmplY3QgaW4gd2hpY2ggcHJvcGVydHkgbmFtZXMgd2l0aCB0cnV0aHlcbiAgICAgKiB2YWx1ZXMgYXJlIHVzZWQgYXMgdGhlIGNsYXNzIG5hbWVzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLXVpKVxuICAgICAqL1xuICAgIHVpID8gOiBzdHJpbmd8b2JqZWN0XG4gICAgLyoqXG4gICAgICogYHRydWVgIHRvIGNhdXNlIHRoZSBmaWVsZCB0byBiZSBpbiBhbiBpbnZhbGlkIHN0YXRlIHdoaWxlIHRoZSB0eXBlZCBmaWx0ZXIgc3RyaW5nIGRvZXMgbm90IG1hdGNoIGEgcmVjb3JkIGluIHRoZSBzdG9yZS5cbiAgICAgKi9cbiAgICB2YWxpZGF0ZUZpbHRlciA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIG5vdCBoaWdobGlnaHQgYSBmaWVsZCBhcyBpbnZhbGlkIHdoaWxlIHR5cGluZywgdG8gaW5zdGVhZCBzaG93IGl0IG9uIEVOVEVSIGtleSBwcmVzc1xuICAgICAqIG9yIHNpbWlsYXIuXG4gICAgICovXG4gICAgdmFsaWRhdGVPbklucHV0ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhpcyBDb21ibyBib3guIEFuIGFycmF5IG9mIHJlY29yZCBpZHMuXG4gICAgICovXG4gICAgdmFsdWUgPyA6IHN0cmluZ1tdfG51bWJlcltdXG4gICAgLyoqXG4gICAgICogRmllbGQgdXNlZCBmb3IgaXRlbSB2YWx1ZSB3aGVuIHBvcHVsYXRpbmcgZnJvbSBzdG9yZS4gU2V0dGluZyB0aGlzIHRvIGBudWxsYCB3aWxsXG4gICAgICogeWllbGQgdGhlIHNlbGVjdGVkIHJlY29yZCBhcyB0aGUgQ29tYm8ncyBbdmFsdWVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db21ibyNwcm9wZXJ0eS12YWx1ZSkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctdmFsdWVGaWVsZClcbiAgICAgKi9cbiAgICB2YWx1ZUZpZWxkID8gOiBzdHJpbmd8bnVsbFxuICAgIC8qKlxuICAgICAqIEEgd2lkZ2V0cyB3ZWlnaHQgZGV0ZXJtaW5lcyBpdHMgcG9zaXRpb24gYW1vbmcgc2libGluZ3Mgd2hlbiBhZGRlZCB0byBhIFtDb250YWluZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIpLlxuICAgICAqIEhpZ2hlciB3ZWlnaHRzIGdvIGZ1cnRoZXIgZG93bi5cbiAgICAgKi9cbiAgICB3ZWlnaHQgPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIFdpZGdldCdzIHdpZHRoLCB1c2VkIHRvIHNldCBlbGVtZW50IGBzdHlsZS53aWR0aGAuIEVpdGhlciBzcGVjaWZ5IGEgdmFsaWQgd2lkdGggc3RyaW5nIG9yIGEgbnVtYmVyLCB3aGljaFxuICAgICAqIHdpbGwgZ2V0ICdweCcgYXBwZW5kZWQuIFdlIHJlY29tbWVuZCB1c2luZyBDU1MgYXMgdGhlIHByaW1hcnkgd2F5IHRvIGNvbnRyb2wgd2lkdGgsIGJ1dCBpbiBzb21lIGNhc2VzXG4gICAgICogdGhpcyBjb25maWcgaXMgY29udmVuaWVudC5cbiAgICAgKi9cbiAgICB3aWR0aCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSB4IHBvc2l0aW9uIGZvciB0aGUgd2lkZ2V0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLXgpXG4gICAgICovXG4gICAgeCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIHkgcG9zaXRpb24gZm9yIHRoZSB3aWRnZXQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWcteSlcbiAgICAgKi9cbiAgICB5ID8gOiBudW1iZXJcblxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvciA6ICdicnludHVtLWNoZWNrbGlzdC1maWx0ZXItY29tYm8nLFxuICAgIHRlbXBsYXRlIDogJydcbn0pXG5leHBvcnQgY2xhc3MgQnJ5bnR1bUNoZWNrbGlzdEZpbHRlckNvbWJvQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgcHVibGljIHN0YXRpYyBpbnN0YW5jZUNsYXNzID0gQ2hlY2tsaXN0RmlsdGVyQ29tYm87XG5cbiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlTmFtZSA9ICdDaGVja2xpc3RGaWx0ZXJDb21ibyc7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtRXZlbnRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ29uQWN0aW9uJyxcbiAgICAgICAgJ29uQmVmb3JlRGVzdHJveScsXG4gICAgICAgICdvbkJlZm9yZUhpZGUnLFxuICAgICAgICAnb25CZWZvcmVTaG93JyxcbiAgICAgICAgJ29uQ2F0Y2hBbGwnLFxuICAgICAgICAnb25DaGFuZ2UnLFxuICAgICAgICAnb25DbGVhcicsXG4gICAgICAgICdvbkRlc3Ryb3knLFxuICAgICAgICAnb25FbGVtZW50Q3JlYXRlZCcsXG4gICAgICAgICdvbkZvY3VzSW4nLFxuICAgICAgICAnb25Gb2N1c091dCcsXG4gICAgICAgICdvbkhpZGUnLFxuICAgICAgICAnb25JbnB1dCcsXG4gICAgICAgICdvblBhaW50JyxcbiAgICAgICAgJ29uUmVhZE9ubHknLFxuICAgICAgICAnb25SZWNvbXBvc2UnLFxuICAgICAgICAnb25SZXNpemUnLFxuICAgICAgICAnb25TZWxlY3QnLFxuICAgICAgICAnb25TaG93JyxcbiAgICAgICAgJ29uVHJpZ2dlcidcbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUZlYXR1cmVOYW1lczogc3RyaW5nW10gPSBbXG5cbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUNvbmZpZ3M6IHN0cmluZ1tdID0gQnJ5bnR1bUNoZWNrbGlzdEZpbHRlckNvbWJvQ29tcG9uZW50LmJyeW50dW1GZWF0dXJlTmFtZXMuY29uY2F0KFtcbiAgICAgICAgJ2Fkb3B0JyxcbiAgICAgICAgJ2FsaWduJyxcbiAgICAgICAgJ2FsaWduU2VsZicsXG4gICAgICAgICdhbmNob3InLFxuICAgICAgICAnYXBwZW5kVG8nLFxuICAgICAgICAnYXJpYURlc2NyaXB0aW9uJyxcbiAgICAgICAgJ2FyaWFMYWJlbCcsXG4gICAgICAgICdhdXRvQ29tcGxldGUnLFxuICAgICAgICAnYXV0b0V4cGFuZCcsXG4gICAgICAgICdhdXRvU2VsZWN0JyxcbiAgICAgICAgJ2JhZGdlJyxcbiAgICAgICAgJ2J1YmJsZUV2ZW50cycsXG4gICAgICAgICdjYWNoZUxhc3RSZXN1bHQnLFxuICAgICAgICAnY2FsbE9uRnVuY3Rpb25zJyxcbiAgICAgICAgJ2Nhc2VTZW5zaXRpdmUnLFxuICAgICAgICAnY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zJyxcbiAgICAgICAgJ2NlbnRlcmVkJyxcbiAgICAgICAgJ2NoaXBWaWV3JyxcbiAgICAgICAgJ2NsZWFyYWJsZScsXG4gICAgICAgICdjbGVhclRleHRPblBpY2tlckhpZGUnLFxuICAgICAgICAnY2xlYXJUZXh0T25TZWxlY3Rpb24nLFxuICAgICAgICAnY2xlYXJXaGVuSW5wdXRFbXB0eScsXG4gICAgICAgICdjbHMnLFxuICAgICAgICAnY29sb3InLFxuICAgICAgICAnY29sdW1uJyxcbiAgICAgICAgJ2NvbmZpZycsXG4gICAgICAgICdjb25zdHJhaW5UbycsXG4gICAgICAgICdjb250YWluZXInLFxuICAgICAgICAnY29udGFpblZhbHVlcycsXG4gICAgICAgICdjb250ZW50RWxlbWVudENscycsXG4gICAgICAgICdjcmVhdGVPblVubWF0Y2hlZCcsXG4gICAgICAgICdkYXRhRmllbGQnLFxuICAgICAgICAnZGF0YXNldCcsXG4gICAgICAgICdkZWZhdWx0QmluZFByb3BlcnR5JyxcbiAgICAgICAgJ2RldGVjdENTU0NvbXBhdGliaWxpdHlJc3N1ZXMnLFxuICAgICAgICAnZGlzYWJsZWQnLFxuICAgICAgICAnZGlzcGxheUZpZWxkJyxcbiAgICAgICAgJ2Rpc3BsYXlWYWx1ZVJlbmRlcmVyJyxcbiAgICAgICAgJ2RvY2snLFxuICAgICAgICAnZHJhZ2dhYmxlJyxcbiAgICAgICAgJ2VkaXRhYmxlJyxcbiAgICAgICAgJ2VsZW1lbnRBdHRyaWJ1dGVzJyxcbiAgICAgICAgJ2VtcHR5VGV4dCcsXG4gICAgICAgICdlbmNvZGVGaWx0ZXJQYXJhbXMnLFxuICAgICAgICAnZXh0cmFEYXRhJyxcbiAgICAgICAgJ2ZpbHRlck9uRW50ZXInLFxuICAgICAgICAnZmlsdGVyT3BlcmF0b3InLFxuICAgICAgICAnZmlsdGVyUGFyYW1OYW1lJyxcbiAgICAgICAgJ2ZpbHRlclNlbGVjdGVkJyxcbiAgICAgICAgJ2ZsZXgnLFxuICAgICAgICAnZmxvYXRpbmcnLFxuICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgJ2hpZGRlbicsXG4gICAgICAgICdoaWRlQW5pbWF0aW9uJyxcbiAgICAgICAgJ2hpZGVQaWNrZXJPblNlbGVjdCcsXG4gICAgICAgICdoaWRlVHJpZ2dlcicsXG4gICAgICAgICdoaWdobGlnaHRFeHRlcm5hbENoYW5nZScsXG4gICAgICAgICdoaW50JyxcbiAgICAgICAgJ2hpbnRIdG1sJyxcbiAgICAgICAgJ2lkJyxcbiAgICAgICAgJ2lnbm9yZVBhcmVudFJlYWRPbmx5JyxcbiAgICAgICAgJ2lubGluZScsXG4gICAgICAgICdpbmxpbmVQaWNrZXInLFxuICAgICAgICAnaW5wdXRBbGlnbicsXG4gICAgICAgICdpbnB1dEF0dHJpYnV0ZXMnLFxuICAgICAgICAnaW5wdXRUYWcnLFxuICAgICAgICAnaW5wdXRUeXBlJyxcbiAgICAgICAgJ2lucHV0V2lkdGgnLFxuICAgICAgICAnaW5zZXJ0QmVmb3JlJyxcbiAgICAgICAgJ2luc2VydEZpcnN0JyxcbiAgICAgICAgJ2l0ZW1zJyxcbiAgICAgICAgJ2tleU1hcCcsXG4gICAgICAgICdrZXlTdHJva2VDaGFuZ2VEZWxheScsXG4gICAgICAgICdrZXlTdHJva2VGaWx0ZXJEZWxheScsXG4gICAgICAgICdsYWJlbCcsXG4gICAgICAgICdsYWJlbENscycsXG4gICAgICAgICdsYWJlbFBvc2l0aW9uJyxcbiAgICAgICAgJ2xhYmVscycsXG4gICAgICAgICdsYWJlbFdpZHRoJyxcbiAgICAgICAgJ2xpc3RDbHMnLFxuICAgICAgICAnbGlzdGVuZXJzJyxcbiAgICAgICAgJ2xpc3RJdGVtUGlsbFRwbCcsXG4gICAgICAgICdsaXN0SXRlbVRwbCcsXG4gICAgICAgICdsb2NhbGVDbGFzcycsXG4gICAgICAgICdsb2NhbGl6YWJsZScsXG4gICAgICAgICdsb2NhbGl6YWJsZVByb3BlcnRpZXMnLFxuICAgICAgICAnbWFyZ2luJyxcbiAgICAgICAgJ21hc2tEZWZhdWx0cycsXG4gICAgICAgICdtYXNrZWQnLFxuICAgICAgICAnbWF4SGVpZ2h0JyxcbiAgICAgICAgJ21heGltaXplT25Nb2JpbGUnLFxuICAgICAgICAnbWF4TGVuZ3RoJyxcbiAgICAgICAgJ21heFdpZHRoJyxcbiAgICAgICAgJ21pbkNoYXJzJyxcbiAgICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAgICdtaW5MZW5ndGgnLFxuICAgICAgICAnbWluV2lkdGgnLFxuICAgICAgICAnbW9uaXRvclJlc2l6ZScsXG4gICAgICAgICdtdWx0aVZhbHVlU2VwYXJhdG9yJyxcbiAgICAgICAgJ25hbWUnLFxuICAgICAgICAnb3ZlcmxheUFuY2hvcicsXG4gICAgICAgICdwaWNrZXInLFxuICAgICAgICAncGlja2VyQWxpZ25FbGVtZW50JyxcbiAgICAgICAgJ3BpY2tlcldpZHRoJyxcbiAgICAgICAgJ3BsYWNlaG9sZGVyJyxcbiAgICAgICAgJ3Bvc2l0aW9uZWQnLFxuICAgICAgICAncHJldmVudFRvb2x0aXBPblRvdWNoJyxcbiAgICAgICAgJ3ByaW1hcnlGaWx0ZXInLFxuICAgICAgICAncmVhZE9ubHknLFxuICAgICAgICAncmVsYXlTdG9yZUV2ZW50cycsXG4gICAgICAgICdyZW5kaXRpb24nLFxuICAgICAgICAncmVxdWlyZWQnLFxuICAgICAgICAncmV2ZXJ0T25Fc2NhcGUnLFxuICAgICAgICAncmlwcGxlJyxcbiAgICAgICAgJ3Jvb3RFbGVtZW50JyxcbiAgICAgICAgJ3J0bCcsXG4gICAgICAgICdzY3JvbGxBY3Rpb24nLFxuICAgICAgICAnc2VhcmNoVGV4dCcsXG4gICAgICAgICdzaG93QW5pbWF0aW9uJyxcbiAgICAgICAgJ3Nob3dBcHBseUJ1dHRvbicsXG4gICAgICAgICdzaG93UmVxdWlyZWRJbmRpY2F0b3InLFxuICAgICAgICAnc2hvd1Rvb2x0aXBXaGVuRGlzYWJsZWQnLFxuICAgICAgICAnc2tpcFZhbGlkYXRpb24nLFxuICAgICAgICAnc3BhbicsXG4gICAgICAgICdzcGVsbENoZWNrJyxcbiAgICAgICAgJ3N0b3JlJyxcbiAgICAgICAgJ3RhYicsXG4gICAgICAgICd0YWJJbmRleCcsXG4gICAgICAgICd0ZXh0QWxpZ24nLFxuICAgICAgICAndGl0bGUnLFxuICAgICAgICAndG9vbHRpcCcsXG4gICAgICAgICd0cmlnZ2VyQWN0aW9uJyxcbiAgICAgICAgJ3RyaWdnZXJzJyxcbiAgICAgICAgJ3R5cGUnLFxuICAgICAgICAndWknLFxuICAgICAgICAndmFsaWRhdGVGaWx0ZXInLFxuICAgICAgICAndmFsaWRhdGVPbklucHV0JyxcbiAgICAgICAgJ3ZhbHVlJyxcbiAgICAgICAgJ3ZhbHVlRmllbGQnLFxuICAgICAgICAnd2VpZ2h0JyxcbiAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgJ3gnLFxuICAgICAgICAneSdcbiAgICBdKTtcblxuICAgIHByaXZhdGUgc3RhdGljIGJyeW50dW1Db25maWdzT25seTogc3RyaW5nW10gPSBbXG4gICAgICAgICdhZG9wdCcsXG4gICAgICAgICdhbGlnbicsXG4gICAgICAgICdhbmNob3InLFxuICAgICAgICAnYXJpYURlc2NyaXB0aW9uJyxcbiAgICAgICAgJ2FyaWFMYWJlbCcsXG4gICAgICAgICdhdXRvQ29tcGxldGUnLFxuICAgICAgICAnYXV0b0V4cGFuZCcsXG4gICAgICAgICdhdXRvU2VsZWN0JyxcbiAgICAgICAgJ2J1YmJsZUV2ZW50cycsXG4gICAgICAgICdjYWNoZUxhc3RSZXN1bHQnLFxuICAgICAgICAnY2FzZVNlbnNpdGl2ZScsXG4gICAgICAgICdjZW50ZXJlZCcsXG4gICAgICAgICdjaGlwVmlldycsXG4gICAgICAgICdjbGVhcmFibGUnLFxuICAgICAgICAnY2xlYXJUZXh0T25QaWNrZXJIaWRlJyxcbiAgICAgICAgJ2NsZWFyVGV4dE9uU2VsZWN0aW9uJyxcbiAgICAgICAgJ2NsZWFyV2hlbklucHV0RW1wdHknLFxuICAgICAgICAnY29sb3InLFxuICAgICAgICAnY29uZmlnJyxcbiAgICAgICAgJ2NvbnN0cmFpblRvJyxcbiAgICAgICAgJ2NvbnRhaW5lcicsXG4gICAgICAgICdjb250YWluVmFsdWVzJyxcbiAgICAgICAgJ2NvbnRlbnRFbGVtZW50Q2xzJyxcbiAgICAgICAgJ2NyZWF0ZU9uVW5tYXRjaGVkJyxcbiAgICAgICAgJ2RhdGFGaWVsZCcsXG4gICAgICAgICdkZWZhdWx0QmluZFByb3BlcnR5JyxcbiAgICAgICAgJ2RldGVjdENTU0NvbXBhdGliaWxpdHlJc3N1ZXMnLFxuICAgICAgICAnZGlzcGxheUZpZWxkJyxcbiAgICAgICAgJ2Rpc3BsYXlWYWx1ZVJlbmRlcmVyJyxcbiAgICAgICAgJ2RvY2snLFxuICAgICAgICAnZHJhZ2dhYmxlJyxcbiAgICAgICAgJ2VsZW1lbnRBdHRyaWJ1dGVzJyxcbiAgICAgICAgJ2VtcHR5VGV4dCcsXG4gICAgICAgICdlbmNvZGVGaWx0ZXJQYXJhbXMnLFxuICAgICAgICAnZmlsdGVyT25FbnRlcicsXG4gICAgICAgICdmaWx0ZXJQYXJhbU5hbWUnLFxuICAgICAgICAnZmlsdGVyU2VsZWN0ZWQnLFxuICAgICAgICAnZmxvYXRpbmcnLFxuICAgICAgICAnaGlkZUFuaW1hdGlvbicsXG4gICAgICAgICdoaWRlUGlja2VyT25TZWxlY3QnLFxuICAgICAgICAnaGlkZVRyaWdnZXInLFxuICAgICAgICAnaGlnaGxpZ2h0RXh0ZXJuYWxDaGFuZ2UnLFxuICAgICAgICAnaGludCcsXG4gICAgICAgICdoaW50SHRtbCcsXG4gICAgICAgICdpZ25vcmVQYXJlbnRSZWFkT25seScsXG4gICAgICAgICdpbmxpbmUnLFxuICAgICAgICAnaW5saW5lUGlja2VyJyxcbiAgICAgICAgJ2lucHV0QWxpZ24nLFxuICAgICAgICAnaW5wdXRBdHRyaWJ1dGVzJyxcbiAgICAgICAgJ2lucHV0VGFnJyxcbiAgICAgICAgJ2lucHV0VHlwZScsXG4gICAgICAgICdpbnB1dFdpZHRoJyxcbiAgICAgICAgJ2l0ZW1zJyxcbiAgICAgICAgJ2tleVN0cm9rZUNoYW5nZURlbGF5JyxcbiAgICAgICAgJ2tleVN0cm9rZUZpbHRlckRlbGF5JyxcbiAgICAgICAgJ2xhYmVsQ2xzJyxcbiAgICAgICAgJ2xhYmVsUG9zaXRpb24nLFxuICAgICAgICAnbGFiZWxzJyxcbiAgICAgICAgJ2xhYmVsV2lkdGgnLFxuICAgICAgICAnbGlzdENscycsXG4gICAgICAgICdsaXN0ZW5lcnMnLFxuICAgICAgICAnbGlzdEl0ZW1UcGwnLFxuICAgICAgICAnbG9jYWxlQ2xhc3MnLFxuICAgICAgICAnbG9jYWxpemFibGUnLFxuICAgICAgICAnbG9jYWxpemFibGVQcm9wZXJ0aWVzJyxcbiAgICAgICAgJ21hc2tEZWZhdWx0cycsXG4gICAgICAgICdtYXNrZWQnLFxuICAgICAgICAnbWF4TGVuZ3RoJyxcbiAgICAgICAgJ21pbkNoYXJzJyxcbiAgICAgICAgJ21pbkxlbmd0aCcsXG4gICAgICAgICdtb25pdG9yUmVzaXplJyxcbiAgICAgICAgJ211bHRpVmFsdWVTZXBhcmF0b3InLFxuICAgICAgICAnbmFtZScsXG4gICAgICAgICdvdmVybGF5QW5jaG9yJyxcbiAgICAgICAgJ3BpY2tlckFsaWduRWxlbWVudCcsXG4gICAgICAgICdwaWNrZXJXaWR0aCcsXG4gICAgICAgICdwb3NpdGlvbmVkJyxcbiAgICAgICAgJ3ByZXZlbnRUb29sdGlwT25Ub3VjaCcsXG4gICAgICAgICdwcmltYXJ5RmlsdGVyJyxcbiAgICAgICAgJ3JlbGF5U3RvcmVFdmVudHMnLFxuICAgICAgICAncmV2ZXJ0T25Fc2NhcGUnLFxuICAgICAgICAncmlwcGxlJyxcbiAgICAgICAgJ3Jvb3RFbGVtZW50JyxcbiAgICAgICAgJ3Njcm9sbEFjdGlvbicsXG4gICAgICAgICdzaG93QW5pbWF0aW9uJyxcbiAgICAgICAgJ3Nob3dUb29sdGlwV2hlbkRpc2FibGVkJyxcbiAgICAgICAgJ3NraXBWYWxpZGF0aW9uJyxcbiAgICAgICAgJ3NwZWxsQ2hlY2snLFxuICAgICAgICAndGFiJyxcbiAgICAgICAgJ3RhYkluZGV4JyxcbiAgICAgICAgJ3RleHRBbGlnbicsXG4gICAgICAgICd0aXRsZScsXG4gICAgICAgICd0cmlnZ2VyQWN0aW9uJyxcbiAgICAgICAgJ3R5cGUnLFxuICAgICAgICAndWknLFxuICAgICAgICAndmFsaWRhdGVGaWx0ZXInLFxuICAgICAgICAndmFsaWRhdGVPbklucHV0JyxcbiAgICAgICAgJ3ZhbHVlRmllbGQnLFxuICAgICAgICAnd2VpZ2h0J1xuICAgIF07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtUHJvcHM6IHN0cmluZ1tdID0gQnJ5bnR1bUNoZWNrbGlzdEZpbHRlckNvbWJvQ29tcG9uZW50LmJyeW50dW1GZWF0dXJlTmFtZXMuY29uY2F0KFtcbiAgICAgICAgJ2FsaWduU2VsZicsXG4gICAgICAgICdhbmNob3JTaXplJyxcbiAgICAgICAgJ2FwcGVuZFRvJyxcbiAgICAgICAgJ2JhZGdlJyxcbiAgICAgICAgJ2NhbGxPbkZ1bmN0aW9ucycsXG4gICAgICAgICdjYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMnLFxuICAgICAgICAnY2xzJyxcbiAgICAgICAgJ2NvbHVtbicsXG4gICAgICAgICdjb250ZW50JyxcbiAgICAgICAgJ2RhdGFzZXQnLFxuICAgICAgICAnZGlzYWJsZWQnLFxuICAgICAgICAnZWRpdGFibGUnLFxuICAgICAgICAnZXh0cmFEYXRhJyxcbiAgICAgICAgJ2ZpbHRlck9wZXJhdG9yJyxcbiAgICAgICAgJ2ZsZXgnLFxuICAgICAgICAnZm9jdXNWaXNpYmxlJyxcbiAgICAgICAgJ2Zvcm11bGEnLFxuICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgJ2hpZGRlbicsXG4gICAgICAgICdodG1sJyxcbiAgICAgICAgJ2lkJyxcbiAgICAgICAgJ2lucHV0JyxcbiAgICAgICAgJ2luc2VydEJlZm9yZScsXG4gICAgICAgICdpbnNlcnRGaXJzdCcsXG4gICAgICAgICdrZXlNYXAnLFxuICAgICAgICAnbGFiZWwnLFxuICAgICAgICAnbGlzdEl0ZW1QaWxsVHBsJyxcbiAgICAgICAgJ21hcmdpbicsXG4gICAgICAgICdtYXhIZWlnaHQnLFxuICAgICAgICAnbWF4aW1pemVPbk1vYmlsZScsXG4gICAgICAgICdtYXhXaWR0aCcsXG4gICAgICAgICdtaW5IZWlnaHQnLFxuICAgICAgICAnbWluV2lkdGgnLFxuICAgICAgICAnbXVsdGlTZWxlY3QnLFxuICAgICAgICAncGFyZW50JyxcbiAgICAgICAgJ3BpY2tlcicsXG4gICAgICAgICdwbGFjZWhvbGRlcicsXG4gICAgICAgICdyZWFkT25seScsXG4gICAgICAgICdyZW5kaXRpb24nLFxuICAgICAgICAncmVxdWlyZWQnLFxuICAgICAgICAncnRsJyxcbiAgICAgICAgJ3Njcm9sbGFibGUnLFxuICAgICAgICAnc2VhcmNoVGV4dCcsXG4gICAgICAgICdzaG93QXBwbHlCdXR0b24nLFxuICAgICAgICAnc2hvd1JlcXVpcmVkSW5kaWNhdG9yJyxcbiAgICAgICAgJ3NwYW4nLFxuICAgICAgICAnc3RvcmUnLFxuICAgICAgICAndG9vbHRpcCcsXG4gICAgICAgICd0cmlnZ2VycycsXG4gICAgICAgICd2YWx1ZScsXG4gICAgICAgICd3aWR0aCcsXG4gICAgICAgICd4JyxcbiAgICAgICAgJ3knXG4gICAgXSk7XG5cbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XG4gICAgcHVibGljIGluc3RhbmNlITogQ2hlY2tsaXN0RmlsdGVyQ29tYm87XG5cbiAgICBwcml2YXRlIGJyeW50dW1Db25maWcgPSB7XG4gICAgICAgIGFkb3B0ICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGFwcGVuZFRvICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGhyZWYgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGFuZ3VsYXJDb21wb25lbnQgOiB0aGlzLFxuICAgICAgICBmZWF0dXJlcyAgICAgICAgIDoge30sXG4gICAgICAgIGxpc3RlbmVycyAgICAgICAgOiB7fVxuICAgIH07XG5cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50OiBFbGVtZW50UmVmKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudFJlZiA9IGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gQ29uZmlncyBvbmx5XG4gICAgQElucHV0KCkgYWRvcHQgICAgICAgICAgICAgICAgICAgICAgICAhIDogSFRNTEVsZW1lbnR8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGFsaWduICAgICAgICAgICAgICAgICAgICAgICAgISA6IEFsaWduU3BlY3xzdHJpbmc7XG4gICAgQElucHV0KCkgYW5jaG9yICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBhcmlhRGVzY3JpcHRpb24gICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgYXJpYUxhYmVsICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGF1dG9Db21wbGV0ZSAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBhdXRvRXhwYW5kICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGF1dG9TZWxlY3QgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYnViYmxlRXZlbnRzICAgICAgICAgICAgICAgICAhIDogb2JqZWN0O1xuICAgIEBJbnB1dCgpIGNhY2hlTGFzdFJlc3VsdCAgICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmd8RHVyYXRpb258RHVyYXRpb25Db25maWc7XG4gICAgQElucHV0KCkgY2FzZVNlbnNpdGl2ZSAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjZW50ZXJlZCAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNoaXBWaWV3ICAgICAgICAgICAgICAgICAgICAgISA6IENoaXBWaWV3Q29uZmlnO1xuICAgIEBJbnB1dCgpIGNsZWFyYWJsZSAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58RmllbGRUcmlnZ2VyQ29uZmlnO1xuICAgIEBJbnB1dCgpIGNsZWFyVGV4dE9uUGlja2VySGlkZSAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY2xlYXJUZXh0T25TZWxlY3Rpb24gICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjbGVhcldoZW5JbnB1dEVtcHR5ICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNvbG9yICAgICAgICAgICAgICAgICAgICAgICAgISA6IENvbG9yO1xuICAgIEBJbnB1dCgpIGNvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgISA6IG9iamVjdDtcbiAgICBASW5wdXQoKSBjb25zdHJhaW5UbyAgICAgICAgICAgICAgICAgICEgOiBIVE1MRWxlbWVudHxXaWRnZXR8UmVjdGFuZ2xlO1xuICAgIEBJbnB1dCgpIGNvbnRhaW5lciAgICAgICAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIEdyaWRDb250YWluZXJJdGVtQ29uZmlnPnxHcmlkQ29udGFpbmVySXRlbUNvbmZpZ1tdfEZpZWxkQ29udGFpbmVyQ29uZmlnfEZpZWxkQ29udGFpbmVyO1xuICAgIEBJbnB1dCgpIGNvbnRhaW5WYWx1ZXMgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58c3RyaW5nfCgoZmllbGQ6IEZpZWxkKSA9PiBib29sZWFuKTtcbiAgICBASW5wdXQoKSBjb250ZW50RWxlbWVudENscyAgICAgICAgICAgICEgOiBzdHJpbmd8b2JqZWN0O1xuICAgIEBJbnB1dCgpIGNyZWF0ZU9uVW5tYXRjaGVkICAgICAgICAgICAgISA6ICgobmFtZTogc3RyaW5nLCBjb21ibzogQ29tYm8pID0+IE1vZGVsKXxzdHJpbmd8Ym9vbGVhbjtcbiAgICBASW5wdXQoKSBkYXRhRmllbGQgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgZGVmYXVsdEJpbmRQcm9wZXJ0eSAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRldGVjdENTU0NvbXBhdGliaWxpdHlJc3N1ZXMgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZGlzcGxheUZpZWxkICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRpc3BsYXlWYWx1ZVJlbmRlcmVyICAgICAgICAgISA6IChyZWNvcmQ6IE1vZGVsfENvbWJvTW9kZWwsIGNvbWJvOiBDb21ibykgPT4gc3RyaW5nfHZvaWQ7XG4gICAgQElucHV0KCkgZG9jayAgICAgICAgICAgICAgICAgICAgICAgICAhIDogJ3RvcCd8J2JvdHRvbSd8J2xlZnQnfCdyaWdodCd8J3N0YXJ0J3wnZW5kJ3wnaGVhZGVyJ3wncHJlLWhlYWRlcid8b2JqZWN0O1xuICAgIEBJbnB1dCgpIGRyYWdnYWJsZSAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58e1xuICAgICAgICBoYW5kbGVTZWxlY3Rvcj86IHN0cmluZ1xuICAgIH07XG4gICAgQElucHV0KCkgZWxlbWVudEF0dHJpYnV0ZXMgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgc3RyaW5nfG51bGw+O1xuICAgIEBJbnB1dCgpIGVtcHR5VGV4dCAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBlbmNvZGVGaWx0ZXJQYXJhbXMgICAgICAgICAgICEgOiAoZmlsdGVyczogb2JqZWN0W10pID0+IG9iamVjdFtdO1xuICAgIEBJbnB1dCgpIGZpbHRlck9uRW50ZXIgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZmlsdGVyUGFyYW1OYW1lICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGZpbHRlclNlbGVjdGVkICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZmxvYXRpbmcgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBoaWRlQW5pbWF0aW9uICAgICAgICAgICAgICAgICEgOiBib29sZWFufG9iamVjdDtcbiAgICBASW5wdXQoKSBoaWRlUGlja2VyT25TZWxlY3QgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGhpZGVUcmlnZ2VyICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaGlnaGxpZ2h0RXh0ZXJuYWxDaGFuZ2UgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBoaW50ICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8KChkYXRhOiB7IHNvdXJjZTogRmllbGQsIHZhbHVlOiBhbnkgfSkgPT4gc3RyaW5nKTtcbiAgICBASW5wdXQoKSBoaW50SHRtbCAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8KChkYXRhOiB7IHNvdXJjZTogRmllbGQsIHZhbHVlOiBhbnkgfSkgPT4gc3RyaW5nKTtcbiAgICBASW5wdXQoKSBpZ25vcmVQYXJlbnRSZWFkT25seSAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlubGluZSAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaW5saW5lUGlja2VyICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpbnB1dEFsaWduICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgaW5wdXRBdHRyaWJ1dGVzICAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBASW5wdXQoKSBpbnB1dFRhZyAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgaW5wdXRUeXBlICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGlucHV0V2lkdGggICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgaXRlbXMgICAgICAgICAgICAgICAgICAgICAgICAhIDogb2JqZWN0W118c3RyaW5nW118b2JqZWN0O1xuICAgIEBJbnB1dCgpIGtleVN0cm9rZUNoYW5nZURlbGF5ICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBrZXlTdHJva2VGaWx0ZXJEZWxheSAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgbGFiZWxDbHMgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG9iamVjdDtcbiAgICBASW5wdXQoKSBsYWJlbFBvc2l0aW9uICAgICAgICAgICAgICAgICEgOiAnYmVmb3JlJ3wnYWJvdmUnfG51bGw7XG4gICAgQElucHV0KCkgbGFiZWxzICAgICAgICAgICAgICAgICAgICAgICAhIDogb2JqZWN0W107XG4gICAgQElucHV0KCkgbGFiZWxXaWR0aCAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBsaXN0Q2xzICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgbGlzdGVuZXJzICAgICAgICAgICAgICAgICAgICAhIDogQ2hlY2tsaXN0RmlsdGVyQ29tYm9MaXN0ZW5lcnM7XG4gICAgQElucHV0KCkgbGlzdEl0ZW1UcGwgICAgICAgICAgICAgICAgICAhIDogKHJlY29yZDogTW9kZWx8Q29tYm9Nb2RlbCkgPT4gc3RyaW5nfHZvaWQ7XG4gICAgQElucHV0KCkgbG9jYWxlQ2xhc3MgICAgICAgICAgICAgICAgICAhIDogdHlwZW9mIEJhc2U7XG4gICAgQElucHV0KCkgbG9jYWxpemFibGUgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBsb2NhbGl6YWJsZVByb3BlcnRpZXMgICAgICAgICEgOiBzdHJpbmdbXTtcbiAgICBASW5wdXQoKSBtYXNrRGVmYXVsdHMgICAgICAgICAgICAgICAgICEgOiBNYXNrQ29uZmlnO1xuICAgIEBJbnB1dCgpIG1hc2tlZCAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58c3RyaW5nfE1hc2tDb25maWc7XG4gICAgQElucHV0KCkgbWF4TGVuZ3RoICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIG1pbkNoYXJzICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBtaW5MZW5ndGggICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgbW9uaXRvclJlc2l6ZSAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnx7XG4gICAgICAgIGltbWVkaWF0ZT86IGJvb2xlYW5cbiAgICB9O1xuICAgIEBJbnB1dCgpIG11bHRpVmFsdWVTZXBhcmF0b3IgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgb3ZlcmxheUFuY2hvciAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwaWNrZXJBbGlnbkVsZW1lbnQgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcGlja2VyV2lkdGggICAgICAgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZztcbiAgICBASW5wdXQoKSBwb3NpdGlvbmVkICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHByZXZlbnRUb29sdGlwT25Ub3VjaCAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHJpbWFyeUZpbHRlciAgICAgICAgICAgICAgICAhIDogQ29sbGVjdGlvbkZpbHRlckNvbmZpZztcbiAgICBASW5wdXQoKSByZWxheVN0b3JlRXZlbnRzICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJldmVydE9uRXNjYXBlICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcmlwcGxlICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnx7XG4gICAgICAgIGRlbGVnYXRlPzogc3RyaW5nXG4gICAgICAgIGNvbG9yPzogc3RyaW5nXG4gICAgICAgIHJhZGl1cz86IG51bWJlclxuICAgICAgICBjbGlwPzogc3RyaW5nXG4gICAgfTtcbiAgICBASW5wdXQoKSByb290RWxlbWVudCAgICAgICAgICAgICAgICAgICEgOiBTaGFkb3dSb290fEhUTUxFbGVtZW50O1xuICAgIEBJbnB1dCgpIHNjcm9sbEFjdGlvbiAgICAgICAgICAgICAgICAgISA6ICdoaWRlJ3wncmVhbGlnbid8bnVsbDtcbiAgICBASW5wdXQoKSBzaG93QW5pbWF0aW9uICAgICAgICAgICAgICAgICEgOiBib29sZWFufG9iamVjdDtcbiAgICBASW5wdXQoKSBzaG93VG9vbHRpcFdoZW5EaXNhYmxlZCAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHNraXBWYWxpZGF0aW9uICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc3BlbGxDaGVjayAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSB0YWIgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufFRhYkNvbmZpZztcbiAgICBASW5wdXQoKSB0YWJJbmRleCAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgdGV4dEFsaWduICAgICAgICAgICAgICAgICAgICAhIDogJ2xlZnQnfCdjZW50ZXInfCdyaWdodCd8J3N0YXJ0J3wnZW5kJztcbiAgICBASW5wdXQoKSB0aXRsZSAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgdHJpZ2dlckFjdGlvbiAgICAgICAgICAgICAgICAhIDogJ2FsbCd8J2xhc3QnfG51bGw7XG4gICAgQElucHV0KCkgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAhIDogJ2NoZWNrbGlzdGZpbHRlcmNvbWJvJztcbiAgICBASW5wdXQoKSB1aSAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8b2JqZWN0O1xuICAgIEBJbnB1dCgpIHZhbGlkYXRlRmlsdGVyICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgdmFsaWRhdGVPbklucHV0ICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSB2YWx1ZUZpZWxkICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8bnVsbDtcbiAgICBASW5wdXQoKSB3ZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG5cbiAgICAvLyBDb25maWdzIGFuZCBwcm9wZXJ0aWVzXG4gICAgQElucHV0KCkgYWxpZ25TZWxmICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgYXBwZW5kVG8gICAgICAgICAgICAgICAgICAgICEgOiBIVE1MRWxlbWVudHxzdHJpbmc7XG4gICAgQElucHV0KCkgYmFkZ2UgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgY2FsbE9uRnVuY3Rpb25zICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucyAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjbHMgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xvYmplY3Q7XG4gICAgQElucHV0KCkgY29sdW1uICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgZGF0YXNldCAgICAgICAgICAgICAgICAgICAgICEgOiBvYmplY3R8UmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBASW5wdXQoKSBkaXNhYmxlZCAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58J2luZXJ0JztcbiAgICBASW5wdXQoKSBlZGl0YWJsZSAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZXh0cmFEYXRhICAgICAgICAgICAgICAgICAgICEgOiBhbnk7XG4gICAgQElucHV0KCkgZmlsdGVyT3BlcmF0b3IgICAgICAgICAgICAgICEgOiBDb2xsZWN0aW9uQ29tcGFyZU9wZXJhdG9yO1xuICAgIEBJbnB1dCgpIGZsZXggICAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZztcbiAgICBASW5wdXQoKSBoZWlnaHQgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmc7XG4gICAgQElucHV0KCkgaGlkZGVuICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlkICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGluc2VydEJlZm9yZSAgICAgICAgICAgICAgICAhIDogSFRNTEVsZW1lbnR8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGluc2VydEZpcnN0ICAgICAgICAgICAgICAgICAhIDogSFRNTEVsZW1lbnR8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGtleU1hcCAgICAgICAgICAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgS2V5TWFwQ29uZmlnPjtcbiAgICBASW5wdXQoKSBsYWJlbCAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBsaXN0SXRlbVBpbGxUcGwgICAgICAgICAgICAgISA6IChyZWNvcmQ6IE1vZGVsKSA9PiBzdHJpbmc7XG4gICAgQElucHV0KCkgbWFyZ2luICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIG1heEhlaWdodCAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBtYXhpbWl6ZU9uTW9iaWxlICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmc7XG4gICAgQElucHV0KCkgbWF4V2lkdGggICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8bnVtYmVyO1xuICAgIEBJbnB1dCgpIG1pbkhlaWdodCAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBtaW5XaWR0aCAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgcGlja2VyICAgICAgICAgICAgICAgICAgICAgICEgOiBMaXN0Q29uZmlnfExpc3Q7XG4gICAgQElucHV0KCkgcGxhY2Vob2xkZXIgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcmVhZE9ubHkgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJlbmRpdGlvbiAgICAgICAgICAgICAgICAgICAhIDogJ291dGxpbmVkJ3wnZmlsbGVkJ3xzdHJpbmc7XG4gICAgQElucHV0KCkgcmVxdWlyZWQgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJ0bCAgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzZWFyY2hUZXh0ICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBzaG93QXBwbHlCdXR0b24gICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc2hvd1JlcXVpcmVkSW5kaWNhdG9yICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgc3BhbiAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgc3RvcmUgICAgICAgICAgICAgICAgICAgICAgICEgOiBTdG9yZXxTdG9yZUNvbmZpZztcbiAgICBASW5wdXQoKSB0b29sdGlwICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xUb29sdGlwQ29uZmlnfG51bGw7XG4gICAgQElucHV0KCkgdHJpZ2dlcnMgICAgICAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBGaWVsZFRyaWdnZXJDb25maWc+fFJlY29yZDxzdHJpbmcsIFdpZGdldD47XG4gICAgQElucHV0KCkgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICEgOiBvYmplY3R8bnVtYmVyfHN0cmluZ3xzdHJpbmdbXXxudW1iZXJbXTtcbiAgICBASW5wdXQoKSB3aWR0aCAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmc7XG4gICAgQElucHV0KCkgeCAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgeSAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG5cbiAgICAvLyBQcm9wZXJ0aWVzIG9ubHlcbiAgICBASW5wdXQoKSBhbmNob3JTaXplICAgISA6IG51bWJlcltdO1xuICAgIEBJbnB1dCgpIGNvbnRlbnQgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGZvY3VzVmlzaWJsZSAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBmb3JtdWxhICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBodG1sICAgICAgICAgISA6IHN0cmluZ3woKHdpZGdldDogV2lkZ2V0KSA9PiBzdHJpbmcpfERvbUNvbmZpZ3xEb21Db25maWdbXXxWdWVDb25maWc7XG4gICAgQElucHV0KCkgaW5wdXQgICAgICAgICEgOiBIVE1MRWxlbWVudDtcbiAgICBASW5wdXQoKSBtdWx0aVNlbGVjdCAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcGFyZW50ICAgICAgICEgOiBXaWRnZXQ7XG4gICAgQElucHV0KCkgc2Nyb2xsYWJsZSAgICEgOiBTY3JvbGxlcjtcblxuICAgIC8vIEV2ZW50cyBlbWl0dGVyc1xuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IGFjdGlvbiB3YXMgcGVyZm9ybWVkIChhbiBpdGVtIGluIHRoZSBsaXN0IHdhcyBzZWxlY3RlZClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5Db21ib30gZXZlbnQuc291cmNlIFRoZSBjb21ib1xuICAgICAqIEBwYXJhbSB7YW55fSBldmVudC52YWx1ZSBUaGUgW3ZhbHVlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29tYm8jY29uZmlnLXZhbHVlRmllbGQpIG9mIHRoZSBzZWxlY3RlZCByZWNvcmRcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFNlbGVjdGVkIHJlY29yZFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LnJlY29yZHMgU2VsZWN0ZWQgcmVjb3JkcyBhcyBhbiBhcnJheSBpZiBbbXVsdGlTZWxlY3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db21ibyNjb25maWctbXVsdGlTZWxlY3QpIGlzIGB0cnVlYFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQudXNlckFjdGlvbiBgdHJ1ZWAgaWYgdGhlIHZhbHVlIGNoYW5nZSBpcyBkdWUgdG8gdXNlciBpbnRlcmFjdGlvblxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkFjdGlvbjogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ29tYm8sIHZhbHVlOiBhbnksIHJlY29yZDogTW9kZWwsIHJlY29yZHM6IE1vZGVsW10sIHVzZXJBY3Rpb246IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGJlZm9yZSBhbiBvYmplY3QgaXMgZGVzdHJveWVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUuQmFzZX0gZXZlbnQuc291cmNlIFRoZSBPYmplY3QgdGhhdCBpcyBiZWluZyBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlRGVzdHJveTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQmFzZSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGJlZm9yZSBhIHdpZGdldCBpcyBoaWRkZW4uIFJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIGFjdGlvbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0IGJlaW5nIGhpZGRlbi5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVIaWRlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYmVmb3JlIGEgd2lkZ2V0IGlzIHNob3duLiBSZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IHRoZSBhY3Rpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0LGFueX0gZXZlbnQuc291cmNlIFRoZSB3aWRnZXQgYmVpbmcgc2hvd25cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVTaG93OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXR8YW55IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhbnkgb3RoZXIgZXZlbnQgaXMgZmlyZWQgZnJvbSB0aGUgb2JqZWN0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jZXZlbnQtY2F0Y2hBbGwpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7e1trZXk6IHN0cmluZ106IGFueSwgdHlwZTogc3RyaW5nfX0gZXZlbnQuZXZlbnQgVGhlIE9iamVjdCB0aGF0IGNvbnRhaW5zIGV2ZW50IGRldGFpbHNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuZXZlbnQudHlwZSBUaGUgdHlwZSBvZiB0aGUgZXZlbnQgd2hpY2ggaXMgY2F1Z2h0IGJ5IHRoZSBsaXN0ZW5lclxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNhdGNoQWxsOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHtba2V5OiBzdHJpbmddOiBhbnksIHR5cGU6IHN0cmluZ30pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoaXMgZmllbGQncyB2YWx1ZSBjaGFuZ2VzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LkZpZWxkLGFueX0gZXZlbnQuc291cmNlIFRoaXMgRmllbGRcbiAgICAgKiBAcGFyYW0ge3N0cmluZyxudW1iZXIsYm9vbGVhbixhbnl9IGV2ZW50LnZhbHVlIFRoaXMgZmllbGQncyB2YWx1ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nLG51bWJlcixib29sZWFuLGFueX0gZXZlbnQub2xkVmFsdWUgVGhpcyBmaWVsZCdzIHByZXZpb3VzIHZhbHVlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC52YWxpZCBUcnVlIGlmIHRoaXMgZmllbGQgaXMgaW4gYSB2YWxpZCBzdGF0ZVxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmV2ZW50IFRoZSB0cmlnZ2VyaW5nIERPTSBldmVudCBpZiBhbnlcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LnVzZXJBY3Rpb24gVHJpZ2dlcmVkIGJ5IHVzZXIgdGFraW5nIGFuIGFjdGlvbiAoYHRydWVgKSBvciBieSBzZXR0aW5nIGEgdmFsdWUgKGBmYWxzZWApXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jaGVja2VkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBGaWVsZHxhbnksIHZhbHVlOiBzdHJpbmd8bnVtYmVyfGJvb2xlYW58YW55LCBvbGRWYWx1ZTogc3RyaW5nfG51bWJlcnxib29sZWFufGFueSwgdmFsaWQ6IGJvb2xlYW4sIGV2ZW50OiBFdmVudCwgdXNlckFjdGlvbjogYm9vbGVhbiwgY2hlY2tlZDogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGlzIGZpZWxkIGlzIFtjbGVhcmVkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvRmllbGQjZnVuY3Rpb24tY2xlYXIpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jZXZlbnQtY2xlYXIpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuRmllbGQsYW55fSBldmVudC5zb3VyY2UgVGhpcyBGaWVsZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNsZWFyOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBGaWVsZHxhbnkgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYW4gb2JqZWN0IGlzIGRlc3Ryb3llZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLkJhc2V9IGV2ZW50LnNvdXJjZSBUaGUgT2JqZWN0IHRoYXQgaXMgYmVpbmcgZGVzdHJveWVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRlc3Ryb3k6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEJhc2UgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgd2lkZ2V0J3MgW2VsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktZWxlbWVudCkgaXMgYXZhaWxhYmxlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5lbGVtZW50IFRoZSBXaWRnZXQncyBlbGVtZW50LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkVsZW1lbnRDcmVhdGVkOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZWxlbWVudDogSFRNTEVsZW1lbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gZm9jdXMgZW50ZXJzIHRoaXMgV2lkZ2V0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoaXMgV2lkZ2V0XG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZnJvbUVsZW1lbnQgVGhlIGVsZW1lbnQgd2hpY2ggbG9zdCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC50b0VsZW1lbnQgVGhlIGVsZW1lbnQgd2hpY2ggZ2FpbmVkIGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5mcm9tV2lkZ2V0IFRoZSB3aWRnZXQgd2hpY2ggbG9zdCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQudG9XaWRnZXQgVGhlIHdpZGdldCB3aGljaCBnYWluZWQgZm9jdXMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5iYWNrd2FyZHMgYHRydWVgIGlmIHRoZSBgdG9FbGVtZW50YCBpcyBiZWZvcmUgdGhlIGBmcm9tRWxlbWVudGAgaW4gZG9jdW1lbnQgb3JkZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRm9jdXNJbjogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBmcm9tRWxlbWVudDogSFRNTEVsZW1lbnQsIHRvRWxlbWVudDogSFRNTEVsZW1lbnQsIGZyb21XaWRnZXQ6IFdpZGdldCwgdG9XaWRnZXQ6IFdpZGdldCwgYmFja3dhcmRzOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGZvY3VzIGV4aXRzIHRoaXMgV2lkZ2V0J3Mgb3duZXJzaGlwIHRyZWUuIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gYSBgYmx1cmAgZXZlbnQuXG4gICAgICogZm9jdXMgbW92aW5nIGZyb20gd2l0aGluIHRoaXMgV2lkZ2V0J3Mgb3duZXJzaGlwIHRyZWUsIGV2ZW4gaWYgdGhlcmUgYXJlIGZsb2F0aW5nIHdpZGdldHNcbiAgICAgKiB3aWxsIG5vdCB0cmlnZ2VyIHRoaXMgZXZlbnQuIFRoaXMgaXMgd2hlbiBmb2N1cyBleGl0cyB0aGlzIHdpZGdldCBjb21wbGV0ZWx5LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoaXMgV2lkZ2V0XG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZnJvbUVsZW1lbnQgVGhlIGVsZW1lbnQgd2hpY2ggbG9zdCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC50b0VsZW1lbnQgVGhlIGVsZW1lbnQgd2hpY2ggZ2FpbmVkIGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5mcm9tV2lkZ2V0IFRoZSB3aWRnZXQgd2hpY2ggbG9zdCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQudG9XaWRnZXQgVGhlIHdpZGdldCB3aGljaCBnYWluZWQgZm9jdXMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5iYWNrd2FyZHMgYHRydWVgIGlmIHRoZSBgdG9FbGVtZW50YCBpcyBiZWZvcmUgdGhlIGBmcm9tRWxlbWVudGAgaW4gZG9jdW1lbnQgb3JkZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRm9jdXNPdXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgZnJvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0b0VsZW1lbnQ6IEhUTUxFbGVtZW50LCBmcm9tV2lkZ2V0OiBXaWRnZXQsIHRvV2lkZ2V0OiBXaWRnZXQsIGJhY2t3YXJkczogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGFmdGVyIGEgd2lkZ2V0IHdhcyBoaWRkZW5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uSGlkZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBVc2VyIHR5cGVkIGludG8gdGhlIGZpZWxkLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSB2YWx1ZSBhdHRhY2hlZCB0byB0aGlzIGV2ZW50IGlzIHRoZSByYXcgaW5wdXQgZmllbGQgdmFsdWUgYW5kXG4gICAgICogbm90IHRoZSBjb21ib3MgdmFsdWVcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5Db21ib30gZXZlbnQuc291cmNlIFRoZSBjb21iby5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQudmFsdWUgUmF3IGlucHV0IHZhbHVlXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZXZlbnQgVGhlIHRyaWdnZXJpbmcgRE9NIGV2ZW50IGlmIGFueS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25JbnB1dDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ29tYm8sIHZhbHVlOiBzdHJpbmcsIGV2ZW50OiBFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSB3aWRnZXQgd2hpY2ggaGFkIGJlZW4gaW4gYSBub24tdmlzaWJsZSBzdGF0ZSBmb3IgYW55IHJlYXNvblxuICAgICAqIGFjaGlldmVzIHZpc2liaWxpdHkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNldmVudC1wYWludClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0IGJlaW5nIHBhaW50ZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5maXJzdFBhaW50IGB0cnVlYCBpZiB0aGlzIGlzIHRoZSBmaXJzdCBwYWludC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25QYWludDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBmaXJzdFBhaW50OiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgV2lkZ2V0J3MgcmVhZCBvbmx5IHN0YXRlIGlzIHRvZ2dsZWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5yZWFkT25seSBSZWFkIG9ubHkgb3Igbm90XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVhZE9ubHk6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyByZWFkT25seTogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBpcyBmaXJlZCBhZnRlciBhIHdpZGdldCdzIGVsZW1lbnRzIGhhdmUgYmVlbiBzeW5jaHJvbml6ZWQgZHVlIHRvIGEgZGlyZWN0IG9yIGluZGlyZWN0IGNhbGxcbiAgICAgKiB0byBbcmVjb21wb3NlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2Z1bmN0aW9uLXJlY29tcG9zZSksIGlmIHRoaXMgcmVzdWx0cyBpbiBzb21lIGNoYW5nZSB0byB0aGUgd2lkZ2V0J3MgcmVuZGVyZWQgRE9NIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlY29tcG9zZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKCkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIGVuY2Fwc3VsYXRpbmcgZWxlbWVudCBvZiBhIFdpZGdldCByZXNpemVzICpvbmx5IHdoZW4gW21vbml0b3JSZXNpemVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLW1vbml0b3JSZXNpemUpIGlzIGB0cnVlYCouXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhpcyBXaWRnZXRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQud2lkdGggVGhlIG5ldyB3aWR0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC5oZWlnaHQgVGhlIG5ldyBoZWlnaHRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQub2xkV2lkdGggVGhlIG9sZCB3aWR0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC5vbGRIZWlnaHQgVGhlIG9sZCBoZWlnaHRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZXNpemU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIG9sZFdpZHRoOiBudW1iZXIsIG9sZEhlaWdodDogbnVtYmVyIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBBbiBpdGVtIGluIHRoZSBsaXN0IHdhcyBzZWxlY3RlZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LkNvbWJvfSBldmVudC5zb3VyY2UgVGhlIGNvbWJvXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBTZWxlY3RlZCByZWNvcmRcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5yZWNvcmRzIFNlbGVjdGVkIHJlY29yZHMgYXMgYW4gYXJyYXkgaWYgW211bHRpU2VsZWN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29tYm8jY29uZmlnLW11bHRpU2VsZWN0KSBpcyBgdHJ1ZWBcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LnVzZXJBY3Rpb24gYHRydWVgIGlmIHRoZSB2YWx1ZSBjaGFuZ2UgaXMgZHVlIHRvIHVzZXIgaW50ZXJhY3Rpb25cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TZWxlY3Q6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENvbWJvLCByZWNvcmQ6IE1vZGVsLCByZWNvcmRzOiBNb2RlbFtdLCB1c2VyQWN0aW9uOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYWZ0ZXIgYSB3aWRnZXQgaXMgc2hvd24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVXNlciBjbGlja2VkIG9uZSBvZiB0aGlzIGZpZWxkJ3MgW3RyaWdnZXJzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvRmllbGQjcHJvcGVydHktdHJpZ2dlcnMpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuRmllbGQsYW55fSBldmVudC5zb3VyY2UgVGhpcyBmaWVsZFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC50cmlnZ2VyIFRoZSB0cmlnZ2VyIGFjdGl2YXRlZCBieSBjbGljayBvciB0b3VjaCB0YXAuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVHJpZ2dlcjogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogRmllbGR8YW55LCB0cmlnZ2VyOiBXaWRnZXQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuZCBhcHBlbmQgdGhlIHVuZGVybHlpbmcgd2lkZ2V0XG4gICAgICovXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0XG4gICAgICAgICAgICBtZSA9IHRoaXMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZWxlbWVudFJlZixcbiAgICAgICAgICAgICAgICBicnludHVtQ29uZmlnXG4gICAgICAgICAgICB9ID0gbWUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VDbGFzcyxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZU5hbWUsXG4gICAgICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZ3MsXG4gICAgICAgICAgICAgICAgYnJ5bnR1bUV2ZW50c1xuICAgICAgICAgICAgfSA9IEJyeW50dW1DaGVja2xpc3RGaWx0ZXJDb21ib0NvbXBvbmVudDtcblxuICAgICAgICBicnludHVtQ29uZmlncy5maWx0ZXIocHJvcCA9PiBwcm9wIGluIHRoaXMpLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBXcmFwcGVySGVscGVyLmFwcGx5UHJvcFZhbHVlKGJyeW50dW1Db25maWcsIHByb3AsIHRoaXNbcHJvcF0pO1xuICAgICAgICAgICAgaWYgKFsnZmVhdHVyZXMnLCAnY29uZmlnJ10uaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBXcmFwcGVySGVscGVyLmRldldhcm5pbmdDb25maWdQcm9wKGluc3RhbmNlTmFtZSwgcHJvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGJyeW50dW1FdmVudHMuZmlsdGVyKGV2ZW50ID0+IHRoaXNbZXZlbnRdICYmIHRoaXNbZXZlbnRdLm9ic2VydmVycy5sZW5ndGggPiAwKS5mb3JFYWNoKGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0XG4gICAgICAgICAgICAgICAgdW5jYXBpdGFsaXplID0gKHN0cjogc3RyaW5nKSA9PiBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSksXG4gICAgICAgICAgICAgICAgZXZlbnROYW1lID0gKHN0cjogc3RyaW5nKSA9PiB1bmNhcGl0YWxpemUoc3RyLnNsaWNlKDIpKTtcblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZy5saXN0ZW5lcnNbZXZlbnROYW1lKGV2ZW50KV0gPSBlID0+IHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgbWVbZXZlbnRdLmVtaXQoZSk7XG4gICAgICAgICAgICAgICAgLy8gRXZlbnRFbWl0dGVyIGRvZXMgbm90IHJldHVybiB2YWx1ZXMgaW4gdGhlIG5vcm1hbCB3YXksIHdvcmsgYXJvdW5kIGl0IGJ5IHNldHRpbmcgYHJldHVyblZhbHVlYCBmbGFnXG4gICAgICAgICAgICAgICAgLy8gaW4gQW5ndWxhciBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5yZXR1cm5WYWx1ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElmIGNvbXBvbmVudCBoYXMgbm8gY29udGFpbmVyIHNwZWNpZmllZCBpbiBjb25maWcgdGhlbiB1c2UgYWRvcHQgdG8gV3JhcHBlcidzIGVsZW1lbnRcbiAgICAgICAgY29uc3RcbiAgICAgICAgICAgIGNvbnRhaW5lclBhcmFtID0gW1xuICAgICAgICAgICAgICAgICdhZG9wdCcsXG4gICAgICAgICAgICAgICAgJ2FwcGVuZFRvJyxcbiAgICAgICAgICAgICAgICAnaW5zZXJ0QWZ0ZXInLFxuICAgICAgICAgICAgICAgICdpbnNlcnRCZWZvcmUnXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgXS5maW5kKHByb3AgPT4gYnJ5bnR1bUNvbmZpZ1twcm9wXSk7XG4gICAgICAgIGlmICghY29udGFpbmVyUGFyYW0pIHtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZU5hbWUgPT09ICdCdXR0b24nIHx8IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRSb290Tm9kZSgpIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICAgICAgICAgIC8vIEJ1dHRvbiBzaG91bGQgYWx3YXlzIGJlIDxhPiBvciA8YnV0dG9uPiBpbnNpZGUgb3duZXIgZWxlbWVudFxuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWcuYXBwZW5kVG8gPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBicnludHVtQ29uZmlnLmFkb3B0ID0gZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgV3JhcHBlckhlbHBlci5kZXZXYXJuaW5nQ29udGFpbmVyKGluc3RhbmNlTmFtZSwgY29udGFpbmVyUGFyYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBtZS5pbnN0YW5jZSA9IGluc3RhbmNlTmFtZSA9PT0gJ1dpZGdldCcgPyBXaWRnZXQuY3JlYXRlKGJyeW50dW1Db25maWcpIDogbmV3IGluc3RhbmNlQ2xhc3MoYnJ5bnR1bUNvbmZpZyk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXYXRjaCBmb3IgY2hhbmdlc1xuICAgICAqIEBwYXJhbSBjaGFuZ2VzXG4gICAgICovXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBjb25zdFxuICAgICAgICAgICAgeyBpbnN0YW5jZSB9ID0gdGhpcyxcbiAgICAgICAgICAgIHsgaW5zdGFuY2VOYW1lIH0gPSBCcnludHVtQ2hlY2tsaXN0RmlsdGVyQ29tYm9Db21wb25lbnQ7XG4gICAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIGNoYW5nZXNcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY2hhbmdlcykuZm9yRWFjaCgoW3Byb3AsIGNoYW5nZV0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0XG4gICAgICAgICAgICAgICAgbmV3VmFsdWUgPSAoY2hhbmdlIGFzIFNpbXBsZUNoYW5nZSkuY3VycmVudFZhbHVlLFxuICAgICAgICAgICAgICAgIHsgaW5zdGFuY2UgfSA9IHRoaXMsXG4gICAgICAgICAgICAgICAgeyBicnludHVtQ29uZmlnc09ubHksIGJyeW50dW1Qcm9wcyB9ID0gQnJ5bnR1bUNoZWNrbGlzdEZpbHRlckNvbWJvQ29tcG9uZW50O1xuICAgICAgICAgICAgaWYgKGJyeW50dW1Qcm9wcy5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgIFdyYXBwZXJIZWxwZXIuYXBwbHlQcm9wVmFsdWUoaW5zdGFuY2UsIHByb3AsIG5ld1ZhbHVlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGJyeW50dW1Db25maWdzT25seS5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICBXcmFwcGVySGVscGVyLmRldldhcm5pbmdVcGRhdGVQcm9wKGluc3RhbmNlTmFtZSwgcHJvcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95IHRoZSBjb21wb25lbnRcbiAgICAgKi9cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAodGhpcy5pbnN0YW5jZSAmJiB0aGlzLmluc3RhbmNlLmRlc3Ryb3kpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19
992
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJ5bnR1bS1jaGVja2xpc3QtZmlsdGVyLWNvbWJvLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudC9zcmMvbGliL2JyeW50dW0tY2hlY2tsaXN0LWZpbHRlci1jb21iby5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0RBQXNEO0FBQ3REOztHQUVHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBa0QsTUFBTSxlQUFlLENBQUM7QUFFbkksT0FBTyxhQUFhLE1BQU0sa0JBQWtCLENBQUM7QUFFN0MsT0FBTyxFQUFxVSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvVyxPQUFPLEVBQUUsb0JBQW9CLEVBQTBELE1BQU0sb0JBQW9CLENBQUM7QUFHbEgsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBNHhCNUQsTUFBTSxPQUFPLG9DQUFvQztJQStWN0MsWUFBWSxPQUFtQjtRQVR2QixrQkFBYSxHQUFHO1lBQ3BCLEtBQUssRUFBYyxTQUFTO1lBQzVCLFFBQVEsRUFBVyxTQUFTO1lBQzVCLElBQUksRUFBZSxTQUFTO1lBQzVCLGdCQUFnQixFQUFHLElBQUk7WUFDdkIsUUFBUSxFQUFXLEVBQUU7WUFDckIsU0FBUyxFQUFVLEVBQUU7U0FDeEIsQ0FBQztRQW9LRixrQkFBa0I7UUFDbEI7Ozs7Ozs7O1dBUUc7UUFDTyxhQUFRLEdBQVEsSUFBSSxZQUFZLEVBQWlILENBQUM7UUFDNUo7Ozs7V0FJRztRQUNPLG9CQUFlLEdBQVEsSUFBSSxZQUFZLEVBQThDLENBQUM7UUFDaEc7Ozs7V0FJRztRQUNPLGlCQUFZLEdBQVEsSUFBSSxZQUFZLEVBQXdELENBQUM7UUFDdkc7Ozs7V0FJRztRQUNPLGlCQUFZLEdBQVEsSUFBSSxZQUFZLEVBQTZFLENBQUM7UUFDNUg7Ozs7OztXQU1HO1FBQ08sZUFBVSxH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QUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csQ0FBQztzQkFBVCxLQUFLO2dCQUNHLENBQUM7c0JBQVQsS0FBSztnQkFHRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFZSSxRQUFRO3NCQUFqQixNQUFNO2dCQU1HLGVBQWU7c0JBQXhCLE1BQU07Z0JBTUcsWUFBWTtzQkFBckIsTUFBTTtnQkFNRyxZQUFZO3NCQUFyQixNQUFNO2dCQVFHLFVBQVU7c0JBQW5CLE1BQU07Z0JBWUcsUUFBUTtzQkFBakIsTUFBTTtnQkFPRyxPQUFPO3NCQUFoQixNQUFNO2dCQU1HLFNBQVM7c0JBQWxCLE1BQU07Z0JBTUcsZ0JBQWdCO3NCQUF6QixNQUFNO2dCQVdHLFNBQVM7c0JBQWxCLE1BQU07Z0JBYUcsVUFBVTtzQkFBbkIsTUFBTTtnQkFNRyxNQUFNO3NCQUFmLE1BQU07Z0JBU0csT0FBTztzQkFBaEIsTUFBTTtnQkFTRyxPQUFPO3NCQUFoQixNQUFNO2dCQU1HLFVBQVU7c0JBQW5CLE1BQU07Z0JBS0csV0FBVztzQkFBcEIsTUFBTTtnQkFVRyxRQUFRO3NCQUFqQixNQUFNO2dCQVNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBTUcsTUFBTTtzQkFBZixNQUFNO2dCQU9HLFNBQVM7c0JBQWxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8qKlxuICogQW5ndWxhciB3cmFwcGVyIGZvciBCcnludHVtIENoZWNrbGlzdEZpbHRlckNvbWJvXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgSW5wdXQsIFNpbXBsZUNoYW5nZSwgU2ltcGxlQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IFdyYXBwZXJIZWxwZXIgZnJvbSAnLi93cmFwcGVyLmhlbHBlcic7XG5cbmltcG9ydCB7IEFsaWduU3BlYywgQmFzZSwgQ2hpcFZpZXdDb25maWcsIENvbGxlY3Rpb25Db21wYXJlT3BlcmF0b3IsIENvbGxlY3Rpb25GaWx0ZXJDb25maWcsIENvbG9yLCBDb21ibywgRG9tQ29uZmlnLCBEdXJhdGlvbiwgRHVyYXRpb25Db25maWcsIEZpZWxkLCBGaWVsZENvbnRhaW5lckNvbmZpZywgRmllbGRUcmlnZ2VyQ29uZmlnLCBLZXlNYXBDb25maWcsIExpc3QsIExpc3RDb25maWcsIE1hc2tDb25maWcsIE1vZGVsLCBSZWFjdEpTWCwgUmVjdGFuZ2xlLCBTY3JvbGxlciwgU3RvcmUsIFN0b3JlQ29uZmlnLCBUYWJDb25maWcsIFRvb2x0aXBDb25maWcsIFZ1ZUNvbmZpZywgV2lkZ2V0IH0gZnJvbSAnQGJyeW50dW0vY29yZS10aGluJztcbmltcG9ydCB7IENoZWNrbGlzdEZpbHRlckNvbWJvLCBDaGVja2xpc3RGaWx0ZXJDb21ib0xpc3RlbmVycywgR3JpZENvbnRhaW5lckl0ZW1Db25maWcgfSBmcm9tICdAYnJ5bnR1bS9ncmlkLXRoaW4nO1xuXG5pbXBvcnQgeyBEb21IZWxwZXIsIFN0cmluZ0hlbHBlciB9IGZyb20gJ0BicnludHVtL2NvcmUtdGhpbic7XG5pbXBvcnQgeyBpbml0VGhlbWVJblNoYWRvd1Jvb3RzIH0gZnJvbSAnLi9zaGFkb3dkb20uaGVscGVyJztcblxuZXhwb3J0IHR5cGUgQnJ5bnR1bUNoZWNrbGlzdEZpbHRlckNvbWJvUHJvcHMgPSB7XG4gICAgLy8gQ29uZmlnc1xuICAgIC8qKlxuICAgICAqIEVsZW1lbnQgKG9yIGVsZW1lbnQgaWQpIHRvIGFkb3B0IGFzIHRoaXMgV2lkZ2V0J3MgZW5jYXBzdWxhdGluZyBlbGVtZW50LiBUaGUgd2lkZ2V0J3NcbiAgICAgKiBjb250ZW50IHdpbGwgYmUgcGxhY2VkIGluc2lkZSB0aGlzIGVsZW1lbnQuXG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctYWRvcHQpXG4gICAgICovXG4gICAgYWRvcHQgPyA6IEhUTUxFbGVtZW50fHN0cmluZ1xuICAgIC8qKlxuICAgICAqICpPbmx5IHZhbGlkIGlmIHRoaXMgV2lkZ2V0IGlzIFtmbG9hdGluZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpLipcbiAgICAgKiBbTW9yZS4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1hbGlnbilcbiAgICAgKi9cbiAgICBhbGlnbiA/IDogQWxpZ25TcGVjfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyB3aWRnZXQgaXMgYSBjaGlsZCBvZiBhIFtDb250YWluZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIpLCBpdCB3aWxsIGJ5IGRlZmF1bHQgYmUgcGFydGljaXBhdGluZyBpbiBhXG4gICAgICogZmxleGJveCBsYXlvdXQuIFRoaXMgY29uZmlnIGFsbG93cyB5b3UgdG8gc2V0IHRoaXMgd2lkZ2V0J3NcbiAgICAgKiBbYWxpZ24tc2VsZl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2FsaWduLXNlbGYpIHN0eWxlLlxuICAgICAqL1xuICAgIGFsaWduU2VsZiA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogKk9ubHkgdmFsaWQgaWYgdGhpcyBXaWRnZXQgaXMgW2Zsb2F0aW5nXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykgYW5kIGJlaW5nIHNob3duIHRocm91Z2ggW3Nob3dCeV0oI0NvcmUvd2lkZ2V0L1dpZGdldCNmdW5jdGlvbi1zaG93QnkpLipcbiAgICAgKiBgdHJ1ZWAgdG8gc2hvdyBhIGNvbm5lY3RvciBhcnJvdyBwb2ludGluZyB0byB0aGUgYWxpZ24gdGFyZ2V0LlxuICAgICAqL1xuICAgIGFuY2hvciA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEVsZW1lbnQgKG9yIHRoZSBpZCBvZiBhbiBlbGVtZW50KSB0byBhcHBlbmQgdGhpcyB3aWRnZXQncyBlbGVtZW50IHRvLiBDYW4gYmUgY29uZmlndXJlZCwgb3Igc2V0IG9uY2UgYXRcbiAgICAgKiBydW50aW1lLiBUbyBhY2Nlc3MgdGhlIGVsZW1lbnQgb2YgYSByZW5kZXJlZCB3aWRnZXQsIHNlZSBbZWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1lbGVtZW50KS5cbiAgICAgKi9cbiAgICBhcHBlbmRUbyA/IDogSFRNTEVsZW1lbnR8c3RyaW5nXG4gICAgLyoqXG4gICAgICogQSBsb2NhbGl6YWJsZSBzdHJpbmcgKE1heSBjb250YWluIGAnTHt9J2AgdG9rZW5zIHdoaWNoIHJlc29sdmUgaW4gdGhlIGxvY2FsZSBmaWxlKSB0byBpbmplY3RcbiAgICAgKiBpbnRvIGFuIGVsZW1lbnQgd2hpY2ggd2lsbCBiZSBsaW5rZWQgdXNpbmcgdGhlIGBhcmlhLWRlc2NyaWJlZGJ5YCBhdHRyaWJ1dGUuXG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctYXJpYURlc2NyaXB0aW9uKVxuICAgICAqL1xuICAgIGFyaWFEZXNjcmlwdGlvbiA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQSBsb2NhbGl6YWJsZSBzdHJpbmcgKE1heSBjb250YWluIGAnTHt9J2AgdG9rZW5zIHdoaWNoIHJlc29sdmUgaW4gdGhlIGxvY2FsZSBmaWxlKSB0byBpbmplY3QgYXNcbiAgICAgKiB0aGUgYGFyaWEtbGFiZWxgIGF0dHJpYnV0ZS5cbiAgICAgKiBbTW9yZS4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1hcmlhTGFiZWwpXG4gICAgICovXG4gICAgYXJpYUxhYmVsID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBuYXRpdmUgYGF1dG9jb21wbGV0ZWAgcHJvcGVydHkgb2YgdGhlIHVuZGVybHlpbmcgaW5wdXQgZWxlbWVudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWZlciB0b1xuICAgICAqIFtNRE5dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvQXR0cmlidXRlcy9hdXRvY29tcGxldGUpXG4gICAgICovXG4gICAgYXV0b0NvbXBsZXRlID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYHRydWVgIHRvIGhhdmUgdGhlIHBpY2tlciBleHBhbmQgdXBvbiBmb2N1cyBlbnRlci5cbiAgICAgKi9cbiAgICBhdXRvRXhwYW5kID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBgdHJ1ZWAgdG8gYXV0byBzZWxlY3QgZmllbGQgY29udGVudHMgb24gZm9jdXNcbiAgICAgKi9cbiAgICBhdXRvU2VsZWN0ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbCB0ZXh0IHRvIHNob3cgaW4gYmFkZ2UuXG4gICAgICovXG4gICAgYmFkZ2UgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aGVyZSBwcm9wZXJ0eSBuYW1lcyB3aXRoIGEgdHJ1dGh5IHZhbHVlIGluZGljYXRlIHdoaWNoIGV2ZW50cyBzaG91bGQgYnViYmxlIHVwIHRoZSBvd25lcnNoaXBcbiAgICAgKiBoaWVyYXJjaHkgd2hlbiB0cmlnZ2VyZWQuXG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctYnViYmxlRXZlbnRzKVxuICAgICAqL1xuICAgIGJ1YmJsZUV2ZW50cyA/IDogb2JqZWN0XG4gICAgLyoqXG4gICAgICogRW5hYmxlIGNhY2hpbmcgb2YgdGhlIGxhc3QgcmV0cmlldmVkIHJlc3VsdCB1bnRpbCB0aGUgdGltZW91dCBpcyByZWFjaGVkLlxuICAgICAqIFtNb3JlLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLWNhY2hlTGFzdFJlc3VsdClcbiAgICAgKi9cbiAgICBjYWNoZUxhc3RSZXN1bHQgPyA6IG51bWJlcnxzdHJpbmd8RHVyYXRpb258RHVyYXRpb25Db25maWdcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYGZhbHNlYCB0byBub3QgY2FsbCBvblhYWCBtZXRob2QgbmFtZXMgKGUuZy4gYG9uU2hvd2AsIGBvbkNsaWNrYCksIGFzIGFuIGVhc3kgd2F5IHRvIGxpc3RlbiBmb3IgZXZlbnRzLlxuICAgICAqIFtNb3JlLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLWNhbGxPbkZ1bmN0aW9ucylcbiAgICAgKi9cbiAgICBjYWxsT25GdW5jdGlvbnMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYHRydWVgIHRvIGZvcmNlIGNhc2UgbWF0Y2hpbmcgd2hlbiBmaWx0ZXJpbmcgdGhlIGRyb3Bkb3duIGxpc3QgYmFzZWQgdXBvbiB0aGUgdHlwZWQgdmFsdWUuXG4gICAgICovXG4gICAgY2FzZVNlbnNpdGl2ZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIGlmIGFuIGV2ZW50IGhhbmRsZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdGhlIGVycm9yIHByb3BhZ2F0ZXMgdXAgdGhlIHN0YWNrIGFuZCB0aGVcbiAgICAgKiBhcHBsaWNhdGlvbiBzdGF0ZSBpcyB1bmRlZmluZWQuIENvZGUgd2hpY2ggZm9sbG93cyB0aGUgZXZlbnQgaGFuZGxlciB3aWxsICpub3QqIGJlIGV4ZWN1dGVkLlxuICAgICAqIFtNb3JlLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLWNhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucylcbiAgICAgKi9cbiAgICBjYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWZsb2F0aW5nKS4qXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBjZW50cmUgdGhlIFdpZGdldCBpbiBicm93c2VyIHZpZXdwb3J0IHNwYWNlLlxuICAgICAqL1xuICAgIGNlbnRlcmVkID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQSBmdW5jdGlvbiAob3IgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiBpbiB0aGUgb3duZXJzaGlwIGhpZXJhcmNoeSkgY2FsbGVkIGR1cmluZyBmaWVsZCB2YWxpZGF0aW9uXG4gICAgICogdG8gcGVyZm9ybSBjdXN0b20gdmFsaWRpdHkgY2hlY2tzLiBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIFtpc1ZhbGlkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvRmllbGQjcHJvcGVydHktaXNWYWxpZClcbiAgICAgKiBldmFsdWF0aW9uLCBhZnRlciB0aGUgYnVpbHQtaW4gW3JlcXVpcmVkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvRmllbGQjY29uZmlnLXJlcXVpcmVkKSBjaGVjay5cbiAgICAgKiBbTW9yZS4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1jaGVja1ZhbGlkaXR5KVxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuRmllbGR9IGZpZWxkIFRoZSBmaWVsZCBiZWluZyB2YWxpZGF0ZWRcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBjaGVja1ZhbGlkaXR5ID8gOiAoKGZpZWxkOiBGaWVsZCkgPT4gdm9pZCl8c3RyaW5nXG4gICAgLyoqXG4gICAgICogQSBjb25maWcgb2JqZWN0IHRvIGNvbmZpZ3VyZSB0aGUgW0NoaXBWaWV3XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ2hpcFZpZXcpIHRvIGRpc3BsYXkgdGhlXG4gICAgICogc2VsZWN0ZWQgdmFsdWUgc2V0IHdoZW4gW211bHRpU2VsZWN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29tYm8jY29uZmlnLW11bHRpU2VsZWN0KSBpcyBgdHJ1ZWAuXG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctY2hpcFZpZXcpXG4gICAgICovXG4gICAgY2hpcFZpZXcgPyA6IENoaXBWaWV3Q29uZmlnXG4gICAgLyoqXG4gICAgICogU2hvdyBhIHRyaWdnZXIgdG8gY2xlYXIgZmllbGQsIGlmIHRoaXMgZmllbGQgaXMgbm90IFtyZWFkT25seV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0ZpZWxkI2NvbmZpZy1yZWFkT25seSkuIFRoZSB0cmlnZ2VyIGlzIGF2YWlsYWJsZVxuICAgICAqIGluIHRoZSBbdHJpZ2dlcnNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9GaWVsZCNwcm9wZXJ0eS10cmlnZ2Vycykgb2JqZWN0IHVuZGVyIHRoZSBuYW1lIGBjbGVhcmAuIE1heSBhbHNvIGJlIGFuIG9iamVjdCB3aGljaFxuICAgICAqIGNvbmZpZ3VyZXMgdGhlIGBjbGVhcmAgW3RyaWdnZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9GaWVsZCNwcm9wZXJ0eS10cmlnZ2VycykuXG4gICAgICovXG4gICAgY2xlYXJhYmxlID8gOiBib29sZWFufEZpZWxkVHJpZ2dlckNvbmZpZ1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCB0byBjbGVhciB2YWx1ZSB0eXBlZCB0byBhIG11bHRpc2VsZWN0IGNvbWJvIHdoZW4gcGlja2VyIGlzIGNvbGxhcHNlZFxuICAgICAqL1xuICAgIGNsZWFyVGV4dE9uUGlja2VySGlkZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYGZhbHNlYCB0byBub3QgY2xlYXIgdmFsdWUgdHlwZWQgdG8gYSBtdWx0aXNlbGVjdCBjb21ibyB3aGVuIGFuIGl0ZW0gaXMgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgY2xlYXJUZXh0T25TZWxlY3Rpb24gPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGNsZWFyIHRoaXMgZmllbGQgd2hlbiB1c2VyIGVtcHRpZXMgdGhlIGlucHV0IGVsZW1lbnRcbiAgICAgKi9cbiAgICBjbGVhcldoZW5JbnB1dEVtcHR5ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIENTUyBjbGFzc2VzIHRvIGFkZCB0byBlbGVtZW50LlxuICAgICAqIE1heSBiZSBzcGVjaWZpZWQgYXMgYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nLCBvciBhcyBhbiBvYmplY3QgaW4gd2hpY2ggcHJvcGVydHkgbmFtZXNcbiAgICAgKiB3aXRoIHRydXRoeSB2YWx1ZXMgYXJlIHVzZWQgYXMgdGhlIGNsYXNzIG5hbWVzOlxuICAgICAqIFtNb3JlLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLWNscylcbiAgICAgKi9cbiAgICBjbHMgPyA6IHN0cmluZ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIHRoZSBzcGVjaWZpZWQgY29sb3IgdG8gdGhlIHdpZGdldCwgYnkgc2V0dGluZyB0aGUgYC0tYi1wcmltYXJ5YCBDU1MgdmFyaWFibGUgaW4gdGhlIHdpZGdldHNcbiAgICAgKiBgc3R5bGVgIGJsb2NrLlxuICAgICAqIFtNb3JlLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLWNvbG9yKVxuICAgICAqL1xuICAgIGNvbG9yID8gOiBDb2xvclxuICAgIC8qKlxuICAgICAqIFByb2dyYW1tYXRpYyBjb250cm9sIG92ZXIgd2hpY2ggY29sdW1uIHRvIHN0YXJ0IGluIHdoZW4gdXNlZCBpbiBhIGdyaWQgbGF5b3V0LlxuICAgICAqL1xuICAgIGNvbHVtbiA/IDogbnVtYmVyXG4gICAgY29uZmlnID8gOiBvYmplY3RcbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWZsb2F0aW5nKSBvciBbcG9zaXRpb25lZF0oI0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctcG9zaXRpb25lZCkuKlxuICAgICAqIEVsZW1lbnQsIFdpZGdldCBvciBSZWN0YW5nbGUgdG8gd2hpY2ggdGhpcyBXaWRnZXQgaXMgY29uc3RyYWluZWQuXG4gICAgICovXG4gICAgY29uc3RyYWluVG8gPyA6IEhUTUxFbGVtZW50fFdpZGdldHxSZWN0YW5nbGVcbiAgICAvKipcbiAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBmb3IgYWRkaXRpb25hbCBpdGVtcyBhc3NvY2lhdGVkIHRvIHRoaXMgZmllbGQuIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgdG8gYWRkIGNvbnRleHR1YWxcbiAgICAgKiBmaWVsZHMgcmVsYXRlZCB0byBhIFtjaGVja2JveF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NoZWNrYm94KSBvciBbcmFkaW8gYnV0dG9uXSgjQ29yZS93aWRnZXQvUmFkaW8pLiBTZWVcbiAgICAgKiB0aGVzZSBjbGFzc2VzIGZvciBleGFtcGxlcyBvZiBuZXN0ZWQgZmllbGRzLlxuICAgICAqIFtNb3JlLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLWNvbnRhaW5lcilcbiAgICAgKi9cbiAgICBjb250YWluZXIgPyA6IFJlY29yZDxzdHJpbmcsIEdyaWRDb250YWluZXJJdGVtQ29uZmlnPnxHcmlkQ29udGFpbmVySXRlbUNvbmZpZ1tdfEZpZWxkQ29udGFpbmVyQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhlIGNvbmZpZyBjb250cm9scyBob3cgdGhlIHZhbHVlIG9mIG5lc3RlZCBpdGVtcyBhcmUgaGFuZGxlZCB3aGVuIGEgcGFyZW50IGNvbnRhaW5lciBnZXRzIG9yIHNldHMgaXRzXG4gICAgICogW3ZhbHVlc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbnRhaW5lciNwcm9wZXJ0eS12YWx1ZXMpLlxuICAgICAqIFtNb3JlLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLWNvbnRhaW5WYWx1ZXMpXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5GaWVsZH0gZmllbGQgRmllbGQgaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBjb250YWluVmFsdWVzID8gOiBib29sZWFufHN0cmluZ3woKGZpZWxkOiBGaWVsZCkgPT4gYm9vbGVhbilcbiAgICAvKipcbiAgICAgKiBDdXN0b20gQ1NTIGNsYXNzZXMgdG8gYWRkIHRvIHRoZSBbY29udGVudEVsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktY29udGVudEVsZW1lbnQpLlxuICAgICAqIE1heSBiZSBzcGVjaWZpZWQgYXMgYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nLCBvciBhcyBhbiBvYmplY3QgaW4gd2hpY2ggcHJvcGVydHkgbmFtZXNcbiAgICAgKiB3aXRoIHRydXRoeSB2YWx1ZXMgYXJlIHVzZWQgYXMgdGhlIGNsYXNzIG5hbWVzOlxuICAgICAqIFtNb3JlLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLWNvbnRlbnRFbGVtZW50Q2xzKVxuICAgICAqL1xuICAgIGNvbnRlbnRFbGVtZW50Q2xzID8gOiBzdHJpbmd8b2JqZWN0XG4gICAgLyoqXG4gICAgICogSWYgY29uZmlndXJlZCBhcyBgdHJ1ZWAsIHRoaXMgbWVhbnMgdGhhdCB3aGVuIGFuIHVubWF0Y2hlZCBzdHJpbmcgaXMgdHlwZWQgaW50byB0aGVcbiAgICAgKiBjb21ibydzIGlucHV0IGZpZWxkLCBhbmQgPGtiZD5FbnRlcjwva2JkPiwgb3IgdGhlIFttdWx0aVZhbHVlU2VwYXJhdG9yXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29tYm8jY29uZmlnLW11bHRpVmFsdWVTZXBhcmF0b3IpIGlzIHR5cGVkLFxuICAgICAqIGEgbmV3IHJlY29yZCB3aWxsIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIHR5cGVkIHN0cmluZyBhcyB0aGUgW2Rpc3BsYXlGaWVsZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbWJvI2NvbmZpZy1kaXNwbGF5RmllbGQpLlxuICAgICAqIFtNb3JlLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLWNyZWF0ZU9uVW5tYXRjaGVkKVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFJlY29yZCBuYW1lXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5Db21ib30gY29tYm8gQ29tYm8gaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7Q29yZS5kYXRhLk1vZGVsfSBOZXcgcmVjb3JkXG4gICAgICovXG4gICAgY3JlYXRlT25Vbm1hdGNoZWQgPyA6ICgobmFtZTogc3RyaW5nLCBjb21ibzogQ29tYm8pID0+IE1vZGVsKXxzdHJpbmd8Ym9vbGVhblxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyBXaWRnZXQgY29uZmlndXJhdGlvbiBpcyB1c2VkIGluIHRoZSBHcmlkJ3MgUm93RXhwYW5kZXIgZmVhdHVyZSdzIGB3aWRnZXRgIGNvbmZpZywgcHJvdmlkZSB0aGVcbiAgICAgKiBmaWVsZCBvbiB0aGUgZXhwYW5kZWQgcmVjb3JkIHRvIHVzZSBmb3IgcG9wdWxhdGluZyB0aGlzIHdpZGdldCdzIHN0b3JlIChpZiBhcHBsaWNhYmxlKVxuICAgICAqL1xuICAgIGRhdGFGaWVsZCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogT2JqZWN0IHRvIGFwcGx5IHRvIGVsZW1lbnRzIGRhdGFzZXQgKGVhY2gga2V5IHdpbGwgYmUgdXNlZCBhcyBhIGRhdGEtYXR0cmlidXRlIG9uIHRoZSBlbGVtZW50KVxuICAgICAqL1xuICAgIGRhdGFzZXQgPyA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0IHdoZW4gYSBzaW5nbGUgdmFsdWUgaXMgdG8gYmUgYXBwbGllZCB0byB0aGlzIFdpZGdldC4gU3VjaCBhcyB3aGVuIHVzZWRcbiAgICAgKiBpbiBhIGdyaWQgV2lkZ2V0Q29sdW1uLCB0aGlzIGlzIHRoZSBwcm9wZXJ0eSB0byB3aGljaCB0aGUgY29sdW1uJ3MgYGZpZWxkYCBpcyBhcHBsaWVkLlxuICAgICAqL1xuICAgIGRlZmF1bHRCaW5kUHJvcGVydHkgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIENoZWNrIGZvciBDU1MgY29tcGF0aWJpbGl0eSBhbmQgaW5jbHVzaW9uIHJlbGF0ZWQgaXNzdWVzIGFuZCB0cnkgdG8gYXV0byBmaXggdGhlbS4gUGVyZm9ybXMgdGhlIGZvbGxvd2luZ1xuICAgICAqIGNoZWNrczpcbiAgICAgKiBbTW9yZS4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1kZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzKVxuICAgICAqL1xuICAgIGRldGVjdENTU0NvbXBhdGliaWxpdHlJc3N1ZXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIG9yIGVuYWJsZSB0aGUgd2lkZ2V0LiBJdCBpcyBzaW1pbGFyIHRvIFtyZWFkT25seV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctcmVhZE9ubHkpIGV4Y2VwdCBhIGRpc2FibGVkIHdpZGdldFxuICAgICAqIGNhbm5vdCBiZSBmb2N1c2VkLCB1c2VzIGEgZGlmZmVyZW50IHJlbmRpdGlvbiAodXN1YWxseSBncmV5aXNoKSBhbmQgZG9lcyBub3QgYWxsb3cgc2VsZWN0aW5nIGl0cyB2YWx1ZS5cbiAgICAgKiBbTW9yZS4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1kaXNhYmxlZClcbiAgICAgKi9cbiAgICBkaXNhYmxlZCA/IDogYm9vbGVhbnwnaW5lcnQnXG4gICAgLyoqXG4gICAgICogRmllbGQgdXNlZCBmb3IgaXRlbSB0ZXh0IHdoZW4gcG9wdWxhdGluZyBmcm9tIHN0b3JlXG4gICAgICovXG4gICAgZGlzcGxheUZpZWxkID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUZW1wbGF0ZSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGN1c3RvbWl6ZSB0aGUgZGlzcGxheWVkIHZhbHVlXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IHJlY29yZCBUaGUgcmVjb3JkIHRvIHByb3ZpZGUgYSB0ZXh0dWFsIHZhbHVlIGZvclxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuQ29tYm99IGNvbWJvIEEgcmVmZXJlbmNlIHRvIHRoaXMgQ29tYm9cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nLHZvaWR9XG4gICAgICovXG4gICAgZGlzcGxheVZhbHVlUmVuZGVyZXIgPyA6IChyZWNvcmQ6IE1vZGVsLCBjb21ibzogQ29tYm8pID0+IHN0cmluZ3x2b2lkXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgdGhlIHBsYWNlbWVudCBvZiB0aGlzIHdpZGdldCB3aGVuIGl0IGlzIGFkZGVkIHRvIGEgW3BhbmVsJ3MgXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwpXG4gICAgICogW3N0cmlwcyBjb2xsZWN0aW9uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLXN0cmlwcykuIFR5cGljYWwgdmFsdWVzIGZvciB0aGlzIGNvbmZpZyBhcmUgYCd0b3AnYCxcbiAgICAgKiBgJ2JvdHRvbSdgLCBgJ2xlZnQnYCwgb3IgYCdyaWdodCdgLCB3aGljaCBjYXVzZSB0aGUgd2lkZ2V0IHRvIGJlIHBsYWNlZCBvbiB0aGF0IHNpZGUgb2YgdGhlIHBhbmVsJ3NcbiAgICAgKiBib2R5LiBTdWNoIHdpZGdldHMgYXJlIGNhbGxlZCBcImVkZ2Ugc3RyaXBzXCIuXG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctZG9jaylcbiAgICAgKi9cbiAgICBkb2NrID8gOiAndG9wJ3wnYm90dG9tJ3wnbGVmdCd8J3JpZ2h0J3wnc3RhcnQnfCdlbmQnfCdoZWFkZXInfCdwcmUtaGVhZGVyJ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWZsb2F0aW5nKS4qXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBiZSBhYmxlIHRvIGRyYWcgYSB3aWRnZXQgZnJlZWx5IG9uIHRoZSBwYWdlLiBPciBzZXQgdG8gYW4gb2JqZWN0IHdpdGggYSDCtGhhbmRsZVNlbGVjdG9ywrRcbiAgICAgKiBwcm9wZXJ0eSB3aGljaCBjb250cm9scyB3aGVuIGEgZHJhZyBzaG91bGQgc3RhcnQuXG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctZHJhZ2dhYmxlKVxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBoYW5kbGVTZWxlY3RvciBDU1Mgc2VsZWN0b3IgdXNlZCB0byBkZXRlcm1pbmUgaWYgZHJhZyBjYW4gYmUgc3RhcnRlZCBmcm9tIGEgbW91c2UtZG93bmVkIGVsZW1lbnQgaW5zaWRlIHRoZSB3aWRnZXRcbiAgICAgKi9cbiAgICBkcmFnZ2FibGUgPyA6IGJvb2xlYW58b2JqZWN0XG4gICAgLyoqXG4gICAgICogVXNlciBjYW4gZWRpdCB0ZXh0IGluIHRleHQgZmllbGQgKG90aGVyd2lzZSBvbmx5IHBpY2sgZnJvbSBhdHRhY2hlZCBwaWNrZXIpXG4gICAgICovXG4gICAgZWRpdGFibGUgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgc3BlY2lmeWluZyBhdHRyaWJ1dGVzIHRvIGFzc2lnbiB0byB0aGUgcm9vdCBlbGVtZW50IG9mIHRoaXMgd2lkZ2V0LlxuICAgICAqIFNldCBgbnVsbGAgdmFsdWUgdG8gYXR0cmlidXRlIHRvIHJlbW92ZSBpdC5cbiAgICAgKiBbTW9yZS4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1lbGVtZW50QXR0cmlidXRlcylcbiAgICAgKi9cbiAgICBlbGVtZW50QXR0cmlidXRlcyA/IDogUmVjb3JkPHN0cmluZywgc3RyaW5nfG51bGw+XG4gICAgLyoqXG4gICAgICogVGV4dCB0byBkaXNwbGF5IGluIHRoZSBkcm9wIGRvd24gd2hlbiB0aGVyZSBhcmUgbm8gaXRlbXMgaW4gdGhlIHVuZGVybHlpbmcgc3RvcmUuXG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctZW1wdHlUZXh0KVxuICAgICAqL1xuICAgIGVtcHR5VGV4dCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQSBmdW5jdGlvbiB3aGljaCBjcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBmb3IgdGhlIFtmaWx0ZXJQYXJhbU5hbWVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db21ibyNjb25maWctZmlsdGVyUGFyYW1OYW1lKSB0byBwYXNzXG4gICAgICogYW55IGZpbHRlcnMgdG8gdGhlIHNlcnZlciB1cG9uIGxvYWQuXG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctZW5jb2RlRmlsdGVyUGFyYW1zKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0W119IGZpbHRlcnMgZmlsdGVyc1xuICAgICAqIEByZXR1cm5zIHtvYmplY3RbXX0gYXJyYXkgb2YgdmFsdWVzXG4gICAgICovXG4gICAgZW5jb2RlRmlsdGVyUGFyYW1zID8gOiAoZmlsdGVyczogb2JqZWN0W10pID0+IG9iamVjdFtdXG4gICAgZXh0cmFEYXRhID8gOiBhbnlcbiAgICAvKipcbiAgICAgKiBJZiBgZmFsc2VgLCBmaWx0ZXJpbmcgd2lsbCBiZSB0cmlnZ2VyZWQgb25jZSB5b3UgZXhjZWVkIFttaW5DaGFyc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbWJvI2NvbmZpZy1taW5DaGFycykuIFRvIGZpbHRlciBvbmx5IHdoZW5cbiAgICAgKiBoaXR0aW5nIEVudGVyIGtleSwgc2V0IHRoaXMgdG8gYHRydWVgO1xuICAgICAqL1xuICAgIGZpbHRlck9uRW50ZXIgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiBhbiBvcGVyYXRvciB0eXBlIGFzIGltcGxlbWVudGVkIGluIFtvcGVyYXRvcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvdXRpbC9Db2xsZWN0aW9uRmlsdGVyI2NvbmZpZy1vcGVyYXRvcilcbiAgICAgKiB0byB1c2Ugd2hlbiBmaWx0ZXJpbmcgdGhlIGRyb3Bkb3duIGxpc3QgYmFzZWQgdXBvbiB0aGUgdHlwZWQgdmFsdWUuXG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctZmlsdGVyT3BlcmF0b3IpXG4gICAgICovXG4gICAgZmlsdGVyT3BlcmF0b3IgPyA6IENvbGxlY3Rpb25Db21wYXJlT3BlcmF0b3JcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgZHJvcGRvd24gaXMgdG8gYmUgcG9wdWxhdGVkIHdpdGggYSBmaWx0ZXJlZCBxdWVyeSB0byBhIHJlbW90ZSBzZXJ2ZXIsIHNwZWNpZnkgdGhlXG4gICAgICogbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRvIHBhc3MgdGhlIHR5cGVkIHN0cmluZyBoZXJlLiBCeSBkZWZhdWx0LCB0aGUgc3RyaW5nIGlzIHNpbXBseSBzZW50XG4gICAgICogYXMgdGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuIEZvciBzcGVjaWFsIGVuY29kaW5nLCBjb25maWd1cmUgdGhlIGNvbWJvIHdpdGggW2VuY29kZUZpbHRlclBhcmFtc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbWJvI2NvbmZpZy1lbmNvZGVGaWx0ZXJQYXJhbXMpXG4gICAgICovXG4gICAgZmlsdGVyUGFyYW1OYW1lID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBXaGVuIFttdWx0aVNlbGVjdF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbWJvI2NvbmZpZy1tdWx0aVNlbGVjdCkgaXMgYHRydWVgLCB5b3UgbWF5IGNvbmZpZ3VyZSBgZmlsdGVyU2VsZWN0ZWRgIGFzXG4gICAgICogYHRydWVgIHRvIGhpZGUgaXRlbXMgaW4gdGhlIGRyb3Bkb3duIHdoZW4gdGhleSBhcmUgYWRkZWQgdG8gdGhlIHNlbGVjdGlvbi5cbiAgICAgKiBJdCB3aWxsIGFwcGVhciBhcyBpZiB0aGUgcmVxdWVzdGVkIGl0ZW0gaGFzIFwibW92ZWRcIiBpbnRvIHRoZSBmaWVsZCdzXG4gICAgICogW0NoaXBWaWV3XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29tYm8jY29uZmlnLWNoaXBWaWV3KS5cbiAgICAgKi9cbiAgICBmaWx0ZXJTZWxlY3RlZCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyB3aWRnZXQgaXMgYSBjaGlsZCBvZiBhIFtDb250YWluZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIpLCBpdCB3aWxsIGJ5IGRlZmF1bHQgYmUgcGFydGljaXBhdGluZyBpbiBhXG4gICAgICogZmxleGJveCBsYXlvdXQuIFRoaXMgY29uZmlnIGFsbG93cyB5b3UgdG8gc2V0IHRoaXMgd2lkZ2V0J3NcbiAgICAgKiBbZmxleF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2ZsZXgpIHN0eWxlLlxuICAgICAqIFRoaXMgbWF5IGJlIGNvbmZpZ3VyZWQgYXMgYSBzaW5nbGUgbnVtYmVyIG9yIGEgYCZsdDtmbGV4LWdyb3cmZ3Q7ICZsdDtmbGV4LXNocmluayZndDsgJmx0O2ZsZXgtYmFzaXMmZ3Q7YCBmb3JtYXQgc3RyaW5nLlxuICAgICAqIG51bWVyaWMtb25seSB2YWx1ZXMgYXJlIGludGVycHJldGVkIGFzIHRoZSBgZmxleC1ncm93YCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmbGV4ID8gOiBudW1iZXJ8c3RyaW5nXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBtb3ZlIHRoZSB3aWRnZXQgb3V0IG9mIHRoZSBkb2N1bWVudCBmbG93IGFuZCBwb3NpdGlvbiBpdFxuICAgICAqIGFic29sdXRlbHkgaW4gYnJvd3NlciB2aWV3cG9ydCBzcGFjZS5cbiAgICAgKi9cbiAgICBmbG9hdGluZyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFdpZGdldCdzIGhlaWdodCwgdXNlZCB0byBzZXQgZWxlbWVudCBgc3R5bGUuaGVpZ2h0YC4gRWl0aGVyIHNwZWNpZnkgYSB2YWxpZCBoZWlnaHQgc3RyaW5nIG9yIGEgbnVtYmVyLFxuICAgICAqIHdoaWNoIHdpbGwgZ2V0ICdweCcgYXBwZW5kZWQuIFdlIHJlY29tbWVuZCB1c2luZyBDU1MgYXMgdGhlIHByaW1hcnkgd2F5IHRvIGNvbnRyb2wgaGVpZ2h0LCBidXQgaW4gc29tZVxuICAgICAqIGNhc2VzIHRoaXMgY29uZmlnIGlzIGNvbnZlbmllbnQuXG4gICAgICovXG4gICAgaGVpZ2h0ID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIHdpdGggdHJ1ZSB0byBtYWtlIHdpZGdldCBpbml0aWFsbHkgaGlkZGVuLlxuICAgICAqL1xuICAgIGhpZGRlbiA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqICpPbmx5IHZhbGlkIGlmIHRoaXMgV2lkZ2V0IGlzIFtmbG9hdGluZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpLipcbiAgICAgKiBbTW9yZS4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1oaWRlQW5pbWF0aW9uKVxuICAgICAqL1xuICAgIGhpZGVBbmltYXRpb24gPyA6IGJvb2xlYW58b2JqZWN0XG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgdGhlIHBpY2tlciBpcyBoaWRkZW4gb24gc2VsZWN0aW9uIGluIHNpbmdsZSBzZWxlY3QgbW9kZSwgYW5kXG4gICAgICogcmVtYWlucyB0byBhbGxvdyBtb3JlIHNlbGVjdGlvbnMgd2hlbiBbbXVsdGlTZWxlY3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db21ibyNjb25maWctbXVsdGlTZWxlY3QpIGlzIGB0cnVlYC5cbiAgICAgKiBTZXR0aW5nIHRoaXMgdG8gYSBgQm9vbGVhbmAgdmFsdWUgY2FuIG92ZXJyaWRlIHRoYXQgZGVmYXVsdC5cbiAgICAgKi9cbiAgICBoaWRlUGlja2VyT25TZWxlY3QgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYHRydWVgIHRvIGhpZGUgdGhlIGV4cGFuZCB0cmlnZ2VyLiBUaGlzIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHRvIGB0cnVlYCBpZlxuICAgICAqIHJlbW90ZSBmaWx0ZXJpbmcgaXMgZW5hYmxlZCBieSBzZXR0aW5nIHRoZSBbZmlsdGVyUGFyYW1OYW1lXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29tYm8jY29uZmlnLWZpbHRlclBhcmFtTmFtZSkgY29uZmlnLlxuICAgICAqL1xuICAgIGhpZGVUcmlnZ2VyID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBgdHJ1ZWAgdG8gaGlnaGxpZ2h0IGZpZWxkIGFmdGVyIGV4dGVybmFsIHZhbHVlIGNoYW5nZXNcbiAgICAgKi9cbiAgICBoaWdobGlnaHRFeHRlcm5hbENoYW5nZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIHN0cmluZyB0byBkaXNwbGF5IGluc2lkZSB0aGUgaW5wdXQgZmllbGQgYXMgYW4gb3ZlcmxheS4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBkaXNwbGF5aW5nXG4gICAgICogYSBmaWVsZCdzIHVuaXRzLlxuICAgICAqIFtNb3JlLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLWhpbnQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgQSBkYXRhIG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuRmllbGR9IGRhdGEuc291cmNlIEEgcmVmZXJlbmNlIHRvIHRoZSBmaWVsZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7YW55fSBkYXRhLnZhbHVlIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmaWVsZFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgaGludCA/IDogc3RyaW5nfCgoZGF0YTogeyBzb3VyY2U6IEZpZWxkLCB2YWx1ZTogYW55IH0pID0+IHN0cmluZylcbiAgICAvKipcbiAgICAgKiBUaGlzIGNvbmZpZyBpcyBzaW1pbGFyIHRvIFtoaW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvRmllbGQjY29uZmlnLWhpbnQpIGV4Y2VwdCB0aGF0IHRoaXMgY29uZmlnIGlzIHVzZWQgdG8gZGlzcGxheSBIVE1MIGNvbnRlbnQuXG4gICAgICogU2luY2UgdGhpcyBjYW4gYWxsb3cgbWFsaWNpb3VzIGNvbnRlbnQgdG8gYmUgZXhlY3V0ZWQsIGJlIHN1cmUgbm90IHRvIGluY2x1ZGUgdXNlci1lbnRlcmVkIGRhdGEgb3IgdG9cbiAgICAgKiBlbmNvZGUgc3VjaCBkYXRhIChzZWUgW2VuY29kZUh0bWxdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL2hlbHBlci9TdHJpbmdIZWxwZXIjZnVuY3Rpb24tZW5jb2RlSHRtbC1zdGF0aWMpKS5cbiAgICAgKiBbTW9yZS4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1oaW50SHRtbClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSBBIGRhdGEgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5GaWVsZH0gZGF0YS5zb3VyY2UgQSByZWZlcmVuY2UgdG8gdGhlIGZpZWxkIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHthbnl9IGRhdGEudmFsdWUgVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGZpZWxkXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBoaW50SHRtbCA/IDogc3RyaW5nfCgoZGF0YTogeyBzb3VyY2U6IEZpZWxkLCB2YWx1ZTogYW55IH0pID0+IHN0cmluZylcbiAgICAvKipcbiAgICAgKiBXaWRnZXQgaWQsIGlmIG5vdCBzcGVjaWZpZWQgb25lIHdpbGwgYmUgZ2VuZXJhdGVkLiBBbHNvIHVzZWQgZm9yIGxvb2t1cHMgdGhyb3VnaCBXaWRnZXQuZ2V0QnlJZFxuICAgICAqL1xuICAgIGlkID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSB3aWRnZXRzIHJlYWQtb25seSBzdGF0ZSBzaG91bGQgYmUgY29udHJvbGxlZCBieSBpdHMgcGFyZW50LlxuICAgICAqIFtNb3JlLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLWlnbm9yZVBhcmVudFJlYWRPbmx5KVxuICAgICAqL1xuICAgIGlnbm9yZVBhcmVudFJlYWRPbmx5ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU2V0IHRoaXMgY29uZmlnIHRvIGB0cnVlYCB0byBhbHdheXMgZGlzcGxheSBpdGVtcyBob3Jpem9udGFsbHkgYWxvbmcgd2l0aCB0aGlzIGZpZWxkLiBUaGlzIGFzc2lnbnMgYW5cbiAgICAgKiBbaGJveF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L2xheW91dC9Cb3gpIGFzIHRoZSBbbGF5b3V0XSgjQ29yZS93aWRnZXQvQ29udGFpbmVyI2NvbmZpZy1sYXlvdXQpIHRvIHRoZVxuICAgICAqIFtjb250YWluZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9GaWVsZCNjb25maWctY29udGFpbmVyKS5cbiAgICAgKiBbTW9yZS4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1pbmxpbmUpXG4gICAgICovXG4gICAgaW5saW5lID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIHRoaXMgYXMgYHRydWVgIHRvIHJlbmRlciB0aGUgZHJvcGRvd24gbGlzdCBhcyBhIHBlcm1hbmVudGx5IHZpc2libGUgbGlzdFxuICAgICAqIGluIHRoZSBkb2N1bWVudCBmbG93IGltbWVkaWF0ZWx5IGJlbG93IHRoZSBpbnB1dCBhcmVhIGluc3RlYWQgb2YgYXMgYSBwb3B1cC5cbiAgICAgKiBbTW9yZS4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1pbmxpbmVQaWNrZXIpXG4gICAgICovXG4gICAgaW5saW5lUGlja2VyID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGV4dCBhbGlnbm1lbnQgZm9yIHRoZSBpbnB1dCBmaWVsZC5cbiAgICAgKi9cbiAgICBpbnB1dEFsaWduID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBTZXRzIGN1c3RvbSBhdHRyaWJ1dGVzIG9mIHRoZSB1bmRlcmx5aW5nIGlucHV0IGVsZW1lbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVmZXIgdG9cbiAgICAgKiBbTUROXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0F0dHJpYnV0ZXMpXG4gICAgICovXG4gICAgaW5wdXRBdHRyaWJ1dGVzID8gOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgLyoqXG4gICAgICogSWYgeW91IG5lZWQgdG8gdXNlIHNvbWV0aGluZyBlbHNlIHRoYW4gYSBkZWZhdWx0IGBpbnB1dGAgZWxlbWVudCwgYXMgdGhlIGlucHV0IGVsZW1lbnQsIHByb3ZpZGUgdGhlIHRhZ1xuICAgICAqIG5hbWUgaGVyZS4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGlzIHVzZWQgZm9yIGFkdmFuY2VkIHVzYWdlIG9ubHksIGZvciBleGFtcGxlIHdoZW4gdXNpbmcgV2ViQ29tcG9uZW50c1xuICAgICAqIChjdXN0b20gZWxlbWVudHMpLCBhbmQgdGhhdCB0aGUgY29uZmlndXJlZCBlbGVtZW50IG11c3QgZnVsZmlsIHRoZSBzYW1lIGNvbnRyYWN0IGFzIGEgcmVndWxhciBpbnB1dFxuICAgICAqIGVsZW1lbnQuXG4gICAgICovXG4gICAgaW5wdXRUYWcgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGB0eXBlYCBhdHRyaWJ1dGUgb2YgdGhlIHVuZGVybHlpbmcgaW5wdXQgZWxlbWVudCAocGFzc3dvcmQsIGhpZGRlbiwgZGF0ZSwgY29sb3IsIGV0Yy4pLlxuICAgICAqL1xuICAgIGlucHV0VHlwZSA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIHdpZHRoIHRvIGFwcGx5IHRvIHRoZSBgLmItZmllbGQtaW5uZXJgIGVsZW1lbnQsIHdoaWNoIGVuY29tcGFzc2VzIHRoZSBgaW5wdXRgIGVsZW1lbnQgYW5kIGFueVxuICAgICAqIHRyaWdnZXJzLiBJZiBhIG51bWJlciBpcyBzcGVjaWZpZWQsIGBweGAgd2lsbCBiZSB1c2VkLlxuICAgICAqL1xuICAgIGlucHV0V2lkdGggPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiBFbGVtZW50IChvciBlbGVtZW50IGlkKSB0byBpbnNlcnQgdGhpcyB3aWRnZXQgYmVmb3JlLiBJZiBwcm92aWRlZCwgW2FwcGVuZFRvXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1hcHBlbmRUbykgY29uZmlnIGlzIGlnbm9yZWQuXG4gICAgICovXG4gICAgaW5zZXJ0QmVmb3JlID8gOiBIVE1MRWxlbWVudHxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBFbGVtZW50IChvciBlbGVtZW50IGlkKSB0byBhcHBlbmQgdGhpcyB3aWRnZXQgZWxlbWVudCB0bywgYXMgYSBmaXJzdCBjaGlsZC4gSWYgcHJvdmlkZWQsIFthcHBlbmRUb10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctYXBwZW5kVG8pIGNvbmZpZyBpcyBpZ25vcmVkLlxuICAgICAqL1xuICAgIGluc2VydEZpcnN0ID8gOiBIVE1MRWxlbWVudHxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBSb3dzIHRvIGRpc3BsYXkgaW4gdGhlIGRyb3Bkb3duIChsaXN0IGl0ZW1zKS5cbiAgICAgKiBbTW9yZS4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1pdGVtcylcbiAgICAgKi9cbiAgICBpdGVtcyA/IDogb2JqZWN0W118c3RyaW5nW118b2JqZWN0XG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHdob3NlIGtleXMgYXJlIHRoZSBba2V5XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudC9rZXkpIG5hbWVcbiAgICAgKiBhbmQgb3B0aW9uYWwgbW9kaWZpZXIgcHJlZml4ZXM6IGAnQ3RybCsnYCwgYCdBbHQrJ2AsIGAnTWV0YSsnYCwgYW5kIGAnU2hpZnQrJ2AgKGNhc2UtaW5zZW5zaXRpdmUpLiBUaGUgdmFsdWVzXG4gICAgICogYXJlIHRoZSBuYW1lIG9mIHRoZSBpbnN0YW5jZSBtZXRob2QgdG8gY2FsbCB3aGVuIHRoZSBrZXlzdHJva2UgaXMgcmVjZWl2ZWQuXG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWcta2V5TWFwKVxuICAgICAqL1xuICAgIGtleU1hcCA/IDogUmVjb3JkPHN0cmluZywgS2V5TWFwQ29uZmlnPlxuICAgIC8qKlxuICAgICAqIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBhZnRlciB0aGUgbGFzdCBrZXlzdHJva2UgYmVmb3JlIHRyaWdnZXJpbmcgYSBjaGFuZ2UgZXZlbnQuXG4gICAgICogU2V0IHRvIDAgdG8gbm90IHRyaWdnZXIgY2hhbmdlIGV2ZW50cyBmcm9tIGtleXN0cm9rZXMgKGxpc3RlbiBmb3IgaW5wdXQgZXZlbnQgaW5zdGVhZCB0byBoYXZlXG4gICAgICogaW1tZWRpYXRlIGZlZWRiYWNrLCBjaGFuZ2Ugd2lsbCBzdGlsbCBiZSB0cmlnZ2VyZWQgb24gYmx1cikuXG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWcta2V5U3Ryb2tlQ2hhbmdlRGVsYXkpXG4gICAgICovXG4gICAga2V5U3Ryb2tlQ2hhbmdlRGVsYXkgPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBhZnRlciB0aGUgbGFzdCBrZXlzdHJva2UgYmVmb3JlIGZpbHRlcmluZyB0aGUgbGlzdC5cbiAgICAgKiBbTW9yZS4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1rZXlTdHJva2VGaWx0ZXJEZWxheSlcbiAgICAgKi9cbiAgICBrZXlTdHJva2VGaWx0ZXJEZWxheSA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogTGFiZWwsIHByZXBlbmRlZCB0byBmaWVsZFxuICAgICAqL1xuICAgIGxhYmVsID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBDU1MgY2xhc3MgbmFtZSBvciBjbGFzcyBuYW1lcyB0byBhZGQgdG8gYW55IGNvbmZpZ3VyZWQgW2xhYmVsXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvbWl4aW4vTGFiZWxhYmxlI2NvbmZpZy1sYWJlbClcbiAgICAgKi9cbiAgICBsYWJlbENscyA/IDogc3RyaW5nfG9iamVjdFxuICAgIC8qKlxuICAgICAqIExhYmVsIHBvc2l0aW9uLCBlaXRoZXIgJ2JlZm9yZScgdGhlIGZpZWxkIG9yICdhYm92ZScgdGhlIGZpZWxkXG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctbGFiZWxQb3NpdGlvbilcbiAgICAgKi9cbiAgICBsYWJlbFBvc2l0aW9uID8gOiAnYmVmb3JlJ3wnYWJvdmUnfG51bGxcbiAgICAvKipcbiAgICAgKiBUaGUgbGFiZWxzIHRvIGFkZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSBpbnB1dCBmaWVsZC5cbiAgICAgKiBFYWNoIGxhYmVsIG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgKiBbTW9yZS4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1sYWJlbHMpXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGh0bWwgTGFiZWwgdGV4dFxuICAgICAqIEBwcm9wZXJ0eSB7J3N0YXJ0JywnZW5kJ30gYWxpZ24gV2hpY2ggZW5kIG9mIHRoZSBmaWxlIHRoZSBsYWJlbCBzaG91bGQgZ29cbiAgICAgKi9cbiAgICBsYWJlbHMgPyA6IG9iamVjdFtdXG4gICAgLyoqXG4gICAgICogVGhlIHdpZHRoIHRvIGFwcGx5IHRvIHRoZSBgJmx0O2xhYmVsJmd0O2AgZWxlbWVudC4gSWYgYSBudW1iZXIgaXMgc3BlY2lmaWVkLCBgcHhgIHdpbGwgYmUgdXNlZC5cbiAgICAgKi9cbiAgICBsYWJlbFdpZHRoID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogQ1NTIGNsYXNzIHRvIGFkZCB0byBwaWNrZXJcbiAgICAgKi9cbiAgICBsaXN0Q2xzID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdGVuZXIgc2V0IGZvciB0aGlzIG9iamVjdC5cbiAgICAgKiBbTW9yZS4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1saXN0ZW5lcnMpXG4gICAgICovXG4gICAgbGlzdGVuZXJzID8gOiBDaGVja2xpc3RGaWx0ZXJDb21ib0xpc3RlbmVyc1xuICAgIC8qKlxuICAgICAqIFRlbXBsYXRlIHRvIHJlbmRlciBvcHRpb25hbCBjb250ZW50IG5leHQgdG8gbGlzdCBpdGVtcy5cbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gcmVjb3JkIFRoZSBsaXN0IGl0ZW0ncyBiYWNraW5nIHJlY29yZFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgbGlzdEl0ZW1QaWxsVHBsID8gOiAocmVjb3JkOiBNb2RlbCkgPT4gc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGVtcGxhdGUgc3RyaW5nIHVzZWQgdG8gcmVuZGVyIHRoZSBsaXN0IGl0ZW1zIGluIHRoZSBkcm9wZG93biBsaXN0XG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctbGlzdEl0ZW1UcGwpXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IHJlY29yZCBUaGUgcmVjb3JkIHJlcHJlc2VudGluZyB0aGUgaXRlbSBiZWluZyByZW5kZXJlZFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmcsdm9pZH1cbiAgICAgKi9cbiAgICBsaXN0SXRlbVRwbCA/IDogKHJlY29yZDogTW9kZWwpID0+IHN0cmluZ3x2b2lkXG4gICAgLyoqXG4gICAgICogQSBjbGFzcyB0cmFuc2xhdGlvbnMgb2Ygd2hpY2ggYXJlIHVzZWQgZm9yIHRyYW5zbGF0aW5nIHRoaXMgZW50aXR5LlxuICAgICAqIFRoaXMgaXMgb2Z0ZW4gdXNlZCB3aGVuIHRyYW5zbGF0aW9ucyBvZiBhbiBpdGVtIGFyZSBkZWZpbmVkIG9uIGl0cyBjb250YWluZXIgY2xhc3MuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctbG9jYWxlQ2xhc3MpXG4gICAgICovXG4gICAgbG9jYWxlQ2xhc3MgPyA6IHR5cGVvZiBCYXNlXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGBmYWxzZWAgdG8gZGlzYWJsZSBsb2NhbGl6YXRpb24gb2YgdGhpcyBvYmplY3QuXG4gICAgICovXG4gICAgbG9jYWxpemFibGUgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHByb3BlcnRpZXMgd2hpY2ggdmFsdWVzIHNob3VsZCBiZSB0cmFuc2xhdGVkIGF1dG9tYXRpY2FsbHkgdXBvbiBhIGxvY2FsZSBhcHBseWluZy5cbiAgICAgKiBJbiBjYXNlIHRoZXJlIGlzIGEgbmVlZCB0byBsb2NhbGl6ZSBub3QgdHlwaWNhbCB2YWx1ZSAobm90IGEgU3RyaW5nIHZhbHVlIG9yIGEgZmllbGQgd2l0aCByZS1kZWZpbmVkIHNldHRlci9nZXR0ZXIpLFxuICAgICAqIHlvdSBjb3VsZCB1c2UgJ2xvY2FsZUtleScgbWV0YSBjb25maWd1cmF0aW9uLlxuICAgICAqIEV4YW1wbGU6XG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctbG9jYWxpemFibGVQcm9wZXJ0aWVzKVxuICAgICAqL1xuICAgIGxvY2FsaXphYmxlUHJvcGVydGllcyA/IDogc3RyaW5nW11cbiAgICAvKipcbiAgICAgKiBXaWRnZXQncyBtYXJnaW4uIFRoaXMgbWF5IGJlIGNvbmZpZ3VyZWQgYXMgYSBzaW5nbGUgbnVtYmVyIG9yIGEgYFRSQkxgIGZvcm1hdCBzdHJpbmcuXG4gICAgICogbnVtZXJpYy1vbmx5IHZhbHVlcyBhcmUgaW50ZXJwcmV0ZWQgYXMgcGl4ZWxzLlxuICAgICAqL1xuICAgIG1hcmdpbiA/IDogbnVtYmVyfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoaXMgY29uZmlnIG9iamVjdCBjb250YWlucyB0aGUgZGVmYXVsdHMgZm9yIHRoZSBbTWFza10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L01hc2spIGNyZWF0ZWQgZm9yIHRoZVxuICAgICAqIFttYXNrZWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLW1hc2tlZCkgY29uZmlnLiBBbnkgcHJvcGVydGllcyBzcGVjaWZpZWQgaW4gdGhlIGBtYXNrZWRgIGNvbmZpZyB3aWxsIG92ZXJyaWRlIHRoZXNlXG4gICAgICogdmFsdWVzLlxuICAgICAqL1xuICAgIG1hc2tEZWZhdWx0cyA/IDogTWFza0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gYXBwbHkgdGhlIGRlZmF1bHQgbWFzayB0byB0aGUgd2lkZ2V0LiBBbHRlcm5hdGl2ZWx5LCB0aGlzIGNhbiBiZSB0aGUgbWFzayBtZXNzYWdlIG9yIGFcbiAgICAgKiBbTWFza10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L01hc2spIGNvbmZpZyBvYmplY3QuXG4gICAgICovXG4gICAgbWFza2VkID8gOiBib29sZWFufHN0cmluZ3xNYXNrQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhlIGVsZW1lbnQncyBtYXhIZWlnaHQuIENhbiBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYSBOdW1iZXIgKHdoaWNoIHdpbGwgaGF2ZSAncHgnIGFwcGVuZGVkKS4gTm90ZSB0aGF0XG4gICAgICogbGlrZSBbaGVpZ2h0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1oZWlnaHQpLCAqcmVhZGluZyogdGhlIHZhbHVlIHdpbGwgcmV0dXJuIHRoZSBudW1lcmljIHZhbHVlIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBtYXhIZWlnaHQgPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWZsb2F0aW5nKS4qXG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctbWF4aW1pemVPbk1vYmlsZSlcbiAgICAgKi9cbiAgICBtYXhpbWl6ZU9uTW9iaWxlID8gOiBudW1iZXJ8c3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIG1heCBudW1iZXIgb2YgY2hhcmFjdGVycyBmb3IgdGhlIGlucHV0IGZpZWxkXG4gICAgICovXG4gICAgbWF4TGVuZ3RoID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBUaGUgZWxlbWVudHMgbWF4V2lkdGguIENhbiBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYSBOdW1iZXIgKHdoaWNoIHdpbGwgaGF2ZSAncHgnIGFwcGVuZGVkKS4gTm90ZSB0aGF0XG4gICAgICogbGlrZSBbd2lkdGhdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLXdpZHRoKSwgKnJlYWRpbmcqIHRoZSB2YWx1ZSB3aWxsIHJldHVybiB0aGUgbnVtZXJpYyB2YWx1ZSBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgbWF4V2lkdGggPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiBUaGUgbWluaW11bSBzdHJpbmcgbGVuZ3RoIHRvIHRyaWdnZXIgdGhlIGZpbHRlcmluZywgb25seSByZWxldmFudCB3aGVuIFtlZGl0YWJsZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbWJvI2NvbmZpZy1lZGl0YWJsZSkgaXMgYHRydWVgLlxuICAgICAqIFtNb3JlLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLW1pbkNoYXJzKVxuICAgICAqL1xuICAgIG1pbkNoYXJzID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBUaGUgZWxlbWVudCdzIG1pbkhlaWdodC4gQ2FuIGJlIGVpdGhlciBhIFN0cmluZyBvciBhIE51bWJlciAod2hpY2ggd2lsbCBoYXZlICdweCcgYXBwZW5kZWQpLiBOb3RlIHRoYXRcbiAgICAgKiBsaWtlIFtoZWlnaHRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWhlaWdodCksICpyZWFkaW5nKiB0aGUgdmFsdWUgd2lsbCByZXR1cm4gdGhlIG51bWVyaWMgdmFsdWUgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIG1pbkhlaWdodCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSBtaW4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgZm9yIHRoZSBpbnB1dCBmaWVsZFxuICAgICAqL1xuICAgIG1pbkxlbmd0aCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIGVsZW1lbnRzIG1pbldpZHRoLiBDYW4gYmUgZWl0aGVyIGEgU3RyaW5nIG9yIGEgTnVtYmVyICh3aGljaCB3aWxsIGhhdmUgJ3B4JyBhcHBlbmRlZCkuIE5vdGUgdGhhdFxuICAgICAqIGxpa2UgW3dpZHRoXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy13aWR0aCksICpyZWFkaW5nKiB0aGUgdmFsdWUgd2lsbCByZXR1cm4gdGhlIG51bWVyaWMgdmFsdWUgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIG1pbldpZHRoID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGlzIGlzIGNvbmZpZ3VyZWQgYXMgYHRydWVgIGEgW1Jlc2l6ZU9ic2VydmVyXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUmVzaXplT2JzZXJ2ZXIpXG4gICAgICogaXMgdXNlZCB0byBtb25pdG9yIHRoaXMgZWxlbWVudCBmb3Igc2l6ZSBjaGFuZ2VzIGNhdXNlZCBieSBlaXRoZXIgc3R5bGUgbWFuaXB1bGF0aW9uLCBvciBieSBDU1NcbiAgICAgKiBsYXlvdXQuXG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctbW9uaXRvclJlc2l6ZSlcbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGltbWVkaWF0ZSBTZXQgdG8gYHRydWVgIHRvIHJlY2VpdmUgcmVzaXplIG5vdGlmaWNhdGlvbnMgaW1tZWRpYXRlbHkuXG4gICAgICovXG4gICAgbW9uaXRvclJlc2l6ZSA/IDogYm9vbGVhbnxvYmplY3RcbiAgICAvKipcbiAgICAgKiBBIGtleSB2YWx1ZSB3aGljaCwgd2hlbiB0eXBlZCBpbiBhIFttdWx0aVNlbGVjdF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbWJvI2NvbmZpZy1tdWx0aVNlbGVjdCkgQ29tYm8sIHNlbGVjdHMgdGhlXG4gICAgICogY3VycmVudGx5IGFjdGl2ZSBpdGVtIGluIHRoZSBwaWNrZXIsIGFuZCBjbGVhcnMgdGhlIGlucHV0IGZpZWxkIHJlYWR5IGZvciBhbm90aGVyXG4gICAgICogbWF0Y2ggdG8gYmUgdHlwZWQuXG4gICAgICovXG4gICAgbXVsdGlWYWx1ZVNlcGFyYXRvciA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgZmllbGQgd2hpY2ggaXMgdXNlZCBhcyBhIGtleSB0byBnZXQvc2V0IHZhbHVlcyBmcm9tL3RvIHRoZSBmaWVsZC5cbiAgICAgKiBVc2VkIHByaW9yIHRvIFtyZWZdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLXJlZikgYW5kIFtpZF0oI0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctaWQpIGluXG4gICAgICogW0NvbnRhaW5lci52YWx1ZXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIjcHJvcGVydHktdmFsdWVzKS5cbiAgICAgKiBbTW9yZS4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1uYW1lKVxuICAgICAqL1xuICAgIG5hbWUgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoaXMgaW1wbGllcyB0aGF0IHRoZSBwaWNrZXIgd2lsbCBkaXNwbGF5IGFuIGFuY2hvciBwb2ludGVyLCBidXQgYWxzbyBtZWFucyB0aGF0IHRoZSBwaWNrZXIgd2lsbCBhbGlnbiBjbG9zZXJcbiAgICAgKiB0byB0aGUgaW5wdXQgZmllbGQgc28gdGhhdCB0aGUgcG9pbnRlciBwaWVyY2VzIHRoZSBbcGlja2VyQWxpZ25FbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29tYm8jY29uZmlnLXBpY2tlckFsaWduRWxlbWVudClcbiAgICAgKi9cbiAgICBvdmVybGF5QW5jaG9yID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIHRoZSBbcGlja2VyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTGlzdCkgb24gaW5pdGlhbGl6YXRpb24uIFJldHVybnMgdGhlXG4gICAgICogW3BpY2tlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0xpc3QpIGluc3RhbmNlIGF0IHJ1bnRpbWUuXG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctcGlja2VyKVxuICAgICAqL1xuICAgIHBpY2tlciA/IDogTGlzdENvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHByb3BlcnR5IHRvIHdoaWNoIHRoZSBwaWNrZXIgc2hvdWxkIHNpemUgYW5kIGFsaWduIGl0c2VsZi5cbiAgICAgKi9cbiAgICBwaWNrZXJBbGlnbkVsZW1lbnQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFdpZHRoIG9mIHBpY2tlciwgZGVmYXVsdHMgdG8gdGhpcyBjb21ibydzIFtwaWNrZXJBbGlnbkVsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db21ibyNjb25maWctcGlja2VyQWxpZ25FbGVtZW50KSB3aWR0aFxuICAgICAqL1xuICAgIHBpY2tlcldpZHRoID8gOiBudW1iZXJ8c3RyaW5nXG4gICAgLyoqXG4gICAgICogVGV4dCB0byBkaXNwbGF5IGluIGVtcHR5IGZpZWxkLlxuICAgICAqL1xuICAgIHBsYWNlaG9sZGVyID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHdoZW4gYSB3aWRnZXQgaXMgcmVuZGVyZWQgaW50byBhbm90aGVyIHdpZGdldCdzIFtjb250ZW50RWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1jb250ZW50RWxlbWVudCksIGJ1dCBtdXN0XG4gICAgICogbm90IHBhcnRpY2lwYXRlIGluIHRoZSBzdGFuZGFyZCBsYXlvdXQgb2YgdGhhdCB3aWRnZXQsIGFuZCBtdXN0IGJlIHBvc2l0aW9uZWQgcmVsYXRpdmVseSB0byB0aGF0XG4gICAgICogd2lkZ2V0J3MgW2NvbnRlbnRFbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWNvbnRlbnRFbGVtZW50KS5cbiAgICAgKiBbTW9yZS4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1wb3NpdGlvbmVkKVxuICAgICAqL1xuICAgIHBvc2l0aW9uZWQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBQcmV2ZW50IHRvb2x0aXAgZnJvbSBiZWluZyBkaXNwbGF5ZWQgb24gdG91Y2ggZGV2aWNlcy4gVXNlZnVsIGZvciBleGFtcGxlIGZvciBidXR0b25zIHRoYXQgZGlzcGxheSBhXG4gICAgICogbWVudSBvbiBjbGljayBldGMsIHNpbmNlIHRoZSB0b29sdGlwIHdvdWxkIGJlIGRpc3BsYXllZCBhdCB0aGUgc2FtZSB0aW1lLlxuICAgICAqL1xuICAgIHByZXZlbnRUb29sdGlwT25Ub3VjaCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsbHkgYSBbRmlsdGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS91dGlsL0NvbGxlY3Rpb25GaWx0ZXIpIGNvbmZpZyBvYmplY3Qgd2hpY2ggdGhlIGNvbWJvIHNob3VsZCB1c2UgZm9yXG4gICAgICogZmlsdGVyaW5nIHVzaW5nIHRoZSB0eXBlZCB2YWx1ZS5cbiAgICAgKiBUaGlzIG1heSB1c2UgYSBgZmlsdGVyQnlgIHByb3BlcnR5IHRvIHRlc3QgaXRzIGB2YWx1ZWAgYWdhaW5zdCBhbnkgZmllbGQgaW4gdGhlIHBhc3NlZCByZWNvcmQuXG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctcHJpbWFyeUZpbHRlcilcbiAgICAgKi9cbiAgICBwcmltYXJ5RmlsdGVyID8gOiBDb2xsZWN0aW9uRmlsdGVyQ29uZmlnXG4gICAgLyoqXG4gICAgICogTWFrZXMgdGhlIGZpZWxkIHVubW9kaWZpYWJsZSBieSB1c2VyIGFjdGlvbi4gVGhlIGlucHV0IGFyZWEgaXMgbm90IGVkaXRhYmxlLCBhbmQgdHJpZ2dlcnNcbiAgICAgKiBhcmUgdW5yZXNwb25zaXZlLlxuICAgICAqIFtNb3JlLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLXJlYWRPbmx5KVxuICAgICAqL1xuICAgIHJlYWRPbmx5ID8gOiBib29sZWFuXG4gICAgcmVsYXlTdG9yZUV2ZW50cyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFByZWRlZmluZWQgc3R5bGUgdG8gdXNlIGZvciB0aGUgZmllbGQuIFBvc3NpYmxlIHZhbHVlcyBhcmU6XG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctcmVuZGl0aW9uKVxuICAgICAqL1xuICAgIHJlbmRpdGlvbiA/IDogJ291dGxpbmVkJ3wnZmlsbGVkJ3xzdHJpbmdcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYHRydWVgIHRvIGluZGljYXRlIHRoYXQgYSBgbnVsbGAgZmllbGQgdmFsdWUgaXMgdG8gYmUgbWFya2VkIGFzIGludmFsaWQuIFRoaXMgd2lsbFxuICAgICAqIG9wdGlvbmFsbHkgYXBwZW5kIGEgKiB0byB0aGUgZmllbGQgbGFiZWwgaWYgW3Nob3dSZXF1aXJlZEluZGljYXRvcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0ZpZWxkI3Byb3BlcnR5LXNob3dSZXF1aXJlZEluZGljYXRvcikgaXMgc2V0LlxuICAgICAqL1xuICAgIHJlcXVpcmVkID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBmaWVsZCBpcyBub3QgW3JlYWRPbmx5XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvRmllbGQjY29uZmlnLXJlYWRPbmx5KSwgdGhlbiBzZXR0aW5nIHRoaXMgb3B0aW9uIG1lYW5zIHRoYXQgcHJlc3NpbmdcbiAgICAgKiB0aGUgPGtiZD5Fc2NhcGU8L2tiZD4ga2V5IGFmdGVyIGVkaXRpbmcgdGhlIGZpZWxkIHdpbGwgcmV2ZXJ0IHRoZSBmaWVsZCB0byB0aGUgdmFsdWUgaXQgaGFkIHdoZW5cbiAgICAgKiB0aGUgdXNlciBmb2N1c2VkIHRoZSBmaWVsZC4gSWYgdGhlIGZpZWxkIGlzICpub3QqIGNoYW5nZWQgZnJvbSB3aGVuIGZvY3VzZWQsIHRoZSBbY2xlYXJhYmxlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvRmllbGQjY29uZmlnLWNsZWFyYWJsZSlcbiAgICAgKiBiZWhhdmlvdXIgd2lsbCBiZSBhY3RpdmF0ZWQuXG4gICAgICovXG4gICAgcmV2ZXJ0T25Fc2NhcGUgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYHRydWVgIHRvIGhhdmUgdGhlIGNvbXBvbmVudCBkaXNwbGF5IGEgdHJhbnNsdWNlbnQgcmlwcGxlIHdoZW4gaXRzXG4gICAgICogW2ZvY3VzRWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1mb2N1c0VsZW1lbnQpLCBvciBbZWxlbWVudF0oI0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1lbGVtZW50KSBpcyB0YXBwZWQgPGVtPmlmIHRoZVxuICAgICAqIGN1cnJlbnQgdGhlbWUgc3VwcG9ydHMgcmlwcGxlczwvZW0+LiBPdXQgb2YgdGhlIGJveCwgb25seSB0aGUgTWF0ZXJpYWwgdGhlbWUgc3VwcG9ydHMgcmlwcGxlcy5cbiAgICAgKiBbTW9yZS4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1yaXBwbGUpXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtkZWxlZ2F0ZV0gQSBDU1Mgc2VsZWN0b3IgdG8gZmlsdGVyIHdoaWNoIGNoaWxkIGVsZW1lbnRzIHRyaWdnZXIgcmlwcGxlcy4gQnkgZGVmYXVsdCwgdGhlIHJpcHBsZSBpcyBjbGlwcGVkIHRvIHRoZSB0cmlnZ2VyaW5nIGVsZW1lbnQuXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb2xvcl0gQSBDU1MgY29sb3IgbmFtZSBvciBzcGVjaWZpY2F0aW9uLlxuICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcmFkaXVzXSBUaGUgZW5kaW5nIHJhZGl1cyBvZiB0aGUgcmlwcGxlLiBOb3RlIHRoYXQgaXQgd2lsbCBiZSBjbGlwcGVkIGJ5IHRoZSB0YXJnZXQgZWxlbWVudCBieSBkZWZhdWx0LlxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY2xpcF0gQSBzdHJpbmcgd2hpY2ggZGVzY3JpYmVzIGhvdyB0byBjbGlwIHRoZSByaXBwbGUgaWYgaXQgaXMgbm90IHRvIGJlIGNsaXBwZWQgdG8gdGhlIGRlZmF1bHQgZWxlbWVudC4gRWl0aGVyIHRoZSBwcm9wZXJ0eSBvZiB0aGUgd2lkZ2V0IHRvIHVzZSBhcyB0aGUgY2xpcHBpbmcgZWxlbWVudCwgb3IgYSBzZWxlY3RvciB0byBhbGxvdyBjbGlwcGluZyB0byB0aGUgY2xvc2VzdCBtYXRjaGluZyBhbmNlc3RvciB0byB0aGUgdGFyZ2V0IGVsZW1lbnQuXG4gICAgICovXG4gICAgcmlwcGxlID8gOiBib29sZWFufG9iamVjdFxuICAgIC8qKlxuICAgICAqIFRoZSBBUklBIHJvbGUgdG8gYXBwbHkgdG8gdGhpcyB3aWRnZXQncyBlbGVtZW50LiBCeSBkZWZhdWx0LCB0aGlzIGlzIHNldCB0byBgJ3ByZXNlbnRhdGlvbidgIHRvIGF2b2lkXG4gICAgICogYWNjaWRlbnRhbGx5IGFwcGx5aW5nIGEgcm9sZSB3aGljaCBtYXkgaW50ZXJmZXJlIHdpdGggc2NyZWVuIHJlYWRlcnMuXG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctcm9sZSlcbiAgICAgKi9cbiAgICByb2xlID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBJZiB5b3UgYXJlIHJlbmRlcmluZyB0aGlzIHdpZGdldCB0byBhIHNoYWRvdyByb290IGluc2lkZSBhIHdlYiBjb21wb25lbnQsIHNldCB0aGlzIGNvbmZpZyB0byB0aGUgc2hhZG93Um9vdC4gSWYgbm90IGluc2lkZSBhIHdlYiBjb21wb25lbnQsIHNldCBpdCB0byBgZG9jdW1lbnQuYm9keWBcbiAgICAgKi9cbiAgICByb290RWxlbWVudCA/IDogU2hhZG93Um9vdHxIVE1MRWxlbWVudFxuICAgIC8qKlxuICAgICAqIFRoaXMgbWF5IGJlIGNvbmZpZ3VyZWQgYXMgYHRydWVgIHRvIG1ha2UgdGhlIHdpZGdldCdzIGVsZW1lbnQgdXNlIHRoZSBgZGlyZWN0aW9uOnJ0bGAgc3R5bGUuXG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctcnRsKVxuICAgICAqL1xuICAgIHJ0bCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgd2hhdCB0byBkbyBpZiBkb2N1bWVudCBpcyBzY3JvbGxlZCB3aGlsZSBXaWRnZXQgaXMgdmlzaWJsZSAob25seSByZWxldmFudCB3aGVuIGZsb2F0aW5nIGlzIHNldCB0byBgdHJ1ZWApLlxuICAgICAqIFZhbGlkIHZhbHVlczogwrRudWxswrQ6IGRvIG5vdGhpbmcsIMK0aGlkZcK0OiBoaWRlIHRoZSB3aWRnZXQgb3IgwrRyZWFsaWduwrQ6IHJlYWxpZ24gdG8gdGhlIHRhcmdldCBpZiBwb3NzaWJsZS5cbiAgICAgKi9cbiAgICBzY3JvbGxBY3Rpb24gPyA6ICdoaWRlJ3wncmVhbGlnbid8bnVsbFxuICAgIC8qKlxuICAgICAqIFRoZSB0ZXh0IGluIHRoZSBzZWFyY2ggYm94LCB3aGljaCB3aWxsIGZpbHRlciB0aGUgbGlzdCB0byBtYXRjaGluZyByZWNvcmRzIG9ubHkuIFNlZSBhbHNvIFtmaWx0ZXJPcGVyYXRvcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy1maWx0ZXJPcGVyYXRvcikuXG4gICAgICovXG4gICAgc2VhcmNoVGV4dCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogKk9ubHkgdmFsaWQgaWYgdGhpcyBXaWRnZXQgaXMgW2Zsb2F0aW5nXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykuKlxuICAgICAqIFtNb3JlLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLXNob3dBbmltYXRpb24pXG4gICAgICovXG4gICAgc2hvd0FuaW1hdGlvbiA/IDogYm9vbGVhbnxvYmplY3RcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgc2hvd3MgYW4gXCJBcHBseVwiIGJ1dHRvbiBpbiBwbGFjZSBvZiB0aGUgXCJTZWxlY3QgQWxsXCIgYnV0dG9uLCBhbmQgZG9lcyBub3RcbiAgICAgKiByYWlzZSBgY2hhbmdlYCBldmVudHMgdW50aWwgdGhlIEFwcGx5IGJ1dHRvbiBpcyBjbGlja2VkLlxuICAgICAqL1xuICAgIHNob3dBcHBseUJ1dHRvbiA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIGB0cnVlYCB0byBhdXRvbWF0aWNhbGx5IGRpc3BsYXkgYSAqIGFmdGVyIHRoZSBsYWJlbCBmb3IgdGhpcyBmaWVsZCB3aGVuIGl0IGlzIFtyZXF1aXJlZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0ZpZWxkI3Byb3BlcnR5LXJlcXVpcmVkKS5cbiAgICAgKi9cbiAgICBzaG93UmVxdWlyZWRJbmRpY2F0b3IgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIG5vdCBzaG93IHRoZSB0b29sdGlwIHdoZW4gdGhpcyB3aWRnZXQgaXMgW2Rpc2FibGVkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWRpc2FibGVkKVxuICAgICAqL1xuICAgIHNob3dUb29sdGlwV2hlbkRpc2FibGVkID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCwgY29tcGxldGVseSBieXBhc3NlcyB2YWxpZGF0aW9uIGxvZ2ljIChjb3VsZCBiZSB1c2VyZnVsIGlmIHlvdXIgZmllbGQgaXMgbm90IGBlZGl0YWJsZWBcbiAgICAgKiB0byB0aGUgdXNlcikuXG4gICAgICovXG4gICAgc2tpcFZhbGlkYXRpb24gPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBQcm9ncmFtbWF0aWMgY29udHJvbCBvdmVyIGhvdyBtYW55IGNvbHVtbnMgdG8gc3BhbiB3aGVuIHVzZWQgaW4gYSBncmlkIGxheW91dC5cbiAgICAgKi9cbiAgICBzcGFuID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBuYXRpdmUgYHNwZWxsY2hlY2tgIHByb3BlcnR5IG9mIHRoZSB1bmRlcmx5aW5nIGlucHV0IGVsZW1lbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVmZXIgdG9cbiAgICAgKiBbTUROXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0dsb2JhbF9hdHRyaWJ1dGVzL3NwZWxsY2hlY2spXG4gICAgICovXG4gICAgc3BlbGxDaGVjayA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFN0b3JlIHVzZWQgdG8gcG9wdWxhdGUgaXRlbXMuIEFsc28gYWNjZXB0cyBhIFN0b3JlIGNvbmZpZyBvYmplY3RcbiAgICAgKi9cbiAgICBzdG9yZSA/IDogU3RvcmV8U3RvcmVDb25maWdcbiAgICAvKipcbiAgICAgKiBBIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBbdGFiXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvVGFiKSBjcmVhdGVkIGZvciB0aGlzIHdpZGdldCB3aGVuIGl0IGlzIHBsYWNlZCBpbiBhXG4gICAgICogW1RhYlBhbmVsXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvVGFiUGFuZWwpLiBGb3IgZXhhbXBsZSwgdGhpcyBjb25maWcgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgaWNvbiBvZiB0aGUgYHRhYmAgZm9yXG4gICAgICogdGhpcyB3aWRnZXQ6XG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctdGFiKVxuICAgICAqL1xuICAgIHRhYiA/IDogYm9vbGVhbnxUYWJDb25maWdcbiAgICAvKipcbiAgICAgKiBUaGUgdGFiIGluZGV4IG9mIHRoZSBpbnB1dCBmaWVsZCBvciBmaWVsZHMsIG9yIGBudWxsYCBmb3IgbmF0dXJhbCB0YWIgb3JkZXIgKHJlY29tbWVuZGVkKS4gU2V0dGluZyB0byBgMGBcbiAgICAgKiBpcyBlcXVpdmFsZW50IHRvIG5hdHVyYWwgdGFiIG9yZGVyLCBidXQgaXMgdW5uZWNlc3NhcnkgZm9yIGZpZWxkcyBzaW5jZSB0aGV5IGFyZSBuYXR1cmFsbHkgdGFiYmFibGVcbiAgICAgKiAoaS5lLiwgYWNjZXNzaWJsZSB2aWEgdGhlIFRBQiBrZXkpLiBTZXR0aW5nIHRvIGAtMWAgZGlzYWJsZXMgdGFiYmFiaWxpdHkgYnV0IGFsbG93cyBmb3IgZm9jdXMgdG8gYmUgc2V0XG4gICAgICogdG8gdGhlIGVsZW1lbnQgcHJvZ3JhbW1hdGljYWxseS5cbiAgICAgKiBbTW9yZS4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy10YWJJbmRleClcbiAgICAgKi9cbiAgICB0YWJJbmRleCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogVGV4dCBhbGlnbm1lbnQ6ICdsZWZ0JywgJ2NlbnRlcicgb3IgJ3JpZ2h0Jy4gQWxzbyBhY2NlcHRzIGRpcmVjdGlvbiBuZXV0cmFsICdzdGFydCcgYW5kICdlbmQnLlxuICAgICAqIFtNb3JlLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLXRleHRBbGlnbilcbiAgICAgKi9cbiAgICB0ZXh0QWxpZ24gPyA6ICdsZWZ0J3wnY2VudGVyJ3wncmlnaHQnfCdzdGFydCd8J2VuZCdcbiAgICAvKipcbiAgICAgKiBBIHRpdGxlIHRvIGRpc3BsYXkgZm9yIHRoZSB3aWRnZXQuIE9ubHkgaW4gZWZmZWN0IHdoZW4gaW5zaWRlIGEgY29udGFpbmVyIHRoYXQgdXNlcyBpdCAoc3VjaCBhcyBUYWJQYW5lbClcbiAgICAgKi9cbiAgICB0aXRsZSA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVG9vbHRpcCBmb3IgdGhlIHdpZGdldCwgZWl0aGVyIGFzIGEgc3RyaW5nIG9yIGFzIGEgVG9vbHRpcCBjb25maWcgb2JqZWN0LlxuICAgICAqIFtNb3JlLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLXRvb2x0aXApXG4gICAgICovXG4gICAgdG9vbHRpcCA/IDogc3RyaW5nfFRvb2x0aXBDb25maWd8bnVsbFxuICAgIC8qKlxuICAgICAqIEhvdyB0byBxdWVyeSB0aGUgc3RvcmUgdXBvbiBjbGljayBvZiB0aGUgZXhwYW5kIHRyaWdnZXIuIFNwZWNpZnkgb25lIG9mIHRoZXNlIHZhbHVlczpcbiAgICAgKiBbTW9yZS4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvd2lkZ2V0L0NoZWNrbGlzdEZpbHRlckNvbWJvI2NvbmZpZy10cmlnZ2VyQWN0aW9uKVxuICAgICAqL1xuICAgIHRyaWdnZXJBY3Rpb24gPyA6ICdhbGwnfCdsYXN0J3xudWxsXG4gICAgLyoqXG4gICAgICogVGhlIHRyaWdnZXJzIHRvIGFkZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSBpbnB1dCBmaWVsZC4gRWFjaCBwcm9wZXJ0eSBuYW1lIGlzIHRoZSByZWZlcmVuY2UgYnkgd2hpY2hcbiAgICAgKiBhbiBpbnN0YW50aWF0ZWQgVHJpZ2dlciBXaWRnZXQgbWF5IGJlIHJldHJpZXZlZCBmcm9tIHRoZSBsaXZlIGB0cmlnZ2Vyc2AgcHJvcGVydHkuXG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctdHJpZ2dlcnMpXG4gICAgICovXG4gICAgdHJpZ2dlcnMgPyA6IFJlY29yZDxzdHJpbmcsIEZpZWxkVHJpZ2dlckNvbmZpZz5cbiAgICB0eXBlID8gOiAnY2hlY2tsaXN0ZmlsdGVyY29tYm8nXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIENTUyBjbGFzcyBuYW1lIHN1ZmZpeGVzIHRvIGFwcGx5IHRvIHRoZSBlbGVtZW50cyByZW5kZXJlZCBieSB0aGlzIHdpZGdldC4gVGhpcyBtYXkgYmUgc3BlY2lmaWVkXG4gICAgICogYXMgYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nLCBhbiBhcnJheSBvZiBzdHJpbmdzLCBvciBhcyBhbiBvYmplY3QgaW4gd2hpY2ggcHJvcGVydHkgbmFtZXMgd2l0aCB0cnV0aHlcbiAgICAgKiB2YWx1ZXMgYXJlIHVzZWQgYXMgdGhlIGNsYXNzIG5hbWVzLlxuICAgICAqIFtNb3JlLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLXVpKVxuICAgICAqL1xuICAgIHVpID8gOiBzdHJpbmd8b2JqZWN0XG4gICAgLyoqXG4gICAgICogYHRydWVgIHRvIGNhdXNlIHRoZSBmaWVsZCB0byBiZSBpbiBhbiBpbnZhbGlkIHN0YXRlIHdoaWxlIHRoZSB0eXBlZCBmaWx0ZXIgc3RyaW5nIGRvZXMgbm90IG1hdGNoIGEgcmVjb3JkIGluIHRoZSBzdG9yZS5cbiAgICAgKi9cbiAgICB2YWxpZGF0ZUZpbHRlciA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIG5vdCBoaWdobGlnaHQgYSBmaWVsZCBhcyBpbnZhbGlkIHdoaWxlIHR5cGluZywgdG8gaW5zdGVhZCBzaG93IGl0IG9uIEVOVEVSIGtleSBwcmVzc1xuICAgICAqIG9yIHNpbWlsYXIuXG4gICAgICovXG4gICAgdmFsaWRhdGVPbklucHV0ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhpcyBDb21ibyBib3guIEFuIGFycmF5IG9mIHJlY29yZCBpZHMuXG4gICAgICovXG4gICAgdmFsdWUgPyA6IHN0cmluZ1tdfG51bWJlcltdXG4gICAgLyoqXG4gICAgICogRmllbGQgdXNlZCBmb3IgaXRlbSB2YWx1ZSB3aGVuIHBvcHVsYXRpbmcgZnJvbSBzdG9yZS4gU2V0dGluZyB0aGlzIHRvIGBudWxsYCB3aWxsXG4gICAgICogeWllbGQgdGhlIHNlbGVjdGVkIHJlY29yZCBhcyB0aGUgQ29tYm8ncyBbdmFsdWVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db21ibyNwcm9wZXJ0eS12YWx1ZSkuXG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWctdmFsdWVGaWVsZClcbiAgICAgKi9cbiAgICB2YWx1ZUZpZWxkID8gOiBzdHJpbmd8bnVsbFxuICAgIC8qKlxuICAgICAqIEEgd2lkZ2V0cyB3ZWlnaHQgZGV0ZXJtaW5lcyBpdHMgcG9zaXRpb24gYW1vbmcgc2libGluZ3Mgd2hlbiBhZGRlZCB0byBhIFtDb250YWluZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIpLlxuICAgICAqIEhpZ2hlciB3ZWlnaHRzIGdvIGZ1cnRoZXIgZG93bi5cbiAgICAgKi9cbiAgICB3ZWlnaHQgPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIFdpZGdldCdzIHdpZHRoLCB1c2VkIHRvIHNldCBlbGVtZW50IGBzdHlsZS53aWR0aGAuIEVpdGhlciBzcGVjaWZ5IGEgdmFsaWQgd2lkdGggc3RyaW5nIG9yIGEgbnVtYmVyLCB3aGljaFxuICAgICAqIHdpbGwgZ2V0ICdweCcgYXBwZW5kZWQuIFdlIHJlY29tbWVuZCB1c2luZyBDU1MgYXMgdGhlIHByaW1hcnkgd2F5IHRvIGNvbnRyb2wgd2lkdGgsIGJ1dCBpbiBzb21lIGNhc2VzXG4gICAgICogdGhpcyBjb25maWcgaXMgY29udmVuaWVudC5cbiAgICAgKi9cbiAgICB3aWR0aCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSB4IHBvc2l0aW9uIGZvciB0aGUgd2lkZ2V0LlxuICAgICAqIFtNb3JlLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jY29uZmlnLXgpXG4gICAgICovXG4gICAgeCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIHkgcG9zaXRpb24gZm9yIHRoZSB3aWRnZXQuXG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNjb25maWcteSlcbiAgICAgKi9cbiAgICB5ID8gOiBudW1iZXJcblxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvciA6ICdicnludHVtLWNoZWNrbGlzdC1maWx0ZXItY29tYm8nLFxuICAgIHRlbXBsYXRlIDogJydcbn0pXG5leHBvcnQgY2xhc3MgQnJ5bnR1bUNoZWNrbGlzdEZpbHRlckNvbWJvQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgcHVibGljIHN0YXRpYyBpbnN0YW5jZUNsYXNzID0gQ2hlY2tsaXN0RmlsdGVyQ29tYm87XG5cbiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlTmFtZSA9ICdDaGVja2xpc3RGaWx0ZXJDb21ibyc7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtRXZlbnRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ29uQWN0aW9uJyxcbiAgICAgICAgJ29uQmVmb3JlRGVzdHJveScsXG4gICAgICAgICdvbkJlZm9yZUhpZGUnLFxuICAgICAgICAnb25CZWZvcmVTaG93JyxcbiAgICAgICAgJ29uQ2F0Y2hBbGwnLFxuICAgICAgICAnb25DaGFuZ2UnLFxuICAgICAgICAnb25DbGVhcicsXG4gICAgICAgICdvbkRlc3Ryb3knLFxuICAgICAgICAnb25FbGVtZW50Q3JlYXRlZCcsXG4gICAgICAgICdvbkZvY3VzSW4nLFxuICAgICAgICAnb25Gb2N1c091dCcsXG4gICAgICAgICdvbkhpZGUnLFxuICAgICAgICAnb25JbnB1dCcsXG4gICAgICAgICdvblBhaW50JyxcbiAgICAgICAgJ29uUmVhZE9ubHknLFxuICAgICAgICAnb25SZWNvbXBvc2UnLFxuICAgICAgICAnb25SZXNpemUnLFxuICAgICAgICAnb25TZWxlY3QnLFxuICAgICAgICAnb25TaG93JyxcbiAgICAgICAgJ29uVHJpZ2dlcidcbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUZlYXR1cmVOYW1lczogc3RyaW5nW10gPSBbXG5cbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUNvbmZpZ3M6IHN0cmluZ1tdID0gQnJ5bnR1bUNoZWNrbGlzdEZpbHRlckNvbWJvQ29tcG9uZW50LmJyeW50dW1GZWF0dXJlTmFtZXMuY29uY2F0KFtcbiAgICAgICAgJ2Fkb3B0JyxcbiAgICAgICAgJ2FsaWduJyxcbiAgICAgICAgJ2FsaWduU2VsZicsXG4gICAgICAgICdhbmNob3InLFxuICAgICAgICAnYXBwZW5kVG8nLFxuICAgICAgICAnYXJpYURlc2NyaXB0aW9uJyxcbiAgICAgICAgJ2FyaWFMYWJlbCcsXG4gICAgICAgICdhdXRvQ29tcGxldGUnLFxuICAgICAgICAnYXV0b0V4cGFuZCcsXG4gICAgICAgICdhdXRvU2VsZWN0JyxcbiAgICAgICAgJ2JhZGdlJyxcbiAgICAgICAgJ2J1YmJsZUV2ZW50cycsXG4gICAgICAgICdjYWNoZUxhc3RSZXN1bHQnLFxuICAgICAgICAnY2FsbE9uRnVuY3Rpb25zJyxcbiAgICAgICAgJ2Nhc2VTZW5zaXRpdmUnLFxuICAgICAgICAnY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zJyxcbiAgICAgICAgJ2NlbnRlcmVkJyxcbiAgICAgICAgJ2NoZWNrVmFsaWRpdHknLFxuICAgICAgICAnY2hpcFZpZXcnLFxuICAgICAgICAnY2xlYXJhYmxlJyxcbiAgICAgICAgJ2NsZWFyVGV4dE9uUGlja2VySGlkZScsXG4gICAgICAgICdjbGVhclRleHRPblNlbGVjdGlvbicsXG4gICAgICAgICdjbGVhcldoZW5JbnB1dEVtcHR5JyxcbiAgICAgICAgJ2NscycsXG4gICAgICAgICdjb2xvcicsXG4gICAgICAgICdjb2x1bW4nLFxuICAgICAgICAnY29uZmlnJyxcbiAgICAgICAgJ2NvbnN0cmFpblRvJyxcbiAgICAgICAgJ2NvbnRhaW5lcicsXG4gICAgICAgICdjb250YWluVmFsdWVzJyxcbiAgICAgICAgJ2NvbnRlbnRFbGVtZW50Q2xzJyxcbiAgICAgICAgJ2NyZWF0ZU9uVW5tYXRjaGVkJyxcbiAgICAgICAgJ2RhdGFGaWVsZCcsXG4gICAgICAgICdkYXRhc2V0JyxcbiAgICAgICAgJ2RlZmF1bHRCaW5kUHJvcGVydHknLFxuICAgICAgICAnZGV0ZWN0Q1NTQ29tcGF0aWJpbGl0eUlzc3VlcycsXG4gICAgICAgICdkaXNhYmxlZCcsXG4gICAgICAgICdkaXNwbGF5RmllbGQnLFxuICAgICAgICAnZGlzcGxheVZhbHVlUmVuZGVyZXInLFxuICAgICAgICAnZG9jaycsXG4gICAgICAgICdkcmFnZ2FibGUnLFxuICAgICAgICAnZWRpdGFibGUnLFxuICAgICAgICAnZWxlbWVudEF0dHJpYnV0ZXMnLFxuICAgICAgICAnZW1wdHlUZXh0JyxcbiAgICAgICAgJ2VuY29kZUZpbHRlclBhcmFtcycsXG4gICAgICAgICdleHRyYURhdGEnLFxuICAgICAgICAnZmlsdGVyT25FbnRlcicsXG4gICAgICAgICdmaWx0ZXJPcGVyYXRvcicsXG4gICAgICAgICdmaWx0ZXJQYXJhbU5hbWUnLFxuICAgICAgICAnZmlsdGVyU2VsZWN0ZWQnLFxuICAgICAgICAnZmxleCcsXG4gICAgICAgICdmbG9hdGluZycsXG4gICAgICAgICdoZWlnaHQnLFxuICAgICAgICAnaGlkZGVuJyxcbiAgICAgICAgJ2hpZGVBbmltYXRpb24nLFxuICAgICAgICAnaGlkZVBpY2tlck9uU2VsZWN0JyxcbiAgICAgICAgJ2hpZGVUcmlnZ2VyJyxcbiAgICAgICAgJ2hpZ2hsaWdodEV4dGVybmFsQ2hhbmdlJyxcbiAgICAgICAgJ2hpbnQnLFxuICAgICAgICAnaGludEh0bWwnLFxuICAgICAgICAnaWQnLFxuICAgICAgICAnaWdub3JlUGFyZW50UmVhZE9ubHknLFxuICAgICAgICAnaW5saW5lJyxcbiAgICAgICAgJ2lubGluZVBpY2tlcicsXG4gICAgICAgICdpbnB1dEFsaWduJyxcbiAgICAgICAgJ2lucHV0QXR0cmlidXRlcycsXG4gICAgICAgICdpbnB1dFRhZycsXG4gICAgICAgICdpbnB1dFR5cGUnLFxuICAgICAgICAnaW5wdXRXaWR0aCcsXG4gICAgICAgICdpbnNlcnRCZWZvcmUnLFxuICAgICAgICAnaW5zZXJ0Rmlyc3QnLFxuICAgICAgICAnaXRlbXMnLFxuICAgICAgICAna2V5TWFwJyxcbiAgICAgICAgJ2tleVN0cm9rZUNoYW5nZURlbGF5JyxcbiAgICAgICAgJ2tleVN0cm9rZUZpbHRlckRlbGF5JyxcbiAgICAgICAgJ2xhYmVsJyxcbiAgICAgICAgJ2xhYmVsQ2xzJyxcbiAgICAgICAgJ2xhYmVsUG9zaXRpb24nLFxuICAgICAgICAnbGFiZWxzJyxcbiAgICAgICAgJ2xhYmVsV2lkdGgnLFxuICAgICAgICAnbGlzdENscycsXG4gICAgICAgICdsaXN0ZW5lcnMnLFxuICAgICAgICAnbGlzdEl0ZW1QaWxsVHBsJyxcbiAgICAgICAgJ2xpc3RJdGVtVHBsJyxcbiAgICAgICAgJ2xvY2FsZUNsYXNzJyxcbiAgICAgICAgJ2xvY2FsaXphYmxlJyxcbiAgICAgICAgJ2xvY2FsaXphYmxlUHJvcGVydGllcycsXG4gICAgICAgICdtYXJnaW4nLFxuICAgICAgICAnbWFza0RlZmF1bHRzJyxcbiAgICAgICAgJ21hc2tlZCcsXG4gICAgICAgICdtYXhIZWlnaHQnLFxuICAgICAgICAnbWF4aW1pemVPbk1vYmlsZScsXG4gICAgICAgICdtYXhMZW5ndGgnLFxuICAgICAgICAnbWF4V2lkdGgnLFxuICAgICAgICAnbWluQ2hhcnMnLFxuICAgICAgICAnbWluSGVpZ2h0JyxcbiAgICAgICAgJ21pbkxlbmd0aCcsXG4gICAgICAgICdtaW5XaWR0aCcsXG4gICAgICAgICdtb25pdG9yUmVzaXplJyxcbiAgICAgICAgJ211bHRpVmFsdWVTZXBhcmF0b3InLFxuICAgICAgICAnbmFtZScsXG4gICAgICAgICdvdmVybGF5QW5jaG9yJyxcbiAgICAgICAgJ3BpY2tlcicsXG4gICAgICAgICdwaWNrZXJBbGlnbkVsZW1lbnQnLFxuICAgICAgICAncGlja2VyV2lkdGgnLFxuICAgICAgICAncGxhY2Vob2xkZXInLFxuICAgICAgICAncG9zaXRpb25lZCcsXG4gICAgICAgICdwcmV2ZW50VG9vbHRpcE9uVG91Y2gnLFxuICAgICAgICAncHJpbWFyeUZpbHRlcicsXG4gICAgICAgICdyZWFkT25seScsXG4gICAgICAgICdyZWxheVN0b3JlRXZlbnRzJyxcbiAgICAgICAgJ3JlbmRpdGlvbicsXG4gICAgICAgICdyZXF1aXJlZCcsXG4gICAgICAgICdyZXZlcnRPbkVzY2FwZScsXG4gICAgICAgICdyaXBwbGUnLFxuICAgICAgICAncm9sZScsXG4gICAgICAgICdyb290RWxlbWVudCcsXG4gICAgICAgICdydGwnLFxuICAgICAgICAnc2Nyb2xsQWN0aW9uJyxcbiAgICAgICAgJ3NlYXJjaFRleHQnLFxuICAgICAgICAnc2hvd0FuaW1hdGlvbicsXG4gICAgICAgICdzaG93QXBwbHlCdXR0b24nLFxuICAgICAgICAnc2hvd1JlcXVpcmVkSW5kaWNhdG9yJyxcbiAgICAgICAgJ3Nob3dUb29sdGlwV2hlbkRpc2FibGVkJyxcbiAgICAgICAgJ3NraXBWYWxpZGF0aW9uJyxcbiAgICAgICAgJ3NwYW4nLFxuICAgICAgICAnc3BlbGxDaGVjaycsXG4gICAgICAgICdzdG9yZScsXG4gICAgICAgICd0YWInLFxuICAgICAgICAndGFiSW5kZXgnLFxuICAgICAgICAndGV4dEFsaWduJyxcbiAgICAgICAgJ3RpdGxlJyxcbiAgICAgICAgJ3Rvb2x0aXAnLFxuICAgICAgICAndHJpZ2dlckFjdGlvbicsXG4gICAgICAgICd0cmlnZ2VycycsXG4gICAgICAgICd0eXBlJyxcbiAgICAgICAgJ3VpJyxcbiAgICAgICAgJ3ZhbGlkYXRlRmlsdGVyJyxcbiAgICAgICAgJ3ZhbGlkYXRlT25JbnB1dCcsXG4gICAgICAgICd2YWx1ZScsXG4gICAgICAgICd2YWx1ZUZpZWxkJyxcbiAgICAgICAgJ3dlaWdodCcsXG4gICAgICAgICd3aWR0aCcsXG4gICAgICAgICd4JyxcbiAgICAgICAgJ3knXG4gICAgXSk7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtQ29uZmlnc09ubHk6IHN0cmluZ1tdID0gW1xuICAgICAgICAnYWRvcHQnLFxuICAgICAgICAnYWxpZ24nLFxuICAgICAgICAnYW5jaG9yJyxcbiAgICAgICAgJ2FyaWFEZXNjcmlwdGlvbicsXG4gICAgICAgICdhcmlhTGFiZWwnLFxuICAgICAgICAnYXV0b0NvbXBsZXRlJyxcbiAgICAgICAgJ2F1dG9FeHBhbmQnLFxuICAgICAgICAnYXV0b1NlbGVjdCcsXG4gICAgICAgICdidWJibGVFdmVudHMnLFxuICAgICAgICAnY2FjaGVMYXN0UmVzdWx0JyxcbiAgICAgICAgJ2Nhc2VTZW5zaXRpdmUnLFxuICAgICAgICAnY2VudGVyZWQnLFxuICAgICAgICAnY2hlY2tWYWxpZGl0eScsXG4gICAgICAgICdjaGlwVmlldycsXG4gICAgICAgICdjbGVhcmFibGUnLFxuICAgICAgICAnY2xlYXJUZXh0T25QaWNrZXJIaWRlJyxcbiAgICAgICAgJ2NsZWFyVGV4dE9uU2VsZWN0aW9uJyxcbiAgICAgICAgJ2NsZWFyV2hlbklucHV0RW1wdHknLFxuICAgICAgICAnY29sb3InLFxuICAgICAgICAnY29uZmlnJyxcbiAgICAgICAgJ2NvbnN0cmFpblRvJyxcbiAgICAgICAgJ2NvbnRhaW5lcicsXG4gICAgICAgICdjb250YWluVmFsdWVzJyxcbiAgICAgICAgJ2NvbnRlbnRFbGVtZW50Q2xzJyxcbiAgICAgICAgJ2NyZWF0ZU9uVW5tYXRjaGVkJyxcbiAgICAgICAgJ2RhdGFGaWVsZCcsXG4gICAgICAgICdkZWZhdWx0QmluZFByb3BlcnR5JyxcbiAgICAgICAgJ2RldGVjdENTU0NvbXBhdGliaWxpdHlJc3N1ZXMnLFxuICAgICAgICAnZGlzcGxheUZpZWxkJyxcbiAgICAgICAgJ2Rpc3BsYXlWYWx1ZVJlbmRlcmVyJyxcbiAgICAgICAgJ2RvY2snLFxuICAgICAgICAnZHJhZ2dhYmxlJyxcbiAgICAgICAgJ2VsZW1lbnRBdHRyaWJ1dGVzJyxcbiAgICAgICAgJ2VtcHR5VGV4dCcsXG4gICAgICAgICdlbmNvZGVGaWx0ZXJQYXJhbXMnLFxuICAgICAgICAnZmlsdGVyT25FbnRlcicsXG4gICAgICAgICdmaWx0ZXJQYXJhbU5hbWUnLFxuICAgICAgICAnZmlsdGVyU2VsZWN0ZWQnLFxuICAgICAgICAnZmxvYXRpbmcnLFxuICAgICAgICAnaGlkZUFuaW1hdGlvbicsXG4gICAgICAgICdoaWRlUGlja2VyT25TZWxlY3QnLFxuICAgICAgICAnaGlkZVRyaWdnZXInLFxuICAgICAgICAnaGlnaGxpZ2h0RXh0ZXJuYWxDaGFuZ2UnLFxuICAgICAgICAnaGludCcsXG4gICAgICAgICdoaW50SHRtbCcsXG4gICAgICAgICdpZ25vcmVQYXJlbnRSZWFkT25seScsXG4gICAgICAgICdpbmxpbmUnLFxuICAgICAgICAnaW5saW5lUGlja2VyJyxcbiAgICAgICAgJ2lucHV0QWxpZ24nLFxuICAgICAgICAnaW5wdXRBdHRyaWJ1dGVzJyxcbiAgICAgICAgJ2lucHV0VGFnJyxcbiAgICAgICAgJ2lucHV0VHlwZScsXG4gICAgICAgICdpbnB1dFdpZHRoJyxcbiAgICAgICAgJ2l0ZW1zJyxcbiAgICAgICAgJ2tleVN0cm9rZUNoYW5nZURlbGF5JyxcbiAgICAgICAgJ2tleVN0cm9rZUZpbHRlckRlbGF5JyxcbiAgICAgICAgJ2xhYmVsQ2xzJyxcbiAgICAgICAgJ2xhYmVsUG9zaXRpb24nLFxuICAgICAgICAnbGFiZWxzJyxcbiAgICAgICAgJ2xhYmVsV2lkdGgnLFxuICAgICAgICAnbGlzdENscycsXG4gICAgICAgICdsaXN0ZW5lcnMnLFxuICAgICAgICAnbGlzdEl0ZW1UcGwnLFxuICAgICAgICAnbG9jYWxlQ2xhc3MnLFxuICAgICAgICAnbG9jYWxpemFibGUnLFxuICAgICAgICAnbG9jYWxpemFibGVQcm9wZXJ0aWVzJyxcbiAgICAgICAgJ21hc2tEZWZhdWx0cycsXG4gICAgICAgICdtYXNrZWQnLFxuICAgICAgICAnbWF4TGVuZ3RoJyxcbiAgICAgICAgJ21pbkNoYXJzJyxcbiAgICAgICAgJ21pbkxlbmd0aCcsXG4gICAgICAgICdtb25pdG9yUmVzaXplJyxcbiAgICAgICAgJ211bHRpVmFsdWVTZXBhcmF0b3InLFxuICAgICAgICAnbmFtZScsXG4gICAgICAgICdvdmVybGF5QW5jaG9yJyxcbiAgICAgICAgJ3BpY2tlckFsaWduRWxlbWVudCcsXG4gICAgICAgICdwaWNrZXJXaWR0aCcsXG4gICAgICAgICdwb3NpdGlvbmVkJyxcbiAgICAgICAgJ3ByZXZlbnRUb29sdGlwT25Ub3VjaCcsXG4gICAgICAgICdwcmltYXJ5RmlsdGVyJyxcbiAgICAgICAgJ3JlbGF5U3RvcmVFdmVudHMnLFxuICAgICAgICAncmV2ZXJ0T25Fc2NhcGUnLFxuICAgICAgICAncmlwcGxlJyxcbiAgICAgICAgJ3JvbGUnLFxuICAgICAgICAncm9vdEVsZW1lbnQnLFxuICAgICAgICAnc2Nyb2xsQWN0aW9uJyxcbiAgICAgICAgJ3Nob3dBbmltYXRpb24nLFxuICAgICAgICAnc2hvd1Rvb2x0aXBXaGVuRGlzYWJsZWQnLFxuICAgICAgICAnc2tpcFZhbGlkYXRpb24nLFxuICAgICAgICAnc3BlbGxDaGVjaycsXG4gICAgICAgICd0YWInLFxuICAgICAgICAndGFiSW5kZXgnLFxuICAgICAgICAndGV4dEFsaWduJyxcbiAgICAgICAgJ3RpdGxlJyxcbiAgICAgICAgJ3RyaWdnZXJBY3Rpb24nLFxuICAgICAgICAndHlwZScsXG4gICAgICAgICd1aScsXG4gICAgICAgICd2YWxpZGF0ZUZpbHRlcicsXG4gICAgICAgICd2YWxpZGF0ZU9uSW5wdXQnLFxuICAgICAgICAndmFsdWVGaWVsZCcsXG4gICAgICAgICd3ZWlnaHQnXG4gICAgXTtcblxuICAgIHByaXZhdGUgc3RhdGljIGJyeW50dW1Qcm9wczogc3RyaW5nW10gPSBCcnludHVtQ2hlY2tsaXN0RmlsdGVyQ29tYm9Db21wb25lbnQuYnJ5bnR1bUZlYXR1cmVOYW1lcy5jb25jYXQoW1xuICAgICAgICAnYWxpZ25TZWxmJyxcbiAgICAgICAgJ2FwcGVuZFRvJyxcbiAgICAgICAgJ2JhZGdlJyxcbiAgICAgICAgJ2NhbGxPbkZ1bmN0aW9ucycsXG4gICAgICAgICdjYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMnLFxuICAgICAgICAnY2xzJyxcbiAgICAgICAgJ2NvbHVtbicsXG4gICAgICAgICdjb250ZW50JyxcbiAgICAgICAgJ2RhdGFzZXQnLFxuICAgICAgICAnZGlzYWJsZWQnLFxuICAgICAgICAnZWRpdGFibGUnLFxuICAgICAgICAnZXh0cmFEYXRhJyxcbiAgICAgICAgJ2ZpbHRlck9wZXJhdG9yJyxcbiAgICAgICAgJ2ZsZXgnLFxuICAgICAgICAnZm9ybXVsYScsXG4gICAgICAgICdoZWlnaHQnLFxuICAgICAgICAnaGlkZGVuJyxcbiAgICAgICAgJ2h0bWwnLFxuICAgICAgICAnaWQnLFxuICAgICAgICAnaW5wdXQnLFxuICAgICAgICAnaW5zZXJ0QmVmb3JlJyxcbiAgICAgICAgJ2luc2VydEZpcnN0JyxcbiAgICAgICAgJ2tleU1hcCcsXG4gICAgICAgICdsYWJlbCcsXG4gICAgICAgICdsaXN0SXRlbVBpbGxUcGwnLFxuICAgICAgICAnbWFyZ2luJyxcbiAgICAgICAgJ21heEhlaWdodCcsXG4gICAgICAgICdtYXhpbWl6ZU9uTW9iaWxlJyxcbiAgICAgICAgJ21heFdpZHRoJyxcbiAgICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAgICdtaW5XaWR0aCcsXG4gICAgICAgICdtdWx0aVNlbGVjdCcsXG4gICAgICAgICdwYXJlbnQnLFxuICAgICAgICAncGlja2VyJyxcbiAgICAgICAgJ3BsYWNlaG9sZGVyJyxcbiAgICAgICAgJ3JlYWRPbmx5JyxcbiAgICAgICAgJ3JlbmRpdGlvbicsXG4gICAgICAgICdyZXF1aXJlZCcsXG4gICAgICAgICdydGwnLFxuICAgICAgICAnc2Nyb2xsYWJsZScsXG4gICAgICAgICdzZWFyY2hUZXh0JyxcbiAgICAgICAgJ3Nob3dBcHBseUJ1dHRvbicsXG4gICAgICAgICdzaG93UmVxdWlyZWRJbmRpY2F0b3InLFxuICAgICAgICAnc3BhbicsXG4gICAgICAgICdzdG9yZScsXG4gICAgICAgICd0b29sdGlwJyxcbiAgICAgICAgJ3RyaWdnZXJzJyxcbiAgICAgICAgJ3ZhbHVlJyxcbiAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgJ3gnLFxuICAgICAgICAneSdcbiAgICBdKTtcblxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjtcbiAgICBwdWJsaWMgaW5zdGFuY2UhOiBDaGVja2xpc3RGaWx0ZXJDb21ibztcblxuICAgIHByaXZhdGUgYnJ5bnR1bUNvbmZpZyA9IHtcbiAgICAgICAgYWRvcHQgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgYXBwZW5kVG8gICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgaHJlZiAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgYW5ndWxhckNvbXBvbmVudCA6IHRoaXMsXG4gICAgICAgIGZlYXR1cmVzICAgICAgICAgOiB7fSxcbiAgICAgICAgbGlzdGVuZXJzICAgICAgICA6IHt9XG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBDb25maWdzIG9ubHlcbiAgICBASW5wdXQoKSBhZG9wdCAgICAgICAgICAgICAgICAgICAgICAgICEgOiBIVE1MRWxlbWVudHxzdHJpbmc7XG4gICAgQElucHV0KCkgYWxpZ24gICAgICAgICAgICAgICAgICAgICAgICAhIDogQWxpZ25TcGVjfHN0cmluZztcbiAgICBASW5wdXQoKSBhbmNob3IgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGFyaWFEZXNjcmlwdGlvbiAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBhcmlhTGFiZWwgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgYXV0b0NvbXBsZXRlICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGF1dG9FeHBhbmQgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYXV0b1NlbGVjdCAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBidWJibGVFdmVudHMgICAgICAgICAgICAgICAgICEgOiBvYmplY3Q7XG4gICAgQElucHV0KCkgY2FjaGVMYXN0UmVzdWx0ICAgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZ3xEdXJhdGlvbnxEdXJhdGlvbkNvbmZpZztcbiAgICBASW5wdXQoKSBjYXNlU2Vuc2l0aXZlICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNlbnRlcmVkICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY2hlY2tWYWxpZGl0eSAgICAgICAgICAgICAgICAhIDogKChmaWVsZDogRmllbGQpID0+IHZvaWQpfHN0cmluZztcbiAgICBASW5wdXQoKSBjaGlwVmlldyAgICAgICAgICAgICAgICAgICAgICEgOiBDaGlwVmlld0NvbmZpZztcbiAgICBASW5wdXQoKSBjbGVhcmFibGUgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufEZpZWxkVHJpZ2dlckNvbmZpZztcbiAgICBASW5wdXQoKSBjbGVhclRleHRPblBpY2tlckhpZGUgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNsZWFyVGV4dE9uU2VsZWN0aW9uICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY2xlYXJXaGVuSW5wdXRFbXB0eSAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjb2xvciAgICAgICAgICAgICAgICAgICAgICAgICEgOiBDb2xvcjtcbiAgICBASW5wdXQoKSBjb25maWcgICAgICAgICAgICAgICAgICAgICAgICEgOiBvYmplY3Q7XG4gICAgQElucHV0KCkgY29uc3RyYWluVG8gICAgICAgICAgICAgICAgICAhIDogSFRNTEVsZW1lbnR8V2lkZ2V0fFJlY3RhbmdsZTtcbiAgICBASW5wdXQoKSBjb250YWluZXIgICAgICAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBHcmlkQ29udGFpbmVySXRlbUNvbmZpZz58R3JpZENvbnRhaW5lckl0ZW1Db25maWdbXXxGaWVsZENvbnRhaW5lckNvbmZpZztcbiAgICBASW5wdXQoKSBjb250YWluVmFsdWVzICAgICAgICAgICAgICAgICEgOiBib29sZWFufHN0cmluZ3woKGZpZWxkOiBGaWVsZCkgPT4gYm9vbGVhbik7XG4gICAgQElucHV0KCkgY29udGVudEVsZW1lbnRDbHMgICAgICAgICAgICAhIDogc3RyaW5nfG9iamVjdDtcbiAgICBASW5wdXQoKSBjcmVhdGVPblVubWF0Y2hlZCAgICAgICAgICAgICEgOiAoKG5hbWU6IHN0cmluZywgY29tYm86IENvbWJvKSA9PiBNb2RlbCl8c3RyaW5nfGJvb2xlYW47XG4gICAgQElucHV0KCkgZGF0YUZpZWxkICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRlZmF1bHRCaW5kUHJvcGVydHkgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBkZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGRpc3BsYXlGaWVsZCAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBkaXNwbGF5VmFsdWVSZW5kZXJlciAgICAgICAgICEgOiAocmVjb3JkOiBNb2RlbCwgY29tYm86IENvbWJvKSA9PiBzdHJpbmd8dm9pZDtcbiAgICBASW5wdXQoKSBkb2NrICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAndG9wJ3wnYm90dG9tJ3wnbGVmdCd8J3JpZ2h0J3wnc3RhcnQnfCdlbmQnfCdoZWFkZXInfCdwcmUtaGVhZGVyJ3xvYmplY3Q7XG4gICAgQElucHV0KCkgZHJhZ2dhYmxlICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxvYmplY3Q7XG4gICAgQElucHV0KCkgZWxlbWVudEF0dHJpYnV0ZXMgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgc3RyaW5nfG51bGw+O1xuICAgIEBJbnB1dCgpIGVtcHR5VGV4dCAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBlbmNvZGVGaWx0ZXJQYXJhbXMgICAgICAgICAgICEgOiAoZmlsdGVyczogb2JqZWN0W10pID0+IG9iamVjdFtdO1xuICAgIEBJbnB1dCgpIGZpbHRlck9uRW50ZXIgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZmlsdGVyUGFyYW1OYW1lICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGZpbHRlclNlbGVjdGVkICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZmxvYXRpbmcgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBoaWRlQW5pbWF0aW9uICAgICAgICAgICAgICAgICEgOiBib29sZWFufG9iamVjdDtcbiAgICBASW5wdXQoKSBoaWRlUGlja2VyT25TZWxlY3QgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGhpZGVUcmlnZ2VyICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaGlnaGxpZ2h0RXh0ZXJuYWxDaGFuZ2UgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBoaW50ICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8KChkYXRhOiB7IHNvdXJjZTogRmllbGQsIHZhbHVlOiBhbnkgfSkgPT4gc3RyaW5nKTtcbiAgICBASW5wdXQoKSBoaW50SHRtbCAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8KChkYXRhOiB7IHNvdXJjZTogRmllbGQsIHZhbHVlOiBhbnkgfSkgPT4gc3RyaW5nKTtcbiAgICBASW5wdXQoKSBpZ25vcmVQYXJlbnRSZWFkT25seSAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlubGluZSAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaW5saW5lUGlja2VyICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpbnB1dEFsaWduICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgaW5wdXRBdHRyaWJ1dGVzICAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBASW5wdXQoKSBpbnB1dFRhZyAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgaW5wdXRUeXBlICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGlucHV0V2lkdGggICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgaXRlbXMgICAgICAgICAgICAgICAgICAgICAgICAhIDogb2JqZWN0W118c3RyaW5nW118b2JqZWN0O1xuICAgIEBJbnB1dCgpIGtleVN0cm9rZUNoYW5nZURlbGF5ICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBrZXlTdHJva2VGaWx0ZXJEZWxheSAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgbGFiZWxDbHMgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG9iamVjdDtcbiAgICBASW5wdXQoKSBsYWJlbFBvc2l0aW9uICAgICAgICAgICAgICAgICEgOiAnYmVmb3JlJ3wnYWJvdmUnfG51bGw7XG4gICAgQElucHV0KCkgbGFiZWxzICAgICAgICAgICAgICAgICAgICAgICAhIDogb2JqZWN0W107XG4gICAgQElucHV0KCkgbGFiZWxXaWR0aCAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBsaXN0Q2xzICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgbGlzdGVuZXJzICAgICAgICAgICAgICAgICAgICAhIDogQ2hlY2tsaXN0RmlsdGVyQ29tYm9MaXN0ZW5lcnM7XG4gICAgQElucHV0KCkgbGlzdEl0ZW1UcGwgICAgICAgICAgICAgICAgICAhIDogKHJlY29yZDogTW9kZWwpID0+IHN0cmluZ3x2b2lkO1xuICAgIEBJbnB1dCgpIGxvY2FsZUNsYXNzICAgICAgICAgICAgICAgICAgISA6IHR5cGVvZiBCYXNlO1xuICAgIEBJbnB1dCgpIGxvY2FsaXphYmxlICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgbG9jYWxpemFibGVQcm9wZXJ0aWVzICAgICAgICAhIDogc3RyaW5nW107XG4gICAgQElucHV0KCkgbWFza0RlZmF1bHRzICAgICAgICAgICAgICAgICAhIDogTWFza0NvbmZpZztcbiAgICBASW5wdXQoKSBtYXNrZWQgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufHN0cmluZ3xNYXNrQ29uZmlnO1xuICAgIEBJbnB1dCgpIG1heExlbmd0aCAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBtaW5DaGFycyAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgbWluTGVuZ3RoICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIG1vbml0b3JSZXNpemUgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58b2JqZWN0O1xuICAgIEBJbnB1dCgpIG11bHRpVmFsdWVTZXBhcmF0b3IgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgb3ZlcmxheUFuY2hvciAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwaWNrZXJBbGlnbkVsZW1lbnQgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcGlja2VyV2lkdGggICAgICAgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZztcbiAgICBASW5wdXQoKSBwb3NpdGlvbmVkICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHByZXZlbnRUb29sdGlwT25Ub3VjaCAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHJpbWFyeUZpbHRlciAgICAgICAgICAgICAgICAhIDogQ29sbGVjdGlvbkZpbHRlckNvbmZpZztcbiAgICBASW5wdXQoKSByZWxheVN0b3JlRXZlbnRzICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJldmVydE9uRXNjYXBlICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcmlwcGxlICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxvYmplY3Q7XG4gICAgQElucHV0KCkgcm9sZSAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHJvb3RFbGVtZW50ICAgICAgICAgICAgICAgICAgISA6IFNoYWRvd1Jvb3R8SFRNTEVsZW1lbnQ7XG4gICAgQElucHV0KCkgc2Nyb2xsQWN0aW9uICAgICAgICAgICAgICAgICAhIDogJ2hpZGUnfCdyZWFsaWduJ3xudWxsO1xuICAgIEBJbnB1dCgpIHNob3dBbmltYXRpb24gICAgICAgICAgICAgICAgISA6IGJvb2xlYW58b2JqZWN0O1xuICAgIEBJbnB1dCgpIHNob3dUb29sdGlwV2hlbkRpc2FibGVkICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc2tpcFZhbGlkYXRpb24gICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzcGVsbENoZWNrICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHRhYiAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58VGFiQ29uZmlnO1xuICAgIEBJbnB1dCgpIHRhYkluZGV4ICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSB0ZXh0QWxpZ24gICAgICAgICAgICAgICAgICAgICEgOiAnbGVmdCd8J2NlbnRlcid8J3JpZ2h0J3wnc3RhcnQnfCdlbmQnO1xuICAgIEBJbnB1dCgpIHRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSB0cmlnZ2VyQWN0aW9uICAgICAgICAgICAgICAgICEgOiAnYWxsJ3wnbGFzdCd8bnVsbDtcbiAgICBASW5wdXQoKSB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAnY2hlY2tsaXN0ZmlsdGVyY29tYm8nO1xuICAgIEBJbnB1dCgpIHVpICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xvYmplY3Q7XG4gICAgQElucHV0KCkgdmFsaWRhdGVGaWx0ZXIgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSB2YWxpZGF0ZU9uSW5wdXQgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHZhbHVlRmllbGQgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudWxsO1xuICAgIEBJbnB1dCgpIHdlaWdodCAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcblxuICAgIC8vIENvbmZpZ3MgYW5kIHByb3BlcnRpZXNcbiAgICBASW5wdXQoKSBhbGlnblNlbGYgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBhcHBlbmRUbyAgICAgICAgICAgICAgICAgICAgISA6IEhUTUxFbGVtZW50fHN0cmluZztcbiAgICBASW5wdXQoKSBiYWRnZSAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBjYWxsT25GdW5jdGlvbnMgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNscyAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG9iamVjdDtcbiAgICBASW5wdXQoKSBjb2x1bW4gICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBkYXRhc2V0ICAgICAgICAgICAgICAgICAgICAgISA6IG9iamVjdHxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIEBJbnB1dCgpIGRpc2FibGVkICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnwnaW5lcnQnO1xuICAgIEBJbnB1dCgpIGVkaXRhYmxlICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBleHRyYURhdGEgICAgICAgICAgICAgICAgICAgISA6IGFueTtcbiAgICBASW5wdXQoKSBmaWx0ZXJPcGVyYXRvciAgICAgICAgICAgICAgISA6IENvbGxlY3Rpb25Db21wYXJlT3BlcmF0b3I7XG4gICAgQElucHV0KCkgZmxleCAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGhlaWdodCAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZztcbiAgICBASW5wdXQoKSBoaWRkZW4gICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgaW5zZXJ0QmVmb3JlICAgICAgICAgICAgICAgICEgOiBIVE1MRWxlbWVudHxzdHJpbmc7XG4gICAgQElucHV0KCkgaW5zZXJ0Rmlyc3QgICAgICAgICAgICAgICAgICEgOiBIVE1MRWxlbWVudHxzdHJpbmc7XG4gICAgQElucHV0KCkga2V5TWFwICAgICAgICAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBLZXlNYXBDb25maWc+O1xuICAgIEBJbnB1dCgpIGxhYmVsICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGxpc3RJdGVtUGlsbFRwbCAgICAgICAgICAgICAhIDogKHJlY29yZDogTW9kZWwpID0+IHN0cmluZztcbiAgICBASW5wdXQoKSBtYXJnaW4gICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmc7XG4gICAgQElucHV0KCkgbWF4SGVpZ2h0ICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8bnVtYmVyO1xuICAgIEBJbnB1dCgpIG1heGltaXplT25Nb2JpbGUgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZztcbiAgICBASW5wdXQoKSBtYXhXaWR0aCAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgbWluSGVpZ2h0ICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8bnVtYmVyO1xuICAgIEBJbnB1dCgpIG1pbldpZHRoICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBwaWNrZXIgICAgICAgICAgICAgICAgICAgICAgISA6IExpc3RDb25maWd8TGlzdDtcbiAgICBASW5wdXQoKSBwbGFjZWhvbGRlciAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSByZWFkT25seSAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcmVuZGl0aW9uICAgICAgICAgICAgICAgICAgICEgOiAnb3V0bGluZWQnfCdmaWxsZWQnfHN0cmluZztcbiAgICBASW5wdXQoKSByZXF1aXJlZCAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcnRsICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHNlYXJjaFRleHQgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHNob3dBcHBseUJ1dHRvbiAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzaG93UmVxdWlyZWRJbmRpY2F0b3IgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBzcGFuICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBzdG9yZSAgICAgICAgICAgICAgICAgICAgICAgISA6IFN0b3JlfFN0b3JlQ29uZmlnO1xuICAgIEBJbnB1dCgpIHRvb2x0aXAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfFRvb2x0aXBDb25maWd8bnVsbDtcbiAgICBASW5wdXQoKSB0cmlnZ2VycyAgICAgICAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIEZpZWxkVHJpZ2dlckNvbmZpZz58UmVjb3JkPHN0cmluZywgV2lkZ2V0PjtcbiAgICBASW5wdXQoKSB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgISA6IG9iamVjdHxudW1iZXJ8c3RyaW5nfHN0cmluZ1tdfG51bWJlcltdO1xuICAgIEBJbnB1dCgpIHdpZHRoICAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZztcbiAgICBASW5wdXQoKSB4ICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcblxuICAgIC8vIFByb3BlcnRpZXMgb25seVxuICAgIEBJbnB1dCgpIGNvbnRlbnQgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgZm9ybXVsYSAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBodG1sICAgICAgICAhIDogc3RyaW5nfCgod2lkZ2V0OiBXaWRnZXQpID0+IHZvaWQpfERvbUNvbmZpZ3xEb21Db25maWdbXXxWdWVDb25maWd8UmVhY3RKU1g7XG4gICAgQElucHV0KCkgaW5wdXQgICAgICAgISA6IEhUTUxFbGVtZW50O1xuICAgIEBJbnB1dCgpIG11bHRpU2VsZWN0ICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHBhcmVudCAgICAgICEgOiBXaWRnZXQ7XG4gICAgQElucHV0KCkgc2Nyb2xsYWJsZSAgISA6IFNjcm9sbGVyO1xuXG4gICAgLy8gRXZlbnRzIGVtaXR0ZXJzXG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgYWN0aW9uIHdhcyBwZXJmb3JtZWQgKGFuIGl0ZW0gaW4gdGhlIGxpc3Qgd2FzIHNlbGVjdGVkKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LkNvbWJvfSBldmVudC5zb3VyY2UgVGhlIGNvbWJvXG4gICAgICogQHBhcmFtIHthbnl9IGV2ZW50LnZhbHVlIFRoZSBbdmFsdWVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db21ibyNjb25maWctdmFsdWVGaWVsZCkgb2YgdGhlIHNlbGVjdGVkIHJlY29yZFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgU2VsZWN0ZWQgcmVjb3JkXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQucmVjb3JkcyBTZWxlY3RlZCByZWNvcmRzIGFzIGFuIGFycmF5IGlmIFttdWx0aVNlbGVjdF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbWJvI2NvbmZpZy1tdWx0aVNlbGVjdCkgaXMgYHRydWVgXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC51c2VyQWN0aW9uIGB0cnVlYCBpZiB0aGUgdmFsdWUgY2hhbmdlIGlzIGR1ZSB0byB1c2VyIGludGVyYWN0aW9uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQWN0aW9uOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDb21ibywgdmFsdWU6IGFueSwgcmVjb3JkOiBNb2RlbCwgcmVjb3JkczogTW9kZWxbXSwgdXNlckFjdGlvbjogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYmVmb3JlIGFuIG9iamVjdCBpcyBkZXN0cm95ZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5CYXNlfSBldmVudC5zb3VyY2UgVGhlIE9iamVjdCB0aGF0IGlzIGJlaW5nIGRlc3Ryb3llZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVEZXN0cm95OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBCYXNlIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYmVmb3JlIGEgd2lkZ2V0IGlzIGhpZGRlbi4gUmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCB0aGUgYWN0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoZSB3aWRnZXQgYmVpbmcgaGlkZGVuLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUhpZGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCB9KSA9PiBib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYmVmb3JlIGEgd2lkZ2V0IGlzIHNob3duLiBSZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IHRoZSBhY3Rpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0LGFueX0gZXZlbnQuc291cmNlIFRoZSB3aWRnZXQgYmVpbmcgc2hvd25cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVTaG93OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXR8YW55IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhbnkgb3RoZXIgZXZlbnQgaXMgZmlyZWQgZnJvbSB0aGUgb2JqZWN0LlxuICAgICAqIFtNb3JlLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jZXZlbnQtY2F0Y2hBbGwpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7e1trZXk6IHN0cmluZ106IGFueSwgdHlwZTogc3RyaW5nfX0gZXZlbnQuZXZlbnQgVGhlIE9iamVjdCB0aGF0IGNvbnRhaW5zIGV2ZW50IGRldGFpbHNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuZXZlbnQudHlwZSBUaGUgdHlwZSBvZiB0aGUgZXZlbnQgd2hpY2ggaXMgY2F1Z2h0IGJ5IHRoZSBsaXN0ZW5lclxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNhdGNoQWxsOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHtba2V5OiBzdHJpbmddOiBhbnksIHR5cGU6IHN0cmluZ30pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoaXMgZmllbGQncyB2YWx1ZSBjaGFuZ2VzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LkZpZWxkLGFueX0gZXZlbnQuc291cmNlIFRoaXMgRmllbGRcbiAgICAgKiBAcGFyYW0ge3N0cmluZyxudW1iZXIsYm9vbGVhbixhbnl9IGV2ZW50LnZhbHVlIFRoaXMgZmllbGQncyB2YWx1ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nLG51bWJlcixib29sZWFuLGFueX0gZXZlbnQub2xkVmFsdWUgVGhpcyBmaWVsZCdzIHByZXZpb3VzIHZhbHVlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC52YWxpZCBUcnVlIGlmIHRoaXMgZmllbGQgaXMgaW4gYSB2YWxpZCBzdGF0ZVxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmV2ZW50IFRoZSB0cmlnZ2VyaW5nIERPTSBldmVudCBpZiBhbnlcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LnVzZXJBY3Rpb24gVHJpZ2dlcmVkIGJ5IHVzZXIgdGFraW5nIGFuIGFjdGlvbiAoYHRydWVgKSBvciBieSBzZXR0aW5nIGEgdmFsdWUgKGBmYWxzZWApXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jaGVja2VkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBGaWVsZHxhbnksIHZhbHVlOiBzdHJpbmd8bnVtYmVyfGJvb2xlYW58YW55LCBvbGRWYWx1ZTogc3RyaW5nfG51bWJlcnxib29sZWFufGFueSwgdmFsaWQ6IGJvb2xlYW4sIGV2ZW50OiBFdmVudCwgdXNlckFjdGlvbjogYm9vbGVhbiwgY2hlY2tlZDogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGlzIGZpZWxkIGlzIFtjbGVhcmVkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvRmllbGQjZnVuY3Rpb24tY2xlYXIpLlxuICAgICAqIFtNb3JlLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC93aWRnZXQvQ2hlY2tsaXN0RmlsdGVyQ29tYm8jZXZlbnQtY2xlYXIpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuRmllbGQsYW55fSBldmVudC5zb3VyY2UgVGhpcyBGaWVsZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNsZWFyOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBGaWVsZHxhbnkgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYW4gb2JqZWN0IGlzIGRlc3Ryb3llZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLkJhc2V9IGV2ZW50LnNvdXJjZSBUaGUgT2JqZWN0IHRoYXQgaXMgYmVpbmcgZGVzdHJveWVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRlc3Ryb3k6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEJhc2UgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgd2lkZ2V0J3MgW2VsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktZWxlbWVudCkgaXMgYXZhaWxhYmxlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5lbGVtZW50IFRoZSBXaWRnZXQncyBlbGVtZW50LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkVsZW1lbnRDcmVhdGVkOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZWxlbWVudDogSFRNTEVsZW1lbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gZm9jdXMgZW50ZXJzIHRoaXMgV2lkZ2V0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoaXMgV2lkZ2V0XG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZnJvbUVsZW1lbnQgVGhlIGVsZW1lbnQgd2hpY2ggbG9zdCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC50b0VsZW1lbnQgVGhlIGVsZW1lbnQgd2hpY2ggZ2FpbmVkIGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5mcm9tV2lkZ2V0IFRoZSB3aWRnZXQgd2hpY2ggbG9zdCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQudG9XaWRnZXQgVGhlIHdpZGdldCB3aGljaCBnYWluZWQgZm9jdXMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5iYWNrd2FyZHMgYHRydWVgIGlmIHRoZSBgdG9FbGVtZW50YCBpcyBiZWZvcmUgdGhlIGBmcm9tRWxlbWVudGAgaW4gZG9jdW1lbnQgb3JkZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRm9jdXNJbjogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBmcm9tRWxlbWVudDogSFRNTEVsZW1lbnQsIHRvRWxlbWVudDogSFRNTEVsZW1lbnQsIGZyb21XaWRnZXQ6IFdpZGdldCwgdG9XaWRnZXQ6IFdpZGdldCwgYmFja3dhcmRzOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGZvY3VzIGV4aXRzIHRoaXMgV2lkZ2V0J3Mgb3duZXJzaGlwIHRyZWUuIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gYSBgYmx1cmAgZXZlbnQuXG4gICAgICogZm9jdXMgbW92aW5nIGZyb20gd2l0aGluIHRoaXMgV2lkZ2V0J3Mgb3duZXJzaGlwIHRyZWUsIGV2ZW4gaWYgdGhlcmUgYXJlIGZsb2F0aW5nIHdpZGdldHNcbiAgICAgKiB3aWxsIG5vdCB0cmlnZ2VyIHRoaXMgZXZlbnQuIFRoaXMgaXMgd2hlbiBmb2N1cyBleGl0cyB0aGlzIHdpZGdldCBjb21wbGV0ZWx5LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoaXMgV2lkZ2V0XG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZnJvbUVsZW1lbnQgVGhlIGVsZW1lbnQgd2hpY2ggbG9zdCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC50b0VsZW1lbnQgVGhlIGVsZW1lbnQgd2hpY2ggZ2FpbmVkIGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5mcm9tV2lkZ2V0IFRoZSB3aWRnZXQgd2hpY2ggbG9zdCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQudG9XaWRnZXQgVGhlIHdpZGdldCB3aGljaCBnYWluZWQgZm9jdXMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5iYWNrd2FyZHMgYHRydWVgIGlmIHRoZSBgdG9FbGVtZW50YCBpcyBiZWZvcmUgdGhlIGBmcm9tRWxlbWVudGAgaW4gZG9jdW1lbnQgb3JkZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRm9jdXNPdXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgZnJvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0b0VsZW1lbnQ6IEhUTUxFbGVtZW50LCBmcm9tV2lkZ2V0OiBXaWRnZXQsIHRvV2lkZ2V0OiBXaWRnZXQsIGJhY2t3YXJkczogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGFmdGVyIGEgd2lkZ2V0IHdhcyBoaWRkZW5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uSGlkZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBVc2VyIHR5cGVkIGludG8gdGhlIGZpZWxkLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSB2YWx1ZSBhdHRhY2hlZCB0byB0aGlzIGV2ZW50IGlzIHRoZSByYXcgaW5wdXQgZmllbGQgdmFsdWUgYW5kXG4gICAgICogbm90IHRoZSBjb21ib3MgdmFsdWVcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5Db21ib30gZXZlbnQuc291cmNlIFRoZSBjb21iby5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQudmFsdWUgUmF3IGlucHV0IHZhbHVlXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZXZlbnQgVGhlIHRyaWdnZXJpbmcgRE9NIGV2ZW50IGlmIGFueS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25JbnB1dDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ29tYm8sIHZhbHVlOiBzdHJpbmcsIGV2ZW50OiBFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSB3aWRnZXQgd2hpY2ggaGFkIGJlZW4gaW4gYSBub24tdmlzaWJsZSBzdGF0ZSBmb3IgYW55IHJlYXNvblxuICAgICAqIGFjaGlldmVzIHZpc2liaWxpdHkuXG4gICAgICogW01vcmUuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3dpZGdldC9DaGVja2xpc3RGaWx0ZXJDb21ibyNldmVudC1wYWludClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0IGJlaW5nIHBhaW50ZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5maXJzdFBhaW50IGB0cnVlYCBpZiB0aGlzIGlzIHRoZSBmaXJzdCBwYWludC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25QYWludDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBmaXJzdFBhaW50OiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgV2lkZ2V0J3MgcmVhZCBvbmx5IHN0YXRlIGlzIHRvZ2dsZWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5yZWFkT25seSBSZWFkIG9ubHkgb3Igbm90XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVhZE9ubHk6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyByZWFkT25seTogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBpcyBmaXJlZCBhZnRlciBhIHdpZGdldCdzIGVsZW1lbnRzIGhhdmUgYmVlbiBzeW5jaHJvbml6ZWQgZHVlIHRvIGEgZGlyZWN0IG9yIGluZGlyZWN0IGNhbGxcbiAgICAgKiB0byBbcmVjb21wb3NlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2Z1bmN0aW9uLXJlY29tcG9zZSksIGlmIHRoaXMgcmVzdWx0cyBpbiBzb21lIGNoYW5nZSB0byB0aGUgd2lkZ2V0J3MgcmVuZGVyZWQgRE9NIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlY29tcG9zZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKCkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIGVuY2Fwc3VsYXRpbmcgZWxlbWVudCBvZiBhIFdpZGdldCByZXNpemVzICpvbmx5IHdoZW4gW21vbml0b3JSZXNpemVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLW1vbml0b3JSZXNpemUpIGlzIGB0cnVlYCouXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhpcyBXaWRnZXRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQud2lkdGggVGhlIG5ldyB3aWR0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC5oZWlnaHQgVGhlIG5ldyBoZWlnaHRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQub2xkV2lkdGggVGhlIG9sZCB3aWR0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC5vbGRIZWlnaHQgVGhlIG9sZCBoZWlnaHRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZXNpemU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIG9sZFdpZHRoOiBudW1iZXIsIG9sZEhlaWdodDogbnVtYmVyIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBBbiBpdGVtIGluIHRoZSBsaXN0IHdhcyBzZWxlY3RlZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LkNvbWJvfSBldmVudC5zb3VyY2UgVGhlIGNvbWJvXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBTZWxlY3RlZCByZWNvcmRcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5yZWNvcmRzIFNlbGVjdGVkIHJlY29yZHMgYXMgYW4gYXJyYXkgaWYgW211bHRpU2VsZWN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29tYm8jY29uZmlnLW11bHRpU2VsZWN0KSBpcyBgdHJ1ZWBcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LnVzZXJBY3Rpb24gYHRydWVgIGlmIHRoZSB2YWx1ZSBjaGFuZ2UgaXMgZHVlIHRvIHVzZXIgaW50ZXJhY3Rpb25cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TZWxlY3Q6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENvbWJvLCByZWNvcmQ6IE1vZGVsLCByZWNvcmRzOiBNb2RlbFtdLCB1c2VyQWN0aW9uOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYWZ0ZXIgYSB3aWRnZXQgaXMgc2hvd24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVXNlciBjbGlja2VkIG9uZSBvZiB0aGlzIGZpZWxkJ3MgW3RyaWdnZXJzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvRmllbGQjcHJvcGVydHktdHJpZ2dlcnMpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuRmllbGQsYW55fSBldmVudC5zb3VyY2UgVGhpcyBmaWVsZFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC50cmlnZ2VyIFRoZSB0cmlnZ2VyIGFjdGl2YXRlZCBieSBjbGljayBvciB0b3VjaCB0YXAuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVHJpZ2dlcjogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogRmllbGR8YW55LCB0cmlnZ2VyOiBXaWRnZXQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuZCBhcHBlbmQgdGhlIHVuZGVybHlpbmcgd2lkZ2V0XG4gICAgICovXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0XG4gICAgICAgICAgICBtZSA9IHRoaXMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZWxlbWVudFJlZixcbiAgICAgICAgICAgICAgICBicnludHVtQ29uZmlnXG4gICAgICAgICAgICB9ID0gbWUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VDbGFzcyxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZU5hbWUsXG4gICAgICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZ3MsXG4gICAgICAgICAgICAgICAgYnJ5bnR1bUV2ZW50c1xuICAgICAgICAgICAgfSA9IEJyeW50dW1DaGVja2xpc3RGaWx0ZXJDb21ib0NvbXBvbmVudDtcblxuICAgICAgICBicnludHVtQ29uZmlncy5maWx0ZXIocHJvcCA9PiBwcm9wIGluIHRoaXMpLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBXcmFwcGVySGVscGVyLmFwcGx5UHJvcFZhbHVlKGJyeW50dW1Db25maWcsIHByb3AsIHRoaXNbcHJvcF0pO1xuICAgICAgICAgICAgaWYgKFsnZmVhdHVyZXMnLCAnY29uZmlnJ10uaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBXcmFwcGVySGVscGVyLmRldldhcm5pbmdDb25maWdQcm9wKGluc3RhbmNlTmFtZSwgcHJvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGJyeW50dW1FdmVudHMuZmlsdGVyKGV2ZW50ID0+IHRoaXNbZXZlbnRdICYmIHRoaXNbZXZlbnRdLm9ic2VydmVycy5sZW5ndGggPiAwKS5mb3JFYWNoKGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0XG4gICAgICAgICAgICAgICAgdW5jYXBpdGFsaXplID0gKHN0cjogc3RyaW5nKSA9PiBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSksXG4gICAgICAgICAgICAgICAgZXZlbnROYW1lID0gKHN0cjogc3RyaW5nKSA9PiB1bmNhcGl0YWxpemUoc3RyLnNsaWNlKDIpKTtcblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZy5saXN0ZW5lcnNbZXZlbnROYW1lKGV2ZW50KV0gPSBlID0+IHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgbWVbZXZlbnRdLmVtaXQoZSk7XG4gICAgICAgICAgICAgICAgLy8gRXZlbnRFbWl0dGVyIGRvZXMgbm90IHJldHVybiB2YWx1ZXMgaW4gdGhlIG5vcm1hbCB3YXksIHdvcmsgYXJvdW5kIGl0IGJ5IHNldHRpbmcgYHJldHVyblZhbHVlYCBmbGFnXG4gICAgICAgICAgICAgICAgLy8gaW4gQW5ndWxhciBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5yZXR1cm5WYWx1ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElmIGNvbXBvbmVudCBoYXMgbm8gY29udGFpbmVyIHNwZWNpZmllZCBpbiBjb25maWcgdGhlbiB1c2UgYWRvcHQgdG8gV3JhcHBlcidzIGVsZW1lbnRcbiAgICAgICAgY29uc3RcbiAgICAgICAgICAgIGNvbnRhaW5lclBhcmFtID0gW1xuICAgICAgICAgICAgICAgICdhZG9wdCcsXG4gICAgICAgICAgICAgICAgJ2FwcGVuZFRvJyxcbiAgICAgICAgICAgICAgICAnaW5zZXJ0QWZ0ZXInLFxuICAgICAgICAgICAgICAgICdpbnNlcnRCZWZvcmUnXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgXS5maW5kKHByb3AgPT4gYnJ5bnR1bUNvbmZpZ1twcm9wXSk7XG4gICAgICAgIGlmICghY29udGFpbmVyUGFyYW0pIHtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZU5hbWUgPT09ICdCdXR0b24nIHx8IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRSb290Tm9kZSgpIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICAgICAgICAgIC8vIEJ1dHRvbiBzaG91bGQgYWx3YXlzIGJlIDxhPiBvciA8YnV0dG9uPiBpbnNpZGUgb3duZXIgZWxlbWVudFxuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWcuYXBwZW5kVG8gPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBicnludHVtQ29uZmlnLmFkb3B0ID0gZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgV3JhcHBlckhlbHBlci5kZXZXYXJuaW5nQ29udGFpbmVyKGluc3RhbmNlTmFtZSwgY29udGFpbmVyUGFyYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW4gc2hhZG93IERPTSAoZS5nLiBBbmd1bGFyIFZpZXdFbmNhcHN1bGF0aW9uLlNoYWRvd0RvbSksIHRoZW1lIENTUyBmcm9tIGRvY3VtZW50LmhlYWRcbiAgICAgICAgLy8gZG9lcyBub3QgY2FzY2FkZSBpbnRvIHRoZSBzaGFkb3cgcm9vdC4gSW5qZWN0IGEgbWF0Y2hpbmcgPGxpbms+IHNvIEJyeW50dW0ncyBDU1MgY2hlY2tcbiAgICAgICAgLy8gZmluZHMgdGhlIHRoZW1lLiBUaGUgQGZvbnQtZmFjZSBydWxlcyBmcm9tIGNvbXBvbmVudCBzdHlsZXMgYXJlIGFsc28gZXh0cmFjdGVkIHRvXG4gICAgICAgIC8vIGRvY3VtZW50IHNjb3BlIHNvIGRvY3VtZW50LmZvbnRzIGRldGVjdHMgdGhlbSAoc2hhZG93LXJvb3QgQGZvbnQtZmFjZSBpcyBub3QgcmVsaWFibHlcbiAgICAgICAgLy8gaW5jbHVkZWQgaW4gZG9jdW1lbnQuZm9udHMgYWNyb3NzIGFsbCBicm93c2VycykuXG4gICAgICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Um9vdE5vZGUoKTtcbiAgICAgICAgaWYgKHNoYWRvd1Jvb3QgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICAgICAgICBpbml0VGhlbWVJblNoYWRvd1Jvb3RzKCk7XG4gICAgICAgICAgICBCcnludHVtQ2hlY2tsaXN0RmlsdGVyQ29tYm9Db21wb25lbnQuZW5zdXJlRm9udHNJbkRvY3VtZW50KHNoYWRvd1Jvb3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBtZS5pbnN0YW5jZSA9IGluc3RhbmNlTmFtZSA9PT0gJ1dpZGdldCcgPyBXaWRnZXQuY3JlYXRlKGJyeW50dW1Db25maWcpIDogbmV3IGluc3RhbmNlQ2xhc3MoYnJ5bnR1bUNvbmZpZyk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyBhbGwgQGZvbnQtZmFjZSBkZWNsYXJhdGlvbnMgZnJvbSBhIHNoYWRvdyByb290J3Mgc3R5bGVzaGVldHMgYW5kIGFkZHMgdGhlbSB0b1xuICAgICAqIGRvY3VtZW50LmhlYWQgYXMgYSBzaW5nbGUgPHN0eWxlPiBlbGVtZW50LiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIEBmb250LWZhY2UgcnVsZXMgaW5zaWRlXG4gICAgICogYSBzaGFkb3cgcm9vdCBhcmUgbm90IHJlbGlhYmx5IGluY2x1ZGVkIGluIGRvY3VtZW50LmZvbnRzIGFjcm9zcyBhbGwgYnJvd3NlcnMsIGNhdXNpbmdcbiAgICAgKiBCcnludHVtJ3MgQ1NTIGNvbXBhdGliaWxpdHkgY2hlY2sgdG8gaW5jb3JyZWN0bHkgcmVwb3J0IG1pc3NpbmcgZm9udHMuXG4gICAgICogU2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzIOKAlCB0aGUgZXh0cmFjdGlvbiBydW5zIG9ubHkgb25jZSBwZXIgcGFnZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBlbnN1cmVGb250c0luRG9jdW1lbnQoc2hhZG93Um9vdDogU2hhZG93Um9vdCk6IHZvaWQge1xuICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Itc2hhZG93LXJvb3QtZm9udHMnKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9udEZhY2VSdWxlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBjb25zdCBleHRyYWN0RnJvbVNoZWV0ID0gKHNoZWV0OiBDU1NTdHlsZVNoZWV0KTogdm9pZCA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJ1bGVzID0gc2hlZXQuY3NzUnVsZXM7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBydWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocnVsZXNbaV0udHlwZSA9PT0gQ1NTUnVsZS5GT05UX0ZBQ0VfUlVMRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9udEZhY2VSdWxlcy5wdXNoKHJ1bGVzW2ldLmNzc1RleHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF9lKSB7XG4gICAgICAgICAgICAgICAgLy8gQ3Jvc3Mtb3JpZ2luIGFjY2VzcyBtYXkgdGhyb3c7IHNpbGVudGx5IHNraXBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBhZG9wdGVkU3R5bGVTaGVldHMgKEFuZ3VsYXIgMTQrIC8gbW9kZXJuIGJyb3dzZXJzKVxuICAgICAgICBjb25zdCBhZG9wdGVkU2hlZXRzOiBDU1NTdHlsZVNoZWV0W10gPSAoc2hhZG93Um9vdCBhcyBhbnkpLmFkb3B0ZWRTdHlsZVNoZWV0cyA/PyBbXTtcbiAgICAgICAgYWRvcHRlZFNoZWV0cy5mb3JFYWNoKHNoZWV0ID0+IGV4dHJhY3RGcm9tU2hlZXQoc2hlZXQpKTtcblxuICAgICAgICAvLyA8c3R5bGU+IGVsZW1lbnRzIChvbGRlciBBbmd1bGFyIG9yIGZhbGxiYWNrKVxuICAgICAgICBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N0eWxlJykuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgICBpZiAoZWwuc2hlZXQpIHtcbiAgICAgICAgICAgICAgICBleHRyYWN0RnJvbVNoZWV0KGVsLnNoZWV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGZvbnRGYWNlUnVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgICAgc3R5bGUuaWQgPSAnYi1zaGFkb3ctcm9vdC1mb250cyc7XG4gICAgICAgICAgICBzdHlsZS50ZXh0Q29udGVudCA9IGZvbnRGYWNlUnVsZXMuam9pbignXFxuJyk7XG4gICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdhdGNoIGZvciBjaGFuZ2VzXG4gICAgICogQHBhcmFtIGNoYW5nZXNcbiAgICAgKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0XG4gICAgICAgICAgICB7IGluc3RhbmNlIH0gPSB0aGlzLFxuICAgICAgICAgICAgeyBpbnN0YW5jZU5hbWUgfSA9IEJyeW50dW1DaGVja2xpc3RGaWx0ZXJDb21ib0NvbXBvbmVudDtcbiAgICAgICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgY2hhbmdlc1xuICAgICAgICBPYmplY3QuZW50cmllcyhjaGFuZ2VzKS5mb3JFYWNoKChbcHJvcCwgY2hhbmdlXSkgPT4ge1xuICAgICAgICAgICAgY29uc3RcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IChjaGFuZ2UgYXMgU2ltcGxlQ2hhbmdlKS5jdXJyZW50VmFsdWUsXG4gICAgICAgICAgICAgICAgeyBpbnN0YW5jZSB9ID0gdGhpcyxcbiAgICAgICAgICAgICAgICB7IGJyeW50dW1Db25maWdzT25seSwgYnJ5bnR1bVByb3BzIH0gPSBCcnludHVtQ2hlY2tsaXN0RmlsdGVyQ29tYm9Db21wb25lbnQ7XG4gICAgICAgICAgICBpZiAoYnJ5bnR1bVByb3BzLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgV3JhcHBlckhlbHBlci5hcHBseVByb3BWYWx1ZShpbnN0YW5jZSwgcHJvcCwgbmV3VmFsdWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoYnJ5bnR1bUNvbmZpZ3NPbmx5LmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIFdyYXBwZXJIZWxwZXIuZGV2V2FybmluZ1VwZGF0ZVByb3AoaW5zdGFuY2VOYW1lLCBwcm9wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgdGhlIGNvbXBvbmVudFxuICAgICAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmICh0aGlzLmluc3RhbmNlICYmIHRoaXMuaW5zdGFuY2UuZGVzdHJveSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=