@seniorsistemas/angular-components 19.9.13 → 19.9.14-develop-23365630
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/card/lib/card/card.component.d.ts +2 -0
- package/confirm-dialog/README.md +2 -0
- package/confirm-dialog/lib/confirm-dialog.model.d.ts +2 -0
- package/country-phone-picker/lib/country-phone-picker/country-phone-picker.component.d.ts +1 -0
- package/dynamic-form/dynamic-form/components/lookup/lookup.component.d.ts +0 -1
- package/esm2022/card/lib/card/card.component.mjs +17 -3
- package/esm2022/chips/lib/chips/chips/chips.component.mjs +3 -3
- package/esm2022/confirm-dialog/lib/confirm-dialog.model.mjs +1 -1
- package/esm2022/confirm-dialog/lib/popup-confirm-dialog/popup-confirm-dialog.component.mjs +3 -3
- package/esm2022/country-phone-picker/lib/country-phone-picker/country-phone-picker.component.mjs +12 -7
- package/esm2022/datepicker/lib/datepicker/datepicker.component.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +3 -5
- package/esm2022/text-area/lib/text-area/text-area.component.mjs +3 -3
- package/fesm2022/seniorsistemas-angular-components-card.mjs +16 -2
- package/fesm2022/seniorsistemas-angular-components-card.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-chips.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-chips.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-confirm-dialog.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-confirm-dialog.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-country-phone-picker.mjs +11 -6
- package/fesm2022/seniorsistemas-angular-components-country-phone-picker.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-datepicker.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-datepicker.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +2 -4
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-text-area.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-text-area.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1803,7 +1803,7 @@ export class DatepickerComponent {
|
|
|
1803
1803
|
useExisting: DatepickerComponent,
|
|
1804
1804
|
multi: true,
|
|
1805
1805
|
},
|
|
1806
|
-
], viewQueries: [{ propertyName: "popupPanel", first: true, predicate: ["popupPanel"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "increaseHourButton", first: true, predicate: ["increaseHourButton"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "iconButton", first: true, predicate: ["iconButton"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "triggerInput", first: true, predicate: ["triggerInput"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<div\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"datepicker-group relative flex w-full items-center after:pointer-events-none after:absolute after:inset-0 after:rounded-medium has-[input:focus]:after:outline has-[input:focus]:after:outline-2 has-[input:focus]:after:outline-offset-[-2px] has-[input:focus]:after:outline-[var(--s-focus-ring-color,#0090ff)]\"\n role=\"combobox\"\n aria-haspopup=\"grid\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"popupId()\"\n>\n <input\n #triggerInput\n class=\"h-[35px] w-full rounded-medium border border-solid border-grayscale-30 pl-[10px] text-sm outline-none transition-colors duration-200 ease-out\"\n [class.pr-10]=\"showIcon() && !showClear()\"\n [class.pr-16]=\"showIcon() && showClear()\"\n [class.pr-6]=\"!showIcon() && showClear()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [id]=\"inputId()\"\n [name]=\"name() ?? inputId()\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? (placeholderKey() | translate)\"\n [disabled]=\"disabled()\"\n [readonly]=\"\n readonlyInput() ||\n mode() === 'range' ||\n mode() === 'year' ||\n isMultipleMode() ||\n (isSegmentModeCandidate() && isTouchDevice())\n \"\n [tabIndex]=\"tabindex() ?? null\"\n [autofocus]=\"autofocus()\"\n [(ngModel)]=\"inputDate\"\n (ngModelChange)=\"handleInputChange($event)\"\n (focus)=\"handleInputFocus($event)\"\n (blur)=\"handleInputBlur($event)\"\n (mousedown)=\"handleInputClick($event)\"\n (keydown)=\"handleTriggerKeydown($event)\"\n (input)=\"handleNativeInput($event)\"\n [attr.aria-invalid]=\"ngControl?.control?.invalid || null\"\n [attr.aria-describedby]=\"mode() === 'range' ? rangeStatusElementId() : null\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate: dialogAriaLabelParams()\"\n />\n\n @if (mode() === 'range') {\n <span\n class=\"sr-only\"\n [id]=\"rangeStatusElementId()\"\n >{{ rangePendingStatusText() }}</span\n >\n }\n\n @if (showClear() && inputDate) {\n <button\n type=\"button\"\n class=\"absolute flex h-[35px] w-6 items-center justify-center text-grayscale-60 transition-colors hover:text-grayscale-90\"\n [class.right-9]=\"showIcon()\"\n [class.right-0]=\"!showIcon()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_clear' | translate\"\n (click)=\"clearValue($event)\"\n >\n <i\n class=\"fas fa-times text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n @if (showIcon()) {\n <button\n #iconButton\n type=\"button\"\n class=\"trigger-icon absolute right-0 flex h-[35px] w-9 items-center justify-center rounded-r-medium border border-solid transition-colors duration-200 ease-out\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.hover:bg-grayscale-5]=\"!disabled()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_open' | translate\"\n (click)=\"toggle()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <i\n [class]=\"resolvedIcon()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (backdropClick)=\"handleBackdropClick($event)\"\n (overlayKeydown)=\"handleOverlayKeydown($event)\"\n (detach)=\"isOpen.set(false)\"\n>\n <div\n #popupPanel\n class=\"z-50 w-72 rounded-medium border border-solid border-grayscale-30 bg-grayscale-0 shadow-md\"\n role=\"dialog\"\n cdkTrapFocus\n [id]=\"popupId()\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate: dialogAriaLabelParams()\"\n >\n @if (showCalendar()) {\n @if (pickerView() === 'calendar') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o mensal -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_month'\n | translate: { month: prevMonthTarget() }\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex items-center gap-1 rounded-small px-2 py-1 text-sm font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month_year' | translate\"\n (click)=\"switchToMonths()\"\n >\n {{ currentMonthKey() | translate }} {{ currentYear() }}\n <i\n class=\"fas fa-chevron-down text-[10px]\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_month'\n | translate: { month: nextMonthTarget() }\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Cabe\u00E7alhos dos dias da semana -->\n <div\n class=\"grid grid-cols-7 px-3 pt-2\"\n role=\"row\"\n >\n @for (dayKey of orderedWeekDayKeys(); track dayKey) {\n <div\n class=\"flex h-8 items-center justify-center text-xs font-medium text-grayscale-60\"\n role=\"columnheader\"\n [attr.aria-label]=\"dayKey | translate\"\n >\n {{ dayKey | translate }}\n </div>\n }\n </div>\n\n <!-- Grade do calend\u00E1rio -->\n <div\n class=\"grid grid-cols-7 px-3 pb-2\"\n role=\"grid\"\n [attr.aria-label]=\"\n calendarGridAriaLabelKey()\n | translate: { month: (currentMonthKey() | translate), year: currentYear() }\n \"\n [attr.aria-multiselectable]=\"mode() === 'range' ? true : null\"\n (keydown)=\"handleCalendarGridKeydown($event)\"\n >\n @for (week of calendarWeeks(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (day of week; track day.date.toISOString()) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-8 w-8 items-center justify-center rounded-[50%] text-sm font-normal transition-colors\"\n [class.invisible]=\"!showOtherMonths() && !day.isCurrentMonth\"\n [attr.aria-label]=\"formatDayAriaLabel(day.date, day)\"\n [attr.aria-selected]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd || day.isInRange || null\n \"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-disabled]=\"day.isDisabled ? 'true' : null\"\n [attr.aria-hidden]=\"!showOtherMonths() && !day.isCurrentMonth ? 'true' : null\"\n [attr.data-focus]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd\n ? 'selected'\n : day.isToday\n ? 'today'\n : null\n \"\n [disabled]=\"day.isDisabled\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0':\n day.isSelected || day.isRangeStart || day.isRangeEnd,\n 'bg-grayscale-10 hover:bg-grayscale-20':\n day.isInRange && !day.isRangeStart && !day.isRangeEnd,\n 'text-grayscale-90 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n day.isCurrentMonth,\n 'text-grayscale-60 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n !day.isCurrentMonth,\n 'ring-2 ring-inset ring-primary':\n day.isToday && !day.isSelected && !day.isRangeStart && !day.isRangeEnd,\n 'cursor-not-allowed text-grayscale-30': day.isDisabled,\n }\"\n (mouseenter)=\"onDayHover(day.date)\"\n (mouseleave)=\"onDayHover(null)\"\n (focus)=\"onDayHover(day.date)\"\n (click)=\"selectDate(day)\"\n >\n {{ day.dayOfMonth }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'years') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o por d\u00E9cada -->\n <div\n data-nav-header\n class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\"\n >\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_decade' | translate: prevDecadeRange()\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\"\n >{{ currentDecadeStart() }} \u2013 {{ currentDecadeStart() + 11 }}</span\n >\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_decade' | translate: nextDecadeRange()\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de anos -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_year' | translate\"\n >\n @for (row of yearsGrid(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (year of row; track year) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isYearSelected(year) || null\"\n [attr.aria-disabled]=\"isYearDisabled(year) ? 'true' : null\"\n [attr.aria-current]=\"isCurrentYear(year) ? 'date' : null\"\n [attr.data-focus]=\"\n isYearSelected(year) ? 'selected' : isCurrentYear(year) ? 'today' : null\n \"\n [disabled]=\"isYearDisabled(year)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isYearSelected(year),\n 'ring-2 ring-inset ring-primary':\n isCurrentYear(year) && !isYearSelected(year) && !isYearDisabled(year),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isYearSelected(year) && !isYearDisabled(year),\n 'cursor-not-allowed text-grayscale-30': isYearDisabled(year),\n }\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'months') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o anual -->\n <div\n data-nav-header\n class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\"\n >\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_year' | translate: { year: prevYearTarget() }\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentYear() }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_year' | translate: { year: nextYearTarget() }\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de meses -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month' | translate\"\n >\n @for (row of monthsGrid(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (month of row; track month.index) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isMonthSelected(month.index) || null\"\n [attr.aria-disabled]=\"isMonthDisabled(month.index) ? 'true' : null\"\n [attr.data-focus]=\"isMonthSelected(month.index) ? 'selected' : null\"\n [disabled]=\"isMonthDisabled(month.index)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isMonthSelected(month.index),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isMonthSelected(month.index) && !isMonthDisabled(month.index),\n 'cursor-not-allowed text-grayscale-30': isMonthDisabled(month.index),\n }\"\n (click)=\"selectMonth(month.index)\"\n >\n {{ month.key | translate }}\n </button>\n }\n </div>\n }\n </div>\n\n @if (mode() !== 'month') {\n <div class=\"border-t border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex items-center gap-2 rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"backToCalendar()\"\n >\n <i\n class=\"fas fa-arrow-left\"\n aria-hidden=\"true\"\n ></i>\n {{ 'platform.angular_components.datepicker_back_to_calendar' | translate }}\n </button>\n </div>\n }\n }\n }\n\n <!-- Time picker -->\n @if (showTimePicker()) {\n <div\n class=\"flex items-center justify-center gap-3 px-4 py-3\"\n [class.border-t]=\"showCalendar()\"\n [class.border-solid]=\"showCalendar()\"\n [class.border-grayscale-30]=\"showCalendar()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_time' | translate\"\n >\n <!-- Horas -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n #increaseHourButton\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_hour'\n | translate: { time: nextHourTarget() }\n \"\n (click)=\"incrementHours()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(displayHours())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_hour' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleHoursKeydown($event)\"\n (change)=\"handleHoursInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_hour'\n | translate: { time: prevHourTarget() }\n \"\n (click)=\"decrementHours()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Minutos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_minute'\n | translate: { time: nextMinuteTarget() }\n \"\n (click)=\"incrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(minutes())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_minute' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleMinutesKeydown($event)\"\n (change)=\"handleMinutesInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_minute'\n | translate: { time: prevMinuteTarget() }\n \"\n (click)=\"decrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Segundos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_second'\n | translate: { time: nextSecondTarget() }\n \"\n (click)=\"incrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(seconds())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_second' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleSecondsKeydown($event)\"\n (change)=\"handleSecondsInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_second'\n | translate: { time: prevSecondTarget() }\n \"\n (click)=\"decrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n\n @if (is12HourFormat()) {\n <!-- Seletor AM/PM -->\n <button\n type=\"button\"\n class=\"flex h-9 w-12 items-center justify-center rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-base font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_toggle_meridiem'\n | translate: { meridiem: nextMeridiemTarget() }\n \"\n aria-live=\"polite\"\n (click)=\"toggleAmPm()\"\n >\n {{ amPm() }}\n </button>\n }\n </div>\n }\n\n <!-- Rodap\u00E9 de a\u00E7\u00F5es -->\n @if (showButtonBar() || mode() === 'datetime' || mode() === 'time') {\n <div class=\"flex items-center justify-between border-t border-solid border-grayscale-30 px-3 py-2\">\n @if (showButtonBar()) {\n <div>\n @if (mode() === 'date' || mode() === 'datetime' || mode() === 'range') {\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"selectToday()\"\n >\n {{ 'platform.angular_components.datepicker_today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"flex gap-2\">\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"clearValue($event)\"\n >\n {{ 'platform.angular_components.datepicker_clear' | translate }}\n </button>\n\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n } @else {\n <div></div>\n <div>\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n</ng-template>\n\n", styles: [":host{display:block;position:relative;width:100%}:host.ng-invalid.ng-dirty .datepicker-group:not(:focus-within){input,button.trigger-icon{border-color:#c13018}}:host.no-icon button[type=button]{display:none}:host.no-icon input{padding-right:.75rem}button[type=button]:focus-visible{outline:2px solid #428bca;outline-offset:1px;border-radius:inherit}button.trigger-icon[type=button]:focus-visible{outline:2px solid var(--s-focus-ring-color, #0090ff);outline-offset:-2px;border-radius:0 4px 4px 0}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }] });
|
|
1806
|
+
], viewQueries: [{ propertyName: "popupPanel", first: true, predicate: ["popupPanel"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "increaseHourButton", first: true, predicate: ["increaseHourButton"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "iconButton", first: true, predicate: ["iconButton"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "triggerInput", first: true, predicate: ["triggerInput"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<div\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"datepicker-group relative flex w-full items-center after:pointer-events-none after:absolute after:inset-0 after:rounded-medium has-[input:focus]:after:outline has-[input:focus]:after:outline-2 has-[input:focus]:after:outline-offset-[-2px] has-[input:focus]:after:outline-[var(--s-focus-ring-color,#0090ff)]\"\n role=\"combobox\"\n aria-haspopup=\"grid\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"popupId()\"\n>\n <input\n #triggerInput\n class=\"h-[35px] w-full rounded-medium border border-solid pl-[10px] text-sm outline-none transition-colors duration-200 ease-out\"\n [class.pr-10]=\"showIcon() && !showClear()\"\n [class.pr-16]=\"showIcon() && showClear()\"\n [class.pr-6]=\"!showIcon() && showClear()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-default]=\"disabled()\"\n [id]=\"inputId()\"\n [name]=\"name() ?? inputId()\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? (placeholderKey() | translate)\"\n [disabled]=\"disabled()\"\n [readonly]=\"\n readonlyInput() ||\n mode() === 'range' ||\n mode() === 'year' ||\n isMultipleMode() ||\n (isSegmentModeCandidate() && isTouchDevice())\n \"\n [tabIndex]=\"tabindex() ?? null\"\n [autofocus]=\"autofocus()\"\n [(ngModel)]=\"inputDate\"\n (ngModelChange)=\"handleInputChange($event)\"\n (focus)=\"handleInputFocus($event)\"\n (blur)=\"handleInputBlur($event)\"\n (mousedown)=\"handleInputClick($event)\"\n (keydown)=\"handleTriggerKeydown($event)\"\n (input)=\"handleNativeInput($event)\"\n [attr.aria-invalid]=\"ngControl?.control?.invalid || null\"\n [attr.aria-describedby]=\"mode() === 'range' ? rangeStatusElementId() : null\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate: dialogAriaLabelParams()\"\n />\n\n @if (mode() === 'range') {\n <span\n class=\"sr-only\"\n [id]=\"rangeStatusElementId()\"\n >{{ rangePendingStatusText() }}</span\n >\n }\n\n @if (showClear() && inputDate) {\n <button\n type=\"button\"\n class=\"absolute flex h-[35px] w-6 items-center justify-center text-grayscale-60 transition-colors hover:text-grayscale-90\"\n [class.right-9]=\"showIcon()\"\n [class.right-0]=\"!showIcon()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_clear' | translate\"\n (click)=\"clearValue($event)\"\n >\n <i\n class=\"fas fa-times text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n @if (showIcon()) {\n <button\n #iconButton\n type=\"button\"\n class=\"trigger-icon absolute right-0 flex h-[35px] w-9 items-center justify-center rounded-r-medium border border-solid transition-colors duration-200 ease-out\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-default]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.hover:bg-grayscale-5]=\"!disabled()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_open' | translate\"\n (click)=\"toggle()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <i\n [class]=\"resolvedIcon()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (backdropClick)=\"handleBackdropClick($event)\"\n (overlayKeydown)=\"handleOverlayKeydown($event)\"\n (detach)=\"isOpen.set(false)\"\n>\n <div\n #popupPanel\n class=\"z-50 w-72 rounded-medium border border-solid border-grayscale-30 bg-grayscale-0 shadow-md\"\n role=\"dialog\"\n cdkTrapFocus\n [id]=\"popupId()\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate: dialogAriaLabelParams()\"\n >\n @if (showCalendar()) {\n @if (pickerView() === 'calendar') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o mensal -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_month'\n | translate: { month: prevMonthTarget() }\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex items-center gap-1 rounded-small px-2 py-1 text-sm font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month_year' | translate\"\n (click)=\"switchToMonths()\"\n >\n {{ currentMonthKey() | translate }} {{ currentYear() }}\n <i\n class=\"fas fa-chevron-down text-[10px]\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_month'\n | translate: { month: nextMonthTarget() }\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Cabe\u00E7alhos dos dias da semana -->\n <div\n class=\"grid grid-cols-7 px-3 pt-2\"\n role=\"row\"\n >\n @for (dayKey of orderedWeekDayKeys(); track dayKey) {\n <div\n class=\"flex h-8 items-center justify-center text-xs font-medium text-grayscale-60\"\n role=\"columnheader\"\n [attr.aria-label]=\"dayKey | translate\"\n >\n {{ dayKey | translate }}\n </div>\n }\n </div>\n\n <!-- Grade do calend\u00E1rio -->\n <div\n class=\"grid grid-cols-7 px-3 pb-2\"\n role=\"grid\"\n [attr.aria-label]=\"\n calendarGridAriaLabelKey()\n | translate: { month: (currentMonthKey() | translate), year: currentYear() }\n \"\n [attr.aria-multiselectable]=\"mode() === 'range' ? true : null\"\n (keydown)=\"handleCalendarGridKeydown($event)\"\n >\n @for (week of calendarWeeks(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (day of week; track day.date.toISOString()) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-8 w-8 items-center justify-center rounded-[50%] text-sm font-normal transition-colors\"\n [class.invisible]=\"!showOtherMonths() && !day.isCurrentMonth\"\n [attr.aria-label]=\"formatDayAriaLabel(day.date, day)\"\n [attr.aria-selected]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd || day.isInRange || null\n \"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-disabled]=\"day.isDisabled ? 'true' : null\"\n [attr.aria-hidden]=\"!showOtherMonths() && !day.isCurrentMonth ? 'true' : null\"\n [attr.data-focus]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd\n ? 'selected'\n : day.isToday\n ? 'today'\n : null\n \"\n [disabled]=\"day.isDisabled\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0':\n day.isSelected || day.isRangeStart || day.isRangeEnd,\n 'bg-grayscale-10 hover:bg-grayscale-20':\n day.isInRange && !day.isRangeStart && !day.isRangeEnd,\n 'text-grayscale-90 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n day.isCurrentMonth,\n 'text-grayscale-60 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n !day.isCurrentMonth,\n 'ring-2 ring-inset ring-primary':\n day.isToday && !day.isSelected && !day.isRangeStart && !day.isRangeEnd,\n 'cursor-not-allowed text-grayscale-30': day.isDisabled,\n }\"\n (mouseenter)=\"onDayHover(day.date)\"\n (mouseleave)=\"onDayHover(null)\"\n (focus)=\"onDayHover(day.date)\"\n (click)=\"selectDate(day)\"\n >\n {{ day.dayOfMonth }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'years') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o por d\u00E9cada -->\n <div\n data-nav-header\n class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\"\n >\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_decade' | translate: prevDecadeRange()\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\"\n >{{ currentDecadeStart() }} \u2013 {{ currentDecadeStart() + 11 }}</span\n >\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_decade' | translate: nextDecadeRange()\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de anos -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_year' | translate\"\n >\n @for (row of yearsGrid(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (year of row; track year) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isYearSelected(year) || null\"\n [attr.aria-disabled]=\"isYearDisabled(year) ? 'true' : null\"\n [attr.aria-current]=\"isCurrentYear(year) ? 'date' : null\"\n [attr.data-focus]=\"\n isYearSelected(year) ? 'selected' : isCurrentYear(year) ? 'today' : null\n \"\n [disabled]=\"isYearDisabled(year)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isYearSelected(year),\n 'ring-2 ring-inset ring-primary':\n isCurrentYear(year) && !isYearSelected(year) && !isYearDisabled(year),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isYearSelected(year) && !isYearDisabled(year),\n 'cursor-not-allowed text-grayscale-30': isYearDisabled(year),\n }\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'months') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o anual -->\n <div\n data-nav-header\n class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\"\n >\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_year' | translate: { year: prevYearTarget() }\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentYear() }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_year' | translate: { year: nextYearTarget() }\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de meses -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month' | translate\"\n >\n @for (row of monthsGrid(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (month of row; track month.index) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isMonthSelected(month.index) || null\"\n [attr.aria-disabled]=\"isMonthDisabled(month.index) ? 'true' : null\"\n [attr.data-focus]=\"isMonthSelected(month.index) ? 'selected' : null\"\n [disabled]=\"isMonthDisabled(month.index)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isMonthSelected(month.index),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isMonthSelected(month.index) && !isMonthDisabled(month.index),\n 'cursor-not-allowed text-grayscale-30': isMonthDisabled(month.index),\n }\"\n (click)=\"selectMonth(month.index)\"\n >\n {{ month.key | translate }}\n </button>\n }\n </div>\n }\n </div>\n\n @if (mode() !== 'month') {\n <div class=\"border-t border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex items-center gap-2 rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"backToCalendar()\"\n >\n <i\n class=\"fas fa-arrow-left\"\n aria-hidden=\"true\"\n ></i>\n {{ 'platform.angular_components.datepicker_back_to_calendar' | translate }}\n </button>\n </div>\n }\n }\n }\n\n <!-- Time picker -->\n @if (showTimePicker()) {\n <div\n class=\"flex items-center justify-center gap-3 px-4 py-3\"\n [class.border-t]=\"showCalendar()\"\n [class.border-solid]=\"showCalendar()\"\n [class.border-grayscale-30]=\"showCalendar()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_time' | translate\"\n >\n <!-- Horas -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n #increaseHourButton\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_hour'\n | translate: { time: nextHourTarget() }\n \"\n (click)=\"incrementHours()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(displayHours())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_hour' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleHoursKeydown($event)\"\n (change)=\"handleHoursInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_hour'\n | translate: { time: prevHourTarget() }\n \"\n (click)=\"decrementHours()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Minutos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_minute'\n | translate: { time: nextMinuteTarget() }\n \"\n (click)=\"incrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(minutes())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_minute' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleMinutesKeydown($event)\"\n (change)=\"handleMinutesInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_minute'\n | translate: { time: prevMinuteTarget() }\n \"\n (click)=\"decrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Segundos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_second'\n | translate: { time: nextSecondTarget() }\n \"\n (click)=\"incrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(seconds())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_second' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleSecondsKeydown($event)\"\n (change)=\"handleSecondsInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_second'\n | translate: { time: prevSecondTarget() }\n \"\n (click)=\"decrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n\n @if (is12HourFormat()) {\n <!-- Seletor AM/PM -->\n <button\n type=\"button\"\n class=\"flex h-9 w-12 items-center justify-center rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-base font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_toggle_meridiem'\n | translate: { meridiem: nextMeridiemTarget() }\n \"\n aria-live=\"polite\"\n (click)=\"toggleAmPm()\"\n >\n {{ amPm() }}\n </button>\n }\n </div>\n }\n\n <!-- Rodap\u00E9 de a\u00E7\u00F5es -->\n @if (showButtonBar() || mode() === 'datetime' || mode() === 'time') {\n <div class=\"flex items-center justify-between border-t border-solid border-grayscale-30 px-3 py-2\">\n @if (showButtonBar()) {\n <div>\n @if (mode() === 'date' || mode() === 'datetime' || mode() === 'range') {\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"selectToday()\"\n >\n {{ 'platform.angular_components.datepicker_today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"flex gap-2\">\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"clearValue($event)\"\n >\n {{ 'platform.angular_components.datepicker_clear' | translate }}\n </button>\n\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n } @else {\n <div></div>\n <div>\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n</ng-template>\n\n", styles: [":host{display:block;position:relative;width:100%}:host.ng-invalid.ng-dirty .datepicker-group:not(:focus-within){input,button.trigger-icon{border-color:#c13018}}:host.no-icon button[type=button]{display:none}:host.no-icon input{padding-right:.75rem}button[type=button]:focus-visible{outline:2px solid #428bca;outline-offset:1px;border-radius:inherit}button.trigger-icon[type=button]:focus-visible{outline:2px solid var(--s-focus-ring-color, #0090ff);outline-offset:-2px;border-radius:0 4px 4px 0}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }] });
|
|
1807
1807
|
}
|
|
1808
1808
|
__decorate([
|
|
1809
1809
|
numericKeysOnly()
|
|
@@ -1837,6 +1837,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
1837
1837
|
useExisting: DatepickerComponent,
|
|
1838
1838
|
multi: true,
|
|
1839
1839
|
},
|
|
1840
|
-
], template: "<div\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"datepicker-group relative flex w-full items-center after:pointer-events-none after:absolute after:inset-0 after:rounded-medium has-[input:focus]:after:outline has-[input:focus]:after:outline-2 has-[input:focus]:after:outline-offset-[-2px] has-[input:focus]:after:outline-[var(--s-focus-ring-color,#0090ff)]\"\n role=\"combobox\"\n aria-haspopup=\"grid\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"popupId()\"\n>\n <input\n #triggerInput\n class=\"h-[35px] w-full rounded-medium border border-solid border-grayscale-30 pl-[10px] text-sm outline-none transition-colors duration-200 ease-out\"\n [class.pr-10]=\"showIcon() && !showClear()\"\n [class.pr-16]=\"showIcon() && showClear()\"\n [class.pr-6]=\"!showIcon() && showClear()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [id]=\"inputId()\"\n [name]=\"name() ?? inputId()\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? (placeholderKey() | translate)\"\n [disabled]=\"disabled()\"\n [readonly]=\"\n readonlyInput() ||\n mode() === 'range' ||\n mode() === 'year' ||\n isMultipleMode() ||\n (isSegmentModeCandidate() && isTouchDevice())\n \"\n [tabIndex]=\"tabindex() ?? null\"\n [autofocus]=\"autofocus()\"\n [(ngModel)]=\"inputDate\"\n (ngModelChange)=\"handleInputChange($event)\"\n (focus)=\"handleInputFocus($event)\"\n (blur)=\"handleInputBlur($event)\"\n (mousedown)=\"handleInputClick($event)\"\n (keydown)=\"handleTriggerKeydown($event)\"\n (input)=\"handleNativeInput($event)\"\n [attr.aria-invalid]=\"ngControl?.control?.invalid || null\"\n [attr.aria-describedby]=\"mode() === 'range' ? rangeStatusElementId() : null\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate: dialogAriaLabelParams()\"\n />\n\n @if (mode() === 'range') {\n <span\n class=\"sr-only\"\n [id]=\"rangeStatusElementId()\"\n >{{ rangePendingStatusText() }}</span\n >\n }\n\n @if (showClear() && inputDate) {\n <button\n type=\"button\"\n class=\"absolute flex h-[35px] w-6 items-center justify-center text-grayscale-60 transition-colors hover:text-grayscale-90\"\n [class.right-9]=\"showIcon()\"\n [class.right-0]=\"!showIcon()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_clear' | translate\"\n (click)=\"clearValue($event)\"\n >\n <i\n class=\"fas fa-times text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n @if (showIcon()) {\n <button\n #iconButton\n type=\"button\"\n class=\"trigger-icon absolute right-0 flex h-[35px] w-9 items-center justify-center rounded-r-medium border border-solid transition-colors duration-200 ease-out\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.hover:bg-grayscale-5]=\"!disabled()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_open' | translate\"\n (click)=\"toggle()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <i\n [class]=\"resolvedIcon()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (backdropClick)=\"handleBackdropClick($event)\"\n (overlayKeydown)=\"handleOverlayKeydown($event)\"\n (detach)=\"isOpen.set(false)\"\n>\n <div\n #popupPanel\n class=\"z-50 w-72 rounded-medium border border-solid border-grayscale-30 bg-grayscale-0 shadow-md\"\n role=\"dialog\"\n cdkTrapFocus\n [id]=\"popupId()\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate: dialogAriaLabelParams()\"\n >\n @if (showCalendar()) {\n @if (pickerView() === 'calendar') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o mensal -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_month'\n | translate: { month: prevMonthTarget() }\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex items-center gap-1 rounded-small px-2 py-1 text-sm font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month_year' | translate\"\n (click)=\"switchToMonths()\"\n >\n {{ currentMonthKey() | translate }} {{ currentYear() }}\n <i\n class=\"fas fa-chevron-down text-[10px]\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_month'\n | translate: { month: nextMonthTarget() }\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Cabe\u00E7alhos dos dias da semana -->\n <div\n class=\"grid grid-cols-7 px-3 pt-2\"\n role=\"row\"\n >\n @for (dayKey of orderedWeekDayKeys(); track dayKey) {\n <div\n class=\"flex h-8 items-center justify-center text-xs font-medium text-grayscale-60\"\n role=\"columnheader\"\n [attr.aria-label]=\"dayKey | translate\"\n >\n {{ dayKey | translate }}\n </div>\n }\n </div>\n\n <!-- Grade do calend\u00E1rio -->\n <div\n class=\"grid grid-cols-7 px-3 pb-2\"\n role=\"grid\"\n [attr.aria-label]=\"\n calendarGridAriaLabelKey()\n | translate: { month: (currentMonthKey() | translate), year: currentYear() }\n \"\n [attr.aria-multiselectable]=\"mode() === 'range' ? true : null\"\n (keydown)=\"handleCalendarGridKeydown($event)\"\n >\n @for (week of calendarWeeks(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (day of week; track day.date.toISOString()) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-8 w-8 items-center justify-center rounded-[50%] text-sm font-normal transition-colors\"\n [class.invisible]=\"!showOtherMonths() && !day.isCurrentMonth\"\n [attr.aria-label]=\"formatDayAriaLabel(day.date, day)\"\n [attr.aria-selected]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd || day.isInRange || null\n \"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-disabled]=\"day.isDisabled ? 'true' : null\"\n [attr.aria-hidden]=\"!showOtherMonths() && !day.isCurrentMonth ? 'true' : null\"\n [attr.data-focus]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd\n ? 'selected'\n : day.isToday\n ? 'today'\n : null\n \"\n [disabled]=\"day.isDisabled\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0':\n day.isSelected || day.isRangeStart || day.isRangeEnd,\n 'bg-grayscale-10 hover:bg-grayscale-20':\n day.isInRange && !day.isRangeStart && !day.isRangeEnd,\n 'text-grayscale-90 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n day.isCurrentMonth,\n 'text-grayscale-60 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n !day.isCurrentMonth,\n 'ring-2 ring-inset ring-primary':\n day.isToday && !day.isSelected && !day.isRangeStart && !day.isRangeEnd,\n 'cursor-not-allowed text-grayscale-30': day.isDisabled,\n }\"\n (mouseenter)=\"onDayHover(day.date)\"\n (mouseleave)=\"onDayHover(null)\"\n (focus)=\"onDayHover(day.date)\"\n (click)=\"selectDate(day)\"\n >\n {{ day.dayOfMonth }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'years') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o por d\u00E9cada -->\n <div\n data-nav-header\n class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\"\n >\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_decade' | translate: prevDecadeRange()\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\"\n >{{ currentDecadeStart() }} \u2013 {{ currentDecadeStart() + 11 }}</span\n >\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_decade' | translate: nextDecadeRange()\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de anos -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_year' | translate\"\n >\n @for (row of yearsGrid(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (year of row; track year) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isYearSelected(year) || null\"\n [attr.aria-disabled]=\"isYearDisabled(year) ? 'true' : null\"\n [attr.aria-current]=\"isCurrentYear(year) ? 'date' : null\"\n [attr.data-focus]=\"\n isYearSelected(year) ? 'selected' : isCurrentYear(year) ? 'today' : null\n \"\n [disabled]=\"isYearDisabled(year)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isYearSelected(year),\n 'ring-2 ring-inset ring-primary':\n isCurrentYear(year) && !isYearSelected(year) && !isYearDisabled(year),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isYearSelected(year) && !isYearDisabled(year),\n 'cursor-not-allowed text-grayscale-30': isYearDisabled(year),\n }\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'months') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o anual -->\n <div\n data-nav-header\n class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\"\n >\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_year' | translate: { year: prevYearTarget() }\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentYear() }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_year' | translate: { year: nextYearTarget() }\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de meses -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month' | translate\"\n >\n @for (row of monthsGrid(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (month of row; track month.index) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isMonthSelected(month.index) || null\"\n [attr.aria-disabled]=\"isMonthDisabled(month.index) ? 'true' : null\"\n [attr.data-focus]=\"isMonthSelected(month.index) ? 'selected' : null\"\n [disabled]=\"isMonthDisabled(month.index)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isMonthSelected(month.index),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isMonthSelected(month.index) && !isMonthDisabled(month.index),\n 'cursor-not-allowed text-grayscale-30': isMonthDisabled(month.index),\n }\"\n (click)=\"selectMonth(month.index)\"\n >\n {{ month.key | translate }}\n </button>\n }\n </div>\n }\n </div>\n\n @if (mode() !== 'month') {\n <div class=\"border-t border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex items-center gap-2 rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"backToCalendar()\"\n >\n <i\n class=\"fas fa-arrow-left\"\n aria-hidden=\"true\"\n ></i>\n {{ 'platform.angular_components.datepicker_back_to_calendar' | translate }}\n </button>\n </div>\n }\n }\n }\n\n <!-- Time picker -->\n @if (showTimePicker()) {\n <div\n class=\"flex items-center justify-center gap-3 px-4 py-3\"\n [class.border-t]=\"showCalendar()\"\n [class.border-solid]=\"showCalendar()\"\n [class.border-grayscale-30]=\"showCalendar()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_time' | translate\"\n >\n <!-- Horas -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n #increaseHourButton\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_hour'\n | translate: { time: nextHourTarget() }\n \"\n (click)=\"incrementHours()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(displayHours())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_hour' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleHoursKeydown($event)\"\n (change)=\"handleHoursInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_hour'\n | translate: { time: prevHourTarget() }\n \"\n (click)=\"decrementHours()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Minutos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_minute'\n | translate: { time: nextMinuteTarget() }\n \"\n (click)=\"incrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(minutes())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_minute' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleMinutesKeydown($event)\"\n (change)=\"handleMinutesInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_minute'\n | translate: { time: prevMinuteTarget() }\n \"\n (click)=\"decrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Segundos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_second'\n | translate: { time: nextSecondTarget() }\n \"\n (click)=\"incrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(seconds())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_second' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleSecondsKeydown($event)\"\n (change)=\"handleSecondsInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_second'\n | translate: { time: prevSecondTarget() }\n \"\n (click)=\"decrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n\n @if (is12HourFormat()) {\n <!-- Seletor AM/PM -->\n <button\n type=\"button\"\n class=\"flex h-9 w-12 items-center justify-center rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-base font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_toggle_meridiem'\n | translate: { meridiem: nextMeridiemTarget() }\n \"\n aria-live=\"polite\"\n (click)=\"toggleAmPm()\"\n >\n {{ amPm() }}\n </button>\n }\n </div>\n }\n\n <!-- Rodap\u00E9 de a\u00E7\u00F5es -->\n @if (showButtonBar() || mode() === 'datetime' || mode() === 'time') {\n <div class=\"flex items-center justify-between border-t border-solid border-grayscale-30 px-3 py-2\">\n @if (showButtonBar()) {\n <div>\n @if (mode() === 'date' || mode() === 'datetime' || mode() === 'range') {\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"selectToday()\"\n >\n {{ 'platform.angular_components.datepicker_today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"flex gap-2\">\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"clearValue($event)\"\n >\n {{ 'platform.angular_components.datepicker_clear' | translate }}\n </button>\n\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n } @else {\n <div></div>\n <div>\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n</ng-template>\n\n", styles: [":host{display:block;position:relative;width:100%}:host.ng-invalid.ng-dirty .datepicker-group:not(:focus-within){input,button.trigger-icon{border-color:#c13018}}:host.no-icon button[type=button]{display:none}:host.no-icon input{padding-right:.75rem}button[type=button]:focus-visible{outline:2px solid #428bca;outline-offset:1px;border-radius:inherit}button.trigger-icon[type=button]:focus-visible{outline:2px solid var(--s-focus-ring-color, #0090ff);outline-offset:-2px;border-radius:0 4px 4px 0}\n"] }]
|
|
1840
|
+
], template: "<div\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"datepicker-group relative flex w-full items-center after:pointer-events-none after:absolute after:inset-0 after:rounded-medium has-[input:focus]:after:outline has-[input:focus]:after:outline-2 has-[input:focus]:after:outline-offset-[-2px] has-[input:focus]:after:outline-[var(--s-focus-ring-color,#0090ff)]\"\n role=\"combobox\"\n aria-haspopup=\"grid\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"popupId()\"\n>\n <input\n #triggerInput\n class=\"h-[35px] w-full rounded-medium border border-solid pl-[10px] text-sm outline-none transition-colors duration-200 ease-out\"\n [class.pr-10]=\"showIcon() && !showClear()\"\n [class.pr-16]=\"showIcon() && showClear()\"\n [class.pr-6]=\"!showIcon() && showClear()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-default]=\"disabled()\"\n [id]=\"inputId()\"\n [name]=\"name() ?? inputId()\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? (placeholderKey() | translate)\"\n [disabled]=\"disabled()\"\n [readonly]=\"\n readonlyInput() ||\n mode() === 'range' ||\n mode() === 'year' ||\n isMultipleMode() ||\n (isSegmentModeCandidate() && isTouchDevice())\n \"\n [tabIndex]=\"tabindex() ?? null\"\n [autofocus]=\"autofocus()\"\n [(ngModel)]=\"inputDate\"\n (ngModelChange)=\"handleInputChange($event)\"\n (focus)=\"handleInputFocus($event)\"\n (blur)=\"handleInputBlur($event)\"\n (mousedown)=\"handleInputClick($event)\"\n (keydown)=\"handleTriggerKeydown($event)\"\n (input)=\"handleNativeInput($event)\"\n [attr.aria-invalid]=\"ngControl?.control?.invalid || null\"\n [attr.aria-describedby]=\"mode() === 'range' ? rangeStatusElementId() : null\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate: dialogAriaLabelParams()\"\n />\n\n @if (mode() === 'range') {\n <span\n class=\"sr-only\"\n [id]=\"rangeStatusElementId()\"\n >{{ rangePendingStatusText() }}</span\n >\n }\n\n @if (showClear() && inputDate) {\n <button\n type=\"button\"\n class=\"absolute flex h-[35px] w-6 items-center justify-center text-grayscale-60 transition-colors hover:text-grayscale-90\"\n [class.right-9]=\"showIcon()\"\n [class.right-0]=\"!showIcon()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_clear' | translate\"\n (click)=\"clearValue($event)\"\n >\n <i\n class=\"fas fa-times text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n @if (showIcon()) {\n <button\n #iconButton\n type=\"button\"\n class=\"trigger-icon absolute right-0 flex h-[35px] w-9 items-center justify-center rounded-r-medium border border-solid transition-colors duration-200 ease-out\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-default]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.hover:bg-grayscale-5]=\"!disabled()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_open' | translate\"\n (click)=\"toggle()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <i\n [class]=\"resolvedIcon()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (backdropClick)=\"handleBackdropClick($event)\"\n (overlayKeydown)=\"handleOverlayKeydown($event)\"\n (detach)=\"isOpen.set(false)\"\n>\n <div\n #popupPanel\n class=\"z-50 w-72 rounded-medium border border-solid border-grayscale-30 bg-grayscale-0 shadow-md\"\n role=\"dialog\"\n cdkTrapFocus\n [id]=\"popupId()\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate: dialogAriaLabelParams()\"\n >\n @if (showCalendar()) {\n @if (pickerView() === 'calendar') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o mensal -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_month'\n | translate: { month: prevMonthTarget() }\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex items-center gap-1 rounded-small px-2 py-1 text-sm font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month_year' | translate\"\n (click)=\"switchToMonths()\"\n >\n {{ currentMonthKey() | translate }} {{ currentYear() }}\n <i\n class=\"fas fa-chevron-down text-[10px]\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_month'\n | translate: { month: nextMonthTarget() }\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Cabe\u00E7alhos dos dias da semana -->\n <div\n class=\"grid grid-cols-7 px-3 pt-2\"\n role=\"row\"\n >\n @for (dayKey of orderedWeekDayKeys(); track dayKey) {\n <div\n class=\"flex h-8 items-center justify-center text-xs font-medium text-grayscale-60\"\n role=\"columnheader\"\n [attr.aria-label]=\"dayKey | translate\"\n >\n {{ dayKey | translate }}\n </div>\n }\n </div>\n\n <!-- Grade do calend\u00E1rio -->\n <div\n class=\"grid grid-cols-7 px-3 pb-2\"\n role=\"grid\"\n [attr.aria-label]=\"\n calendarGridAriaLabelKey()\n | translate: { month: (currentMonthKey() | translate), year: currentYear() }\n \"\n [attr.aria-multiselectable]=\"mode() === 'range' ? true : null\"\n (keydown)=\"handleCalendarGridKeydown($event)\"\n >\n @for (week of calendarWeeks(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (day of week; track day.date.toISOString()) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-8 w-8 items-center justify-center rounded-[50%] text-sm font-normal transition-colors\"\n [class.invisible]=\"!showOtherMonths() && !day.isCurrentMonth\"\n [attr.aria-label]=\"formatDayAriaLabel(day.date, day)\"\n [attr.aria-selected]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd || day.isInRange || null\n \"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-disabled]=\"day.isDisabled ? 'true' : null\"\n [attr.aria-hidden]=\"!showOtherMonths() && !day.isCurrentMonth ? 'true' : null\"\n [attr.data-focus]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd\n ? 'selected'\n : day.isToday\n ? 'today'\n : null\n \"\n [disabled]=\"day.isDisabled\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0':\n day.isSelected || day.isRangeStart || day.isRangeEnd,\n 'bg-grayscale-10 hover:bg-grayscale-20':\n day.isInRange && !day.isRangeStart && !day.isRangeEnd,\n 'text-grayscale-90 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n day.isCurrentMonth,\n 'text-grayscale-60 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n !day.isCurrentMonth,\n 'ring-2 ring-inset ring-primary':\n day.isToday && !day.isSelected && !day.isRangeStart && !day.isRangeEnd,\n 'cursor-not-allowed text-grayscale-30': day.isDisabled,\n }\"\n (mouseenter)=\"onDayHover(day.date)\"\n (mouseleave)=\"onDayHover(null)\"\n (focus)=\"onDayHover(day.date)\"\n (click)=\"selectDate(day)\"\n >\n {{ day.dayOfMonth }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'years') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o por d\u00E9cada -->\n <div\n data-nav-header\n class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\"\n >\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_decade' | translate: prevDecadeRange()\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\"\n >{{ currentDecadeStart() }} \u2013 {{ currentDecadeStart() + 11 }}</span\n >\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_decade' | translate: nextDecadeRange()\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de anos -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_year' | translate\"\n >\n @for (row of yearsGrid(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (year of row; track year) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isYearSelected(year) || null\"\n [attr.aria-disabled]=\"isYearDisabled(year) ? 'true' : null\"\n [attr.aria-current]=\"isCurrentYear(year) ? 'date' : null\"\n [attr.data-focus]=\"\n isYearSelected(year) ? 'selected' : isCurrentYear(year) ? 'today' : null\n \"\n [disabled]=\"isYearDisabled(year)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isYearSelected(year),\n 'ring-2 ring-inset ring-primary':\n isCurrentYear(year) && !isYearSelected(year) && !isYearDisabled(year),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isYearSelected(year) && !isYearDisabled(year),\n 'cursor-not-allowed text-grayscale-30': isYearDisabled(year),\n }\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'months') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o anual -->\n <div\n data-nav-header\n class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\"\n >\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_year' | translate: { year: prevYearTarget() }\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentYear() }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_year' | translate: { year: nextYearTarget() }\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de meses -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month' | translate\"\n >\n @for (row of monthsGrid(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (month of row; track month.index) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isMonthSelected(month.index) || null\"\n [attr.aria-disabled]=\"isMonthDisabled(month.index) ? 'true' : null\"\n [attr.data-focus]=\"isMonthSelected(month.index) ? 'selected' : null\"\n [disabled]=\"isMonthDisabled(month.index)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isMonthSelected(month.index),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isMonthSelected(month.index) && !isMonthDisabled(month.index),\n 'cursor-not-allowed text-grayscale-30': isMonthDisabled(month.index),\n }\"\n (click)=\"selectMonth(month.index)\"\n >\n {{ month.key | translate }}\n </button>\n }\n </div>\n }\n </div>\n\n @if (mode() !== 'month') {\n <div class=\"border-t border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex items-center gap-2 rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"backToCalendar()\"\n >\n <i\n class=\"fas fa-arrow-left\"\n aria-hidden=\"true\"\n ></i>\n {{ 'platform.angular_components.datepicker_back_to_calendar' | translate }}\n </button>\n </div>\n }\n }\n }\n\n <!-- Time picker -->\n @if (showTimePicker()) {\n <div\n class=\"flex items-center justify-center gap-3 px-4 py-3\"\n [class.border-t]=\"showCalendar()\"\n [class.border-solid]=\"showCalendar()\"\n [class.border-grayscale-30]=\"showCalendar()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_time' | translate\"\n >\n <!-- Horas -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n #increaseHourButton\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_hour'\n | translate: { time: nextHourTarget() }\n \"\n (click)=\"incrementHours()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(displayHours())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_hour' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleHoursKeydown($event)\"\n (change)=\"handleHoursInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_hour'\n | translate: { time: prevHourTarget() }\n \"\n (click)=\"decrementHours()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Minutos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_minute'\n | translate: { time: nextMinuteTarget() }\n \"\n (click)=\"incrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(minutes())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_minute' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleMinutesKeydown($event)\"\n (change)=\"handleMinutesInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_minute'\n | translate: { time: prevMinuteTarget() }\n \"\n (click)=\"decrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Segundos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_second'\n | translate: { time: nextSecondTarget() }\n \"\n (click)=\"incrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(seconds())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_second' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleSecondsKeydown($event)\"\n (change)=\"handleSecondsInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_second'\n | translate: { time: prevSecondTarget() }\n \"\n (click)=\"decrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n\n @if (is12HourFormat()) {\n <!-- Seletor AM/PM -->\n <button\n type=\"button\"\n class=\"flex h-9 w-12 items-center justify-center rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-base font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_toggle_meridiem'\n | translate: { meridiem: nextMeridiemTarget() }\n \"\n aria-live=\"polite\"\n (click)=\"toggleAmPm()\"\n >\n {{ amPm() }}\n </button>\n }\n </div>\n }\n\n <!-- Rodap\u00E9 de a\u00E7\u00F5es -->\n @if (showButtonBar() || mode() === 'datetime' || mode() === 'time') {\n <div class=\"flex items-center justify-between border-t border-solid border-grayscale-30 px-3 py-2\">\n @if (showButtonBar()) {\n <div>\n @if (mode() === 'date' || mode() === 'datetime' || mode() === 'range') {\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"selectToday()\"\n >\n {{ 'platform.angular_components.datepicker_today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"flex gap-2\">\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"clearValue($event)\"\n >\n {{ 'platform.angular_components.datepicker_clear' | translate }}\n </button>\n\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n } @else {\n <div></div>\n <div>\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n</ng-template>\n\n", styles: [":host{display:block;position:relative;width:100%}:host.ng-invalid.ng-dirty .datepicker-group:not(:focus-within){input,button.trigger-icon{border-color:#c13018}}:host.no-icon button[type=button]{display:none}:host.no-icon input{padding-right:.75rem}button[type=button]:focus-visible{outline:2px solid #428bca;outline-offset:1px;border-radius:inherit}button.trigger-icon[type=button]:focus-visible{outline:2px solid var(--s-focus-ring-color, #0090ff);outline-offset:-2px;border-radius:0 4px 4px 0}\n"] }]
|
|
1841
1841
|
}], ctorParameters: () => [], propDecorators: { handleHoursKeydown: [], handleMinutesKeydown: [], handleSecondsKeydown: [] } });
|
|
1842
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZGF0ZXBpY2tlci9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZGF0ZXBpY2tlci9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQXFCLE1BQU0sc0JBQXNCLENBQUM7QUFDaEcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFDSCxlQUFlLEVBQ2YsU0FBUyxFQUNULFFBQVEsRUFDUixVQUFVLEVBQ1YsVUFBVSxFQUNWLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUNMLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBR0gsV0FBVyxFQUNYLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsU0FBUyxFQUNULG1CQUFtQixFQUduQixVQUFVLEdBQ2IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFvQyxNQUFNLHNCQUFzQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMs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cUJBQ0o7d0RBNHFEUyxrQkFBa0IsTUFXbEIsb0JBQW9CLE1BV3BCLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka1RyYXBGb2N1cywgTGl2ZUFubm91bmNlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7IENka0Nvbm5lY3RlZE92ZXJsYXksIENka092ZXJsYXlPcmlnaW4sIENvbm5lY3RlZFBvc2l0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgTmdDbGFzcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIGFmdGVyTmV4dFJlbmRlcixcbiAgICBDb21wb25lbnQsXG4gICAgY29tcHV0ZWQsXG4gICAgRGVzdHJveVJlZixcbiAgICBFbGVtZW50UmVmLFxuICAgIGluamVjdCxcbiAgICBJbmplY3RvcixcbiAgICBpbnB1dCxcbiAgICBtb2RlbCxcbiAgICBPbkluaXQsXG4gICAgb3V0cHV0LFxuICAgIHNpZ25hbCxcbiAgICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtcbiAgICBBYnN0cmFjdENvbnRyb2wsXG4gICAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTkdfVkFMSURBVE9SUyxcbiAgICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICBOZ0NvbnRyb2wsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBWYWxpZGF0aW9uRXJyb3JzLFxuICAgIFZhbGlkYXRvcixcbiAgICBWYWxpZGF0b3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IERhdGVTZWdtZW50RW5naW5lLCBTZWdtZW50RW5naW5lQ29uZmlnLCBTZWdtZW50S2luZCB9IGZyb20gJy4vZGF0ZS1zZWdtZW50LWlucHV0JztcbmltcG9ydCB7IGZvcm1hdFZhbHVlRm9ySW5wdXQsIGlzU2FtZURheSwgcGFyc2VJbnB1dCwgc3RyaXBUaW1lIH0gZnJvbSAnLi9kYXRlLnV0aWxzJztcbmltcG9ydCB0eXBlIHsgQ2FsZW5kYXJEYXksIERhdGVQaWNrZXJNb2RlLCBEYXRlUmFuZ2UgfSBmcm9tICcuL21vZGVscyc7XG5cbnR5cGUgRGF0ZXBpY2tlclZhbHVlID0gRGF0ZSB8IERhdGVSYW5nZSB8IERhdGVbXSB8IG51bGw7XG50eXBlIFBpY2tlclZpZXcgPSAnY2FsZW5kYXInIHwgJ21vbnRocycgfCAneWVhcnMnO1xuXG5mdW5jdGlvbiBudW1lcmljS2V5c09ubHkoKTogTWV0aG9kRGVjb3JhdG9yIHtcbiAgICByZXR1cm4gKF90YXJnZXQsIF9rZXksIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgICAgICBjb25zdCBvcmlnaW5hbDogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uICh0aGlzOiB1bmtub3duLCBldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICAgICAgY29uc3QgaXNWYWxpZEtleSA9XG4gICAgICAgICAgICAgICAgWydBcnJvd1VwJywgJ0Fycm93RG93bicsICdCYWNrc3BhY2UnLCAnRGVsZXRlJywgJ1RhYiddLmluY2x1ZGVzKGV2ZW50LmtleSkgfHwgL15cXGQkLy50ZXN0KGV2ZW50LmtleSk7XG4gICAgICAgICAgICBpZiAoIWlzVmFsaWRLZXkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbC5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfTtcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzLWRhdGVwaWNrZXInLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0NsYXNzLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIENka1RyYXBGb2N1cyxcbiAgICAgICAgQ2RrT3ZlcmxheU9yaWdpbixcbiAgICAgICAgQ2RrQ29ubmVjdGVkT3ZlcmxheSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVzOiBbXG4gICAgICAgIGBcbiAgICAgICAgICAgIDpob3N0IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6aG9zdC5uZy1pbnZhbGlkLm5nLWRpcnR5IC5kYXRlcGlja2VyLWdyb3VwOm5vdCg6Zm9jdXMtd2l0aGluKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgYnV0dG9uLnRyaWdnZXItaWNvbiB7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogI2MxMzAxODtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6aG9zdC5uby1pY29uIGJ1dHRvblt0eXBlPSdidXR0b24nXSB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDpob3N0Lm5vLWljb24gaW5wdXQge1xuICAgICAgICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDAuNzVyZW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidXR0b25bdHlwZT0nYnV0dG9uJ106Zm9jdXMtdmlzaWJsZSB7XG4gICAgICAgICAgICAgICAgb3V0bGluZTogMnB4IHNvbGlkICM0MjhiY2E7XG4gICAgICAgICAgICAgICAgb3V0bGluZS1vZmZzZXQ6IDFweDtcbiAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnV0dG9uLnRyaWdnZXItaWNvblt0eXBlPSdidXR0b24nXTpmb2N1cy12aXNpYmxlIHtcbiAgICAgICAgICAgICAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tcy1mb2N1cy1yaW5nLWNvbG9yLCAjMDA5MGZmKTtcbiAgICAgICAgICAgICAgICBvdXRsaW5lLW9mZnNldDogLTJweDtcbiAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwIDRweCA0cHggMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgYCxcbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ1tjbGFzcy5uby1pY29uXSc6ICchc2hvd0ljb24oKScsXG4gICAgfSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogRGF0ZXBpY2tlckNvbXBvbmVudCxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IERhdGVwaWNrZXJDb21wb25lbnQsXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRlcGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25Jbml0IHtcbiAgICBwcml2YXRlIHN0YXRpYyBpZENvdW50ZXIgPSAwO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERBWVNfSU5fV0VFSyA9IDc7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTU9OVEhTX0lOX1lFQVIgPSAxMjtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNT05USFNfUEVSX1JPVyA9IDM7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgWUVBUlNfUEVSX0dSSUQgPSAxMjtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBZRUFSU19QRVJfUk9XID0gMztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX01JTlVURV9TVEVQID0gNTtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfSE9VUlMgPSAyNDtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfTUlOVVRFUyA9IDYwO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEhPVVJTX1BFUl9NRVJJRElFTSA9IDEyO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERPVUJMRV9DTElDS19USFJFU0hPTERfTVMgPSA0MDA7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBuZXh0SWQoKTogc3RyaW5nIHtcbiAgICAgICAgRGF0ZXBpY2tlckNvbXBvbmVudC5pZENvdW50ZXIrKztcbiAgICAgICAgcmV0dXJuIGBzLWRhdGVwaWNrZXItJHtEYXRlcGlja2VyQ29tcG9uZW50LmlkQ291bnRlcn1gO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBJbnB1dHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICAvKiogSFRNTCBgaWRgIGFwbGljYWRvIGFvIGVsZW1lbnRvIGA8aW5wdXQ+YC4gQXV0by1nZXJhZG8gcXVhbmRvIG9taXRpZG8uICovXG4gICAgcmVhZG9ubHkgaW5wdXRJZCA9IGlucHV0PHN0cmluZz4oRGF0ZXBpY2tlckNvbXBvbmVudC5uZXh0SWQoKSk7XG5cbiAgICAvKiogQXRyaWJ1dG8gYG5hbWVgIGRvIGA8aW5wdXQ+YCBuYXRpdm8uICovXG4gICAgcmVhZG9ubHkgbmFtZSA9IGlucHV0PHN0cmluZz4oKTtcblxuICAgIC8qKiBUZXh0byBleGliaWRvIHF1YW5kbyBuZW5odW0gdmFsb3IgZXN0w6Egc2VsZWNpb25hZG8uICovXG4gICAgcmVhZG9ubHkgcGxhY2Vob2xkZXIgPSBpbnB1dDxzdHJpbmc+KCk7XG5cbiAgICAvKipcbiAgICAgKiBNb2RvIGRlIHNlbGXDp8OjbyBkbyBjb21wb25lbnRlLlxuICAgICAqIC0gYCdkYXRlJ2Ag4oCUIHNlbGXDp8OjbyBkZSBkYXRhIMO6bmljYSAocGFkcsOjbylcbiAgICAgKiAtIGAnbW9udGgnYCDigJQgc2VsZcOnw6NvIGRlIG3DqnMvYW5vXG4gICAgICogLSBgJ2RhdGV0aW1lJ2Ag4oCUIGRhdGEgY29tIGhvcmEgKHJlcXVlciBjb25maXJtYcOnw6NvKVxuICAgICAqIC0gYCd0aW1lJ2Ag4oCUIGFwZW5hcyBzZWxlw6fDo28gZGUgaG9yYVxuICAgICAqIC0gYCdyYW5nZSdgIOKAlCBpbnRlcnZhbG8gZW50cmUgZHVhcyBkYXRhc1xuICAgICAqL1xuICAgIHJlYWRvbmx5IG1vZGUgPSBpbnB1dDxEYXRlUGlja2VyTW9kZT4oJ2RhdGUnKTtcblxuICAgIC8qKlxuICAgICAqIE1vZG8gZGUgc2VsZcOnw6NvIHF1YW5kbyBgbW9kZWAgw6kgYCdkYXRlJ2AuXG4gICAgICogLSBgJ3NpbmdsZSdgIOKAlCBzZWxlw6fDo28gZGUgdW1hIMO6bmljYSBkYXRhIChwYWRyw6NvKVxuICAgICAqIC0gYCdtdWx0aXBsZSdgIOKAlCBzZWxlw6fDo28gZGUgbcO6bHRpcGxhcyBkYXRhcyBhdnVsc2FzXG4gICAgICovXG4gICAgcmVhZG9ubHkgc2VsZWN0aW9uTW9kZSA9IGlucHV0PCdzaW5nbGUnIHwgJ211bHRpcGxlJz4oJ3NpbmdsZScpO1xuXG4gICAgLyoqIFNlcGFyYWRvciBleGliaWRvIGVudHJlIGFzIGRhdGFzIG5vIG1vZG8gYHNlbGVjdGlvbk1vZGUgPSAnbXVsdGlwbGUnYC4gKi9cbiAgICByZWFkb25seSBtdWx0aXBsZVNlcGFyYXRvciA9IGlucHV0PHN0cmluZz4oJywgJyk7XG5cbiAgICAvKiogUXVhbmRvIGB0cnVlYCwgZXhpYmUgbyBib3TDo28gZGUgw61jb25lIGFvIGxhZG8gZG8gY2FtcG8uICovXG4gICAgcmVhZG9ubHkgc2hvd0ljb24gPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIENsYXNzZSBkbyDDrWNvbmUgZXhpYmlkbyBubyBib3TDo28gZG8gY2FtcG8uXG4gICAgICogUXVhbmRvIGBtb2RlYCDDqSBgJ3RpbWUnYCwgbyBwYWRyw6NvIG11ZGEgYXV0b21hdGljYW1lbnRlIHBhcmEgYCdmYXMgZmEtY2xvY2snYC5cbiAgICAgKi9cbiAgICByZWFkb25seSBpY29uID0gaW5wdXQ8c3RyaW5nPignZmFzIGZhLWNhbGVuZGFyJyk7XG5cbiAgICAvKiogRGF0YSBtw61uaW1hIHNlbGVjaW9uw6F2ZWwuIERpYXMvbWVzZXMgYW50ZXJpb3JlcyBmaWNhbSBkZXNhYmlsaXRhZG9zLiAqL1xuICAgIHJlYWRvbmx5IG1pbiA9IGlucHV0PERhdGUgfCBudWxsPihudWxsKTtcblxuICAgIC8qKiBEYXRhIG3DoXhpbWEgc2VsZWNpb27DoXZlbC4gRGlhcy9tZXNlcyBwb3N0ZXJpb3JlcyBmaWNhbSBkZXNhYmlsaXRhZG9zLiAqL1xuICAgIHJlYWRvbmx5IG1heCA9IGlucHV0PERhdGUgfCBudWxsPihudWxsKTtcblxuICAgIC8qKiBEYXRhIGV4aWJpZGEgYW8gYWJyaXIgbyBjYWxlbmTDoXJpbyBxdWFuZG8gbmVuaHVtYSBkYXRhIGVzdMOhIHNlbGVjaW9uYWRhLiAqL1xuICAgIHJlYWRvbmx5IGRlZmF1bHREYXRlID0gaW5wdXQ8RGF0ZSB8IG51bGw+KG51bGwpO1xuXG4gICAgLyoqXG4gICAgICogRm9ybWF0byBkZSBleGliacOnw6NvIGRhIGRhdGEgbm8gY2FtcG8uIFF1YW5kbyBvbWl0aWRvLCDDqSByZXNvbHZpZG8gYSBwYXJ0aXIgZG9cbiAgICAgKiBsb2NhbGUgYXRpdm8gKGNoYXZlIGBwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZV9mb3JtYXRgKSwgY29tIGZhbGxiYWNrIHBhcmEgYGRkL01NL3l5eXlgLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGRhdGVGb3JtYXQgPSBpbnB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXRvIGRlIGV4aWJpw6fDo28gZGFzIGhvcmFzOiBgJzEyJ2Agb3UgYCcyNCdgLiBRdWFuZG8gb21pdGlkbywgw6kgcmVzb2x2aWRvIGEgcGFydGlyXG4gICAgICogZG8gbG9jYWxlIGF0aXZvIChjaGF2ZSBgcGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmhvdXJfZm9ybWF0YCksIGNvbSBmYWxsYmFjayBwYXJhIGAnMjQnYC5cbiAgICAgKi9cbiAgICByZWFkb25seSBob3VyRm9ybWF0ID0gaW5wdXQ8JzEyJyB8ICcyNCcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgICAvKiogSW5jcmVtZW50byBlbSBtaW51dG9zIGFvIHVzYXIgYXMgc2V0YXMgZG8gdGltZSBwaWNrZXIuICovXG4gICAgcmVhZG9ubHkgbWludXRlU3RlcCA9IGlucHV0PG51bWJlcj4oRGF0ZXBpY2tlckNvbXBvbmVudC5ERUZBVUxUX01JTlVURV9TVEVQKTtcblxuICAgIC8qKiBRdWFuZG8gYHRydWVgLCBleGliZSBvIGNhbXBvIGRlIHNlZ3VuZG9zIG5vIHRpbWUgcGlja2VyLiAqL1xuICAgIHJlYWRvbmx5IHNob3dTZWNvbmRzID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIFNlcGFyYWRvciBleGliaWRvIGVudHJlIGFzIGRhdGFzIG5vIG1vZG8gYCdyYW5nZSdgLiAqL1xuICAgIHJlYWRvbmx5IHJhbmdlU2VwYXJhdG9yID0gaW5wdXQ8c3RyaW5nPignIOKAlCAnKTtcblxuICAgIC8qKiBBYnJlIG8gcGFpbmVsIGFvIGZvY2FyIG8gaW5wdXQ7IGZvY28gcGVybWFuZWNlIG5vIGlucHV0LCBuw6NvIHB1bGEgcGFyYSBvIGRyb3Bkb3duLiAqL1xuICAgIHJlYWRvbmx5IHNob3dPbkZvY3VzID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgICAvKiogSW1wZWRlIGRpZ2l0YcOnw6NvIG1hbnVhbDsgdmFsb3Igc8OzIHBvZGUgc2VyIHNlbGVjaW9uYWRvIHBlbG8gY2FsZW5kw6FyaW8uICovXG4gICAgcmVhZG9ubHkgcmVhZG9ubHlJbnB1dCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKiBQcmltZWlybyBkaWEgZGEgc2VtYW5hICgwID0gZG9taW5nbywgMSA9IHNlZ3VuZGEtZmVpcmEsIC4uLiwgNiA9IHPDoWJhZG8pLiAqL1xuICAgIHJlYWRvbmx5IGZpcnN0RGF5T2ZXZWVrID0gaW5wdXQ8bnVtYmVyPigwKTtcblxuICAgIC8qKiBFeGliZS9vY3VsdGEgYSBiYXJyYSBkZSBib3TDtWVzIEhvamUgZSBMaW1wYXIgbm8gcm9kYXDDqS4gKi9cbiAgICByZWFkb25seSBzaG93QnV0dG9uQmFyID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgICAvKiogRXhpYmUgw61jb25lIGRlIGxpbXBhciBpbmxpbmUgbm8gY2FtcG8gZGUgaW5wdXQuICovXG4gICAgcmVhZG9ubHkgc2hvd0NsZWFyID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIEV4aWJlIGRpYXMgZGUgbWVzZXMgYWRqYWNlbnRlcyBuYSBncmFkZSBkbyBjYWxlbmTDoXJpby4gKi9cbiAgICByZWFkb25seSBzaG93T3RoZXJNb250aHMgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICAgIC8qKiBQZXJtaXRlIHNlbGVjaW9uYXIgZGlhcyBkZSBtZXNlcyBhZGphY2VudGVzIG5hIGdyYWRlIGRvIGNhbGVuZMOhcmlvLiAqL1xuICAgIHJlYWRvbmx5IHNlbGVjdE90aGVyTW9udGhzID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIEZlY2hhIG8gcGFpbmVsIGFww7NzIHNlbGVjaW9uYXIgdW1hIGRhdGEgbm8gbW9kbyBgZGF0ZXRpbWVgLiAqL1xuICAgIHJlYWRvbmx5IGhpZGVPbkRhdGVUaW1lU2VsZWN0ID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIEluY3JlbWVudG8gZGUgaG9yYXMgbm8gdGltZSBwaWNrZXIuICovXG4gICAgcmVhZG9ubHkgc3RlcEhvdXIgPSBpbnB1dDxudW1iZXI+KDEpO1xuXG4gICAgLyoqIEluY3JlbWVudG8gZGUgc2VndW5kb3Mgbm8gdGltZSBwaWNrZXIuICovXG4gICAgcmVhZG9ubHkgc3RlcFNlY29uZCA9IGlucHV0PG51bWJlcj4oMSk7XG5cbiAgICAvKiogw41uZGljZSBkZSB0YWIgZG8gY2FtcG8gZGUgaW5wdXQuICovXG4gICAgcmVhZG9ubHkgdGFiaW5kZXggPSBpbnB1dDxudW1iZXI+KCk7XG5cbiAgICAvKiogRm9jYSBhdXRvbWF0aWNhbWVudGUgbyBjYW1wbyBhbyBjYXJyZWdhciBvIGNvbXBvbmVudGUuICovXG4gICAgcmVhZG9ubHkgYXV0b2ZvY3VzID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIERhdGFzIGVzcGVjw61maWNhcyBkZXNhYmlsaXRhZGFzIG5vIGNhbGVuZMOhcmlvLiAqL1xuICAgIHJlYWRvbmx5IGRpc2FibGVkRGF0ZXMgPSBpbnB1dDxEYXRlW10+KFtdKTtcblxuICAgIC8qKiBEaWFzIGRhIHNlbWFuYSBkZXNhYmlsaXRhZG9zICgwID0gZG9taW5nbywgLi4uLCA2ID0gc8OhYmFkbykuICovXG4gICAgcmVhZG9ubHkgZGlzYWJsZWREYXlzID0gaW5wdXQ8bnVtYmVyW10+KFtdKTtcblxuICAgIC8vIOKUgOKUgCBUd28td2F5IG1vZGVscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIC8qKiBFc3RhZG8gZGVzYWJpbGl0YWRvIGRvIGNvbXBvbmVudGUuICovXG4gICAgcmVhZG9ubHkgZGlzYWJsZWQgPSBtb2RlbDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvLyDilIDilIAgT3V0cHV0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIC8qKiBFbWl0aWRvIHF1YW5kbyBvIGNhbXBvIHBlcmRlIG8gZm9jby4gKi9cbiAgICByZWFkb25seSBibHVycmVkID0gb3V0cHV0PEV2ZW50PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gcXVhbmRvIG8gY2FtcG8gcmVjZWJlIG8gZm9jby4gKi9cbiAgICByZWFkb25seSBmb2N1c2VkID0gb3V0cHV0PEV2ZW50PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gYW8gc2VsZWNpb25hciB1bWEgZGF0YSwgbcOqcywgaG9yw6FyaW8gb3UgaW50ZXJ2YWxvLiAqL1xuICAgIHJlYWRvbmx5IHNlbGVjdGVkID0gb3V0cHV0PERhdGVwaWNrZXJWYWx1ZT4oKTtcblxuICAgIC8qKiBFbWl0aWRvIHF1YW5kbyBvIHBhaW5lbCBkbyBjYWxlbmTDoXJpbyBmZWNoYS4gRW1pdGUgbyBlbGVtZW50byBkbyBwYWluZWwuICovXG4gICAgcmVhZG9ubHkgY2xvc2VkID0gb3V0cHV0PEhUTUxFbGVtZW50PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gYW8gY2xpY2FyIG5vIGJvdMOjbyBcIkhvamVcIi4gKi9cbiAgICByZWFkb25seSB0b2RheUNsaWNrID0gb3V0cHV0PERhdGU+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBhbyBjbGljYXIgbm8gYm90w6NvIFwiTGltcGFyXCIgb3Ugbm8gw61jb25lIGRlIGxpbXBhciBpbmxpbmUuICovXG4gICAgcmVhZG9ubHkgY2xlYXJDbGljayA9IG91dHB1dDxNb3VzZUV2ZW50PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gcXVhbmRvIG8gbcOqcyB2aXN1YWxpemFkbyBtdWRhLiAqL1xuICAgIHJlYWRvbmx5IG1vbnRoQ2hhbmdlID0gb3V0cHV0PHsgbW9udGg6IG51bWJlcjsgeWVhcjogbnVtYmVyIH0+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyBhbm8gdmlzdWFsaXphZG8gbXVkYS4gKi9cbiAgICByZWFkb25seSB5ZWFyQ2hhbmdlID0gb3V0cHV0PHsgbW9udGg6IG51bWJlcjsgeWVhcjogbnVtYmVyIH0+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyBwYWluZWwgZG8gY2FsZW5kw6FyaW8gYWJyZS4gKi9cbiAgICByZWFkb25seSBzaG93ID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyB1c3XDoXJpbyBkaWdpdGEgbWFudWFsbWVudGUgbm8gY2FtcG8uICovXG4gICAgcmVhZG9ubHkgdmFsdWVJbnB1dCA9IG91dHB1dDxFdmVudD4oKTtcblxuICAgIC8vIOKUgOKUgCBJbnRlcm5hbCBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBtYXhIb3VycyA9IERhdGVwaWNrZXJDb21wb25lbnQuTUFYX0hPVVJTO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBtYXhNaW51dGVzID0gRGF0ZXBpY2tlckNvbXBvbmVudC5NQVhfTUlOVVRFUztcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGltZUlucHV0TWF4TGVuZ3RoID0gMjtcblxuICAgIHByb3RlY3RlZCBpbnB1dERhdGUgPSAnJztcblxuICAgIHByb3RlY3RlZCBuZ0NvbnRyb2w6IE5nQ29udHJvbCB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHZhbHVlID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNPcGVuID0gc2lnbmFsKGZhbHNlKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNGb2N1c2VkID0gc2lnbmFsKGZhbHNlKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdmlld0RhdGUgPSBzaWduYWwobmV3IERhdGUoKSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBpY2tlclZpZXcgPSBzaWduYWw8UGlja2VyVmlldz4oJ2NhbGVuZGFyJyk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGhvdXJzID0gc2lnbmFsKDApO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBtaW51dGVzID0gc2lnbmFsKDApO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzZWNvbmRzID0gc2lnbmFsKDApO1xuICAgIHByb3RlY3RlZCByZWFkb25seSByYW5nZVZhbHVlID0gc2lnbmFsPERhdGVSYW5nZSB8IG51bGw+KG51bGwpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBtdWx0aXBsZVZhbHVlcyA9IHNpZ25hbDxEYXRlW10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGVuZGluZ1JhbmdlU3RhcnQgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBob3ZlckRhdGUgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwpO1xuICAgIHByaXZhdGUgX2hhc0Zvcm1hdEVycm9yID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBvblZhbGlkYXRvckNoYW5nZTogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAgIHByaXZhdGUgX29uQ2hhbmdlOiAodmFsdWU6IERhdGVwaWNrZXJWYWx1ZSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAgIHByaXZhdGUgX29uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBwb3B1cFBhbmVsID0gdmlld0NoaWxkKCdwb3B1cFBhbmVsJywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaW5jcmVhc2VIb3VyQnV0dG9uID0gdmlld0NoaWxkKCdpbmNyZWFzZUhvdXJCdXR0b24nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpY29uQnV0dG9uID0gdmlld0NoaWxkKCdpY29uQnV0dG9uJywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJpZ2dlcklucHV0ID0gdmlld0NoaWxkLnJlcXVpcmVkKCd0cmlnZ2VySW5wdXQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBob3N0RWxlbWVudCA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbGl2ZUFubm91bmNlciA9IGluamVjdChMaXZlQW5ub3VuY2VyKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3VycmVudExhbmcgPSBzaWduYWwodGhpcy50cmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMYW5nKTtcblxuICAgIC8qKiBSZWZsZXRlIGAocG9pbnRlcjogY29hcnNlKWAg4oCUIGRpc3Bvc2l0aXZvcyB0b3VjaCBwcmVmZXJlbSBvIHBvcHVwIGRvIGNhbGVuZMOhcmlvIGFvIHRlY2xhZG8uICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzVG91Y2hEZXZpY2UgPSBzaWduYWwoXG4gICAgICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cubWF0Y2hNZWRpYSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyB3aW5kb3cubWF0Y2hNZWRpYSgnKHBvaW50ZXI6IGNvYXJzZSknKS5tYXRjaGVzXG4gICAgICAgICAgICA6IGZhbHNlLFxuICAgICk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlZ21lbnRFbmdpbmUgPSBuZXcgRGF0ZVNlZ21lbnRFbmdpbmUoKTtcbiAgICAvKiogRWxlbWVudG8gcXVlIHRpbmhhIGZvY28gYW50ZXMgZG8gcGFpbmVsIGFicmlyIOKAlCB2ZXIgYGNhcHR1cmVGb2N1c09yaWdpbmAvYGNsb3NlUGFuZWxgLiAqL1xuICAgIHByaXZhdGUgZWxlbWVudFRvUmVzdG9yZUZvY3VzVG86IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgLyoqIGB0cnVlYCBzw7MgZHVyYW50ZSBvIGAuZm9jdXMoKWAgcHJvZ3JhbcOhdGljbyBkZSByZXN0YXVyYcOnw6NvIGVtIGBjbG9zZVBhbmVsKClgIOKAlCBldml0YSBxdWVcbiAgICAgKiAgYGhhbmRsZUlucHV0Rm9jdXNgIGludGVycHJldGUgZXNzZSBmb2NvIGNvbW8gdW0gZm9jbyBnZW51w61ubyBkbyB1c3XDoXJpbyBlIHJlYWJyYSBvIHBhaW5lbFxuICAgICAqICBuYSBob3JhIHZpYSBgc2hvd09uRm9jdXNgIChleC46IHNlbGVjaW9uYXIgdW1hIGRhdGEgZGV2b2x2ZSBvIGZvY28gcHJvIGlucHV0LCBxdWUgc2Vuw6NvXG4gICAgICogIHJlYWJyaXJpYSBvIHBhaW5lbCBpbWVkaWF0YW1lbnRlIGRlcG9pcyBkZSBmZWNow6EtbG8pLiAqL1xuICAgIHByaXZhdGUgaXNSZXN0b3JpbmdGb2N1c09uQ2xvc2UgPSBmYWxzZTtcbiAgICBwcml2YXRlIGxhc3RTZWdtZW50Q29uZmlnOiBTZWdtZW50RW5naW5lQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBtZWFzdXJlQ2FudmFzPzogSFRNTENhbnZhc0VsZW1lbnQ7XG4gICAgLyoqIEluY3JlbWVudGFkbyBhIGNhZGEgbXV0YcOnw6NvIGRvIHVzdcOhcmlvIOKAlCBpbnZhbGlkYSBjYWxsYmFja3MgZGUgY2xpcXVlL2ZvY28gYWRpYWRvcyBxdWUgZmljYXJhbSBvYnNvbGV0b3MuICovXG4gICAgcHJpdmF0ZSBpbnRlcmFjdGlvbkdlbmVyYXRpb24gPSAwO1xuICAgIC8qKiBgdGltZVN0YW1wYCBkbyDDumx0aW1vIG1vdXNlZG93biBubyBpbnB1dCBzZWdtZW50YWRvIOKAlCB1c2FkbyBwcmEgZGV0ZWN0YXIgZHVwbG8gY2xpcXVlIG5hIG3Do28uICovXG4gICAgcHJpdmF0ZSBsYXN0TW91c2VEb3duQXQgPSAwO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5vbkxhbmdDaGFuZ2UucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZy5zZXQoZXZlbnQubGFuZyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93Lm1hdGNoTWVkaWEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lZGlhUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHBvaW50ZXI6IGNvYXJzZSknKTtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZVBvaW50ZXJDaGFuZ2UgPSAoZXZlbnQ6IE1lZGlhUXVlcnlMaXN0RXZlbnQpOiB2b2lkID0+IHRoaXMuaXNUb3VjaERldmljZS5zZXQoZXZlbnQubWF0Y2hlcyk7XG4gICAgICAgICAgICBtZWRpYVF1ZXJ5LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGhhbmRsZVBvaW50ZXJDaGFuZ2UpO1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiBtZWRpYVF1ZXJ5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGhhbmRsZVBvaW50ZXJDaGFuZ2UpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgCBDb21wdXRlZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCByZWFkb25seSByZXNvbHZlZEljb24gPSBjb21wdXRlZCgoKSA9PiAodGhpcy5tb2RlKCkgPT09ICd0aW1lJyA/ICdmYXMgZmEtY2xvY2snIDogdGhpcy5pY29uKCkpKTtcblxuICAgIC8qKiBgZGF0ZUZvcm1hdGAgZXhwbMOtY2l0byBvdSByZXNvbHZpZG8gYSBwYXJ0aXIgZG8gbG9jYWxlIGF0aXZvIChmYWxsYmFjayBgZGQvTU0veXl5eWApLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSByZXNvbHZlZERhdGVGb3JtYXQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudExhbmcoKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuZGF0ZUZvcm1hdCgpID8/XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVUcmFuc2xhdGVkT3JEZWZhdWx0KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZV9mb3JtYXQnLCAnZGQvTU0veXl5eScpXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvKiogYGhvdXJGb3JtYXRgIGV4cGzDrWNpdG8gb3UgcmVzb2x2aWRvIGEgcGFydGlyIGRvIGxvY2FsZSBhdGl2byAoZmFsbGJhY2sgYCcyNCdgKS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZWRIb3VyRm9ybWF0ID0gY29tcHV0ZWQ8JzEyJyB8ICcyNCc+KCgpID0+IHtcbiAgICAgICAgdGhpcy5jdXJyZW50TGFuZygpO1xuICAgICAgICBjb25zdCBleHBsaWNpdCA9IHRoaXMuaG91ckZvcm1hdCgpO1xuICAgICAgICBpZiAoZXhwbGljaXQpIHJldHVybiBleHBsaWNpdDtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRlZCA9IHRoaXMucmVzb2x2ZVRyYW5zbGF0ZWRPckRlZmF1bHQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5ob3VyX2Zvcm1hdCcsICcyNCcpO1xuICAgICAgICByZXR1cm4gdHJhbnNsYXRlZCA9PT0gJzEyJyA/ICcxMicgOiAnMjQnO1xuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU0VHTUVOVF9MQUJFTF9LRVlTOiBSZWNvcmQ8U2VnbWVudEtpbmQsIHN0cmluZz4gPSB7XG4gICAgICAgIGRheTogJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlZ21lbnRfZGF5JyxcbiAgICAgICAgbW9udGg6ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWdtZW50X21vbnRoJyxcbiAgICAgICAgeWVhcjogJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlZ21lbnRfeWVhcicsXG4gICAgICAgIGhvdXI6ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9ob3VyJyxcbiAgICAgICAgbWludXRlOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbWludXRlJyxcbiAgICAgICAgc2Vjb25kOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2Vjb25kJyxcbiAgICAgICAgYW1wbTogJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlZ21lbnRfYW1wbScsXG4gICAgfTtcblxuICAgIC8qKiBNb2RvcyBjdWpvIGZvcm1hdG8gZGUgZXhpYmnDp8OjbyDDqSByZXNvbHZpZG8gcGVsYSBlbmdpbmUgZGUgc2VnbWVudG9zIChpbmRlcGVuZGVudGUgZGUgdG91Y2gvcmVhZG9ubHkpLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc1NlZ21lbnRNb2RlQ2FuZGlkYXRlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc011bHRpcGxlTW9kZSgpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLm1vZGUoKTtcbiAgICAgICAgcmV0dXJuIG1vZGUgPT09ICdkYXRlJyB8fCBtb2RlID09PSAnbW9udGgnIHx8IG1vZGUgPT09ICd0aW1lJyB8fCBtb2RlID09PSAnZGF0ZXRpbWUnO1xuICAgIH0pO1xuXG4gICAgLyoqIEludGVyYXRpdmlkYWRlIGRlIGRpZ2l0YcOnw6NvIHBvciBzZWdtZW50byDigJQgZGVzbGlnYWRhIGVtIHRvdWNoIG91IHF1YW5kbyBgcmVhZG9ubHlJbnB1dGAgw6kgdXNhZG8uICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzU2VnbWVudGVkTW9kZSA9IGNvbXB1dGVkKFxuICAgICAgICAoKSA9PiB0aGlzLmlzU2VnbWVudE1vZGVDYW5kaWRhdGUoKSAmJiAhdGhpcy5pc1RvdWNoRGV2aWNlKCkgJiYgIXRoaXMucmVhZG9ubHlJbnB1dCgpLFxuICAgICk7XG5cbiAgICAvKiogSW5kaWNhIHNlIG8gdGltZSBwaWNrZXIgZGV2ZSB1c2FyIG8gZm9ybWF0byBkZSAxMiBob3JhcyBjb20gc2VsZXRvciBBTS9QTS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXMxMkhvdXJGb3JtYXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnJlc29sdmVkSG91ckZvcm1hdCgpID09PSAnMTInKTtcblxuICAgIC8qKiBIb3JhIGV4aWJpZGEgbm8gdGltZSBwaWNrZXI6IDHigJMxMiBubyBmb3JtYXRvIDEyaCwgMOKAkzIzIG5vIGZvcm1hdG8gMjRoLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkaXNwbGF5SG91cnMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmRpc3BsYXlIb3VyRm9yKHRoaXMuaG91cnMoKSkpO1xuXG4gICAgLyoqIE1lcmlkaWFubyBhdHVhbCBkZXJpdmFkbyBkYSBob3JhIGludGVybmEgKDDigJMyMykuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFtUG0gPSBjb21wdXRlZDwnQU0nIHwgJ1BNJz4oKCkgPT4gdGhpcy5tZXJpZGllbUZvcih0aGlzLmhvdXJzKCkpKTtcblxuICAgIHByaXZhdGUgZGlzcGxheUhvdXJGb3IoaG91cnMyNDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzMTJIb3VyRm9ybWF0KCkpIHJldHVybiBob3VyczI0O1xuICAgICAgICBjb25zdCBoMTIgPSBob3VyczI0ICUgRGF0ZXBpY2tlckNvbXBvbmVudC5IT1VSU19QRVJfTUVSSURJRU07XG4gICAgICAgIHJldHVybiBoMTIgPT09IDAgPyBEYXRlcGlja2VyQ29tcG9uZW50LkhPVVJTX1BFUl9NRVJJRElFTSA6IGgxMjtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1lcmlkaWVtRm9yKGhvdXJzMjQ6IG51bWJlcik6ICdBTScgfCAnUE0nIHtcbiAgICAgICAgcmV0dXJuIGhvdXJzMjQgPCBEYXRlcGlja2VyQ29tcG9uZW50LkhPVVJTX1BFUl9NRVJJRElFTSA/ICdBTScgOiAnUE0nO1xuICAgIH1cblxuICAgIC8qKiBUZXh0byAoY29tIEFNL1BNIHF1YW5kbyBhcGxpY8OhdmVsKSBkYSBob3JhIGRlIGRlc3Rpbm8gZG8gYm90w6NvIFwiYXVtZW50YXJcIi9cImRpbWludWlyIGhvcmFcIlxuICAgICAqICDigJQgbWVzbWEgbW90aXZhw6fDo28gZGUgYHByZXZNb250aFRhcmdldGAvYG5leHRNb250aFRhcmdldGAvYHByZXZZZWFyVGFyZ2V0YC9gbmV4dFllYXJUYXJnZXRgOlxuICAgICAqICBzZW0gaXNzbywgbyBib3TDo28gc8OzIGRpeiBcImF1bWVudGFyIGhvcmFcIiwgc2VtIGRpemVyIHF1YWwgaG9yYSB2YWkgcmVzdWx0YXIuICovXG4gICAgcHJpdmF0ZSBmb3JtYXRIb3VyVGFyZ2V0KGhvdXJzMjQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHBhZGRlZCA9IHRoaXMucGFkVGltZSh0aGlzLmRpc3BsYXlIb3VyRm9yKGhvdXJzMjQpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXMxMkhvdXJGb3JtYXQoKSA/IGAke3BhZGRlZH0gJHt0aGlzLm1lcmlkaWVtRm9yKGhvdXJzMjQpfWAgOiBwYWRkZWQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHByZXZIb3VyVGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT5cbiAgICAgICAgdGhpcy5mb3JtYXRIb3VyVGFyZ2V0KCh0aGlzLmhvdXJzKCkgLSB0aGlzLnN0ZXBIb3VyKCkgKyB0aGlzLm1heEhvdXJzKSAlIHRoaXMubWF4SG91cnMpLFxuICAgICk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHRIb3VyVGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT5cbiAgICAgICAgdGhpcy5mb3JtYXRIb3VyVGFyZ2V0KCh0aGlzLmhvdXJzKCkgKyB0aGlzLnN0ZXBIb3VyKCkpICUgdGhpcy5tYXhIb3VycyksXG4gICAgKTtcblxuICAgIC8qKiBNZXNtYSBtb3RpdmHDp8OjbywgcGFyYSBvcyBib3TDtWVzIGRlIG1pbnV0by9zZWd1bmRvL0FNLVBNLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBwcmV2TWludXRlVGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT5cbiAgICAgICAgdGhpcy5wYWRUaW1lKCh0aGlzLm1pbnV0ZXMoKSAtIHRoaXMubWludXRlU3RlcCgpICsgdGhpcy5tYXhNaW51dGVzKSAlIHRoaXMubWF4TWludXRlcyksXG4gICAgKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmV4dE1pbnV0ZVRhcmdldCA9IGNvbXB1dGVkKCgpID0+XG4gICAgICAgIHRoaXMucGFkVGltZSgodGhpcy5taW51dGVzKCkgKyB0aGlzLm1pbnV0ZVN0ZXAoKSkgJSB0aGlzLm1heE1pbnV0ZXMpLFxuICAgICk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJldlNlY29uZFRhcmdldCA9IGNvbXB1dGVkKCgpID0+IHRoaXMucGFkVGltZSgodGhpcy5zZWNvbmRzKCkgLSB0aGlzLnN0ZXBTZWNvbmQoKSArIDYwKSAlIDYwKSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHRTZWNvbmRUYXJnZXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnBhZFRpbWUoKHRoaXMuc2Vjb25kcygpICsgdGhpcy5zdGVwU2Vjb25kKCkpICUgNjApKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBuZXh0TWVyaWRpZW1UYXJnZXQgPSBjb21wdXRlZCgoKSA9PiAodGhpcy5hbVBtKCkgPT09ICdBTScgPyAnUE0nIDogJ0FNJykpO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBvc2l0aW9uczogQ29ubmVjdGVkUG9zaXRpb25bXSA9IFtcbiAgICAgICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAnYm90dG9tJywgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAndG9wJywgb2Zmc2V0WTogNCB9LFxuICAgICAgICB7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICd0b3AnLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdib3R0b20nLCBvZmZzZXRZOiAtNCB9LFxuICAgIF07XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcG9wdXBJZCA9IGNvbXB1dGVkKCgpID0+IGAke3RoaXMuaW5wdXRJZCgpfS1wb3B1cGApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGN1cnJlbnRNb250aEluZGV4ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy52aWV3RGF0ZSgpLmdldE1vbnRoKCkpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjdXJyZW50WWVhciA9IGNvbXB1dGVkKCgpID0+IHRoaXMudmlld0RhdGUoKS5nZXRGdWxsWWVhcigpKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3VycmVudE1vbnRoS2V5ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5tb250aEtleXNbdGhpcy5jdXJyZW50TW9udGhJbmRleCgpXSk7XG5cbiAgICAvKiogQW5vIGRlIGRlc3Rpbm8gZG8gYm90w6NvIFwiYW5vIGFudGVyaW9yXCIvXCJwcsOzeGltbyBhbm9cIiAodmlldyBkZSBtZXNlcykg4oCUIHBybyBhcmlhLWxhYmVsXG4gICAgICogIGFudW5jaWFyIHByYSBvbmRlIG8gYm90w6NvIHZhaSwgasOhIHF1ZSBcIkFubyBhbnRlcmlvclwiIHNvemluaG8gbsOjbyBkaXogcXVhbCBhbm8gw6kgZXNzZS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJldlllYXJUYXJnZXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmN1cnJlbnRZZWFyKCkgLSAxKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmV4dFllYXJUYXJnZXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmN1cnJlbnRZZWFyKCkgKyAxKTtcblxuICAgIC8qKiBNw6pzL2FubyBkZSBkZXN0aW5vIGRvIGJvdMOjbyBcIm3DqnMgYW50ZXJpb3JcIi9cInByw7N4aW1vIG3DqnNcIiAodmlldyBkZSBjYWxlbmTDoXJpbykg4oCUIG1lc21hXG4gICAgICogIG1vdGl2YcOnw6NvIGRlIGBwcmV2WWVhclRhcmdldGAvYG5leHRZZWFyVGFyZ2V0YDogXCJNw6pzIGFudGVyaW9yXCIgc296aW5obyBuw6NvIGRpeiBxdWFsIG3DqnMgw6lcbiAgICAgKiAgZXNzZSwgZSBjcnV6YXIgYSBmcm9udGVpcmEgZG8gYW5vIChleC46IGphbmVpcm8g4oaSIGRlemVtYnJvIGRvIGFubyBhbnRlcmlvcikgdG9ybmFyaWEgZXNzYVxuICAgICAqICBmYWx0YSBkZSBjb250ZXh0byBhaW5kYSBtYWlzIGNvbmZ1c2Egc2VtIG8gYW5vIGp1bnRvLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBwcmV2TW9udGhUYXJnZXQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IG5ldyBEYXRlKHZpZXcuZ2V0RnVsbFllYXIoKSwgdmlldy5nZXRNb250aCgpIC0gMSwgMSk7XG4gICAgICAgIHJldHVybiB0YXJnZXQudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMuY3VycmVudExhbmcoKSwgeyBtb250aDogJ2xvbmcnLCB5ZWFyOiAnbnVtZXJpYycgfSk7XG4gICAgfSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHRNb250aFRhcmdldCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gbmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpLCB2aWV3LmdldE1vbnRoKCkgKyAxLCAxKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldC50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5jdXJyZW50TGFuZygpLCB7IG1vbnRoOiAnbG9uZycsIHllYXI6ICdudW1lcmljJyB9KTtcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBzaG93Q2FsZW5kYXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm1vZGUoKSAhPT0gJ3RpbWUnKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd1RpbWVQaWNrZXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm1vZGUoKSA9PT0gJ2RhdGV0aW1lJyB8fCB0aGlzLm1vZGUoKSA9PT0gJ3RpbWUnKTtcblxuICAgIC8qKiBTZWxlw6fDo28gbcO6bHRpcGxhIGF0aXZhOiBhcGVuYXMgbm8gbW9kbyBgZGF0ZWAgY29tIGBzZWxlY3Rpb25Nb2RlID0gJ211bHRpcGxlJ2AuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzTXVsdGlwbGVNb2RlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zZWxlY3Rpb25Nb2RlKCkgPT09ICdtdWx0aXBsZScgJiYgdGhpcy5tb2RlKCkgPT09ICdkYXRlJyk7XG5cbiAgICAvKiogSW5zdHJ1w6fDo28gbGlkYSBqdW50byBkbyByw7N0dWxvIGRhIGdyYWRlIGRlIGRpYXMg4oCUIGNhZGEgbW9kbyBjb20gc2Vtw6JudGljYSBkZSBzZWxlw6fDo28gbsOjb1xuICAgICAqICDDs2J2aWEgKG3Dumx0aXBsYSwgaW50ZXJ2YWxvKSBnYW5oYSB1bWEgZnJhc2UgcHLDs3ByaWE7IGByYW5nZWAgYWluZGEgc2UgZGl2aWRlIGVtIGR1YXMgZmFzZXNcbiAgICAgKiAgKGVzY29saGVuZG8gaW7DrWNpbyB2cy4gasOhIGNvbSBgcGVuZGluZ1JhbmdlU3RhcnRgLCBlc2NvbGhlbmRvIGZpbSkuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNhbGVuZGFyR3JpZEFyaWFMYWJlbEtleSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNNdWx0aXBsZU1vZGUoKSkgcmV0dXJuICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9jYWxlbmRhcl9sYWJlbF9tdWx0aXBsZSc7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGVuZGluZ1JhbmdlU3RhcnQoKVxuICAgICAgICAgICAgICAgID8gJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2NhbGVuZGFyX2xhYmVsX3JhbmdlX3BlbmRpbmcnXG4gICAgICAgICAgICAgICAgOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY2FsZW5kYXJfbGFiZWxfcmFuZ2UnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY2FsZW5kYXJfbGFiZWwnO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG9yZGVyZWRXZWVrRGF5S2V5cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLmZpcnN0RGF5T2ZXZWVrKCk7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy53ZWVrRGF5S2V5cy5zbGljZShzdGFydCksIC4uLnRoaXMud2Vla0RheUtleXMuc2xpY2UoMCwgc3RhcnQpXTtcbiAgICB9KTtcblxuICAgIC8qKiBDaWVudGUgZGEgZmFzZSBkZSBzZWxlw6fDo28gZW0gYHJhbmdlYDogZW5xdWFudG8gbsOjbyBow6EgYHBlbmRpbmdSYW5nZVN0YXJ0YCwgw6kgYSBtZXNtYSBjaGF2ZVxuICAgICAqICBkZSBzZW1wcmUgKFwic2VsZWNpb25hciBpbnRlcnZhbG9cIik7IGRlcG9pcyBkbyBwcmltZWlybyBjbGlxdWUsIG11ZGEgcHJhIHVtYSBjaGF2ZSBxdWUgY2l0YVxuICAgICAqICBhIGRhdGEgaW5pY2lhbCBqw6EgZXNjb2xoaWRhLCBqw6EgcXVlIHJlYWJyaXIvcmVlbnRyYXIgbm8gZGnDoWxvZ28gbmVzc2UgbWVpby10ZW1wbyBuw6NvIGRhdmFcbiAgICAgKiAgbmVuaHVtYSBwaXN0YSBkZSBxdWUgYSBzZWd1bmRhIG1ldGFkZSBkbyBmbHV4byBlcmEgYSBxdWUgZmFsdGF2YS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlhbG9nQXJpYUxhYmVsS2V5ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgIT09ICdyYW5nZScpIHJldHVybiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X2RhdGUnO1xuICAgICAgICByZXR1cm4gdGhpcy5wZW5kaW5nUmFuZ2VTdGFydCgpXG4gICAgICAgICAgICA/ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWxlY3RfcmFuZ2VfZW5kJ1xuICAgICAgICAgICAgOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X3JhbmdlJztcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBkaWFsb2dBcmlhTGFiZWxQYXJhbXMgPSBjb21wdXRlZDx7IGRhdGU/OiBzdHJpbmcgfT4oKCkgPT4ge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nUmFuZ2VTdGFydCgpO1xuICAgICAgICByZXR1cm4gcGVuZGluZyA/IHsgZGF0ZTogdGhpcy5mb3JtYXREYXlBcmlhTGFiZWwocGVuZGluZykgfSA6IHt9O1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJhbmdlU3RhdHVzRWxlbWVudElkID0gY29tcHV0ZWQoKCkgPT4gYCR7dGhpcy5pbnB1dElkKCl9LXJhbmdlLXN0YXR1c2ApO1xuXG4gICAgLyoqIFRleHRvIGRvIGA8c3Bhbj5gIGBzci1vbmx5YCByZWZlcmVuY2lhZG8gcG9yIGBhcmlhLWRlc2NyaWJlZGJ5YCBubyBgPGlucHV0PmAg4oCUIGTDoSBhbyBjYW1wb1xuICAgICAqICB1bSBjb250ZcO6ZG8gcGVyc2lzdGVudGUgZSBhY2Vzc8OtdmVsIGVucXVhbnRvIHPDsyBhIGRhdGEgaW5pY2lhbCBkbyBpbnRlcnZhbG8gZm9pIGVzY29saGlkYSxcbiAgICAgKiAgasOhIHF1ZSBgaW5wdXREYXRlYCBzw7MgcmVmbGV0ZSBvIHZhbG9yIGNvbXBsZXRvIGRlcG9pcyBkYSBzZWd1bmRhIGVzY29saGEgKGEgYXR1YWxpemHDp8Ojb1xuICAgICAqICBwYXJjaWFsIGVtIGBzZWxlY3REYXRlKClgIGNvYnJlIG8gdGV4dG8gdmlzw612ZWw7IGlzdG8gY29icmUgbyBxdWUgdW0gbGVpdG9yIGRlIHRlbGEgbMOqIGFvXG4gICAgICogIGZvY2FyL3JlbGVyIG8gY2FtcG8pLiBVc2EgYGFyaWEtZGVzY3JpYmVkYnlgLCBuw6NvIGBhcmlhLWxhYmVsYCwgcHJhIHPDsyBBQ1JFU0NFTlRBUlxuICAgICAqICBpbmZvcm1hw6fDo28gc2VtIHNvYnJlc2NyZXZlciBvIG5vbWUgYWNlc3PDrXZlbCBxdWUgaW50ZWdyYcOnw7VlcyAoZHluYW1pYy1mb3JtLCBzaG93Y2FzZSlcbiAgICAgKiAgasOhIGNvbnRyb2xhbSBwb3IgZm9yYSBkbyBjb21wb25lbnRlLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSByYW5nZVBlbmRpbmdTdGF0dXNUZXh0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgIT09ICdyYW5nZScpIHJldHVybiAnJztcbiAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ1JhbmdlU3RhcnQoKTtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmcgPyB0aGlzLmJ1aWxkUmFuZ2VTdGFydFNlbGVjdGVkVGV4dChwZW5kaW5nKSA6ICcnO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsYWNlaG9sZGVyS2V5ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBtb2RlID0gdGhpcy5tb2RlKCk7XG4gICAgICAgIHJldHVybiBgcGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcGxhY2Vob2xkZXJfJHttb2RlfWA7XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZWZmZWN0aXZlUmFuZ2UgPSBjb21wdXRlZCgoKTogeyBzdGFydDogRGF0ZSB8IG51bGw7IGVuZDogRGF0ZSB8IG51bGwgfSA9PiB7XG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0KCk7XG4gICAgICAgIGNvbnN0IGhvdmVyID0gdGhpcy5ob3ZlckRhdGUoKTtcbiAgICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgICAgIGlmIChob3Zlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHBlbmRpbmcuZ2V0VGltZSgpIDw9IGhvdmVyLmdldFRpbWUoKSA/IFtwZW5kaW5nLCBob3Zlcl0gOiBbaG92ZXIsIHBlbmRpbmddO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBwZW5kaW5nLCBlbmQ6IG51bGwgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yYW5nZVZhbHVlKCkgPz8geyBzdGFydDogbnVsbCwgZW5kOiBudWxsIH07XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2FsZW5kYXJXZWVrcyA9IGNvbXB1dGVkKCgpOiBDYWxlbmRhckRheVtdW10gPT4ge1xuICAgICAgICBjb25zdCB5ZWFyID0gdGhpcy5jdXJyZW50WWVhcigpO1xuICAgICAgICBjb25zdCBtb250aCA9IHRoaXMuY3VycmVudE1vbnRoSW5kZXgoKTtcbiAgICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLmVmZmVjdGl2ZVJhbmdlKCk7XG4gICAgICAgIGNvbnN0IHJhbmdlU3RhcnRUaW1lID0gcmFuZ2Uuc3RhcnQgPyBzdHJpcFRpbWUocmFuZ2Uuc3RhcnQpIDogbnVsbDtcbiAgICAgICAgY29uc3QgcmFuZ2VFbmRUaW1lID0gcmFuZ2UuZW5kID8gc3RyaXBUaW1lKHJhbmdlLmVuZCkgOiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0RGF5T2ZNb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKTtcbiAgICAgICAgY29uc3Qgc3RhcnRXZWVrRGF5ID0gZmlyc3REYXlPZk1vbnRoLmdldERheSgpO1xuICAgICAgICBjb25zdCBhZGp1c3RlZFN0YXJ0RGF5ID0gKHN0YXJ0V2Vla0RheSAtIHRoaXMuZmlyc3REYXlPZldlZWsoKSArIDcpICUgNztcbiAgICAgICAgY29uc3QgZGF5c0luTW9udGggPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIDApLmdldERhdGUoKTtcbiAgICAgICAgY29uc3QgZGF5c0luUHJldk1vbnRoID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDApLmdldERhdGUoKTtcblxuICAgICAgICBjb25zdCBhbGxEYXlzOiBDYWxlbmRhckRheVtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IGFkanVzdGVkU3RhcnREYXkgLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5c0luUHJldk1vbnRoIC0gaSk7XG4gICAgICAgICAgICBhbGxEYXlzLnB1c2godGhpcy5idWlsZENhbGVuZGFyRGF5KGRhdGUsIGZhbHNlLCB0b2RheSwgc2VsZWN0ZWQsIHJhbmdlLCByYW5nZVN0YXJ0VGltZSwgcmFuZ2VFbmRUaW1lKSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBkID0gMTsgZCA8PSBkYXlzSW5Nb250aDsgZCsrKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGgsIGQpO1xuICAgICAgICAgICAgYWxsRGF5cy5wdXNoKHRoaXMuYnVpbGRDYWxlbmRhckRheShkYXRlLCB0cnVlLCB0b2RheSwgc2VsZWN0ZWQsIHJhbmdlLCByYW5nZVN0YXJ0VGltZSwgcmFuZ2VFbmRUaW1lKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbENlbGxzID1cbiAgICAgICAgICAgIE1hdGguY2VpbChhbGxEYXlzLmxlbmd0aCAvIERhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLKSAqIERhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLO1xuICAgICAgICBsZXQgbmV4dERheSA9IDE7XG4gICAgICAgIHdoaWxlIChhbGxEYXlzLmxlbmd0aCA8IHRvdGFsQ2VsbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIG5leHREYXkpO1xuICAgICAgICAgICAgbmV4dERheSsrO1xuICAgICAgICAgICAgYWxsRGF5cy5wdXNoKHRoaXMuYnVpbGRDYWxlbmRhckRheShkYXRlLCBmYWxzZSwgdG9kYXksIHNlbGVjdGVkLCByYW5nZSwgcmFuZ2VTdGFydFRpbWUsIHJhbmdlRW5kVGltZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgd2Vla3M6IENhbGVuZGFyRGF5W11bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbERheXMubGVuZ3RoOyBpICs9IERhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLKSB7XG4gICAgICAgICAgICB3ZWVrcy5wdXNoKGFsbERheXMuc2xpY2UoaSwgaSArIERhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdlZWtzO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vbnRoc0dyaWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJvd3M6IHsga2V5OiBzdHJpbmc7IGluZGV4OiBudW1iZXIgfVtdW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBEYXRlcGlja2VyQ29tcG9uZW50Lk1PTlRIU19JTl9ZRUFSOyBpICs9IERhdGVwaWNrZXJDb21wb25lbnQuTU9OVEhTX1BFUl9ST1cpIHtcbiAgICAgICAgICAgIHJvd3MucHVzaChbXG4gICAgICAgICAgICAgICAgeyBrZXk6IHRoaXMubW9udGhLZXlzW2ldLCBpbmRleDogaSB9LFxuICAgICAgICAgICAgICAgIHsga2V5OiB0aGlzLm1vbnRoS2V5c1tpICsgMV0sIGluZGV4OiBpICsgMSB9LFxuICAgICAgICAgICAgICAgIHsga2V5OiB0aGlzLm1vbnRoS2V5c1tpICsgMl0sIGluZGV4OiBpICsgMiB9LFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3M7XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3VycmVudERlY2FkZVN0YXJ0ID0gY29tcHV0ZWQoKCkgPT4gTWF0aC5mbG9vcih0aGlzLmN1cnJlbnRZZWFyKCkgLyAxMCkgKiAxMCk7XG5cbiAgICAvKiogSW50ZXJ2YWxvIGRlIGRlc3Rpbm8gZG8gYm90w6NvIFwiZMOpY2FkYSBhbnRlcmlvclwiL1wicHLDs3hpbWEgZMOpY2FkYVwiICh2aWV3IGRlIGFub3MpIOKAlCBtZXNtYVxuICAgICAqICBtb3RpdmHDp8OjbyBkZSBgcHJldlllYXJUYXJnZXRgL2BuZXh0WWVhclRhcmdldGAuIGBuYXZpZ2F0ZVByZXZgL2BuYXZpZ2F0ZU5leHRgIGRlc2xvY2FtXG4gICAgICogIGB2aWV3RGF0ZWAgZW0gwrExMCBhbm9zIChuw6NvIMKxMTIpIG5lc3NhIHZpZXc7IG8gZ3JpZCBleGliaWRvIMOpIHF1ZSBtb3N0cmEgMTIgYW5vcyBwb3JcbiAgICAgKiAgcMOhZ2luYSAodmVyIGB5ZWFyc0dyaWRgKSDigJQgZGHDrSBvIGludGVydmFsbyBpciBkZSBgY3VycmVudERlY2FkZVN0YXJ0KCkgwrEgMTBgIGF0w6lcbiAgICAgKiAgYCsgMTFgIHByYSBiYXRlciBleGF0YW1lbnRlIGNvbSBhIHDDoWdpbmEgcXVlIG8gY2xpcXVlIHJlYWxtZW50ZSBhYnJlLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBwcmV2RGVjYWRlUmFuZ2UgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKSAtIDEwO1xuICAgICAgICByZXR1cm4geyBzdGFydFllYXI6IHN0YXJ0LCBlbmRZZWFyOiBzdGFydCArIDExIH07XG4gICAgfSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHREZWNhZGVSYW5nZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLmN1cnJlbnREZWNhZGVTdGFydCgpICsgMTA7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0WWVhcjogc3RhcnQsIGVuZFllYXI6IHN0YXJ0ICsgMTEgfTtcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSB5ZWFyc0dyaWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKTtcbiAgICAgICAgY29uc3Qgcm93czogbnVtYmVyW11bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IERhdGVwaWNrZXJDb21wb25lbnQuWUVBUlNfUEVSX0dSSUQ7IGkgKz0gRGF0ZXBpY2tlckNvbXBvbmVudC5ZRUFSU19QRVJfUk9XKSB7XG4gICAgICAgICAgICByb3dzLnB1c2goW3N0YXJ0ICsgaSwgc3RhcnQgKyBpICsgMSwgc3RhcnQgKyBpICsgMl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHByZXZEaXNhYmxlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgaWYgKCFtaW4pIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAneWVhcnMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKSA8PSBtaW4uZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5waWNrZXJWaWV3KCkgPT09ICdtb250aHMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlldy5nZXRGdWxsWWVhcigpIDw9IG1pbi5nZXRGdWxsWWVhcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB2aWV3LmdldEZ1bGxZZWFyKCkgPCBtaW4uZ2V0RnVsbFllYXIoKSB8fFxuICAgICAgICAgICAgKHZpZXcuZ2V0RnVsbFllYXIoKSA9PT0gbWluLmdldEZ1bGxZZWFyKCkgJiYgdmlldy5nZXRNb250aCgpIDw9IG1pbi5nZXRNb250aCgpKVxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHREaXNhYmxlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKCFtYXgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAneWVhcnMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKSArIERhdGVwaWNrZXJDb21wb25lbnQuWUVBUlNfUEVSX0dSSUQgLSAxID49IG1heC5nZXRGdWxsWWVhcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgICAgICAgIHJldHVybiB2aWV3LmdldEZ1bGxZZWFyKCkgPj0gbWF4LmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHZpZXcuZ2V0RnVsbFllYXIoKSA+IG1heC5nZXRGdWxsWWVhcigpIHx8XG4gICAgICAgICAgICAodmlldy5nZXRGdWxsWWVhcigpID09PSBtYXguZ2V0RnVsbFllYXIoKSAmJiB2aWV3LmdldE1vbnRoKCkgPj0gbWF4LmdldE1vbnRoKCkpXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyDilIDilIAgVHJhbnNsYXRpb24ga2V5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCByZWFkb25seSB3ZWVrRGF5S2V5cyA9IFtcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV9zdW4nLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF5X21vbicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfdHVlJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV93ZWQnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF5X3RodScsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfZnJpJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV9zYXQnLFxuICAgIF07XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW9udGhLZXlzID0gW1xuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfamFuJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2ZlYicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9tYXInLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfYXByJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX21heScsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9qdW4nLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfanVsJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2F1ZycsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9zZXAnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfb2N0JyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX25vdicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9kZWMnLFxuICAgIF07XG5cbiAgICAvLyDilIDilIAgTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm5nQ29udHJvbCA9IHRoaXMuaW5qZWN0b3IuZ2V0KE5nQ29udHJvbCwgbnVsbCwgeyBzZWxmOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSB0aGlzLmRlZmF1bHREYXRlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGQgJiYgIXRoaXMudmFsdWUoKSAmJiAhdGhpcy5yYW5nZVZhbHVlKCkgJiYgdGhpcy5tdWx0aXBsZVZhbHVlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLnNldChkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5Rm9yKGQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBpbmplY3RvcjogdGhpcy5pbmplY3RvciB9LFxuICAgICAgICApO1xuICAgIH1cbiAgICAvLyDilIDilIAgQ29udHJvbFZhbHVlQWNjZXNzb3Ig4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogRGF0ZXBpY2tlclZhbHVlKTogdm9pZCB7XG4gICAgICAgIGlmICghdmFsdWUgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVWYWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheUZvcihudWxsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi52YWx1ZV0uc29ydCgoYSwgYikgPT4gYS5nZXRUaW1lKCkgLSBiLmdldFRpbWUoKSk7XG4gICAgICAgICAgICB0aGlzLm11bHRpcGxlVmFsdWVzLnNldChzb3J0ZWQpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkoc29ydGVkKTtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0ID0gc29ydGVkWzBdO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUoZmlyc3QuZ2V0RnVsbFllYXIoKSwgZmlyc3QuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRGF0ZVJhbmdlKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldCh2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheSh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodmFsdWUuc3RhcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZSh2YWx1ZS5zdGFydC5nZXRGdWxsWWVhcigpLCB2YWx1ZS5zdGFydC5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWx1ZS5zZXQodmFsdWUgYXMgRGF0ZSk7XG4gICAgICAgIGNvbnN0IGQgPSB2YWx1ZSBhcyBEYXRlO1xuICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IoZCk7XG4gICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSwgZC5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgIHRoaXMuaG91cnMuc2V0KGQuZ2V0SG91cnMoKSk7XG4gICAgICAgIHRoaXMubWludXRlcy5zZXQoZC5nZXRNaW51dGVzKCkpO1xuICAgICAgICB0aGlzLnNlY29uZHMuc2V0KGQuZ2V0U2Vjb25kcygpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBEYXRlcGlja2VyVmFsdWUpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkLnNldChpc0Rpc2FibGVkKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgVmFsaWRhdG9yIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHVibGljIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICAgICAgbGV0IHZhbHVlOiBEYXRlcGlja2VyVmFsdWU7XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGVNb2RlKCkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5tdWx0aXBsZVZhbHVlcygpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSgpID09PSAncmFuZ2UnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMucmFuZ2VWYWx1ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZVZhbGlkYXRpb25FcnJvcnModmFsdWUsIGNvbnRyb2wpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgUHVibGljIGFjdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgb3BlbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmNhcHR1cmVGb2N1c09yaWdpbigpO1xuICAgICAgICB0aGlzLmlzT3Blbi5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMucHJlcGFyZU9wZW5WaWV3KCk7XG4gICAgICAgIHRoaXMuc2hvdy5lbWl0KCk7XG4gICAgICAgIHRoaXMuZm9jdXNQYW5lbEFmdGVyT3BlbigpO1xuICAgIH1cblxuICAgIC8qKiBBYnJlIG8gcGFpbmVsIHNlbSB0cmFuc2ZlcmlyIG8gZm9jbyBwb3IgcGFkcsOjbyAodXNhZG8gcGVsbyBzaG93T25Gb2N1cykuIEVtIG1vZG9zIHNlbVxuICAgICAqICBkaWdpdGHDp8OjbyBwb3Igc2VnbWVudG8gKG11bHRpcGxlL3JhbmdlL3llYXIvdG91Y2gpIG8gZm9jbyBzZWd1ZSBwcm8gY2FsZW5kw6FyaW8gaWd1YWwgZW1cbiAgICAgKiAgb3BlbigpOyBlbSBtb2RvIHNlZ21lbnRhZG8gbyBmb2NvIHBlcm1hbmVjZSBubyBpbnB1dCBwcmEgY29udGludWFyIGRpZ2l0YW5kby4gKi9cbiAgICBwcml2YXRlIG9wZW5PbkZvY3VzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCgpIHx8IHRoaXMuaXNPcGVuKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5jYXB0dXJlRm9jdXNPcmlnaW4oKTtcbiAgICAgICAgdGhpcy5pc09wZW4uc2V0KHRydWUpO1xuICAgICAgICB0aGlzLnByZXBhcmVPcGVuVmlldygpO1xuICAgICAgICB0aGlzLnNob3cuZW1pdCgpO1xuICAgICAgICBpZiAoIXRoaXMuaXNTZWdtZW50ZWRNb2RlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNQYW5lbEFmdGVyT3BlbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c1BhbmVsQWZ0ZXJPcGVuKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICd0aW1lJykge1xuICAgICAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHRoaXMuaW5jcmVhc2VIb3VyQnV0dG9uKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKSwgeyBpbmplY3RvcjogdGhpcy5pbmplY3RvciB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNCZXN0Q2FsZW5kYXJUYXJnZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBHdWFyZGEgbyBlbGVtZW50byBmb2NhZG8gbm8gbW9tZW50byBlbSBxdWUgbyBwYWluZWwgYWJyZSwgcHJhIGRldm9sdmVyIG8gZm9jbyBwcmEgbMOhIGFvXG4gICAgICogIGZlY2hhciBlbSB2ZXogZGUgc2VtcHJlIGZvcsOnYXIgcHJvIGJvdMOjbyBkbyDDrWNvbmUg4oCUIHZlciBgY2xvc2VQYW5lbCgpYC4gKi9cbiAgICBwcml2YXRlIGNhcHR1cmVGb2N1c09yaWdpbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbGVtZW50VG9SZXN0b3JlRm9jdXNUbyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSBhIHZpZXcgaW5pY2lhbCBkbyBwYWluZWwgZSBwb3NpY2lvbmEgbyBjYWxlbmTDoXJpbyBubyBgZGVmYXVsdERhdGVgXG4gICAgICogcXVhbmRvIG5lbmh1bSB2YWxvciBlc3TDoSBzZWxlY2lvbmFkby5cbiAgICAgKi9cbiAgICBwcml2YXRlIHByZXBhcmVPcGVuVmlldygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLnJhbmdlVmFsdWUoKTtcbiAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAncmFuZ2UnICYmIHJhbmdlPy5zdGFydCkge1xuICAgICAgICAgICAgLy8gUmVhYnJpciB1bSBpbnRlcnZhbG8gasOhIGRlZmluaWRvIHByZWNpc2EgY2FpciBzZW1wcmUgbm8gbcOqcyBkbyBpbsOtY2lvIOKAlCBzZW7Do29cbiAgICAgICAgICAgIC8vIGB2aWV3RGF0ZWAgZmljYSBvbmRlIHVtYSBuYXZlZ2HDp8OjbyBhbnRlcmlvciBwYXJvdSBwb3IgYWNhc28gKGV4LjogY3J1emFyIG3DqnMgYW9cbiAgICAgICAgICAgIC8vIGVzY29saGVyIG8gZmltKSwgZSBgZm9jdXNCZXN0Q2FsZW5kYXJUYXJnZXQoKWAgKHByaW1laXJvIGBbZGF0YS1mb2N1cz1cInNlbGVjdGVkXCJdYFxuICAgICAgICAgICAgLy8gZW0gb3JkZW0gZGUgRE9NKSBhY2FiYSBmb2NhbmRvIG8gZmltIG91IG5lbmh1bWEgY8OpbHVsYSwgZGVwZW5kZW5kbyBkZSBxdWFsIG3DqnNcbiAgICAgICAgICAgIC8vIGNhbGhhIGRlIGVzdGFyIGVtIGV4aWJpw6fDo28uXG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShyYW5nZS5zdGFydC5nZXRGdWxsWWVhcigpLCByYW5nZS5zdGFydC5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0RGF0ZSA9IHRoaXMuZGVmYXVsdERhdGUoKTtcbiAgICAgICAgICAgIGlmIChkZWZhdWx0RGF0ZSAmJiAhdGhpcy52YWx1ZSgpICYmICF0aGlzLnJhbmdlVmFsdWUoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKGRlZmF1bHREYXRlLmdldEZ1bGxZZWFyKCksIGRlZmF1bHREYXRlLmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdtb250aCcpIHtcbiAgICAgICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ21vbnRocycpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSgpID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ3llYXJzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBpY2tlclZpZXcuc2V0KCdjYWxlbmRhcicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c0Jlc3RDYWxlbmRhclRhcmdldCgpOiB2b2lkIHtcbiAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5wb3B1cFBhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKCFwYW5lbCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hdkhlYWRlclRhcmdldCA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyVmlldygpID09PSAnY2FsZW5kYXInXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1tkYXRhLW5hdi1oZWFkZXJdIGJ1dHRvbjpub3QoW2Rpc2FibGVkXSknKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPVxuICAgICAgICAgICAgICAgICAgICBuYXZIZWFkZXJUYXJnZXQgPz9cbiAgICAgICAgICAgICAgICAgICAgcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1tkYXRhLWZvY3VzPVwic2VsZWN0ZWRcIl0nKSA/P1xuICAgICAgICAgICAgICAgICAgICBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignW2RhdGEtZm9jdXM9XCJ0b2RheVwiXScpID8/XG4gICAgICAgICAgICAgICAgICAgIHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdidXR0b246bm90KFtkaXNhYmxlZF0pJyk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Py5mb2N1cygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogWmVyYSBvIGVzdGFkbyBkZSBpbnRlcnZhbG8gZW0gYW5kYW1lbnRvIOKAlCB1c2FkbyB0YW50byBwZWxvIGZlY2hhbWVudG8gdG90YWwgZG8gcGFpbmVsXG4gICAgICogIChgY2xvc2VQYW5lbGAsIG9uZGUgbsOjbyBmYXogc2VudGlkbyBhbnVuY2lhciBuYWRhIHBvcnF1ZSBvIGRpw6Fsb2dvIGludGVpcm8gZXN0w6Egc3VtaW5kbylcbiAgICAgKiAgcXVhbnRvIHBlbG8gY2FuY2VsYW1lbnRvIGxldmUgdmlhIEVzY2FwZSBkZW50cm8gZGEgZ3JhZGUgKGBjYW5jZWxQZW5kaW5nUmFuZ2VTdGFydGApLCBxdWVcbiAgICAgKiAgbWFudMOpbSBvIHBhaW5lbCBhYmVydG8gZSBwb3IgaXNzbyBhbnVuY2lhIGEgbXVkYW7Dp2Egc2VwYXJhZGFtZW50ZS4gKi9cbiAgICBwcml2YXRlIHJlc2V0UGVuZGluZ1JhbmdlU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0LnNldChudWxsKTtcbiAgICAgICAgdGhpcy5ob3ZlckRhdGUuc2V0KG51bGwpO1xuICAgIH1cblxuICAgIC8qKiBDYW5jZWxhbWVudG8gbGV2ZSBkZSB1bWEgc2VsZcOnw6NvIGRlIGludGVydmFsbyBlbSBhbmRhbWVudG8gKHZlciBgaGFuZGxlQ2FsZW5kYXJHcmlkS2V5ZG93bmAsXG4gICAgICogIHRlY2xhIEVzY2FwZSkg4oCUIGFvIGNvbnRyw6FyaW8gZGUgYGNsb3NlUGFuZWxgLCBvIHBhaW5lbCBjb250aW51YSBhYmVydG8sIGVudMOjbyBhcXVpIGZhelxuICAgICAqICBzZW50aWRvIGFudW5jaWFyIGEgbXVkYW7Dp2EgZGUgZXN0YWRvLiAqL1xuICAgIHByaXZhdGUgY2FuY2VsUGVuZGluZ1JhbmdlU3RhcnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVzZXRQZW5kaW5nUmFuZ2VTZWxlY3Rpb24oKTtcbiAgICAgICAgLy8gQSBlc2NvbGhhIGRvIGluw61jaW8gKHJhbW8gYCFwZW5kaW5nYCBkZSBzZWxlY3REYXRlKCkpIGdyYXZhIG8gaW7DrWNpbyBwZW5kZW50ZSBlbVxuICAgICAgICAvLyBgaW5wdXREYXRlYCBwcmEgbsOjbyBkZWl4YXIgbyBjYW1wbyBvYnNvbGV0byBkdXJhbnRlIGEgc2VsZcOnw6NvIHBhcmNpYWwgKHZlciBzZWxlY3REYXRlKCkpXG4gICAgICAgIC8vIOKAlCBjYW5jZWxhciBlc3NhIGVzY29saGEgcHJlY2lzYSBkZXNmYXplciBpc3NvIHRhbWLDqW0sIHZvbHRhbmRvIHBybyBpbnRlcnZhbG8gasOhXG4gICAgICAgIC8vIGNvbmZpcm1hZG8gKG91IHZhemlvLCBzZSBuZW5odW0pIOKAlCB0ZXN0YWRvIG1hbnVhbG1lbnRlIHZpYSBkZXZ0b29sczogc2VtIGVzdGEgbGluaGEsIG9cbiAgICAgICAgLy8gY2FtcG8gZmljYXZhIHByZXNvIG1vc3RyYW5kbyBhIGRhdGEgcGVuZGVudGUgZGVzY2FydGFkYSBtZXNtbyBjb20gbyBpbnRlcnZhbG8gYW50aWdvXG4gICAgICAgIC8vIGFpbmRhIGRlc3RhY2FkbyBubyBjYWxlbmTDoXJpby5cbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkodGhpcy5yYW5nZVZhbHVlKCkpO1xuICAgICAgICB2b2lkIHRoaXMubGl2ZUFubm91bmNlci5hbm5vdW5jZShcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9yYW5nZV9zZWxlY3Rpb25fY2FuY2VsbGVkJyksXG4gICAgICAgICAgICAncG9saXRlJyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2xvc2VQYW5lbCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFuZWxFbGVtZW50ID0gdGhpcy5wb3B1cFBhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuaXNPcGVuLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMucmVzZXRQZW5kaW5nUmFuZ2VTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgICAgIHRoaXMuY2xvc2VkLmVtaXQocGFuZWxFbGVtZW50ID8/ICh0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpKTtcblxuICAgICAgICAvLyBTw7MgZm9yw6dhIG8gZm9jbyBwcmEgb3V0cm8gbHVnYXIgc2UgZWxlIGVzdGl2ZXIgZGVudHJvIGRvIHBhaW5lbCBxdWUgZXN0w6Egc2VuZG8gZmVjaGFkb1xuICAgICAgICAvLyAoc2Vuw6NvIG8gdXN1w6FyaW8gZmljYXJpYSBjb20gZm9jbyBcInByZXNvXCIgbnVtIGVsZW1lbnRvIHF1ZSBlc3TDoSBwcmVzdGVzIGEgc3VtaXIgZG8gRE9NKS5cbiAgICAgICAgLy8gU2UgbyBmb2NvIGrDoSBlc3TDoSBlbSBvdXRybyBsdWdhciDigJQgZXguOiBvIHByw7NwcmlvIGlucHV0IHNlZ21lbnRhZG8sIHF1ZSBhYnJpdSBvIHBhaW5lbFxuICAgICAgICAvLyB2aWEgYG9wZW5PbkZvY3VzYCBlIG51bmNhIGNoZWdvdSBhIHBlcmRlciBvIGZvY28g4oCUIGRlaXhhbW9zIGNvbW8gZXN0w6EsIGVtIHZleiBkZSBwdXhhclxuICAgICAgICAvLyBvIGZvY28gcHJvIGJvdMOjbyBkbyDDrWNvbmUgc2VtIG5lbmh1bSBtb3Rpdm8gKGJ1ZyByZWxhdGFkbyB2aWEgR05PTUUgT3JjYTogZmVjaGFyIG9cbiAgICAgICAgLy8gcGFpbmVsIGNsaWNhbmRvIGZvcmEsIGNvbSBvIGZvY28gYWluZGEgbm8gaW5wdXQsIGZhemlhIG8gZm9jbyBwdWxhciBwcm8gw61jb25lKS5cbiAgICAgICAgY29uc3QgZm9jdXNJc0luc2lkZVBhbmVsID1cbiAgICAgICAgICAgIHBhbmVsRWxlbWVudCAhPSBudWxsICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlICYmIHBhbmVsRWxlbWVudC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgICAgICAgaWYgKCFmb2N1c0lzSW5zaWRlUGFuZWwpIHJldHVybjtcblxuICAgICAgICBjb25zdCByZXN0b3JlVGFyZ2V0ID0gdGhpcy5lbGVtZW50VG9SZXN0b3JlRm9jdXNUbztcbiAgICAgICAgdGhpcy5lbGVtZW50VG9SZXN0b3JlRm9jdXNUbyA9IG51bGw7XG4gICAgICAgIGFmdGVyTmV4dFJlbmRlcihcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzUmVzdG9yaW5nRm9jdXNPbkNsb3NlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdG9yZVRhcmdldCAmJiBkb2N1bWVudC5jb250YWlucyhyZXN0b3JlVGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXN0b3JlVGFyZ2V0LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pY29uQnV0dG9uKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pc1Jlc3RvcmluZ0ZvY3VzT25DbG9zZSA9IGZhbHNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPIGJhY2tkcm9wIGRvIENESyBPdmVybGF5IGNvYnJlIGEgdGVsYSBpbnRlaXJhLCBpbmNsdWluZG8gbyBwcsOzcHJpbyB0cmlnZ2VyIOKAlCBjbGljYXIgbm9cbiAgICAgKiBpbnB1dCBvdSBub3MgYm90w7VlcyBkbyB0cmlnZ2VyIGVucXVhbnRvIG8gcGFpbmVsIGrDoSBlc3TDoSBhYmVydG8gdGFtYsOpbSBkaXNwYXJhXG4gICAgICogYGJhY2tkcm9wQ2xpY2tgIChvIHByw7NwcmlvIGA8aW5wdXQ+YCBudW5jYSByZWNlYmUgbyBgY2xpY2tgIG5lc3NlIGNhc28sIGVudMOjb1xuICAgICAqIGBoYW5kbGVJbnB1dENsaWNrYCBudW5jYSBkaXNwYXJhKS4gU2VtIGVzdGUgZmlsdHJvLCBjbGljYXIgbm8gaW5wdXQgcGFyYSB0cm9jYXIgZGVcbiAgICAgKiBzZWdtZW50byBmZWNoYXJpYSBvIHBhaW5lbCBlIHJvdWJhcmlhIG8gZm9jbyBwYXJhIG8gYm90w6NvIGRvIMOtY29uZSAodmlhIGBjbG9zZVBhbmVsYCkuXG4gICAgICogUXVhbmRvIG8gY2xpcXVlIGNhaXUgZXNwZWNpZmljYW1lbnRlIHNvYnJlIG8gYDxpbnB1dD5gLCByZWFwbGljYW1vcyBhIG1lc21hIGzDs2dpY2EgZGVcbiAgICAgKiByZXBvc2ljaW9uYW1lbnRvIGRlIHNlZ21lbnRvIHF1ZSBgaGFuZGxlSW5wdXRDbGlja2AgZmFyaWEsIGVtIHZleiBkZSBzw7MgaWdub3JhciBvIGNsaXF1ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaGFuZGxlQmFja2Ryb3BDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICAvLyBgZXZlbnQudGFyZ2V0YCBkZSB1bSBiYWNrZHJvcENsaWNrIGRvIENESyBPdmVybGF5IMOpIHNlbXByZSBvIHByw7NwcmlvIDxkaXY+IGRvXG4gICAgICAgIC8vIGJhY2tkcm9wLCBudW5jYSBvIGVsZW1lbnRvIHJlYWxtZW50ZSBjbGljYWRvIOKAlCBlbnTDo28gY2hlY2FyIGAuY29udGFpbnMoZXZlbnQudGFyZ2V0KWBcbiAgICAgICAgLy8gbnVuY2EgZnVuY2lvbmEuIEVtIHZleiBkaXNzbywgY29tcGFyYW1vcyBhIGNvb3JkZW5hZGEgcmVhbCBkbyBjbGlxdWUgKHF1ZSBvXG4gICAgICAgIC8vIE1vdXNlRXZlbnQgc2VtcHJlIGNhcnJlZ2EgY29ycmV0YW1lbnRlKSBjb250cmEgb3MgcmV0w6JuZ3Vsb3MgZG9zIGVsZW1lbnRvcyBkbyB0cmlnZ2VyLlxuICAgICAgICBjb25zdCBpbnB1dEVsID0gdGhpcy50cmlnZ2VySW5wdXQoKT8ubmF0aXZlRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaW5wdXRFbCAmJiB0aGlzLmlzU2VnbWVudGVkTW9kZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dFJlY3QgPSBpbnB1dEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgY2xpY2tlZE9uSW5wdXQgPVxuICAgICAgICAgICAgICAgIGV2ZW50LmNsaWVudFggPj0gaW5wdXRSZWN0LmxlZnQgJiZcbiAgICAgICAgICAgICAgICBldmVudC5jbGllbnRYIDw9IGlucHV0UmVjdC5yaWdodCAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmNsaWVudFkgPj0gaW5wdXRSZWN0LnRvcCAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmNsaWVudFkgPD0gaW5wdXRSZWN0LmJvdHRvbTtcbiAgICAgICAgICAgIGlmIChjbGlja2VkT25JbnB1dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VnbWVudFBvaW50ZXJEb3duKGlucHV0RWwsIGV2ZW50LmNsaWVudFgsIGV2ZW50LnRpbWVTdGFtcCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGNsaWNrZWRPblRyaWdnZXIgPVxuICAgICAgICAgICAgZXZlbnQuY2xpZW50WCA+PSByZWN0LmxlZnQgJiZcbiAgICAgICAgICAgIGV2ZW50LmNsaWVudFggPD0gcmVjdC5yaWdodCAmJlxuICAgICAgICAgICAgZXZlbnQuY2xpZW50WSA+PSByZWN0LnRvcCAmJlxuICAgICAgICAgICAgZXZlbnQuY2xpZW50WSA8PSByZWN0LmJvdHRvbTtcbiAgICAgICAgaWYgKGNsaWNrZWRPblRyaWdnZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdG9nZ2xlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVPdmVybGF5S2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlSW5wdXRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNTZWdtZW50ZWRNb2RlKCkgfHwgIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJvdW5kIHRvIGBtb3VzZWRvd25gLCBuw6NvIGBjbGlja2AgKHZlamEgbyBjb21lbnTDoXJpbyBlbSBgYXBwbHlTZWdtZW50Q2xpY2tgKS4gT1xuICAgICAgICAvLyBjb21wb3J0YW1lbnRvIG5hdGl2byBwYWRyw6NvIGRvIGJyb3dzZXIgcHJhIG1vdXNlZG93biBudW0gYDxpbnB1dD5gIGRlIHRleHRvIMOpXG4gICAgICAgIC8vIHBvc2ljaW9uYXIgbyBjYXJldC9pbmljaWFyIHNlbGXDp8OjbyBkZSB0ZXh0byBuYSBjb29yZGVuYWRhIGRvIGNsaXF1ZSDigJQgaXNzbyByb2RhXG4gICAgICAgIC8vICpkZXBvaXMqIGRvcyBub3Nzb3MgbGlzdGVuZXJzIGUgc29icmVzY3JldmVyaWEgbyBgc2V0U2VsZWN0aW9uUmFuZ2VgIGRvIHNlZ21lbnRvXG4gICAgICAgIC8vIGFwbGljYWRvIGxvZ28gYWJhaXhvLiBgcHJldmVudERlZmF1bHQoKWAgZXZpdGEgZXNzYSBjb3JyaWRhLlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmhhbmRsZVNlZ21lbnRQb2ludGVyRG93bihldmVudC50YXJnZXQsIGV2ZW50LmNsaWVudFgsIGV2ZW50LnRpbWVTdGFtcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUG9udG8gZGUgZW50cmFkYSDDum5pY28gcHJvIGNsaXF1ZSBubyBpbnB1dCBzZWdtZW50YWRvIOKAlCBjaGFtYWRvIHRhbnRvIHBvclxuICAgICAqIGBoYW5kbGVJbnB1dENsaWNrYCAobW91c2Vkb3duIGRpcmV0byBubyBgPGlucHV0PmAsIG8gcHJpbWVpcm8gY2xpcXVlLCBhbnRlcyBkbyBiYWNrZHJvcFxuICAgICAqIGV4aXN0aXIpIHF1YW50byBwb3IgYGhhbmRsZUJhY2tkcm9wQ2xpY2tgIChjbGlxdWVzIHNlZ3VpbnRlcywgasOhIGNvbSBvIHBhaW5lbCBhYmVydG8gZSBvXG4gICAgICogYmFja2Ryb3AgY29icmluZG8gbyBpbnB1dCkuIFByZWNpc2Egc2VyIMO6bmljbyBwb3JxdWUgb3MgZG9pcyBjbGlxdWVzIGRlIHVtIGR1cGxvIGNsaXF1ZVxuICAgICAqIHJlYWwgY29zdHVtYW0gY2hlZ2FyIHBvciBjYW1pbmhvcyBESUZFUkVOVEVTIOKAlCBvIHByaW1laXJvIHZpYSBtb3VzZWRvd24gbm8gaW5wdXQsIG9cbiAgICAgKiBzZWd1bmRvIHZpYSBiYWNrZHJvcENsaWNrIOKAlCBlbnTDo28gcmFzdHJlYXIgbyB0aW1lc3RhbXAgZG8gXCLDumx0aW1vIGNsaXF1ZVwiIHNlcGFyYWRhbWVudGVcbiAgICAgKiBlbSBjYWRhIGhhbmRsZXIgbnVuY2EgZGV0ZWN0YXJpYSB1bSBkdXBsbyBjbGlxdWUgZGUgdmVyZGFkZS4gTmVtIGBkYmxjbGlja2AgbmVtXG4gICAgICogYGV2ZW50LmRldGFpbGAgc8OjbyBjb25macOhdmVpcyBhcXVpIChkZXBlbmRlbSBkYSBjb250YWdlbS90YXJnZXRpbmcgaW50ZXJuYSBkZSBjbGlxdWVzIGRvXG4gICAgICogYnJvd3NlciwgcXVlIG5vc3NhcyBtYW5pcHVsYcOnw7VlcyBkZSBmb2NvL3NlbGXDp8OjbyBwYXJlY2VtIGF0cmFwYWxoYXIg4oCUIG9ic2VydmFkb1xuICAgICAqIGVtcGlyaWNhbWVudGU6IGBldmVudC5kZXRhaWxgIGZpY2Egc2VtcHJlIDEpLCBkYcOtIGEgZGV0ZWPDp8OjbyBtYW51YWwgcG9yIHRpbWVzdGFtcC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGhhbmRsZVNlZ21lbnRQb2ludGVyRG93bihpbnB1dDogSFRNTElucHV0RWxlbWVudCwgY2xpZW50WDogbnVtYmVyLCB0aW1lU3RhbXA6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBpc0RvdWJsZUNsaWNrID0gdGltZVN0YW1wIC0gdGhpcy5sYXN0TW91c2VEb3duQXQgPCBEYXRlcGlja2VyQ29tcG9uZW50LkRPVUJMRV9DTElDS19USFJFU0hPTERfTVM7XG4gICAgICAgIHRoaXMubGFzdE1vdXNlRG93bkF0ID0gdGltZVN0YW1wO1xuICAgICAgICBpZiAoaXNEb3VibGVDbGljaykge1xuICAgICAgICAgICAgdGhpcy5sYXN0TW91c2VEb3duQXQgPSAwOyAvLyBldml0YSBxdWUgdW0gdGVyY2Vpcm8gY2xpcXVlIGVuY2FkZWllIGVtIG91dHJvIFwiZHVwbG9cIlxuICAgICAgICAgICAgdGhpcy5zZWxlY3RXaG9sZUZpZWxkKGlucHV0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGx5U2VnbWVudENsaWNrKGlucHV0LCBjbGllbnRYKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY2lvbmEgbyBzZWdtZW50byBzb2IgYSBjb29yZGVuYWRhIGBjbGllbnRYYCBkZSB1bSBjbGlxdWUgbm8gaW5wdXQgc2VnbWVudGFkby5cbiAgICAgKiBDb21wYXJ0aWxoYWRvIHBvciBgaGFuZGxlSW5wdXRDbGlja2AgKG1vdXNlZG93biByZWFsIG5vIGA8aW5wdXQ+YCDigJQgdXNhbW9zIGBtb3VzZWRvd25gXG4gICAgICogZW0gdmV6IGRlIGBjbGlja2AgcG9ycXVlIG8gYGZvY3VzYC9gb3Blbk9uRm9jdXNgIGRpc3BhcmFkbyBubyBtZWlvIGRvIGdlc3RvIHBvZGUgbW9udGFyXG4gICAgICogbyBiYWNrZHJvcCBkbyBDREsgT3ZlcmxheSBlbWJhaXhvIGRvIGN1cnNvciBhbnRlcyBkbyBgbW91c2V1cGAsIGZhemVuZG8gbyBicm93c2VyIHJlc29sdmVyXG4gICAgICogbyBgY2xpY2tgIHBybyBhbmNlc3RyYWwgY29tdW0gZW50cmUgbyBhbHZvIGRvIG1vdXNlZG93biBlIG8gZG8gbW91c2V1cCDigJQgbmEgcHLDoXRpY2EsXG4gICAgICogYDxib2R5PmAg4oCUIGVtIHZleiBkbyBgPGlucHV0PmAgb3UgZG8gYmFja2Ryb3ApIGUgYGhhbmRsZUJhY2tkcm9wQ2xpY2tgIChjbGlxdWUgbm8gdHJpZ2dlclxuICAgICAqIGNvbSBvIHBhaW5lbCBqw6EgYWJlcnRvIGVtIHJlZ2ltZSBlc3TDoXZlbCwgaW50ZXJjZXB0YWRvIHBlbG8gYmFja2Ryb3AgZG8gQ0RLIE92ZXJsYXkpLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXBwbHlTZWdtZW50Q2xpY2soaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQsIGNsaWVudFg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgIC8vIENhbGN1bGEgbyBzZWdtZW50byBhIHBhcnRpciBkYSBjb29yZGVuYWRhIGRvIGNsaXF1ZSAoY2xpZW50WCksIG7Do28gZGVcbiAgICAgICAgLy8gYGlucHV0LnNlbGVjdGlvblN0YXJ0YCDigJQgbyBicm93c2VyIGFqdXN0YSBhIHBvc2nDp8OjbyBkbyBjYXJldCBkZSBmb3JtYSBhc3PDrW5jcm9uYVxuICAgICAgICAvLyBhcMOzcyBvIGNsaXF1ZSAob2JzZXJ2YWRvIGVtcGlyaWNhbWVudGUsIGVzcGVjaWFsbWVudGUgbmEgdHJhbnNpw6fDo28gZGUgZm9jbyksIGVudMOjb1xuICAgICAgICAvLyBsZXIgYHNlbGVjdGlvblN0YXJ0YCBuZXNzZSBtb21lbnRvIMOpIHVtYSBmb250ZSBuw6NvIGNvbmZpw6F2ZWwuIGBjbGllbnRYYCDDqSBzw61uY3Jvbm9cbiAgICAgICAgLy8gZSBpbWVkaWF0bywgc2VtIGVzc2EgY29ycmlkYS5cbiAgICAgICAgY29uc3QgY2hhckluZGV4ID0gdGhpcy5jbGlja0NsaWVudFhUb0NoYXJJbmRleChpbnB1dCwgY2xpZW50WCk7XG4gICAgICAgIGNvbnN0IGdlbmVyYXRpb24gPSArK3RoaXMuaW50ZXJhY3Rpb25HZW5lcmF0aW9uO1xuICAgICAgICAvLyBGb2NhIGUgc2VsZWNpb25hIG8gc2VnbWVudG8ganVudG9zLCBlIHJlYXBsaWNhIG9zIGRvaXMgYWxndW1hcyB2ZXplcyBsb2dvIGVtIHNlZ3VpZGEg4oCUXG4gICAgICAgIC8vIG8gYnJvd3Nlci9DREsgT3ZlcmxheSBwb2RlIG1leGVyIG5vIGZvY28gZGUgZm9ybWEgYXNzw61uY3JvbmEgZGVwb2lzIGRvIGNsaXF1ZSAoYmx1clxuICAgICAgICAvLyBuYXRpdm8gZG8gYmFja2Ryb3AsIGNka1RyYXBGb2N1cyBkbyBwYWluZWwsIGV0Yy4pOyBlbSB2ZXogZGUgdGVudGFyIHByZXZlci9ldml0YXIgY2FkYVxuICAgICAgICAvLyBjYXVzYSwgc2ltcGxlc21lbnRlIHZlbmNlbW9zIHJlYWZpcm1hbmRvIGZvY28rc2VsZcOnw6NvIHBvciBjaW1hLlxuICAgICAgICBjb25zdCBmb2N1c0FuZFNlbGVjdCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSB0aGlzLmludGVyYWN0aW9uR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnNlZ21lbnRFbmdpbmUuc2VsZWN0U2VnbWVudEF0KGNoYXJJbmRleCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuc2VsZWN0U2VnbWVudChpbmRleCk7XG4gICAgICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBY3RpdmVTZWdtZW50UmFuZ2UoaW5wdXQpO1xuICAgICAgICAgICAgdGhpcy5hbm5vdW5jZUFjdGl2ZVNlZ21lbnQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9jdXNBbmRTZWxlY3QoKTtcbiAgICAgICAgc2V0VGltZW91dChmb2N1c0FuZFNlbGVjdCwgMCk7XG4gICAgICAgIHNldFRpbWVvdXQoZm9jdXNBbmRTZWxlY3QsIDUwKTtcbiAgICB9XG5cbiAgICAvKiogRHVwbG8gY2xpcXVlIHNlbGVjaW9uYSBvIGlucHV0IGludGVpcm8gKHRvZG9zIG9zIHNlZ21lbnRvcyksIGNvbW8gbnVtIGA8aW5wdXQ+YCBkZSB0ZXh0byBjb211bS4gKi9cbiAgICBwcm90ZWN0ZWQgaGFuZGxlSW5wdXREYmxDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNTZWdtZW50ZWRNb2RlKCkgfHwgIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNlbGVjdFdob2xlRmllbGQoZXZlbnQudGFyZ2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY2lvbmEgdG9kb3Mgb3Mgc2VnbWVudG9zIGRvIGlucHV0ICh1c2FkbyB0YW50byBwZWxvIGR1cGxvIGNsaXF1ZSBkZXRlY3RhZG8gbmEgbcOjbyBlbVxuICAgICAqIGBoYW5kbGVTZWdtZW50UG9pbnRlckRvd25gIHF1YW50byBwb3IgYGhhbmRsZUlucHV0RGJsQ2xpY2tgLCBtYW50aWRvIGNvbW8gY2FtaW5obyBkaXJldG9cbiAgICAgKiBwcmEgcXVlbSBkaXNwYXJhIHVtIGBkYmxjbGlja2AgZGUgdmVyZGFkZSwgZXguOiBhY2Vzc2liaWxpZGFkZS90ZXN0ZXMpLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2VsZWN0V2hvbGVGaWVsZChpbnB1dDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgIC8vIEdhcmFudGUgdW0gc2VnbWVudG8gYXRpdm8gKmFudGVzKiBkZSBmb2Nhcjogc2UgbyBDREsgT3ZlcmxheSB0aXZlciByb3ViYWRvIG8gZm9jbyBkZVxuICAgICAgICAvLyBmb3JtYSBhc3PDrW5jcm9uYSAoYmx1cikgZW50cmUgb3MgY2xpcXVlcyBxdWUgY29tcMO1ZW0gbyBkdXBsbyBjbGlxdWUsIG8gYGlucHV0LmZvY3VzKClgXG4gICAgICAgIC8vIGFiYWl4byBkaXNwYXJhIHVtIGV2ZW50byBgZm9jdXNgIGdlbnXDrW5vLCBlIGhhbmRsZUlucHV0Rm9jdXMgc8OzIGV2aXRhIGFnZW5kYXIgc3VhIHByw7NwcmlhXG4gICAgICAgIC8vIHJlYXBsaWNhw6fDo28gY29uY29ycmVudGUgKHF1ZSBzb2JyZXNjcmV2ZXJpYSBub3NzYSBzZWxlw6fDo28gZG8gY2FtcG8gaW50ZWlybyBtYWlzIHRhcmRlKVxuICAgICAgICAvLyBxdWFuZG8gZW5jb250cmEgYGdldEFjdGl2ZUluZGV4KCkgIT09IG51bGxgIOKAlCBvIG1lc21vIG1vdGl2byBwZWxvIHF1YWwgaGFuZGxlSW5wdXRDbGlja1xuICAgICAgICAvLyBzZW1wcmUgY2hhbWEgYHNlZ21lbnRFbmdpbmUuc2VsZWN0U2VnbWVudChpbmRleClgIGFudGVzIGRlIGBpbnB1dC5mb2N1cygpYC5cbiAgICAgICAgaWYgKHRoaXMuc2VnbWVudEVuZ2luZS5nZXRBY3RpdmVJbmRleCgpID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuc2VsZWN0Rmlyc3RTZWdtZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ2VuZXJhdGlvbiA9ICsrdGhpcy5pbnRlcmFjdGlvbkdlbmVyYXRpb247XG4gICAgICAgIC8vIE1lc21vIHBhZHLDo28gZGVmZW5zaXZvIGRlIGhhbmRsZUlucHV0Q2xpY2s6IG8gY2xpcXVlIHF1ZSBmZWNoYSBvIGR1cGxvIGNsaXF1ZSBqw6Egcm9kb3VcbiAgICAgICAgLy8gaGFuZGxlSW5wdXRDbGljayAoc2VsZWNpb25hbmRvIHPDsyB1bSBzZWdtZW50bykgZSBwb2RlIHRlciBhZ2VuZGFkbyBzdWFzIHByw7Nwcmlhc1xuICAgICAgICAvLyByZWFwbGljYcOnw7VlcyBhZGlhZGFzIOKAlCBhIGdlcmHDp8OjbyByZWPDqW0taW5jcmVtZW50YWRhIGFzIGludmFsaWRhLCBlbnTDo28gc8OzIGEgc2VsZcOnw6NvIGRvXG4gICAgICAgIC8vIGNhbXBvIGludGVpcm8gc29icmV2aXZlLlxuICAgICAgICBjb25zdCBmb2N1c0FuZFNlbGVjdEFsbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSB0aGlzLmludGVyYWN0aW9uR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgICAgICAgICAgaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKDAsIGlucHV0LnZhbHVlLmxlbmd0aCk7XG4gICAgICAgIH07XG4gICAgICAgIGZvY3VzQW5kU2VsZWN0QWxsKCk7XG4gICAgICAgIHNldFRpbWVvdXQoZm9jdXNBbmRTZWxlY3RBbGwsIDApO1xuICAgICAgICBzZXRUaW1lb3V0KGZvY3VzQW5kU2VsZWN0QWxsLCA1MCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUlucHV0Rm9jdXMoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNGb2N1c2VkLnNldCh0cnVlKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkLmVtaXQoZXZlbnQpO1xuICAgICAgICBpZiAodGhpcy5pc1NlZ21lbnRlZE1vZGUoKSAmJiBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IHRoaXMuc2VnbWVudEVuZ2luZS5nZXREaXNwbGF5U3RyaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zZWdtZW50RW5naW5lLmdldEFjdGl2ZUluZGV4KCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBGb2NvIFwiZ2VudcOtbm9cIiAoVGFiIGEgcGFydGlyIGRlIG91dHJvIGNhbXBvLCBvdSBwcmltZWlybyBmb2NvIG5vIGNhbXBvKSDigJRcbiAgICAgICAgICAgICAgICAvLyBuZW5odW0gc2VnbWVudG8gYXRpdm8gYWluZGEsIGVudMOjbyBzZWxlY2lvbmEgbyBwcmltZWlyby5cbiAgICAgICAgICAgICAgICBjb25zdCBnZW5lcmF0aW9uID0gKyt0aGlzLmludGVyYWN0aW9uR2VuZXJhdGlvbjtcbiAgICAgICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuc2VsZWN0Rmlyc3RTZWdtZW50KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBY3RpdmVTZWdtZW50UmFuZ2UoaW5wdXQpO1xuICAgICAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VHZW51aW5lRm9jdXMoKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT09IHRoaXMuaW50ZXJhY3Rpb25HZW5lcmF0aW9uKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0QWN0aXZlSW5kZXgoKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBY3RpdmVTZWdtZW50UmFuZ2UoaW5wdXQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIErDoSBleGlzdGUgdW0gc2VnbWVudG8gYXRpdm8g4oCUIHBvciBleGVtcGxvLCBoYW5kbGVJbnB1dENsaWNrIGFjYWJvdSBkZVxuICAgICAgICAgICAgICAgIC8vIGRlZmluaS1sbyBlIGVzdMOhIHJlZm9jYW5kbyBvIGlucHV0IHByb2dyYW1hdGljYW1lbnRlIGFww7NzIHVtIGJsdXIgZXNww7pyaW8uXG4gICAgICAgICAgICAgICAgLy8gTsOjbyByZWluaWNpYSBwYXJhIG8gcHJpbWVpcm8gc2VnbWVudG87IHPDsyBnYXJhbnRlIHF1ZSBhIHNlbGXDp8OjbyB2aXN1YWwgYmF0YVxuICAgICAgICAgICAgICAgIC8vIGNvbSBvIGVzdGFkbyBhdHVhbCwgZSBhbnVuY2lhIHPDsyBvIHNlZ21lbnRvIChvIHJlc3VtbyBkbyB2YWxvciBpbnRlaXJvIMOpXG4gICAgICAgICAgICAgICAgLy8gcmVzZXJ2YWRvIGFvIHByaW1laXJvIGZvY28gZ2VudcOtbm8pLlxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWN0aXZlU2VnbWVudFJhbmdlKGlucHV0KTtcbiAgICAgICAgICAgICAgICB0aGlzLmFubm91bmNlQWN0aXZlU2VnbWVudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNob3dPbkZvY3VzKCkgJiYgIXRoaXMuaXNSZXN0b3JpbmdGb2N1c09uQ2xvc2UpIHtcbiAgICAgICAgICAgIHRoaXMub3Blbk9uRm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBNYXBlaWEgYSBjb29yZGVuYWRhIFggKHZpZXdwb3J0KSBkZSB1bSBjbGlxdWUgcGFyYSBvIMOtbmRpY2UgZGUgY2FyYWN0ZXJlIG1haXMgcHLDs3hpbW8gbm8gdmFsb3IgZXhpYmlkby4gKi9cbiAgICBwcml2YXRlIGNsaWNrQ2xpZW50WFRvQ2hhckluZGV4KGlucHV0OiBIVE1MSW5wdXRFbGVtZW50LCBjbGllbnRYOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoaW5wdXQpO1xuICAgICAgICBjb25zdCBjYW52YXMgPSAodGhpcy5tZWFzdXJlQ2FudmFzID8/PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKSk7XG4gICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBpZiAoIWN0eCkgcmV0dXJuIDA7XG4gICAgICAgIGN0eC5mb250ID0gYCR7c3R5bGUuZm9udFN0eWxlfSAke3N0eWxlLmZvbnRXZWlnaHR9ICR7c3R5bGUuZm9udFNpemV9ICR7c3R5bGUuZm9udEZhbWlseX1gO1xuICAgICAgICBjb25zdCByZWN0ID0gaW5wdXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdMZWZ0ID0gcGFyc2VGbG9hdChzdHlsZS5wYWRkaW5nTGVmdCkgfHwgMDtcbiAgICAgICAgY29uc3QgbG9jYWxYID0gY2xpZW50WCAtIHJlY3QubGVmdCAtIHBhZGRpbmdMZWZ0ICsgaW5wdXQuc2Nyb2xsTGVmdDtcbiAgICAgICAgY29uc3QgdGV4dCA9IGlucHV0LnZhbHVlO1xuICAgICAgICBsZXQgYmVzdEluZGV4ID0gMDtcbiAgICAgICAgbGV0IGJlc3REaXN0YW5jZSA9IEluZmluaXR5O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguYWJzKGN0eC5tZWFzdXJlVGV4dCh0ZXh0LnNsaWNlKDAsIGkpKS53aWR0aCAtIGxvY2FsWCk7XG4gICAgICAgICAgICBpZiAoZGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgICAgICBiZXN0SW5kZXggPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZXN0SW5kZXg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZU5hdGl2ZUlucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlSW5wdXQuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUlucHV0Qmx1cihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc0ZvY3VzZWQuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5ibHVycmVkLmVtaXQoZXZlbnQpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBjb25zdCB3YXNTZWdtZW50ZWQgPSB0aGlzLmlzU2VnbWVudGVkTW9kZSgpO1xuICAgICAgICBpZiAod2FzU2VnbWVudGVkKSB7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5saXZlQW5ub3VuY2VyLmNsZWFyKCk7XG4gICAgICAgICAgICB0aGlzLmNvbW1pdFNlZ21lbnRlZFZhbHVlSWZDb21wbGV0ZSgpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLnNlZ21lbnRFbmdpbmUuaXNFbXB0eSgpID8gJycgOiB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0RGlzcGxheVN0cmluZygpO1xuICAgICAgICAgICAgaW5wdXQudmFsdWUgPSB0aGlzLmlucHV0RGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlucHV0LnZhbHVlPy50cmltKCkpIHtcbiAgICAgICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IChldmVudCBhcyBGb2N1c0V2ZW50KS5yZWxhdGVkVGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5wb3B1cFBhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAvLyBFbSBtb2RvIHNlZ21lbnRhZG8sIHVtIGJsdXIgc2VtIGByZWxhdGVkVGFyZ2V0YCBub3JtYWxtZW50ZSBuw6NvIMOpIHVtYSBzYcOtZGEgcmVhbFxuICAgICAgICAgICAgLy8gZGUgZm9jbyDigJQgw6kgbyBiYWNrZHJvcCB0cmFuc3BhcmVudGUgZG8gcHLDs3ByaW8gcG9wdXAgKG7Do28gZm9jw6F2ZWwpIGludGVyY2VwdGFuZG9cbiAgICAgICAgICAgIC8vIHVtIGNsaXF1ZSBubyB0cmlnZ2VyIHBhcmEgdHJvY2FyIGRlIHNlZ21lbnRvLiBOw6NvIHJlZGlyZWNpb25hIG8gZm9jbyBwcm8gcGFpbmVsXG4gICAgICAgICAgICAvLyBuZXNzZSBjYXNvOyBkZWl4YSBoYW5kbGVJbnB1dENsaWNrL2hhbmRsZUlucHV0Rm9jdXMgcmVzb2x2ZXJlbSAoZWxlcyByZWZvY2FtIG9cbiAgICAgICAgICAgIC8vIGlucHV0IGUgcmVhcGxpY2FtIG8gc2VnbWVudG8gY29ycmV0byBsb2dvIGVtIHNlZ3VpZGEpLlxuICAgICAgICAgICAgY29uc3QgbG9va3NMaWtlT3duVHJpZ2dlckNsaWNrID0gd2FzU2VnbWVudGVkICYmICFyZWxhdGVkVGFyZ2V0O1xuICAgICAgICAgICAgaWYgKCFsb29rc0xpa2VPd25UcmlnZ2VyQ2xpY2sgJiYgKCFyZWxhdGVkVGFyZ2V0IHx8ICFwYW5lbD8uY29udGFpbnMocmVsYXRlZFRhcmdldCkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAndGltZScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmNyZWFzZUhvdXJCdXR0b24oKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYW5lbD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1tkYXRhLWZvY3VzPVwic2VsZWN0ZWRcIl0nKSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWw/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdbZGF0YS1mb2N1cz1cInRvZGF5XCJdJykgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsPy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignYnV0dG9uOm5vdChbZGlzYWJsZWRdKScpO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ/LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUlucHV0Q2hhbmdlKHJhdzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzU2VnbWVudE1vZGVDYW5kaWRhdGUoKSkgcmV0dXJuO1xuICAgICAgICBpZiAoIXJhdz8udHJpbSgpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VWYWx1ZS5zZXQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLl9oYXNGb3JtYXRFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UobnVsbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnB1dCh0aGlzLm1vZGUoKSwgcmF3LCB0aGlzLnJhbmdlU2VwYXJhdG9yKCkpO1xuICAgICAgICBpZiAocGFyc2VkID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9oYXNGb3JtYXRFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faGFzRm9ybWF0RXJyb3IgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICBpZiAodGhpcy5pc0RhdGVSYW5nZShwYXJzZWQpKSB7XG4gICAgICAgICAgICB0aGlzLnJhbmdlVmFsdWUuc2V0KHBhcnNlZCk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShwYXJzZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZCA9IHBhcnNlZCBhcyBEYXRlO1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQoZCk7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgdGhpcy5ob3Vycy5zZXQoZC5nZXRIb3VycygpKTtcbiAgICAgICAgICAgIHRoaXMubWludXRlcy5zZXQoZC5nZXRNaW51dGVzKCkpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlVHJpZ2dlcktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTZWdtZW50ZWRNb2RlKCkgJiYgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVTZWdtZW50ZWRLZXlkb3duKGV2ZW50LCBldmVudC50YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQua2V5ID09PSAnICcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBUZWNsYXMgcXVlIGRldmVtIHBhc3NhciBkaXJldG8gcGFyYSBvIGJyb3dzZXIgc2VtIGluc2VyaXIvYWx0ZXJhciBuYWRhIG5vIGNhbXBvLiAqL1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNFR01FTlRFRF9QQVNTVEhST1VHSF9LRVlTID0gWydIb21lJywgJ0VuZCcsICdTaGlmdCcsICdDYXBzTG9jaycsICdFc2NhcGUnLCAnRW50ZXInLCAnICddO1xuXG4gICAgLyoqIERpZ2l0YcOnw6NvIHBvciBzZWdtZW50byAoZGlhL23DqnMvYW5vL2hvcmEvbWludXRvL3NlZ3VuZG8vYW1wbSkgbm8gaW5wdXQgZG8gdHJpZ2dlci4gKi9cbiAgICBwcml2YXRlIGhhbmRsZVNlZ21lbnRlZEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGlucHV0OiBIVE1MSW5wdXRFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW5zdXJlU2VnbWVudEVuZ2luZUNvbmZpZ3VyZWQoKTtcbiAgICAgICAgY29uc3QgeyBrZXksIGN0cmxLZXksIG1ldGFLZXksIGFsdEtleSwgc2hpZnRLZXkgfSA9IGV2ZW50O1xuICAgICAgICBpZiAoY3RybEtleSB8fCBtZXRhS2V5IHx8IGFsdEtleSB8fCBrZXkuc3RhcnRzV2l0aCgnRicpKSByZXR1cm47XG4gICAgICAgIGlmIChEYXRlcGlja2VyQ29tcG9uZW50LlNFR01FTlRFRF9QQVNTVEhST1VHSF9LRVlTLmluY2x1ZGVzKGtleSkpIHJldHVybjtcbiAgICAgICAgdGhpcy5pbnRlcmFjdGlvbkdlbmVyYXRpb24rKztcblxuICAgICAgICBpZiAoa2V5ID09PSAnVGFiJykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZWdtZW50RW5naW5lLm1vdmVUb0FkamFjZW50U2VnbWVudChzaGlmdEtleSA/IC0xIDogMSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNTZWdtZW50ZWRJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSAnbW92ZWQnKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXkgPT09ICdBcnJvd0xlZnQnIHx8IGtleSA9PT0gJ0Fycm93UmlnaHQnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgLy8gQW8gY29udHLDoXJpbyBkbyBUYWIsIHNldGEgbm8gcHJpbWVpcm8vw7psdGltbyBzZWdtZW50byBuw6NvIGRldmUgc2FpciBkbyBjYW1wbyBuZW1cbiAgICAgICAgICAgIC8vIGRlc2F0aXZhciBhIHNlbGXDp8OjbyDigJQgYG1vdmVUb0FkamFjZW50U2VnbWVudGAgemVyYSBgYWN0aXZlSW5kZXhgIGFvIGJhdGVyIG5vIGxpbWl0ZVxuICAgICAgICAgICAgLy8gKGNvbXBvcnRhbWVudG8gY2VydG8gcHJvIFRhYiBlc2NhcGFyIGRvIGNhbXBvKSwgZW50w6NvIG5hIGJvcmRhIGEgZ2VudGUgcmVzZWxlY2lvbmFcbiAgICAgICAgICAgIC8vIG8gc2VnbWVudG8gcXVlIGrDoSBlc3RhdmEgYXRpdm8sIGltaXRhbmRvIG8gYDxpbnB1dCB0eXBlPVwiZGF0ZVwiPmAgbmF0aXZvIChhIHNldGEgc29tZVxuICAgICAgICAgICAgLy8gbm8gbGltaXRlLCBuw6NvIG5hdmVnYSBwcmEgZm9yYSkuXG4gICAgICAgICAgICBjb25zdCBiZWZvcmUgPSB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0QWN0aXZlSW5kZXgoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VnbWVudEVuZ2luZS5tb3ZlVG9BZGphY2VudFNlZ21lbnQoa2V5ID09PSAnQXJyb3dMZWZ0JyA/IC0xIDogMSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSAnYm91bmRhcnknICYmIGJlZm9yZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5zZWxlY3RTZWdtZW50KGJlZm9yZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN5bmNTZWdtZW50ZWRJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5ID09PSAnQXJyb3dVcCcgfHwga2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5pbmNyZW1lbnRBY3RpdmVTZWdtZW50KGtleSA9PT0gJ0Fycm93VXAnID8gMSA6IC0xKTtcbiAgICAgICAgICAgIHRoaXMuc3luY1NlZ21lbnRlZElucHV0KGlucHV0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXkgPT09ICdCYWNrc3BhY2UnIHx8IGtleSA9PT0gJ0RlbGV0ZScpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBjb25zdCBpc1dob2xlRmllbGRTZWxlY3RlZCA9IGlucHV0LnNlbGVjdGlvblN0YXJ0ID09PSAwICYmIGlucHV0LnNlbGVjdGlvbkVuZCA9PT0gaW5wdXQudmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGlzV2hvbGVGaWVsZFNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLmNsZWFyQWxsKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5jbGVhckFjdGl2ZVNlZ21lbnQoa2V5ID09PSAnQmFja3NwYWNlJyA/ICdiYWNrc3BhY2UnIDogJ2RlbGV0ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zeW5jU2VnbWVudGVkSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKC9eWzAtOV0kLy50ZXN0KGtleSkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUudHlwZURpZ2l0KGtleSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNTZWdtZW50ZWRJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZWdtZW50RW5naW5lLmFjdGl2ZUtpbmQoKSA9PT0gJ2FtcG0nICYmIC9eW2FwQVBdJC8udGVzdChrZXkpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLnNldEFtUG0oa2V5LnRvTG93ZXJDYXNlKCkgPT09ICdhJyA/IDAgOiAxKTtcbiAgICAgICAgICAgIHRoaXMuc3luY1NlZ21lbnRlZElucHV0KGlucHV0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFF1YWxxdWVyIG91dHJhIHRlY2xhIGltcHJpbcOtdmVsIChsZXRyYXMsIHPDrW1ib2xvcykgbsOjbyDDqSBpbnNlcmlkYSBubyBjYW1wby5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICAvKiogU2luY3Jvbml6YSBvIERPTSBjb20gbyBlc3RhZG8gYXR1YWwgZGEgZW5naW5lICh2YWxvciArIHNlbGXDp8OjbyBkbyBzZWdtZW50byBhdGl2bykgYXDDs3MgdW1hIG11dGHDp8Ojby4gKi9cbiAgICBwcml2YXRlIHN5bmNTZWdtZW50ZWRJbnB1dChpbnB1dDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuc2VnbWVudEVuZ2luZS5nZXREaXNwbGF5U3RyaW5nKCk7XG4gICAgICAgIGlucHV0LnZhbHVlID0gdGhpcy5pbnB1dERhdGU7XG4gICAgICAgIHRoaXMuc2VsZWN0QWN0aXZlU2VnbWVudFJhbmdlKGlucHV0KTtcbiAgICAgICAgdGhpcy5hbm5vdW5jZUFjdGl2ZVNlZ21lbnQoKTtcbiAgICAgICAgaW5wdXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICAgICAgdGhpcy5jb21taXRTZWdtZW50ZWRWYWx1ZUlmQ29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdEFjdGl2ZVNlZ21lbnRSYW5nZShpbnB1dDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VnbWVudEVuZ2luZS5nZXRBY3RpdmVJbmRleCgpO1xuICAgICAgICBpZiAoaW5kZXggPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gdGhpcy5zZWdtZW50RW5naW5lLmdldFNlZ21lbnRSYW5nZShpbmRleCk7XG4gICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8qKiBcIntyw7N0dWxvIGRvIHNlZ21lbnRvfSwge3ZhbG9yfVwiIChleC46IFwiRGlhLCAwM1wiKSDigJQgdGV4dG8gZG8gYW7Dum5jaW8gZGUgbsOtdmVsIGRlIHNlZ21lbnRvLiAqL1xuICAgIHByaXZhdGUgYnVpbGRTZWdtZW50QW5ub3VuY2VtZW50VGV4dCgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBraW5kID0gdGhpcy5zZWdtZW50RW5naW5lLmFjdGl2ZUtpbmQoKTtcbiAgICAgICAgaWYgKGtpbmQgPT09IG51bGwpIHJldHVybiAnJztcbiAgICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChEYXRlcGlja2VyQ29tcG9uZW50LlNFR01FTlRfTEFCRUxfS0VZU1traW5kXSk7XG4gICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0QWN0aXZlU2VnbWVudFRleHQoKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0ZXh0IHx8IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWdtZW50X2VtcHR5Jyk7XG4gICAgICAgIHJldHVybiBgJHtsYWJlbH0sICR7dmFsdWV9YDtcbiAgICB9XG5cbiAgICAvKiogQW51bmNpYSB2aWEgTGl2ZUFubm91bmNlciBvIHNlZ21lbnRvIGF0aXZvIOKAlCBjaGFtYWRvIGVtIHRvZG8gcG9udG8gcXVlIG11ZGEgbyBzZWdtZW50byBhdGl2by9zZXVcbiAgICAgKiAgdmFsb3IgREVQT0lTIGRvIHByaW1laXJvIGZvY28gZ2VudcOtbm8gKHF1ZSBqw6EgcmVjZWJlIGVzc2UgbWVzbW8gdGV4dG8gZW1idXRpZG8gZW0gYGFubm91bmNlR2VudWluZUZvY3VzYCkuICovXG4gICAgcHJpdmF0ZSBhbm5vdW5jZUFjdGl2ZVNlZ21lbnQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmJ1aWxkU2VnbWVudEFubm91bmNlbWVudFRleHQoKTtcbiAgICAgICAgaWYgKHRleHQpIHZvaWQgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKHRleHQsICdwb2xpdGUnKTtcbiAgICB9XG5cbiAgICAvKiogUmVzdW1vIGh1bWFuaXphZG8gZG8gdmFsb3IgaW50ZWlybyAoZXguOiBcIjEwIGRlIG91dHVicm8gZGUgMjAyMFwiLCBvdSBhIGZyYXNlIGdlbsOpcmljYSBkZSBjYW1wb1xuICAgICAqICB2YXppbykg4oCUIGNvbXBsZW1lbnRhIG8gYDxpbnB1dD5gIHNlZ21lbnRhZG8sIHF1ZSBvIGxlaXRvciBkZSB0ZWxhIGzDqiBkZSBmb3JtYSBsaXRlcmFsL3BvdWNvXG4gICAgICogIG5hdHVyYWwgKGVzcXVlbGV0byBkZSBzdWJsaW5oYWRvcyBxdWFuZG8gdmF6aW8sIGTDrWdpdG9zIHNlcGFyYWRvcyBwb3IgYmFycmEgcXVhbmRvIGNvbXBsZXRvKS5cbiAgICAgKiAgRm9ybWF0YcOnw6NvIHB1cmEgdmlhIGBJbnRsYCwgc2VtIGNoYXZlcyBkZSB0cmFkdcOnw6NvIG5vdmFzIChleGNldG8gYSBmcmFzZSBkZSBjYW1wbyB2YXppbykuXG4gICAgICogIEVzcGVsaGEgYGZvcm1hdERheUFyaWFMYWJlbGAgcHJvIG1vZG8gYGRhdGVgLiAqL1xuICAgIHByaXZhdGUgZGVzY3JpYmVXaG9sZVZhbHVlKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLnNlZ21lbnRFbmdpbmUuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX25vX3ZhbHVlX3NlbGVjdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgaWYgKCFkYXRlKSByZXR1cm4gJyc7IC8vIHZhbG9yIHBhcmNpYWxtZW50ZSBkaWdpdGFkbyAoaW5jb21wbGV0bykg4oCUIG5hZGEgaHVtYW5pesOhdmVsIGFpbmRhLlxuICAgICAgICBjb25zdCBsYW5nID0gdGhpcy5jdXJyZW50TGFuZygpO1xuICAgICAgICBzd2l0Y2ggKHRoaXMubW9kZSgpKSB7XG4gICAgICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXREYXlBcmlhTGFiZWwoZGF0ZSk7XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKGxhbmcsIHsgbW9udGg6ICdsb25nJywgeWVhcjogJ251bWVyaWMnIH0pO1xuICAgICAgICAgICAgY2FzZSAndGltZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVUaW1lU3RyaW5nKGxhbmcsIHtcbiAgICAgICAgICAgICAgICAgICAgaG91cjogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgICAgICAgICAgc2Vjb25kOiB0aGlzLnNob3dTZWNvbmRzKCkgPyAnMi1kaWdpdCcgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGhvdXIxMjogdGhpcy5yZXNvbHZlZEhvdXJGb3JtYXQoKSA9PT0gJzEyJyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNhc2UgJ2RhdGV0aW1lJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZyhsYW5nLCB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGVTdHlsZTogJ2xvbmcnLFxuICAgICAgICAgICAgICAgICAgICB0aW1lU3R5bGU6IHRoaXMuc2hvd1NlY29uZHMoKSA/ICdtZWRpdW0nIDogJ3Nob3J0JyxcbiAgICAgICAgICAgICAgICAgICAgaG91cjEyOiB0aGlzLnJlc29sdmVkSG91ckZvcm1hdCgpID09PSAnMTInLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJyc7IC8vIGlzU2VnbWVudGVkTW9kZSgpIGrDoSByZXN0cmluZ2UgYSBkYXRlL21vbnRoL3RpbWUvZGF0ZXRpbWVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBbsO6bmNpbyBjb21iaW5hZG8gbm8gcHJpbWVpcm8gZm9jbyBnZW51w61ubyBkbyBjYW1wbzogcmVzdW1vIGRvIHZhbG9yIGludGVpcm8gKyBzZWdtZW50byBhdGl2byxcbiAgICAgKiAgbnVtYSDDmk5JQ0EgY2hhbWFkYSBhIGBhbm5vdW5jZWAgKGV2aXRhIGR1YXMgcmVnacO1ZXMgY29uY29ycmVudGVzL3VtYSBjb3J0YW5kbyBhIG91dHJhKS4gKi9cbiAgICBwcml2YXRlIGFubm91bmNlR2VudWluZUZvY3VzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdW1tYXJ5ID0gdGhpcy5kZXNjcmliZVdob2xlVmFsdWUoKTtcbiAgICAgICAgY29uc3Qgc2VnbWVudFRleHQgPSB0aGlzLmJ1aWxkU2VnbWVudEFubm91bmNlbWVudFRleHQoKTtcbiAgICAgICAgY29uc3QgY29tYmluZWQgPSBzdW1tYXJ5ID8gYCR7c3VtbWFyeX0uICR7c2VnbWVudFRleHR9YCA6IHNlZ21lbnRUZXh0O1xuICAgICAgICBpZiAoY29tYmluZWQpIHZvaWQgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKGNvbWJpbmVkLCAncG9saXRlJyk7XG4gICAgfVxuXG4gICAgLyoqIFByb3BhZ2EgbyB2YWxvciBkYSBlbmdpbmUgcGFyYSBvIG1vZGVsbyAoQ1ZBKSBhc3NpbSBxdWUgdG9kb3Mgb3Mgc2VnbWVudG9zIGVzdGl2ZXJlbSBjb21wbGV0b3MuICovXG4gICAgcHJpdmF0ZSBjb21taXRTZWdtZW50ZWRWYWx1ZUlmQ29tcGxldGUoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5zZWdtZW50RW5naW5lLmlzQ29tcGxldGUoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUoKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KG51bGwpO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJhc2UgPVxuICAgICAgICAgICAgdGhpcy52YWx1ZSgpID8/XG4gICAgICAgICAgICBuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICAgICAgbmV3IERhdGUoKS5nZXRNb250aCgpLFxuICAgICAgICAgICAgICAgIG5ldyBEYXRlKCkuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgICAgIHRoaXMuaG91cnMoKSxcbiAgICAgICAgICAgICAgICB0aGlzLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dTZWNvbmRzKCkgPyB0aGlzLnNlY29uZHMoKSA6IDAsXG4gICAgICAgICAgICApO1xuICAgICAgICBjb25zdCBkYXRlID0gdGhpcy5zZWdtZW50RW5naW5lLnRvRGF0ZShiYXNlKTtcbiAgICAgICAgaWYgKCFkYXRlKSByZXR1cm47XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KGRhdGUpO1xuICAgICAgICBpZiAodGhpcy5zaG93Q2FsZW5kYXIoKSkge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zaG93VGltZVBpY2tlcigpKSB7XG4gICAgICAgICAgICB0aGlzLmhvdXJzLnNldChkYXRlLmdldEhvdXJzKCkpO1xuICAgICAgICAgICAgdGhpcy5taW51dGVzLnNldChkYXRlLmdldE1pbnV0ZXMoKSk7XG4gICAgICAgICAgICB0aGlzLnNlY29uZHMuc2V0KGRhdGUuZ2V0U2Vjb25kcygpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vbkNoYW5nZShkYXRlKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgTmF2aWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCBuYXZpZ2F0ZVByZXYoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ3llYXJzJykge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpIC0gMTAsIHZpZXcuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgdGhpcy55ZWFyQ2hhbmdlLmVtaXQoeyBtb250aDogdmlldy5nZXRNb250aCgpLCB5ZWFyOiB2aWV3LmdldEZ1bGxZZWFyKCkgLSAxMCB9KTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VEZWNhZGVDaGFuZ2UoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh2aWV3LmdldEZ1bGxZZWFyKCkgLSAxLCB2aWV3LmdldE1vbnRoKCksIDEpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnllYXJDaGFuZ2UuZW1pdCh7IG1vbnRoOiB2aWV3LmdldE1vbnRoKCksIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSB9KTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VZZWFyQ2hhbmdlKG5ld0RhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHZpZXcuZ2V0RnVsbFllYXIoKSwgdmlldy5nZXRNb250aCgpIC0gMSwgMSk7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7IG1vbnRoOiBuZXdEYXRlLmdldE1vbnRoKCksIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSB9KTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VNb250aENoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBuYXZpZ2F0ZU5leHQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ3llYXJzJykge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpICsgMTAsIHZpZXcuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgdGhpcy55ZWFyQ2hhbmdlLmVtaXQoeyBtb250aDogdmlldy5nZXRNb250aCgpLCB5ZWFyOiB2aWV3LmdldEZ1bGxZZWFyKCkgKyAxMCB9KTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VEZWNhZGVDaGFuZ2UoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh2aWV3LmdldEZ1bGxZZWFyKCkgKyAxLCB2aWV3LmdldE1vbnRoKCksIDEpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnllYXJDaGFuZ2UuZW1pdCh7IG1vbnRoOiB2aWV3LmdldE1vbnRoKCksIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSB9KTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VZZWFyQ2hhbmdlKG5ld0RhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHZpZXcuZ2V0RnVsbFllYXIoKSwgdmlldy5nZXRNb250aCgpICsgMSwgMSk7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7IG1vbnRoOiBuZXdEYXRlLmdldE1vbnRoKCksIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSB9KTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VNb250aENoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBbnVuY2lhIHPDsyBcInttw6pzfSBkZSB7YW5vfVwiIChleC46IFwib3V0dWJybyBkZSAyMDI2XCIpIGFvIGNydXphciBmcm9udGVpcmEgZGUgbcOqcyBuYSBncmFkZSBkZSBkaWFzLlxuICAgICAqICBPIG5vdm8gZm9jbyAoYnV0dG9uW3JvbGU9XCJncmlkY2VsbFwiXSkgasOhIGNhcnJlZ2EgZXNzYSBpbmZvIGRlbnRybyBkbyBhcmlhLWxhYmVsIGxvbmdvIGRlXG4gICAgICogIGBmb3JtYXREYXlBcmlhTGFiZWxgLCBtYXMgbyBub21lIGRvIG3DqnMgZmljYSBcImVudGVycmFkb1wiIG5vIG1laW8gZGEgZnJhc2UgZSBwYXNzYSBkZXNwZXJjZWJpZG9cbiAgICAgKiAgKGNvbmZpcm1hZG8gY29tIHRlc3RlIG1hbnVhbCB2aWEgT3JjYSkuIFNlbSBwcmVmaXhvIHRpcG8gXCJhZ29yYSBleGliaW5kb1wiLCBtZXNtYSBjb252ZW7Dp8Ojb1xuICAgICAqICBhZG90YWRhIHBvciBvdXRyb3MgY2FsZW5kw6FyaW9zIGFjZXNzw612ZWlzIChleC46IHJlYWN0LWFyaWEpLiAqL1xuICAgIHByaXZhdGUgYW5ub3VuY2VNb250aENoYW5nZShuZXdEYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgICAgIHZvaWQgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKFxuICAgICAgICAgICAgbmV3RGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5jdXJyZW50TGFuZygpLCB7IG1vbnRoOiAnbG9uZycsIHllYXI6ICdudW1lcmljJyB9KSxcbiAgICAgICAgICAgICdwb2xpdGUnLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKiBBbnVuY2lhIG8gYW5vIGF0dWFsbWVudGUgZXhpYmlkbyBhbyBwYWdpbmFyIGEgdmlldyAnbW9udGhzJyAoZXguOiBcIjIwMjVcIikuIE8gYDxzcGFuPmAgY2VudHJhbFxuICAgICAqICBxdWUgbW9zdHJhIGVzc2UgYW5vIG5vIGNhYmXDp2FsaG8gbsOjbyDDqSBmb2PDoXZlbCwgZSBvIGFyaWEtbGFiZWwgZG9zIGJvdMO1ZXMgZGUgbmF2ZWdhw6fDo28gc8OzXG4gICAgICogIGZhbGEgbyBhbm8gZGUgREVTVElOTyAoXCJBbm8gYW50ZXJpb3IsIDIwMjVcIikg4oCUIHNlbSBpc3NvLCBvIGxlaXRvciBkZSB0ZWxhIG51bmNhIGNvbmZpcm1hIG9cbiAgICAgKiAgYW5vIHF1ZSBwYXNzb3UgYSBlc3RhciBlbSBleGliacOnw6NvLCBzw7Mgb3MgYWx2b3MgXCJhbnRlcmlvclwiL1wicHLDs3hpbW9cIi4gKi9cbiAgICBwcml2YXRlIGFubm91bmNlWWVhckNoYW5nZShuZXdEYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgICAgIHZvaWQgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKFxuICAgICAgICAgICAgbmV3RGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5jdXJyZW50TGFuZygpLCB7IHllYXI6ICdudW1lcmljJyB9KSxcbiAgICAgICAgICAgICdwb2xpdGUnLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKiBNZXNtYSBtb3RpdmHDp8OjbyBkZSBgYW5ub3VuY2VZZWFyQ2hhbmdlYCwgcGFyYSBhIHZpZXcgJ3llYXJzJyAocGFnaW5hw6fDo28gZGUgZMOpY2FkYSkg4oCUIGFudW5jaWFcbiAgICAgKiAgbyBpbnRlcnZhbG8gYXR1YWxtZW50ZSBleGliaWRvIChleC46IFwiMjAyMCDigJMgMjAzMVwiKSwgZXNwZWxoYW5kbyBvIHRleHRvIGRvIGA8c3Bhbj5gIGNlbnRyYWwuICovXG4gICAgcHJpdmF0ZSBhbm5vdW5jZURlY2FkZUNoYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgdm9pZCB0aGlzLmxpdmVBbm5vdW5jZXIuYW5ub3VuY2UoYCR7dGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKX0g4oCTICR7dGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKSArIDExfWAsICdwb2xpdGUnKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlQ2FsZW5kYXJHcmlkS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJyAmJiB0aGlzLm1vZGUoKSA9PT0gJ3JhbmdlJyAmJiB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0KCkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAvLyBDYW5jZWxhbWVudG8gbGV2ZTogZGVzaXN0ZSBzw7MgZGEgZGF0YSBpbmljaWFsIHBlbmRlbnRlLCBtYW50ZW5kbyBvIHBhaW5lbCBhYmVydG8sXG4gICAgICAgICAgICAvLyBlbSB2ZXogZGUgZmVjaGFyIG8gZGnDoWxvZ28gaW50ZWlybyAobyDDum5pY28gY2FtaW5obyBhbnRlcyBkaXNzbykuIGBzdG9wUHJvcGFnYXRpb25gXG4gICAgICAgICAgICAvLyBpbXBlZGUgZXNzZSBtZXNtbyBFc2NhcGUgZGUgYm9yYnVsaGFyIGF0w6kgYGRvY3VtZW50LmJvZHlgLCBvbmRlIG9cbiAgICAgICAgICAgIC8vIGBPdmVybGF5S2V5Ym9hcmREaXNwYXRjaGVyYCBkbyBDREsgZXNjdXRhIGBrZXlkb3duYCAoZmFzZSBkZSBidWJibGUsIHNlbSBjYXB0dXJlKSBlXG4gICAgICAgICAgICAvLyBkaXNwYXJhcmlhIGBoYW5kbGVPdmVybGF5S2V5ZG93bmAvYGNsb3NlUGFuZWwoKWAg4oCUIHNlbSBpc3NvLCBvIGNhbmNlbGFtZW50byBsZXZlIGUgb1xuICAgICAgICAgICAgLy8gZmVjaGFtZW50byB0b3RhbCBhY29udGVjZXJpYW0gbmVzc2UgbWVzbW8gRXNjYXBlLiBTZW0gYHBlbmRpbmdSYW5nZVN0YXJ0YCwgZXNzZSBgaWZgXG4gICAgICAgICAgICAvLyDDqSBmYWxzbyBlIG8gRXNjYXBlIHNlZ3VlIGludG9jYWRvIGF0w6kgYGRvY3VtZW50LmJvZHlgLCBmZWNoYW5kbyBvIHBhaW5lbCBjb21vIHNlbXByZS5cbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxQZW5kaW5nUmFuZ2VTdGFydCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgQVJST1dTID0gWydBcnJvd0xlZnQnLCAnQXJyb3dSaWdodCcsICdBcnJvd1VwJywgJ0Fycm93RG93biddO1xuICAgICAgICBpZiAoIUFSUk9XUy5pbmNsdWRlcyhldmVudC5rZXkpKSByZXR1cm47XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCBncmlkID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgYnV0dG9ucyA9IEFycmF5LmZyb20oZ3JpZC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PignYnV0dG9uW3JvbGU9XCJncmlkY2VsbFwiXScpKTtcbiAgICAgICAgY29uc3QgY3VycmVudElkeCA9IGJ1dHRvbnMuaW5kZXhPZihldmVudC50YXJnZXQgYXMgSFRNTEJ1dHRvbkVsZW1lbnQpO1xuICAgICAgICBpZiAoY3VycmVudElkeCA9PT0gLTEpIHJldHVybjtcblxuICAgICAgICBsZXQgZGVsdGEgPSAwO1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcpIGRlbHRhID0gMTtcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0JykgZGVsdGEgPSAtMTtcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykgZGVsdGEgPSBEYXRlcGlja2VyQ29tcG9uZW50LkRBWVNfSU5fV0VFSztcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIGRlbHRhID0gLURhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLO1xuXG4gICAgICAgIGNvbnN0IG5leHRJZHggPSBjdXJyZW50SWR4ICsgZGVsdGE7XG5cbiAgICAgICAgaWYgKG5leHRJZHggPCAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2RGlzYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVByZXYoKTtcbiAgICAgICAgICAgIGFmdGVyTmV4dFJlbmRlcihcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5wb3B1cFBhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ0bnMgPSBBcnJheS5mcm9tKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWw/LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEJ1dHRvbkVsZW1lbnQ+KCdidXR0b25bcm9sZT1cImdyaWRjZWxsXCJdJykgPz8gW10sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldElkeCA9IE1hdGgubWF4KDAsIGJ0bnMubGVuZ3RoICsgbmV4dElkeCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmZpbmRFbmFibGVkKGJ0bnMsIHRhcmdldElkeCwgLTEpID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmZpbmRFbmFibGVkKGJ0bnMsIHRhcmdldElkeCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD8uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dElkeCA+PSBidXR0b25zLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubmV4dERpc2FibGVkKCkpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGVOZXh0KCk7XG4gICAgICAgICAgICBhZnRlck5leHRSZW5kZXIoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMucG9wdXBQYW5lbCgpPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBidG5zID0gQXJyYXkuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsPy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PignYnV0dG9uW3JvbGU9XCJncmlkY2VsbFwiXScpID8/IFtdLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRJZHggPSBNYXRoLm1pbihuZXh0SWR4IC0gYnV0dG9ucy5sZW5ndGgsIGJ0bnMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmZpbmRFbmFibGVkKGJ0bnMsIHRhcmdldElkeCwgMSkgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVwaWNrZXJDb21wb25lbnQuZmluZEVuYWJsZWQoYnRucywgdGFyZ2V0SWR4LCAtMSk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD8uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWJ1dHRvbnNbbmV4dElkeF0/LmRpc2FibGVkKSB7XG4gICAgICAgICAgICBidXR0b25zW25leHRJZHhdLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBmaW5kRW5hYmxlZChcbiAgICAgICAgYnV0dG9uczogSFRNTEJ1dHRvbkVsZW1lbnRbXSxcbiAgICAgICAgc3RhcnRJZHg6IG51bWJlcixcbiAgICAgICAgZGlyZWN0aW9uOiAxIHwgLTEsXG4gICAgKTogSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SWR4OyBpID49IDAgJiYgaSA8IGJ1dHRvbnMubGVuZ3RoOyBpICs9IGRpcmVjdGlvbikge1xuICAgICAgICAgICAgaWYgKCFidXR0b25zW2ldLmRpc2FibGVkKSByZXR1cm4gYnV0dG9uc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3dpdGNoVG9Nb250aHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ21vbnRocycpO1xuICAgICAgICB0aGlzLmZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJhY2tUb0NhbGVuZGFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBpY2tlclZpZXcuc2V0KCdjYWxlbmRhcicpO1xuICAgICAgICB0aGlzLmZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFNlbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCBzZWxlY3REYXRlKGRheTogQ2FsZW5kYXJEYXkpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRheS5pc0Rpc2FibGVkKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGVNb2RlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlTXVsdGlwbGVEYXRlKGRheS5kYXRlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0KCk7XG4gICAgICAgICAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0LnNldChkYXkuZGF0ZSk7XG4gICAgICAgICAgICAgICAgLy8gU2VtIGlzc28gbyA8aW5wdXQ+IGZpY2F2YSBjb20gbyB2YWxvciBhbnRlcmlvciAob3UgdmF6aW8pIGVucXVhbnRvIHPDsyBhIGRhdGFcbiAgICAgICAgICAgICAgICAvLyBpbmljaWFsIGVzdGF2YSBlc2NvbGhpZGEg4oCUIHRhbnRvIG8gdGV4dG8gdmlzw612ZWwgcXVhbnRvIG8gcXVlIHVtIGxlaXRvciBkZSB0ZWxhXG4gICAgICAgICAgICAgICAgLy8gbMOqIGFvIGZvY2FyIG8gY2FtcG8gZmljYXZhbSBvYnNvbGV0b3MgYXTDqSBhIHNlZ3VuZGEgZXNjb2xoYS5cbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheSh7IHN0YXJ0OiBkYXkuZGF0ZSwgZW5kOiBudWxsIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VSYW5nZVN0YXJ0U2VsZWN0ZWQoZGF5LmRhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbc3RhcnQsIGVuZF0gPVxuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLmdldFRpbWUoKSA8PSBkYXkuZGF0ZS5nZXRUaW1lKCkgPyBbcGVuZGluZywgZGF5LmRhdGVdIDogW2RheS5kYXRlLCBwZW5kaW5nXTtcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZTogRGF0ZVJhbmdlID0geyBzdGFydCwgZW5kIH07XG4gICAgICAgICAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldChyYW5nZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkocmFuZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQocmFuZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VSYW5nZUNvbXBsZXRlZChyYW5nZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKFxuICAgICAgICAgICAgZGF5LmRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIGRheS5kYXRlLmdldE1vbnRoKCksXG4gICAgICAgICAgICBkYXkuZGF0ZS5nZXREYXRlKCksXG4gICAgICAgICAgICB0aGlzLmhvdXJzKCksXG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgIHRoaXMuc2hvd1NlY29uZHMoKSA/IHRoaXMuc2Vjb25kcygpIDogMCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy52YWx1ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ2RhdGUnKSB7XG4gICAgICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSgpID09PSAnZGF0ZXRpbWUnKSB7XG4gICAgICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChuZXdEYXRlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmhpZGVPbkRhdGVUaW1lU2VsZWN0KCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBZGljaW9uYS9yZW1vdmUgdW1hIGRhdGEgZGEgc2VsZcOnw6NvIG3Dumx0aXBsYS4gTyBwYWluZWwgcGVybWFuZWNlIGFiZXJ0by4gKi9cbiAgICBwcml2YXRlIHRvZ2dsZU11bHRpcGxlRGF0ZShkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpO1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMubXVsdGlwbGVWYWx1ZXMoKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBleGlzdGluZy5maW5kSW5kZXgoKGQpID0+IGlzU2FtZURheShkLCBub3JtYWxpemVkKSk7XG4gICAgICAgIGNvbnN0IG5leHQgPVxuICAgICAgICAgICAgaW5kZXggPj0gMFxuICAgICAgICAgICAgICAgID8gZXhpc3RpbmcuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleClcbiAgICAgICAgICAgICAgICA6IFsuLi5leGlzdGluZywgbm9ybWFsaXplZF0uc29ydCgoYSwgYikgPT4gYS5nZXRUaW1lKCkgLSBiLmdldFRpbWUoKSk7XG4gICAgICAgIHRoaXMubXVsdGlwbGVWYWx1ZXMuc2V0KG5leHQpO1xuICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheShuZXh0KTtcbiAgICAgICAgY29uc3QgZW1pdFZhbHVlID0gbmV4dC5sZW5ndGggPyBuZXh0IDogbnVsbDtcbiAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZShlbWl0VmFsdWUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQoZW1pdFZhbHVlKTtcbiAgICAgICAgdGhpcy5hbm5vdW5jZU11bHRpcGxlRGF0ZVRvZ2dsZShub3JtYWxpemVkLCBpbmRleCA8IDApO1xuICAgIH1cblxuICAgIC8qKiBBbnVuY2lhIHZpYSBMaXZlQW5ub3VuY2VyIGEgZGF0YSBjb21wbGV0YSAoZGlhIGRhIHNlbWFuYSwgZGlhLCBtw6pzLCBhbm8pIGUgc2UgZWxhIGFjYWJvdVxuICAgICAqICBkZSBzZXIgc2VsZWNpb25hZGEgb3UgZGVzbWFyY2FkYSDigJQgcHJvIHVzdcOhcmlvIGRlIGxlaXRvciBkZSB0ZWxhIHNhYmVyIGV4YXRhbWVudGUgbyBxdWVcbiAgICAgKiAgbXVkb3UgYW50ZXMgZGUgc2VndWlyIGVzY29saGVuZG8gYSBwcsOzeGltYSBkYXRhLiAqL1xuICAgIHByaXZhdGUgYW5ub3VuY2VNdWx0aXBsZURhdGVUb2dnbGUoZGF0ZTogRGF0ZSwgaXNOb3dTZWxlY3RlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBjb25zdCBkYXRlVGV4dCA9IHRoaXMuZm9ybWF0RGF5QXJpYUxhYmVsKGRhdGUpO1xuICAgICAgICBjb25zdCBrZXkgPSBpc05vd1NlbGVjdGVkXG4gICAgICAgICAgICA/ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXRlX3NlbGVjdGVkJ1xuICAgICAgICAgICAgOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF0ZV9kZXNlbGVjdGVkJztcbiAgICAgICAgdm9pZCB0aGlzLmxpdmVBbm5vdW5jZXIuYW5ub3VuY2UodGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoa2V5LCB7IGRhdGU6IGRhdGVUZXh0IH0pLCAncG9saXRlJyk7XG4gICAgfVxuXG4gICAgLyoqIFRleHRvIGNvbXBhcnRpbGhhZG8gZW50cmUgbyBhbsO6bmNpbyB0cmFuc2l0w7NyaW8gZGUgaW7DrWNpbyBkZSBpbnRlcnZhbG8gZXNjb2xoaWRvXG4gICAgICogIChgYW5ub3VuY2VSYW5nZVN0YXJ0U2VsZWN0ZWRgKSBlIG8gc3RhdHVzIHBlcnNpc3RlbnRlIGV4cG9zdG8gdmlhIGBhcmlhLWRlc2NyaWJlZGJ5YCBub1xuICAgICAqICBgPGlucHV0PmAgKGByYW5nZVBlbmRpbmdTdGF0dXNUZXh0YCkg4oCUIG1lc21hIHJlZGHDp8OjbyBub3MgZG9pcyBsdWdhcmVzIGRlIHByb3DDs3NpdG8sIHByYSBuw6NvXG4gICAgICogIHNvYXJlbSBjb21vIGRvaXMgZXN0YWRvcyBkaWZlcmVudGVzIHBybyBtZXNtbyBtb21lbnRvLiAqL1xuICAgIHByaXZhdGUgYnVpbGRSYW5nZVN0YXJ0U2VsZWN0ZWRUZXh0KGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3JhbmdlX3N0YXJ0X3NlbGVjdGVkJywge1xuICAgICAgICAgICAgZGF0ZTogdGhpcy5mb3JtYXREYXlBcmlhTGFiZWwoZGF0ZSksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBBbnVuY2lhIHF1ZSBhIGRhdGEgSU5JQ0lBTCBkbyBpbnRlcnZhbG8gZm9pIGVzY29saGlkYSDigJQgbyBwcmltZWlybyBjbGlxdWUgZW0gYHJhbmdlYCBlcmFcbiAgICAgKiAgbXVkbyAoYW8gY29udHLDoXJpbyBkbyB0b2dnbGUgZW0gbW9kbyBgbXVsdGlwbGVgLCBzZW1wcmUgYW51bmNpYWRvKS4gUmVjZWJlIHVtIGBEYXRlYCBwdXJvLFxuICAgICAqICBuw6NvIHVtIGNsaXF1ZTogYHNlbGVjdFRvZGF5KClgIGNoYW1hIGBzZWxlY3REYXRlKClgIGludGVybmFtZW50ZSBlIGhlcmRhIGVzdGUgYW7Dum5jaW8gZGVcbiAgICAgKiAgZ3Jhw6dhLCBzZW0gcHJlY2lzYXIgZGUgdW1hIHNlZ3VuZGEgY2hhbWFkYS4gKi9cbiAgICBwcml2YXRlIGFubm91bmNlUmFuZ2VTdGFydFNlbGVjdGVkKGRhdGU6IERhdGUpOiB2b2lkIHtcbiAgICAgICAgdm9pZCB0aGlzLmxpdmVBbm5vdW5jZXIuYW5ub3VuY2UodGhpcy5idWlsZFJhbmdlU3RhcnRTZWxlY3RlZFRleHQoZGF0ZSksICdwb2xpdGUnKTtcbiAgICB9XG5cbiAgICAvKiogQW51bmNpYSBvIGludGVydmFsbyBjb25jbHXDrWRvLCBjaGFtYWRvIGFudGVzIGRlIGBjbG9zZVBhbmVsKClgIOKAlCBvIGBMaXZlQW5ub3VuY2VyYCBlc2NyZXZlXG4gICAgICogIG51bWEgcmVnacOjbyBgYXJpYS1saXZlYCBwcsOzcHJpYSBlIGRlc2Fjb3BsYWRhIGRvIGZvY28sIGVudMOjbyBuw6NvIMOpIGNvcnRhZG8gcGVsYSByZXN0YXVyYcOnw6NvXG4gICAgICogIGRlIGZvY28gcXVlIGBjbG9zZVBhbmVsKClgIGFnZW5kYSB1bSB0aWNrIGRlcG9pcyB2aWEgYGFmdGVyTmV4dFJlbmRlcmAuICovXG4gICAgcHJpdmF0ZSBhbm5vdW5jZVJhbmdlQ29tcGxldGVkKHJhbmdlOiBEYXRlUmFuZ2UpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFyYW5nZS5zdGFydCB8fCAhcmFuZ2UuZW5kKSByZXR1cm47XG4gICAgICAgIHZvaWQgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKFxuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3JhbmdlX3NlbGVjdGVkJywge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmZvcm1hdERheUFyaWFMYWJlbChyYW5nZS5zdGFydCksXG4gICAgICAgICAgICAgICAgZW5kOiB0aGlzLmZvcm1hdERheUFyaWFMYWJlbChyYW5nZS5lbmQpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAncG9saXRlJyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2VsZWN0WWVhcih5ZWFyOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNZZWFyRGlzYWJsZWQoeWVhcikpIHJldHVybjtcbiAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHllYXIsIDAsIDEpO1xuICAgICAgICB0aGlzLnZhbHVlLnNldChuZXdEYXRlKTtcbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkobmV3RGF0ZSk7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKG5ld0RhdGUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQobmV3RGF0ZSk7XG4gICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZWxlY3RNb250aChtb250aEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNNb250aERpc2FibGVkKG1vbnRoSW5kZXgpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJlbnRZZWFyKCk7XG4gICAgICAgIGNvbnN0IG5ld1ZpZXdEYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGhJbmRleCwgMSk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ21vbnRoJykge1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobmV3Vmlld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5Rm9yKG5ld1ZpZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKG5ld1ZpZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChuZXdWaWV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ld1ZpZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ2NhbGVuZGFyJyk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2VsZWN0VG9kYXkoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzRGF0ZURpc2FibGVkKHRvZGF5KSkge1xuICAgICAgICAgICAgY29uc3QgY2FsRGF5OiBDYWxlbmRhckRheSA9IHtcbiAgICAgICAgICAgICAgICBkYXRlOiB0b2RheSxcbiAgICAgICAgICAgICAgICBkYXlPZk1vbnRoOiB0b2RheS5nZXREYXRlKCksXG4gICAgICAgICAgICAgICAgaXNDdXJyZW50TW9udGg6IHRydWUsXG4gICAgICAgICAgICAgICAgaXNUb2RheTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0Rpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1JhbmdlU3RhcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzUmFuZ2VFbmQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzSW5SYW5nZTogZmFsc2UsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5zZWxlY3REYXRlKGNhbERheSk7XG4gICAgICAgICAgICB0aGlzLnRvZGF5Q2xpY2suZW1pdCh0b2RheSk7XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdyYW5nZScgJiYgdGhpcy5pc09wZW4oKSkge1xuICAgICAgICAgICAgICAgIC8vIEVtIHJhbmdlLCBzZWxlY3REYXRlKCkgc8OzIGZlY2hhIG8gcGFpbmVsIG5hIHNlZ3VuZGEgZXNjb2xoYSAodmVyIHNldSByYW1vXG4gICAgICAgICAgICAgICAgLy8gJ3JhbmdlJyk7IG5hIHByaW1laXJhLCBvIGZvY28gZmljYSBwYXJhZG8gbm8gYm90w6NvIFwiSG9qZVwiIGRvIHJvZGFww6ksIGZvcmEgZGFcbiAgICAgICAgICAgICAgICAvLyBncmFkZSDigJQgc2VtIGlzc28gbyB1c3XDoXJpbyBuw6NvIHRpbmhhIG5lbmh1bWEgcGlzdGEgZGUgcXVlIHByZWNpc2F2YSB2b2x0YXIgcHJhXG4gICAgICAgICAgICAgICAgLy8gZ3JhZGUgcHJhIGVzY29saGVyIGEgZGF0YSBmaW5hbC4gQSBjw6lsdWxhIGRlIGhvamUgasOhIGNhcnJlZ2FcbiAgICAgICAgICAgICAgICAvLyBgZGF0YS1mb2N1cz1cInNlbGVjdGVkXCJgIChpc1JhbmdlU3RhcnQgYWNhYm91IGRlIHNlciBzZXRhZG8gcG9yIHNlbGVjdERhdGUpLCBxdWVcbiAgICAgICAgICAgICAgICAvLyBmb2N1c0Jlc3RDYWxlbmRhclRhcmdldCgpIGrDoSBwcmlvcml6YS4gTyBhbsO6bmNpbyBkZSBcImluw61jaW8gc2VsZWNpb25hZG9cIiBqw6FcbiAgICAgICAgICAgICAgICAvLyBkaXNwYXJvdSBkZW50cm8gZGUgc2VsZWN0RGF0ZSgpIGFudGVzIGRlc3RlIGJsb2NvIHJvZGFyLlxuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNCZXN0Q2FsZW5kYXJUYXJnZXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBjbGVhclZhbHVlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGhhZFJhbmdlSW5Qcm9ncmVzcyA9XG4gICAgICAgICAgICB0aGlzLm1vZGUoKSA9PT0gJ3JhbmdlJyAmJiAodGhpcy5wZW5kaW5nUmFuZ2VTdGFydCgpICE9PSBudWxsIHx8IHRoaXMucmFuZ2VWYWx1ZSgpICE9PSBudWxsKTtcbiAgICAgICAgdGhpcy52YWx1ZS5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMuaG91cnMuc2V0KDApO1xuICAgICAgICB0aGlzLm1pbnV0ZXMuc2V0KDApO1xuICAgICAgICB0aGlzLnNlY29uZHMuc2V0KDApO1xuICAgICAgICB0aGlzLnJhbmdlVmFsdWUuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLm11bHRpcGxlVmFsdWVzLnNldChbXSk7XG4gICAgICAgIHRoaXMucGVuZGluZ1JhbmdlU3RhcnQuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IobnVsbCk7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKG51bGwpO1xuICAgICAgICB0aGlzLmNsZWFyQ2xpY2suZW1pdChldmVudCk7XG4gICAgICAgIGlmIChoYWRSYW5nZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgIC8vIFPDsyBhbnVuY2lhIHF1YW5kbyBoYXZpYSBkZSBmYXRvIGFsZ28gYSBsaW1wYXIg4oCUIGV2aXRhIFwiaW50ZXJ2YWxvIGxpbXBvXCIgdG9kYSB2ZXpcbiAgICAgICAgICAgIC8vIHF1ZSBhbGd1w6ltIGFwZXJ0YSBcIkxpbXBhclwiIHBvciBnYXJhbnRpYSwgc2VtIG5hZGEgc2VsZWNpb25hZG8gYWluZGEuXG4gICAgICAgICAgICB2b2lkIHRoaXMubGl2ZUFubm91bmNlci5hbm5vdW5jZShcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcmFuZ2VfY2xlYXJlZCcpLFxuICAgICAgICAgICAgICAgICdwb2xpdGUnLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY29uZmlybSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMudmFsdWUoKSA/PyBuZXcgRGF0ZSgpO1xuICAgICAgICBjb25zdCBjb25maXJtZWQgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgIGN1cnJlbnQuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIGN1cnJlbnQuZ2V0TW9udGgoKSxcbiAgICAgICAgICAgIGN1cnJlbnQuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgdGhpcy5ob3VycygpLFxuICAgICAgICAgICAgdGhpcy5taW51dGVzKCksXG4gICAgICAgICAgICB0aGlzLnNob3dTZWNvbmRzKCkgPyB0aGlzLnNlY29uZHMoKSA6IDAsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KGNvbmZpcm1lZCk7XG4gICAgICAgIHRoaXMuc2V0RGlzcGxheUZvcihjb25maXJtZWQpO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZShjb25maXJtZWQpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQoY29uZmlybWVkKTtcbiAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFRpbWUgcGlja2VyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHJvdGVjdGVkIGluY3JlbWVudEhvdXJzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhvdXJzLnNldCgodGhpcy5ob3VycygpICsgdGhpcy5zdGVwSG91cigpKSAlIHRoaXMubWF4SG91cnMpO1xuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBkZWNyZW1lbnRIb3VycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob3Vycy5zZXQoKHRoaXMuaG91cnMoKSAtIHRoaXMuc3RlcEhvdXIoKSArIHRoaXMubWF4SG91cnMpICUgdGhpcy5tYXhIb3Vycyk7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGluY3JlbWVudE1pbnV0ZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWludXRlcy5zZXQoKHRoaXMubWludXRlcygpICsgdGhpcy5taW51dGVTdGVwKCkpICUgdGhpcy5tYXhNaW51dGVzKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZGVjcmVtZW50TWludXRlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5taW51dGVzLnNldCgodGhpcy5taW51dGVzKCkgLSB0aGlzLm1pbnV0ZVN0ZXAoKSArIHRoaXMubWF4TWludXRlcykgJSB0aGlzLm1heE1pbnV0ZXMpO1xuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpbmNyZW1lbnRTZWNvbmRzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlY29uZHMuc2V0KCh0aGlzLnNlY29uZHMoKSArIHRoaXMuc3RlcFNlY29uZCgpKSAlIDYwKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZGVjcmVtZW50U2Vjb25kcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWNvbmRzLnNldCgodGhpcy5zZWNvbmRzKCkgLSB0aGlzLnN0ZXBTZWNvbmQoKSArIDYwKSAlIDYwKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBAbnVtZXJpY0tleXNPbmx5KClcbiAgICBwcm90ZWN0ZWQgaGFuZGxlSG91cnNLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuaW5jcmVtZW50SG91cnMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRIb3VycygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQG51bWVyaWNLZXlzT25seSgpXG4gICAgcHJvdGVjdGVkIGhhbmRsZU1pbnV0ZXNLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuaW5jcmVtZW50TWludXRlcygpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmRlY3JlbWVudE1pbnV0ZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBudW1lcmljS2V5c09ubHkoKVxuICAgIHByb3RlY3RlZCBoYW5kbGVTZWNvbmRzS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmluY3JlbWVudFNlY29uZHMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRTZWNvbmRzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlSG91cnNJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmF3ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQocmF3LCAxMCk7XG4gICAgICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmlzMTJIb3VyRm9ybWF0KCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbGYgPSBEYXRlcGlja2VyQ29tcG9uZW50LkhPVVJTX1BFUl9NRVJJRElFTTtcbiAgICAgICAgICAgIGNvbnN0IGgxMiA9IE1hdGgubWluKGhhbGYsIE1hdGgubWF4KDEsIHBhcnNlZCkpO1xuICAgICAgICAgICAgY29uc3QgYmFzZSA9IGgxMiAlIGhhbGY7XG4gICAgICAgICAgICB0aGlzLmhvdXJzLnNldCh0aGlzLmFtUG0oKSA9PT0gJ1BNJyA/IGJhc2UgKyBoYWxmIDogYmFzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhvdXJzLnNldChNYXRoLm1pbih0aGlzLm1heEhvdXJzIC0gMSwgTWF0aC5tYXgoMCwgcGFyc2VkKSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgLyoqIEFsdGVybmEgZW50cmUgQU0gZSBQTSBzb21hbmRvL3N1YnRyYWluZG8gMTIgaG9yYXMgZGEgaG9yYSBpbnRlcm5hLiAqL1xuICAgIHByb3RlY3RlZCB0b2dnbGVBbVBtKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBoYWxmID0gRGF0ZXBpY2tlckNvbXBvbmVudC5IT1VSU19QRVJfTUVSSURJRU07XG4gICAgICAgIHRoaXMuaG91cnMuc2V0KHRoaXMuaG91cnMoKSA8IGhhbGYgPyB0aGlzLmhvdXJzKCkgKyBoYWxmIDogdGhpcy5ob3VycygpIC0gaGFsZik7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZU1pbnV0ZXNJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmF3ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQocmF3LCAxMCk7XG4gICAgICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICAgICAgdGhpcy5taW51dGVzLnNldChNYXRoLm1pbih0aGlzLm1heE1pbnV0ZXMgLSAxLCBNYXRoLm1heCgwLCBwYXJzZWQpKSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZVNlY29uZHNJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmF3ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQocmF3LCAxMCk7XG4gICAgICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICAgICAgdGhpcy5zZWNvbmRzLnNldChNYXRoLm1pbig1OSwgTWF0aC5tYXgoMCwgcGFyc2VkKSkpO1xuICAgICAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkRheUhvdmVyKGRhdGU6IERhdGUgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgdGhpcy5ob3ZlckRhdGUuc2V0KGRhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIEhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgaXNEYXRlRGlzYWJsZWQoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBtaW4gPSB0aGlzLm1pbigpO1xuICAgICAgICBjb25zdCBtYXggPSB0aGlzLm1heCgpO1xuICAgICAgICBpZiAobWluICYmIHN0cmlwVGltZShkYXRlKSA8IHN0cmlwVGltZShtaW4pKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKG1heCAmJiBzdHJpcFRpbWUoZGF0ZSkgPiBzdHJpcFRpbWUobWF4KSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnN0IGRpc2FibGVkRGF5cyA9IHRoaXMuZGlzYWJsZWREYXlzKCk7XG4gICAgICAgIGlmIChkaXNhYmxlZERheXMubGVuZ3RoICYmIGRpc2FibGVkRGF5cy5pbmNsdWRlcyhkYXRlLmdldERheSgpKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnN0IGRpc2FibGVkRGF0ZXMgPSB0aGlzLmRpc2FibGVkRGF0ZXMoKTtcbiAgICAgICAgaWYgKGRpc2FibGVkRGF0ZXMubGVuZ3RoICYmIGRpc2FibGVkRGF0ZXMuc29tZSgoZCkgPT4gaXNTYW1lRGF5KGQsIGRhdGUpKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNZZWFyU2VsZWN0ZWQoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICByZXR1cm4gISFzZWxlY3RlZCAmJiBzZWxlY3RlZC5nZXRGdWxsWWVhcigpID09PSB5ZWFyO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpc1llYXJEaXNhYmxlZCh5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKG1pbiAmJiB5ZWFyIDwgbWluLmdldEZ1bGxZZWFyKCkpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAobWF4ICYmIHllYXIgPiBtYXguZ2V0RnVsbFllYXIoKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNDdXJyZW50WWVhcih5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHllYXIgPT09IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNNb250aFNlbGVjdGVkKG1vbnRoSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgcmV0dXJuICEhc2VsZWN0ZWQgJiYgc2VsZWN0ZWQuZ2V0TW9udGgoKSA9PT0gbW9udGhJbmRleCAmJiBzZWxlY3RlZC5nZXRGdWxsWWVhcigpID09PSB0aGlzLmN1cnJlbnRZZWFyKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzTW9udGhEaXNhYmxlZChtb250aEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgeWVhciA9IHRoaXMuY3VycmVudFllYXIoKTtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKG1pbiAmJiAoeWVhciA8IG1pbi5nZXRGdWxsWWVhcigpIHx8ICh5ZWFyID09PSBtaW4uZ2V0RnVsbFllYXIoKSAmJiBtb250aEluZGV4IDwgbWluLmdldE1vbnRoKCkpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heCAmJiAoeWVhciA+IG1heC5nZXRGdWxsWWVhcigpIHx8ICh5ZWFyID09PSBtYXguZ2V0RnVsbFllYXIoKSAmJiBtb250aEluZGV4ID4gbWF4LmdldE1vbnRoKCkpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwYWRUaW1lKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIH1cblxuICAgIC8qKiBgZGF5YCDDqSBvcGNpb25hbCBlIHPDsyB1c2FkbyBlbSBgbW9kZT1cInJhbmdlXCJgIOKAlCBvcyBkZW1haXMgY2FsbCBzaXRlcyAocmVzdW1vIGRvIHZhbG9yXG4gICAgICogIHNlZ21lbnRhZG8sIGFuw7puY2lvIGRlIHRvZ2dsZSBlbSBtb2RvIGBtdWx0aXBsZWApIG51bmNhIHTDqm0gdW0gYENhbGVuZGFyRGF5YCDDoCBtw6NvIGUgbnVuY2FcbiAgICAgKiAgcm9kYW0gZW0gYHJhbmdlYCwgZW50w6NvIGNvbnRpbnVhbSByZWNlYmVuZG8gZXhhdGFtZW50ZSBvIHRleHRvIGRlIHNlbXByZS4gKi9cbiAgICBwcm90ZWN0ZWQgZm9ybWF0RGF5QXJpYUxhYmVsKGRhdGU6IERhdGUsIGRheT86IENhbGVuZGFyRGF5KTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgYmFzZSA9IGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMuY3VycmVudExhbmcoKSwge1xuICAgICAgICAgICAgd2Vla2RheTogJ2xvbmcnLFxuICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICAgICAgbW9udGg6ICdsb25nJyxcbiAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFkYXkgfHwgdGhpcy5tb2RlKCkgIT09ICdyYW5nZScpIHJldHVybiBiYXNlO1xuICAgICAgICBjb25zdCBzdWZmaXggPSB0aGlzLnJhbmdlRGF5U3RhdHVzU3VmZml4KGRheSk7XG4gICAgICAgIHJldHVybiBzdWZmaXggPyBgJHtiYXNlfSwgJHtzdWZmaXh9YCA6IGJhc2U7XG4gICAgfVxuXG4gICAgLyoqIFN1Zml4byBxdWUgZGl6IG8gcGFwZWwgZG8gZGlhIGRlbnRybyBkbyBpbnRlcnZhbG8gc2VsZWNpb25hZG8g4oCUIHNlbSBpc3NvLCB0b2RhIGPDqWx1bGEgZGFcbiAgICAgKiAgZ3JhZGUgc29hIGlkw6pudGljYSBwcm8gbGVpdG9yIGRlIHRlbGEsIGUgbyDDum5pY28gamVpdG8gZGUgc2FiZXIgb25kZSBlc3TDoSBvIGluw61jaW8vZmltIMOpXG4gICAgICogIGVueGVyZ2FuZG8gbyBkZXN0YXF1ZSB2aXN1YWwuICovXG4gICAgcHJpdmF0ZSByYW5nZURheVN0YXR1c1N1ZmZpeChkYXk6IENhbGVuZGFyRGF5KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGRheS5pc1JhbmdlU3RhcnQgJiYgZGF5LmlzUmFuZ2VFbmQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcmFuZ2Vfc3RhcnRfZW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRheS5pc1JhbmdlU3RhcnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcmFuZ2Vfc3RhcnQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF5LmlzUmFuZ2VFbmQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcmFuZ2VfZW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRheS5pc0luUmFuZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcmFuZ2VfaW5fcmFuZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLyoqIEZvcm1hdGEgbyB2YWxvciBwYXJhIGV4aWJpw6fDo28gbm8gaW5wdXQsIGFwbGljYW5kbyByYW5nZVNlcGFyYXRvciwgZGF0ZUZvcm1hdCBlIG11bHRpcGxlU2VwYXJhdG9yLiAqL1xuICAgIHByaXZhdGUgZm9ybWF0Rm9yRGlzcGxheSh2YWx1ZTogRGF0ZSB8IERhdGVSYW5nZSB8IERhdGVbXSB8IG51bGwpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZm9ybWF0VmFsdWVGb3JJbnB1dChcbiAgICAgICAgICAgIHRoaXMubW9kZSgpLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICB0aGlzLnJhbmdlU2VwYXJhdG9yKCksXG4gICAgICAgICAgICB0aGlzLnJlc29sdmVkRGF0ZUZvcm1hdCgpLFxuICAgICAgICAgICAgdGhpcy5tdWx0aXBsZVNlcGFyYXRvcigpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dWFsaXphIGBpbnB1dERhdGVgIGEgcGFydGlyIGRlIHVtIHZhbG9yIMO6bmljbywgcm90ZWFuZG8gcGVsYSBlbmdpbmUgZGUgc2VnbWVudG9zXG4gICAgICogKGRhdGUvbW9udGgvdGltZS9kYXRldGltZSkgb3UgcGVsbyBmb3JtYXRhZG9yIGxlZ2FkbyAocmFuZ2UveWVhci9tdWx0aXBsZSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXREaXNwbGF5Rm9yKHZhbHVlOiBEYXRlIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc1NlZ21lbnRNb2RlQ2FuZGlkYXRlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZW5zdXJlU2VnbWVudEVuZ2luZUNvbmZpZ3VyZWQoKTtcbiAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5sb2FkRnJvbURhdGUodmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB2YWx1ZSA/IHRoaXMuc2VnbWVudEVuZ2luZS5nZXREaXNwbGF5U3RyaW5nKCkgOiAnJztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKFJlKWNvbmZpZ3VyYSBhIGVuZ2luZSBkZSBzZWdtZW50b3MgcXVhbmRvIGBtb2RlYC9gZGF0ZUZvcm1hdGAvYGhvdXJGb3JtYXRgL2BzaG93U2Vjb25kc2BcbiAgICAgKiBtdWRhcmFtIGRlc2RlIGEgw7psdGltYSBjaGFtYWRhLCByZWNhcnJlZ2FuZG8gbyB2YWxvciBhdHVhbC4gQ2hhbWFkbyBkZSBmb3JtYSBzw61uY3JvbmEgYVxuICAgICAqIHBhcnRpciBkZSB0b2RvIHBvbnRvIGRlIGVudHJhZGEgcXVlIHVzYSBhIGVuZ2luZSDigJQgbsOjbyBkZXBlbmRlIGRlIHVtIGBlZmZlY3QoKWAgKHF1ZSBzw7NcbiAgICAgKiByb2RhIGVtIHVtIGNpY2xvIGRlIGNoYW5nZSBkZXRlY3Rpb24sIHRhcmRlIGRlbWFpcyBwYXJhIGxlaXR1cmFzL2VzY3JpdGFzIGltZWRpYXRhcykuXG4gICAgICovXG4gICAgcHJpdmF0ZSBlbnN1cmVTZWdtZW50RW5naW5lQ29uZmlndXJlZCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbW9kZSA9IHRoaXMubW9kZSgpO1xuICAgICAgICBpZiAobW9kZSAhPT0gJ2RhdGUnICYmIG1vZGUgIT09ICdtb250aCcgJiYgbW9kZSAhPT0gJ3RpbWUnICYmIG1vZGUgIT09ICdkYXRldGltZScpIHJldHVybjtcbiAgICAgICAgY29uc3QgY29uZmlnOiBTZWdtZW50RW5naW5lQ29uZmlnID0ge1xuICAgICAgICAgICAgbW9kZSxcbiAgICAgICAgICAgIGRhdGVGb3JtYXQ6IHRoaXMucmVzb2x2ZWREYXRlRm9ybWF0KCksXG4gICAgICAgICAgICBob3VyRm9ybWF0OiB0aGlzLnJlc29sdmVkSG91ckZvcm1hdCgpLFxuICAgICAgICAgICAgc2hvd1NlY29uZHM6IHRoaXMuc2hvd1NlY29uZHMoKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbGFzdCA9IHRoaXMubGFzdFNlZ21lbnRDb25maWc7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGxhc3QgJiZcbiAgICAgICAgICAgIGxhc3QubW9kZSA9PT0gY29uZmlnLm1vZGUgJiZcbiAgICAgICAgICAgIGxhc3QuZGF0ZUZvcm1hdCA9PT0gY29uZmlnLmRhdGVGb3JtYXQgJiZcbiAgICAgICAgICAgIGxhc3QuaG91ckZvcm1hdCA9PT0gY29uZmlnLmhvdXJGb3JtYXQgJiZcbiAgICAgICAgICAgIGxhc3Quc2hvd1NlY29uZHMgPT09IGNvbmZpZy5zaG93U2Vjb25kc1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhc3RTZWdtZW50Q29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuY29uZmlndXJlKGNvbmZpZyk7XG4gICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5sb2FkRnJvbURhdGUodGhpcy52YWx1ZSgpKTtcbiAgICB9XG5cbiAgICAvKiogUmV0b3JuYSBhIHRyYWR1w6fDo28gZGUgYGtleWAsIG91IGBmYWxsYmFja2AgcXVhbmRvIGEgY2hhdmUgbsOjbyBlc3TDoSB0cmFkdXppZGEgKG5neC10cmFuc2xhdGUgcmV0b3JuYSBhIHByw7NwcmlhIGNoYXZlKS4gKi9cbiAgICBwcml2YXRlIHJlc29sdmVUcmFuc2xhdGVkT3JEZWZhdWx0KGtleTogc3RyaW5nLCBmYWxsYmFjazogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRlZCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGtleSk7XG4gICAgICAgIGlmICh0eXBlb2YgdHJhbnNsYXRlZCAhPT0gJ3N0cmluZycgfHwgIXRyYW5zbGF0ZWQgfHwgdHJhbnNsYXRlZCA9PT0ga2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzeW5jVGltZVRvVmFsdWUoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLnZhbHVlKCkgPz8gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKFxuICAgICAgICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgICAgZGF0ZS5nZXRNb250aCgpLFxuICAgICAgICAgICAgZGF0ZS5nZXREYXRlKCksXG4gICAgICAgICAgICB0aGlzLmhvdXJzKCksXG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgIHRoaXMuc2hvd1NlY29uZHMoKSA/IHRoaXMuc2Vjb25kcygpIDogMCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy52YWx1ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgIHRoaXMuc2V0RGlzcGxheUZvcihuZXdEYXRlKTtcbiAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAndGltZScpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKG5ld0RhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBidWlsZENhbGVuZGFyRGF5KFxuICAgICAgICBkYXRlOiBEYXRlLFxuICAgICAgICBpc0N1cnJlbnRNb250aDogYm9vbGVhbixcbiAgICAgICAgdG9kYXk6IERhdGUsXG4gICAgICAgIHNlbGVjdGVkOiBEYXRlIHwgbnVsbCxcbiAgICAgICAgcmFuZ2U6IHsgc3RhcnQ6IERhdGUgfCBudWxsOyBlbmQ6IERhdGUgfCBudWxsIH0sXG4gICAgICAgIHJhbmdlU3RhcnRUaW1lOiBudW1iZXIgfCBudWxsLFxuICAgICAgICByYW5nZUVuZFRpbWU6IG51bWJlciB8IG51bGwsXG4gICAgKTogQ2FsZW5kYXJEYXkge1xuICAgICAgICBjb25zdCBpc1JhbmdlU3RhcnQgPSByYW5nZS5zdGFydCA/IGlzU2FtZURheShkYXRlLCByYW5nZS5zdGFydCkgOiBmYWxzZTtcbiAgICAgICAgY29uc3QgaXNSYW5nZUVuZCA9IHJhbmdlLmVuZCA/IGlzU2FtZURheShkYXRlLCByYW5nZS5lbmQpIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGRhdGVUaW1lID0gc3RyaXBUaW1lKGRhdGUpO1xuICAgICAgICBjb25zdCBpc0luUmFuZ2UgPVxuICAgICAgICAgICAgcmFuZ2VTdGFydFRpbWUgIT09IG51bGwgJiYgcmFuZ2VFbmRUaW1lICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBkYXRlVGltZSA+IHJhbmdlU3RhcnRUaW1lICYmIGRhdGVUaW1lIDwgcmFuZ2VFbmRUaW1lXG4gICAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHRoaXMuaXNNdWx0aXBsZU1vZGUoKVxuICAgICAgICAgICAgPyB0aGlzLm11bHRpcGxlVmFsdWVzKCkuc29tZSgoZCkgPT4gaXNTYW1lRGF5KGQsIGRhdGUpKVxuICAgICAgICAgICAgOiBzZWxlY3RlZFxuICAgICAgICAgICAgICA/IGlzU2FtZURheShkYXRlLCBzZWxlY3RlZClcbiAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRheU9mTW9udGg6IGRhdGUuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgaXNUb2RheTogaXNTYW1lRGF5KGRhdGUsIHRvZGF5KSxcbiAgICAgICAgICAgIGlzU2VsZWN0ZWQsXG4gICAgICAgICAgICBpc0Rpc2FibGVkOiB0aGlzLmlzRGF0ZURpc2FibGVkKGRhdGUpIHx8ICghaXNDdXJyZW50TW9udGggJiYgIXRoaXMuc2VsZWN0T3RoZXJNb250aHMoKSksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgaXNDdXJyZW50TW9udGgsXG4gICAgICAgICAgICBpc1JhbmdlU3RhcnQsXG4gICAgICAgICAgICBpc1JhbmdlRW5kLFxuICAgICAgICAgICAgaXNJblJhbmdlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgY29tcHV0ZVZhbGlkYXRpb25FcnJvcnModmFsdWU6IERhdGVwaWNrZXJWYWx1ZSwgY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgICAgICBpZiAodGhpcy5faGFzRm9ybWF0RXJyb3IpIHJldHVybiB7IGludmFsaWRGb3JtYXQ6IHRydWUgfTtcbiAgICAgICAgaWYgKCF2YWx1ZSB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSkgcmV0dXJuIFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcihjb250cm9sKTtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGQgb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAobWluICYmIHN0cmlwVGltZShkKSA8IHN0cmlwVGltZShtaW4pKSByZXR1cm4geyBtaW46IHsgbWluLCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICAgICAgICAgIGlmIChtYXggJiYgc3RyaXBUaW1lKGQpID4gc3RyaXBUaW1lKG1heCkpIHJldHVybiB7IG1heDogeyBtYXgsIGFjdHVhbDogZCB9IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yKGNvbnRyb2wpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRGF0ZVJhbmdlKHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlLnN0YXJ0ICYmIG1pbiAmJiBzdHJpcFRpbWUodmFsdWUuc3RhcnQpIDwgc3RyaXBUaW1lKG1pbikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBtaW46IHsgbWluLCBhY3R1YWw6IHZhbHVlLnN0YXJ0IH0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZS5lbmQgJiYgbWF4ICYmIHN0cmlwVGltZSh2YWx1ZS5lbmQpID4gc3RyaXBUaW1lKG1heCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBtYXg6IHsgbWF4LCBhY3R1YWw6IHZhbHVlLmVuZCB9IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yKGNvbnRyb2wpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGQgPSB2YWx1ZSBhcyBEYXRlO1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICd5ZWFyJykge1xuICAgICAgICAgICAgaWYgKG1pbiAmJiBkLmdldEZ1bGxZZWFyKCkgPCBtaW4uZ2V0RnVsbFllYXIoKSkgcmV0dXJuIHsgbWluOiB7IG1pbiwgYWN0dWFsOiBkIH0gfTtcbiAgICAgICAgICAgIGlmIChtYXggJiYgZC5nZXRGdWxsWWVhcigpID4gbWF4LmdldEZ1bGxZZWFyKCkpIHJldHVybiB7IG1heDogeyBtYXgsIGFjdHVhbDogZCB9IH07XG4gICAgICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yKGNvbnRyb2wpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtaW4gJiYgc3RyaXBUaW1lKGQpIDwgc3RyaXBUaW1lKG1pbikpIHJldHVybiB7IG1pbjogeyBtaW4sIGFjdHVhbDogZCB9IH07XG4gICAgICAgIGlmIChtYXggJiYgc3RyaXBUaW1lKGQpID4gc3RyaXBUaW1lKG1heCkpIHJldHVybiB7IG1heDogeyBtYXgsIGFjdHVhbDogZCB9IH07XG4gICAgICAgIHJldHVybiBWYWxpZGF0b3JzLm51bGxWYWxpZGF0b3IoY29udHJvbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0RhdGVSYW5nZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIERhdGVSYW5nZSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICdzdGFydCcgaW4gdmFsdWUgJiYgJ2VuZCcgaW4gdmFsdWU7XG4gICAgfVxufVxuXG4iLCI8ZGl2XG4gICAgY2RrT3ZlcmxheU9yaWdpblxuICAgICN0cmlnZ2VyPVwiY2RrT3ZlcmxheU9yaWdpblwiXG4gICAgY2xhc3M9XCJkYXRlcGlja2VyLWdyb3VwIHJlbGF0aXZlIGZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlciBhZnRlcjpwb2ludGVyLWV2ZW50cy1ub25lIGFmdGVyOmFic29sdXRlIGFmdGVyOmluc2V0LTAgYWZ0ZXI6cm91bmRlZC1tZWRpdW0gaGFzLVtpbnB1dDpmb2N1c106YWZ0ZXI6b3V0bGluZSBoYXMtW2lucHV0OmZvY3VzXTphZnRlcjpvdXRsaW5lLTIgaGFzLVtpbnB1dDpmb2N1c106YWZ0ZXI6b3V0bGluZS1vZmZzZXQtWy0ycHhdIGhhcy1baW5wdXQ6Zm9jdXNdOmFmdGVyOm91dGxpbmUtW3ZhcigtLXMtZm9jdXMtcmluZy1jb2xvciwjMDA5MGZmKV1cIlxuICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgYXJpYS1oYXNwb3B1cD1cImdyaWRcIlxuICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXNPcGVuKClcIlxuICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwicG9wdXBJZCgpXCJcbj5cbiAgICA8aW5wdXRcbiAgICAgICAgI3RyaWdnZXJJbnB1dFxuICAgICAgICBjbGFzcz1cImgtWzM1cHhdIHctZnVsbCByb3VuZGVkLW1lZGl1bSBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcGwtWzEwcHhdIHRleHQtc20gb3V0bGluZS1ub25lIHRyYW5zaXRpb24tY29sb3JzIGR1cmF0aW9uLTIwMCBlYXNlLW91dFwiXG4gICAgICAgIFtjbGFzcy5wci0xMF09XCJzaG93SWNvbigpICYmICFzaG93Q2xlYXIoKVwiXG4gICAgICAgIFtjbGFzcy5wci0xNl09XCJzaG93SWNvbigpICYmIHNob3dDbGVhcigpXCJcbiAgICAgICAgW2NsYXNzLnByLTZdPVwiIXNob3dJY29uKCkgJiYgc2hvd0NsZWFyKClcIlxuICAgICAgICBbY2xhc3MuYmctZ3JheXNjYWxlLTBdPVwiIWRpc2FibGVkKClcIlxuICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtOTBdPVwiIWRpc2FibGVkKClcIlxuICAgICAgICBbY2xhc3MuYm9yZGVyLWdyYXlzY2FsZS0yMF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgW2NsYXNzLmJnLWdyYXlzY2FsZS01XT1cImRpc2FibGVkKClcIlxuICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtMzBdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgIFtjbGFzcy5jdXJzb3Itbm90LWFsbG93ZWRdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgIFtpZF09XCJpbnB1dElkKClcIlxuICAgICAgICBbbmFtZV09XCJuYW1lKCkgPz8gaW5wdXRJZCgpXCJcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIoKSA/PyAocGxhY2Vob2xkZXJLZXkoKSB8IHRyYW5zbGF0ZSlcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgIFtyZWFkb25seV09XCJcbiAgICAgICAgICAgIHJlYWRvbmx5SW5wdXQoKSB8fFxuICAgICAgICAgICAgbW9kZSgpID09PSAncmFuZ2UnIHx8XG4gICAgICAgICAgICBtb2RlKCkgPT09ICd5ZWFyJyB8fFxuICAgICAgICAgICAgaXNNdWx0aXBsZU1vZGUoKSB8fFxuICAgICAgICAgICAgKGlzU2VnbWVudE1vZGVDYW5kaWRhdGUoKSAmJiBpc1RvdWNoRGV2aWNlKCkpXG4gICAgICAgIFwiXG4gICAgICAgIFt0YWJJbmRleF09XCJ0YWJpbmRleCgpID8/IG51bGxcIlxuICAgICAgICBbYXV0b2ZvY3VzXT1cImF1dG9mb2N1cygpXCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJpbnB1dERhdGVcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJoYW5kbGVJbnB1dENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKGZvY3VzKT1cImhhbmRsZUlucHV0Rm9jdXMoJGV2ZW50KVwiXG4gICAgICAgIChibHVyKT1cImhhbmRsZUlucHV0Qmx1cigkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlZG93bik9XCJoYW5kbGVJbnB1dENsaWNrKCRldmVudClcIlxuICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVUcmlnZ2VyS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgKGlucHV0KT1cImhhbmRsZU5hdGl2ZUlucHV0KCRldmVudClcIlxuICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwibmdDb250cm9sPy5jb250cm9sPy5pbnZhbGlkIHx8IG51bGxcIlxuICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIm1vZGUoKSA9PT0gJ3JhbmdlJyA/IHJhbmdlU3RhdHVzRWxlbWVudElkKCkgOiBudWxsXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJkaWFsb2dBcmlhTGFiZWxLZXkoKSB8IHRyYW5zbGF0ZTogZGlhbG9nQXJpYUxhYmVsUGFyYW1zKClcIlxuICAgIC8+XG5cbiAgICBAaWYgKG1vZGUoKSA9PT0gJ3JhbmdlJykge1xuICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJzci1vbmx5XCJcbiAgICAgICAgICAgIFtpZF09XCJyYW5nZVN0YXR1c0VsZW1lbnRJZCgpXCJcbiAgICAgICAgICAgID57eyByYW5nZVBlbmRpbmdTdGF0dXNUZXh0KCkgfX08L3NwYW5cbiAgICAgICAgPlxuICAgIH1cblxuICAgIEBpZiAoc2hvd0NsZWFyKCkgJiYgaW5wdXREYXRlKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSBmbGV4IGgtWzM1cHhdIHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdGV4dC1ncmF5c2NhbGUtNjAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6dGV4dC1ncmF5c2NhbGUtOTBcIlxuICAgICAgICAgICAgW2NsYXNzLnJpZ2h0LTldPVwic2hvd0ljb24oKVwiXG4gICAgICAgICAgICBbY2xhc3MucmlnaHQtMF09XCIhc2hvd0ljb24oKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9jbGVhcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyVmFsdWUoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtdGltZXMgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIH1cblxuICAgIEBpZiAoc2hvd0ljb24oKSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAjaWNvbkJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInRyaWdnZXItaWNvbiBhYnNvbHV0ZSByaWdodC0wIGZsZXggaC1bMzVweF0gdy05IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXItbWVkaXVtIGJvcmRlciBib3JkZXItc29saWQgdHJhbnNpdGlvbi1jb2xvcnMgZHVyYXRpb24tMjAwIGVhc2Utb3V0XCJcbiAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTIwXT1cImRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTMwXT1cImRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLmN1cnNvci1ub3QtYWxsb3dlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTMwXT1cIiFkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5iZy1ncmF5c2NhbGUtMF09XCIhZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MuYmctZ3JheXNjYWxlLTVdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtOTBdPVwiIWRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLmhvdmVyOmJnLWdyYXlzY2FsZS01XT1cIiFkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX29wZW4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGUoKVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVUcmlnZ2VyS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwicmVzb2x2ZWRJY29uKClcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlXG4gICAgY2RrQ29ubmVjdGVkT3ZlcmxheVxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cInRyaWdnZXJcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3Blbl09XCJpc09wZW4oKVwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlIYXNCYWNrZHJvcF09XCJ0cnVlXCJcbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcz1cImNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uc109XCJwb3NpdGlvbnNcIlxuICAgIChiYWNrZHJvcENsaWNrKT1cImhhbmRsZUJhY2tkcm9wQ2xpY2soJGV2ZW50KVwiXG4gICAgKG92ZXJsYXlLZXlkb3duKT1cImhhbmRsZU92ZXJsYXlLZXlkb3duKCRldmVudClcIlxuICAgIChkZXRhY2gpPVwiaXNPcGVuLnNldChmYWxzZSlcIlxuPlxuICAgIDxkaXZcbiAgICAgICAgI3BvcHVwUGFuZWxcbiAgICAgICAgY2xhc3M9XCJ6LTUwIHctNzIgcm91bmRlZC1tZWRpdW0gYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS0wIHNoYWRvdy1tZFwiXG4gICAgICAgIHJvbGU9XCJkaWFsb2dcIlxuICAgICAgICBjZGtUcmFwRm9jdXNcbiAgICAgICAgW2lkXT1cInBvcHVwSWQoKVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZGlhbG9nQXJpYUxhYmVsS2V5KCkgfCB0cmFuc2xhdGU6IGRpYWxvZ0FyaWFMYWJlbFBhcmFtcygpXCJcbiAgICA+XG4gICAgICAgIEBpZiAoc2hvd0NhbGVuZGFyKCkpIHtcbiAgICAgICAgICAgIEBpZiAocGlja2VyVmlldygpID09PSAnY2FsZW5kYXInKSB7XG4gICAgICAgICAgICAgICAgPCEtLSBDYWJlw6dhbGhvIGRlIG5hdmVnYcOnw6NvIG1lbnNhbCAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGJvcmRlci1iIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIHB4LTMgcHktMlwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTcgdy03IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6dGV4dC1ncmF5c2NhbGUtMzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInByZXZEaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwicHJldkRpc2FibGVkKCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3ByZXZfbW9udGgnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IG1vbnRoOiBwcmV2TW9udGhUYXJnZXQoKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlUHJldigpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWxlZnQgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMSByb3VuZGVkLXNtYWxsIHB4LTIgcHktMSB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWxlY3RfbW9udGhfeWVhcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInN3aXRjaFRvTW9udGhzKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBjdXJyZW50TW9udGhLZXkoKSB8IHRyYW5zbGF0ZSB9fSZuYnNwO3t7IGN1cnJlbnRZZWFyKCkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duIHRleHQtWzEwcHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC03IHctNyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOnRleHQtZ3JheXNjYWxlLTMwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJuZXh0RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIm5leHREaXNhYmxlZCgpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9uZXh0X21vbnRoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyBtb250aDogbmV4dE1vbnRoVGFyZ2V0KCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZU5leHQoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1yaWdodCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIENhYmXDp2FsaG9zIGRvcyBkaWFzIGRhIHNlbWFuYSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtNyBweC0zIHB0LTJcIlxuICAgICAgICAgICAgICAgICAgICByb2xlPVwicm93XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGRheUtleSBvZiBvcmRlcmVkV2Vla0RheUtleXMoKTsgdHJhY2sgZGF5S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtOCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS02MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImNvbHVtbmhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJkYXlLZXkgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRheUtleSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gR3JhZGUgZG8gY2FsZW5kw6FyaW8gLS0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTcgcHgtMyBwYi0yXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJHcmlkQXJpYUxhYmVsS2V5KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyBtb250aDogKGN1cnJlbnRNb250aEtleSgpIHwgdHJhbnNsYXRlKSwgeWVhcjogY3VycmVudFllYXIoKSB9XG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbXVsdGlzZWxlY3RhYmxlXT1cIm1vZGUoKSA9PT0gJ3JhbmdlJyA/IHRydWUgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlQ2FsZW5kYXJHcmlkS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKHdlZWsgb2YgY2FsZW5kYXJXZWVrcygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRlbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChkYXkgb2Ygd2VlazsgdHJhY2sgZGF5LmRhdGUudG9JU09TdHJpbmcoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC04IHctOCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1bNTAlXSB0ZXh0LXNtIGZvbnQtbm9ybWFsIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pbnZpc2libGVdPVwiIXNob3dPdGhlck1vbnRocygpICYmICFkYXkuaXNDdXJyZW50TW9udGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJmb3JtYXREYXlBcmlhTGFiZWwoZGF5LmRhdGUsIGRheSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaXNTZWxlY3RlZCB8fCBkYXkuaXNSYW5nZVN0YXJ0IHx8IGRheS5pc1JhbmdlRW5kIHx8IGRheS5pc0luUmFuZ2UgfHwgbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY3VycmVudF09XCJkYXkuaXNUb2RheSA/ICdkYXRlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkYXkuaXNEaXNhYmxlZCA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1oaWRkZW5dPVwiIXNob3dPdGhlck1vbnRocygpICYmICFkYXkuaXNDdXJyZW50TW9udGggPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZm9jdXNdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5LmlzU2VsZWN0ZWQgfHwgZGF5LmlzUmFuZ2VTdGFydCB8fCBkYXkuaXNSYW5nZUVuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdzZWxlY3RlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkYXkuaXNUb2RheVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RvZGF5J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkYXkuaXNEaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JnLXByaW1hcnkgZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXlzY2FsZS0wJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5LmlzU2VsZWN0ZWQgfHwgZGF5LmlzUmFuZ2VTdGFydCB8fCBkYXkuaXNSYW5nZUVuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmctZ3JheXNjYWxlLTEwIGhvdmVyOmJnLWdyYXlzY2FsZS0yMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheS5pc0luUmFuZ2UgJiYgIWRheS5pc1JhbmdlU3RhcnQgJiYgIWRheS5pc1JhbmdlRW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS05MCBob3ZlcjpiZy1ncmF5c2NhbGUtMTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzU2VsZWN0ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1JhbmdlU3RhcnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1JhbmdlRW5kICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNEaXNhYmxlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaXNDdXJyZW50TW9udGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTYwIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNTZWxlY3RlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzUmFuZ2VTdGFydCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzUmFuZ2VFbmQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc0Rpc2FibGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNDdXJyZW50TW9udGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JpbmctMiByaW5nLWluc2V0IHJpbmctcHJpbWFyeSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheS5pc1RvZGF5ICYmICFkYXkuaXNTZWxlY3RlZCAmJiAhZGF5LmlzUmFuZ2VTdGFydCAmJiAhZGF5LmlzUmFuZ2VFbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N1cnNvci1ub3QtYWxsb3dlZCB0ZXh0LWdyYXlzY2FsZS0zMCc6IGRheS5pc0Rpc2FibGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvbkRheUhvdmVyKGRheS5kYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbkRheUhvdmVyKG51bGwpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJvbkRheUhvdmVyKGRheS5kYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF0ZShkYXkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF5LmRheU9mTW9udGggfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGlmIChwaWNrZXJWaWV3KCkgPT09ICd5ZWFycycpIHtcbiAgICAgICAgICAgICAgICA8IS0tIENhYmXDp2FsaG8gZGUgbmF2ZWdhw6fDo28gcG9yIGTDqWNhZGEgLS0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBkYXRhLW5hdi1oZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLWIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcHgtMyBweS0yXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNyB3LTcgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDp0ZXh0LWdyYXlzY2FsZS0zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicHJldkRpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJwcmV2RGlzYWJsZWQoKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcHJldl9kZWNhZGUnIHwgdHJhbnNsYXRlOiBwcmV2RGVjYWRlUmFuZ2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZVByZXYoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1sZWZ0IHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtOTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPnt7IGN1cnJlbnREZWNhZGVTdGFydCgpIH19IOKAkyB7eyBjdXJyZW50RGVjYWRlU3RhcnQoKSArIDExIH19PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID5cblxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTcgdy03IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6dGV4dC1ncmF5c2NhbGUtMzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm5leHREaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwibmV4dERpc2FibGVkKCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX25leHRfZGVjYWRlJyB8IHRyYW5zbGF0ZTogbmV4dERlY2FkZVJhbmdlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVOZXh0KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tcmlnaHQgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBHcmFkZSBkZSBhbm9zIC0tPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJncmlkIGdyaWQtY29scy0zIGdhcC0yIHB4LTMgcHktM1wiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X3llYXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKHJvdyBvZiB5ZWFyc0dyaWQoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb250ZW50c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoeWVhciBvZiByb3c7IHRyYWNrIHllYXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtOSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LXNtIGZvbnQtbm9ybWFsIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNZZWFyU2VsZWN0ZWQoeWVhcikgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImlzWWVhckRpc2FibGVkKHllYXIpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWN1cnJlbnRdPVwiaXNDdXJyZW50WWVhcih5ZWFyKSA/ICdkYXRlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1mb2N1c109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1llYXJTZWxlY3RlZCh5ZWFyKSA/ICdzZWxlY3RlZCcgOiBpc0N1cnJlbnRZZWFyKHllYXIpID8gJ3RvZGF5JyA6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNZZWFyRGlzYWJsZWQoeWVhcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZy1wcmltYXJ5IGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5c2NhbGUtMCc6IGlzWWVhclNlbGVjdGVkKHllYXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyaW5nLTIgcmluZy1pbnNldCByaW5nLXByaW1hcnknOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0N1cnJlbnRZZWFyKHllYXIpICYmICFpc1llYXJTZWxlY3RlZCh5ZWFyKSAmJiAhaXNZZWFyRGlzYWJsZWQoeWVhciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTkwIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc1llYXJTZWxlY3RlZCh5ZWFyKSAmJiAhaXNZZWFyRGlzYWJsZWQoeWVhciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N1cnNvci1ub3QtYWxsb3dlZCB0ZXh0LWdyYXlzY2FsZS0zMCc6IGlzWWVhckRpc2FibGVkKHllYXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0WWVhcih5ZWFyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHllYXIgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGlmIChwaWNrZXJWaWV3KCkgPT09ICdtb250aHMnKSB7XG4gICAgICAgICAgICAgICAgPCEtLSBDYWJlw6dhbGhvIGRlIG5hdmVnYcOnw6NvIGFudWFsIC0tPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1uYXYtaGVhZGVyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGJvcmRlci1iIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIHB4LTMgcHktMlwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTcgdy03IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6dGV4dC1ncmF5c2NhbGUtMzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInByZXZEaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwicHJldkRpc2FibGVkKCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3ByZXZfeWVhcicgfCB0cmFuc2xhdGU6IHsgeWVhcjogcHJldlllYXJUYXJnZXQoKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlUHJldigpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWxlZnQgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MFwiPnt7IGN1cnJlbnRZZWFyKCkgfX08L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC03IHctNyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOnRleHQtZ3JheXNjYWxlLTMwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJuZXh0RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIm5leHREaXNhYmxlZCgpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9uZXh0X3llYXInIHwgdHJhbnNsYXRlOiB7IHllYXI6IG5leHRZZWFyVGFyZ2V0KCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZU5leHQoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1yaWdodCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIEdyYWRlIGRlIG1lc2VzIC0tPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJncmlkIGdyaWQtY29scy0zIGdhcC0yIHB4LTMgcHktM1wiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X21vbnRoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChyb3cgb2YgbW9udGhzR3JpZCgpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRlbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChtb250aCBvZiByb3c7IHRyYWNrIG1vbnRoLmluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTkgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1zbSBmb250LW5vcm1hbCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzTW9udGhTZWxlY3RlZChtb250aC5pbmRleCkgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImlzTW9udGhEaXNhYmxlZChtb250aC5pbmRleCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZm9jdXNdPVwiaXNNb250aFNlbGVjdGVkKG1vbnRoLmluZGV4KSA/ICdzZWxlY3RlZCcgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc01vbnRoRGlzYWJsZWQobW9udGguaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmctcHJpbWFyeSBmb250LXNlbWlib2xkIHRleHQtZ3JheXNjYWxlLTAnOiBpc01vbnRoU2VsZWN0ZWQobW9udGguaW5kZXgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS05MCBob3ZlcjpiZy1ncmF5c2NhbGUtMTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNNb250aFNlbGVjdGVkKG1vbnRoLmluZGV4KSAmJiAhaXNNb250aERpc2FibGVkKG1vbnRoLmluZGV4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3Vyc29yLW5vdC1hbGxvd2VkIHRleHQtZ3JheXNjYWxlLTMwJzogaXNNb250aERpc2FibGVkKG1vbnRoLmluZGV4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdE1vbnRoKG1vbnRoLmluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1vbnRoLmtleSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgQGlmIChtb2RlKCkgIT09ICdtb250aCcpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvcmRlci10IGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIHB4LTMgcHktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1zbWFsbCBweC0yIHB5LTEgdGV4dC1zbSB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJiYWNrVG9DYWxlbmRhcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1hcnJvdy1sZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9iYWNrX3RvX2NhbGVuZGFyJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gVGltZSBwaWNrZXIgLS0+XG4gICAgICAgIEBpZiAoc2hvd1RpbWVQaWNrZXIoKSkge1xuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTMgcHgtNCBweS0zXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYm9yZGVyLXRdPVwic2hvd0NhbGVuZGFyKClcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItc29saWRdPVwic2hvd0NhbGVuZGFyKClcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTMwXT1cInNob3dDYWxlbmRhcigpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWxlY3RfdGltZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwhLS0gSG9yYXMgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICNpbmNyZWFzZUhvdXJCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNiB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2luY3JlbWVudF9ob3VyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyB0aW1lOiBuZXh0SG91clRhcmdldCgpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW5jcmVtZW50SG91cnMoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi11cCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRtb2RlPVwibnVtZXJpY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5tYXhsZW5ndGhdPVwidGltZUlucHV0TWF4TGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC05IHctMTIgcm91bmRlZC1zbWFsbCBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgYmctZ3JheXNjYWxlLTUgdGV4dC1jZW50ZXIgdGV4dC1iYXNlIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTkwIG91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOm91dGxpbmUgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLTIgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW9mZnNldC1bLTJweF0gZm9jdXMtdmlzaWJsZTpvdXRsaW5lLVt2YXIoLS1zLWZvY3VzLXJpbmctY29sb3IsIzAwOTBmZildXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJwYWRUaW1lKGRpc3BsYXlIb3VycygpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9ob3VyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybj1cIlswLTldK1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVIb3Vyc0tleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZUhvdXJzSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNiB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RlY3JlbWVudF9ob3VyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyB0aW1lOiBwcmV2SG91clRhcmdldCgpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVjcmVtZW50SG91cnMoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC14bCBmb250LWJvbGQgdGV4dC1ncmF5c2NhbGUtNjBcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICA+Ojwvc3BhblxuICAgICAgICAgICAgICAgID5cblxuICAgICAgICAgICAgICAgIDwhLS0gTWludXRvcyAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfaW5jcmVtZW50X21pbnV0ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgdGltZTogbmV4dE1pbnV0ZVRhcmdldCgpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW5jcmVtZW50TWludXRlcygpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXVwIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dG1vZGU9XCJudW1lcmljXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLm1heGxlbmd0aF09XCJ0aW1lSW5wdXRNYXhMZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoLTkgdy0xMiByb3VuZGVkLXNtYWxsIGJvcmRlciBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBiZy1ncmF5c2NhbGUtNSB0ZXh0LWNlbnRlciB0ZXh0LWJhc2UgZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtOTAgb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6b3V0bGluZSBmb2N1cy12aXNpYmxlOm91dGxpbmUtMiBmb2N1cy12aXNpYmxlOm91dGxpbmUtb2Zmc2V0LVstMnB4XSBmb2N1cy12aXNpYmxlOm91dGxpbmUtW3ZhcigtLXMtZm9jdXMtcmluZy1jb2xvciwjMDA5MGZmKV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInBhZFRpbWUobWludXRlcygpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9taW51dGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuPVwiWzAtOV0rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZU1pbnV0ZXNLZXlkb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJoYW5kbGVNaW51dGVzSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNiB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RlY3JlbWVudF9taW51dGUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IHRpbWU6IHByZXZNaW51dGVUYXJnZXQoKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlY3JlbWVudE1pbnV0ZXMoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIEBpZiAoc2hvd1NlY29uZHMoKSkge1xuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXhsIGZvbnQtYm9sZCB0ZXh0LWdyYXlzY2FsZS02MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjo8L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gU2VndW5kb3MgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTYgdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2luY3JlbWVudF9zZWNvbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyB0aW1lOiBuZXh0U2Vjb25kVGFyZ2V0KCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImluY3JlbWVudFNlY29uZHMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi11cCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRtb2RlPVwibnVtZXJpY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIubWF4bGVuZ3RoXT1cInRpbWVJbnB1dE1heExlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoLTkgdy0xMiByb3VuZGVkLXNtYWxsIGJvcmRlciBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBiZy1ncmF5c2NhbGUtNSB0ZXh0LWNlbnRlciB0ZXh0LWJhc2UgZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtOTAgb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6b3V0bGluZSBmb2N1cy12aXNpYmxlOm91dGxpbmUtMiBmb2N1cy12aXNpYmxlOm91dGxpbmUtb2Zmc2V0LVstMnB4XSBmb2N1cy12aXNpYmxlOm91dGxpbmUtW3ZhcigtLXMtZm9jdXMtcmluZy1jb2xvciwjMDA5MGZmKV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJwYWRUaW1lKHNlY29uZHMoKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlY29uZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybj1cIlswLTldK1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlU2Vjb25kc0tleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJoYW5kbGVTZWNvbmRzSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTYgdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RlY3JlbWVudF9zZWNvbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyB0aW1lOiBwcmV2U2Vjb25kVGFyZ2V0KCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlY3JlbWVudFNlY29uZHMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgQGlmIChpczEySG91ckZvcm1hdCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gU2VsZXRvciBBTS9QTSAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC05IHctMTIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS01IHRleHQtYmFzZSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfdG9nZ2xlX21lcmlkaWVtJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyBtZXJpZGllbTogbmV4dE1lcmlkaWVtVGFyZ2V0KCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQW1QbSgpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgYW1QbSgpIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBSb2RhcMOpIGRlIGHDp8O1ZXMgLS0+XG4gICAgICAgIEBpZiAoc2hvd0J1dHRvbkJhcigpIHx8IG1vZGUoKSA9PT0gJ2RhdGV0aW1lJyB8fCBtb2RlKCkgPT09ICd0aW1lJykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBib3JkZXItdCBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBweC0zIHB5LTJcIj5cbiAgICAgICAgICAgICAgICBAaWYgKHNob3dCdXR0b25CYXIoKSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChtb2RlKCkgPT09ICdkYXRlJyB8fCBtb2RlKCkgPT09ICdkYXRldGltZScgfHwgbW9kZSgpID09PSAncmFuZ2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLXNtYWxsIHB4LTIgcHktMSB0ZXh0LXNtIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUb2RheSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl90b2RheScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtc21hbGwgcHgtMiBweS0xIHRleHQtc20gdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY2xlYXInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChtb2RlKCkgPT09ICdkYXRldGltZScgfHwgbW9kZSgpID09PSAndGltZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtc21hbGwgYmctcHJpbWFyeSBweC0zIHB5LTEgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS0wIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOm9wYWNpdHktOTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29uZmlybSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9jb25maXJtJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAobW9kZSgpID09PSAnZGF0ZXRpbWUnIHx8IG1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLXNtYWxsIGJnLXByaW1hcnkgcHgtMyBweS0xIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtMCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpvcGFjaXR5LTkwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbmZpcm0oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY29uZmlybScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbiJdfQ==
|
|
1842
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZGF0ZXBpY2tlci9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZGF0ZXBpY2tlci9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQXFCLE1BQU0sc0JBQXNCLENBQUM7QUFDaEcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFDSCxlQUFlLEVBQ2YsU0FBUyxFQUNULFFBQVEsRUFDUixVQUFVLEVBQ1YsVUFBVSxFQUNWLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUNMLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBR0gsV0FBVyxFQUNYLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsU0FBUyxFQUNULG1CQUFtQixFQUduQixVQUFVLEdBQ2IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFvQyxNQUFNLHNCQUFzQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMs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cUJBQ0o7d0RBNHFEUyxrQkFBa0IsTUFXbEIsb0JBQW9CLE1BV3BCLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka1RyYXBGb2N1cywgTGl2ZUFubm91bmNlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7IENka0Nvbm5lY3RlZE92ZXJsYXksIENka092ZXJsYXlPcmlnaW4sIENvbm5lY3RlZFBvc2l0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgTmdDbGFzcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIGFmdGVyTmV4dFJlbmRlcixcbiAgICBDb21wb25lbnQsXG4gICAgY29tcHV0ZWQsXG4gICAgRGVzdHJveVJlZixcbiAgICBFbGVtZW50UmVmLFxuICAgIGluamVjdCxcbiAgICBJbmplY3RvcixcbiAgICBpbnB1dCxcbiAgICBtb2RlbCxcbiAgICBPbkluaXQsXG4gICAgb3V0cHV0LFxuICAgIHNpZ25hbCxcbiAgICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtcbiAgICBBYnN0cmFjdENvbnRyb2wsXG4gICAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTkdfVkFMSURBVE9SUyxcbiAgICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICBOZ0NvbnRyb2wsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBWYWxpZGF0aW9uRXJyb3JzLFxuICAgIFZhbGlkYXRvcixcbiAgICBWYWxpZGF0b3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IERhdGVTZWdtZW50RW5naW5lLCBTZWdtZW50RW5naW5lQ29uZmlnLCBTZWdtZW50S2luZCB9IGZyb20gJy4vZGF0ZS1zZWdtZW50LWlucHV0JztcbmltcG9ydCB7IGZvcm1hdFZhbHVlRm9ySW5wdXQsIGlzU2FtZURheSwgcGFyc2VJbnB1dCwgc3RyaXBUaW1lIH0gZnJvbSAnLi9kYXRlLnV0aWxzJztcbmltcG9ydCB0eXBlIHsgQ2FsZW5kYXJEYXksIERhdGVQaWNrZXJNb2RlLCBEYXRlUmFuZ2UgfSBmcm9tICcuL21vZGVscyc7XG5cbnR5cGUgRGF0ZXBpY2tlclZhbHVlID0gRGF0ZSB8IERhdGVSYW5nZSB8IERhdGVbXSB8IG51bGw7XG50eXBlIFBpY2tlclZpZXcgPSAnY2FsZW5kYXInIHwgJ21vbnRocycgfCAneWVhcnMnO1xuXG5mdW5jdGlvbiBudW1lcmljS2V5c09ubHkoKTogTWV0aG9kRGVjb3JhdG9yIHtcbiAgICByZXR1cm4gKF90YXJnZXQsIF9rZXksIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgICAgICBjb25zdCBvcmlnaW5hbDogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uICh0aGlzOiB1bmtub3duLCBldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICAgICAgY29uc3QgaXNWYWxpZEtleSA9XG4gICAgICAgICAgICAgICAgWydBcnJvd1VwJywgJ0Fycm93RG93bicsICdCYWNrc3BhY2UnLCAnRGVsZXRlJywgJ1RhYiddLmluY2x1ZGVzKGV2ZW50LmtleSkgfHwgL15cXGQkLy50ZXN0KGV2ZW50LmtleSk7XG4gICAgICAgICAgICBpZiAoIWlzVmFsaWRLZXkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbC5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfTtcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzLWRhdGVwaWNrZXInLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0NsYXNzLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIENka1RyYXBGb2N1cyxcbiAgICAgICAgQ2RrT3ZlcmxheU9yaWdpbixcbiAgICAgICAgQ2RrQ29ubmVjdGVkT3ZlcmxheSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVzOiBbXG4gICAgICAgIGBcbiAgICAgICAgICAgIDpob3N0IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6aG9zdC5uZy1pbnZhbGlkLm5nLWRpcnR5IC5kYXRlcGlja2VyLWdyb3VwOm5vdCg6Zm9jdXMtd2l0aGluKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgYnV0dG9uLnRyaWdnZXItaWNvbiB7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogI2MxMzAxODtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6aG9zdC5uby1pY29uIGJ1dHRvblt0eXBlPSdidXR0b24nXSB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDpob3N0Lm5vLWljb24gaW5wdXQge1xuICAgICAgICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDAuNzVyZW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidXR0b25bdHlwZT0nYnV0dG9uJ106Zm9jdXMtdmlzaWJsZSB7XG4gICAgICAgICAgICAgICAgb3V0bGluZTogMnB4IHNvbGlkICM0MjhiY2E7XG4gICAgICAgICAgICAgICAgb3V0bGluZS1vZmZzZXQ6IDFweDtcbiAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnV0dG9uLnRyaWdnZXItaWNvblt0eXBlPSdidXR0b24nXTpmb2N1cy12aXNpYmxlIHtcbiAgICAgICAgICAgICAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tcy1mb2N1cy1yaW5nLWNvbG9yLCAjMDA5MGZmKTtcbiAgICAgICAgICAgICAgICBvdXRsaW5lLW9mZnNldDogLTJweDtcbiAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwIDRweCA0cHggMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgYCxcbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ1tjbGFzcy5uby1pY29uXSc6ICchc2hvd0ljb24oKScsXG4gICAgfSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogRGF0ZXBpY2tlckNvbXBvbmVudCxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IERhdGVwaWNrZXJDb21wb25lbnQsXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRlcGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25Jbml0IHtcbiAgICBwcml2YXRlIHN0YXRpYyBpZENvdW50ZXIgPSAwO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERBWVNfSU5fV0VFSyA9IDc7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTU9OVEhTX0lOX1lFQVIgPSAxMjtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNT05USFNfUEVSX1JPVyA9IDM7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgWUVBUlNfUEVSX0dSSUQgPSAxMjtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBZRUFSU19QRVJfUk9XID0gMztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX01JTlVURV9TVEVQID0gNTtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfSE9VUlMgPSAyNDtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfTUlOVVRFUyA9IDYwO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEhPVVJTX1BFUl9NRVJJRElFTSA9IDEyO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERPVUJMRV9DTElDS19USFJFU0hPTERfTVMgPSA0MDA7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBuZXh0SWQoKTogc3RyaW5nIHtcbiAgICAgICAgRGF0ZXBpY2tlckNvbXBvbmVudC5pZENvdW50ZXIrKztcbiAgICAgICAgcmV0dXJuIGBzLWRhdGVwaWNrZXItJHtEYXRlcGlja2VyQ29tcG9uZW50LmlkQ291bnRlcn1gO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBJbnB1dHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICAvKiogSFRNTCBgaWRgIGFwbGljYWRvIGFvIGVsZW1lbnRvIGA8aW5wdXQ+YC4gQXV0by1nZXJhZG8gcXVhbmRvIG9taXRpZG8uICovXG4gICAgcmVhZG9ubHkgaW5wdXRJZCA9IGlucHV0PHN0cmluZz4oRGF0ZXBpY2tlckNvbXBvbmVudC5uZXh0SWQoKSk7XG5cbiAgICAvKiogQXRyaWJ1dG8gYG5hbWVgIGRvIGA8aW5wdXQ+YCBuYXRpdm8uICovXG4gICAgcmVhZG9ubHkgbmFtZSA9IGlucHV0PHN0cmluZz4oKTtcblxuICAgIC8qKiBUZXh0byBleGliaWRvIHF1YW5kbyBuZW5odW0gdmFsb3IgZXN0w6Egc2VsZWNpb25hZG8uICovXG4gICAgcmVhZG9ubHkgcGxhY2Vob2xkZXIgPSBpbnB1dDxzdHJpbmc+KCk7XG5cbiAgICAvKipcbiAgICAgKiBNb2RvIGRlIHNlbGXDp8OjbyBkbyBjb21wb25lbnRlLlxuICAgICAqIC0gYCdkYXRlJ2Ag4oCUIHNlbGXDp8OjbyBkZSBkYXRhIMO6bmljYSAocGFkcsOjbylcbiAgICAgKiAtIGAnbW9udGgnYCDigJQgc2VsZcOnw6NvIGRlIG3DqnMvYW5vXG4gICAgICogLSBgJ2RhdGV0aW1lJ2Ag4oCUIGRhdGEgY29tIGhvcmEgKHJlcXVlciBjb25maXJtYcOnw6NvKVxuICAgICAqIC0gYCd0aW1lJ2Ag4oCUIGFwZW5hcyBzZWxlw6fDo28gZGUgaG9yYVxuICAgICAqIC0gYCdyYW5nZSdgIOKAlCBpbnRlcnZhbG8gZW50cmUgZHVhcyBkYXRhc1xuICAgICAqL1xuICAgIHJlYWRvbmx5IG1vZGUgPSBpbnB1dDxEYXRlUGlja2VyTW9kZT4oJ2RhdGUnKTtcblxuICAgIC8qKlxuICAgICAqIE1vZG8gZGUgc2VsZcOnw6NvIHF1YW5kbyBgbW9kZWAgw6kgYCdkYXRlJ2AuXG4gICAgICogLSBgJ3NpbmdsZSdgIOKAlCBzZWxlw6fDo28gZGUgdW1hIMO6bmljYSBkYXRhIChwYWRyw6NvKVxuICAgICAqIC0gYCdtdWx0aXBsZSdgIOKAlCBzZWxlw6fDo28gZGUgbcO6bHRpcGxhcyBkYXRhcyBhdnVsc2FzXG4gICAgICovXG4gICAgcmVhZG9ubHkgc2VsZWN0aW9uTW9kZSA9IGlucHV0PCdzaW5nbGUnIHwgJ211bHRpcGxlJz4oJ3NpbmdsZScpO1xuXG4gICAgLyoqIFNlcGFyYWRvciBleGliaWRvIGVudHJlIGFzIGRhdGFzIG5vIG1vZG8gYHNlbGVjdGlvbk1vZGUgPSAnbXVsdGlwbGUnYC4gKi9cbiAgICByZWFkb25seSBtdWx0aXBsZVNlcGFyYXRvciA9IGlucHV0PHN0cmluZz4oJywgJyk7XG5cbiAgICAvKiogUXVhbmRvIGB0cnVlYCwgZXhpYmUgbyBib3TDo28gZGUgw61jb25lIGFvIGxhZG8gZG8gY2FtcG8uICovXG4gICAgcmVhZG9ubHkgc2hvd0ljb24gPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIENsYXNzZSBkbyDDrWNvbmUgZXhpYmlkbyBubyBib3TDo28gZG8gY2FtcG8uXG4gICAgICogUXVhbmRvIGBtb2RlYCDDqSBgJ3RpbWUnYCwgbyBwYWRyw6NvIG11ZGEgYXV0b21hdGljYW1lbnRlIHBhcmEgYCdmYXMgZmEtY2xvY2snYC5cbiAgICAgKi9cbiAgICByZWFkb25seSBpY29uID0gaW5wdXQ8c3RyaW5nPignZmFzIGZhLWNhbGVuZGFyJyk7XG5cbiAgICAvKiogRGF0YSBtw61uaW1hIHNlbGVjaW9uw6F2ZWwuIERpYXMvbWVzZXMgYW50ZXJpb3JlcyBmaWNhbSBkZXNhYmlsaXRhZG9zLiAqL1xuICAgIHJlYWRvbmx5IG1pbiA9IGlucHV0PERhdGUgfCBudWxsPihudWxsKTtcblxuICAgIC8qKiBEYXRhIG3DoXhpbWEgc2VsZWNpb27DoXZlbC4gRGlhcy9tZXNlcyBwb3N0ZXJpb3JlcyBmaWNhbSBkZXNhYmlsaXRhZG9zLiAqL1xuICAgIHJlYWRvbmx5IG1heCA9IGlucHV0PERhdGUgfCBudWxsPihudWxsKTtcblxuICAgIC8qKiBEYXRhIGV4aWJpZGEgYW8gYWJyaXIgbyBjYWxlbmTDoXJpbyBxdWFuZG8gbmVuaHVtYSBkYXRhIGVzdMOhIHNlbGVjaW9uYWRhLiAqL1xuICAgIHJlYWRvbmx5IGRlZmF1bHREYXRlID0gaW5wdXQ8RGF0ZSB8IG51bGw+KG51bGwpO1xuXG4gICAgLyoqXG4gICAgICogRm9ybWF0byBkZSBleGliacOnw6NvIGRhIGRhdGEgbm8gY2FtcG8uIFF1YW5kbyBvbWl0aWRvLCDDqSByZXNvbHZpZG8gYSBwYXJ0aXIgZG9cbiAgICAgKiBsb2NhbGUgYXRpdm8gKGNoYXZlIGBwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZV9mb3JtYXRgKSwgY29tIGZhbGxiYWNrIHBhcmEgYGRkL01NL3l5eXlgLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGRhdGVGb3JtYXQgPSBpbnB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXRvIGRlIGV4aWJpw6fDo28gZGFzIGhvcmFzOiBgJzEyJ2Agb3UgYCcyNCdgLiBRdWFuZG8gb21pdGlkbywgw6kgcmVzb2x2aWRvIGEgcGFydGlyXG4gICAgICogZG8gbG9jYWxlIGF0aXZvIChjaGF2ZSBgcGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmhvdXJfZm9ybWF0YCksIGNvbSBmYWxsYmFjayBwYXJhIGAnMjQnYC5cbiAgICAgKi9cbiAgICByZWFkb25seSBob3VyRm9ybWF0ID0gaW5wdXQ8JzEyJyB8ICcyNCcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgICAvKiogSW5jcmVtZW50byBlbSBtaW51dG9zIGFvIHVzYXIgYXMgc2V0YXMgZG8gdGltZSBwaWNrZXIuICovXG4gICAgcmVhZG9ubHkgbWludXRlU3RlcCA9IGlucHV0PG51bWJlcj4oRGF0ZXBpY2tlckNvbXBvbmVudC5ERUZBVUxUX01JTlVURV9TVEVQKTtcblxuICAgIC8qKiBRdWFuZG8gYHRydWVgLCBleGliZSBvIGNhbXBvIGRlIHNlZ3VuZG9zIG5vIHRpbWUgcGlja2VyLiAqL1xuICAgIHJlYWRvbmx5IHNob3dTZWNvbmRzID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIFNlcGFyYWRvciBleGliaWRvIGVudHJlIGFzIGRhdGFzIG5vIG1vZG8gYCdyYW5nZSdgLiAqL1xuICAgIHJlYWRvbmx5IHJhbmdlU2VwYXJhdG9yID0gaW5wdXQ8c3RyaW5nPignIOKAlCAnKTtcblxuICAgIC8qKiBBYnJlIG8gcGFpbmVsIGFvIGZvY2FyIG8gaW5wdXQ7IGZvY28gcGVybWFuZWNlIG5vIGlucHV0LCBuw6NvIHB1bGEgcGFyYSBvIGRyb3Bkb3duLiAqL1xuICAgIHJlYWRvbmx5IHNob3dPbkZvY3VzID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgICAvKiogSW1wZWRlIGRpZ2l0YcOnw6NvIG1hbnVhbDsgdmFsb3Igc8OzIHBvZGUgc2VyIHNlbGVjaW9uYWRvIHBlbG8gY2FsZW5kw6FyaW8uICovXG4gICAgcmVhZG9ubHkgcmVhZG9ubHlJbnB1dCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKiBQcmltZWlybyBkaWEgZGEgc2VtYW5hICgwID0gZG9taW5nbywgMSA9IHNlZ3VuZGEtZmVpcmEsIC4uLiwgNiA9IHPDoWJhZG8pLiAqL1xuICAgIHJlYWRvbmx5IGZpcnN0RGF5T2ZXZWVrID0gaW5wdXQ8bnVtYmVyPigwKTtcblxuICAgIC8qKiBFeGliZS9vY3VsdGEgYSBiYXJyYSBkZSBib3TDtWVzIEhvamUgZSBMaW1wYXIgbm8gcm9kYXDDqS4gKi9cbiAgICByZWFkb25seSBzaG93QnV0dG9uQmFyID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgICAvKiogRXhpYmUgw61jb25lIGRlIGxpbXBhciBpbmxpbmUgbm8gY2FtcG8gZGUgaW5wdXQuICovXG4gICAgcmVhZG9ubHkgc2hvd0NsZWFyID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIEV4aWJlIGRpYXMgZGUgbWVzZXMgYWRqYWNlbnRlcyBuYSBncmFkZSBkbyBjYWxlbmTDoXJpby4gKi9cbiAgICByZWFkb25seSBzaG93T3RoZXJNb250aHMgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICAgIC8qKiBQZXJtaXRlIHNlbGVjaW9uYXIgZGlhcyBkZSBtZXNlcyBhZGphY2VudGVzIG5hIGdyYWRlIGRvIGNhbGVuZMOhcmlvLiAqL1xuICAgIHJlYWRvbmx5IHNlbGVjdE90aGVyTW9udGhzID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIEZlY2hhIG8gcGFpbmVsIGFww7NzIHNlbGVjaW9uYXIgdW1hIGRhdGEgbm8gbW9kbyBgZGF0ZXRpbWVgLiAqL1xuICAgIHJlYWRvbmx5IGhpZGVPbkRhdGVUaW1lU2VsZWN0ID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIEluY3JlbWVudG8gZGUgaG9yYXMgbm8gdGltZSBwaWNrZXIuICovXG4gICAgcmVhZG9ubHkgc3RlcEhvdXIgPSBpbnB1dDxudW1iZXI+KDEpO1xuXG4gICAgLyoqIEluY3JlbWVudG8gZGUgc2VndW5kb3Mgbm8gdGltZSBwaWNrZXIuICovXG4gICAgcmVhZG9ubHkgc3RlcFNlY29uZCA9IGlucHV0PG51bWJlcj4oMSk7XG5cbiAgICAvKiogw41uZGljZSBkZSB0YWIgZG8gY2FtcG8gZGUgaW5wdXQuICovXG4gICAgcmVhZG9ubHkgdGFiaW5kZXggPSBpbnB1dDxudW1iZXI+KCk7XG5cbiAgICAvKiogRm9jYSBhdXRvbWF0aWNhbWVudGUgbyBjYW1wbyBhbyBjYXJyZWdhciBvIGNvbXBvbmVudGUuICovXG4gICAgcmVhZG9ubHkgYXV0b2ZvY3VzID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIERhdGFzIGVzcGVjw61maWNhcyBkZXNhYmlsaXRhZGFzIG5vIGNhbGVuZMOhcmlvLiAqL1xuICAgIHJlYWRvbmx5IGRpc2FibGVkRGF0ZXMgPSBpbnB1dDxEYXRlW10+KFtdKTtcblxuICAgIC8qKiBEaWFzIGRhIHNlbWFuYSBkZXNhYmlsaXRhZG9zICgwID0gZG9taW5nbywgLi4uLCA2ID0gc8OhYmFkbykuICovXG4gICAgcmVhZG9ubHkgZGlzYWJsZWREYXlzID0gaW5wdXQ8bnVtYmVyW10+KFtdKTtcblxuICAgIC8vIOKUgOKUgCBUd28td2F5IG1vZGVscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIC8qKiBFc3RhZG8gZGVzYWJpbGl0YWRvIGRvIGNvbXBvbmVudGUuICovXG4gICAgcmVhZG9ubHkgZGlzYWJsZWQgPSBtb2RlbDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvLyDilIDilIAgT3V0cHV0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIC8qKiBFbWl0aWRvIHF1YW5kbyBvIGNhbXBvIHBlcmRlIG8gZm9jby4gKi9cbiAgICByZWFkb25seSBibHVycmVkID0gb3V0cHV0PEV2ZW50PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gcXVhbmRvIG8gY2FtcG8gcmVjZWJlIG8gZm9jby4gKi9cbiAgICByZWFkb25seSBmb2N1c2VkID0gb3V0cHV0PEV2ZW50PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gYW8gc2VsZWNpb25hciB1bWEgZGF0YSwgbcOqcywgaG9yw6FyaW8gb3UgaW50ZXJ2YWxvLiAqL1xuICAgIHJlYWRvbmx5IHNlbGVjdGVkID0gb3V0cHV0PERhdGVwaWNrZXJWYWx1ZT4oKTtcblxuICAgIC8qKiBFbWl0aWRvIHF1YW5kbyBvIHBhaW5lbCBkbyBjYWxlbmTDoXJpbyBmZWNoYS4gRW1pdGUgbyBlbGVtZW50byBkbyBwYWluZWwuICovXG4gICAgcmVhZG9ubHkgY2xvc2VkID0gb3V0cHV0PEhUTUxFbGVtZW50PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gYW8gY2xpY2FyIG5vIGJvdMOjbyBcIkhvamVcIi4gKi9cbiAgICByZWFkb25seSB0b2RheUNsaWNrID0gb3V0cHV0PERhdGU+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBhbyBjbGljYXIgbm8gYm90w6NvIFwiTGltcGFyXCIgb3Ugbm8gw61jb25lIGRlIGxpbXBhciBpbmxpbmUuICovXG4gICAgcmVhZG9ubHkgY2xlYXJDbGljayA9IG91dHB1dDxNb3VzZUV2ZW50PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gcXVhbmRvIG8gbcOqcyB2aXN1YWxpemFkbyBtdWRhLiAqL1xuICAgIHJlYWRvbmx5IG1vbnRoQ2hhbmdlID0gb3V0cHV0PHsgbW9udGg6IG51bWJlcjsgeWVhcjogbnVtYmVyIH0+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyBhbm8gdmlzdWFsaXphZG8gbXVkYS4gKi9cbiAgICByZWFkb25seSB5ZWFyQ2hhbmdlID0gb3V0cHV0PHsgbW9udGg6IG51bWJlcjsgeWVhcjogbnVtYmVyIH0+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyBwYWluZWwgZG8gY2FsZW5kw6FyaW8gYWJyZS4gKi9cbiAgICByZWFkb25seSBzaG93ID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyB1c3XDoXJpbyBkaWdpdGEgbWFudWFsbWVudGUgbm8gY2FtcG8uICovXG4gICAgcmVhZG9ubHkgdmFsdWVJbnB1dCA9IG91dHB1dDxFdmVudD4oKTtcblxuICAgIC8vIOKUgOKUgCBJbnRlcm5hbCBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBtYXhIb3VycyA9IERhdGVwaWNrZXJDb21wb25lbnQuTUFYX0hPVVJTO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBtYXhNaW51dGVzID0gRGF0ZXBpY2tlckNvbXBvbmVudC5NQVhfTUlOVVRFUztcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGltZUlucHV0TWF4TGVuZ3RoID0gMjtcblxuICAgIHByb3RlY3RlZCBpbnB1dERhdGUgPSAnJztcblxuICAgIHByb3RlY3RlZCBuZ0NvbnRyb2w6IE5nQ29udHJvbCB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHZhbHVlID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNPcGVuID0gc2lnbmFsKGZhbHNlKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNGb2N1c2VkID0gc2lnbmFsKGZhbHNlKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdmlld0RhdGUgPSBzaWduYWwobmV3IERhdGUoKSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBpY2tlclZpZXcgPSBzaWduYWw8UGlja2VyVmlldz4oJ2NhbGVuZGFyJyk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGhvdXJzID0gc2lnbmFsKDApO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBtaW51dGVzID0gc2lnbmFsKDApO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzZWNvbmRzID0gc2lnbmFsKDApO1xuICAgIHByb3RlY3RlZCByZWFkb25seSByYW5nZVZhbHVlID0gc2lnbmFsPERhdGVSYW5nZSB8IG51bGw+KG51bGwpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBtdWx0aXBsZVZhbHVlcyA9IHNpZ25hbDxEYXRlW10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGVuZGluZ1JhbmdlU3RhcnQgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBob3ZlckRhdGUgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwpO1xuICAgIHByaXZhdGUgX2hhc0Zvcm1hdEVycm9yID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBvblZhbGlkYXRvckNoYW5nZTogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAgIHByaXZhdGUgX29uQ2hhbmdlOiAodmFsdWU6IERhdGVwaWNrZXJWYWx1ZSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAgIHByaXZhdGUgX29uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBwb3B1cFBhbmVsID0gdmlld0NoaWxkKCdwb3B1cFBhbmVsJywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaW5jcmVhc2VIb3VyQnV0dG9uID0gdmlld0NoaWxkKCdpbmNyZWFzZUhvdXJCdXR0b24nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpY29uQnV0dG9uID0gdmlld0NoaWxkKCdpY29uQnV0dG9uJywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJpZ2dlcklucHV0ID0gdmlld0NoaWxkLnJlcXVpcmVkKCd0cmlnZ2VySW5wdXQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBob3N0RWxlbWVudCA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbGl2ZUFubm91bmNlciA9IGluamVjdChMaXZlQW5ub3VuY2VyKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3VycmVudExhbmcgPSBzaWduYWwodGhpcy50cmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMYW5nKTtcblxuICAgIC8qKiBSZWZsZXRlIGAocG9pbnRlcjogY29hcnNlKWAg4oCUIGRpc3Bvc2l0aXZvcyB0b3VjaCBwcmVmZXJlbSBvIHBvcHVwIGRvIGNhbGVuZMOhcmlvIGFvIHRlY2xhZG8uICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzVG91Y2hEZXZpY2UgPSBzaWduYWwoXG4gICAgICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cubWF0Y2hNZWRpYSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyB3aW5kb3cubWF0Y2hNZWRpYSgnKHBvaW50ZXI6IGNvYXJzZSknKS5tYXRjaGVzXG4gICAgICAgICAgICA6IGZhbHNlLFxuICAgICk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlZ21lbnRFbmdpbmUgPSBuZXcgRGF0ZVNlZ21lbnRFbmdpbmUoKTtcbiAgICAvKiogRWxlbWVudG8gcXVlIHRpbmhhIGZvY28gYW50ZXMgZG8gcGFpbmVsIGFicmlyIOKAlCB2ZXIgYGNhcHR1cmVGb2N1c09yaWdpbmAvYGNsb3NlUGFuZWxgLiAqL1xuICAgIHByaXZhdGUgZWxlbWVudFRvUmVzdG9yZUZvY3VzVG86IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgLyoqIGB0cnVlYCBzw7MgZHVyYW50ZSBvIGAuZm9jdXMoKWAgcHJvZ3JhbcOhdGljbyBkZSByZXN0YXVyYcOnw6NvIGVtIGBjbG9zZVBhbmVsKClgIOKAlCBldml0YSBxdWVcbiAgICAgKiAgYGhhbmRsZUlucHV0Rm9jdXNgIGludGVycHJldGUgZXNzZSBmb2NvIGNvbW8gdW0gZm9jbyBnZW51w61ubyBkbyB1c3XDoXJpbyBlIHJlYWJyYSBvIHBhaW5lbFxuICAgICAqICBuYSBob3JhIHZpYSBgc2hvd09uRm9jdXNgIChleC46IHNlbGVjaW9uYXIgdW1hIGRhdGEgZGV2b2x2ZSBvIGZvY28gcHJvIGlucHV0LCBxdWUgc2Vuw6NvXG4gICAgICogIHJlYWJyaXJpYSBvIHBhaW5lbCBpbWVkaWF0YW1lbnRlIGRlcG9pcyBkZSBmZWNow6EtbG8pLiAqL1xuICAgIHByaXZhdGUgaXNSZXN0b3JpbmdGb2N1c09uQ2xvc2UgPSBmYWxzZTtcbiAgICBwcml2YXRlIGxhc3RTZWdtZW50Q29uZmlnOiBTZWdtZW50RW5naW5lQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBtZWFzdXJlQ2FudmFzPzogSFRNTENhbnZhc0VsZW1lbnQ7XG4gICAgLyoqIEluY3JlbWVudGFkbyBhIGNhZGEgbXV0YcOnw6NvIGRvIHVzdcOhcmlvIOKAlCBpbnZhbGlkYSBjYWxsYmFja3MgZGUgY2xpcXVlL2ZvY28gYWRpYWRvcyBxdWUgZmljYXJhbSBvYnNvbGV0b3MuICovXG4gICAgcHJpdmF0ZSBpbnRlcmFjdGlvbkdlbmVyYXRpb24gPSAwO1xuICAgIC8qKiBgdGltZVN0YW1wYCBkbyDDumx0aW1vIG1vdXNlZG93biBubyBpbnB1dCBzZWdtZW50YWRvIOKAlCB1c2FkbyBwcmEgZGV0ZWN0YXIgZHVwbG8gY2xpcXVlIG5hIG3Do28uICovXG4gICAgcHJpdmF0ZSBsYXN0TW91c2VEb3duQXQgPSAwO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5vbkxhbmdDaGFuZ2UucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZy5zZXQoZXZlbnQubGFuZyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93Lm1hdGNoTWVkaWEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lZGlhUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHBvaW50ZXI6IGNvYXJzZSknKTtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZVBvaW50ZXJDaGFuZ2UgPSAoZXZlbnQ6IE1lZGlhUXVlcnlMaXN0RXZlbnQpOiB2b2lkID0+IHRoaXMuaXNUb3VjaERldmljZS5zZXQoZXZlbnQubWF0Y2hlcyk7XG4gICAgICAgICAgICBtZWRpYVF1ZXJ5LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGhhbmRsZVBvaW50ZXJDaGFuZ2UpO1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiBtZWRpYVF1ZXJ5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGhhbmRsZVBvaW50ZXJDaGFuZ2UpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgCBDb21wdXRlZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCByZWFkb25seSByZXNvbHZlZEljb24gPSBjb21wdXRlZCgoKSA9PiAodGhpcy5tb2RlKCkgPT09ICd0aW1lJyA/ICdmYXMgZmEtY2xvY2snIDogdGhpcy5pY29uKCkpKTtcblxuICAgIC8qKiBgZGF0ZUZvcm1hdGAgZXhwbMOtY2l0byBvdSByZXNvbHZpZG8gYSBwYXJ0aXIgZG8gbG9jYWxlIGF0aXZvIChmYWxsYmFjayBgZGQvTU0veXl5eWApLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSByZXNvbHZlZERhdGVGb3JtYXQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudExhbmcoKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuZGF0ZUZvcm1hdCgpID8/XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVUcmFuc2xhdGVkT3JEZWZhdWx0KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZV9mb3JtYXQnLCAnZGQvTU0veXl5eScpXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvKiogYGhvdXJGb3JtYXRgIGV4cGzDrWNpdG8gb3UgcmVzb2x2aWRvIGEgcGFydGlyIGRvIGxvY2FsZSBhdGl2byAoZmFsbGJhY2sgYCcyNCdgKS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZWRIb3VyRm9ybWF0ID0gY29tcHV0ZWQ8JzEyJyB8ICcyNCc+KCgpID0+IHtcbiAgICAgICAgdGhpcy5jdXJyZW50TGFuZygpO1xuICAgICAgICBjb25zdCBleHBsaWNpdCA9IHRoaXMuaG91ckZvcm1hdCgpO1xuICAgICAgICBpZiAoZXhwbGljaXQpIHJldHVybiBleHBsaWNpdDtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRlZCA9IHRoaXMucmVzb2x2ZVRyYW5zbGF0ZWRPckRlZmF1bHQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5ob3VyX2Zvcm1hdCcsICcyNCcpO1xuICAgICAgICByZXR1cm4gdHJhbnNsYXRlZCA9PT0gJzEyJyA/ICcxMicgOiAnMjQnO1xuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU0VHTUVOVF9MQUJFTF9LRVlTOiBSZWNvcmQ8U2VnbWVudEtpbmQsIHN0cmluZz4gPSB7XG4gICAgICAgIGRheTogJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlZ21lbnRfZGF5JyxcbiAgICAgICAgbW9udGg6ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWdtZW50X21vbnRoJyxcbiAgICAgICAgeWVhcjogJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlZ21lbnRfeWVhcicsXG4gICAgICAgIGhvdXI6ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9ob3VyJyxcbiAgICAgICAgbWludXRlOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbWludXRlJyxcbiAgICAgICAgc2Vjb25kOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2Vjb25kJyxcbiAgICAgICAgYW1wbTogJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlZ21lbnRfYW1wbScsXG4gICAgfTtcblxuICAgIC8qKiBNb2RvcyBjdWpvIGZvcm1hdG8gZGUgZXhpYmnDp8OjbyDDqSByZXNvbHZpZG8gcGVsYSBlbmdpbmUgZGUgc2VnbWVudG9zIChpbmRlcGVuZGVudGUgZGUgdG91Y2gvcmVhZG9ubHkpLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc1NlZ21lbnRNb2RlQ2FuZGlkYXRlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc011bHRpcGxlTW9kZSgpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLm1vZGUoKTtcbiAgICAgICAgcmV0dXJuIG1vZGUgPT09ICdkYXRlJyB8fCBtb2RlID09PSAnbW9udGgnIHx8IG1vZGUgPT09ICd0aW1lJyB8fCBtb2RlID09PSAnZGF0ZXRpbWUnO1xuICAgIH0pO1xuXG4gICAgLyoqIEludGVyYXRpdmlkYWRlIGRlIGRpZ2l0YcOnw6NvIHBvciBzZWdtZW50byDigJQgZGVzbGlnYWRhIGVtIHRvdWNoIG91IHF1YW5kbyBgcmVhZG9ubHlJbnB1dGAgw6kgdXNhZG8uICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzU2VnbWVudGVkTW9kZSA9IGNvbXB1dGVkKFxuICAgICAgICAoKSA9PiB0aGlzLmlzU2VnbWVudE1vZGVDYW5kaWRhdGUoKSAmJiAhdGhpcy5pc1RvdWNoRGV2aWNlKCkgJiYgIXRoaXMucmVhZG9ubHlJbnB1dCgpLFxuICAgICk7XG5cbiAgICAvKiogSW5kaWNhIHNlIG8gdGltZSBwaWNrZXIgZGV2ZSB1c2FyIG8gZm9ybWF0byBkZSAxMiBob3JhcyBjb20gc2VsZXRvciBBTS9QTS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXMxMkhvdXJGb3JtYXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnJlc29sdmVkSG91ckZvcm1hdCgpID09PSAnMTInKTtcblxuICAgIC8qKiBIb3JhIGV4aWJpZGEgbm8gdGltZSBwaWNrZXI6IDHigJMxMiBubyBmb3JtYXRvIDEyaCwgMOKAkzIzIG5vIGZvcm1hdG8gMjRoLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkaXNwbGF5SG91cnMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmRpc3BsYXlIb3VyRm9yKHRoaXMuaG91cnMoKSkpO1xuXG4gICAgLyoqIE1lcmlkaWFubyBhdHVhbCBkZXJpdmFkbyBkYSBob3JhIGludGVybmEgKDDigJMyMykuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFtUG0gPSBjb21wdXRlZDwnQU0nIHwgJ1BNJz4oKCkgPT4gdGhpcy5tZXJpZGllbUZvcih0aGlzLmhvdXJzKCkpKTtcblxuICAgIHByaXZhdGUgZGlzcGxheUhvdXJGb3IoaG91cnMyNDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzMTJIb3VyRm9ybWF0KCkpIHJldHVybiBob3VyczI0O1xuICAgICAgICBjb25zdCBoMTIgPSBob3VyczI0ICUgRGF0ZXBpY2tlckNvbXBvbmVudC5IT1VSU19QRVJfTUVSSURJRU07XG4gICAgICAgIHJldHVybiBoMTIgPT09IDAgPyBEYXRlcGlja2VyQ29tcG9uZW50LkhPVVJTX1BFUl9NRVJJRElFTSA6IGgxMjtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1lcmlkaWVtRm9yKGhvdXJzMjQ6IG51bWJlcik6ICdBTScgfCAnUE0nIHtcbiAgICAgICAgcmV0dXJuIGhvdXJzMjQgPCBEYXRlcGlja2VyQ29tcG9uZW50LkhPVVJTX1BFUl9NRVJJRElFTSA/ICdBTScgOiAnUE0nO1xuICAgIH1cblxuICAgIC8qKiBUZXh0byAoY29tIEFNL1BNIHF1YW5kbyBhcGxpY8OhdmVsKSBkYSBob3JhIGRlIGRlc3Rpbm8gZG8gYm90w6NvIFwiYXVtZW50YXJcIi9cImRpbWludWlyIGhvcmFcIlxuICAgICAqICDigJQgbWVzbWEgbW90aXZhw6fDo28gZGUgYHByZXZNb250aFRhcmdldGAvYG5leHRNb250aFRhcmdldGAvYHByZXZZZWFyVGFyZ2V0YC9gbmV4dFllYXJUYXJnZXRgOlxuICAgICAqICBzZW0gaXNzbywgbyBib3TDo28gc8OzIGRpeiBcImF1bWVudGFyIGhvcmFcIiwgc2VtIGRpemVyIHF1YWwgaG9yYSB2YWkgcmVzdWx0YXIuICovXG4gICAgcHJpdmF0ZSBmb3JtYXRIb3VyVGFyZ2V0KGhvdXJzMjQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHBhZGRlZCA9IHRoaXMucGFkVGltZSh0aGlzLmRpc3BsYXlIb3VyRm9yKGhvdXJzMjQpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXMxMkhvdXJGb3JtYXQoKSA/IGAke3BhZGRlZH0gJHt0aGlzLm1lcmlkaWVtRm9yKGhvdXJzMjQpfWAgOiBwYWRkZWQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHByZXZIb3VyVGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT5cbiAgICAgICAgdGhpcy5mb3JtYXRIb3VyVGFyZ2V0KCh0aGlzLmhvdXJzKCkgLSB0aGlzLnN0ZXBIb3VyKCkgKyB0aGlzLm1heEhvdXJzKSAlIHRoaXMubWF4SG91cnMpLFxuICAgICk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHRIb3VyVGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT5cbiAgICAgICAgdGhpcy5mb3JtYXRIb3VyVGFyZ2V0KCh0aGlzLmhvdXJzKCkgKyB0aGlzLnN0ZXBIb3VyKCkpICUgdGhpcy5tYXhIb3VycyksXG4gICAgKTtcblxuICAgIC8qKiBNZXNtYSBtb3RpdmHDp8OjbywgcGFyYSBvcyBib3TDtWVzIGRlIG1pbnV0by9zZWd1bmRvL0FNLVBNLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBwcmV2TWludXRlVGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT5cbiAgICAgICAgdGhpcy5wYWRUaW1lKCh0aGlzLm1pbnV0ZXMoKSAtIHRoaXMubWludXRlU3RlcCgpICsgdGhpcy5tYXhNaW51dGVzKSAlIHRoaXMubWF4TWludXRlcyksXG4gICAgKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmV4dE1pbnV0ZVRhcmdldCA9IGNvbXB1dGVkKCgpID0+XG4gICAgICAgIHRoaXMucGFkVGltZSgodGhpcy5taW51dGVzKCkgKyB0aGlzLm1pbnV0ZVN0ZXAoKSkgJSB0aGlzLm1heE1pbnV0ZXMpLFxuICAgICk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJldlNlY29uZFRhcmdldCA9IGNvbXB1dGVkKCgpID0+IHRoaXMucGFkVGltZSgodGhpcy5zZWNvbmRzKCkgLSB0aGlzLnN0ZXBTZWNvbmQoKSArIDYwKSAlIDYwKSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHRTZWNvbmRUYXJnZXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnBhZFRpbWUoKHRoaXMuc2Vjb25kcygpICsgdGhpcy5zdGVwU2Vjb25kKCkpICUgNjApKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBuZXh0TWVyaWRpZW1UYXJnZXQgPSBjb21wdXRlZCgoKSA9PiAodGhpcy5hbVBtKCkgPT09ICdBTScgPyAnUE0nIDogJ0FNJykpO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBvc2l0aW9uczogQ29ubmVjdGVkUG9zaXRpb25bXSA9IFtcbiAgICAgICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAnYm90dG9tJywgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAndG9wJywgb2Zmc2V0WTogNCB9LFxuICAgICAgICB7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICd0b3AnLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdib3R0b20nLCBvZmZzZXRZOiAtNCB9LFxuICAgIF07XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcG9wdXBJZCA9IGNvbXB1dGVkKCgpID0+IGAke3RoaXMuaW5wdXRJZCgpfS1wb3B1cGApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGN1cnJlbnRNb250aEluZGV4ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy52aWV3RGF0ZSgpLmdldE1vbnRoKCkpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjdXJyZW50WWVhciA9IGNvbXB1dGVkKCgpID0+IHRoaXMudmlld0RhdGUoKS5nZXRGdWxsWWVhcigpKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3VycmVudE1vbnRoS2V5ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5tb250aEtleXNbdGhpcy5jdXJyZW50TW9udGhJbmRleCgpXSk7XG5cbiAgICAvKiogQW5vIGRlIGRlc3Rpbm8gZG8gYm90w6NvIFwiYW5vIGFudGVyaW9yXCIvXCJwcsOzeGltbyBhbm9cIiAodmlldyBkZSBtZXNlcykg4oCUIHBybyBhcmlhLWxhYmVsXG4gICAgICogIGFudW5jaWFyIHByYSBvbmRlIG8gYm90w6NvIHZhaSwgasOhIHF1ZSBcIkFubyBhbnRlcmlvclwiIHNvemluaG8gbsOjbyBkaXogcXVhbCBhbm8gw6kgZXNzZS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJldlllYXJUYXJnZXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmN1cnJlbnRZZWFyKCkgLSAxKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmV4dFllYXJUYXJnZXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmN1cnJlbnRZZWFyKCkgKyAxKTtcblxuICAgIC8qKiBNw6pzL2FubyBkZSBkZXN0aW5vIGRvIGJvdMOjbyBcIm3DqnMgYW50ZXJpb3JcIi9cInByw7N4aW1vIG3DqnNcIiAodmlldyBkZSBjYWxlbmTDoXJpbykg4oCUIG1lc21hXG4gICAgICogIG1vdGl2YcOnw6NvIGRlIGBwcmV2WWVhclRhcmdldGAvYG5leHRZZWFyVGFyZ2V0YDogXCJNw6pzIGFudGVyaW9yXCIgc296aW5obyBuw6NvIGRpeiBxdWFsIG3DqnMgw6lcbiAgICAgKiAgZXNzZSwgZSBjcnV6YXIgYSBmcm9udGVpcmEgZG8gYW5vIChleC46IGphbmVpcm8g4oaSIGRlemVtYnJvIGRvIGFubyBhbnRlcmlvcikgdG9ybmFyaWEgZXNzYVxuICAgICAqICBmYWx0YSBkZSBjb250ZXh0byBhaW5kYSBtYWlzIGNvbmZ1c2Egc2VtIG8gYW5vIGp1bnRvLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBwcmV2TW9udGhUYXJnZXQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IG5ldyBEYXRlKHZpZXcuZ2V0RnVsbFllYXIoKSwgdmlldy5nZXRNb250aCgpIC0gMSwgMSk7XG4gICAgICAgIHJldHVybiB0YXJnZXQudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMuY3VycmVudExhbmcoKSwgeyBtb250aDogJ2xvbmcnLCB5ZWFyOiAnbnVtZXJpYycgfSk7XG4gICAgfSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHRNb250aFRhcmdldCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gbmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpLCB2aWV3LmdldE1vbnRoKCkgKyAxLCAxKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldC50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5jdXJyZW50TGFuZygpLCB7IG1vbnRoOiAnbG9uZycsIHllYXI6ICdudW1lcmljJyB9KTtcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBzaG93Q2FsZW5kYXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm1vZGUoKSAhPT0gJ3RpbWUnKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd1RpbWVQaWNrZXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm1vZGUoKSA9PT0gJ2RhdGV0aW1lJyB8fCB0aGlzLm1vZGUoKSA9PT0gJ3RpbWUnKTtcblxuICAgIC8qKiBTZWxlw6fDo28gbcO6bHRpcGxhIGF0aXZhOiBhcGVuYXMgbm8gbW9kbyBgZGF0ZWAgY29tIGBzZWxlY3Rpb25Nb2RlID0gJ211bHRpcGxlJ2AuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzTXVsdGlwbGVNb2RlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zZWxlY3Rpb25Nb2RlKCkgPT09ICdtdWx0aXBsZScgJiYgdGhpcy5tb2RlKCkgPT09ICdkYXRlJyk7XG5cbiAgICAvKiogSW5zdHJ1w6fDo28gbGlkYSBqdW50byBkbyByw7N0dWxvIGRhIGdyYWRlIGRlIGRpYXMg4oCUIGNhZGEgbW9kbyBjb20gc2Vtw6JudGljYSBkZSBzZWxlw6fDo28gbsOjb1xuICAgICAqICDDs2J2aWEgKG3Dumx0aXBsYSwgaW50ZXJ2YWxvKSBnYW5oYSB1bWEgZnJhc2UgcHLDs3ByaWE7IGByYW5nZWAgYWluZGEgc2UgZGl2aWRlIGVtIGR1YXMgZmFzZXNcbiAgICAgKiAgKGVzY29saGVuZG8gaW7DrWNpbyB2cy4gasOhIGNvbSBgcGVuZGluZ1JhbmdlU3RhcnRgLCBlc2NvbGhlbmRvIGZpbSkuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNhbGVuZGFyR3JpZEFyaWFMYWJlbEtleSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNNdWx0aXBsZU1vZGUoKSkgcmV0dXJuICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9jYWxlbmRhcl9sYWJlbF9tdWx0aXBsZSc7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGVuZGluZ1JhbmdlU3RhcnQoKVxuICAgICAgICAgICAgICAgID8gJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2NhbGVuZGFyX2xhYmVsX3JhbmdlX3BlbmRpbmcnXG4gICAgICAgICAgICAgICAgOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY2FsZW5kYXJfbGFiZWxfcmFuZ2UnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY2FsZW5kYXJfbGFiZWwnO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG9yZGVyZWRXZWVrRGF5S2V5cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLmZpcnN0RGF5T2ZXZWVrKCk7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy53ZWVrRGF5S2V5cy5zbGljZShzdGFydCksIC4uLnRoaXMud2Vla0RheUtleXMuc2xpY2UoMCwgc3RhcnQpXTtcbiAgICB9KTtcblxuICAgIC8qKiBDaWVudGUgZGEgZmFzZSBkZSBzZWxlw6fDo28gZW0gYHJhbmdlYDogZW5xdWFudG8gbsOjbyBow6EgYHBlbmRpbmdSYW5nZVN0YXJ0YCwgw6kgYSBtZXNtYSBjaGF2ZVxuICAgICAqICBkZSBzZW1wcmUgKFwic2VsZWNpb25hciBpbnRlcnZhbG9cIik7IGRlcG9pcyBkbyBwcmltZWlybyBjbGlxdWUsIG11ZGEgcHJhIHVtYSBjaGF2ZSBxdWUgY2l0YVxuICAgICAqICBhIGRhdGEgaW5pY2lhbCBqw6EgZXNjb2xoaWRhLCBqw6EgcXVlIHJlYWJyaXIvcmVlbnRyYXIgbm8gZGnDoWxvZ28gbmVzc2UgbWVpby10ZW1wbyBuw6NvIGRhdmFcbiAgICAgKiAgbmVuaHVtYSBwaXN0YSBkZSBxdWUgYSBzZWd1bmRhIG1ldGFkZSBkbyBmbHV4byBlcmEgYSBxdWUgZmFsdGF2YS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlhbG9nQXJpYUxhYmVsS2V5ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgIT09ICdyYW5nZScpIHJldHVybiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X2RhdGUnO1xuICAgICAgICByZXR1cm4gdGhpcy5wZW5kaW5nUmFuZ2VTdGFydCgpXG4gICAgICAgICAgICA/ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWxlY3RfcmFuZ2VfZW5kJ1xuICAgICAgICAgICAgOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X3JhbmdlJztcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBkaWFsb2dBcmlhTGFiZWxQYXJhbXMgPSBjb21wdXRlZDx7IGRhdGU/OiBzdHJpbmcgfT4oKCkgPT4ge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nUmFuZ2VTdGFydCgpO1xuICAgICAgICByZXR1cm4gcGVuZGluZyA/IHsgZGF0ZTogdGhpcy5mb3JtYXREYXlBcmlhTGFiZWwocGVuZGluZykgfSA6IHt9O1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJhbmdlU3RhdHVzRWxlbWVudElkID0gY29tcHV0ZWQoKCkgPT4gYCR7dGhpcy5pbnB1dElkKCl9LXJhbmdlLXN0YXR1c2ApO1xuXG4gICAgLyoqIFRleHRvIGRvIGA8c3Bhbj5gIGBzci1vbmx5YCByZWZlcmVuY2lhZG8gcG9yIGBhcmlhLWRlc2NyaWJlZGJ5YCBubyBgPGlucHV0PmAg4oCUIGTDoSBhbyBjYW1wb1xuICAgICAqICB1bSBjb250ZcO6ZG8gcGVyc2lzdGVudGUgZSBhY2Vzc8OtdmVsIGVucXVhbnRvIHPDsyBhIGRhdGEgaW5pY2lhbCBkbyBpbnRlcnZhbG8gZm9pIGVzY29saGlkYSxcbiAgICAgKiAgasOhIHF1ZSBgaW5wdXREYXRlYCBzw7MgcmVmbGV0ZSBvIHZhbG9yIGNvbXBsZXRvIGRlcG9pcyBkYSBzZWd1bmRhIGVzY29saGEgKGEgYXR1YWxpemHDp8Ojb1xuICAgICAqICBwYXJjaWFsIGVtIGBzZWxlY3REYXRlKClgIGNvYnJlIG8gdGV4dG8gdmlzw612ZWw7IGlzdG8gY29icmUgbyBxdWUgdW0gbGVpdG9yIGRlIHRlbGEgbMOqIGFvXG4gICAgICogIGZvY2FyL3JlbGVyIG8gY2FtcG8pLiBVc2EgYGFyaWEtZGVzY3JpYmVkYnlgLCBuw6NvIGBhcmlhLWxhYmVsYCwgcHJhIHPDsyBBQ1JFU0NFTlRBUlxuICAgICAqICBpbmZvcm1hw6fDo28gc2VtIHNvYnJlc2NyZXZlciBvIG5vbWUgYWNlc3PDrXZlbCBxdWUgaW50ZWdyYcOnw7VlcyAoZHluYW1pYy1mb3JtLCBzaG93Y2FzZSlcbiAgICAgKiAgasOhIGNvbnRyb2xhbSBwb3IgZm9yYSBkbyBjb21wb25lbnRlLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSByYW5nZVBlbmRpbmdTdGF0dXNUZXh0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgIT09ICdyYW5nZScpIHJldHVybiAnJztcbiAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ1JhbmdlU3RhcnQoKTtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmcgPyB0aGlzLmJ1aWxkUmFuZ2VTdGFydFNlbGVjdGVkVGV4dChwZW5kaW5nKSA6ICcnO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsYWNlaG9sZGVyS2V5ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBtb2RlID0gdGhpcy5tb2RlKCk7XG4gICAgICAgIHJldHVybiBgcGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcGxhY2Vob2xkZXJfJHttb2RlfWA7XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZWZmZWN0aXZlUmFuZ2UgPSBjb21wdXRlZCgoKTogeyBzdGFydDogRGF0ZSB8IG51bGw7IGVuZDogRGF0ZSB8IG51bGwgfSA9PiB7XG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0KCk7XG4gICAgICAgIGNvbnN0IGhvdmVyID0gdGhpcy5ob3ZlckRhdGUoKTtcbiAgICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgICAgIGlmIChob3Zlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHBlbmRpbmcuZ2V0VGltZSgpIDw9IGhvdmVyLmdldFRpbWUoKSA/IFtwZW5kaW5nLCBob3Zlcl0gOiBbaG92ZXIsIHBlbmRpbmddO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBwZW5kaW5nLCBlbmQ6IG51bGwgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yYW5nZVZhbHVlKCkgPz8geyBzdGFydDogbnVsbCwgZW5kOiBudWxsIH07XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2FsZW5kYXJXZWVrcyA9IGNvbXB1dGVkKCgpOiBDYWxlbmRhckRheVtdW10gPT4ge1xuICAgICAgICBjb25zdCB5ZWFyID0gdGhpcy5jdXJyZW50WWVhcigpO1xuICAgICAgICBjb25zdCBtb250aCA9IHRoaXMuY3VycmVudE1vbnRoSW5kZXgoKTtcbiAgICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLmVmZmVjdGl2ZVJhbmdlKCk7XG4gICAgICAgIGNvbnN0IHJhbmdlU3RhcnRUaW1lID0gcmFuZ2Uuc3RhcnQgPyBzdHJpcFRpbWUocmFuZ2Uuc3RhcnQpIDogbnVsbDtcbiAgICAgICAgY29uc3QgcmFuZ2VFbmRUaW1lID0gcmFuZ2UuZW5kID8gc3RyaXBUaW1lKHJhbmdlLmVuZCkgOiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0RGF5T2ZNb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKTtcbiAgICAgICAgY29uc3Qgc3RhcnRXZWVrRGF5ID0gZmlyc3REYXlPZk1vbnRoLmdldERheSgpO1xuICAgICAgICBjb25zdCBhZGp1c3RlZFN0YXJ0RGF5ID0gKHN0YXJ0V2Vla0RheSAtIHRoaXMuZmlyc3REYXlPZldlZWsoKSArIDcpICUgNztcbiAgICAgICAgY29uc3QgZGF5c0luTW9udGggPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIDApLmdldERhdGUoKTtcbiAgICAgICAgY29uc3QgZGF5c0luUHJldk1vbnRoID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDApLmdldERhdGUoKTtcblxuICAgICAgICBjb25zdCBhbGxEYXlzOiBDYWxlbmRhckRheVtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IGFkanVzdGVkU3RhcnREYXkgLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5c0luUHJldk1vbnRoIC0gaSk7XG4gICAgICAgICAgICBhbGxEYXlzLnB1c2godGhpcy5idWlsZENhbGVuZGFyRGF5KGRhdGUsIGZhbHNlLCB0b2RheSwgc2VsZWN0ZWQsIHJhbmdlLCByYW5nZVN0YXJ0VGltZSwgcmFuZ2VFbmRUaW1lKSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBkID0gMTsgZCA8PSBkYXlzSW5Nb250aDsgZCsrKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGgsIGQpO1xuICAgICAgICAgICAgYWxsRGF5cy5wdXNoKHRoaXMuYnVpbGRDYWxlbmRhckRheShkYXRlLCB0cnVlLCB0b2RheSwgc2VsZWN0ZWQsIHJhbmdlLCByYW5nZVN0YXJ0VGltZSwgcmFuZ2VFbmRUaW1lKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbENlbGxzID1cbiAgICAgICAgICAgIE1hdGguY2VpbChhbGxEYXlzLmxlbmd0aCAvIERhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLKSAqIERhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLO1xuICAgICAgICBsZXQgbmV4dERheSA9IDE7XG4gICAgICAgIHdoaWxlIChhbGxEYXlzLmxlbmd0aCA8IHRvdGFsQ2VsbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIG5leHREYXkpO1xuICAgICAgICAgICAgbmV4dERheSsrO1xuICAgICAgICAgICAgYWxsRGF5cy5wdXNoKHRoaXMuYnVpbGRDYWxlbmRhckRheShkYXRlLCBmYWxzZSwgdG9kYXksIHNlbGVjdGVkLCByYW5nZSwgcmFuZ2VTdGFydFRpbWUsIHJhbmdlRW5kVGltZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgd2Vla3M6IENhbGVuZGFyRGF5W11bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbERheXMubGVuZ3RoOyBpICs9IERhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLKSB7XG4gICAgICAgICAgICB3ZWVrcy5wdXNoKGFsbERheXMuc2xpY2UoaSwgaSArIERhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdlZWtzO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vbnRoc0dyaWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJvd3M6IHsga2V5OiBzdHJpbmc7IGluZGV4OiBudW1iZXIgfVtdW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBEYXRlcGlja2VyQ29tcG9uZW50Lk1PTlRIU19JTl9ZRUFSOyBpICs9IERhdGVwaWNrZXJDb21wb25lbnQuTU9OVEhTX1BFUl9ST1cpIHtcbiAgICAgICAgICAgIHJvd3MucHVzaChbXG4gICAgICAgICAgICAgICAgeyBrZXk6IHRoaXMubW9udGhLZXlzW2ldLCBpbmRleDogaSB9LFxuICAgICAgICAgICAgICAgIHsga2V5OiB0aGlzLm1vbnRoS2V5c1tpICsgMV0sIGluZGV4OiBpICsgMSB9LFxuICAgICAgICAgICAgICAgIHsga2V5OiB0aGlzLm1vbnRoS2V5c1tpICsgMl0sIGluZGV4OiBpICsgMiB9LFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3M7XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3VycmVudERlY2FkZVN0YXJ0ID0gY29tcHV0ZWQoKCkgPT4gTWF0aC5mbG9vcih0aGlzLmN1cnJlbnRZZWFyKCkgLyAxMCkgKiAxMCk7XG5cbiAgICAvKiogSW50ZXJ2YWxvIGRlIGRlc3Rpbm8gZG8gYm90w6NvIFwiZMOpY2FkYSBhbnRlcmlvclwiL1wicHLDs3hpbWEgZMOpY2FkYVwiICh2aWV3IGRlIGFub3MpIOKAlCBtZXNtYVxuICAgICAqICBtb3RpdmHDp8OjbyBkZSBgcHJldlllYXJUYXJnZXRgL2BuZXh0WWVhclRhcmdldGAuIGBuYXZpZ2F0ZVByZXZgL2BuYXZpZ2F0ZU5leHRgIGRlc2xvY2FtXG4gICAgICogIGB2aWV3RGF0ZWAgZW0gwrExMCBhbm9zIChuw6NvIMKxMTIpIG5lc3NhIHZpZXc7IG8gZ3JpZCBleGliaWRvIMOpIHF1ZSBtb3N0cmEgMTIgYW5vcyBwb3JcbiAgICAgKiAgcMOhZ2luYSAodmVyIGB5ZWFyc0dyaWRgKSDigJQgZGHDrSBvIGludGVydmFsbyBpciBkZSBgY3VycmVudERlY2FkZVN0YXJ0KCkgwrEgMTBgIGF0w6lcbiAgICAgKiAgYCsgMTFgIHByYSBiYXRlciBleGF0YW1lbnRlIGNvbSBhIHDDoWdpbmEgcXVlIG8gY2xpcXVlIHJlYWxtZW50ZSBhYnJlLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBwcmV2RGVjYWRlUmFuZ2UgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKSAtIDEwO1xuICAgICAgICByZXR1cm4geyBzdGFydFllYXI6IHN0YXJ0LCBlbmRZZWFyOiBzdGFydCArIDExIH07XG4gICAgfSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHREZWNhZGVSYW5nZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLmN1cnJlbnREZWNhZGVTdGFydCgpICsgMTA7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0WWVhcjogc3RhcnQsIGVuZFllYXI6IHN0YXJ0ICsgMTEgfTtcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSB5ZWFyc0dyaWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKTtcbiAgICAgICAgY29uc3Qgcm93czogbnVtYmVyW11bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IERhdGVwaWNrZXJDb21wb25lbnQuWUVBUlNfUEVSX0dSSUQ7IGkgKz0gRGF0ZXBpY2tlckNvbXBvbmVudC5ZRUFSU19QRVJfUk9XKSB7XG4gICAgICAgICAgICByb3dzLnB1c2goW3N0YXJ0ICsgaSwgc3RhcnQgKyBpICsgMSwgc3RhcnQgKyBpICsgMl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHByZXZEaXNhYmxlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgaWYgKCFtaW4pIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAneWVhcnMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKSA8PSBtaW4uZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5waWNrZXJWaWV3KCkgPT09ICdtb250aHMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlldy5nZXRGdWxsWWVhcigpIDw9IG1pbi5nZXRGdWxsWWVhcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB2aWV3LmdldEZ1bGxZZWFyKCkgPCBtaW4uZ2V0RnVsbFllYXIoKSB8fFxuICAgICAgICAgICAgKHZpZXcuZ2V0RnVsbFllYXIoKSA9PT0gbWluLmdldEZ1bGxZZWFyKCkgJiYgdmlldy5nZXRNb250aCgpIDw9IG1pbi5nZXRNb250aCgpKVxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHREaXNhYmxlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKCFtYXgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAneWVhcnMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKSArIERhdGVwaWNrZXJDb21wb25lbnQuWUVBUlNfUEVSX0dSSUQgLSAxID49IG1heC5nZXRGdWxsWWVhcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgICAgICAgIHJldHVybiB2aWV3LmdldEZ1bGxZZWFyKCkgPj0gbWF4LmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHZpZXcuZ2V0RnVsbFllYXIoKSA+IG1heC5nZXRGdWxsWWVhcigpIHx8XG4gICAgICAgICAgICAodmlldy5nZXRGdWxsWWVhcigpID09PSBtYXguZ2V0RnVsbFllYXIoKSAmJiB2aWV3LmdldE1vbnRoKCkgPj0gbWF4LmdldE1vbnRoKCkpXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyDilIDilIAgVHJhbnNsYXRpb24ga2V5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCByZWFkb25seSB3ZWVrRGF5S2V5cyA9IFtcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV9zdW4nLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF5X21vbicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfdHVlJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV93ZWQnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF5X3RodScsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfZnJpJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV9zYXQnLFxuICAgIF07XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW9udGhLZXlzID0gW1xuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfamFuJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2ZlYicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9tYXInLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfYXByJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX21heScsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9qdW4nLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfanVsJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2F1ZycsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9zZXAnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfb2N0JyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX25vdicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9kZWMnLFxuICAgIF07XG5cbiAgICAvLyDilIDilIAgTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm5nQ29udHJvbCA9IHRoaXMuaW5qZWN0b3IuZ2V0KE5nQ29udHJvbCwgbnVsbCwgeyBzZWxmOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSB0aGlzLmRlZmF1bHREYXRlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGQgJiYgIXRoaXMudmFsdWUoKSAmJiAhdGhpcy5yYW5nZVZhbHVlKCkgJiYgdGhpcy5tdWx0aXBsZVZhbHVlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLnNldChkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5Rm9yKGQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBpbmplY3RvcjogdGhpcy5pbmplY3RvciB9LFxuICAgICAgICApO1xuICAgIH1cbiAgICAvLyDilIDilIAgQ29udHJvbFZhbHVlQWNjZXNzb3Ig4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogRGF0ZXBpY2tlclZhbHVlKTogdm9pZCB7XG4gICAgICAgIGlmICghdmFsdWUgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVWYWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheUZvcihudWxsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi52YWx1ZV0uc29ydCgoYSwgYikgPT4gYS5nZXRUaW1lKCkgLSBiLmdldFRpbWUoKSk7XG4gICAgICAgICAgICB0aGlzLm11bHRpcGxlVmFsdWVzLnNldChzb3J0ZWQpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkoc29ydGVkKTtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0ID0gc29ydGVkWzBdO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUoZmlyc3QuZ2V0RnVsbFllYXIoKSwgZmlyc3QuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRGF0ZVJhbmdlKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldCh2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheSh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodmFsdWUuc3RhcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZSh2YWx1ZS5zdGFydC5nZXRGdWxsWWVhcigpLCB2YWx1ZS5zdGFydC5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWx1ZS5zZXQodmFsdWUgYXMgRGF0ZSk7XG4gICAgICAgIGNvbnN0IGQgPSB2YWx1ZSBhcyBEYXRlO1xuICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IoZCk7XG4gICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSwgZC5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgIHRoaXMuaG91cnMuc2V0KGQuZ2V0SG91cnMoKSk7XG4gICAgICAgIHRoaXMubWludXRlcy5zZXQoZC5nZXRNaW51dGVzKCkpO1xuICAgICAgICB0aGlzLnNlY29uZHMuc2V0KGQuZ2V0U2Vjb25kcygpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBEYXRlcGlja2VyVmFsdWUpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkLnNldChpc0Rpc2FibGVkKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgVmFsaWRhdG9yIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHVibGljIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICAgICAgbGV0IHZhbHVlOiBEYXRlcGlja2VyVmFsdWU7XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGVNb2RlKCkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5tdWx0aXBsZVZhbHVlcygpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSgpID09PSAncmFuZ2UnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMucmFuZ2VWYWx1ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZVZhbGlkYXRpb25FcnJvcnModmFsdWUsIGNvbnRyb2wpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgUHVibGljIGFjdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgb3BlbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmNhcHR1cmVGb2N1c09yaWdpbigpO1xuICAgICAgICB0aGlzLmlzT3Blbi5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMucHJlcGFyZU9wZW5WaWV3KCk7XG4gICAgICAgIHRoaXMuc2hvdy5lbWl0KCk7XG4gICAgICAgIHRoaXMuZm9jdXNQYW5lbEFmdGVyT3BlbigpO1xuICAgIH1cblxuICAgIC8qKiBBYnJlIG8gcGFpbmVsIHNlbSB0cmFuc2ZlcmlyIG8gZm9jbyBwb3IgcGFkcsOjbyAodXNhZG8gcGVsbyBzaG93T25Gb2N1cykuIEVtIG1vZG9zIHNlbVxuICAgICAqICBkaWdpdGHDp8OjbyBwb3Igc2VnbWVudG8gKG11bHRpcGxlL3JhbmdlL3llYXIvdG91Y2gpIG8gZm9jbyBzZWd1ZSBwcm8gY2FsZW5kw6FyaW8gaWd1YWwgZW1cbiAgICAgKiAgb3BlbigpOyBlbSBtb2RvIHNlZ21lbnRhZG8gbyBmb2NvIHBlcm1hbmVjZSBubyBpbnB1dCBwcmEgY29udGludWFyIGRpZ2l0YW5kby4gKi9cbiAgICBwcml2YXRlIG9wZW5PbkZvY3VzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCgpIHx8IHRoaXMuaXNPcGVuKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5jYXB0dXJlRm9jdXNPcmlnaW4oKTtcbiAgICAgICAgdGhpcy5pc09wZW4uc2V0KHRydWUpO1xuICAgICAgICB0aGlzLnByZXBhcmVPcGVuVmlldygpO1xuICAgICAgICB0aGlzLnNob3cuZW1pdCgpO1xuICAgICAgICBpZiAoIXRoaXMuaXNTZWdtZW50ZWRNb2RlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNQYW5lbEFmdGVyT3BlbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c1BhbmVsQWZ0ZXJPcGVuKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICd0aW1lJykge1xuICAgICAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHRoaXMuaW5jcmVhc2VIb3VyQnV0dG9uKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKSwgeyBpbmplY3RvcjogdGhpcy5pbmplY3RvciB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNCZXN0Q2FsZW5kYXJUYXJnZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBHdWFyZGEgbyBlbGVtZW50byBmb2NhZG8gbm8gbW9tZW50byBlbSBxdWUgbyBwYWluZWwgYWJyZSwgcHJhIGRldm9sdmVyIG8gZm9jbyBwcmEgbMOhIGFvXG4gICAgICogIGZlY2hhciBlbSB2ZXogZGUgc2VtcHJlIGZvcsOnYXIgcHJvIGJvdMOjbyBkbyDDrWNvbmUg4oCUIHZlciBgY2xvc2VQYW5lbCgpYC4gKi9cbiAgICBwcml2YXRlIGNhcHR1cmVGb2N1c09yaWdpbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbGVtZW50VG9SZXN0b3JlRm9jdXNUbyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSBhIHZpZXcgaW5pY2lhbCBkbyBwYWluZWwgZSBwb3NpY2lvbmEgbyBjYWxlbmTDoXJpbyBubyBgZGVmYXVsdERhdGVgXG4gICAgICogcXVhbmRvIG5lbmh1bSB2YWxvciBlc3TDoSBzZWxlY2lvbmFkby5cbiAgICAgKi9cbiAgICBwcml2YXRlIHByZXBhcmVPcGVuVmlldygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLnJhbmdlVmFsdWUoKTtcbiAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAncmFuZ2UnICYmIHJhbmdlPy5zdGFydCkge1xuICAgICAgICAgICAgLy8gUmVhYnJpciB1bSBpbnRlcnZhbG8gasOhIGRlZmluaWRvIHByZWNpc2EgY2FpciBzZW1wcmUgbm8gbcOqcyBkbyBpbsOtY2lvIOKAlCBzZW7Do29cbiAgICAgICAgICAgIC8vIGB2aWV3RGF0ZWAgZmljYSBvbmRlIHVtYSBuYXZlZ2HDp8OjbyBhbnRlcmlvciBwYXJvdSBwb3IgYWNhc28gKGV4LjogY3J1emFyIG3DqnMgYW9cbiAgICAgICAgICAgIC8vIGVzY29saGVyIG8gZmltKSwgZSBgZm9jdXNCZXN0Q2FsZW5kYXJUYXJnZXQoKWAgKHByaW1laXJvIGBbZGF0YS1mb2N1cz1cInNlbGVjdGVkXCJdYFxuICAgICAgICAgICAgLy8gZW0gb3JkZW0gZGUgRE9NKSBhY2FiYSBmb2NhbmRvIG8gZmltIG91IG5lbmh1bWEgY8OpbHVsYSwgZGVwZW5kZW5kbyBkZSBxdWFsIG3DqnNcbiAgICAgICAgICAgIC8vIGNhbGhhIGRlIGVzdGFyIGVtIGV4aWJpw6fDo28uXG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShyYW5nZS5zdGFydC5nZXRGdWxsWWVhcigpLCByYW5nZS5zdGFydC5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0RGF0ZSA9IHRoaXMuZGVmYXVsdERhdGUoKTtcbiAgICAgICAgICAgIGlmIChkZWZhdWx0RGF0ZSAmJiAhdGhpcy52YWx1ZSgpICYmICF0aGlzLnJhbmdlVmFsdWUoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKGRlZmF1bHREYXRlLmdldEZ1bGxZZWFyKCksIGRlZmF1bHREYXRlLmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdtb250aCcpIHtcbiAgICAgICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ21vbnRocycpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSgpID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ3llYXJzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBpY2tlclZpZXcuc2V0KCdjYWxlbmRhcicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c0Jlc3RDYWxlbmRhclRhcmdldCgpOiB2b2lkIHtcbiAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5wb3B1cFBhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKCFwYW5lbCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hdkhlYWRlclRhcmdldCA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyVmlldygpID09PSAnY2FsZW5kYXInXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1tkYXRhLW5hdi1oZWFkZXJdIGJ1dHRvbjpub3QoW2Rpc2FibGVkXSknKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPVxuICAgICAgICAgICAgICAgICAgICBuYXZIZWFkZXJUYXJnZXQgPz9cbiAgICAgICAgICAgICAgICAgICAgcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1tkYXRhLWZvY3VzPVwic2VsZWN0ZWRcIl0nKSA/P1xuICAgICAgICAgICAgICAgICAgICBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignW2RhdGEtZm9jdXM9XCJ0b2RheVwiXScpID8/XG4gICAgICAgICAgICAgICAgICAgIHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdidXR0b246bm90KFtkaXNhYmxlZF0pJyk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Py5mb2N1cygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogWmVyYSBvIGVzdGFkbyBkZSBpbnRlcnZhbG8gZW0gYW5kYW1lbnRvIOKAlCB1c2FkbyB0YW50byBwZWxvIGZlY2hhbWVudG8gdG90YWwgZG8gcGFpbmVsXG4gICAgICogIChgY2xvc2VQYW5lbGAsIG9uZGUgbsOjbyBmYXogc2VudGlkbyBhbnVuY2lhciBuYWRhIHBvcnF1ZSBvIGRpw6Fsb2dvIGludGVpcm8gZXN0w6Egc3VtaW5kbylcbiAgICAgKiAgcXVhbnRvIHBlbG8gY2FuY2VsYW1lbnRvIGxldmUgdmlhIEVzY2FwZSBkZW50cm8gZGEgZ3JhZGUgKGBjYW5jZWxQZW5kaW5nUmFuZ2VTdGFydGApLCBxdWVcbiAgICAgKiAgbWFudMOpbSBvIHBhaW5lbCBhYmVydG8gZSBwb3IgaXNzbyBhbnVuY2lhIGEgbXVkYW7Dp2Egc2VwYXJhZGFtZW50ZS4gKi9cbiAgICBwcml2YXRlIHJlc2V0UGVuZGluZ1JhbmdlU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0LnNldChudWxsKTtcbiAgICAgICAgdGhpcy5ob3ZlckRhdGUuc2V0KG51bGwpO1xuICAgIH1cblxuICAgIC8qKiBDYW5jZWxhbWVudG8gbGV2ZSBkZSB1bWEgc2VsZcOnw6NvIGRlIGludGVydmFsbyBlbSBhbmRhbWVudG8gKHZlciBgaGFuZGxlQ2FsZW5kYXJHcmlkS2V5ZG93bmAsXG4gICAgICogIHRlY2xhIEVzY2FwZSkg4oCUIGFvIGNvbnRyw6FyaW8gZGUgYGNsb3NlUGFuZWxgLCBvIHBhaW5lbCBjb250aW51YSBhYmVydG8sIGVudMOjbyBhcXVpIGZhelxuICAgICAqICBzZW50aWRvIGFudW5jaWFyIGEgbXVkYW7Dp2EgZGUgZXN0YWRvLiAqL1xuICAgIHByaXZhdGUgY2FuY2VsUGVuZGluZ1JhbmdlU3RhcnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVzZXRQZW5kaW5nUmFuZ2VTZWxlY3Rpb24oKTtcbiAgICAgICAgLy8gQSBlc2NvbGhhIGRvIGluw61jaW8gKHJhbW8gYCFwZW5kaW5nYCBkZSBzZWxlY3REYXRlKCkpIGdyYXZhIG8gaW7DrWNpbyBwZW5kZW50ZSBlbVxuICAgICAgICAvLyBgaW5wdXREYXRlYCBwcmEgbsOjbyBkZWl4YXIgbyBjYW1wbyBvYnNvbGV0byBkdXJhbnRlIGEgc2VsZcOnw6NvIHBhcmNpYWwgKHZlciBzZWxlY3REYXRlKCkpXG4gICAgICAgIC8vIOKAlCBjYW5jZWxhciBlc3NhIGVzY29saGEgcHJlY2lzYSBkZXNmYXplciBpc3NvIHRhbWLDqW0sIHZvbHRhbmRvIHBybyBpbnRlcnZhbG8gasOhXG4gICAgICAgIC8vIGNvbmZpcm1hZG8gKG91IHZhemlvLCBzZSBuZW5odW0pIOKAlCB0ZXN0YWRvIG1hbnVhbG1lbnRlIHZpYSBkZXZ0b29sczogc2VtIGVzdGEgbGluaGEsIG9cbiAgICAgICAgLy8gY2FtcG8gZmljYXZhIHByZXNvIG1vc3RyYW5kbyBhIGRhdGEgcGVuZGVudGUgZGVzY2FydGFkYSBtZXNtbyBjb20gbyBpbnRlcnZhbG8gYW50aWdvXG4gICAgICAgIC8vIGFpbmRhIGRlc3RhY2FkbyBubyBjYWxlbmTDoXJpby5cbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkodGhpcy5yYW5nZVZhbHVlKCkpO1xuICAgICAgICB2b2lkIHRoaXMubGl2ZUFubm91bmNlci5hbm5vdW5jZShcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9yYW5nZV9zZWxlY3Rpb25fY2FuY2VsbGVkJyksXG4gICAgICAgICAgICAncG9saXRlJyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2xvc2VQYW5lbCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFuZWxFbGVtZW50ID0gdGhpcy5wb3B1cFBhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuaXNPcGVuLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMucmVzZXRQZW5kaW5nUmFuZ2VTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgICAgIHRoaXMuY2xvc2VkLmVtaXQocGFuZWxFbGVtZW50ID8/ICh0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpKTtcblxuICAgICAgICAvLyBTw7MgZm9yw6dhIG8gZm9jbyBwcmEgb3V0cm8gbHVnYXIgc2UgZWxlIGVzdGl2ZXIgZGVudHJvIGRvIHBhaW5lbCBxdWUgZXN0w6Egc2VuZG8gZmVjaGFkb1xuICAgICAgICAvLyAoc2Vuw6NvIG8gdXN1w6FyaW8gZmljYXJpYSBjb20gZm9jbyBcInByZXNvXCIgbnVtIGVsZW1lbnRvIHF1ZSBlc3TDoSBwcmVzdGVzIGEgc3VtaXIgZG8gRE9NKS5cbiAgICAgICAgLy8gU2UgbyBmb2NvIGrDoSBlc3TDoSBlbSBvdXRybyBsdWdhciDigJQgZXguOiBvIHByw7NwcmlvIGlucHV0IHNlZ21lbnRhZG8sIHF1ZSBhYnJpdSBvIHBhaW5lbFxuICAgICAgICAvLyB2aWEgYG9wZW5PbkZvY3VzYCBlIG51bmNhIGNoZWdvdSBhIHBlcmRlciBvIGZvY28g4oCUIGRlaXhhbW9zIGNvbW8gZXN0w6EsIGVtIHZleiBkZSBwdXhhclxuICAgICAgICAvLyBvIGZvY28gcHJvIGJvdMOjbyBkbyDDrWNvbmUgc2VtIG5lbmh1bSBtb3Rpdm8gKGJ1ZyByZWxhdGFkbyB2aWEgR05PTUUgT3JjYTogZmVjaGFyIG9cbiAgICAgICAgLy8gcGFpbmVsIGNsaWNhbmRvIGZvcmEsIGNvbSBvIGZvY28gYWluZGEgbm8gaW5wdXQsIGZhemlhIG8gZm9jbyBwdWxhciBwcm8gw61jb25lKS5cbiAgICAgICAgY29uc3QgZm9jdXNJc0luc2lkZVBhbmVsID1cbiAgICAgICAgICAgIHBhbmVsRWxlbWVudCAhPSBudWxsICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlICYmIHBhbmVsRWxlbWVudC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgICAgICAgaWYgKCFmb2N1c0lzSW5zaWRlUGFuZWwpIHJldHVybjtcblxuICAgICAgICBjb25zdCByZXN0b3JlVGFyZ2V0ID0gdGhpcy5lbGVtZW50VG9SZXN0b3JlRm9jdXNUbztcbiAgICAgICAgdGhpcy5lbGVtZW50VG9SZXN0b3JlRm9jdXNUbyA9IG51bGw7XG4gICAgICAgIGFmdGVyTmV4dFJlbmRlcihcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzUmVzdG9yaW5nRm9jdXNPbkNsb3NlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdG9yZVRhcmdldCAmJiBkb2N1bWVudC5jb250YWlucyhyZXN0b3JlVGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXN0b3JlVGFyZ2V0LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pY29uQnV0dG9uKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pc1Jlc3RvcmluZ0ZvY3VzT25DbG9zZSA9IGZhbHNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPIGJhY2tkcm9wIGRvIENESyBPdmVybGF5IGNvYnJlIGEgdGVsYSBpbnRlaXJhLCBpbmNsdWluZG8gbyBwcsOzcHJpbyB0cmlnZ2VyIOKAlCBjbGljYXIgbm9cbiAgICAgKiBpbnB1dCBvdSBub3MgYm90w7VlcyBkbyB0cmlnZ2VyIGVucXVhbnRvIG8gcGFpbmVsIGrDoSBlc3TDoSBhYmVydG8gdGFtYsOpbSBkaXNwYXJhXG4gICAgICogYGJhY2tkcm9wQ2xpY2tgIChvIHByw7NwcmlvIGA8aW5wdXQ+YCBudW5jYSByZWNlYmUgbyBgY2xpY2tgIG5lc3NlIGNhc28sIGVudMOjb1xuICAgICAqIGBoYW5kbGVJbnB1dENsaWNrYCBudW5jYSBkaXNwYXJhKS4gU2VtIGVzdGUgZmlsdHJvLCBjbGljYXIgbm8gaW5wdXQgcGFyYSB0cm9jYXIgZGVcbiAgICAgKiBzZWdtZW50byBmZWNoYXJpYSBvIHBhaW5lbCBlIHJvdWJhcmlhIG8gZm9jbyBwYXJhIG8gYm90w6NvIGRvIMOtY29uZSAodmlhIGBjbG9zZVBhbmVsYCkuXG4gICAgICogUXVhbmRvIG8gY2xpcXVlIGNhaXUgZXNwZWNpZmljYW1lbnRlIHNvYnJlIG8gYDxpbnB1dD5gLCByZWFwbGljYW1vcyBhIG1lc21hIGzDs2dpY2EgZGVcbiAgICAgKiByZXBvc2ljaW9uYW1lbnRvIGRlIHNlZ21lbnRvIHF1ZSBgaGFuZGxlSW5wdXRDbGlja2AgZmFyaWEsIGVtIHZleiBkZSBzw7MgaWdub3JhciBvIGNsaXF1ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaGFuZGxlQmFja2Ryb3BDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICAvLyBgZXZlbnQudGFyZ2V0YCBkZSB1bSBiYWNrZHJvcENsaWNrIGRvIENESyBPdmVybGF5IMOpIHNlbXByZSBvIHByw7NwcmlvIDxkaXY+IGRvXG4gICAgICAgIC8vIGJhY2tkcm9wLCBudW5jYSBvIGVsZW1lbnRvIHJlYWxtZW50ZSBjbGljYWRvIOKAlCBlbnTDo28gY2hlY2FyIGAuY29udGFpbnMoZXZlbnQudGFyZ2V0KWBcbiAgICAgICAgLy8gbnVuY2EgZnVuY2lvbmEuIEVtIHZleiBkaXNzbywgY29tcGFyYW1vcyBhIGNvb3JkZW5hZGEgcmVhbCBkbyBjbGlxdWUgKHF1ZSBvXG4gICAgICAgIC8vIE1vdXNlRXZlbnQgc2VtcHJlIGNhcnJlZ2EgY29ycmV0YW1lbnRlKSBjb250cmEgb3MgcmV0w6JuZ3Vsb3MgZG9zIGVsZW1lbnRvcyBkbyB0cmlnZ2VyLlxuICAgICAgICBjb25zdCBpbnB1dEVsID0gdGhpcy50cmlnZ2VySW5wdXQoKT8ubmF0aXZlRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaW5wdXRFbCAmJiB0aGlzLmlzU2VnbWVudGVkTW9kZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dFJlY3QgPSBpbnB1dEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgY2xpY2tlZE9uSW5wdXQgPVxuICAgICAgICAgICAgICAgIGV2ZW50LmNsaWVudFggPj0gaW5wdXRSZWN0LmxlZnQgJiZcbiAgICAgICAgICAgICAgICBldmVudC5jbGllbnRYIDw9IGlucHV0UmVjdC5yaWdodCAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmNsaWVudFkgPj0gaW5wdXRSZWN0LnRvcCAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmNsaWVudFkgPD0gaW5wdXRSZWN0LmJvdHRvbTtcbiAgICAgICAgICAgIGlmIChjbGlja2VkT25JbnB1dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VnbWVudFBvaW50ZXJEb3duKGlucHV0RWwsIGV2ZW50LmNsaWVudFgsIGV2ZW50LnRpbWVTdGFtcCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGNsaWNrZWRPblRyaWdnZXIgPVxuICAgICAgICAgICAgZXZlbnQuY2xpZW50WCA+PSByZWN0LmxlZnQgJiZcbiAgICAgICAgICAgIGV2ZW50LmNsaWVudFggPD0gcmVjdC5yaWdodCAmJlxuICAgICAgICAgICAgZXZlbnQuY2xpZW50WSA+PSByZWN0LnRvcCAmJlxuICAgICAgICAgICAgZXZlbnQuY2xpZW50WSA8PSByZWN0LmJvdHRvbTtcbiAgICAgICAgaWYgKGNsaWNrZWRPblRyaWdnZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdG9nZ2xlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVPdmVybGF5S2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlSW5wdXRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNTZWdtZW50ZWRNb2RlKCkgfHwgIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJvdW5kIHRvIGBtb3VzZWRvd25gLCBuw6NvIGBjbGlja2AgKHZlamEgbyBjb21lbnTDoXJpbyBlbSBgYXBwbHlTZWdtZW50Q2xpY2tgKS4gT1xuICAgICAgICAvLyBjb21wb3J0YW1lbnRvIG5hdGl2byBwYWRyw6NvIGRvIGJyb3dzZXIgcHJhIG1vdXNlZG93biBudW0gYDxpbnB1dD5gIGRlIHRleHRvIMOpXG4gICAgICAgIC8vIHBvc2ljaW9uYXIgbyBjYXJldC9pbmljaWFyIHNlbGXDp8OjbyBkZSB0ZXh0byBuYSBjb29yZGVuYWRhIGRvIGNsaXF1ZSDigJQgaXNzbyByb2RhXG4gICAgICAgIC8vICpkZXBvaXMqIGRvcyBub3Nzb3MgbGlzdGVuZXJzIGUgc29icmVzY3JldmVyaWEgbyBgc2V0U2VsZWN0aW9uUmFuZ2VgIGRvIHNlZ21lbnRvXG4gICAgICAgIC8vIGFwbGljYWRvIGxvZ28gYWJhaXhvLiBgcHJldmVudERlZmF1bHQoKWAgZXZpdGEgZXNzYSBjb3JyaWRhLlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmhhbmRsZVNlZ21lbnRQb2ludGVyRG93bihldmVudC50YXJnZXQsIGV2ZW50LmNsaWVudFgsIGV2ZW50LnRpbWVTdGFtcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUG9udG8gZGUgZW50cmFkYSDDum5pY28gcHJvIGNsaXF1ZSBubyBpbnB1dCBzZWdtZW50YWRvIOKAlCBjaGFtYWRvIHRhbnRvIHBvclxuICAgICAqIGBoYW5kbGVJbnB1dENsaWNrYCAobW91c2Vkb3duIGRpcmV0byBubyBgPGlucHV0PmAsIG8gcHJpbWVpcm8gY2xpcXVlLCBhbnRlcyBkbyBiYWNrZHJvcFxuICAgICAqIGV4aXN0aXIpIHF1YW50byBwb3IgYGhhbmRsZUJhY2tkcm9wQ2xpY2tgIChjbGlxdWVzIHNlZ3VpbnRlcywgasOhIGNvbSBvIHBhaW5lbCBhYmVydG8gZSBvXG4gICAgICogYmFja2Ryb3AgY29icmluZG8gbyBpbnB1dCkuIFByZWNpc2Egc2VyIMO6bmljbyBwb3JxdWUgb3MgZG9pcyBjbGlxdWVzIGRlIHVtIGR1cGxvIGNsaXF1ZVxuICAgICAqIHJlYWwgY29zdHVtYW0gY2hlZ2FyIHBvciBjYW1pbmhvcyBESUZFUkVOVEVTIOKAlCBvIHByaW1laXJvIHZpYSBtb3VzZWRvd24gbm8gaW5wdXQsIG9cbiAgICAgKiBzZWd1bmRvIHZpYSBiYWNrZHJvcENsaWNrIOKAlCBlbnTDo28gcmFzdHJlYXIgbyB0aW1lc3RhbXAgZG8gXCLDumx0aW1vIGNsaXF1ZVwiIHNlcGFyYWRhbWVudGVcbiAgICAgKiBlbSBjYWRhIGhhbmRsZXIgbnVuY2EgZGV0ZWN0YXJpYSB1bSBkdXBsbyBjbGlxdWUgZGUgdmVyZGFkZS4gTmVtIGBkYmxjbGlja2AgbmVtXG4gICAgICogYGV2ZW50LmRldGFpbGAgc8OjbyBjb25macOhdmVpcyBhcXVpIChkZXBlbmRlbSBkYSBjb250YWdlbS90YXJnZXRpbmcgaW50ZXJuYSBkZSBjbGlxdWVzIGRvXG4gICAgICogYnJvd3NlciwgcXVlIG5vc3NhcyBtYW5pcHVsYcOnw7VlcyBkZSBmb2NvL3NlbGXDp8OjbyBwYXJlY2VtIGF0cmFwYWxoYXIg4oCUIG9ic2VydmFkb1xuICAgICAqIGVtcGlyaWNhbWVudGU6IGBldmVudC5kZXRhaWxgIGZpY2Egc2VtcHJlIDEpLCBkYcOtIGEgZGV0ZWPDp8OjbyBtYW51YWwgcG9yIHRpbWVzdGFtcC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGhhbmRsZVNlZ21lbnRQb2ludGVyRG93bihpbnB1dDogSFRNTElucHV0RWxlbWVudCwgY2xpZW50WDogbnVtYmVyLCB0aW1lU3RhbXA6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBpc0RvdWJsZUNsaWNrID0gdGltZVN0YW1wIC0gdGhpcy5sYXN0TW91c2VEb3duQXQgPCBEYXRlcGlja2VyQ29tcG9uZW50LkRPVUJMRV9DTElDS19USFJFU0hPTERfTVM7XG4gICAgICAgIHRoaXMubGFzdE1vdXNlRG93bkF0ID0gdGltZVN0YW1wO1xuICAgICAgICBpZiAoaXNEb3VibGVDbGljaykge1xuICAgICAgICAgICAgdGhpcy5sYXN0TW91c2VEb3duQXQgPSAwOyAvLyBldml0YSBxdWUgdW0gdGVyY2Vpcm8gY2xpcXVlIGVuY2FkZWllIGVtIG91dHJvIFwiZHVwbG9cIlxuICAgICAgICAgICAgdGhpcy5zZWxlY3RXaG9sZUZpZWxkKGlucHV0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGx5U2VnbWVudENsaWNrKGlucHV0LCBjbGllbnRYKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY2lvbmEgbyBzZWdtZW50byBzb2IgYSBjb29yZGVuYWRhIGBjbGllbnRYYCBkZSB1bSBjbGlxdWUgbm8gaW5wdXQgc2VnbWVudGFkby5cbiAgICAgKiBDb21wYXJ0aWxoYWRvIHBvciBgaGFuZGxlSW5wdXRDbGlja2AgKG1vdXNlZG93biByZWFsIG5vIGA8aW5wdXQ+YCDigJQgdXNhbW9zIGBtb3VzZWRvd25gXG4gICAgICogZW0gdmV6IGRlIGBjbGlja2AgcG9ycXVlIG8gYGZvY3VzYC9gb3Blbk9uRm9jdXNgIGRpc3BhcmFkbyBubyBtZWlvIGRvIGdlc3RvIHBvZGUgbW9udGFyXG4gICAgICogbyBiYWNrZHJvcCBkbyBDREsgT3ZlcmxheSBlbWJhaXhvIGRvIGN1cnNvciBhbnRlcyBkbyBgbW91c2V1cGAsIGZhemVuZG8gbyBicm93c2VyIHJlc29sdmVyXG4gICAgICogbyBgY2xpY2tgIHBybyBhbmNlc3RyYWwgY29tdW0gZW50cmUgbyBhbHZvIGRvIG1vdXNlZG93biBlIG8gZG8gbW91c2V1cCDigJQgbmEgcHLDoXRpY2EsXG4gICAgICogYDxib2R5PmAg4oCUIGVtIHZleiBkbyBgPGlucHV0PmAgb3UgZG8gYmFja2Ryb3ApIGUgYGhhbmRsZUJhY2tkcm9wQ2xpY2tgIChjbGlxdWUgbm8gdHJpZ2dlclxuICAgICAqIGNvbSBvIHBhaW5lbCBqw6EgYWJlcnRvIGVtIHJlZ2ltZSBlc3TDoXZlbCwgaW50ZXJjZXB0YWRvIHBlbG8gYmFja2Ryb3AgZG8gQ0RLIE92ZXJsYXkpLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXBwbHlTZWdtZW50Q2xpY2soaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQsIGNsaWVudFg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgIC8vIENhbGN1bGEgbyBzZWdtZW50byBhIHBhcnRpciBkYSBjb29yZGVuYWRhIGRvIGNsaXF1ZSAoY2xpZW50WCksIG7Do28gZGVcbiAgICAgICAgLy8gYGlucHV0LnNlbGVjdGlvblN0YXJ0YCDigJQgbyBicm93c2VyIGFqdXN0YSBhIHBvc2nDp8OjbyBkbyBjYXJldCBkZSBmb3JtYSBhc3PDrW5jcm9uYVxuICAgICAgICAvLyBhcMOzcyBvIGNsaXF1ZSAob2JzZXJ2YWRvIGVtcGlyaWNhbWVudGUsIGVzcGVjaWFsbWVudGUgbmEgdHJhbnNpw6fDo28gZGUgZm9jbyksIGVudMOjb1xuICAgICAgICAvLyBsZXIgYHNlbGVjdGlvblN0YXJ0YCBuZXNzZSBtb21lbnRvIMOpIHVtYSBmb250ZSBuw6NvIGNvbmZpw6F2ZWwuIGBjbGllbnRYYCDDqSBzw61uY3Jvbm9cbiAgICAgICAgLy8gZSBpbWVkaWF0bywgc2VtIGVzc2EgY29ycmlkYS5cbiAgICAgICAgY29uc3QgY2hhckluZGV4ID0gdGhpcy5jbGlja0NsaWVudFhUb0NoYXJJbmRleChpbnB1dCwgY2xpZW50WCk7XG4gICAgICAgIGNvbnN0IGdlbmVyYXRpb24gPSArK3RoaXMuaW50ZXJhY3Rpb25HZW5lcmF0aW9uO1xuICAgICAgICAvLyBGb2NhIGUgc2VsZWNpb25hIG8gc2VnbWVudG8ganVudG9zLCBlIHJlYXBsaWNhIG9zIGRvaXMgYWxndW1hcyB2ZXplcyBsb2dvIGVtIHNlZ3VpZGEg4oCUXG4gICAgICAgIC8vIG8gYnJvd3Nlci9DREsgT3ZlcmxheSBwb2RlIG1leGVyIG5vIGZvY28gZGUgZm9ybWEgYXNzw61uY3JvbmEgZGVwb2lzIGRvIGNsaXF1ZSAoYmx1clxuICAgICAgICAvLyBuYXRpdm8gZG8gYmFja2Ryb3AsIGNka1RyYXBGb2N1cyBkbyBwYWluZWwsIGV0Yy4pOyBlbSB2ZXogZGUgdGVudGFyIHByZXZlci9ldml0YXIgY2FkYVxuICAgICAgICAvLyBjYXVzYSwgc2ltcGxlc21lbnRlIHZlbmNlbW9zIHJlYWZpcm1hbmRvIGZvY28rc2VsZcOnw6NvIHBvciBjaW1hLlxuICAgICAgICBjb25zdCBmb2N1c0FuZFNlbGVjdCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSB0aGlzLmludGVyYWN0aW9uR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnNlZ21lbnRFbmdpbmUuc2VsZWN0U2VnbWVudEF0KGNoYXJJbmRleCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuc2VsZWN0U2VnbWVudChpbmRleCk7XG4gICAgICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBY3RpdmVTZWdtZW50UmFuZ2UoaW5wdXQpO1xuICAgICAgICAgICAgdGhpcy5hbm5vdW5jZUFjdGl2ZVNlZ21lbnQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9jdXNBbmRTZWxlY3QoKTtcbiAgICAgICAgc2V0VGltZW91dChmb2N1c0FuZFNlbGVjdCwgMCk7XG4gICAgICAgIHNldFRpbWVvdXQoZm9jdXNBbmRTZWxlY3QsIDUwKTtcbiAgICB9XG5cbiAgICAvKiogRHVwbG8gY2xpcXVlIHNlbGVjaW9uYSBvIGlucHV0IGludGVpcm8gKHRvZG9zIG9zIHNlZ21lbnRvcyksIGNvbW8gbnVtIGA8aW5wdXQ+YCBkZSB0ZXh0byBjb211bS4gKi9cbiAgICBwcm90ZWN0ZWQgaGFuZGxlSW5wdXREYmxDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNTZWdtZW50ZWRNb2RlKCkgfHwgIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNlbGVjdFdob2xlRmllbGQoZXZlbnQudGFyZ2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY2lvbmEgdG9kb3Mgb3Mgc2VnbWVudG9zIGRvIGlucHV0ICh1c2FkbyB0YW50byBwZWxvIGR1cGxvIGNsaXF1ZSBkZXRlY3RhZG8gbmEgbcOjbyBlbVxuICAgICAqIGBoYW5kbGVTZWdtZW50UG9pbnRlckRvd25gIHF1YW50byBwb3IgYGhhbmRsZUlucHV0RGJsQ2xpY2tgLCBtYW50aWRvIGNvbW8gY2FtaW5obyBkaXJldG9cbiAgICAgKiBwcmEgcXVlbSBkaXNwYXJhIHVtIGBkYmxjbGlja2AgZGUgdmVyZGFkZSwgZXguOiBhY2Vzc2liaWxpZGFkZS90ZXN0ZXMpLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2VsZWN0V2hvbGVGaWVsZChpbnB1dDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgIC8vIEdhcmFudGUgdW0gc2VnbWVudG8gYXRpdm8gKmFudGVzKiBkZSBmb2Nhcjogc2UgbyBDREsgT3ZlcmxheSB0aXZlciByb3ViYWRvIG8gZm9jbyBkZVxuICAgICAgICAvLyBmb3JtYSBhc3PDrW5jcm9uYSAoYmx1cikgZW50cmUgb3MgY2xpcXVlcyBxdWUgY29tcMO1ZW0gbyBkdXBsbyBjbGlxdWUsIG8gYGlucHV0LmZvY3VzKClgXG4gICAgICAgIC8vIGFiYWl4byBkaXNwYXJhIHVtIGV2ZW50byBgZm9jdXNgIGdlbnXDrW5vLCBlIGhhbmRsZUlucHV0Rm9jdXMgc8OzIGV2aXRhIGFnZW5kYXIgc3VhIHByw7NwcmlhXG4gICAgICAgIC8vIHJlYXBsaWNhw6fDo28gY29uY29ycmVudGUgKHF1ZSBzb2JyZXNjcmV2ZXJpYSBub3NzYSBzZWxlw6fDo28gZG8gY2FtcG8gaW50ZWlybyBtYWlzIHRhcmRlKVxuICAgICAgICAvLyBxdWFuZG8gZW5jb250cmEgYGdldEFjdGl2ZUluZGV4KCkgIT09IG51bGxgIOKAlCBvIG1lc21vIG1vdGl2byBwZWxvIHF1YWwgaGFuZGxlSW5wdXRDbGlja1xuICAgICAgICAvLyBzZW1wcmUgY2hhbWEgYHNlZ21lbnRFbmdpbmUuc2VsZWN0U2VnbWVudChpbmRleClgIGFudGVzIGRlIGBpbnB1dC5mb2N1cygpYC5cbiAgICAgICAgaWYgKHRoaXMuc2VnbWVudEVuZ2luZS5nZXRBY3RpdmVJbmRleCgpID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuc2VsZWN0Rmlyc3RTZWdtZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ2VuZXJhdGlvbiA9ICsrdGhpcy5pbnRlcmFjdGlvbkdlbmVyYXRpb247XG4gICAgICAgIC8vIE1lc21vIHBhZHLDo28gZGVmZW5zaXZvIGRlIGhhbmRsZUlucHV0Q2xpY2s6IG8gY2xpcXVlIHF1ZSBmZWNoYSBvIGR1cGxvIGNsaXF1ZSBqw6Egcm9kb3VcbiAgICAgICAgLy8gaGFuZGxlSW5wdXRDbGljayAoc2VsZWNpb25hbmRvIHPDsyB1bSBzZWdtZW50bykgZSBwb2RlIHRlciBhZ2VuZGFkbyBzdWFzIHByw7Nwcmlhc1xuICAgICAgICAvLyByZWFwbGljYcOnw7VlcyBhZGlhZGFzIOKAlCBhIGdlcmHDp8OjbyByZWPDqW0taW5jcmVtZW50YWRhIGFzIGludmFsaWRhLCBlbnTDo28gc8OzIGEgc2VsZcOnw6NvIGRvXG4gICAgICAgIC8vIGNhbXBvIGludGVpcm8gc29icmV2aXZlLlxuICAgICAgICBjb25zdCBmb2N1c0FuZFNlbGVjdEFsbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSB0aGlzLmludGVyYWN0aW9uR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgICAgICAgICAgaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKDAsIGlucHV0LnZhbHVlLmxlbmd0aCk7XG4gICAgICAgIH07XG4gICAgICAgIGZvY3VzQW5kU2VsZWN0QWxsKCk7XG4gICAgICAgIHNldFRpbWVvdXQoZm9jdXNBbmRTZWxlY3RBbGwsIDApO1xuICAgICAgICBzZXRUaW1lb3V0KGZvY3VzQW5kU2VsZWN0QWxsLCA1MCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUlucHV0Rm9jdXMoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNGb2N1c2VkLnNldCh0cnVlKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkLmVtaXQoZXZlbnQpO1xuICAgICAgICBpZiAodGhpcy5pc1NlZ21lbnRlZE1vZGUoKSAmJiBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IHRoaXMuc2VnbWVudEVuZ2luZS5nZXREaXNwbGF5U3RyaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zZWdtZW50RW5naW5lLmdldEFjdGl2ZUluZGV4KCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBGb2NvIFwiZ2VudcOtbm9cIiAoVGFiIGEgcGFydGlyIGRlIG91dHJvIGNhbXBvLCBvdSBwcmltZWlybyBmb2NvIG5vIGNhbXBvKSDigJRcbiAgICAgICAgICAgICAgICAvLyBuZW5odW0gc2VnbWVudG8gYXRpdm8gYWluZGEsIGVudMOjbyBzZWxlY2lvbmEgbyBwcmltZWlyby5cbiAgICAgICAgICAgICAgICBjb25zdCBnZW5lcmF0aW9uID0gKyt0aGlzLmludGVyYWN0aW9uR2VuZXJhdGlvbjtcbiAgICAgICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuc2VsZWN0Rmlyc3RTZWdtZW50KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBY3RpdmVTZWdtZW50UmFuZ2UoaW5wdXQpO1xuICAgICAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VHZW51aW5lRm9jdXMoKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT09IHRoaXMuaW50ZXJhY3Rpb25HZW5lcmF0aW9uKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0QWN0aXZlSW5kZXgoKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBY3RpdmVTZWdtZW50UmFuZ2UoaW5wdXQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIErDoSBleGlzdGUgdW0gc2VnbWVudG8gYXRpdm8g4oCUIHBvciBleGVtcGxvLCBoYW5kbGVJbnB1dENsaWNrIGFjYWJvdSBkZVxuICAgICAgICAgICAgICAgIC8vIGRlZmluaS1sbyBlIGVzdMOhIHJlZm9jYW5kbyBvIGlucHV0IHByb2dyYW1hdGljYW1lbnRlIGFww7NzIHVtIGJsdXIgZXNww7pyaW8uXG4gICAgICAgICAgICAgICAgLy8gTsOjbyByZWluaWNpYSBwYXJhIG8gcHJpbWVpcm8gc2VnbWVudG87IHPDsyBnYXJhbnRlIHF1ZSBhIHNlbGXDp8OjbyB2aXN1YWwgYmF0YVxuICAgICAgICAgICAgICAgIC8vIGNvbSBvIGVzdGFkbyBhdHVhbCwgZSBhbnVuY2lhIHPDsyBvIHNlZ21lbnRvIChvIHJlc3VtbyBkbyB2YWxvciBpbnRlaXJvIMOpXG4gICAgICAgICAgICAgICAgLy8gcmVzZXJ2YWRvIGFvIHByaW1laXJvIGZvY28gZ2VudcOtbm8pLlxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWN0aXZlU2VnbWVudFJhbmdlKGlucHV0KTtcbiAgICAgICAgICAgICAgICB0aGlzLmFubm91bmNlQWN0aXZlU2VnbWVudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNob3dPbkZvY3VzKCkgJiYgIXRoaXMuaXNSZXN0b3JpbmdGb2N1c09uQ2xvc2UpIHtcbiAgICAgICAgICAgIHRoaXMub3Blbk9uRm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBNYXBlaWEgYSBjb29yZGVuYWRhIFggKHZpZXdwb3J0KSBkZSB1bSBjbGlxdWUgcGFyYSBvIMOtbmRpY2UgZGUgY2FyYWN0ZXJlIG1haXMgcHLDs3hpbW8gbm8gdmFsb3IgZXhpYmlkby4gKi9cbiAgICBwcml2YXRlIGNsaWNrQ2xpZW50WFRvQ2hhckluZGV4KGlucHV0OiBIVE1MSW5wdXRFbGVtZW50LCBjbGllbnRYOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoaW5wdXQpO1xuICAgICAgICBjb25zdCBjYW52YXMgPSAodGhpcy5tZWFzdXJlQ2FudmFzID8/PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKSk7XG4gICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBpZiAoIWN0eCkgcmV0dXJuIDA7XG4gICAgICAgIGN0eC5mb250ID0gYCR7c3R5bGUuZm9udFN0eWxlfSAke3N0eWxlLmZvbnRXZWlnaHR9ICR7c3R5bGUuZm9udFNpemV9ICR7c3R5bGUuZm9udEZhbWlseX1gO1xuICAgICAgICBjb25zdCByZWN0ID0gaW5wdXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdMZWZ0ID0gcGFyc2VGbG9hdChzdHlsZS5wYWRkaW5nTGVmdCkgfHwgMDtcbiAgICAgICAgY29uc3QgbG9jYWxYID0gY2xpZW50WCAtIHJlY3QubGVmdCAtIHBhZGRpbmdMZWZ0ICsgaW5wdXQuc2Nyb2xsTGVmdDtcbiAgICAgICAgY29uc3QgdGV4dCA9IGlucHV0LnZhbHVlO1xuICAgICAgICBsZXQgYmVzdEluZGV4ID0gMDtcbiAgICAgICAgbGV0IGJlc3REaXN0YW5jZSA9IEluZmluaXR5O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguYWJzKGN0eC5tZWFzdXJlVGV4dCh0ZXh0LnNsaWNlKDAsIGkpKS53aWR0aCAtIGxvY2FsWCk7XG4gICAgICAgICAgICBpZiAoZGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgICAgICBiZXN0SW5kZXggPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZXN0SW5kZXg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZU5hdGl2ZUlucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlSW5wdXQuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUlucHV0Qmx1cihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc0ZvY3VzZWQuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5ibHVycmVkLmVtaXQoZXZlbnQpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBjb25zdCB3YXNTZWdtZW50ZWQgPSB0aGlzLmlzU2VnbWVudGVkTW9kZSgpO1xuICAgICAgICBpZiAod2FzU2VnbWVudGVkKSB7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5saXZlQW5ub3VuY2VyLmNsZWFyKCk7XG4gICAgICAgICAgICB0aGlzLmNvbW1pdFNlZ21lbnRlZFZhbHVlSWZDb21wbGV0ZSgpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLnNlZ21lbnRFbmdpbmUuaXNFbXB0eSgpID8gJycgOiB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0RGlzcGxheVN0cmluZygpO1xuICAgICAgICAgICAgaW5wdXQudmFsdWUgPSB0aGlzLmlucHV0RGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlucHV0LnZhbHVlPy50cmltKCkpIHtcbiAgICAgICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IChldmVudCBhcyBGb2N1c0V2ZW50KS5yZWxhdGVkVGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5wb3B1cFBhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAvLyBFbSBtb2RvIHNlZ21lbnRhZG8sIHVtIGJsdXIgc2VtIGByZWxhdGVkVGFyZ2V0YCBub3JtYWxtZW50ZSBuw6NvIMOpIHVtYSBzYcOtZGEgcmVhbFxuICAgICAgICAgICAgLy8gZGUgZm9jbyDigJQgw6kgbyBiYWNrZHJvcCB0cmFuc3BhcmVudGUgZG8gcHLDs3ByaW8gcG9wdXAgKG7Do28gZm9jw6F2ZWwpIGludGVyY2VwdGFuZG9cbiAgICAgICAgICAgIC8vIHVtIGNsaXF1ZSBubyB0cmlnZ2VyIHBhcmEgdHJvY2FyIGRlIHNlZ21lbnRvLiBOw6NvIHJlZGlyZWNpb25hIG8gZm9jbyBwcm8gcGFpbmVsXG4gICAgICAgICAgICAvLyBuZXNzZSBjYXNvOyBkZWl4YSBoYW5kbGVJbnB1dENsaWNrL2hhbmRsZUlucHV0Rm9jdXMgcmVzb2x2ZXJlbSAoZWxlcyByZWZvY2FtIG9cbiAgICAgICAgICAgIC8vIGlucHV0IGUgcmVhcGxpY2FtIG8gc2VnbWVudG8gY29ycmV0byBsb2dvIGVtIHNlZ3VpZGEpLlxuICAgICAgICAgICAgY29uc3QgbG9va3NMaWtlT3duVHJpZ2dlckNsaWNrID0gd2FzU2VnbWVudGVkICYmICFyZWxhdGVkVGFyZ2V0O1xuICAgICAgICAgICAgaWYgKCFsb29rc0xpa2VPd25UcmlnZ2VyQ2xpY2sgJiYgKCFyZWxhdGVkVGFyZ2V0IHx8ICFwYW5lbD8uY29udGFpbnMocmVsYXRlZFRhcmdldCkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAndGltZScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmNyZWFzZUhvdXJCdXR0b24oKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYW5lbD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1tkYXRhLWZvY3VzPVwic2VsZWN0ZWRcIl0nKSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWw/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdbZGF0YS1mb2N1cz1cInRvZGF5XCJdJykgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsPy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignYnV0dG9uOm5vdChbZGlzYWJsZWRdKScpO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ/LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUlucHV0Q2hhbmdlKHJhdzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzU2VnbWVudE1vZGVDYW5kaWRhdGUoKSkgcmV0dXJuO1xuICAgICAgICBpZiAoIXJhdz8udHJpbSgpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VWYWx1ZS5zZXQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLl9oYXNGb3JtYXRFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UobnVsbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnB1dCh0aGlzLm1vZGUoKSwgcmF3LCB0aGlzLnJhbmdlU2VwYXJhdG9yKCkpO1xuICAgICAgICBpZiAocGFyc2VkID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9oYXNGb3JtYXRFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faGFzRm9ybWF0RXJyb3IgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICBpZiAodGhpcy5pc0RhdGVSYW5nZShwYXJzZWQpKSB7XG4gICAgICAgICAgICB0aGlzLnJhbmdlVmFsdWUuc2V0KHBhcnNlZCk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShwYXJzZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZCA9IHBhcnNlZCBhcyBEYXRlO1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQoZCk7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgdGhpcy5ob3Vycy5zZXQoZC5nZXRIb3VycygpKTtcbiAgICAgICAgICAgIHRoaXMubWludXRlcy5zZXQoZC5nZXRNaW51dGVzKCkpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlVHJpZ2dlcktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTZWdtZW50ZWRNb2RlKCkgJiYgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVTZWdtZW50ZWRLZXlkb3duKGV2ZW50LCBldmVudC50YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQua2V5ID09PSAnICcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBUZWNsYXMgcXVlIGRldmVtIHBhc3NhciBkaXJldG8gcGFyYSBvIGJyb3dzZXIgc2VtIGluc2VyaXIvYWx0ZXJhciBuYWRhIG5vIGNhbXBvLiAqL1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNFR01FTlRFRF9QQVNTVEhST1VHSF9LRVlTID0gWydIb21lJywgJ0VuZCcsICdTaGlmdCcsICdDYXBzTG9jaycsICdFc2NhcGUnLCAnRW50ZXInLCAnICddO1xuXG4gICAgLyoqIERpZ2l0YcOnw6NvIHBvciBzZWdtZW50byAoZGlhL23DqnMvYW5vL2hvcmEvbWludXRvL3NlZ3VuZG8vYW1wbSkgbm8gaW5wdXQgZG8gdHJpZ2dlci4gKi9cbiAgICBwcml2YXRlIGhhbmRsZVNlZ21lbnRlZEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGlucHV0OiBIVE1MSW5wdXRFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW5zdXJlU2VnbWVudEVuZ2luZUNvbmZpZ3VyZWQoKTtcbiAgICAgICAgY29uc3QgeyBrZXksIGN0cmxLZXksIG1ldGFLZXksIGFsdEtleSwgc2hpZnRLZXkgfSA9IGV2ZW50O1xuICAgICAgICBpZiAoY3RybEtleSB8fCBtZXRhS2V5IHx8IGFsdEtleSB8fCBrZXkuc3RhcnRzV2l0aCgnRicpKSByZXR1cm47XG4gICAgICAgIGlmIChEYXRlcGlja2VyQ29tcG9uZW50LlNFR01FTlRFRF9QQVNTVEhST1VHSF9LRVlTLmluY2x1ZGVzKGtleSkpIHJldHVybjtcbiAgICAgICAgdGhpcy5pbnRlcmFjdGlvbkdlbmVyYXRpb24rKztcblxuICAgICAgICBpZiAoa2V5ID09PSAnVGFiJykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZWdtZW50RW5naW5lLm1vdmVUb0FkamFjZW50U2VnbWVudChzaGlmdEtleSA/IC0xIDogMSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNTZWdtZW50ZWRJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSAnbW92ZWQnKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXkgPT09ICdBcnJvd0xlZnQnIHx8IGtleSA9PT0gJ0Fycm93UmlnaHQnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgLy8gQW8gY29udHLDoXJpbyBkbyBUYWIsIHNldGEgbm8gcHJpbWVpcm8vw7psdGltbyBzZWdtZW50byBuw6NvIGRldmUgc2FpciBkbyBjYW1wbyBuZW1cbiAgICAgICAgICAgIC8vIGRlc2F0aXZhciBhIHNlbGXDp8OjbyDigJQgYG1vdmVUb0FkamFjZW50U2VnbWVudGAgemVyYSBgYWN0aXZlSW5kZXhgIGFvIGJhdGVyIG5vIGxpbWl0ZVxuICAgICAgICAgICAgLy8gKGNvbXBvcnRhbWVudG8gY2VydG8gcHJvIFRhYiBlc2NhcGFyIGRvIGNhbXBvKSwgZW50w6NvIG5hIGJvcmRhIGEgZ2VudGUgcmVzZWxlY2lvbmFcbiAgICAgICAgICAgIC8vIG8gc2VnbWVudG8gcXVlIGrDoSBlc3RhdmEgYXRpdm8sIGltaXRhbmRvIG8gYDxpbnB1dCB0eXBlPVwiZGF0ZVwiPmAgbmF0aXZvIChhIHNldGEgc29tZVxuICAgICAgICAgICAgLy8gbm8gbGltaXRlLCBuw6NvIG5hdmVnYSBwcmEgZm9yYSkuXG4gICAgICAgICAgICBjb25zdCBiZWZvcmUgPSB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0QWN0aXZlSW5kZXgoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VnbWVudEVuZ2luZS5tb3ZlVG9BZGphY2VudFNlZ21lbnQoa2V5ID09PSAnQXJyb3dMZWZ0JyA/IC0xIDogMSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSAnYm91bmRhcnknICYmIGJlZm9yZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5zZWxlY3RTZWdtZW50KGJlZm9yZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN5bmNTZWdtZW50ZWRJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5ID09PSAnQXJyb3dVcCcgfHwga2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5pbmNyZW1lbnRBY3RpdmVTZWdtZW50KGtleSA9PT0gJ0Fycm93VXAnID8gMSA6IC0xKTtcbiAgICAgICAgICAgIHRoaXMuc3luY1NlZ21lbnRlZElucHV0KGlucHV0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXkgPT09ICdCYWNrc3BhY2UnIHx8IGtleSA9PT0gJ0RlbGV0ZScpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBjb25zdCBpc1dob2xlRmllbGRTZWxlY3RlZCA9IGlucHV0LnNlbGVjdGlvblN0YXJ0ID09PSAwICYmIGlucHV0LnNlbGVjdGlvbkVuZCA9PT0gaW5wdXQudmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGlzV2hvbGVGaWVsZFNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLmNsZWFyQWxsKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5jbGVhckFjdGl2ZVNlZ21lbnQoa2V5ID09PSAnQmFja3NwYWNlJyA/ICdiYWNrc3BhY2UnIDogJ2RlbGV0ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zeW5jU2VnbWVudGVkSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKC9eWzAtOV0kLy50ZXN0KGtleSkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUudHlwZURpZ2l0KGtleSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNTZWdtZW50ZWRJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZWdtZW50RW5naW5lLmFjdGl2ZUtpbmQoKSA9PT0gJ2FtcG0nICYmIC9eW2FwQVBdJC8udGVzdChrZXkpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLnNldEFtUG0oa2V5LnRvTG93ZXJDYXNlKCkgPT09ICdhJyA/IDAgOiAxKTtcbiAgICAgICAgICAgIHRoaXMuc3luY1NlZ21lbnRlZElucHV0KGlucHV0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFF1YWxxdWVyIG91dHJhIHRlY2xhIGltcHJpbcOtdmVsIChsZXRyYXMsIHPDrW1ib2xvcykgbsOjbyDDqSBpbnNlcmlkYSBubyBjYW1wby5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICAvKiogU2luY3Jvbml6YSBvIERPTSBjb20gbyBlc3RhZG8gYXR1YWwgZGEgZW5naW5lICh2YWxvciArIHNlbGXDp8OjbyBkbyBzZWdtZW50byBhdGl2bykgYXDDs3MgdW1hIG11dGHDp8Ojby4gKi9cbiAgICBwcml2YXRlIHN5bmNTZWdtZW50ZWRJbnB1dChpbnB1dDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuc2VnbWVudEVuZ2luZS5nZXREaXNwbGF5U3RyaW5nKCk7XG4gICAgICAgIGlucHV0LnZhbHVlID0gdGhpcy5pbnB1dERhdGU7XG4gICAgICAgIHRoaXMuc2VsZWN0QWN0aXZlU2VnbWVudFJhbmdlKGlucHV0KTtcbiAgICAgICAgdGhpcy5hbm5vdW5jZUFjdGl2ZVNlZ21lbnQoKTtcbiAgICAgICAgaW5wdXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICAgICAgdGhpcy5jb21taXRTZWdtZW50ZWRWYWx1ZUlmQ29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdEFjdGl2ZVNlZ21lbnRSYW5nZShpbnB1dDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VnbWVudEVuZ2luZS5nZXRBY3RpdmVJbmRleCgpO1xuICAgICAgICBpZiAoaW5kZXggPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gdGhpcy5zZWdtZW50RW5naW5lLmdldFNlZ21lbnRSYW5nZShpbmRleCk7XG4gICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8qKiBcIntyw7N0dWxvIGRvIHNlZ21lbnRvfSwge3ZhbG9yfVwiIChleC46IFwiRGlhLCAwM1wiKSDigJQgdGV4dG8gZG8gYW7Dum5jaW8gZGUgbsOtdmVsIGRlIHNlZ21lbnRvLiAqL1xuICAgIHByaXZhdGUgYnVpbGRTZWdtZW50QW5ub3VuY2VtZW50VGV4dCgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBraW5kID0gdGhpcy5zZWdtZW50RW5naW5lLmFjdGl2ZUtpbmQoKTtcbiAgICAgICAgaWYgKGtpbmQgPT09IG51bGwpIHJldHVybiAnJztcbiAgICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChEYXRlcGlja2VyQ29tcG9uZW50LlNFR01FTlRfTEFCRUxfS0VZU1traW5kXSk7XG4gICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0QWN0aXZlU2VnbWVudFRleHQoKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0ZXh0IHx8IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWdtZW50X2VtcHR5Jyk7XG4gICAgICAgIHJldHVybiBgJHtsYWJlbH0sICR7dmFsdWV9YDtcbiAgICB9XG5cbiAgICAvKiogQW51bmNpYSB2aWEgTGl2ZUFubm91bmNlciBvIHNlZ21lbnRvIGF0aXZvIOKAlCBjaGFtYWRvIGVtIHRvZG8gcG9udG8gcXVlIG11ZGEgbyBzZWdtZW50byBhdGl2by9zZXVcbiAgICAgKiAgdmFsb3IgREVQT0lTIGRvIHByaW1laXJvIGZvY28gZ2VudcOtbm8gKHF1ZSBqw6EgcmVjZWJlIGVzc2UgbWVzbW8gdGV4dG8gZW1idXRpZG8gZW0gYGFubm91bmNlR2VudWluZUZvY3VzYCkuICovXG4gICAgcHJpdmF0ZSBhbm5vdW5jZUFjdGl2ZVNlZ21lbnQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmJ1aWxkU2VnbWVudEFubm91bmNlbWVudFRleHQoKTtcbiAgICAgICAgaWYgKHRleHQpIHZvaWQgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKHRleHQsICdwb2xpdGUnKTtcbiAgICB9XG5cbiAgICAvKiogUmVzdW1vIGh1bWFuaXphZG8gZG8gdmFsb3IgaW50ZWlybyAoZXguOiBcIjEwIGRlIG91dHVicm8gZGUgMjAyMFwiLCBvdSBhIGZyYXNlIGdlbsOpcmljYSBkZSBjYW1wb1xuICAgICAqICB2YXppbykg4oCUIGNvbXBsZW1lbnRhIG8gYDxpbnB1dD5gIHNlZ21lbnRhZG8sIHF1ZSBvIGxlaXRvciBkZSB0ZWxhIGzDqiBkZSBmb3JtYSBsaXRlcmFsL3BvdWNvXG4gICAgICogIG5hdHVyYWwgKGVzcXVlbGV0byBkZSBzdWJsaW5oYWRvcyBxdWFuZG8gdmF6aW8sIGTDrWdpdG9zIHNlcGFyYWRvcyBwb3IgYmFycmEgcXVhbmRvIGNvbXBsZXRvKS5cbiAgICAgKiAgRm9ybWF0YcOnw6NvIHB1cmEgdmlhIGBJbnRsYCwgc2VtIGNoYXZlcyBkZSB0cmFkdcOnw6NvIG5vdmFzIChleGNldG8gYSBmcmFzZSBkZSBjYW1wbyB2YXppbykuXG4gICAgICogIEVzcGVsaGEgYGZvcm1hdERheUFyaWFMYWJlbGAgcHJvIG1vZG8gYGRhdGVgLiAqL1xuICAgIHByaXZhdGUgZGVzY3JpYmVXaG9sZVZhbHVlKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLnNlZ21lbnRFbmdpbmUuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX25vX3ZhbHVlX3NlbGVjdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgaWYgKCFkYXRlKSByZXR1cm4gJyc7IC8vIHZhbG9yIHBhcmNpYWxtZW50ZSBkaWdpdGFkbyAoaW5jb21wbGV0bykg4oCUIG5hZGEgaHVtYW5pesOhdmVsIGFpbmRhLlxuICAgICAgICBjb25zdCBsYW5nID0gdGhpcy5jdXJyZW50TGFuZygpO1xuICAgICAgICBzd2l0Y2ggKHRoaXMubW9kZSgpKSB7XG4gICAgICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXREYXlBcmlhTGFiZWwoZGF0ZSk7XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKGxhbmcsIHsgbW9udGg6ICdsb25nJywgeWVhcjogJ251bWVyaWMnIH0pO1xuICAgICAgICAgICAgY2FzZSAndGltZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVUaW1lU3RyaW5nKGxhbmcsIHtcbiAgICAgICAgICAgICAgICAgICAgaG91cjogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgICAgICAgICAgc2Vjb25kOiB0aGlzLnNob3dTZWNvbmRzKCkgPyAnMi1kaWdpdCcgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGhvdXIxMjogdGhpcy5yZXNvbHZlZEhvdXJGb3JtYXQoKSA9PT0gJzEyJyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNhc2UgJ2RhdGV0aW1lJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZyhsYW5nLCB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGVTdHlsZTogJ2xvbmcnLFxuICAgICAgICAgICAgICAgICAgICB0aW1lU3R5bGU6IHRoaXMuc2hvd1NlY29uZHMoKSA/ICdtZWRpdW0nIDogJ3Nob3J0JyxcbiAgICAgICAgICAgICAgICAgICAgaG91cjEyOiB0aGlzLnJlc29sdmVkSG91ckZvcm1hdCgpID09PSAnMTInLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJyc7IC8vIGlzU2VnbWVudGVkTW9kZSgpIGrDoSByZXN0cmluZ2UgYSBkYXRlL21vbnRoL3RpbWUvZGF0ZXRpbWVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBbsO6bmNpbyBjb21iaW5hZG8gbm8gcHJpbWVpcm8gZm9jbyBnZW51w61ubyBkbyBjYW1wbzogcmVzdW1vIGRvIHZhbG9yIGludGVpcm8gKyBzZWdtZW50byBhdGl2byxcbiAgICAgKiAgbnVtYSDDmk5JQ0EgY2hhbWFkYSBhIGBhbm5vdW5jZWAgKGV2aXRhIGR1YXMgcmVnacO1ZXMgY29uY29ycmVudGVzL3VtYSBjb3J0YW5kbyBhIG91dHJhKS4gKi9cbiAgICBwcml2YXRlIGFubm91bmNlR2VudWluZUZvY3VzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdW1tYXJ5ID0gdGhpcy5kZXNjcmliZVdob2xlVmFsdWUoKTtcbiAgICAgICAgY29uc3Qgc2VnbWVudFRleHQgPSB0aGlzLmJ1aWxkU2VnbWVudEFubm91bmNlbWVudFRleHQoKTtcbiAgICAgICAgY29uc3QgY29tYmluZWQgPSBzdW1tYXJ5ID8gYCR7c3VtbWFyeX0uICR7c2VnbWVudFRleHR9YCA6IHNlZ21lbnRUZXh0O1xuICAgICAgICBpZiAoY29tYmluZWQpIHZvaWQgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKGNvbWJpbmVkLCAncG9saXRlJyk7XG4gICAgfVxuXG4gICAgLyoqIFByb3BhZ2EgbyB2YWxvciBkYSBlbmdpbmUgcGFyYSBvIG1vZGVsbyAoQ1ZBKSBhc3NpbSBxdWUgdG9kb3Mgb3Mgc2VnbWVudG9zIGVzdGl2ZXJlbSBjb21wbGV0b3MuICovXG4gICAgcHJpdmF0ZSBjb21taXRTZWdtZW50ZWRWYWx1ZUlmQ29tcGxldGUoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5zZWdtZW50RW5naW5lLmlzQ29tcGxldGUoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUoKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KG51bGwpO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJhc2UgPVxuICAgICAgICAgICAgdGhpcy52YWx1ZSgpID8/XG4gICAgICAgICAgICBuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICAgICAgbmV3IERhdGUoKS5nZXRNb250aCgpLFxuICAgICAgICAgICAgICAgIG5ldyBEYXRlKCkuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgICAgIHRoaXMuaG91cnMoKSxcbiAgICAgICAgICAgICAgICB0aGlzLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dTZWNvbmRzKCkgPyB0aGlzLnNlY29uZHMoKSA6IDAsXG4gICAgICAgICAgICApO1xuICAgICAgICBjb25zdCBkYXRlID0gdGhpcy5zZWdtZW50RW5naW5lLnRvRGF0ZShiYXNlKTtcbiAgICAgICAgaWYgKCFkYXRlKSByZXR1cm47XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KGRhdGUpO1xuICAgICAgICBpZiAodGhpcy5zaG93Q2FsZW5kYXIoKSkge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zaG93VGltZVBpY2tlcigpKSB7XG4gICAgICAgICAgICB0aGlzLmhvdXJzLnNldChkYXRlLmdldEhvdXJzKCkpO1xuICAgICAgICAgICAgdGhpcy5taW51dGVzLnNldChkYXRlLmdldE1pbnV0ZXMoKSk7XG4gICAgICAgICAgICB0aGlzLnNlY29uZHMuc2V0KGRhdGUuZ2V0U2Vjb25kcygpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vbkNoYW5nZShkYXRlKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgTmF2aWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCBuYXZpZ2F0ZVByZXYoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ3llYXJzJykge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpIC0gMTAsIHZpZXcuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgdGhpcy55ZWFyQ2hhbmdlLmVtaXQoeyBtb250aDogdmlldy5nZXRNb250aCgpLCB5ZWFyOiB2aWV3LmdldEZ1bGxZZWFyKCkgLSAxMCB9KTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VEZWNhZGVDaGFuZ2UoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh2aWV3LmdldEZ1bGxZZWFyKCkgLSAxLCB2aWV3LmdldE1vbnRoKCksIDEpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnllYXJDaGFuZ2UuZW1pdCh7IG1vbnRoOiB2aWV3LmdldE1vbnRoKCksIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSB9KTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VZZWFyQ2hhbmdlKG5ld0RhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHZpZXcuZ2V0RnVsbFllYXIoKSwgdmlldy5nZXRNb250aCgpIC0gMSwgMSk7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7IG1vbnRoOiBuZXdEYXRlLmdldE1vbnRoKCksIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSB9KTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VNb250aENoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBuYXZpZ2F0ZU5leHQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ3llYXJzJykge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpICsgMTAsIHZpZXcuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgdGhpcy55ZWFyQ2hhbmdlLmVtaXQoeyBtb250aDogdmlldy5nZXRNb250aCgpLCB5ZWFyOiB2aWV3LmdldEZ1bGxZZWFyKCkgKyAxMCB9KTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VEZWNhZGVDaGFuZ2UoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh2aWV3LmdldEZ1bGxZZWFyKCkgKyAxLCB2aWV3LmdldE1vbnRoKCksIDEpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnllYXJDaGFuZ2UuZW1pdCh7IG1vbnRoOiB2aWV3LmdldE1vbnRoKCksIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSB9KTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VZZWFyQ2hhbmdlKG5ld0RhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHZpZXcuZ2V0RnVsbFllYXIoKSwgdmlldy5nZXRNb250aCgpICsgMSwgMSk7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7IG1vbnRoOiBuZXdEYXRlLmdldE1vbnRoKCksIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSB9KTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VNb250aENoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBbnVuY2lhIHPDsyBcInttw6pzfSBkZSB7YW5vfVwiIChleC46IFwib3V0dWJybyBkZSAyMDI2XCIpIGFvIGNydXphciBmcm9udGVpcmEgZGUgbcOqcyBuYSBncmFkZSBkZSBkaWFzLlxuICAgICAqICBPIG5vdm8gZm9jbyAoYnV0dG9uW3JvbGU9XCJncmlkY2VsbFwiXSkgasOhIGNhcnJlZ2EgZXNzYSBpbmZvIGRlbnRybyBkbyBhcmlhLWxhYmVsIGxvbmdvIGRlXG4gICAgICogIGBmb3JtYXREYXlBcmlhTGFiZWxgLCBtYXMgbyBub21lIGRvIG3DqnMgZmljYSBcImVudGVycmFkb1wiIG5vIG1laW8gZGEgZnJhc2UgZSBwYXNzYSBkZXNwZXJjZWJpZG9cbiAgICAgKiAgKGNvbmZpcm1hZG8gY29tIHRlc3RlIG1hbnVhbCB2aWEgT3JjYSkuIFNlbSBwcmVmaXhvIHRpcG8gXCJhZ29yYSBleGliaW5kb1wiLCBtZXNtYSBjb252ZW7Dp8Ojb1xuICAgICAqICBhZG90YWRhIHBvciBvdXRyb3MgY2FsZW5kw6FyaW9zIGFjZXNzw612ZWlzIChleC46IHJlYWN0LWFyaWEpLiAqL1xuICAgIHByaXZhdGUgYW5ub3VuY2VNb250aENoYW5nZShuZXdEYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgICAgIHZvaWQgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKFxuICAgICAgICAgICAgbmV3RGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5jdXJyZW50TGFuZygpLCB7IG1vbnRoOiAnbG9uZycsIHllYXI6ICdudW1lcmljJyB9KSxcbiAgICAgICAgICAgICdwb2xpdGUnLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKiBBbnVuY2lhIG8gYW5vIGF0dWFsbWVudGUgZXhpYmlkbyBhbyBwYWdpbmFyIGEgdmlldyAnbW9udGhzJyAoZXguOiBcIjIwMjVcIikuIE8gYDxzcGFuPmAgY2VudHJhbFxuICAgICAqICBxdWUgbW9zdHJhIGVzc2UgYW5vIG5vIGNhYmXDp2FsaG8gbsOjbyDDqSBmb2PDoXZlbCwgZSBvIGFyaWEtbGFiZWwgZG9zIGJvdMO1ZXMgZGUgbmF2ZWdhw6fDo28gc8OzXG4gICAgICogIGZhbGEgbyBhbm8gZGUgREVTVElOTyAoXCJBbm8gYW50ZXJpb3IsIDIwMjVcIikg4oCUIHNlbSBpc3NvLCBvIGxlaXRvciBkZSB0ZWxhIG51bmNhIGNvbmZpcm1hIG9cbiAgICAgKiAgYW5vIHF1ZSBwYXNzb3UgYSBlc3RhciBlbSBleGliacOnw6NvLCBzw7Mgb3MgYWx2b3MgXCJhbnRlcmlvclwiL1wicHLDs3hpbW9cIi4gKi9cbiAgICBwcml2YXRlIGFubm91bmNlWWVhckNoYW5nZShuZXdEYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgICAgIHZvaWQgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKFxuICAgICAgICAgICAgbmV3RGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5jdXJyZW50TGFuZygpLCB7IHllYXI6ICdudW1lcmljJyB9KSxcbiAgICAgICAgICAgICdwb2xpdGUnLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKiBNZXNtYSBtb3RpdmHDp8OjbyBkZSBgYW5ub3VuY2VZZWFyQ2hhbmdlYCwgcGFyYSBhIHZpZXcgJ3llYXJzJyAocGFnaW5hw6fDo28gZGUgZMOpY2FkYSkg4oCUIGFudW5jaWFcbiAgICAgKiAgbyBpbnRlcnZhbG8gYXR1YWxtZW50ZSBleGliaWRvIChleC46IFwiMjAyMCDigJMgMjAzMVwiKSwgZXNwZWxoYW5kbyBvIHRleHRvIGRvIGA8c3Bhbj5gIGNlbnRyYWwuICovXG4gICAgcHJpdmF0ZSBhbm5vdW5jZURlY2FkZUNoYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgdm9pZCB0aGlzLmxpdmVBbm5vdW5jZXIuYW5ub3VuY2UoYCR7dGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKX0g4oCTICR7dGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKSArIDExfWAsICdwb2xpdGUnKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlQ2FsZW5kYXJHcmlkS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJyAmJiB0aGlzLm1vZGUoKSA9PT0gJ3JhbmdlJyAmJiB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0KCkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAvLyBDYW5jZWxhbWVudG8gbGV2ZTogZGVzaXN0ZSBzw7MgZGEgZGF0YSBpbmljaWFsIHBlbmRlbnRlLCBtYW50ZW5kbyBvIHBhaW5lbCBhYmVydG8sXG4gICAgICAgICAgICAvLyBlbSB2ZXogZGUgZmVjaGFyIG8gZGnDoWxvZ28gaW50ZWlybyAobyDDum5pY28gY2FtaW5obyBhbnRlcyBkaXNzbykuIGBzdG9wUHJvcGFnYXRpb25gXG4gICAgICAgICAgICAvLyBpbXBlZGUgZXNzZSBtZXNtbyBFc2NhcGUgZGUgYm9yYnVsaGFyIGF0w6kgYGRvY3VtZW50LmJvZHlgLCBvbmRlIG9cbiAgICAgICAgICAgIC8vIGBPdmVybGF5S2V5Ym9hcmREaXNwYXRjaGVyYCBkbyBDREsgZXNjdXRhIGBrZXlkb3duYCAoZmFzZSBkZSBidWJibGUsIHNlbSBjYXB0dXJlKSBlXG4gICAgICAgICAgICAvLyBkaXNwYXJhcmlhIGBoYW5kbGVPdmVybGF5S2V5ZG93bmAvYGNsb3NlUGFuZWwoKWAg4oCUIHNlbSBpc3NvLCBvIGNhbmNlbGFtZW50byBsZXZlIGUgb1xuICAgICAgICAgICAgLy8gZmVjaGFtZW50byB0b3RhbCBhY29udGVjZXJpYW0gbmVzc2UgbWVzbW8gRXNjYXBlLiBTZW0gYHBlbmRpbmdSYW5nZVN0YXJ0YCwgZXNzZSBgaWZgXG4gICAgICAgICAgICAvLyDDqSBmYWxzbyBlIG8gRXNjYXBlIHNlZ3VlIGludG9jYWRvIGF0w6kgYGRvY3VtZW50LmJvZHlgLCBmZWNoYW5kbyBvIHBhaW5lbCBjb21vIHNlbXByZS5cbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxQZW5kaW5nUmFuZ2VTdGFydCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgQVJST1dTID0gWydBcnJvd0xlZnQnLCAnQXJyb3dSaWdodCcsICdBcnJvd1VwJywgJ0Fycm93RG93biddO1xuICAgICAgICBpZiAoIUFSUk9XUy5pbmNsdWRlcyhldmVudC5rZXkpKSByZXR1cm47XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCBncmlkID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgYnV0dG9ucyA9IEFycmF5LmZyb20oZ3JpZC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PignYnV0dG9uW3JvbGU9XCJncmlkY2VsbFwiXScpKTtcbiAgICAgICAgY29uc3QgY3VycmVudElkeCA9IGJ1dHRvbnMuaW5kZXhPZihldmVudC50YXJnZXQgYXMgSFRNTEJ1dHRvbkVsZW1lbnQpO1xuICAgICAgICBpZiAoY3VycmVudElkeCA9PT0gLTEpIHJldHVybjtcblxuICAgICAgICBsZXQgZGVsdGEgPSAwO1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcpIGRlbHRhID0gMTtcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0JykgZGVsdGEgPSAtMTtcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykgZGVsdGEgPSBEYXRlcGlja2VyQ29tcG9uZW50LkRBWVNfSU5fV0VFSztcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIGRlbHRhID0gLURhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLO1xuXG4gICAgICAgIGNvbnN0IG5leHRJZHggPSBjdXJyZW50SWR4ICsgZGVsdGE7XG5cbiAgICAgICAgaWYgKG5leHRJZHggPCAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2RGlzYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVByZXYoKTtcbiAgICAgICAgICAgIGFmdGVyTmV4dFJlbmRlcihcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5wb3B1cFBhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ0bnMgPSBBcnJheS5mcm9tKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWw/LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEJ1dHRvbkVsZW1lbnQ+KCdidXR0b25bcm9sZT1cImdyaWRjZWxsXCJdJykgPz8gW10sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldElkeCA9IE1hdGgubWF4KDAsIGJ0bnMubGVuZ3RoICsgbmV4dElkeCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmZpbmRFbmFibGVkKGJ0bnMsIHRhcmdldElkeCwgLTEpID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmZpbmRFbmFibGVkKGJ0bnMsIHRhcmdldElkeCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD8uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dElkeCA+PSBidXR0b25zLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubmV4dERpc2FibGVkKCkpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGVOZXh0KCk7XG4gICAgICAgICAgICBhZnRlck5leHRSZW5kZXIoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMucG9wdXBQYW5lbCgpPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBidG5zID0gQXJyYXkuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsPy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PignYnV0dG9uW3JvbGU9XCJncmlkY2VsbFwiXScpID8/IFtdLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRJZHggPSBNYXRoLm1pbihuZXh0SWR4IC0gYnV0dG9ucy5sZW5ndGgsIGJ0bnMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmZpbmRFbmFibGVkKGJ0bnMsIHRhcmdldElkeCwgMSkgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVwaWNrZXJDb21wb25lbnQuZmluZEVuYWJsZWQoYnRucywgdGFyZ2V0SWR4LCAtMSk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD8uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWJ1dHRvbnNbbmV4dElkeF0/LmRpc2FibGVkKSB7XG4gICAgICAgICAgICBidXR0b25zW25leHRJZHhdLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBmaW5kRW5hYmxlZChcbiAgICAgICAgYnV0dG9uczogSFRNTEJ1dHRvbkVsZW1lbnRbXSxcbiAgICAgICAgc3RhcnRJZHg6IG51bWJlcixcbiAgICAgICAgZGlyZWN0aW9uOiAxIHwgLTEsXG4gICAgKTogSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SWR4OyBpID49IDAgJiYgaSA8IGJ1dHRvbnMubGVuZ3RoOyBpICs9IGRpcmVjdGlvbikge1xuICAgICAgICAgICAgaWYgKCFidXR0b25zW2ldLmRpc2FibGVkKSByZXR1cm4gYnV0dG9uc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3dpdGNoVG9Nb250aHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ21vbnRocycpO1xuICAgICAgICB0aGlzLmZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJhY2tUb0NhbGVuZGFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBpY2tlclZpZXcuc2V0KCdjYWxlbmRhcicpO1xuICAgICAgICB0aGlzLmZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFNlbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCBzZWxlY3REYXRlKGRheTogQ2FsZW5kYXJEYXkpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRheS5pc0Rpc2FibGVkKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGVNb2RlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlTXVsdGlwbGVEYXRlKGRheS5kYXRlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0KCk7XG4gICAgICAgICAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0LnNldChkYXkuZGF0ZSk7XG4gICAgICAgICAgICAgICAgLy8gU2VtIGlzc28gbyA8aW5wdXQ+IGZpY2F2YSBjb20gbyB2YWxvciBhbnRlcmlvciAob3UgdmF6aW8pIGVucXVhbnRvIHPDsyBhIGRhdGFcbiAgICAgICAgICAgICAgICAvLyBpbmljaWFsIGVzdGF2YSBlc2NvbGhpZGEg4oCUIHRhbnRvIG8gdGV4dG8gdmlzw612ZWwgcXVhbnRvIG8gcXVlIHVtIGxlaXRvciBkZSB0ZWxhXG4gICAgICAgICAgICAgICAgLy8gbMOqIGFvIGZvY2FyIG8gY2FtcG8gZmljYXZhbSBvYnNvbGV0b3MgYXTDqSBhIHNlZ3VuZGEgZXNjb2xoYS5cbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheSh7IHN0YXJ0OiBkYXkuZGF0ZSwgZW5kOiBudWxsIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VSYW5nZVN0YXJ0U2VsZWN0ZWQoZGF5LmRhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbc3RhcnQsIGVuZF0gPVxuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLmdldFRpbWUoKSA8PSBkYXkuZGF0ZS5nZXRUaW1lKCkgPyBbcGVuZGluZywgZGF5LmRhdGVdIDogW2RheS5kYXRlLCBwZW5kaW5nXTtcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZTogRGF0ZVJhbmdlID0geyBzdGFydCwgZW5kIH07XG4gICAgICAgICAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldChyYW5nZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkocmFuZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQocmFuZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VSYW5nZUNvbXBsZXRlZChyYW5nZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKFxuICAgICAgICAgICAgZGF5LmRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIGRheS5kYXRlLmdldE1vbnRoKCksXG4gICAgICAgICAgICBkYXkuZGF0ZS5nZXREYXRlKCksXG4gICAgICAgICAgICB0aGlzLmhvdXJzKCksXG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgIHRoaXMuc2hvd1NlY29uZHMoKSA/IHRoaXMuc2Vjb25kcygpIDogMCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy52YWx1ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ2RhdGUnKSB7XG4gICAgICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSgpID09PSAnZGF0ZXRpbWUnKSB7XG4gICAgICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChuZXdEYXRlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmhpZGVPbkRhdGVUaW1lU2VsZWN0KCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBZGljaW9uYS9yZW1vdmUgdW1hIGRhdGEgZGEgc2VsZcOnw6NvIG3Dumx0aXBsYS4gTyBwYWluZWwgcGVybWFuZWNlIGFiZXJ0by4gKi9cbiAgICBwcml2YXRlIHRvZ2dsZU11bHRpcGxlRGF0ZShkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpO1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMubXVsdGlwbGVWYWx1ZXMoKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBleGlzdGluZy5maW5kSW5kZXgoKGQpID0+IGlzU2FtZURheShkLCBub3JtYWxpemVkKSk7XG4gICAgICAgIGNvbnN0IG5leHQgPVxuICAgICAgICAgICAgaW5kZXggPj0gMFxuICAgICAgICAgICAgICAgID8gZXhpc3RpbmcuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleClcbiAgICAgICAgICAgICAgICA6IFsuLi5leGlzdGluZywgbm9ybWFsaXplZF0uc29ydCgoYSwgYikgPT4gYS5nZXRUaW1lKCkgLSBiLmdldFRpbWUoKSk7XG4gICAgICAgIHRoaXMubXVsdGlwbGVWYWx1ZXMuc2V0KG5leHQpO1xuICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheShuZXh0KTtcbiAgICAgICAgY29uc3QgZW1pdFZhbHVlID0gbmV4dC5sZW5ndGggPyBuZXh0IDogbnVsbDtcbiAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZShlbWl0VmFsdWUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQoZW1pdFZhbHVlKTtcbiAgICAgICAgdGhpcy5hbm5vdW5jZU11bHRpcGxlRGF0ZVRvZ2dsZShub3JtYWxpemVkLCBpbmRleCA8IDApO1xuICAgIH1cblxuICAgIC8qKiBBbnVuY2lhIHZpYSBMaXZlQW5ub3VuY2VyIGEgZGF0YSBjb21wbGV0YSAoZGlhIGRhIHNlbWFuYSwgZGlhLCBtw6pzLCBhbm8pIGUgc2UgZWxhIGFjYWJvdVxuICAgICAqICBkZSBzZXIgc2VsZWNpb25hZGEgb3UgZGVzbWFyY2FkYSDigJQgcHJvIHVzdcOhcmlvIGRlIGxlaXRvciBkZSB0ZWxhIHNhYmVyIGV4YXRhbWVudGUgbyBxdWVcbiAgICAgKiAgbXVkb3UgYW50ZXMgZGUgc2VndWlyIGVzY29saGVuZG8gYSBwcsOzeGltYSBkYXRhLiAqL1xuICAgIHByaXZhdGUgYW5ub3VuY2VNdWx0aXBsZURhdGVUb2dnbGUoZGF0ZTogRGF0ZSwgaXNOb3dTZWxlY3RlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBjb25zdCBkYXRlVGV4dCA9IHRoaXMuZm9ybWF0RGF5QXJpYUxhYmVsKGRhdGUpO1xuICAgICAgICBjb25zdCBrZXkgPSBpc05vd1NlbGVjdGVkXG4gICAgICAgICAgICA/ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXRlX3NlbGVjdGVkJ1xuICAgICAgICAgICAgOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF0ZV9kZXNlbGVjdGVkJztcbiAgICAgICAgdm9pZCB0aGlzLmxpdmVBbm5vdW5jZXIuYW5ub3VuY2UodGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoa2V5LCB7IGRhdGU6IGRhdGVUZXh0IH0pLCAncG9saXRlJyk7XG4gICAgfVxuXG4gICAgLyoqIFRleHRvIGNvbXBhcnRpbGhhZG8gZW50cmUgbyBhbsO6bmNpbyB0cmFuc2l0w7NyaW8gZGUgaW7DrWNpbyBkZSBpbnRlcnZhbG8gZXNjb2xoaWRvXG4gICAgICogIChgYW5ub3VuY2VSYW5nZVN0YXJ0U2VsZWN0ZWRgKSBlIG8gc3RhdHVzIHBlcnNpc3RlbnRlIGV4cG9zdG8gdmlhIGBhcmlhLWRlc2NyaWJlZGJ5YCBub1xuICAgICAqICBgPGlucHV0PmAgKGByYW5nZVBlbmRpbmdTdGF0dXNUZXh0YCkg4oCUIG1lc21hIHJlZGHDp8OjbyBub3MgZG9pcyBsdWdhcmVzIGRlIHByb3DDs3NpdG8sIHByYSBuw6NvXG4gICAgICogIHNvYXJlbSBjb21vIGRvaXMgZXN0YWRvcyBkaWZlcmVudGVzIHBybyBtZXNtbyBtb21lbnRvLiAqL1xuICAgIHByaXZhdGUgYnVpbGRSYW5nZVN0YXJ0U2VsZWN0ZWRUZXh0KGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3JhbmdlX3N0YXJ0X3NlbGVjdGVkJywge1xuICAgICAgICAgICAgZGF0ZTogdGhpcy5mb3JtYXREYXlBcmlhTGFiZWwoZGF0ZSksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBBbnVuY2lhIHF1ZSBhIGRhdGEgSU5JQ0lBTCBkbyBpbnRlcnZhbG8gZm9pIGVzY29saGlkYSDigJQgbyBwcmltZWlybyBjbGlxdWUgZW0gYHJhbmdlYCBlcmFcbiAgICAgKiAgbXVkbyAoYW8gY29udHLDoXJpbyBkbyB0b2dnbGUgZW0gbW9kbyBgbXVsdGlwbGVgLCBzZW1wcmUgYW51bmNpYWRvKS4gUmVjZWJlIHVtIGBEYXRlYCBwdXJvLFxuICAgICAqICBuw6NvIHVtIGNsaXF1ZTogYHNlbGVjdFRvZGF5KClgIGNoYW1hIGBzZWxlY3REYXRlKClgIGludGVybmFtZW50ZSBlIGhlcmRhIGVzdGUgYW7Dum5jaW8gZGVcbiAgICAgKiAgZ3Jhw6dhLCBzZW0gcHJlY2lzYXIgZGUgdW1hIHNlZ3VuZGEgY2hhbWFkYS4gKi9cbiAgICBwcml2YXRlIGFubm91bmNlUmFuZ2VTdGFydFNlbGVjdGVkKGRhdGU6IERhdGUpOiB2b2lkIHtcbiAgICAgICAgdm9pZCB0aGlzLmxpdmVBbm5vdW5jZXIuYW5ub3VuY2UodGhpcy5idWlsZFJhbmdlU3RhcnRTZWxlY3RlZFRleHQoZGF0ZSksICdwb2xpdGUnKTtcbiAgICB9XG5cbiAgICAvKiogQW51bmNpYSBvIGludGVydmFsbyBjb25jbHXDrWRvLCBjaGFtYWRvIGFudGVzIGRlIGBjbG9zZVBhbmVsKClgIOKAlCBvIGBMaXZlQW5ub3VuY2VyYCBlc2NyZXZlXG4gICAgICogIG51bWEgcmVnacOjbyBgYXJpYS1saXZlYCBwcsOzcHJpYSBlIGRlc2Fjb3BsYWRhIGRvIGZvY28sIGVudMOjbyBuw6NvIMOpIGNvcnRhZG8gcGVsYSByZXN0YXVyYcOnw6NvXG4gICAgICogIGRlIGZvY28gcXVlIGBjbG9zZVBhbmVsKClgIGFnZW5kYSB1bSB0aWNrIGRlcG9pcyB2aWEgYGFmdGVyTmV4dFJlbmRlcmAuICovXG4gICAgcHJpdmF0ZSBhbm5vdW5jZVJhbmdlQ29tcGxldGVkKHJhbmdlOiBEYXRlUmFuZ2UpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFyYW5nZS5zdGFydCB8fCAhcmFuZ2UuZW5kKSByZXR1cm47XG4gICAgICAgIHZvaWQgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKFxuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3JhbmdlX3NlbGVjdGVkJywge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmZvcm1hdERheUFyaWFMYWJlbChyYW5nZS5zdGFydCksXG4gICAgICAgICAgICAgICAgZW5kOiB0aGlzLmZvcm1hdERheUFyaWFMYWJlbChyYW5nZS5lbmQpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAncG9saXRlJyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2VsZWN0WWVhcih5ZWFyOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNZZWFyRGlzYWJsZWQoeWVhcikpIHJldHVybjtcbiAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHllYXIsIDAsIDEpO1xuICAgICAgICB0aGlzLnZhbHVlLnNldChuZXdEYXRlKTtcbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkobmV3RGF0ZSk7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKG5ld0RhdGUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQobmV3RGF0ZSk7XG4gICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZWxlY3RNb250aChtb250aEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNNb250aERpc2FibGVkKG1vbnRoSW5kZXgpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJlbnRZZWFyKCk7XG4gICAgICAgIGNvbnN0IG5ld1ZpZXdEYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGhJbmRleCwgMSk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ21vbnRoJykge1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobmV3Vmlld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5Rm9yKG5ld1ZpZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKG5ld1ZpZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChuZXdWaWV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ld1ZpZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ2NhbGVuZGFyJyk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2VsZWN0VG9kYXkoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzRGF0ZURpc2FibGVkKHRvZGF5KSkge1xuICAgICAgICAgICAgY29uc3QgY2FsRGF5OiBDYWxlbmRhckRheSA9IHtcbiAgICAgICAgICAgICAgICBkYXRlOiB0b2RheSxcbiAgICAgICAgICAgICAgICBkYXlPZk1vbnRoOiB0b2RheS5nZXREYXRlKCksXG4gICAgICAgICAgICAgICAgaXNDdXJyZW50TW9udGg6IHRydWUsXG4gICAgICAgICAgICAgICAgaXNUb2RheTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0Rpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1JhbmdlU3RhcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzUmFuZ2VFbmQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzSW5SYW5nZTogZmFsc2UsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5zZWxlY3REYXRlKGNhbERheSk7XG4gICAgICAgICAgICB0aGlzLnRvZGF5Q2xpY2suZW1pdCh0b2RheSk7XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdyYW5nZScgJiYgdGhpcy5pc09wZW4oKSkge1xuICAgICAgICAgICAgICAgIC8vIEVtIHJhbmdlLCBzZWxlY3REYXRlKCkgc8OzIGZlY2hhIG8gcGFpbmVsIG5hIHNlZ3VuZGEgZXNjb2xoYSAodmVyIHNldSByYW1vXG4gICAgICAgICAgICAgICAgLy8gJ3JhbmdlJyk7IG5hIHByaW1laXJhLCBvIGZvY28gZmljYSBwYXJhZG8gbm8gYm90w6NvIFwiSG9qZVwiIGRvIHJvZGFww6ksIGZvcmEgZGFcbiAgICAgICAgICAgICAgICAvLyBncmFkZSDigJQgc2VtIGlzc28gbyB1c3XDoXJpbyBuw6NvIHRpbmhhIG5lbmh1bWEgcGlzdGEgZGUgcXVlIHByZWNpc2F2YSB2b2x0YXIgcHJhXG4gICAgICAgICAgICAgICAgLy8gZ3JhZGUgcHJhIGVzY29saGVyIGEgZGF0YSBmaW5hbC4gQSBjw6lsdWxhIGRlIGhvamUgasOhIGNhcnJlZ2FcbiAgICAgICAgICAgICAgICAvLyBgZGF0YS1mb2N1cz1cInNlbGVjdGVkXCJgIChpc1JhbmdlU3RhcnQgYWNhYm91IGRlIHNlciBzZXRhZG8gcG9yIHNlbGVjdERhdGUpLCBxdWVcbiAgICAgICAgICAgICAgICAvLyBmb2N1c0Jlc3RDYWxlbmRhclRhcmdldCgpIGrDoSBwcmlvcml6YS4gTyBhbsO6bmNpbyBkZSBcImluw61jaW8gc2VsZWNpb25hZG9cIiBqw6FcbiAgICAgICAgICAgICAgICAvLyBkaXNwYXJvdSBkZW50cm8gZGUgc2VsZWN0RGF0ZSgpIGFudGVzIGRlc3RlIGJsb2NvIHJvZGFyLlxuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNCZXN0Q2FsZW5kYXJUYXJnZXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBjbGVhclZhbHVlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGhhZFJhbmdlSW5Qcm9ncmVzcyA9XG4gICAgICAgICAgICB0aGlzLm1vZGUoKSA9PT0gJ3JhbmdlJyAmJiAodGhpcy5wZW5kaW5nUmFuZ2VTdGFydCgpICE9PSBudWxsIHx8IHRoaXMucmFuZ2VWYWx1ZSgpICE9PSBudWxsKTtcbiAgICAgICAgdGhpcy52YWx1ZS5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMuaG91cnMuc2V0KDApO1xuICAgICAgICB0aGlzLm1pbnV0ZXMuc2V0KDApO1xuICAgICAgICB0aGlzLnNlY29uZHMuc2V0KDApO1xuICAgICAgICB0aGlzLnJhbmdlVmFsdWUuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLm11bHRpcGxlVmFsdWVzLnNldChbXSk7XG4gICAgICAgIHRoaXMucGVuZGluZ1JhbmdlU3RhcnQuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IobnVsbCk7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKG51bGwpO1xuICAgICAgICB0aGlzLmNsZWFyQ2xpY2suZW1pdChldmVudCk7XG4gICAgICAgIGlmIChoYWRSYW5nZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgIC8vIFPDsyBhbnVuY2lhIHF1YW5kbyBoYXZpYSBkZSBmYXRvIGFsZ28gYSBsaW1wYXIg4oCUIGV2aXRhIFwiaW50ZXJ2YWxvIGxpbXBvXCIgdG9kYSB2ZXpcbiAgICAgICAgICAgIC8vIHF1ZSBhbGd1w6ltIGFwZXJ0YSBcIkxpbXBhclwiIHBvciBnYXJhbnRpYSwgc2VtIG5hZGEgc2VsZWNpb25hZG8gYWluZGEuXG4gICAgICAgICAgICB2b2lkIHRoaXMubGl2ZUFubm91bmNlci5hbm5vdW5jZShcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcmFuZ2VfY2xlYXJlZCcpLFxuICAgICAgICAgICAgICAgICdwb2xpdGUnLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY29uZmlybSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMudmFsdWUoKSA/PyBuZXcgRGF0ZSgpO1xuICAgICAgICBjb25zdCBjb25maXJtZWQgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgIGN1cnJlbnQuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIGN1cnJlbnQuZ2V0TW9udGgoKSxcbiAgICAgICAgICAgIGN1cnJlbnQuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgdGhpcy5ob3VycygpLFxuICAgICAgICAgICAgdGhpcy5taW51dGVzKCksXG4gICAgICAgICAgICB0aGlzLnNob3dTZWNvbmRzKCkgPyB0aGlzLnNlY29uZHMoKSA6IDAsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KGNvbmZpcm1lZCk7XG4gICAgICAgIHRoaXMuc2V0RGlzcGxheUZvcihjb25maXJtZWQpO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZShjb25maXJtZWQpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQoY29uZmlybWVkKTtcbiAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFRpbWUgcGlja2VyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHJvdGVjdGVkIGluY3JlbWVudEhvdXJzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhvdXJzLnNldCgodGhpcy5ob3VycygpICsgdGhpcy5zdGVwSG91cigpKSAlIHRoaXMubWF4SG91cnMpO1xuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBkZWNyZW1lbnRIb3VycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob3Vycy5zZXQoKHRoaXMuaG91cnMoKSAtIHRoaXMuc3RlcEhvdXIoKSArIHRoaXMubWF4SG91cnMpICUgdGhpcy5tYXhIb3Vycyk7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGluY3JlbWVudE1pbnV0ZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWludXRlcy5zZXQoKHRoaXMubWludXRlcygpICsgdGhpcy5taW51dGVTdGVwKCkpICUgdGhpcy5tYXhNaW51dGVzKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZGVjcmVtZW50TWludXRlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5taW51dGVzLnNldCgodGhpcy5taW51dGVzKCkgLSB0aGlzLm1pbnV0ZVN0ZXAoKSArIHRoaXMubWF4TWludXRlcykgJSB0aGlzLm1heE1pbnV0ZXMpO1xuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpbmNyZW1lbnRTZWNvbmRzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlY29uZHMuc2V0KCh0aGlzLnNlY29uZHMoKSArIHRoaXMuc3RlcFNlY29uZCgpKSAlIDYwKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZGVjcmVtZW50U2Vjb25kcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWNvbmRzLnNldCgodGhpcy5zZWNvbmRzKCkgLSB0aGlzLnN0ZXBTZWNvbmQoKSArIDYwKSAlIDYwKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBAbnVtZXJpY0tleXNPbmx5KClcbiAgICBwcm90ZWN0ZWQgaGFuZGxlSG91cnNLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuaW5jcmVtZW50SG91cnMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRIb3VycygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQG51bWVyaWNLZXlzT25seSgpXG4gICAgcHJvdGVjdGVkIGhhbmRsZU1pbnV0ZXNLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuaW5jcmVtZW50TWludXRlcygpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmRlY3JlbWVudE1pbnV0ZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBudW1lcmljS2V5c09ubHkoKVxuICAgIHByb3RlY3RlZCBoYW5kbGVTZWNvbmRzS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmluY3JlbWVudFNlY29uZHMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRTZWNvbmRzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlSG91cnNJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmF3ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQocmF3LCAxMCk7XG4gICAgICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmlzMTJIb3VyRm9ybWF0KCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbGYgPSBEYXRlcGlja2VyQ29tcG9uZW50LkhPVVJTX1BFUl9NRVJJRElFTTtcbiAgICAgICAgICAgIGNvbnN0IGgxMiA9IE1hdGgubWluKGhhbGYsIE1hdGgubWF4KDEsIHBhcnNlZCkpO1xuICAgICAgICAgICAgY29uc3QgYmFzZSA9IGgxMiAlIGhhbGY7XG4gICAgICAgICAgICB0aGlzLmhvdXJzLnNldCh0aGlzLmFtUG0oKSA9PT0gJ1BNJyA/IGJhc2UgKyBoYWxmIDogYmFzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhvdXJzLnNldChNYXRoLm1pbih0aGlzLm1heEhvdXJzIC0gMSwgTWF0aC5tYXgoMCwgcGFyc2VkKSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgLyoqIEFsdGVybmEgZW50cmUgQU0gZSBQTSBzb21hbmRvL3N1YnRyYWluZG8gMTIgaG9yYXMgZGEgaG9yYSBpbnRlcm5hLiAqL1xuICAgIHByb3RlY3RlZCB0b2dnbGVBbVBtKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBoYWxmID0gRGF0ZXBpY2tlckNvbXBvbmVudC5IT1VSU19QRVJfTUVSSURJRU07XG4gICAgICAgIHRoaXMuaG91cnMuc2V0KHRoaXMuaG91cnMoKSA8IGhhbGYgPyB0aGlzLmhvdXJzKCkgKyBoYWxmIDogdGhpcy5ob3VycygpIC0gaGFsZik7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZU1pbnV0ZXNJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmF3ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQocmF3LCAxMCk7XG4gICAgICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICAgICAgdGhpcy5taW51dGVzLnNldChNYXRoLm1pbih0aGlzLm1heE1pbnV0ZXMgLSAxLCBNYXRoLm1heCgwLCBwYXJzZWQpKSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZVNlY29uZHNJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmF3ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQocmF3LCAxMCk7XG4gICAgICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICAgICAgdGhpcy5zZWNvbmRzLnNldChNYXRoLm1pbig1OSwgTWF0aC5tYXgoMCwgcGFyc2VkKSkpO1xuICAgICAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkRheUhvdmVyKGRhdGU6IERhdGUgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgdGhpcy5ob3ZlckRhdGUuc2V0KGRhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIEhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgaXNEYXRlRGlzYWJsZWQoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBtaW4gPSB0aGlzLm1pbigpO1xuICAgICAgICBjb25zdCBtYXggPSB0aGlzLm1heCgpO1xuICAgICAgICBpZiAobWluICYmIHN0cmlwVGltZShkYXRlKSA8IHN0cmlwVGltZShtaW4pKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKG1heCAmJiBzdHJpcFRpbWUoZGF0ZSkgPiBzdHJpcFRpbWUobWF4KSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnN0IGRpc2FibGVkRGF5cyA9IHRoaXMuZGlzYWJsZWREYXlzKCk7XG4gICAgICAgIGlmIChkaXNhYmxlZERheXMubGVuZ3RoICYmIGRpc2FibGVkRGF5cy5pbmNsdWRlcyhkYXRlLmdldERheSgpKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnN0IGRpc2FibGVkRGF0ZXMgPSB0aGlzLmRpc2FibGVkRGF0ZXMoKTtcbiAgICAgICAgaWYgKGRpc2FibGVkRGF0ZXMubGVuZ3RoICYmIGRpc2FibGVkRGF0ZXMuc29tZSgoZCkgPT4gaXNTYW1lRGF5KGQsIGRhdGUpKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNZZWFyU2VsZWN0ZWQoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICByZXR1cm4gISFzZWxlY3RlZCAmJiBzZWxlY3RlZC5nZXRGdWxsWWVhcigpID09PSB5ZWFyO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpc1llYXJEaXNhYmxlZCh5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKG1pbiAmJiB5ZWFyIDwgbWluLmdldEZ1bGxZZWFyKCkpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAobWF4ICYmIHllYXIgPiBtYXguZ2V0RnVsbFllYXIoKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNDdXJyZW50WWVhcih5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHllYXIgPT09IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNNb250aFNlbGVjdGVkKG1vbnRoSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgcmV0dXJuICEhc2VsZWN0ZWQgJiYgc2VsZWN0ZWQuZ2V0TW9udGgoKSA9PT0gbW9udGhJbmRleCAmJiBzZWxlY3RlZC5nZXRGdWxsWWVhcigpID09PSB0aGlzLmN1cnJlbnRZZWFyKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzTW9udGhEaXNhYmxlZChtb250aEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgeWVhciA9IHRoaXMuY3VycmVudFllYXIoKTtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKG1pbiAmJiAoeWVhciA8IG1pbi5nZXRGdWxsWWVhcigpIHx8ICh5ZWFyID09PSBtaW4uZ2V0RnVsbFllYXIoKSAmJiBtb250aEluZGV4IDwgbWluLmdldE1vbnRoKCkpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heCAmJiAoeWVhciA+IG1heC5nZXRGdWxsWWVhcigpIHx8ICh5ZWFyID09PSBtYXguZ2V0RnVsbFllYXIoKSAmJiBtb250aEluZGV4ID4gbWF4LmdldE1vbnRoKCkpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwYWRUaW1lKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIH1cblxuICAgIC8qKiBgZGF5YCDDqSBvcGNpb25hbCBlIHPDsyB1c2FkbyBlbSBgbW9kZT1cInJhbmdlXCJgIOKAlCBvcyBkZW1haXMgY2FsbCBzaXRlcyAocmVzdW1vIGRvIHZhbG9yXG4gICAgICogIHNlZ21lbnRhZG8sIGFuw7puY2lvIGRlIHRvZ2dsZSBlbSBtb2RvIGBtdWx0aXBsZWApIG51bmNhIHTDqm0gdW0gYENhbGVuZGFyRGF5YCDDoCBtw6NvIGUgbnVuY2FcbiAgICAgKiAgcm9kYW0gZW0gYHJhbmdlYCwgZW50w6NvIGNvbnRpbnVhbSByZWNlYmVuZG8gZXhhdGFtZW50ZSBvIHRleHRvIGRlIHNlbXByZS4gKi9cbiAgICBwcm90ZWN0ZWQgZm9ybWF0RGF5QXJpYUxhYmVsKGRhdGU6IERhdGUsIGRheT86IENhbGVuZGFyRGF5KTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgYmFzZSA9IGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMuY3VycmVudExhbmcoKSwge1xuICAgICAgICAgICAgd2Vla2RheTogJ2xvbmcnLFxuICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICAgICAgbW9udGg6ICdsb25nJyxcbiAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFkYXkgfHwgdGhpcy5tb2RlKCkgIT09ICdyYW5nZScpIHJldHVybiBiYXNlO1xuICAgICAgICBjb25zdCBzdWZmaXggPSB0aGlzLnJhbmdlRGF5U3RhdHVzU3VmZml4KGRheSk7XG4gICAgICAgIHJldHVybiBzdWZmaXggPyBgJHtiYXNlfSwgJHtzdWZmaXh9YCA6IGJhc2U7XG4gICAgfVxuXG4gICAgLyoqIFN1Zml4byBxdWUgZGl6IG8gcGFwZWwgZG8gZGlhIGRlbnRybyBkbyBpbnRlcnZhbG8gc2VsZWNpb25hZG8g4oCUIHNlbSBpc3NvLCB0b2RhIGPDqWx1bGEgZGFcbiAgICAgKiAgZ3JhZGUgc29hIGlkw6pudGljYSBwcm8gbGVpdG9yIGRlIHRlbGEsIGUgbyDDum5pY28gamVpdG8gZGUgc2FiZXIgb25kZSBlc3TDoSBvIGluw61jaW8vZmltIMOpXG4gICAgICogIGVueGVyZ2FuZG8gbyBkZXN0YXF1ZSB2aXN1YWwuICovXG4gICAgcHJpdmF0ZSByYW5nZURheVN0YXR1c1N1ZmZpeChkYXk6IENhbGVuZGFyRGF5KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGRheS5pc1JhbmdlU3RhcnQgJiYgZGF5LmlzUmFuZ2VFbmQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcmFuZ2Vfc3RhcnRfZW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRheS5pc1JhbmdlU3RhcnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcmFuZ2Vfc3RhcnQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF5LmlzUmFuZ2VFbmQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcmFuZ2VfZW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRheS5pc0luUmFuZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcmFuZ2VfaW5fcmFuZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLyoqIEZvcm1hdGEgbyB2YWxvciBwYXJhIGV4aWJpw6fDo28gbm8gaW5wdXQsIGFwbGljYW5kbyByYW5nZVNlcGFyYXRvciwgZGF0ZUZvcm1hdCBlIG11bHRpcGxlU2VwYXJhdG9yLiAqL1xuICAgIHByaXZhdGUgZm9ybWF0Rm9yRGlzcGxheSh2YWx1ZTogRGF0ZSB8IERhdGVSYW5nZSB8IERhdGVbXSB8IG51bGwpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZm9ybWF0VmFsdWVGb3JJbnB1dChcbiAgICAgICAgICAgIHRoaXMubW9kZSgpLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICB0aGlzLnJhbmdlU2VwYXJhdG9yKCksXG4gICAgICAgICAgICB0aGlzLnJlc29sdmVkRGF0ZUZvcm1hdCgpLFxuICAgICAgICAgICAgdGhpcy5tdWx0aXBsZVNlcGFyYXRvcigpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dWFsaXphIGBpbnB1dERhdGVgIGEgcGFydGlyIGRlIHVtIHZhbG9yIMO6bmljbywgcm90ZWFuZG8gcGVsYSBlbmdpbmUgZGUgc2VnbWVudG9zXG4gICAgICogKGRhdGUvbW9udGgvdGltZS9kYXRldGltZSkgb3UgcGVsbyBmb3JtYXRhZG9yIGxlZ2FkbyAocmFuZ2UveWVhci9tdWx0aXBsZSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXREaXNwbGF5Rm9yKHZhbHVlOiBEYXRlIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc1NlZ21lbnRNb2RlQ2FuZGlkYXRlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZW5zdXJlU2VnbWVudEVuZ2luZUNvbmZpZ3VyZWQoKTtcbiAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5sb2FkRnJvbURhdGUodmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB2YWx1ZSA/IHRoaXMuc2VnbWVudEVuZ2luZS5nZXREaXNwbGF5U3RyaW5nKCkgOiAnJztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKFJlKWNvbmZpZ3VyYSBhIGVuZ2luZSBkZSBzZWdtZW50b3MgcXVhbmRvIGBtb2RlYC9gZGF0ZUZvcm1hdGAvYGhvdXJGb3JtYXRgL2BzaG93U2Vjb25kc2BcbiAgICAgKiBtdWRhcmFtIGRlc2RlIGEgw7psdGltYSBjaGFtYWRhLCByZWNhcnJlZ2FuZG8gbyB2YWxvciBhdHVhbC4gQ2hhbWFkbyBkZSBmb3JtYSBzw61uY3JvbmEgYVxuICAgICAqIHBhcnRpciBkZSB0b2RvIHBvbnRvIGRlIGVudHJhZGEgcXVlIHVzYSBhIGVuZ2luZSDigJQgbsOjbyBkZXBlbmRlIGRlIHVtIGBlZmZlY3QoKWAgKHF1ZSBzw7NcbiAgICAgKiByb2RhIGVtIHVtIGNpY2xvIGRlIGNoYW5nZSBkZXRlY3Rpb24sIHRhcmRlIGRlbWFpcyBwYXJhIGxlaXR1cmFzL2VzY3JpdGFzIGltZWRpYXRhcykuXG4gICAgICovXG4gICAgcHJpdmF0ZSBlbnN1cmVTZWdtZW50RW5naW5lQ29uZmlndXJlZCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbW9kZSA9IHRoaXMubW9kZSgpO1xuICAgICAgICBpZiAobW9kZSAhPT0gJ2RhdGUnICYmIG1vZGUgIT09ICdtb250aCcgJiYgbW9kZSAhPT0gJ3RpbWUnICYmIG1vZGUgIT09ICdkYXRldGltZScpIHJldHVybjtcbiAgICAgICAgY29uc3QgY29uZmlnOiBTZWdtZW50RW5naW5lQ29uZmlnID0ge1xuICAgICAgICAgICAgbW9kZSxcbiAgICAgICAgICAgIGRhdGVGb3JtYXQ6IHRoaXMucmVzb2x2ZWREYXRlRm9ybWF0KCksXG4gICAgICAgICAgICBob3VyRm9ybWF0OiB0aGlzLnJlc29sdmVkSG91ckZvcm1hdCgpLFxuICAgICAgICAgICAgc2hvd1NlY29uZHM6IHRoaXMuc2hvd1NlY29uZHMoKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbGFzdCA9IHRoaXMubGFzdFNlZ21lbnRDb25maWc7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGxhc3QgJiZcbiAgICAgICAgICAgIGxhc3QubW9kZSA9PT0gY29uZmlnLm1vZGUgJiZcbiAgICAgICAgICAgIGxhc3QuZGF0ZUZvcm1hdCA9PT0gY29uZmlnLmRhdGVGb3JtYXQgJiZcbiAgICAgICAgICAgIGxhc3QuaG91ckZvcm1hdCA9PT0gY29uZmlnLmhvdXJGb3JtYXQgJiZcbiAgICAgICAgICAgIGxhc3Quc2hvd1NlY29uZHMgPT09IGNvbmZpZy5zaG93U2Vjb25kc1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhc3RTZWdtZW50Q29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuY29uZmlndXJlKGNvbmZpZyk7XG4gICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5sb2FkRnJvbURhdGUodGhpcy52YWx1ZSgpKTtcbiAgICB9XG5cbiAgICAvKiogUmV0b3JuYSBhIHRyYWR1w6fDo28gZGUgYGtleWAsIG91IGBmYWxsYmFja2AgcXVhbmRvIGEgY2hhdmUgbsOjbyBlc3TDoSB0cmFkdXppZGEgKG5neC10cmFuc2xhdGUgcmV0b3JuYSBhIHByw7NwcmlhIGNoYXZlKS4gKi9cbiAgICBwcml2YXRlIHJlc29sdmVUcmFuc2xhdGVkT3JEZWZhdWx0KGtleTogc3RyaW5nLCBmYWxsYmFjazogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRlZCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGtleSk7XG4gICAgICAgIGlmICh0eXBlb2YgdHJhbnNsYXRlZCAhPT0gJ3N0cmluZycgfHwgIXRyYW5zbGF0ZWQgfHwgdHJhbnNsYXRlZCA9PT0ga2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzeW5jVGltZVRvVmFsdWUoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLnZhbHVlKCkgPz8gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKFxuICAgICAgICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgICAgZGF0ZS5nZXRNb250aCgpLFxuICAgICAgICAgICAgZGF0ZS5nZXREYXRlKCksXG4gICAgICAgICAgICB0aGlzLmhvdXJzKCksXG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgIHRoaXMuc2hvd1NlY29uZHMoKSA/IHRoaXMuc2Vjb25kcygpIDogMCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy52YWx1ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgIHRoaXMuc2V0RGlzcGxheUZvcihuZXdEYXRlKTtcbiAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAndGltZScpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKG5ld0RhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBidWlsZENhbGVuZGFyRGF5KFxuICAgICAgICBkYXRlOiBEYXRlLFxuICAgICAgICBpc0N1cnJlbnRNb250aDogYm9vbGVhbixcbiAgICAgICAgdG9kYXk6IERhdGUsXG4gICAgICAgIHNlbGVjdGVkOiBEYXRlIHwgbnVsbCxcbiAgICAgICAgcmFuZ2U6IHsgc3RhcnQ6IERhdGUgfCBudWxsOyBlbmQ6IERhdGUgfCBudWxsIH0sXG4gICAgICAgIHJhbmdlU3RhcnRUaW1lOiBudW1iZXIgfCBudWxsLFxuICAgICAgICByYW5nZUVuZFRpbWU6IG51bWJlciB8IG51bGwsXG4gICAgKTogQ2FsZW5kYXJEYXkge1xuICAgICAgICBjb25zdCBpc1JhbmdlU3RhcnQgPSByYW5nZS5zdGFydCA/IGlzU2FtZURheShkYXRlLCByYW5nZS5zdGFydCkgOiBmYWxzZTtcbiAgICAgICAgY29uc3QgaXNSYW5nZUVuZCA9IHJhbmdlLmVuZCA/IGlzU2FtZURheShkYXRlLCByYW5nZS5lbmQpIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGRhdGVUaW1lID0gc3RyaXBUaW1lKGRhdGUpO1xuICAgICAgICBjb25zdCBpc0luUmFuZ2UgPVxuICAgICAgICAgICAgcmFuZ2VTdGFydFRpbWUgIT09IG51bGwgJiYgcmFuZ2VFbmRUaW1lICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBkYXRlVGltZSA+IHJhbmdlU3RhcnRUaW1lICYmIGRhdGVUaW1lIDwgcmFuZ2VFbmRUaW1lXG4gICAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHRoaXMuaXNNdWx0aXBsZU1vZGUoKVxuICAgICAgICAgICAgPyB0aGlzLm11bHRpcGxlVmFsdWVzKCkuc29tZSgoZCkgPT4gaXNTYW1lRGF5KGQsIGRhdGUpKVxuICAgICAgICAgICAgOiBzZWxlY3RlZFxuICAgICAgICAgICAgICA/IGlzU2FtZURheShkYXRlLCBzZWxlY3RlZClcbiAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRheU9mTW9udGg6IGRhdGUuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgaXNUb2RheTogaXNTYW1lRGF5KGRhdGUsIHRvZGF5KSxcbiAgICAgICAgICAgIGlzU2VsZWN0ZWQsXG4gICAgICAgICAgICBpc0Rpc2FibGVkOiB0aGlzLmlzRGF0ZURpc2FibGVkKGRhdGUpIHx8ICghaXNDdXJyZW50TW9udGggJiYgIXRoaXMuc2VsZWN0T3RoZXJNb250aHMoKSksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgaXNDdXJyZW50TW9udGgsXG4gICAgICAgICAgICBpc1JhbmdlU3RhcnQsXG4gICAgICAgICAgICBpc1JhbmdlRW5kLFxuICAgICAgICAgICAgaXNJblJhbmdlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgY29tcHV0ZVZhbGlkYXRpb25FcnJvcnModmFsdWU6IERhdGVwaWNrZXJWYWx1ZSwgY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgICAgICBpZiAodGhpcy5faGFzRm9ybWF0RXJyb3IpIHJldHVybiB7IGludmFsaWRGb3JtYXQ6IHRydWUgfTtcbiAgICAgICAgaWYgKCF2YWx1ZSB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSkgcmV0dXJuIFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcihjb250cm9sKTtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGQgb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAobWluICYmIHN0cmlwVGltZShkKSA8IHN0cmlwVGltZShtaW4pKSByZXR1cm4geyBtaW46IHsgbWluLCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICAgICAgICAgIGlmIChtYXggJiYgc3RyaXBUaW1lKGQpID4gc3RyaXBUaW1lKG1heCkpIHJldHVybiB7IG1heDogeyBtYXgsIGFjdHVhbDogZCB9IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yKGNvbnRyb2wpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRGF0ZVJhbmdlKHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlLnN0YXJ0ICYmIG1pbiAmJiBzdHJpcFRpbWUodmFsdWUuc3RhcnQpIDwgc3RyaXBUaW1lKG1pbikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBtaW46IHsgbWluLCBhY3R1YWw6IHZhbHVlLnN0YXJ0IH0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZS5lbmQgJiYgbWF4ICYmIHN0cmlwVGltZSh2YWx1ZS5lbmQpID4gc3RyaXBUaW1lKG1heCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBtYXg6IHsgbWF4LCBhY3R1YWw6IHZhbHVlLmVuZCB9IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yKGNvbnRyb2wpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGQgPSB2YWx1ZSBhcyBEYXRlO1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICd5ZWFyJykge1xuICAgICAgICAgICAgaWYgKG1pbiAmJiBkLmdldEZ1bGxZZWFyKCkgPCBtaW4uZ2V0RnVsbFllYXIoKSkgcmV0dXJuIHsgbWluOiB7IG1pbiwgYWN0dWFsOiBkIH0gfTtcbiAgICAgICAgICAgIGlmIChtYXggJiYgZC5nZXRGdWxsWWVhcigpID4gbWF4LmdldEZ1bGxZZWFyKCkpIHJldHVybiB7IG1heDogeyBtYXgsIGFjdHVhbDogZCB9IH07XG4gICAgICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yKGNvbnRyb2wpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtaW4gJiYgc3RyaXBUaW1lKGQpIDwgc3RyaXBUaW1lKG1pbikpIHJldHVybiB7IG1pbjogeyBtaW4sIGFjdHVhbDogZCB9IH07XG4gICAgICAgIGlmIChtYXggJiYgc3RyaXBUaW1lKGQpID4gc3RyaXBUaW1lKG1heCkpIHJldHVybiB7IG1heDogeyBtYXgsIGFjdHVhbDogZCB9IH07XG4gICAgICAgIHJldHVybiBWYWxpZGF0b3JzLm51bGxWYWxpZGF0b3IoY29udHJvbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0RhdGVSYW5nZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIERhdGVSYW5nZSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICdzdGFydCcgaW4gdmFsdWUgJiYgJ2VuZCcgaW4gdmFsdWU7XG4gICAgfVxufVxuXG4iLCI8ZGl2XG4gICAgY2RrT3ZlcmxheU9yaWdpblxuICAgICN0cmlnZ2VyPVwiY2RrT3ZlcmxheU9yaWdpblwiXG4gICAgY2xhc3M9XCJkYXRlcGlja2VyLWdyb3VwIHJlbGF0aXZlIGZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlciBhZnRlcjpwb2ludGVyLWV2ZW50cy1ub25lIGFmdGVyOmFic29sdXRlIGFmdGVyOmluc2V0LTAgYWZ0ZXI6cm91bmRlZC1tZWRpdW0gaGFzLVtpbnB1dDpmb2N1c106YWZ0ZXI6b3V0bGluZSBoYXMtW2lucHV0OmZvY3VzXTphZnRlcjpvdXRsaW5lLTIgaGFzLVtpbnB1dDpmb2N1c106YWZ0ZXI6b3V0bGluZS1vZmZzZXQtWy0ycHhdIGhhcy1baW5wdXQ6Zm9jdXNdOmFmdGVyOm91dGxpbmUtW3ZhcigtLXMtZm9jdXMtcmluZy1jb2xvciwjMDA5MGZmKV1cIlxuICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgYXJpYS1oYXNwb3B1cD1cImdyaWRcIlxuICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXNPcGVuKClcIlxuICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwicG9wdXBJZCgpXCJcbj5cbiAgICA8aW5wdXRcbiAgICAgICAgI3RyaWdnZXJJbnB1dFxuICAgICAgICBjbGFzcz1cImgtWzM1cHhdIHctZnVsbCByb3VuZGVkLW1lZGl1bSBib3JkZXIgYm9yZGVyLXNvbGlkIHBsLVsxMHB4XSB0ZXh0LXNtIG91dGxpbmUtbm9uZSB0cmFuc2l0aW9uLWNvbG9ycyBkdXJhdGlvbi0yMDAgZWFzZS1vdXRcIlxuICAgICAgICBbY2xhc3MucHItMTBdPVwic2hvd0ljb24oKSAmJiAhc2hvd0NsZWFyKClcIlxuICAgICAgICBbY2xhc3MucHItMTZdPVwic2hvd0ljb24oKSAmJiBzaG93Q2xlYXIoKVwiXG4gICAgICAgIFtjbGFzcy5wci02XT1cIiFzaG93SWNvbigpICYmIHNob3dDbGVhcigpXCJcbiAgICAgICAgW2NsYXNzLmJnLWdyYXlzY2FsZS0wXT1cIiFkaXNhYmxlZCgpXCJcbiAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTkwXT1cIiFkaXNhYmxlZCgpXCJcbiAgICAgICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMzBdPVwiIWRpc2FibGVkKClcIlxuICAgICAgICBbY2xhc3MuYm9yZGVyLWdyYXlzY2FsZS0yMF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgW2NsYXNzLmJnLWdyYXlzY2FsZS01XT1cImRpc2FibGVkKClcIlxuICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtMzBdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgIFtjbGFzcy5jdXJzb3ItZGVmYXVsdF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgW2lkXT1cImlucHV0SWQoKVwiXG4gICAgICAgIFtuYW1lXT1cIm5hbWUoKSA/PyBpbnB1dElkKClcIlxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlcigpID8/IChwbGFjZWhvbGRlcktleSgpIHwgdHJhbnNsYXRlKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cIlxuICAgICAgICAgICAgcmVhZG9ubHlJbnB1dCgpIHx8XG4gICAgICAgICAgICBtb2RlKCkgPT09ICdyYW5nZScgfHxcbiAgICAgICAgICAgIG1vZGUoKSA9PT0gJ3llYXInIHx8XG4gICAgICAgICAgICBpc011bHRpcGxlTW9kZSgpIHx8XG4gICAgICAgICAgICAoaXNTZWdtZW50TW9kZUNhbmRpZGF0ZSgpICYmIGlzVG91Y2hEZXZpY2UoKSlcbiAgICAgICAgXCJcbiAgICAgICAgW3RhYkluZGV4XT1cInRhYmluZGV4KCkgPz8gbnVsbFwiXG4gICAgICAgIFthdXRvZm9jdXNdPVwiYXV0b2ZvY3VzKClcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cImlucHV0RGF0ZVwiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImhhbmRsZUlucHV0Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAoZm9jdXMpPVwiaGFuZGxlSW5wdXRGb2N1cygkZXZlbnQpXCJcbiAgICAgICAgKGJsdXIpPVwiaGFuZGxlSW5wdXRCbHVyKCRldmVudClcIlxuICAgICAgICAobW91c2Vkb3duKT1cImhhbmRsZUlucHV0Q2xpY2soJGV2ZW50KVwiXG4gICAgICAgIChrZXlkb3duKT1cImhhbmRsZVRyaWdnZXJLZXlkb3duKCRldmVudClcIlxuICAgICAgICAoaW5wdXQpPVwiaGFuZGxlTmF0aXZlSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJuZ0NvbnRyb2w/LmNvbnRyb2w/LmludmFsaWQgfHwgbnVsbFwiXG4gICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwibW9kZSgpID09PSAncmFuZ2UnID8gcmFuZ2VTdGF0dXNFbGVtZW50SWQoKSA6IG51bGxcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImRpYWxvZ0FyaWFMYWJlbEtleSgpIHwgdHJhbnNsYXRlOiBkaWFsb2dBcmlhTGFiZWxQYXJhbXMoKVwiXG4gICAgLz5cblxuICAgIEBpZiAobW9kZSgpID09PSAncmFuZ2UnKSB7XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cInNyLW9ubHlcIlxuICAgICAgICAgICAgW2lkXT1cInJhbmdlU3RhdHVzRWxlbWVudElkKClcIlxuICAgICAgICAgICAgPnt7IHJhbmdlUGVuZGluZ1N0YXR1c1RleHQoKSB9fTwvc3BhblxuICAgICAgICA+XG4gICAgfVxuXG4gICAgQGlmIChzaG93Q2xlYXIoKSAmJiBpbnB1dERhdGUpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIGZsZXggaC1bMzVweF0gdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0ZXh0LWdyYXlzY2FsZS02MCB0cmFuc2l0aW9uLWNvbG9ycyBob3Zlcjp0ZXh0LWdyYXlzY2FsZS05MFwiXG4gICAgICAgICAgICBbY2xhc3MucmlnaHQtOV09XCJzaG93SWNvbigpXCJcbiAgICAgICAgICAgIFtjbGFzcy5yaWdodC0wXT1cIiFzaG93SWNvbigpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2NsZWFyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS10aW1lcyB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgfVxuXG4gICAgQGlmIChzaG93SWNvbigpKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICNpY29uQnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwidHJpZ2dlci1pY29uIGFic29sdXRlIHJpZ2h0LTAgZmxleCBoLVszNXB4XSB3LTkgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtci1tZWRpdW0gYm9yZGVyIGJvcmRlci1zb2xpZCB0cmFuc2l0aW9uLWNvbG9ycyBkdXJhdGlvbi0yMDAgZWFzZS1vdXRcIlxuICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMjBdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtMzBdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MuY3Vyc29yLWRlZmF1bHRdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MuYm9yZGVyLWdyYXlzY2FsZS0zMF09XCIhZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MuYmctZ3JheXNjYWxlLTBdPVwiIWRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLmJnLWdyYXlzY2FsZS01XT1cImRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTkwXT1cIiFkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5ob3ZlcjpiZy1ncmF5c2NhbGUtNV09XCIhZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9vcGVuJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlKClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlVHJpZ2dlcktleWRvd24oJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cInJlc29sdmVkSWNvbigpXCJcbiAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgfVxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZVxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbl09XCJ0cmlnZ2VyXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwiaXNPcGVuKClcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5SGFzQmFja2Ryb3BdPVwidHJ1ZVwiXG4gICAgY2RrQ29ubmVjdGVkT3ZlcmxheUJhY2tkcm9wQ2xhc3M9XCJjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnNdPVwicG9zaXRpb25zXCJcbiAgICAoYmFja2Ryb3BDbGljayk9XCJoYW5kbGVCYWNrZHJvcENsaWNrKCRldmVudClcIlxuICAgIChvdmVybGF5S2V5ZG93bik9XCJoYW5kbGVPdmVybGF5S2V5ZG93bigkZXZlbnQpXCJcbiAgICAoZGV0YWNoKT1cImlzT3Blbi5zZXQoZmFsc2UpXCJcbj5cbiAgICA8ZGl2XG4gICAgICAgICNwb3B1cFBhbmVsXG4gICAgICAgIGNsYXNzPVwiei01MCB3LTcyIHJvdW5kZWQtbWVkaXVtIGJvcmRlciBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBiZy1ncmF5c2NhbGUtMCBzaGFkb3ctbWRcIlxuICAgICAgICByb2xlPVwiZGlhbG9nXCJcbiAgICAgICAgY2RrVHJhcEZvY3VzXG4gICAgICAgIFtpZF09XCJwb3B1cElkKClcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImRpYWxvZ0FyaWFMYWJlbEtleSgpIHwgdHJhbnNsYXRlOiBkaWFsb2dBcmlhTGFiZWxQYXJhbXMoKVwiXG4gICAgPlxuICAgICAgICBAaWYgKHNob3dDYWxlbmRhcigpKSB7XG4gICAgICAgICAgICBAaWYgKHBpY2tlclZpZXcoKSA9PT0gJ2NhbGVuZGFyJykge1xuICAgICAgICAgICAgICAgIDwhLS0gQ2FiZcOnYWxobyBkZSBuYXZlZ2HDp8OjbyBtZW5zYWwgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBib3JkZXItYiBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBweC0zIHB5LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC03IHctNyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOnRleHQtZ3JheXNjYWxlLTMwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJwcmV2RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInByZXZEaXNhYmxlZCgpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9wcmV2X21vbnRoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyBtb250aDogcHJldk1vbnRoVGFyZ2V0KCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZVByZXYoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1sZWZ0IHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgcm91bmRlZC1zbWFsbCBweC0yIHB5LTEgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X21vbnRoX3llYXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzd2l0Y2hUb01vbnRocygpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgY3VycmVudE1vbnRoS2V5KCkgfCB0cmFuc2xhdGUgfX0mbmJzcDt7eyBjdXJyZW50WWVhcigpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tZG93biB0ZXh0LVsxMHB4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNyB3LTcgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDp0ZXh0LWdyYXlzY2FsZS0zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibmV4dERpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJuZXh0RGlzYWJsZWQoKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbmV4dF9tb250aCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgbW9udGg6IG5leHRNb250aFRhcmdldCgpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVOZXh0KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tcmlnaHQgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBDYWJlw6dhbGhvcyBkb3MgZGlhcyBkYSBzZW1hbmEgLS0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTcgcHgtMyBwdC0yXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cInJvd1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChkYXlLZXkgb2Ygb3JkZXJlZFdlZWtEYXlLZXlzKCk7IHRyYWNrIGRheUtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtNjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjb2x1bW5oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZGF5S2V5IHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXlLZXkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIEdyYWRlIGRvIGNhbGVuZMOhcmlvIC0tPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJncmlkIGdyaWQtY29scy03IHB4LTMgcGItMlwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyR3JpZEFyaWFMYWJlbEtleSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgbW9udGg6IChjdXJyZW50TW9udGhLZXkoKSB8IHRyYW5zbGF0ZSksIHllYXI6IGN1cnJlbnRZZWFyKCkgfVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLW11bHRpc2VsZWN0YWJsZV09XCJtb2RlKCkgPT09ICdyYW5nZScgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZUNhbGVuZGFyR3JpZEtleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAZm9yICh3ZWVrIG9mIGNhbGVuZGFyV2Vla3MoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb250ZW50c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoZGF5IG9mIHdlZWs7IHRyYWNrIGRheS5kYXRlLnRvSVNPU3RyaW5nKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtOCB3LTggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtWzUwJV0gdGV4dC1zbSBmb250LW5vcm1hbCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaW52aXNpYmxlXT1cIiFzaG93T3RoZXJNb250aHMoKSAmJiAhZGF5LmlzQ3VycmVudE1vbnRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZm9ybWF0RGF5QXJpYUxhYmVsKGRheS5kYXRlLCBkYXkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5LmlzU2VsZWN0ZWQgfHwgZGF5LmlzUmFuZ2VTdGFydCB8fCBkYXkuaXNSYW5nZUVuZCB8fCBkYXkuaXNJblJhbmdlIHx8IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWN1cnJlbnRdPVwiZGF5LmlzVG9kYXkgPyAnZGF0ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGF5LmlzRGlzYWJsZWQgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaGlkZGVuXT1cIiFzaG93T3RoZXJNb250aHMoKSAmJiAhZGF5LmlzQ3VycmVudE1vbnRoID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWZvY3VzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheS5pc1NlbGVjdGVkIHx8IGRheS5pc1JhbmdlU3RhcnQgfHwgZGF5LmlzUmFuZ2VFbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc2VsZWN0ZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGF5LmlzVG9kYXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICd0b2RheSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGF5LmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZy1wcmltYXJ5IGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5c2NhbGUtMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheS5pc1NlbGVjdGVkIHx8IGRheS5pc1JhbmdlU3RhcnQgfHwgZGF5LmlzUmFuZ2VFbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JnLWdyYXlzY2FsZS0xMCBob3ZlcjpiZy1ncmF5c2NhbGUtMjAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaXNJblJhbmdlICYmICFkYXkuaXNSYW5nZVN0YXJ0ICYmICFkYXkuaXNSYW5nZUVuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtOTAgaG92ZXI6YmctZ3JheXNjYWxlLTEwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1NlbGVjdGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNSYW5nZVN0YXJ0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNSYW5nZUVuZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzRGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5LmlzQ3VycmVudE1vbnRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS02MCBob3ZlcjpiZy1ncmF5c2NhbGUtMTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzU2VsZWN0ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1JhbmdlU3RhcnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1JhbmdlRW5kICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNEaXNhYmxlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzQ3VycmVudE1vbnRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyaW5nLTIgcmluZy1pbnNldCByaW5nLXByaW1hcnknOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaXNUb2RheSAmJiAhZGF5LmlzU2VsZWN0ZWQgJiYgIWRheS5pc1JhbmdlU3RhcnQgJiYgIWRheS5pc1JhbmdlRW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXJzb3Itbm90LWFsbG93ZWQgdGV4dC1ncmF5c2NhbGUtMzAnOiBkYXkuaXNEaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25EYXlIb3ZlcihkYXkuZGF0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25EYXlIb3ZlcihudWxsKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXMpPVwib25EYXlIb3ZlcihkYXkuZGF0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdERhdGUoZGF5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRheS5kYXlPZk1vbnRoIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBpZiAocGlja2VyVmlldygpID09PSAneWVhcnMnKSB7XG4gICAgICAgICAgICAgICAgPCEtLSBDYWJlw6dhbGhvIGRlIG5hdmVnYcOnw6NvIHBvciBkw6ljYWRhIC0tPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1uYXYtaGVhZGVyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGJvcmRlci1iIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIHB4LTMgcHktMlwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTcgdy03IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6dGV4dC1ncmF5c2NhbGUtMzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInByZXZEaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwicHJldkRpc2FibGVkKCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3ByZXZfZGVjYWRlJyB8IHRyYW5zbGF0ZTogcHJldkRlY2FkZVJhbmdlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVQcmV2KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tbGVmdCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTkwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID57eyBjdXJyZW50RGVjYWRlU3RhcnQoKSB9fSDigJMge3sgY3VycmVudERlY2FkZVN0YXJ0KCkgKyAxMSB9fTwvc3BhblxuICAgICAgICAgICAgICAgICAgICA+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC03IHctNyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOnRleHQtZ3JheXNjYWxlLTMwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJuZXh0RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIm5leHREaXNhYmxlZCgpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9uZXh0X2RlY2FkZScgfCB0cmFuc2xhdGU6IG5leHREZWNhZGVSYW5nZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlTmV4dCgpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXJpZ2h0IHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gR3JhZGUgZGUgYW5vcyAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtMyBnYXAtMiBweC0zIHB5LTNcIlxuICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlbGVjdF95ZWFyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChyb3cgb2YgeWVhcnNHcmlkKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29udGVudHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKHllYXIgb2Ygcm93OyB0cmFjayB5ZWFyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTkgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1zbSBmb250LW5vcm1hbCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzWWVhclNlbGVjdGVkKHllYXIpIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJpc1llYXJEaXNhYmxlZCh5ZWFyKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cImlzQ3VycmVudFllYXIoeWVhcikgPyAnZGF0ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZm9jdXNdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNZZWFyU2VsZWN0ZWQoeWVhcikgPyAnc2VsZWN0ZWQnIDogaXNDdXJyZW50WWVhcih5ZWFyKSA/ICd0b2RheScgOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzWWVhckRpc2FibGVkKHllYXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmctcHJpbWFyeSBmb250LXNlbWlib2xkIHRleHQtZ3JheXNjYWxlLTAnOiBpc1llYXJTZWxlY3RlZCh5ZWFyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmluZy0yIHJpbmctaW5zZXQgcmluZy1wcmltYXJ5JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDdXJyZW50WWVhcih5ZWFyKSAmJiAhaXNZZWFyU2VsZWN0ZWQoeWVhcikgJiYgIWlzWWVhckRpc2FibGVkKHllYXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS05MCBob3ZlcjpiZy1ncmF5c2NhbGUtMTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNZZWFyU2VsZWN0ZWQoeWVhcikgJiYgIWlzWWVhckRpc2FibGVkKHllYXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXJzb3Itbm90LWFsbG93ZWQgdGV4dC1ncmF5c2NhbGUtMzAnOiBpc1llYXJEaXNhYmxlZCh5ZWFyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFllYXIoeWVhcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB5ZWFyIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBpZiAocGlja2VyVmlldygpID09PSAnbW9udGhzJykge1xuICAgICAgICAgICAgICAgIDwhLS0gQ2FiZcOnYWxobyBkZSBuYXZlZ2HDp8OjbyBhbnVhbCAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGRhdGEtbmF2LWhlYWRlclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBib3JkZXItYiBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBweC0zIHB5LTJcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC03IHctNyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOnRleHQtZ3JheXNjYWxlLTMwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJwcmV2RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInByZXZEaXNhYmxlZCgpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9wcmV2X3llYXInIHwgdHJhbnNsYXRlOiB7IHllYXI6IHByZXZZZWFyVGFyZ2V0KCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZVByZXYoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1sZWZ0IHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtOTBcIj57eyBjdXJyZW50WWVhcigpIH19PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNyB3LTcgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDp0ZXh0LWdyYXlzY2FsZS0zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibmV4dERpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJuZXh0RGlzYWJsZWQoKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbmV4dF95ZWFyJyB8IHRyYW5zbGF0ZTogeyB5ZWFyOiBuZXh0WWVhclRhcmdldCgpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVOZXh0KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tcmlnaHQgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBHcmFkZSBkZSBtZXNlcyAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtMyBnYXAtMiBweC0zIHB5LTNcIlxuICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlbGVjdF9tb250aCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAocm93IG9mIG1vbnRoc0dyaWQoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb250ZW50c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAobW9udGggb2Ygcm93OyB0cmFjayBtb250aC5pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC05IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtc20gZm9udC1ub3JtYWwgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc01vbnRoU2VsZWN0ZWQobW9udGguaW5kZXgpIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJpc01vbnRoRGlzYWJsZWQobW9udGguaW5kZXgpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWZvY3VzXT1cImlzTW9udGhTZWxlY3RlZChtb250aC5pbmRleCkgPyAnc2VsZWN0ZWQnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNNb250aERpc2FibGVkKG1vbnRoLmluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JnLXByaW1hcnkgZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXlzY2FsZS0wJzogaXNNb250aFNlbGVjdGVkKG1vbnRoLmluZGV4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtOTAgaG92ZXI6YmctZ3JheXNjYWxlLTEwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzTW9udGhTZWxlY3RlZChtb250aC5pbmRleCkgJiYgIWlzTW9udGhEaXNhYmxlZChtb250aC5pbmRleCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N1cnNvci1ub3QtYWxsb3dlZCB0ZXh0LWdyYXlzY2FsZS0zMCc6IGlzTW9udGhEaXNhYmxlZChtb250aC5pbmRleCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RNb250aChtb250aC5pbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBtb250aC5rZXkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIEBpZiAobW9kZSgpICE9PSAnbW9udGgnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3JkZXItdCBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBweC0zIHB5LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtc21hbGwgcHgtMiBweS0xIHRleHQtc20gdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYmFja1RvQ2FsZW5kYXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtYXJyb3ctbGVmdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfYmFja190b19jYWxlbmRhcicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIFRpbWUgcGlja2VyIC0tPlxuICAgICAgICBAaWYgKHNob3dUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0zIHB4LTQgcHktM1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci10XT1cInNob3dDYWxlbmRhcigpXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYm9yZGVyLXNvbGlkXT1cInNob3dDYWxlbmRhcigpXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYm9yZGVyLWdyYXlzY2FsZS0zMF09XCJzaG93Q2FsZW5kYXIoKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X3RpbWUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8IS0tIEhvcmFzIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAjaW5jcmVhc2VIb3VyQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTYgdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9pbmNyZW1lbnRfaG91cidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgdGltZTogbmV4dEhvdXJUYXJnZXQoKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImluY3JlbWVudEhvdXJzKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tdXAgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0bW9kZT1cIm51bWVyaWNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIubWF4bGVuZ3RoXT1cInRpbWVJbnB1dE1heExlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImgtOSB3LTEyIHJvdW5kZWQtc21hbGwgYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS01IHRleHQtY2VudGVyIHRleHQtYmFzZSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MCBvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpvdXRsaW5lIGZvY3VzLXZpc2libGU6b3V0bGluZS0yIGZvY3VzLXZpc2libGU6b3V0bGluZS1vZmZzZXQtWy0ycHhdIGZvY3VzLXZpc2libGU6b3V0bGluZS1bdmFyKC0tcy1mb2N1cy1yaW5nLWNvbG9yLCMwMDkwZmYpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwicGFkVGltZShkaXNwbGF5SG91cnMoKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfaG91cicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm49XCJbMC05XStcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlSG91cnNLZXlkb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJoYW5kbGVIb3Vyc0lucHV0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTYgdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kZWNyZW1lbnRfaG91cidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgdGltZTogcHJldkhvdXJUYXJnZXQoKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlY3JlbWVudEhvdXJzKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tZG93biB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQteGwgZm9udC1ib2xkIHRleHQtZ3JheXNjYWxlLTYwXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgPjo8L3NwYW5cbiAgICAgICAgICAgICAgICA+XG5cbiAgICAgICAgICAgICAgICA8IS0tIE1pbnV0b3MgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNiB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2luY3JlbWVudF9taW51dGUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IHRpbWU6IG5leHRNaW51dGVUYXJnZXQoKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImluY3JlbWVudE1pbnV0ZXMoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi11cCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRtb2RlPVwibnVtZXJpY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5tYXhsZW5ndGhdPVwidGltZUlucHV0TWF4TGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC05IHctMTIgcm91bmRlZC1zbWFsbCBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgYmctZ3JheXNjYWxlLTUgdGV4dC1jZW50ZXIgdGV4dC1iYXNlIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTkwIG91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOm91dGxpbmUgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLTIgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW9mZnNldC1bLTJweF0gZm9jdXMtdmlzaWJsZTpvdXRsaW5lLVt2YXIoLS1zLWZvY3VzLXJpbmctY29sb3IsIzAwOTBmZildXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJwYWRUaW1lKG1pbnV0ZXMoKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbWludXRlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybj1cIlswLTldK1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVNaW51dGVzS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlTWludXRlc0lucHV0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTYgdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kZWNyZW1lbnRfbWludXRlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyB0aW1lOiBwcmV2TWludXRlVGFyZ2V0KCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWNyZW1lbnRNaW51dGVzKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tZG93biB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICBAaWYgKHNob3dTZWNvbmRzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC14bCBmb250LWJvbGQgdGV4dC1ncmF5c2NhbGUtNjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID46PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIFNlZ3VuZG9zIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9pbmNyZW1lbnRfc2Vjb25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgdGltZTogbmV4dFNlY29uZFRhcmdldCgpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpbmNyZW1lbnRTZWNvbmRzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tdXAgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0bW9kZT1cIm51bWVyaWNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLm1heGxlbmd0aF09XCJ0aW1lSW5wdXRNYXhMZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC05IHctMTIgcm91bmRlZC1zbWFsbCBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgYmctZ3JheXNjYWxlLTUgdGV4dC1jZW50ZXIgdGV4dC1iYXNlIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTkwIG91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOm91dGxpbmUgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLTIgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW9mZnNldC1bLTJweF0gZm9jdXMtdmlzaWJsZTpvdXRsaW5lLVt2YXIoLS1zLWZvY3VzLXJpbmctY29sb3IsIzAwOTBmZildXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwicGFkVGltZShzZWNvbmRzKCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWNvbmQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm49XCJbMC05XStcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZVNlY29uZHNLZXlkb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlU2Vjb25kc0lucHV0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kZWNyZW1lbnRfc2Vjb25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgdGltZTogcHJldlNlY29uZFRhcmdldCgpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWNyZW1lbnRTZWNvbmRzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tZG93biB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIEBpZiAoaXMxMkhvdXJGb3JtYXQoKSkge1xuICAgICAgICAgICAgICAgICAgICA8IS0tIFNlbGV0b3IgQU0vUE0gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtOSB3LTEyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIGJvcmRlciBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBiZy1ncmF5c2NhbGUtNSB0ZXh0LWJhc2UgZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3RvZ2dsZV9tZXJpZGllbSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgbWVyaWRpZW06IG5leHRNZXJpZGllbVRhcmdldCgpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUFtUG0oKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFtUG0oKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gUm9kYXDDqSBkZSBhw6fDtWVzIC0tPlxuICAgICAgICBAaWYgKHNob3dCdXR0b25CYXIoKSB8fCBtb2RlKCkgPT09ICdkYXRldGltZScgfHwgbW9kZSgpID09PSAndGltZScpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLXQgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcHgtMyBweS0yXCI+XG4gICAgICAgICAgICAgICAgQGlmIChzaG93QnV0dG9uQmFyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAobW9kZSgpID09PSAnZGF0ZScgfHwgbW9kZSgpID09PSAnZGF0ZXRpbWUnIHx8IG1vZGUoKSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm91bmRlZC1zbWFsbCBweC0yIHB5LTEgdGV4dC1zbSB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VG9kYXkoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfdG9kYXknIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLXNtYWxsIHB4LTIgcHktMSB0ZXh0LXNtIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyVmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2NsZWFyJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAobW9kZSgpID09PSAnZGF0ZXRpbWUnIHx8IG1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLXNtYWxsIGJnLXByaW1hcnkgcHgtMyBweS0xIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtMCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpvcGFjaXR5LTkwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbmZpcm0oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY29uZmlybScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG1vZGUoKSA9PT0gJ2RhdGV0aW1lJyB8fCBtb2RlKCkgPT09ICd0aW1lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm91bmRlZC1zbWFsbCBiZy1wcmltYXJ5IHB4LTMgcHktMSB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6b3BhY2l0eS05MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb25maXJtKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2NvbmZpcm0nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG4iXX0=
|