@sidekick-coder/zenith-kit 0.0.13 → 0.0.14
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/bin/zenith.js +2 -3
- package/cli/commands/generateLegacyFolder.js +38 -0
- package/cli/commands/generatePluginId.js +17 -0
- package/cli/utils/createWrapper.js +4 -7
- package/dist/client/index.d.mts +70 -5
- package/dist/client/index.mjs +2 -2
- package/dist/components/index.es.js +20025 -21787
- package/dist/components/styles.css +81 -4
- package/dist/server/index.d.mts +1425 -387
- package/dist/server/index.mjs +5 -5
- package/dist/shared/index.d.mts +217 -3
- package/dist/shared/index.mjs +2 -2
- package/legacy/client/components/Alert.vue +3 -0
- package/legacy/client/components/AlertButton.vue +3 -0
- package/legacy/client/components/Button.vue +3 -0
- package/legacy/client/components/ClientOnly.vue +3 -0
- package/legacy/client/components/ColorPicker.vue +3 -0
- package/legacy/client/components/ColorWheel.vue +3 -0
- package/legacy/client/components/Component.vue +3 -0
- package/legacy/client/components/DataTable.vue +4 -0
- package/legacy/client/components/DataTablePagination.vue +3 -0
- package/legacy/client/components/DatePicker.vue +3 -0
- package/legacy/client/components/DialogForm.vue +4 -0
- package/legacy/client/components/FileUploader.vue +3 -0
- package/legacy/client/components/FormAutoFieldList.vue +3 -0
- package/legacy/client/components/FormAutocomplete.vue +3 -0
- package/legacy/client/components/FormColorPicker.vue +3 -0
- package/legacy/client/components/FormDatePicker.vue +3 -0
- package/legacy/client/components/FormFilePicker.vue +3 -0
- package/legacy/client/components/FormFileUploader.vue +3 -0
- package/legacy/client/components/FormImageUploader.vue +3 -0
- package/legacy/client/components/FormJsonInput.vue +3 -0
- package/legacy/client/components/FormSelect.vue +3 -0
- package/legacy/client/components/FormStringListInput.vue +3 -0
- package/legacy/client/components/FormSwitch.vue +3 -0
- package/legacy/client/components/FormTextField.vue +3 -0
- package/legacy/client/components/FormTextarea.vue +3 -0
- package/legacy/client/components/Icon.vue +3 -0
- package/legacy/client/components/Image.vue +3 -0
- package/legacy/client/components/JsonInput.vue +3 -0
- package/legacy/client/components/Logo.vue +3 -0
- package/legacy/client/components/LogoIcon.vue +3 -0
- package/legacy/client/components/ObjectInspect.vue +3 -0
- package/legacy/client/components/PageCrud.vue +3 -0
- package/legacy/client/components/PageSubtitle.vue +3 -0
- package/legacy/client/components/PageTable.vue +3 -0
- package/legacy/client/components/PageTitle.vue +3 -0
- package/legacy/client/components/Pagination.vue +3 -0
- package/legacy/client/components/Select.vue +3 -0
- package/legacy/client/components/StringListInput.vue +3 -0
- package/legacy/client/components/Switch.vue +3 -0
- package/legacy/client/components/TextField.vue +3 -0
- package/legacy/client/components/Textarea.vue +3 -0
- package/legacy/client/components/UserMenu.vue +3 -0
- package/legacy/client/components/index.ts +349 -0
- package/legacy/client/components/ui/accordion/Accordion.vue +3 -0
- package/legacy/client/components/ui/accordion/AccordionContent.vue +3 -0
- package/legacy/client/components/ui/accordion/AccordionItem.vue +3 -0
- package/legacy/client/components/ui/accordion/AccordionTrigger.vue +3 -0
- package/legacy/client/components/ui/accordion/index.ts +1 -0
- package/legacy/client/components/ui/alert/Alert.vue +3 -0
- package/legacy/client/components/ui/alert/AlertDescription.vue +3 -0
- package/legacy/client/components/ui/alert/AlertTitle.vue +3 -0
- package/legacy/client/components/ui/alert/index.ts +1 -0
- package/legacy/client/components/ui/alert-dialog/AlertDialog.vue +3 -0
- package/legacy/client/components/ui/alert-dialog/AlertDialogAction.vue +3 -0
- package/legacy/client/components/ui/alert-dialog/AlertDialogCancel.vue +3 -0
- package/legacy/client/components/ui/alert-dialog/AlertDialogContent.vue +3 -0
- package/legacy/client/components/ui/alert-dialog/AlertDialogDescription.vue +3 -0
- package/legacy/client/components/ui/alert-dialog/AlertDialogFooter.vue +3 -0
- package/legacy/client/components/ui/alert-dialog/AlertDialogHeader.vue +3 -0
- package/legacy/client/components/ui/alert-dialog/AlertDialogTitle.vue +3 -0
- package/legacy/client/components/ui/alert-dialog/AlertDialogTrigger.vue +3 -0
- package/legacy/client/components/ui/alert-dialog/index.ts +1 -0
- package/legacy/client/components/ui/aspect-ratio/AspectRatio.vue +3 -0
- package/legacy/client/components/ui/aspect-ratio/index.ts +1 -0
- package/legacy/client/components/ui/avatar/Avatar.vue +3 -0
- package/legacy/client/components/ui/avatar/AvatarFallback.vue +3 -0
- package/legacy/client/components/ui/avatar/AvatarImage.vue +3 -0
- package/legacy/client/components/ui/avatar/index.ts +1 -0
- package/legacy/client/components/ui/badge/Badge.vue +3 -0
- package/legacy/client/components/ui/badge/index.ts +1 -0
- package/legacy/client/components/ui/breadcrumb/Breadcrumb.vue +3 -0
- package/legacy/client/components/ui/breadcrumb/BreadcrumbEllipsis.vue +3 -0
- package/legacy/client/components/ui/breadcrumb/BreadcrumbItem.vue +3 -0
- package/legacy/client/components/ui/breadcrumb/BreadcrumbLink.vue +3 -0
- package/legacy/client/components/ui/breadcrumb/BreadcrumbList.vue +3 -0
- package/legacy/client/components/ui/breadcrumb/BreadcrumbPage.vue +3 -0
- package/legacy/client/components/ui/breadcrumb/BreadcrumbSeparator.vue +3 -0
- package/legacy/client/components/ui/breadcrumb/index.ts +1 -0
- package/legacy/client/components/ui/button/Button.vue +3 -0
- package/legacy/client/components/ui/button/index.ts +1 -0
- package/legacy/client/components/ui/calendar/Calendar.vue +3 -0
- package/legacy/client/components/ui/calendar/CalendarCell.vue +3 -0
- package/legacy/client/components/ui/calendar/CalendarCellTrigger.vue +3 -0
- package/legacy/client/components/ui/calendar/CalendarGrid.vue +3 -0
- package/legacy/client/components/ui/calendar/CalendarGridBody.vue +3 -0
- package/legacy/client/components/ui/calendar/CalendarGridHead.vue +3 -0
- package/legacy/client/components/ui/calendar/CalendarGridRow.vue +3 -0
- package/legacy/client/components/ui/calendar/CalendarHeadCell.vue +3 -0
- package/legacy/client/components/ui/calendar/CalendarHeader.vue +3 -0
- package/legacy/client/components/ui/calendar/CalendarHeading.vue +3 -0
- package/legacy/client/components/ui/calendar/CalendarNextButton.vue +3 -0
- package/legacy/client/components/ui/calendar/CalendarPrevButton.vue +3 -0
- package/legacy/client/components/ui/calendar/index.ts +1 -0
- package/legacy/client/components/ui/card/Card.vue +3 -0
- package/legacy/client/components/ui/card/CardAction.vue +3 -0
- package/legacy/client/components/ui/card/CardContent.vue +3 -0
- package/legacy/client/components/ui/card/CardDescription.vue +3 -0
- package/legacy/client/components/ui/card/CardFooter.vue +3 -0
- package/legacy/client/components/ui/card/CardHeader.vue +3 -0
- package/legacy/client/components/ui/card/CardTitle.vue +3 -0
- package/legacy/client/components/ui/card/index.ts +1 -0
- package/legacy/client/components/ui/carousel/Carousel.vue +3 -0
- package/legacy/client/components/ui/carousel/CarouselContent.vue +3 -0
- package/legacy/client/components/ui/carousel/CarouselItem.vue +3 -0
- package/legacy/client/components/ui/carousel/CarouselNext.vue +3 -0
- package/legacy/client/components/ui/carousel/CarouselPrevious.vue +3 -0
- package/legacy/client/components/ui/carousel/index.ts +1 -0
- package/legacy/client/components/ui/checkbox/Checkbox.vue +3 -0
- package/legacy/client/components/ui/checkbox/index.ts +1 -0
- package/legacy/client/components/ui/collapsible/Collapsible.vue +3 -0
- package/legacy/client/components/ui/collapsible/CollapsibleContent.vue +3 -0
- package/legacy/client/components/ui/collapsible/CollapsibleTrigger.vue +3 -0
- package/legacy/client/components/ui/collapsible/index.ts +1 -0
- package/legacy/client/components/ui/combobox/Combobox.vue +3 -0
- package/legacy/client/components/ui/combobox/ComboboxAnchor.vue +3 -0
- package/legacy/client/components/ui/combobox/ComboboxEmpty.vue +3 -0
- package/legacy/client/components/ui/combobox/ComboboxGroup.vue +3 -0
- package/legacy/client/components/ui/combobox/ComboboxInput.vue +3 -0
- package/legacy/client/components/ui/combobox/ComboboxItem.vue +3 -0
- package/legacy/client/components/ui/combobox/ComboboxItemIndicator.vue +3 -0
- package/legacy/client/components/ui/combobox/ComboboxList.vue +3 -0
- package/legacy/client/components/ui/combobox/ComboboxSeparator.vue +3 -0
- package/legacy/client/components/ui/combobox/ComboboxTrigger.vue +3 -0
- package/legacy/client/components/ui/combobox/ComboboxViewport.vue +3 -0
- package/legacy/client/components/ui/combobox/index.ts +1 -0
- package/legacy/client/components/ui/command/Command.vue +3 -0
- package/legacy/client/components/ui/command/CommandDialog.vue +3 -0
- package/legacy/client/components/ui/command/CommandEmpty.vue +3 -0
- package/legacy/client/components/ui/command/CommandGroup.vue +3 -0
- package/legacy/client/components/ui/command/CommandInput.vue +3 -0
- package/legacy/client/components/ui/command/CommandItem.vue +3 -0
- package/legacy/client/components/ui/command/CommandList.vue +3 -0
- package/legacy/client/components/ui/command/CommandSeparator.vue +3 -0
- package/legacy/client/components/ui/command/CommandShortcut.vue +3 -0
- package/legacy/client/components/ui/command/index.ts +1 -0
- package/legacy/client/components/ui/context-menu/ContextMenu.vue +3 -0
- package/legacy/client/components/ui/context-menu/ContextMenuCheckboxItem.vue +3 -0
- package/legacy/client/components/ui/context-menu/ContextMenuContent.vue +3 -0
- package/legacy/client/components/ui/context-menu/ContextMenuGroup.vue +3 -0
- package/legacy/client/components/ui/context-menu/ContextMenuItem.vue +3 -0
- package/legacy/client/components/ui/context-menu/ContextMenuLabel.vue +3 -0
- package/legacy/client/components/ui/context-menu/ContextMenuPortal.vue +3 -0
- package/legacy/client/components/ui/context-menu/ContextMenuRadioGroup.vue +3 -0
- package/legacy/client/components/ui/context-menu/ContextMenuRadioItem.vue +3 -0
- package/legacy/client/components/ui/context-menu/ContextMenuSeparator.vue +3 -0
- package/legacy/client/components/ui/context-menu/ContextMenuShortcut.vue +3 -0
- package/legacy/client/components/ui/context-menu/ContextMenuSub.vue +3 -0
- package/legacy/client/components/ui/context-menu/ContextMenuSubContent.vue +3 -0
- package/legacy/client/components/ui/context-menu/ContextMenuSubTrigger.vue +3 -0
- package/legacy/client/components/ui/context-menu/ContextMenuTrigger.vue +3 -0
- package/legacy/client/components/ui/context-menu/index.ts +1 -0
- package/legacy/client/components/ui/dialog/Dialog.vue +3 -0
- package/legacy/client/components/ui/dialog/DialogClose.vue +3 -0
- package/legacy/client/components/ui/dialog/DialogContent.vue +3 -0
- package/legacy/client/components/ui/dialog/DialogDescription.vue +3 -0
- package/legacy/client/components/ui/dialog/DialogFooter.vue +3 -0
- package/legacy/client/components/ui/dialog/DialogHeader.vue +3 -0
- package/legacy/client/components/ui/dialog/DialogOverlay.vue +3 -0
- package/legacy/client/components/ui/dialog/DialogScrollContent.vue +3 -0
- package/legacy/client/components/ui/dialog/DialogTitle.vue +3 -0
- package/legacy/client/components/ui/dialog/DialogTrigger.vue +3 -0
- package/legacy/client/components/ui/dialog/index.ts +1 -0
- package/legacy/client/components/ui/drawer/Drawer.vue +3 -0
- package/legacy/client/components/ui/drawer/DrawerClose.vue +3 -0
- package/legacy/client/components/ui/drawer/DrawerContent.vue +3 -0
- package/legacy/client/components/ui/drawer/DrawerDescription.vue +3 -0
- package/legacy/client/components/ui/drawer/DrawerFooter.vue +3 -0
- package/legacy/client/components/ui/drawer/DrawerHeader.vue +3 -0
- package/legacy/client/components/ui/drawer/DrawerOverlay.vue +3 -0
- package/legacy/client/components/ui/drawer/DrawerTitle.vue +3 -0
- package/legacy/client/components/ui/drawer/DrawerTrigger.vue +3 -0
- package/legacy/client/components/ui/drawer/index.ts +1 -0
- package/legacy/client/components/ui/dropdown-menu/DropdownMenu.vue +3 -0
- package/legacy/client/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +3 -0
- package/legacy/client/components/ui/dropdown-menu/DropdownMenuContent.vue +3 -0
- package/legacy/client/components/ui/dropdown-menu/DropdownMenuGroup.vue +3 -0
- package/legacy/client/components/ui/dropdown-menu/DropdownMenuItem.vue +3 -0
- package/legacy/client/components/ui/dropdown-menu/DropdownMenuLabel.vue +3 -0
- package/legacy/client/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +3 -0
- package/legacy/client/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +3 -0
- package/legacy/client/components/ui/dropdown-menu/DropdownMenuSeparator.vue +3 -0
- package/legacy/client/components/ui/dropdown-menu/DropdownMenuShortcut.vue +3 -0
- package/legacy/client/components/ui/dropdown-menu/DropdownMenuSub.vue +3 -0
- package/legacy/client/components/ui/dropdown-menu/DropdownMenuSubContent.vue +3 -0
- package/legacy/client/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +3 -0
- package/legacy/client/components/ui/dropdown-menu/DropdownMenuTrigger.vue +3 -0
- package/legacy/client/components/ui/dropdown-menu/index.ts +1 -0
- package/legacy/client/components/ui/form/FormControl.vue +3 -0
- package/legacy/client/components/ui/form/FormDescription.vue +3 -0
- package/legacy/client/components/ui/form/FormItem.vue +3 -0
- package/legacy/client/components/ui/form/FormLabel.vue +3 -0
- package/legacy/client/components/ui/form/FormMessage.vue +3 -0
- package/legacy/client/components/ui/form/index.ts +1 -0
- package/legacy/client/components/ui/hover-card/HoverCard.vue +3 -0
- package/legacy/client/components/ui/hover-card/HoverCardContent.vue +3 -0
- package/legacy/client/components/ui/hover-card/HoverCardTrigger.vue +3 -0
- package/legacy/client/components/ui/hover-card/index.ts +1 -0
- package/legacy/client/components/ui/input/Input.vue +3 -0
- package/legacy/client/components/ui/input/index.ts +1 -0
- package/legacy/client/components/ui/label/Label.vue +3 -0
- package/legacy/client/components/ui/label/index.ts +1 -0
- package/legacy/client/components/ui/menubar/Menubar.vue +3 -0
- package/legacy/client/components/ui/menubar/MenubarCheckboxItem.vue +3 -0
- package/legacy/client/components/ui/menubar/MenubarContent.vue +3 -0
- package/legacy/client/components/ui/menubar/MenubarGroup.vue +3 -0
- package/legacy/client/components/ui/menubar/MenubarItem.vue +3 -0
- package/legacy/client/components/ui/menubar/MenubarLabel.vue +3 -0
- package/legacy/client/components/ui/menubar/MenubarMenu.vue +3 -0
- package/legacy/client/components/ui/menubar/MenubarRadioGroup.vue +3 -0
- package/legacy/client/components/ui/menubar/MenubarRadioItem.vue +3 -0
- package/legacy/client/components/ui/menubar/MenubarSeparator.vue +3 -0
- package/legacy/client/components/ui/menubar/MenubarShortcut.vue +3 -0
- package/legacy/client/components/ui/menubar/MenubarSub.vue +3 -0
- package/legacy/client/components/ui/menubar/MenubarSubContent.vue +3 -0
- package/legacy/client/components/ui/menubar/MenubarSubTrigger.vue +3 -0
- package/legacy/client/components/ui/menubar/MenubarTrigger.vue +3 -0
- package/legacy/client/components/ui/menubar/index.ts +1 -0
- package/legacy/client/components/ui/navigation-menu/NavigationMenu.vue +3 -0
- package/legacy/client/components/ui/navigation-menu/NavigationMenuContent.vue +3 -0
- package/legacy/client/components/ui/navigation-menu/NavigationMenuIndicator.vue +3 -0
- package/legacy/client/components/ui/navigation-menu/NavigationMenuItem.vue +3 -0
- package/legacy/client/components/ui/navigation-menu/NavigationMenuLink.vue +3 -0
- package/legacy/client/components/ui/navigation-menu/NavigationMenuList.vue +3 -0
- package/legacy/client/components/ui/navigation-menu/NavigationMenuTrigger.vue +3 -0
- package/legacy/client/components/ui/navigation-menu/NavigationMenuViewport.vue +3 -0
- package/legacy/client/components/ui/navigation-menu/index.ts +1 -0
- package/legacy/client/components/ui/number-field/NumberField.vue +3 -0
- package/legacy/client/components/ui/number-field/NumberFieldContent.vue +3 -0
- package/legacy/client/components/ui/number-field/NumberFieldDecrement.vue +3 -0
- package/legacy/client/components/ui/number-field/NumberFieldIncrement.vue +3 -0
- package/legacy/client/components/ui/number-field/NumberFieldInput.vue +3 -0
- package/legacy/client/components/ui/number-field/index.ts +1 -0
- package/legacy/client/components/ui/pagination/Pagination.vue +3 -0
- package/legacy/client/components/ui/pagination/PaginationContent.vue +3 -0
- package/legacy/client/components/ui/pagination/PaginationEllipsis.vue +3 -0
- package/legacy/client/components/ui/pagination/PaginationFirst.vue +3 -0
- package/legacy/client/components/ui/pagination/PaginationItem.vue +3 -0
- package/legacy/client/components/ui/pagination/PaginationLast.vue +3 -0
- package/legacy/client/components/ui/pagination/PaginationNext.vue +3 -0
- package/legacy/client/components/ui/pagination/PaginationPrevious.vue +3 -0
- package/legacy/client/components/ui/pagination/index.ts +1 -0
- package/legacy/client/components/ui/pin-input/PinInput.vue +3 -0
- package/legacy/client/components/ui/pin-input/PinInputGroup.vue +3 -0
- package/legacy/client/components/ui/pin-input/PinInputSeparator.vue +3 -0
- package/legacy/client/components/ui/pin-input/PinInputSlot.vue +3 -0
- package/legacy/client/components/ui/pin-input/index.ts +1 -0
- package/legacy/client/components/ui/popover/Popover.vue +3 -0
- package/legacy/client/components/ui/popover/PopoverAnchor.vue +3 -0
- package/legacy/client/components/ui/popover/PopoverContent.vue +3 -0
- package/legacy/client/components/ui/popover/PopoverTrigger.vue +3 -0
- package/legacy/client/components/ui/popover/index.ts +1 -0
- package/legacy/client/components/ui/progress/Progress.vue +3 -0
- package/legacy/client/components/ui/progress/index.ts +1 -0
- package/legacy/client/components/ui/radio-group/RadioGroup.vue +3 -0
- package/legacy/client/components/ui/radio-group/RadioGroupItem.vue +3 -0
- package/legacy/client/components/ui/radio-group/index.ts +1 -0
- package/legacy/client/components/ui/range-calendar/RangeCalendar.vue +3 -0
- package/legacy/client/components/ui/range-calendar/RangeCalendarCell.vue +3 -0
- package/legacy/client/components/ui/range-calendar/RangeCalendarCellTrigger.vue +3 -0
- package/legacy/client/components/ui/range-calendar/RangeCalendarGrid.vue +3 -0
- package/legacy/client/components/ui/range-calendar/RangeCalendarGridBody.vue +3 -0
- package/legacy/client/components/ui/range-calendar/RangeCalendarGridHead.vue +3 -0
- package/legacy/client/components/ui/range-calendar/RangeCalendarGridRow.vue +3 -0
- package/legacy/client/components/ui/range-calendar/RangeCalendarHeadCell.vue +3 -0
- package/legacy/client/components/ui/range-calendar/RangeCalendarHeader.vue +3 -0
- package/legacy/client/components/ui/range-calendar/RangeCalendarHeading.vue +3 -0
- package/legacy/client/components/ui/range-calendar/RangeCalendarNextButton.vue +3 -0
- package/legacy/client/components/ui/range-calendar/RangeCalendarPrevButton.vue +3 -0
- package/legacy/client/components/ui/range-calendar/index.ts +1 -0
- package/legacy/client/components/ui/resizable/ResizableHandle.vue +3 -0
- package/legacy/client/components/ui/resizable/ResizablePanel.vue +3 -0
- package/legacy/client/components/ui/resizable/ResizablePanelGroup.vue +3 -0
- package/legacy/client/components/ui/resizable/index.ts +1 -0
- package/legacy/client/components/ui/scroll-area/ScrollArea.vue +3 -0
- package/legacy/client/components/ui/scroll-area/ScrollBar.vue +3 -0
- package/legacy/client/components/ui/scroll-area/index.ts +1 -0
- package/legacy/client/components/ui/select/Select.vue +3 -0
- package/legacy/client/components/ui/select/SelectContent.vue +3 -0
- package/legacy/client/components/ui/select/SelectGroup.vue +3 -0
- package/legacy/client/components/ui/select/SelectItem.vue +3 -0
- package/legacy/client/components/ui/select/SelectItemText.vue +3 -0
- package/legacy/client/components/ui/select/SelectLabel.vue +3 -0
- package/legacy/client/components/ui/select/SelectScrollDownButton.vue +3 -0
- package/legacy/client/components/ui/select/SelectScrollUpButton.vue +3 -0
- package/legacy/client/components/ui/select/SelectSeparator.vue +3 -0
- package/legacy/client/components/ui/select/SelectTrigger.vue +3 -0
- package/legacy/client/components/ui/select/SelectValue.vue +3 -0
- package/legacy/client/components/ui/select/index.ts +1 -0
- package/legacy/client/components/ui/separator/Separator.vue +3 -0
- package/legacy/client/components/ui/separator/index.ts +1 -0
- package/legacy/client/components/ui/sheet/Sheet.vue +3 -0
- package/legacy/client/components/ui/sheet/SheetClose.vue +3 -0
- package/legacy/client/components/ui/sheet/SheetContent.vue +3 -0
- package/legacy/client/components/ui/sheet/SheetDescription.vue +3 -0
- package/legacy/client/components/ui/sheet/SheetFooter.vue +3 -0
- package/legacy/client/components/ui/sheet/SheetHeader.vue +3 -0
- package/legacy/client/components/ui/sheet/SheetOverlay.vue +3 -0
- package/legacy/client/components/ui/sheet/SheetTitle.vue +3 -0
- package/legacy/client/components/ui/sheet/SheetTrigger.vue +3 -0
- package/legacy/client/components/ui/sheet/index.ts +1 -0
- package/legacy/client/components/ui/sidebar/Sidebar.vue +3 -0
- package/legacy/client/components/ui/sidebar/SidebarContent.vue +3 -0
- package/legacy/client/components/ui/sidebar/SidebarFooter.vue +3 -0
- package/legacy/client/components/ui/sidebar/SidebarGroup.vue +3 -0
- package/legacy/client/components/ui/sidebar/SidebarGroupAction.vue +3 -0
- package/legacy/client/components/ui/sidebar/SidebarGroupContent.vue +3 -0
- package/legacy/client/components/ui/sidebar/SidebarGroupLabel.vue +3 -0
- package/legacy/client/components/ui/sidebar/SidebarHeader.vue +3 -0
- package/legacy/client/components/ui/sidebar/SidebarInput.vue +3 -0
- package/legacy/client/components/ui/sidebar/SidebarInset.vue +3 -0
- package/legacy/client/components/ui/sidebar/SidebarMenu.vue +3 -0
- package/legacy/client/components/ui/sidebar/SidebarMenuAction.vue +3 -0
- package/legacy/client/components/ui/sidebar/SidebarMenuBadge.vue +3 -0
- package/legacy/client/components/ui/sidebar/SidebarMenuButton.vue +3 -0
- package/legacy/client/components/ui/sidebar/SidebarMenuButtonChild.vue +3 -0
- package/legacy/client/components/ui/sidebar/SidebarMenuItem.vue +3 -0
- package/legacy/client/components/ui/sidebar/SidebarMenuSkeleton.vue +3 -0
- package/legacy/client/components/ui/sidebar/SidebarMenuSub.vue +3 -0
- package/legacy/client/components/ui/sidebar/SidebarMenuSubButton.vue +3 -0
- package/legacy/client/components/ui/sidebar/SidebarMenuSubItem.vue +3 -0
- package/legacy/client/components/ui/sidebar/SidebarProvider.vue +3 -0
- package/legacy/client/components/ui/sidebar/SidebarRail.vue +3 -0
- package/legacy/client/components/ui/sidebar/SidebarSeparator.vue +3 -0
- package/legacy/client/components/ui/sidebar/SidebarTrigger.vue +3 -0
- package/legacy/client/components/ui/sidebar/index.ts +1 -0
- package/legacy/client/components/ui/skeleton/Skeleton.vue +3 -0
- package/legacy/client/components/ui/skeleton/index.ts +1 -0
- package/legacy/client/components/ui/slider/Slider.vue +3 -0
- package/legacy/client/components/ui/slider/index.ts +1 -0
- package/legacy/client/components/ui/sonner/Sonner.vue +3 -0
- package/legacy/client/components/ui/sonner/index.ts +1 -0
- package/legacy/client/components/ui/stepper/Stepper.vue +3 -0
- package/legacy/client/components/ui/stepper/StepperDescription.vue +3 -0
- package/legacy/client/components/ui/stepper/StepperIndicator.vue +3 -0
- package/legacy/client/components/ui/stepper/StepperItem.vue +3 -0
- package/legacy/client/components/ui/stepper/StepperSeparator.vue +3 -0
- package/legacy/client/components/ui/stepper/StepperTitle.vue +3 -0
- package/legacy/client/components/ui/stepper/StepperTrigger.vue +3 -0
- package/legacy/client/components/ui/stepper/index.ts +1 -0
- package/legacy/client/components/ui/switch/Switch.vue +3 -0
- package/legacy/client/components/ui/switch/index.ts +1 -0
- package/legacy/client/components/ui/table/Table.vue +3 -0
- package/legacy/client/components/ui/table/TableBody.vue +3 -0
- package/legacy/client/components/ui/table/TableCaption.vue +3 -0
- package/legacy/client/components/ui/table/TableCell.vue +3 -0
- package/legacy/client/components/ui/table/TableEmpty.vue +3 -0
- package/legacy/client/components/ui/table/TableFooter.vue +3 -0
- package/legacy/client/components/ui/table/TableHead.vue +3 -0
- package/legacy/client/components/ui/table/TableHeader.vue +3 -0
- package/legacy/client/components/ui/table/TableRow.vue +3 -0
- package/legacy/client/components/ui/table/index.ts +1 -0
- package/legacy/client/components/ui/tabs/Tabs.vue +3 -0
- package/legacy/client/components/ui/tabs/TabsContent.vue +3 -0
- package/legacy/client/components/ui/tabs/TabsList.vue +3 -0
- package/legacy/client/components/ui/tabs/TabsTrigger.vue +3 -0
- package/legacy/client/components/ui/tabs/index.ts +1 -0
- package/legacy/client/components/ui/tags-input/TagsInput.vue +3 -0
- package/legacy/client/components/ui/tags-input/TagsInputInput.vue +3 -0
- package/legacy/client/components/ui/tags-input/TagsInputItem.vue +3 -0
- package/legacy/client/components/ui/tags-input/TagsInputItemDelete.vue +3 -0
- package/legacy/client/components/ui/tags-input/TagsInputItemText.vue +3 -0
- package/legacy/client/components/ui/tags-input/index.ts +1 -0
- package/legacy/client/components/ui/textarea/Textarea.vue +3 -0
- package/legacy/client/components/ui/textarea/index.ts +1 -0
- package/legacy/client/components/ui/toggle/Toggle.vue +3 -0
- package/legacy/client/components/ui/toggle/index.ts +1 -0
- package/legacy/client/components/ui/toggle-group/ToggleGroup.vue +3 -0
- package/legacy/client/components/ui/toggle-group/ToggleGroupItem.vue +3 -0
- package/legacy/client/components/ui/toggle-group/index.ts +1 -0
- package/legacy/client/components/ui/tooltip/Tooltip.vue +3 -0
- package/legacy/client/components/ui/tooltip/TooltipContent.vue +3 -0
- package/legacy/client/components/ui/tooltip/TooltipProvider.vue +3 -0
- package/legacy/client/components/ui/tooltip/TooltipTrigger.vue +3 -0
- package/legacy/client/components/ui/tooltip/index.ts +1 -0
- package/legacy/client/facades/acl.facade.ts +1 -0
- package/legacy/client/facades/app.facade.ts +6 -0
- package/legacy/client/facades/auth.facade.ts +1 -0
- package/legacy/client/facades/config.facade.ts +1 -0
- package/legacy/client/facades/fetch.facade.ts +1 -0
- package/legacy/client/facades/logger.facade.ts +1 -0
- package/legacy/client/facades/menu.facade.ts +1 -0
- package/legacy/client/facades/router.facade.ts +1 -0
- package/legacy/client/facades/translator.facade.ts +10 -0
- package/legacy/client/utils/autoPages.ts +1 -0
- package/legacy/client/utils/createId.ts +1 -0
- package/legacy/client/utils/di.ts +1 -0
- package/legacy/client/utils/fetcher.ts +1 -0
- package/legacy/client/utils/file.ts +1 -0
- package/legacy/client/utils/index.ts +7 -0
- package/legacy/client/utils/logger.ts +1 -0
- package/legacy/client/utils/toast.ts +1 -0
- package/legacy/server/entities/file.entity.ts +4 -0
- package/legacy/server/exceptions/base.ts +4 -0
- package/legacy/server/facades/arte.facade.ts +6 -0
- package/legacy/server/facades/config.facade.ts +4 -0
- package/legacy/server/facades/db.facade.ts +4 -0
- package/legacy/server/facades/download.facade.ts +4 -0
- package/legacy/server/facades/drive.facade.ts +4 -0
- package/legacy/server/facades/logger.facade.ts +4 -0
- package/legacy/server/facades/router.facade.ts +4 -0
- package/legacy/server/middlewares/auth.middleware.ts +6 -0
- package/legacy/server/middlewares/authorization.middleware.ts +8 -0
- package/legacy/server/mixins/hooks.mixin.ts +6 -0
- package/legacy/server/mixins/model.mixin.ts +6 -0
- package/legacy/server/mixins/modelConfig.mixin.ts +4 -0
- package/legacy/server/queries/index.ts +6 -0
- package/legacy/server/services/metadataQuery.service.ts +6 -0
- package/legacy/server/services/routerResourceConfig.service.ts +5 -0
- package/legacy/shared/services/validator.service.ts +4 -0
- package/legacy/shared/utils/compose.ts +8 -0
- package/legacy/shared/utils/tryCatch.ts +7 -0
- package/package.json +3 -1
- package/tsdown.config.ts +3 -0
- package/vite.config.ts +1 -0
- package/cli/commands/dev.js +0 -37
- package/cli/commands/start.js +0 -38
- package/dist/components/index-Dk5fhUBV.mjs +0 -4399
package/dist/client/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{toast as e}from"vue-sonner";import t from"qs";import{get as n,has as r,orderBy as i,set as a,unset as o}from"lodash-es";import{defineAbility as s,subject as c}from"@casl/ability";import{createMemoryHistory as l,createRouter as u,createWebHistory as d}from"vue-router";async function f(e){try{return[null,await e()]}catch(e){return[e,null]}}f.sync=function(e){try{return[null,e()]}catch(e){return[e,null]}};var p=class{static __container_entry_key=`FetchService`;async handleError(t){if(!(t.headers.get(`Content-Type`)||``).includes(`application/json`)){e.error($t(`Internal Server Error`));return}if(t.headers.get(`Content-Type`)?.includes(`json`)){let n=await t.json().catch(()=>({message:$t(`Internal Server Error`)}));n.message&&e.error(n.message)}}buildUrl(e,n){if(!n)return e;let r=t.stringify(n,{arrayFormat:`brackets`});return e+`?`+r}buildRequestInit(e){let t={...e};return e.data&&(t.body=JSON.stringify(e.data),t.headers={...t.headers,"Content-Type":`application/json`}),t}async parseResponse(e){return e.headers.get(`Content-Type`)?.includes(`json`)?e.json():e.text()}async fetch(e,t={}){throw Error(`Method not implemented`)}async try(e,t={}){return f(()=>this.fetch(e,t))}async get(e,t={}){return this.fetch(e,{...t,method:`GET`})}async post(e,t={}){return this.fetch(e,{...t,method:`POST`})}async put(e,t={}){return this.fetch(e,{...t,method:`PUT`})}async delete(e,t={}){return this.fetch(e,{...t,method:`DELETE`})}},ee=class e extends Error{statusCode=500;constructor(e,t=500){super(e),this.name=this.constructor.name,this.statusCode=t}static fromError(t){return new e(t.message,500)}},m=class{entries=new Map;loadFromRecord(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[String(t)]=n;return e}getKey(e){let t=e;(typeof e==`function`||typeof e==`object`)&&(t=e.name);let n=typeof e!=`string`&&typeof e!=`symbol`;return n&&!e.__container_entry_key&&console.warn(`Warning: The constructor ${e.name} does not have a unique identifier. Consider adding a static property __container_entry_key to avoid potential conflicts.`),n&&e.__container_entry_key&&(t=e.__container_entry_key),t}set(e,t){let n=this.getKey(e);return this.entries.set(n,t),this}has(e){let t=this.getKey(e);return this.entries.has(t)}get(e){let t=this.getKey(e);if(!this.entries.has(t))throw new ee(`Entry with key "${String(t)}" not found in container.`);return this.entries.get(t)}singleton(e){let t=e.name,n=this.entries.get(t);if(n)return n;let r=new e;return this.entries.set(t,r),r}load(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}proxy(e){return new Proxy({},{get:(t,n)=>{let r=this.get(e),i=r[n];return typeof i==`function`?i.bind(r):r[n]},set:(t,n,r)=>{let i=this.get(e);return i[n]=r,!0}})}keys(){return Array.from(this.entries.keys())}};const h=globalThis.clientContainer||new m;globalThis.clientContainer=h;const g=h.proxy(p);function _(...e){return e.reduce((e,t)=>t(e),class{})}function v(e,...t){return t.reduce((e,t)=>t(e),e)}function y(e){return function(t){class n extends t{constructor(...t){super(...t);let n=new e(...t);Object.assign(this,n)}}for(let t of Reflect.ownKeys(e.prototype))t!==`constructor`&&Object.defineProperty(n.prototype,t,Object.getOwnPropertyDescriptor(e.prototype,t));return n}}function b(e){return class extends e{static from(t){let n=typeof this==`function`?this:e,r=new n,i={...t};return typeof n?.parse==`function`&&(i=n.parse(t)),typeof this?.parse==`function`&&(i=this.parse(t)),Object.assign(r,i),r}merge(e){return Object.assign(this,e),this}}}function x(e){return class extends e{created_at;updated_at}}function S(e){return class extends e{deleted_at=null}}_(b,x,S);var C=class{static __container_entry_key=`AuthService`;user;constructor(e={}){this.user=e.user||null}async logout(e){let[t]=await g.try(`/auth/logout`,{method:`POST`});t||(window.location.href=e?.redirect||`/`)}},w=class extends p{async fetch(e,t={}){let n=this.buildUrl(e,t.query),r=this.buildRequestInit(t),i=await fetch(n,r);if(!i.ok)throw await this.handleError(i),Error(`HTTP error! status: ${i.status}`);return this.parseResponse(i)}},T=class{static __container_entry_key=`CookieMapEntity`;cookies;prefix;constructor(e){this.cookies=e?.cookies||new Map,this.prefix=e?.prefix||``}load(e){if(e instanceof Map){for(let[t,n]of e.entries())this.set(t,n);return}for(let t of Object.keys(e))this.set(t,e[t])}get(e,t=null){let n=this.prefix+e;return this.cookies.get(n)||t}set(e,t,n){let r=this.prefix+e;this.cookies.set(r,t)}toRecord(){let e={};for(let[t,n]of this.cookies.entries())if(t.startsWith(this.prefix)){let r=t.slice(this.prefix.length);e[r]=n}return e}},te=class{static __container_entry_key=`ConfigService`;entries;constructor(){this.entries=new Map}list(){return Array.from(this.entries.values())}parseValue(e){return typeof e==`string`&&e.endsWith(`:boolean`)?e.replace(`:boolean`,``).trim()===`true`:e}loadFromRecord(e,t=`unknow`){for(let[n,r]of Object.entries(e))this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}loadFromEntries(e,t=`unknow`){for(let[n,r]of e)this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[t]=n.value;return e}has(e){if(this.entries.get(e))return!0;if(!e.includes(`.`))return!1;let t=e.split(`.`)[0],n=this.entries.get(t);if(!n)return!!this.entries.get(e);let i=n.value;return typeof i!=`object`||Array.isArray(i)?!1:r(i,e.substring(t.length+1))}get(e,t){let r=this.entries.get(e);if(r)return r.value;if(!e.includes(`.`))return t;let i=e.split(`.`)[0],a=this.entries.get(i);if(!a){let n=this.entries.get(e);return n?n.value:t}let o=a.value;return typeof o!=`object`||Array.isArray(o)?t:n(o,e.substring(i.length+1),t)}getOne(e,t){for(let t of e)if(this.has(t))return this.get(t);return t}set(e,t,n=`runtime`){if(!e.includes(`.`)){this.entries.set(e,{key:e,source:n,value:t});return}let r=e.split(`.`)[0],i=this.get(r,{});(typeof i!=`object`||Array.isArray(i))&&(i={}),a(i,e.substring(r.length+1),t),this.entries.set(r,{key:r,source:n,value:i})}unset(e){if(!e.includes(`.`)){this.entries.delete(e);return}let t=e.split(`.`)[0],n=this.get(t,{});n&&(typeof n!=`object`||Array.isArray(n)||(o(n,e.substring(t.length+1)),this.entries.set(t,{key:t,source:`runtime`,value:n})))}clear(){this.entries.clear()}};const E=h.proxy(te);import.meta.env.DEV&&(globalThis.config=E);function ne(e,t){let n={},r=e.split(`/`).filter(Boolean),i=t.split(`/`).filter(Boolean);for(let e=0;e<r.length;e++){let t=r[e],a=i[e];if(t.startsWith(`:`)){let e=t.slice(1);n[e]=a}if(t===`*`){n[`*`]=i.slice(e).join(`/`);break}}return n}function D(e){let n={},r=e.split(`?`)[1];return r?t.parse(r):n}var O=class extends p{async fetch(e,t={}){return!e.startsWith(`http://`)&&!e.startsWith(`https://`)?this.fetchInternal(e,t):this.fetchExternal(e,t)}async fetchExternal(e,t={}){let n=this.buildUrl(e,t.query),r=this.buildRequestInit(t),i=await fetch(n,r);if(!i.ok)throw await this.handleError(i),Error(`HTTP error! status: ${i.status}`);return this.parseResponse(i)}async fetchInternal(e,t={}){let n=h.get(`RouterService`),r=t.method||`GET`,i=n.resolve(r,e),a=new T({prefix:E.get(`cookie.prefix`,``)});if(h.has(`cookies`)&&a.load(h.get(`cookies`)),!i||!i.handler)throw Error(`Route not found for ${r} ${e}`);return await n.execute(i,{url:e,params:ne(i.path,e),query:t.query||D(e),body:t.data||t.body,method:r.toLowerCase(),cookie:a})}},k=class{hook_id;hook_aliases;order;subhooks;async register(){}async load(){}async boot(){}async shutdown(){}async onRegister(){}async onLoad(){}async onBoot(){}async onShutdown(){}},A=class e{static __container_entry_key=`LoggerService`;info(e,t){}debug(e,t){}warn(e,t){}error(e,t){}child(t){return new e}},j=class{static __container_entry_key=`LifecycleService`;hooks;logger;debug=!1;constructor(e={}){this.debug=e.debug??this.debug,this.hooks=e.hooks??new Map,this.logger=e.logger??new A,e.onError&&(this.onError=e.onError)}onError(e,t){Object.assign(e,{context:t}),this.logger.error(`Error in hook ${t.method} (${t.hookId}):`,e)}mapAliases(e){let t=[],n=Array.from(this.hooks.values());for(let r of n){if(e.includes(r.hook_id)){t.push(r.hook_id);continue}r.hook_aliases&&r.hook_aliases.find(t=>e.includes(t))&&t.push(r.hook_id)}return t}list(e){let t=Array.from(this.hooks.values());if(e?.exclude){let n=Array.isArray(e.exclude)?e.exclude:[e.exclude];n=this.mapAliases(n),t=t.filter(e=>!n.includes(e.hook_id))}if(e?.include){let n=Array.isArray(e.include)?e.include:[e.include];n=this.mapAliases(n),t=t.filter(e=>n.includes(e.hook_id))}return t=i(t,[`order`],[`asc`]),t}add(...e){let t=[];for(let n of e){if(typeof n==`function`){t.push(new n);continue}t.push(n)}for(let e of t){if(!e.hook_id){this.logger.warn(`Skipping hook without hook_id:`,e);continue}this.hooks.set(e.hook_id,e),this.debug&&this.logger.debug(`add `+e.hook_id),e.subhooks&&e.subhooks.forEach(e=>this.add(e))}}async emitMethod(e,t){let n=this.list(t);this.debug&&this.logger.debug(`emitting ${e} for hooks:`,{hooks:n.map(e=>e.hook_id)});for(let n of this.list(t)){let t={register:()=>Promise.all([n.register(),n.onRegister()]),load:()=>Promise.all([n.load(),n.onLoad()]),boot:()=>Promise.all([n.boot(),n.onBoot()]),shutdown:()=>Promise.all([n.shutdown(),n.onShutdown()])},[r]=await f(()=>t[e]());if(r){this.onError(r,{hookId:n.hook_id,method:e});continue}this.debug&&this.logger.debug(`${e} `+n.hook_id)}}async emit(e,t){let n=Array.isArray(e)?e:[e];for(let e of n)await this.emitMethod(e,t)}async register(e){return this.emit(`register`,e)}async load(e){return this.emit(`load`,e)}async boot(e){return this.emit(`boot`,e)}async shutdown(e){await this.emit(`shutdown`,e)}clear(){this.hooks.clear()}},M=class extends j{addImports(e){let t=[];for(let[n,r]of Object.entries(e)){let e=new(r.default||r);e.hook_id=e.hook_id||n,t.push(e)}t.forEach(e=>this.add(e))}},N=class extends _(b){id;label;layout;to;target;group;order;icon;parent},P=class extends _(b){id;name;description=null;origin;subject;action;conditions=null;get editable(){return this.origin===`custom`}get parsedConditions(){if(!this.conditions)return{};let[e,t]=f.sync(()=>typeof this.conditions==`string`?JSON.parse(this.conditions):this.conditions);return e?{}:t}},F=class{static __container_entry_key=`AclEntity`;ability;permissions;debug=!1;logger;constructor(e={}){let t=(e.permissions||[]).map(e=>P.from(e));this.permissions=t,this.debug=e.debug||!1,this.logger=e.logger||new A().child({label:`acl`}),this.ability=s(e=>{t.forEach(t=>{e(t.action,t.subject,t.parsedConditions)})}),this.debug&&this.logger.debug(`initialized in debug mode`,{permissions:this.permissions})}can(e,t,n){if(!n)return this.ability.can(e,t);let r=c(t,n);return this.ability.can(e,r)}cannot(e,t,n){if(!n)return this.ability.cannot(e,t);let r=c(t,n);return this.ability.cannot(e,r)}subject(e,t){return c(e,t)}};const I=h.proxy(F);var L=class{static __container_entry_key=`MenuService`;items=new Map;add(...e){for(let t of e)t.id||=JSON.stringify(t),this.items.set(t.id,N.from(t))}remove(e){this.items.delete(e)}list(e={}){let t=JSON.parse(JSON.stringify(Array.from(this.items.values())));return e.layout&&(t=t.filter(t=>t.layout===e.layout)),e.group&&(t=t.filter(t=>t.group===e.group||t.parent===e.group)),e.parent&&(t=t.filter(t=>t.parent===e.parent)),e.allowed!==void 0&&e.allowed===!0&&(t=t.filter(e=>I.can(`view`,e))),t.sort((e,t)=>(e.order?e.order:98)-(t.order?t.order:98)),t}clear(){this.items.clear()}};const R=e=>{let t=E.get(`setup`),n=!t?.need_database&&!t?.need_users;return n&&e.path.startsWith(`/setup`)?`/`:n?!0:e.path.startsWith(`/setup`)?e.path===`/setup`?!0:t?.need_database?e.path===`/setup/database`?!0:`/setup/database`:t?.need_users?e.path===`/setup/user`?!0:`/setup/user`:!0:`/setup`};function z(e,t={}){let n=[];for(let[r,i]of Object.entries(e)){if(t.exclude?.some(e=>typeof e==`string`?r.includes(e):e.test(r)))continue;let e=r.replace(/\.vue$/,``).split(`/`).filter(e=>e&&!e.startsWith(`.`)).map(e=>{let t=e;return t.startsWith(`[`)&&t.endsWith(`]`)&&(t=`:`+t.slice(1,-1)),t});t.strip?.length&&(e=e.filter(e=>!t.strip.some(t=>typeof t==`string`?e===t:t.test(e))));let a=e.join(`/`).replace(/index$/,``);t.prefix&&(a=t.prefix+`/`+a),a.startsWith(`/`)||(a=`/`+a),a.endsWith(`/`)&&(a=a.slice(0,-1));let o={path:a,component:i,beforeEnter:[]};t.guards&&Array.isArray(t.guards)&&(o.beforeEnter=t.guards),t.guards&&typeof t.guards==`function`&&(o.beforeEnter=t.guards(o)),n.push(o)}return t.refine&&(n=t.refine(n)),n}function B(){let e=import.meta.env.SSR,t=u({history:e?l():d(),routes:[],scrollBehavior(e,t,n){return n||{top:0}}});return t.beforeEach(R),t.auto=(e,n={})=>{let r=z(e,n);return r.forEach(e=>t.addRoute(e)),r},t}var V=class{static __container_entry_key=`ToastService`;success(e,t){console.log(`Success:`,e,t)}error(e,t){console.error(`Error:`,e,t)}};const H=h.proxy(C);import.meta.env.DEV&&!import.meta.env.SSR&&(window.auth=H);const re=h.proxy(A),U=h.proxy(L),W=h.proxy(`route`),G=h.proxy(`router`),K=h.proxy(V);var q=class extends _(b,y(k)){id;name;enabled=!1;dependencies={};build={};directory;upgrade_info;setData(e){let t=Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0));Object.assign(this,t),this.hook_id=`module:${this.id}`}},J=class extends v(q){},Y=class extends _(b){id;name;version;enabled},X=class extends v(Y){addPagesFolder(e,t){G.auto(e,t)}async load(){}};const Z=g;function ie(e){return new Promise(t=>{let n=document.createElement(`input`);n.type=`file`,n.accept=e.accept||`*/*`,n.multiple=e.multiple||!1,n.onchange=n=>{let r=n.target,i=Array.from(r.files);t(e.multiple?Array.from(i):i[0])},n.oncancel=()=>{t(e.multiple?[]:null)},n.click()})}function ae(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=e=>{e.target?.result instanceof ArrayBuffer?t(new Uint8Array(e.target.result)):n(Error(`Failed to read file as ArrayBuffer`))},r.onerror=()=>{n(r.error)},r.readAsArrayBuffer(e)})}async function oe(e){let t=new FormData;return t.append(`file`,e.file),e.directory&&t.append(`directory`,e.directory),Z(`/api/drives/${e.driveId}/upload`,{method:`POST`,body:t,query:{directory:e.directory}})}const se={pick:ie,upload:oe,toUint8Array:ae};function Q(e){let t=e.exclude||[`/auth/login`,`/auth/register`];return n=>{if(!H.user&&!t.includes(n.path))return e.redirect}}const ce=Q({redirect:`/auth/login`});function $(e){return()=>{if(H.user)return e.redirect}}const le=$({redirect:`/`});export{Z as $fetch,se as $file,C as AuthService,w as FetchBrowserService,O as FetchNodeService,p as FetchService,M as LifecycleService,N as MenuItemEntity,L as MenuService,J as ModuleEntity,X as PluginEntity,V as ToastService,I as acl,H as auth,ce as authGuard,z as auto,E as config,h as container,Q as createAuthGuard,$ as createGuestGuard,B as createRouter,g as fetch,le as guestGuard,re as logger,U as menu,W as route,G as router,R as setupGuard,K as toast};
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiJGZldGNoIiwiJGZldGNoIiwiQ29ra2llTWFwRW50aXR5IiwiTGlmZWN5Y2xlU2VydmljZSIsIkJhc2VMaWZlY3ljbGVTZXJ2aWNlIiwiUGVybWlzc2lvbiIsInN1YmplY3QiLCJjcmVhdGVTdWJqZWN0IiwiY3JlYXRlVnVlUm91dGVyIiwiTW9kdWxlIiwiQmFzZSIsIlBsdWdpbkVudGl0eSIsIkJhc2UiLCIkb3JpZ2luYWwiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL3RyeUNhdGNoLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9GZXRjaFNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvQ29udGFpbmVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvZmV0Y2gudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvVXNlckVudGl0eS50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvQXV0aFNlcnZpY2UudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL0ZldGNoQnJvd3NlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0Nvb2tpZU1hcEVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvQ29uZmlnU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9jb25maWcudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL3BhcnNlUm91dGVVcmwudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL0ZldGNoTm9kZVNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0xpZmVjeWNsZVNlcnZpY2UudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL0xpZmVjeWNsZVNlcnZpY2UudHMiLCIuLi8uLi9zcmMvY2xpZW50L2VudGl0aWVzL01lbnVJdGVtRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9QZXJtaXNzaW9uRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9BY2xFbnRpdHkudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvYWNsLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9NZW51U2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZ3VhcmRzL3NldHVwR3VhcmQudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL1RvYXN0U2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9hdXRoLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL2xvZ2dlci50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9tZW51LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL3JvdXRlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL3JvdXRlci50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy90b2FzdC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTW9kdWxlRW50aXR5LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9lbnRpdGllcy9Nb2R1bGVFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1BsdWdpbkVudGl0eS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZW50aXRpZXMvUGx1Z2luRW50aXR5LnRzIiwiLi4vLi4vc3JjL2NsaWVudC91dGlscy9mZXRjaGVyLnRzIiwiLi4vLi4vc3JjL2NsaWVudC91dGlscy9maWxlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9ndWFyZHMvYXV0aEd1YXJkLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9ndWFyZHMvZ3Vlc3RHdWFyZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbnRlcmZhY2UgVHJ5ZXIge1xuICAgICguLi5hcmdzOiBhbnlbXSk6IGFueVxufVxuXG5pbnRlcmZhY2UgVHJ5ZXJBc3luYyB7XG4gICAgKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxhbnk+IHwgYW55XG59XG5cbnR5cGUgVHJ5Q2F0Y2hSZXN1bHQ8VCBleHRlbmRzIFRyeWVyPiA9IFtudWxsLCBSZXR1cm5UeXBlPFQ+XSB8IFtFcnJvciwgbnVsbF1cblxudHlwZSBUcnlDYXRjaEFzeW5jUmVzdWx0PFQgZXh0ZW5kcyBUcnllckFzeW5jPiA9IFtudWxsLCBBd2FpdGVkPFJldHVyblR5cGU8VD4+XSB8IFtFcnJvciwgbnVsbF1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyeUNhdGNoPFQgZXh0ZW5kcyBUcnllckFzeW5jPih0cnllcjogVCk6IFByb21pc2U8VHJ5Q2F0Y2hBc3luY1Jlc3VsdDxUPj4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyeWVyKClcbiAgICAgICAgcmV0dXJuIFtudWxsLCByZXN1bHRdXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIFtlcnJvciBhcyBhbnksIG51bGxdXG4gICAgfVxufVxuXG50cnlDYXRjaC5zeW5jID0gZnVuY3Rpb24gPFQgZXh0ZW5kcyBUcnllcj4odHJ5ZXI6IFQpOiBUcnlDYXRjaFJlc3VsdDxUPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdHJ5ZXIoKVxuICAgICAgICByZXR1cm4gW251bGwsIHJlc3VsdF1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gW2Vycm9yIGFzIGFueSwgbnVsbF1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyB0b2FzdCB9IGZyb20gJ3Z1ZS1zb25uZXInXG5pbXBvcnQgcXMgZnJvbSAncXMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRmV0Y2hPcHRpb25zIGV4dGVuZHMgUmVxdWVzdEluaXQge1xuICAgIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgYW55PlxuICAgIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZldGNoU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnRmV0Y2hTZXJ2aWNlJ1xuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZUVycm9yKHJlc3BvbnNlOiBSZXNwb25zZSkgeyAgICBcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykgfHwgJydcblxuICAgICAgICBpZiAoIWNvbnRlbnRUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICAgICAgICAgIHRvYXN0LmVycm9yKCR0KCdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InKSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKT8uaW5jbHVkZXMoJ2pzb24nKSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiAoeyBtZXNzYWdlOiAkdCgnSW50ZXJuYWwgU2VydmVyIEVycm9yJykgfSkpXG5cbiAgICAgICAgICAgIGlmIChkYXRhLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICB0b2FzdC5lcnJvcihkYXRhLm1lc3NhZ2UpXG4gICAgICAgICAgICB9ICAgIFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJ1aWxkVXJsKHVybDogc3RyaW5nLCBxdWVyeT86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXF1ZXJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWVyeVN0cmluZyA9IHFzLnN0cmluZ2lmeShxdWVyeSwgeyBhcnJheUZvcm1hdDogJ2JyYWNrZXRzJyB9KVxuXG4gICAgICAgIHJldHVybiB1cmwgKyAnPycgKyBxdWVyeVN0cmluZ1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBidWlsZFJlcXVlc3RJbml0KG9wdGlvbnM6IEZldGNoT3B0aW9ucyk6IFJlcXVlc3RJbml0IHtcbiAgICAgICAgY29uc3QgZmV0Y2hPcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHsgLi4ub3B0aW9ucyB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZGF0YSkge1xuICAgICAgICAgICAgZmV0Y2hPcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmRhdGEpXG4gICAgICAgICAgICBmZXRjaE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICAgICAgICAuLi5mZXRjaE9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZldGNoT3B0aW9uc1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBwYXJzZVJlc3BvbnNlPFQ+KHJlc3BvbnNlOiBSZXNwb25zZSk6IFByb21pc2U8VD4ge1xuICAgICAgICBpZiAocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpPy5pbmNsdWRlcygnanNvbicpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpIGFzIFByb21pc2U8VD5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCkgYXMgUHJvbWlzZTxUPlxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmZXRjaDxUPihfdXJsOiBzdHJpbmcsIF9vcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VD4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQnKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB0cnk8VCA9IGFueT4odXJsOiBzdHJpbmcsIG9wdGlvbnM6IEZldGNoT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0cnlDYXRjaCgoKSA9PiB0aGlzLmZldGNoPFQ+KHVybCwgb3B0aW9ucykpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldDxUID0gYW55Pih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2g8VD4odXJsLCB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcG9zdDxUID0gYW55Pih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2g8VD4odXJsLCB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHB1dDxUID0gYW55Pih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2g8VD4odXJsLCB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGVsZXRlPFQgPSBhbnk+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaDxUPih1cmwsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VFeGNlcHRpb24gZXh0ZW5kcyBFcnJvciB7XG4gICAgcHVibGljIHN0YXR1c0NvZGU6IG51bWJlciA9IDUwMFxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzQ29kZTogbnVtYmVyID0gNTAwKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZVxuICAgICAgICB0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tRXJyb3IoZXJyb3I6IEVycm9yKTogQmFzZUV4Y2VwdGlvbiB7XG4gICAgICAgIHJldHVybiBuZXcgQmFzZUV4Y2VwdGlvbihlcnJvci5tZXNzYWdlLCA1MDApXG4gICAgfVxufSIsImltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gXCIjc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50c1wiXG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IG9iamVjdD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUXG5cbnR5cGUgRW50cnlLZXkgPSBzdHJpbmcgfCBzeW1ib2wgfCBDb25zdHJ1Y3RvclxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb250YWluZXJTZXJ2aWNlIHtcbiAgICBwcml2YXRlIGVudHJpZXMgPSBuZXcgTWFwPEVudHJ5S2V5LCBhbnk+KClcblxuICAgIHB1YmxpYyBsb2FkRnJvbVJlY29yZChyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocmVjb3JkKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHRvUmVjb3JkKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuZW50cmllcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHJlY29yZFtTdHJpbmcoa2V5KV0gPSB2YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlY29yZFxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0S2V5KHBheWxvYWQ6IEVudHJ5S2V5KTogRW50cnlLZXkge1xuICAgICAgICBsZXQga2V5ID0gcGF5bG9hZFxuXG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgcGF5bG9hZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGtleSA9IHBheWxvYWQubmFtZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNDb25zdHJ1Y3RvciA9IHR5cGVvZiBwYXlsb2FkICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgcGF5bG9hZCAhPT0gJ3N5bWJvbCdcblxuICAgICAgICBpZiAoaXNDb25zdHJ1Y3RvciAmJiAhKHBheWxvYWQgYXMgYW55KS5fX2NvbnRhaW5lcl9lbnRyeV9rZXkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgV2FybmluZzogVGhlIGNvbnN0cnVjdG9yICR7cGF5bG9hZC5uYW1lfSBkb2VzIG5vdCBoYXZlIGEgdW5pcXVlIGlkZW50aWZpZXIuIENvbnNpZGVyIGFkZGluZyBhIHN0YXRpYyBwcm9wZXJ0eSBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgdG8gYXZvaWQgcG90ZW50aWFsIGNvbmZsaWN0cy5gKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQ29uc3RydWN0b3IgJiYgKHBheWxvYWQgYXMgYW55KS5fX2NvbnRhaW5lcl9lbnRyeV9rZXkpIHtcbiAgICAgICAgICAgIGtleSA9IChwYXlsb2FkIGFzIGFueSkuX19jb250YWluZXJfZW50cnlfa2V5XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ga2V5XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KHBheWxvYWQ6IEVudHJ5S2V5LCB2YWx1ZTogYW55KSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHBheWxvYWQpXG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHZhbHVlKVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhwYXlsb2FkOiBFbnRyeUtleSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShwYXlsb2FkKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMuaGFzKGtleSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQ+KHBheWxvYWQ6IEVudHJ5S2V5KTogVCB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHBheWxvYWQpXG5cbiAgICAgICAgaWYgKCF0aGlzLmVudHJpZXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBFbnRyeSB3aXRoIGtleSBcIiR7U3RyaW5nKGtleSl9XCIgbm90IGZvdW5kIGluIGNvbnRhaW5lci5gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICByZXR1cm4gZW50cnlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2luZ2xldG9uPFQ+KGNsYXNzQ29uc3RydWN0b3I6IENvbnN0cnVjdG9yPFQ+KTogVCB7XG4gICAgICAgIGNvbnN0IGtleSA9IGNsYXNzQ29uc3RydWN0b3IubmFtZVxuICAgICAgICBjb25zdCBleGlzdGluZ0luc3RhbmNlID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgaWYgKGV4aXN0aW5nSW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0luc3RhbmNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdJbnN0YW5jZSA9IG5ldyBjbGFzc0NvbnN0cnVjdG9yKClcbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIG5ld0luc3RhbmNlKVxuICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2VcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZChlbnRyaWVzOiBSZWNvcmQ8YW55LCBhbnk+KTogdm9pZCB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJveHk8VCA9IHVua25vd24+KGtleTogRW50cnlLZXkpOiBUIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eSh7fSwge1xuICAgICAgICAgICAgZ2V0OiAoX3RhcmdldCwgcHJvcCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5nZXQ8VD4oa2V5KSBhcyBhbnlcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVudHJ5W3Byb3BdXG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5iaW5kKGVudHJ5KVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeVtwcm9wXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogKF90YXJnZXQsIHByb3AsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmdldDxUPihrZXkpIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgZW50cnlbcHJvcF0gPSB2YWx1ZVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkgYXMgVFxuICAgIH1cblxuICAgIHB1YmxpYyBrZXlzKCk6IEVudHJ5S2V5W10ge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMua2V5cygpKVxuICAgIH1cbn1cbiIsImltcG9ydCBDb250YWluZXJTZXJ2aWNlIGZyb20gXCIjc2hhcmVkL3NlcnZpY2VzL0NvbnRhaW5lclNlcnZpY2UudHNcIjtcblxuY29uc3QgY29udGFpbmVyID0gKGdsb2JhbFRoaXMgYXMgYW55KS5jbGllbnRDb250YWluZXIgfHwgbmV3IENvbnRhaW5lclNlcnZpY2UoKVxuXG5nbG9iYWxUaGlzLmNsaWVudENvbnRhaW5lciA9IGNvbnRhaW5lclxuXG5leHBvcnQgZGVmYXVsdCBjb250YWluZXIgYXMgQ29udGFpbmVyU2VydmljZVxuIiwiaW1wb3J0IEZldGNoU2VydmljZSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL0ZldGNoU2VydmljZS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5cbmNvbnN0ICRmZXRjaCA9IGNvbnRhaW5lci5wcm94eTxGZXRjaFNlcnZpY2U+KEZldGNoU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgJGZldGNoXG4iLCJpbXBvcnQgdHlwZSB7IFVuaW9uVG9JbnRlcnNlY3Rpb24gfSBmcm9tICcuL3R5cGluZy50cydcblxuZXhwb3J0IHR5cGUgQW55Q2xhc3MgPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbmV4cG9ydCB0eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUXG5leHBvcnQgdHlwZSBNaXhpbjxUPiA9IChiYXNlOiBDb25zdHJ1Y3RvcikgPT4gQ29uc3RydWN0b3I8VD5cblxuLyoqXG4gKiBDb21wb3NlcyBtdWx0aXBsZSBtaXhpbnMgaW50byBhIHNpbmdsZSBjbGFzcyB0aGF0IGNhbiBiZSBleHRlbmRlZC5cbiAqIEFsbG93cyBmb3IgbXVsdGlwbGUgaW5oZXJpdGFuY2UtbGlrZSBiZWhhdmlvciBieSBhcHBseWluZyBtaXhpbnMgc2VxdWVudGlhbGx5LlxuICogXG4gKiBAcGFyYW0gbWl4aW5zIC0gQXJyYXkgb2YgbWl4aW4gZnVuY3Rpb25zIHRvIGNvbXBvc2VcbiAqIEByZXR1cm5zIEEgY2xhc3MgY29uc3RydWN0b3IgdGhhdCBpbmNsdWRlcyBhbGwgbWl4aW4gZnVuY3Rpb25hbGl0eVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIGNvbXBvc2UoVGltZXN0YW1wLCBTb2Z0RGVsZXRlKSB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAqICAgICBzdXBlcigpXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZTxcbiAgICBNIGV4dGVuZHMgQXJyYXk8KGJhc2U6IENvbnN0cnVjdG9yPGFueT4pID0+IENvbnN0cnVjdG9yPGFueT4+XG4+KC4uLm1peGluczogTSk6IFVuaW9uVG9JbnRlcnNlY3Rpb248UmV0dXJuVHlwZTxNW251bWJlcl0+PiB7XG4gICAgcmV0dXJuIG1peGlucy5yZWR1Y2UoKGJhc2UsIG1peGluKSA9PiBtaXhpbihiYXNlKSwgY2xhc3Mge30gYXMgYW55KSBhcyBhbnlcbn1cblxuLyoqXG4gKiBBbHRlcm5hdGl2ZSBjb21wb3NlIGZ1bmN0aW9uIHRoYXQgc3RhcnRzIHdpdGggYSBiYXNlIGNsYXNzXG4gKiBcbiAqIEBwYXJhbSBiYXNlQ2xhc3MgLSBUaGUgYmFzZSBjbGFzcyB0byBzdGFydCB3aXRoXG4gKiBAcGFyYW0gbWl4aW5zIC0gQXJyYXkgb2YgbWl4aW4gZnVuY3Rpb25zIHRvIGFwcGx5XG4gKiBAcmV0dXJucyBBIGNsYXNzIGNvbnN0cnVjdG9yIHRoYXQgZXh0ZW5kcyB0aGUgYmFzZSBjbGFzcyB3aXRoIGFsbCBtaXhpbiBmdW5jdGlvbmFsaXR5XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgY29tcG9zZVdpdGgoQmFzZUVudGl0eSwgVGltZXN0YW1wLCBTb2Z0RGVsZXRlKSB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAqICAgICBzdXBlcigpXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZVdpdGg8XG4gICAgVEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3RvcixcbiAgICBNIGV4dGVuZHMgQXJyYXk8KGJhc2U6IENvbnN0cnVjdG9yKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+PlxuPihcbiAgICBiYXNlQ2xhc3M6IFRCYXNlLFxuICAgIC4uLm1peGluczogTVxuKTogVEJhc2UgJiBVbmlvblRvSW50ZXJzZWN0aW9uPFJldHVyblR5cGU8TVtudW1iZXJdPj4ge1xuICAgIHJldHVybiBtaXhpbnMucmVkdWNlKChiYXNlLCBtaXhpbikgPT4gbWl4aW4oYmFzZSksIGJhc2VDbGFzcyBhcyBhbnkpIGFzIGFueVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWl4aW48VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oU291cmNlOiBUQmFzZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiA8VFRhcmdldCBleHRlbmRzIENvbnN0cnVjdG9yPihUYXJnZXQ6IFRUYXJnZXQpIHtcbiAgICAgICAgY2xhc3MgTWl4ZWQgZXh0ZW5kcyBUYXJnZXQge1xuICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgICAgICBzdXBlciguLi5hcmdzKVxuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IG5ldyBTb3VyY2UoLi4uYXJncylcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHNvdXJjZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvcHkgbWV0aG9kc1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMoU291cmNlLnByb3RvdHlwZSkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgICAgICAgICAgIE1peGVkLnByb3RvdHlwZSxcbiAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFNvdXJjZS5wcm90b3R5cGUsIGtleSkhXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIE1peGVkIGFzIFRUYXJnZXQgJiBUQmFzZVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmludGVyZmFjZSBDcmVhdGVCYXNlRW50aXR5T3B0aW9ucyB7XG4gICAgcGFyc2U/OiAoZGF0YTogYW55KSA9PiBhbnlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJhc2VFbnRpdHkob3B0aW9uczogQ3JlYXRlQmFzZUVudGl0eU9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBCYXNlRW50aXR5PFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmcm9tPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBkYXRhOiBQYXJ0aWFsPFQ+KTogVCB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udHJ1Y3RvciA9ICh0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBCYXNlKSBhcyBhbnlcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGNvbnRydWN0b3IoKSBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGxldCBwYXlsb2FkID0geyAuLi5kYXRhIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnBhcnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBvcHRpb25zLnBhcnNlKGRhdGEpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSBhcyBhbnksIHBheWxvYWQpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIG1lcmdlKGRhdGE6IFBhcnRpYWw8dGhpcz4pOiB0aGlzIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQmFzZUVudGl0eTxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICBwdWJsaWMgc3RhdGljIGZyb208VD4odGhpczogbmV3ICgpID0+IFQsIGRhdGE6IFBhcnRpYWw8VD4pOiBUIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRydWN0b3IgPSAodHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogQmFzZSkgYXMgYW55XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGNvbnRydWN0b3IoKSBhcyBhbnlcblxuICAgICAgICAgICAgbGV0IHBheWxvYWQgPSB7IC4uLmRhdGEgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRydWN0b3I/LnBhcnNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IChjb250cnVjdG9yIGFzIGFueSkucGFyc2UoZGF0YSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiAodGhpcyBhcyBhbnkpPy5wYXJzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSAodGhpcyBhcyBhbnkpLnBhcnNlKGRhdGEpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UgYXMgYW55LCBwYXlsb2FkKVxuXG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBtZXJnZShkYXRhOiBQYXJ0aWFsPHRoaXM+KTogdGhpcyB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gVGltZXN0YW1wTWl4aW48VCBleHRlbmRzIENvbnN0cnVjdG9yPihiYXNlOiBUKSB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgYmFzZSB7XG4gICAgICAgIHB1YmxpYyBjcmVhdGVkX2F0OiBEYXRlIHwgc3RyaW5nXG4gICAgICAgIHB1YmxpYyB1cGRhdGVkX2F0OiBEYXRlIHwgc3RyaW5nXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gU29mdERlbGV0ZU1peGluPFQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oYmFzZTogVCkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIGJhc2Uge1xuICAgICAgICBwdWJsaWMgZGVsZXRlZF9hdDogRGF0ZSB8IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgUGVybWlzc2lvbiBmcm9tICcuL1Blcm1pc3Npb25FbnRpdHkudHMnXG5pbXBvcnQgdHlwZSBSb2xlIGZyb20gJy4vUm9sZUVudGl0eS50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgVGltZXN0YW1wTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMnXG5pbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXNlckVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikgeyAgXG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgZW1haWw6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdXNlcm5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBwYXNzd29yZD86IHN0cmluZ1xuICAgIHB1YmxpYyB2ZXJpZmllZF9hdD86IERhdGUgfCBzdHJpbmcgfCBudWxsXG5cbiAgICBwdWJsaWMgcGVybWlzc2lvbnM/OiBQZXJtaXNzaW9uW11cbiAgICBwdWJsaWMgcm9sZXM/OiBSb2xlW11cblxuICAgIHB1YmxpYyBnZXQgaW5pdGlhbHMoKXtcbiAgICAgICAgY29uc3QgW2ZpcnN0TmFtZSwgc2Vjb25kTmFtZV0gPSB0aGlzLm5hbWUuc3BsaXQoJyAnKVxuXG4gICAgICAgIGlmICghc2Vjb25kTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpcnN0TmFtZVswXS50b1VwcGVyQ2FzZSgpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhID0gZmlyc3ROYW1lWzBdLnRvVXBwZXJDYXNlKClcbiAgICAgICAgY29uc3QgYiA9IHNlY29uZE5hbWVbMF0udG9VcHBlckNhc2UoKVxuXG4gICAgICAgIHJldHVybiBhICsgYlxuICAgIH1cbn1cbiIsImltcG9ydCAkZmV0Y2ggZnJvbSAnI2NsaWVudC9mYWNhZGVzL2ZldGNoLnRzJ1xuaW1wb3J0IFVzZXIgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Vc2VyRW50aXR5LnRzJ1xuXG5pbnRlcmZhY2UgTG9nb3V0T3B0aW9ucyB7XG4gICAgcmVkaXJlY3Q/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXV0aFNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0F1dGhTZXJ2aWNlJ1xuICAgIHB1YmxpYyB1c2VyOiBVc2VyIHwgbnVsbFxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxBdXRoU2VydmljZT4gPSB7fSkge1xuICAgICAgICB0aGlzLnVzZXIgPSBkYXRhLnVzZXIgfHwgbnVsbFxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2dvdXQob3B0aW9ucz86IExvZ291dE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0ICRmZXRjaC50cnkoJy9hdXRoL2xvZ291dCcsIHsgbWV0aG9kOiAnUE9TVCcgfSlcblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBvcHRpb25zPy5yZWRpcmVjdCB8fCAnLydcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEZldGNoT3B0aW9ucyB9IGZyb20gJy4vRmV0Y2hTZXJ2aWNlLnRzJ1xuaW1wb3J0IEZldGNoU2VydmljZSBmcm9tICcuL0ZldGNoU2VydmljZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmV0Y2hCcm93c2VyU2VydmljZSBleHRlbmRzIEZldGNoU2VydmljZSB7XG4gICAgcHVibGljIGFzeW5jIGZldGNoPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBmdWxsVXJsID0gdGhpcy5idWlsZFVybCh1cmwsIG9wdGlvbnMucXVlcnkpXG4gICAgICAgIGNvbnN0IGZldGNoT3B0aW9ucyA9IHRoaXMuYnVpbGRSZXF1ZXN0SW5pdChvcHRpb25zKVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZnVsbFVybCwgZmV0Y2hPcHRpb25zKVxuXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXJyb3IocmVzcG9uc2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlUmVzcG9uc2U8VD4ocmVzcG9uc2UpXG4gICAgfVxufVxuIiwiZXhwb3J0IGludGVyZmFjZSBDb29raWVNYXBFbnRpdHlPcHRpb25zIHtcbiAgICBjb29raWVzPzogTWFwPHN0cmluZywgc3RyaW5nPlxuICAgIHByZWZpeD86IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb29raWVNYXBFbnRpdHkge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0Nvb2tpZU1hcEVudGl0eSdcblxuICAgIHB1YmxpYyBjb29raWVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gICAgcHVibGljIHByZWZpeDogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogQ29va2llTWFwRW50aXR5T3B0aW9ucykge1xuICAgICAgICB0aGlzLmNvb2tpZXMgPSBkYXRhPy5jb29raWVzIHx8IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgICAgICAgdGhpcy5wcmVmaXggPSBkYXRhPy5wcmVmaXggfHwgJydcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZChjb29raWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgTWFwPHN0cmluZywgc3RyaW5nPikge1xuICAgICAgICBpZiAoY29va2llcyBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgY29va2llcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvb2tpZXMpKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIGNvb2tpZXNba2V5XSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGZ1bGxOYW1lID0gdGhpcy5wcmVmaXggKyBuYW1lXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY29va2llcy5nZXQoZnVsbE5hbWUpIHx8IGRlZmF1bHRWYWx1ZVxuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBXZSB3YW50IHRvIGFsbG93IGFueSBvcHRpb25zIHRvIGJlIHBhc3NlZCBoZXJlLCBhcyB0aGV5IG1heSBiZSB1c2VkIGJ5IHRoZSB1bmRlcmx5aW5nIGNvb2tpZVxuICAgIC8vICBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIHNldChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgZnVsbE5hbWUgPSB0aGlzLnByZWZpeCArIG5hbWVcblxuICAgICAgICB0aGlzLmNvb2tpZXMuc2V0KGZ1bGxOYW1lLCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5jb29raWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKHRoaXMucHJlZml4KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVucHJlZml4ZWRLZXkgPSBrZXkuc2xpY2UodGhpcy5wcmVmaXgubGVuZ3RoKVxuXG4gICAgICAgICAgICAgICAgcmVzdWx0W3VucHJlZml4ZWRLZXldID0gdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBnZXQsIHNldCwgaGFzLCB1bnNldCB9IGZyb20gJ2xvZGFzaC1lcydcblxuaW50ZXJmYWNlIEVudHJ5IHtcbiAgICBrZXk6IHN0cmluZ1xuICAgIHZhbHVlOiBhbnlcbiAgICBzb3VyY2U6IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb25maWdTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdDb25maWdTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGVudHJpZXM6IE1hcDxzdHJpbmcsIEVudHJ5PlxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZW50cmllcyA9IG5ldyBNYXAoKVxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0KCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmVuZHNXaXRoKCc6Ym9vbGVhbicpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgnOmJvb2xlYW4nLCAnJykudHJpbSgpID09PSAndHJ1ZSdcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkRnJvbVJlY29yZChyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4sIHNvdXJjZSA9ICd1bmtub3cnKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCkpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnBhcnNlVmFsdWUodmFsdWUpLFxuICAgICAgICAgICAgICAgIHNvdXJjZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkRnJvbUVudHJpZXMoZW50cmllczogW3N0cmluZywgYW55XVtdLCBzb3VyY2UgPSAndW5rbm93Jyk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwge1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5wYXJzZVZhbHVlKHZhbHVlKSxcbiAgICAgICAgICAgICAgICBzb3VyY2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgdGhpcy5lbnRyaWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgcmVjb3JkW2tleV0gPSBlbnRyeS52YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlY29yZFxuICAgIH1cblxuICAgIHB1YmxpYyBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBjb25zdCBwcmltYXJ5RW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KHByaW1hcnkpXG5cbiAgICAgICAgaWYgKCFwcmltYXJ5RW50cnkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgICAgIHJldHVybiBlbnRyeSA/IHRydWUgOiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBwcmltYXJ5RW50cnkudmFsdWVcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFzKHZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSkpXG4gICAgfVxuXG4gICAgcHVibGljIGdldDxUID0gYW55IHwgdW5kZWZpbmVkPihrZXk6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogYW55KTogVCB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gZW50cnkudmFsdWUgYXMgVFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlFbnRyeSA9IHRoaXMuZW50cmllcy5nZXQocHJpbWFyeSlcblxuICAgICAgICBpZiAoIXByaW1hcnlFbnRyeSkge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICAgICAgcmV0dXJuIGVudHJ5ID8gZW50cnkudmFsdWUgOiBkZWZhdWx0VmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcHJpbWFyeUVudHJ5LnZhbHVlXG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGdldCh2YWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpLCBkZWZhdWx0VmFsdWUpXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRPbmU8VCA9IGFueSB8IHVuZGVmaW5lZD4oa2V5czogc3RyaW5nW10sIGRlZmF1bHRWYWx1ZT86IGFueSk6IFQge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldDxUPihrZXkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgcHVibGljIHNldChrZXk6IHN0cmluZywgdmFsdWU6IGFueSwgc291cmNlID0gJ3J1bnRpbWUnKTogdm9pZCB7XG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBsZXQgcHJpbWFyeVZhbHVlID0gdGhpcy5nZXQocHJpbWFyeSwge30pXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwcmltYXJ5VmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocHJpbWFyeVZhbHVlKSkge1xuICAgICAgICAgICAgcHJpbWFyeVZhbHVlID0ge31cbiAgICAgICAgfVxuXG4gICAgICAgIHNldChwcmltYXJ5VmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSwgdmFsdWUpXG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChwcmltYXJ5LCB7XG4gICAgICAgICAgICBrZXk6IHByaW1hcnksXG4gICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgIHZhbHVlOiBwcmltYXJ5VmFsdWVcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdW5zZXQoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShrZXkpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBjb25zdCBwcmltYXJ5VmFsdWUgPSB0aGlzLmdldChwcmltYXJ5LCB7fSlcblxuICAgICAgICBpZiAoIXByaW1hcnlWYWx1ZSkgcmV0dXJuXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwcmltYXJ5VmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocHJpbWFyeVZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB1bnNldChwcmltYXJ5VmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSlcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KHByaW1hcnksIHtcbiAgICAgICAgICAgIGtleTogcHJpbWFyeSxcbiAgICAgICAgICAgIHNvdXJjZTogJ3J1bnRpbWUnLFxuICAgICAgICAgICAgdmFsdWU6IHByaW1hcnlWYWx1ZVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzLmNsZWFyKClcbiAgICB9XG59XG4iLCJpbXBvcnQgQ29uZmlnU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0NvbmZpZ1NlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuXG5jb25zdCBjb25maWcgPSBjb250YWluZXIucHJveHk8Q29uZmlnU2VydmljZT4oQ29uZmlnU2VydmljZSlcblxuaWYgKGltcG9ydC5tZXRhLmVudi5ERVYpIHtcbiAgICBnbG9iYWxUaGlzLmNvbmZpZyA9IGNvbmZpZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjb25maWdcbiIsImltcG9ydCBxcyBmcm9tICdxcycgXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVybFBhcmFtcyhyb3V0ZVBhdGg6IHN0cmluZywgcmVxdWVzdFBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICBjb25zdCByb3V0ZVNlZ21lbnRzID0gcm91dGVQYXRoLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pXG4gICAgY29uc3QgcmVxdWVzdFNlZ21lbnRzID0gcmVxdWVzdFBhdGguc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbilcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm91dGVTZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByb3V0ZVNlZ21lbnQgPSByb3V0ZVNlZ21lbnRzW2ldXG4gICAgICAgIGNvbnN0IHJlcXVlc3RTZWdtZW50ID0gcmVxdWVzdFNlZ21lbnRzW2ldXG5cbiAgICAgICAgaWYgKHJvdXRlU2VnbWVudC5zdGFydHNXaXRoKCc6JykpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHJvdXRlU2VnbWVudC5zbGljZSgxKSAvLyBSZW1vdmUgdGhlICc6JyBwcmVmaXhcbiAgICAgICAgICAgIHBhcmFtc1twYXJhbU5hbWVdID0gcmVxdWVzdFNlZ21lbnRcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyb3V0ZVNlZ21lbnQgPT09ICcqJykge1xuICAgICAgICAgICAgLy8gQ2FwdHVyZSBhbGwgcmVtYWluaW5nIHNlZ21lbnRzIGFzIGEgc2luZ2xlIHBhdGhcbiAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ1NlZ21lbnRzID0gcmVxdWVzdFNlZ21lbnRzLnNsaWNlKGkpXG4gICAgICAgICAgICBwYXJhbXNbJyonXSA9IHJlbWFpbmluZ1NlZ21lbnRzLmpvaW4oJy8nKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVXJsUXVlcnkocmVxdWVzdFBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IHJlcXVlc3RQYXRoLnNwbGl0KCc/JylbMV1cblxuICAgIGlmICghcXVlcnlTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5XG4gICAgfVxuXG4gICAgcmV0dXJuIHFzLnBhcnNlKHF1ZXJ5U3RyaW5nKVxufVxuIiwiaW1wb3J0IHR5cGUgeyBGZXRjaE9wdGlvbnMgfSBmcm9tICcuL0ZldGNoU2VydmljZS50cydcbmltcG9ydCBGZXRjaFNlcnZpY2UgZnJvbSAnLi9GZXRjaFNlcnZpY2UudHMnXG4vLyBpbXBvcnQgdHlwZSBSb3V0ZXJTZXJ2aWNlIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvUm91dGVyU2VydmljZS50cydcbmltcG9ydCBDb2traWVNYXBFbnRpdHkgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Db29raWVNYXBFbnRpdHkudHMnXG5pbXBvcnQgY29uZmlnIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb25maWcudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMnXG5pbXBvcnQgeyBwYXJzZVVybFBhcmFtcywgcGFyc2VVcmxRdWVyeSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvcGFyc2VSb3V0ZVVybC50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmV0Y2hOb2RlU2VydmljZSBleHRlbmRzIEZldGNoU2VydmljZSB7XG4gICAgcHVibGljIGFzeW5jIGZldGNoPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBpc0ludGVybmFsID0gIXVybC5zdGFydHNXaXRoKCdodHRwOi8vJykgJiYgIXVybC5zdGFydHNXaXRoKCdodHRwczovLycpXG5cbiAgICAgICAgaWYgKCFpc0ludGVybmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mZXRjaEV4dGVybmFsPFQ+KHVybCwgb3B0aW9ucylcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoSW50ZXJuYWw8VD4odXJsLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBmZXRjaEV4dGVybmFsPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBmdWxsVXJsID0gdGhpcy5idWlsZFVybCh1cmwsIG9wdGlvbnMucXVlcnkpXG4gICAgICAgIGNvbnN0IGZldGNoT3B0aW9ucyA9IHRoaXMuYnVpbGRSZXF1ZXN0SW5pdChvcHRpb25zKVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZnVsbFVybCwgZmV0Y2hPcHRpb25zKVxuXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXJyb3IocmVzcG9uc2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlUmVzcG9uc2U8VD4ocmVzcG9uc2UpXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGZldGNoSW50ZXJuYWw8VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM6IEZldGNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHJvdXRlciA9ICBjb250YWluZXIuZ2V0PGFueT4oJ1JvdXRlclNlcnZpY2UnKVxuICAgICAgICBjb25zdCBtZXRob2QgPSBvcHRpb25zLm1ldGhvZCB8fCAnR0VUJ1xuICAgICAgICBjb25zdCByb3V0ZSA9IHJvdXRlci5yZXNvbHZlKG1ldGhvZCwgdXJsKVxuICAgICAgICBjb25zdCBjb29raWUgPSBuZXcgQ29ra2llTWFwRW50aXR5KHtcbiAgICAgICAgICAgIHByZWZpeDogY29uZmlnLmdldCgnY29va2llLnByZWZpeCcsICcnKVxuICAgICAgICB9KVxuICAgICAgICBcbiAgICAgICAgaWYgKGNvbnRhaW5lci5oYXMoJ2Nvb2tpZXMnKSkge1xuICAgICAgICAgICAgY29va2llLmxvYWQoY29udGFpbmVyLmdldDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PignY29va2llcycpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyb3V0ZSB8fCAhcm91dGUuaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb3V0ZSBub3QgZm91bmQgZm9yICR7bWV0aG9kfSAke3VybH1gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcm91dGVyLmV4ZWN1dGUocm91dGUsIHtcbiAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgcGFyYW1zOiBwYXJzZVVybFBhcmFtcyhyb3V0ZS5wYXRoLCB1cmwpLFxuICAgICAgICAgICAgcXVlcnk6IG9wdGlvbnMucXVlcnkgfHwgcGFyc2VVcmxRdWVyeSh1cmwpLFxuICAgICAgICAgICAgYm9keTogb3B0aW9ucy5kYXRhIHx8IG9wdGlvbnMuYm9keSxcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICBjb29raWU6IGNvb2tpZVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiByZXN1bHQgYXMgUHJvbWlzZTxUPlxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZmVjeWNsZUhvb2sge1xuICAgIHB1YmxpYyBob29rX2lkOiBzdHJpbmdcbiAgICBwdWJsaWMgaG9va19hbGlhc2VzPzogc3RyaW5nW11cbiAgICBwdWJsaWMgb3JkZXI/OiBudW1iZXJcbiAgICBwdWJsaWMgc3ViaG9va3M/OiBMaWZlY3ljbGVIb29rW11cblxuICAgIHB1YmxpYyBhc3luYyByZWdpc3RlcigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIGJvb3QoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICBwdWJsaWMgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7IH1cblxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgcmVnaXN0ZXIgKi9cbiAgICBwdWJsaWMgYXN5bmMgb25SZWdpc3RlcigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgbG9hZCAqL1xuICAgIHB1YmxpYyBhc3luYyBvbkxvYWQoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIGJvb3QgKi9cbiAgICBwdWJsaWMgYXN5bmMgb25Cb290KCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSBzaHV0ZG93biAqL1xuICAgIHB1YmxpYyBhc3luYyBvblNodXRkb3duKCk6IFByb21pc2U8dm9pZD4geyB9XG5cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50ICovXG4vLyBAdHMtbm9jaGVja1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb2dnZXJTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdMb2dnZXJTZXJ2aWNlJyBcblxuICAgIHB1YmxpYyBpbmZvKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgd2FybihtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgZXJyb3IobWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG5cbiAgICBwdWJsaWMgY2hpbGQob3B0aW9uczogYW55KTogTG9nZ2VyU2VydmljZSB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICAgICAgcmV0dXJuIG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICB9XG59XG4iLCJpbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcuL0xvZ2dlclNlcnZpY2UudHMnXG5pbXBvcnQgdHlwZSBMaWZlY3ljbGVIb29rIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cydcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJy4uL3V0aWxzL3RyeUNhdGNoLnRzJ1xuaW1wb3J0IHsgb3JkZXJCeSB9IGZyb20gJ2xvZGFzaC1lcydcblxudHlwZSBMaWZlY3ljbGVNZXRob2QgPSAncmVnaXN0ZXInIHwgJ2xvYWQnIHwgJ2Jvb3QnIHwgJ3NodXRkb3duJ1xuXG5pbnRlcmZhY2UgTGlzdE9wdGlvbnMge1xuICAgIGluY2x1ZGU/OiBzdHJpbmcgfCBzdHJpbmdbXVxuICAgIGV4Y2x1ZGU/OiBzdHJpbmcgfCBzdHJpbmdbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpZmVjeWNsZVNlcnZpY2VPcHRpb25zIHtcbiAgICBkZWJ1Zz86IGJvb2xlYW5cbiAgICBob29rcz86IE1hcDxzdHJpbmcsIExpZmVjeWNsZUhvb2s+XG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZVxuICAgIG9uRXJyb3I/OiAoZXJyb3I6IEVycm9yLCBjb250ZXh0OiB7IGhvb2tJZDogc3RyaW5nOyBtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCB9KSA9PiB2b2lkXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZmVjeWNsZVNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0xpZmVjeWNsZVNlcnZpY2UnXG5cbiAgICBwdWJsaWMgaG9va3M6IE1hcDxzdHJpbmcsIExpZmVjeWNsZUhvb2s+XG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuICAgIHB1YmxpYyBkZWJ1ZyA9IGZhbHNlXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBMaWZlY3ljbGVTZXJ2aWNlT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBkYXRhLmRlYnVnID8/IHRoaXMuZGVidWdcbiAgICAgICAgdGhpcy5ob29rcyA9IGRhdGEuaG9va3MgPz8gbmV3IE1hcCgpXG4gICAgICAgIHRoaXMubG9nZ2VyID0gZGF0YS5sb2dnZXIgPz8gbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgICAgICBcbiAgICAgICAgaWYgKGRhdGEub25FcnJvcikge1xuICAgICAgICAgICAgdGhpcy5vbkVycm9yID0gZGF0YS5vbkVycm9yXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25FcnJvcihlcnJvcjogRXJyb3IsIGNvbnRleHQ6IHsgaG9va0lkOiBzdHJpbmc7IG1ldGhvZDogTGlmZWN5Y2xlTWV0aG9kIH0pIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBjb250ZXh0IH0pXG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIGhvb2sgJHtjb250ZXh0Lm1ldGhvZH0gKCR7Y29udGV4dC5ob29rSWR9KTpgLCBlcnJvcilcbiAgICB9XG5cbiAgICBwdWJsaWMgbWFwQWxpYXNlcyhhcmdzOiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW11cbiAgICAgICAgY29uc3QgYWxsID0gQXJyYXkuZnJvbSh0aGlzLmhvb2tzLnZhbHVlcygpKVxuXG4gICAgICAgIGZvciAoY29uc3QgaG9vayBvZiBhbGwpIHtcbiAgICAgICAgICAgIGlmIChhcmdzLmluY2x1ZGVzKGhvb2suaG9va19pZCkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChob29rLmhvb2tfaWQpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGhvb2suaG9va19hbGlhc2VzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlZEFsaWFzID0gaG9vay5ob29rX2FsaWFzZXMuZmluZChhbGlhcyA9PiBhcmdzLmluY2x1ZGVzKGFsaWFzKSlcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkQWxpYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdChvcHRpb25zPzogTGlzdE9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGhvb2tzID0gQXJyYXkuZnJvbSh0aGlzLmhvb2tzLnZhbHVlcygpKVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5leGNsdWRlKSB7XG4gICAgICAgICAgICBsZXQgaWRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmV4Y2x1ZGUpID8gb3B0aW9ucy5leGNsdWRlIDogW29wdGlvbnMuZXhjbHVkZV1cblxuICAgICAgICAgICAgaWRzID0gdGhpcy5tYXBBbGlhc2VzKGlkcylcblxuICAgICAgICAgICAgaG9va3MgPSBob29rcy5maWx0ZXIoaG9vayA9PiAhaWRzLmluY2x1ZGVzKGhvb2suaG9va19pZCkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uaW5jbHVkZSkge1xuICAgICAgICAgICAgbGV0IGlkcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5pbmNsdWRlKSA/IG9wdGlvbnMuaW5jbHVkZSA6IFtvcHRpb25zLmluY2x1ZGVdXG5cbiAgICAgICAgICAgIGlkcyA9IHRoaXMubWFwQWxpYXNlcyhpZHMpXG5cbiAgICAgICAgICAgIGhvb2tzID0gaG9va3MuZmlsdGVyKGhvb2sgPT4gaWRzLmluY2x1ZGVzKGhvb2suaG9va19pZCkpXG4gICAgICAgIH1cblxuICAgICAgICBob29rcyA9IG9yZGVyQnkoaG9va3MsIFsnb3JkZXInXSwgWydhc2MnXSlcblxuICAgICAgICByZXR1cm4gaG9va3NcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKC4uLnBheWxvYWQ6IChMaWZlY3ljbGVIb29rIHwgQ29uc3RydWN0b3I8TGlmZWN5Y2xlSG9vaz4pW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VzOiBMaWZlY3ljbGVIb29rW10gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXlsb2FkKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZXMucHVzaChuZXcgaXRlbSgpKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluc3RhbmNlcy5wdXNoKGl0ZW0pXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgaW5zdGFuY2VzKSB7XG4gICAgICAgICAgICBpZiAoIWhvb2suaG9va19pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ1NraXBwaW5nIGhvb2sgd2l0aG91dCBob29rX2lkOicsIGhvb2spXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5ob29rcy5zZXQoaG9vay5ob29rX2lkLCBob29rKVxuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdhZGQgJyArIGhvb2suaG9va19pZClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGhvb2suc3ViaG9va3MpIHtcbiAgICAgICAgICAgICAgICBob29rLnN1Ymhvb2tzLmZvckVhY2goc3ViaG9vayA9PiB0aGlzLmFkZChzdWJob29rKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbWl0TWV0aG9kKG1ldGhvZDogTGlmZWN5Y2xlTWV0aG9kLCBvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaG9va3MgPSB0aGlzLmxpc3Qob3B0aW9ucykgXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBlbWl0dGluZyAke21ldGhvZH0gZm9yIGhvb2tzOmAsIHtcbiAgICAgICAgICAgICAgICBob29rczogaG9va3MubWFwKGhvb2sgPT4gaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgaG9vayBvZiB0aGlzLmxpc3Qob3B0aW9ucykpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hcCA9IHtcbiAgICAgICAgICAgICAgICByZWdpc3RlcjogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2sucmVnaXN0ZXIoKSwgaG9vay5vblJlZ2lzdGVyKCldKSxcbiAgICAgICAgICAgICAgICBsb2FkOiAoKSA9PiBQcm9taXNlLmFsbChbaG9vay5sb2FkKCksIGhvb2sub25Mb2FkKCldKSxcbiAgICAgICAgICAgICAgICBib290OiAoKSA9PiBQcm9taXNlLmFsbChbaG9vay5ib290KCksIGhvb2sub25Cb290KCldKSxcbiAgICAgICAgICAgICAgICBzaHV0ZG93bjogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2suc2h1dGRvd24oKSwgaG9vay5vblNodXRkb3duKCldKSxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IHRyeUNhdGNoKCgpID0+IG1hcFttZXRob2RdKCkpXG5cbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihlcnJvciwgeyBob29rSWQ6IGhvb2suaG9va19pZCwgbWV0aG9kIH0pXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgJHttZXRob2R9IGAgKyBob29rLmhvb2tfaWQpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdChwYXlsb2FkOiBMaWZlY3ljbGVNZXRob2QgfCBMaWZlY3ljbGVNZXRob2RbXSwgb3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IG1ldGhvZHMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpID8gcGF5bG9hZCA6IFtwYXlsb2FkXVxuXG4gICAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdE1ldGhvZChtZXRob2QsIG9wdGlvbnMpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXIob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ3JlZ2lzdGVyJywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZChvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnbG9hZCcsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGJvb3Qob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2Jvb3QnLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzaHV0ZG93bihvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdzaHV0ZG93bicsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhvb2tzLmNsZWFyKClcbiAgICB9XG59XG4iLCJpbXBvcnQgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnO1xuaW1wb3J0IEJhc2VMaWZlY3ljbGVTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZmVjeWNsZVNlcnZpY2UgZXh0ZW5kcyBCYXNlTGlmZWN5Y2xlU2VydmljZSB7XG4gICAgcHVibGljIGFkZEltcG9ydHMoaW1wb3J0czogUmVjb3JkPHN0cmluZywgYW55Pil7XG4gICAgICAgIGNvbnN0IGhvb2tzOiBMaWZlY3ljbGVIb29rW10gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIG1vZF0gb2YgT2JqZWN0LmVudHJpZXMoaW1wb3J0cykpIHtcbiAgICAgICAgICAgIGNvbnN0IEhvb2tDbGFzcyA9IG1vZC5kZWZhdWx0IHx8IG1vZFxuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgSG9va0NsYXNzKCkgYXMgTGlmZWN5Y2xlSG9va1xuXG4gICAgICAgICAgICBpbnN0YW5jZS5ob29rX2lkID0gaW5zdGFuY2UuaG9va19pZCB8fCBuYW1lXG5cbiAgICAgICAgICAgIGhvb2tzLnB1c2goaW5zdGFuY2UpXG4gICAgICAgIH1cblxuICAgICAgICBob29rcy5mb3JFYWNoKGhvb2sgPT4gdGhpcy5hZGQoaG9vaykpXG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWVudUl0ZW0gZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBsYWJlbDogc3RyaW5nXG4gICAgcHVibGljIGxheW91dDogc3RyaW5nXG5cbiAgICBwdWJsaWMgdG8/OiBzdHJpbmdcblxuICAgIHB1YmxpYyB0YXJnZXQ/OiAnX2JsYW5rJyB8ICdfc2VsZicgfCAnX3BhcmVudCcgfCAnX3RvcCdcbiAgICBwdWJsaWMgZ3JvdXA/OiBzdHJpbmdcbiAgICBwdWJsaWMgb3JkZXI/OiBudW1iZXJcbiAgICBwdWJsaWMgaWNvbj86IHN0cmluZ1xuICAgIHB1YmxpYyBwYXJlbnQ/OiBzdHJpbmdcbn1cbiIsImltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBlcm1pc3Npb25FbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgcHVibGljIG9yaWdpbjogc3RyaW5nXG4gICAgcHVibGljIHN1YmplY3Q6IHN0cmluZ1xuICAgIHB1YmxpYyBhY3Rpb246IHN0cmluZ1xuICAgIHB1YmxpYyBjb25kaXRpb25zOiBzdHJpbmcgfCBudWxsIHwgUmVjb3JkPHN0cmluZywgYW55PiA9IG51bGxcblxuICAgIHB1YmxpYyBnZXQgZWRpdGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbiA9PT0gJ2N1c3RvbSdcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBhcnNlZENvbmRpdGlvbnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb25kaXRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtlcnJvciwganNvbl0gPSB0cnlDYXRjaC5zeW5jKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25kaXRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuY29uZGl0aW9ucyBhcyBzdHJpbmcpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnMgYXMgUmVjb3JkPHN0cmluZywgYW55PlxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBlcnJvciA/IHt9IDoganNvblxuICAgIH1cbn1cbiIsImltcG9ydCB7IGRlZmluZUFiaWxpdHksIHN1YmplY3QgYXMgY3JlYXRlU3ViamVjdCB9IGZyb20gJ0BjYXNsL2FiaWxpdHknXG5pbXBvcnQgUGVybWlzc2lvbiBmcm9tICcuL1Blcm1pc3Npb25FbnRpdHkudHMnXG5pbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFjbEVudGl0eSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnQWNsRW50aXR5J1xuXG4gICAgcHVibGljIGFiaWxpdHk6IFJldHVyblR5cGU8dHlwZW9mIGRlZmluZUFiaWxpdHk+XG4gICAgcHVibGljIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uW11cbiAgICBwdWJsaWMgZGVidWc6IGJvb2xlYW4gPSBmYWxzZVxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFBhcnRpYWw8QWNsRW50aXR5PiA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gZGF0YS5wZXJtaXNzaW9ucyB8fCBbXVxuICAgICAgICBjb25zdCBwZXJtcyA9IHBlcm1pc3Npb25zLm1hcCgocGVybWlzc2lvbikgPT4gUGVybWlzc2lvbi5mcm9tKHBlcm1pc3Npb24pKVxuXG4gICAgICAgIFxuICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gcGVybXNcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IGRhdGEuZGVidWcgfHwgZmFsc2VcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBkYXRhLmxvZ2dlciB8fCBuZXcgTG9nZ2VyU2VydmljZSgpLmNoaWxkKHsgbGFiZWw6ICdhY2wnIH0pXG4gICAgICAgIFxuICAgICAgICB0aGlzLmFiaWxpdHkgPSBkZWZpbmVBYmlsaXR5KChjYW4pID0+IHtcbiAgICAgICAgICAgIHBlcm1zLmZvckVhY2goKHBlcm1pc3Npb24pID0+IHtcbiAgICAgICAgICAgICAgICBjYW4ocGVybWlzc2lvbi5hY3Rpb24sIHBlcm1pc3Npb24uc3ViamVjdCwgcGVybWlzc2lvbi5wYXJzZWRDb25kaXRpb25zKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2luaXRpYWxpemVkIGluIGRlYnVnIG1vZGUnLCB7XG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IHRoaXMucGVybWlzc2lvbnMsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNhbihhY3Rpb246IHN0cmluZywgc3ViamVjdDogYW55LCBvYmplY3Q/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG5cbiAgICAgICAgaWYgKCFvYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2FuKGFjdGlvbiwgc3ViamVjdClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YmplY3RXaXRoT2JqZWN0ID0gY3JlYXRlU3ViamVjdChzdWJqZWN0LCBvYmplY3QpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW4oYWN0aW9uLCBzdWJqZWN0V2l0aE9iamVjdClcbiAgICB9XG5cbiAgICBwdWJsaWMgY2Fubm90KGFjdGlvbjogc3RyaW5nLCBzdWJqZWN0OiBhbnksIG9iamVjdD86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgaWYgKCFvYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2Fubm90KGFjdGlvbiwgc3ViamVjdClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YmplY3RXaXRoT2JqZWN0ID0gY3JlYXRlU3ViamVjdChzdWJqZWN0LCBvYmplY3QpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW5ub3QoYWN0aW9uLCBzdWJqZWN0V2l0aE9iamVjdClcbiAgICB9XG5cbiAgICBwdWJsaWMgc3ViamVjdChzdWJqZWN0OiBzdHJpbmcsIG9iamVjdDogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICByZXR1cm4gY3JlYXRlU3ViamVjdChzdWJqZWN0LCBvYmplY3QpXG4gICAgfVxufVxuIiwiaW1wb3J0IGNvbnRhaW5lciBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuaW1wb3J0IEFjbEVudGl0eSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0FjbEVudGl0eS50cydcblxuY29uc3QgYWNsID0gY29udGFpbmVyLnByb3h5PEFjbEVudGl0eT4oQWNsRW50aXR5KVxuXG5leHBvcnQgZGVmYXVsdCBhY2xcbiIsImltcG9ydCBNZW51SXRlbSBmcm9tICcjY2xpZW50L2VudGl0aWVzL01lbnVJdGVtRW50aXR5LnRzJ1xuaW1wb3J0IGFjbCBmcm9tICcjY2xpZW50L2ZhY2FkZXMvYWNsLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RGaWx0ZXIge1xuICAgIGxheW91dD86IHN0cmluZ1xuICAgIGdyb3VwPzogc3RyaW5nXG4gICAgcGFyZW50Pzogc3RyaW5nXG4gICAgYWxsb3dlZD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWVudVNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ01lbnVTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGl0ZW1zOiBNYXA8c3RyaW5nLCBNZW51SXRlbT4gPSBuZXcgTWFwKClcblxuICAgIHB1YmxpYyBhZGQoLi4uaXRlbTogT21pdDxQYXJ0aWFsPE1lbnVJdGVtPiwgJ21lcmdlJyB8ICdmcm9tJz5bXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgaXRlbSkge1xuXG4gICAgICAgICAgICBpZiAoIWkuaWQpIHtcbiAgICAgICAgICAgICAgICBpLmlkID0gSlNPTi5zdHJpbmdpZnkoaSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5pdGVtcy5zZXQoaS5pZCwgTWVudUl0ZW0uZnJvbShpKSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmUoaWQ6IE1lbnVJdGVtWydpZCddKSB7XG4gICAgICAgIHRoaXMuaXRlbXMuZGVsZXRlKGlkKVxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0KGZpbHRlcjogTGlzdEZpbHRlciA9IHt9KSB7XG4gICAgICAgIGxldCBpdGVtcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoQXJyYXkuZnJvbSh0aGlzLml0ZW1zLnZhbHVlcygpKSkpIGFzIE1lbnVJdGVtW11cblxuXG4gICAgICAgIGlmIChmaWx0ZXIubGF5b3V0KSB7XG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpID0+IGkubGF5b3V0ID09PSBmaWx0ZXIubGF5b3V0KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlci5ncm91cCkge1xuICAgICAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoaSA9PiBpLmdyb3VwID09PSBmaWx0ZXIuZ3JvdXAgfHwgaS5wYXJlbnQgPT09IGZpbHRlci5ncm91cClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXIucGFyZW50KSB7XG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpID0+IGkucGFyZW50ID09PSBmaWx0ZXIucGFyZW50KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlci5hbGxvd2VkICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyLmFsbG93ZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMuZmlsdGVyKGkgPT4gYWNsLmNhbigndmlldycsIGkpKVxuICAgICAgICB9XG5cbiAgICAgICAgaXRlbXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3JkZXJBID0gYS5vcmRlciA/IGEub3JkZXIgOiA5OFxuICAgICAgICAgICAgY29uc3Qgb3JkZXJCID0gYi5vcmRlciA/IGIub3JkZXIgOiA5OFxuXG4gICAgICAgICAgICByZXR1cm4gb3JkZXJBIC0gb3JkZXJCXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zXG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCkge1xuICAgICAgICB0aGlzLml0ZW1zLmNsZWFyKClcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE5hdmlnYXRpb25HdWFyZCB9IGZyb20gJ3Z1ZS1yb3V0ZXInXG5pbXBvcnQgY29uZmlnIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb25maWcudHMnXG5cbmNvbnN0IHNldHVwR3VhcmQ6IE5hdmlnYXRpb25HdWFyZCA9ICh0bykgPT4ge1xuICAgIGNvbnN0IHNldHVwID0gY29uZmlnLmdldDxhbnk+KCdzZXR1cCcpXG4gICAgXG4gICAgY29uc3QgY29tcGxldGVkID0gIXNldHVwPy5uZWVkX2RhdGFiYXNlICYmICFzZXR1cD8ubmVlZF91c2Vyc1xuICAgIFxuICAgIGlmIChjb21wbGV0ZWQgJiYgdG8ucGF0aC5zdGFydHNXaXRoKCcvc2V0dXAnKSkge1xuICAgICAgICByZXR1cm4gJy8nXG4gICAgfVxuICAgIFxuICAgIGlmIChjb21wbGV0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgXG4gICAgaWYgKCF0by5wYXRoLnN0YXJ0c1dpdGgoJy9zZXR1cCcpKSB7XG4gICAgICAgIHJldHVybiAnL3NldHVwJ1xuICAgIH1cbiAgICBcbiAgICBpZiAodG8ucGF0aCA9PT0gJy9zZXR1cCcpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9ICAgIFxuXG4gICAgaWYgKHNldHVwPy5uZWVkX2RhdGFiYXNlKSB7XG4gICAgICAgIHJldHVybiB0by5wYXRoICE9PSAnL3NldHVwL2RhdGFiYXNlJyA/ICcvc2V0dXAvZGF0YWJhc2UnIDogdHJ1ZVxuICAgIH1cblxuICAgIGlmIChzZXR1cD8ubmVlZF91c2Vycykge1xuICAgICAgICByZXR1cm4gdG8ucGF0aCAhPT0gJy9zZXR1cC91c2VyJyA/ICcvc2V0dXAvdXNlcicgOiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2V0dXBHdWFyZFxuIiwiaW1wb3J0IHtcbiAgICBjcmVhdGVSb3V0ZXIgYXMgY3JlYXRlVnVlUm91dGVyLFxuICAgIGNyZWF0ZU1lbW9yeUhpc3RvcnksXG4gICAgY3JlYXRlV2ViSGlzdG9yeVxufSBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IHR5cGUgeyBOYXZpZ2F0aW9uR3VhcmQsIFJvdXRlciBhcyBWdWVSb3V0ZXIgfSBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IHR5cGUgeyBSb3V0ZVJlY29yZFJhdyB9IGZyb20gJ3Z1ZS1yb3V0ZXInXG5pbXBvcnQgdHlwZSB7IERlZmluZUNvbXBvbmVudCB9IGZyb20gJ3Z1ZSdcbmltcG9ydCBzZXR1cEd1YXJkIGZyb20gJyNjbGllbnQvZ3VhcmRzL3NldHVwR3VhcmQudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVyIGV4dGVuZHMgVnVlUm91dGVyIHtcbiAgICBhdXRvOiB0eXBlb2YgYXV0bztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdXRvT3B0aW9ucyB7XG4gICAgZ3VhcmRzPzogTmF2aWdhdGlvbkd1YXJkW10gfCAoKHJlY29yZDogUm91dGVSZWNvcmRSYXcpID0+IE5hdmlnYXRpb25HdWFyZFtdKTtcbiAgICBzdHJpcD86IChzdHJpbmcgfCBSZWdFeHApW107XG4gICAgZXhjbHVkZT86IChzdHJpbmcgfCBSZWdFeHApW107XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIHJlZmluZT86IChyZWNvcmRzOiBSb3V0ZVJlY29yZFJhd1tdKSA9PiBSb3V0ZVJlY29yZFJhd1tdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXV0byhpbXBvcnRzOiBSZWNvcmQ8c3RyaW5nLCBEZWZpbmVDb21wb25lbnQgfCAoKCkgPT4gUHJvbWlzZTxEZWZpbmVDb21wb25lbnQ+KT4sIG9wdGlvbnM6IEF1dG9PcHRpb25zID0ge30pOiBSb3V0ZVJlY29yZFJhd1tdIHtcbiAgICBsZXQgcm91dGVzOiBSb3V0ZVJlY29yZFJhd1tdID0gW11cblxuICAgIGZvciAoY29uc3QgW2ZpbGVuYW1lLCBjb21wb25lbnRdIG9mIE9iamVjdC5lbnRyaWVzKGltcG9ydHMpKSB7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZXhjbHVkZT8uc29tZShydWxlID0+XG4gICAgICAgICAgICB0eXBlb2YgcnVsZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IGZpbGVuYW1lLmluY2x1ZGVzKHJ1bGUpXG4gICAgICAgICAgICAgICAgOiBydWxlLnRlc3QoZmlsZW5hbWUpXG4gICAgICAgICkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFydHMgPSBmaWxlbmFtZVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcLnZ1ZSQvLCAnJylcbiAgICAgICAgICAgIC5zcGxpdCgnLycpXG4gICAgICAgICAgICAuZmlsdGVyKHAgPT4gcCAmJiAhcC5zdGFydHNXaXRoKCcuJykpXG4gICAgICAgICAgICAubWFwKHBhcnQgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBwID0gcGFydFxuXG4gICAgICAgICAgICAgICAgaWYgKHAuc3RhcnRzV2l0aCgnWycpICYmIHAuZW5kc1dpdGgoJ10nKSkge1xuICAgICAgICAgICAgICAgICAgICBwID0gJzonICsgcC5zbGljZSgxLCAtMSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcFxuICAgICAgICAgICAgfSlcblxuXG4gICAgICAgIC8vIFN0cmlwIHNwZWNpZmljIHNlZ21lbnRzXG4gICAgICAgIGlmIChvcHRpb25zLnN0cmlwPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHBhcnRzID0gcGFydHMuZmlsdGVyKHAgPT5cbiAgICAgICAgICAgICAgICAhb3B0aW9ucy5zdHJpcCEuc29tZShydWxlID0+XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBydWxlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBwID09PSBydWxlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHJ1bGUudGVzdChwKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXRoID0gcGFydHMuam9pbignLycpLnJlcGxhY2UoL2luZGV4JC8sICcnKVxuXG4gICAgICAgIGlmIChvcHRpb25zLnByZWZpeCkge1xuICAgICAgICAgICAgcGF0aCA9IG9wdGlvbnMucHJlZml4ICsgJy8nICsgcGF0aFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgcGF0aCA9ICcvJyArIHBhdGhcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVjb3JkID0ge1xuICAgICAgICAgICAgcGF0aDogcGF0aCxcbiAgICAgICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50IGFzIERlZmluZUNvbXBvbmVudCxcbiAgICAgICAgICAgIGJlZm9yZUVudGVyOiBbXSBhcyBOYXZpZ2F0aW9uR3VhcmRbXSxcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKG9wdGlvbnMuZ3VhcmRzICYmIEFycmF5LmlzQXJyYXkob3B0aW9ucy5ndWFyZHMpKSB7XG4gICAgICAgICAgICByZWNvcmQuYmVmb3JlRW50ZXIgPSBvcHRpb25zLmd1YXJkc1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZ3VhcmRzICYmIHR5cGVvZiBvcHRpb25zLmd1YXJkcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmVjb3JkLmJlZm9yZUVudGVyID0gb3B0aW9ucy5ndWFyZHMocmVjb3JkKVxuICAgICAgICB9XG5cbiAgICAgICAgcm91dGVzLnB1c2gocmVjb3JkKVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnJlZmluZSkge1xuICAgICAgICByb3V0ZXMgPSBvcHRpb25zLnJlZmluZShyb3V0ZXMpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJvdXRlc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUm91dGVyKCkge1xuICAgIGNvbnN0IHNzciA9IGltcG9ydC5tZXRhLmVudi5TU1JcblxuICAgIGNvbnN0IHJvdXRlciA9IGNyZWF0ZVZ1ZVJvdXRlcih7XG4gICAgICAgIGhpc3Rvcnk6IHNzciA/IGNyZWF0ZU1lbW9yeUhpc3RvcnkoKSA6IGNyZWF0ZVdlYkhpc3RvcnkoKSxcbiAgICAgICAgcm91dGVzOiBbXSxcbiAgICAgICAgc2Nyb2xsQmVoYXZpb3IodG8sIGZyb20sIHNhdmVkUG9zaXRpb24pIHtcbiAgICAgICAgICAgIGlmIChzYXZlZFBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNhdmVkUG9zaXRpb25cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdG9wOiAwIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KSBhcyBhbnkgYXMgUm91dGVyXG5cbiAgICByb3V0ZXIuYmVmb3JlRWFjaChzZXR1cEd1YXJkKVxuXG4gICAgcm91dGVyLmF1dG8gPSAoaW1wb3J0czogUmVjb3JkPHN0cmluZywgRGVmaW5lQ29tcG9uZW50IHwgKCgpID0+IFByb21pc2U8RGVmaW5lQ29tcG9uZW50Pik+LCBvcHRpb25zOiBBdXRvT3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGF1dG9Sb3V0ZXMgPSBhdXRvKGltcG9ydHMsIG9wdGlvbnMpXG4gICAgICAgIFxuICAgICAgICBhdXRvUm91dGVzLmZvckVhY2gocm91dGUgPT4gcm91dGVyLmFkZFJvdXRlKHJvdXRlKSlcblxuICAgICAgICByZXR1cm4gYXV0b1JvdXRlc1xuICAgIH1cblxuICAgIHJldHVybiByb3V0ZXJcbn1cblxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgVG9hc3RTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdUb2FzdFNlcnZpY2UnXG5cbiAgICBwdWJsaWMgc3VjY2VzcyhtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdTdWNjZXNzOicsIG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6JywgbWVzc2FnZSwgb3B0aW9ucylcbiAgICB9XG59XG4iLCJpbXBvcnQgQXV0aFNlcnZpY2UgZnJvbSAnI2NsaWVudC9zZXJ2aWNlcy9BdXRoU2VydmljZS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5cbmNvbnN0IGF1dGggPSBjb250YWluZXIucHJveHk8QXV0aFNlcnZpY2U+KEF1dGhTZXJ2aWNlKVxuXG5pZiAoaW1wb3J0Lm1ldGEuZW52LkRFViAmJiAhaW1wb3J0Lm1ldGEuZW52LlNTUikge1xuICAgICh3aW5kb3cgYXMgYW55KS5hdXRoID0gYXV0aFxufVxuXG5leHBvcnQgZGVmYXVsdCBhdXRoXG4iLCJpbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuXG5jb25zdCBsb2dnZXIgPSBjb250YWluZXIucHJveHk8TG9nZ2VyU2VydmljZT4oTG9nZ2VyU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgbG9nZ2VyXG4iLCJpbXBvcnQgTWVudVNlcnZpY2UgZnJvbSAnI2NsaWVudC9zZXJ2aWNlcy9NZW51U2VydmljZS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5cbmNvbnN0IG1lbnUgPSBjb250YWluZXIucHJveHk8TWVudVNlcnZpY2U+KE1lbnVTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCBtZW51XG4iLCJpbXBvcnQgY29udGFpbmVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMnXG5pbXBvcnQgdHlwZSB7IFJvdXRlTG9jYXRpb25Ob3JtYWxpemVkR2VuZXJpYyB9IGZyb20gJ3Z1ZS1yb3V0ZXInXG5cbmNvbnN0IHJvdXRlID0gY29udGFpbmVyLnByb3h5PFJvdXRlTG9jYXRpb25Ob3JtYWxpemVkR2VuZXJpYz4oJ3JvdXRlJylcblxuZXhwb3J0IGRlZmF1bHQgcm91dGVcblxuIiwiaW1wb3J0IGNvbnRhaW5lciBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuaW1wb3J0IHR5cGUgeyBSb3V0ZXIgfSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMnXG5cbmNvbnN0IHJvdXRlciA9IGNvbnRhaW5lci5wcm94eTxSb3V0ZXI+KCdyb3V0ZXInKVxuXG5leHBvcnQgZGVmYXVsdCByb3V0ZXJcbiIsImltcG9ydCBjb250YWluZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cydcbmltcG9ydCBUb2FzdFNlcnZpY2UgZnJvbSAnI2NsaWVudC9zZXJ2aWNlcy9Ub2FzdFNlcnZpY2UudHMnXG5cbmNvbnN0IHRvYXN0ID0gY29udGFpbmVyLnByb3h5PFRvYXN0U2VydmljZT4oVG9hc3RTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCB0b2FzdFxuIiwiaW1wb3J0IHR5cGUgTW9kdWxlTWFuaWZlc3QgZnJvbSAnLi9Nb2R1bGVNYW5pZmVzdEVudGl0eS50cydcbmltcG9ydCBMaWZlY3ljbGVIb29rIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cydcbmltcG9ydCB7IGNvbXBvc2UsIG1peGluIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuXG5pbnRlcmZhY2UgTW9kdWxlVXBncmFkZUluZm8ge1xuICAgIHNvdXJjZTogJ2dpdCcgfCAnemlwJ1xuICAgIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2R1bGUgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHksIG1peGluKExpZmVjeWNsZUhvb2spKSB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGVuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICAgIHB1YmxpYyBkZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuICAgIHB1YmxpYyBidWlsZDogTW9kdWxlTWFuaWZlc3RbJ2J1aWxkJ10gPSB7fVxuICAgIHB1YmxpYyBkaXJlY3Rvcnk6IHN0cmluZ1xuXG4gICAgcHVibGljIHVwZ3JhZGVfaW5mbz86IE1vZHVsZVVwZ3JhZGVJbmZvXG5cbiAgICBwdWJsaWMgc2V0RGF0YShkYXRhOiBQYXJ0aWFsPE1vZHVsZSB8IE1vZHVsZU1hbmlmZXN0Pikge1xuICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGRhdGEpLmZpbHRlcigoWywgdl0pID0+IHYgIT09IHVuZGVmaW5lZClcbiAgICAgICAgKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZmlsdGVyZWQpXG5cbiAgICAgICAgdGhpcy5ob29rX2lkID0gYG1vZHVsZToke3RoaXMuaWR9YFxuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvTW9kdWxlRW50aXR5LnRzJ1xuaW1wb3J0IHsgY29tcG9zZVdpdGggfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZHVsZSBleHRlbmRzIGNvbXBvc2VXaXRoKEJhc2UpIHtcbiAgIFxufVxuIiwiaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luRW50aXR5IGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5KSB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHZlcnNpb246IHN0cmluZ1xuICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuXG59XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL1BsdWdpbkVudGl0eS50cydcbmltcG9ydCByb3V0ZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL3JvdXRlci50cydcbmltcG9ydCB7IGNvbXBvc2VXaXRoIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IHR5cGUgeyBBdXRvT3B0aW9ucyB9IGZyb20gJyNjbGllbnQvc2VydmljZXMvUm91dGVyU2VydmljZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luRW50aXR5IGV4dGVuZHMgY29tcG9zZVdpdGgoQmFzZSkge1xuICAgIHB1YmxpYyBhZGRQYWdlc0ZvbGRlcihpbXBvcnRzOiBhbnksIG9wdGlvbnM/OiBBdXRvT3B0aW9ucykge1xuICAgICAgICByb3V0ZXIuYXV0byhpbXBvcnRzLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCkge1xuICAgICAgICAvLyBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBsb2FkIGFkZGl0aW9uYWwgZGF0YSBmcm9tIHRoZSBwbHVnaW4ncyBkaXJlY3RvcnkgaWYgbmVlZGVkXG4gICAgfVxufVxuIiwiaW1wb3J0ICRvcmlnaW5hbCBmcm9tIFwiI2NsaWVudC9mYWNhZGVzL2ZldGNoLnRzXCI7XG5cbi8qKiBAZGVwcmVjYXRlZCBVc2UgJGZldGNoIGZhY2FkZSAqL1xuZXhwb3J0IGNvbnN0ICRmZXRjaCA9ICRvcmlnaW5hbDtcbiIsImltcG9ydCB7ICRmZXRjaCB9IGZyb20gJy4vZmV0Y2hlcidcblxuaW50ZXJmYWNlIFBpY2tPcHRpb25zIHtcbiAgICBhY2NlcHQ/OiBzdHJpbmdcbiAgICBtdWx0aXBsZT86IGJvb2xlYW5cbn1cblxudHlwZSBQaWNrUmVzdWx0PFQgZXh0ZW5kcyBQaWNrT3B0aW9ucz4gPSBUWydtdWx0aXBsZSddIGV4dGVuZHMgdHJ1ZSA/IEZpbGVbXSA6IEZpbGUgfCBudWxsXG5cbmZ1bmN0aW9uIHBpY2s8VCBleHRlbmRzIFBpY2tPcHRpb25zPihvcHRpb25zOiBUKTogUHJvbWlzZTxQaWNrUmVzdWx0PFQ+PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxuXG4gICAgICAgIGlucHV0LnR5cGUgPSAnZmlsZSdcbiAgICAgICAgaW5wdXQuYWNjZXB0ID0gb3B0aW9ucy5hY2NlcHQgfHwgJyovKidcbiAgICAgICAgaW5wdXQubXVsdGlwbGUgPSBvcHRpb25zLm11bHRpcGxlIHx8IGZhbHNlXG5cbiAgICAgICAgaW5wdXQub25jaGFuZ2UgPSAoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudFxuICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBBcnJheS5mcm9tKHRhcmdldC5maWxlcyBhcyBGaWxlTGlzdCkgYXMgRmlsZVtdXG5cbiAgICAgICAgICAgIHJlc29sdmUoKG9wdGlvbnMubXVsdGlwbGUgPyBBcnJheS5mcm9tKGZpbGVzKSA6IGZpbGVzWzBdKSBhcyBQaWNrUmVzdWx0PFQ+KVxuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXQub25jYW5jZWwgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKG9wdGlvbnMubXVsdGlwbGUgPyBbXSA6IChudWxsIGFzIGFueSkpXG4gICAgICAgIH1cblxuICAgICAgICBpbnB1dC5jbGljaygpXG4gICAgfSlcbn1cblxuZnVuY3Rpb24gdG9VaW50OEFycmF5KGZpbGU6IEZpbGUpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpXG5cbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IChlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZS50YXJnZXQ/LnJlc3VsdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgVWludDhBcnJheShlLnRhcmdldC5yZXN1bHQpKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gcmVhZCBmaWxlIGFzIEFycmF5QnVmZmVyJykpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZWFkZXIub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChyZWFkZXIuZXJyb3IpXG4gICAgICAgIH1cblxuICAgICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSlcbiAgICB9KVxufVxuXG5pbnRlcmZhY2UgVXBsb2FkT3B0aW9ucyB7XG4gICAgZHJpdmVJZDogc3RyaW5nXG4gICAgZmlsZTogRmlsZVxuICAgIGRpcmVjdG9yeT86IHN0cmluZ1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGxvYWQob3B0aW9uczogVXBsb2FkT3B0aW9ucyl7XG4gICAgY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgXG4gICAgZm9ybS5hcHBlbmQoJ2ZpbGUnLCBvcHRpb25zLmZpbGUpXG5cbiAgICBpZiAob3B0aW9ucy5kaXJlY3RvcnkpIHtcbiAgICAgICAgZm9ybS5hcHBlbmQoJ2RpcmVjdG9yeScsIG9wdGlvbnMuZGlyZWN0b3J5KVxuICAgIH1cblxuICAgIHJldHVybiAkZmV0Y2goYC9hcGkvZHJpdmVzLyR7b3B0aW9ucy5kcml2ZUlkfS91cGxvYWRgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5OiBmb3JtLFxuICAgICAgICBxdWVyeTogeyBkaXJlY3Rvcnk6IG9wdGlvbnMuZGlyZWN0b3J5LCB9XG4gICAgfSlcbn1cblxuZXhwb3J0IGNvbnN0ICRmaWxlID0ge1xuICAgIHBpY2ssXG4gICAgdXBsb2FkLFxuICAgIHRvVWludDhBcnJheSxcbn0iLCJpbXBvcnQgdHlwZSB7IE5hdmlnYXRpb25HdWFyZCB9IGZyb20gJ3Z1ZS1yb3V0ZXInXG5pbXBvcnQgYXV0aCBmcm9tICcjY2xpZW50L2ZhY2FkZXMvYXV0aC50cydcblxuZXhwb3J0IGludGVyZmFjZSBBdXRoR3VhcmRPcHRpb25zIHtcbiAgICByZWRpcmVjdDogc3RyaW5nXG4gICAgZXhjbHVkZT86IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBdXRoR3VhcmQob3B0aW9uczogQXV0aEd1YXJkT3B0aW9ucyk6IE5hdmlnYXRpb25HdWFyZCB7XG4gICAgY29uc3QgZXhjbHVkZSA9IG9wdGlvbnMuZXhjbHVkZSB8fCBbJy9hdXRoL2xvZ2luJywgJy9hdXRoL3JlZ2lzdGVyJ11cbiAgICBcbiAgICByZXR1cm4gKHRvKSA9PiB7XG4gICAgICAgIGlmICghYXV0aC51c2VyICYmICFleGNsdWRlLmluY2x1ZGVzKHRvLnBhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5yZWRpcmVjdFxuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBhdXRoR3VhcmQgPSBjcmVhdGVBdXRoR3VhcmQoeyBcbiAgICByZWRpcmVjdDogJy9hdXRoL2xvZ2luJyxcbn0pXG5cbmV4cG9ydCBkZWZhdWx0IGF1dGhHdWFyZFxuIiwiaW1wb3J0IGF1dGggZnJvbSAnI2NsaWVudC9mYWNhZGVzL2F1dGgudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgR3Vlc3RHdWFyZE9wdGlvbnMge1xuICAgIHJlZGlyZWN0OiBzdHJpbmdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUd1ZXN0R3VhcmQob3B0aW9uczogR3Vlc3RHdWFyZE9wdGlvbnMpIHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoYXV0aC51c2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5yZWRpcmVjdFxuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBndWVzdEd1YXJkID0gY3JlYXRlR3Vlc3RHdWFyZCh7XG4gICAgcmVkaXJlY3Q6ICcvJ1xufSlcblxuZXhwb3J0IGRlZmF1bHQgZ3Vlc3RHdWFyZFxuIl0sIm1hcHBpbmdzIjoibVJBWUEsZUFBc0IsRUFBK0IsRUFBMkMsQ0FDNUYsR0FBSSxDQUVBLE1BQU8sQ0FBQyxLQURPLE1BQU0sR0FBTyxDQUNQLE9BQ2hCLEVBQU8sQ0FDWixNQUFPLENBQUMsRUFBYyxLQUFLLEVBSW5DLEVBQVMsS0FBTyxTQUEyQixFQUE2QixDQUNwRSxHQUFJLENBRUEsTUFBTyxDQUFDLEtBRE8sR0FB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
|
|
1
|
+
import{toast as e}from"vue-sonner";import t from"qs";import{get as n,has as r,orderBy as i,set as a,unset as o}from"lodash-es";import{defineAbility as s,subject as c}from"@casl/ability";import{createMemoryHistory as l,createRouter as u,createWebHistory as d}from"vue-router";async function f(e){try{return[null,await e()]}catch(e){return[e,null]}}f.sync=function(e){try{return[null,e()]}catch(e){return[e,null]}};var p=class{static __container_entry_key=`FetchService`;async handleError(t){if(!(t.headers.get(`Content-Type`)||``).includes(`application/json`)){e.error($t(`Internal Server Error`));return}if(t.headers.get(`Content-Type`)?.includes(`json`)){let n=await t.json().catch(()=>({message:$t(`Internal Server Error`)}));n.message&&e.error(n.message)}}buildUrl(e,n){if(!n)return e;let r=t.stringify(n,{arrayFormat:`brackets`});return e+`?`+r}buildRequestInit(e){let t={...e};return e.data&&(t.body=JSON.stringify(e.data),t.headers={...t.headers,"Content-Type":`application/json`}),t}async parseResponse(e){return e.headers.get(`Content-Type`)?.includes(`json`)?e.json():e.text()}async fetch(e,t={}){throw Error(`Method not implemented`)}async try(e,t={}){return f(()=>this.fetch(e,t))}async get(e,t={}){return this.fetch(e,{...t,method:`GET`})}async post(e,t={}){return this.fetch(e,{...t,method:`POST`})}async put(e,t={}){return this.fetch(e,{...t,method:`PUT`})}async delete(e,t={}){return this.fetch(e,{...t,method:`DELETE`})}},m=class e extends Error{statusCode=500;constructor(e,t=500){super(e),this.name=this.constructor.name,this.statusCode=t}static fromError(t){return new e(t.message,500)}},h=class{entries=new Map;loadFromRecord(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[String(t)]=n;return e}getKey(e){let t=e;(typeof e==`function`||typeof e==`object`)&&(t=e.name);let n=typeof e!=`string`&&typeof e!=`symbol`;return n&&!e.__container_entry_key&&console.warn(`Warning: The constructor ${e.name} does not have a unique identifier. Consider adding a static property __container_entry_key to avoid potential conflicts.`),n&&e.__container_entry_key&&(t=e.__container_entry_key),t}set(e,t){let n=this.getKey(e);return this.entries.set(n,t),this}has(e){let t=this.getKey(e);return this.entries.has(t)}get(e){let t=this.getKey(e);if(!this.entries.has(t))throw new m(`Entry with key "${String(t)}" not found in container.`);return this.entries.get(t)}singleton(e){let t=e.name,n=this.entries.get(t);if(n)return n;let r=new e;return this.entries.set(t,r),r}load(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}proxy(e){return new Proxy({},{get:(t,n)=>{let r=this.get(e),i=r[n];return typeof i==`function`?i.bind(r):r[n]},set:(t,n,r)=>{let i=this.get(e);return i[n]=r,!0}})}keys(){return Array.from(this.entries.keys())}};const g=globalThis.clientContainer||new h;globalThis.clientContainer=g;const _=g.proxy(p);function v(...e){return e.reduce((e,t)=>t(e),class{})}function y(e,...t){return t.reduce((e,t)=>t(e),e)}function b(e){return function(t){class n extends t{constructor(...t){super(...t);let n=new e(...t);Object.assign(this,n)}}for(let t of Reflect.ownKeys(e.prototype))t!==`constructor`&&Object.defineProperty(n.prototype,t,Object.getOwnPropertyDescriptor(e.prototype,t));return n}}function x(e){return class extends e{static from(t){let n=typeof this==`function`?this:e,r=new n,i={...t};return typeof n?.parse==`function`&&(i=n.parse(t)),typeof this?.parse==`function`&&(i=this.parse(t)),Object.assign(r,i),r}merge(e){return Object.assign(this,e),this}}}function S(e){return class extends e{created_at;updated_at}}function C(e){return class extends e{deleted_at=null}}v(x,S,C);var w=class{static __container_entry_key=`AuthService`;user;constructor(e={}){this.user=e.user||null}async logout(e){let[t]=await _.try(`/auth/logout`,{method:`POST`});t||(window.location.href=e?.redirect||`/`)}},T=class extends p{async fetch(e,t={}){let n=this.buildUrl(e,t.query),r=this.buildRequestInit(t),i=await fetch(n,r);if(!i.ok)throw await this.handleError(i),Error(`HTTP error! status: ${i.status}`);return this.parseResponse(i)}},ee=class{static __container_entry_key=`CookieMapEntity`;cookies;prefix;constructor(e){this.cookies=e?.cookies||new Map,this.prefix=e?.prefix||``}load(e){if(e instanceof Map){for(let[t,n]of e.entries())this.set(t,n);return}for(let t of Object.keys(e))this.set(t,e[t])}get(e,t=null){let n=this.prefix+e;return this.cookies.get(n)||t}set(e,t,n){let r=this.prefix+e;this.cookies.set(r,t)}toRecord(){let e={};for(let[t,n]of this.cookies.entries())if(t.startsWith(this.prefix)){let r=t.slice(this.prefix.length);e[r]=n}return e}};function E(e,t=``,n={}){for(let[r,i]of Object.entries(e)){let e=/^\d+$/.test(r)?`${t}[${r}]`:t?`${t}.${r}`:r;if(i&&typeof i==`object`){E(i,e,n);continue}n[e]=i}return n}function te(){return typeof crypto<`u`&&crypto.randomUUID?crypto.randomUUID():typeof self<`u`&&self.crypto&&self.crypto.randomUUID?self.crypto.randomUUID():typeof window<`u`&&window.crypto&&window.crypto.randomUUID?window.crypto.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,function(e){let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function ne(e=``){return e+te()}var re=class{static __container_entry_key=`ConfigService`;entries;constructor(){this.entries=new Map}list(){return Array.from(this.entries.values())}parseValue(e){return typeof e==`string`&&e.endsWith(`:boolean`)?e.replace(`:boolean`,``).trim()===`true`:e}loadFromRecord(e,t=`unknow`){for(let[n,r]of Object.entries(e))this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}loadFromEntries(e,t=`unknow`){for(let[n,r]of e)this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[t]=n.value;return e}has(e){if(this.entries.get(e))return!0;if(!e.includes(`.`))return!1;let t=e.split(`.`)[0],n=this.entries.get(t);if(!n)return!!this.entries.get(e);let i=n.value;return typeof i!=`object`||Array.isArray(i)?!1:r(i,e.substring(t.length+1))}get(e,t){let r=this.entries.get(e);if(r)return r.value;if(!e.includes(`.`))return t;let i=e.split(`.`)[0],a=this.entries.get(i);if(!a){let n=this.entries.get(e);return n?n.value:t}let o=a.value;return typeof o!=`object`||Array.isArray(o)?t:n(o,e.substring(i.length+1),t)}getOne(e,t){for(let t of e)if(this.has(t))return this.get(t);return t}set(e,t,n=`runtime`){if(!e.includes(`.`)){this.entries.set(e,{key:e,source:n,value:t});return}let r=e.split(`.`)[0],i=this.get(r,{});(typeof i!=`object`||Array.isArray(i))&&(i={}),a(i,e.substring(r.length+1),t),this.entries.set(r,{key:r,source:n,value:i})}unset(e){if(!e.includes(`.`)){this.entries.delete(e);return}let t=e.split(`.`)[0],n=this.get(t,{});n&&(typeof n!=`object`||Array.isArray(n)||(o(n,e.substring(t.length+1)),this.entries.set(t,{key:t,source:`runtime`,value:n})))}clear(){this.entries.clear()}dump(){return E(this.toRecord())}};const D=g.proxy(re);import.meta.env.DEV&&(globalThis.config=D);function O(e,t){let n={},r=e.split(`/`).filter(Boolean),i=t.split(`/`).filter(Boolean);for(let e=0;e<r.length;e++){let t=r[e],a=i[e];if(t.startsWith(`:`)){let e=t.slice(1);n[e]=a}if(t===`*`){n[`*`]=i.slice(e).join(`/`);break}}return n}function k(e){let n={},r=e.split(`?`)[1];return r?t.parse(r):n}var A=class extends p{async fetch(e,t={}){return!e.startsWith(`http://`)&&!e.startsWith(`https://`)?this.fetchInternal(e,t):this.fetchExternal(e,t)}async fetchExternal(e,t={}){let n=this.buildUrl(e,t.query),r=this.buildRequestInit(t),i=await fetch(n,r);if(!i.ok)throw await this.handleError(i),Error(`HTTP error! status: ${i.status}`);return this.parseResponse(i)}async fetchInternal(e,t={}){let n=g.get(`RouterService`),r=t.method||`GET`,i=n.resolve(r,e),a=new ee({prefix:D.get(`cookie.prefix`,``)});if(g.has(`cookies`)&&a.load(g.get(`cookies`)),!i||!i.handler)throw Error(`Route not found for ${r} ${e}`);return await n.execute(i,{url:e,params:O(i.path,e),query:t.query||k(e),body:t.data||t.body,method:r.toLowerCase(),cookie:a})}},j=class{hook_id;hook_aliases;order;subhooks;async register(){}async load(){}async boot(){}async shutdown(){}async onRegister(){}async onLoad(){}async onBoot(){}async onShutdown(){}},M=class e{static __container_entry_key=`LoggerService`;info(e,t){}debug(e,t){}warn(e,t){}error(e,t){}child(t){return new e}},N=class{static __container_entry_key=`LifecycleService`;hooks;logger;debug=!1;constructor(e={}){this.debug=e.debug??this.debug,this.hooks=e.hooks??new Map,this.logger=e.logger??new M,e.onError&&(this.onError=e.onError)}onError(e,t){Object.assign(e,{context:t}),this.logger.error(`Error in hook ${t.method} (${t.hookId}):`,e)}mapAliases(e){let t=[],n=Array.from(this.hooks.values());for(let r of n){if(e.includes(r.hook_id)){t.push(r.hook_id);continue}r.hook_aliases&&r.hook_aliases.find(t=>e.includes(t))&&t.push(r.hook_id)}return t}list(e){let t=Array.from(this.hooks.values());if(e?.exclude){let n=Array.isArray(e.exclude)?e.exclude:[e.exclude];n=this.mapAliases(n),t=t.filter(e=>!n.includes(e.hook_id))}if(e?.include){let n=Array.isArray(e.include)?e.include:[e.include];n=this.mapAliases(n),t=t.filter(e=>n.includes(e.hook_id))}return t=i(t,[`order`],[`asc`]),t}add(...e){let t=[];for(let n of e){if(typeof n==`function`){t.push(new n);continue}t.push(n)}for(let e of t){if(!e.hook_id){this.logger.warn(`Skipping hook without hook_id:`,e);continue}this.hooks.set(e.hook_id,e),this.debug&&this.logger.debug(`add `+e.hook_id),e.subhooks&&e.subhooks.forEach(e=>this.add(e))}}async emitMethod(e,t){let n=this.list(t);this.debug&&this.logger.debug(`emitting ${e} for hooks:`,{hooks:n.map(e=>e.hook_id)});for(let n of this.list(t)){let t={register:()=>Promise.all([n.register(),n.onRegister()]),load:()=>Promise.all([n.load(),n.onLoad()]),boot:()=>Promise.all([n.boot(),n.onBoot()]),shutdown:()=>Promise.all([n.shutdown(),n.onShutdown()])},[r]=await f(()=>t[e]());if(r){this.onError(r,{hookId:n.hook_id,method:e});continue}this.debug&&this.logger.debug(`${e} `+n.hook_id)}}async emit(e,t){let n=Array.isArray(e)?e:[e];for(let e of n)await this.emitMethod(e,t)}async register(e){return this.emit(`register`,e)}async load(e){return this.emit(`load`,e)}async boot(e){return this.emit(`boot`,e)}async shutdown(e){await this.emit(`shutdown`,e)}clear(){this.hooks.clear()}},P=class extends N{addImports(e){let t=[];for(let[n,r]of Object.entries(e)){let e=new(r.default||r);e.hook_id=e.hook_id||n,t.push(e)}t.forEach(e=>this.add(e))}},F=class extends v(x){id;label;layout;to;target;group;order;icon;parent},I=class extends v(x){id;name;description=null;origin;subject;action;conditions=null;get editable(){return this.origin===`custom`}get parsedConditions(){if(!this.conditions)return{};let[e,t]=f.sync(()=>typeof this.conditions==`string`?JSON.parse(this.conditions):this.conditions);return e?{}:t}},L=class{static __container_entry_key=`AclEntity`;ability;permissions;debug=!1;logger;constructor(e={}){let t=(e.permissions||[]).map(e=>I.from(e));this.permissions=t,this.debug=e.debug||!1,this.logger=e.logger||new M().child({label:`acl`}),this.ability=s(e=>{t.forEach(t=>{e(t.action,t.subject,t.parsedConditions)})}),this.debug&&this.logger.debug(`initialized in debug mode`,{permissions:this.permissions})}can(e,t,n){if(!n)return this.ability.can(e,t);let r=c(t,n);return this.ability.can(e,r)}cannot(e,t,n){if(!n)return this.ability.cannot(e,t);let r=c(t,n);return this.ability.cannot(e,r)}subject(e,t){return c(e,t)}};const R=g.proxy(L);var z=class{static __container_entry_key=`MenuService`;items=new Map;add(...e){for(let t of e)t.id||=JSON.stringify(t),this.items.set(t.id,F.from(t))}remove(e){this.items.delete(e)}list(e={}){let t=JSON.parse(JSON.stringify(Array.from(this.items.values())));return e.layout&&(t=t.filter(t=>t.layout===e.layout)),e.group&&(t=t.filter(t=>t.group===e.group||t.parent===e.group)),e.parent&&(t=t.filter(t=>t.parent===e.parent)),e.allowed!==void 0&&e.allowed===!0&&(t=t.filter(e=>R.can(`view`,e))),t.sort((e,t)=>(e.order?e.order:98)-(t.order?t.order:98)),t}clear(){this.items.clear()}};const B=e=>{let t=D.get(`setup`),n=!t?.need_database&&!t?.need_users;return n&&e.path.startsWith(`/setup`)?`/`:n?!0:e.path.startsWith(`/setup`)?e.path===`/setup`?!0:t?.need_database?e.path===`/setup/database`?!0:`/setup/database`:t?.need_users?e.path===`/setup/user`?!0:`/setup/user`:!0:`/setup`};function V(e,t={}){let n=[];for(let[r,i]of Object.entries(e)){if(t.exclude?.some(e=>typeof e==`string`?r.includes(e):e.test(r)))continue;let e=r.replace(/\.vue$/,``).split(`/`).filter(e=>e&&!e.startsWith(`.`)).map(e=>{let t=e;return t.startsWith(`[`)&&t.endsWith(`]`)&&(t=`:`+t.slice(1,-1)),t});t.strip?.length&&(e=e.filter(e=>!t.strip.some(t=>typeof t==`string`?e===t:t.test(e))));let a=e.join(`/`).replace(/index$/,``);t.prefix&&(a=t.prefix+`/`+a),a.startsWith(`/`)||(a=`/`+a),a.endsWith(`/`)&&(a=a.slice(0,-1));let o={path:a,component:i,beforeEnter:[]};t.guards&&Array.isArray(t.guards)&&(o.beforeEnter=t.guards),t.guards&&typeof t.guards==`function`&&(o.beforeEnter=t.guards(o)),n.push(o)}return t.refine&&(n=t.refine(n)),n}function H(){let e=import.meta.env.SSR,t=u({history:e?l():d(),routes:[],scrollBehavior(e,t,n){return n||{top:0}}});return t.beforeEach(B),t.auto=(e,n={})=>{let r=V(e,n);return r.forEach(e=>t.addRoute(e)),r},t}var U=class{static __container_entry_key=`ToastService`;success(e,t){console.log(`Success:`,e,t)}error(e,t){console.error(`Error:`,e,t)}};const W=g.proxy(w);import.meta.env.DEV&&!import.meta.env.SSR&&(window.auth=W);const G=g.proxy(M),K=g.proxy(z),q=g.proxy(`route`),J=g.proxy(`router`),Y=g.proxy(U);var X=class extends v(x,b(j)){id;name;enabled=!1;dependencies={};build={};directory;upgrade_info;setData(e){let t=Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0));Object.assign(this,t),this.hook_id=`module:${this.id}`}},ie=class extends y(X){},ae=class extends v(x){id;name;version;enabled;aliases},oe=class extends y(ae){addPagesFolder(e,t){J.auto(e,t)}async load(){}};function se(e,t={}){return V(e,t)}const Z=_;function ce(e){return new Promise(t=>{let n=document.createElement(`input`);n.type=`file`,n.accept=e.accept||`*/*`,n.multiple=e.multiple||!1,n.onchange=n=>{let r=n.target,i=Array.from(r.files);t(e.multiple?Array.from(i):i[0])},n.oncancel=()=>{t(e.multiple?[]:null)},n.click()})}function le(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=e=>{e.target?.result instanceof ArrayBuffer?t(new Uint8Array(e.target.result)):n(Error(`Failed to read file as ArrayBuffer`))},r.onerror=()=>{n(r.error)},r.readAsArrayBuffer(e)})}async function ue(e){let t=new FormData;return t.append(`file`,e.file),e.directory&&t.append(`directory`,e.directory),Z(`/api/drives/${e.driveId}/upload`,{method:`POST`,body:t,query:{directory:e.directory}})}const de={pick:ce,upload:ue,toUint8Array:le},fe=e;function Q(e){let t=e.exclude||[`/auth/login`,`/auth/register`];return n=>{if(!W.user&&!t.includes(n.path))return e.redirect}}const pe=Q({redirect:`/auth/login`});function $(e){return()=>{if(W.user)return e.redirect}}const me=$({redirect:`/`});export{Z as $fetch,de as $file,fe as $toast,w as AuthService,T as FetchBrowserService,A as FetchNodeService,p as FetchService,P as LifecycleService,F as MenuItemEntity,z as MenuService,ie as ModuleEntity,oe as PluginEntity,U as ToastService,R as acl,W as auth,pe as authGuard,V as auto,se as autoRoutes,D as config,g as container,Q as createAuthGuard,$ as createGuestGuard,ne as createId,H as createRouter,_ as fetcher,me as guestGuard,G as logger,K as menu,q as route,J as router,B as setupGuard,Y as toast};
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiJGZldGNoIiwiQ29ra2llTWFwRW50aXR5IiwiTGlmZWN5Y2xlU2VydmljZSIsIkJhc2VMaWZlY3ljbGVTZXJ2aWNlIiwiUGVybWlzc2lvbiIsInN1YmplY3QiLCJjcmVhdGVTdWJqZWN0IiwiY3JlYXRlVnVlUm91dGVyIiwiTW9kdWxlIiwiQmFzZSIsIlBsdWdpbkVudGl0eSIsIkJhc2UiLCIkb3JpZ2luYWwiLCJ0b2FzdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL0ZldGNoU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zZXJ2aWNlcy9Db250YWluZXJTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9mZXRjaGVyLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9jb21wb3NlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1VzZXJFbnRpdHkudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL0F1dGhTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9GZXRjaEJyb3dzZXJTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Db29raWVNYXBFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL2ZsYXR0ZW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL2NyZWF0ZUlkLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL2NvbmZpZy50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvcGFyc2VSb3V0ZVVybC50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvRmV0Y2hOb2RlU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZW50aXRpZXMvTWVudUl0ZW1FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1Blcm1pc3Npb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0FjbEVudGl0eS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9hY2wudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL01lbnVTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9ndWFyZHMvc2V0dXBHdWFyZC50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvUm91dGVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvVG9hc3RTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL2F1dGgudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvbG9nZ2VyLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL21lbnUudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvcm91dGUudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvcm91dGVyLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL3RvYXN0LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Nb2R1bGVFbnRpdHkudHMiLCIuLi8uLi9zcmMvY2xpZW50L2VudGl0aWVzL01vZHVsZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvUGx1Z2luRW50aXR5LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9lbnRpdGllcy9QbHVnaW5FbnRpdHkudHMiLCIuLi8uLi9zcmMvY2xpZW50L3V0aWxzL2F1dG9QYWdlcy50cyIsIi4uLy4uL3NyYy9jbGllbnQvdXRpbHMvZmV0Y2hlci50cyIsIi4uLy4uL3NyYy9jbGllbnQvdXRpbHMvZmlsZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvdXRpbHMvdG9hc3QudHMiLCIuLi8uLi9zcmMvY2xpZW50L2d1YXJkcy9hdXRoR3VhcmQudHMiLCIuLi8uLi9zcmMvY2xpZW50L2d1YXJkcy9ndWVzdEd1YXJkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImludGVyZmFjZSBUcnllciB7XG4gICAgKC4uLmFyZ3M6IGFueVtdKTogYW55XG59XG5cbmludGVyZmFjZSBUcnllckFzeW5jIHtcbiAgICAoLi4uYXJnczogYW55W10pOiBQcm9taXNlPGFueT4gfCBhbnlcbn1cblxudHlwZSBUcnlDYXRjaFJlc3VsdDxUIGV4dGVuZHMgVHJ5ZXI+ID0gW251bGwsIFJldHVyblR5cGU8VD5dIHwgW0Vycm9yLCBudWxsXVxuXG50eXBlIFRyeUNhdGNoQXN5bmNSZXN1bHQ8VCBleHRlbmRzIFRyeWVyQXN5bmM+ID0gW251bGwsIEF3YWl0ZWQ8UmV0dXJuVHlwZTxUPj5dIHwgW0Vycm9yLCBudWxsXVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJ5Q2F0Y2g8VCBleHRlbmRzIFRyeWVyQXN5bmM+KHRyeWVyOiBUKTogUHJvbWlzZTxUcnlDYXRjaEFzeW5jUmVzdWx0PFQ+PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJ5ZXIoKVxuICAgICAgICByZXR1cm4gW251bGwsIHJlc3VsdF1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gW2Vycm9yIGFzIGFueSwgbnVsbF1cbiAgICB9XG59XG5cbnRyeUNhdGNoLnN5bmMgPSBmdW5jdGlvbiA8VCBleHRlbmRzIFRyeWVyPih0cnllcjogVCk6IFRyeUNhdGNoUmVzdWx0PFQ+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0cnllcigpXG4gICAgICAgIHJldHVybiBbbnVsbCwgcmVzdWx0XVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBbZXJyb3IgYXMgYW55LCBudWxsXVxuICAgIH1cbn1cbiIsImltcG9ydCB7IHRvYXN0IH0gZnJvbSAndnVlLXNvbm5lcidcbmltcG9ydCBxcyBmcm9tICdxcydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnI3NoYXJlZC91dGlscy90cnlDYXRjaC50cydcblxuZXhwb3J0IGludGVyZmFjZSBGZXRjaE9wdGlvbnMgZXh0ZW5kcyBSZXF1ZXN0SW5pdCB7XG4gICAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT5cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmV0Y2hTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdGZXRjaFNlcnZpY2UnXG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlRXJyb3IocmVzcG9uc2U6IFJlc3BvbnNlKSB7ICAgIFxuICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKSB8fCAnJ1xuXG4gICAgICAgIGlmICghY29udGVudFR5cGUuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgICAgICAgICAgdG9hc3QuZXJyb3IoJHQoJ0ludGVybmFsIFNlcnZlciBFcnJvcicpKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpPy5pbmNsdWRlcygnanNvbicpKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+ICh7IG1lc3NhZ2U6ICR0KCdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InKSB9KSlcblxuICAgICAgICAgICAgaWYgKGRhdGEubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIHRvYXN0LmVycm9yKGRhdGEubWVzc2FnZSlcbiAgICAgICAgICAgIH0gICAgXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYnVpbGRVcmwodXJsOiBzdHJpbmcsIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgYW55Pik6IHN0cmluZyB7XG4gICAgICAgIGlmICghcXVlcnkpIHtcbiAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gcXMuc3RyaW5naWZ5KHF1ZXJ5LCB7IGFycmF5Rm9ybWF0OiAnYnJhY2tldHMnIH0pXG5cbiAgICAgICAgcmV0dXJuIHVybCArICc/JyArIHF1ZXJ5U3RyaW5nXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJ1aWxkUmVxdWVzdEluaXQob3B0aW9uczogRmV0Y2hPcHRpb25zKTogUmVxdWVzdEluaXQge1xuICAgICAgICBjb25zdCBmZXRjaE9wdGlvbnM6IFJlcXVlc3RJbml0ID0geyAuLi5vcHRpb25zIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5kYXRhKSB7XG4gICAgICAgICAgICBmZXRjaE9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuZGF0YSlcbiAgICAgICAgICAgIGZldGNoT3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgICAgICAgIC4uLmZldGNoT3B0aW9ucy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmV0Y2hPcHRpb25zXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIHBhcnNlUmVzcG9uc2U8VD4ocmVzcG9uc2U6IFJlc3BvbnNlKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJyk/LmluY2x1ZGVzKCdqc29uJykpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCkgYXMgUHJvbWlzZTxUPlxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKSBhcyBQcm9taXNlPFQ+XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZldGNoPFQ+KF91cmw6IHN0cmluZywgX29wdGlvbnM6IEZldGNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZCcpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHRyeTxUID0gYW55Pih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRyeUNhdGNoKCgpID0+IHRoaXMuZmV0Y2g8VD4odXJsLCBvcHRpb25zKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0PFQgPSBhbnk+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaDxUPih1cmwsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBwb3N0PFQgPSBhbnk+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaDxUPih1cmwsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcHV0PFQgPSBhbnk+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaDxUPih1cmwsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWxldGU8VCA9IGFueT4odXJsOiBzdHJpbmcsIG9wdGlvbnM6IEZldGNoT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoPFQ+KHVybCwge1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZUV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcbiAgICBwdWJsaWMgc3RhdHVzQ29kZTogbnVtYmVyID0gNTAwXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBzdGF0dXNDb2RlOiBudW1iZXIgPSA1MDApIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSlcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGVcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21FcnJvcihlcnJvcjogRXJyb3IpOiBCYXNlRXhjZXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCYXNlRXhjZXB0aW9uKGVycm9yLm1lc3NhZ2UsIDUwMClcbiAgICB9XG59IiwiaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSBcIiNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzXCJcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0gb2JqZWN0PiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFRcblxudHlwZSBFbnRyeUtleSA9IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdG9yXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRhaW5lclNlcnZpY2Uge1xuICAgIHByaXZhdGUgZW50cmllcyA9IG5ldyBNYXA8RW50cnlLZXksIGFueT4oKVxuXG4gICAgcHVibGljIGxvYWRGcm9tUmVjb3JkKHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgICAgICBPYmplY3QuZW50cmllcyhyZWNvcmQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5lbnRyaWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgcmVjb3JkW1N0cmluZyhrZXkpXSA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVjb3JkXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRLZXkocGF5bG9hZDogRW50cnlLZXkpOiBFbnRyeUtleSB7XG4gICAgICAgIGxldCBrZXkgPSBwYXlsb2FkXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBwYXlsb2FkID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAga2V5ID0gcGF5bG9hZC5uYW1lXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0NvbnN0cnVjdG9yID0gdHlwZW9mIHBheWxvYWQgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBwYXlsb2FkICE9PSAnc3ltYm9sJ1xuXG4gICAgICAgIGlmIChpc0NvbnN0cnVjdG9yICYmICEocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBXYXJuaW5nOiBUaGUgY29uc3RydWN0b3IgJHtwYXlsb2FkLm5hbWV9IGRvZXMgbm90IGhhdmUgYSB1bmlxdWUgaWRlbnRpZmllci4gQ29uc2lkZXIgYWRkaW5nIGEgc3RhdGljIHByb3BlcnR5IF9fY29udGFpbmVyX2VudHJ5X2tleSB0byBhdm9pZCBwb3RlbnRpYWwgY29uZmxpY3RzLmApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNDb25zdHJ1Y3RvciAmJiAocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleSkge1xuICAgICAgICAgICAga2V5ID0gKHBheWxvYWQgYXMgYW55KS5fX2NvbnRhaW5lcl9lbnRyeV9rZXlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrZXlcblxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQocGF5bG9hZDogRW50cnlLZXksIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgdmFsdWUpXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKHBheWxvYWQ6IEVudHJ5S2V5KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHBheWxvYWQpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5oYXMoa2V5KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8VD4ocGF5bG9hZDogRW50cnlLZXkpOiBUIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICBpZiAoIXRoaXMuZW50cmllcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYEVudHJ5IHdpdGgga2V5IFwiJHtTdHJpbmcoa2V5KX1cIiBub3QgZm91bmQgaW4gY29udGFpbmVyLmApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIHJldHVybiBlbnRyeVxuICAgIH1cblxuICAgIHB1YmxpYyBzaW5nbGV0b248VD4oY2xhc3NDb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8VD4pOiBUIHtcbiAgICAgICAgY29uc3Qga2V5ID0gY2xhc3NDb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSW5zdGFuY2UgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZXhpc3RpbmdJbnN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nSW5zdGFuY2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gbmV3IGNsYXNzQ29uc3RydWN0b3IoKVxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgbmV3SW5zdGFuY2UpXG4gICAgICAgIHJldHVybiBuZXdJbnN0YW5jZVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKGVudHJpZXM6IFJlY29yZDxhbnksIGFueT4pOiB2b2lkIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZW50cmllcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBwcm94eTxUID0gdW5rbm93bj4oa2V5OiBFbnRyeUtleSk6IFQge1xuICAgICAgICByZXR1cm4gbmV3IFByb3h5KHt9LCB7XG4gICAgICAgICAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmdldDxUPihrZXkpIGFzIGFueVxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZW50cnlbcHJvcF1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmJpbmQoZW50cnkpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5W3Byb3BdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiAoX3RhcmdldCwgcHJvcCwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZ2V0PFQ+KGtleSkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBlbnRyeVtwcm9wXSA9IHZhbHVlXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSBhcyBUXG4gICAgfVxuXG4gICAgcHVibGljIGtleXMoKTogRW50cnlLZXlbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy5rZXlzKCkpXG4gICAgfVxufVxuIiwiaW1wb3J0IENvbnRhaW5lclNlcnZpY2UgZnJvbSBcIiNzaGFyZWQvc2VydmljZXMvQ29udGFpbmVyU2VydmljZS50c1wiO1xuXG5jb25zdCBjb250YWluZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmNsaWVudENvbnRhaW5lciB8fCBuZXcgQ29udGFpbmVyU2VydmljZSgpXG5cbmdsb2JhbFRoaXMuY2xpZW50Q29udGFpbmVyID0gY29udGFpbmVyXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRhaW5lciBhcyBDb250YWluZXJTZXJ2aWNlXG4iLCJpbXBvcnQgRmV0Y2hTZXJ2aWNlIGZyb20gJyNjbGllbnQvc2VydmljZXMvRmV0Y2hTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcblxuY29uc3QgZmV0Y2hlciA9IGNvbnRhaW5lci5wcm94eTxGZXRjaFNlcnZpY2U+KEZldGNoU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgZmV0Y2hlclxuIiwiaW1wb3J0IHR5cGUgeyBVbmlvblRvSW50ZXJzZWN0aW9uIH0gZnJvbSAnLi90eXBpbmcudHMnXG5cbmV4cG9ydCB0eXBlIEFueUNsYXNzID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVFxuZXhwb3J0IHR5cGUgTWl4aW48VD4gPSAoYmFzZTogQ29uc3RydWN0b3IpID0+IENvbnN0cnVjdG9yPFQ+XG5cbi8qKlxuICogQ29tcG9zZXMgbXVsdGlwbGUgbWl4aW5zIGludG8gYSBzaW5nbGUgY2xhc3MgdGhhdCBjYW4gYmUgZXh0ZW5kZWQuXG4gKiBBbGxvd3MgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlLWxpa2UgYmVoYXZpb3IgYnkgYXBwbHlpbmcgbWl4aW5zIHNlcXVlbnRpYWxseS5cbiAqIFxuICogQHBhcmFtIG1peGlucyAtIEFycmF5IG9mIG1peGluIGZ1bmN0aW9ucyB0byBjb21wb3NlXG4gKiBAcmV0dXJucyBBIGNsYXNzIGNvbnN0cnVjdG9yIHRoYXQgaW5jbHVkZXMgYWxsIG1peGluIGZ1bmN0aW9uYWxpdHlcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBjb21wb3NlKFRpbWVzdGFtcCwgU29mdERlbGV0ZSkge1xuICogICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoKVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2U8XG4gICAgTSBleHRlbmRzIEFycmF5PChiYXNlOiBDb25zdHJ1Y3Rvcjxhbnk+KSA9PiBDb25zdHJ1Y3Rvcjxhbnk+PlxuPiguLi5taXhpbnM6IE0pOiBVbmlvblRvSW50ZXJzZWN0aW9uPFJldHVyblR5cGU8TVtudW1iZXJdPj4ge1xuICAgIHJldHVybiBtaXhpbnMucmVkdWNlKChiYXNlLCBtaXhpbikgPT4gbWl4aW4oYmFzZSksIGNsYXNzIHt9IGFzIGFueSkgYXMgYW55XG59XG5cbi8qKlxuICogQWx0ZXJuYXRpdmUgY29tcG9zZSBmdW5jdGlvbiB0aGF0IHN0YXJ0cyB3aXRoIGEgYmFzZSBjbGFzc1xuICogXG4gKiBAcGFyYW0gYmFzZUNsYXNzIC0gVGhlIGJhc2UgY2xhc3MgdG8gc3RhcnQgd2l0aFxuICogQHBhcmFtIG1peGlucyAtIEFycmF5IG9mIG1peGluIGZ1bmN0aW9ucyB0byBhcHBseVxuICogQHJldHVybnMgQSBjbGFzcyBjb25zdHJ1Y3RvciB0aGF0IGV4dGVuZHMgdGhlIGJhc2UgY2xhc3Mgd2l0aCBhbGwgbWl4aW4gZnVuY3Rpb25hbGl0eVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIGNvbXBvc2VXaXRoKEJhc2VFbnRpdHksIFRpbWVzdGFtcCwgU29mdERlbGV0ZSkge1xuICogICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoKVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VXaXRoPFxuICAgIFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3IsXG4gICAgTSBleHRlbmRzIEFycmF5PChiYXNlOiBDb25zdHJ1Y3RvcikgPT4gQ29uc3RydWN0b3I8YW55Pj5cbj4oXG4gICAgYmFzZUNsYXNzOiBUQmFzZSxcbiAgICAuLi5taXhpbnM6IE1cbik6IFRCYXNlICYgVW5pb25Ub0ludGVyc2VjdGlvbjxSZXR1cm5UeXBlPE1bbnVtYmVyXT4+IHtcbiAgICByZXR1cm4gbWl4aW5zLnJlZHVjZSgoYmFzZSwgbWl4aW4pID0+IG1peGluKGJhc2UpLCBiYXNlQ2xhc3MgYXMgYW55KSBhcyBhbnlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1peGluPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KFNvdXJjZTogVEJhc2UpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gPFRUYXJnZXQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oVGFyZ2V0OiBUVGFyZ2V0KSB7XG4gICAgICAgIGNsYXNzIE1peGVkIGV4dGVuZHMgVGFyZ2V0IHtcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICAgICAgc3VwZXIoLi4uYXJncylcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBuZXcgU291cmNlKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBzb3VyY2UpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb3B5IG1ldGhvZHNcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKFNvdXJjZS5wcm90b3R5cGUpKSB7XG4gICAgICAgICAgICBpZiAoa2V5ICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgICAgICAgICBNaXhlZC5wcm90b3R5cGUsXG4gICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihTb3VyY2UucHJvdG90eXBlLCBrZXkpIVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBNaXhlZCBhcyBUVGFyZ2V0ICYgVEJhc2VcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5pbnRlcmZhY2UgQ3JlYXRlQmFzZUVudGl0eU9wdGlvbnMge1xuICAgIHBhcnNlPzogKGRhdGE6IGFueSkgPT4gYW55XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCYXNlRW50aXR5KG9wdGlvbnM6IENyZWF0ZUJhc2VFbnRpdHlPcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gQmFzZUVudGl0eTxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgICAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZnJvbTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgZGF0YTogUGFydGlhbDxUPik6IFQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRydWN0b3IgPSAodHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogQmFzZSkgYXMgYW55XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjb250cnVjdG9yKCkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBsZXQgcGF5bG9hZCA9IHsgLi4uZGF0YSB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wYXJzZSkge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gb3B0aW9ucy5wYXJzZShkYXRhKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UgYXMgYW55LCBwYXlsb2FkKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBtZXJnZShkYXRhOiBQYXJ0aWFsPHRoaXM+KTogdGhpcyB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEJhc2VFbnRpdHk8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgcHVibGljIHN0YXRpYyBmcm9tPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBkYXRhOiBQYXJ0aWFsPFQ+KTogVCB7XG4gICAgICAgICAgICBjb25zdCBjb250cnVjdG9yID0gKHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6IEJhc2UpIGFzIGFueVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjb250cnVjdG9yKCkgYXMgYW55XG5cbiAgICAgICAgICAgIGxldCBwYXlsb2FkID0geyAuLi5kYXRhIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250cnVjdG9yPy5wYXJzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSAoY29udHJ1Y3RvciBhcyBhbnkpLnBhcnNlKGRhdGEpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHRoaXMgYXMgYW55KT8ucGFyc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gKHRoaXMgYXMgYW55KS5wYXJzZShkYXRhKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlIGFzIGFueSwgcGF5bG9hZClcblxuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgbWVyZ2UoZGF0YTogUGFydGlhbDx0aGlzPik6IHRoaXMge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFRpbWVzdGFtcE1peGluPFQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oYmFzZTogVCkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIGJhc2Uge1xuICAgICAgICBwdWJsaWMgY3JlYXRlZF9hdDogRGF0ZSB8IHN0cmluZ1xuICAgICAgICBwdWJsaWMgdXBkYXRlZF9hdDogRGF0ZSB8IHN0cmluZ1xuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFNvZnREZWxldGVNaXhpbjxUIGV4dGVuZHMgQ29uc3RydWN0b3I+KGJhc2U6IFQpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBiYXNlIHtcbiAgICAgICAgcHVibGljIGRlbGV0ZWRfYXQ6IERhdGUgfCBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIFBlcm1pc3Npb24gZnJvbSAnLi9QZXJtaXNzaW9uRW50aXR5LnRzJ1xuaW1wb3J0IHR5cGUgUm9sZSBmcm9tICcuL1JvbGVFbnRpdHkudHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IFNvZnREZWxldGVNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJFbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHksIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHsgIFxuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIGVtYWlsOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHVzZXJuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgcGFzc3dvcmQ/OiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyaWZpZWRfYXQ/OiBEYXRlIHwgc3RyaW5nIHwgbnVsbFxuXG4gICAgcHVibGljIHBlcm1pc3Npb25zPzogUGVybWlzc2lvbltdXG4gICAgcHVibGljIHJvbGVzPzogUm9sZVtdXG5cbiAgICBwdWJsaWMgZ2V0IGluaXRpYWxzKCl7XG4gICAgICAgIGNvbnN0IFtmaXJzdE5hbWUsIHNlY29uZE5hbWVdID0gdGhpcy5uYW1lLnNwbGl0KCcgJylcblxuICAgICAgICBpZiAoIXNlY29uZE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdE5hbWVbMF0udG9VcHBlckNhc2UoKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYSA9IGZpcnN0TmFtZVswXS50b1VwcGVyQ2FzZSgpXG4gICAgICAgIGNvbnN0IGIgPSBzZWNvbmROYW1lWzBdLnRvVXBwZXJDYXNlKClcblxuICAgICAgICByZXR1cm4gYSArIGJcbiAgICB9XG59XG4iLCJpbXBvcnQgJGZldGNoIGZyb20gJyNjbGllbnQvZmFjYWRlcy9mZXRjaGVyLnRzJ1xuaW1wb3J0IFVzZXIgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Vc2VyRW50aXR5LnRzJ1xuXG5pbnRlcmZhY2UgTG9nb3V0T3B0aW9ucyB7XG4gICAgcmVkaXJlY3Q/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXV0aFNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0F1dGhTZXJ2aWNlJ1xuICAgIHB1YmxpYyB1c2VyOiBVc2VyIHwgbnVsbFxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxBdXRoU2VydmljZT4gPSB7fSkge1xuICAgICAgICB0aGlzLnVzZXIgPSBkYXRhLnVzZXIgfHwgbnVsbFxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2dvdXQob3B0aW9ucz86IExvZ291dE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0ICRmZXRjaC50cnkoJy9hdXRoL2xvZ291dCcsIHsgbWV0aG9kOiAnUE9TVCcgfSlcblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBvcHRpb25zPy5yZWRpcmVjdCB8fCAnLydcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEZldGNoT3B0aW9ucyB9IGZyb20gJy4vRmV0Y2hTZXJ2aWNlLnRzJ1xuaW1wb3J0IEZldGNoU2VydmljZSBmcm9tICcuL0ZldGNoU2VydmljZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmV0Y2hCcm93c2VyU2VydmljZSBleHRlbmRzIEZldGNoU2VydmljZSB7XG4gICAgcHVibGljIGFzeW5jIGZldGNoPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBmdWxsVXJsID0gdGhpcy5idWlsZFVybCh1cmwsIG9wdGlvbnMucXVlcnkpXG4gICAgICAgIGNvbnN0IGZldGNoT3B0aW9ucyA9IHRoaXMuYnVpbGRSZXF1ZXN0SW5pdChvcHRpb25zKVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZnVsbFVybCwgZmV0Y2hPcHRpb25zKVxuXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXJyb3IocmVzcG9uc2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlUmVzcG9uc2U8VD4ocmVzcG9uc2UpXG4gICAgfVxufVxuIiwiZXhwb3J0IGludGVyZmFjZSBDb29raWVNYXBFbnRpdHlPcHRpb25zIHtcbiAgICBjb29raWVzPzogTWFwPHN0cmluZywgc3RyaW5nPlxuICAgIHByZWZpeD86IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb29raWVNYXBFbnRpdHkge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0Nvb2tpZU1hcEVudGl0eSdcblxuICAgIHB1YmxpYyBjb29raWVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gICAgcHVibGljIHByZWZpeDogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogQ29va2llTWFwRW50aXR5T3B0aW9ucykge1xuICAgICAgICB0aGlzLmNvb2tpZXMgPSBkYXRhPy5jb29raWVzIHx8IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgICAgICAgdGhpcy5wcmVmaXggPSBkYXRhPy5wcmVmaXggfHwgJydcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZChjb29raWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgTWFwPHN0cmluZywgc3RyaW5nPikge1xuICAgICAgICBpZiAoY29va2llcyBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgY29va2llcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvb2tpZXMpKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIGNvb2tpZXNba2V5XSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGZ1bGxOYW1lID0gdGhpcy5wcmVmaXggKyBuYW1lXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY29va2llcy5nZXQoZnVsbE5hbWUpIHx8IGRlZmF1bHRWYWx1ZVxuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBXZSB3YW50IHRvIGFsbG93IGFueSBvcHRpb25zIHRvIGJlIHBhc3NlZCBoZXJlLCBhcyB0aGV5IG1heSBiZSB1c2VkIGJ5IHRoZSB1bmRlcmx5aW5nIGNvb2tpZVxuICAgIC8vICBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIHNldChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgZnVsbE5hbWUgPSB0aGlzLnByZWZpeCArIG5hbWVcblxuICAgICAgICB0aGlzLmNvb2tpZXMuc2V0KGZ1bGxOYW1lLCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5jb29raWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKHRoaXMucHJlZml4KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVucHJlZml4ZWRLZXkgPSBrZXkuc2xpY2UodGhpcy5wcmVmaXgubGVuZ3RoKVxuXG4gICAgICAgICAgICAgICAgcmVzdWx0W3VucHJlZml4ZWRLZXldID0gdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKG9iajogYW55LCBwcmVmaXggPSAnJywgcmVzOiBhbnkgPSB7fSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgICAgY29uc3QgaXNJbmRleCA9IC9eXFxkKyQvLnRlc3Qoa2V5KVxuICAgICAgICBjb25zdCBuZXdLZXkgPSBpc0luZGV4ID8gYCR7cHJlZml4fVske2tleX1dYCA6IHByZWZpeCA/IGAke3ByZWZpeH0uJHtrZXl9YCA6IGtleVxuXG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBmbGF0dGVuKHZhbHVlLCBuZXdLZXksIHJlcylcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICByZXNbbmV3S2V5XSA9IHZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5mbGF0dGVuKG9iajogYW55KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgcmVzdWx0ID0ge31cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIHNldChyZXN1bHQsIGtleSwgdmFsdWUpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbn1cbiIsImZ1bmN0aW9uIHV1aWQoKXtcbiAgICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICAgICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmLmNyeXB0byAmJiBzZWxmLmNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgICAgIHJldHVybiBzZWxmLmNyeXB0by5yYW5kb21VVUlEKClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jcnlwdG8gJiYgd2luZG93LmNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciBlbnZpcm9ubWVudHMgd2l0aG91dCBjcnlwdG8ucmFuZG9tVVVJRFxuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIGNvbnN0IHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDBcbiAgICAgICAgY29uc3QgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MykgfCAweDhcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpXG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUlkKHByZWZpeCA9ICcnKSB7XG4gICAgcmV0dXJuIHByZWZpeCArIHV1aWQoKVxufSIsImltcG9ydCB7IGdldCwgc2V0LCBoYXMsIHVuc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHsgZmxhdHRlbiB9IGZyb20gJy4uL3V0aWxzJ1xuXG5pbnRlcmZhY2UgRW50cnkge1xuICAgIGtleTogc3RyaW5nXG4gICAgdmFsdWU6IGFueVxuICAgIHNvdXJjZTogc3RyaW5nXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbmZpZ1NlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0NvbmZpZ1NlcnZpY2UnXG5cbiAgICBwdWJsaWMgZW50cmllczogTWFwPHN0cmluZywgRW50cnk+XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzID0gbmV3IE1hcCgpXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3QoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2VWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuZW5kc1dpdGgoJzpib29sZWFuJykpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKCc6Ym9vbGVhbicsICcnKS50cmltKCkgPT09ICd0cnVlJ1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRGcm9tUmVjb3JkKHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55Piwgc291cmNlID0gJ3Vua25vdycpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucGFyc2VWYWx1ZSh2YWx1ZSksXG4gICAgICAgICAgICAgICAgc291cmNlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRGcm9tRW50cmllcyhlbnRyaWVzOiBbc3RyaW5nLCBhbnldW10sIHNvdXJjZSA9ICd1bmtub3cnKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnBhcnNlVmFsdWUodmFsdWUpLFxuICAgICAgICAgICAgICAgIHNvdXJjZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0b1JlY29yZCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmVudHJpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICByZWNvcmRba2V5XSA9IGVudHJ5LnZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVjb3JkXG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlFbnRyeSA9IHRoaXMuZW50cmllcy5nZXQocHJpbWFyeSlcblxuICAgICAgICBpZiAoIXByaW1hcnlFbnRyeSkge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICAgICAgcmV0dXJuIGVudHJ5ID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IHByaW1hcnlFbnRyeS52YWx1ZVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXModmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQgPSBhbnkgfCB1bmRlZmluZWQ+KGtleTogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBUIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnRyeS52YWx1ZSBhcyBUXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltYXJ5ID0ga2V5LnNwbGl0KCcuJylbMF1cbiAgICAgICAgY29uc3QgcHJpbWFyeUVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChwcmltYXJ5KVxuXG4gICAgICAgIGlmICghcHJpbWFyeUVudHJ5KSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgICAgICByZXR1cm4gZW50cnkgPyBlbnRyeS52YWx1ZSA6IGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBwcmltYXJ5RW50cnkudmFsdWVcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0KHZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSksIGRlZmF1bHRWYWx1ZSlcblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcHVibGljIGdldE9uZTxUID0gYW55IHwgdW5kZWZpbmVkPihrZXlzOiBzdHJpbmdbXSwgZGVmYXVsdFZhbHVlPzogYW55KTogVCB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0PFQ+KGtleSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogYW55LCBzb3VyY2UgPSAncnVudGltZScpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHtcbiAgICAgICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGxldCBwcmltYXJ5VmFsdWUgPSB0aGlzLmdldChwcmltYXJ5LCB7fSlcblxuICAgICAgICBpZiAodHlwZW9mIHByaW1hcnlWYWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwcmltYXJ5VmFsdWUpKSB7XG4gICAgICAgICAgICBwcmltYXJ5VmFsdWUgPSB7fVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0KHByaW1hcnlWYWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpLCB2YWx1ZSlcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KHByaW1hcnksIHtcbiAgICAgICAgICAgIGtleTogcHJpbWFyeSxcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgICAgdmFsdWU6IHByaW1hcnlWYWx1ZVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyB1bnNldChrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGtleSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlWYWx1ZSA9IHRoaXMuZ2V0KHByaW1hcnksIHt9KVxuXG4gICAgICAgIGlmICghcHJpbWFyeVZhbHVlKSByZXR1cm5cblxuICAgICAgICBpZiAodHlwZW9mIHByaW1hcnlWYWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwcmltYXJ5VmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHVuc2V0KHByaW1hcnlWYWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpKVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQocHJpbWFyeSwge1xuICAgICAgICAgICAga2V5OiBwcmltYXJ5LFxuICAgICAgICAgICAgc291cmNlOiAncnVudGltZScsXG4gICAgICAgICAgICB2YWx1ZTogcHJpbWFyeVZhbHVlXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVudHJpZXMuY2xlYXIoKVxuICAgIH1cblxuICAgIHB1YmxpYyBkdW1wKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICByZXR1cm4gZmxhdHRlbih0aGlzLnRvUmVjb3JkKCkpXG4gICAgfVxufVxuIiwiaW1wb3J0IENvbmZpZ1NlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcblxuY29uc3QgY29uZmlnID0gY29udGFpbmVyLnByb3h5PENvbmZpZ1NlcnZpY2U+KENvbmZpZ1NlcnZpY2UpXG5cbmlmIChpbXBvcnQubWV0YS5lbnYuREVWKSB7XG4gICAgZ2xvYmFsVGhpcy5jb25maWcgPSBjb25maWdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29uZmlnXG4iLCJpbXBvcnQgcXMgZnJvbSAncXMnIFxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVcmxQYXJhbXMocm91dGVQYXRoOiBzdHJpbmcsIHJlcXVlc3RQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuXG4gICAgY29uc3Qgcm91dGVTZWdtZW50cyA9IHJvdXRlUGF0aC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKVxuICAgIGNvbnN0IHJlcXVlc3RTZWdtZW50cyA9IHJlcXVlc3RQYXRoLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvdXRlU2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgcm91dGVTZWdtZW50ID0gcm91dGVTZWdtZW50c1tpXVxuICAgICAgICBjb25zdCByZXF1ZXN0U2VnbWVudCA9IHJlcXVlc3RTZWdtZW50c1tpXVxuXG4gICAgICAgIGlmIChyb3V0ZVNlZ21lbnQuc3RhcnRzV2l0aCgnOicpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSByb3V0ZVNlZ21lbnQuc2xpY2UoMSkgLy8gUmVtb3ZlIHRoZSAnOicgcHJlZml4XG4gICAgICAgICAgICBwYXJhbXNbcGFyYW1OYW1lXSA9IHJlcXVlc3RTZWdtZW50XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocm91dGVTZWdtZW50ID09PSAnKicpIHtcbiAgICAgICAgICAgIC8vIENhcHR1cmUgYWxsIHJlbWFpbmluZyBzZWdtZW50cyBhcyBhIHNpbmdsZSBwYXRoXG4gICAgICAgICAgICBjb25zdCByZW1haW5pbmdTZWdtZW50cyA9IHJlcXVlc3RTZWdtZW50cy5zbGljZShpKVxuICAgICAgICAgICAgcGFyYW1zWycqJ10gPSByZW1haW5pbmdTZWdtZW50cy5qb2luKCcvJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVybFF1ZXJ5KHJlcXVlc3RQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSByZXF1ZXN0UGF0aC5zcGxpdCgnPycpWzFdXG5cbiAgICBpZiAoIXF1ZXJ5U3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBxdWVyeVxuICAgIH1cblxuICAgIHJldHVybiBxcy5wYXJzZShxdWVyeVN0cmluZylcbn1cbiIsImltcG9ydCB0eXBlIHsgRmV0Y2hPcHRpb25zIH0gZnJvbSAnLi9GZXRjaFNlcnZpY2UudHMnXG5pbXBvcnQgRmV0Y2hTZXJ2aWNlIGZyb20gJy4vRmV0Y2hTZXJ2aWNlLnRzJ1xuLy8gaW1wb3J0IHR5cGUgUm91dGVyU2VydmljZSBmcm9tICcjc2VydmVyL3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMnXG5pbXBvcnQgQ29ra2llTWFwRW50aXR5IGZyb20gJyNzaGFyZWQvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LnRzJ1xuaW1wb3J0IGNvbmZpZyBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29uZmlnLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuaW1wb3J0IHsgcGFyc2VVcmxQYXJhbXMsIHBhcnNlVXJsUXVlcnkgfSBmcm9tICcjc2hhcmVkL3V0aWxzL3BhcnNlUm91dGVVcmwudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZldGNoTm9kZVNlcnZpY2UgZXh0ZW5kcyBGZXRjaFNlcnZpY2Uge1xuICAgIHB1YmxpYyBhc3luYyBmZXRjaDxUPih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgaXNJbnRlcm5hbCA9ICF1cmwuc3RhcnRzV2l0aCgnaHR0cDovLycpICYmICF1cmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKVxuXG4gICAgICAgIGlmICghaXNJbnRlcm5hbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hFeHRlcm5hbDxUPih1cmwsIG9wdGlvbnMpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaEludGVybmFsPFQ+KHVybCwgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZmV0Y2hFeHRlcm5hbDxUPih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgZnVsbFVybCA9IHRoaXMuYnVpbGRVcmwodXJsLCBvcHRpb25zLnF1ZXJ5KVxuICAgICAgICBjb25zdCBmZXRjaE9wdGlvbnMgPSB0aGlzLmJ1aWxkUmVxdWVzdEluaXQob3B0aW9ucylcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGZ1bGxVcmwsIGZldGNoT3B0aW9ucylcblxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUVycm9yKHJlc3BvbnNlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIGVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVJlc3BvbnNlPFQ+KHJlc3BvbnNlKVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBmZXRjaEludGVybmFsPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCByb3V0ZXIgPSAgY29udGFpbmVyLmdldDxhbnk+KCdSb3V0ZXJTZXJ2aWNlJylcbiAgICAgICAgY29uc3QgbWV0aG9kID0gb3B0aW9ucy5tZXRob2QgfHwgJ0dFVCdcbiAgICAgICAgY29uc3Qgcm91dGUgPSByb3V0ZXIucmVzb2x2ZShtZXRob2QsIHVybClcbiAgICAgICAgY29uc3QgY29va2llID0gbmV3IENva2tpZU1hcEVudGl0eSh7XG4gICAgICAgICAgICBwcmVmaXg6IGNvbmZpZy5nZXQoJ2Nvb2tpZS5wcmVmaXgnLCAnJylcbiAgICAgICAgfSlcbiAgICAgICAgXG4gICAgICAgIGlmIChjb250YWluZXIuaGFzKCdjb29raWVzJykpIHtcbiAgICAgICAgICAgIGNvb2tpZS5sb2FkKGNvbnRhaW5lci5nZXQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oJ2Nvb2tpZXMnKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcm91dGUgfHwgIXJvdXRlLmhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUm91dGUgbm90IGZvdW5kIGZvciAke21ldGhvZH0gJHt1cmx9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJvdXRlci5leGVjdXRlKHJvdXRlLCB7XG4gICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgIHBhcmFtczogcGFyc2VVcmxQYXJhbXMocm91dGUucGF0aCwgdXJsKSxcbiAgICAgICAgICAgIHF1ZXJ5OiBvcHRpb25zLnF1ZXJ5IHx8IHBhcnNlVXJsUXVlcnkodXJsKSxcbiAgICAgICAgICAgIGJvZHk6IG9wdGlvbnMuZGF0YSB8fCBvcHRpb25zLmJvZHksXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZC50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgY29va2llOiBjb29raWVcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gcmVzdWx0IGFzIFByb21pc2U8VD5cbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZlY3ljbGVIb29rIHtcbiAgICBwdWJsaWMgaG9va19pZDogc3RyaW5nXG4gICAgcHVibGljIGhvb2tfYWxpYXNlcz86IHN0cmluZ1tdXG4gICAgcHVibGljIG9yZGVyPzogbnVtYmVyXG4gICAgcHVibGljIHN1Ymhvb2tzPzogTGlmZWN5Y2xlSG9va1tdXG5cbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXIoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyBib290KCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4geyB9XG5cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIHJlZ2lzdGVyICovXG4gICAgcHVibGljIGFzeW5jIG9uUmVnaXN0ZXIoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIGxvYWQgKi9cbiAgICBwdWJsaWMgYXN5bmMgb25Mb2FkKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSBib290ICovXG4gICAgcHVibGljIGFzeW5jIG9uQm9vdCgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2Ugc2h1dGRvd24gKi9cbiAgICBwdWJsaWMgYXN5bmMgb25TaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuXG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudCAqL1xuLy8gQHRzLW5vY2hlY2tcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9nZ2VyU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnTG9nZ2VyU2VydmljZScgXG5cbiAgICBwdWJsaWMgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgZGVidWcobWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG4gICAgXG4gICAgcHVibGljIHdhcm4obWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG4gICAgXG4gICAgcHVibGljIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuXG4gICAgcHVibGljIGNoaWxkKG9wdGlvbnM6IGFueSk6IExvZ2dlclNlcnZpY2Uge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgICAgIHJldHVybiBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgfVxufVxuIiwiaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnLi9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IHR5cGUgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnXG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcuLi91dGlscy90cnlDYXRjaC50cydcbmltcG9ydCB7IG9yZGVyQnkgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbnR5cGUgTGlmZWN5Y2xlTWV0aG9kID0gJ3JlZ2lzdGVyJyB8ICdsb2FkJyB8ICdib290JyB8ICdzaHV0ZG93bidcblxuaW50ZXJmYWNlIExpc3RPcHRpb25zIHtcbiAgICBpbmNsdWRlPzogc3RyaW5nIHwgc3RyaW5nW11cbiAgICBleGNsdWRlPzogc3RyaW5nIHwgc3RyaW5nW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaWZlY3ljbGVTZXJ2aWNlT3B0aW9ucyB7XG4gICAgZGVidWc/OiBib29sZWFuXG4gICAgaG9va3M/OiBNYXA8c3RyaW5nLCBMaWZlY3ljbGVIb29rPlxuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2VcbiAgICBvbkVycm9yPzogKGVycm9yOiBFcnJvciwgY29udGV4dDogeyBob29rSWQ6IHN0cmluZzsgbWV0aG9kOiBMaWZlY3ljbGVNZXRob2QgfSkgPT4gdm9pZFxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZlY3ljbGVTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdMaWZlY3ljbGVTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGhvb2tzOiBNYXA8c3RyaW5nLCBMaWZlY3ljbGVIb29rPlxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcbiAgICBwdWJsaWMgZGVidWcgPSBmYWxzZVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogTGlmZWN5Y2xlU2VydmljZU9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmRlYnVnID0gZGF0YS5kZWJ1ZyA/PyB0aGlzLmRlYnVnXG4gICAgICAgIHRoaXMuaG9va3MgPSBkYXRhLmhvb2tzID8/IG5ldyBNYXAoKVxuICAgICAgICB0aGlzLmxvZ2dlciA9IGRhdGEubG9nZ2VyID8/IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICAgICAgXG4gICAgICAgIGlmIChkYXRhLm9uRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMub25FcnJvciA9IGRhdGEub25FcnJvclxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uRXJyb3IoZXJyb3I6IEVycm9yLCBjb250ZXh0OiB7IGhvb2tJZDogc3RyaW5nOyBtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCB9KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgY29udGV4dCB9KVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBob29rICR7Y29udGV4dC5tZXRob2R9ICgke2NvbnRleHQuaG9va0lkfSk6YCwgZXJyb3IpXG4gICAgfVxuXG4gICAgcHVibGljIG1hcEFsaWFzZXMoYXJnczogc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdXG4gICAgICAgIGNvbnN0IGFsbCA9IEFycmF5LmZyb20odGhpcy5ob29rcy52YWx1ZXMoKSlcblxuICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgYWxsKSB7XG4gICAgICAgICAgICBpZiAoYXJncy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChob29rLmhvb2tfYWxpYXNlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRBbGlhcyA9IGhvb2suaG9va19hbGlhc2VzLmZpbmQoYWxpYXMgPT4gYXJncy5pbmNsdWRlcyhhbGlhcykpXG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEFsaWFzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGhvb2suaG9va19pZClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcHVibGljIGxpc3Qob3B0aW9ucz86IExpc3RPcHRpb25zKSB7XG4gICAgICAgIGxldCBob29rcyA9IEFycmF5LmZyb20odGhpcy5ob29rcy52YWx1ZXMoKSlcblxuICAgICAgICBpZiAob3B0aW9ucz8uZXhjbHVkZSkge1xuICAgICAgICAgICAgbGV0IGlkcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5leGNsdWRlKSA/IG9wdGlvbnMuZXhjbHVkZSA6IFtvcHRpb25zLmV4Y2x1ZGVdXG5cbiAgICAgICAgICAgIGlkcyA9IHRoaXMubWFwQWxpYXNlcyhpZHMpXG5cbiAgICAgICAgICAgIGhvb2tzID0gaG9va3MuZmlsdGVyKGhvb2sgPT4gIWlkcy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmluY2x1ZGUpIHtcbiAgICAgICAgICAgIGxldCBpZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuaW5jbHVkZSkgPyBvcHRpb25zLmluY2x1ZGUgOiBbb3B0aW9ucy5pbmNsdWRlXVxuXG4gICAgICAgICAgICBpZHMgPSB0aGlzLm1hcEFsaWFzZXMoaWRzKVxuXG4gICAgICAgICAgICBob29rcyA9IGhvb2tzLmZpbHRlcihob29rID0+IGlkcy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKVxuICAgICAgICB9XG5cbiAgICAgICAgaG9va3MgPSBvcmRlckJ5KGhvb2tzLCBbJ29yZGVyJ10sIFsnYXNjJ10pXG5cbiAgICAgICAgcmV0dXJuIGhvb2tzXG4gICAgfVxuXG4gICAgcHVibGljIGFkZCguLi5wYXlsb2FkOiAoTGlmZWN5Y2xlSG9vayB8IENvbnN0cnVjdG9yPExpZmVjeWNsZUhvb2s+KVtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlczogTGlmZWN5Y2xlSG9va1tdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGF5bG9hZCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VzLnB1c2gobmV3IGl0ZW0oKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnN0YW5jZXMucHVzaChpdGVtKVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBob29rIG9mIGluc3RhbmNlcykge1xuICAgICAgICAgICAgaWYgKCFob29rLmhvb2tfaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdTa2lwcGluZyBob29rIHdpdGhvdXQgaG9va19pZDonLCBob29rKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaG9va3Muc2V0KGhvb2suaG9va19pZCwgaG9vaylcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnYWRkICcgKyBob29rLmhvb2tfaWQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChob29rLnN1Ymhvb2tzKSB7XG4gICAgICAgICAgICAgICAgaG9vay5zdWJob29rcy5mb3JFYWNoKHN1Ymhvb2sgPT4gdGhpcy5hZGQoc3ViaG9vaykpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdE1ldGhvZChtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCwgb3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGhvb2tzID0gdGhpcy5saXN0KG9wdGlvbnMpIFxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgZW1pdHRpbmcgJHttZXRob2R9IGZvciBob29rczpgLCB7XG4gICAgICAgICAgICAgICAgaG9va3M6IGhvb2tzLm1hcChob29rID0+IGhvb2suaG9va19pZClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgdGhpcy5saXN0KG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBjb25zdCBtYXAgPSB7XG4gICAgICAgICAgICAgICAgcmVnaXN0ZXI6ICgpID0+IFByb21pc2UuYWxsKFtob29rLnJlZ2lzdGVyKCksIGhvb2sub25SZWdpc3RlcigpXSksXG4gICAgICAgICAgICAgICAgbG9hZDogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2subG9hZCgpLCBob29rLm9uTG9hZCgpXSksXG4gICAgICAgICAgICAgICAgYm9vdDogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2suYm9vdCgpLCBob29rLm9uQm9vdCgpXSksXG4gICAgICAgICAgICAgICAgc2h1dGRvd246ICgpID0+IFByb21pc2UuYWxsKFtob29rLnNodXRkb3duKCksIGhvb2sub25TaHV0ZG93bigpXSksXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFtlcnJvcl0gPSBhd2FpdCB0cnlDYXRjaCgoKSA9PiBtYXBbbWV0aG9kXSgpKVxuXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IsIHsgaG9va0lkOiBob29rLmhvb2tfaWQsIG1ldGhvZCB9KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYCR7bWV0aG9kfSBgICsgaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVtaXQocGF5bG9hZDogTGlmZWN5Y2xlTWV0aG9kIHwgTGlmZWN5Y2xlTWV0aG9kW10sIG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBtZXRob2RzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKSA/IHBheWxvYWQgOiBbcGF5bG9hZF1cblxuICAgICAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2RzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXRNZXRob2QobWV0aG9kLCBvcHRpb25zKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlZ2lzdGVyKG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdyZWdpc3RlcicsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWQob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2xvYWQnLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBib290KG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdib290Jywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2h1dGRvd24ob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnc2h1dGRvd24nLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob29rcy5jbGVhcigpXG4gICAgfVxufVxuIiwiaW1wb3J0IExpZmVjeWNsZUhvb2sgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9MaWZlY3ljbGVIb29rLnRzJztcbmltcG9ydCBCYXNlTGlmZWN5Y2xlU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xpZmVjeWNsZVNlcnZpY2UudHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZlY3ljbGVTZXJ2aWNlIGV4dGVuZHMgQmFzZUxpZmVjeWNsZVNlcnZpY2Uge1xuICAgIHB1YmxpYyBhZGRJbXBvcnRzKGltcG9ydHM6IFJlY29yZDxzdHJpbmcsIGFueT4pe1xuICAgICAgICBjb25zdCBob29rczogTGlmZWN5Y2xlSG9va1tdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBtb2RdIG9mIE9iamVjdC5lbnRyaWVzKGltcG9ydHMpKSB7XG4gICAgICAgICAgICBjb25zdCBIb29rQ2xhc3MgPSBtb2QuZGVmYXVsdCB8fCBtb2RcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IEhvb2tDbGFzcygpIGFzIExpZmVjeWNsZUhvb2tcblxuICAgICAgICAgICAgaW5zdGFuY2UuaG9va19pZCA9IGluc3RhbmNlLmhvb2tfaWQgfHwgbmFtZVxuXG4gICAgICAgICAgICBob29rcy5wdXNoKGluc3RhbmNlKVxuICAgICAgICB9XG5cbiAgICAgICAgaG9va3MuZm9yRWFjaChob29rID0+IHRoaXMuYWRkKGhvb2spKVxuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1lbnVJdGVtIGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5KSB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbGFiZWw6IHN0cmluZ1xuICAgIHB1YmxpYyBsYXlvdXQ6IHN0cmluZ1xuXG4gICAgcHVibGljIHRvPzogc3RyaW5nXG5cbiAgICBwdWJsaWMgdGFyZ2V0PzogJ19ibGFuaycgfCAnX3NlbGYnIHwgJ19wYXJlbnQnIHwgJ190b3AnXG4gICAgcHVibGljIGdyb3VwPzogc3RyaW5nXG4gICAgcHVibGljIG9yZGVyPzogbnVtYmVyXG4gICAgcHVibGljIGljb24/OiBzdHJpbmdcbiAgICBwdWJsaWMgcGFyZW50Pzogc3RyaW5nXG59XG4iLCJpbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcjc2hhcmVkL3V0aWxzL3RyeUNhdGNoLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQZXJtaXNzaW9uRW50aXR5IGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5KSB7XG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIHB1YmxpYyBvcmlnaW46IHN0cmluZ1xuICAgIHB1YmxpYyBzdWJqZWN0OiBzdHJpbmdcbiAgICBwdWJsaWMgYWN0aW9uOiBzdHJpbmdcbiAgICBwdWJsaWMgY29uZGl0aW9uczogc3RyaW5nIHwgbnVsbCB8IFJlY29yZDxzdHJpbmcsIGFueT4gPSBudWxsXG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW4gPT09ICdjdXN0b20nXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYXJzZWRDb25kaXRpb25zKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29uZGl0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHt9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbZXJyb3IsIGpzb25dID0gdHJ5Q2F0Y2guc3luYygoKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29uZGl0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLmNvbmRpdGlvbnMgYXMgc3RyaW5nKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25zIGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gZXJyb3IgPyB7fSA6IGpzb25cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVBYmlsaXR5LCBzdWJqZWN0IGFzIGNyZWF0ZVN1YmplY3QgfSBmcm9tICdAY2FzbC9hYmlsaXR5J1xuaW1wb3J0IFBlcm1pc3Npb24gZnJvbSAnLi9QZXJtaXNzaW9uRW50aXR5LnRzJ1xuaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY2xFbnRpdHkge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0FjbEVudGl0eSdcblxuICAgIHB1YmxpYyBhYmlsaXR5OiBSZXR1cm5UeXBlPHR5cGVvZiBkZWZpbmVBYmlsaXR5PlxuICAgIHB1YmxpYyBwZXJtaXNzaW9uczogUGVybWlzc2lvbltdXG4gICAgcHVibGljIGRlYnVnOiBib29sZWFuID0gZmFsc2VcbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQYXJ0aWFsPEFjbEVudGl0eT4gPSB7fSkge1xuICAgICAgICBjb25zdCBwZXJtaXNzaW9ucyA9IGRhdGEucGVybWlzc2lvbnMgfHwgW11cbiAgICAgICAgY29uc3QgcGVybXMgPSBwZXJtaXNzaW9ucy5tYXAoKHBlcm1pc3Npb24pID0+IFBlcm1pc3Npb24uZnJvbShwZXJtaXNzaW9uKSlcblxuICAgICAgICBcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IHBlcm1zXG4gICAgICAgIHRoaXMuZGVidWcgPSBkYXRhLmRlYnVnIHx8IGZhbHNlXG4gICAgICAgIHRoaXMubG9nZ2VyID0gZGF0YS5sb2dnZXIgfHwgbmV3IExvZ2dlclNlcnZpY2UoKS5jaGlsZCh7IGxhYmVsOiAnYWNsJyB9KVxuICAgICAgICBcbiAgICAgICAgdGhpcy5hYmlsaXR5ID0gZGVmaW5lQWJpbGl0eSgoY2FuKSA9PiB7XG4gICAgICAgICAgICBwZXJtcy5mb3JFYWNoKChwZXJtaXNzaW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgY2FuKHBlcm1pc3Npb24uYWN0aW9uLCBwZXJtaXNzaW9uLnN1YmplY3QsIHBlcm1pc3Npb24ucGFyc2VkQ29uZGl0aW9ucylcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdpbml0aWFsaXplZCBpbiBkZWJ1ZyBtb2RlJywge1xuICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zOiB0aGlzLnBlcm1pc3Npb25zLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjYW4oYWN0aW9uOiBzdHJpbmcsIHN1YmplY3Q6IGFueSwgb2JqZWN0PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuXG4gICAgICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbihhY3Rpb24sIHN1YmplY3QpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWJqZWN0V2l0aE9iamVjdCA9IGNyZWF0ZVN1YmplY3Qoc3ViamVjdCwgb2JqZWN0KVxuXG4gICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2FuKGFjdGlvbiwgc3ViamVjdFdpdGhPYmplY3QpXG4gICAgfVxuXG4gICAgcHVibGljIGNhbm5vdChhY3Rpb246IHN0cmluZywgc3ViamVjdDogYW55LCBvYmplY3Q/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbm5vdChhY3Rpb24sIHN1YmplY3QpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWJqZWN0V2l0aE9iamVjdCA9IGNyZWF0ZVN1YmplY3Qoc3ViamVjdCwgb2JqZWN0KVxuXG4gICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2Fubm90KGFjdGlvbiwgc3ViamVjdFdpdGhPYmplY3QpXG4gICAgfVxuXG4gICAgcHVibGljIHN1YmplY3Qoc3ViamVjdDogc3RyaW5nLCBvYmplY3Q6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVN1YmplY3Qoc3ViamVjdCwgb2JqZWN0KVxuICAgIH1cbn1cbiIsImltcG9ydCBjb250YWluZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cydcbmltcG9ydCBBY2xFbnRpdHkgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9BY2xFbnRpdHkudHMnXG5cbmNvbnN0IGFjbCA9IGNvbnRhaW5lci5wcm94eTxBY2xFbnRpdHk+KEFjbEVudGl0eSlcblxuZXhwb3J0IGRlZmF1bHQgYWNsXG4iLCJpbXBvcnQgTWVudUl0ZW0gZnJvbSAnI2NsaWVudC9lbnRpdGllcy9NZW51SXRlbUVudGl0eS50cydcbmltcG9ydCBhY2wgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2FjbC50cydcblxuZXhwb3J0IGludGVyZmFjZSBMaXN0RmlsdGVyIHtcbiAgICBsYXlvdXQ/OiBzdHJpbmdcbiAgICBncm91cD86IHN0cmluZ1xuICAgIHBhcmVudD86IHN0cmluZ1xuICAgIGFsbG93ZWQ/OiBib29sZWFuXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1lbnVTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdNZW51U2VydmljZSdcblxuICAgIHB1YmxpYyBpdGVtczogTWFwPHN0cmluZywgTWVudUl0ZW0+ID0gbmV3IE1hcCgpXG5cbiAgICBwdWJsaWMgYWRkKC4uLml0ZW06IE9taXQ8UGFydGlhbDxNZW51SXRlbT4sICdtZXJnZScgfCAnZnJvbSc+W10pIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIGl0ZW0pIHtcblxuICAgICAgICAgICAgaWYgKCFpLmlkKSB7XG4gICAgICAgICAgICAgICAgaS5pZCA9IEpTT04uc3RyaW5naWZ5KGkpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaXRlbXMuc2V0KGkuaWQsIE1lbnVJdGVtLmZyb20oaSkpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlKGlkOiBNZW51SXRlbVsnaWQnXSkge1xuICAgICAgICB0aGlzLml0ZW1zLmRlbGV0ZShpZClcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdChmaWx0ZXI6IExpc3RGaWx0ZXIgPSB7fSkge1xuICAgICAgICBsZXQgaXRlbXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEFycmF5LmZyb20odGhpcy5pdGVtcy52YWx1ZXMoKSkpKSBhcyBNZW51SXRlbVtdXG5cblxuICAgICAgICBpZiAoZmlsdGVyLmxheW91dCkge1xuICAgICAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoaSA9PiBpLmxheW91dCA9PT0gZmlsdGVyLmxheW91dClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXIuZ3JvdXApIHtcbiAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMuZmlsdGVyKGkgPT4gaS5ncm91cCA9PT0gZmlsdGVyLmdyb3VwIHx8IGkucGFyZW50ID09PSBmaWx0ZXIuZ3JvdXApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsdGVyLnBhcmVudCkge1xuICAgICAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoaSA9PiBpLnBhcmVudCA9PT0gZmlsdGVyLnBhcmVudClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXIuYWxsb3dlZCAhPT0gdW5kZWZpbmVkICYmIGZpbHRlci5hbGxvd2VkID09PSB0cnVlKSB7XG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpID0+IGFjbC5jYW4oJ3ZpZXcnLCBpKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9yZGVyQSA9IGEub3JkZXIgPyBhLm9yZGVyIDogOThcbiAgICAgICAgICAgIGNvbnN0IG9yZGVyQiA9IGIub3JkZXIgPyBiLm9yZGVyIDogOThcblxuICAgICAgICAgICAgcmV0dXJuIG9yZGVyQSAtIG9yZGVyQlxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBpdGVtc1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5pdGVtcy5jbGVhcigpXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBOYXZpZ2F0aW9uR3VhcmQgfSBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IGNvbmZpZyBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29uZmlnLnRzJ1xuXG5jb25zdCBzZXR1cEd1YXJkOiBOYXZpZ2F0aW9uR3VhcmQgPSAodG8pID0+IHtcbiAgICBjb25zdCBzZXR1cCA9IGNvbmZpZy5nZXQ8YW55Pignc2V0dXAnKVxuICAgIFxuICAgIGNvbnN0IGNvbXBsZXRlZCA9ICFzZXR1cD8ubmVlZF9kYXRhYmFzZSAmJiAhc2V0dXA/Lm5lZWRfdXNlcnNcbiAgICBcbiAgICBpZiAoY29tcGxldGVkICYmIHRvLnBhdGguc3RhcnRzV2l0aCgnL3NldHVwJykpIHtcbiAgICAgICAgcmV0dXJuICcvJ1xuICAgIH1cbiAgICBcbiAgICBpZiAoY29tcGxldGVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIFxuICAgIGlmICghdG8ucGF0aC5zdGFydHNXaXRoKCcvc2V0dXAnKSkge1xuICAgICAgICByZXR1cm4gJy9zZXR1cCdcbiAgICB9XG4gICAgXG4gICAgaWYgKHRvLnBhdGggPT09ICcvc2V0dXAnKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfSAgICBcblxuICAgIGlmIChzZXR1cD8ubmVlZF9kYXRhYmFzZSkge1xuICAgICAgICByZXR1cm4gdG8ucGF0aCAhPT0gJy9zZXR1cC9kYXRhYmFzZScgPyAnL3NldHVwL2RhdGFiYXNlJyA6IHRydWVcbiAgICB9XG5cbiAgICBpZiAoc2V0dXA/Lm5lZWRfdXNlcnMpIHtcbiAgICAgICAgcmV0dXJuIHRvLnBhdGggIT09ICcvc2V0dXAvdXNlcicgPyAnL3NldHVwL3VzZXInIDogdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBkZWZhdWx0IHNldHVwR3VhcmRcbiIsImltcG9ydCB7XG4gICAgY3JlYXRlUm91dGVyIGFzIGNyZWF0ZVZ1ZVJvdXRlcixcbiAgICBjcmVhdGVNZW1vcnlIaXN0b3J5LFxuICAgIGNyZWF0ZVdlYkhpc3Rvcnlcbn0gZnJvbSAndnVlLXJvdXRlcidcbmltcG9ydCB0eXBlIHsgTmF2aWdhdGlvbkd1YXJkLCBSb3V0ZXIgYXMgVnVlUm91dGVyIH0gZnJvbSAndnVlLXJvdXRlcidcbmltcG9ydCB0eXBlIHsgUm91dGVSZWNvcmRSYXcgfSBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IHR5cGUgeyBEZWZpbmVDb21wb25lbnQgfSBmcm9tICd2dWUnXG5pbXBvcnQgc2V0dXBHdWFyZCBmcm9tICcjY2xpZW50L2d1YXJkcy9zZXR1cEd1YXJkLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlciBleHRlbmRzIFZ1ZVJvdXRlciB7XG4gICAgYXV0bzogdHlwZW9mIGF1dG87XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b09wdGlvbnMge1xuICAgIGd1YXJkcz86IE5hdmlnYXRpb25HdWFyZFtdIHwgKChyZWNvcmQ6IFJvdXRlUmVjb3JkUmF3KSA9PiBOYXZpZ2F0aW9uR3VhcmRbXSk7XG4gICAgc3RyaXA/OiAoc3RyaW5nIHwgUmVnRXhwKVtdO1xuICAgIGV4Y2x1ZGU/OiAoc3RyaW5nIHwgUmVnRXhwKVtdO1xuICAgIHByZWZpeD86IHN0cmluZztcbiAgICByZWZpbmU/OiAocmVjb3JkczogUm91dGVSZWNvcmRSYXdbXSkgPT4gUm91dGVSZWNvcmRSYXdbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF1dG8oaW1wb3J0czogUmVjb3JkPHN0cmluZywgRGVmaW5lQ29tcG9uZW50IHwgKCgpID0+IFByb21pc2U8RGVmaW5lQ29tcG9uZW50Pik+LCBvcHRpb25zOiBBdXRvT3B0aW9ucyA9IHt9KTogUm91dGVSZWNvcmRSYXdbXSB7XG4gICAgbGV0IHJvdXRlczogUm91dGVSZWNvcmRSYXdbXSA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlbmFtZSwgY29tcG9uZW50XSBvZiBPYmplY3QuZW50cmllcyhpbXBvcnRzKSkge1xuXG4gICAgICAgIGlmIChvcHRpb25zLmV4Y2x1ZGU/LnNvbWUocnVsZSA9PlxuICAgICAgICAgICAgdHlwZW9mIHJ1bGUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgPyBmaWxlbmFtZS5pbmNsdWRlcyhydWxlKVxuICAgICAgICAgICAgICAgIDogcnVsZS50ZXN0KGZpbGVuYW1lKVxuICAgICAgICApKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcnRzID0gZmlsZW5hbWVcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXC52dWUkLywgJycpXG4gICAgICAgICAgICAuc3BsaXQoJy8nKVxuICAgICAgICAgICAgLmZpbHRlcihwID0+IHAgJiYgIXAuc3RhcnRzV2l0aCgnLicpKVxuICAgICAgICAgICAgLm1hcChwYXJ0ID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcCA9IHBhcnRcblxuICAgICAgICAgICAgICAgIGlmIChwLnN0YXJ0c1dpdGgoJ1snKSAmJiBwLmVuZHNXaXRoKCddJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcCA9ICc6JyArIHAuc2xpY2UoMSwgLTEpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBcbiAgICAgICAgICAgIH0pXG5cblxuICAgICAgICAvLyBTdHJpcCBzcGVjaWZpYyBzZWdtZW50c1xuICAgICAgICBpZiAob3B0aW9ucy5zdHJpcD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBwYXJ0cyA9IHBhcnRzLmZpbHRlcihwID0+XG4gICAgICAgICAgICAgICAgIW9wdGlvbnMuc3RyaXAhLnNvbWUocnVsZSA9PlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcnVsZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcCA9PT0gcnVsZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBydWxlLnRlc3QocClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGF0aCA9IHBhcnRzLmpvaW4oJy8nKS5yZXBsYWNlKC9pbmRleCQvLCAnJylcblxuICAgICAgICBpZiAob3B0aW9ucy5wcmVmaXgpIHtcbiAgICAgICAgICAgIHBhdGggPSBvcHRpb25zLnByZWZpeCArICcvJyArIHBhdGhcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgIHBhdGggPSAnLycgKyBwYXRoXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlY29yZCA9IHtcbiAgICAgICAgICAgIHBhdGg6IHBhdGgsXG4gICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudCBhcyBEZWZpbmVDb21wb25lbnQsXG4gICAgICAgICAgICBiZWZvcmVFbnRlcjogW10gYXMgTmF2aWdhdGlvbkd1YXJkW10sXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChvcHRpb25zLmd1YXJkcyAmJiBBcnJheS5pc0FycmF5KG9wdGlvbnMuZ3VhcmRzKSkge1xuICAgICAgICAgICAgcmVjb3JkLmJlZm9yZUVudGVyID0gb3B0aW9ucy5ndWFyZHNcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLmd1YXJkcyAmJiB0eXBlb2Ygb3B0aW9ucy5ndWFyZHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJlY29yZC5iZWZvcmVFbnRlciA9IG9wdGlvbnMuZ3VhcmRzKHJlY29yZClcbiAgICAgICAgfVxuXG4gICAgICAgIHJvdXRlcy5wdXNoKHJlY29yZClcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5yZWZpbmUpIHtcbiAgICAgICAgcm91dGVzID0gb3B0aW9ucy5yZWZpbmUocm91dGVzKVxuICAgIH1cblxuICAgIHJldHVybiByb3V0ZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlcigpIHtcbiAgICBjb25zdCBzc3IgPSBpbXBvcnQubWV0YS5lbnYuU1NSXG5cbiAgICBjb25zdCByb3V0ZXIgPSBjcmVhdGVWdWVSb3V0ZXIoe1xuICAgICAgICBoaXN0b3J5OiBzc3IgPyBjcmVhdGVNZW1vcnlIaXN0b3J5KCkgOiBjcmVhdGVXZWJIaXN0b3J5KCksXG4gICAgICAgIHJvdXRlczogW10sXG4gICAgICAgIHNjcm9sbEJlaGF2aW9yKHRvLCBmcm9tLCBzYXZlZFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBpZiAoc2F2ZWRQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBzYXZlZFBvc2l0aW9uXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHRvcDogMCB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSkgYXMgYW55IGFzIFJvdXRlclxuXG4gICAgcm91dGVyLmJlZm9yZUVhY2goc2V0dXBHdWFyZClcblxuICAgIHJvdXRlci5hdXRvID0gKGltcG9ydHM6IFJlY29yZDxzdHJpbmcsIERlZmluZUNvbXBvbmVudCB8ICgoKSA9PiBQcm9taXNlPERlZmluZUNvbXBvbmVudD4pPiwgb3B0aW9uczogQXV0b09wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCBhdXRvUm91dGVzID0gYXV0byhpbXBvcnRzLCBvcHRpb25zKVxuICAgICAgICBcbiAgICAgICAgYXV0b1JvdXRlcy5mb3JFYWNoKHJvdXRlID0+IHJvdXRlci5hZGRSb3V0ZShyb3V0ZSkpXG5cbiAgICAgICAgcmV0dXJuIGF1dG9Sb3V0ZXNcbiAgICB9XG5cbiAgICByZXR1cm4gcm91dGVyXG59XG5cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFRvYXN0U2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnVG9hc3RTZXJ2aWNlJ1xuXG4gICAgcHVibGljIHN1Y2Nlc3MobWVzc2FnZTogc3RyaW5nLCBvcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICBjb25zb2xlLmxvZygnU3VjY2VzczonLCBtZXNzYWdlLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgfVxufVxuIiwiaW1wb3J0IEF1dGhTZXJ2aWNlIGZyb20gJyNjbGllbnQvc2VydmljZXMvQXV0aFNlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuXG5jb25zdCBhdXRoID0gY29udGFpbmVyLnByb3h5PEF1dGhTZXJ2aWNlPihBdXRoU2VydmljZSlcblxuaWYgKGltcG9ydC5tZXRhLmVudi5ERVYgJiYgIWltcG9ydC5tZXRhLmVudi5TU1IpIHtcbiAgICAod2luZG93IGFzIGFueSkuYXV0aCA9IGF1dGhcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXV0aFxuIiwiaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcblxuY29uc3QgbG9nZ2VyID0gY29udGFpbmVyLnByb3h5PExvZ2dlclNlcnZpY2U+KExvZ2dlclNlcnZpY2UpXG5cbmV4cG9ydCBkZWZhdWx0IGxvZ2dlclxuIiwiaW1wb3J0IE1lbnVTZXJ2aWNlIGZyb20gJyNjbGllbnQvc2VydmljZXMvTWVudVNlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuXG5jb25zdCBtZW51ID0gY29udGFpbmVyLnByb3h5PE1lbnVTZXJ2aWNlPihNZW51U2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgbWVudVxuIiwiaW1wb3J0IGNvbnRhaW5lciBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuaW1wb3J0IHR5cGUgeyBSb3V0ZUxvY2F0aW9uTm9ybWFsaXplZEdlbmVyaWMgfSBmcm9tICd2dWUtcm91dGVyJ1xuXG5jb25zdCByb3V0ZSA9IGNvbnRhaW5lci5wcm94eTxSb3V0ZUxvY2F0aW9uTm9ybWFsaXplZEdlbmVyaWM+KCdyb3V0ZScpXG5cbmV4cG9ydCBkZWZhdWx0IHJvdXRlXG5cbiIsImltcG9ydCBjb250YWluZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cydcbmltcG9ydCB0eXBlIHsgUm91dGVyIH0gZnJvbSAnI2NsaWVudC9zZXJ2aWNlcy9Sb3V0ZXJTZXJ2aWNlLnRzJ1xuXG5jb25zdCByb3V0ZXIgPSBjb250YWluZXIucHJveHk8Um91dGVyPigncm91dGVyJylcblxuZXhwb3J0IGRlZmF1bHQgcm91dGVyXG4iLCJpbXBvcnQgY29udGFpbmVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMnXG5pbXBvcnQgVG9hc3RTZXJ2aWNlIGZyb20gJyNjbGllbnQvc2VydmljZXMvVG9hc3RTZXJ2aWNlLnRzJ1xuXG5jb25zdCB0b2FzdCA9IGNvbnRhaW5lci5wcm94eTxUb2FzdFNlcnZpY2U+KFRvYXN0U2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgdG9hc3RcbiIsImltcG9ydCB0eXBlIE1vZHVsZU1hbmlmZXN0IGZyb20gJy4vTW9kdWxlTWFuaWZlc3RFbnRpdHkudHMnXG5pbXBvcnQgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnXG5pbXBvcnQgeyBjb21wb3NlLCBtaXhpbiB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcblxuaW50ZXJmYWNlIE1vZHVsZVVwZ3JhZGVJbmZvIHtcbiAgICBzb3VyY2U6ICdnaXQnIHwgJ3ppcCdcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kdWxlIGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5LCBtaXhpbihMaWZlY3ljbGVIb29rKSkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuID0gZmFsc2VcbiAgICBwdWJsaWMgZGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cbiAgICBwdWJsaWMgYnVpbGQ6IE1vZHVsZU1hbmlmZXN0WydidWlsZCddID0ge31cbiAgICBwdWJsaWMgZGlyZWN0b3J5OiBzdHJpbmdcblxuICAgIHB1YmxpYyB1cGdyYWRlX2luZm8/OiBNb2R1bGVVcGdyYWRlSW5mb1xuXG4gICAgcHVibGljIHNldERhdGEoZGF0YTogUGFydGlhbDxNb2R1bGUgfCBNb2R1bGVNYW5pZmVzdD4pIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhkYXRhKS5maWx0ZXIoKFssIHZdKSA9PiB2ICE9PSB1bmRlZmluZWQpXG4gICAgICAgIClcblxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGZpbHRlcmVkKVxuXG4gICAgICAgIHRoaXMuaG9va19pZCA9IGBtb2R1bGU6JHt0aGlzLmlkfWBcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL01vZHVsZUVudGl0eS50cydcbmltcG9ydCB7IGNvbXBvc2VXaXRoIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2R1bGUgZXh0ZW5kcyBjb21wb3NlV2l0aChCYXNlKSB7XG4gICBcbn1cbiIsImltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsdWdpbkVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyB2ZXJzaW9uOiBzdHJpbmdcbiAgICBwdWJsaWMgZW5hYmxlZDogYm9vbGVhblxuICAgIHB1YmxpYyBhbGlhc2VzOiBzdHJpbmdbXVxufVxuIiwiaW1wb3J0IEJhc2UgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9QbHVnaW5FbnRpdHkudHMnXG5pbXBvcnQgcm91dGVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9yb3V0ZXIudHMnXG5pbXBvcnQgeyBjb21wb3NlV2l0aCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCB0eXBlIHsgQXV0b09wdGlvbnMgfSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsdWdpbkVudGl0eSBleHRlbmRzIGNvbXBvc2VXaXRoKEJhc2UpIHtcbiAgICBwdWJsaWMgYWRkUGFnZXNGb2xkZXIoaW1wb3J0czogYW55LCBvcHRpb25zPzogQXV0b09wdGlvbnMpIHtcbiAgICAgICAgcm91dGVyLmF1dG8oaW1wb3J0cywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgLy8gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gbG9hZCBhZGRpdGlvbmFsIGRhdGEgZnJvbSB0aGUgcGx1Z2luJ3MgZGlyZWN0b3J5IGlmIG5lZWRlZFxuICAgIH1cbn1cbiIsImltcG9ydCB7IGF1dG8gfSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMnXG5pbXBvcnQgdHlwZSB7IEF1dG9PcHRpb25zIH0gZnJvbSAnI2NsaWVudC9zZXJ2aWNlcy9Sb3V0ZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IHR5cGUgeyBEZWZpbmVDb21wb25lbnQgfSBmcm9tICd2dWUnXG5pbXBvcnQgdHlwZSB7IFJvdXRlUmVjb3JkUmF3IH0gZnJvbSAndnVlLXJvdXRlcidcblxuLyoqIEBkZXByZWNhdGVkIFVzZSBhdXRvIGZyb20gUm91dGVyU2VydmljZSBpbnN0ZWFkICovXG5leHBvcnQgZnVuY3Rpb24gYXV0b1JvdXRlcyhcbiAgICBpbXBvcnRzOiBSZWNvcmQ8c3RyaW5nLCBEZWZpbmVDb21wb25lbnQgfCAoKCkgPT4gUHJvbWlzZTxEZWZpbmVDb21wb25lbnQ+KT4sXG4gICAgb3B0aW9uczogQXV0b09wdGlvbnMgPSB7fVxuKTogUm91dGVSZWNvcmRSYXdbXSB7XG4gICAgcmV0dXJuIGF1dG8oaW1wb3J0cywgb3B0aW9ucylcbn1cbiIsImltcG9ydCAkb3JpZ2luYWwgZnJvbSBcIiNjbGllbnQvZmFjYWRlcy9mZXRjaGVyLnRzXCI7XG5cbi8qKiBAZGVwcmVjYXRlZCBVc2UgZmV0Y2hlciBmYWNhZGUgKi9cbmV4cG9ydCBjb25zdCAkZmV0Y2ggPSAkb3JpZ2luYWw7XG4iLCJpbXBvcnQgeyAkZmV0Y2ggfSBmcm9tICcuL2ZldGNoZXInXG5cbmludGVyZmFjZSBQaWNrT3B0aW9ucyB7XG4gICAgYWNjZXB0Pzogc3RyaW5nXG4gICAgbXVsdGlwbGU/OiBib29sZWFuXG59XG5cbnR5cGUgUGlja1Jlc3VsdDxUIGV4dGVuZHMgUGlja09wdGlvbnM+ID0gVFsnbXVsdGlwbGUnXSBleHRlbmRzIHRydWUgPyBGaWxlW10gOiBGaWxlIHwgbnVsbFxuXG5mdW5jdGlvbiBwaWNrPFQgZXh0ZW5kcyBQaWNrT3B0aW9ucz4ob3B0aW9uczogVCk6IFByb21pc2U8UGlja1Jlc3VsdDxUPj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcblxuICAgICAgICBpbnB1dC50eXBlID0gJ2ZpbGUnXG4gICAgICAgIGlucHV0LmFjY2VwdCA9IG9wdGlvbnMuYWNjZXB0IHx8ICcqLyonXG4gICAgICAgIGlucHV0Lm11bHRpcGxlID0gb3B0aW9ucy5tdWx0aXBsZSB8fCBmYWxzZVxuXG4gICAgICAgIGlucHV0Lm9uY2hhbmdlID0gKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnRcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbSh0YXJnZXQuZmlsZXMgYXMgRmlsZUxpc3QpIGFzIEZpbGVbXVxuXG4gICAgICAgICAgICByZXNvbHZlKChvcHRpb25zLm11bHRpcGxlID8gQXJyYXkuZnJvbShmaWxlcykgOiBmaWxlc1swXSkgYXMgUGlja1Jlc3VsdDxUPilcbiAgICAgICAgfVxuXG4gICAgICAgIGlucHV0Lm9uY2FuY2VsID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShvcHRpb25zLm11bHRpcGxlID8gW10gOiAobnVsbCBhcyBhbnkpKVxuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXQuY2xpY2soKVxuICAgIH0pXG59XG5cbmZ1bmN0aW9uIHRvVWludDhBcnJheShmaWxlOiBGaWxlKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUudGFyZ2V0Py5yZXN1bHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFVpbnQ4QXJyYXkoZS50YXJnZXQucmVzdWx0KSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIHJlYWQgZmlsZSBhcyBBcnJheUJ1ZmZlcicpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICByZWplY3QocmVhZGVyLmVycm9yKVxuICAgICAgICB9XG5cbiAgICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpXG4gICAgfSlcbn1cblxuaW50ZXJmYWNlIFVwbG9hZE9wdGlvbnMge1xuICAgIGRyaXZlSWQ6IHN0cmluZ1xuICAgIGZpbGU6IEZpbGVcbiAgICBkaXJlY3Rvcnk/OiBzdHJpbmdcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBsb2FkKG9wdGlvbnM6IFVwbG9hZE9wdGlvbnMpe1xuICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKVxuICAgIFxuICAgIGZvcm0uYXBwZW5kKCdmaWxlJywgb3B0aW9ucy5maWxlKVxuXG4gICAgaWYgKG9wdGlvbnMuZGlyZWN0b3J5KSB7XG4gICAgICAgIGZvcm0uYXBwZW5kKCdkaXJlY3RvcnknLCBvcHRpb25zLmRpcmVjdG9yeSlcbiAgICB9XG5cbiAgICByZXR1cm4gJGZldGNoKGAvYXBpL2RyaXZlcy8ke29wdGlvbnMuZHJpdmVJZH0vdXBsb2FkYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogZm9ybSxcbiAgICAgICAgcXVlcnk6IHsgZGlyZWN0b3J5OiBvcHRpb25zLmRpcmVjdG9yeSwgfVxuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCAkZmlsZSA9IHtcbiAgICBwaWNrLFxuICAgIHVwbG9hZCxcbiAgICB0b1VpbnQ4QXJyYXksXG59IiwiaW1wb3J0IHsgdG9hc3QgfSBmcm9tICd2dWUtc29ubmVyJ1xuXG5leHBvcnQgY29uc3QgJHRvYXN0ID0gdG9hc3RcbiIsImltcG9ydCB0eXBlIHsgTmF2aWdhdGlvbkd1YXJkIH0gZnJvbSAndnVlLXJvdXRlcidcbmltcG9ydCBhdXRoIGZyb20gJyNjbGllbnQvZmFjYWRlcy9hdXRoLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhHdWFyZE9wdGlvbnMge1xuICAgIHJlZGlyZWN0OiBzdHJpbmdcbiAgICBleGNsdWRlPzogc3RyaW5nW11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUF1dGhHdWFyZChvcHRpb25zOiBBdXRoR3VhcmRPcHRpb25zKTogTmF2aWdhdGlvbkd1YXJkIHtcbiAgICBjb25zdCBleGNsdWRlID0gb3B0aW9ucy5leGNsdWRlIHx8IFsnL2F1dGgvbG9naW4nLCAnL2F1dGgvcmVnaXN0ZXInXVxuICAgIFxuICAgIHJldHVybiAodG8pID0+IHtcbiAgICAgICAgaWYgKCFhdXRoLnVzZXIgJiYgIWV4Y2x1ZGUuaW5jbHVkZXModG8ucGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnJlZGlyZWN0XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNvbnN0IGF1dGhHdWFyZCA9IGNyZWF0ZUF1dGhHdWFyZCh7IFxuICAgIHJlZGlyZWN0OiAnL2F1dGgvbG9naW4nLFxufSlcblxuZXhwb3J0IGRlZmF1bHQgYXV0aEd1YXJkXG4iLCJpbXBvcnQgYXV0aCBmcm9tICcjY2xpZW50L2ZhY2FkZXMvYXV0aC50cydcblxuZXhwb3J0IGludGVyZmFjZSBHdWVzdEd1YXJkT3B0aW9ucyB7XG4gICAgcmVkaXJlY3Q6IHN0cmluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR3Vlc3RHdWFyZChvcHRpb25zOiBHdWVzdEd1YXJkT3B0aW9ucykge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmIChhdXRoLnVzZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnJlZGlyZWN0XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNvbnN0IGd1ZXN0R3VhcmQgPSBjcmVhdGVHdWVzdEd1YXJkKHtcbiAgICByZWRpcmVjdDogJy8nXG59KVxuXG5leHBvcnQgZGVmYXVsdCBndWVzdEd1YXJkXG4iXSwibWFwcGluZ3MiOiJtUkFZQSxlQUFzQixFQUErQixFQUEyQyxDQUM1RixHQUFJLENBRUEsTUFBTyxDQUFDLEtBRE8sTUFBTSxHQUFPLENBQ1AsT0FDaEIsRUFBTyxDQUNaLE1BQU8sQ0FBQyxFQUFjLEtBQUssRUFJbkMsRUFBUyxLQUFPLFNBQTJCLEVBQTZCLENBQ3BFLEdBQUksQ0FFQSxNQUFPLENBQUMsS0FETyxHQUFPLENBQ0QsT0FDaEIsRUFBTyxDQUNaLE1BQU8sQ0FBQyxFQUFjLEtBQUssR0NqQm5DLElBQXFCLEVBQXJCLEtBQWtDLENBQzlCLE9BQWMsc0JBQXdCLGVBRXRDLE1BQWdCLFlBQVksRUFBb0IsQ0FHNUMsR0FBSSxFQUZnQixFQUFTLFFBQVEsSUFBSSxlQUFlLEVBQUksSUFFM0MsU0FBUyxtQkFBbUIsQ0FBRSxDQUMzQyxFQUFNLE1BQU0sR0FBRyx3QkFBd0IsQ0FBQyxDQUN4QyxPQUdKLEdBQUksRUFBUyxRQUFRLElBQUksZUFBZSxFQUFFLFNBQVMsT0FBTyxDQUFFLENBQ3hELElBQU0sRUFBTyxNQUFNLEVBQVMsTUFBTSxDQUM3QixXQUFhLENBQUUsUUFBUyxHQUFHLHdCQUF3QixDQUFFLEVBQUUsQ0FFeEQsRUFBSyxTQUNMLEVBQU0sTUFBTSxFQUFLLFFBQVEsRUFLckMsU0FBbUIsRUFBYSxFQUFxQyxDQUNqRSxHQUFJLENBQUMsRUFDRCxPQUFPLEVBR1gsSUFBTSxFQUFjLEVBQUcsVUFBVSxFQUFPLENBQUUsWUFBYSxXQUFZLENBQUMsQ0FFcEUsT0FBTyxFQUFNLElBQU0sRUFHdkIsaUJBQTJCLEVBQW9DLENBQzNELElBQU0sRUFBNEIsQ0FBRSxHQUFHLEVBQVMsQ0FVaEQsT0FSSSxFQUFRLE9BQ1IsRUFBYSxLQUFPLEtBQUssVUFBVSxFQUFRLEtBQUssQ0FDaEQsRUFBYSxRQUFVLENBQ25CLEdBQUcsRUFBYSxRQUNoQixlQUFnQixtQkFDbkIsRUFHRSxFQUdYLE1BQWdCLGNBQWlCLEVBQWdDLENBSzdELE9BSkksRUFBUyxRQUFRLElBQUksZUFBZSxFQUFFLFNBQVMsT0FBTyxDQUMvQyxFQUFTLE1BQU0sQ0FHbkIsRUFBUyxNQUFNLENBRzFCLE1BQWEsTUFBUyxFQUFjLEVBQXlCLEVBQUUsQ0FBYyxDQUN6RSxNQUFVLE1BQU0seUJBQXlCLENBRzdDLE1BQWEsSUFBYSxFQUFhLEVBQXdCLEVBQUUsQ0FBRSxDQUMvRCxPQUFPLE1BQWUsS0FBSyxNQUFTLEVBQUssRUFBUSxDQUFDLENBR3RELE1BQWEsSUFBYSxFQUFhLEVBQXdCLEVBQUUsQ0FBRSxDQUMvRCxPQUFPLEtBQUssTUFBUyxFQUFLLENBQ3RCLEdBQUcsRUFDSCxPQUFRLE1BQ1gsQ0FBQyxDQUdOLE1BQWEsS0FBYyxFQUFhLEVBQXdCLEVBQUUsQ0FBRSxDQUNoRSxPQUFPLEtBQUssTUFBUyxFQUFLLENBQ3RCLEdBQUcsRUFDSCxPQUFRLE9BQ1gsQ0FBQyxDQUdOLE1BQWEsSUFBYSxFQUFhLEVBQXdCLEVBQUUsQ0FBRSxDQUMvRCxPQUFPLEtBQUssTUFBUyxFQUFLLENBQ3RCLEdBQUcsRUFDSCxPQUFRLE1BQ1gsQ0FBQyxDQUdOLE1BQWEsT0FBZ0IsRUFBYSxFQUF3QixFQUFFLENBQUUsQ0FDbEUsT0FBTyxLQUFLLE1BQVMsRUFBSyxDQUN0QixHQUFHLEVBQ0gsT0FBUSxTQUNYLENBQUMsR0MvRlcsRUFBckIsTUFBcUIsVUFBc0IsS0FBTSxDQUM3QyxXQUE0QixJQUM1QixZQUFZLEVBQWlCLEVBQXFCLElBQUssQ0FDbkQsTUFBTSxFQUFRLENBQ2QsS0FBSyxLQUFPLEtBQUssWUFBWSxLQUM3QixLQUFLLFdBQWEsRUFHdEIsT0FBYyxVQUFVLEVBQTZCLENBQ2pELE9BQU8sSUFBSSxFQUFjLEVBQU0sUUFBUyxJQUFJLEdDSC9CLEVBQXJCLEtBQXNDLENBQ2xDLFFBQWtCLElBQUksSUFFdEIsZUFBc0IsRUFBbUMsQ0FDckQsT0FBTyxRQUFRLEVBQU8sQ0FBQyxTQUFTLENBQUMsRUFBSyxLQUFXLENBQzdDLEtBQUssSUFBSSxFQUFLLEVBQU0sRUFDdEIsQ0FHTixVQUF1QyxDQUNuQyxJQUFNLEVBQThCLEVBQUUsQ0FFdEMsSUFBSyxHQUFNLENBQUMsRUFBSyxLQUFVLEtBQUssUUFBUSxTQUFTLENBQzdDLEVBQU8sT0FBTyxFQUFJLEVBQUksRUFHMUIsT0FBTyxFQUdYLE9BQWUsRUFBNkIsQ0FDeEMsSUFBSSxFQUFNLEdBRU4sT0FBTyxHQUFZLFlBQWMsT0FBTyxHQUFZLFlBQ3BELEVBQU0sRUFBUSxNQUdsQixJQUFNLEVBQWdCLE9BQU8sR0FBWSxVQUFZLE9BQU8sR0FBWSxTQVV4RSxPQVJJLEdBQWlCLENBQUUsRUFBZ0IsdUJBQ25DLFFBQVEsS0FBSyw0QkFBNEIsRUFBUSxLQUFLLDJIQUEySCxDQUdqTCxHQUFrQixFQUFnQix3QkFDbEMsRUFBTyxFQUFnQix1QkFHcEIsRUFJWCxJQUFXLEVBQW1CLEVBQVksQ0FDdEMsSUFBTSxFQUFNLEtBQUssT0FBTyxFQUFRLENBSWhDLE9BRkEsS0FBSyxRQUFRLElBQUksRUFBSyxFQUFNLENBRXJCLEtBR1gsSUFBVyxFQUE0QixDQUNuQyxJQUFNLEVBQU0sS0FBSyxPQUFPLEVBQVEsQ0FFaEMsT0FBTyxLQUFLLFFBQVEsSUFBSSxFQUFJLENBR2hDLElBQWMsRUFBc0IsQ0FDaEMsSUFBTSxFQUFNLEtBQUssT0FBTyxFQUFRLENBRWhDLEdBQUksQ0FBQyxLQUFLLFFBQVEsSUFBSSxFQUFJLENBQ3RCLE1BQU0sSUFBSSxFQUFjLG1CQUFtQixPQUFPLEVBQUksQ0FBQywyQkFBMkIsQ0FLdEYsT0FGYyxLQUFLLFFBQVEsSUFBSSxFQUFJLENBS3ZDLFVBQW9CLEVBQXFDLENBQ3JELElBQU0sRUFBTSxFQUFpQixLQUN2QixFQUFtQixLQUFLLFFBQVEsSUFBSSxFQUFJLENBRTlDLEdBQUksRUFDQSxPQUFPLEVBR1gsSUFBTSxFQUFjLElBQUksRUFFeEIsT0FEQSxLQUFLLFFBQVEsSUFBSSxFQUFLLEVBQVksQ0FDM0IsRUFHWCxLQUFZLEVBQWlDLENBQ3pDLE9BQU8sUUFBUSxFQUFRLENBQUMsU0FBUyxDQUFDLEVBQUssS0FBVyxDQUM5QyxLQUFLLElBQUksRUFBSyxFQUFNLEVBQ3RCLENBR04sTUFBMEIsRUFBa0IsQ0FDeEMsT0FBTyxJQUFJLE1BQU0sRUFBRSxDQUFFLENBQ2pCLEtBQU0sRUFBUyxJQUFTLENBQ3BCLElBQU0sRUFBUSxLQUFLLElBQU8sRUFBSSxDQUN4QixFQUFRLEVBQU0sR0FNcEIsT0FKSSxPQUFPLEdBQVUsV0FDVixFQUFNLEtBQUssRUFBTSxDQUdyQixFQUFNLElBRWpCLEtBQU0sRUFBUyxFQUFNLElBQVUsQ0FDM0IsSUFBTSxFQUFRLEtBQUssSUFBTyxFQUFJLENBSTlCLE1BRkEsR0FBTSxHQUFRLEVBRVAsSUFFZCxDQUFDLENBR04sTUFBMEIsQ0FDdEIsT0FBTyxNQUFNLEtBQUssS0FBSyxRQUFRLE1BQU0sQ0FBQyxHQ2hIOUMsTUFBTSxFQUFhLFdBQW1CLGlCQUFtQixJQUFJLEVBRTdELFdBQVcsZ0JBQWtCLEVDRDdCLE1BQU0sRUFBVSxFQUFVLE1BQW9CLEVBQWEsQ0NtQjNELFNBQWdCLEVBRWQsR0FBRyxFQUF1RCxDQUN4RCxPQUFPLEVBQU8sUUFBUSxFQUFNLElBQVUsRUFBTSxFQUFLLENBQUUsS0FBTSxHQUFVLENBbUJ2RSxTQUFnQixFQUlaLEVBQ0EsR0FBRyxFQUMrQyxDQUNsRCxPQUFPLEVBQU8sUUFBUSxFQUFNLElBQVUsRUFBTSxFQUFLLENBQUUsRUFBaUIsQ0FHeEUsU0FBZ0IsRUFBaUMsRUFBZSxDQUM1RCxPQUFPLFNBQXVDLEVBQWlCLENBQzNELE1BQU0sVUFBYyxDQUFPLENBQ3ZCLFlBQVksR0FBRyxFQUFhLENBQ3hCLE1BQU0sR0FBRyxFQUFLLENBQ2QsSUFBTSxFQUFTLElBQUksRUFBTyxHQUFHLEVBQUssQ0FDbEMsT0FBTyxPQUFPLEtBQU0sRUFBTyxFQUtuQyxJQUFLLElBQU0sS0FBTyxRQUFRLFFBQVEsRUFBTyxVQUFVLENBQzNDLElBQVEsZUFDUixPQUFPLGVBQ0gsRUFBTSxVQUNOLEVBQ0EsT0FBTyx5QkFBeUIsRUFBTyxVQUFXLEVBQUksQ0FDekQsQ0FJVCxPQUFPLEdDMUNmLFNBQXdCLEVBQXNDLEVBQWEsQ0FDdkUsT0FBTyxjQUFjLENBQUssQ0FDdEIsT0FBYyxLQUEyQixFQUFxQixDQUMxRCxJQUFNLEVBQWMsT0FBTyxNQUFTLFdBQWEsS0FBTyxFQUVsRCxFQUFXLElBQUksRUFFakIsRUFBVSxDQUFFLEdBQUcsRUFBTSxDQVl6QixPQVZJLE9BQU8sR0FBWSxPQUFVLGFBQzdCLEVBQVcsRUFBbUIsTUFBTSxFQUFLLEVBR3pDLE9BQVEsTUFBYyxPQUFVLGFBQ2hDLEVBQVcsS0FBYSxNQUFNLEVBQUssRUFHdkMsT0FBTyxPQUFPLEVBQWlCLEVBQVEsQ0FFaEMsRUFHWCxNQUFhLEVBQTJCLENBRXBDLE9BREEsT0FBTyxPQUFPLEtBQU0sRUFBSyxDQUNsQixPQ3ZEbkIsU0FBd0IsRUFBc0MsRUFBUyxDQUNuRSxPQUFPLGNBQWMsQ0FBSyxDQUN0QixXQUNBLFlDSFIsU0FBd0IsRUFBdUMsRUFBUyxDQUNwRSxPQUFPLGNBQWMsQ0FBSyxDQUN0QixXQUEwQyxNQ0dWLEVBQVEsRUFBWSxFQUFnQixFQUFnQixDQ0E1RixJQUFxQixFQUFyQixLQUFpQyxDQUM3QixPQUFjLHNCQUF3QixjQUN0QyxLQUVBLFlBQVksRUFBNkIsRUFBRSxDQUFFLENBQ3pDLEtBQUssS0FBTyxFQUFLLE1BQVEsS0FHN0IsTUFBYSxPQUFPLEVBQXdDLENBQ3hELEdBQU0sQ0FBQyxHQUFTLE1BQU1BLEVBQU8sSUFBSSxlQUFnQixDQUFFLE9BQVEsT0FBUSxDQUFDLENBRWhFLElBSUosT0FBTyxTQUFTLEtBQU8sR0FBUyxVQUFZLE9DbkIvQixFQUFyQixjQUFpRCxDQUFhLENBQzFELE1BQWEsTUFBUyxFQUFhLEVBQXdCLEVBQUUsQ0FBYyxDQUN2RSxJQUFNLEVBQVUsS0FBSyxTQUFTLEVBQUssRUFBUSxNQUFNLENBQzNDLEVBQWUsS0FBSyxpQkFBaUIsRUFBUSxDQUU3QyxFQUFXLE1BQU0sTUFBTSxFQUFTLEVBQWEsQ0FFbkQsR0FBSSxDQUFDLEVBQVMsR0FFVixNQURBLE1BQU0sS0FBSyxZQUFZLEVBQVMsQ0FDdEIsTUFBTSx1QkFBdUIsRUFBUyxTQUFTLENBRzdELE9BQU8sS0FBSyxjQUFpQixFQUFTLEdDVnpCLEdBQXJCLEtBQXFDLENBQ2pDLE9BQWMsc0JBQXdCLGtCQUV0QyxRQUNBLE9BRUEsWUFBWSxFQUErQixDQUN2QyxLQUFLLFFBQVUsR0FBTSxTQUFXLElBQUksSUFDcEMsS0FBSyxPQUFTLEdBQU0sUUFBVSxHQUdsQyxLQUFZLEVBQXVELENBQy9ELEdBQUksYUFBbUIsSUFBSyxDQUN4QixJQUFLLEdBQU0sQ0FBQyxFQUFLLEtBQVUsRUFBUSxTQUFTLENBQ3hDLEtBQUssSUFBSSxFQUFLLEVBQU0sQ0FHeEIsT0FHSixJQUFLLElBQU0sS0FBTyxPQUFPLEtBQUssRUFBUSxDQUNsQyxLQUFLLElBQUksRUFBSyxFQUFRLEdBQUssQ0FJbkMsSUFBVyxFQUFjLEVBQThCLEtBQXFCLENBQ3hFLElBQU0sRUFBVyxLQUFLLE9BQVMsRUFFL0IsT0FBTyxLQUFLLFFBQVEsSUFBSSxFQUFTLEVBQUksRUFLekMsSUFBVyxFQUFjLEVBQWUsRUFBZSxDQUNuRCxJQUFNLEVBQVcsS0FBSyxPQUFTLEVBRS9CLEtBQUssUUFBUSxJQUFJLEVBQVUsRUFBTSxDQUdyQyxVQUEwQyxDQUN0QyxJQUFNLEVBQWlDLEVBQUUsQ0FFekMsSUFBSyxHQUFNLENBQUMsRUFBSyxLQUFVLEtBQUssUUFBUSxTQUFTLENBQzdDLEdBQUksRUFBSSxXQUFXLEtBQUssT0FBTyxDQUFFLENBQzdCLElBQU0sRUFBZ0IsRUFBSSxNQUFNLEtBQUssT0FBTyxPQUFPLENBRW5ELEVBQU8sR0FBaUIsRUFJaEMsT0FBTyxJQ3JEZixTQUFnQixFQUFRLEVBQVUsRUFBUyxHQUFJLEVBQVcsRUFBRSxDQUF1QixDQUMvRSxJQUFLLEdBQU0sQ0FBQyxFQUFLLEtBQVUsT0FBTyxRQUFRLEVBQUksQ0FBRSxDQUU1QyxJQUFNLEVBRFUsUUFBUSxLQUFLLEVBQUksQ0FDUixHQUFHLEVBQU8sR0FBRyxFQUFJLEdBQUssRUFBUyxHQUFHLEVBQU8sR0FBRyxJQUFRLEVBRTdFLEdBQUksR0FBUyxPQUFPLEdBQVUsU0FBVSxDQUNwQyxFQUFRLEVBQU8sRUFBUSxFQUFJLENBQzNCLFNBR0osRUFBSSxHQUFVLEVBR2xCLE9BQU8sRUNmWCxTQUFTLElBQU0sQ0FZWCxPQVhJLE9BQU8sT0FBVyxLQUFlLE9BQU8sV0FDakMsT0FBTyxZQUFZLENBRTFCLE9BQU8sS0FBUyxLQUFlLEtBQUssUUFBVSxLQUFLLE9BQU8sV0FDbkQsS0FBSyxPQUFPLFlBQVksQ0FFL0IsT0FBTyxPQUFXLEtBQWUsT0FBTyxRQUFVLE9BQU8sT0FBTyxXQUN6RCxPQUFPLE9BQU8sWUFBWSxDQUk5Qix1Q0FBdUMsUUFBUSxRQUFTLFNBQVUsRUFBRyxDQUN4RSxJQUFNLEVBQUssS0FBSyxRQUFRLENBQUcsR0FBTSxFQUVqQyxPQURVLElBQU0sSUFBTSxFQUFLLEVBQUksRUFBTyxHQUM3QixTQUFTLEdBQUcsRUFDdkIsQ0FHTixTQUFnQixHQUFTLEVBQVMsR0FBSSxDQUNsQyxPQUFPLEVBQVMsSUFBTSxDQ1gxQixJQUFxQixHQUFyQixLQUFtQyxDQUMvQixPQUFjLHNCQUF3QixnQkFFdEMsUUFFQSxhQUFjLENBQ1YsS0FBSyxRQUFVLElBQUksSUFHdkIsTUFBYyxDQUNWLE9BQU8sTUFBTSxLQUFLLEtBQUssUUFBUSxRQUFRLENBQUMsQ0FHNUMsV0FBa0IsRUFBaUIsQ0FLL0IsT0FKSSxPQUFPLEdBQVUsVUFBWSxFQUFNLFNBQVMsV0FBVyxDQUNoRCxFQUFNLFFBQVEsV0FBWSxHQUFHLENBQUMsTUFBTSxHQUFLLE9BRzdDLEVBR1gsZUFBc0IsRUFBNkIsRUFBUyxTQUFnQixDQUN4RSxJQUFLLEdBQU0sQ0FBQyxFQUFLLEtBQVUsT0FBTyxRQUFRLEVBQU8sQ0FDN0MsS0FBSyxRQUFRLElBQUksRUFBSyxDQUNsQixNQUNBLE1BQU8sS0FBSyxXQUFXLEVBQU0sQ0FDN0IsU0FDSCxDQUFDLENBSVYsZ0JBQXVCLEVBQTBCLEVBQVMsU0FBZ0IsQ0FDdEUsSUFBSyxHQUFNLENBQUMsRUFBSyxLQUFVLEVBQ3ZCLEtBQUssUUFBUSxJQUFJLEVBQUssQ0FDbEIsTUFDQSxNQUFPLEtBQUssV0FBVyxFQUFNLENBQzdCLFNBQ0gsQ0FBQyxDQUlWLFVBQXVDLENBQ25DLElBQU0sRUFBOEIsRUFBRSxDQUV0QyxJQUFLLEdBQU0sQ0FBQyxFQUFLLEtBQVUsS0FBSyxRQUFRLFNBQVMsQ0FDN0MsRUFBTyxHQUFPLEVBQU0sTUFHeEIsT0FBTyxFQUdYLElBQVcsRUFBc0IsQ0FHN0IsR0FGYyxLQUFLLFFBQVEsSUFBSSxFQUFJLENBRy9CLE1BQU8sR0FHWCxHQUFJLENBQUMsRUFBSSxTQUFTLElBQUksQ0FDbEIsTUFBTyxHQUdYLElBQU0sRUFBVSxFQUFJLE1BQU0sSUFBSSxDQUFDLEdBQ3pCLEVBQWUsS0FBSyxRQUFRLElBQUksRUFBUSxDQUU5QyxHQUFJLENBQUMsRUFHRCxNQUZjLE9BQUssUUFBUSxJQUFJLEVBQUksQ0FLdkMsSUFBTSxFQUFRLEVBQWEsTUFNM0IsT0FKSSxPQUFPLEdBQVUsVUFBWSxNQUFNLFFBQVEsRUFBTSxDQUMxQyxHQUdKLEVBQUksRUFBTyxFQUFJLFVBQVUsRUFBUSxPQUFTLEVBQUUsQ0FBQyxDQUd4RCxJQUFnQyxFQUFhLEVBQXVCLENBQ2hFLElBQU0sRUFBUSxLQUFLLFFBQVEsSUFBSSxFQUFJLENBRW5DLEdBQUksRUFDQSxPQUFPLEVBQU0sTUFHakIsR0FBSSxDQUFDLEVBQUksU0FBUyxJQUFJLENBQ2xCLE9BQU8sRUFHWCxJQUFNLEVBQVUsRUFBSSxNQUFNLElBQUksQ0FBQyxHQUN6QixFQUFlLEtBQUssUUFBUSxJQUFJLEVBQVEsQ0FFOUMsR0FBSSxDQUFDLEVBQWMsQ0FDZixJQUFNLEVBQVEsS0FBSyxRQUFRLElBQUksRUFBSSxDQUVuQyxPQUFPLEVBQVEsRUFBTSxNQUFRLEVBR2pDLElBQU0sRUFBUSxFQUFhLE1BUTNCLE9BTkksT0FBTyxHQUFVLFVBQVksTUFBTSxRQUFRLEVBQU0sQ0FDMUMsRUFHSSxFQUFJLEVBQU8sRUFBSSxVQUFVLEVBQVEsT0FBUyxFQUFFLENBQUUsRUFBYSxDQUs5RSxPQUFtQyxFQUFnQixFQUF1QixDQUN0RSxJQUFLLElBQU0sS0FBTyxFQUNkLEdBQUksS0FBSyxJQUFJLEVBQUksQ0FDYixPQUFPLEtBQUssSUFBTyxFQUFJLENBSS9CLE9BQU8sRUFHWCxJQUFXLEVBQWEsRUFBWSxFQUFTLFVBQWlCLENBQzFELEdBQUksQ0FBQyxFQUFJLFNBQVMsSUFBSSxDQUFFLENBQ3BCLEtBQUssUUFBUSxJQUFJLEVBQUssQ0FDYixNQUNHLFNBQ1IsUUFDSCxDQUFDLENBQ0YsT0FHSixJQUFNLEVBQVUsRUFBSSxNQUFNLElBQUksQ0FBQyxHQUMzQixFQUFlLEtBQUssSUFBSSxFQUFTLEVBQUUsQ0FBQyxFQUVwQyxPQUFPLEdBQWlCLFVBQVksTUFBTSxRQUFRLEVBQWEsSUFDL0QsRUFBZSxFQUFFLEVBR3JCLEVBQUksRUFBYyxFQUFJLFVBQVUsRUFBUSxPQUFTLEVBQUUsQ0FBRSxFQUFNLENBRTNELEtBQUssUUFBUSxJQUFJLEVBQVMsQ0FDdEIsSUFBSyxFQUNHLFNBQ1IsTUFBTyxFQUNWLENBQUMsQ0FHTixNQUFhLEVBQW1CLENBQzVCLEdBQUksQ0FBQyxFQUFJLFNBQVMsSUFBSSxDQUFFLENBQ3BCLEtBQUssUUFBUSxPQUFPLEVBQUksQ0FDeEIsT0FHSixJQUFNLEVBQVUsRUFBSSxNQUFNLElBQUksQ0FBQyxHQUN6QixFQUFlLEtBQUssSUFBSSxFQUFTLEVBQUUsQ0FBQyxDQUVyQyxJQUVELE9BQU8sR0FBaUIsVUFBWSxNQUFNLFFBQVEsRUFBYSxHQUluRSxFQUFNLEVBQWMsRUFBSSxVQUFVLEVBQVEsT0FBUyxFQUFFLENBQUMsQ0FFdEQsS0FBSyxRQUFRLElBQUksRUFBUyxDQUN0QixJQUFLLEVBQ0wsT0FBUSxVQUNSLE1BQU8sRUFDVixDQUFDLEdBR04sT0FBcUIsQ0FDakIsS0FBSyxRQUFRLE9BQU8sQ0FHeEIsTUFBbUMsQ0FDL0IsT0FBTyxFQUFRLEtBQUssVUFBVSxDQUFDLEdDdEx2QyxNQUFNLEVBQVMsRUFBVSxNQUFxQixHQUFjLENBRXhELE9BQU8sS0FBSyxJQUFJLE1BQ2hCLFdBQVcsT0FBUyxHQ0p4QixTQUFnQixFQUFlLEVBQW1CLEVBQTZDLENBQzNGLElBQU0sRUFBaUMsRUFBRSxDQUVuQyxFQUFnQixFQUFVLE1BQU0sSUFBSSxDQUFDLE9BQU8sUUFBUSxDQUNwRCxFQUFrQixFQUFZLE1BQU0sSUFBSSxDQUFDLE9BQU8sUUFBUSxDQUU5RCxJQUFLLElBQUksRUFBSSxFQUFHLEVBQUksRUFBYyxPQUFRLElBQUssQ0FDM0MsSUFBTSxFQUFlLEVBQWMsR0FDN0IsRUFBaUIsRUFBZ0IsR0FFdkMsR0FBSSxFQUFhLFdBQVcsSUFBSSxDQUFFLENBQzlCLElBQU0sRUFBWSxFQUFhLE1BQU0sRUFBRSxDQUN2QyxFQUFPLEdBQWEsRUFHeEIsR0FBSSxJQUFpQixJQUFLLENBR3RCLEVBQU8sS0FEbUIsRUFBZ0IsTUFBTSxFQUFFLENBQ2xCLEtBQUssSUFBSSxDQUN6QyxPQUlSLE9BQU8sRUFHWCxTQUFnQixFQUFjLEVBQTBDLENBQ3BFLElBQU0sRUFBZ0MsRUFBRSxDQUNsQyxFQUFjLEVBQVksTUFBTSxJQUFJLENBQUMsR0FNM0MsT0FKSyxFQUlFLEVBQUcsTUFBTSxFQUFZLENBSGpCLEVDekJmLElBQXFCLEVBQXJCLGNBQThDLENBQWEsQ0FDdkQsTUFBYSxNQUFTLEVBQWEsRUFBd0IsRUFBRSxDQUFjLENBT3ZFLE1BTm1CLENBQUMsRUFBSSxXQUFXLFVBQVUsRUFBSSxDQUFDLEVBQUksV0FBVyxXQUFXLENBTXJFLEtBQUssY0FBaUIsRUFBSyxFQUFRLENBSC9CLEtBQUssY0FBaUIsRUFBSyxFQUFRLENBTWxELE1BQWdCLGNBQWlCLEVBQWEsRUFBd0IsRUFBRSxDQUFjLENBQ2xGLElBQU0sRUFBVSxLQUFLLFNBQVMsRUFBSyxFQUFRLE1BQU0sQ0FDM0MsRUFBZSxLQUFLLGlCQUFpQixFQUFRLENBRTdDLEVBQVcsTUFBTSxNQUFNLEVBQVMsRUFBYSxDQUVuRCxHQUFJLENBQUMsRUFBUyxHQUVWLE1BREEsTUFBTSxLQUFLLFlBQVksRUFBUyxDQUN0QixNQUFNLHVCQUF1QixFQUFTLFNBQVMsQ0FHN0QsT0FBTyxLQUFLLGNBQWlCLEVBQVMsQ0FHMUMsTUFBZ0IsY0FBaUIsRUFBYSxFQUF3QixFQUFFLENBQWMsQ0FDbEYsSUFBTSxFQUFVLEVBQVUsSUFBUyxnQkFBZ0IsQ0FDN0MsRUFBUyxFQUFRLFFBQVUsTUFDM0IsRUFBUSxFQUFPLFFBQVEsRUFBUSxFQUFJLENBQ25DLEVBQVMsSUFBSUMsR0FBZ0IsQ0FDL0IsT0FBUSxFQUFPLElBQUksZ0JBQWlCLEdBQUcsQ0FDMUMsQ0FBQyxDQU1GLEdBSkksRUFBVSxJQUFJLFVBQVUsRUFDeEIsRUFBTyxLQUFLLEVBQVUsSUFBNEIsVUFBVSxDQUFDLENBRzdELENBQUMsR0FBUyxDQUFDLEVBQU0sUUFDakIsTUFBVSxNQUFNLHVCQUF1QixFQUFPLEdBQUcsSUFBTSxDQVkzRCxPQVRlLE1BQU0sRUFBTyxRQUFRLEVBQU8sQ0FDbEMsTUFDTCxPQUFRLEVBQWUsRUFBTSxLQUFNLEVBQUksQ0FDdkMsTUFBTyxFQUFRLE9BQVMsRUFBYyxFQUFJLENBQzFDLEtBQU0sRUFBUSxNQUFRLEVBQVEsS0FDOUIsT0FBUSxFQUFPLGFBQWEsQ0FDcEIsU0FDWCxDQUFDLEdDeERXLEVBQXJCLEtBQW1DLENBQy9CLFFBQ0EsYUFDQSxNQUNBLFNBRUEsTUFBYSxVQUEwQixFQUN2QyxNQUFhLE1BQXNCLEVBQ25DLE1BQWEsTUFBc0IsRUFDbkMsTUFBYSxVQUEwQixFQUd2QyxNQUFhLFlBQTRCLEVBRXpDLE1BQWEsUUFBd0IsRUFFckMsTUFBYSxRQUF3QixFQUVyQyxNQUFhLFlBQTRCLElDZHhCLEVBQXJCLE1BQXFCLENBQWMsQ0FDL0IsT0FBYyxzQkFBd0IsZ0JBRXRDLEtBQVksRUFBaUIsRUFBa0IsRUFJL0MsTUFBYSxFQUFpQixFQUFrQixFQUloRCxLQUFZLEVBQWlCLEVBQWtCLEVBSS9DLE1BQWEsRUFBaUIsRUFBa0IsRUFJaEQsTUFBYSxFQUE2QixDQUV0QyxPQUFPLElBQUksSUNMRUMsRUFBckIsS0FBc0MsQ0FDbEMsT0FBYyxzQkFBd0IsbUJBRXRDLE1BQ0EsT0FDQSxNQUFlLEdBRWYsWUFBWSxFQUFnQyxFQUFFLENBQUUsQ0FDNUMsS0FBSyxNQUFRLEVBQUssT0FBUyxLQUFLLE1BQ2hDLEtBQUssTUFBUSxFQUFLLE9BQVMsSUFBSSxJQUMvQixLQUFLLE9BQVMsRUFBSyxRQUFVLElBQUksRUFFN0IsRUFBSyxVQUNMLEtBQUssUUFBVSxFQUFLLFNBSTVCLFFBQWUsRUFBYyxFQUFzRCxDQUMvRSxPQUFPLE9BQU8sRUFBTyxDQUFFLFVBQVMsQ0FBQyxDQUVqQyxLQUFLLE9BQU8sTUFBTSxpQkFBaUIsRUFBUSxPQUFPLElBQUksRUFBUSxPQUFPLElBQUssRUFBTSxDQUdwRixXQUFrQixFQUFnQixDQUM5QixJQUFNLEVBQW1CLEVBQUUsQ0FDckIsRUFBTSxNQUFNLEtBQUssS0FBSyxNQUFNLFFBQVEsQ0FBQyxDQUUzQyxJQUFLLElBQU0sS0FBUSxFQUFLLENBQ3BCLEdBQUksRUFBSyxTQUFTLEVBQUssUUFBUSxDQUFFLENBQzdCLEVBQU8sS0FBSyxFQUFLLFFBQVEsQ0FDekIsU0FHQSxFQUFLLGNBQ2dCLEVBQUssYUFBYSxLQUFLLEdBQVMsRUFBSyxTQUFTLEVBQU0sQ0FBQyxFQUd0RSxFQUFPLEtBQUssRUFBSyxRQUFRLENBS3JDLE9BQU8sRUFHWCxLQUFZLEVBQXVCLENBQy9CLElBQUksRUFBUSxNQUFNLEtBQUssS0FBSyxNQUFNLFFBQVEsQ0FBQyxDQUUzQyxHQUFJLEdBQVMsUUFBUyxDQUNsQixJQUFJLEVBQU0sTUFBTSxRQUFRLEVBQVEsUUFBUSxDQUFHLEVBQVEsUUFBVSxDQUFDLEVBQVEsUUFBUSxDQUU5RSxFQUFNLEtBQUssV0FBVyxFQUFJLENBRTFCLEVBQVEsRUFBTSxPQUFPLEdBQVEsQ0FBQyxFQUFJLFNBQVMsRUFBSyxRQUFRLENBQUMsQ0FHN0QsR0FBSSxHQUFTLFFBQVMsQ0FDbEIsSUFBSSxFQUFNLE1BQU0sUUFBUSxFQUFRLFFBQVEsQ0FBRyxFQUFRLFFBQVUsQ0FBQyxFQUFRLFFBQVEsQ0FFOUUsRUFBTSxLQUFLLFdBQVcsRUFBSSxDQUUxQixFQUFRLEVBQU0sT0FBTyxHQUFRLEVBQUksU0FBUyxFQUFLLFFBQVEsQ0FBQyxDQUs1RCxNQUZBLEdBQVEsRUFBUSxFQUFPLENBQUMsUUFBUSxDQUFFLENBQUMsTUFBTSxDQUFDLENBRW5DLEVBR1gsSUFBVyxHQUFHLEVBQStELENBQ3pFLElBQU0sRUFBNkIsRUFBRSxDQUVyQyxJQUFLLElBQU0sS0FBUSxFQUFTLENBQ3hCLEdBQUksT0FBTyxHQUFTLFdBQVksQ0FDNUIsRUFBVSxLQUFLLElBQUksRUFBTyxDQUMxQixTQUdKLEVBQVUsS0FBSyxFQUFLLENBR3hCLElBQUssSUFBTSxLQUFRLEVBQVcsQ0FDMUIsR0FBSSxDQUFDLEVBQUssUUFBUyxDQUNmLEtBQUssT0FBTyxLQUFLLGlDQUFrQyxFQUFLLENBQ3hELFNBR0osS0FBSyxNQUFNLElBQUksRUFBSyxRQUFTLEVBQUssQ0FFOUIsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLE9BQVMsRUFBSyxRQUFRLENBR3hDLEVBQUssVUFDTCxFQUFLLFNBQVMsUUFBUSxHQUFXLEtBQUssSUFBSSxFQUFRLENBQUMsRUFLL0QsTUFBYSxXQUFXLEVBQXlCLEVBQXNDLENBQ25GLElBQU0sRUFBUSxLQUFLLEtBQUssRUFBUSxDQUU1QixLQUFLLE9BQ0wsS0FBSyxPQUFPLE1BQU0sWUFBWSxFQUFPLGFBQWMsQ0FDL0MsTUFBTyxFQUFNLElBQUksR0FBUSxFQUFLLFFBQVEsQ0FDekMsQ0FBQyxDQUdOLElBQUssSUFBTSxLQUFRLEtBQUssS0FBSyxFQUFRLENBQUUsQ0FDbkMsSUFBTSxFQUFNLENBQ1IsYUFBZ0IsUUFBUSxJQUFJLENBQUMsRUFBSyxVQUFVLENBQUUsRUFBSyxZQUFZLENBQUMsQ0FBQyxDQUNqRSxTQUFZLFFBQVEsSUFBSSxDQUFDLEVBQUssTUFBTSxDQUFFLEVBQUssUUFBUSxDQUFDLENBQUMsQ0FDckQsU0FBWSxRQUFRLElBQUksQ0FBQyxFQUFLLE1BQU0sQ0FBRSxFQUFLLFFBQVEsQ0FBQyxDQUFDLENBQ3JELGFBQWdCLFFBQVEsSUFBSSxDQUFDLEVBQUssVUFBVSxDQUFFLEVBQUssWUFBWSxDQUFDLENBQUMsQ0FDcEUsQ0FFSyxDQUFDLEdBQVMsTUFBTSxNQUFlLEVBQUksSUFBUyxDQUFDLENBRW5ELEdBQUksRUFBTyxDQUNQLEtBQUssUUFBUSxFQUFPLENBQUUsT0FBUSxFQUFLLFFBQVMsU0FBUSxDQUFDLENBQ3JELFNBR0EsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLEdBQUcsRUFBTyxHQUFLLEVBQUssUUFBUSxFQUsxRCxNQUFhLEtBQUssRUFBOEMsRUFBc0MsQ0FDbEcsSUFBTSxFQUFVLE1BQU0sUUFBUSxFQUFRLENBQUcsRUFBVSxDQUFDLEVBQVEsQ0FFNUQsSUFBSyxJQUFNLEtBQVUsRUFDakIsTUFBTSxLQUFLLFdBQVcsRUFBUSxFQUFRLENBSTlDLE1BQWEsU0FBUyxFQUFzQyxDQUN4RCxPQUFPLEtBQUssS0FBSyxXQUFZLEVBQVEsQ0FHekMsTUFBYSxLQUFLLEVBQXNDLENBQ3BELE9BQU8sS0FBSyxLQUFLLE9BQVEsRUFBUSxDQUdyQyxNQUFhLEtBQUssRUFBc0MsQ0FDcEQsT0FBTyxLQUFLLEtBQUssT0FBUSxFQUFRLENBR3JDLE1BQWEsU0FBUyxFQUFzQyxDQUN4RCxNQUFNLEtBQUssS0FBSyxXQUFZLEVBQVEsQ0FHeEMsT0FBcUIsQ0FDakIsS0FBSyxNQUFNLE9BQU8sR0MzS0wsRUFBckIsY0FBOENDLENBQXFCLENBQy9ELFdBQWtCLEVBQTZCLENBQzNDLElBQU0sRUFBeUIsRUFBRSxDQUVqQyxJQUFLLEdBQU0sQ0FBQyxFQUFNLEtBQVEsT0FBTyxRQUFRLEVBQVEsQ0FBRSxDQUUvQyxJQUFNLEVBQVcsSUFEQyxFQUFJLFNBQVcsR0FHakMsRUFBUyxRQUFVLEVBQVMsU0FBVyxFQUV2QyxFQUFNLEtBQUssRUFBUyxDQUd4QixFQUFNLFFBQVEsR0FBUSxLQUFLLElBQUksRUFBSyxDQUFDLEdDYnhCLEVBQXJCLGNBQXNDLEVBQVEsRUFBVyxBQUFDLENBQ3RELEdBQ0EsTUFDQSxPQUVBLEdBRUEsT0FDQSxNQUNBLE1BQ0EsS0FDQSxRQ1ZpQixFQUFyQixjQUE4QyxFQUFRLEVBQVcsQUFBQyxDQUM5RCxHQUNBLEtBQ0EsWUFBb0MsS0FDcEMsT0FDQSxRQUNBLE9BQ0EsV0FBeUQsS0FFekQsSUFBVyxVQUFXLENBQ2xCLE9BQU8sS0FBSyxTQUFXLFNBRzNCLElBQVcsa0JBQW1CLENBQzFCLEdBQUksQ0FBQyxLQUFLLFdBQ04sTUFBTyxFQUFFLENBR2IsR0FBTSxDQUFDLEVBQU8sR0FBUSxFQUFTLFNBQ3ZCLE9BQU8sS0FBSyxZQUFlLFNBQ3BCLEtBQUssTUFBTSxLQUFLLFdBQXFCLENBR3pDLEtBQUssV0FDZCxDQUVGLE9BQU8sRUFBUSxFQUFFLENBQUcsSUMxQlAsRUFBckIsS0FBK0IsQ0FDM0IsT0FBYyxzQkFBd0IsWUFFdEMsUUFDQSxZQUNBLE1BQXdCLEdBQ3hCLE9BRUEsWUFBWSxFQUEyQixFQUFFLENBQUUsQ0FFdkMsSUFBTSxHQURjLEVBQUssYUFBZSxFQUFFLEVBQ2hCLElBQUssR0FBZUMsRUFBVyxLQUFLLEVBQVcsQ0FBQyxDQUcxRSxLQUFLLFlBQWMsRUFDbkIsS0FBSyxNQUFRLEVBQUssT0FBUyxHQUMzQixLQUFLLE9BQVMsRUFBSyxRQUFVLElBQUksR0FBZSxDQUFDLE1BQU0sQ0FBRSxNQUFPLE1BQU8sQ0FBQyxDQUV4RSxLQUFLLFFBQVUsRUFBZSxHQUFRLENBQ2xDLEVBQU0sUUFBUyxHQUFlLENBQzFCLEVBQUksRUFBVyxPQUFRLEVBQVcsUUFBUyxFQUFXLGlCQUFpQixFQUN6RSxFQUNKLENBRUUsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLDRCQUE2QixDQUMzQyxZQUFhLEtBQUssWUFDckIsQ0FBQyxDQUlWLElBQVcsRUFBZ0IsRUFBYyxFQUE4QixDQUVuRSxHQUFJLENBQUMsRUFDRCxPQUFPLEtBQUssUUFBUSxJQUFJLEVBQVFDLEVBQVEsQ0FHNUMsSUFBTSxFQUFvQkMsRUFBY0QsRUFBUyxFQUFPLENBRXhELE9BQU8sS0FBSyxRQUFRLElBQUksRUFBUSxFQUFrQixDQUd0RCxPQUFjLEVBQWdCLEVBQWMsRUFBOEIsQ0FDdEUsR0FBSSxDQUFDLEVBQ0QsT0FBTyxLQUFLLFFBQVEsT0FBTyxFQUFRQSxFQUFRLENBRy9DLElBQU0sRUFBb0JDLEVBQWNELEVBQVMsRUFBTyxDQUV4RCxPQUFPLEtBQUssUUFBUSxPQUFPLEVBQVEsRUFBa0IsQ0FHekQsUUFBZSxFQUFpQixFQUE2QixDQUN6RCxPQUFPQyxFQUFjRCxFQUFTLEVBQU8sR0NyRDdDLE1BQU0sRUFBTSxFQUFVLE1BQWlCLEVBQVUsQ0NPakQsSUFBcUIsRUFBckIsS0FBaUMsQ0FDN0IsT0FBYyxzQkFBd0IsY0FFdEMsTUFBc0MsSUFBSSxJQUUxQyxJQUFXLEdBQUcsRUFBbUQsQ0FDN0QsSUFBSyxJQUFNLEtBQUssRUFFWixBQUNJLEVBQUUsS0FBSyxLQUFLLFVBQVUsRUFBRSxDQUc1QixLQUFLLE1BQU0sSUFBSSxFQUFFLEdBQUksRUFBUyxLQUFLLEVBQUUsQ0FBQyxDQUk5QyxPQUFjLEVBQW9CLENBQzlCLEtBQUssTUFBTSxPQUFPLEVBQUcsQ0FHekIsS0FBWSxFQUFxQixFQUFFLENBQUUsQ0FDakMsSUFBSSxFQUFRLEtBQUssTUFBTSxLQUFLLFVBQVUsTUFBTSxLQUFLLEtBQUssTUFBTSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBMEJ2RSxPQXZCSSxFQUFPLFNBQ1AsRUFBUSxFQUFNLE9BQU8sR0FBSyxFQUFFLFNBQVcsRUFBTyxPQUFPLEVBR3JELEVBQU8sUUFDUCxFQUFRLEVBQU0sT0FBTyxHQUFLLEVBQUUsUUFBVSxFQUFPLE9BQVMsRUFBRSxTQUFXLEVBQU8sTUFBTSxFQUdoRixFQUFPLFNBQ1AsRUFBUSxFQUFNLE9BQU8sR0FBSyxFQUFFLFNBQVcsRUFBTyxPQUFPLEVBR3JELEVBQU8sVUFBWSxJQUFBLElBQWEsRUFBTyxVQUFZLEtBQ25ELEVBQVEsRUFBTSxPQUFPLEdBQUssRUFBSSxJQUFJLE9BQVEsRUFBRSxDQUFDLEVBR2pELEVBQU0sTUFBTSxFQUFHLEtBQ0ksRUFBRSxNQUFRLEVBQUUsTUFBUSxLQUNwQixFQUFFLE1BQVEsRUFBRSxNQUFRLElBR3JDLENBRUssRUFHWCxPQUFlLENBQ1gsS0FBSyxNQUFNLE9BQU8sR0MxRDFCLE1BQU0sRUFBK0IsR0FBTyxDQUN4QyxJQUFNLEVBQVEsRUFBTyxJQUFTLFFBQVEsQ0FFaEMsRUFBWSxDQUFDLEdBQU8sZUFBaUIsQ0FBQyxHQUFPLFdBMEJuRCxPQXhCSSxHQUFhLEVBQUcsS0FBSyxXQUFXLFNBQVMsQ0FDbEMsSUFHUCxFQUNPLEdBR04sRUFBRyxLQUFLLFdBQVcsU0FBUyxDQUk3QixFQUFHLE9BQVMsU0FDTCxHQUdQLEdBQU8sY0FDQSxFQUFHLE9BQVMsa0JBQXdDLEdBQXBCLGtCQUd2QyxHQUFPLFdBQ0EsRUFBRyxPQUFTLGNBQWdDLEdBQWhCLGNBR2hDLEdBZkksVUNLZixTQUFnQixFQUFLLEVBQTZFLEVBQXVCLEVBQUUsQ0FBb0IsQ0FDM0ksSUFBSSxFQUEyQixFQUFFLENBRWpDLElBQUssR0FBTSxDQUFDLEVBQVUsS0FBYyxPQUFPLFFBQVEsRUFBUSxDQUFFLENBRXpELEdBQUksRUFBUSxTQUFTLEtBQUssR0FDdEIsT0FBTyxHQUFTLFNBQ1YsRUFBUyxTQUFTLEVBQUssQ0FDdkIsRUFBSyxLQUFLLEVBQVMsQ0FDNUIsQ0FDRyxTQUdKLElBQUksRUFBUSxFQUNQLFFBQVEsU0FBVSxHQUFHLENBQ3JCLE1BQU0sSUFBSSxDQUNWLE9BQU8sR0FBSyxHQUFLLENBQUMsRUFBRSxXQUFXLElBQUksQ0FBQyxDQUNwQyxJQUFJLEdBQVEsQ0FDVCxJQUFJLEVBQUksRUFNUixPQUpJLEVBQUUsV0FBVyxJQUFJLEVBQUksRUFBRSxTQUFTLElBQUksR0FDcEMsRUFBSSxJQUFNLEVBQUUsTUFBTSxFQUFHLEdBQUcsRUFHckIsR0FDVCxDQUlGLEVBQVEsT0FBTyxTQUNmLEVBQVEsRUFBTSxPQUFPLEdBQ2pCLENBQUMsRUFBUSxNQUFPLEtBQUssR0FDakIsT0FBTyxHQUFTLFNBQ1YsSUFBTSxFQUNOLEVBQUssS0FBSyxFQUFFLENBQ3JCLENBQ0osRUFHTCxJQUFJLEVBQU8sRUFBTSxLQUFLLElBQUksQ0FBQyxRQUFRLFNBQVUsR0FBRyxDQUU1QyxFQUFRLFNBQ1IsRUFBTyxFQUFRLE9BQVMsSUFBTSxHQUc3QixFQUFLLFdBQVcsSUFBSSxHQUNyQixFQUFPLElBQU0sR0FHYixFQUFLLFNBQVMsSUFBSSxHQUNsQixFQUFPLEVBQUssTUFBTSxFQUFHLEdBQUcsRUFHNUIsSUFBTSxFQUFTLENBQ0wsT0FDSyxZQUNYLFlBQWEsRUFBRSxDQUNsQixDQUVHLEVBQVEsUUFBVSxNQUFNLFFBQVEsRUFBUSxPQUFPLEdBQy9DLEVBQU8sWUFBYyxFQUFRLFFBRzdCLEVBQVEsUUFBVSxPQUFPLEVBQVEsUUFBVyxhQUM1QyxFQUFPLFlBQWMsRUFBUSxPQUFPLEVBQU8sRUFHL0MsRUFBTyxLQUFLLEVBQU8sQ0FPdkIsT0FKSSxFQUFRLFNBQ1IsRUFBUyxFQUFRLE9BQU8sRUFBTyxFQUc1QixFQUdYLFNBQWdCLEdBQWUsQ0FDM0IsSUFBTSxFQUFNLE9BQU8sS0FBSyxJQUFJLElBRXRCLEVBQVNFLEVBQWdCLENBQzNCLFFBQVMsRUFBTSxHQUFxQixDQUFHLEdBQWtCLENBQ3pELE9BQVEsRUFBRSxDQUNWLGVBQWUsRUFBSSxFQUFNLEVBQWUsQ0FJaEMsT0FIQSxHQUdPLENBQUUsSUFBSyxFQUFHLEVBRzVCLENBQUMsQ0FZRixPQVZBLEVBQU8sV0FBVyxFQUFXLENBRTdCLEVBQU8sTUFBUSxFQUE2RSxFQUF1QixFQUFFLEdBQUssQ0FDdEgsSUFBTSxFQUFhLEVBQUssRUFBUyxFQUFRLENBSXpDLE9BRkEsRUFBVyxRQUFRLEdBQVMsRUFBTyxTQUFTLEVBQU0sQ0FBQyxDQUU1QyxHQUdKLEVDNUhYLElBQXFCLEVBQXJCLEtBQWtDLENBQzlCLE9BQWMsc0JBQXdCLGVBRXRDLFFBQWUsRUFBaUIsRUFBK0IsQ0FDM0QsUUFBUSxJQUFJLFdBQVksRUFBUyxFQUFRLENBRzdDLE1BQWEsRUFBaUIsRUFBK0IsQ0FDekQsUUFBUSxNQUFNLFNBQVUsRUFBUyxFQUFRLEdDTGpELE1BQU0sRUFBTyxFQUFVLE1BQW1CLEVBQVksQ0FFbEQsT0FBTyxLQUFLLElBQUksS0FBTyxDQUFDLE9BQU8sS0FBSyxJQUFJLE1BQ3ZDLE9BQWUsS0FBTyxHQ0gzQixNQUFNLEVBQVMsRUFBVSxNQUFxQixFQUFjLENDQXRELEVBQU8sRUFBVSxNQUFtQixFQUFZLENDQWhELEVBQVEsRUFBVSxNQUFzQyxRQUFRLENDQWhFLEVBQVMsRUFBVSxNQUFjLFNBQVMsQ0NBMUMsRUFBUSxFQUFVLE1BQW9CLEVBQWEsQ0NPekQsSUFBcUJDLEVBQXJCLGNBQW9DLEVBQVEsRUFBWSxFQUFNLEVBQWMsQ0FBQyxBQUFDLENBQzFFLEdBQ0EsS0FDQSxRQUEwQixHQUMxQixhQUEyQyxFQUFFLENBQzdDLE1BQXdDLEVBQUUsQ0FDMUMsVUFFQSxhQUVBLFFBQWUsRUFBd0MsQ0FDbkQsSUFBTSxFQUFXLE9BQU8sWUFDcEIsT0FBTyxRQUFRLEVBQUssQ0FBQyxRQUFRLEVBQUcsS0FBTyxJQUFNLElBQUEsR0FBVSxDQUMxRCxDQUVELE9BQU8sT0FBTyxLQUFNLEVBQVMsQ0FFN0IsS0FBSyxRQUFVLFVBQVUsS0FBSyxPQ3hCakIsR0FBckIsY0FBb0MsRUFBWUMsRUFBSyxBQUFDLEdDQWpDQyxHQUFyQixjQUEwQyxFQUFRLEVBQVcsQUFBQyxDQUMxRCxHQUNBLEtBQ0EsUUFDQSxRQUNBLFNDSGlCLEdBQXJCLGNBQTBDLEVBQVlDLEdBQUssQUFBQyxDQUN4RCxlQUFzQixFQUFjLEVBQXVCLENBQ3ZELEVBQU8sS0FBSyxFQUFTLEVBQVEsQ0FHakMsTUFBYSxNQUFPLElDSnhCLFNBQWdCLEdBQ1osRUFDQSxFQUF1QixFQUFFLENBQ1QsQ0FDaEIsT0FBTyxFQUFLLEVBQVMsRUFBUSxDQ1BqQyxNQUFhLEVBQVNDLEVDTXRCLFNBQVMsR0FBNEIsRUFBb0MsQ0FDckUsT0FBTyxJQUFJLFFBQVMsR0FBWSxDQUM1QixJQUFNLEVBQVEsU0FBUyxjQUFjLFFBQVEsQ0FFN0MsRUFBTSxLQUFPLE9BQ2IsRUFBTSxPQUFTLEVBQVEsUUFBVSxNQUNqQyxFQUFNLFNBQVcsRUFBUSxVQUFZLEdBRXJDLEVBQU0sU0FBWSxHQUFNLENBQ3BCLElBQU0sRUFBUyxFQUFFLE9BQ1gsRUFBUSxNQUFNLEtBQUssRUFBTyxNQUFrQixDQUVsRCxFQUFTLEVBQVEsU0FBVyxNQUFNLEtBQUssRUFBTSxDQUFHLEVBQU0sR0FBcUIsRUFHL0UsRUFBTSxhQUFpQixDQUNuQixFQUFRLEVBQVEsU0FBVyxFQUFFLENBQUksS0FBYSxFQUdsRCxFQUFNLE9BQU8sRUFDZixDQUdOLFNBQVMsR0FBYSxFQUFpQyxDQUNuRCxPQUFPLElBQUksU0FBUyxFQUFTLElBQVcsQ0FDcEMsSUFBTSxFQUFTLElBQUksV0FFbkIsRUFBTyxPQUFVLEdBQU0sQ0FDZixFQUFFLFFBQVEsa0JBQWtCLFlBQzVCLEVBQVEsSUFBSSxXQUFXLEVBQUUsT0FBTyxPQUFPLENBQUMsQ0FFeEMsRUFBVyxNQUFNLHFDQUFxQyxDQUFDLEVBSS9ELEVBQU8sWUFBZ0IsQ0FDbkIsRUFBTyxFQUFPLE1BQU0sRUFHeEIsRUFBTyxrQkFBa0IsRUFBSyxFQUNoQyxDQVNOLGVBQWUsR0FBTyxFQUF1QixDQUN6QyxJQUFNLEVBQU8sSUFBSSxTQVFqQixPQU5BLEVBQUssT0FBTyxPQUFRLEVBQVEsS0FBSyxDQUU3QixFQUFRLFdBQ1IsRUFBSyxPQUFPLFlBQWEsRUFBUSxVQUFVLENBR3hDLEVBQU8sZUFBZSxFQUFRLFFBQVEsU0FBVSxDQUNuRCxPQUFRLE9BQ1IsS0FBTSxFQUNOLE1BQU8sQ0FBRSxVQUFXLEVBQVEsVUFBWSxDQUMzQyxDQUFDLENBR04sTUFBYSxHQUFRLENBQ2pCLFFBQ0EsVUFDQSxpQkMzRVMsR0FBU0MsRUNNdEIsU0FBZ0IsRUFBZ0IsRUFBNEMsQ0FDeEUsSUFBTSxFQUFVLEVBQVEsU0FBVyxDQUFDLGNBQWUsaUJBQWlCLENBRXBFLE1BQVEsSUFBTyxDQUNYLEdBQUksQ0FBQyxFQUFLLE1BQVEsQ0FBQyxFQUFRLFNBQVMsRUFBRyxLQUFLLENBQ3hDLE9BQU8sRUFBUSxVQUszQixNQUFNLEdBQVksRUFBZ0IsQ0FDOUIsU0FBVSxjQUNiLENBQUMsQ0NkRixTQUFnQixFQUFpQixFQUE0QixDQUN6RCxVQUFhLENBQ1QsR0FBSSxFQUFLLEtBQ0wsT0FBTyxFQUFRLFVBSzNCLE1BQU0sR0FBYSxFQUFpQixDQUNoQyxTQUFVLElBQ2IsQ0FBQyJ9
|