tnx-shared 5.1.363 → 5.1.366

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 (31) hide show
  1. package/bundles/tnx-shared.umd.js +46 -13
  2. package/bundles/tnx-shared.umd.js.map +1 -1
  3. package/bundles/tnx-shared.umd.min.js +1 -1
  4. package/bundles/tnx-shared.umd.min.js.map +1 -1
  5. package/classes/base/component-base-with-button.d.ts.map +1 -1
  6. package/classes/base/data-form-base.d.ts.map +1 -1
  7. package/classes/form-schema.d.ts +6 -1
  8. package/classes/form-schema.d.ts.map +1 -1
  9. package/components/crud/crud-form/crud-form.component.d.ts +3 -2
  10. package/components/crud/crud-form/crud-form.component.d.ts.map +1 -1
  11. package/components/dropdown/dropdown.component.d.ts.map +1 -1
  12. package/components/file-explorer/file-manager/file-manager.component.d.ts.map +1 -1
  13. package/components/file-explorer/models/file-settings.d.ts +2 -2
  14. package/components/file-explorer/models/file-settings.d.ts.map +1 -1
  15. package/components/tn-tabview/tn-tabview.component.d.ts.map +1 -1
  16. package/esm2015/classes/base/component-base-with-button.js +1 -1
  17. package/esm2015/classes/base/data-form-base.js +6 -2
  18. package/esm2015/classes/form-schema.js +10 -1
  19. package/esm2015/components/crud/crud-form/crud-form.component.js +15 -8
  20. package/esm2015/components/dropdown/dropdown.component.js +6 -2
  21. package/esm2015/components/file-explorer/file-manager/file-manager.component.js +7 -3
  22. package/esm2015/components/file-explorer/models/file-settings.js +1 -1
  23. package/esm2015/components/tn-tabview/tn-tabview.component.js +2 -1
  24. package/esm2015/services/base.service.js +2 -2
  25. package/esm2015/services/notification.service.js +1 -1
  26. package/fesm2015/tnx-shared.js +41 -12
  27. package/fesm2015/tnx-shared.js.map +1 -1
  28. package/package.json +2 -2
  29. package/services/notification.service.d.ts +1 -1
  30. package/services/notification.service.d.ts.map +1 -1
  31. package/tnx-shared.metadata.json +1 -1
@@ -9,7 +9,7 @@ import { ContextMenu } from 'tn-custom-primeng/contextmenu';
9
9
  import { ComponentContextService } from '../../../app-context/component-context.service';
10
10
  import { ComponentBase } from '../../../classes/base/component-base';
11
11
  import { FormState, KeyFlashShow } from '../../../classes/constants';
12
- import { AddressControlSchema, AutoCompleteControlSchema, AutoCompletePickerControlSchema, ButtonControlSchema, CheckboxControlSchema, CheckBoxListControlSchema, CoCauToChucControlSchema, CoCauToChucPickerControlSchema, CoCauToChucPickerControlSchemaNew, ColorControlSchema, ColorPickerControlSchema, ColumnSchemaBase, CongViecPickerControlSchema, ContainerSchema, CrudFormSetting, CrudListSetting, CustomControlSchema, DateTimeControlSchema, DateTimeRangeControlSchema, DropdownControlSchema, EditorControlSchema, EntityPickerControlSchema, EventData, EventType, FileManagerControlSchema, FileUploadControlSchema, FileUploadMode, KeyFunctionReload, KeyValueControlSchema, LabelSchema, MaskControlSchema, NumberRangeControlSchema, Operator, OrganizationPickerControlSchema, PercentControlSchema, PopupSize, RadioButtonListControlSchema, ReferenceTextControlSchema, SpanControlSchema, SwitchControlSchema, TableSchema, TemplateControlSchema, TextAlign, TextAreaControlSchema, TextControlSchema, TitleSchema, UserPickerControlSchema, VanBanPickerControlSchema, WrapPickerControlSchema, } from '../../../classes/form-schema';
12
+ import { AddressControlSchema, AutoCompleteControlSchema, AutoCompletePickerControlSchema, ButtonControlSchema, CheckboxControlSchema, CheckBoxListControlSchema, ChipsControlSchema, CoCauToChucControlSchema, CoCauToChucPickerControlSchema, CoCauToChucPickerControlSchemaNew, ColorControlSchema, ColorPickerControlSchema, ColumnSchemaBase, CongViecPickerControlSchema, ContainerSchema, CrudFormSetting, CrudListSetting, CustomControlSchema, DateTimeControlSchema, DateTimeRangeControlSchema, DropdownControlSchema, EditorControlSchema, EntityPickerControlSchema, EventData, EventType, FileManagerControlSchema, FileUploadControlSchema, FileUploadMode, KeyFunctionReload, KeyValueControlSchema, LabelSchema, MaskControlSchema, NumberRangeControlSchema, Operator, OrganizationPickerControlSchema, PercentControlSchema, PopupSize, RadioButtonListControlSchema, ReferenceTextControlSchema, SpanControlSchema, SwitchControlSchema, TableSchema, TemplateControlSchema, TextAlign, TextAreaControlSchema, TextControlSchema, TitleSchema, UserPickerControlSchema, VanBanPickerControlSchema, WrapPickerControlSchema, } from '../../../classes/form-schema';
13
13
  import { FieldDefineIsTaskFormControl, RegexSplitFieldByItem } from '../../../const/common';
14
14
  import { CommonService } from '../../../services/common.service';
15
15
  import { CrudService } from '../../../services/crud.service';
@@ -1120,6 +1120,8 @@ export class CrudFormComponent extends ComponentBase {
1120
1120
  return 'congviec';
1121
1121
  if (control instanceof PercentControlSchema)
1122
1122
  return 'percent';
1123
+ if (control instanceof ChipsControlSchema)
1124
+ return 'chips';
1123
1125
  if (control instanceof ColumnSchemaBase)
1124
1126
  return 'column';
1125
1127
  return 'custom';
@@ -1206,8 +1208,8 @@ export class CrudFormComponent extends ComponentBase {
1206
1208
  }
1207
1209
  }
1208
1210
  else {
1209
- if (childNode['_hidden'] || childNode.control['_hidden'])
1210
- continue;
1211
+ if (this.checkHidden(childNode.control, childNode.parentModel, childNode.schemaPath))
1212
+ return;
1211
1213
  }
1212
1214
  if (!(yield this.validate(childNode, true))) {
1213
1215
  this._inValidForm = true;
@@ -1736,13 +1738,15 @@ export class CrudFormComponent extends ComponentBase {
1736
1738
  if (control.showEdit && !disableOpenDialog) {
1737
1739
  this.tableFormTitle = `Thêm mới ${control.label}`;
1738
1740
  this.tableFormSchema = control.rowTemplate;
1739
- this.tableFormShow = true;
1741
+ this.tableFormPopupSize = control.popupSize;
1740
1742
  this.tableFormCurrentRow = -1;
1743
+ this.tableFormData = {};
1741
1744
  this.tableFormCurrentInfo = {
1742
1745
  control,
1743
1746
  tablePath,
1744
1747
  eventType
1745
1748
  };
1749
+ this.tableFormShow = true;
1746
1750
  return;
1747
1751
  }
1748
1752
  const tableNode = this._rootNode.getNodeByPath(tablePath);
@@ -2090,9 +2094,9 @@ export class CrudFormComponent extends ComponentBase {
2090
2094
  CrudFormComponent.decorators = [
2091
2095
  { type: Component, args: [{
2092
2096
  selector: 'crud-form',
2093
- template: "<div [class]=\"_styleClass\">\r\n <form #formElement autocomplete=\"off\" autocorrect=\"off\" spellcheck=\"false\"\r\n [class]=\"'p-grid form-group crud-form' + (formClass ? ' ' + formClass : '')\"\r\n (keydown.shift.tab)=\"preventBlur($event)\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\">\r\n <ng-container *ngFor=\"let control of setting.schema\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: control, data: _modelData, parentPath: '', path: control.field, showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </form>\r\n</div>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<ng-template #customControl let-data=\"data\" let-control=\"control\" let-showLabel=\"showLabel\" let-mdWidth=\"mdWidth\"\r\n let-rowIndex=\"index\" let-path=\"path\" let-parentPath=\"parentPath\" let-tablePath=\"tablePath\"\r\n let-tableParentData=\"tableParentData\">\r\n <div *ngIf=\"!checkHidden(control, data, path)\" id=\"{{path}}-holder\"\r\n class=\"p-col-{{control.gWidth}} p-md-{{mdWidth}} {{control.class}} crud-form-control type-{{control.dataType}}\"\r\n [class.error]=\"data._errors[control.field].length > 0\"\r\n [class.not-show-in-box-holder]=\"control.showInBox === false\"\r\n [class.show-in-box-holder]=\"control.showInBox === true\" [ngStyle]=\"control.style\">\r\n <div class=\"label\" *ngIf=\"showLabel\">\r\n <label *ngIf=\"control.label\" [pTooltip]=\"control.fullLabel\" tooltipPosition=\"top\">{{control.label}}\r\n <span *ngIf=\"control.required\" class=\"star-required\">*</span></label>\r\n <span *ngIf=\"control.description\" class=\"control-description\">({{control.description}})</span>\r\n </div>\r\n <ng-container [ngSwitch]=\"control.controlType\">\r\n <ng-container *ngSwitchCase=\"'label'\">\r\n <ng-container [ngTemplateOutlet]=\"labelControl\"\r\n [ngTemplateOutletContext]=\"{control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'title'\">\r\n <label *ngIf=\"!control.ishtml\" [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | translate\"></label>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <div class=\"p-inputgroup\" *ngIf=\"control.suffFix\">\r\n <input [placeholder]=\"control.placeholder\"\r\n [required]=\"control.validators && control.validators.required\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText\r\n [type]=\"control.dataFormat\" [(ngModel)]=\"data[control.field]\" [max]=\"control.max\"\r\n [min]=\"control.min\" [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, eventType.ENTER, data, parentPath)\" />\r\n <span class=\"p-inputgroup-addon\">({{control.suffFix}})</span>\r\n </div>\r\n <input *ngIf=\"!control.suffFix\" [placeholder]=\"control.placeholder\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText [type]=\"control.dataFormat\"\r\n [(ngModel)]=\"data[control.field]\" [max]=\"control.max\" [min]=\"control.min\"\r\n [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, eventType.ENTER, data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'reference-text'\">\r\n <reference-textbox [control]=\"control\" [value]=\"data[control.field]\" [dataSource]=\"control.dataSource\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"></reference-textbox>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'template'\">\r\n <ng-container [ngTemplateOutlet]=\"control.template\"\r\n [ngTemplateOutletContext]=\"{$implicit: _rootNode, control: control, data: data, tablePath: tablePath, parentPath: parentPath, rowIndex: rowIndex, funcUpdateModel: updateModelFromExternal}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'mask'\">\r\n <tn-mask [prefix]=\"control.prefix\" [decimalPlaces]=\"control.decimalPlaces\" [suffix]=\"control.suffix\"\r\n [placeholder]=\"control.placeholder\" [disabled]=\"checkDisabled(data, control)\"\r\n [maskType]=\"control.maskType\" [autoFormat]=\"control.autoFormat\" [min]=\"control.min\"\r\n [max]=\"control.max\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </tn-mask>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'numberrange'\">\r\n <tn-number-picker-range [decimalPlaces]=\"control.decimalPlaces\"\r\n [disabled]=\"checkDisabled(data, control)\" [maskType]=\"control.maskType\" [min]=\"control.min\"\r\n [max]=\"control.max\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (search)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (blur)=\"handleFieldValueChange(control, $event, eventType.BLUR, data, parentPath)\">\r\n </tn-number-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'money'\">\r\n <input currencyMask [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText type=\"tel\"\r\n [(ngModel)]=\"data[control.field]\"\r\n [options]=\"{prefix: '', thousands: '.', decimal: ',',precision:control.dataFormat === 'money'?0:0 }\"\r\n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'phoneOrfax'\">\r\n <input [placeholder]=\"control.dataFormat==='phone'?'(999) 999-9999':'999-999-9999'\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" type=\"tel\" pInputText\r\n [(ngModel)]=\"data[control.field]\"\r\n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <textarea pInputTextarea [rows]=\"control.rows ? control.rows : 5\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" [(ngModel)]=\"data[control.field]\"\r\n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"></textarea>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'editor'\">\r\n <tn-tinymce *ngIf=\"!checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n [required]=\"control.validators && control.validators.required\" [mode]=\"control.mode\"\r\n [height]=\"control.height ? control.height : 250\" [languageCode]=\"control.languageCode\"\r\n [disabled]=\"control.disabled || (control.disableCheck && control.disableCheck(model))\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </tn-tinymce>\r\n <div *ngIf=\"checkDisabled(data, control)\" class=\"html-box\"\r\n [innerHTML]=\"data[control.field] ? (data[control.field] | safeHtml) : ''\">\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <datetime-picker [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n [control]=\"control\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </datetime-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete'\">\r\n <app-autocomplete-datasource [control]=\"control\"\r\n [suggestions]=\"data._source[control.field] || control.dataSource\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onValueChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </app-autocomplete-datasource>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetimerange'\">\r\n <tn-datetime-picker-range [disabled]=\"control.disabled\" [control]=\"control\"\r\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </tn-datetime-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <dropdown [control]=\"control\" [dataSource]=\"getControlDataSource(control, data)\"\r\n [(value)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleChangeDropdown(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onHideSmartEvent)=\"handleChangeDropdown(control, $event, eventType.HIDE, data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <file-manager *ngIf=\"control.entityKey || data[control.entityKeyField]\" [control]=\"control\"\r\n [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"control.entityKey ? control.entityKey : data[control.entityKeyField]\"\r\n [readonly]=\"control.disabled\" [layout]=\"control.layout\" [rootFolderId]=\"control.rootFolderId\"\r\n [maxFileSize]=\"control.maxFileSize\" [inTaiLieu]=\"control.inTaiLieu\"\r\n [inTaiLieuChung]=\"control.inTaiLieuChung\" [copyToFolderId]=\"control.copyToFolderId\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n [(value)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onSelected)=\"control.onSelected($event)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </file-manager>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'fileUpload'\">\r\n <file-upload [(ngModel)]=\"data[control.field]\" [sharedFolderType]=\"control.sharedFolderType\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n [readonly]=\"control.readonly\" [accept]=\"control.accept\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </file-upload>\r\n </span>\r\n <span *ngSwitchCase=\"'serviceFileUpload'\">\r\n <service-file-upload [(ngModel)]=\"data[control.field]\" [parentContext]=\"context\"\r\n [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [control]=\"control\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </service-file-upload>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'user-picker'\">\r\n <user-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [readOnlyValues]=\"data[control.field + '_readOnly']\" [(ngModel)]=\"data[control.field]\"\r\n [multiple]=\"control.multiple\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </user-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'switch'\">\r\n <p-inputSwitch [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n (onChange)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </p-inputSwitch>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <div [class]=\"control.class\" role=\"checkbox-alone\">\r\n <p-checkbox [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n [label]=\"!control.hiddenLabel ? control.label : null\"\r\n (onChange)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n binary=\"true\">\r\n </p-checkbox>\r\n <!-- <tn-checkbox [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (onChange)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"></tn-checkbox> -->\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <button type=\"button\" pButton [class]=\"control.btClass\" [icon]=\"control.icon\"\r\n [label]=\"control.label | translate\" [ngStyle]=\"control.btStyle\"\r\n (click)=\"handleButtonClick(control, $event, parentPath)\"></button>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'container'\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\" [class.not-show-in-box]=\"!control.showInBox\"\r\n [class.show-in-box]=\"control.showInBox\" [ngStyle]=\"control.boxStyle\">\r\n <ng-container *ngFor=\"let subControl of control.controls\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: subControl, data: data[control.field], parentPath: path, rowIndex: rowIndex, path: path + '.' + subControl.field, showLabel: subControl.showLabel, mdWidth: subControl.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkboxlist'\">\r\n <check-box-list [control]=\"control\" [dataSource]=\"data._source[control.field] || control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </check-box-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'radiobuttonlist'\">\r\n <radio-button-list [control]=\"control\" [dataSource]=\"control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(value)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\">\r\n </radio-button-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorPicker'\">\r\n <tn-color-picker [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </tn-color-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'spanControl'\">\r\n <span *ngIf=\"!control.ishtml\">{{data[control.field]}}</span>\r\n <span *ngIf=\"control.ishtml\" [innerHTML]=\"data[control.field]\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorControl'\">\r\n <span class=\"show-color-control\" [ngStyle]=\"{ backgroundColor: data[control.sourceField]}\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'address'\">\r\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\"\r\n [disabled]=\"checkDisabled(data, control)\" [(data)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </address-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete-picker'\">\r\n <autocomplete-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [readOnlyValues]=\"data[control.field + '_readOnly']\"\r\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </autocomplete-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'entity-picker'\">\r\n <entity-picker [control]=\"control\" [children]=\"children\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </entity-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc'\">\r\n <cocautochuc-picker [control]=\"control\" [parentOrgId]=\"control.parentOrgId\"\r\n [disabled]=\"checkDisabled(data, control)\" [parentOrgCode]=\"control.parentOrgCode\"\r\n [filter]=\"control.filter\" [multiple]=\"control.multiple\" [required]=\"control.required\"\r\n [isUsingId]=\"control.isUsingId\" [disabledParentItem]=\"control.disabledParentItem\"\r\n [rootParentId]=\"control.rootParentId\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </cocautochuc-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc-picker'\">\r\n <cocautochuc-picker-list [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [readOnlyValues]=\"data[control.field + '_readOnly']\"\r\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </cocautochuc-picker-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc-picker-new'\">\r\n <cocautochuc-picker-list-new [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [readOnlyValues]=\"data[control.field + '_readOnly']\"\r\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </cocautochuc-picker-list-new>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'vanban'\">\r\n <vanban-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [readOnly]=\"control.readOnly\" [loaiVanBan]=\"control.loaiVanBan\"\r\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </vanban-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'congviec'\">\r\n <div>\r\n <congviec-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </congviec-picker>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'percent'\">\r\n <div>\r\n <tn-mask [suffix]=\"'%'\" [placeholder]=\"control.placeholder\" [maskType]=\"'int'\"\r\n [autoFormat]=\"control.autoFormat\" [min]=\"0\" [max]=\"100\"\r\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </tn-mask>\r\n <p-slider [step]=\"1\" [min]=\"0\" [max]=\"100\" [disabled]=\"checkDisabled(data, control)\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (onSlideEnd)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </p-slider>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div [class]=\"control.class\">\r\n <tn-custom-scrollbar class=\"--has-border\" [showScrollHorizontal]=\"true\">\r\n <p-table class=\"new-table scr-table table-control\" [value]=\"data[control.field]\"\r\n [columns]=\"control.headerTemplate\" [responsive]=\"true\" [scrollable]=\"false\"\r\n [rowTrackBy]=\"trackByFuncId\"\r\n (onRowReorder)=\"handleRowOrdered(control, $event, eventType.ROW_REORDER, data, parentPath)\">\r\n <ng-template pTemplate=\"colgroup\">\r\n <colgroup>\r\n <col *ngIf=\"control.showNumber\" style=\"width: 40px\" />\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\r\n <col [style.width]=\"subControl.width\" />\r\n </ng-container>\r\n <col *ngIf=\"control.enableReorderRow\" style=\"width: 30px\" />\r\n <col *ngIf=\"control.showFunction\" [style.width]=\"control.widthFunctionColumn\" />\r\n </colgroup>\r\n </ng-template>\r\n <ng-template *ngIf=\"getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getComponentByType(_prefixCustomHeader + control.field), context: {$implicit: control.headerTemplate, crudForm: this, containerSticky: containerSticky}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-rowData let-columns>\r\n <tr>\r\n <th *ngIf=\"control.showNumber\" style=\"text-align: center\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\r\n <th *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [pTooltip]=\"subControl.fullLabel || subControl.label\" tooltipPosition=\"top\"\r\n style=\"text-align: center;\">\r\n {{subControl.label}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"control.enableReorderRow\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"control.showFunction\" class=\"table-function column-function\">\r\n <div class=\"cell-header-function\"><span>Ch\u1EE9c n\u0103ng</span></div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-ri=\"rowIndex\">\r\n <tr [pReorderableRow]=\"ri\" [class]=\"rowData.class\">\r\n <td *ngIf=\"control.showNumber\" class=\"stt\"\r\n style=\"text-align: center; vertical-align: inherit\">\r\n <span>\r\n {{ri + 1}}\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate; let i = index\">\r\n <td *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [class.control-inside]=\"true\" [class]=\"subControl.class\"\r\n [ngStyle]=\"{'text-align': getTextAlign(subControl.textAlign), 'vertical-align': 'inherit'}\">\r\n <span class=\"p-column-title\">{{subControl.label}}</span>\r\n <ng-template [ngIf]=\"getControlType(subControl) != 'column'\">\r\n <ng-container *ngTemplateOutlet=\"customControl; context: {\r\n control: subControl,\r\n data: rowData,\r\n index: ri,\r\n tablePath: path,\r\n parentPath: path + '[' + ri + ']',\r\n path: path + '[' + ri + '].' + subControl.field,\r\n showLabel: false,\r\n mdWidth: 12\r\n }\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template [ngIf]=\"getControlType(subControl) == 'column'\">\r\n <span>{{_modelData[control.field][ri][subControl.field]}}</span>\r\n </ng-template>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"control.enableReorderRow\" class=\"no-padding center v-center\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\"\r\n pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td *ngIf=\"control.showFunction\" style=\"text-align: center\"\r\n class=\"column-function text-center\">\r\n <div *ngIf=\"!control.rowButtonTemplate\"\r\n class=\"p-toolbar-group-center button-group\">\r\n <button *ngIf=\"control.showSave\" [disabled]=\"rowData._disableSave\"\r\n type=\"button\" pButton class=\"p-button-text p-button-rounded\"\r\n icon=\"pi pi-save\" [pTooltip]=\"'L\u01B0u' | translate\" tooltipPosition=\"top\"\r\n (click)=\"saveRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showEdit\" [disabled]=\"rowData._disableEdit\"\r\n type=\"button\" pButton class=\"p-button-text p-button-rounded\"\r\n icon=\"pi pi-pencil\" [pTooltip]=\"'S\u1EEDa' | translate\" tooltipPosition=\"top\"\r\n (click)=\"editRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showDelete\" [disabled]=\"rowData._disableDelete\"\r\n type=\"button\" pButton\r\n class=\"p-button-text p-button-danger p-button-rounded\"\r\n icon=\"pi pi-trash\" [pTooltip]=\"'X\u00F3a' | translate\" tooltipPosition=\"top\"\r\n (click)=\"deleteRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.rowButtons\" type=\"button\" pButton\r\n icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\"\r\n pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData, control)\"></button>\r\n </div>\r\n <div *ngIf=\"control.rowButtonTemplate\"\r\n class=\"p-toolbar-group-center button-group\">\r\n <ng-container\r\n *ngTemplateOutlet=\"control.rowButtonTemplate; context: {rowData: _modelData[control.field][ri], rowIndex: ri, path: path, control: control}\">\r\n </ng-container>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template *ngIf=\"control.summaryTemplate\" pTemplate=\"summary\" let-rowData>\r\n <ng-container *ngTemplateOutlet=\"control.summaryTemplate; context: {rowData: rowData}\">\r\n </ng-container>\r\n </ng-template>\r\n </p-table>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"control.showFooter\" class=\"--table-schema-footer\">\r\n <button *ngIf=\"control.showAdd\" type=\"button\" pButton style=\"width:auto\" label=\"Th\u00EAm m\u1EDBi\"\r\n icon=\"pi pi-plus\" class=\"p-button-text\" (click)=\"addNewRow(control, path)\"></button>\r\n <span *ngIf=\"control.showDialog\" style=\"font-weight: normal;\">\r\n <p-checkbox label=\"M\u1EDF dialog\" [binary]=\"true\" [(ngModel)]=\"control.showEdit\">\r\n </p-checkbox>\r\n </span>\r\n <button *ngIf=\"control.enableAddMulti\" type=\"button\" pButton\r\n style=\"width:auto; margin-left:10px;\" label=\"Th\u00EAm nhi\u1EC1u\" icon=\"pi pi-clone\"\r\n class=\"p-button-text\" (click)=\"addMultiRow(control, 5, path)\"></button>\r\n <button *ngFor=\"let bt of control.footerButtons\" type=\"button\" pButton [class]=\"bt.class\"\r\n [icon]=\"bt.icon\" [label]=\"bt.label | translate\" style=\"width:auto; margin-left:10px;\"\r\n (click)=\"messageRow( -1, control, path)\"></button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(control.field)\" [ngTemplateOutletContext]=\"{\r\n crudForm: this, data: data, index: rowIndex, parentPath: parentPath, control: control, changeFunc: handleFieldValueChange\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"validation; context: {control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #validation let-control=\"control\" let-data=\"data\">\r\n <ng-container *ngIf=\"data._errors[control.field].length > 0\">\r\n <div class=\"error-container\">\r\n <ng-container *ngFor=\"let error of data._errors[control.field]\">\r\n <div class=\"error-item\" *ngIf=\"error\">\r\n <ng-container [ngTemplateOutlet]=\"errorMessage\" [ngTemplateOutletContext]=\"{content: error}\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #errorMessage let-content=\"content\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-ban\"></i>\r\n <span> {{content}}</span>\r\n </div>\r\n</ng-template>\r\n<ng-template #labelControl let-control=\"control\">\r\n <ng-container>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"!control.ishtml\" [attr.label-index]=\"control.indexLabel\"\r\n [pTooltip]=\"control.title\" tooltipPosition=\"top\" tooltipStyleClass=\"wrap\" [escape]=\"false\"\r\n [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | safeHtml\"\r\n [attr.label-index]=\"control.indexLabel\"></label>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<ng-template #templateCongViecForm let-control=\"control\">\r\n <base-congviec-form [control]=\"control\" [parentSetting]=\"congViecSetting\" [tenCongViec]=\"control.data.tenCongViec\">\r\n </base-congviec-form>\r\n</ng-template>\r\n<tn-dialog *ngIf=\"tableFormShow\" #dialog [styleClass]=\"'address-form'\" [header]=\"tableFormTitle | translate\"\r\n [popupSize]=\"tableFormPopupSize\" (onHide)=\"tableFormShow = false\">\r\n <table-detail-form #formBase [parentSetting]=\"setting\" [schema]=\"tableFormSchema\" [data]=\"tableFormData\"\r\n (onSaved)=\"handleSavedTableRow($event)\" (onCancel)=\"tableFormShow = false\">\r\n </table-detail-form>\r\n</tn-dialog>",
2097
+ template: "<div [class]=\"_styleClass\">\r\n <form #formElement autocomplete=\"off\" autocorrect=\"off\" spellcheck=\"false\"\r\n [class]=\"'p-grid form-group crud-form' + (formClass ? ' ' + formClass : '')\"\r\n (keydown.shift.tab)=\"preventBlur($event)\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\">\r\n <ng-container *ngFor=\"let control of setting.schema\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: control, data: _modelData, parentPath: '', path: control.field, showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </form>\r\n</div>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<ng-template #customControl let-data=\"data\" let-control=\"control\" let-showLabel=\"showLabel\" let-mdWidth=\"mdWidth\"\r\n let-rowIndex=\"index\" let-path=\"path\" let-parentPath=\"parentPath\" let-tablePath=\"tablePath\"\r\n let-tableParentData=\"tableParentData\">\r\n <div *ngIf=\"!checkHidden(control, data, path)\" id=\"{{path}}-holder\"\r\n class=\"p-col-{{control.gWidth}} p-md-{{mdWidth}} {{control.class}} crud-form-control type-{{control.dataType}}\"\r\n [class.error]=\"data._errors[control.field].length > 0\"\r\n [class.not-show-in-box-holder]=\"control.showInBox === false\"\r\n [class.show-in-box-holder]=\"control.showInBox === true\" [ngStyle]=\"control.style\">\r\n <div class=\"label\" *ngIf=\"showLabel\">\r\n <label *ngIf=\"control.label\" [pTooltip]=\"control.fullLabel\" tooltipPosition=\"top\">{{control.label}}\r\n <span *ngIf=\"control.required\" class=\"star-required\">*</span></label>\r\n <span *ngIf=\"control.description\" class=\"control-description\">({{control.description}})</span>\r\n </div>\r\n <ng-container [ngSwitch]=\"control.controlType\">\r\n <ng-container *ngSwitchCase=\"'label'\">\r\n <ng-container [ngTemplateOutlet]=\"labelControl\"\r\n [ngTemplateOutletContext]=\"{control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'title'\">\r\n <label *ngIf=\"!control.ishtml\" [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | translate\"></label>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <div class=\"p-inputgroup\" *ngIf=\"control.suffFix\">\r\n <input [placeholder]=\"control.placeholder\"\r\n [required]=\"control.validators && control.validators.required\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText\r\n [type]=\"control.dataFormat\" [(ngModel)]=\"data[control.field]\" [max]=\"control.max\"\r\n [min]=\"control.min\" [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, eventType.ENTER, data, parentPath)\" />\r\n <span class=\"p-inputgroup-addon\">({{control.suffFix}})</span>\r\n </div>\r\n <input *ngIf=\"!control.suffFix\" [placeholder]=\"control.placeholder\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText [type]=\"control.dataFormat\"\r\n [(ngModel)]=\"data[control.field]\" [max]=\"control.max\" [min]=\"control.min\"\r\n [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, eventType.ENTER, data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'reference-text'\">\r\n <reference-textbox [control]=\"control\" [value]=\"data[control.field]\" [dataSource]=\"control.dataSource\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"></reference-textbox>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'template'\">\r\n <ng-container [ngTemplateOutlet]=\"control.template\"\r\n [ngTemplateOutletContext]=\"{$implicit: _rootNode, control: control, data: data, tablePath: tablePath, parentPath: parentPath, rowIndex: rowIndex, funcUpdateModel: updateModelFromExternal}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'mask'\">\r\n <tn-mask [prefix]=\"control.prefix\" [decimalPlaces]=\"control.decimalPlaces\" [suffix]=\"control.suffix\"\r\n [placeholder]=\"control.placeholder\" [disabled]=\"checkDisabled(data, control)\"\r\n [maskType]=\"control.maskType\" [autoFormat]=\"control.autoFormat\" [min]=\"control.min\"\r\n [max]=\"control.max\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </tn-mask>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'numberrange'\">\r\n <tn-number-picker-range [decimalPlaces]=\"control.decimalPlaces\"\r\n [disabled]=\"checkDisabled(data, control)\" [maskType]=\"control.maskType\" [min]=\"control.min\"\r\n [max]=\"control.max\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (search)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (blur)=\"handleFieldValueChange(control, $event, eventType.BLUR, data, parentPath)\">\r\n </tn-number-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'money'\">\r\n <input currencyMask [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText type=\"tel\"\r\n [(ngModel)]=\"data[control.field]\"\r\n [options]=\"{prefix: '', thousands: '.', decimal: ',',precision:control.dataFormat === 'money'?0:0 }\"\r\n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'phoneOrfax'\">\r\n <input [placeholder]=\"control.dataFormat==='phone'?'(999) 999-9999':'999-999-9999'\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" type=\"tel\" pInputText\r\n [(ngModel)]=\"data[control.field]\"\r\n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <textarea pInputTextarea [rows]=\"control.rows ? control.rows : 5\"\r\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" [(ngModel)]=\"data[control.field]\"\r\n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"></textarea>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'editor'\">\r\n <tn-tinymce *ngIf=\"!checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n [required]=\"control.validators && control.validators.required\" [mode]=\"control.mode\"\r\n [height]=\"control.height ? control.height : 250\" [languageCode]=\"control.languageCode\"\r\n [disabled]=\"control.disabled || (control.disableCheck && control.disableCheck(model))\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </tn-tinymce>\r\n <div *ngIf=\"checkDisabled(data, control)\" class=\"html-box\"\r\n [innerHTML]=\"data[control.field] ? (data[control.field] | safeHtml) : ''\">\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <datetime-picker [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n [control]=\"control\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </datetime-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete'\">\r\n <app-autocomplete-datasource [control]=\"control\"\r\n [suggestions]=\"data._source[control.field] || control.dataSource\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onValueChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </app-autocomplete-datasource>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetimerange'\">\r\n <tn-datetime-picker-range [disabled]=\"control.disabled\" [control]=\"control\"\r\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </tn-datetime-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <dropdown [control]=\"control\" [dataSource]=\"getControlDataSource(control, data)\"\r\n [(value)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleChangeDropdown(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onHideSmartEvent)=\"handleChangeDropdown(control, $event, eventType.HIDE, data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <file-manager *ngIf=\"control.entityKey || data[control.entityKeyField] || control.rootFolderId\"\r\n [control]=\"control\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"control.entityKey ? control.entityKey : data[control.entityKeyField]\"\r\n [readonly]=\"control.disabled\" [layout]=\"control.layout\" [rootFolderId]=\"control.rootFolderId\"\r\n [maxFileSize]=\"control.maxFileSize\" [inTaiLieu]=\"control.inTaiLieu\"\r\n [inTaiLieuChung]=\"control.inTaiLieuChung\" [copyToFolderId]=\"control.copyToFolderId\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n [(value)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onSelected)=\"control.onSelected($event)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </file-manager>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'fileUpload'\">\r\n <file-upload [(ngModel)]=\"data[control.field]\" [sharedFolderType]=\"control.sharedFolderType\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n [readonly]=\"control.readonly\" [accept]=\"control.accept\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </file-upload>\r\n </span>\r\n <span *ngSwitchCase=\"'serviceFileUpload'\">\r\n <service-file-upload *ngIf=\"control.entityKey || data[control.entityKeyfield] || control.rootFolderId\"\r\n [(ngModel)]=\"data[control.field]\" [parentContext]=\"context\" [serviceCode]=\"control.serviceCode\"\r\n [entity]=\"control.entity\"\r\n [entityKey]=\"control.entityKey ? control.entityKey : data[control.entityKeyField]\"\r\n [control]=\"control\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </service-file-upload>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'user-picker'\">\r\n <user-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [readOnlyValues]=\"data[control.field + '_readOnly']\" [(ngModel)]=\"data[control.field]\"\r\n [multiple]=\"control.multiple\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </user-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'switch'\">\r\n <p-inputSwitch [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n (onChange)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </p-inputSwitch>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <div [class]=\"control.class\" role=\"checkbox-alone\">\r\n <p-checkbox [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n [label]=\"!control.hiddenLabel ? control.label : null\"\r\n (onChange)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n binary=\"true\">\r\n </p-checkbox>\r\n <!-- <tn-checkbox [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (onChange)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"></tn-checkbox> -->\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <button type=\"button\" pButton [class]=\"control.btClass\" [icon]=\"control.icon\"\r\n [label]=\"control.label | translate\" [ngStyle]=\"control.btStyle\"\r\n (click)=\"handleButtonClick(control, $event, parentPath)\"></button>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'container'\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\" [class.not-show-in-box]=\"!control.showInBox\"\r\n [class.show-in-box]=\"control.showInBox\" [ngStyle]=\"control.boxStyle\">\r\n <ng-container *ngFor=\"let subControl of control.controls\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: subControl, data: data[control.field], parentPath: path, rowIndex: rowIndex, path: path + '.' + subControl.field, showLabel: subControl.showLabel, mdWidth: subControl.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkboxlist'\">\r\n <check-box-list [control]=\"control\" [dataSource]=\"data._source[control.field] || control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </check-box-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'radiobuttonlist'\">\r\n <radio-button-list [control]=\"control\" [dataSource]=\"control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(value)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\">\r\n </radio-button-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorPicker'\">\r\n <tn-color-picker [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </tn-color-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'spanControl'\">\r\n <span *ngIf=\"!control.ishtml\">{{data[control.field]}}</span>\r\n <span *ngIf=\"control.ishtml\" [innerHTML]=\"data[control.field]\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorControl'\">\r\n <span class=\"show-color-control\" [ngStyle]=\"{ backgroundColor: data[control.sourceField]}\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'address'\">\r\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\"\r\n [disabled]=\"checkDisabled(data, control)\" [(data)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </address-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete-picker'\">\r\n <autocomplete-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [readOnlyValues]=\"data[control.field + '_readOnly']\"\r\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </autocomplete-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'entity-picker'\">\r\n <entity-picker [control]=\"control\" [children]=\"children\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </entity-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc'\">\r\n <cocautochuc-picker [control]=\"control\" [parentOrgId]=\"control.parentOrgId\"\r\n [disabled]=\"checkDisabled(data, control)\" [parentOrgCode]=\"control.parentOrgCode\"\r\n [filter]=\"control.filter\" [multiple]=\"control.multiple\" [required]=\"control.required\"\r\n [isUsingId]=\"control.isUsingId\" [disabledParentItem]=\"control.disabledParentItem\"\r\n [rootParentId]=\"control.rootParentId\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </cocautochuc-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc-picker'\">\r\n <cocautochuc-picker-list [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [readOnlyValues]=\"data[control.field + '_readOnly']\"\r\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </cocautochuc-picker-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc-picker-new'\">\r\n <cocautochuc-picker-list-new [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [readOnlyValues]=\"data[control.field + '_readOnly']\"\r\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </cocautochuc-picker-list-new>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'vanban'\">\r\n <vanban-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [readOnly]=\"control.readOnly\" [loaiVanBan]=\"control.loaiVanBan\"\r\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </vanban-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'congviec'\">\r\n <div>\r\n <congviec-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </congviec-picker>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'percent'\">\r\n <div>\r\n <tn-mask [suffix]=\"'%'\" [placeholder]=\"control.placeholder\" [maskType]=\"'int'\"\r\n [autoFormat]=\"control.autoFormat\" [min]=\"0\" [max]=\"100\"\r\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </tn-mask>\r\n <p-slider [step]=\"1\" [min]=\"0\" [max]=\"100\" [disabled]=\"checkDisabled(data, control)\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (onSlideEnd)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </p-slider>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'chips'\">\r\n <p-chips [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onAdd)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\r\n (onRemove)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"></p-chips>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'entity-picker'\">\r\n <entity-picker [control]=\"control\" [children]=\"children\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\r\n </entity-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div [class]=\"control.class\">\r\n <tn-custom-scrollbar class=\"--has-border\" [showScrollHorizontal]=\"true\">\r\n <p-table class=\"new-table scr-table table-control\" [value]=\"data[control.field]\"\r\n [columns]=\"control.headerTemplate\" [responsive]=\"true\" [scrollable]=\"false\"\r\n [rowTrackBy]=\"trackByFuncId\"\r\n (onRowReorder)=\"handleRowOrdered(control, $event, eventType.ROW_REORDER, data, parentPath)\">\r\n <ng-template pTemplate=\"colgroup\">\r\n <colgroup>\r\n <col *ngIf=\"control.showNumber\" style=\"width: 40px\" />\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\r\n <col *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [style.width]=\"subControl.width\" />\r\n </ng-container>\r\n <col *ngIf=\"control.enableReorderRow\" style=\"width: 30px\" />\r\n <col *ngIf=\"control.showFunction\" [style.width]=\"control.widthFunctionColumn\" />\r\n </colgroup>\r\n </ng-template>\r\n <ng-template *ngIf=\"getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getComponentByType(_prefixCustomHeader + control.field), context: {$implicit: control.headerTemplate, crudForm: this, containerSticky: containerSticky}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-rowData let-columns>\r\n <tr>\r\n <th *ngIf=\"control.showNumber\" style=\"text-align: center\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\r\n <th *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [pTooltip]=\"subControl.fullLabel || subControl.label\" tooltipPosition=\"top\"\r\n style=\"text-align: center;\">\r\n {{subControl.label}}\r\n <span *ngIf=\"subControl.required\" class=\"star-required\">*</span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"control.enableReorderRow\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"control.showFunction\" class=\"table-function column-function\">\r\n <div class=\"cell-header-function\"><span>Ch\u1EE9c n\u0103ng</span></div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-ri=\"rowIndex\">\r\n <tr [pReorderableRow]=\"ri\" [class]=\"rowData.class\">\r\n <td *ngIf=\"control.showNumber\" class=\"stt\"\r\n style=\"text-align: center; vertical-align: inherit\">\r\n <span>\r\n {{ri + 1}}\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate; let i = index\">\r\n <td *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [class.control-inside]=\"true\" [class]=\"subControl.class\"\r\n [ngStyle]=\"{'text-align': getTextAlign(subControl.textAlign), 'vertical-align': 'inherit'}\">\r\n <span class=\"p-column-title\">{{subControl.label}}</span>\r\n <ng-template [ngIf]=\"getControlType(subControl) != 'column'\">\r\n <ng-container *ngTemplateOutlet=\"customControl; context: {\r\n control: subControl,\r\n data: rowData,\r\n index: ri,\r\n tablePath: path,\r\n parentPath: path + '[' + ri + ']',\r\n path: path + '[' + ri + '].' + subControl.field,\r\n showLabel: false,\r\n mdWidth: 12\r\n }\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template [ngIf]=\"getControlType(subControl) == 'column'\">\r\n <span>{{_modelData[control.field][ri][subControl.field]}}</span>\r\n </ng-template>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"control.enableReorderRow\" class=\"no-padding center v-center\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\"\r\n pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td *ngIf=\"control.showFunction\" style=\"text-align: center\"\r\n class=\"column-function text-center\">\r\n <div *ngIf=\"!control.rowButtonTemplate\"\r\n class=\"p-toolbar-group-center button-group\">\r\n <button *ngIf=\"control.showSave\" [disabled]=\"rowData._disableSave\"\r\n type=\"button\" pButton class=\"p-button-text p-button-rounded\"\r\n icon=\"pi pi-save\" [pTooltip]=\"'L\u01B0u' | translate\" tooltipPosition=\"top\"\r\n (click)=\"saveRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showEdit\" [disabled]=\"rowData._disableEdit\"\r\n type=\"button\" pButton class=\"p-button-text p-button-rounded\"\r\n icon=\"pi pi-pencil\" [pTooltip]=\"'S\u1EEDa' | translate\" tooltipPosition=\"top\"\r\n (click)=\"editRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showDelete\" [disabled]=\"rowData._disableDelete\"\r\n type=\"button\" pButton\r\n class=\"p-button-text p-button-danger p-button-rounded\"\r\n icon=\"pi pi-trash\" [pTooltip]=\"'X\u00F3a' | translate\" tooltipPosition=\"top\"\r\n (click)=\"deleteRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.rowButtons\" type=\"button\" pButton\r\n icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\"\r\n pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData, control)\"></button>\r\n </div>\r\n <div *ngIf=\"control.rowButtonTemplate\"\r\n class=\"p-toolbar-group-center button-group\">\r\n <ng-container\r\n *ngTemplateOutlet=\"control.rowButtonTemplate; context: {rowData: _modelData[control.field][ri], rowIndex: ri, path: path, control: control}\">\r\n </ng-container>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template *ngIf=\"control.summaryTemplate\" pTemplate=\"summary\" let-rowData>\r\n <ng-container *ngTemplateOutlet=\"control.summaryTemplate; context: {rowData: rowData}\">\r\n </ng-container>\r\n </ng-template>\r\n </p-table>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"control.showFooter\" class=\"--table-schema-footer\">\r\n <button *ngIf=\"control.showAdd\" type=\"button\" pButton style=\"width:auto\" label=\"Th\u00EAm m\u1EDBi\"\r\n icon=\"pi pi-plus\" class=\"p-button-text\" (click)=\"addNewRow(control, path)\"></button>\r\n <span *ngIf=\"control.showDialog\" style=\"font-weight: normal;\">\r\n <p-checkbox label=\"M\u1EDF dialog\" [binary]=\"true\" [(ngModel)]=\"control.showEdit\">\r\n </p-checkbox>\r\n </span>\r\n <button *ngIf=\"control.enableAddMulti\" type=\"button\" pButton\r\n style=\"width:auto; margin-left:10px;\" label=\"Th\u00EAm nhi\u1EC1u\" icon=\"pi pi-clone\"\r\n class=\"p-button-text\" (click)=\"addMultiRow(control, 5, path)\"></button>\r\n <button *ngFor=\"let bt of control.footerButtons\" type=\"button\" pButton [class]=\"bt.class\"\r\n [icon]=\"bt.icon\" [label]=\"bt.label | translate\" style=\"width:auto; margin-left:10px;\"\r\n (click)=\"messageRow( -1, control, path)\"></button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(control.field)\" [ngTemplateOutletContext]=\"{\r\n crudForm: this, data: data, index: rowIndex, parentPath: parentPath, control: control, changeFunc: handleFieldValueChange\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"validation; context: {control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #validation let-control=\"control\" let-data=\"data\">\r\n <ng-container *ngIf=\"data._errors[control.field].length > 0\">\r\n <div class=\"error-container\">\r\n <ng-container *ngFor=\"let error of data._errors[control.field]\">\r\n <div class=\"error-item\" *ngIf=\"error\">\r\n <ng-container [ngTemplateOutlet]=\"errorMessage\" [ngTemplateOutletContext]=\"{content: error}\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #errorMessage let-content=\"content\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-ban\"></i>\r\n <span> {{content}}</span>\r\n </div>\r\n</ng-template>\r\n<ng-template #labelControl let-control=\"control\">\r\n <ng-container>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"!control.ishtml\" [attr.label-index]=\"control.indexLabel\"\r\n [pTooltip]=\"control.title\" tooltipPosition=\"top\" tooltipStyleClass=\"wrap\" [escape]=\"false\"\r\n [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | safeHtml\"\r\n [attr.label-index]=\"control.indexLabel\"></label>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<ng-template #templateCongViecForm let-control=\"control\">\r\n <base-congviec-form [control]=\"control\" [parentSetting]=\"congViecSetting\" [tenCongViec]=\"control.data.tenCongViec\">\r\n </base-congviec-form>\r\n</ng-template>\r\n<tn-dialog *ngIf=\"tableFormShow\" #dialog [styleClass]=\"'address-form'\" [header]=\"tableFormTitle | translate\"\r\n [popupSize]=\"tableFormPopupSize\" (onHide)=\"tableFormShow = false\">\r\n <table-detail-form #formBase [parentSetting]=\"setting\" [schema]=\"tableFormSchema\" [data]=\"tableFormData\"\r\n (onSaved)=\"handleSavedTableRow($event)\" (onCancel)=\"tableFormShow = false\">\r\n </table-detail-form>\r\n</tn-dialog>",
2094
2098
  providers: [ComponentContextService],
2095
- styles: [".label-only{font-weight:700;margin-bottom:1em}div.label{position:relative}div.label .star-required{color:red;padding-left:.2em;padding-top:.3em;position:absolute}div.type-container.not-show-in-box-holder{padding:0}.--table-schema-footer{align-items:center;background:#f8f9fa;border:1px solid #e9ecef;color:#495057;display:flex;font-weight:600;padding:.5em}.show-in-box{border:1px solid #ced4da;border-radius:5px}.not-show-in-box{padding:0}.view-mode div.label{padding-bottom:3px}.view-mode div.label label{font-size:.85em;font-weight:700}.view-mode>span:not(:empty){display:inline-block;padding:5px 0;width:100%}.view-mode.type-table div.label+div{padding:5px 0}td>.view-mode{display:inline-block;padding:.25rem .5rem}td>.view-mode .view-mode{padding:0}.crud-form-control div[role=checkbox-alone]{margin-top:24px}.crud-form-control div[role=checkbox-alone].mg-top-0{margin-top:0}.crud-form-control .label+div[role=checkbox-alone]{margin-top:11px}.crud-form-control.type-table div[role=checkbox-alone]{margin-top:6px;text-align:center}.crud-form-control.type-table div[role=checkbox-alone].mg-top-0{margin-top:0}.crud-form-control.type-table div[role=checkbox-alone].align-left{text-align:left}.crud-form-control.type-title{border-bottom:1px solid #cfcfcf;color:#025ba7;font-size:1.2rem;font-weight:700;margin-bottom:5px;padding:5px;text-transform:uppercase}.crud-form-control.type-title>.label{margin-bottom:0}.control-description{color:#007eff;font-size:.8rem;font-weight:700;margin-bottom:5px;margin-left:10px}.cell-header-function{align-items:center;display:flex}.cell-header-function>span{flex:1 1;text-align:center}.cell-header-function button{height:24px;margin:0;padding:0;width:24px}::ng-deep .crud-form-control .tn-check-box-list{margin-top:5px}::ng-deep .crud-form-control>div.label{font-size:.9rem;height:1.15em;margin-bottom:5px}::ng-deep .crud-form-control>div.label+*{width:100%}::ng-deep .crud-form-control>.error-container .error-item{-webkit-animation:shrink .1s;animation:shrink .1s;min-height:20px;overflow:visible;padding-top:5px}::ng-deep .crud-form-control>.error-container .error-item .error-content{-webkit-animation:fadeIn .1s;animation:fadeIn .1s;color:red;display:flex;font-size:.9em;position:relative}::ng-deep .crud-form-control>.error-container .error-item .error-content i{display:flex;font-size:.9em;padding-top:1px}::ng-deep .crud-form-control>.error-container .error-item .error-content span{display:flex;padding-left:5px}::ng-deep .crud-form-control.no-label>div.label{display:none}::ng-deep .crud-form-control.error .p-dropdown,::ng-deep .crud-form-control.error .p-inputtext,::ng-deep .crud-form-control.error .p-multiselect,::ng-deep .crud-form-control.error .tn-dropdown,::ng-deep .crud-form-control.error input,::ng-deep .crud-form-control.error select,::ng-deep .crud-form-control.error textarea{border-color:#ff5722!important}::ng-deep .crud-form-control.error .p-autocomplete-multiple-container:not(.p-disabled).p-focus,::ng-deep .crud-form-control.error .p-inputtext:enabled:focus,::ng-deep .crud-form-control.error .tn-dropdown:not(.p-disabled).p-focus{box-shadow:0 0 0 .2rem #ffc4b3}::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-dropdown,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-inputtext,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-multiselect,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .tn-dropdown,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) input,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) select,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) textarea{border-color:#ced4da!important}::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-autocomplete-multiple-container:not(.p-disabled).p-focus,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-dropdown.tn-dropdown.p-focus,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-inputtext:enabled:focus{box-shadow:0 0 0 .2rem #a6d5fa}@-webkit-keyframes fadeIn{0%{opacity:0;top:-25px}to{opacity:1;top:0}}@keyframes fadeIn{0%{opacity:0;top:-25px}to{opacity:1;top:0}}@-webkit-keyframes shrink{0%{height:0}to{height:20px}}@keyframes shrink{0%{height:0}to{height:20px}}@media screen and (min-width:40.063em){.label-right{padding-left:2em}}::ng-deep crud-form .crud-form-container{padding:.5rem .5rem 0}::ng-deep crud-form .p-datatable .p-datatable-tbody tr td.control-inside,::ng-deep crud-form .p-datatable .p-datatable-tbody tr td.control-inside .show-in-box:not(.crud-form-control),::ng-deep crud-form base-congviec-form crud-form>.crud-form-container{padding:0}:host ::ng-deep .tox-tinymce{border:none;border-top:1px solid #ccc;overflow:unset}:host ::ng-deep .tox-tinymce .tox-editor-container{overflow:unset}:host ::ng-deep .tox-tinymce .tox-toolbar{border:1px solid #ccc;border-bottom:none}:host ::ng-deep .tox-tinymce .tox-edit-area{border:1px solid #ccc}:host ::ng-deep .tox-tinymce .tox-edit-area iframe{box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}:host ::ng-deep .tox-tinymce .tox-menubar{border:1px solid #ccc}:host ::ng-deep .tox .tox-edit-area.tinymce-focus{border:1px solid #66afe9;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 3px 0 #66afe9;transition:box-shadow .3s,border-color .3s;transition-delay:0s,0s;transition-duration:.3s,.3s;transition-property:box-shadow,border-color;transition-timing-function:ease,ease}:host ::ng-deep .rq .tox .tox-edit-area{border-left-color:#ff4c46}.no-value{font-size:.8em}:host ::ng-deep .table-schema-paging{display:block;margin-bottom:40px}"]
2099
+ styles: [".label-only{font-weight:700;margin-bottom:1em}div.label{position:relative}div.label .star-required{position:absolute}div.label .star-required,th>span.star-required{color:red;padding-left:.2em;padding-top:.3em}div.type-container.not-show-in-box-holder{padding:0}.--table-schema-footer{align-items:center;background:#f8f9fa;border:1px solid #e9ecef;color:#495057;display:flex;font-weight:600;padding:.5em}.show-in-box{border:1px solid #ced4da;border-radius:5px}.not-show-in-box{padding:0}.view-mode div.label{padding-bottom:3px}.view-mode div.label label{font-size:.85em;font-weight:700}.view-mode>span:not(:empty){display:inline-block;padding:5px 0;width:100%}.view-mode.type-table div.label+div{padding:5px 0}td>.view-mode{display:inline-block;padding:.25rem .5rem}td>.view-mode .view-mode{padding:0}.crud-form-control div[role=checkbox-alone]{margin-top:24px}.crud-form-control div[role=checkbox-alone].mg-top-0{margin-top:0}.crud-form-control .label+div[role=checkbox-alone]{margin-top:11px}.crud-form-control.type-table div[role=checkbox-alone]{margin-top:6px;text-align:center}.crud-form-control.type-table div[role=checkbox-alone].mg-top-0{margin-top:0}.crud-form-control.type-table div[role=checkbox-alone].align-left{text-align:left}.crud-form-control.type-title{border-bottom:1px solid #cfcfcf;color:#025ba7;font-size:1.2rem;font-weight:700;margin-bottom:5px;padding:5px;text-transform:uppercase}.crud-form-control.type-title>.label{margin-bottom:0}.control-description{color:#007eff;font-size:.8rem;font-weight:700;margin-bottom:5px;margin-left:10px}.cell-header-function{align-items:center;display:flex}.cell-header-function>span{flex:1 1;text-align:center}.cell-header-function button{height:24px;margin:0;padding:0;width:24px}::ng-deep .crud-form-control .tn-check-box-list{margin-top:5px}::ng-deep .crud-form-control>div.label{font-size:.9rem;height:1.15em;margin-bottom:5px}::ng-deep .crud-form-control>div.label+*{width:100%}::ng-deep .crud-form-control>.error-container .error-item{-webkit-animation:shrink .1s;animation:shrink .1s;min-height:20px;overflow:visible;padding-top:5px}::ng-deep .crud-form-control>.error-container .error-item .error-content{-webkit-animation:fadeIn .1s;animation:fadeIn .1s;color:red;display:flex;font-size:.9em;position:relative}::ng-deep .crud-form-control>.error-container .error-item .error-content i{display:flex;font-size:.9em;padding-top:1px}::ng-deep .crud-form-control>.error-container .error-item .error-content span{display:flex;padding-left:5px}::ng-deep .crud-form-control.no-label>div.label{display:none}::ng-deep .crud-form-control.error .p-dropdown,::ng-deep .crud-form-control.error .p-inputtext,::ng-deep .crud-form-control.error .p-multiselect,::ng-deep .crud-form-control.error .tn-dropdown,::ng-deep .crud-form-control.error input,::ng-deep .crud-form-control.error select,::ng-deep .crud-form-control.error textarea{border-color:#ff5722!important}::ng-deep .crud-form-control.error .p-autocomplete-multiple-container:not(.p-disabled).p-focus,::ng-deep .crud-form-control.error .p-inputtext:enabled:focus,::ng-deep .crud-form-control.error .tn-dropdown:not(.p-disabled).p-focus{box-shadow:0 0 0 .2rem #ffc4b3}::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-dropdown,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-inputtext,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-multiselect,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .tn-dropdown,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) input,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) select,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) textarea{border-color:#ced4da!important}::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-autocomplete-multiple-container:not(.p-disabled).p-focus,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-dropdown.tn-dropdown.p-focus,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-inputtext:enabled:focus{box-shadow:0 0 0 .2rem #a6d5fa}@-webkit-keyframes fadeIn{0%{opacity:0;top:-25px}to{opacity:1;top:0}}@keyframes fadeIn{0%{opacity:0;top:-25px}to{opacity:1;top:0}}@-webkit-keyframes shrink{0%{height:0}to{height:20px}}@keyframes shrink{0%{height:0}to{height:20px}}@media screen and (min-width:40.063em){.label-right{padding-left:2em}}::ng-deep crud-form .crud-form-container{padding:.5rem .5rem 0}::ng-deep crud-form .p-datatable .p-datatable-tbody tr td.control-inside,::ng-deep crud-form .p-datatable .p-datatable-tbody tr td.control-inside .show-in-box:not(.crud-form-control),::ng-deep crud-form base-congviec-form crud-form>.crud-form-container{padding:0}:host ::ng-deep .tox-tinymce{border:none;border-top:1px solid #ccc;overflow:unset}:host ::ng-deep .tox-tinymce .tox-editor-container{overflow:unset}:host ::ng-deep .tox-tinymce .tox-toolbar{border:1px solid #ccc;border-bottom:none}:host ::ng-deep .tox-tinymce .tox-edit-area{border:1px solid #ccc}:host ::ng-deep .tox-tinymce .tox-edit-area iframe{box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}:host ::ng-deep .tox-tinymce .tox-menubar{border:1px solid #ccc}:host ::ng-deep .tox .tox-edit-area.tinymce-focus{border:1px solid #66afe9;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 3px 0 #66afe9;transition:box-shadow .3s,border-color .3s;transition-delay:0s,0s;transition-duration:.3s,.3s;transition-property:box-shadow,border-color;transition-timing-function:ease,ease}:host ::ng-deep .rq .tox .tox-edit-area{border-left-color:#ff4c46}.no-value{font-size:.8em}:host ::ng-deep .table-schema-paging{display:block;margin-bottom:40px}"]
2096
2100
  },] }
2097
2101
  ];
2098
2102
  CrudFormComponent.ctorParameters = () => [
@@ -2135,8 +2139,9 @@ CrudFormComponent.propDecorators = {
2135
2139
  export class ControlTreeNode {
2136
2140
  constructor(model, schemas, field, parentNode) {
2137
2141
  this.childNodes = [];
2138
- this.childNodeDic = {};
2139
2142
  this.hasSchema = true;
2143
+ this.isRootNode = false;
2144
+ this.childNodeDic = {};
2140
2145
  this.data = model;
2141
2146
  this.formControls = schemas;
2142
2147
  if (parentNode) {
@@ -2183,6 +2188,8 @@ export class ControlTreeNode {
2183
2188
  }
2184
2189
  else {
2185
2190
  if (!this.schemaPath) {
2191
+ this.isRootNode = true;
2192
+ this.hasSchema = false;
2186
2193
  Object.keys(schemas).forEach(key => {
2187
2194
  const item = schemas[key];
2188
2195
  if (item.uniqueField == item.field) {
@@ -2387,4 +2394,4 @@ export class ControlTreeNode {
2387
2394
  }
2388
2395
  }
2389
2396
  }
2390
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9wcm9qZWN0cy90bngtc2hhcmVkL3NyYy9saWIvIiwic291cmNlcyI6WyJjb21wb25lbnRzL2NydWQvY3J1ZC1mb3JtL2NydWQtZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFSCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUM3QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRS9CLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU1RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDckUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRSxPQUFPLEVBQ0gsb0JBQW9CLEVBQ3BCLHlCQUF5QixFQUN6QiwrQkFBK0IsRUFDL0IsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQix5QkFBeUIsRUFDekIsd0JBQXdCLEVBQ3hCLDhCQUE4QixFQUM5QixpQ0FBaUMsRUFDakMsa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4QixnQkFBZ0IsRUFDaEIsMkJBQTJCLEVBQzNCLGVBQWUsRUFD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LFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDbEk7SUFDTCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQWZ0ZXJWaWV3SW5pdCxcclxuICAgIENvbXBvbmVudCxcclxuICAgIENvbnRlbnRDaGlsZHJlbixcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBJbmplY3RvcixcclxuICAgIElucHV0LFxyXG4gICAgT25EZXN0cm95LFxyXG4gICAgT25Jbml0LFxyXG4gICAgT3V0cHV0LFxyXG4gICAgUXVlcnlMaXN0LFxyXG4gICAgVGVtcGxhdGVSZWYsXHJcbiAgICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCBqUXVlcnlfIGZyb20gJ2pxdWVyeSc7XHJcbmltcG9ydCB7IERldmljZURldGVjdG9yU2VydmljZSB9IGZyb20gJ25neC1kZXZpY2UtZGV0ZWN0b3InO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1lbnVJdGVtIH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgQ29udGV4dE1lbnUgfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9jb250ZXh0bWVudSc7XHJcblxyXG5pbXBvcnQgeyBDb21wb25lbnRDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2FwcC1jb250ZXh0L2NvbXBvbmVudC1jb250ZXh0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRCYXNlIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9iYXNlL2NvbXBvbmVudC1iYXNlJztcclxuaW1wb3J0IHsgRm9ybVN0YXRlLCBLZXlGbGFzaFNob3cgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2NvbnN0YW50cyc7XHJcbmltcG9ydCB7XHJcbiAgICBBZGRyZXNzQ29udHJvbFNjaGVtYSxcclxuICAgIEF1dG9Db21wbGV0ZUNvbnRyb2xTY2hlbWEsXHJcbiAgICBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hLFxyXG4gICAgQnV0dG9uQ29udHJvbFNjaGVtYSxcclxuICAgIENoZWNrYm94Q29udHJvbFNjaGVtYSxcclxuICAgIENoZWNrQm94TGlzdENvbnRyb2xTY2hlbWEsXHJcbiAgICBDb0NhdVRvQ2h1Y0NvbnRyb2xTY2hlbWEsXHJcbiAgICBDb0NhdVRvQ2h1Y1BpY2tlckNvbnRyb2xTY2hlbWEsXHJcbiAgICBDb0NhdVRvQ2h1Y1BpY2tlckNvbnRyb2xTY2hlbWFOZXcsXHJcbiAgICBDb2xvckNvbnRyb2xTY2hlbWEsXHJcbiAgICBDb2xvclBpY2tlckNvbnRyb2xTY2hlbWEsXHJcbiAgICBDb2x1bW5TY2hlbWFCYXNlLFxyXG4gICAgQ29uZ1ZpZWNQaWNrZXJDb250cm9sU2NoZW1hLFxyXG4gICAgQ29udGFpbmVyU2NoZW1hLFxyXG4gICAgQ3J1ZEZvcm1TZXR0aW5nLFxyXG4gICAgQ3J1ZExpc3RTZXR0aW5nLFxyXG4gICAgQ3VzdG9tQ29udHJvbFNjaGVtYSxcclxuICAgIERhdGVUaW1lQ29udHJvbFNjaGVtYSxcclxuICAgIERhdGVUaW1lUmFuZ2VDb250cm9sU2NoZW1hLFxyXG4gICAgRHJvcGRvd25Db250cm9sU2NoZW1hLFxyXG4gICAgRWRpdG9yQ29udHJvbFNjaGVtYSxcclxuICAgIEVudGl0eVBpY2tlckNvbnRyb2xTY2hlbWEsXHJcbiAgICBFdmVudERhdGEsXHJcbiAgICBFdmVudFR5cGUsXHJcbiAgICBGaWxlTWFuYWdlckNvbnRyb2xTY2hlbWEsXHJcbiAgICBGaWxlVXBsb2FkQ29udHJvbFNjaGVtYSxcclxuICAgIEZpbGVVcGxvYWRNb2RlLFxyXG4gICAgRm9ybUNvbnRyb2xCYXNlLFxyXG4gICAgRm9ybUNvbnRyb2xCYXNlV2l0aFNlcnZpY2UsXHJcbiAgICBGb3JtU2NoZW1hQmFzZSxcclxuICAgIEtleUZ1bmN0aW9uUmVsb2FkLFxyXG4gICAgS2V5VmFsdWVDb250cm9sU2NoZW1hLFxyXG4gICAgTGFiZWxTY2hlbWEsXHJcbiAgICBNYXNrQ29udHJvbFNjaGVtYSxcclxuICAgIE51bWJlclJhbmdlQ29udHJvbFNjaGVtYSxcclxuICAgIE9wZXJhdG9yLFxyXG4gICAgT3JnYW5pemF0aW9uUGlja2VyQ29udHJvbFNjaGVtYSxcclxuICAgIFBlcmNlbnRDb250cm9sU2NoZW1hLFxyXG4gICAgUG9wdXBTaXplLFxyXG4gICAgUmFkaW9CdXR0b25MaXN0Q29udHJvbFNjaGVtYSxcclxuICAgIFJlZmVyZW5jZVRleHRDb250cm9sU2NoZW1hLFxyXG4gICAgU3BhbkNvbnRyb2xTY2hlbWEsXHJcbiAgICBTd2l0Y2hDb250cm9sU2NoZW1hLFxyXG4gICAgVGFibGVTY2hlbWEsXHJcbiAgICBUZW1wbGF0ZUNvbnRyb2xTY2hlbWEsXHJcbiAgICBUZXh0QWxpZ24sXHJcbiAgICBUZXh0QXJlYUNvbnRyb2xTY2hlbWEsXHJcbiAgICBUZXh0Q29udHJvbFNjaGVtYSxcclxuICAgIFRpdGxlU2NoZW1hLFxyXG4gICAgVXNlclBpY2tlckNvbnRyb2xTY2hlbWEsXHJcbiAgICBWYW5CYW5QaWNrZXJDb250cm9sU2NoZW1hLFxyXG4gICAgV3JhcFBpY2tlckNvbnRyb2xTY2hlbWEsXHJcbn0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9mb3JtLXNjaGVtYSc7XHJcbmltcG9ydCB7IEZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2wsIFJlZ2V4U3BsaXRGaWVsZEJ5SXRlbSB9IGZyb20gJy4uLy4uLy4uL2NvbnN0L2NvbW1vbic7XHJcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jb21tb24uc2VydmljZSc7XHJcbmltcG9ydCB7IENydWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY3J1ZC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW50aXR5UGlja2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2VudGl0eS1waWNrZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hc3RlckRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbWFzdGVyLWRhdGEuc2VydmljZSc7XHJcbmltcG9ydCB7IE1vZHVsZUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tb2R1bGUtY29uZmlnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3RpZmllclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9ub3RpZmllci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRHJvcGRvd25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZHJvcGRvd24vc2VydmljZXMvZHJvcGRvd24uc2VydmljZSc7XHJcbmltcG9ydCB7IGJhc2VUcmluaEt5LCBnZXRSZWdleFJlc3VsdCwgZ2V0U3RyaW5nRGlzcGxheVZhbHVlLCBsb29wQ3Vyc29yRnVuY3Rpb24gfSBmcm9tICcuLi91dGlscyc7XHJcbmltcG9ydCB7IEdtYWlsQ29ycmVjdG9yLCBMb3dlckNvcnJlY3RvciB9IGZyb20gJy4vLi4vLi4vLi4vY2xhc3Nlcy9iYXNlL2NvcnJlY3RvcnMnO1xyXG5pbXBvcnQge1xyXG4gICAgQ2hlY2tEdXBsaWNhdGVGaWVsZHNWYWxpZGF0b3IsXHJcbiAgICBDaGVja0R1cGxpY2F0ZVZhbGlkYXRvcixcclxuICAgIENvbXBhcmVWYWxpZGF0b3IsXHJcbiAgICBEYXRlQ29tcGFyZVZhbGlkYXRvcixcclxuICAgIEVtYWlsVmFsaWRhdG9yLFxyXG4gICAgTnVtYmVyQ29tcGFyZVZhbGlkYXRvcixcclxuICAgIE51bWJlck9ubHlWYWxpZGF0b3IsXHJcbiAgICBQaG9uZU51bWJlclZhbGlkYXRvcixcclxuICAgIFJlcXVpcmVkRmllbGRzVmFsaWRhdG9yLFxyXG4gICAgUmVxdWlyZWRWYWxpZGF0b3IsXHJcbiAgICBTYW1lVmFsdWVWYWxpZGF0b3IsXHJcbn0gZnJvbSAnLi8uLi8uLi8uLi9jbGFzc2VzL2Jhc2UvdmFsaWRhdG9ycyc7XHJcbmltcG9ydCB7IGlzQXJyYXksIGlzTGl0ZXJhbE9iamVjdCwgbWVyZ2VKU09OIH0gZnJvbSAnLi8uLi8uLi8uLi9jbGFzc2VzL2Vudmlyb25tZW50LXNjaGVtYSc7XHJcbmltcG9ydCB7IENvbUN0eENvbnN0YW50cyB9IGZyb20gJy4vLi4vLi4vLi4vY29uZmlncy9jb21wb25lbnQtY29udGV4dC5jb25zdGFudCc7XHJcbmltcG9ydCB7IEZpbHRlciB9IGZyb20gJy4vLi4vLi4vLi4vbW9kZWxzL2dyaWQtaW5mbyc7XHJcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi8uLi9zZXJ2aWNlcy91c2VyLnNlcnZpY2UnO1xyXG5cclxuXHJcbi8vIGZpeCBmb3IgYnVpbGQgcHJvZFxyXG5jb25zdCBqUXVlcnkgPSBqUXVlcnlfO1xyXG5cclxuZGVjbGFyZSB2YXIgdGlueW1jZTogYW55O1xyXG5cclxuY29uc3Qgb3BlcmF0b3JDb250cmFzdCA9IHtcclxuICAgIFtPcGVyYXRvci5ncmVhdGVyXTogT3BlcmF0b3IubG93ZXIsXHJcbiAgICBbT3BlcmF0b3IuZ3JlYXRlclRoYW5FcXVhbF06IE9wZXJhdG9yLmxvd2VyVGhhbkVxdWFsLFxyXG4gICAgW09wZXJhdG9yLmxvd2VyXTogT3BlcmF0b3IuZ3JlYXRlcixcclxuICAgIFtPcGVyYXRvci5sb3dlclRoYW5FcXVhbF06IE9wZXJhdG9yLmdyZWF0ZXJUaGFuRXF1YWxcclxufTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdjcnVkLWZvcm0nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NydWQtZm9ybS5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9jcnVkLWZvcm0uY29tcG9uZW50LnNjc3MnXSxcclxuICAgIHByb3ZpZGVyczogW0NvbXBvbmVudENvbnRleHRTZXJ2aWNlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ3J1ZEZvcm1Db21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRCYXNlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xyXG4gICAgQFZpZXdDaGlsZCgnZm9ybUVsZW1lbnQnKSBmb3JtRWxlbWVudDogRWxlbWVudFJlZjtcclxuICAgIEBWaWV3Q2hpbGQoJ2NvbnRleHRNZW51JywgeyBzdGF0aWM6IGZhbHNlIH0pIGNvbnRleHRNZW51OiBDb250ZXh0TWVudTtcclxuICAgIEBDb250ZW50Q2hpbGRyZW4oVGVtcGxhdGVSZWYpIGNoaWxkcmVuOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XHJcblxyXG4gICAgQFZpZXdDaGlsZCgndGVtcGxhdGVDb25nVmllY0Zvcm0nLCB7IHN0YXRpYzogZmFsc2UgfSkgc2V0IHRlbXBsYXRlQ29uZ1ZpZWNGb3JtKHZhbHVlOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XHJcbiAgICAgICAgdGhpcy50ZW1wbGF0ZXNbRmllbGREZWZpbmVJc1Rhc2tGb3JtQ29udHJvbF0gPSB2YWx1ZTtcclxuICAgIH07XHJcblxyXG4gICAgQElucHV0KCkgc2V0dGluZzogQ3J1ZEZvcm1TZXR0aW5nID0gbmV3IENydWRGb3JtU2V0dGluZygpO1xyXG4gICAgQElucHV0KCkgY29udGV4dDogQ29tcG9uZW50Q29udGV4dFNlcnZpY2U7XHJcblxyXG4gICAgQElucHV0KCkgZmlsZXNVcGxvYWRlZCA9IFtdO1xyXG4gICAgQElucHV0KCkgaXNWaWV3TW9kZSA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgZGlzYWJsZUtleXByZXNzQ29udHJvbCA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgZGlzYWJsZUNhY2hpbmcgPSBmYWxzZTtcclxuICAgIF9zdHlsZUNsYXNzID0gJ3AtZmx1aWQgY3J1ZC1mb3JtLWNvbnRhaW5lcic7XHJcbiAgICBASW5wdXQoKSBzZXQgc3R5bGVDbGFzcyh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fc3R5bGVDbGFzcyA9ICdwLWZsdWlkIGNydWQtZm9ybS1jb250YWluZXInO1xyXG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9ICcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0eWxlQ2xhc3MgKz0gYCAke3ZhbHVlfWA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpIGZvcm1JZCA9ICcnO1xyXG4gICAgQElucHV0KCkgZm9ybUNsYXNzID0gJyc7XHJcbiAgICBASW5wdXQoKSBhdXRvRm9jdXMgPSB0cnVlO1xyXG4gICAgQElucHV0KCkgdHJhcEZvY3VzID0gdHJ1ZTtcclxuXHJcbiAgICBASW5wdXQoKSBzZXQgZGF0YSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5jYW5QcmludCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLl9taW5pbWl6ZWREYXRhICE9IHZhbHVlICYmIGlzTGl0ZXJhbE9iamVjdCh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgdGhpcy5fbW9kZWxEYXRhID0gbWVyZ2VKU09OKHRoaXMuX21vZGVsRGF0YSwgdmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFuKCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVJbml0Q29udHJvbE1vZGVsQW5kUm9vdE5vZGUoKTtcclxuICAgICAgICAgICAgdGhpcy5fbWluaW1pemVkRGF0YSA9IHRoaXMuZ2V0TWluaW1pemVEYXRhKHRoaXMuX21vZGVsRGF0YSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMubG9hZGVkRGF0YUVkaXRPbGQgJiYgdGhpcy5sb2FkZWREYXRhRWRpdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jYW5QcmludCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQ2FuUHJpbnQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YSA9IHt9O1xyXG4gICAgICAgICAgICB0aGlzLnJlSW5pdENvbnRyb2xNb2RlbEFuZFJvb3ROb2RlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBASW5wdXQoKSBmb3JtU3RhdGU6IEZvcm1TdGF0ZSA9IEZvcm1TdGF0ZS5FRElUO1xyXG5cclxuICAgIEBPdXRwdXQoKSBvbkZvcm1SZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQ29udHJvbFJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25BbGxDb250cm9sUmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbk1vZGVsQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIGRhdGFDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkNoYW5nZTogRXZlbnRFbWl0dGVyPEV2ZW50RGF0YT4gPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50RGF0YT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkFmdGVyVHJpbmhLeSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAgIF9yb290Tm9kZTogQ29udHJvbFRyZWVOb2RlO1xyXG4gICAgX21pbmltaXplZERhdGE6IGFueTtcclxuICAgIF9tb2RlbERhdGE6IGFueSA9IHt9O1xyXG4gICAgX3Vuc3Vic2NyaWJlQWxsID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gICAgX2luVmFsaWRGb3JtID0gZmFsc2U7XHJcbiAgICBldmVudFR5cGUgPSBFdmVudFR5cGU7XHJcblxyXG4gICAgLy8gRG9jIHR1IGNhdSBoaW5oIHRoYW0gc28gaGUgdGhvbmdcclxuICAgIGxpbWl0U2l6ZSA9IDA7XHJcbiAgICBmb3JtQ29udHJvbHM6IGFueSA9IFtdO1xyXG4gICAgZnVuY0NoZWNrVW5pcXVlRmllbGQ6IGFueSA9IHt9O1xyXG4gICAgYmVmb3JlRGF0YTogYW55ID0ge307XHJcbiAgICBmaXJzdERpdkhvbGRlcjogYW55O1xyXG4gICAgY2FjaGVkVmFsdWVzID0ge307XHJcbiAgICB0ZW1wbGF0ZXM6IHsgW2tleTogc3RyaW5nXTogVGVtcGxhdGVSZWY8YW55PjsgfSA9IHt9O1xyXG4gICAgX3ByZWZpeEN1c3RvbUhlYWRlciA9ICdjdXN0b21IZWFkZXJfJztcclxuICAgIGNvbmdWaWVjU2V0dGluZzogQ3J1ZExpc3RTZXR0aW5nO1xyXG5cclxuICAgIGxvYWRlZERhdGFFZGl0T2xkID0gZmFsc2U7XHJcbiAgICBsb2FkZWREYXRhRWRpdCA9IGZhbHNlO1xyXG4gICAgY2FuUHJpbnQgPSBmYWxzZTtcclxuXHJcbiAgICB0YWJsZUZvcm1TaG93ID0gZmFsc2U7XHJcbiAgICB0YWJsZUZvcm1UaXRsZTogc3RyaW5nO1xyXG4gICAgdGFibGVGb3JtUG9wdXBTaXplID0gbmV3IFBvcHVwU2l6ZSh7IHdpZHRoOiAxMTAwLCBoZWlnaHQ6IDY1MCB9KTtcclxuICAgIHRhYmxlRm9ybURhdGE6IGFueSA9IHt9O1xyXG4gICAgdGFibGVGb3JtQ3VycmVudFJvdzogbnVtYmVyO1xyXG4gICAgdGFibGVGb3JtU2NoZW1hOiBGb3JtU2NoZW1hQmFzZVtdID0gW107XHJcbiAgICB0YWJsZUZvcm1DdXJyZW50SW5mbzogYW55ID0ge307XHJcblxyXG4gICAgYnV0dG9uQ29udGV4dHM6IE1lbnVJdGVtW10gPSBbXTtcclxuICAgIHJvd0RhdGFDdXJyZW50OiBhbnkgPSB7fTtcclxuICAgIGNvbnRyb2xOZWVkQ2hlY2tSZWFkeTogRm9ybVNjaGVtYUJhc2VbXSA9IFtdO1xyXG4gICAgcmVhZHlTdGF0dXM6IGFueSA9IHt9O1xyXG4gICAgZmllbGRQYXJlbnRGaWVsZCA9ICdwYXJlbnRGaWVsZCc7XHJcbiAgICB3YWl0UmVhZHlBbmRQcmludFRpbWVvdXQ6IGFueTtcclxuICAgIHB1YmxpYyBfbm90aWZpZXJTZXJ2aWNlOiBOb3RpZmllclNlcnZpY2U7XHJcbiAgICBwdWJsaWMgX21hc3RlckRhdGFTZXJ2aWNlOiBNYXN0ZXJEYXRhU2VydmljZTtcclxuICAgIHB1YmxpYyBfdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHB1YmxpYyBfaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgICAgIHB1YmxpYyBfY29tbW9uU2VydmljZTogQ29tbW9uU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgX2NydWRTZXJ2aWNlOiBDcnVkU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF90cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBfZGV2aWNlRGV0ZWN0b3JTZXJ2aWNlOiBEZXZpY2VEZXRlY3RvclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfZHJvcGRvd25TZXJ2aWNlOiBEcm9wZG93blNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIF9zYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgICAgICBwdWJsaWMgX2VudGl0eVBpY2tlclNlcnZpY2U6IEVudGl0eVBpY2tlclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfbW9kdWxlQ29uZmlnOiBNb2R1bGVDb25maWdTZXJ2aWNlLFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoX2luamVjdG9yKTtcclxuICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoTm90aWZpZXJTZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLl9tYXN0ZXJEYXRhU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChNYXN0ZXJEYXRhU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5fdXNlclNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoVXNlclNlcnZpY2UpO1xyXG5cclxuICAgICAgICAvLyBHZXQgQ29uZmlndXJhdGlvblN5c3RlbVxyXG4gICAgICAgIHRoaXMuX21hc3RlckRhdGFTZXJ2aWNlLmdldENvbmZpZ0J5Q29kZSgnU2l6ZU9mRmlsZScpLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGltaXRTaXplID0gTnVtYmVyKHJlc3BvbnNlKSAqIDEwMDAgKiAxMDAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmcuaGlkZGVuVHJpbmhLeSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuc2NoZW1hLnB1c2goXHJcbiAgICAgICAgICAgICAgICBuZXcgRmlsZVVwbG9hZENvbnRyb2xTY2hlbWEoe1xyXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiAncHJpbnRGaWxlSWQnLFxyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnRmlsZScsXHJcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogRmlsZVVwbG9hZE1vZGUudXNpbmdGaWxlSW5zdGFuY2VJZCxcclxuICAgICAgICAgICAgICAgICAgICBoaWRkZW5DaGVjazogKG1vZGVsLCBjdXJyZW50Tm9kZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIW1vZGVsLnByaW50RmlsZUlkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmluaXRMb2FkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoVmlld01vZGUocmVhZG9ubHlWaWV3ID0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuaXNWaWV3TW9kZSA9IHJlYWRvbmx5VmlldztcclxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xyXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVDb250cm9sU2NoZW1hKGNvbnRyb2wsIHRoaXMuaXNWaWV3TW9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbG9hZCgpIHtcclxuICAgICAgICB0aGlzLmluaXRMb2FkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYW4oKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhbk1vZGVsKHRoaXMuX21vZGVsRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjbGVhbk1vZGVsKG1vZGVsKSB7XHJcbiAgICAgICAgaWYgKGlzTGl0ZXJhbE9iamVjdChtb2RlbCkpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gJ19zdGF0dXMnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzIGluIG1vZGVsW2tleV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxba2V5XVtzXSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09ICdfZXJyb3JzJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcyBpbiBtb2RlbFtrZXldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsW2tleV1bc10gPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFuTW9kZWwobW9kZWxba2V5XSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoaXNBcnJheShtb2RlbCkpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFuTW9kZWwoaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVJbml0Q29udHJvbE1vZGVsQW5kUm9vdE5vZGUoKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKHRoaXMuX21vZGVsRGF0YSwgY29udHJvbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJvb3ROb2RlT2xkID0gdGhpcy5fcm9vdE5vZGU7XHJcbiAgICAgICAgdGhpcy5fcm9vdE5vZGUgPSBuZXcgQ29udHJvbFRyZWVOb2RlKHRoaXMuX21vZGVsRGF0YSwgdGhpcy5mb3JtQ29udHJvbHMpO1xyXG4gICAgICAgIHRoaXMuX3Jvb3ROb2RlLnNldENydWRGb3JtKHRoaXMpO1xyXG4gICAgICAgIGlmIChyb290Tm9kZU9sZCkge1xyXG4gICAgICAgICAgICByb290Tm9kZU9sZC5jaGlsZE5vZGVzLmZvckVhY2gobm9kZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdOb2RlID0gdGhpcy5fcm9vdE5vZGUuY2hpbGROb2Rlcy5maW5kKHEgPT4gcS5tb2RlbFBhdGggPT0gbm9kZS5tb2RlbFBhdGgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5ld05vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdOb2RlLmNvbXBvbmVudCA9IG5vZGUuY29tcG9uZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0aGlzLl9yb290Tm9kZSxcclxuICAgICAgICAgICAgZXZlbnRUeXBlOiB0aGlzLmV2ZW50VHlwZS5NT0RFTF9DSEFOR0VELFxyXG4gICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMub25Nb2RlbENoYW5nZWQuZW1pdChldmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRNaW5pbWl6ZURhdGEobW9kZWwpIHtcclxuICAgICAgICBpZiAoaXNMaXRlcmFsT2JqZWN0KG1vZGVsKSkge1xyXG4gICAgICAgICAgICBpZiAobW9kZWwuX2Ryb3Bkb3dudmFsdWUgIT0gbnVsbCAmJiBtb2RlbC5fZHJvcGRvd252YWx1ZSAhPT0gJycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFttb2RlbC5fZHJvcGRvd252YWx1ZV0gfHwgbW9kZWxbJ3ZhbHVlJ107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7fTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gJ19zdGF0dXMnICYmIGtleSAhPSAnX2Vycm9ycycgJiYga2V5ICE9ICdfc291cmNlJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRNaW5pbWl6ZURhdGEobW9kZWxba2V5XSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGlzQXJyYXkobW9kZWwpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFyciA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIGFyci5wdXNoKHRoaXMuZ2V0TWluaW1pemVEYXRhKGl0ZW0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChtb2RlbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtb2RlbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0TG9hZCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZy5zY2hlbWEpIHJldHVybjtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLnNjaGVtYS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAvLyB0aOG7sWMgaGnhu4duIHNhdSBjw7luZyBraGkgbW9kZWwgxJHDoyBpbml0IHhvbmcgdsOgIGPDoWMgc+G7sSBraeG7h24gYWRkIHJvdyB0aOG7sWMgaGnhu4duIHhvbmdcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtRXZlbnQgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcy5fcm9vdE5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiB0aGlzLmV2ZW50VHlwZS5GT1JNX1JFQURZLFxyXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMub25Gb3JtUmVhZHkuZW1pdChmb3JtRXZlbnQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pbml0U2NoZW1hKCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVDYWNoaW5nICYmICF0aGlzLl9tb2RlbERhdGEuaWQpIHRoaXMuYXBwbHlDYWNoZWRWYWx1ZXMoKTtcclxuICAgICAgICB0aGlzLnNldERhdGFEZWZhdWx0KCk7XHJcblxyXG4gICAgICAgIC8vIHRo4buxYyBoaeG7h24gc2F1IGPDuW5nIGtoaSBtb2RlbCDEkcOjIGluaXQgeG9uZyB2w6AgY8OhYyBz4buxIGtp4buHbiBhZGQgcm93IHRo4buxYyBoaeG7h24geG9uZ1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBmb3JtRXZlbnQgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0aGlzLl9yb290Tm9kZSxcclxuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogdGhpcy5ldmVudFR5cGUuRk9STV9SRUFEWSxcclxuICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLm9uRm9ybVJlYWR5LmVtaXQoZm9ybUV2ZW50KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRTY2hlbWEoKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbFNjaGVtYShjb250cm9sKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xNb2RlbCh0aGlzLl9tb2RlbERhdGEsIGNvbnRyb2wpO1xyXG4gICAgICAgICAgICB0aGlzLmluaXRWYWxpZGF0b3JBbmRDb3JyZWN0b3IoY29udHJvbCk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdEJpbmRpbmdDb250cm9sU2NoZW1hKGNvbnRyb2wpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcm9vdE5vZGUgPSBuZXcgQ29udHJvbFRyZWVOb2RlKHRoaXMuX21vZGVsRGF0YSwgdGhpcy5mb3JtQ29udHJvbHMpO1xyXG4gICAgICAgIHRoaXMuX3Jvb3ROb2RlLnNldENydWRGb3JtKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdENvbnRyb2xNb2RlbChwYXJlbnRNb2RlbCwgY29udHJvbCwgcGFyZW50UGF0aD8pIHtcclxuICAgICAgICB0aGlzLmluaXRQcml2YXRlRGF0YShwYXJlbnRNb2RlbCwgY29udHJvbC5maWVsZCk7XHJcblxyXG4gICAgICAgIGxldCBfcGFyZW50UGF0aCA9IGNvbnRyb2wuZmllbGQ7XHJcbiAgICAgICAgaWYgKHBhcmVudFBhdGggIT0gbnVsbCkgX3BhcmVudFBhdGggPSBwYXJlbnRQYXRoICsgJy4nICsgX3BhcmVudFBhdGg7XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKCFwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSB8fCAhKHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdIGluc3RhbmNlb2YgQXJyYXkpKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGFkZE1vcmUgPSBjb250cm9sLmluaXRSb3dDb3VudCAtIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdLmxlbmd0aDtcclxuICAgICAgICAgICAgaWYgKGFkZE1vcmUgPiAwICYmICFwYXJlbnRNb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLnJlYWR5KSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLnJlYWR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIC8vIHRo4buxYyBoaeG7h24gc2F1IGPDuW5nIGtoaSB04bqldCBj4bqjIG1vZGVsIMSRw6MgaW5pdCB4b25nXHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbW9kZWxEYXRhLmlkKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRNdWx0aVJvdyhjb250cm9sLCBhZGRNb3JlLCBfcGFyZW50UGF0aCwgJ2luaXQnKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBpID0gMDtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5yb3dUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xNb2RlbChpdGVtLCBzdWJDb250cm9sLCBfcGFyZW50UGF0aCArICdbJyArIGkgKyAnXScpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID09IG51bGwgfHwgIWlzTGl0ZXJhbE9iamVjdChwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSkpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0ge307XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sTW9kZWwocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0sIHN1YkNvbnRyb2wsIF9wYXJlbnRQYXRoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBlbHNlIHtcclxuICAgICAgICAvLyAgICAgLy8gaWYgKCFwYXJlbnRNb2RlbC5oYXNPd25Qcm9wZXJ0eShjb250cm9sLmZpZWxkKSAmJiBjb250cm9sLmZpZWxkICE9IG51bGwpIHtcclxuICAgICAgICAvLyAgICAgLy8gICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gY29udHJvbC5kZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgLy8gICAgIC8vIH1cclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdENvbnRyb2xEZWZhdWx0VmFsdWVGcm9tRXh0ZXJuYWwoKSB7XHJcbiAgICAgICAgLy8gY29uc3Qgc2NoZW1hRHluYW1pY3MgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRDb250cm9sRGVmYXVsdFZhbHVlKHRoaXMuX21vZGVsRGF0YSwgY29udHJvbCk7XHJcbiAgICAgICAgICAgIC8vIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ3VzdG9tQ29udHJvbFNjaGVtYVxyXG4gICAgICAgICAgICAvLyAgICAgJiYgdGhpcy5jaGVja0lzRHluYW1pY0NvbnRyb2woY29udHJvbClcclxuICAgICAgICAgICAgLy8gKSB7XHJcbiAgICAgICAgICAgIC8vICAgICBzY2hlbWFEeW5hbWljcy5wdXNoKGNvbnRyb2wpO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFThuqFtIHRo4budaSBrIHJlbmRlciBsdcO0biB0w6puIGPDtG5nIHZp4buHYyB0cm9uZyBmb3JtIGluaXQsIHbDrCDEkWFuZyBrIGtp4buDbSBzb8OhdCBkYyBraGkgbsOgbyB04bqldCBj4bqjIGNvbnRyb2wgcmVhZHlcclxuICAgICAgICAvLyBzY2hlbWFEeW5hbWljcy5mb3JFYWNoKHNjaGVtYSA9PiB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMucmVuZGVyVGVuQ29uZ1ZpZWModGhpcy5fbW9kZWxEYXRhLCBzY2hlbWEpO1xyXG4gICAgICAgIC8vIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdENvbnRyb2xEZWZhdWx0VmFsdWUocGFyZW50TW9kZWwsIGNvbnRyb2wsIHBhcmVudFBhdGg/KSB7XHJcbiAgICAgICAgdGhpcy5pbml0UHJpdmF0ZURhdGEocGFyZW50TW9kZWwsIGNvbnRyb2wuZmllbGQpO1xyXG5cclxuICAgICAgICBsZXQgX3BhcmVudFBhdGggPSBjb250cm9sLmZpZWxkO1xyXG4gICAgICAgIGlmIChwYXJlbnRQYXRoICE9IG51bGwpIF9wYXJlbnRQYXRoID0gcGFyZW50UGF0aCArICcuJyArIF9wYXJlbnRQYXRoO1xyXG5cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmICghcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gfHwgIShwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSBpbnN0YW5jZW9mIEFycmF5KSkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBhZGRNb3JlID0gY29udHJvbC5pbml0Um93Q291bnQgLSBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXS5sZW5ndGg7XHJcbiAgICAgICAgICAgIGlmIChhZGRNb3JlID4gMCAmJiAhcGFyZW50TW9kZWwuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5yZWFkeSkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50TW9kZWwuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5yZWFkeSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGkgPSAwO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0pIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbERlZmF1bHRWYWx1ZShpdGVtLCBzdWJDb250cm9sLCBfcGFyZW50UGF0aCArICdbJyArIGkgKyAnXScpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID09IG51bGwgfHwgIWlzTGl0ZXJhbE9iamVjdChwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSkpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0ge307XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sRGVmYXVsdFZhbHVlKHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdLCBzdWJDb250cm9sLCBfcGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghcGFyZW50TW9kZWwuaGFzT3duUHJvcGVydHkoY29udHJvbC5maWVsZCkgJiYgY29udHJvbC5maWVsZCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5kZWZhdWx0VmFsdWUgIT09IG51bGwgJiYgY29udHJvbC5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gY29udHJvbC5kZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuYXV0b0Rpc3BsYXlGaXJzdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBjb250cm9sLl9jb21wb25lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29udHJvbC5fY29tcG9uZW50Ll9oYXNMb2FkZWREYXRhc291cmNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbnRyb2wuX2NvbXBvbmVudC5kYXRhU291cmNlSW50ZXJuYWwubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IGNvbnRyb2wuX2NvbXBvbmVudC5kYXRhU291cmNlSW50ZXJuYWxbMF0udmFsdWVbY29udHJvbC52YWx1ZUZpZWxkXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0UHJpdmF0ZURhdGEocGFyZW50TW9kZWwsIGZpZWxkKSB7XHJcbiAgICAgICAgaWYgKCFwYXJlbnRNb2RlbC5fc291cmNlKSBwYXJlbnRNb2RlbC5fc291cmNlID0ge307XHJcblxyXG4gICAgICAgIGlmICghcGFyZW50TW9kZWwuX3N0YXR1cykgcGFyZW50TW9kZWwuX3N0YXR1cyA9IHt9O1xyXG4gICAgICAgIGlmICghcGFyZW50TW9kZWwuX2Vycm9ycykgcGFyZW50TW9kZWwuX2Vycm9ycyA9IHt9O1xyXG5cclxuICAgICAgICBpZiAoIXBhcmVudE1vZGVsLl9zdGF0dXNbZmllbGRdKSBwYXJlbnRNb2RlbC5fc3RhdHVzW2ZpZWxkXSA9IHt9O1xyXG4gICAgICAgIGlmICghcGFyZW50TW9kZWwuX2Vycm9yc1tmaWVsZF0pIHBhcmVudE1vZGVsLl9lcnJvcnNbZmllbGRdID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0Q29udHJvbFNjaGVtYShzY2hlbWE6IEZvcm1TY2hlbWFCYXNlLCBwYXJlbnRJZD8pIHtcclxuICAgICAgICBpZiAoc2NoZW1hLmRpc2FibGVkICE9IHRydWUpIHtcclxuICAgICAgICAgICAgc2NoZW1hLmRpc2FibGVkID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuaXNWaWV3TW9kZSkge1xyXG4gICAgICAgICAgICBzY2hlbWEuZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2NoZW1hLmxhYmVsICYmICFzY2hlbWEuZnVsbExhYmVsKSB7XHJcbiAgICAgICAgICAgIHNjaGVtYS5mdWxsTGFiZWwgPSBzY2hlbWEubGFiZWw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2NoZW1hIGluc3RhbmNlb2YgVGl0bGVTY2hlbWFcclxuICAgICAgICAgICAgfHwgc2NoZW1hIGluc3RhbmNlb2YgTGFiZWxTY2hlbWFcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgc2NoZW1hLnNob3dMYWJlbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoIXNjaGVtYS5maWVsZCkge1xyXG4gICAgICAgICAgICAgICAgc2NoZW1hLmZpZWxkID0gdGhpcy5fY29tbW9uU2VydmljZS5ndWlkKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzY2hlbWEuZmllbGQpIHtcclxuICAgICAgICAgICAgbGV0IGtleSA9IHNjaGVtYS5maWVsZDtcclxuICAgICAgICAgICAgaWYgKHBhcmVudElkICE9IG51bGwpIGtleSA9IHBhcmVudElkICsgJy4nICsga2V5O1xyXG4gICAgICAgICAgICBzY2hlbWEudW5pcXVlRmllbGQgPSBrZXk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2xzW2tleV0gPSBzY2hlbWE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzY2hlbWFbJ2NvbnRyb2xUeXBlJ10gPSB0aGlzLmdldENvbnRyb2xUeXBlKHNjaGVtYSk7XHJcbiAgICAgICAgc2NoZW1hWydkYXRhVHlwZSddID0gdGhpcy5nZXRWaWV3TW9kZURhdGFUeXBlKHNjaGVtYSk7XHJcblxyXG4gICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPFRhYmxlU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgaWYgKCFjb250cm9sLndpZHRoRnVuY3Rpb25Db2x1bW4pIHtcclxuICAgICAgICAgICAgICAgIGxldCBidXR0b25Db3VudCA9IDA7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5zaG93U2F2ZSkgYnV0dG9uQ291bnQrKztcclxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLnNob3dFZGl0KSBidXR0b25Db3VudCsrO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuc2hvd0RlbGV0ZSkgYnV0dG9uQ291bnQrKztcclxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLnJvd0J1dHRvbnMpIGJ1dHRvbkNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICAvLyAyLjM1NyBsw6AgY2hp4buBdSBy4buZbmcgY+G7p2EgbeG7l2kgYnV0dG9uLCAxIGzDoCBwYWRkaW5nIHRyw6FpIHBo4bqjaSAwLjVyZW1cclxuICAgICAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gMi4zNTcgKiBidXR0b25Db3VudCArIDE7XHJcbiAgICAgICAgICAgICAgICBpZiAod2lkdGggPCA2KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbC53aWR0aEZ1bmN0aW9uQ29sdW1uID0gYDYuM3JlbWA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sLndpZHRoRnVuY3Rpb25Db2x1bW4gPSBgJHt3aWR0aH1yZW1gO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBzdWJDb250cm9sW3RoaXMuZmllbGRQYXJlbnRGaWVsZF0gPSBjb250cm9sLnVuaXF1ZUZpZWxkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbFNjaGVtYShzdWJDb250cm9sLCBzY2hlbWEudW5pcXVlRmllbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRyb2xTY2hlbWEgPSA8RHJvcGRvd25Db250cm9sU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgZHJvcGRvd25Db250cm9sU2NoZW1hLnJldHVyblR5cGUgPSAnb2JqZWN0JztcclxuICAgICAgICAgICAgZHJvcGRvd25Db250cm9sU2NoZW1hLmZpcmVDYWxsQmFja0luc2lkZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoIWRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycykge1xyXG4gICAgICAgICAgICAgICAgZHJvcGRvd25Db250cm9sU2NoZW1hLmxvYWRPbkluaXQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2RldmljZURldGVjdG9yU2VydmljZS5pc0Rlc2t0b3AoKSkge1xyXG4gICAgICAgICAgICAgICAgZHJvcGRvd25Db250cm9sU2NoZW1hLmZpbHRlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xOZWVkQ2hlY2tSZWFkeS5wdXNoKHNjaGVtYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFVzZXJQaWNrZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVzZXJQaWNrZXJDb250cm9sU2NoZW1hID0gPERyb3Bkb3duQ29udHJvbFNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIHVzZXJQaWNrZXJDb250cm9sU2NoZW1hLnJldHVyblR5cGUgPSAnb2JqZWN0JztcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sTmVlZENoZWNrUmVhZHkucHVzaChzY2hlbWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxDb250YWluZXJTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5jb250cm9scykge1xyXG4gICAgICAgICAgICAgICAgc3ViQ29udHJvbFt0aGlzLmZpZWxkUGFyZW50RmllbGRdID0gY29udHJvbC51bmlxdWVGaWVsZDtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xTY2hlbWEoc3ViQ29udHJvbCwgY29udHJvbC51bmlxdWVGaWVsZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBhdXRvY29tcGxldGVDb250cm9sU2NoZW1hID0gPEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBhdXRvY29tcGxldGVDb250cm9sU2NoZW1hLnJldHVyblR5cGUgPSAnb2JqZWN0JztcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sTmVlZENoZWNrUmVhZHkucHVzaChzY2hlbWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBBZGRyZXNzQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xOZWVkQ2hlY2tSZWFkeS5wdXNoKHNjaGVtYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgc2NoZW1hLmZpcmVDYWxsQmFja0luc2lkZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBDdXN0b21Db250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrSXNUYXNrQ29udHJvbChzY2hlbWEpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmdWaWVjU2V0dGluZyA9IG5ldyBDcnVkTGlzdFNldHRpbmcoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZ1ZpZWNTZXR0aW5nLmlzV29ya2Zsb3dUcmVlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHNjaGVtYS5kYXRhLmZpZWxkUGFyZW50Rm9yVGFza3MgPSBbXTtcclxuICAgICAgICAgICAgICAgIGxvb3BDdXJzb3JGdW5jdGlvbihcclxuICAgICAgICAgICAgICAgICAgICBnZXRSZWdleFJlc3VsdChzY2hlbWEuZGF0YS5fX3RlbXBsYXRlVGFza05hbWUsIFJlZ2V4U3BsaXRGaWVsZEJ5SXRlbSwgZXhlY1Jlc3VsdCA9PiBleGVjUmVzdWx0WzFdKSxcclxuICAgICAgICAgICAgICAgICAgICBmaWVsZCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYS5kYXRhLmZpZWxkUGFyZW50Rm9yVGFza3MucHVzaChmaWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjaGVtYUNoaWxkID0gdGhpcy5zZXR0aW5nLnNjaGVtYS5maW5kKHEgPT4gcS5maWVsZCA9PSBmaWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWFDaGlsZCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE1vcmVPbkNoYW5nZUV2ZW50KHNjaGVtYUNoaWxkLCAoZXZ0OiBFdmVudERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclRlbkNvbmdWaWVjKGV2dC5yb290TW9kZWwsIHNjaGVtYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkaXNhYmxlQ29udHJvbFNjaGVtYShzY2hlbWE6IEZvcm1TY2hlbWFCYXNlLCBkaXNhYmxlZCA9IHRydWUpIHtcclxuICAgICAgICBpZiAoIXNjaGVtYS5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgICBzY2hlbWEuZGlzYWJsZWQgPSBkaXNhYmxlZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8VGFibGVTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5yb3dUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ29udHJvbFNjaGVtYShzdWJDb250cm9sLCBkaXNhYmxlZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8Q29udGFpbmVyU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wuY29udHJvbHMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZUNvbnRyb2xTY2hlbWEoc3ViQ29udHJvbCwgZGlzYWJsZWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2hlY2tJc1Rhc2tDb250cm9sKHNjaGVtYSkge1xyXG4gICAgICAgIHJldHVybiBzY2hlbWEuZmllbGQgPT0gRmllbGREZWZpbmVJc1Rhc2tGb3JtQ29udHJvbFxyXG4gICAgICAgICAgICAmJiBzY2hlbWEuZGF0YVxyXG4gICAgICAgICAgICAmJiBzY2hlbWEuZGF0YS5fX3RlbXBsYXRlVGFza05hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyVGVuQ29uZ1ZpZWMobW9kZWw6IGFueSwgc2NoZW1hOiBDdXN0b21Db250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgbGV0IHRlbXBsYXRlVGV4dCA9IHNjaGVtYS5kYXRhLl9fdGVtcGxhdGVUYXNrTmFtZTtcclxuICAgICAgICBzY2hlbWEuZGF0YS5maWVsZFBhcmVudEZvclRhc2tzLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZVRleHQgPSB0ZW1wbGF0ZVRleHQucmVwbGFjZShge3tpdGVtLiR7ZmllbGR9fX1gLCBnZXRTdHJpbmdEaXNwbGF5VmFsdWUobW9kZWxbZmllbGRdKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgc2NoZW1hLmRhdGEudGVuQ29uZ1ZpZWMgPSB0ZW1wbGF0ZVRleHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0QmluZGluZ0NvbnRyb2xTY2hlbWEoc2NoZW1hOiBhbnkpIHtcclxuICAgICAgICBpZiAoc2NoZW1hIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxUYWJsZVNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRCaW5kaW5nQ29udHJvbFNjaGVtYShzdWJDb250cm9sKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgZHJvcGRvd25Db250cm9sU2NoZW1hID0gPERyb3Bkb3duQ29udHJvbFNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGlmIChkcm9wZG93bkNvbnRyb2xTY2hlbWEuYmluZGluZ0ZpbHRlcnMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZE9uQ2hhbmdlVG9Ecm9wZG93bihkcm9wZG93bkNvbnRyb2xTY2hlbWEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgZHJvcGRvd25Db250cm9sU2NoZW1hID0gPEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBpZiAoZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRPbkNoYW5nZVRvRHJvcGRvd24oZHJvcGRvd25Db250cm9sU2NoZW1hKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxDb250YWluZXJTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5jb250cm9scykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0QmluZGluZ0NvbnRyb2xTY2hlbWEoc3ViQ29udHJvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBiaW5kT25DaGFuZ2VUb0Ryb3Bkb3duKGRyb3Bkb3duQ29udHJvbFNjaGVtYTogRHJvcGRvd25Db250cm9sU2NoZW1hIHwgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgIGxldCB0bXBGaWx0ZXJzOiBGaWx0ZXJbXSA9IFtdO1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycykpIHtcclxuICAgICAgICAgICAgdG1wRmlsdGVycyA9IGRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIChkcm9wZG93bkNvbnRyb2xTY2hlbWEuYmluZGluZ0ZpbHRlcnMpID09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdG1wRmlsdGVycyA9IGRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdG1wRmlsdGVycyA9IGF3YWl0IGRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycztcclxuICAgICAgICB9XHJcbiAgICAgICAgdG1wRmlsdGVycy5mb3JFYWNoKGZpbHRlciA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZpZWxkID0gZmlsdGVyLnNvdXJjZUZpZWxkO1xyXG4gICAgICAgICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLnNldHRpbmcuc2NoZW1hLmZpbmQocSA9PiBxLmZpZWxkID09IHNvdXJjZUZpZWxkKTtcclxuICAgICAgICAgICAgaWYgKCFmaWx0ZXIuc3ViRmllbGRcclxuICAgICAgICAgICAgICAgICYmIChzY2hlbWEgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEgfHwgc2NoZW1hIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSkpIHtcclxuICAgICAgICAgICAgICAgIGZpbHRlci5zdWJGaWVsZCA9IHNjaGVtYS52YWx1ZUZpZWxkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgbWFya2VkQ29udHJvbCA9IHt9O1xyXG4gICAgICAgIHRoaXMuYmluZE9uQ2hhbmdlVG9Ecm9wZG93blJlY3Vyc2l2ZShkcm9wZG93bkNvbnRyb2xTY2hlbWEsIHRtcEZpbHRlcnMsIG1hcmtlZENvbnRyb2wpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYmluZE9uQ2hhbmdlVG9Ecm9wZG93blJlY3Vyc2l2ZShjaGlsZERyb3Bkb3duOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEgfCBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hLCB0bXBGaWx0ZXJzOiBGaWx0ZXJbXSwgbWFya2VkQ29udHJvbCkge1xyXG4gICAgICAgIGlmICh0bXBGaWx0ZXJzIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgdG1wRmlsdGVycykge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlRmllbGQgPSBmaWx0ZXIuc291cmNlRmllbGQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnREcm9wZG93biA9IHRoaXMuZm9ybUNvbnRyb2xzW3NvdXJjZUZpZWxkXTtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnREcm9wZG93biAmJiAhbWFya2VkQ29udHJvbFtzb3VyY2VGaWVsZF0pIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXJrZWRDb250cm9sW3NvdXJjZUZpZWxkXSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZERyb3Bkb3duW0tleUZ1bmN0aW9uUmVsb2FkXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGREcm9wZG93biBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGREcm9wZG93bltLZXlGdW5jdGlvblJlbG9hZF0gPSAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZWVkR2V0RGF0YSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZERyb3Bkb3duLmFsbG93TG9hZERhdGFXaGVuUGFyZW50TnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBldmVudC5ldmVudFR5cGUgPT0gdGhpcy5ldmVudFR5cGUuQURKVVNUX1ZBTFVFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRHZXREYXRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQudmFsdWUgPT0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBldmVudC52YWx1ZSA9PSAnJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZXZlbnQudmFsdWUgaW5zdGFuY2VvZiBBcnJheSAmJiBldmVudC52YWx1ZS5sZW5ndGggPT0gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGREcm9wZG93bi5fY29tcG9uZW50LnJlc2V0Q29udHJvbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkR2V0RGF0YSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkR2V0RGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fY3J1ZFNlcnZpY2UuZ2V0RmlsdGVyRnJvbVRlbXBsYXRlKHRtcEZpbHRlcnMsIGV2ZW50LnBhcmVudE1vZGVsLCBldmVudC5yb290TW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGREcm9wZG93bi5fY29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIShwYXJlbnREcm9wZG93biBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJlbnREcm9wZG93bi5fY29tcG9uZW50ICYmIHBhcmVudERyb3Bkb3duLl9jb21wb25lbnQuX2hhc0xvYWRlZERhdGFzb3VyY2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZERyb3Bkb3duLl9jb21wb25lbnQuZ2V0RGF0YShmaWx0ZXJzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGREcm9wZG93bi5fY29tcG9uZW50ICYmIGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudC5nZXREYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGREcm9wZG93bi5fY29tcG9uZW50LmdldERhdGEoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE1vcmVPbkNoYW5nZUV2ZW50KHBhcmVudERyb3Bkb3duLCAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZERyb3Bkb3duW0tleUZ1bmN0aW9uUmVsb2FkXShldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRPbkNoYW5nZVRvRHJvcGRvd25SZWN1cnNpdmUoY2hpbGREcm9wZG93biwgZmlsdGVyLmZpbHRlcnMsIG1hcmtlZENvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkTW9yZU9uQ2hhbmdlRXZlbnQoY29udHJvbDogRm9ybUNvbnRyb2xCYXNlLCBuZXdPbkNoYW5nZSkge1xyXG4gICAgICAgIGlmIChjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgb2xkVHJpZ2dlckxvYWRDaGlsZCA9IGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZDtcclxuICAgICAgICAgICAgY29udHJvbC50cmlnZ2VyTG9hZENoaWxkID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG9sZFRyaWdnZXJMb2FkQ2hpbGQoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3T25DaGFuZ2UoZXZlbnQpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29udHJvbC50cmlnZ2VyTG9hZENoaWxkID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG5ld09uQ2hhbmdlKGV2ZW50KTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdG1wRmllbGRPbGRPbkNoYW5nZSA9ICdvbGRPbkNoYW5nZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2xbdG1wRmllbGRPbGRPbkNoYW5nZV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZE9uQ2hhbmdlID0gY29udHJvbC5vbkNoYW5nZWQ7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sW3RtcEZpZWxkT2xkT25DaGFuZ2VdID0gb2xkT25DaGFuZ2U7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uQ2hhbmdlZCA9IGFzeW5jIChldmVudDogRXZlbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgb2xkT25DaGFuZ2UoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZChldmVudCk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkNoYW5nZWQgPSBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQ7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sW3RtcEZpZWxkT2xkT25DaGFuZ2VdID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2xbdG1wRmllbGRPbGRPbkNoYW5nZV0pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZE9uQ2hhbmdlID0gY29udHJvbFt0bXBGaWVsZE9sZE9uQ2hhbmdlXTtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wub25DaGFuZ2VkID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBvbGRPbkNoYW5nZShldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC50cmlnZ2VyTG9hZENoaWxkKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uQ2hhbmdlZCA9IGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wub25BZGp1c3RlZFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRFdmVudCA9IGNvbnRyb2wub25BZGp1c3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkFkanVzdGVkVmFsdWUgPSBhc3luYyAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG9sZEV2ZW50KGV2ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXdPbkNoYW5nZShldmVudCk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkFkanVzdGVkVmFsdWUgPSBhc3luYyAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ld09uQ2hhbmdlKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0VmFsaWRhdG9yQW5kQ29ycmVjdG9yKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlKSB7XHJcbiAgICAgICAgaWYgKCFzY2hlbWEuY29ycmVjdG9ycykgc2NoZW1hLmNvcnJlY3RvcnMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKCFzY2hlbWEudmFsaWRhdG9ycykgc2NoZW1hLnZhbGlkYXRvcnMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHNjaGVtYS5yZXF1aXJlZCkge1xyXG4gICAgICAgICAgICBzY2hlbWEudmFsaWRhdG9ycy5wdXNoKG5ldyBSZXF1aXJlZFZhbGlkYXRvcigpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBNYXNrQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoc2NoZW1hLnZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIHNjaGVtYS52YWxpZGF0b3JzLmZvckVhY2godmFsaWRhdG9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgTnVtYmVyQ29tcGFyZVZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvckNvbXBhcmVSZXZlcnQodmFsaWRhdG9yLCBzY2hlbWEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFRleHRDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRleHRTY2hlbWEgPSAoPFRleHRDb250cm9sU2NoZW1hPnNjaGVtYSk7XHJcbiAgICAgICAgICAgIGlmICh0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ251bWJlcicgfHwgdGV4dFNjaGVtYS5kYXRhRm9ybWF0ID09ICdhbW91bnQnKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0U2NoZW1hLnZhbGlkYXRvcnMucHVzaChuZXcgTnVtYmVyT25seVZhbGlkYXRvcigpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ21vbmV5JyB8fCB0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ21vbmV5aW50Jykge1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ2VtYWlsJykge1xyXG4gICAgICAgICAgICAgICAgdGV4dFNjaGVtYS52YWxpZGF0b3JzLnB1c2gobmV3IEVtYWlsVmFsaWRhdG9yKCkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdGV4dFNjaGVtYS5jb3JyZWN0b3JzKSB0ZXh0U2NoZW1hLmNvcnJlY3RvcnMgPSBbXTtcclxuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEuY29ycmVjdG9ycy5wdXNoKG5ldyBHbWFpbENvcnJlY3RvcigpKTtcclxuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEuY29ycmVjdG9ycy5wdXNoKG5ldyBMb3dlckNvcnJlY3RvcigpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ3Bob25lJyB8fCB0ZXh0U2NoZW1hLmRhdGFGb3JtYXQgPT0gJ2ZheCcpIHtcclxuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEudmFsaWRhdG9ycy5wdXNoKG5ldyBQaG9uZU51bWJlclZhbGlkYXRvcigpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRleHRTY2hlbWEudmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgICAgICAgdGV4dFNjaGVtYS52YWxpZGF0b3JzLmZvckVhY2godmFsaWRhdG9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgTnVtYmVyQ29tcGFyZVZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvckNvbXBhcmVSZXZlcnQodmFsaWRhdG9yLCB0ZXh0U2NoZW1hKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPFRhYmxlU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFZhbGlkYXRvckFuZENvcnJlY3RvcihzdWJDb250cm9sKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZVRpbWVTY2hlbWEgPSAoPERhdGVUaW1lQ29udHJvbFNjaGVtYT5zY2hlbWEpO1xyXG4gICAgICAgICAgICBpZiAoZGF0ZVRpbWVTY2hlbWEudmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgICAgICAgZGF0ZVRpbWVTY2hlbWEudmFsaWRhdG9ycy5mb3JFYWNoKHZhbGlkYXRvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIERhdGVDb21wYXJlVmFsaWRhdG9yIHx8IHZhbGlkYXRvciBpbnN0YW5jZW9mIENvbXBhcmVWYWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVWYWxpZGF0b3JDb21wYXJlUmV2ZXJ0KHZhbGlkYXRvciwgZGF0ZVRpbWVTY2hlbWEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPENvbnRhaW5lclNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRWYWxpZGF0b3JBbmRDb3JyZWN0b3Ioc3ViQ29udHJvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNjaGVtYS52YWxpZGF0b3JzLmZvckVhY2godmFsaWRhdG9yID0+IHtcclxuICAgICAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIENoZWNrRHVwbGljYXRlVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3Iuc2V0QmFzZVNlcnZpY2UodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBDaGVja0R1cGxpY2F0ZUZpZWxkc1ZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgdmFsaWRhdG9yLnNldEJhc2VTZXJ2aWNlKHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvckNoZWNrRHVwbGljYXRlKHNjaGVtYSwgdmFsaWRhdG9yLmdldER1cGxpY2F0ZUZpZWxkcygpLCB2YWxpZGF0b3IuZ2V0TWVzc2FnZSgpLCB2YWxpZGF0b3IuZ2V0RGVmYXVsdEZpbHRlcnMoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgUmVxdWlyZWRGaWVsZHNWYWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsaWRhdG9yUmVxdWlyZWRzKHNjaGVtYSwgdmFsaWRhdG9yLmdldFJlcXVpcmVkRmllbGRzKCksIHZhbGlkYXRvci5nZXRNZXNzYWdlKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIFNhbWVWYWx1ZVZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVTYW1lVmFsdWVWYWxpZGF0b3JzKHNjaGVtYSwgdmFsaWRhdG9yLmdldFNhbWVGaWVsZHMoKSwgdmFsaWRhdG9yLmdldE1lc3NhZ2UoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVWYWxpZGF0b3JDb21wYXJlUmV2ZXJ0KFxyXG4gICAgICAgIHZhbGlkYXRvcjogRGF0ZUNvbXBhcmVWYWxpZGF0b3IgfCBOdW1iZXJDb21wYXJlVmFsaWRhdG9yIHwgQ29tcGFyZVZhbGlkYXRvcixcclxuICAgICAgICBzY2hlbWE6IERhdGVUaW1lQ29udHJvbFNjaGVtYSB8IFRleHRDb250cm9sU2NoZW1hIHwgTWFza0NvbnRyb2xTY2hlbWFcclxuICAgICkge1xyXG4gICAgICAgIGNvbnN0IGNvbXBhcmVVbmlxdWVGaWVsZCA9IHZhbGlkYXRvci5jb21wYXJlVW5pcXVlRmllbGQ7XHJcbiAgICAgICAgaWYgKHNjaGVtYS51bmlxdWVGaWVsZCA9PSBjb21wYXJlVW5pcXVlRmllbGQpIHtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdTY2hlbWEgY+G6pXUgaMOsbmggYuG7iyBs4buXaScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgb3BlcmF0b3JDb21wYXJlID0gdmFsaWRhdG9yLmdldE9wZXJhdG9yQ29tcGFyZSgpO1xyXG4gICAgICAgICAgICBjb25zdCBzY2hlbWFDb21wYXJlID0gPEZvcm1Db250cm9sQmFzZT4odGhpcy5mb3JtQ29udHJvbHNbY29tcGFyZVVuaXF1ZUZpZWxkXSk7XHJcbiAgICAgICAgICAgIGlmIChzY2hlbWFDb21wYXJlID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnU2NoZW1hIGPhuqV1IGjDrG5oIGLhu4sgbOG7l2knKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICghc2NoZW1hQ29tcGFyZS52YWxpZGF0b3JzLnNvbWUocCA9PiBwIGluc3RhbmNlb2YgQ29tcGFyZVZhbGlkYXRvclxyXG4gICAgICAgICAgICAgICAgICAgICYmIHAuY29tcGFyZVVuaXF1ZUZpZWxkID09IHNjaGVtYS51bmlxdWVGaWVsZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgRGF0ZUNvbXBhcmVWYWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hQ29tcGFyZS52YWxpZGF0b3JzLnB1c2gobmV3IERhdGVDb21wYXJlVmFsaWRhdG9yKG9wZXJhdG9yQ29udHJhc3Rbb3BlcmF0b3JDb21wYXJlXSwgc2NoZW1hLnVuaXF1ZUZpZWxkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIE51bWJlckNvbXBhcmVWYWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hQ29tcGFyZS52YWxpZGF0b3JzLnB1c2gobmV3IE51bWJlckNvbXBhcmVWYWxpZGF0b3Iob3BlcmF0b3JDb250cmFzdFtvcGVyYXRvckNvbXBhcmVdLCBzY2hlbWEudW5pcXVlRmllbGQpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUNvbXBhcmUudmFsaWRhdG9ycy5wdXNoKG5ldyBDb21wYXJlVmFsaWRhdG9yKG9wZXJhdG9yQ29udHJhc3Rbb3BlcmF0b3JDb21wYXJlXSwgc2NoZW1hLnVuaXF1ZUZpZWxkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVZhbGlkYXRvckNoZWNrRHVwbGljYXRlKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlLCBmaWVsZE90aGVyOiBzdHJpbmdbXSwgbWVzc2FnZTogc3RyaW5nLCBkZWZhdWx0RmlsdGVyczogRmlsdGVyW10pIHtcclxuICAgICAgICBpZiAoZmllbGRPdGhlci5pbmRleE9mKHNjaGVtYS51bmlxdWVGaWVsZCkgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NjaGVtYSBj4bqldSBow6xuaCBi4buLIGzhu5dpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBmaWVsZHMgPSBbLi4uZmllbGRPdGhlciwgc2NoZW1hLmZpZWxkXTtcclxuICAgICAgICAgICAgZmllbGRPdGhlci5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNjaGVtYU90aGVyID0gPEZvcm1Db250cm9sQmFzZT4odGhpcy5mb3JtQ29udHJvbHNbZmllbGRdKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIocCA9PiBwICE9IHNjaGVtYU90aGVyLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmICghc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5zb21lKHAgPT4gcCBpbnN0YW5jZW9mIENoZWNrRHVwbGljYXRlRmllbGRzVmFsaWRhdG9yXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5fY29tbW9uU2VydmljZS5pc1NhbWVBcnJheSh0bXBGaWVsZHMsIHAuZ2V0RHVwbGljYXRlRmllbGRzKCkpKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX3ZhbGlkYXRvciA9IG5ldyBDaGVja0R1cGxpY2F0ZUZpZWxkc1ZhbGlkYXRvcih0bXBGaWVsZHMsIG1lc3NhZ2UsIGRlZmF1bHRGaWx0ZXJzKTtcclxuICAgICAgICAgICAgICAgICAgICBfdmFsaWRhdG9yLnNldEJhc2VTZXJ2aWNlKHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5wdXNoKF92YWxpZGF0b3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlVmFsaWRhdG9yUmVxdWlyZWRzKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlLCBmaWVsZE90aGVyOiBzdHJpbmdbXSwgbWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKGZpZWxkT3RoZXIuaW5kZXhPZihzY2hlbWEudW5pcXVlRmllbGQpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdTY2hlbWEgY+G6pXUgaMOsbmggYuG7iyBs4buXaScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZmllbGRzID0gWy4uLmZpZWxkT3RoZXIsIHNjaGVtYS5maWVsZF07XHJcbiAgICAgICAgICAgIGZpZWxkT3RoZXIuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWFPdGhlciA9IDxGb3JtQ29udHJvbEJhc2U+KHRoaXMuZm9ybUNvbnRyb2xzW2ZpZWxkXSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0bXBGaWVsZHMgPSBmaWVsZHMuZmlsdGVyKHAgPT4gcCAhPSBzY2hlbWFPdGhlci5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYU90aGVyLnZhbGlkYXRvcnMuc29tZShwID0+IHAgaW5zdGFuY2VvZiBSZXF1aXJlZEZpZWxkc1ZhbGlkYXRvclxyXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMuX2NvbW1vblNlcnZpY2UuaXNTYW1lQXJyYXkodG1wRmllbGRzLCBwLmdldFJlcXVpcmVkRmllbGRzKCkpKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX3ZhbGlkYXRvciA9IG5ldyBSZXF1aXJlZEZpZWxkc1ZhbGlkYXRvcih0bXBGaWVsZHMsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNjaGVtYU90aGVyLnZhbGlkYXRvcnMucHVzaChfdmFsaWRhdG9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVNhbWVWYWx1ZVZhbGlkYXRvcnMoc2NoZW1hOiBGb3JtQ29udHJvbEJhc2UsIGZpZWxkT3RoZXI6IHN0cmluZ1tdLCBtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoZmllbGRPdGhlci5pbmRleE9mKHNjaGVtYS51bmlxdWVGaWVsZCkgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NjaGVtYSBj4bqldSBow6xuaCBi4buLIGzhu5dpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBmaWVsZHMgPSBbLi4uZmllbGRPdGhlciwgc2NoZW1hLmZpZWxkXTtcclxuICAgICAgICAgICAgZmllbGRPdGhlci5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNjaGVtYU90aGVyID0gPEZvcm1Db250cm9sQmFzZT4odGhpcy5mb3JtQ29udHJvbHNbZmllbGRdKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIocCA9PiBwICE9IHNjaGVtYU90aGVyLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmICghc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5zb21lKHAgPT4gcCBpbnN0YW5jZW9mIFNhbWVWYWx1ZVZhbGlkYXRvclxyXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMuX2NvbW1vblNlcnZpY2UuaXNTYW1lQXJyYXkodG1wRmllbGRzLCBwLmdldFNhbWVGaWVsZHMoKSkpXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBfdmFsaWRhdG9yID0gbmV3IFNhbWVWYWx1ZVZhbGlkYXRvcih0bXBGaWVsZHMsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNjaGVtYU90aGVyLnZhbGlkYXRvcnMucHVzaChfdmFsaWRhdG9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0RGF0YURlZmF1bHQoKSB7XHJcbiAgICAgICAgY29uc3Qgc3RyaW5nRGF0YURlZmF1bHQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShDb21DdHhDb25zdGFudHMuTE9DQUxTVE9SQUdFX0tFWS5ERUZBVUxUX0RBVEEpO1xyXG4gICAgICAgIGNvbnN0IGdldFNldHRpbmdEYXRhRGVmYXVsdCA9IHRoaXMuX21vZHVsZUNvbmZpZy5nZXRDb25maWcoKS5lbnZpcm9ubWVudC5zZXR0aW5nRGF0YURlZmF1bHQ7XHJcbiAgICAgICAgaWYgKHN0cmluZ0RhdGFEZWZhdWx0ICYmICh0aGlzLl9tb2RlbERhdGEgJiYgIXRoaXMuX21vZGVsRGF0YS5pZCkpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YUNhY2hlID0gSlNPTi5wYXJzZShzdHJpbmdEYXRhRGVmYXVsdCk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSAoPERyb3Bkb3duQ29udHJvbFNjaGVtYT5pdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSAoY29udHJvbC5maWVsZCArIChjb250cm9sLnZhbHVlRmllbGQgPT0gJ2lkJyA/ICcnIDogY29udHJvbC52YWx1ZUZpZWxkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZGF0YUNhY2hlW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChnZXRTZXR0aW5nRGF0YURlZmF1bHQpIHsgLy8gbOG6pXkgY+G6pXUgaMOsbmggZmllbGQgbWFwUGluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZE1hcEdldENhY2hlID0gZ2V0U2V0dGluZ0RhdGFEZWZhdWx0W2NvbnRyb2wuZmllbGRdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRNYXBHZXRDYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gKGZpZWxkTWFwR2V0Q2FjaGUgKyAoY29udHJvbC52YWx1ZUZpZWxkID09ICdpZCcgPyAnJyA6IGNvbnRyb2wudmFsdWVGaWVsZCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkYXRhQ2FjaGVba2V5XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRhQ2FjaGVbKDxGb3JtU2NoZW1hQmFzZT5pdGVtKS5maWVsZF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YVsoPEZvcm1TY2hlbWFCYXNlPml0ZW0pLmZpZWxkXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmZ1bmN0aW9uLm1vZGlmeURhdGFBZnRlckdldENhY2hlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5mdW5jdGlvbi5tb2RpZnlEYXRhQWZ0ZXJHZXRDYWNoZSh0aGlzLl9tb2RlbERhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFwcGx5Q2FjaGVkVmFsdWVzKCkge1xyXG4gICAgICAgIHRoaXMuZ2V0Q2FjaGVkVmFsdWVzRnJvbVN0b3JhZ2UoKTtcclxuICAgICAgICB0aGlzLnNldENhY2hlZFZhbHVlVG9Nb2RlbCh0aGlzLl9tb2RlbERhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0Q2FjaGVkVmFsdWVUb01vZGVsKG1vZGVsLCB1bmlxdWVLZXlDb250cm9sPywgcGF0aD8pIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIGluIG1vZGVsKSB7XHJcbiAgICAgICAgICAgIGlmIChmaWVsZCAhPSAnX2Vycm9ycycgJiYgZmllbGQgIT0gJ19zdGF0dXMnICYmIGZpZWxkICE9ICdfc291cmNlJykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHN1YlVuaXF1ZUtleUNvbnRyb2w7XHJcbiAgICAgICAgICAgICAgICBpZiAodW5pcXVlS2V5Q29udHJvbCAhPSBudWxsICYmIHVuaXF1ZUtleUNvbnRyb2wgIT09ICcnKSBzdWJVbmlxdWVLZXlDb250cm9sID0gdW5pcXVlS2V5Q29udHJvbCArICcuJyArIGZpZWxkO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBzdWJVbmlxdWVLZXlDb250cm9sID0gZmllbGQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtQ29udHJvbHNbc3ViVW5pcXVlS2V5Q29udHJvbF07XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRyb2wpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgbGV0IHN1YlBhdGg7XHJcbiAgICAgICAgICAgICAgICBpZiAocGF0aCAhPSBudWxsICYmIHBhdGggIT09ICcnKSBzdWJQYXRoID0gcGF0aCArICcuJyArIGZpZWxkO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBzdWJQYXRoID0gZmllbGQ7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViTW9kZWwgPSBtb2RlbFtmaWVsZF07XHJcbiAgICAgICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHN1Yk1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FjaGVkVmFsdWVUb01vZGVsKGl0ZW0sIHN1YlVuaXF1ZUtleUNvbnRyb2wsIHN1YlBhdGggKyAnWycgKyBpbmRleCArICddJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNMaXRlcmFsT2JqZWN0KHN1Yk1vZGVsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FjaGVkVmFsdWVUb01vZGVsKHN1Yk1vZGVsLCBzdWJVbmlxdWVLZXlDb250cm9sLCBzdWJQYXRoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnRyb2wuZW5hYmxlQ2FjaGluZyAmJiB0aGlzLmNhY2hlZFZhbHVlcy5oYXNPd25Qcm9wZXJ0eShzdWJQYXRoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsW2ZpZWxkXSA9IHRoaXMuY2FjaGVkVmFsdWVzW3N1YlBhdGhdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0Q2FjaGVkVmFsdWVzRnJvbVN0b3JhZ2UoKSB7XHJcbiAgICAgICAgY29uc3QgY2FjaGVkVmFsdWVzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FjaGVkVmFsdWVzJykpO1xyXG4gICAgICAgIGlmIChjYWNoZWRWYWx1ZXMpIHtcclxuICAgICAgICAgICAgbGV0IHBhdGhOYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1JZCkgcGF0aE5hbWUgKz0gJy8nICsgdGhpcy5mb3JtSWQ7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FjaGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gY2FjaGVkVmFsdWVzW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZWRWYWx1ZXMgPSBlbGVtZW50LnZhbHVlcztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNhdmVDYWNoZVZhbHVlc1RvU3RvcmFnZSgpIHtcclxuICAgICAgICBsZXQgY2FjaGVkVmFsdWVzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FjaGVkVmFsdWVzJykpO1xyXG4gICAgICAgIGlmICghY2FjaGVkVmFsdWVzKSBjYWNoZWRWYWx1ZXMgPSBbXTtcclxuICAgICAgICBsZXQgY2hlY2tFeGlzdCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBwYXRoTmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lO1xyXG4gICAgICAgIGlmICh0aGlzLmZvcm1JZCkgcGF0aE5hbWUgKz0gJy8nICsgdGhpcy5mb3JtSWQ7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYWNoZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNhY2hlZFZhbHVlc1tpXTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnZhbHVlcyA9IHRoaXMuY2FjaGVkVmFsdWVzO1xyXG4gICAgICAgICAgICAgICAgY2hlY2tFeGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFjaGVja0V4aXN0KSB7XHJcbiAgICAgICAgICAgIGNhY2hlZFZhbHVlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHBhdGhuYW1lOiBwYXRoTmFtZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlczogdGhpcy5jYWNoZWRWYWx1ZXNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FjaGVkVmFsdWVzJywgSlNPTi5zdHJpbmdpZnkoY2FjaGVkVmFsdWVzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJpZ2dlckNoYW5nZShmaWVsZFBhdGgpIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgoZmllbGRQYXRoKTtcclxuICAgICAgICBjb25zdCBjb250cm9sID0gY3VycmVudE5vZGUuY29udHJvbDtcclxuICAgICAgICBpZiAoY29udHJvbCAmJiBjdXJyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUZpZWxkVmFsdWVDaGFuZ2UoY29udHJvbCwgbnVsbCwgJ3RyaWdnZXInLCBjdXJyZW50Tm9kZS5wYXJlbnRNb2RlbCwgY3VycmVudE5vZGUucGFyZW50TW9kZWxQYXRoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvRm9jdXMgJiYgIXRoaXMucm9vdENvbnRleHQuZGF0YS5mbGFncy5oYXNGb2N1c2luZ0NvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucm9vdENvbnRleHQuZGF0YS5mbGFncy5oYXNGb2N1c2luZ0NvbnRyb2wgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c0ZpcnN0Q29udHJvbCgpO1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290Q29udGV4dC5kYXRhLmZsYWdzLmhhc0ZvY3VzaW5nQ29udHJvbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSwgODAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNldElzTG9hZGVkRGF0YUVkaXQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmxvYWRlZERhdGFFZGl0T2xkID0gdGhpcy5sb2FkZWREYXRhRWRpdDtcclxuICAgICAgICB0aGlzLmxvYWRlZERhdGFFZGl0ID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENvbnRyb2xUeXBlKGNvbnRyb2w6IGFueSkge1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGl0bGVTY2hlbWEpIHJldHVybiAndGl0bGUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgTGFiZWxTY2hlbWEpIHJldHVybiAnbGFiZWwnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgU3BhbkNvbnRyb2xTY2hlbWEpIHJldHVybiAnc3BhbkNvbnRyb2wnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgTWFza0NvbnRyb2xTY2hlbWEpIHJldHVybiAnbWFzayc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBOdW1iZXJSYW5nZUNvbnRyb2xTY2hlbWEpIHJldHVybiAnbnVtYmVycmFuZ2UnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGV4dENvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgdGV4dENvbnRyb2wgPSA8VGV4dENvbnRyb2xTY2hlbWE+Y29udHJvbDtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgdGV4dENvbnRyb2wuZGF0YUZvcm1hdCA9PT0gJ21vbmV5J1xyXG4gICAgICAgICAgICAgICAgfHwgdGV4dENvbnRyb2wuZGF0YUZvcm1hdCA9PT0gJ21vbmV5aW50J1xyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnbW9uZXknO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHRleHRDb250cm9sLmRhdGFGb3JtYXQgPT09ICdwaG9uZSdcclxuICAgICAgICAgICAgICAgIHx8IHRleHRDb250cm9sLmRhdGFGb3JtYXQgPT09ICdmYXgnXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdwaG9uZU9yZmF4JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gJ3RleHQnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFJlZmVyZW5jZVRleHRDb250cm9sU2NoZW1hKSByZXR1cm4gJ3JlZmVyZW5jZS10ZXh0JztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRlbXBsYXRlQ29udHJvbFNjaGVtYSkgcmV0dXJuICd0ZW1wbGF0ZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHJldHVybiAnZGF0ZXRpbWUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRGF0ZVRpbWVSYW5nZUNvbnRyb2xTY2hlbWEpIHJldHVybiAnZGF0ZXRpbWVyYW5nZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBBZGRyZXNzQ29udHJvbFNjaGVtYSkgcmV0dXJuICdhZGRyZXNzJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkgcmV0dXJuICdkcm9wZG93bic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBFZGl0b3JDb250cm9sU2NoZW1hKSByZXR1cm4gJ2VkaXRvcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0QXJlYUNvbnRyb2xTY2hlbWEpIHJldHVybiAndGV4dGFyZWEnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgV3JhcFBpY2tlckNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdjb21tb24tcGlja2VyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUGjhuqNpIMSR4buDIGTDsm5nIGTGsOG7m2kg4bufIGLDqm4gdHLDqm4gVXNlclBpY2tlckNvbnRyb2xTY2hlbWEgdsOsIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEgOiBVc2VyUGlja2VyQ29udHJvbFNjaGVtYVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICdhdXRvY29tcGxldGUtcGlja2VyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFVzZXJQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ3VzZXItcGlja2VyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEVudGl0eVBpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnZW50aXR5LXBpY2tlcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBPcmdhbml6YXRpb25QaWNrZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnb3JnYW5pemF0aW9uLXBpY2tlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29DYXVUb0NodWNQaWNrZXJDb250cm9sU2NoZW1hTmV3KSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnY29jYXV0b2NodWMtcGlja2VyLW5ldyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29DYXVUb0NodWNQaWNrZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnY29jYXV0b2NodWMtcGlja2VyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb0NhdVRvQ2h1Y0NvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdjb2NhdXRvY2h1Yyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQXV0b0NvbXBsZXRlQ29udHJvbFNjaGVtYSkgcmV0dXJuICdhdXRvY29tcGxldGUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgU3dpdGNoQ29udHJvbFNjaGVtYSkgcmV0dXJuICdzd2l0Y2gnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ2hlY2tib3hDb250cm9sU2NoZW1hKSByZXR1cm4gJ2NoZWNrYm94JztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENoZWNrQm94TGlzdENvbnRyb2xTY2hlbWEpIHJldHVybiAnY2hlY2tib3hsaXN0JztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdyYWRpb2J1dHRvbmxpc3QnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZpbGVVcGxvYWRDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm1vZGUgPT0gRmlsZVVwbG9hZE1vZGUudXNpbmdGaWxlSW5zdGFuY2VJZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdmaWxlVXBsb2FkJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnc2VydmljZUZpbGVVcGxvYWQnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRmlsZU1hbmFnZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2ZpbGVNYW5hZ2VyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbG9yUGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICdjb2xvclBpY2tlcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb2xvckNvbnRyb2xTY2hlbWEpIHJldHVybiAnY29sb3JDb250cm9sJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSByZXR1cm4gJ3RhYmxlJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkgcmV0dXJuICdjb250YWluZXInO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQnV0dG9uQ29udHJvbFNjaGVtYSkgcmV0dXJuICdidXR0b24nO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVmFuQmFuUGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICd2YW5iYW4nO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29uZ1ZpZWNQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2Nvbmd2aWVjJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFBlcmNlbnRDb250cm9sU2NoZW1hKSByZXR1cm4gJ3BlcmNlbnQnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29sdW1uU2NoZW1hQmFzZSkgcmV0dXJuICdjb2x1bW4nO1xyXG4gICAgICAgIHJldHVybiAnY3VzdG9tJztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Vmlld01vZGVEYXRhVHlwZShjb250cm9sKSB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUaXRsZVNjaGVtYSkgcmV0dXJuICd0aXRsZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBMYWJlbFNjaGVtYSkgcmV0dXJuICdsYWJlbCc7XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgTWFza0NvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdtYXNrJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRGF0ZVRpbWVDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGVDb250cm9sID0gPERhdGVUaW1lQ29udHJvbFNjaGVtYT5jb250cm9sO1xyXG4gICAgICAgICAgICBpZiAoZGF0ZUNvbnRyb2wuc2hvd1RpbWUpIHJldHVybiAnZGF0ZXRpbWUnO1xyXG4gICAgICAgICAgICByZXR1cm4gJ2RhdGUnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEVkaXRvckNvbnRyb2xTY2hlbWEpIHJldHVybiAnaHRtbCc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBVc2VyUGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICd1c2VyJztcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGNvbnRyb2wgaW5zdGFuY2VvZiBTd2l0Y2hDb250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBDaGVja2JveENvbnRyb2xTY2hlbWFcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuICdib29sZWFuJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBjb250cm9sIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBDaGVja0JveExpc3RDb250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBSYWRpb0J1dHRvbkxpc3RDb250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBPcmdhbml6YXRpb25QaWNrZXJDb250cm9sU2NoZW1hXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnaGFzRGF0YVNvdXJjZSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRmlsZVVwbG9hZENvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wubW9kZSA9PSBGaWxlVXBsb2FkTW9kZS51c2luZ0ZpbGVJbnN0YW5jZUlkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2ZpbGVVcGxvYWQnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdmaWxlU2VydmljZVVwbG9hZCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGaWxlTWFuYWdlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnZmlsZU1hbmFnZXInO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQWRkcmVzc0NvbnRyb2xTY2hlbWEpIHJldHVybiAnYWRkcmVzcyc7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBjb250cm9sIGluc3RhbmNlb2YgVGV4dENvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgJiYgKGNvbnRyb2wuZGF0YUZvcm1hdCA9PT0gJ21vbmV5J1xyXG4gICAgICAgICAgICAgICAgfHwgY29udHJvbC5kYXRhRm9ybWF0ID09PSAnbW9uZXlpbnQnKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ21vbmV5JztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb2xvclBpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnY29sb3JQaWNrZXInO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29sb3JDb250cm9sU2NoZW1hKSByZXR1cm4gJ2NvbG9yQ29udHJvbCc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkgcmV0dXJuICd0YWJsZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBLZXlWYWx1ZUNvbnRyb2xTY2hlbWEpIHJldHVybiAnYXBwLWtleS12YWx1ZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdjb250YWluZXInO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHZhbGlkYXRlRm9ybShzZXRWYWxpZGF0ZUZvcm0gPSB0cnVlKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgaWYgKHNldFZhbGlkYXRlRm9ybSkge1xyXG4gICAgICAgICAgICB0aGlzLl9pblZhbGlkRm9ybSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlTW9kZWwodGhpcy5fcm9vdE5vZGUpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5faW5WYWxpZEZvcm0pIHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNUb0ZpcnN0RXJyb3JDb250cm9sKCk7XHJcbiAgICAgICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVNb2RlbChjdXJyZW50Tm9kZTogQ29udHJvbFRyZWVOb2RlKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZE5vZGUgb2YgY3VycmVudE5vZGUuY2hpbGROb2Rlcykge1xyXG4gICAgICAgICAgICBpZiAoIWNoaWxkTm9kZS5jb250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlLmNoaWxkTm9kZXMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkTm9kZVsnX2hpZGRlbiddIHx8IGNoaWxkTm9kZS5jb250cm9sWydfaGlkZGVuJ10pIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWF3YWl0IHRoaXMudmFsaWRhdGUoY2hpbGROb2RlLCB0cnVlKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faW5WYWxpZEZvcm0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlTW9kZWwoY2hpbGROb2RlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdmFsaWRhdGVGb3JtQ29udHJvbChmaWVsZFBhdGgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBjb25zdCBjb250cm9sTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgoZmllbGRQYXRoKTtcclxuICAgICAgICBpZiAoY29udHJvbE5vZGUpIHtcclxuICAgICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLnZhbGlkYXRlKGNvbnRyb2xOb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGhhbmRsZUNoYW5nZURyb3Bkb3duKGNvbnRyb2w6IERyb3Bkb3duQ29udHJvbFNjaGVtYSwgZXZlbnQ/LCBldmVudFR5cGU/LCBwYXJlbnRNb2RlbD8sIHBhcmVudFBhdGg/LCBzb3VyY2VOb2RlPywgYnViYmxlPykge1xyXG4gICAgICAgIGlmIChjb250cm9sLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gdGhpcy5ldmVudFR5cGUuSElERSkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGaWVsZFZhbHVlQ2hhbmdlKGNvbnRyb2wsIGV2ZW50LCB0aGlzLmV2ZW50VHlwZS5DSEFOR0UsIHBhcmVudE1vZGVsLCBwYXJlbnRQYXRoLCBzb3VyY2VOb2RlLCBidWJibGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUZpZWxkVmFsdWVDaGFuZ2UoY29udHJvbCwgZXZlbnQsIGV2ZW50VHlwZSwgcGFyZW50TW9kZWwsIHBhcmVudFBhdGgsIHNvdXJjZU5vZGUsIGJ1YmJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogxJDhu4Mgbmd1ecOqbiBow6BtIGThuqFuZyBhcnJvdyBmdW5jdGlvbiB2w6wgY8OzIDEgc+G7kSBmb3JtIGtow6FjIGfhu41pXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBoYW5kbGVGaWVsZFZhbHVlQ2hhbmdlID0gYXN5bmMgKGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSwgZXZlbnQ/LCBldmVudFR5cGU/LCBwYXJlbnRNb2RlbD8sIHBhcmVudFBhdGg/LCBzb3VyY2VOb2RlPywgYnViYmxlPykgPT4ge1xyXG4gICAgICAgIGxldCBwYXJlbnROb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKTtcclxuICAgICAgICBsZXQgY3VycmVudE5vZGU7XHJcblxyXG4gICAgICAgIC8vIHJvdyBpbiB0YWJsZVxyXG4gICAgICAgIGlmIChjb250cm9sID09IG51bGwpIHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlO1xyXG4gICAgICAgICAgICBjb250cm9sID0gY3VycmVudE5vZGUuY29udHJvbDtcclxuICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgcGFyZW50TW9kZWwgPSBwYXJlbnROb2RlLm1vZGVsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZShjb250cm9sLmZpZWxkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHZhbHVlID0gY3VycmVudE5vZGUudmFsdWU7XHJcblxyXG4gICAgICAgIC8vIGF1dG8gY29ycmVjdCB2YWx1ZVxyXG4gICAgICAgIHZhbHVlID0gdGhpcy5jb3JyZWN0VmFsdWUoY3VycmVudE5vZGUpO1xyXG4gICAgICAgIGN1cnJlbnROb2RlLnZhbHVlID0gdmFsdWU7XHJcblxyXG4gICAgICAgIC8vIHZhbGlkYXRlIHZhbHVlXHJcbiAgICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZShjdXJyZW50Tm9kZSk7XHJcblxyXG4gICAgICAgIGlmICghYnViYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZU1vZGVsQ2hhbmdlZCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsXHJcbiAgICAgICAgICAgIHNvdXJjZU5vZGU6IHNvdXJjZU5vZGUgfHwgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgIGV2ZW50VHlwZSxcclxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wub25DaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQ2hhbmdlZChldmVudERhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFidWJibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocGFyZW50Tm9kZS5wYXJlbnROb2RlICE9IG51bGwgJiYgcGFyZW50Tm9kZS5wYXJlbnROb2RlICE9IHBhcmVudE5vZGUucm9vdE5vZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVGaWVsZFZhbHVlQ2hhbmdlKHBhcmVudE5vZGUuY29udHJvbCwgZXZlbnQsIGV2ZW50VHlwZSwgcGFyZW50Tm9kZS5wYXJlbnROb2RlLm1vZGVsLCBwYXJlbnROb2RlLnBhcmVudE5vZGUubW9kZWxQYXRoLCBzb3VyY2VOb2RlIHx8IGN1cnJlbnROb2RlLCB0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlQ2FjaGluZyAmJiBjb250cm9sLmVuYWJsZUNhY2hpbmcpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlQ29udHJvbFZhbHVlKGNvbnRyb2wsIHZhbHVlLCBwYXJlbnRQYXRoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoZXZlbnREYXRhKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFdmVudCBraGkgZHJvcGRvd24gxJFp4buBdSBjaOG7iW5oIHZhbHVlIHThu6sgcmF3IHZhbHVlIGThuqFuZyBndWlkIHwgaW50IHwgLi4uID0+IG9iamVjdCBraeG7g3Uge3ZhbHVlOiBndWlkIHwgaW50IHwgLi4uLCAuLi4gWzEgc+G7kSB0csaw4budbmcga2jDoWNdfVxyXG4gICAgICogQHBhcmFtIGNvbnRyb2xcclxuICAgICAqIEBwYXJhbSBwYXJlbnRQYXRoXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGVBZGp1c3RWYWx1ZURyb3Bkb3duRXZlbnQoY29udHJvbDogRHJvcGRvd25Db250cm9sU2NoZW1hIHwgUmFkaW9CdXR0b25MaXN0Q29udHJvbFNjaGVtYSwgcGFyZW50UGF0aD8pIHtcclxuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKTtcclxuICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlKGNvbnRyb2wuZmllbGQpO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSxcclxuICAgICAgICAgICAgZXZlbnRUeXBlOiB0aGlzLmV2ZW50VHlwZS5BREpVU1RfVkFMVUUsXHJcbiAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sLm9uQWRqdXN0ZWRWYWx1ZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkFkanVzdGVkVmFsdWUoZXZlbnREYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZURhdGFTb3VyY2VMb2FkQ29tcGxldGUoY29udHJvbDogRm9ybUNvbnRyb2xCYXNlV2l0aFNlcnZpY2UsIHBhcmVudFBhdGgsIGRhdGFTb3VyY2UpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZURhdGFTb3VyY2VMb2FkZWQoY29udHJvbDogRHJvcGRvd25Db250cm9sU2NoZW1hLCBwYXJlbnRQYXRoLCBkYXRhRnJvbURyb3Bkb3duOiBhbnkpIHtcclxuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKTtcclxuICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlKGNvbnRyb2wuZmllbGQpO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSxcclxuICAgICAgICAgICAgZXZlbnRUeXBlOiAnZGF0YVNvdXJjZUxvYWRlZCcsXHJcbiAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzLFxyXG4gICAgICAgICAgICBkYXRhOiBkYXRhRnJvbURyb3Bkb3duLnJhd0RhdGFTb3VyY2UgPyBkYXRhRnJvbURyb3Bkb3duLnJhd0RhdGFTb3VyY2UgOiBkYXRhRnJvbURyb3Bkb3duLmRhdGFTb3VyY2VcclxuICAgICAgICB9KTtcclxuICAgICAgICBldmVudERhdGFbJ2VsbSddID0gZGF0YUZyb21Ecm9wZG93bi5lbG07XHJcbiAgICAgICAgaWYgKHRoaXMuZm9ybVN0YXRlID09IEZvcm1TdGF0ZS5BRERcclxuICAgICAgICAgICAgJiYgY29udHJvbC5hdXRvRGlzcGxheUZpcnN0XHJcbiAgICAgICAgICAgICYmIGV2ZW50RGF0YS5kYXRhLmxlbmd0aCA+IDBcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wubXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2wuZmllbGRdIHx8ICF0aGlzLl9tb2RlbERhdGFbY29udHJvbC5maWVsZF0ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2wuZmllbGRdID0gW2V2ZW50RGF0YS5kYXRhWzBdW2NvbnRyb2wudmFsdWVGaWVsZF1dO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9tb2RlbERhdGFbY29udHJvbC5maWVsZF0pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2RlbERhdGFbY29udHJvbC5maWVsZF0gPSBldmVudERhdGEuZGF0YVswXVtjb250cm9sLnZhbHVlRmllbGRdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sLmNhbGxiYWNrRGF0YUZpbmlzaCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5jYWxsYmFja0RhdGFGaW5pc2goZXZlbnREYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaGFuZGxlUmVhZHlDb250cm9sUGlja2VyKGNvbnRyb2w6IEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEgfCBVc2VyUGlja2VyQ29udHJvbFNjaGVtYSB8IENvQ2F1VG9DaHVjUGlja2VyQ29udHJvbFNjaGVtYSwgcGFyZW50UGF0aD8pIHtcclxuICAgICAgICB0aGlzLmhhbmRsZUNvbnRyb2xSZWFkeUV2ZW50KGNvbnRyb2wsIHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGUoY29udHJvbC5maWVsZCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBldmVudFR5cGU6IHRoaXMuZXZlbnRUeXBlLlJFQURZLFxyXG4gICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChjb250cm9sLm9uUmVhZHkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25SZWFkeShldmVudERhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVMb2FkZWRDb250cm9sKF9jb21wb25lbnQ6IGFueSwgY29udHJvbDogRm9ybUNvbnRyb2xCYXNlLCBwYXJlbnRQYXRoPykge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGUoY29udHJvbC5maWVsZCk7XHJcbiAgICAgICAgaWYgKF9jb21wb25lbnQgJiYgY3VycmVudE5vZGUpIHtcclxuICAgICAgICAgICAgX2NvbXBvbmVudC5jdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlO1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZS5jb21wb25lbnQgPSBfY29tcG9uZW50O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlQ29udHJvbFJlYWR5RXZlbnQoY29udHJvbDogRm9ybUNvbnRyb2xCYXNlLCBwYXJlbnRQYXRoPykge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgIHBhcmVudE5vZGUubW9kZWwuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5yZWFkeSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5vbkNvbnRyb2xSZWFkeS5lbWl0KGNvbnRyb2wuZmllbGQpO1xyXG4gICAgICAgIGlmICh0aGlzLl9tb2RlbERhdGFbS2V5Rmxhc2hTaG93XSkge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50UGF0aCkgeyAvLyDEkG/huqFuIGNvZGUgdHJvbmcgYmxvY2sgaWYgbsOgeSBjaMawYSBjaHXhuqluLCB04bqhbSB0aOG7nWkgY29kZSB0aOG6vyDEkeG6v24ga2hpIGfhurdwIGNhc2UgbsOgeSB0aMOsIHhlbSBs4bqhaSBzYXVcclxuICAgICAgICAgICAgICAgIHRoaXMucmVhZHlTdGF0dXNbYCR7cGFyZW50UGF0aH0uJHtjb250cm9sLmZpZWxkfWBdID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVhZHlTdGF0dXNbYCR7Y29udHJvbC5maWVsZH1gXSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5jaGVja0NhblByaW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrQ2FuUHJpbnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX21vZGVsRGF0YVtLZXlGbGFzaFNob3ddICYmIHRoaXMuY2FuUHJpbnQpIHtcclxuICAgICAgICAgICAgdGhpcy53YWl0UmVhZHlBbmRQcmludCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB3YWl0UmVhZHlBbmRQcmludCgpIHtcclxuICAgICAgICBjb25zdCByZWFkeUFsbCA9IHRoaXMuY2hlY2tSZWFkeUFsbCgpO1xyXG4gICAgICAgIGlmICh0aGlzLndhaXRSZWFkeUFuZFByaW50VGltZW91dCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy53YWl0UmVhZHlBbmRQcmludFRpbWVvdXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVhZHlBbGwpIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX21vZGVsRGF0YVtLZXlGbGFzaFNob3ddO1xyXG4gICAgICAgICAgICB0aGlzLl9taW5pbWl6ZWREYXRhID0gdGhpcy5nZXRNaW5pbWl6ZURhdGEodGhpcy5fbW9kZWxEYXRhKTtcclxuICAgICAgICAgICAgdGhpcy5fcHJpbnRQZGZCeVNjaGVtYSh0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UsIHRoaXMuX21pbmltaXplZERhdGEsIHRoaXMuc2V0dGluZy5zY2hlbWEpXHJcbiAgICAgICAgICAgICAgICAudGhlbihyZXMgPT4gdGhpcy5oYW5kbGVSZXNwb25zZShyZXMsICcnLCBmID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1N1Y2Nlc3MoJ1ThuqFvIGZpbGUgdGjDoG5oIGPDtG5nJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWluaW1pemVkRGF0YS5wcmludEZpbGVJZCA9IHJlcy5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21pbmltaXplZERhdGEgPSB0aGlzLl9jb21tb25TZXJ2aWNlLmNsb25lT2JqZWN0KHRoaXMuX21pbmltaXplZERhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZVdhaXRCb3goKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnZpcm9ubWVudCA9IHRoaXMuX21vZHVsZUNvbmZpZy5nZXRDb25maWcoKS5lbnZpcm9ubWVudDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBiYXNlVHJpbmhLeShlbnZpcm9ubWVudCwgdGhpcy5zZXR0aW5nLCB0aGlzLl9tb2RlbERhdGEsIHJlcy5kYXRhLCB0aGlzLl9ub3RpZmllclNlcnZpY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkFmdGVyVHJpbmhLeS5lbWl0KCk7XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLndhaXRSZWFkeUFuZFByaW50VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy53YWl0UmVhZHlBbmRQcmludCgpO1xyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldE1vZGVsVGFibGVTY2hlbWFCeUNoaWxkU2NoZW1hKGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2xUYWJsZSA9IHRoaXMuZm9ybUNvbnRyb2xzW2NvbnRyb2xbdGhpcy5maWVsZFBhcmVudEZpZWxkXV07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vZGVsRGF0YVtjb250cm9sVGFibGUuZmllbGRdO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2hlY2tSZWFkeUFsbCgpOiBib29sZWFuIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5jb250cm9sTmVlZENoZWNrUmVhZHkpIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wuaGlkZGVuIHx8ICF0aGlzLl9tb2RlbERhdGFbY29udHJvbC5maWVsZF0pIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEZpZWxkID0gY29udHJvbFt0aGlzLmZpZWxkUGFyZW50RmllbGRdO1xyXG4gICAgICAgICAgICAvLyBO4bq/dSBsw6AgZmllbGQgdHJvbmcgdGFibGUgc2NoZW1hXHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRGaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXJyTW9kZWxDdW5nTGV2ZWwgPSB0aGlzLmdldE1vZGVsVGFibGVTY2hlbWFCeUNoaWxkU2NoZW1hKGNvbnRyb2wpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFyck1vZGVsQ3VuZ0xldmVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJNb2RlbEN1bmdMZXZlbC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmVhZHlTdGF0dXNbYCR7cGFyZW50RmllbGR9WyR7aX1dLiR7Y29udHJvbC5maWVsZH1gXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLnJlYWR5U3RhdHVzW2Ake2NvbnRyb2wuZmllbGR9YF0pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVNb2RlbEZyb21FeHRlcm5hbCA9ICgpID0+IHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRDb250cm9sTW9kZWwodGhpcy5fbW9kZWxEYXRhLCBjb250cm9sKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIFBo4bqjaSDEkeG7gyBhcnJvdyBmdW5jdGlvbiB2w6wgY8OzIGV4cG9ydCByYSBjaG8gbeG7mXQgc+G7kSB0ZW1wbGF0ZSBz4butIGThu6VuZ1xyXG4gICAgZmlyZU1vZGVsQ2hhbmdlZCA9ICgpID0+IHtcclxuICAgICAgICB0aGlzLl9taW5pbWl6ZWREYXRhID0gdGhpcy5nZXRNaW5pbWl6ZURhdGEodGhpcy5fbW9kZWxEYXRhKTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFuZ2UuZW1pdCh0aGlzLl9taW5pbWl6ZWREYXRhKTtcclxuICAgIH07XHJcblxyXG4gICAgcHVibGljIGhhbmRsZUJ1dHRvbkNsaWNrKGNvbnRyb2w6IEJ1dHRvbkNvbnRyb2xTY2hlbWEsIGV2ZW50LCBwYXJlbnRQYXRoKSB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wub25DbGljaykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkNsaWNrKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpLFxyXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUV2ZW50OiBldmVudCxcclxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRoaXMuZXZlbnRUeXBlLkNMSUNLLFxyXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY29ycmVjdFZhbHVlKGN1cnJlbnROb2RlOiBDb250cm9sVHJlZU5vZGUpIHtcclxuICAgICAgICBsZXQgcmUgPSBjdXJyZW50Tm9kZS52YWx1ZTtcclxuICAgICAgICBjb25zdCBjb250cm9sID0gY3VycmVudE5vZGUuY29udHJvbDtcclxuICAgICAgICBpZiAoY29udHJvbCAmJiBjb250cm9sLmNvcnJlY3RvcnMgJiYgY29udHJvbC5jb3JyZWN0b3JzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250cm9sLmNvcnJlY3RvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvcnJlY3RvciA9IGNvbnRyb2wuY29ycmVjdG9yc1tpXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogdGhpcy5ldmVudFR5cGUuQVVUT19DT1JSRUNULFxyXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmUgPSBjb3JyZWN0b3IuY29ycmVjdChldmVudERhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0cnVlIGzDoCB0aOG7j2EgbcOjbiwgZmFsc2UgbMOgIGtow7RuZyB0aOG7j2EgbcOjbiAo4bueIGPhuqVwIGhp4buHbiB04bqhaSBjaOG7qSBjaMawYSBraeG7g20gdHJhIGPhuqVwIGNvbilcclxuICAgIHByaXZhdGUgYXN5bmMgdmFsaWRhdGUoY3VycmVudE5vZGU6IENvbnRyb2xUcmVlTm9kZSwgZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSBjdXJyZW50Tm9kZS5jb250cm9sO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBSYWRpb0J1dHRvbkxpc3RDb250cm9sU2NoZW1hXHJcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBBZGRyZXNzQ29udHJvbFNjaGVtYVxyXG4gICAgICAgICAgICB8fCBjb250cm9sIGluc3RhbmNlb2YgRmlsZU1hbmFnZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmICghZm9yY2UgJiYgIXBhcmVudE5vZGUubW9kZWwuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5yZWFkeSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGUubW9kZWwuX2Vycm9yc1tjdXJyZW50Tm9kZS5maWVsZF07XHJcbiAgICAgICAgICAgIGlmICghZXJyb3JzKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgZXJyb3JzLnNwbGljZSgwLCBlcnJvcnMubGVuZ3RoKTtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wudmFsaWRhdG9ycyAmJiBjb250cm9sLnZhbGlkYXRvcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250cm9sLnZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSBjb250cm9sLnZhbGlkYXRvcnNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRoaXMuZXZlbnRUeXBlLlZBTElEQVRFLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhd2FpdCB2YWxpZGF0b3IudmFsaWRhdGUoZXZlbnREYXRhKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IHZhbGlkYXRvci5nZXRFcnJvcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9ycy5pbmRleE9mKGVycikgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHByaXZhdGUgX3NldEVycm9yKGZpZWxkOiBzdHJpbmcsIGVycm9yOiBzdHJpbmcpIHtcclxuICAgIC8vICAgICBjb25zdCBub2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChmaWVsZCk7XHJcbiAgICAvLyAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xyXG4gICAgLy8gICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1RyxrDhu51uZyBk4buvIGxp4buHdSBraMO0bmcgdOG7k24gdOG6oWknKTtcclxuICAgIC8vICAgICAgICAgcmV0dXJuO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICBjb25zdCBlcnJvcnMgPSBub2RlLnBhcmVudE5vZGUubW9kZWwuX2Vycm9yc1tub2RlLmZpZWxkXTtcclxuICAgIC8vICAgICBlcnJvcnMucHVzaChlcnJvcik7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gc2V0RXJyb3IoZmllbGQ6IHN0cmluZyB8IHN0cmluZ1tdLCBlcnJvcjogc3RyaW5nKSB7XHJcbiAgICAvLyAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQpKVxyXG4gICAgLy8gICAgICAgICBmaWVsZC5mb3JFYWNoKGl0ZW0gPT4gdGhpcy5fc2V0RXJyb3IoaXRlbSwgZXJyb3IpKTtcclxuICAgIC8vICAgICBlbHNlXHJcbiAgICAvLyAgICAgICAgIHRoaXMuX3NldEVycm9yKGZpZWxkLCBlcnJvcik7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYWNoZUNvbnRyb2xWYWx1ZShjb250cm9sLCB2YWx1ZSwgcGFyZW50UGF0aCkge1xyXG4gICAgICAgIGlmIChjb250cm9sICYmIGNvbnRyb2wuZW5hYmxlQ2FjaGluZykge1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlZFZhbHVlc1twYXJlbnRQYXRoICsgJy4nICsgY29udHJvbC5maWVsZF0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29tcG9uZW50QnlUeXBlKHRlbXBsYXRlTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnRlbXBsYXRlc1t0ZW1wbGF0ZU5hbWVdKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVzW3RlbXBsYXRlTmFtZV0gPSB0aGlzLl9jb21tb25TZXJ2aWNlLmZpbmRUZW1wbGF0ZUZyb21MaXN0KHRoaXMuY2hpbGRyZW4sIHRlbXBsYXRlTmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlc1t0ZW1wbGF0ZU5hbWVdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRJdGVtSW5BcnJheUJ5VmFsdWUoYXJyYXksIHYsIGNvbnRyb2wpIHtcclxuICAgICAgICBpZiAodiA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGZ1bmNHZXRMYWJlbCA9IGNvbnRyb2wuZnVuY0dldExhYmVsO1xyXG4gICAgICAgIGlmIChmdW5jR2V0TGFiZWwgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBmdW5jR2V0TGFiZWwgPSBpdGVtID0+IGl0ZW1bY29udHJvbC5kaXNwbGF5RmllbGRdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYXJyYXkgaW5zdGFuY2VvZiBBcnJheSAmJiBhcnJheS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCB2QXJyID0gdjtcclxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHYpKSB7XHJcbiAgICAgICAgICAgICAgICB2QXJyID0gdi50b1N0cmluZygpLnNwbGl0KCcsJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh2QXJyLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGFycmF5LmZpbmQoeCA9PiB4W2NvbnRyb2wudmFsdWVGaWVsZF0gPT0gdik7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jR2V0TGFiZWwoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodkFyci5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkuZmlsdGVyKHAgPT4gdkFyci5zb21lKHEgPT4gcSA9PSBwW2NvbnRyb2wudmFsdWVGaWVsZF0pKVxyXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoaXRlbSA9PiBmdW5jR2V0TGFiZWwoaXRlbSkpXHJcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJywnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEl0ZW1JbkFycmF5QnlUZXh0VmFsdWUoYXJyYXksIHYpIHtcclxuICAgICAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIHYgPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHY7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgYXJyYXkgaW5zdGFuY2VvZiBBcnJheVxyXG4gICAgICAgICAgICAmJiBhcnJheS5sZW5ndGggPiAwXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2LmpvaW4oJzsgJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QWRkcmVzc0Rpc3BsYXlUZXh0KHNlbGVjdGVkVmFsdWUpIHtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TGFiZWxDbGFzcyhjb250cm9sKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IGBsYWJlbC1jb250cm9sYDtcclxuICAgICAgICBpZiAoY29udHJvbC5pbmRleExhYmVsKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCArPSAnIGhhdmVJbmRleCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzY3JvbGxUb1ZpZXcoZWxlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RldmljZURldGVjdG9yU2VydmljZS5pc01vYmlsZSgpKSB7XHJcbiAgICAgICAgICAgIGlmIChlbGUpIHtcclxuICAgICAgICAgICAgICAgIGxldCBoMTogYW55ID0gZWxlLmNsb3Nlc3QoJ2RpdltpZCQ9XFwnLWhvbGRlclxcJ10nKTtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChoMSAmJiBoMS5wcmV2aW91c1NpYmxpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBoMSA9IGgxLnByZXZpb3VzU2libGluZztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaDEudGFnTmFtZSA9PT0gJ0RJVicpIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChoMSAmJiBoMS5zY3JvbGxJbnRvVmlldykgaDEuc2Nyb2xsSW50b1ZpZXcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIC0gU2V0IEZvY3VzIGNvbnRyb2xcclxuICAgICAqIEBwYXJhbSBvcHRpb25zXHJcbiAgICAgKi9cclxuXHJcbiAgICBwcml2YXRlIGZvY3VzRmlyc3RDb250cm9sKCkge1xyXG4gICAgICAgIGNvbnN0IGZvcm1FbGVtZW50ID0gdGhpcy5mb3JtRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGRpdnMgPSBmb3JtRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkaXYuY3J1ZC1mb3JtLWNvbnRyb2wnKTtcclxuICAgICAgICBpZiAoZGl2cykge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRpdiBvZiBkaXZzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0RGl2SG9sZGVyID0gZGl2O1xyXG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0Q29udHJvbCA9IHRoaXMuZmlyc3REaXZIb2xkZXIucXVlcnlTZWxlY3RvcignaW5wdXQ6bm90KFt0eXBlPWZpbGVdKTpub3QoW3R5cGU9aGlkZGVuXSknKTtcclxuICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvVmlldyhmaXJzdENvbnRyb2wpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sID0gdGhpcy5maXJzdERpdkhvbGRlci5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sICYmIGZpcnN0Q29udHJvbC5pZC5pbmRleE9mKCd0aW55LWFuZ3VsYXInKSAhPSAwXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sID0gdGhpcy5maXJzdERpdkhvbGRlci5xdWVyeVNlbGVjdG9yKCdpZnJhbWUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KGZpcnN0Q29udHJvbClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29udGVudHMoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCdib2R5JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGRlcHJlY2F0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aW55bWNlLWZvY3VzJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmb2N1c1RvRmlyc3RFcnJvckNvbnRyb2woKSB7XHJcbiAgICAgICAgY29uc3QgZm9ybUVsZW1lbnQgPSB0aGlzLmZvcm1FbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBgZGl2LmVycm9yYDtcclxuICAgICAgICBjb25zdCBkaXZIb2xkZXIgPSBmb3JtRWxlbWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcclxuICAgICAgICBpZiAoZGl2SG9sZGVyKSB7XHJcbiAgICAgICAgICAgIGxldCBmaXJzdENvbnRyb2wgPSBkaXZIb2xkZXIucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcclxuICAgICAgICAgICAgaWYgKGZpcnN0Q29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgZmlyc3RDb250cm9sLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvVmlldyhmaXJzdENvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZmlyc3RDb250cm9sID0gZGl2SG9sZGVyLnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sICYmIGZpcnN0Q29udHJvbC5pZC5pbmRleE9mKCd0aW55LWFuZ3VsYXInKSAhPSAwXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCA9IGRpdkhvbGRlci5xdWVyeVNlbGVjdG9yKCdpZnJhbWUnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeShmaXJzdENvbnRyb2wpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29udGVudHMoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJ2JvZHknKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBkZXByZWNhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGlueW1jZS1mb2N1cydcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHByZXZlbnRCbHVyKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMudHJhcEZvY3VzKSB7XHJcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgd2hpbGUgKHRhcmdldCB8fCB0YXJnZXQudGFnTmFtZSA9PSAnRk9STScpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuaWQuZW5kc1dpdGgoJy1ob2xkZXInKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQgPT0gdGhpcy5maXJzdERpdkhvbGRlcikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RDb250cm9sID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250cm9sID09IGV2ZW50LnRhcmdldCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzVmlzaWJsZShlbGVtKSB7XHJcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW0pO1xyXG4gICAgICAgIGlmIChzdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAoc3R5bGUudmlzaWJpbGl0eSAhPT0gJ3Zpc2libGUnKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKCtzdHlsZS5vcGFjaXR5IDwgMC4xKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBlbGVtLm9mZnNldFdpZHRoXHJcbiAgICAgICAgICAgICsgZWxlbS5vZmZzZXRIZWlnaHRcclxuICAgICAgICAgICAgKyBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxyXG4gICAgICAgICAgICArIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGhcclxuICAgICAgICAgICAgPT09IDBcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBlbGVtQ2VudGVyID0ge1xyXG4gICAgICAgICAgICB4OiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyBlbGVtLm9mZnNldFdpZHRoIC8gMixcclxuICAgICAgICAgICAgeTogZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyBlbGVtLm9mZnNldEhlaWdodCAvIDJcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgcG9pbnRDb250YWluZXIgPSA8YW55PihcclxuICAgICAgICAgICAgZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChlbGVtQ2VudGVyLngsIGVsZW1DZW50ZXIueSlcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChwb2ludENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9pbnRDb250YWluZXIgPT09IGVsZW0pIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25kaXRpb25hbC1hc3NpZ25tZW50XHJcbiAgICAgICAgICAgIH0gd2hpbGUgKChwb2ludENvbnRhaW5lciA9IHBvaW50Q29udGFpbmVyLnBhcmVudE5vZGUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZWxldGVSb3coaW5kZXgsIGNvbnRyb2w6IFRhYmxlU2NoZW1hLCB0YWJsZVBhdGgpIHtcclxuICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd0RlbGV0ZUNvbmZpcm0oKS50aGVuKGFzeW5jIHJzID0+IHtcclxuICAgICAgICAgICAgaWYgKCFycykgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHRhYmxlUGF0aCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvRGVsZXRlUm93Tm9kZSA9IHRhYmxlTm9kZS5jaGlsZE5vZGVzW2luZGV4XTtcclxuXHJcbiAgICAgICAgICAgIGxldCB0b0RlbGV0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm9uRGVsZXRpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRvRGVsZXRlID0gY29udHJvbC5vbkRlbGV0aW5nKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogdG9EZWxldGVSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogdGhpcy5ldmVudFR5cGUuREVMRVRJTkcsXHJcbiAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodG9EZWxldGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICB0YWJsZU5vZGUubW9kZWwuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIHRhYmxlTm9kZS5yZWluaXRDaGlsZE5vZGVzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wub25DaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkNoYW5nZWQobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogdG9EZWxldGVSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiB0aGlzLmV2ZW50VHlwZS5UQUJMRV9DSEFOR0VELFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLm9uRGVsZXRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25EZWxldGVkKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IHRvRGVsZXRlUm93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogdGhpcy5ldmVudFR5cGUuREVMRVRFRCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBhZGROZXdSb3coXHJcbiAgICAgICAgY29udHJvbDogVGFibGVTY2hlbWEsIHRhYmxlUGF0aCwgZXZlbnRUeXBlPywgZGlzYWJsZU9wZW5EaWFsb2c6IGJvb2xlYW4gPSBmYWxzZSxcclxuICAgICAgICBpbml0RGF0YTogYW55ID0ge30sIGZpcmVFdmVudEZpbmlzaCA9IHRydWVcclxuICAgICkge1xyXG4gICAgICAgIGlmIChjb250cm9sLnNob3dFZGl0ICYmICFkaXNhYmxlT3BlbkRpYWxvZykge1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybVRpdGxlID0gYFRow6ptIG3hu5tpICR7Y29udHJvbC5sYWJlbH1gO1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybVNjaGVtYSA9IGNvbnRyb2wucm93VGVtcGxhdGU7XHJcbiAgICAgICAgICAgIHRoaXMudGFibGVGb3JtU2hvdyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMudGFibGVGb3JtQ3VycmVudFJvdyA9IC0xO1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybUN1cnJlbnRJbmZvID0ge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbCxcclxuICAgICAgICAgICAgICAgIHRhYmxlUGF0aCxcclxuICAgICAgICAgICAgICAgIGV2ZW50VHlwZVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgodGFibGVQYXRoKTtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRhYmxlTm9kZS5jaGlsZE5vZGVzLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gdGFibGVQYXRoICsgJ1snICsgaW5kZXggKyAnXSc7XHJcbiAgICAgICAgY29uc3QgZGF0YTogYW55ID0gaW5pdERhdGE7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuYXV0b0dlbmVyYXRlSWQgJiYgIWluaXREYXRhLmlkKSB7XHJcbiAgICAgICAgICAgIGRhdGEuaWQgPSB0aGlzLl9jb21tb25TZXJ2aWNlLmd1aWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVGjDqm0gaWQgxJHhu4MgbmfEg24gcmVuZGVyIGxpw6puIHThu6VjXHJcbiAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbERlZmF1bHRWYWx1ZShkYXRhLCBzdWJDb250cm9sLCBwYXJlbnRQYXRoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB0b0FkZCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wub25BZGRpbmcpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRvQWRkID0gY29udHJvbC5vbkFkZGluZyhuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgdGhpcy5ldmVudFR5cGUuQURESU5HLFxyXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgdG9BZGQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRvQWRkICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0YWJsZU5vZGUubW9kZWwucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgdGFibGVOb2RlLnJlaW5pdENoaWxkTm9kZXMoZmlyZUV2ZW50RmluaXNoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudFR5cGUgIT0gdGhpcy5ldmVudFR5cGUuSU5JVCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1Jvd05vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkNoYW5nZWQobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IG5ld1Jvd05vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlIHx8IHRoaXMuZXZlbnRUeXBlLlRBQkxFX0NIQU5HRUQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkFkZGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25BZGRlZChuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogbmV3Um93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgdGhpcy5ldmVudFR5cGUuQURERUQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRNdWx0aVJvdyhjb250cm9sLCBsZW5ndGgsIHRhYmxlUGF0aCwgZXZlbnRUeXBlPykge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5hZGROZXdSb3coY29udHJvbCwgdGFibGVQYXRoLCBldmVudFR5cGUsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBoYW5kbGVTYXZlZFRhYmxlUm93KGRhdGEpIHtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybVNob3cgPSBmYWxzZTtcclxuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy50YWJsZUZvcm1DdXJyZW50SW5mby5jb250cm9sO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlUGF0aCA9IHRoaXMudGFibGVGb3JtQ3VycmVudEluZm8udGFibGVQYXRoO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50VHlwZSA9IHRoaXMudGFibGVGb3JtQ3VycmVudEluZm8uZXZlbnRUeXBlO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgodGFibGVQYXRoKTtcclxuICAgICAgICBpZiAodGhpcy50YWJsZUZvcm1DdXJyZW50Um93ID4gLTEpIHtcclxuICAgICAgICAgICAgdGFibGVOb2RlLm1vZGVsW3RoaXMudGFibGVGb3JtQ3VycmVudFJvd10gPSB7IC4uLnRhYmxlTm9kZS5tb2RlbFt0aGlzLnRhYmxlRm9ybUN1cnJlbnRSb3ddLCAuLi5kYXRhIH07XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZU1vZGVsQ2hhbmdlZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGFibGVOb2RlLmNoaWxkTm9kZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gdGFibGVQYXRoICsgJ1snICsgaW5kZXggKyAnXSc7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sTW9kZWwoZGF0YSwgc3ViQ29udHJvbCwgcGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCB0b0FkZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm9uQWRkaW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvQWRkID0gY29udHJvbC5vbkFkZGluZyhuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgdGhpcy5ldmVudFR5cGUuQURESU5HLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgICAgICAgICB0b0FkZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodG9BZGQgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICB0YWJsZU5vZGUubW9kZWwucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgICAgIHRhYmxlTm9kZS5yZWluaXRDaGlsZE5vZGVzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSAhPSB0aGlzLmV2ZW50VHlwZS5JTklUKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Um93Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5vbkNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQ2hhbmdlZChuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBuZXdSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgdGhpcy5ldmVudFR5cGUuVEFCTEVfQ0hBTkdFRCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5vbkFkZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkFkZGVkKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IG5ld1Jvd05vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSB8fCB0aGlzLmV2ZW50VHlwZS5BRERFRCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2F2ZVJvdyhpbmRleCwgY29udHJvbDogVGFibGVTY2hlbWEsIHRhYmxlUGF0aCkge1xyXG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgodGFibGVQYXRoKTtcclxuICAgICAgICBjb25zdCBjdXJlbnRSb3dOb2RlID0gdGFibGVOb2RlLmNoaWxkTm9kZXNbaW5kZXhdO1xyXG4gICAgICAgIGlmIChjb250cm9sLm9uU2F2ZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vblNhdmUobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBjdXJlbnRSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogdGhpcy5ldmVudFR5cGUuU0FWRSxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBlZGl0Um93KGluZGV4LCBjb250cm9sOiBUYWJsZVNjaGVtYSwgdGFibGVQYXRoKSB7XHJcbiAgICAgICAgdGhpcy50YWJsZUZvcm1UaXRsZSA9IGBT4butYSAke2NvbnRyb2wubGFiZWx9YDtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybVNjaGVtYSA9IGNvbnRyb2wucm93VGVtcGxhdGU7XHJcbiAgICAgICAgdGhpcy50YWJsZUZvcm1DdXJyZW50Um93ID0gaW5kZXg7XHJcbiAgICAgICAgY29uc3QgdGFibGVOb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aCh0YWJsZVBhdGgpO1xyXG4gICAgICAgIGNvbnN0IHRvRGVsZXRlUm93Tm9kZSA9IHRhYmxlTm9kZS5jaGlsZE5vZGVzW2luZGV4XTtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybURhdGEgPSB0b0RlbGV0ZVJvd05vZGUudmFsdWU7XHJcbiAgICAgICAgdGhpcy50YWJsZUZvcm1DdXJyZW50SW5mbyA9IHtcclxuICAgICAgICAgICAgY29udHJvbCxcclxuICAgICAgICAgICAgdGFibGVQYXRoLFxyXG4gICAgICAgICAgICBpbmRleFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy50YWJsZUZvcm1TaG93ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlUm93T3JkZXJlZChjb250cm9sOiBUYWJsZVNjaGVtYSwgZXZ0LCBldmVudFR5cGU/LCBwYXJlbnRNb2RlbD8sIHBhcmVudFBhdGg/LCBzb3VyY2VOb2RlPywgYnViYmxlPykge1xyXG4gICAgICAgIGxldCBwYXJlbnROb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKTtcclxuICAgICAgICBsZXQgY3VycmVudE5vZGU7XHJcblxyXG4gICAgICAgIC8vIHJvdyBpbiB0YWJsZVxyXG4gICAgICAgIGlmIChjb250cm9sID09IG51bGwpIHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlO1xyXG4gICAgICAgICAgICBjb250cm9sID0gY3VycmVudE5vZGUuY29udHJvbDtcclxuICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgcGFyZW50TW9kZWwgPSBwYXJlbnROb2RlLm1vZGVsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZShjb250cm9sLmZpZWxkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHZhbHVlID0gY3VycmVudE5vZGUudmFsdWU7XHJcblxyXG4gICAgICAgIC8vIGF1dG8gY29ycmVjdCB2YWx1ZVxyXG4gICAgICAgIHZhbHVlID0gdGhpcy5jb3JyZWN0VmFsdWUoY3VycmVudE5vZGUpO1xyXG4gICAgICAgIGN1cnJlbnROb2RlLnZhbHVlID0gdmFsdWU7XHJcblxyXG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSxcclxuICAgICAgICAgICAgc291cmNlRXZlbnQ6IGV2ZW50LFxyXG4gICAgICAgICAgICBzb3VyY2VOb2RlOiBzb3VyY2VOb2RlIHx8IGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBldmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wub25SZW9yZGVyZWQpIHtcclxuICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vblJlb3JkZXJlZChldmVudERhdGEpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFidWJibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdChldmVudERhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dDb250ZXh0TWVudShldnQsIHJvd0RhdGEsIGNvbnRyb2w6IFRhYmxlU2NoZW1hKSB7XHJcbiAgICAgICAgdGhpcy5yb3dEYXRhQ3VycmVudCA9IHJvd0RhdGE7XHJcbiAgICAgICAgdGhpcy5idXR0b25Db250ZXh0cyA9IGF3YWl0IGNvbnRyb2wucm93QnV0dG9ucyhyb3dEYXRhKTtcclxuICAgICAgICBpZiAoIXRoaXMuYnV0dG9uQ29udGV4dHMgfHwgdGhpcy5idXR0b25Db250ZXh0cy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3Nob3dDb250ZXh0TWVudShldnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3Nob3dDb250ZXh0TWVudShldnQpIHtcclxuICAgICAgICB0aGlzLmNvbnRleHRNZW51LnNob3coZXZ0KTtcclxuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG1lc3NhZ2VSb3coaW5kZXgsIGNvbnRyb2w6IFRhYmxlU2NoZW1hLCB0YWJsZVBhdGgpIHtcclxuICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHRhYmxlUGF0aCk7XHJcbiAgICAgICAgY29uc3QgY3VyZW50Um93Tm9kZSA9IHRhYmxlTm9kZS5jaGlsZE5vZGVzW2luZGV4XTtcclxuICAgICAgICBpZiAoY29udHJvbC5vbk1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wub25NZXNzYWdlKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogY3VyZW50Um93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRoaXMuZXZlbnRUeXBlLk1FU1NBR0UsXHJcbiAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFRhYmxlRnVuY3Rpb25Db2x1bW5XaWR0aChjb250cm9sOiBUYWJsZVNjaGVtYSkge1xyXG4gICAgICAgIGxldCBuZSA9IDUwO1xyXG4gICAgICAgIGlmIChjb250cm9sLnNob3dEZWxldGUpIG5lICs9IDMwO1xyXG4gICAgICAgIGlmIChjb250cm9sLnNob3dFZGl0KSBuZSArPSAzMDtcclxuICAgICAgICBpZiAoY29udHJvbC5zaG93U2F2ZSkgbmUgKz0gMzA7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wucm93QnV0dG9ucykgbmUgKz0gMzA7XHJcbiAgICAgICAgcmV0dXJuIG5lICsgJ3B4JztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TWFza0J5VHlwZShtYXNrVHlwZSkge1xyXG4gICAgICAgIGlmIChtYXNrVHlwZSA9PSAnZGVjaW1hbCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdkb3Rfc2VwYXJhdG9yLjUnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VGV4dEFsaWduKHRleHRBbGlnbjogbnVtYmVyKSB7XHJcbiAgICAgICAgc3dpdGNoICh0ZXh0QWxpZ24pIHtcclxuICAgICAgICAgICAgY2FzZSBUZXh0QWxpZ24uQ2VudGVyOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdjZW50ZXInO1xyXG4gICAgICAgICAgICBjYXNlIFRleHRBbGlnbi5MZWZ0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdsZWZ0JztcclxuICAgICAgICAgICAgY2FzZSBUZXh0QWxpZ24uUmlnaHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3JpZ2h0JztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tEaXNhYmxlZChkYXRhOiBhbnksIGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSkge1xyXG4gICAgICAgIHJldHVybiBkYXRhLl9zdGF0dXNbY29udHJvbC5maWVsZF0uZGlzYWJsZWQgPT09IHRydWUgfHwgKGRhdGEuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5kaXNhYmxlZCA9PT0gdW5kZWZpbmVkICYmIGNvbnRyb2wuZGlzYWJsZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrSGlkZGVuKGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSwgcGFyZW50TW9kZWw6IGFueSwgcGF0aDogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gbnVsbDtcclxuICAgICAgICBpZiAocGF0aCAmJiBjb250cm9sWydub2RlcyddKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY29udHJvbFsnbm9kZXMnXVtwYXRoXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGN1cnJlbnROb2RlID09IG51bGwpIHtcclxuICAgICAgICAgICAgY29udHJvbFsnX2hpZGRlbiddID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByZXN1bHQgPSBwYXJlbnRNb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLmhpZGRlbiA9PT0gdHJ1ZVxyXG4gICAgICAgICAgICB8fCAocGFyZW50TW9kZWwuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5oaWRkZW4gPT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgJiYgKGNvbnRyb2wuaGlkZGVuXHJcbiAgICAgICAgICAgICAgICAgICAgfHwgKGNvbnRyb2wuaGlkZGVuQ2hlY2sgJiYgY29udHJvbC5oaWRkZW5DaGVjayh0aGlzLl9taW5pbWl6ZWREYXRhLCBjdXJyZW50Tm9kZSkpXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgY3VycmVudE5vZGVbJ19oaWRkZW4nXSA9ICEhcmVzdWx0O1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29udGV4dFRkKGNvbnRyb2wsIHJvd0RhdGEsIGluZGV4LCB0YWJsZVBhdGgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBjb250cm9sLFxyXG4gICAgICAgICAgICBkYXRhOiByb3dEYXRhLFxyXG4gICAgICAgICAgICBpbmRleCxcclxuICAgICAgICAgICAgdGFibGVQYXRoLFxyXG4gICAgICAgICAgICBwYXJlbnRQYXRoOiBgJHt0YWJsZVBhdGh9WyR7aW5kZXh9XWAsXHJcbiAgICAgICAgICAgIHBhdGg6IGAke3RhYmxlUGF0aH1bJHtpbmRleH1dLiR7Y29udHJvbC5maWVsZH1gLFxyXG4gICAgICAgICAgICBzaG93TGFiZWw6IGZhbHNlLFxyXG4gICAgICAgICAgICBtZFdpZHRoOiAxMlxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzTW9iaWxlT3JUYWJsZXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgdGhpcy5fZGV2aWNlRGV0ZWN0b3JTZXJ2aWNlLmlzTW9iaWxlKClcclxuICAgICAgICAgICAgfHwgdGhpcy5fZGV2aWNlRGV0ZWN0b3JTZXJ2aWNlLmlzVGFibGV0KClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlQ2FjaGluZykge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUNhY2hlVmFsdWVzVG9TdG9yYWdlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25TZXR0aW5ncyhldmVudCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25UYWJsZVNjaGVtYU9sZGVzdChldnQpIHtcclxuICAgICAgICB0aGlzLmNvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5DT01NT04uVEFCTEVfU0NIRU1BX1BBR0lOR19PTERFU1QsIG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblRhYmxlU2NoZW1hTmV3ZXN0KGV2dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5UQUJMRV9TQ0hFTUFfUEFHSU5HX05FV0VTVCwgbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uVGFibGVTY2hlbWFOZXh0KGV2dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5UQUJMRV9TQ0hFTUFfUEFHSU5HX05FWFQsIG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblRhYmxlU2NoZW1hUHJldihldnQpIHtcclxuICAgICAgICB0aGlzLmNvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5DT01NT04uVEFCTEVfU0NIRU1BX1BBR0lOR19QUkVWLCBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVmcmVzaChldnQpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29udHJvbERhdGFTb3VyY2UoY29udHJvbDogRHJvcGRvd25Db250cm9sU2NoZW1hLCBkYXRhOiBhbnkpIHtcclxuICAgICAgICBpZiAoZGF0YS5fc291cmNlW2NvbnRyb2wuZmllbGRdIGluc3RhbmNlb2YgQXJyYXkpIHJldHVybiBkYXRhLl9zb3VyY2VbY29udHJvbC5maWVsZF07XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuZGF0YVNvdXJjZSBpbnN0YW5jZW9mIEFycmF5KSByZXR1cm4gY29udHJvbC5kYXRhU291cmNlO1xyXG4gICAgICAgIGlmIChjb250cm9sLmRhdGFTb3VyY2UgaW5zdGFuY2VvZiBGdW5jdGlvbikgcmV0dXJuIGNvbnRyb2wuZGF0YVNvdXJjZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRyaWdnZXJSZWxvYWQoZmllbGQ6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm1Db250cm9sc1tmaWVsZF07XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgJiYgY29udHJvbC5iaW5kaW5nRmlsdGVycyAmJiBjb250cm9sLmJpbmRpbmdGaWx0ZXJzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChjb250cm9sLmJpbmRpbmdGaWx0ZXJzWzBdLmZpZWxkKTtcclxuICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogcGFyZW50Tm9kZSxcclxuICAgICAgICAgICAgICAgIHNvdXJjZUV2ZW50OiBudWxsLFxyXG4gICAgICAgICAgICAgICAgc291cmNlTm9kZTogcGFyZW50Tm9kZSxcclxuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogdGhpcy5ldmVudFR5cGUuQ0hBTkdFXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY29ycmVjdFZhbHVlKHBhcmVudE5vZGUpO1xyXG4gICAgICAgICAgICAvLyBhdXRvIGNvcnJlY3QgdmFsdWVcclxuICAgICAgICAgICAgcGFyZW50Tm9kZS52YWx1ZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNvbnRyb2xbS2V5RnVuY3Rpb25SZWxvYWRdKSB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sW0tleUZ1bmN0aW9uUmVsb2FkXShldmVudERhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbnRyb2wuX2NvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuX2NvbXBvbmVudC5nZXREYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5fY29tcG9uZW50LmdldERhdGEoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIENvbnRyb2xUcmVlTm9kZSB7XHJcbiAgICBtb2RlbFBhdGg6IHN0cmluZztcclxuICAgIHNjaGVtYVBhdGg6IHN0cmluZztcclxuICAgIGZpZWxkOiBzdHJpbmc7XHJcbiAgICBwYXJlbnROb2RlOiBDb250cm9sVHJlZU5vZGU7XHJcbiAgICByb290Tm9kZTogQ29udHJvbFRyZWVOb2RlO1xyXG4gICAgY2hpbGROb2RlczogQ29udHJvbFRyZWVOb2RlW10gPSBbXTtcclxuICAgIGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZTtcclxuICAgIF9jb21wb25lbnQ6IGFueTtcclxuICAgIGZvcm1Db250cm9scztcclxuICAgIGtleXNQbHVzOiBzdHJpbmdbXTtcclxuICAgIHByaXZhdGUgX2NydWRGb3JtOiBDcnVkRm9ybUNvbXBvbmVudDtcclxuICAgIHByaXZhdGUgY2hpbGROb2RlRGljID0ge307XHJcbiAgICBwcml2YXRlIGRhdGE6IGFueTtcclxuICAgIHByaXZhdGUgaGFzU2NoZW1hID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihtb2RlbDogYW55LCBzY2hlbWFzOiBbXSwgZmllbGQ/LCBwYXJlbnROb2RlPzogQ29udHJvbFRyZWVOb2RlKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gbW9kZWw7XHJcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbHMgPSBzY2hlbWFzO1xyXG4gICAgICAgIGlmIChwYXJlbnROb2RlKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnROb2RlLm1vZGVsUGF0aCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWxQYXRoID0gcGFyZW50Tm9kZS5tb2RlbFBhdGggKyAnLicgKyBmaWVsZDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYVBhdGggPSBwYXJlbnROb2RlLnNjaGVtYVBhdGggKyAnLicgKyBmaWVsZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBmaWVsZCA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsUGF0aCA9IHBhcmVudE5vZGUubW9kZWxQYXRoICsgJ1snICsgZmllbGQgKyAnXSc7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlbWFQYXRoID0gcGFyZW50Tm9kZS5zY2hlbWFQYXRoO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzU2NoZW1hID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsUGF0aCA9IGZpZWxkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY2hlbWFQYXRoID0gZmllbGQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMucm9vdE5vZGUgPSBwYXJlbnROb2RlLnJvb3ROb2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5yb290Tm9kZSA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7XHJcbiAgICAgICAgdGhpcy5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTtcclxuICAgICAgICBpZiAodGhpcy5oYXNTY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sID0gc2NoZW1hc1t0aGlzLnNjaGVtYVBhdGhdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jb250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udHJvbFsnbm9kZXMnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbFsnbm9kZXMnXSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sWydub2RlcyddW3RoaXMubW9kZWxQYXRoXSA9IHRoaXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gc2NoZW1hc1t0aGlzLnNjaGVtYVBhdGhdO1xyXG4gICAgICAgIGxldCBrZXlzUGx1cyA9IFtdO1xyXG4gICAgICAgIGlmIChzY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICAgICAga2V5c1BsdXMgPSBzY2hlbWEuY29udHJvbHMuZmlsdGVyKHEgPT4gcS5maWVsZCkubWFwKHEgPT4gcS5maWVsZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgIGtleXNQbHVzID0gc2NoZW1hLnJvd1RlbXBsYXRlLmZpbHRlcihxID0+IHEuZmllbGQpLm1hcChxID0+IHEuZmllbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2NoZW1hUGF0aCkge1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoc2NoZW1hcykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBzY2hlbWFzW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0udW5pcXVlRmllbGQgPT0gaXRlbS5maWVsZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzUGx1cy5wdXNoKGtleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5rZXlzUGx1cyA9IGtleXNQbHVzO1xyXG4gICAgICAgIHRoaXMucmVpbml0Q2hpbGROb2RlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWluaXRDaGlsZE5vZGVzKGZpcmVFdmVudEZpbmlzaCA9IHRydWUpIHtcclxuICAgICAgICB0aGlzLmNoaWxkTm9kZXMubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLmNoaWxkTm9kZURpYyA9IHt9O1xyXG4gICAgICAgIHRoaXMuaW5pdENoaWxkTm9kZXModGhpcy5kYXRhLCB0aGlzLmZvcm1Db250cm9scywgdGhpcy5rZXlzUGx1cyk7XHJcbiAgICAgICAgaWYgKGZpcmVFdmVudEZpbmlzaCAmJiB0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sIGluc3RhbmNlb2YgVGFibGVTY2hlbWEgJiYgdGhpcy5jb250cm9sLm9uVGFibGVGaW5pc2hJbml0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgc291cmNlTm9kZTogdGhpcyxcclxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0aGlzLFxyXG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBFdmVudFR5cGUuVEFCTEVfRklOSVNIX0lOSVRcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5vblRhYmxlRmluaXNoSW5pdChldmVudERhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRDaGlsZE5vZGVzKG1vZGVsOiBhbnksIHNjaGVtYXM6IFtdLCBrZXlzUGx1czogc3RyaW5nW10pIHtcclxuICAgICAgICBpZiAoaXNMaXRlcmFsT2JqZWN0KG1vZGVsKSkge1xyXG4gICAgICAgICAgICBjb25zdCBhbGxLZXkgPSBuZXcgU2V0KFsuLi5rZXlzUGx1cywgLi4uT2JqZWN0LmtleXMobW9kZWwpXSk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGFsbEtleSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPSAnX3N0YXR1cycgJiYga2V5ICE9ICdfZXJyb3JzJyAmJiBrZXkgIT0gJ19zb3VyY2UnICYmIGtleSAhPSBLZXlGbGFzaFNob3cpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSBuZXcgQ29udHJvbFRyZWVOb2RlKG1vZGVsW2tleV0sIHNjaGVtYXMsIGtleSwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZE5vZGVzLnB1c2goY2hpbGROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaWxkTm9kZURpY1tjaGlsZE5vZGUuZmllbGRdID0gY2hpbGROb2RlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIFNhdSBraGkgxJHDoyBpbml0IHhvbmcgbm9kZSBjaG8gcm93IHRow6wgZmlyZSBldmVudCBjaG8gY8OhYyBjb250cm9sIHRyb25nIHJvd1xyXG4gICAgICAgICAgICAvLyBUaMaw4budbmcgZMO5bmcgduG7m2kgbeG7pWMgxJHDrWNoIGPhuqduIGRpc2FibGVkLCBoaWRkZW4gY8OhYyBjb250cm9sIGPhu6dhIHJvdyBraGkgY8OzIG5odSBj4bqndVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGlsZE5vZGVzLmZvckVhY2goXyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKF8uY29udHJvbCAmJiBfLmNvbnRyb2wub25Sb3dOb2RlRmluaXNoSW5pdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IF8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogXyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogRXZlbnRUeXBlLlJPV19GSU5JU0hfSU5JVFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXy5jb250cm9sLm9uUm93Tm9kZUZpbmlzaEluaXQoZXZlbnREYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGlzQXJyYXkobW9kZWwpKSB7XHJcbiAgICAgICAgICAgIGxldCBpID0gMDtcclxuICAgICAgICAgICAgaWYgKG1vZGVsLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBtb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IG5ldyBDb250cm9sVHJlZU5vZGUoaXRlbSwgc2NoZW1hcywgaSwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGROb2RlLnBhcmVudE5vZGUgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGROb2Rlcy5wdXNoKGNoaWxkTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZE5vZGVEaWNbY2hpbGROb2RlLmZpZWxkXSA9IGNoaWxkTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENoaWxkTm9kZShmaWVsZCk6IENvbnRyb2xUcmVlTm9kZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGROb2RlRGljW2ZpZWxkXTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRDcnVkRm9ybShjcnVkRm9ybTogQ3J1ZEZvcm1Db21wb25lbnQpIHtcclxuICAgICAgICB0aGlzLl9jcnVkRm9ybSA9IGNydWRGb3JtO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwYXJlbnRNb2RlbCgpIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlKSByZXR1cm4gdGhpcy5wYXJlbnROb2RlLm1vZGVsO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwYXJlbnRNb2RlbFBhdGgoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgcmV0dXJuIHRoaXMucGFyZW50Tm9kZS5tb2RlbFBhdGg7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHBhcmVudENvbnRyb2woKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgcmV0dXJuIHRoaXMucGFyZW50Tm9kZS5jb250cm9sO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBtb2RlbCgpIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlKSByZXR1cm4gdGhpcy5wYXJlbnROb2RlLmRhdGFbdGhpcy5maWVsZF07XHJcbiAgICAgICAgZWxzZSByZXR1cm4gdGhpcy5kYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBtb2RlbCh2YWwpIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlKSB0aGlzLnBhcmVudE5vZGUuZGF0YVt0aGlzLmZpZWxkXSA9IHZhbDtcclxuICAgICAgICBlbHNlIHRoaXMuZGF0YSA9IHZhbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgdmFsdWUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgcmV0dXJuIHRoaXMucGFyZW50Tm9kZS5kYXRhW3RoaXMuZmllbGRdO1xyXG4gICAgICAgIGVsc2UgcmV0dXJuIHRoaXMuZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgdmFsdWUodmFsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgdGhpcy5wYXJlbnROb2RlLmRhdGFbdGhpcy5maWVsZF0gPSB2YWw7XHJcbiAgICAgICAgZWxzZSB0aGlzLmRhdGEgPSB2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29tcG9uZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBjb21wb25lbnQodmFsKSB7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50ID0gdmFsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRIaWRkZW4oZmllbGQ6IHN0cmluZyB8IHN0cmluZ1tdLCBoaWRkZW46IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQpKSB7XHJcbiAgICAgICAgICAgIGZpZWxkLmZvckVhY2goZiA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEhpZGRlbkZpZWxkKGYsIGhpZGRlbik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRIaWRkZW5GaWVsZChmaWVsZCwgaGlkZGVuKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRIaWRkZW5GaWVsZChmaWVsZDogc3RyaW5nLCBoaWRkZW46IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLnNldFByaXZhdGVTdGF0dXMoZmllbGQsICdoaWRkZW4nLCBoaWRkZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXREaXNhYmxlZChmaWVsZDogc3RyaW5nIHwgc3RyaW5nW10sIGRpc2FibGVkOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkKSkge1xyXG4gICAgICAgICAgICBmaWVsZC5mb3JFYWNoKGYgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXREaXNhYmxlZEZpZWxkKGYsIGRpc2FibGVkKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldERpc2FibGVkRmllbGQoZmllbGQsIGRpc2FibGVkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXREaXNhYmxlZEZpZWxkKGZpZWxkOiBzdHJpbmcsIGRpc2FibGVkOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5zZXRQcml2YXRlU3RhdHVzKGZpZWxkLCAnZGlzYWJsZWQnLCBkaXNhYmxlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRQcml2YXRlU3RhdHVzKGZpZWxkOiBzdHJpbmcsIHByb3A6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoZmllbGQuaW5kZXhPZignLicpID4gLTEpIHtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gdGhpcy5nZXROb2RlQnlQYXRoKGAke3RoaXMubW9kZWxQYXRofS4ke2ZpZWxkfWApO1xyXG4gICAgICAgICAgICBjb25zdCBsYXN0RmllbGQgPSBmaWVsZC5zcGxpdCgnLicpLnBvcCgpO1xyXG4gICAgICAgICAgICBjaGlsZE5vZGUucGFyZW50Tm9kZS5kYXRhLl9zdGF0dXNbbGFzdEZpZWxkXVtwcm9wXSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhLl9zdGF0dXNbZmllbGRdW3Byb3BdID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXROb2RlQnlQYXRoKG1vZGVsUGF0aCk6IENvbnRyb2xUcmVlTm9kZSB7XHJcbiAgICAgICAgaWYgKG1vZGVsUGF0aCA9PSBudWxsIHx8IG1vZGVsUGF0aCA9PT0gJycpIHJldHVybiB0aGlzLnJvb3ROb2RlO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRJblRyZWUodGhpcy5yb290Tm9kZSwgbW9kZWxQYXRoLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXROb2RlQnlTY2hlbWFQYXRoKHNjaGVtYVBhdGgpOiBDb250cm9sVHJlZU5vZGUge1xyXG4gICAgICAgIGlmIChzY2hlbWFQYXRoID09IG51bGwgfHwgc2NoZW1hUGF0aCA9PT0gJycpIHJldHVybiB0aGlzLnJvb3ROb2RlO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRTY2hlbWFJblRyZWUodGhpcy5yb290Tm9kZSwgc2NoZW1hUGF0aC50b0xvd2VyQ2FzZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZpbmRJblRyZWUobm9kZTogQ29udHJvbFRyZWVOb2RlLCBtb2RlbFBhdGgpOiBDb250cm9sVHJlZU5vZGUge1xyXG4gICAgICAgIGlmIChub2RlLm1vZGVsUGF0aCAhPSBudWxsICYmIG5vZGUubW9kZWxQYXRoLnRvTG93ZXJDYXNlKCkgPT0gbW9kZWxQYXRoLnRvTG93ZXJDYXNlKCkpIHJldHVybiBub2RlO1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkTm9kZSBvZiBub2RlLmNoaWxkTm9kZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGUubW9kZWxQYXRoICE9IG51bGwgJiYgbW9kZWxQYXRoLnN0YXJ0c1dpdGgoY2hpbGROb2RlLm1vZGVsUGF0aC50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlID0gdGhpcy5maW5kSW5UcmVlKGNoaWxkTm9kZSwgbW9kZWxQYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmUpIHJldHVybiByZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZpbmRTY2hlbWFJblRyZWUobm9kZTogQ29udHJvbFRyZWVOb2RlLCBzY2hlbWFQYXRoKTogQ29udHJvbFRyZWVOb2RlIHtcclxuICAgICAgICBpZiAobm9kZS5zY2hlbWFQYXRoICE9IG51bGwgJiYgbm9kZS5zY2hlbWFQYXRoLnRvTG93ZXJDYXNlKCkgPT0gc2NoZW1hUGF0aC50b0xvd2VyQ2FzZSgpKSByZXR1cm4gbm9kZTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjaGlsZE5vZGUgb2Ygbm9kZS5jaGlsZE5vZGVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlLnNjaGVtYVBhdGggIT0gbnVsbCAmJiBzY2hlbWFQYXRoLnN0YXJ0c1dpdGgoY2hpbGROb2RlLnNjaGVtYVBhdGgudG9Mb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZSA9IHRoaXMuZmluZFNjaGVtYUluVHJlZShjaGlsZE5vZGUsIHNjaGVtYVBhdGgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZSkgcmV0dXJuIHJlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXREYXRhU291cmNlVGFibGVTY2hlbWEocGF0aDogc3RyaW5nLCBkYXRhU291cmNlOiBhbnlbXSkge1xyXG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuZ2V0Tm9kZUJ5UGF0aChwYXRoKTtcclxuICAgICAgICBpZiAoIXRhYmxlTm9kZS5tb2RlbCkge1xyXG4gICAgICAgICAgICB0YWJsZU5vZGUubW9kZWwgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGFibGVOb2RlLm1vZGVsLnNwbGljZSgwLCB0YWJsZU5vZGUubW9kZWwubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgaWYgKGRhdGFTb3VyY2UubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgdGFibGVOb2RlLnJlaW5pdENoaWxkTm9kZXMoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFTb3VyY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5yb290Tm9kZS5fY3J1ZEZvcm0uYWRkTmV3Um93KDxUYWJsZVNjaGVtYT50YWJsZU5vZGUuY29udHJvbCwgcGF0aCwgbnVsbCwgdHJ1ZSwgZGF0YVNvdXJjZVtpXSwgaSA9PSBkYXRhU291cmNlLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=
2397
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9wcm9qZWN0cy90bngtc2hhcmVkL3NyYy9saWIvIiwic291cmNlcyI6WyJjb21wb25lbnRzL2NydWQvY3J1ZC1mb3JtL2NydWQtZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFSCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUM3QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRS9CLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU1RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDckUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRSxPQUFPLEVBQ0gsb0JBQW9CLEVBQ3BCLHlCQUF5QixFQUN6QiwrQkFBK0IsRUFDL0IsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQix5QkFBeUIsRUFDekIsa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4Qiw4QkFBOEIsRUFDOUIsaUNBQWlDLEVBQ2pDLGtCQUFrQixFQUNsQix3QkFBd0IsRUFDeEIsZ0JBQWdCLEVBQ2hCLDJCQUEyQixF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SSxDQUFDLEVBQUU7WUFDeEIsU0FBUyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDN0IsT0FBTztTQUNWO1FBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFjLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ2xJO0lBQ0wsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIEFmdGVyVmlld0luaXQsXHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBDb250ZW50Q2hpbGRyZW4sXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgSW5qZWN0b3IsXHJcbiAgICBJbnB1dCxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdCxcclxuICAgIE91dHB1dCxcclxuICAgIFF1ZXJ5TGlzdCxcclxuICAgIFRlbXBsYXRlUmVmLFxyXG4gICAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgalF1ZXJ5XyBmcm9tICdqcXVlcnknO1xyXG5pbXBvcnQgeyBEZXZpY2VEZXRlY3RvclNlcnZpY2UgfSBmcm9tICduZ3gtZGV2aWNlLWRldGVjdG9yJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBNZW51SXRlbSB9IGZyb20gJ3RuLWN1c3RvbS1wcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IENvbnRleHRNZW51IH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvY29udGV4dG1lbnUnO1xyXG5cclxuaW1wb3J0IHsgQ29tcG9uZW50Q29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9hcHAtY29udGV4dC9jb21wb25lbnQtY29udGV4dC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvYmFzZS9jb21wb25lbnQtYmFzZSc7XHJcbmltcG9ydCB7IEZvcm1TdGF0ZSwgS2V5Rmxhc2hTaG93IH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9jb25zdGFudHMnO1xyXG5pbXBvcnQge1xyXG4gICAgQWRkcmVzc0NvbnRyb2xTY2hlbWEsXHJcbiAgICBBdXRvQ29tcGxldGVDb250cm9sU2NoZW1hLFxyXG4gICAgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSxcclxuICAgIEJ1dHRvbkNvbnRyb2xTY2hlbWEsXHJcbiAgICBDaGVja2JveENvbnRyb2xTY2hlbWEsXHJcbiAgICBDaGVja0JveExpc3RDb250cm9sU2NoZW1hLFxyXG4gICAgQ2hpcHNDb250cm9sU2NoZW1hLFxyXG4gICAgQ29DYXVUb0NodWNDb250cm9sU2NoZW1hLFxyXG4gICAgQ29DYXVUb0NodWNQaWNrZXJDb250cm9sU2NoZW1hLFxyXG4gICAgQ29DYXVUb0NodWNQaWNrZXJDb250cm9sU2NoZW1hTmV3LFxyXG4gICAgQ29sb3JDb250cm9sU2NoZW1hLFxyXG4gICAgQ29sb3JQaWNrZXJDb250cm9sU2NoZW1hLFxyXG4gICAgQ29sdW1uU2NoZW1hQmFzZSxcclxuICAgIENvbmdWaWVjUGlja2VyQ29udHJvbFNjaGVtYSxcclxuICAgIENvbnRhaW5lclNjaGVtYSxcclxuICAgIENydWRGb3JtU2V0dGluZyxcclxuICAgIENydWRMaXN0U2V0dGluZyxcclxuICAgIEN1c3RvbUNvbnRyb2xTY2hlbWEsXHJcbiAgICBEYXRlVGltZUNvbnRyb2xTY2hlbWEsXHJcbiAgICBEYXRlVGltZVJhbmdlQ29udHJvbFNjaGVtYSxcclxuICAgIERyb3Bkb3duQ29udHJvbFNjaGVtYSxcclxuICAgIEVkaXRvckNvbnRyb2xTY2hlbWEsXHJcbiAgICBFbnRpdHlQaWNrZXJDb250cm9sU2NoZW1hLFxyXG4gICAgRXZlbnREYXRhLFxyXG4gICAgRXZlbnRUeXBlLFxyXG4gICAgRmlsZU1hbmFnZXJDb250cm9sU2NoZW1hLFxyXG4gICAgRmlsZVVwbG9hZENvbnRyb2xTY2hlbWEsXHJcbiAgICBGaWxlVXBsb2FkTW9kZSxcclxuICAgIEZvcm1Db250cm9sQmFzZSxcclxuICAgIEZvcm1Db250cm9sQmFzZVdpdGhTZXJ2aWNlLFxyXG4gICAgRm9ybVNjaGVtYUJhc2UsXHJcbiAgICBLZXlGdW5jdGlvblJlbG9hZCxcclxuICAgIEtleVZhbHVlQ29udHJvbFNjaGVtYSxcclxuICAgIExhYmVsU2NoZW1hLFxyXG4gICAgTWFza0NvbnRyb2xTY2hlbWEsXHJcbiAgICBOdW1iZXJSYW5nZUNvbnRyb2xTY2hlbWEsXHJcbiAgICBPcGVyYXRvcixcclxuICAgIE9yZ2FuaXphdGlvblBpY2tlckNvbnRyb2xTY2hlbWEsXHJcbiAgICBQZXJjZW50Q29udHJvbFNjaGVtYSxcclxuICAgIFBvcHVwU2l6ZSxcclxuICAgIFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWEsXHJcbiAgICBSZWZlcmVuY2VUZXh0Q29udHJvbFNjaGVtYSxcclxuICAgIFNwYW5Db250cm9sU2NoZW1hLFxyXG4gICAgU3dpdGNoQ29udHJvbFNjaGVtYSxcclxuICAgIFRhYmxlU2NoZW1hLFxyXG4gICAgVGVtcGxhdGVDb250cm9sU2NoZW1hLFxyXG4gICAgVGV4dEFsaWduLFxyXG4gICAgVGV4dEFyZWFDb250cm9sU2NoZW1hLFxyXG4gICAgVGV4dENvbnRyb2xTY2hlbWEsXHJcbiAgICBUaXRsZVNjaGVtYSxcclxuICAgIFVzZXJQaWNrZXJDb250cm9sU2NoZW1hLFxyXG4gICAgVmFuQmFuUGlja2VyQ29udHJvbFNjaGVtYSxcclxuICAgIFdyYXBQaWNrZXJDb250cm9sU2NoZW1hLFxyXG59IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvZm9ybS1zY2hlbWEnO1xyXG5pbXBvcnQgeyBGaWVsZERlZmluZUlzVGFza0Zvcm1Db250cm9sLCBSZWdleFNwbGl0RmllbGRCeUl0ZW0gfSBmcm9tICcuLi8uLi8uLi9jb25zdC9jb21tb24nO1xyXG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29tbW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDcnVkU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NydWQuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGl0eVBpY2tlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lbnRpdHktcGlja2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNYXN0ZXJEYXRhU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL21hc3Rlci1kYXRhLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNb2R1bGVDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbW9kdWxlLWNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTm90aWZpZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbm90aWZpZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IERyb3Bkb3duU2VydmljZSB9IGZyb20gJy4uLy4uL2Ryb3Bkb3duL3NlcnZpY2VzL2Ryb3Bkb3duLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBiYXNlVHJpbmhLeSwgZ2V0UmVnZXhSZXN1bHQsIGdldFN0cmluZ0Rpc3BsYXlWYWx1ZSwgbG9vcEN1cnNvckZ1bmN0aW9uIH0gZnJvbSAnLi4vdXRpbHMnO1xyXG5pbXBvcnQgeyBHbWFpbENvcnJlY3RvciwgTG93ZXJDb3JyZWN0b3IgfSBmcm9tICcuLy4uLy4uLy4uL2NsYXNzZXMvYmFzZS9jb3JyZWN0b3JzJztcclxuaW1wb3J0IHtcclxuICAgIENoZWNrRHVwbGljYXRlRmllbGRzVmFsaWRhdG9yLFxyXG4gICAgQ2hlY2tEdXBsaWNhdGVWYWxpZGF0b3IsXHJcbiAgICBDb21wYXJlVmFsaWRhdG9yLFxyXG4gICAgRGF0ZUNvbXBhcmVWYWxpZGF0b3IsXHJcbiAgICBFbWFpbFZhbGlkYXRvcixcclxuICAgIE51bWJlckNvbXBhcmVWYWxpZGF0b3IsXHJcbiAgICBOdW1iZXJPbmx5VmFsaWRhdG9yLFxyXG4gICAgUGhvbmVOdW1iZXJWYWxpZGF0b3IsXHJcbiAgICBSZXF1aXJlZEZpZWxkc1ZhbGlkYXRvcixcclxuICAgIFJlcXVpcmVkVmFsaWRhdG9yLFxyXG4gICAgU2FtZVZhbHVlVmFsaWRhdG9yLFxyXG59IGZyb20gJy4vLi4vLi4vLi4vY2xhc3Nlcy9iYXNlL3ZhbGlkYXRvcnMnO1xyXG5pbXBvcnQgeyBpc0FycmF5LCBpc0xpdGVyYWxPYmplY3QsIG1lcmdlSlNPTiB9IGZyb20gJy4vLi4vLi4vLi4vY2xhc3Nlcy9lbnZpcm9ubWVudC1zY2hlbWEnO1xyXG5pbXBvcnQgeyBDb21DdHhDb25zdGFudHMgfSBmcm9tICcuLy4uLy4uLy4uL2NvbmZpZ3MvY29tcG9uZW50LWNvbnRleHQuY29uc3RhbnQnO1xyXG5pbXBvcnQgeyBGaWx0ZXIgfSBmcm9tICcuLy4uLy4uLy4uL21vZGVscy9ncmlkLWluZm8nO1xyXG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4vLi4vLi4vLi4vc2VydmljZXMvdXNlci5zZXJ2aWNlJztcclxuXHJcblxyXG4vLyBmaXggZm9yIGJ1aWxkIHByb2RcclxuY29uc3QgalF1ZXJ5ID0galF1ZXJ5XztcclxuXHJcbmRlY2xhcmUgdmFyIHRpbnltY2U6IGFueTtcclxuXHJcbmNvbnN0IG9wZXJhdG9yQ29udHJhc3QgPSB7XHJcbiAgICBbT3BlcmF0b3IuZ3JlYXRlcl06IE9wZXJhdG9yLmxvd2VyLFxyXG4gICAgW09wZXJhdG9yLmdyZWF0ZXJUaGFuRXF1YWxdOiBPcGVyYXRvci5sb3dlclRoYW5FcXVhbCxcclxuICAgIFtPcGVyYXRvci5sb3dlcl06IE9wZXJhdG9yLmdyZWF0ZXIsXHJcbiAgICBbT3BlcmF0b3IubG93ZXJUaGFuRXF1YWxdOiBPcGVyYXRvci5ncmVhdGVyVGhhbkVxdWFsXHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnY3J1ZC1mb3JtJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jcnVkLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vY3J1ZC1mb3JtLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBwcm92aWRlcnM6IFtDb21wb25lbnRDb250ZXh0U2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIENydWRGb3JtQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50QmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcclxuICAgIEBWaWV3Q2hpbGQoJ2Zvcm1FbGVtZW50JykgZm9ybUVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcbiAgICBAVmlld0NoaWxkKCdjb250ZXh0TWVudScsIHsgc3RhdGljOiBmYWxzZSB9KSBjb250ZXh0TWVudTogQ29udGV4dE1lbnU7XHJcbiAgICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlUmVmKSBjaGlsZHJlbjogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPGFueT4+O1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3RlbXBsYXRlQ29uZ1ZpZWNGb3JtJywgeyBzdGF0aWM6IGZhbHNlIH0pIHNldCB0ZW1wbGF0ZUNvbmdWaWVjRm9ybSh2YWx1ZTogVGVtcGxhdGVSZWY8YW55Pikge1xyXG4gICAgICAgIHRoaXMudGVtcGxhdGVzW0ZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2xdID0gdmFsdWU7XHJcbiAgICB9O1xyXG5cclxuICAgIEBJbnB1dCgpIHNldHRpbmc6IENydWRGb3JtU2V0dGluZyA9IG5ldyBDcnVkRm9ybVNldHRpbmcoKTtcclxuICAgIEBJbnB1dCgpIGNvbnRleHQ6IENvbXBvbmVudENvbnRleHRTZXJ2aWNlO1xyXG5cclxuICAgIEBJbnB1dCgpIGZpbGVzVXBsb2FkZWQgPSBbXTtcclxuICAgIEBJbnB1dCgpIGlzVmlld01vZGUgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGRpc2FibGVLZXlwcmVzc0NvbnRyb2wgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGRpc2FibGVDYWNoaW5nID0gZmFsc2U7XHJcbiAgICBfc3R5bGVDbGFzcyA9ICdwLWZsdWlkIGNydWQtZm9ybS1jb250YWluZXInO1xyXG4gICAgQElucHV0KCkgc2V0IHN0eWxlQ2xhc3ModmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3N0eWxlQ2xhc3MgPSAncC1mbHVpZCBjcnVkLWZvcm0tY29udGFpbmVyJztcclxuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSAnJykge1xyXG4gICAgICAgICAgICB0aGlzLl9zdHlsZUNsYXNzICs9IGAgJHt2YWx1ZX1gO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKSBmb3JtSWQgPSAnJztcclxuICAgIEBJbnB1dCgpIGZvcm1DbGFzcyA9ICcnO1xyXG4gICAgQElucHV0KCkgYXV0b0ZvY3VzID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIHRyYXBGb2N1cyA9IHRydWU7XHJcblxyXG4gICAgQElucHV0KCkgc2V0IGRhdGEodmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuY2FuUHJpbnQgPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy5fbWluaW1pemVkRGF0YSAhPSB2YWx1ZSAmJiBpc0xpdGVyYWxPYmplY3QodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YSA9IG1lcmdlSlNPTih0aGlzLl9tb2RlbERhdGEsIHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5jbGVhbigpO1xyXG4gICAgICAgICAgICB0aGlzLnJlSW5pdENvbnRyb2xNb2RlbEFuZFJvb3ROb2RlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX21pbmltaXplZERhdGEgPSB0aGlzLmdldE1pbmltaXplRGF0YSh0aGlzLl9tb2RlbERhdGEpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmxvYWRlZERhdGFFZGl0T2xkICYmIHRoaXMubG9hZGVkRGF0YUVkaXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FuUHJpbnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0NhblByaW50KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLl9tb2RlbERhdGEgPSB7fTtcclxuICAgICAgICAgICAgdGhpcy5yZUluaXRDb250cm9sTW9kZWxBbmRSb290Tm9kZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgQElucHV0KCkgZm9ybVN0YXRlOiBGb3JtU3RhdGUgPSBGb3JtU3RhdGUuRURJVDtcclxuXHJcbiAgICBAT3V0cHV0KCkgb25Gb3JtUmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkNvbnRyb2xSZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQWxsQ29udHJvbFJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25Nb2RlbENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBkYXRhQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxFdmVudERhdGE+ID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudERhdGE+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25BZnRlclRyaW5oS3kgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICBfcm9vdE5vZGU6IENvbnRyb2xUcmVlTm9kZTtcclxuICAgIF9taW5pbWl6ZWREYXRhOiBhbnk7XHJcbiAgICBfbW9kZWxEYXRhOiBhbnkgPSB7fTtcclxuICAgIF91bnN1YnNjcmliZUFsbCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuICAgIF9pblZhbGlkRm9ybSA9IGZhbHNlO1xyXG4gICAgZXZlbnRUeXBlID0gRXZlbnRUeXBlO1xyXG5cclxuICAgIC8vIERvYyB0dSBjYXUgaGluaCB0aGFtIHNvIGhlIHRob25nXHJcbiAgICBsaW1pdFNpemUgPSAwO1xyXG4gICAgZm9ybUNvbnRyb2xzOiBhbnkgPSBbXTtcclxuICAgIGZ1bmNDaGVja1VuaXF1ZUZpZWxkOiBhbnkgPSB7fTtcclxuICAgIGJlZm9yZURhdGE6IGFueSA9IHt9O1xyXG4gICAgZmlyc3REaXZIb2xkZXI6IGFueTtcclxuICAgIGNhY2hlZFZhbHVlcyA9IHt9O1xyXG4gICAgdGVtcGxhdGVzOiB7IFtrZXk6IHN0cmluZ106IFRlbXBsYXRlUmVmPGFueT47IH0gPSB7fTtcclxuICAgIF9wcmVmaXhDdXN0b21IZWFkZXIgPSAnY3VzdG9tSGVhZGVyXyc7XHJcbiAgICBjb25nVmllY1NldHRpbmc6IENydWRMaXN0U2V0dGluZztcclxuXHJcbiAgICBsb2FkZWREYXRhRWRpdE9sZCA9IGZhbHNlO1xyXG4gICAgbG9hZGVkRGF0YUVkaXQgPSBmYWxzZTtcclxuICAgIGNhblByaW50ID0gZmFsc2U7XHJcblxyXG4gICAgdGFibGVGb3JtU2hvdyA9IGZhbHNlO1xyXG4gICAgdGFibGVGb3JtVGl0bGU6IHN0cmluZztcclxuICAgIHRhYmxlRm9ybVBvcHVwU2l6ZSA9IG5ldyBQb3B1cFNpemUoeyB3aWR0aDogMTEwMCwgaGVpZ2h0OiA2NTAgfSk7XHJcbiAgICB0YWJsZUZvcm1EYXRhOiBhbnkgPSB7fTtcclxuICAgIHRhYmxlRm9ybUN1cnJlbnRSb3c6IG51bWJlcjtcclxuICAgIHRhYmxlRm9ybVNjaGVtYTogRm9ybVNjaGVtYUJhc2VbXSA9IFtdO1xyXG4gICAgdGFibGVGb3JtQ3VycmVudEluZm86IGFueSA9IHt9O1xyXG5cclxuICAgIGJ1dHRvbkNvbnRleHRzOiBNZW51SXRlbVtdID0gW107XHJcbiAgICByb3dEYXRhQ3VycmVudDogYW55ID0ge307XHJcbiAgICBjb250cm9sTmVlZENoZWNrUmVhZHk6IEZvcm1TY2hlbWFCYXNlW10gPSBbXTtcclxuICAgIHJlYWR5U3RhdHVzOiBhbnkgPSB7fTtcclxuICAgIGZpZWxkUGFyZW50RmllbGQgPSAncGFyZW50RmllbGQnO1xyXG4gICAgd2FpdFJlYWR5QW5kUHJpbnRUaW1lb3V0OiBhbnk7XHJcbiAgICBwdWJsaWMgX25vdGlmaWVyU2VydmljZTogTm90aWZpZXJTZXJ2aWNlO1xyXG4gICAgcHVibGljIF9tYXN0ZXJEYXRhU2VydmljZTogTWFzdGVyRGF0YVNlcnZpY2U7XHJcbiAgICBwdWJsaWMgX3VzZXJTZXJ2aWNlOiBVc2VyU2VydmljZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwdWJsaWMgX2luamVjdG9yOiBJbmplY3RvcixcclxuICAgICAgICBwdWJsaWMgX2NvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIF9jcnVkU2VydmljZTogQ3J1ZFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgX2RldmljZURldGVjdG9yU2VydmljZTogRGV2aWNlRGV0ZWN0b3JTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2Ryb3Bkb3duU2VydmljZTogRHJvcGRvd25TZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBfc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXHJcbiAgICAgICAgcHVibGljIF9lbnRpdHlQaWNrZXJTZXJ2aWNlOiBFbnRpdHlQaWNrZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX21vZHVsZUNvbmZpZzogTW9kdWxlQ29uZmlnU2VydmljZSxcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKF9pbmplY3Rvcik7XHJcbiAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KE5vdGlmaWVyU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5fbWFzdGVyRGF0YVNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoTWFzdGVyRGF0YVNlcnZpY2UpO1xyXG4gICAgICAgIHRoaXMuX3VzZXJTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KFVzZXJTZXJ2aWNlKTtcclxuXHJcbiAgICAgICAgLy8gR2V0IENvbmZpZ3VyYXRpb25TeXN0ZW1cclxuICAgICAgICB0aGlzLl9tYXN0ZXJEYXRhU2VydmljZS5nZXRDb25maWdCeUNvZGUoJ1NpemVPZkZpbGUnKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpbWl0U2l6ZSA9IE51bWJlcihyZXNwb25zZSkgKiAxMDAwICogMTAwMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5nLmhpZGRlblRyaW5oS3kpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnNjaGVtYS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgbmV3IEZpbGVVcGxvYWRDb250cm9sU2NoZW1hKHtcclxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ3ByaW50RmlsZUlkJyxcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0ZpbGUnLFxyXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6IEZpbGVVcGxvYWRNb2RlLnVzaW5nRmlsZUluc3RhbmNlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgaGlkZGVuQ2hlY2s6IChtb2RlbCwgY3VycmVudE5vZGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFtb2RlbC5wcmludEZpbGVJZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pbml0TG9hZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaFZpZXdNb2RlKHJlYWRvbmx5VmlldyA9IHRydWUpIHtcclxuICAgICAgICB0aGlzLmlzVmlld01vZGUgPSByZWFkb25seVZpZXc7XHJcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ29udHJvbFNjaGVtYShjb250cm9sLCB0aGlzLmlzVmlld01vZGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZWxvYWQoKSB7XHJcbiAgICAgICAgdGhpcy5pbml0TG9hZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFuKCkge1xyXG4gICAgICAgIHRoaXMuY2xlYW5Nb2RlbCh0aGlzLl9tb2RlbERhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2xlYW5Nb2RlbChtb2RlbCkge1xyXG4gICAgICAgIGlmIChpc0xpdGVyYWxPYmplY3QobW9kZWwpKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09ICdfc3RhdHVzJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcyBpbiBtb2RlbFtrZXldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsW2tleV1bc10gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PSAnX2Vycm9ycycpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHMgaW4gbW9kZWxba2V5XSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFtrZXldW3NdID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhbk1vZGVsKG1vZGVsW2tleV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGlzQXJyYXkobW9kZWwpKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBtb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhbk1vZGVsKGl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlSW5pdENvbnRyb2xNb2RlbEFuZFJvb3ROb2RlKCkge1xyXG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xNb2RlbCh0aGlzLl9tb2RlbERhdGEsIGNvbnRyb2wpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByb290Tm9kZU9sZCA9IHRoaXMuX3Jvb3ROb2RlO1xyXG4gICAgICAgIHRoaXMuX3Jvb3ROb2RlID0gbmV3IENvbnRyb2xUcmVlTm9kZSh0aGlzLl9tb2RlbERhdGEsIHRoaXMuZm9ybUNvbnRyb2xzKTtcclxuICAgICAgICB0aGlzLl9yb290Tm9kZS5zZXRDcnVkRm9ybSh0aGlzKTtcclxuICAgICAgICBpZiAocm9vdE5vZGVPbGQpIHtcclxuICAgICAgICAgICAgcm9vdE5vZGVPbGQuY2hpbGROb2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmNoaWxkTm9kZXMuZmluZChxID0+IHEubW9kZWxQYXRoID09IG5vZGUubW9kZWxQYXRoKTtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZS5jb21wb25lbnQgPSBub2RlLmNvbXBvbmVudDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcy5fcm9vdE5vZGUsXHJcbiAgICAgICAgICAgIGV2ZW50VHlwZTogdGhpcy5ldmVudFR5cGUuTU9ERUxfQ0hBTkdFRCxcclxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2VkLmVtaXQoZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0TWluaW1pemVEYXRhKG1vZGVsKSB7XHJcbiAgICAgICAgaWYgKGlzTGl0ZXJhbE9iamVjdChtb2RlbCkpIHtcclxuICAgICAgICAgICAgaWYgKG1vZGVsLl9kcm9wZG93bnZhbHVlICE9IG51bGwgJiYgbW9kZWwuX2Ryb3Bkb3dudmFsdWUgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kZWxbbW9kZWwuX2Ryb3Bkb3dudmFsdWVdIHx8IG1vZGVsWyd2YWx1ZSddO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0ge307XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICE9ICdfc3RhdHVzJyAmJiBrZXkgIT0gJ19lcnJvcnMnICYmIGtleSAhPSAnX3NvdXJjZScpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0TWluaW1pemVEYXRhKG1vZGVsW2tleV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmICh2YWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChpc0FycmF5KG1vZGVsKSkge1xyXG4gICAgICAgICAgICBjb25zdCBhcnIgPSBbXTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICBhcnIucHVzaCh0aGlzLmdldE1pbmltaXplRGF0YShpdGVtKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGFycjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobW9kZWwgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbW9kZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdExvYWQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmcuc2NoZW1hKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5zY2hlbWEubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgLy8gdGjhu7FjIGhp4buHbiBzYXUgY8O5bmcga2hpIG1vZGVsIMSRw6MgaW5pdCB4b25nIHbDoCBjw6FjIHPhu7Ega2nhu4duIGFkZCByb3cgdGjhu7FjIGhp4buHbiB4b25nXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybUV2ZW50ID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRoaXMuX3Jvb3ROb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogdGhpcy5ldmVudFR5cGUuRk9STV9SRUFEWSxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uRm9ybVJlYWR5LmVtaXQoZm9ybUV2ZW50KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdFNjaGVtYSgpO1xyXG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlQ2FjaGluZyAmJiAhdGhpcy5fbW9kZWxEYXRhLmlkKSB0aGlzLmFwcGx5Q2FjaGVkVmFsdWVzKCk7XHJcbiAgICAgICAgdGhpcy5zZXREYXRhRGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAvLyB0aOG7sWMgaGnhu4duIHNhdSBjw7luZyBraGkgbW9kZWwgxJHDoyBpbml0IHhvbmcgdsOgIGPDoWMgc+G7sSBraeG7h24gYWRkIHJvdyB0aOG7sWMgaGnhu4duIHhvbmdcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZm9ybUV2ZW50ID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcy5fcm9vdE5vZGUsXHJcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRoaXMuZXZlbnRUeXBlLkZPUk1fUkVBRFksXHJcbiAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5vbkZvcm1SZWFkeS5lbWl0KGZvcm1FdmVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0U2NoZW1hKCkge1xyXG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xTY2hlbWEoY29udHJvbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRDb250cm9sTW9kZWwodGhpcy5fbW9kZWxEYXRhLCBjb250cm9sKTtcclxuICAgICAgICAgICAgdGhpcy5pbml0VmFsaWRhdG9yQW5kQ29ycmVjdG9yKGNvbnRyb2wpO1xyXG4gICAgICAgICAgICB0aGlzLmluaXRCaW5kaW5nQ29udHJvbFNjaGVtYShjb250cm9sKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3Jvb3ROb2RlID0gbmV3IENvbnRyb2xUcmVlTm9kZSh0aGlzLl9tb2RlbERhdGEsIHRoaXMuZm9ybUNvbnRyb2xzKTtcclxuICAgICAgICB0aGlzLl9yb290Tm9kZS5zZXRDcnVkRm9ybSh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRDb250cm9sTW9kZWwocGFyZW50TW9kZWwsIGNvbnRyb2wsIHBhcmVudFBhdGg/KSB7XHJcbiAgICAgICAgdGhpcy5pbml0UHJpdmF0ZURhdGEocGFyZW50TW9kZWwsIGNvbnRyb2wuZmllbGQpO1xyXG5cclxuICAgICAgICBsZXQgX3BhcmVudFBhdGggPSBjb250cm9sLmZpZWxkO1xyXG4gICAgICAgIGlmIChwYXJlbnRQYXRoICE9IG51bGwpIF9wYXJlbnRQYXRoID0gcGFyZW50UGF0aCArICcuJyArIF9wYXJlbnRQYXRoO1xyXG5cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmICghcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gfHwgIShwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSBpbnN0YW5jZW9mIEFycmF5KSkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBhZGRNb3JlID0gY29udHJvbC5pbml0Um93Q291bnQgLSBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXS5sZW5ndGg7XHJcbiAgICAgICAgICAgIGlmIChhZGRNb3JlID4gMCAmJiAhcGFyZW50TW9kZWwuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5yZWFkeSkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50TW9kZWwuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5yZWFkeSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAvLyB0aOG7sWMgaGnhu4duIHNhdSBjw7luZyBraGkgdOG6pXQgY+G6oyBtb2RlbCDEkcOjIGluaXQgeG9uZ1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX21vZGVsRGF0YS5pZCkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTXVsdGlSb3coY29udHJvbCwgYWRkTW9yZSwgX3BhcmVudFBhdGgsICdpbml0Jyk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgaSA9IDA7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sTW9kZWwoaXRlbSwgc3ViQ29udHJvbCwgX3BhcmVudFBhdGggKyAnWycgKyBpICsgJ10nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9PSBudWxsIHx8ICFpc0xpdGVyYWxPYmplY3QocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0pKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5jb250cm9scykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdLCBzdWJDb250cm9sLCBfcGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIC8vIGlmICghcGFyZW50TW9kZWwuaGFzT3duUHJvcGVydHkoY29udHJvbC5maWVsZCkgJiYgY29udHJvbC5maWVsZCAhPSBudWxsKSB7XHJcbiAgICAgICAgLy8gICAgIC8vICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IGNvbnRyb2wuZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgIC8vICAgICAvLyB9XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXRDb250cm9sRGVmYXVsdFZhbHVlRnJvbUV4dGVybmFsKCkge1xyXG4gICAgICAgIC8vIGNvbnN0IHNjaGVtYUR5bmFtaWNzID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbERlZmF1bHRWYWx1ZSh0aGlzLl9tb2RlbERhdGEsIGNvbnRyb2wpO1xyXG4gICAgICAgICAgICAvLyBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEN1c3RvbUNvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgLy8gICAgICYmIHRoaXMuY2hlY2tJc0R5bmFtaWNDb250cm9sKGNvbnRyb2wpXHJcbiAgICAgICAgICAgIC8vICkge1xyXG4gICAgICAgICAgICAvLyAgICAgc2NoZW1hRHluYW1pY3MucHVzaChjb250cm9sKTtcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBU4bqhbSB0aOG7nWkgayByZW5kZXIgbHXDtG4gdMOqbiBjw7RuZyB2aeG7h2MgdHJvbmcgZm9ybSBpbml0LCB2w6wgxJFhbmcgayBraeG7g20gc2/DoXQgZGMga2hpIG7DoG8gdOG6pXQgY+G6oyBjb250cm9sIHJlYWR5XHJcbiAgICAgICAgLy8gc2NoZW1hRHluYW1pY3MuZm9yRWFjaChzY2hlbWEgPT4ge1xyXG4gICAgICAgIC8vICAgICB0aGlzLnJlbmRlclRlbkNvbmdWaWVjKHRoaXMuX21vZGVsRGF0YSwgc2NoZW1hKTtcclxuICAgICAgICAvLyB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRDb250cm9sRGVmYXVsdFZhbHVlKHBhcmVudE1vZGVsLCBjb250cm9sLCBwYXJlbnRQYXRoPykge1xyXG4gICAgICAgIHRoaXMuaW5pdFByaXZhdGVEYXRhKHBhcmVudE1vZGVsLCBjb250cm9sLmZpZWxkKTtcclxuXHJcbiAgICAgICAgbGV0IF9wYXJlbnRQYXRoID0gY29udHJvbC5maWVsZDtcclxuICAgICAgICBpZiAocGFyZW50UGF0aCAhPSBudWxsKSBfcGFyZW50UGF0aCA9IHBhcmVudFBhdGggKyAnLicgKyBfcGFyZW50UGF0aDtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoIXBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdIHx8ICEocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gaW5zdGFuY2VvZiBBcnJheSkpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgYWRkTW9yZSA9IGNvbnRyb2wuaW5pdFJvd0NvdW50IC0gcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0ubGVuZ3RoO1xyXG4gICAgICAgICAgICBpZiAoYWRkTW9yZSA+IDAgJiYgIXBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBpID0gMDtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5yb3dUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xEZWZhdWx0VmFsdWUoaXRlbSwgc3ViQ29udHJvbCwgX3BhcmVudFBhdGggKyAnWycgKyBpICsgJ10nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9PSBudWxsIHx8ICFpc0xpdGVyYWxPYmplY3QocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0pKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5jb250cm9scykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbERlZmF1bHRWYWx1ZShwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSwgc3ViQ29udHJvbCwgX3BhcmVudFBhdGgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIXBhcmVudE1vZGVsLmhhc093blByb3BlcnR5KGNvbnRyb2wuZmllbGQpICYmIGNvbnRyb2wuZmllbGQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuZGVmYXVsdFZhbHVlICE9PSBudWxsICYmIGNvbnRyb2wuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IGNvbnRyb2wuZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sLmF1dG9EaXNwbGF5Rmlyc3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29udHJvbC5fY29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbnRyb2wuX2NvbXBvbmVudC5faGFzTG9hZGVkRGF0YXNvdXJjZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBjb250cm9sLl9jb21wb25lbnQuZGF0YVNvdXJjZUludGVybmFsLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSBjb250cm9sLl9jb21wb25lbnQuZGF0YVNvdXJjZUludGVybmFsWzBdLnZhbHVlW2NvbnRyb2wudmFsdWVGaWVsZF07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFByaXZhdGVEYXRhKHBhcmVudE1vZGVsLCBmaWVsZCkge1xyXG4gICAgICAgIGlmICghcGFyZW50TW9kZWwuX3NvdXJjZSkgcGFyZW50TW9kZWwuX3NvdXJjZSA9IHt9O1xyXG5cclxuICAgICAgICBpZiAoIXBhcmVudE1vZGVsLl9zdGF0dXMpIHBhcmVudE1vZGVsLl9zdGF0dXMgPSB7fTtcclxuICAgICAgICBpZiAoIXBhcmVudE1vZGVsLl9lcnJvcnMpIHBhcmVudE1vZGVsLl9lcnJvcnMgPSB7fTtcclxuXHJcbiAgICAgICAgaWYgKCFwYXJlbnRNb2RlbC5fc3RhdHVzW2ZpZWxkXSkgcGFyZW50TW9kZWwuX3N0YXR1c1tmaWVsZF0gPSB7fTtcclxuICAgICAgICBpZiAoIXBhcmVudE1vZGVsLl9lcnJvcnNbZmllbGRdKSBwYXJlbnRNb2RlbC5fZXJyb3JzW2ZpZWxkXSA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdENvbnRyb2xTY2hlbWEoc2NoZW1hOiBGb3JtU2NoZW1hQmFzZSwgcGFyZW50SWQ/KSB7XHJcbiAgICAgICAgaWYgKHNjaGVtYS5kaXNhYmxlZCAhPSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHNjaGVtYS5kaXNhYmxlZCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmlzVmlld01vZGUpIHtcclxuICAgICAgICAgICAgc2NoZW1hLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNjaGVtYS5sYWJlbCAmJiAhc2NoZW1hLmZ1bGxMYWJlbCkge1xyXG4gICAgICAgICAgICBzY2hlbWEuZnVsbExhYmVsID0gc2NoZW1hLmxhYmVsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFRpdGxlU2NoZW1hXHJcbiAgICAgICAgICAgIHx8IHNjaGVtYSBpbnN0YW5jZW9mIExhYmVsU2NoZW1hXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHNjaGVtYS5zaG93TGFiZWwgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKCFzY2hlbWEuZmllbGQpIHtcclxuICAgICAgICAgICAgICAgIHNjaGVtYS5maWVsZCA9IHRoaXMuX2NvbW1vblNlcnZpY2UuZ3VpZCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2NoZW1hLmZpZWxkKSB7XHJcbiAgICAgICAgICAgIGxldCBrZXkgPSBzY2hlbWEuZmllbGQ7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRJZCAhPSBudWxsKSBrZXkgPSBwYXJlbnRJZCArICcuJyArIGtleTtcclxuICAgICAgICAgICAgc2NoZW1hLnVuaXF1ZUZpZWxkID0ga2V5O1xyXG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sc1trZXldID0gc2NoZW1hO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2NoZW1hWydjb250cm9sVHlwZSddID0gdGhpcy5nZXRDb250cm9sVHlwZShzY2hlbWEpO1xyXG4gICAgICAgIHNjaGVtYVsnZGF0YVR5cGUnXSA9IHRoaXMuZ2V0Vmlld01vZGVEYXRhVHlwZShzY2hlbWEpO1xyXG5cclxuICAgICAgICBpZiAoc2NoZW1hIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxUYWJsZVNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGlmICghY29udHJvbC53aWR0aEZ1bmN0aW9uQ29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYnV0dG9uQ291bnQgPSAwO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuc2hvd1NhdmUpIGJ1dHRvbkNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5zaG93RWRpdCkgYnV0dG9uQ291bnQrKztcclxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLnNob3dEZWxldGUpIGJ1dHRvbkNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5yb3dCdXR0b25zKSBidXR0b25Db3VudCsrO1xyXG4gICAgICAgICAgICAgICAgLy8gMi4zNTcgbMOgIGNoaeG7gXUgcuG7mW5nIGPhu6dhIG3hu5dpIGJ1dHRvbiwgMSBsw6AgcGFkZGluZyB0csOhaSBwaOG6o2kgMC41cmVtXHJcbiAgICAgICAgICAgICAgICBjb25zdCB3aWR0aCA9IDIuMzU3ICogYnV0dG9uQ291bnQgKyAxO1xyXG4gICAgICAgICAgICAgICAgaWYgKHdpZHRoIDwgNikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wud2lkdGhGdW5jdGlvbkNvbHVtbiA9IGA2LjNyZW1gO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbC53aWR0aEZ1bmN0aW9uQ29sdW1uID0gYCR7d2lkdGh9cmVtYDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5yb3dUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgc3ViQ29udHJvbFt0aGlzLmZpZWxkUGFyZW50RmllbGRdID0gY29udHJvbC51bmlxdWVGaWVsZDtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xTY2hlbWEoc3ViQ29udHJvbCwgc2NoZW1hLnVuaXF1ZUZpZWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgZHJvcGRvd25Db250cm9sU2NoZW1hID0gPERyb3Bkb3duQ29udHJvbFNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGRyb3Bkb3duQ29udHJvbFNjaGVtYS5yZXR1cm5UeXBlID0gJ29iamVjdCc7XHJcbiAgICAgICAgICAgIGRyb3Bkb3duQ29udHJvbFNjaGVtYS5maXJlQ2FsbEJhY2tJbnNpZGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKCFkcm9wZG93bkNvbnRyb2xTY2hlbWEuYmluZGluZ0ZpbHRlcnMpIHtcclxuICAgICAgICAgICAgICAgIGRyb3Bkb3duQ29udHJvbFNjaGVtYS5sb2FkT25Jbml0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNEZXNrdG9wKCkpIHtcclxuICAgICAgICAgICAgICAgIGRyb3Bkb3duQ29udHJvbFNjaGVtYS5maWx0ZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jb250cm9sTmVlZENoZWNrUmVhZHkucHVzaChzY2hlbWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBVc2VyUGlja2VyQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCB1c2VyUGlja2VyQ29udHJvbFNjaGVtYSA9IDxEcm9wZG93bkNvbnRyb2xTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICB1c2VyUGlja2VyQ29udHJvbFNjaGVtYS5yZXR1cm5UeXBlID0gJ29iamVjdCc7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbE5lZWRDaGVja1JlYWR5LnB1c2goc2NoZW1hKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8Q29udGFpbmVyU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wuY29udHJvbHMpIHtcclxuICAgICAgICAgICAgICAgIHN1YkNvbnRyb2xbdGhpcy5maWVsZFBhcmVudEZpZWxkXSA9IGNvbnRyb2wudW5pcXVlRmllbGQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sU2NoZW1hKHN1YkNvbnRyb2wsIGNvbnRyb2wudW5pcXVlRmllbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgYXV0b2NvbXBsZXRlQ29udHJvbFNjaGVtYSA9IDxBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlQ29udHJvbFNjaGVtYS5yZXR1cm5UeXBlID0gJ29iamVjdCc7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbE5lZWRDaGVja1JlYWR5LnB1c2goc2NoZW1hKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgQWRkcmVzc0NvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sTmVlZENoZWNrUmVhZHkucHVzaChzY2hlbWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBSYWRpb0J1dHRvbkxpc3RDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHNjaGVtYS5maXJlQ2FsbEJhY2tJbnNpZGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgQ3VzdG9tQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jaGVja0lzVGFza0NvbnRyb2woc2NoZW1hKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25nVmllY1NldHRpbmcgPSBuZXcgQ3J1ZExpc3RTZXR0aW5nKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmdWaWVjU2V0dGluZy5pc1dvcmtmbG93VHJlZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBzY2hlbWEuZGF0YS5maWVsZFBhcmVudEZvclRhc2tzID0gW107XHJcbiAgICAgICAgICAgICAgICBsb29wQ3Vyc29yRnVuY3Rpb24oXHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0UmVnZXhSZXN1bHQoc2NoZW1hLmRhdGEuX190ZW1wbGF0ZVRhc2tOYW1lLCBSZWdleFNwbGl0RmllbGRCeUl0ZW0sIGV4ZWNSZXN1bHQgPT4gZXhlY1Jlc3VsdFsxXSksXHJcbiAgICAgICAgICAgICAgICAgICAgZmllbGQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEuZGF0YS5maWVsZFBhcmVudEZvclRhc2tzLnB1c2goZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWFDaGlsZCA9IHRoaXMuc2V0dGluZy5zY2hlbWEuZmluZChxID0+IHEuZmllbGQgPT0gZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hQ2hpbGQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRNb3JlT25DaGFuZ2VFdmVudChzY2hlbWFDaGlsZCwgKGV2dDogRXZlbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJUZW5Db25nVmllYyhldnQucm9vdE1vZGVsLCBzY2hlbWEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGlzYWJsZUNvbnRyb2xTY2hlbWEoc2NoZW1hOiBGb3JtU2NoZW1hQmFzZSwgZGlzYWJsZWQgPSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKCFzY2hlbWEuZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgc2NoZW1hLmRpc2FibGVkID0gZGlzYWJsZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPFRhYmxlU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZUNvbnRyb2xTY2hlbWEoc3ViQ29udHJvbCwgZGlzYWJsZWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPENvbnRhaW5lclNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVDb250cm9sU2NoZW1hKHN1YkNvbnRyb2wsIGRpc2FibGVkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrSXNUYXNrQ29udHJvbChzY2hlbWEpIHtcclxuICAgICAgICByZXR1cm4gc2NoZW1hLmZpZWxkID09IEZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2xcclxuICAgICAgICAgICAgJiYgc2NoZW1hLmRhdGFcclxuICAgICAgICAgICAgJiYgc2NoZW1hLmRhdGEuX190ZW1wbGF0ZVRhc2tOYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlclRlbkNvbmdWaWVjKG1vZGVsOiBhbnksIHNjaGVtYTogQ3VzdG9tQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgIGxldCB0ZW1wbGF0ZVRleHQgPSBzY2hlbWEuZGF0YS5fX3RlbXBsYXRlVGFza05hbWU7XHJcbiAgICAgICAgc2NoZW1hLmRhdGEuZmllbGRQYXJlbnRGb3JUYXNrcy5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICAgICAgdGVtcGxhdGVUZXh0ID0gdGVtcGxhdGVUZXh0LnJlcGxhY2UoYHt7aXRlbS4ke2ZpZWxkfX19YCwgZ2V0U3RyaW5nRGlzcGxheVZhbHVlKG1vZGVsW2ZpZWxkXSkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHNjaGVtYS5kYXRhLnRlbkNvbmdWaWVjID0gdGVtcGxhdGVUZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdEJpbmRpbmdDb250cm9sU2NoZW1hKHNjaGVtYTogYW55KSB7XHJcbiAgICAgICAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8VGFibGVTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5yb3dUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0QmluZGluZ0NvbnRyb2xTY2hlbWEoc3ViQ29udHJvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udHJvbFNjaGVtYSA9IDxEcm9wZG93bkNvbnRyb2xTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBpZiAoZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRPbkNoYW5nZVRvRHJvcGRvd24oZHJvcGRvd25Db250cm9sU2NoZW1hKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udHJvbFNjaGVtYSA9IDxBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgaWYgKGRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kT25DaGFuZ2VUb0Ryb3Bkb3duKGRyb3Bkb3duQ29udHJvbFNjaGVtYSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8Q29udGFpbmVyU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wuY29udHJvbHMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdEJpbmRpbmdDb250cm9sU2NoZW1hKHN1YkNvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgYmluZE9uQ2hhbmdlVG9Ecm9wZG93bihkcm9wZG93bkNvbnRyb2xTY2hlbWE6IERyb3Bkb3duQ29udHJvbFNjaGVtYSB8IEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICBsZXQgdG1wRmlsdGVyczogRmlsdGVyW10gPSBbXTtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkcm9wZG93bkNvbnRyb2xTY2hlbWEuYmluZGluZ0ZpbHRlcnMpKSB7XHJcbiAgICAgICAgICAgIHRtcEZpbHRlcnMgPSBkcm9wZG93bkNvbnRyb2xTY2hlbWEuYmluZGluZ0ZpbHRlcnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiAoZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzKSA9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRtcEZpbHRlcnMgPSBkcm9wZG93bkNvbnRyb2xTY2hlbWEuYmluZGluZ0ZpbHRlcnMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRtcEZpbHRlcnMgPSBhd2FpdCBkcm9wZG93bkNvbnRyb2xTY2hlbWEuYmluZGluZ0ZpbHRlcnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRtcEZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VGaWVsZCA9IGZpbHRlci5zb3VyY2VGaWVsZDtcclxuICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5zZXR0aW5nLnNjaGVtYS5maW5kKHEgPT4gcS5maWVsZCA9PSBzb3VyY2VGaWVsZCk7XHJcbiAgICAgICAgICAgIGlmICghZmlsdGVyLnN1YkZpZWxkXHJcbiAgICAgICAgICAgICAgICAmJiAoc2NoZW1hIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hIHx8IHNjaGVtYSBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEpKSB7XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXIuc3ViRmllbGQgPSBzY2hlbWEudmFsdWVGaWVsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IG1hcmtlZENvbnRyb2wgPSB7fTtcclxuICAgICAgICB0aGlzLmJpbmRPbkNoYW5nZVRvRHJvcGRvd25SZWN1cnNpdmUoZHJvcGRvd25Db250cm9sU2NoZW1hLCB0bXBGaWx0ZXJzLCBtYXJrZWRDb250cm9sKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJpbmRPbkNoYW5nZVRvRHJvcGRvd25SZWN1cnNpdmUoY2hpbGREcm9wZG93bjogRHJvcGRvd25Db250cm9sU2NoZW1hIHwgQXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYSwgdG1wRmlsdGVyczogRmlsdGVyW10sIG1hcmtlZENvbnRyb2wpIHtcclxuICAgICAgICBpZiAodG1wRmlsdGVycyBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIHRtcEZpbHRlcnMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZpZWxkID0gZmlsdGVyLnNvdXJjZUZpZWxkO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50RHJvcGRvd24gPSB0aGlzLmZvcm1Db250cm9sc1tzb3VyY2VGaWVsZF07XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50RHJvcGRvd24gJiYgIW1hcmtlZENvbnRyb2xbc291cmNlRmllbGRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFya2VkQ29udHJvbFtzb3VyY2VGaWVsZF0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGREcm9wZG93bltLZXlGdW5jdGlvblJlbG9hZF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRHJvcGRvd24gaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRHJvcGRvd25bS2V5RnVuY3Rpb25SZWxvYWRdID0gKGV2ZW50OiBFdmVudERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmVlZEdldERhdGEgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGREcm9wZG93bi5hbGxvd0xvYWREYXRhV2hlblBhcmVudE51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZXZlbnQuZXZlbnRUeXBlID09IHRoaXMuZXZlbnRUeXBlLkFESlVTVF9WQUxVRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkR2V0RGF0YSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV2ZW50LnZhbHVlID09IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZXZlbnQudmFsdWUgPT0gJydcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGV2ZW50LnZhbHVlIGluc3RhbmNlb2YgQXJyYXkgJiYgZXZlbnQudmFsdWUubGVuZ3RoID09IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZERyb3Bkb3duLl9jb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudC5yZXNldENvbnRyb2woKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZEdldERhdGEgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVlZEdldERhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX2NydWRTZXJ2aWNlLmdldEZpbHRlckZyb21UZW1wbGF0ZSh0bXBGaWx0ZXJzLCBldmVudC5wYXJlbnRNb2RlbCwgZXZlbnQucm9vdE1vZGVsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCEocGFyZW50RHJvcGRvd24gaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyZW50RHJvcGRvd24uX2NvbXBvbmVudCAmJiBwYXJlbnREcm9wZG93bi5fY29tcG9uZW50Ll9oYXNMb2FkZWREYXRhc291cmNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGREcm9wZG93bi5fY29tcG9uZW50LmdldERhdGEoZmlsdGVycyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudCAmJiBjaGlsZERyb3Bkb3duLl9jb21wb25lbnQuZ2V0RGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudC5nZXREYXRhKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRNb3JlT25DaGFuZ2VFdmVudChwYXJlbnREcm9wZG93biwgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGREcm9wZG93bltLZXlGdW5jdGlvblJlbG9hZF0oZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kT25DaGFuZ2VUb0Ryb3Bkb3duUmVjdXJzaXZlKGNoaWxkRHJvcGRvd24sIGZpbHRlci5maWx0ZXJzLCBtYXJrZWRDb250cm9sKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZE1vcmVPbkNoYW5nZUV2ZW50KGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSwgbmV3T25DaGFuZ2UpIHtcclxuICAgICAgICBpZiAoY29udHJvbC50cmlnZ2VyTG9hZENoaWxkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9sZFRyaWdnZXJMb2FkQ2hpbGQgPSBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQ7XHJcbiAgICAgICAgICAgIGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZCA9IGFzeW5jIChldmVudDogRXZlbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBvbGRUcmlnZ2VyTG9hZENoaWxkKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG5ld09uQ2hhbmdlKGV2ZW50KTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZCA9IGFzeW5jIChldmVudDogRXZlbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXdPbkNoYW5nZShldmVudCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRtcEZpZWxkT2xkT25DaGFuZ2UgPSAnb2xkT25DaGFuZ2UnO1xyXG4gICAgICAgIGlmIChjb250cm9sW3RtcEZpZWxkT2xkT25DaGFuZ2VdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wub25DaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRPbkNoYW5nZSA9IGNvbnRyb2wub25DaGFuZ2VkO1xyXG4gICAgICAgICAgICAgICAgY29udHJvbFt0bXBGaWVsZE9sZE9uQ2hhbmdlXSA9IG9sZE9uQ2hhbmdlO1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkNoYW5nZWQgPSBhc3luYyAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG9sZE9uQ2hhbmdlKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wub25DaGFuZ2VkID0gY29udHJvbC50cmlnZ2VyTG9hZENoaWxkO1xyXG4gICAgICAgICAgICAgICAgY29udHJvbFt0bXBGaWVsZE9sZE9uQ2hhbmdlXSA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sW3RtcEZpZWxkT2xkT25DaGFuZ2VdKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRPbkNoYW5nZSA9IGNvbnRyb2xbdG1wRmllbGRPbGRPbkNoYW5nZV07XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uQ2hhbmdlZCA9IGFzeW5jIChldmVudDogRXZlbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgb2xkT25DaGFuZ2UoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZChldmVudCk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkNoYW5nZWQgPSBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm9uQWRqdXN0ZWRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2xkRXZlbnQgPSBjb250cm9sLm9uQWRqdXN0ZWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wub25BZGp1c3RlZFZhbHVlID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBvbGRFdmVudChldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3T25DaGFuZ2UoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wub25BZGp1c3RlZFZhbHVlID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXdPbkNoYW5nZShldmVudCk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFZhbGlkYXRvckFuZENvcnJlY3RvcihzY2hlbWE6IEZvcm1Db250cm9sQmFzZSkge1xyXG4gICAgICAgIGlmICghc2NoZW1hLmNvcnJlY3RvcnMpIHNjaGVtYS5jb3JyZWN0b3JzID0gW107XHJcblxyXG4gICAgICAgIGlmICghc2NoZW1hLnZhbGlkYXRvcnMpIHNjaGVtYS52YWxpZGF0b3JzID0gW107XHJcblxyXG4gICAgICAgIGlmIChzY2hlbWEucmVxdWlyZWQpIHtcclxuICAgICAgICAgICAgc2NoZW1hLnZhbGlkYXRvcnMucHVzaChuZXcgUmVxdWlyZWRWYWxpZGF0b3IoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2NoZW1hIGluc3RhbmNlb2YgTWFza0NvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKHNjaGVtYS52YWxpZGF0b3JzKSB7XHJcbiAgICAgICAgICAgICAgICBzY2hlbWEudmFsaWRhdG9ycy5mb3JFYWNoKHZhbGlkYXRvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIE51bWJlckNvbXBhcmVWYWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVWYWxpZGF0b3JDb21wYXJlUmV2ZXJ0KHZhbGlkYXRvciwgc2NoZW1hKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUZXh0Q29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZXh0U2NoZW1hID0gKDxUZXh0Q29udHJvbFNjaGVtYT5zY2hlbWEpO1xyXG4gICAgICAgICAgICBpZiAodGV4dFNjaGVtYS5kYXRhRm9ybWF0ID09ICdudW1iZXInIHx8IHRleHRTY2hlbWEuZGF0YUZvcm1hdCA9PSAnYW1vdW50Jykge1xyXG4gICAgICAgICAgICAgICAgdGV4dFNjaGVtYS52YWxpZGF0b3JzLnB1c2gobmV3IE51bWJlck9ubHlWYWxpZGF0b3IoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodGV4dFNjaGVtYS5kYXRhRm9ybWF0ID09ICdtb25leScgfHwgdGV4dFNjaGVtYS5kYXRhRm9ybWF0ID09ICdtb25leWludCcpIHtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodGV4dFNjaGVtYS5kYXRhRm9ybWF0ID09ICdlbWFpbCcpIHtcclxuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEudmFsaWRhdG9ycy5wdXNoKG5ldyBFbWFpbFZhbGlkYXRvcigpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRleHRTY2hlbWEuY29ycmVjdG9ycykgdGV4dFNjaGVtYS5jb3JyZWN0b3JzID0gW107XHJcbiAgICAgICAgICAgICAgICB0ZXh0U2NoZW1hLmNvcnJlY3RvcnMucHVzaChuZXcgR21haWxDb3JyZWN0b3IoKSk7XHJcbiAgICAgICAgICAgICAgICB0ZXh0U2NoZW1hLmNvcnJlY3RvcnMucHVzaChuZXcgTG93ZXJDb3JyZWN0b3IoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodGV4dFNjaGVtYS5kYXRhRm9ybWF0ID09ICdwaG9uZScgfHwgdGV4dFNjaGVtYS5kYXRhRm9ybWF0ID09ICdmYXgnKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0U2NoZW1hLnZhbGlkYXRvcnMucHVzaChuZXcgUGhvbmVOdW1iZXJWYWxpZGF0b3IoKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0ZXh0U2NoZW1hLnZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEudmFsaWRhdG9ycy5mb3JFYWNoKHZhbGlkYXRvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIE51bWJlckNvbXBhcmVWYWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVWYWxpZGF0b3JDb21wYXJlUmV2ZXJ0KHZhbGlkYXRvciwgdGV4dFNjaGVtYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxUYWJsZVNjaGVtYT5zY2hlbWE7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRWYWxpZGF0b3JBbmRDb3JyZWN0b3Ioc3ViQ29udHJvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgRGF0ZVRpbWVDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGVUaW1lU2NoZW1hID0gKDxEYXRlVGltZUNvbnRyb2xTY2hlbWE+c2NoZW1hKTtcclxuICAgICAgICAgICAgaWYgKGRhdGVUaW1lU2NoZW1hLnZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIGRhdGVUaW1lU2NoZW1hLnZhbGlkYXRvcnMuZm9yRWFjaCh2YWxpZGF0b3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBEYXRlQ29tcGFyZVZhbGlkYXRvciB8fCB2YWxpZGF0b3IgaW5zdGFuY2VvZiBDb21wYXJlVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsaWRhdG9yQ29tcGFyZVJldmVydCh2YWxpZGF0b3IsIGRhdGVUaW1lU2NoZW1hKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxDb250YWluZXJTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5jb250cm9scykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0VmFsaWRhdG9yQW5kQ29ycmVjdG9yKHN1YkNvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzY2hlbWEudmFsaWRhdG9ycy5mb3JFYWNoKHZhbGlkYXRvciA9PiB7XHJcbiAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBDaGVja0R1cGxpY2F0ZVZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICAgICAgdmFsaWRhdG9yLnNldEJhc2VTZXJ2aWNlKHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgQ2hlY2tEdXBsaWNhdGVGaWVsZHNWYWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRvci5zZXRCYXNlU2VydmljZSh0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVWYWxpZGF0b3JDaGVja0R1cGxpY2F0ZShzY2hlbWEsIHZhbGlkYXRvci5nZXREdXBsaWNhdGVGaWVsZHMoKSwgdmFsaWRhdG9yLmdldE1lc3NhZ2UoKSwgdmFsaWRhdG9yLmdldERlZmF1bHRGaWx0ZXJzKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIFJlcXVpcmVkRmllbGRzVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvclJlcXVpcmVkcyhzY2hlbWEsIHZhbGlkYXRvci5nZXRSZXF1aXJlZEZpZWxkcygpLCB2YWxpZGF0b3IuZ2V0TWVzc2FnZSgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBTYW1lVmFsdWVWYWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlU2FtZVZhbHVlVmFsaWRhdG9ycyhzY2hlbWEsIHZhbGlkYXRvci5nZXRTYW1lRmllbGRzKCksIHZhbGlkYXRvci5nZXRNZXNzYWdlKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlVmFsaWRhdG9yQ29tcGFyZVJldmVydChcclxuICAgICAgICB2YWxpZGF0b3I6IERhdGVDb21wYXJlVmFsaWRhdG9yIHwgTnVtYmVyQ29tcGFyZVZhbGlkYXRvciB8IENvbXBhcmVWYWxpZGF0b3IsXHJcbiAgICAgICAgc2NoZW1hOiBEYXRlVGltZUNvbnRyb2xTY2hlbWEgfCBUZXh0Q29udHJvbFNjaGVtYSB8IE1hc2tDb250cm9sU2NoZW1hXHJcbiAgICApIHtcclxuICAgICAgICBjb25zdCBjb21wYXJlVW5pcXVlRmllbGQgPSB2YWxpZGF0b3IuY29tcGFyZVVuaXF1ZUZpZWxkO1xyXG4gICAgICAgIGlmIChzY2hlbWEudW5pcXVlRmllbGQgPT0gY29tcGFyZVVuaXF1ZUZpZWxkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnU2NoZW1hIGPhuqV1IGjDrG5oIGLhu4sgbOG7l2knKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9wZXJhdG9yQ29tcGFyZSA9IHZhbGlkYXRvci5nZXRPcGVyYXRvckNvbXBhcmUoKTtcclxuICAgICAgICAgICAgY29uc3Qgc2NoZW1hQ29tcGFyZSA9IDxGb3JtQ29udHJvbEJhc2U+KHRoaXMuZm9ybUNvbnRyb2xzW2NvbXBhcmVVbmlxdWVGaWVsZF0pO1xyXG4gICAgICAgICAgICBpZiAoc2NoZW1hQ29tcGFyZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NjaGVtYSBj4bqldSBow6xuaCBi4buLIGzhu5dpJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYUNvbXBhcmUudmFsaWRhdG9ycy5zb21lKHAgPT4gcCBpbnN0YW5jZW9mIENvbXBhcmVWYWxpZGF0b3JcclxuICAgICAgICAgICAgICAgICAgICAmJiBwLmNvbXBhcmVVbmlxdWVGaWVsZCA9PSBzY2hlbWEudW5pcXVlRmllbGQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIERhdGVDb21wYXJlVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUNvbXBhcmUudmFsaWRhdG9ycy5wdXNoKG5ldyBEYXRlQ29tcGFyZVZhbGlkYXRvcihvcGVyYXRvckNvbnRyYXN0W29wZXJhdG9yQ29tcGFyZV0sIHNjaGVtYS51bmlxdWVGaWVsZCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBOdW1iZXJDb21wYXJlVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUNvbXBhcmUudmFsaWRhdG9ycy5wdXNoKG5ldyBOdW1iZXJDb21wYXJlVmFsaWRhdG9yKG9wZXJhdG9yQ29udHJhc3Rbb3BlcmF0b3JDb21wYXJlXSwgc2NoZW1hLnVuaXF1ZUZpZWxkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFDb21wYXJlLnZhbGlkYXRvcnMucHVzaChuZXcgQ29tcGFyZVZhbGlkYXRvcihvcGVyYXRvckNvbnRyYXN0W29wZXJhdG9yQ29tcGFyZV0sIHNjaGVtYS51bmlxdWVGaWVsZCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVWYWxpZGF0b3JDaGVja0R1cGxpY2F0ZShzY2hlbWE6IEZvcm1Db250cm9sQmFzZSwgZmllbGRPdGhlcjogc3RyaW5nW10sIG1lc3NhZ2U6IHN0cmluZywgZGVmYXVsdEZpbHRlcnM6IEZpbHRlcltdKSB7XHJcbiAgICAgICAgaWYgKGZpZWxkT3RoZXIuaW5kZXhPZihzY2hlbWEudW5pcXVlRmllbGQpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdTY2hlbWEgY+G6pXUgaMOsbmggYuG7iyBs4buXaScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZmllbGRzID0gWy4uLmZpZWxkT3RoZXIsIHNjaGVtYS5maWVsZF07XHJcbiAgICAgICAgICAgIGZpZWxkT3RoZXIuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWFPdGhlciA9IDxGb3JtQ29udHJvbEJhc2U+KHRoaXMuZm9ybUNvbnRyb2xzW2ZpZWxkXSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0bXBGaWVsZHMgPSBmaWVsZHMuZmlsdGVyKHAgPT4gcCAhPSBzY2hlbWFPdGhlci5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYU90aGVyLnZhbGlkYXRvcnMuc29tZShwID0+IHAgaW5zdGFuY2VvZiBDaGVja0R1cGxpY2F0ZUZpZWxkc1ZhbGlkYXRvclxyXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMuX2NvbW1vblNlcnZpY2UuaXNTYW1lQXJyYXkodG1wRmllbGRzLCBwLmdldER1cGxpY2F0ZUZpZWxkcygpKSlcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IF92YWxpZGF0b3IgPSBuZXcgQ2hlY2tEdXBsaWNhdGVGaWVsZHNWYWxpZGF0b3IodG1wRmllbGRzLCBtZXNzYWdlLCBkZWZhdWx0RmlsdGVycyk7XHJcbiAgICAgICAgICAgICAgICAgICAgX3ZhbGlkYXRvci5zZXRCYXNlU2VydmljZSh0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNjaGVtYU90aGVyLnZhbGlkYXRvcnMucHVzaChfdmFsaWRhdG9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVZhbGlkYXRvclJlcXVpcmVkcyhzY2hlbWE6IEZvcm1Db250cm9sQmFzZSwgZmllbGRPdGhlcjogc3RyaW5nW10sIG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIGlmIChmaWVsZE90aGVyLmluZGV4T2Yoc2NoZW1hLnVuaXF1ZUZpZWxkKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnU2NoZW1hIGPhuqV1IGjDrG5oIGLhu4sgbOG7l2knKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkcyA9IFsuLi5maWVsZE90aGVyLCBzY2hlbWEuZmllbGRdO1xyXG4gICAgICAgICAgICBmaWVsZE90aGVyLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NoZW1hT3RoZXIgPSA8Rm9ybUNvbnRyb2xCYXNlPih0aGlzLmZvcm1Db250cm9sc1tmaWVsZF0pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdG1wRmllbGRzID0gZmllbGRzLmZpbHRlcihwID0+IHAgIT0gc2NoZW1hT3RoZXIuZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFPdGhlci52YWxpZGF0b3JzLnNvbWUocCA9PiBwIGluc3RhbmNlb2YgUmVxdWlyZWRGaWVsZHNWYWxpZGF0b3JcclxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLl9jb21tb25TZXJ2aWNlLmlzU2FtZUFycmF5KHRtcEZpZWxkcywgcC5nZXRSZXF1aXJlZEZpZWxkcygpKSlcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IF92YWxpZGF0b3IgPSBuZXcgUmVxdWlyZWRGaWVsZHNWYWxpZGF0b3IodG1wRmllbGRzLCBtZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICBzY2hlbWFPdGhlci52YWxpZGF0b3JzLnB1c2goX3ZhbGlkYXRvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVTYW1lVmFsdWVWYWxpZGF0b3JzKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlLCBmaWVsZE90aGVyOiBzdHJpbmdbXSwgbWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKGZpZWxkT3RoZXIuaW5kZXhPZihzY2hlbWEudW5pcXVlRmllbGQpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdTY2hlbWEgY+G6pXUgaMOsbmggYuG7iyBs4buXaScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZmllbGRzID0gWy4uLmZpZWxkT3RoZXIsIHNjaGVtYS5maWVsZF07XHJcbiAgICAgICAgICAgIGZpZWxkT3RoZXIuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWFPdGhlciA9IDxGb3JtQ29udHJvbEJhc2U+KHRoaXMuZm9ybUNvbnRyb2xzW2ZpZWxkXSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0bXBGaWVsZHMgPSBmaWVsZHMuZmlsdGVyKHAgPT4gcCAhPSBzY2hlbWFPdGhlci5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYU90aGVyLnZhbGlkYXRvcnMuc29tZShwID0+IHAgaW5zdGFuY2VvZiBTYW1lVmFsdWVWYWxpZGF0b3JcclxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLl9jb21tb25TZXJ2aWNlLmlzU2FtZUFycmF5KHRtcEZpZWxkcywgcC5nZXRTYW1lRmllbGRzKCkpKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX3ZhbGlkYXRvciA9IG5ldyBTYW1lVmFsdWVWYWxpZGF0b3IodG1wRmllbGRzLCBtZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICBzY2hlbWFPdGhlci52YWxpZGF0b3JzLnB1c2goX3ZhbGlkYXRvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldERhdGFEZWZhdWx0KCkge1xyXG4gICAgICAgIGNvbnN0IHN0cmluZ0RhdGFEZWZhdWx0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuREVGQVVMVF9EQVRBKTtcclxuICAgICAgICBjb25zdCBnZXRTZXR0aW5nRGF0YURlZmF1bHQgPSB0aGlzLl9tb2R1bGVDb25maWcuZ2V0Q29uZmlnKCkuZW52aXJvbm1lbnQuc2V0dGluZ0RhdGFEZWZhdWx0O1xyXG4gICAgICAgIGlmIChzdHJpbmdEYXRhRGVmYXVsdCAmJiAodGhpcy5fbW9kZWxEYXRhICYmICF0aGlzLl9tb2RlbERhdGEuaWQpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGFDYWNoZSA9IEpTT04ucGFyc2Uoc3RyaW5nRGF0YURlZmF1bHQpO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250cm9sID0gKDxEcm9wZG93bkNvbnRyb2xTY2hlbWE+aXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gKGNvbnRyb2wuZmllbGQgKyAoY29udHJvbC52YWx1ZUZpZWxkID09ICdpZCcgPyAnJyA6IGNvbnRyb2wudmFsdWVGaWVsZCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGRhdGFDYWNoZVtrZXldO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2RlbERhdGFbY29udHJvbC5maWVsZF0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZ2V0U2V0dGluZ0RhdGFEZWZhdWx0KSB7IC8vIGzhuqV5IGPhuqV1IGjDrG5oIGZpZWxkIG1hcFBpbmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGRNYXBHZXRDYWNoZSA9IGdldFNldHRpbmdEYXRhRGVmYXVsdFtjb250cm9sLmZpZWxkXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkTWFwR2V0Q2FjaGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IChmaWVsZE1hcEdldENhY2hlICsgKGNvbnRyb2wudmFsdWVGaWVsZCA9PSAnaWQnID8gJycgOiBjb250cm9sLnZhbHVlRmllbGQpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZGF0YUNhY2hlW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2RlbERhdGFbY29udHJvbC5maWVsZF0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGF0YUNhY2hlWyg8Rm9ybVNjaGVtYUJhc2U+aXRlbSkuZmllbGRdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2RlbERhdGFbKDxGb3JtU2NoZW1hQmFzZT5pdGVtKS5maWVsZF0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5mdW5jdGlvbi5tb2RpZnlEYXRhQWZ0ZXJHZXRDYWNoZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuZnVuY3Rpb24ubW9kaWZ5RGF0YUFmdGVyR2V0Q2FjaGUodGhpcy5fbW9kZWxEYXRhKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhcHBseUNhY2hlZFZhbHVlcygpIHtcclxuICAgICAgICB0aGlzLmdldENhY2hlZFZhbHVlc0Zyb21TdG9yYWdlKCk7XHJcbiAgICAgICAgdGhpcy5zZXRDYWNoZWRWYWx1ZVRvTW9kZWwodGhpcy5fbW9kZWxEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldENhY2hlZFZhbHVlVG9Nb2RlbChtb2RlbCwgdW5pcXVlS2V5Q29udHJvbD8sIHBhdGg/KSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBmaWVsZCBpbiBtb2RlbCkge1xyXG4gICAgICAgICAgICBpZiAoZmllbGQgIT0gJ19lcnJvcnMnICYmIGZpZWxkICE9ICdfc3RhdHVzJyAmJiBmaWVsZCAhPSAnX3NvdXJjZScpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzdWJVbmlxdWVLZXlDb250cm9sO1xyXG4gICAgICAgICAgICAgICAgaWYgKHVuaXF1ZUtleUNvbnRyb2wgIT0gbnVsbCAmJiB1bmlxdWVLZXlDb250cm9sICE9PSAnJykgc3ViVW5pcXVlS2V5Q29udHJvbCA9IHVuaXF1ZUtleUNvbnRyb2wgKyAnLicgKyBmaWVsZDtcclxuICAgICAgICAgICAgICAgIGVsc2Ugc3ViVW5pcXVlS2V5Q29udHJvbCA9IGZpZWxkO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybUNvbnRyb2xzW3N1YlVuaXF1ZUtleUNvbnRyb2xdO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjb250cm9sKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGxldCBzdWJQYXRoO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoICE9PSAnJykgc3ViUGF0aCA9IHBhdGggKyAnLicgKyBmaWVsZDtcclxuICAgICAgICAgICAgICAgIGVsc2Ugc3ViUGF0aCA9IGZpZWxkO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1Yk1vZGVsID0gbW9kZWxbZmllbGRdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1Yk1vZGVsIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBzdWJNb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENhY2hlZFZhbHVlVG9Nb2RlbChpdGVtLCBzdWJVbmlxdWVLZXlDb250cm9sLCBzdWJQYXRoICsgJ1snICsgaW5kZXggKyAnXScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzTGl0ZXJhbE9iamVjdChzdWJNb2RlbCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENhY2hlZFZhbHVlVG9Nb2RlbChzdWJNb2RlbCwgc3ViVW5pcXVlS2V5Q29udHJvbCwgc3ViUGF0aCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb250cm9sLmVuYWJsZUNhY2hpbmcgJiYgdGhpcy5jYWNoZWRWYWx1ZXMuaGFzT3duUHJvcGVydHkoc3ViUGF0aCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBtb2RlbFtmaWVsZF0gPSB0aGlzLmNhY2hlZFZhbHVlc1tzdWJQYXRoXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldENhY2hlZFZhbHVlc0Zyb21TdG9yYWdlKCkge1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZFZhbHVlcyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhY2hlZFZhbHVlcycpKTtcclxuICAgICAgICBpZiAoY2FjaGVkVmFsdWVzKSB7XHJcbiAgICAgICAgICAgIGxldCBwYXRoTmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtSWQpIHBhdGhOYW1lICs9ICcvJyArIHRoaXMuZm9ybUlkO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhY2hlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNhY2hlZFZhbHVlc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnBhdGhuYW1lID09PSBwYXRoTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVkVmFsdWVzID0gZWxlbWVudC52YWx1ZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzYXZlQ2FjaGVWYWx1ZXNUb1N0b3JhZ2UoKSB7XHJcbiAgICAgICAgbGV0IGNhY2hlZFZhbHVlcyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhY2hlZFZhbHVlcycpKTtcclxuICAgICAgICBpZiAoIWNhY2hlZFZhbHVlcykgY2FjaGVkVmFsdWVzID0gW107XHJcbiAgICAgICAgbGV0IGNoZWNrRXhpc3QgPSBmYWxzZTtcclxuICAgICAgICBsZXQgcGF0aE5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcclxuICAgICAgICBpZiAodGhpcy5mb3JtSWQpIHBhdGhOYW1lICs9ICcvJyArIHRoaXMuZm9ybUlkO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FjaGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBjYWNoZWRWYWx1ZXNbaV07XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnBhdGhuYW1lID09PSBwYXRoTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC52YWx1ZXMgPSB0aGlzLmNhY2hlZFZhbHVlcztcclxuICAgICAgICAgICAgICAgIGNoZWNrRXhpc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghY2hlY2tFeGlzdCkge1xyXG4gICAgICAgICAgICBjYWNoZWRWYWx1ZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBwYXRobmFtZTogcGF0aE5hbWUsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IHRoaXMuY2FjaGVkVmFsdWVzXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NhY2hlZFZhbHVlcycsIEpTT04uc3RyaW5naWZ5KGNhY2hlZFZhbHVlcykpO1xyXG4gICAgfVxyXG5cclxuICAgIHRyaWdnZXJDaGFuZ2UoZmllbGRQYXRoKSB7XHJcbiAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKGZpZWxkUGF0aCk7XHJcbiAgICAgICAgY29uc3QgY29udHJvbCA9IGN1cnJlbnROb2RlLmNvbnRyb2w7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgJiYgY3VycmVudE5vZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVGaWVsZFZhbHVlQ2hhbmdlKGNvbnRyb2wsIG51bGwsICd0cmlnZ2VyJywgY3VycmVudE5vZGUucGFyZW50TW9kZWwsIGN1cnJlbnROb2RlLnBhcmVudE1vZGVsUGF0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYXV0b0ZvY3VzICYmICF0aGlzLnJvb3RDb250ZXh0LmRhdGEuZmxhZ3MuaGFzRm9jdXNpbmdDb250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3RDb250ZXh0LmRhdGEuZmxhZ3MuaGFzRm9jdXNpbmdDb250cm9sID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNGaXJzdENvbnRyb2woKTtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdENvbnRleHQuZGF0YS5mbGFncy5oYXNGb2N1c2luZ0NvbnRyb2wgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0sIDgwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJc0xvYWRlZERhdGFFZGl0KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkZWREYXRhRWRpdE9sZCA9IHRoaXMubG9hZGVkRGF0YUVkaXQ7XHJcbiAgICAgICAgdGhpcy5sb2FkZWREYXRhRWRpdCA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb250cm9sVHlwZShjb250cm9sOiBhbnkpIHtcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRpdGxlU2NoZW1hKSByZXR1cm4gJ3RpdGxlJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIExhYmVsU2NoZW1hKSByZXR1cm4gJ2xhYmVsJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFNwYW5Db250cm9sU2NoZW1hKSByZXR1cm4gJ3NwYW5Db250cm9sJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIE1hc2tDb250cm9sU2NoZW1hKSByZXR1cm4gJ21hc2snO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgTnVtYmVyUmFuZ2VDb250cm9sU2NoZW1hKSByZXR1cm4gJ251bWJlcnJhbmdlJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRleHRDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRleHRDb250cm9sID0gPFRleHRDb250cm9sU2NoZW1hPmNvbnRyb2w7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHRleHRDb250cm9sLmRhdGFGb3JtYXQgPT09ICdtb25leSdcclxuICAgICAgICAgICAgICAgIHx8IHRleHRDb250cm9sLmRhdGFGb3JtYXQgPT09ICdtb25leWludCdcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21vbmV5JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICB0ZXh0Q29udHJvbC5kYXRhRm9ybWF0ID09PSAncGhvbmUnXHJcbiAgICAgICAgICAgICAgICB8fCB0ZXh0Q29udHJvbC5kYXRhRm9ybWF0ID09PSAnZmF4J1xyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAncGhvbmVPcmZheCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuICd0ZXh0JztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBSZWZlcmVuY2VUZXh0Q29udHJvbFNjaGVtYSkgcmV0dXJuICdyZWZlcmVuY2UtdGV4dCc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZW1wbGF0ZUNvbnRyb2xTY2hlbWEpIHJldHVybiAndGVtcGxhdGUnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRGF0ZVRpbWVDb250cm9sU2NoZW1hKSByZXR1cm4gJ2RhdGV0aW1lJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIERhdGVUaW1lUmFuZ2VDb250cm9sU2NoZW1hKSByZXR1cm4gJ2RhdGV0aW1lcmFuZ2UnO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQWRkcmVzc0NvbnRyb2xTY2hlbWEpIHJldHVybiAnYWRkcmVzcyc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHJldHVybiAnZHJvcGRvd24nO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRWRpdG9yQ29udHJvbFNjaGVtYSkgcmV0dXJuICdlZGl0b3InO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGV4dEFyZWFDb250cm9sU2NoZW1hKSByZXR1cm4gJ3RleHRhcmVhJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFdyYXBQaWNrZXJDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnY29tbW9uLXBpY2tlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFBo4bqjaSDEkeG7gyBkw7JuZyBkxrDhu5tpIOG7nyBiw6puIHRyw6puIFVzZXJQaWNrZXJDb250cm9sU2NoZW1hIHbDrCBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hIDogVXNlclBpY2tlckNvbnRyb2xTY2hlbWFcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnYXV0b2NvbXBsZXRlLXBpY2tlcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBVc2VyUGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICd1c2VyLXBpY2tlcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBFbnRpdHlQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2VudGl0eS1waWNrZXInO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgT3JnYW5pemF0aW9uUGlja2VyQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ29yZ2FuaXphdGlvbi1waWNrZXInO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvQ2F1VG9DaHVjUGlja2VyQ29udHJvbFNjaGVtYU5ldykge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2NvY2F1dG9jaHVjLXBpY2tlci1uZXcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvQ2F1VG9DaHVjUGlja2VyQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2NvY2F1dG9jaHVjLXBpY2tlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29DYXVUb0NodWNDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnY29jYXV0b2NodWMnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZUNvbnRyb2xTY2hlbWEpIHJldHVybiAnYXV0b2NvbXBsZXRlJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFN3aXRjaENvbnRyb2xTY2hlbWEpIHJldHVybiAnc3dpdGNoJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENoZWNrYm94Q29udHJvbFNjaGVtYSkgcmV0dXJuICdjaGVja2JveCc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDaGVja0JveExpc3RDb250cm9sU2NoZW1hKSByZXR1cm4gJ2NoZWNrYm94bGlzdCc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBSYWRpb0J1dHRvbkxpc3RDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAncmFkaW9idXR0b25saXN0JztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGaWxlVXBsb2FkQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5tb2RlID09IEZpbGVVcGxvYWRNb2RlLnVzaW5nRmlsZUluc3RhbmNlSWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnZmlsZVVwbG9hZCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3NlcnZpY2VGaWxlVXBsb2FkJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZpbGVNYW5hZ2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICdmaWxlTWFuYWdlcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb2xvclBpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnY29sb3JQaWNrZXInO1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29sb3JDb250cm9sU2NoZW1hKSByZXR1cm4gJ2NvbG9yQ29udHJvbCc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkgcmV0dXJuICd0YWJsZSc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHJldHVybiAnY29udGFpbmVyJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEJ1dHRvbkNvbnRyb2xTY2hlbWEpIHJldHVybiAnYnV0dG9uJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFZhbkJhblBpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAndmFuYmFuJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbmdWaWVjUGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICdjb25ndmllYyc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBQZXJjZW50Q29udHJvbFNjaGVtYSkgcmV0dXJuICdwZXJjZW50JztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENoaXBzQ29udHJvbFNjaGVtYSkgcmV0dXJuICdjaGlwcyc7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb2x1bW5TY2hlbWFCYXNlKSByZXR1cm4gJ2NvbHVtbic7XHJcbiAgICAgICAgcmV0dXJuICdjdXN0b20nO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRWaWV3TW9kZURhdGFUeXBlKGNvbnRyb2wpIHtcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRpdGxlU2NoZW1hKSByZXR1cm4gJ3RpdGxlJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIExhYmVsU2NoZW1hKSByZXR1cm4gJ2xhYmVsJztcclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBNYXNrQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ21hc2snO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZUNvbnRyb2wgPSA8RGF0ZVRpbWVDb250cm9sU2NoZW1hPmNvbnRyb2w7XHJcbiAgICAgICAgICAgIGlmIChkYXRlQ29udHJvbC5zaG93VGltZSkgcmV0dXJuICdkYXRldGltZSc7XHJcbiAgICAgICAgICAgIHJldHVybiAnZGF0ZSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRWRpdG9yQ29udHJvbFNjaGVtYSkgcmV0dXJuICdodG1sJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFVzZXJQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ3VzZXInO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgY29udHJvbCBpbnN0YW5jZW9mIFN3aXRjaENvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIENoZWNrYm94Q29udHJvbFNjaGVtYVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2Jvb2xlYW4nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGNvbnRyb2wgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIENoZWNrQm94TGlzdENvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIE9yZ2FuaXphdGlvblBpY2tlckNvbnRyb2xTY2hlbWFcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuICdoYXNEYXRhU291cmNlJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGaWxlVXBsb2FkQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5tb2RlID09IEZpbGVVcGxvYWRNb2RlLnVzaW5nRmlsZUluc3RhbmNlSWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnZmlsZVVwbG9hZCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2ZpbGVTZXJ2aWNlVXBsb2FkJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZpbGVNYW5hZ2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICdmaWxlTWFuYWdlcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBBZGRyZXNzQ29udHJvbFNjaGVtYSkgcmV0dXJuICdhZGRyZXNzJztcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0Q29udHJvbFNjaGVtYVxyXG4gICAgICAgICAgICAmJiAoY29udHJvbC5kYXRhRm9ybWF0ID09PSAnbW9uZXknXHJcbiAgICAgICAgICAgICAgICB8fCBjb250cm9sLmRhdGFGb3JtYXQgPT09ICdtb25leWludCcpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnbW9uZXknO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbG9yUGlja2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICdjb2xvclBpY2tlcic7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb2xvckNvbnRyb2xTY2hlbWEpIHJldHVybiAnY29sb3JDb250cm9sJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSByZXR1cm4gJ3RhYmxlJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEtleVZhbHVlQ29udHJvbFNjaGVtYSkgcmV0dXJuICdhcHAta2V5LXZhbHVlJztcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2NvbnRhaW5lcic7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gJ3N0cmluZyc7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdmFsaWRhdGVGb3JtKHNldFZhbGlkYXRlRm9ybSA9IHRydWUpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBpZiAoc2V0VmFsaWRhdGVGb3JtKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2luVmFsaWRGb3JtID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVNb2RlbCh0aGlzLl9yb290Tm9kZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pblZhbGlkRm9ybSkge1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c1RvRmlyc3RFcnJvckNvbnRyb2woKTtcclxuICAgICAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZU1vZGVsKGN1cnJlbnROb2RlOiBDb250cm9sVHJlZU5vZGUpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkTm9kZSBvZiBjdXJyZW50Tm9kZS5jaGlsZE5vZGVzKSB7XHJcbiAgICAgICAgICAgIGlmICghY2hpbGROb2RlLmNvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGUuY2hpbGROb2RlcyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja0hpZGRlbihjaGlsZE5vZGUuY29udHJvbCwgY2hpbGROb2RlLnBhcmVudE1vZGVsLCBjaGlsZE5vZGUuc2NoZW1hUGF0aCkpIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLnZhbGlkYXRlKGNoaWxkTm9kZSwgdHJ1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2luVmFsaWRGb3JtID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZU1vZGVsKGNoaWxkTm9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHZhbGlkYXRlRm9ybUNvbnRyb2woZmllbGRQYXRoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgY29uc3QgY29udHJvbE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKGZpZWxkUGF0aCk7XHJcbiAgICAgICAgaWYgKGNvbnRyb2xOb2RlKSB7XHJcbiAgICAgICAgICAgIGlmICghYXdhaXQgdGhpcy52YWxpZGF0ZShjb250cm9sTm9kZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBoYW5kbGVDaGFuZ2VEcm9wZG93bihjb250cm9sOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEsIGV2ZW50PywgZXZlbnRUeXBlPywgcGFyZW50TW9kZWw/LCBwYXJlbnRQYXRoPywgc291cmNlTm9kZT8sIGJ1YmJsZT8pIHtcclxuICAgICAgICBpZiAoY29udHJvbC5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09IHRoaXMuZXZlbnRUeXBlLkhJREUpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRmllbGRWYWx1ZUNoYW5nZShjb250cm9sLCBldmVudCwgdGhpcy5ldmVudFR5cGUuQ0hBTkdFLCBwYXJlbnRNb2RlbCwgcGFyZW50UGF0aCwgc291cmNlTm9kZSwgYnViYmxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGaWVsZFZhbHVlQ2hhbmdlKGNvbnRyb2wsIGV2ZW50LCBldmVudFR5cGUsIHBhcmVudE1vZGVsLCBwYXJlbnRQYXRoLCBzb3VyY2VOb2RlLCBidWJibGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIMSQ4buDIG5ndXnDqm4gaMOgbSBk4bqhbmcgYXJyb3cgZnVuY3Rpb24gdsOsIGPDsyAxIHPhu5EgZm9ybSBraMOhYyBn4buNaVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGFuZGxlRmllbGRWYWx1ZUNoYW5nZSA9IGFzeW5jIChjb250cm9sOiBGb3JtQ29udHJvbEJhc2UsIGV2ZW50PywgZXZlbnRUeXBlPywgcGFyZW50TW9kZWw/LCBwYXJlbnRQYXRoPywgc291cmNlTm9kZT8sIGJ1YmJsZT8pID0+IHtcclxuICAgICAgICBsZXQgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgbGV0IGN1cnJlbnROb2RlO1xyXG5cclxuICAgICAgICAvLyByb3cgaW4gdGFibGVcclxuICAgICAgICBpZiAoY29udHJvbCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgY29udHJvbCA9IGN1cnJlbnROb2RlLmNvbnRyb2w7XHJcbiAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIHBhcmVudE1vZGVsID0gcGFyZW50Tm9kZS5tb2RlbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGUoY29udHJvbC5maWVsZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB2YWx1ZSA9IGN1cnJlbnROb2RlLnZhbHVlO1xyXG5cclxuICAgICAgICAvLyBhdXRvIGNvcnJlY3QgdmFsdWVcclxuICAgICAgICB2YWx1ZSA9IHRoaXMuY29ycmVjdFZhbHVlKGN1cnJlbnROb2RlKTtcclxuICAgICAgICBjdXJyZW50Tm9kZS52YWx1ZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICAvLyB2YWxpZGF0ZSB2YWx1ZVxyXG4gICAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGUoY3VycmVudE5vZGUpO1xyXG5cclxuICAgICAgICBpZiAoIWJ1YmJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSxcclxuICAgICAgICAgICAgc291cmNlRXZlbnQ6IGV2ZW50LFxyXG4gICAgICAgICAgICBzb3VyY2VOb2RlOiBzb3VyY2VOb2RlIHx8IGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBldmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChjb250cm9sLm9uQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkNoYW5nZWQoZXZlbnREYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghYnViYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZU1vZGVsQ2hhbmdlZCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBhcmVudE5vZGUucGFyZW50Tm9kZSAhPSBudWxsICYmIHBhcmVudE5vZGUucGFyZW50Tm9kZSAhPSBwYXJlbnROb2RlLnJvb3ROb2RlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRmllbGRWYWx1ZUNoYW5nZShwYXJlbnROb2RlLmNvbnRyb2wsIGV2ZW50LCBldmVudFR5cGUsIHBhcmVudE5vZGUucGFyZW50Tm9kZS5tb2RlbCwgcGFyZW50Tm9kZS5wYXJlbnROb2RlLm1vZGVsUGF0aCwgc291cmNlTm9kZSB8fCBjdXJyZW50Tm9kZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZUNhY2hpbmcgJiYgY29udHJvbC5lbmFibGVDYWNoaW5nKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZUNvbnRyb2xWYWx1ZShjb250cm9sLCB2YWx1ZSwgcGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KGV2ZW50RGF0YSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXZlbnQga2hpIGRyb3Bkb3duIMSRaeG7gXUgY2jhu4luaCB2YWx1ZSB04burIHJhdyB2YWx1ZSBk4bqhbmcgZ3VpZCB8IGludCB8IC4uLiA9PiBvYmplY3Qga2nhu4N1IHt2YWx1ZTogZ3VpZCB8IGludCB8IC4uLiwgLi4uIFsxIHPhu5EgdHLGsOG7nW5nIGtow6FjXX1cclxuICAgICAqIEBwYXJhbSBjb250cm9sXHJcbiAgICAgKiBAcGFyYW0gcGFyZW50UGF0aFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlQWRqdXN0VmFsdWVEcm9wZG93bkV2ZW50KGNvbnRyb2w6IERyb3Bkb3duQ29udHJvbFNjaGVtYSB8IFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWEsIHBhcmVudFBhdGg/KSB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZShjb250cm9sLmZpZWxkKTtcclxuICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgIGV2ZW50VHlwZTogdGhpcy5ldmVudFR5cGUuQURKVVNUX1ZBTFVFLFxyXG4gICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoY29udHJvbC5vbkFkanVzdGVkVmFsdWUpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25BZGp1c3RlZFZhbHVlKGV2ZW50RGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGVEYXRhU291cmNlTG9hZENvbXBsZXRlKGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZVdpdGhTZXJ2aWNlLCBwYXJlbnRQYXRoLCBkYXRhU291cmNlKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGVEYXRhU291cmNlTG9hZGVkKGNvbnRyb2w6IERyb3Bkb3duQ29udHJvbFNjaGVtYSwgcGFyZW50UGF0aCwgZGF0YUZyb21Ecm9wZG93bjogYW55KSB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZShjb250cm9sLmZpZWxkKTtcclxuICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ2RhdGFTb3VyY2VMb2FkZWQnLFxyXG4gICAgICAgICAgICBjcnVkRm9ybTogdGhpcyxcclxuICAgICAgICAgICAgZGF0YTogZGF0YUZyb21Ecm9wZG93bi5yYXdEYXRhU291cmNlID8gZGF0YUZyb21Ecm9wZG93bi5yYXdEYXRhU291cmNlIDogZGF0YUZyb21Ecm9wZG93bi5kYXRhU291cmNlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZXZlbnREYXRhWydlbG0nXSA9IGRhdGFGcm9tRHJvcGRvd24uZWxtO1xyXG4gICAgICAgIGlmICh0aGlzLmZvcm1TdGF0ZSA9PSBGb3JtU3RhdGUuQUREXHJcbiAgICAgICAgICAgICYmIGNvbnRyb2wuYXV0b0Rpc3BsYXlGaXJzdFxyXG4gICAgICAgICAgICAmJiBldmVudERhdGEuZGF0YS5sZW5ndGggPiAwXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXSB8fCAhdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2wuZmllbGRdLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXSA9IFtldmVudERhdGEuZGF0YVswXVtjb250cm9sLnZhbHVlRmllbGRdXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2wuZmllbGRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2wuZmllbGRdID0gZXZlbnREYXRhLmRhdGFbMF1bY29udHJvbC52YWx1ZUZpZWxkXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbC5jYWxsYmFja0RhdGFGaW5pc2gpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wuY2FsbGJhY2tEYXRhRmluaXNoKGV2ZW50RGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZmlyZU1vZGVsQ2hhbmdlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGhhbmRsZVJlYWR5Q29udHJvbFBpY2tlcihjb250cm9sOiBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hIHwgVXNlclBpY2tlckNvbnRyb2xTY2hlbWEgfCBDb0NhdVRvQ2h1Y1BpY2tlckNvbnRyb2xTY2hlbWEsIHBhcmVudFBhdGg/KSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVDb250cm9sUmVhZHlFdmVudChjb250cm9sLCBwYXJlbnRQYXRoKTtcclxuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKTtcclxuICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlKGNvbnRyb2wuZmllbGQpO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSxcclxuICAgICAgICAgICAgZXZlbnRUeXBlOiB0aGlzLmV2ZW50VHlwZS5SRUFEWSxcclxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoY29udHJvbC5vblJlYWR5KSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uUmVhZHkoZXZlbnREYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlTG9hZGVkQ29udHJvbChfY29tcG9uZW50OiBhbnksIGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSwgcGFyZW50UGF0aD8pIHtcclxuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKTtcclxuICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlKGNvbnRyb2wuZmllbGQpO1xyXG4gICAgICAgIGlmIChfY29tcG9uZW50ICYmIGN1cnJlbnROb2RlKSB7XHJcbiAgICAgICAgICAgIF9jb21wb25lbnQuY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZTtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUuY29tcG9uZW50ID0gX2NvbXBvbmVudDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZUNvbnRyb2xSZWFkeUV2ZW50KGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSwgcGFyZW50UGF0aD8pIHtcclxuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKTtcclxuICAgICAgICBwYXJlbnROb2RlLm1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMub25Db250cm9sUmVhZHkuZW1pdChjb250cm9sLmZpZWxkKTtcclxuICAgICAgICBpZiAodGhpcy5fbW9kZWxEYXRhW0tleUZsYXNoU2hvd10pIHtcclxuICAgICAgICAgICAgaWYgKHBhcmVudFBhdGgpIHsgLy8gxJBv4bqhbiBjb2RlIHRyb25nIGJsb2NrIGlmIG7DoHkgY2jGsGEgY2h14bqpbiwgdOG6oW0gdGjhu51pIGNvZGUgdGjhur8gxJHhur9uIGtoaSBn4bq3cCBjYXNlIG7DoHkgdGjDrCB4ZW0gbOG6oWkgc2F1XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWR5U3RhdHVzW2Ake3BhcmVudFBhdGh9LiR7Y29udHJvbC5maWVsZH1gXSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWR5U3RhdHVzW2Ake2NvbnRyb2wuZmllbGR9YF0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tDYW5QcmludCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjaGVja0NhblByaW50KCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9tb2RlbERhdGFbS2V5Rmxhc2hTaG93XSAmJiB0aGlzLmNhblByaW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMud2FpdFJlYWR5QW5kUHJpbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgd2FpdFJlYWR5QW5kUHJpbnQoKSB7XHJcbiAgICAgICAgY29uc3QgcmVhZHlBbGwgPSB0aGlzLmNoZWNrUmVhZHlBbGwoKTtcclxuICAgICAgICBpZiAodGhpcy53YWl0UmVhZHlBbmRQcmludFRpbWVvdXQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMud2FpdFJlYWR5QW5kUHJpbnRUaW1lb3V0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlYWR5QWxsKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9tb2RlbERhdGFbS2V5Rmxhc2hTaG93XTtcclxuICAgICAgICAgICAgdGhpcy5fbWluaW1pemVkRGF0YSA9IHRoaXMuZ2V0TWluaW1pemVEYXRhKHRoaXMuX21vZGVsRGF0YSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByaW50UGRmQnlTY2hlbWEodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLCB0aGlzLl9taW5pbWl6ZWREYXRhLCB0aGlzLnNldHRpbmcuc2NoZW1hKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4ocmVzID0+IHRoaXMuaGFuZGxlUmVzcG9uc2UocmVzLCAnJywgZiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dTdWNjZXNzKCdU4bqhbyBmaWxlIHRow6BuaCBjw7RuZycpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21pbmltaXplZERhdGEucHJpbnRGaWxlSWQgPSByZXMuZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9taW5pbWl6ZWREYXRhID0gdGhpcy5fY29tbW9uU2VydmljZS5jbG9uZU9iamVjdCh0aGlzLl9taW5pbWl6ZWREYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVXYWl0Qm94KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52aXJvbm1lbnQgPSB0aGlzLl9tb2R1bGVDb25maWcuZ2V0Q29uZmlnKCkuZW52aXJvbm1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYmFzZVRyaW5oS3koZW52aXJvbm1lbnQsIHRoaXMuc2V0dGluZywgdGhpcy5fbW9kZWxEYXRhLCByZXMuZGF0YSwgdGhpcy5fbm90aWZpZXJTZXJ2aWNlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25BZnRlclRyaW5oS3kuZW1pdCgpO1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy53YWl0UmVhZHlBbmRQcmludFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMud2FpdFJlYWR5QW5kUHJpbnQoKTtcclxuICAgICAgICAgICAgfSwgMTAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRNb2RlbFRhYmxlU2NoZW1hQnlDaGlsZFNjaGVtYShjb250cm9sOiBGb3JtQ29udHJvbEJhc2UpIHtcclxuICAgICAgICBjb25zdCBjb250cm9sVGFibGUgPSB0aGlzLmZvcm1Db250cm9sc1tjb250cm9sW3RoaXMuZmllbGRQYXJlbnRGaWVsZF1dO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tb2RlbERhdGFbY29udHJvbFRhYmxlLmZpZWxkXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrUmVhZHlBbGwoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuY29udHJvbE5lZWRDaGVja1JlYWR5KSB7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLmhpZGRlbiB8fCAhdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2wuZmllbGRdKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRGaWVsZCA9IGNvbnRyb2xbdGhpcy5maWVsZFBhcmVudEZpZWxkXTtcclxuICAgICAgICAgICAgLy8gTuG6v3UgbMOgIGZpZWxkIHRyb25nIHRhYmxlIHNjaGVtYVxyXG4gICAgICAgICAgICBpZiAocGFyZW50RmllbGQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFyck1vZGVsQ3VuZ0xldmVsID0gdGhpcy5nZXRNb2RlbFRhYmxlU2NoZW1hQnlDaGlsZFNjaGVtYShjb250cm9sKTtcclxuICAgICAgICAgICAgICAgIGlmIChhcnJNb2RlbEN1bmdMZXZlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyTW9kZWxDdW5nTGV2ZWwubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnJlYWR5U3RhdHVzW2Ake3BhcmVudEZpZWxkfVske2l9XS4ke2NvbnRyb2wuZmllbGR9YF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICghdGhpcy5yZWFkeVN0YXR1c1tgJHtjb250cm9sLmZpZWxkfWBdKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlTW9kZWxGcm9tRXh0ZXJuYWwgPSAoKSA9PiB7XHJcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKHRoaXMuX21vZGVsRGF0YSwgY29udHJvbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZmlyZU1vZGVsQ2hhbmdlZCgpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBQaOG6o2kgxJHhu4MgYXJyb3cgZnVuY3Rpb24gdsOsIGPDsyBleHBvcnQgcmEgY2hvIG3hu5l0IHPhu5EgdGVtcGxhdGUgc+G7rSBk4bulbmdcclxuICAgIGZpcmVNb2RlbENoYW5nZWQgPSAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fbWluaW1pemVkRGF0YSA9IHRoaXMuZ2V0TWluaW1pemVEYXRhKHRoaXMuX21vZGVsRGF0YSk7XHJcbiAgICAgICAgdGhpcy5kYXRhQ2hhbmdlLmVtaXQodGhpcy5fbWluaW1pemVkRGF0YSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHB1YmxpYyBoYW5kbGVCdXR0b25DbGljayhjb250cm9sOiBCdXR0b25Db250cm9sU2NoZW1hLCBldmVudCwgcGFyZW50UGF0aCkge1xyXG4gICAgICAgIGlmIChjb250cm9sLm9uQ2xpY2spIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wub25DbGljayhuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKSxcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiB0aGlzLmV2ZW50VHlwZS5DTElDSyxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvcnJlY3RWYWx1ZShjdXJyZW50Tm9kZTogQ29udHJvbFRyZWVOb2RlKSB7XHJcbiAgICAgICAgbGV0IHJlID0gY3VycmVudE5vZGUudmFsdWU7XHJcbiAgICAgICAgY29uc3QgY29udHJvbCA9IGN1cnJlbnROb2RlLmNvbnRyb2w7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgJiYgY29udHJvbC5jb3JyZWN0b3JzICYmIGNvbnRyb2wuY29ycmVjdG9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udHJvbC5jb3JyZWN0b3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb3JyZWN0b3IgPSBjb250cm9sLmNvcnJlY3RvcnNbaV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRoaXMuZXZlbnRUeXBlLkFVVE9fQ09SUkVDVCxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlID0gY29ycmVjdG9yLmNvcnJlY3QoZXZlbnREYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdHJ1ZSBsw6AgdGjhu49hIG3Do24sIGZhbHNlIGzDoCBraMO0bmcgdGjhu49hIG3Do24gKOG7niBj4bqlcCBoaeG7h24gdOG6oWkgY2jhu6kgY2jGsGEga2nhu4NtIHRyYSBj4bqlcCBjb24pXHJcbiAgICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlKGN1cnJlbnROb2RlOiBDb250cm9sVHJlZU5vZGUsIGZvcmNlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICBjb25zdCBjb250cm9sID0gY3VycmVudE5vZGUuY29udHJvbDtcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYVxyXG4gICAgICAgICAgICB8fCBjb250cm9sIGluc3RhbmNlb2YgUmFkaW9CdXR0b25MaXN0Q29udHJvbFNjaGVtYVxyXG4gICAgICAgICAgICB8fCBjb250cm9sIGluc3RhbmNlb2YgQWRkcmVzc0NvbnRyb2xTY2hlbWFcclxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIEZpbGVNYW5hZ2VyQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoIWZvcmNlICYmICFwYXJlbnROb2RlLm1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY29udHJvbCkge1xyXG4gICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlLm1vZGVsLl9lcnJvcnNbY3VycmVudE5vZGUuZmllbGRdO1xyXG4gICAgICAgICAgICBpZiAoIWVycm9ycykgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIGVycm9ycy5zcGxpY2UoMCwgZXJyb3JzLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLnZhbGlkYXRvcnMgJiYgY29udHJvbC52YWxpZGF0b3JzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udHJvbC52YWxpZGF0b3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gY29udHJvbC52YWxpZGF0b3JzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiB0aGlzLmV2ZW50VHlwZS5WQUxJREFURSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXdhaXQgdmFsaWRhdG9yLnZhbGlkYXRlKGV2ZW50RGF0YSkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSB2YWxpZGF0b3IuZ2V0RXJyb3IoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcnMuaW5kZXhPZihlcnIpID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwcml2YXRlIF9zZXRFcnJvcihmaWVsZDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKSB7XHJcbiAgICAvLyAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgoZmllbGQpO1xyXG4gICAgLy8gICAgIGlmIChub2RlID09IG51bGwpIHtcclxuICAgIC8vICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdUcsaw4budbmcgZOG7ryBsaeG7h3Uga2jDtG5nIHThu5NuIHThuqFpJyk7XHJcbiAgICAvLyAgICAgICAgIHJldHVybjtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgY29uc3QgZXJyb3JzID0gbm9kZS5wYXJlbnROb2RlLm1vZGVsLl9lcnJvcnNbbm9kZS5maWVsZF07XHJcbiAgICAvLyAgICAgZXJyb3JzLnB1c2goZXJyb3IpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIHNldEVycm9yKGZpZWxkOiBzdHJpbmcgfCBzdHJpbmdbXSwgZXJyb3I6IHN0cmluZykge1xyXG4gICAgLy8gICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkKSlcclxuICAgIC8vICAgICAgICAgZmllbGQuZm9yRWFjaChpdGVtID0+IHRoaXMuX3NldEVycm9yKGl0ZW0sIGVycm9yKSk7XHJcbiAgICAvLyAgICAgZWxzZVxyXG4gICAgLy8gICAgICAgICB0aGlzLl9zZXRFcnJvcihmaWVsZCwgZXJyb3IpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHByaXZhdGUgY2FjaGVDb250cm9sVmFsdWUoY29udHJvbCwgdmFsdWUsIHBhcmVudFBhdGgpIHtcclxuICAgICAgICBpZiAoY29udHJvbCAmJiBjb250cm9sLmVuYWJsZUNhY2hpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWNoZWRWYWx1ZXNbcGFyZW50UGF0aCArICcuJyArIGNvbnRyb2wuZmllbGRdID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldENvbXBvbmVudEJ5VHlwZSh0ZW1wbGF0ZU5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIGlmICghdGhpcy50ZW1wbGF0ZXNbdGVtcGxhdGVOYW1lXSkge1xyXG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlc1t0ZW1wbGF0ZU5hbWVdID0gdGhpcy5fY29tbW9uU2VydmljZS5maW5kVGVtcGxhdGVGcm9tTGlzdCh0aGlzLmNoaWxkcmVuLCB0ZW1wbGF0ZU5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZXNbdGVtcGxhdGVOYW1lXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0SXRlbUluQXJyYXlCeVZhbHVlKGFycmF5LCB2LCBjb250cm9sKSB7XHJcbiAgICAgICAgaWYgKHYgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBmdW5jR2V0TGFiZWwgPSBjb250cm9sLmZ1bmNHZXRMYWJlbDtcclxuICAgICAgICBpZiAoZnVuY0dldExhYmVsID09IG51bGwpIHtcclxuICAgICAgICAgICAgZnVuY0dldExhYmVsID0gaXRlbSA9PiBpdGVtW2NvbnRyb2wuZGlzcGxheUZpZWxkXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFycmF5IGluc3RhbmNlb2YgQXJyYXkgJiYgYXJyYXkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgdkFyciA9IHY7XHJcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2KSkge1xyXG4gICAgICAgICAgICAgICAgdkFyciA9IHYudG9TdHJpbmcoKS5zcGxpdCgnLCcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodkFyci5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBhcnJheS5maW5kKHggPT4geFtjb250cm9sLnZhbHVlRmllbGRdID09IHYpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY0dldExhYmVsKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHZBcnIubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5LmZpbHRlcihwID0+IHZBcnIuc29tZShxID0+IHEgPT0gcFtjb250cm9sLnZhbHVlRmllbGRdKSlcclxuICAgICAgICAgICAgICAgICAgICAubWFwKGl0ZW0gPT4gZnVuY0dldExhYmVsKGl0ZW0pKVxyXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcsJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRJdGVtSW5BcnJheUJ5VGV4dFZhbHVlKGFycmF5LCB2KSB7XHJcbiAgICAgICAgaWYgKHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2ID09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGFycmF5IGluc3RhbmNlb2YgQXJyYXlcclxuICAgICAgICAgICAgJiYgYXJyYXkubGVuZ3RoID4gMFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm4gdi5qb2luKCc7ICcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFkZHJlc3NEaXNwbGF5VGV4dChzZWxlY3RlZFZhbHVlKSB7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldExhYmVsQ2xhc3MoY29udHJvbCkge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBgbGFiZWwtY29udHJvbGA7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuaW5kZXhMYWJlbCkge1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gJyBoYXZlSW5kZXgnO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2Nyb2xsVG9WaWV3KGVsZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNNb2JpbGUoKSkge1xyXG4gICAgICAgICAgICBpZiAoZWxlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaDE6IGFueSA9IGVsZS5jbG9zZXN0KCdkaXZbaWQkPVxcJy1ob2xkZXJcXCddJyk7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoaDEgJiYgaDEucHJldmlvdXNTaWJsaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaDEgPSBoMS5wcmV2aW91c1NpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGgxLnRhZ05hbWUgPT09ICdESVYnKSBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaDEgJiYgaDEuc2Nyb2xsSW50b1ZpZXcpIGgxLnNjcm9sbEludG9WaWV3KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAtIFNldCBGb2N1cyBjb250cm9sXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xyXG4gICAgICovXHJcblxyXG4gICAgcHJpdmF0ZSBmb2N1c0ZpcnN0Q29udHJvbCgpIHtcclxuICAgICAgICBjb25zdCBmb3JtRWxlbWVudCA9IHRoaXMuZm9ybUVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBjb25zdCBkaXZzID0gZm9ybUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGl2LmNydWQtZm9ybS1jb250cm9sJyk7XHJcbiAgICAgICAgaWYgKGRpdnMpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBkaXYgb2YgZGl2cykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdERpdkhvbGRlciA9IGRpdjtcclxuICAgICAgICAgICAgICAgIGxldCBmaXJzdENvbnRyb2wgPSB0aGlzLmZpcnN0RGl2SG9sZGVyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Om5vdChbdHlwZT1maWxlXSk6bm90KFt0eXBlPWhpZGRlbl0pJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1ZpZXcoZmlyc3RDb250cm9sKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCA9IHRoaXMuZmlyc3REaXZIb2xkZXIucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCAmJiBmaXJzdENvbnRyb2wuaWQuaW5kZXhPZigndGlueS1hbmd1bGFyJykgIT0gMFxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCA9IHRoaXMuZmlyc3REaXZIb2xkZXIucXVlcnlTZWxlY3RvcignaWZyYW1lJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeShmaXJzdENvbnRyb2wpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnRzKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnYm9keScpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBkZXByZWNhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGlueW1jZS1mb2N1cydcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZm9jdXNUb0ZpcnN0RXJyb3JDb250cm9sKCkge1xyXG4gICAgICAgIGNvbnN0IGZvcm1FbGVtZW50ID0gdGhpcy5mb3JtRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdG9yID0gYGRpdi5lcnJvcmA7XHJcbiAgICAgICAgY29uc3QgZGl2SG9sZGVyID0gZm9ybUVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XHJcbiAgICAgICAgaWYgKGRpdkhvbGRlcikge1xyXG4gICAgICAgICAgICBsZXQgZmlyc3RDb250cm9sID0gZGl2SG9sZGVyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XHJcbiAgICAgICAgICAgIGlmIChmaXJzdENvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1ZpZXcoZmlyc3RDb250cm9sKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCA9IGRpdkhvbGRlci5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCAmJiBmaXJzdENvbnRyb2wuaWQuaW5kZXhPZigndGlueS1hbmd1bGFyJykgIT0gMFxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wgPSBkaXZIb2xkZXIucXVlcnlTZWxlY3RvcignaWZyYW1lJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoZmlyc3RDb250cm9sKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnRzKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCdib2R5JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogZGVwcmVjYXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RpbnltY2UtZm9jdXMnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwcmV2ZW50Qmx1cihldmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLnRyYXBGb2N1cykge1xyXG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0LnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIHdoaWxlICh0YXJnZXQgfHwgdGFyZ2V0LnRhZ05hbWUgPT0gJ0ZPUk0nKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmlkLmVuZHNXaXRoKCctaG9sZGVyJykpIHtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0ID09IHRoaXMuZmlyc3REaXZIb2xkZXIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0Q29udHJvbCA9IHRhcmdldC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29udHJvbCA9PSBldmVudC50YXJnZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc1Zpc2libGUoZWxlbSkge1xyXG4gICAgICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKTtcclxuICAgICAgICBpZiAoc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKHN0eWxlLnZpc2liaWxpdHkgIT09ICd2aXNpYmxlJykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmICgrc3R5bGUub3BhY2l0eSA8IDAuMSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgZWxlbS5vZmZzZXRXaWR0aFxyXG4gICAgICAgICAgICArIGVsZW0ub2Zmc2V0SGVpZ2h0XHJcbiAgICAgICAgICAgICsgZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcclxuICAgICAgICAgICAgKyBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoXHJcbiAgICAgICAgICAgID09PSAwXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxlbUNlbnRlciA9IHtcclxuICAgICAgICAgICAgeDogZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgZWxlbS5vZmZzZXRXaWR0aCAvIDIsXHJcbiAgICAgICAgICAgIHk6IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgZWxlbS5vZmZzZXRIZWlnaHQgLyAyXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbGV0IHBvaW50Q29udGFpbmVyID0gPGFueT4oXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZWxlbUNlbnRlci54LCBlbGVtQ2VudGVyLnkpXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAocG9pbnRDb250YWluZXIpIHtcclxuICAgICAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHBvaW50Q29udGFpbmVyID09PSBlbGVtKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uZGl0aW9uYWwtYXNzaWdubWVudFxyXG4gICAgICAgICAgICB9IHdoaWxlICgocG9pbnRDb250YWluZXIgPSBwb2ludENvbnRhaW5lci5wYXJlbnROb2RlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlUm93KGluZGV4LCBjb250cm9sOiBUYWJsZVNjaGVtYSwgdGFibGVQYXRoKSB7XHJcbiAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dEZWxldGVDb25maXJtKCkudGhlbihhc3luYyBycyA9PiB7XHJcbiAgICAgICAgICAgIGlmICghcnMpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3QgdGFibGVOb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aCh0YWJsZVBhdGgpO1xyXG4gICAgICAgICAgICBjb25zdCB0b0RlbGV0ZVJvd05vZGUgPSB0YWJsZU5vZGUuY2hpbGROb2Rlc1tpbmRleF07XHJcblxyXG4gICAgICAgICAgICBsZXQgdG9EZWxldGUgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkRlbGV0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0b0RlbGV0ZSA9IGNvbnRyb2wub25EZWxldGluZyhuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IHRvRGVsZXRlUm93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRoaXMuZXZlbnRUeXBlLkRFTEVUSU5HLFxyXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRvRGVsZXRlICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgdGFibGVOb2RlLm1vZGVsLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICB0YWJsZU5vZGUucmVpbml0Q2hpbGROb2RlcygpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZU1vZGVsQ2hhbmdlZCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLm9uQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25DaGFuZ2VkKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IHRvRGVsZXRlUm93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogdGhpcy5ldmVudFR5cGUuVEFCTEVfQ0hBTkdFRCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5vbkRlbGV0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uRGVsZXRlZChuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiB0b0RlbGV0ZVJvd05vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRoaXMuZXZlbnRUeXBlLkRFTEVURUQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgYWRkTmV3Um93KFxyXG4gICAgICAgIGNvbnRyb2w6IFRhYmxlU2NoZW1hLCB0YWJsZVBhdGgsIGV2ZW50VHlwZT8sIGRpc2FibGVPcGVuRGlhbG9nOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICAgICAgaW5pdERhdGE6IGFueSA9IHt9LCBmaXJlRXZlbnRGaW5pc2ggPSB0cnVlXHJcbiAgICApIHtcclxuICAgICAgICBpZiAoY29udHJvbC5zaG93RWRpdCAmJiAhZGlzYWJsZU9wZW5EaWFsb2cpIHtcclxuICAgICAgICAgICAgdGhpcy50YWJsZUZvcm1UaXRsZSA9IGBUaMOqbSBt4bubaSAke2NvbnRyb2wubGFiZWx9YDtcclxuICAgICAgICAgICAgdGhpcy50YWJsZUZvcm1TY2hlbWEgPSBjb250cm9sLnJvd1RlbXBsYXRlO1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybVBvcHVwU2l6ZSA9IGNvbnRyb2wucG9wdXBTaXplO1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybUN1cnJlbnRSb3cgPSAtMTtcclxuICAgICAgICAgICAgdGhpcy50YWJsZUZvcm1EYXRhID0ge307XHJcbiAgICAgICAgICAgIHRoaXMudGFibGVGb3JtQ3VycmVudEluZm8gPSB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLFxyXG4gICAgICAgICAgICAgICAgdGFibGVQYXRoLFxyXG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMudGFibGVGb3JtU2hvdyA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdGFibGVOb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aCh0YWJsZVBhdGgpO1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGFibGVOb2RlLmNoaWxkTm9kZXMubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSB0YWJsZVBhdGggKyAnWycgKyBpbmRleCArICddJztcclxuICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSBpbml0RGF0YTtcclxuICAgICAgICBpZiAoY29udHJvbC5hdXRvR2VuZXJhdGVJZCAmJiAhaW5pdERhdGEuaWQpIHtcclxuICAgICAgICAgICAgZGF0YS5pZCA9IHRoaXMuX2NvbW1vblNlcnZpY2UuZ3VpZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUaMOqbSBpZCDEkeG7gyBuZ8SDbiByZW5kZXIgbGnDqm4gdOG7pWNcclxuICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5yb3dUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRDb250cm9sRGVmYXVsdFZhbHVlKGRhdGEsIHN1YkNvbnRyb2wsIHBhcmVudFBhdGgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRvQWRkID0gdHJ1ZTtcclxuICAgICAgICBpZiAoY29udHJvbC5vbkFkZGluZykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdG9BZGQgPSBjb250cm9sLm9uQWRkaW5nKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSB8fCB0aGlzLmV2ZW50VHlwZS5BRERJTkcsXHJcbiAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICB0b0FkZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodG9BZGQgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRhYmxlTm9kZS5tb2RlbC5wdXNoKGRhdGEpO1xyXG4gICAgICAgICAgICB0YWJsZU5vZGUucmVpbml0Q2hpbGROb2RlcyhmaXJlRXZlbnRGaW5pc2gpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSAhPSB0aGlzLmV2ZW50VHlwZS5JTklUKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgbmV3Um93Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm9uQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQ2hhbmdlZChuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogbmV3Um93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgdGhpcy5ldmVudFR5cGUuVEFCTEVfQ0hBTkdFRCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLm9uQWRkZWQpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkFkZGVkKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBuZXdSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSB8fCB0aGlzLmV2ZW50VHlwZS5BRERFRCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZE11bHRpUm93KGNvbnRyb2wsIGxlbmd0aCwgdGFibGVQYXRoLCBldmVudFR5cGU/KSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLmFkZE5ld1Jvdyhjb250cm9sLCB0YWJsZVBhdGgsIGV2ZW50VHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGhhbmRsZVNhdmVkVGFibGVSb3coZGF0YSkge1xyXG4gICAgICAgIHRoaXMudGFibGVGb3JtU2hvdyA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLnRhYmxlRm9ybUN1cnJlbnRJbmZvLmNvbnRyb2w7XHJcbiAgICAgICAgY29uc3QgdGFibGVQYXRoID0gdGhpcy50YWJsZUZvcm1DdXJyZW50SW5mby50YWJsZVBhdGg7XHJcbiAgICAgICAgY29uc3QgZXZlbnRUeXBlID0gdGhpcy50YWJsZUZvcm1DdXJyZW50SW5mby5ldmVudFR5cGU7XHJcbiAgICAgICAgY29uc3QgdGFibGVOb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aCh0YWJsZVBhdGgpO1xyXG4gICAgICAgIGlmICh0aGlzLnRhYmxlRm9ybUN1cnJlbnRSb3cgPiAtMSkge1xyXG4gICAgICAgICAgICB0YWJsZU5vZGUubW9kZWxbdGhpcy50YWJsZUZvcm1DdXJyZW50Um93XSA9IHsgLi4udGFibGVOb2RlLm1vZGVsW3RoaXMudGFibGVGb3JtQ3VycmVudFJvd10sIC4uLmRhdGEgfTtcclxuICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0YWJsZU5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSB0YWJsZVBhdGggKyAnWycgKyBpbmRleCArICddJztcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xNb2RlbChkYXRhLCBzdWJDb250cm9sLCBwYXJlbnRQYXRoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHRvQWRkID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wub25BZGRpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9BZGQgPSBjb250cm9sLm9uQWRkaW5nKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSB8fCB0aGlzLmV2ZW50VHlwZS5BRERJTkcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvQWRkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0b0FkZCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHRhYmxlTm9kZS5tb2RlbC5wdXNoKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgdGFibGVOb2RlLnJlaW5pdENoaWxkTm9kZXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRUeXBlICE9IHRoaXMuZXZlbnRUeXBlLklOSVQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdSb3dOb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKTtcclxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLm9uQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25DaGFuZ2VkKG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IG5ld1Jvd05vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSB8fCB0aGlzLmV2ZW50VHlwZS5UQUJMRV9DSEFOR0VELFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLm9uQWRkZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQWRkZWQobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogbmV3Um93Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlIHx8IHRoaXMuZXZlbnRUeXBlLkFEREVELFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzYXZlUm93KGluZGV4LCBjb250cm9sOiBUYWJsZVNjaGVtYSwgdGFibGVQYXRoKSB7XHJcbiAgICAgICAgY29uc3QgdGFibGVOb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aCh0YWJsZVBhdGgpO1xyXG4gICAgICAgIGNvbnN0IGN1cmVudFJvd05vZGUgPSB0YWJsZU5vZGUuY2hpbGROb2Rlc1tpbmRleF07XHJcbiAgICAgICAgaWYgKGNvbnRyb2wub25TYXZlKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uU2F2ZShuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IGN1cmVudFJvd05vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiB0aGlzLmV2ZW50VHlwZS5TQVZFLFxyXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVkaXRSb3coaW5kZXgsIGNvbnRyb2w6IFRhYmxlU2NoZW1hLCB0YWJsZVBhdGgpIHtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybVRpdGxlID0gYFPhu61hICR7Y29udHJvbC5sYWJlbH1gO1xyXG4gICAgICAgIHRoaXMudGFibGVGb3JtU2NoZW1hID0gY29udHJvbC5yb3dUZW1wbGF0ZTtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybUN1cnJlbnRSb3cgPSBpbmRleDtcclxuICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHRhYmxlUGF0aCk7XHJcbiAgICAgICAgY29uc3QgdG9EZWxldGVSb3dOb2RlID0gdGFibGVOb2RlLmNoaWxkTm9kZXNbaW5kZXhdO1xyXG4gICAgICAgIHRoaXMudGFibGVGb3JtRGF0YSA9IHRvRGVsZXRlUm93Tm9kZS52YWx1ZTtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybUN1cnJlbnRJbmZvID0ge1xyXG4gICAgICAgICAgICBjb250cm9sLFxyXG4gICAgICAgICAgICB0YWJsZVBhdGgsXHJcbiAgICAgICAgICAgIGluZGV4XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnRhYmxlRm9ybVNob3cgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGVSb3dPcmRlcmVkKGNvbnRyb2w6IFRhYmxlU2NoZW1hLCBldnQsIGV2ZW50VHlwZT8sIHBhcmVudE1vZGVsPywgcGFyZW50UGF0aD8sIHNvdXJjZU5vZGU/LCBidWJibGU/KSB7XHJcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGxldCBjdXJyZW50Tm9kZTtcclxuXHJcbiAgICAgICAgLy8gcm93IGluIHRhYmxlXHJcbiAgICAgICAgaWYgKGNvbnRyb2wgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIGNvbnRyb2wgPSBjdXJyZW50Tm9kZS5jb250cm9sO1xyXG4gICAgICAgICAgICBwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICBwYXJlbnRNb2RlbCA9IHBhcmVudE5vZGUubW9kZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlKGNvbnRyb2wuZmllbGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdmFsdWUgPSBjdXJyZW50Tm9kZS52YWx1ZTtcclxuXHJcbiAgICAgICAgLy8gYXV0byBjb3JyZWN0IHZhbHVlXHJcbiAgICAgICAgdmFsdWUgPSB0aGlzLmNvcnJlY3RWYWx1ZShjdXJyZW50Tm9kZSk7XHJcbiAgICAgICAgY3VycmVudE5vZGUudmFsdWUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLFxyXG4gICAgICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsXHJcbiAgICAgICAgICAgIHNvdXJjZU5vZGU6IHNvdXJjZU5vZGUgfHwgY3VycmVudE5vZGUsXHJcbiAgICAgICAgICAgIGV2ZW50VHlwZSxcclxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoY29udHJvbC5vblJlb3JkZXJlZCkge1xyXG4gICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uUmVvcmRlcmVkKGV2ZW50RGF0YSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWJ1YmJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KGV2ZW50RGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2hvd0NvbnRleHRNZW51KGV2dCwgcm93RGF0YSwgY29udHJvbDogVGFibGVTY2hlbWEpIHtcclxuICAgICAgICB0aGlzLnJvd0RhdGFDdXJyZW50ID0gcm93RGF0YTtcclxuICAgICAgICB0aGlzLmJ1dHRvbkNvbnRleHRzID0gYXdhaXQgY29udHJvbC5yb3dCdXR0b25zKHJvd0RhdGEpO1xyXG4gICAgICAgIGlmICghdGhpcy5idXR0b25Db250ZXh0cyB8fCB0aGlzLmJ1dHRvbkNvbnRleHRzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fc2hvd0NvbnRleHRNZW51KGV2dCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfc2hvd0NvbnRleHRNZW51KGV2dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dE1lbnUuc2hvdyhldnQpO1xyXG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbWVzc2FnZVJvdyhpbmRleCwgY29udHJvbDogVGFibGVTY2hlbWEsIHRhYmxlUGF0aCkge1xyXG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgodGFibGVQYXRoKTtcclxuICAgICAgICBjb25zdCBjdXJlbnRSb3dOb2RlID0gdGFibGVOb2RlLmNoaWxkTm9kZXNbaW5kZXhdO1xyXG4gICAgICAgIGlmIChjb250cm9sLm9uTWVzc2FnZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5vbk1lc3NhZ2UobmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBjdXJlbnRSb3dOb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogdGhpcy5ldmVudFR5cGUuTUVTU0FHRSxcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VGFibGVGdW5jdGlvbkNvbHVtbldpZHRoKGNvbnRyb2w6IFRhYmxlU2NoZW1hKSB7XHJcbiAgICAgICAgbGV0IG5lID0gNTA7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuc2hvd0RlbGV0ZSkgbmUgKz0gMzA7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuc2hvd0VkaXQpIG5lICs9IDMwO1xyXG4gICAgICAgIGlmIChjb250cm9sLnNob3dTYXZlKSBuZSArPSAzMDtcclxuICAgICAgICBpZiAoY29udHJvbC5yb3dCdXR0b25zKSBuZSArPSAzMDtcclxuICAgICAgICByZXR1cm4gbmUgKyAncHgnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNYXNrQnlUeXBlKG1hc2tUeXBlKSB7XHJcbiAgICAgICAgaWYgKG1hc2tUeXBlID09ICdkZWNpbWFsJykge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2RvdF9zZXBhcmF0b3IuNSc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRUZXh0QWxpZ24odGV4dEFsaWduOiBudW1iZXIpIHtcclxuICAgICAgICBzd2l0Y2ggKHRleHRBbGlnbikge1xyXG4gICAgICAgICAgICBjYXNlIFRleHRBbGlnbi5DZW50ZXI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NlbnRlcic7XHJcbiAgICAgICAgICAgIGNhc2UgVGV4dEFsaWduLkxlZnQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2xlZnQnO1xyXG4gICAgICAgICAgICBjYXNlIFRleHRBbGlnbi5SaWdodDpcclxuICAgICAgICAgICAgICAgIHJldHVybiAncmlnaHQnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjaGVja0Rpc2FibGVkKGRhdGE6IGFueSwgY29udHJvbDogRm9ybUNvbnRyb2xCYXNlKSB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGEuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5kaXNhYmxlZCA9PT0gdHJ1ZSB8fCAoZGF0YS5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLmRpc2FibGVkID09PSB1bmRlZmluZWQgJiYgY29udHJvbC5kaXNhYmxlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tIaWRkZW4oY29udHJvbDogRm9ybUNvbnRyb2xCYXNlLCBwYXJlbnRNb2RlbDogYW55LCBwYXRoOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgY3VycmVudE5vZGUgPSBudWxsO1xyXG4gICAgICAgIGlmIChwYXRoICYmIGNvbnRyb2xbJ25vZGVzJ10pIHtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjb250cm9sWydub2RlcyddW3BhdGhdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY3VycmVudE5vZGUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb250cm9sWydfaGlkZGVuJ10gPSB0cnVlO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0uaGlkZGVuID09PSB0cnVlXHJcbiAgICAgICAgICAgIHx8IChwYXJlbnRNb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLmhpZGRlbiA9PT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICAmJiAoY29udHJvbC5oaWRkZW5cclxuICAgICAgICAgICAgICAgICAgICB8fCAoY29udHJvbC5oaWRkZW5DaGVjayAmJiBjb250cm9sLmhpZGRlbkNoZWNrKHRoaXMuX21pbmltaXplZERhdGEsIGN1cnJlbnROb2RlKSlcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICBjdXJyZW50Tm9kZVsnX2hpZGRlbiddID0gISFyZXN1bHQ7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb250ZXh0VGQoY29udHJvbCwgcm93RGF0YSwgaW5kZXgsIHRhYmxlUGF0aCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGNvbnRyb2wsXHJcbiAgICAgICAgICAgIGRhdGE6IHJvd0RhdGEsXHJcbiAgICAgICAgICAgIGluZGV4LFxyXG4gICAgICAgICAgICB0YWJsZVBhdGgsXHJcbiAgICAgICAgICAgIHBhcmVudFBhdGg6IGAke3RhYmxlUGF0aH1bJHtpbmRleH1dYCxcclxuICAgICAgICAgICAgcGF0aDogYCR7dGFibGVQYXRofVske2luZGV4fV0uJHtjb250cm9sLmZpZWxkfWAsXHJcbiAgICAgICAgICAgIHNob3dMYWJlbDogZmFsc2UsXHJcbiAgICAgICAgICAgIG1kV2lkdGg6IDEyXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNNb2JpbGVPclRhYmxldCgpIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICB0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNNb2JpbGUoKVxyXG4gICAgICAgICAgICB8fCB0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNUYWJsZXQoKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVDYWNoaW5nKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlQ2FjaGVWYWx1ZXNUb1N0b3JhZ2UoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblNldHRpbmdzKGV2ZW50KSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblRhYmxlU2NoZW1hT2xkZXN0KGV2dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5UQUJMRV9TQ0hFTUFfUEFHSU5HX09MREVTVCwgbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uVGFibGVTY2hlbWFOZXdlc3QoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuQ09NTU9OLlRBQkxFX1NDSEVNQV9QQUdJTkdfTkVXRVNULCBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25UYWJsZVNjaGVtYU5leHQoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuQ09NTU9OLlRBQkxFX1NDSEVNQV9QQUdJTkdfTkVYVCwgbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uVGFibGVTY2hlbWFQcmV2KGV2dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5UQUJMRV9TQ0hFTUFfUEFHSU5HX1BSRVYsIG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWZyZXNoKGV2dCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBnZXRDb250cm9sRGF0YVNvdXJjZShjb250cm9sOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEsIGRhdGE6IGFueSkge1xyXG4gICAgICAgIGlmIChkYXRhLl9zb3VyY2VbY29udHJvbC5maWVsZF0gaW5zdGFuY2VvZiBBcnJheSkgcmV0dXJuIGRhdGEuX3NvdXJjZVtjb250cm9sLmZpZWxkXTtcclxuICAgICAgICBpZiAoY29udHJvbC5kYXRhU291cmNlIGluc3RhbmNlb2YgQXJyYXkpIHJldHVybiBjb250cm9sLmRhdGFTb3VyY2U7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuZGF0YVNvdXJjZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSByZXR1cm4gY29udHJvbC5kYXRhU291cmNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJpZ2dlclJlbG9hZChmaWVsZDogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybUNvbnRyb2xzW2ZpZWxkXTtcclxuICAgICAgICBpZiAoY29udHJvbCAmJiBjb250cm9sLmJpbmRpbmdGaWx0ZXJzICYmIGNvbnRyb2wuYmluZGluZ0ZpbHRlcnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKGNvbnRyb2wuYmluZGluZ0ZpbHRlcnNbMF0uZmllbGQpO1xyXG4gICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiBwYXJlbnROb2RlLFxyXG4gICAgICAgICAgICAgICAgc291cmNlRXZlbnQ6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBwYXJlbnROb2RlLFxyXG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiB0aGlzLmV2ZW50VHlwZS5DSEFOR0VcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jb3JyZWN0VmFsdWUocGFyZW50Tm9kZSk7XHJcbiAgICAgICAgICAgIC8vIGF1dG8gY29ycmVjdCB2YWx1ZVxyXG4gICAgICAgICAgICBwYXJlbnROb2RlLnZhbHVlID0gdmFsdWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoY29udHJvbFtLZXlGdW5jdGlvblJlbG9hZF0pIHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xbS2V5RnVuY3Rpb25SZWxvYWRdKGV2ZW50RGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoY29udHJvbC5fY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5fY29tcG9uZW50LmdldERhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sLl9jb21wb25lbnQuZ2V0RGF0YSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ29udHJvbFRyZWVOb2RlIHtcclxuICAgIG1vZGVsUGF0aDogc3RyaW5nO1xyXG4gICAgc2NoZW1hUGF0aDogc3RyaW5nO1xyXG4gICAgZmllbGQ6IHN0cmluZztcclxuICAgIHBhcmVudE5vZGU6IENvbnRyb2xUcmVlTm9kZTtcclxuICAgIHJvb3ROb2RlOiBDb250cm9sVHJlZU5vZGU7XHJcbiAgICBjaGlsZE5vZGVzOiBDb250cm9sVHJlZU5vZGVbXSA9IFtdO1xyXG4gICAgaGFzU2NoZW1hID0gdHJ1ZTtcclxuICAgIGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZTtcclxuICAgIF9jb21wb25lbnQ6IGFueTtcclxuICAgIGZvcm1Db250cm9scztcclxuICAgIGtleXNQbHVzOiBzdHJpbmdbXTtcclxuICAgIGlzUm9vdE5vZGUgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2NydWRGb3JtOiBDcnVkRm9ybUNvbXBvbmVudDtcclxuICAgIHByaXZhdGUgY2hpbGROb2RlRGljID0ge307XHJcbiAgICBwcml2YXRlIGRhdGE6IGFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihtb2RlbDogYW55LCBzY2hlbWFzOiBbXSwgZmllbGQ/LCBwYXJlbnROb2RlPzogQ29udHJvbFRyZWVOb2RlKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gbW9kZWw7XHJcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbHMgPSBzY2hlbWFzO1xyXG4gICAgICAgIGlmIChwYXJlbnROb2RlKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnROb2RlLm1vZGVsUGF0aCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWxQYXRoID0gcGFyZW50Tm9kZS5tb2RlbFBhdGggKyAnLicgKyBmaWVsZDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYVBhdGggPSBwYXJlbnROb2RlLnNjaGVtYVBhdGggKyAnLicgKyBmaWVsZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBmaWVsZCA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsUGF0aCA9IHBhcmVudE5vZGUubW9kZWxQYXRoICsgJ1snICsgZmllbGQgKyAnXSc7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlbWFQYXRoID0gcGFyZW50Tm9kZS5zY2hlbWFQYXRoO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzU2NoZW1hID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsUGF0aCA9IGZpZWxkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY2hlbWFQYXRoID0gZmllbGQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMucm9vdE5vZGUgPSBwYXJlbnROb2RlLnJvb3ROb2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5yb290Tm9kZSA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7XHJcbiAgICAgICAgdGhpcy5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTtcclxuICAgICAgICBpZiAodGhpcy5oYXNTY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sID0gc2NoZW1hc1t0aGlzLnNjaGVtYVBhdGhdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jb250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udHJvbFsnbm9kZXMnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbFsnbm9kZXMnXSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sWydub2RlcyddW3RoaXMubW9kZWxQYXRoXSA9IHRoaXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gc2NoZW1hc1t0aGlzLnNjaGVtYVBhdGhdO1xyXG4gICAgICAgIGxldCBrZXlzUGx1cyA9IFtdO1xyXG4gICAgICAgIGlmIChzY2hlbWEpIHtcclxuICAgICAgICAgICAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xyXG4gICAgICAgICAgICAgICAga2V5c1BsdXMgPSBzY2hlbWEuY29udHJvbHMuZmlsdGVyKHEgPT4gcS5maWVsZCkubWFwKHEgPT4gcS5maWVsZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgIGtleXNQbHVzID0gc2NoZW1hLnJvd1RlbXBsYXRlLmZpbHRlcihxID0+IHEuZmllbGQpLm1hcChxID0+IHEuZmllbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2NoZW1hUGF0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1Jvb3ROb2RlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFzU2NoZW1hID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhzY2hlbWFzKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHNjaGVtYXNba2V5XTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS51bmlxdWVGaWVsZCA9PSBpdGVtLmZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXNQbHVzLnB1c2goa2V5KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmtleXNQbHVzID0ga2V5c1BsdXM7XHJcbiAgICAgICAgdGhpcy5yZWluaXRDaGlsZE5vZGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlaW5pdENoaWxkTm9kZXMoZmlyZUV2ZW50RmluaXNoID0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuY2hpbGROb2Rlcy5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMuY2hpbGROb2RlRGljID0ge307XHJcbiAgICAgICAgdGhpcy5pbml0Q2hpbGROb2Rlcyh0aGlzLmRhdGEsIHRoaXMuZm9ybUNvbnRyb2xzLCB0aGlzLmtleXNQbHVzKTtcclxuICAgICAgICBpZiAoZmlyZUV2ZW50RmluaXNoICYmIHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSAmJiB0aGlzLmNvbnRyb2wub25UYWJsZUZpbmlzaEluaXQpIHtcclxuICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiB0aGlzLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRoaXMsXHJcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6IEV2ZW50VHlwZS5UQUJMRV9GSU5JU0hfSU5JVFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sLm9uVGFibGVGaW5pc2hJbml0KGV2ZW50RGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdENoaWxkTm9kZXMobW9kZWw6IGFueSwgc2NoZW1hczogW10sIGtleXNQbHVzOiBzdHJpbmdbXSkge1xyXG4gICAgICAgIGlmIChpc0xpdGVyYWxPYmplY3QobW9kZWwpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFsbEtleSA9IG5ldyBTZXQoWy4uLmtleXNQbHVzLCAuLi5PYmplY3Qua2V5cyhtb2RlbCldKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgYWxsS2V5KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICE9ICdfc3RhdHVzJyAmJiBrZXkgIT0gJ19lcnJvcnMnICYmIGtleSAhPSAnX3NvdXJjZScgJiYga2V5ICE9IEtleUZsYXNoU2hvdykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IG5ldyBDb250cm9sVHJlZU5vZGUobW9kZWxba2V5XSwgc2NoZW1hcywga2V5LCB0aGlzKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaWxkTm9kZXMucHVzaChjaGlsZE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGROb2RlRGljW2NoaWxkTm9kZS5maWVsZF0gPSBjaGlsZE5vZGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gU2F1IGtoaSDEkcOjIGluaXQgeG9uZyBub2RlIGNobyByb3cgdGjDrCBmaXJlIGV2ZW50IGNobyBjw6FjIGNvbnRyb2wgdHJvbmcgcm93XHJcbiAgICAgICAgICAgIC8vIFRoxrDhu51uZyBkw7luZyB24bubaSBt4bulYyDEkcOtY2ggY+G6p24gZGlzYWJsZWQsIGhpZGRlbiBjw6FjIGNvbnRyb2wgY+G7p2Egcm93IGtoaSBjw7Mgbmh1IGPhuqd1XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkTm9kZXMuZm9yRWFjaChfID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoXy5jb250cm9sICYmIF8uY29udHJvbC5vblJvd05vZGVGaW5pc2hJbml0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogXyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiBfLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBFdmVudFR5cGUuUk9XX0ZJTklTSF9JTklUXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfLmNvbnRyb2wub25Sb3dOb2RlRmluaXNoSW5pdChldmVudERhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoaXNBcnJheShtb2RlbCkpIHtcclxuICAgICAgICAgICAgbGV0IGkgPSAwO1xyXG4gICAgICAgICAgICBpZiAobW9kZWwubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gbmV3IENvbnRyb2xUcmVlTm9kZShpdGVtLCBzY2hlbWFzLCBpLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZE5vZGUucGFyZW50Tm9kZSA9IHRoaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZE5vZGVzLnB1c2goY2hpbGROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaWxkTm9kZURpY1tjaGlsZE5vZGUuZmllbGRdID0gY2hpbGROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hpbGROb2RlKGZpZWxkKTogQ29udHJvbFRyZWVOb2RlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZE5vZGVEaWNbZmllbGRdO1xyXG4gICAgfVxyXG5cclxuICAgIHNldENydWRGb3JtKGNydWRGb3JtOiBDcnVkRm9ybUNvbXBvbmVudCkge1xyXG4gICAgICAgIHRoaXMuX2NydWRGb3JtID0gY3J1ZEZvcm07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHBhcmVudE1vZGVsKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHJldHVybiB0aGlzLnBhcmVudE5vZGUubW9kZWw7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHBhcmVudE1vZGVsUGF0aCgpIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlKSByZXR1cm4gdGhpcy5wYXJlbnROb2RlLm1vZGVsUGF0aDtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcGFyZW50Q29udHJvbCgpIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlKSByZXR1cm4gdGhpcy5wYXJlbnROb2RlLmNvbnRyb2w7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1vZGVsKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHJldHVybiB0aGlzLnBhcmVudE5vZGUuZGF0YVt0aGlzLmZpZWxkXTtcclxuICAgICAgICBlbHNlIHJldHVybiB0aGlzLmRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IG1vZGVsKHZhbCkge1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHRoaXMucGFyZW50Tm9kZS5kYXRhW3RoaXMuZmllbGRdID0gdmFsO1xyXG4gICAgICAgIGVsc2UgdGhpcy5kYXRhID0gdmFsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB2YWx1ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlKSByZXR1cm4gdGhpcy5wYXJlbnROb2RlLmRhdGFbdGhpcy5maWVsZF07XHJcbiAgICAgICAgZWxzZSByZXR1cm4gdGhpcy5kYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCB2YWx1ZSh2YWwpIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlKSB0aGlzLnBhcmVudE5vZGUuZGF0YVt0aGlzLmZpZWxkXSA9IHZhbDtcclxuICAgICAgICBlbHNlIHRoaXMuZGF0YSA9IHZhbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb21wb25lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGNvbXBvbmVudCh2YWwpIHtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnQgPSB2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldEhpZGRlbihmaWVsZDogc3RyaW5nIHwgc3RyaW5nW10sIGhpZGRlbjogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZCkpIHtcclxuICAgICAgICAgICAgZmllbGQuZm9yRWFjaChmID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0SGlkZGVuRmllbGQoZiwgaGlkZGVuKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldEhpZGRlbkZpZWxkKGZpZWxkLCBoaWRkZW4pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldEhpZGRlbkZpZWxkKGZpZWxkOiBzdHJpbmcsIGhpZGRlbjogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuc2V0UHJpdmF0ZVN0YXR1cyhmaWVsZCwgJ2hpZGRlbicsIGhpZGRlbik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldERpc2FibGVkKGZpZWxkOiBzdHJpbmcgfCBzdHJpbmdbXSwgZGlzYWJsZWQ6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQpKSB7XHJcbiAgICAgICAgICAgIGZpZWxkLmZvckVhY2goZiA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldERpc2FibGVkRmllbGQoZiwgZGlzYWJsZWQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0RGlzYWJsZWRGaWVsZChmaWVsZCwgZGlzYWJsZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldERpc2FibGVkRmllbGQoZmllbGQ6IHN0cmluZywgZGlzYWJsZWQ6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLnNldFByaXZhdGVTdGF0dXMoZmllbGQsICdkaXNhYmxlZCcsIGRpc2FibGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldFByaXZhdGVTdGF0dXMoZmllbGQ6IHN0cmluZywgcHJvcDogc3RyaW5nLCB2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIGlmIChmaWVsZC5pbmRleE9mKCcuJykgPiAtMSkge1xyXG4gICAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSB0aGlzLmdldE5vZGVCeVBhdGgoYCR7dGhpcy5tb2RlbFBhdGh9LiR7ZmllbGR9YCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGxhc3RGaWVsZCA9IGZpZWxkLnNwbGl0KCcuJykucG9wKCk7XHJcbiAgICAgICAgICAgIGNoaWxkTm9kZS5wYXJlbnROb2RlLmRhdGEuX3N0YXR1c1tsYXN0RmllbGRdW3Byb3BdID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGEuX3N0YXR1c1tmaWVsZF1bcHJvcF0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE5vZGVCeVBhdGgobW9kZWxQYXRoKTogQ29udHJvbFRyZWVOb2RlIHtcclxuICAgICAgICBpZiAobW9kZWxQYXRoID09IG51bGwgfHwgbW9kZWxQYXRoID09PSAnJykgcmV0dXJuIHRoaXMucm9vdE5vZGU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZEluVHJlZSh0aGlzLnJvb3ROb2RlLCBtb2RlbFBhdGgudG9Mb3dlckNhc2UoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE5vZGVCeVNjaGVtYVBhdGgoc2NoZW1hUGF0aCk6IENvbnRyb2xUcmVlTm9kZSB7XHJcbiAgICAgICAgaWYgKHNjaGVtYVBhdGggPT0gbnVsbCB8fCBzY2hlbWFQYXRoID09PSAnJykgcmV0dXJuIHRoaXMucm9vdE5vZGU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZFNjaGVtYUluVHJlZSh0aGlzLnJvb3ROb2RlLCBzY2hlbWFQYXRoLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZmluZEluVHJlZShub2RlOiBDb250cm9sVHJlZU5vZGUsIG1vZGVsUGF0aCk6IENvbnRyb2xUcmVlTm9kZSB7XHJcbiAgICAgICAgaWYgKG5vZGUubW9kZWxQYXRoICE9IG51bGwgJiYgbm9kZS5tb2RlbFBhdGgudG9Mb3dlckNhc2UoKSA9PSBtb2RlbFBhdGgudG9Mb3dlckNhc2UoKSkgcmV0dXJuIG5vZGU7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGROb2RlIG9mIG5vZGUuY2hpbGROb2Rlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkTm9kZS5tb2RlbFBhdGggIT0gbnVsbCAmJiBtb2RlbFBhdGguc3RhcnRzV2l0aChjaGlsZE5vZGUubW9kZWxQYXRoLnRvTG93ZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmUgPSB0aGlzLmZpbmRJblRyZWUoY2hpbGROb2RlLCBtb2RlbFBhdGgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZSkgcmV0dXJuIHJlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZmluZFNjaGVtYUluVHJlZShub2RlOiBDb250cm9sVHJlZU5vZGUsIHNjaGVtYVBhdGgpOiBDb250cm9sVHJlZU5vZGUge1xyXG4gICAgICAgIGlmIChub2RlLnNjaGVtYVBhdGggIT0gbnVsbCAmJiBub2RlLnNjaGVtYVBhdGgudG9Mb3dlckNhc2UoKSA9PSBzY2hlbWFQYXRoLnRvTG93ZXJDYXNlKCkpIHJldHVybiBub2RlO1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkTm9kZSBvZiBub2RlLmNoaWxkTm9kZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGUuc2NoZW1hUGF0aCAhPSBudWxsICYmIHNjaGVtYVBhdGguc3RhcnRzV2l0aChjaGlsZE5vZGUuc2NoZW1hUGF0aC50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlID0gdGhpcy5maW5kU2NoZW1hSW5UcmVlKGNoaWxkTm9kZSwgc2NoZW1hUGF0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlKSByZXR1cm4gcmU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldERhdGFTb3VyY2VUYWJsZVNjaGVtYShwYXRoOiBzdHJpbmcsIGRhdGFTb3VyY2U6IGFueVtdKSB7XHJcbiAgICAgICAgY29uc3QgdGFibGVOb2RlID0gdGhpcy5nZXROb2RlQnlQYXRoKHBhdGgpO1xyXG4gICAgICAgIGlmICghdGFibGVOb2RlLm1vZGVsKSB7XHJcbiAgICAgICAgICAgIHRhYmxlTm9kZS5tb2RlbCA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0YWJsZU5vZGUubW9kZWwuc3BsaWNlKDAsIHRhYmxlTm9kZS5tb2RlbC5sZW5ndGgpO1xyXG5cclxuICAgICAgICBpZiAoZGF0YVNvdXJjZS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICB0YWJsZU5vZGUucmVpbml0Q2hpbGROb2RlcygpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YVNvdXJjZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLnJvb3ROb2RlLl9jcnVkRm9ybS5hZGROZXdSb3coPFRhYmxlU2NoZW1hPnRhYmxlTm9kZS5jb250cm9sLCBwYXRoLCBudWxsLCB0cnVlLCBkYXRhU291cmNlW2ldLCBpID09IGRhdGFTb3VyY2UubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==