@sidekick-coder/zenith-kit 0.0.12 → 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 +27 -0
- package/bin/zkit.js +26 -0
- package/cli/commands/build.js +49 -0
- package/cli/commands/generateLegacyFolder.js +38 -0
- package/cli/commands/generatePluginId.js +17 -0
- package/cli/config.js +23 -0
- package/cli/utils/createWrapper.js +17 -0
- package/dist/client/index.d.mts +513 -0
- package/dist/client/index.mjs +2 -0
- package/dist/components/index.es.js +63946 -0
- package/dist/components/styles.css +4833 -0
- package/dist/server/index.d.mts +1780 -1314
- package/dist/server/index.mjs +5 -7754
- package/dist/shared/chunk-0Lt9GpW0.mjs +1 -0
- package/dist/shared/index.d.mts +472 -19
- package/dist/shared/index.mjs +2 -841
- 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 +57 -13
- package/tsconfig.client.json +3 -3
- package/tsconfig.server.json +1 -1
- package/tsdown/createTsdownConfig.js +29 -0
- package/tsdown.config.ts +55 -2
- package/vite/createViteConfig.js +55 -0
- package/vite/plugins/zenith.js +143 -0
- package/vite.config.ts +72 -0
- package/dist/shared/chunk-CfYAbeIz.mjs +0 -13
package/dist/server/index.d.mts
CHANGED
|
@@ -1,926 +1,23 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import fs, { ReadStream } from "fs";
|
|
2
4
|
import * as v from "valibot";
|
|
3
5
|
import { InferOutput } from "valibot";
|
|
6
|
+
import * as _$_casl_ability0 from "@casl/ability";
|
|
7
|
+
import { defineAbility } from "@casl/ability";
|
|
4
8
|
import cp from "child_process";
|
|
5
9
|
import ms from "ms";
|
|
6
10
|
import { S3Client } from "@aws-sdk/client-s3";
|
|
11
|
+
import * as _$undici from "undici";
|
|
12
|
+
import { RequestInit } from "undici";
|
|
7
13
|
import dotenv from "dotenv";
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import
|
|
13
|
-
import {
|
|
14
|
+
import { ChildProcess } from "node:child_process";
|
|
15
|
+
import * as _$kysely from "kysely";
|
|
16
|
+
import { ColumnType, CreateTableBuilder as CreateTableBuilder$1, ExpressionBuilder as ExpressionBuilder$1, ExpressionWrapper, Generated, Insertable, Kysely, SelectQueryBuilder, Selectable, Updateable } from "kysely";
|
|
17
|
+
import { CookieOptions, Request as Request$1, Response as Response$1 } from "express";
|
|
18
|
+
import { ResolvableHead } from "@unhead/vue";
|
|
19
|
+
import { Token, UserEntity } from "@sidekick-coder/zenith-kit/shared";
|
|
14
20
|
|
|
15
|
-
//#region node_modules/commander/typings/index.d.ts
|
|
16
|
-
// Type definitions for commander
|
|
17
|
-
// Original definitions by: Alan Agius <https://github.com/alan-agius4>, Marcelo Dezem <https://github.com/mdezem>, vvakame <https://github.com/vvakame>, Jules Randolph <https://github.com/sveinburne>
|
|
18
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
19
|
-
// This is a trick to encourage editor to suggest the known literals while still
|
|
20
|
-
// allowing any BaseType value.
|
|
21
|
-
// References:
|
|
22
|
-
// - https://github.com/microsoft/TypeScript/issues/29729
|
|
23
|
-
// - https://github.com/sindresorhus/type-fest/blob/main/source/literal-union.d.ts
|
|
24
|
-
// - https://github.com/sindresorhus/type-fest/blob/main/source/primitive.d.ts
|
|
25
|
-
type LiteralUnion<LiteralType, BaseType extends string | number> = LiteralType | (BaseType & Record<never, never>);
|
|
26
|
-
declare class CommanderError extends Error {
|
|
27
|
-
code: string;
|
|
28
|
-
exitCode: number;
|
|
29
|
-
message: string;
|
|
30
|
-
nestedError?: string;
|
|
31
|
-
/**
|
|
32
|
-
* Constructs the CommanderError class
|
|
33
|
-
* @param exitCode - suggested exit code which could be used with process.exit
|
|
34
|
-
* @param code - an id string representing the error
|
|
35
|
-
* @param message - human-readable description of the error
|
|
36
|
-
*/
|
|
37
|
-
constructor(exitCode: number, code: string, message: string);
|
|
38
|
-
}
|
|
39
|
-
// deprecated old name
|
|
40
|
-
interface ErrorOptions {
|
|
41
|
-
// optional parameter for error()
|
|
42
|
-
/** an id string representing the error */
|
|
43
|
-
code?: string;
|
|
44
|
-
/** suggested exit code which could be used with process.exit */
|
|
45
|
-
exitCode?: number;
|
|
46
|
-
}
|
|
47
|
-
declare class Argument {
|
|
48
|
-
description: string;
|
|
49
|
-
required: boolean;
|
|
50
|
-
variadic: boolean;
|
|
51
|
-
defaultValue?: any;
|
|
52
|
-
defaultValueDescription?: string;
|
|
53
|
-
parseArg?: <T>(value: string, previous: T) => T;
|
|
54
|
-
argChoices?: string[];
|
|
55
|
-
/**
|
|
56
|
-
* Initialize a new command argument with the given name and description.
|
|
57
|
-
* The default is that the argument is required, and you can explicitly
|
|
58
|
-
* indicate this with <> around the name. Put [] around the name for an optional argument.
|
|
59
|
-
*/
|
|
60
|
-
constructor(arg: string, description?: string);
|
|
61
|
-
/**
|
|
62
|
-
* Return argument name.
|
|
63
|
-
*/
|
|
64
|
-
name(): string;
|
|
65
|
-
/**
|
|
66
|
-
* Set the default value, and optionally supply the description to be displayed in the help.
|
|
67
|
-
*/
|
|
68
|
-
default(value: unknown, description?: string): this;
|
|
69
|
-
/**
|
|
70
|
-
* Set the custom handler for processing CLI command arguments into argument values.
|
|
71
|
-
*/
|
|
72
|
-
argParser<T>(fn: (value: string, previous: T) => T): this;
|
|
73
|
-
/**
|
|
74
|
-
* Only allow argument value to be one of choices.
|
|
75
|
-
*/
|
|
76
|
-
choices(values: readonly string[]): this;
|
|
77
|
-
/**
|
|
78
|
-
* Make argument required.
|
|
79
|
-
*/
|
|
80
|
-
argRequired(): this;
|
|
81
|
-
/**
|
|
82
|
-
* Make argument optional.
|
|
83
|
-
*/
|
|
84
|
-
argOptional(): this;
|
|
85
|
-
}
|
|
86
|
-
declare class Option {
|
|
87
|
-
flags: string;
|
|
88
|
-
description: string;
|
|
89
|
-
required: boolean; // A value must be supplied when the option is specified.
|
|
90
|
-
optional: boolean; // A value is optional when the option is specified.
|
|
91
|
-
variadic: boolean;
|
|
92
|
-
mandatory: boolean; // The option must have a value after parsing, which usually means it must be specified on command line.
|
|
93
|
-
short?: string;
|
|
94
|
-
long?: string;
|
|
95
|
-
negate: boolean;
|
|
96
|
-
defaultValue?: any;
|
|
97
|
-
defaultValueDescription?: string;
|
|
98
|
-
presetArg?: unknown;
|
|
99
|
-
envVar?: string;
|
|
100
|
-
parseArg?: <T>(value: string, previous: T) => T;
|
|
101
|
-
hidden: boolean;
|
|
102
|
-
argChoices?: string[];
|
|
103
|
-
helpGroupHeading?: string;
|
|
104
|
-
constructor(flags: string, description?: string);
|
|
105
|
-
/**
|
|
106
|
-
* Set the default value, and optionally supply the description to be displayed in the help.
|
|
107
|
-
*/
|
|
108
|
-
default(value: unknown, description?: string): this;
|
|
109
|
-
/**
|
|
110
|
-
* Preset to use when option used without option-argument, especially optional but also boolean and negated.
|
|
111
|
-
* The custom processing (parseArg) is called.
|
|
112
|
-
*
|
|
113
|
-
* @example
|
|
114
|
-
* ```ts
|
|
115
|
-
* new Option('--color').default('GREYSCALE').preset('RGB');
|
|
116
|
-
* new Option('--donate [amount]').preset('20').argParser(parseFloat);
|
|
117
|
-
* ```
|
|
118
|
-
*/
|
|
119
|
-
preset(arg: unknown): this;
|
|
120
|
-
/**
|
|
121
|
-
* Add option name(s) that conflict with this option.
|
|
122
|
-
* An error will be displayed if conflicting options are found during parsing.
|
|
123
|
-
*
|
|
124
|
-
* @example
|
|
125
|
-
* ```ts
|
|
126
|
-
* new Option('--rgb').conflicts('cmyk');
|
|
127
|
-
* new Option('--js').conflicts(['ts', 'jsx']);
|
|
128
|
-
* ```
|
|
129
|
-
*/
|
|
130
|
-
conflicts(names: string | string[]): this;
|
|
131
|
-
/**
|
|
132
|
-
* Specify implied option values for when this option is set and the implied options are not.
|
|
133
|
-
*
|
|
134
|
-
* The custom processing (parseArg) is not called on the implied values.
|
|
135
|
-
*
|
|
136
|
-
* @example
|
|
137
|
-
* program
|
|
138
|
-
* .addOption(new Option('--log', 'write logging information to file'))
|
|
139
|
-
* .addOption(new Option('--trace', 'log extra details').implies({ log: 'trace.txt' }));
|
|
140
|
-
*/
|
|
141
|
-
implies(optionValues: OptionValues): this;
|
|
142
|
-
/**
|
|
143
|
-
* Set environment variable to check for option value.
|
|
144
|
-
*
|
|
145
|
-
* An environment variables is only used if when processed the current option value is
|
|
146
|
-
* undefined, or the source of the current value is 'default' or 'config' or 'env'.
|
|
147
|
-
*/
|
|
148
|
-
env(name: string): this;
|
|
149
|
-
/**
|
|
150
|
-
* Set the custom handler for processing CLI option arguments into option values.
|
|
151
|
-
*/
|
|
152
|
-
argParser<T>(fn: (value: string, previous: T) => T): this;
|
|
153
|
-
/**
|
|
154
|
-
* Whether the option is mandatory and must have a value after parsing.
|
|
155
|
-
*/
|
|
156
|
-
makeOptionMandatory(mandatory?: boolean): this;
|
|
157
|
-
/**
|
|
158
|
-
* Hide option in help.
|
|
159
|
-
*/
|
|
160
|
-
hideHelp(hide?: boolean): this;
|
|
161
|
-
/**
|
|
162
|
-
* Only allow option value to be one of choices.
|
|
163
|
-
*/
|
|
164
|
-
choices(values: readonly string[]): this;
|
|
165
|
-
/**
|
|
166
|
-
* Return option name.
|
|
167
|
-
*/
|
|
168
|
-
name(): string;
|
|
169
|
-
/**
|
|
170
|
-
* Return option name, in a camelcase format that can be used
|
|
171
|
-
* as an object attribute key.
|
|
172
|
-
*/
|
|
173
|
-
attributeName(): string;
|
|
174
|
-
/**
|
|
175
|
-
* Set the help group heading.
|
|
176
|
-
*/
|
|
177
|
-
helpGroup(heading: string): this;
|
|
178
|
-
/**
|
|
179
|
-
* Return whether a boolean option.
|
|
180
|
-
*
|
|
181
|
-
* Options are one of boolean, negated, required argument, or optional argument.
|
|
182
|
-
*/
|
|
183
|
-
isBoolean(): boolean;
|
|
184
|
-
}
|
|
185
|
-
declare class Help {
|
|
186
|
-
/** output helpWidth, long lines are wrapped to fit */
|
|
187
|
-
helpWidth?: number;
|
|
188
|
-
minWidthToWrap: number;
|
|
189
|
-
sortSubcommands: boolean;
|
|
190
|
-
sortOptions: boolean;
|
|
191
|
-
showGlobalOptions: boolean;
|
|
192
|
-
constructor();
|
|
193
|
-
/*
|
|
194
|
-
* prepareContext is called by Commander after applying overrides from `Command.configureHelp()`
|
|
195
|
-
* and just before calling `formatHelp()`.
|
|
196
|
-
*
|
|
197
|
-
* Commander just uses the helpWidth and the others are provided for subclasses.
|
|
198
|
-
*/
|
|
199
|
-
prepareContext(contextOptions: {
|
|
200
|
-
error?: boolean;
|
|
201
|
-
helpWidth?: number;
|
|
202
|
-
outputHasColors?: boolean;
|
|
203
|
-
}): void;
|
|
204
|
-
/** Get the command term to show in the list of subcommands. */
|
|
205
|
-
subcommandTerm(cmd: Command): string;
|
|
206
|
-
/** Get the command summary to show in the list of subcommands. */
|
|
207
|
-
subcommandDescription(cmd: Command): string;
|
|
208
|
-
/** Get the option term to show in the list of options. */
|
|
209
|
-
optionTerm(option: Option): string;
|
|
210
|
-
/** Get the option description to show in the list of options. */
|
|
211
|
-
optionDescription(option: Option): string;
|
|
212
|
-
/** Get the argument term to show in the list of arguments. */
|
|
213
|
-
argumentTerm(argument: Argument): string;
|
|
214
|
-
/** Get the argument description to show in the list of arguments. */
|
|
215
|
-
argumentDescription(argument: Argument): string;
|
|
216
|
-
/** Get the command usage to be displayed at the top of the built-in help. */
|
|
217
|
-
commandUsage(cmd: Command): string;
|
|
218
|
-
/** Get the description for the command. */
|
|
219
|
-
commandDescription(cmd: Command): string;
|
|
220
|
-
/** Get an array of the visible subcommands. Includes a placeholder for the implicit help command, if there is one. */
|
|
221
|
-
visibleCommands(cmd: Command): Command[];
|
|
222
|
-
/** Get an array of the visible options. Includes a placeholder for the implicit help option, if there is one. */
|
|
223
|
-
visibleOptions(cmd: Command): Option[];
|
|
224
|
-
/** Get an array of the visible global options. (Not including help.) */
|
|
225
|
-
visibleGlobalOptions(cmd: Command): Option[];
|
|
226
|
-
/** Get an array of the arguments which have descriptions. */
|
|
227
|
-
visibleArguments(cmd: Command): Argument[];
|
|
228
|
-
/** Get the longest command term length. */
|
|
229
|
-
longestSubcommandTermLength(cmd: Command, helper: Help): number;
|
|
230
|
-
/** Get the longest option term length. */
|
|
231
|
-
longestOptionTermLength(cmd: Command, helper: Help): number;
|
|
232
|
-
/** Get the longest global option term length. */
|
|
233
|
-
longestGlobalOptionTermLength(cmd: Command, helper: Help): number;
|
|
234
|
-
/** Get the longest argument term length. */
|
|
235
|
-
longestArgumentTermLength(cmd: Command, helper: Help): number;
|
|
236
|
-
/** Return display width of string, ignoring ANSI escape sequences. Used in padding and wrapping calculations. */
|
|
237
|
-
displayWidth(str: string): number;
|
|
238
|
-
/** Style the titles. Called with 'Usage:', 'Options:', etc. */
|
|
239
|
-
styleTitle(title: string): string;
|
|
240
|
-
/** Usage: <str> */
|
|
241
|
-
styleUsage(str: string): string;
|
|
242
|
-
/** Style for command name in usage string. */
|
|
243
|
-
styleCommandText(str: string): string;
|
|
244
|
-
styleCommandDescription(str: string): string;
|
|
245
|
-
styleOptionDescription(str: string): string;
|
|
246
|
-
styleSubcommandDescription(str: string): string;
|
|
247
|
-
styleArgumentDescription(str: string): string;
|
|
248
|
-
/** Base style used by descriptions. */
|
|
249
|
-
styleDescriptionText(str: string): string;
|
|
250
|
-
styleOptionTerm(str: string): string;
|
|
251
|
-
styleSubcommandTerm(str: string): string;
|
|
252
|
-
styleArgumentTerm(str: string): string;
|
|
253
|
-
/** Base style used in terms and usage for options. */
|
|
254
|
-
styleOptionText(str: string): string;
|
|
255
|
-
/** Base style used in terms and usage for subcommands. */
|
|
256
|
-
styleSubcommandText(str: string): string;
|
|
257
|
-
/** Base style used in terms and usage for arguments. */
|
|
258
|
-
styleArgumentText(str: string): string;
|
|
259
|
-
/** Calculate the pad width from the maximum term length. */
|
|
260
|
-
padWidth(cmd: Command, helper: Help): number;
|
|
261
|
-
/**
|
|
262
|
-
* Wrap a string at whitespace, preserving existing line breaks.
|
|
263
|
-
* Wrapping is skipped if the width is less than `minWidthToWrap`.
|
|
264
|
-
*/
|
|
265
|
-
boxWrap(str: string, width: number): string;
|
|
266
|
-
/** Detect manually wrapped and indented strings by checking for line break followed by whitespace. */
|
|
267
|
-
preformatted(str: string): boolean;
|
|
268
|
-
/**
|
|
269
|
-
* Format the "item", which consists of a term and description. Pad the term and wrap the description, indenting the following lines.
|
|
270
|
-
*
|
|
271
|
-
* So "TTT", 5, "DDD DDDD DD DDD" might be formatted for this.helpWidth=17 like so:
|
|
272
|
-
* TTT DDD DDDD
|
|
273
|
-
* DD DDD
|
|
274
|
-
*/
|
|
275
|
-
formatItem(term: string, termWidth: number, description: string, helper: Help): string;
|
|
276
|
-
/**
|
|
277
|
-
* Format a list of items, given a heading and an array of formatted items.
|
|
278
|
-
*/
|
|
279
|
-
formatItemList(heading: string, items: string[], helper: Help): string[];
|
|
280
|
-
/**
|
|
281
|
-
* Group items by their help group heading.
|
|
282
|
-
*/
|
|
283
|
-
groupItems<T extends Command | Option>(unsortedItems: T[], visibleItems: T[], getGroup: (item: T) => string): Map<string, T[]>;
|
|
284
|
-
/** Generate the built-in help text. */
|
|
285
|
-
formatHelp(cmd: Command, helper: Help): string;
|
|
286
|
-
}
|
|
287
|
-
type HelpConfiguration = Partial<Help>;
|
|
288
|
-
interface ParseOptions {
|
|
289
|
-
from: 'node' | 'electron' | 'user';
|
|
290
|
-
}
|
|
291
|
-
interface HelpContext {
|
|
292
|
-
// optional parameter for .help() and .outputHelp()
|
|
293
|
-
error: boolean;
|
|
294
|
-
}
|
|
295
|
-
interface AddHelpTextContext {
|
|
296
|
-
// passed to text function used with .addHelpText()
|
|
297
|
-
error: boolean;
|
|
298
|
-
command: Command;
|
|
299
|
-
}
|
|
300
|
-
interface OutputConfiguration {
|
|
301
|
-
writeOut?(str: string): void;
|
|
302
|
-
writeErr?(str: string): void;
|
|
303
|
-
outputError?(str: string, write: (str: string) => void): void;
|
|
304
|
-
getOutHelpWidth?(): number;
|
|
305
|
-
getErrHelpWidth?(): number;
|
|
306
|
-
getOutHasColors?(): boolean;
|
|
307
|
-
getErrHasColors?(): boolean;
|
|
308
|
-
stripColor?(str: string): string;
|
|
309
|
-
}
|
|
310
|
-
type AddHelpTextPosition = 'beforeAll' | 'before' | 'after' | 'afterAll';
|
|
311
|
-
type HookEvent = 'preSubcommand' | 'preAction' | 'postAction';
|
|
312
|
-
// The source is a string so author can define their own too.
|
|
313
|
-
type OptionValueSource = LiteralUnion<'default' | 'config' | 'env' | 'cli' | 'implied', string> | undefined;
|
|
314
|
-
type OptionValues = Record<string, any>;
|
|
315
|
-
declare class Command {
|
|
316
|
-
args: string[];
|
|
317
|
-
processedArgs: any[];
|
|
318
|
-
readonly commands: readonly Command[];
|
|
319
|
-
readonly options: readonly Option[];
|
|
320
|
-
readonly registeredArguments: readonly Argument[];
|
|
321
|
-
parent: Command | null;
|
|
322
|
-
constructor(name?: string);
|
|
323
|
-
/**
|
|
324
|
-
* Set the program version to `str`.
|
|
325
|
-
*
|
|
326
|
-
* This method auto-registers the "-V, --version" flag
|
|
327
|
-
* which will print the version number when passed.
|
|
328
|
-
*
|
|
329
|
-
* You can optionally supply the flags and description to override the defaults.
|
|
330
|
-
*/
|
|
331
|
-
version(str: string, flags?: string, description?: string): this;
|
|
332
|
-
/**
|
|
333
|
-
* Get the program version.
|
|
334
|
-
*/
|
|
335
|
-
version(): string | undefined;
|
|
336
|
-
/**
|
|
337
|
-
* Define a command, implemented using an action handler.
|
|
338
|
-
*
|
|
339
|
-
* @remarks
|
|
340
|
-
* The command description is supplied using `.description`, not as a parameter to `.command`.
|
|
341
|
-
*
|
|
342
|
-
* @example
|
|
343
|
-
* ```ts
|
|
344
|
-
* program
|
|
345
|
-
* .command('clone <source> [destination]')
|
|
346
|
-
* .description('clone a repository into a newly created directory')
|
|
347
|
-
* .action((source, destination) => {
|
|
348
|
-
* console.log('clone command called');
|
|
349
|
-
* });
|
|
350
|
-
* ```
|
|
351
|
-
*
|
|
352
|
-
* @param nameAndArgs - command name and arguments, args are `<required>` or `[optional]` and last may also be `variadic...`
|
|
353
|
-
* @param opts - configuration options
|
|
354
|
-
* @returns new command
|
|
355
|
-
*/
|
|
356
|
-
command(nameAndArgs: string, opts?: CommandOptions$1): ReturnType<this['createCommand']>;
|
|
357
|
-
/**
|
|
358
|
-
* Define a command, implemented in a separate executable file.
|
|
359
|
-
*
|
|
360
|
-
* @remarks
|
|
361
|
-
* The command description is supplied as the second parameter to `.command`.
|
|
362
|
-
*
|
|
363
|
-
* @example
|
|
364
|
-
* ```ts
|
|
365
|
-
* program
|
|
366
|
-
* .command('start <service>', 'start named service')
|
|
367
|
-
* .command('stop [service]', 'stop named service, or all if no name supplied');
|
|
368
|
-
* ```
|
|
369
|
-
*
|
|
370
|
-
* @param nameAndArgs - command name and arguments, args are `<required>` or `[optional]` and last may also be `variadic...`
|
|
371
|
-
* @param description - description of executable command
|
|
372
|
-
* @param opts - configuration options
|
|
373
|
-
* @returns `this` command for chaining
|
|
374
|
-
*/
|
|
375
|
-
command(nameAndArgs: string, description: string, opts?: ExecutableCommandOptions): this;
|
|
376
|
-
/**
|
|
377
|
-
* Factory routine to create a new unattached command.
|
|
378
|
-
*
|
|
379
|
-
* See .command() for creating an attached subcommand, which uses this routine to
|
|
380
|
-
* create the command. You can override createCommand to customise subcommands.
|
|
381
|
-
*/
|
|
382
|
-
createCommand(name?: string): Command;
|
|
383
|
-
/**
|
|
384
|
-
* Add a prepared subcommand.
|
|
385
|
-
*
|
|
386
|
-
* See .command() for creating an attached subcommand which inherits settings from its parent.
|
|
387
|
-
*
|
|
388
|
-
* @returns `this` command for chaining
|
|
389
|
-
*/
|
|
390
|
-
addCommand(cmd: Command, opts?: CommandOptions$1): this;
|
|
391
|
-
/**
|
|
392
|
-
* Factory routine to create a new unattached argument.
|
|
393
|
-
*
|
|
394
|
-
* See .argument() for creating an attached argument, which uses this routine to
|
|
395
|
-
* create the argument. You can override createArgument to return a custom argument.
|
|
396
|
-
*/
|
|
397
|
-
createArgument(name: string, description?: string): Argument;
|
|
398
|
-
/**
|
|
399
|
-
* Define argument syntax for command.
|
|
400
|
-
*
|
|
401
|
-
* The default is that the argument is required, and you can explicitly
|
|
402
|
-
* indicate this with <> around the name. Put [] around the name for an optional argument.
|
|
403
|
-
*
|
|
404
|
-
* @example
|
|
405
|
-
* ```
|
|
406
|
-
* program.argument('<input-file>');
|
|
407
|
-
* program.argument('[output-file]');
|
|
408
|
-
* ```
|
|
409
|
-
*
|
|
410
|
-
* @returns `this` command for chaining
|
|
411
|
-
*/
|
|
412
|
-
argument<T>(flags: string, description: string, parseArg: (value: string, previous: T) => T, defaultValue?: T): this;
|
|
413
|
-
argument(name: string, description?: string, defaultValue?: unknown): this;
|
|
414
|
-
/**
|
|
415
|
-
* Define argument syntax for command, adding a prepared argument.
|
|
416
|
-
*
|
|
417
|
-
* @returns `this` command for chaining
|
|
418
|
-
*/
|
|
419
|
-
addArgument(arg: Argument): this;
|
|
420
|
-
/**
|
|
421
|
-
* Define argument syntax for command, adding multiple at once (without descriptions).
|
|
422
|
-
*
|
|
423
|
-
* See also .argument().
|
|
424
|
-
*
|
|
425
|
-
* @example
|
|
426
|
-
* ```
|
|
427
|
-
* program.arguments('<cmd> [env]');
|
|
428
|
-
* ```
|
|
429
|
-
*
|
|
430
|
-
* @returns `this` command for chaining
|
|
431
|
-
*/
|
|
432
|
-
arguments(names: string): this;
|
|
433
|
-
/**
|
|
434
|
-
* Customise or override default help command. By default a help command is automatically added if your command has subcommands.
|
|
435
|
-
*
|
|
436
|
-
* @example
|
|
437
|
-
* ```ts
|
|
438
|
-
* program.helpCommand('help [cmd]');
|
|
439
|
-
* program.helpCommand('help [cmd]', 'show help');
|
|
440
|
-
* program.helpCommand(false); // suppress default help command
|
|
441
|
-
* program.helpCommand(true); // add help command even if no subcommands
|
|
442
|
-
* ```
|
|
443
|
-
*/
|
|
444
|
-
helpCommand(nameAndArgs: string, description?: string): this;
|
|
445
|
-
helpCommand(enable: boolean): this;
|
|
446
|
-
/**
|
|
447
|
-
* Add prepared custom help command.
|
|
448
|
-
*/
|
|
449
|
-
addHelpCommand(cmd: Command): this;
|
|
450
|
-
/** @deprecated since v12, instead use helpCommand */
|
|
451
|
-
addHelpCommand(nameAndArgs: string, description?: string): this;
|
|
452
|
-
/** @deprecated since v12, instead use helpCommand */
|
|
453
|
-
addHelpCommand(enable?: boolean): this;
|
|
454
|
-
/**
|
|
455
|
-
* Add hook for life cycle event.
|
|
456
|
-
*/
|
|
457
|
-
hook(event: HookEvent, listener: (thisCommand: Command, actionCommand: Command) => void | Promise<void>): this;
|
|
458
|
-
/**
|
|
459
|
-
* Register callback to use as replacement for calling process.exit.
|
|
460
|
-
*/
|
|
461
|
-
exitOverride(callback?: (err: CommanderError) => never | void): this;
|
|
462
|
-
/**
|
|
463
|
-
* Display error message and exit (or call exitOverride).
|
|
464
|
-
*/
|
|
465
|
-
error(message: string, errorOptions?: ErrorOptions): never;
|
|
466
|
-
/**
|
|
467
|
-
* You can customise the help with a subclass of Help by overriding createHelp,
|
|
468
|
-
* or by overriding Help properties using configureHelp().
|
|
469
|
-
*/
|
|
470
|
-
createHelp(): Help;
|
|
471
|
-
/**
|
|
472
|
-
* You can customise the help by overriding Help properties using configureHelp(),
|
|
473
|
-
* or with a subclass of Help by overriding createHelp().
|
|
474
|
-
*/
|
|
475
|
-
configureHelp(configuration: HelpConfiguration): this;
|
|
476
|
-
/** Get configuration */
|
|
477
|
-
configureHelp(): HelpConfiguration;
|
|
478
|
-
/**
|
|
479
|
-
* The default output goes to stdout and stderr. You can customise this for special
|
|
480
|
-
* applications. You can also customise the display of errors by overriding outputError.
|
|
481
|
-
*
|
|
482
|
-
* The configuration properties are all functions:
|
|
483
|
-
* ```
|
|
484
|
-
* // functions to change where being written, stdout and stderr
|
|
485
|
-
* writeOut(str)
|
|
486
|
-
* writeErr(str)
|
|
487
|
-
* // matching functions to specify width for wrapping help
|
|
488
|
-
* getOutHelpWidth()
|
|
489
|
-
* getErrHelpWidth()
|
|
490
|
-
* // functions based on what is being written out
|
|
491
|
-
* outputError(str, write) // used for displaying errors, and not used for displaying help
|
|
492
|
-
* ```
|
|
493
|
-
*/
|
|
494
|
-
configureOutput(configuration: OutputConfiguration): this;
|
|
495
|
-
/** Get configuration */
|
|
496
|
-
configureOutput(): OutputConfiguration;
|
|
497
|
-
/**
|
|
498
|
-
* Copy settings that are useful to have in common across root command and subcommands.
|
|
499
|
-
*
|
|
500
|
-
* (Used internally when adding a command using `.command()` so subcommands inherit parent settings.)
|
|
501
|
-
*/
|
|
502
|
-
copyInheritedSettings(sourceCommand: Command): this;
|
|
503
|
-
/**
|
|
504
|
-
* Display the help or a custom message after an error occurs.
|
|
505
|
-
*/
|
|
506
|
-
showHelpAfterError(displayHelp?: boolean | string): this;
|
|
507
|
-
/**
|
|
508
|
-
* Display suggestion of similar commands for unknown commands, or options for unknown options.
|
|
509
|
-
*/
|
|
510
|
-
showSuggestionAfterError(displaySuggestion?: boolean): this;
|
|
511
|
-
/**
|
|
512
|
-
* Register callback `fn` for the command.
|
|
513
|
-
*
|
|
514
|
-
* @example
|
|
515
|
-
* ```
|
|
516
|
-
* program
|
|
517
|
-
* .command('serve')
|
|
518
|
-
* .description('start service')
|
|
519
|
-
* .action(function() {
|
|
520
|
-
* // do work here
|
|
521
|
-
* });
|
|
522
|
-
* ```
|
|
523
|
-
*
|
|
524
|
-
* @returns `this` command for chaining
|
|
525
|
-
*/
|
|
526
|
-
action(fn: (this: this, ...args: any[]) => void | Promise<void>): this;
|
|
527
|
-
/**
|
|
528
|
-
* Define option with `flags`, `description`, and optional argument parsing function or `defaultValue` or both.
|
|
529
|
-
*
|
|
530
|
-
* The `flags` string contains the short and/or long flags, separated by comma, a pipe or space. A required
|
|
531
|
-
* option-argument is indicated by `<>` and an optional option-argument by `[]`.
|
|
532
|
-
*
|
|
533
|
-
* See the README for more details, and see also addOption() and requiredOption().
|
|
534
|
-
*
|
|
535
|
-
* @example
|
|
536
|
-
*
|
|
537
|
-
* ```js
|
|
538
|
-
* program
|
|
539
|
-
* .option('-p, --pepper', 'add pepper')
|
|
540
|
-
* .option('--pt, --pizza-type <TYPE>', 'type of pizza') // required option-argument
|
|
541
|
-
* .option('-c, --cheese [CHEESE]', 'add extra cheese', 'mozzarella') // optional option-argument with default
|
|
542
|
-
* .option('-t, --tip <VALUE>', 'add tip to purchase cost', parseFloat) // custom parse function
|
|
543
|
-
* ```
|
|
544
|
-
*
|
|
545
|
-
* @returns `this` command for chaining
|
|
546
|
-
*/
|
|
547
|
-
option(flags: string, description?: string, defaultValue?: string | boolean | string[]): this;
|
|
548
|
-
option<T>(flags: string, description: string, parseArg: (value: string, previous: T) => T, defaultValue?: T): this;
|
|
549
|
-
/** @deprecated since v7, instead use choices or a custom function */
|
|
550
|
-
option(flags: string, description: string, regexp: RegExp, defaultValue?: string | boolean | string[]): this;
|
|
551
|
-
/**
|
|
552
|
-
* Define a required option, which must have a value after parsing. This usually means
|
|
553
|
-
* the option must be specified on the command line. (Otherwise the same as .option().)
|
|
554
|
-
*
|
|
555
|
-
* The `flags` string contains the short and/or long flags, separated by comma, a pipe or space.
|
|
556
|
-
*/
|
|
557
|
-
requiredOption(flags: string, description?: string, defaultValue?: string | boolean | string[]): this;
|
|
558
|
-
requiredOption<T>(flags: string, description: string, parseArg: (value: string, previous: T) => T, defaultValue?: T): this;
|
|
559
|
-
/** @deprecated since v7, instead use choices or a custom function */
|
|
560
|
-
requiredOption(flags: string, description: string, regexp: RegExp, defaultValue?: string | boolean | string[]): this;
|
|
561
|
-
/**
|
|
562
|
-
* Factory routine to create a new unattached option.
|
|
563
|
-
*
|
|
564
|
-
* See .option() for creating an attached option, which uses this routine to
|
|
565
|
-
* create the option. You can override createOption to return a custom option.
|
|
566
|
-
*/
|
|
567
|
-
createOption(flags: string, description?: string): Option;
|
|
568
|
-
/**
|
|
569
|
-
* Add a prepared Option.
|
|
570
|
-
*
|
|
571
|
-
* See .option() and .requiredOption() for creating and attaching an option in a single call.
|
|
572
|
-
*/
|
|
573
|
-
addOption(option: Option): this;
|
|
574
|
-
/**
|
|
575
|
-
* Whether to store option values as properties on command object,
|
|
576
|
-
* or store separately (specify false). In both cases the option values can be accessed using .opts().
|
|
577
|
-
*
|
|
578
|
-
* @returns `this` command for chaining
|
|
579
|
-
*/
|
|
580
|
-
storeOptionsAsProperties<T extends OptionValues>(): this & T;
|
|
581
|
-
storeOptionsAsProperties<T extends OptionValues>(storeAsProperties: true): this & T;
|
|
582
|
-
storeOptionsAsProperties(storeAsProperties?: boolean): this;
|
|
583
|
-
/**
|
|
584
|
-
* Retrieve option value.
|
|
585
|
-
*/
|
|
586
|
-
getOptionValue(key: string): any;
|
|
587
|
-
/**
|
|
588
|
-
* Store option value.
|
|
589
|
-
*/
|
|
590
|
-
setOptionValue(key: string, value: unknown): this;
|
|
591
|
-
/**
|
|
592
|
-
* Store option value and where the value came from.
|
|
593
|
-
*/
|
|
594
|
-
setOptionValueWithSource(key: string, value: unknown, source: OptionValueSource): this;
|
|
595
|
-
/**
|
|
596
|
-
* Get source of option value.
|
|
597
|
-
*/
|
|
598
|
-
getOptionValueSource(key: string): OptionValueSource | undefined;
|
|
599
|
-
/**
|
|
600
|
-
* Get source of option value. See also .optsWithGlobals().
|
|
601
|
-
*/
|
|
602
|
-
getOptionValueSourceWithGlobals(key: string): OptionValueSource | undefined;
|
|
603
|
-
/**
|
|
604
|
-
* Alter parsing of short flags with optional values.
|
|
605
|
-
*
|
|
606
|
-
* @example
|
|
607
|
-
* ```
|
|
608
|
-
* // for `.option('-f,--flag [value]'):
|
|
609
|
-
* .combineFlagAndOptionalValue(true) // `-f80` is treated like `--flag=80`, this is the default behaviour
|
|
610
|
-
* .combineFlagAndOptionalValue(false) // `-fb` is treated like `-f -b`
|
|
611
|
-
* ```
|
|
612
|
-
*
|
|
613
|
-
* @returns `this` command for chaining
|
|
614
|
-
*/
|
|
615
|
-
combineFlagAndOptionalValue(combine?: boolean): this;
|
|
616
|
-
/**
|
|
617
|
-
* Allow unknown options on the command line.
|
|
618
|
-
*
|
|
619
|
-
* @returns `this` command for chaining
|
|
620
|
-
*/
|
|
621
|
-
allowUnknownOption(allowUnknown?: boolean): this;
|
|
622
|
-
/**
|
|
623
|
-
* Allow excess command-arguments on the command line. Pass false to make excess arguments an error.
|
|
624
|
-
*
|
|
625
|
-
* @returns `this` command for chaining
|
|
626
|
-
*/
|
|
627
|
-
allowExcessArguments(allowExcess?: boolean): this;
|
|
628
|
-
/**
|
|
629
|
-
* Enable positional options. Positional means global options are specified before subcommands which lets
|
|
630
|
-
* subcommands reuse the same option names, and also enables subcommands to turn on passThroughOptions.
|
|
631
|
-
*
|
|
632
|
-
* The default behaviour is non-positional and global options may appear anywhere on the command line.
|
|
633
|
-
*
|
|
634
|
-
* @returns `this` command for chaining
|
|
635
|
-
*/
|
|
636
|
-
enablePositionalOptions(positional?: boolean): this;
|
|
637
|
-
/**
|
|
638
|
-
* Pass through options that come after command-arguments rather than treat them as command-options,
|
|
639
|
-
* so actual command-options come before command-arguments. Turning this on for a subcommand requires
|
|
640
|
-
* positional options to have been enabled on the program (parent commands).
|
|
641
|
-
*
|
|
642
|
-
* The default behaviour is non-positional and options may appear before or after command-arguments.
|
|
643
|
-
*
|
|
644
|
-
* @returns `this` command for chaining
|
|
645
|
-
*/
|
|
646
|
-
passThroughOptions(passThrough?: boolean): this;
|
|
647
|
-
/**
|
|
648
|
-
* Parse `argv`, setting options and invoking commands when defined.
|
|
649
|
-
*
|
|
650
|
-
* Use parseAsync instead of parse if any of your action handlers are async.
|
|
651
|
-
*
|
|
652
|
-
* Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode!
|
|
653
|
-
*
|
|
654
|
-
* Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`:
|
|
655
|
-
* - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that
|
|
656
|
-
* - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged
|
|
657
|
-
* - `'user'`: just user arguments
|
|
658
|
-
*
|
|
659
|
-
* @example
|
|
660
|
-
* ```
|
|
661
|
-
* program.parse(); // parse process.argv and auto-detect electron and special node flags
|
|
662
|
-
* program.parse(process.argv); // assume argv[0] is app and argv[1] is script
|
|
663
|
-
* program.parse(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]
|
|
664
|
-
* ```
|
|
665
|
-
*
|
|
666
|
-
* @returns `this` command for chaining
|
|
667
|
-
*/
|
|
668
|
-
parse(argv?: readonly string[], parseOptions?: ParseOptions): this;
|
|
669
|
-
/**
|
|
670
|
-
* Parse `argv`, setting options and invoking commands when defined.
|
|
671
|
-
*
|
|
672
|
-
* Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode!
|
|
673
|
-
*
|
|
674
|
-
* Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`:
|
|
675
|
-
* - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that
|
|
676
|
-
* - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged
|
|
677
|
-
* - `'user'`: just user arguments
|
|
678
|
-
*
|
|
679
|
-
* @example
|
|
680
|
-
* ```
|
|
681
|
-
* await program.parseAsync(); // parse process.argv and auto-detect electron and special node flags
|
|
682
|
-
* await program.parseAsync(process.argv); // assume argv[0] is app and argv[1] is script
|
|
683
|
-
* await program.parseAsync(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]
|
|
684
|
-
* ```
|
|
685
|
-
*
|
|
686
|
-
* @returns Promise
|
|
687
|
-
*/
|
|
688
|
-
parseAsync(argv?: readonly string[], parseOptions?: ParseOptions): Promise<this>;
|
|
689
|
-
/**
|
|
690
|
-
* Called the first time parse is called to save state and allow a restore before subsequent calls to parse.
|
|
691
|
-
* Not usually called directly, but available for subclasses to save their custom state.
|
|
692
|
-
*
|
|
693
|
-
* This is called in a lazy way. Only commands used in parsing chain will have state saved.
|
|
694
|
-
*/
|
|
695
|
-
saveStateBeforeParse(): void;
|
|
696
|
-
/**
|
|
697
|
-
* Restore state before parse for calls after the first.
|
|
698
|
-
* Not usually called directly, but available for subclasses to save their custom state.
|
|
699
|
-
*
|
|
700
|
-
* This is called in a lazy way. Only commands used in parsing chain will have state restored.
|
|
701
|
-
*/
|
|
702
|
-
restoreStateBeforeParse(): void;
|
|
703
|
-
/**
|
|
704
|
-
* Parse options from `argv` removing known options,
|
|
705
|
-
* and return argv split into operands and unknown arguments.
|
|
706
|
-
*
|
|
707
|
-
* Side effects: modifies command by storing options. Does not reset state if called again.
|
|
708
|
-
*
|
|
709
|
-
* argv => operands, unknown
|
|
710
|
-
* --known kkk op => [op], []
|
|
711
|
-
* op --known kkk => [op], []
|
|
712
|
-
* sub --unknown uuu op => [sub], [--unknown uuu op]
|
|
713
|
-
* sub -- --unknown uuu op => [sub --unknown uuu op], []
|
|
714
|
-
*/
|
|
715
|
-
parseOptions(argv: string[]): ParseOptionsResult;
|
|
716
|
-
/**
|
|
717
|
-
* Return an object containing local option values as key-value pairs
|
|
718
|
-
*/
|
|
719
|
-
opts<T extends OptionValues>(): T;
|
|
720
|
-
/**
|
|
721
|
-
* Return an object containing merged local and global option values as key-value pairs.
|
|
722
|
-
*/
|
|
723
|
-
optsWithGlobals<T extends OptionValues>(): T;
|
|
724
|
-
/**
|
|
725
|
-
* Set the description.
|
|
726
|
-
*
|
|
727
|
-
* @returns `this` command for chaining
|
|
728
|
-
*/
|
|
729
|
-
description(str: string): this;
|
|
730
|
-
/** @deprecated since v8, instead use .argument to add command argument with description */
|
|
731
|
-
description(str: string, argsDescription: Record<string, string>): this;
|
|
732
|
-
/**
|
|
733
|
-
* Get the description.
|
|
734
|
-
*/
|
|
735
|
-
description(): string;
|
|
736
|
-
/**
|
|
737
|
-
* Set the summary. Used when listed as subcommand of parent.
|
|
738
|
-
*
|
|
739
|
-
* @returns `this` command for chaining
|
|
740
|
-
*/
|
|
741
|
-
summary(str: string): this;
|
|
742
|
-
/**
|
|
743
|
-
* Get the summary.
|
|
744
|
-
*/
|
|
745
|
-
summary(): string;
|
|
746
|
-
/**
|
|
747
|
-
* Set an alias for the command.
|
|
748
|
-
*
|
|
749
|
-
* You may call more than once to add multiple aliases. Only the first alias is shown in the auto-generated help.
|
|
750
|
-
*
|
|
751
|
-
* @returns `this` command for chaining
|
|
752
|
-
*/
|
|
753
|
-
alias(alias: string): this;
|
|
754
|
-
/**
|
|
755
|
-
* Get alias for the command.
|
|
756
|
-
*/
|
|
757
|
-
alias(): string;
|
|
758
|
-
/**
|
|
759
|
-
* Set aliases for the command.
|
|
760
|
-
*
|
|
761
|
-
* Only the first alias is shown in the auto-generated help.
|
|
762
|
-
*
|
|
763
|
-
* @returns `this` command for chaining
|
|
764
|
-
*/
|
|
765
|
-
aliases(aliases: readonly string[]): this;
|
|
766
|
-
/**
|
|
767
|
-
* Get aliases for the command.
|
|
768
|
-
*/
|
|
769
|
-
aliases(): string[];
|
|
770
|
-
/**
|
|
771
|
-
* Set the command usage.
|
|
772
|
-
*
|
|
773
|
-
* @returns `this` command for chaining
|
|
774
|
-
*/
|
|
775
|
-
usage(str: string): this;
|
|
776
|
-
/**
|
|
777
|
-
* Get the command usage.
|
|
778
|
-
*/
|
|
779
|
-
usage(): string;
|
|
780
|
-
/**
|
|
781
|
-
* Set the name of the command.
|
|
782
|
-
*
|
|
783
|
-
* @returns `this` command for chaining
|
|
784
|
-
*/
|
|
785
|
-
name(str: string): this;
|
|
786
|
-
/**
|
|
787
|
-
* Get the name of the command.
|
|
788
|
-
*/
|
|
789
|
-
name(): string;
|
|
790
|
-
/**
|
|
791
|
-
* Set the name of the command from script filename, such as process.argv[1],
|
|
792
|
-
* or require.main.filename, or __filename.
|
|
793
|
-
*
|
|
794
|
-
* (Used internally and public although not documented in README.)
|
|
795
|
-
*
|
|
796
|
-
* @example
|
|
797
|
-
* ```ts
|
|
798
|
-
* program.nameFromFilename(require.main.filename);
|
|
799
|
-
* ```
|
|
800
|
-
*
|
|
801
|
-
* @returns `this` command for chaining
|
|
802
|
-
*/
|
|
803
|
-
nameFromFilename(filename: string): this;
|
|
804
|
-
/**
|
|
805
|
-
* Set the directory for searching for executable subcommands of this command.
|
|
806
|
-
*
|
|
807
|
-
* @example
|
|
808
|
-
* ```ts
|
|
809
|
-
* program.executableDir(__dirname);
|
|
810
|
-
* // or
|
|
811
|
-
* program.executableDir('subcommands');
|
|
812
|
-
* ```
|
|
813
|
-
*
|
|
814
|
-
* @returns `this` command for chaining
|
|
815
|
-
*/
|
|
816
|
-
executableDir(path: string): this;
|
|
817
|
-
/**
|
|
818
|
-
* Get the executable search directory.
|
|
819
|
-
*/
|
|
820
|
-
executableDir(): string | null;
|
|
821
|
-
/**
|
|
822
|
-
* Set the help group heading for this subcommand in parent command's help.
|
|
823
|
-
*
|
|
824
|
-
* @returns `this` command for chaining
|
|
825
|
-
*/
|
|
826
|
-
helpGroup(heading: string): this;
|
|
827
|
-
/**
|
|
828
|
-
* Get the help group heading for this subcommand in parent command's help.
|
|
829
|
-
*/
|
|
830
|
-
helpGroup(): string;
|
|
831
|
-
/**
|
|
832
|
-
* Set the default help group heading for subcommands added to this command.
|
|
833
|
-
* (This does not override a group set directly on the subcommand using .helpGroup().)
|
|
834
|
-
*
|
|
835
|
-
* @example
|
|
836
|
-
* program.commandsGroup('Development Commands:);
|
|
837
|
-
* program.command('watch')...
|
|
838
|
-
* program.command('lint')...
|
|
839
|
-
* ...
|
|
840
|
-
*
|
|
841
|
-
* @returns `this` command for chaining
|
|
842
|
-
*/
|
|
843
|
-
commandsGroup(heading: string): this;
|
|
844
|
-
/**
|
|
845
|
-
* Get the default help group heading for subcommands added to this command.
|
|
846
|
-
*/
|
|
847
|
-
commandsGroup(): string;
|
|
848
|
-
/**
|
|
849
|
-
* Set the default help group heading for options added to this command.
|
|
850
|
-
* (This does not override a group set directly on the option using .helpGroup().)
|
|
851
|
-
*
|
|
852
|
-
* @example
|
|
853
|
-
* program
|
|
854
|
-
* .optionsGroup('Development Options:')
|
|
855
|
-
* .option('-d, --debug', 'output extra debugging')
|
|
856
|
-
* .option('-p, --profile', 'output profiling information')
|
|
857
|
-
*
|
|
858
|
-
* @returns `this` command for chaining
|
|
859
|
-
*/
|
|
860
|
-
optionsGroup(heading: string): this;
|
|
861
|
-
/**
|
|
862
|
-
* Get the default help group heading for options added to this command.
|
|
863
|
-
*/
|
|
864
|
-
optionsGroup(): string;
|
|
865
|
-
/**
|
|
866
|
-
* Output help information for this command.
|
|
867
|
-
*
|
|
868
|
-
* Outputs built-in help, and custom text added using `.addHelpText()`.
|
|
869
|
-
*
|
|
870
|
-
*/
|
|
871
|
-
outputHelp(context?: HelpContext): void;
|
|
872
|
-
/** @deprecated since v7 */
|
|
873
|
-
outputHelp(cb: (str: string) => string): void;
|
|
874
|
-
/**
|
|
875
|
-
* Return command help documentation.
|
|
876
|
-
*/
|
|
877
|
-
helpInformation(context?: HelpContext): string;
|
|
878
|
-
/**
|
|
879
|
-
* You can pass in flags and a description to override the help
|
|
880
|
-
* flags and help description for your command. Pass in false
|
|
881
|
-
* to disable the built-in help option.
|
|
882
|
-
*/
|
|
883
|
-
helpOption(flags?: string | boolean, description?: string): this;
|
|
884
|
-
/**
|
|
885
|
-
* Supply your own option to use for the built-in help option.
|
|
886
|
-
* This is an alternative to using helpOption() to customise the flags and description etc.
|
|
887
|
-
*/
|
|
888
|
-
addHelpOption(option: Option): this;
|
|
889
|
-
/**
|
|
890
|
-
* Output help information and exit.
|
|
891
|
-
*
|
|
892
|
-
* Outputs built-in help, and custom text added using `.addHelpText()`.
|
|
893
|
-
*/
|
|
894
|
-
help(context?: HelpContext): never;
|
|
895
|
-
/** @deprecated since v7 */
|
|
896
|
-
help(cb: (str: string) => string): never;
|
|
897
|
-
/**
|
|
898
|
-
* Add additional text to be displayed with the built-in help.
|
|
899
|
-
*
|
|
900
|
-
* Position is 'before' or 'after' to affect just this command,
|
|
901
|
-
* and 'beforeAll' or 'afterAll' to affect this command and all its subcommands.
|
|
902
|
-
*/
|
|
903
|
-
addHelpText(position: AddHelpTextPosition, text: string): this;
|
|
904
|
-
addHelpText(position: AddHelpTextPosition, text: (context: AddHelpTextContext) => string): this;
|
|
905
|
-
/**
|
|
906
|
-
* Add a listener (callback) for when events occur. (Implemented using EventEmitter.)
|
|
907
|
-
*/
|
|
908
|
-
on(event: string | symbol, listener: (...args: any[]) => void): this;
|
|
909
|
-
}
|
|
910
|
-
interface CommandOptions$1 {
|
|
911
|
-
hidden?: boolean;
|
|
912
|
-
isDefault?: boolean;
|
|
913
|
-
/** @deprecated since v7, replaced by hidden */
|
|
914
|
-
noHelp?: boolean;
|
|
915
|
-
}
|
|
916
|
-
interface ExecutableCommandOptions extends CommandOptions$1 {
|
|
917
|
-
executableFile?: string;
|
|
918
|
-
}
|
|
919
|
-
interface ParseOptionsResult {
|
|
920
|
-
operands: string[];
|
|
921
|
-
unknown: string[];
|
|
922
|
-
}
|
|
923
|
-
//#endregion
|
|
924
21
|
//#region src/server/utils/printTable.d.ts
|
|
925
22
|
interface TableColumn {
|
|
926
23
|
label: string;
|
|
@@ -934,33 +31,6 @@ interface ObjectOptions {
|
|
|
934
31
|
declare function printObject(output?: any, options?: ObjectOptions): void;
|
|
935
32
|
declare function printTable(items: any[], columns?: TableColumn[]): void;
|
|
936
33
|
//#endregion
|
|
937
|
-
//#region src/server/services/ArtisanService.d.ts
|
|
938
|
-
declare class ArtisanService extends Command {
|
|
939
|
-
needs: Set<string>;
|
|
940
|
-
table: typeof printTable;
|
|
941
|
-
object: typeof printObject;
|
|
942
|
-
colors: chalk.Chalk & chalk.ChalkFunction & {
|
|
943
|
-
supportsColor: chalk.ColorSupport | false;
|
|
944
|
-
Level: chalk.Level;
|
|
945
|
-
Color: ("black" | "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white" | "gray" | "grey" | "blackBright" | "redBright" | "greenBright" | "yellowBright" | "blueBright" | "magentaBright" | "cyanBright" | "whiteBright") | ("bgBlack" | "bgRed" | "bgGreen" | "bgYellow" | "bgBlue" | "bgMagenta" | "bgCyan" | "bgWhite" | "bgGray" | "bgGrey" | "bgBlackBright" | "bgRedBright" | "bgGreenBright" | "bgYellowBright" | "bgBlueBright" | "bgMagentaBright" | "bgCyanBright" | "bgWhiteBright");
|
|
946
|
-
ForegroundColor: "black" | "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white" | "gray" | "grey" | "blackBright" | "redBright" | "greenBright" | "yellowBright" | "blueBright" | "magentaBright" | "cyanBright" | "whiteBright";
|
|
947
|
-
BackgroundColor: "bgBlack" | "bgRed" | "bgGreen" | "bgYellow" | "bgBlue" | "bgMagenta" | "bgCyan" | "bgWhite" | "bgGray" | "bgGrey" | "bgBlackBright" | "bgRedBright" | "bgGreenBright" | "bgYellowBright" | "bgBlueBright" | "bgMagentaBright" | "bgCyanBright" | "bgWhiteBright";
|
|
948
|
-
Modifiers: "reset" | "bold" | "dim" | "italic" | "underline" | "inverse" | "hidden" | "strikethrough" | "visible";
|
|
949
|
-
stderr: chalk.Chalk & {
|
|
950
|
-
supportsColor: chalk.ColorSupport | false;
|
|
951
|
-
};
|
|
952
|
-
};
|
|
953
|
-
need(...args: string[]): this;
|
|
954
|
-
createCommand(name?: string): ArtisanService;
|
|
955
|
-
}
|
|
956
|
-
//#endregion
|
|
957
|
-
//#region src/server/services/ArtisanTesterService.d.ts
|
|
958
|
-
declare class ArteTesterService extends ArtisanService {
|
|
959
|
-
constructor();
|
|
960
|
-
add(path: string): Promise<void>;
|
|
961
|
-
execute(args: string[]): Promise<void>;
|
|
962
|
-
}
|
|
963
|
-
//#endregion
|
|
964
34
|
//#region src/shared/services/ConfigService.d.ts
|
|
965
35
|
interface Entry {
|
|
966
36
|
key: string;
|
|
@@ -968,6 +38,7 @@ interface Entry {
|
|
|
968
38
|
source: string;
|
|
969
39
|
}
|
|
970
40
|
declare class ConfigService {
|
|
41
|
+
static __container_entry_key: string;
|
|
971
42
|
entries: Map<string, Entry>;
|
|
972
43
|
constructor();
|
|
973
44
|
list(): Entry[];
|
|
@@ -981,6 +52,7 @@ declare class ConfigService {
|
|
|
981
52
|
set(key: string, value: any, source?: string): void;
|
|
982
53
|
unset(key: string): void;
|
|
983
54
|
clear(): void;
|
|
55
|
+
dump(): Record<string, any>;
|
|
984
56
|
}
|
|
985
57
|
//#endregion
|
|
986
58
|
//#region src/shared/services/ContainerService.d.ts
|
|
@@ -990,6 +62,7 @@ declare class ContainerService {
|
|
|
990
62
|
private entries;
|
|
991
63
|
loadFromRecord(record: Record<string, any>): void;
|
|
992
64
|
toRecord(): Record<string, any>;
|
|
65
|
+
private getKey;
|
|
993
66
|
set(payload: EntryKey, value: any): this;
|
|
994
67
|
has(payload: EntryKey): boolean;
|
|
995
68
|
get<T>(payload: EntryKey): T;
|
|
@@ -1001,6 +74,7 @@ declare class ContainerService {
|
|
|
1001
74
|
//#endregion
|
|
1002
75
|
//#region src/shared/services/LoggerService.d.ts
|
|
1003
76
|
declare class LoggerService {
|
|
77
|
+
static __container_entry_key: string;
|
|
1004
78
|
info(message: string, meta?: any): void;
|
|
1005
79
|
debug(message: string, meta?: any): void;
|
|
1006
80
|
warn(message: string, meta?: any): void;
|
|
@@ -1027,10 +101,14 @@ interface EmmitterServiceOptions {
|
|
|
1027
101
|
logger?: LoggerService;
|
|
1028
102
|
}
|
|
1029
103
|
declare class EmmitterService$1<Events extends Record<string, any> = Record<string, any>> {
|
|
104
|
+
static __container_entry_key: string;
|
|
1030
105
|
private handlers;
|
|
1031
106
|
private debug;
|
|
1032
107
|
private logger;
|
|
1033
|
-
|
|
108
|
+
constructor(options?: EmmitterServiceOptions);
|
|
109
|
+
static create<Events extends Record<string, any> = Record<string, any>>(options?: EmmitterServiceOptions): EmmitterService$1<Events>;
|
|
110
|
+
setDebug(debug: boolean): void;
|
|
111
|
+
setLogger(logger: LoggerService): void;
|
|
1034
112
|
on<K extends keyof Events>(event: K, listener: (args: Events[K]) => void, options?: OnOptions): EmmitterHandler;
|
|
1035
113
|
on(event: string, listener: (args: any) => void, options?: OnOptions): EmmitterHandler;
|
|
1036
114
|
once<K extends keyof Events>(event: K, listener: (args: Events[K]) => void, options?: OnOptions): EmmitterHandler;
|
|
@@ -1054,20 +132,90 @@ declare class EmmitterService$1<Events extends Record<string, any> = Record<stri
|
|
|
1054
132
|
//#region src/shared/entities/LifecycleHook.d.ts
|
|
1055
133
|
declare class LifecycleHook {
|
|
1056
134
|
hook_id: string;
|
|
135
|
+
hook_aliases?: string[];
|
|
1057
136
|
order?: number;
|
|
1058
137
|
subhooks?: LifecycleHook[];
|
|
1059
|
-
|
|
138
|
+
register(): Promise<void>;
|
|
139
|
+
load(): Promise<void>;
|
|
140
|
+
boot(): Promise<void>;
|
|
141
|
+
shutdown(): Promise<void>;
|
|
142
|
+
/** @deprecated Use register */
|
|
1060
143
|
onRegister(): Promise<void>;
|
|
144
|
+
/** @deprecated Use load */
|
|
1061
145
|
onLoad(): Promise<void>;
|
|
146
|
+
/** @deprecated Use boot */
|
|
1062
147
|
onBoot(): Promise<void>;
|
|
148
|
+
/** @deprecated Use shutdown */
|
|
1063
149
|
onShutdown(): Promise<void>;
|
|
1064
150
|
}
|
|
1065
151
|
//#endregion
|
|
1066
152
|
//#region src/shared/utils/compose.d.ts
|
|
1067
153
|
type Constructor<T = {}> = new (...args: any[]) => T;
|
|
1068
154
|
//#endregion
|
|
155
|
+
//#region src/shared/services/LifecycleService.d.ts
|
|
156
|
+
type LifecycleMethod = 'register' | 'load' | 'boot' | 'shutdown';
|
|
157
|
+
interface ListOptions$1 {
|
|
158
|
+
include?: string | string[];
|
|
159
|
+
exclude?: string | string[];
|
|
160
|
+
}
|
|
161
|
+
interface LifecycleServiceOptions {
|
|
162
|
+
debug?: boolean;
|
|
163
|
+
hooks?: Map<string, LifecycleHook>;
|
|
164
|
+
logger?: LoggerService;
|
|
165
|
+
onError?: (error: Error, context: {
|
|
166
|
+
hookId: string;
|
|
167
|
+
method: LifecycleMethod;
|
|
168
|
+
}) => void;
|
|
169
|
+
}
|
|
170
|
+
declare class LifecycleService$1 {
|
|
171
|
+
static __container_entry_key: string;
|
|
172
|
+
hooks: Map<string, LifecycleHook>;
|
|
173
|
+
logger: LoggerService;
|
|
174
|
+
debug: boolean;
|
|
175
|
+
constructor(data?: LifecycleServiceOptions);
|
|
176
|
+
onError(error: Error, context: {
|
|
177
|
+
hookId: string;
|
|
178
|
+
method: LifecycleMethod;
|
|
179
|
+
}): void;
|
|
180
|
+
mapAliases(args: string[]): string[];
|
|
181
|
+
list(options?: ListOptions$1): LifecycleHook[];
|
|
182
|
+
add(...payload: (LifecycleHook | Constructor<LifecycleHook>)[]): void;
|
|
183
|
+
emitMethod(method: LifecycleMethod, options?: ListOptions$1): Promise<void>;
|
|
184
|
+
emit(payload: LifecycleMethod | LifecycleMethod[], options?: ListOptions$1): Promise<void>;
|
|
185
|
+
register(options?: ListOptions$1): Promise<void>;
|
|
186
|
+
load(options?: ListOptions$1): Promise<void>;
|
|
187
|
+
boot(options?: ListOptions$1): Promise<void>;
|
|
188
|
+
shutdown(options?: ListOptions$1): Promise<void>;
|
|
189
|
+
clear(): void;
|
|
190
|
+
}
|
|
191
|
+
//#endregion
|
|
192
|
+
//#region src/shared/schemas/permissionAssignmentSchema.d.ts
|
|
193
|
+
type PermissionAssignment = v.InferOutput<typeof permissionAssignmentSchema>;
|
|
194
|
+
declare const permissionAssignmentSchema: v.ObjectSchema<{
|
|
195
|
+
readonly id: v.NumberSchema<undefined>;
|
|
196
|
+
readonly permission_id: v.NumberSchema<undefined>;
|
|
197
|
+
readonly assignable_type: v.StringSchema<undefined>;
|
|
198
|
+
readonly assignable_id: v.StringSchema<undefined>;
|
|
199
|
+
readonly created_at: v.StringSchema<undefined>;
|
|
200
|
+
readonly updated_at: v.StringSchema<undefined>;
|
|
201
|
+
}, undefined>;
|
|
202
|
+
//#endregion
|
|
203
|
+
//#region src/shared/schemas/permissionSchema.d.ts
|
|
204
|
+
type Permission = v.InferOutput<typeof permissionSchema>;
|
|
205
|
+
declare const permissionSchema: v.ObjectSchema<{
|
|
206
|
+
readonly id: v.NumberSchema<undefined>;
|
|
207
|
+
readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
208
|
+
readonly description: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
209
|
+
readonly action: v.StringSchema<undefined>;
|
|
210
|
+
readonly subject: v.StringSchema<undefined>;
|
|
211
|
+
readonly conditions: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
212
|
+
readonly created_at: v.StringSchema<undefined>;
|
|
213
|
+
readonly updated_at: v.StringSchema<undefined>;
|
|
214
|
+
readonly expires_at: v.StringSchema<undefined>;
|
|
215
|
+
}, undefined>;
|
|
216
|
+
//#endregion
|
|
1069
217
|
//#region src/shared/schemas/tokenSchema.d.ts
|
|
1070
|
-
type Token = v.InferOutput<typeof tokenSchema>;
|
|
218
|
+
type Token$1 = v.InferOutput<typeof tokenSchema>;
|
|
1071
219
|
declare const tokenSchema: v.ObjectSchema<{
|
|
1072
220
|
readonly id: v.NumberSchema<undefined>;
|
|
1073
221
|
readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
@@ -1079,8 +227,131 @@ declare const tokenSchema: v.ObjectSchema<{
|
|
|
1079
227
|
readonly expires_at: v.StringSchema<undefined>;
|
|
1080
228
|
}, undefined>;
|
|
1081
229
|
//#endregion
|
|
1082
|
-
//#region src/shared/
|
|
1083
|
-
|
|
230
|
+
//#region src/shared/mixins/HooksMixin.d.ts
|
|
231
|
+
interface Listener {
|
|
232
|
+
event: string;
|
|
233
|
+
listener: (...args: any[]) => void;
|
|
234
|
+
}
|
|
235
|
+
//#endregion
|
|
236
|
+
//#region src/shared/entities/PermissionEntity.d.ts
|
|
237
|
+
declare const PermissionEntity_base: {
|
|
238
|
+
new (...args: any[]): {
|
|
239
|
+
merge(data: Partial< /*elided*/any>): /*elided*/any;
|
|
240
|
+
};
|
|
241
|
+
from<T>(this: new () => T, data: Partial<T>): T;
|
|
242
|
+
} & Constructor;
|
|
243
|
+
declare class PermissionEntity extends PermissionEntity_base {
|
|
244
|
+
id: number;
|
|
245
|
+
name: string;
|
|
246
|
+
description: string | null;
|
|
247
|
+
origin: string;
|
|
248
|
+
subject: string;
|
|
249
|
+
action: string;
|
|
250
|
+
conditions: string | null | Record<string, any>;
|
|
251
|
+
get editable(): boolean;
|
|
252
|
+
get parsedConditions(): any;
|
|
253
|
+
}
|
|
254
|
+
//#endregion
|
|
255
|
+
//#region src/shared/entities/AclEntity.d.ts
|
|
256
|
+
declare class AclEntity {
|
|
257
|
+
static __container_entry_key: string;
|
|
258
|
+
ability: ReturnType<typeof defineAbility>;
|
|
259
|
+
permissions: PermissionEntity[];
|
|
260
|
+
debug: boolean;
|
|
261
|
+
logger: LoggerService;
|
|
262
|
+
constructor(data?: Partial<AclEntity>);
|
|
263
|
+
can(action: string, subject: any, object?: Record<string, any>): boolean;
|
|
264
|
+
cannot(action: string, subject: any, object?: Record<string, any>): boolean;
|
|
265
|
+
subject(subject: string, object: Record<string, any>): Record<string, any> & _$_casl_ability0.ForcedSubject<string>;
|
|
266
|
+
}
|
|
267
|
+
//#endregion
|
|
268
|
+
//#region src/shared/entities/CookieMapEntity.d.ts
|
|
269
|
+
interface CookieMapEntityOptions {
|
|
270
|
+
cookies?: Map<string, string>;
|
|
271
|
+
prefix?: string;
|
|
272
|
+
}
|
|
273
|
+
declare class CookieMapEntity$1 {
|
|
274
|
+
static __container_entry_key: string;
|
|
275
|
+
cookies: Map<string, string>;
|
|
276
|
+
prefix: string;
|
|
277
|
+
constructor(data?: CookieMapEntityOptions);
|
|
278
|
+
load(cookies: Record<string, string> | Map<string, string>): void;
|
|
279
|
+
get(name: string, defaultValue?: string | null): string | null;
|
|
280
|
+
set(name: string, value: string, options?: any): void;
|
|
281
|
+
toRecord(): Record<string, string>;
|
|
282
|
+
}
|
|
283
|
+
//#endregion
|
|
284
|
+
//#region src/shared/entities/DriveConfigEntity.d.ts
|
|
285
|
+
declare class DriveConfig$1 {
|
|
286
|
+
static get TYPES(): ({
|
|
287
|
+
id: string;
|
|
288
|
+
label: any;
|
|
289
|
+
description: any;
|
|
290
|
+
config_fields: {
|
|
291
|
+
directory: {
|
|
292
|
+
component: string;
|
|
293
|
+
label: any;
|
|
294
|
+
description: any;
|
|
295
|
+
hint: any;
|
|
296
|
+
};
|
|
297
|
+
accessKeyId?: undefined;
|
|
298
|
+
secretAccessKey?: undefined;
|
|
299
|
+
bucket?: undefined;
|
|
300
|
+
region?: undefined;
|
|
301
|
+
prefix?: undefined;
|
|
302
|
+
endpoint?: undefined;
|
|
303
|
+
};
|
|
304
|
+
} | {
|
|
305
|
+
id: string;
|
|
306
|
+
label: string;
|
|
307
|
+
description: any;
|
|
308
|
+
config_fields: {
|
|
309
|
+
accessKeyId: {
|
|
310
|
+
component: string;
|
|
311
|
+
label: any;
|
|
312
|
+
hint: any;
|
|
313
|
+
type: string;
|
|
314
|
+
};
|
|
315
|
+
secretAccessKey: {
|
|
316
|
+
component: string;
|
|
317
|
+
label: any;
|
|
318
|
+
hint: any;
|
|
319
|
+
type: string;
|
|
320
|
+
};
|
|
321
|
+
bucket: {
|
|
322
|
+
component: string;
|
|
323
|
+
label: any;
|
|
324
|
+
hint: any;
|
|
325
|
+
};
|
|
326
|
+
region: {
|
|
327
|
+
component: string;
|
|
328
|
+
label: any;
|
|
329
|
+
hint: any;
|
|
330
|
+
};
|
|
331
|
+
prefix: {
|
|
332
|
+
component: string;
|
|
333
|
+
label: any;
|
|
334
|
+
hint: any;
|
|
335
|
+
};
|
|
336
|
+
endpoint: {
|
|
337
|
+
component: string;
|
|
338
|
+
label: any;
|
|
339
|
+
hint: any;
|
|
340
|
+
};
|
|
341
|
+
directory?: undefined;
|
|
342
|
+
};
|
|
343
|
+
})[];
|
|
344
|
+
id: string;
|
|
345
|
+
name: string;
|
|
346
|
+
type: string;
|
|
347
|
+
is_default: boolean;
|
|
348
|
+
config: Record<string, any>;
|
|
349
|
+
constructor(data: DriveConfig$1);
|
|
350
|
+
get config_fields(): {};
|
|
351
|
+
}
|
|
352
|
+
//#endregion
|
|
353
|
+
//#region src/shared/entities/DriveEntryEntity.d.ts
|
|
354
|
+
declare class DriveEntry {
|
|
1084
355
|
name: string;
|
|
1085
356
|
path: string;
|
|
1086
357
|
type: 'file' | 'directory';
|
|
@@ -1088,6 +359,58 @@ declare class DriveEntry {
|
|
|
1088
359
|
constructor(data: DriveEntry);
|
|
1089
360
|
}
|
|
1090
361
|
//#endregion
|
|
362
|
+
//#region src/shared/entities/FileEntity.d.ts
|
|
363
|
+
declare const FileEntity_base: {
|
|
364
|
+
new (...args: any[]): {
|
|
365
|
+
merge(data: Partial< /*elided*/any>): /*elided*/any;
|
|
366
|
+
};
|
|
367
|
+
from<T>(this: new () => T, data: Partial<T>): T;
|
|
368
|
+
} & Constructor & {
|
|
369
|
+
new (...args: any[]): {
|
|
370
|
+
created_at: Date | string;
|
|
371
|
+
updated_at: Date | string;
|
|
372
|
+
};
|
|
373
|
+
} & {
|
|
374
|
+
new (...args: any[]): {
|
|
375
|
+
deleted_at: Date | string | null;
|
|
376
|
+
};
|
|
377
|
+
};
|
|
378
|
+
declare class FileEntity extends FileEntity_base {
|
|
379
|
+
id: number;
|
|
380
|
+
drive: string;
|
|
381
|
+
mimetype: string;
|
|
382
|
+
purpose: string;
|
|
383
|
+
client_name: string;
|
|
384
|
+
filename: string;
|
|
385
|
+
public: boolean;
|
|
386
|
+
url?: string;
|
|
387
|
+
metas?: Record<string, any>;
|
|
388
|
+
isImage(): boolean;
|
|
389
|
+
}
|
|
390
|
+
//#endregion
|
|
391
|
+
//#region src/shared/entities/FileMetaEntity.d.ts
|
|
392
|
+
declare const FileMeta_base$1: {
|
|
393
|
+
new (...args: any[]): {
|
|
394
|
+
merge(data: Partial< /*elided*/any>): /*elided*/any;
|
|
395
|
+
};
|
|
396
|
+
from<T>(this: new () => T, data: Partial<T>): T;
|
|
397
|
+
} & Constructor & {
|
|
398
|
+
new (...args: any[]): {
|
|
399
|
+
created_at: Date | string;
|
|
400
|
+
updated_at: Date | string;
|
|
401
|
+
};
|
|
402
|
+
} & {
|
|
403
|
+
new (...args: any[]): {
|
|
404
|
+
deleted_at: Date | string | null;
|
|
405
|
+
};
|
|
406
|
+
};
|
|
407
|
+
declare class FileMeta$1 extends FileMeta_base$1 {
|
|
408
|
+
id: number;
|
|
409
|
+
file_id: number;
|
|
410
|
+
name: string;
|
|
411
|
+
value: string | null;
|
|
412
|
+
}
|
|
413
|
+
//#endregion
|
|
1091
414
|
//#region src/shared/entities/ModuleManifestEntity.d.ts
|
|
1092
415
|
interface ModuleManifestBuildImport {
|
|
1093
416
|
from: string;
|
|
@@ -1137,8 +460,132 @@ declare class Module$1 extends Module_base$1 {
|
|
|
1137
460
|
setData(data: Partial<Module$1 | ModuleManifest>): void;
|
|
1138
461
|
}
|
|
1139
462
|
//#endregion
|
|
1140
|
-
//#region src/
|
|
1141
|
-
declare class
|
|
463
|
+
//#region src/shared/entities/PaginationEntity.d.ts
|
|
464
|
+
declare class PaginationEntity<T = Record<string, any>> {
|
|
465
|
+
items: T[];
|
|
466
|
+
total: number;
|
|
467
|
+
page: number;
|
|
468
|
+
per_page: number;
|
|
469
|
+
total_pages: number;
|
|
470
|
+
constructor(data: Partial<PaginationEntity>);
|
|
471
|
+
static from<T = Record<string, string>>(payload: Partial<PaginationEntity<T>>): PaginationEntity<T>;
|
|
472
|
+
}
|
|
473
|
+
//#endregion
|
|
474
|
+
//#region src/shared/entities/PluginEntity.d.ts
|
|
475
|
+
declare const PluginEntity_base: {
|
|
476
|
+
new (...args: any[]): {
|
|
477
|
+
merge(data: Partial< /*elided*/any>): /*elided*/any;
|
|
478
|
+
};
|
|
479
|
+
from<T>(this: new () => T, data: Partial<T>): T;
|
|
480
|
+
} & Constructor;
|
|
481
|
+
declare class PluginEntity$1 extends PluginEntity_base {
|
|
482
|
+
id: string;
|
|
483
|
+
name: string;
|
|
484
|
+
version: string;
|
|
485
|
+
enabled: boolean;
|
|
486
|
+
aliases: string[];
|
|
487
|
+
}
|
|
488
|
+
//#endregion
|
|
489
|
+
//#region src/shared/entities/RoleEntity.d.ts
|
|
490
|
+
declare const Role_base: {
|
|
491
|
+
new (...args: any[]): {
|
|
492
|
+
merge(data: Partial< /*elided*/any>): /*elided*/any;
|
|
493
|
+
};
|
|
494
|
+
from<T>(this: new () => T, data: Partial<T>): T;
|
|
495
|
+
} & Constructor & {
|
|
496
|
+
new (...args: any[]): {
|
|
497
|
+
created_at: Date | string;
|
|
498
|
+
updated_at: Date | string;
|
|
499
|
+
};
|
|
500
|
+
} & {
|
|
501
|
+
new (...args: any[]): {
|
|
502
|
+
deleted_at: Date | string | null;
|
|
503
|
+
};
|
|
504
|
+
};
|
|
505
|
+
declare class Role extends Role_base {
|
|
506
|
+
id: number;
|
|
507
|
+
name: string;
|
|
508
|
+
description?: string;
|
|
509
|
+
}
|
|
510
|
+
//#endregion
|
|
511
|
+
//#region src/shared/entities/UserEntity.d.ts
|
|
512
|
+
declare const UserEntity_base: {
|
|
513
|
+
new (...args: any[]): {
|
|
514
|
+
merge(data: Partial< /*elided*/any>): /*elided*/any;
|
|
515
|
+
};
|
|
516
|
+
from<T>(this: new () => T, data: Partial<T>): T;
|
|
517
|
+
} & Constructor & {
|
|
518
|
+
new (...args: any[]): {
|
|
519
|
+
created_at: Date | string;
|
|
520
|
+
updated_at: Date | string;
|
|
521
|
+
};
|
|
522
|
+
} & {
|
|
523
|
+
new (...args: any[]): {
|
|
524
|
+
deleted_at: Date | string | null;
|
|
525
|
+
};
|
|
526
|
+
};
|
|
527
|
+
declare class UserEntity$1 extends UserEntity_base {
|
|
528
|
+
id: number;
|
|
529
|
+
email: string;
|
|
530
|
+
name: string;
|
|
531
|
+
username: string;
|
|
532
|
+
password?: string;
|
|
533
|
+
verified_at?: Date | string | null;
|
|
534
|
+
permissions?: PermissionEntity[];
|
|
535
|
+
roles?: Role[];
|
|
536
|
+
get initials(): string;
|
|
537
|
+
}
|
|
538
|
+
//#endregion
|
|
539
|
+
//#region src/server/services/CliService.d.ts
|
|
540
|
+
interface CliEvents {
|
|
541
|
+
'cli:registered': {
|
|
542
|
+
cli: CliService;
|
|
543
|
+
};
|
|
544
|
+
}
|
|
545
|
+
declare class CliCommand extends Command {
|
|
546
|
+
__is_cli_command: boolean;
|
|
547
|
+
table: typeof printTable;
|
|
548
|
+
object: typeof printObject;
|
|
549
|
+
colors: chalk.Chalk & chalk.ChalkFunction & {
|
|
550
|
+
supportsColor: chalk.ColorSupport | false;
|
|
551
|
+
Level: chalk.Level;
|
|
552
|
+
Color: ("black" | "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white" | "gray" | "grey" | "blackBright" | "redBright" | "greenBright" | "yellowBright" | "blueBright" | "magentaBright" | "cyanBright" | "whiteBright") | ("bgBlack" | "bgRed" | "bgGreen" | "bgYellow" | "bgBlue" | "bgMagenta" | "bgCyan" | "bgWhite" | "bgGray" | "bgGrey" | "bgBlackBright" | "bgRedBright" | "bgGreenBright" | "bgYellowBright" | "bgBlueBright" | "bgMagentaBright" | "bgCyanBright" | "bgWhiteBright");
|
|
553
|
+
ForegroundColor: "black" | "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white" | "gray" | "grey" | "blackBright" | "redBright" | "greenBright" | "yellowBright" | "blueBright" | "magentaBright" | "cyanBright" | "whiteBright";
|
|
554
|
+
BackgroundColor: "bgBlack" | "bgRed" | "bgGreen" | "bgYellow" | "bgBlue" | "bgMagenta" | "bgCyan" | "bgWhite" | "bgGray" | "bgGrey" | "bgBlackBright" | "bgRedBright" | "bgGreenBright" | "bgYellowBright" | "bgBlueBright" | "bgMagentaBright" | "bgCyanBright" | "bgWhiteBright";
|
|
555
|
+
Modifiers: "reset" | "bold" | "dim" | "italic" | "underline" | "inverse" | "hidden" | "strikethrough" | "visible";
|
|
556
|
+
stderr: chalk.Chalk & {
|
|
557
|
+
supportsColor: chalk.ColorSupport | false;
|
|
558
|
+
};
|
|
559
|
+
};
|
|
560
|
+
needs: Set<string>;
|
|
561
|
+
need(...args: string[]): this;
|
|
562
|
+
createCommand(name?: string): CliCommand;
|
|
563
|
+
}
|
|
564
|
+
declare class CliService extends CliCommand {
|
|
565
|
+
static __container_entry_key: string;
|
|
566
|
+
dirs: Set<string>;
|
|
567
|
+
logger: LoggerService;
|
|
568
|
+
emmitter: EmmitterService$1<Record<string, any>>;
|
|
569
|
+
debug: boolean;
|
|
570
|
+
static create(name?: string): CliService;
|
|
571
|
+
setLogger(logger: LoggerService): this;
|
|
572
|
+
setDebug(debug: boolean): this;
|
|
573
|
+
setEmmitter(emmitter: EmmitterService$1): this;
|
|
574
|
+
createCommand(name?: string): CliService;
|
|
575
|
+
addDir(dir: string): this;
|
|
576
|
+
loadDir(dir: string): Promise<void>;
|
|
577
|
+
load(): Promise<this>;
|
|
578
|
+
}
|
|
579
|
+
//#endregion
|
|
580
|
+
//#region src/server/services/CliTesterService.d.ts
|
|
581
|
+
declare class ArteTesterService extends CliService {
|
|
582
|
+
constructor();
|
|
583
|
+
add(path: string): Promise<void>;
|
|
584
|
+
execute(args: string[]): Promise<void>;
|
|
585
|
+
}
|
|
586
|
+
//#endregion
|
|
587
|
+
//#region src/server/services/CliWrapperService.d.ts
|
|
588
|
+
declare class CliWrapperService {
|
|
1142
589
|
process: cp.ChildProcess | null;
|
|
1143
590
|
appBasePath: string;
|
|
1144
591
|
env: Map<string, any>;
|
|
@@ -1147,6 +594,7 @@ declare class ArtisanWrapperService {
|
|
|
1147
594
|
configFiles: string[];
|
|
1148
595
|
debug: boolean;
|
|
1149
596
|
logger: LoggerService;
|
|
597
|
+
static create(): CliWrapperService;
|
|
1150
598
|
setBasePath(path: string): this;
|
|
1151
599
|
setDebug(debug: boolean): this;
|
|
1152
600
|
setLogger(logger: LoggerService): this;
|
|
@@ -1156,22 +604,26 @@ declare class ArtisanWrapperService {
|
|
|
1156
604
|
loadConfigArguments(): void;
|
|
1157
605
|
loadConfigFiles(): void;
|
|
1158
606
|
loadEnvironment(): void;
|
|
1159
|
-
loadArguments(): void;
|
|
607
|
+
loadArguments(args?: string[]): void;
|
|
1160
608
|
kill(code?: number): void;
|
|
1161
|
-
run(): Promise<void>;
|
|
609
|
+
run(args?: string[]): Promise<void>;
|
|
1162
610
|
}
|
|
1163
611
|
//#endregion
|
|
1164
612
|
//#region src/server/services/ConfigFSService.d.ts
|
|
1165
|
-
interface
|
|
613
|
+
interface ConfigFSServiceOptions {
|
|
1166
614
|
directory?: string;
|
|
615
|
+
format?: 'json' | 'yml';
|
|
1167
616
|
debug?: boolean;
|
|
1168
617
|
logger?: LoggerService;
|
|
1169
618
|
}
|
|
1170
619
|
declare class ConfigFSService extends ConfigService {
|
|
1171
|
-
directory: string;
|
|
1172
620
|
logger: LoggerService;
|
|
1173
621
|
debug: boolean;
|
|
1174
|
-
|
|
622
|
+
format: 'json' | 'yml';
|
|
623
|
+
directory: string;
|
|
624
|
+
constructor(options?: ConfigFSServiceOptions);
|
|
625
|
+
write(entry: string, data: any): Promise<void>;
|
|
626
|
+
writeSync(entry: string, data: any): void;
|
|
1175
627
|
load(): Promise<void>;
|
|
1176
628
|
private parseKey;
|
|
1177
629
|
set(fullKey: string, value: any, source?: string): void;
|
|
@@ -1180,21 +632,23 @@ declare class ConfigFSService extends ConfigService {
|
|
|
1180
632
|
//#endregion
|
|
1181
633
|
//#region src/server/schemas/envSchema.d.ts
|
|
1182
634
|
type EnvSchema = v.InferOutput<typeof envSchema>;
|
|
1183
|
-
declare const envSchema: v.
|
|
635
|
+
declare const envSchema: v.LooseObjectSchema<{
|
|
1184
636
|
readonly NODE_ENV: v.OptionalSchema<v.UnionSchema<[v.LiteralSchema<"development", undefined>, v.LiteralSchema<"production", undefined>, v.LiteralSchema<"test", undefined>], undefined>, "development">;
|
|
1185
637
|
readonly ZENITH_BASE_PATH: v.StringSchema<undefined>;
|
|
638
|
+
readonly ZENITH_STORAGE_PATH: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
1186
639
|
readonly ZENITH_APP_URL: v.OptionalSchema<v.StringSchema<undefined>, "http://localhost:3000">;
|
|
1187
640
|
readonly ZENITH_PORT: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TransformAction<string, number>]>, "3000">;
|
|
1188
641
|
readonly ZENITH_HOST: v.OptionalSchema<v.StringSchema<undefined>, "0.0.0.0">;
|
|
1189
642
|
readonly ZENITH_LOG_LEVEL: v.OptionalSchema<v.PicklistSchema<["error", "warn", "info", "debug"], undefined>, "info">;
|
|
1190
643
|
readonly ZENITH_LIFECYCLE_DEBUG: v.OptionalSchema<v.SchemaWithPipe<readonly [v.UnionSchema<[v.LiteralSchema<"true", undefined>, v.LiteralSchema<"false", undefined>, v.LiteralSchema<"1", undefined>, v.LiteralSchema<"0", undefined>], undefined>, v.TransformAction<"0" | "1" | "true" | "false", boolean>, v.BooleanSchema<undefined>]>, "false">;
|
|
1191
|
-
readonly ZENITH_CLIENT_CONFIG: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TransformAction<string, Record<string, any>>]>,
|
|
1192
|
-
readonly ZENITH_CONFIG: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TransformAction<string, Record<string, any>>]>,
|
|
1193
|
-
readonly ZENITH_CONFIG_ARGUMENTS: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TransformAction<string, Record<string, any>>]>,
|
|
644
|
+
readonly ZENITH_CLIENT_CONFIG: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TransformAction<string, Record<string, any>>]>, "">;
|
|
645
|
+
readonly ZENITH_CONFIG: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TransformAction<string, Record<string, any>>]>, "">;
|
|
646
|
+
readonly ZENITH_CONFIG_ARGUMENTS: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TransformAction<string, Record<string, any>>]>, "">;
|
|
1194
647
|
readonly ZENITH_CONFIG_FILES: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TransformAction<string, string[]>]>, "">;
|
|
1195
648
|
readonly ZENITH_CONFIG_DEBUG: v.OptionalSchema<v.SchemaWithPipe<readonly [v.UnionSchema<[v.LiteralSchema<"true", undefined>, v.LiteralSchema<"false", undefined>, v.LiteralSchema<"1", undefined>, v.LiteralSchema<"0", undefined>], undefined>, v.TransformAction<"0" | "1" | "true" | "false", boolean>, v.BooleanSchema<undefined>]>, "false">;
|
|
1196
649
|
readonly ZENITH_CONFIG_DRIVER: v.OptionalSchema<v.PicklistSchema<["fs", "s3"], undefined>, "fs">;
|
|
1197
650
|
readonly ZENITH_CONFIG_FS_PATH: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
651
|
+
readonly ZENITH_CONFIG_FS_FORMAT: v.OptionalSchema<v.PicklistSchema<["json", "yml"], undefined>, "json">;
|
|
1198
652
|
readonly ZENITH_CONFIG_S3_BUCKET: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
1199
653
|
readonly ZENITH_CONFIG_S3_REGION: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
1200
654
|
readonly ZENITH_CONFIG_S3_ACCESS_KEY_ID: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
@@ -1202,40 +656,18 @@ declare const envSchema: v.ObjectSchema<{
|
|
|
1202
656
|
readonly ZENITH_CONFIG_S3_SESSION_TOKEN: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
1203
657
|
readonly ZENITH_CONFIG_S3_ENDPOINT: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
1204
658
|
readonly ZENITH_CONFIG_S3_PREFIX: v.OptionalSchema<v.StringSchema<undefined>, "">;
|
|
1205
|
-
readonly
|
|
659
|
+
readonly ZENITH_PLUGINS_DIRS: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TransformAction<string, string[]>]>, undefined>;
|
|
1206
660
|
}, undefined>;
|
|
1207
661
|
//#endregion
|
|
1208
662
|
//#region src/server/services/EnvService.d.ts
|
|
1209
663
|
declare class EnvService {
|
|
1210
664
|
private env;
|
|
1211
665
|
private files;
|
|
666
|
+
static create(): EnvService;
|
|
1212
667
|
static dotEnvConfig(options?: dotenv.DotenvConfigOptions): dotenv.DotenvConfigOutput;
|
|
1213
668
|
setFiles(files: string[]): this;
|
|
1214
669
|
addFile(file: string): this;
|
|
1215
|
-
load():
|
|
1216
|
-
NODE_ENV: "development" | "production" | "test";
|
|
1217
|
-
ZENITH_BASE_PATH: string;
|
|
1218
|
-
ZENITH_APP_URL: string;
|
|
1219
|
-
ZENITH_PORT: number;
|
|
1220
|
-
ZENITH_HOST: string;
|
|
1221
|
-
ZENITH_LOG_LEVEL: "error" | "warn" | "info" | "debug";
|
|
1222
|
-
ZENITH_LIFECYCLE_DEBUG: boolean;
|
|
1223
|
-
ZENITH_CLIENT_CONFIG?: Record<string, any> | undefined;
|
|
1224
|
-
ZENITH_CONFIG?: Record<string, any> | undefined;
|
|
1225
|
-
ZENITH_CONFIG_ARGUMENTS?: Record<string, any> | undefined;
|
|
1226
|
-
ZENITH_CONFIG_FILES: string[];
|
|
1227
|
-
ZENITH_CONFIG_DEBUG: boolean;
|
|
1228
|
-
ZENITH_CONFIG_DRIVER: "fs" | "s3";
|
|
1229
|
-
ZENITH_CONFIG_FS_PATH?: string | undefined;
|
|
1230
|
-
ZENITH_CONFIG_S3_BUCKET?: string | undefined;
|
|
1231
|
-
ZENITH_CONFIG_S3_REGION?: string | undefined;
|
|
1232
|
-
ZENITH_CONFIG_S3_ACCESS_KEY_ID?: string | undefined;
|
|
1233
|
-
ZENITH_CONFIG_S3_SECRET_ACCESS_KEY?: string | undefined;
|
|
1234
|
-
ZENITH_CONFIG_S3_SESSION_TOKEN?: string | undefined;
|
|
1235
|
-
ZENITH_CONFIG_S3_ENDPOINT?: string | undefined;
|
|
1236
|
-
ZENITH_CONFIG_S3_PREFIX: string;
|
|
1237
|
-
ZENITH_MODULE_EXTRAS: string[];
|
|
1238
|
-
};
|
|
670
|
+
load(): this;
|
|
1239
671
|
get production(): boolean;
|
|
1240
672
|
get development(): boolean;
|
|
1241
673
|
get test(): boolean;
|
|
@@ -1245,11 +677,17 @@ declare class EnvService {
|
|
|
1245
677
|
}
|
|
1246
678
|
//#endregion
|
|
1247
679
|
//#region src/server/services/ConfigManagerService.d.ts
|
|
680
|
+
interface ConfigManagerOptions {
|
|
681
|
+
env: EnvService;
|
|
682
|
+
logger: LoggerService;
|
|
683
|
+
silent?: boolean;
|
|
684
|
+
}
|
|
1248
685
|
declare class ConfigManagerService {
|
|
1249
686
|
env: EnvService;
|
|
1250
687
|
logger: LoggerService;
|
|
1251
|
-
|
|
1252
|
-
|
|
688
|
+
silent: boolean;
|
|
689
|
+
constructor(options: ConfigManagerOptions);
|
|
690
|
+
static create(options: ConfigManagerOptions): ConfigManagerService;
|
|
1253
691
|
private loadS3Config;
|
|
1254
692
|
private loadFSConfig;
|
|
1255
693
|
loadConfigFromEnv(service: ConfigService): void;
|
|
@@ -1340,198 +778,188 @@ declare class ConfigS3Service extends ConfigService {
|
|
|
1340
778
|
unset(fullKey: string): void;
|
|
1341
779
|
}
|
|
1342
780
|
//#endregion
|
|
1343
|
-
//#region src/server/
|
|
1344
|
-
interface
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
};
|
|
1354
|
-
'user:after-update': {
|
|
1355
|
-
user: any;
|
|
1356
|
-
};
|
|
1357
|
-
'user:before-delete': {
|
|
1358
|
-
user: any;
|
|
1359
|
-
};
|
|
1360
|
-
'user:after-delete': {
|
|
1361
|
-
user: any;
|
|
1362
|
-
};
|
|
781
|
+
//#region src/server/services/DownloadService.d.ts
|
|
782
|
+
interface DownloadedFetchOptions extends RequestInit {
|
|
783
|
+
proxy?: string;
|
|
784
|
+
}
|
|
785
|
+
declare class DownloadService {
|
|
786
|
+
fetch(url: string, options?: DownloadedFetchOptions): Promise<_$undici.Response>;
|
|
787
|
+
stream(url: string, options?: DownloadedFetchOptions): Promise<{
|
|
788
|
+
stream: NodeJS.ReadableStream;
|
|
789
|
+
contentType: string;
|
|
790
|
+
}>;
|
|
1363
791
|
}
|
|
1364
792
|
//#endregion
|
|
1365
|
-
//#region src/server/
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
//#region src/server/gateways/GitGateway.d.ts
|
|
1369
|
-
interface GitRepoInfo {
|
|
1370
|
-
directory: string;
|
|
1371
|
-
head: string | null;
|
|
1372
|
-
shortHash: string;
|
|
1373
|
-
isDetachedHead: boolean;
|
|
1374
|
-
remotes: string[];
|
|
793
|
+
//#region src/server/contracts/DriveContract.d.ts
|
|
794
|
+
interface DriveUrlOptions {
|
|
795
|
+
expires?: ms.StringValue;
|
|
1375
796
|
}
|
|
1376
|
-
interface
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
sshKeyTmpFileName?: string;
|
|
1381
|
-
logger?: LoggerService;
|
|
1382
|
-
debug?: boolean;
|
|
797
|
+
interface DriveUploadUrlOptions {
|
|
798
|
+
expires?: ms.StringValue;
|
|
799
|
+
mime_types?: string[];
|
|
800
|
+
max_size?: number;
|
|
1383
801
|
}
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
getInfo(): Promise<GitRepoInfo>;
|
|
802
|
+
interface DriveContract {
|
|
803
|
+
id: string;
|
|
804
|
+
name: string;
|
|
805
|
+
description?: string;
|
|
806
|
+
list(folder?: string): Promise<DriveEntry[]>;
|
|
807
|
+
find(filename: string): Promise<DriveEntry>;
|
|
808
|
+
exists(filename: string): Promise<boolean>;
|
|
809
|
+
read(filename: string): Promise<Uint8Array>;
|
|
810
|
+
write(filename: string, data: Uint8Array): Promise<void>;
|
|
811
|
+
writeStream(filename: string, stream: NodeJS.ReadableStream): Promise<void>;
|
|
812
|
+
delete(filename: string): Promise<void>;
|
|
813
|
+
url(filename: string, options?: DriveUrlOptions): Promise<string>;
|
|
814
|
+
uploadUrl(filename: string, options?: DriveUploadUrlOptions): Promise<string>;
|
|
815
|
+
readStream(filename: string): Promise<ReadStream>;
|
|
1399
816
|
}
|
|
1400
817
|
//#endregion
|
|
1401
|
-
//#region src/server/services/
|
|
1402
|
-
interface
|
|
818
|
+
//#region src/server/services/DriveService.d.ts
|
|
819
|
+
interface ValidateUploadOptions {
|
|
820
|
+
mime_types: string;
|
|
821
|
+
maxSize?: number;
|
|
822
|
+
}
|
|
823
|
+
declare class DriveService {
|
|
824
|
+
static __container_entry_key: string;
|
|
825
|
+
gateways: Map<string, typeof DriveBaseGateway>;
|
|
826
|
+
drives: Map<string, DriveBaseGateway>;
|
|
827
|
+
selected?: string;
|
|
828
|
+
defaultDrive?: string;
|
|
829
|
+
debug: boolean;
|
|
830
|
+
logger: LoggerService;
|
|
831
|
+
get current(): DriveBaseGateway | undefined;
|
|
832
|
+
constructor(data?: Partial<DriveService>);
|
|
833
|
+
listDrives(): {
|
|
834
|
+
default: boolean;
|
|
835
|
+
id: string;
|
|
836
|
+
name: string;
|
|
837
|
+
description?: string;
|
|
838
|
+
config: Record<string, any>;
|
|
839
|
+
}[];
|
|
840
|
+
get(name?: string): DriveBaseGateway;
|
|
841
|
+
use(name?: string): DriveService;
|
|
842
|
+
list(folder?: string): Promise<DriveEntry[]>;
|
|
843
|
+
find(filename: string): Promise<DriveEntry>;
|
|
844
|
+
exists(filename: string): Promise<boolean>;
|
|
845
|
+
read(filename: string): Promise<Uint8Array>;
|
|
846
|
+
readStream(filename: string): Promise<NodeJS.ReadableStream>;
|
|
847
|
+
readAsText(filename: string): Promise<string>;
|
|
848
|
+
write(filename: string, payload: Uint8Array | string | Record<string, unknown>): Promise<void>;
|
|
849
|
+
writeStream(filename: string, stream: NodeJS.ReadableStream): Promise<void>;
|
|
850
|
+
/**
|
|
851
|
+
* Retrieve a URL for a file in the drive.
|
|
852
|
+
* @param payload File instance, File ID, DriveEntry instance or filename string
|
|
853
|
+
* @param options
|
|
854
|
+
* @returns string
|
|
855
|
+
*/
|
|
856
|
+
url(filename: string, options?: DriveUrlOptions): Promise<string>;
|
|
857
|
+
uploadUrl(filename: string, options?: DriveUrlOptions): Promise<string>;
|
|
858
|
+
/**
|
|
859
|
+
* Upload a file from the local filesystem to the drive.
|
|
860
|
+
* @param source filename in local filesystem
|
|
861
|
+
* @param destination
|
|
862
|
+
* @returns
|
|
863
|
+
*/
|
|
864
|
+
upload(source: string, destination: string): Promise<void>;
|
|
865
|
+
/**
|
|
866
|
+
* Download a file from the drive to the local filesystem.
|
|
867
|
+
* @param filename filename in the drive
|
|
868
|
+
* @param destination
|
|
869
|
+
* @returns
|
|
870
|
+
*/
|
|
871
|
+
download(filename: string, destination: string): Promise<void>;
|
|
872
|
+
delete(filename: string): Promise<void>;
|
|
873
|
+
load(): Promise<void>;
|
|
874
|
+
createDefaultDrives(): Promise<void>;
|
|
875
|
+
validateUpload(options: ValidateUploadOptions, file: {
|
|
876
|
+
mimetype: string;
|
|
877
|
+
size: number;
|
|
878
|
+
}): void;
|
|
879
|
+
}
|
|
880
|
+
//#endregion
|
|
881
|
+
//#region src/server/entities/MigrationEntity.d.ts
|
|
882
|
+
interface MigrationEntiyData {
|
|
1403
883
|
name: string;
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
884
|
+
source: string | null;
|
|
885
|
+
filename: string;
|
|
886
|
+
executedAt: Date | null;
|
|
1407
887
|
}
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
888
|
+
declare class MigrationEntity {
|
|
889
|
+
name: string;
|
|
890
|
+
source: string | null;
|
|
891
|
+
filename: string;
|
|
892
|
+
executedAt: Date | null;
|
|
893
|
+
constructor(data: MigrationEntiyData);
|
|
894
|
+
up(db: Kysely<any>): Promise<void>;
|
|
895
|
+
down(db: Kysely<any>): Promise<void>;
|
|
1412
896
|
}
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
897
|
+
//#endregion
|
|
898
|
+
//#region src/server/entities/CookieMapEntity.d.ts
|
|
899
|
+
declare class CookieMapEntity extends CookieMapEntity$1 {
|
|
900
|
+
request: Request$1;
|
|
901
|
+
response: Response$1;
|
|
902
|
+
constructor(request: Request$1, response: Response$1);
|
|
903
|
+
set(name: string, value: string, options?: CookieOptions): void;
|
|
1418
904
|
}
|
|
1419
905
|
//#endregion
|
|
1420
|
-
//#region src/server/
|
|
1421
|
-
interface
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
id: string;
|
|
1456
|
-
event: string;
|
|
1457
|
-
data: T;
|
|
1458
|
-
};
|
|
1459
|
-
type IpcListener$1<T = any> = (data: T) => void;
|
|
1460
|
-
declare class PluginIpcClient {
|
|
1461
|
-
private listeners;
|
|
1462
|
-
constructor();
|
|
1463
|
-
on<T = any>(event: string, callback: IpcListener$1<T>): void;
|
|
1464
|
-
off<T = any>(event: string, callback: IpcListener$1<T>): void;
|
|
1465
|
-
emit<T = any>(event: string, data?: T): string;
|
|
906
|
+
//#region src/server/entities/PageRequestContextEntity.d.ts
|
|
907
|
+
interface PageRequestContextEntityOptions {
|
|
908
|
+
url: string;
|
|
909
|
+
request: Request$1;
|
|
910
|
+
response: Response$1;
|
|
911
|
+
state?: Map<string, any>;
|
|
912
|
+
nodeContainer?: ContainerService;
|
|
913
|
+
nodeConfig?: ConfigService;
|
|
914
|
+
nodeState?: Map<string, any>;
|
|
915
|
+
browserContainer?: ContainerService;
|
|
916
|
+
browserConfig?: ConfigService;
|
|
917
|
+
browserState?: Map<string, any>;
|
|
918
|
+
}
|
|
919
|
+
declare class PageRequestContextEntity {
|
|
920
|
+
url: string;
|
|
921
|
+
request: Request$1;
|
|
922
|
+
response: Response$1;
|
|
923
|
+
cookies: CookieMapEntity;
|
|
924
|
+
head: ResolvableHead[];
|
|
925
|
+
nodeContainer: ContainerService;
|
|
926
|
+
nodeConfig: ConfigService;
|
|
927
|
+
nodeState: Map<string, any>;
|
|
928
|
+
browserContainer: ContainerService;
|
|
929
|
+
browserConfig: ConfigService;
|
|
930
|
+
browserState: Map<string, any>;
|
|
931
|
+
constructor(data: PageRequestContextEntityOptions);
|
|
932
|
+
setBrowserState(key: string, value: any): void;
|
|
933
|
+
setNodeState(key: string, value: any): void;
|
|
934
|
+
setState(key: string, value: any): void;
|
|
935
|
+
setBrowserContainerValue(key: string, value: any): void;
|
|
936
|
+
setNodeContainerValue(key: string, value: any): void;
|
|
937
|
+
setContainerValue(key: string, value: any): void;
|
|
938
|
+
setBrowserConfigValue(key: string, value: any): void;
|
|
939
|
+
setNodeConfigValue(key: string, value: any): void;
|
|
940
|
+
setConfigValue(key: string, value: any): void;
|
|
1466
941
|
}
|
|
1467
942
|
//#endregion
|
|
1468
|
-
//#region src/server/
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
private readonly child;
|
|
1472
|
-
private listeners;
|
|
1473
|
-
constructor(child: ChildProcess);
|
|
1474
|
-
on<T = any>(event: string, callback: IpcListener<T>): void;
|
|
1475
|
-
off<T = any>(event: string, callback: IpcListener<T>): void;
|
|
1476
|
-
emit<T = any>(event: string, data?: T): string;
|
|
943
|
+
//#region src/server/entities/AclEntity.d.ts
|
|
944
|
+
declare class Acl extends AclEntity {
|
|
945
|
+
authorize(action: string, subject: any, object?: Record<string, any>): void;
|
|
1477
946
|
}
|
|
1478
947
|
//#endregion
|
|
1479
|
-
//#region src/server/
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
method: HttpMethod;
|
|
1483
|
-
path: string;
|
|
1484
|
-
}
|
|
1485
|
-
interface RouteRequest {
|
|
1486
|
-
requestId: string;
|
|
1487
|
-
method: HttpMethod;
|
|
1488
|
-
path: string;
|
|
1489
|
-
body?: any;
|
|
1490
|
-
headers?: Record<string, string>;
|
|
1491
|
-
query?: Record<string, string>;
|
|
1492
|
-
params?: Record<string, string>;
|
|
1493
|
-
}
|
|
1494
|
-
interface RouteResponsePayload {
|
|
1495
|
-
requestId: string;
|
|
1496
|
-
status: number;
|
|
1497
|
-
body?: any;
|
|
1498
|
-
headers?: Record<string, string>;
|
|
1499
|
-
}
|
|
1500
|
-
interface RouteReply {
|
|
1501
|
-
status(code: number): RouteReply;
|
|
1502
|
-
send(body?: any): void;
|
|
1503
|
-
}
|
|
1504
|
-
type RouteHandler = (req: RouteRequest, reply: RouteReply) => void | Promise<void>;
|
|
1505
|
-
declare class PluginRouter {
|
|
1506
|
-
private readonly client;
|
|
1507
|
-
private routes;
|
|
1508
|
-
constructor(client: PluginIpcClient);
|
|
1509
|
-
private dispatch;
|
|
1510
|
-
private register;
|
|
1511
|
-
get(path: string, handler: RouteHandler): void;
|
|
1512
|
-
post(path: string, handler: RouteHandler): void;
|
|
1513
|
-
put(path: string, handler: RouteHandler): void;
|
|
1514
|
-
patch(path: string, handler: RouteHandler): void;
|
|
1515
|
-
delete(path: string, handler: RouteHandler): void;
|
|
948
|
+
//#region src/server/contracts/HttpContextContract.d.ts
|
|
949
|
+
interface Request {
|
|
950
|
+
[key: string]: any;
|
|
1516
951
|
}
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
interface Listener {
|
|
1520
|
-
event: string;
|
|
1521
|
-
listener: (...args: any[]) => void;
|
|
952
|
+
interface Response {
|
|
953
|
+
[key: string]: any;
|
|
1522
954
|
}
|
|
1523
|
-
//#endregion
|
|
1524
|
-
//#region src/server/contracts/HttpContextContract.d.ts
|
|
1525
|
-
interface Request extends Request$1 {}
|
|
1526
|
-
interface Response extends Response$1 {}
|
|
1527
955
|
interface HttpContext {
|
|
1528
956
|
url: string;
|
|
1529
957
|
method: string;
|
|
1530
958
|
params: Record<string, string>;
|
|
1531
959
|
query: Record<string, string | string[]>;
|
|
1532
960
|
body: any;
|
|
1533
|
-
cookie:
|
|
1534
|
-
upload:
|
|
961
|
+
cookie: any;
|
|
962
|
+
upload: any;
|
|
1535
963
|
acl: Acl;
|
|
1536
964
|
request: Request;
|
|
1537
965
|
response: Response;
|
|
@@ -1581,7 +1009,15 @@ interface MiddlewareRegister {
|
|
|
1581
1009
|
interface LoadOptions {
|
|
1582
1010
|
debug?: boolean;
|
|
1583
1011
|
}
|
|
1584
|
-
|
|
1012
|
+
interface RouterEvents {
|
|
1013
|
+
'router:registered': {
|
|
1014
|
+
router: RouterService;
|
|
1015
|
+
};
|
|
1016
|
+
'router:loaded': {
|
|
1017
|
+
router: RouterService;
|
|
1018
|
+
};
|
|
1019
|
+
}
|
|
1020
|
+
declare const RouterService_base: {
|
|
1585
1021
|
new (...args: any[]): {
|
|
1586
1022
|
listeners: Listener[];
|
|
1587
1023
|
on(event: string, listener: (...args: any[]) => void): void;
|
|
@@ -1590,17 +1026,18 @@ declare const Router_base: {
|
|
|
1590
1026
|
emitAsync(event: string, ...args: any[]): Promise<void>;
|
|
1591
1027
|
};
|
|
1592
1028
|
} & Constructor;
|
|
1593
|
-
declare class
|
|
1029
|
+
declare class RouterService<C = {}> extends RouterService_base {
|
|
1030
|
+
static __container_entry_key: string;
|
|
1594
1031
|
routes: Route[];
|
|
1595
1032
|
middlewares: MiddlewareRegister[];
|
|
1596
1033
|
prefixes: string[];
|
|
1597
|
-
groups:
|
|
1034
|
+
groups: RouterService<any>[];
|
|
1598
1035
|
groupPrefixes: string[];
|
|
1599
1036
|
debug: boolean;
|
|
1600
1037
|
logger: LoggerService;
|
|
1601
1038
|
metadata: Record<string, any>;
|
|
1602
|
-
constructor(data?: Partial<
|
|
1603
|
-
use<T extends Middleware>(middleware: T, context?: RouteContext):
|
|
1039
|
+
constructor(data?: Partial<RouterService<C>>);
|
|
1040
|
+
use<T extends Middleware>(middleware: T, context?: RouteContext): RouterService<C & MiddlewareHandleResult<[typeof middleware]>>;
|
|
1604
1041
|
prefix(prefix: string): this;
|
|
1605
1042
|
makePath(args: string): string;
|
|
1606
1043
|
add(payload: Pick<Route, 'path' | 'method' | 'handler'>): void;
|
|
@@ -1610,7 +1047,7 @@ declare class Router<C = {}> extends Router_base {
|
|
|
1610
1047
|
patch(path: string, handler: Handler<C>): void;
|
|
1611
1048
|
many(methods: Route['method'][], path: string, handler: Handler<C>): void;
|
|
1612
1049
|
delete(path: string, handler: Handler<C>): void;
|
|
1613
|
-
group():
|
|
1050
|
+
group(): RouterService<C>;
|
|
1614
1051
|
resolve(method: string, path: string): Route | null;
|
|
1615
1052
|
execute(route: Route, initialCtx: any): Promise<any>;
|
|
1616
1053
|
matchPath(routePath: string, requestPath: string): boolean;
|
|
@@ -1620,175 +1057,231 @@ declare class Router<C = {}> extends Router_base {
|
|
|
1620
1057
|
loadSync(options?: LoadOptions): void;
|
|
1621
1058
|
}
|
|
1622
1059
|
//#endregion
|
|
1623
|
-
//#region src/server/
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
private router;
|
|
1629
|
-
private logger;
|
|
1630
|
-
private routes;
|
|
1631
|
-
debug: boolean;
|
|
1632
|
-
setDirectory(directory: string): this;
|
|
1633
|
-
setPrefix(prefix: string): this;
|
|
1634
|
-
setRouter(router: Router): this;
|
|
1635
|
-
setModule(module: string): this;
|
|
1636
|
-
setLogger(logger: LoggerService): this;
|
|
1637
|
-
setDebug(debug: boolean): this;
|
|
1638
|
-
static create(directory: string): RouterFileBaseRoutingService;
|
|
1639
|
-
loadFiles(): Promise<void>;
|
|
1640
|
-
registerRoutes(): Promise<void>;
|
|
1641
|
-
load(): Promise<void>;
|
|
1642
|
-
}
|
|
1643
|
-
//#endregion
|
|
1644
|
-
//#region src/server/services/ShellService.d.ts
|
|
1645
|
-
interface CommandOptions {
|
|
1646
|
-
cwd?: string;
|
|
1647
|
-
env?: NodeJS.ProcessEnv;
|
|
1648
|
-
shell?: boolean;
|
|
1060
|
+
//#region src/server/entities/SeederEntity.d.ts
|
|
1061
|
+
interface SeederEntiyData {
|
|
1062
|
+
name: string;
|
|
1063
|
+
source: string | null;
|
|
1064
|
+
filename: string;
|
|
1649
1065
|
}
|
|
1650
|
-
declare class
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
*/
|
|
1657
|
-
command(bin: string, args: string[], options?: CommandOptions): Promise<void>;
|
|
1658
|
-
/**
|
|
1659
|
-
* Execute a shell command and return the output as a string
|
|
1660
|
-
*/
|
|
1661
|
-
executeCommandWithOutput(bin: string, args: string[], options?: CommandOptions): Promise<string>;
|
|
1066
|
+
declare class SeederEntity {
|
|
1067
|
+
name: string;
|
|
1068
|
+
source: string | null;
|
|
1069
|
+
filename: string;
|
|
1070
|
+
constructor(data: SeederEntiyData);
|
|
1071
|
+
run(db: Kysely<any>): Promise<void>;
|
|
1662
1072
|
}
|
|
1663
1073
|
//#endregion
|
|
1664
|
-
//#region src/server/
|
|
1665
|
-
interface
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
per_page: number;
|
|
1669
|
-
total: number;
|
|
1670
|
-
total_pages: number;
|
|
1074
|
+
//#region src/server/services/SeederService.d.ts
|
|
1075
|
+
interface SeederSource {
|
|
1076
|
+
id: string;
|
|
1077
|
+
directory: string;
|
|
1671
1078
|
}
|
|
1672
|
-
interface
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
orderBy?: string | string[];
|
|
1676
|
-
orderDirection?: 'asc' | 'desc' | ('asc' | 'desc')[];
|
|
1079
|
+
interface ListFilters$1 {
|
|
1080
|
+
source?: string | string[];
|
|
1081
|
+
name?: string | string[];
|
|
1677
1082
|
}
|
|
1678
|
-
interface
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1083
|
+
interface SeederResult {
|
|
1084
|
+
name: string;
|
|
1085
|
+
filename: string;
|
|
1086
|
+
source: string | null;
|
|
1087
|
+
result: 'success' | 'failed';
|
|
1088
|
+
error?: any;
|
|
1683
1089
|
}
|
|
1684
|
-
interface
|
|
1685
|
-
|
|
1090
|
+
interface SeederEvents {
|
|
1091
|
+
'seeder:before-run': {
|
|
1092
|
+
seeders: string[];
|
|
1093
|
+
};
|
|
1094
|
+
'seeder:after-run': {
|
|
1095
|
+
seeders: string[];
|
|
1096
|
+
};
|
|
1686
1097
|
}
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
setTable(table: string): this;
|
|
1694
|
-
setPrimaryKey(primaryKey: string): this;
|
|
1695
|
-
query(options?: {
|
|
1696
|
-
qb?: any;
|
|
1697
|
-
} & Record<string, any>): any;
|
|
1698
|
-
count(options?: Record<string, any>): Promise<number>;
|
|
1699
|
-
findMany(options?: FindManyOptions & Record<string, any>): Promise<any>;
|
|
1700
|
-
findById(id: any, options?: Record<string, any>): Promise<any>;
|
|
1701
|
-
findByIdOrFail(id: any, options?: Record<string, any>): Promise<any>;
|
|
1702
|
-
paginate(options?: PaginateOptions & Record<string, any>): Promise<Pagination<any>>;
|
|
1703
|
-
create(data: any): Promise<any>;
|
|
1704
|
-
createMany(data: any[]): Promise<any[]>;
|
|
1705
|
-
updateById(id: any, data: any): Promise<void>;
|
|
1706
|
-
deleteById(id: any): Promise<void>;
|
|
1707
|
-
deleteMany(options?: DeleteManyOptions & Record<string, any>): Promise<void>;
|
|
1098
|
+
interface SeederServiceOptions {
|
|
1099
|
+
db: Kysely<any>;
|
|
1100
|
+
sources?: SeederSource[];
|
|
1101
|
+
debug?: boolean;
|
|
1102
|
+
emmitter?: EmmitterService$1;
|
|
1103
|
+
logger?: LoggerService;
|
|
1708
1104
|
}
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1105
|
+
declare class SeeederService {
|
|
1106
|
+
static __container_entry_key: string;
|
|
1107
|
+
debug: boolean;
|
|
1108
|
+
emmitter: EmmitterService$1;
|
|
1109
|
+
logger: LoggerService;
|
|
1110
|
+
db: Kysely<any>;
|
|
1111
|
+
sources: SeederSource[];
|
|
1112
|
+
constructor(options: SeederServiceOptions);
|
|
1113
|
+
addSource(source: SeederSource): void;
|
|
1114
|
+
listSource(source: SeederSource): Promise<SeederEntity[]>;
|
|
1115
|
+
list(filters?: ListFilters$1): Promise<SeederEntity[]>;
|
|
1116
|
+
runSeeder(seeder: SeederEntity): Promise<SeederResult>;
|
|
1117
|
+
run(filters?: ListFilters$1 & {
|
|
1118
|
+
steps?: number;
|
|
1119
|
+
}): Promise<SeederResult[]>;
|
|
1721
1120
|
}
|
|
1722
|
-
declare function DatabaseRepositoryInferMixin<TEntity = Record<string, any>, TPrimaryKeyType = any, TOptions = Record<string, any>>(): <TBase extends Constructor>(Base: TBase) => TBase & Constructor<IRepositoryTypes<TEntity, TPrimaryKeyType, TOptions>>;
|
|
1723
1121
|
//#endregion
|
|
1724
|
-
//#region src/server/
|
|
1725
|
-
interface
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1122
|
+
//#region src/server/contracts/EventContract.d.ts
|
|
1123
|
+
interface EventContract extends SeederEvents, RouterEvents, CliEvents {
|
|
1124
|
+
'migrator:before-migrate': {
|
|
1125
|
+
migrations: MigrationEntity[];
|
|
1126
|
+
};
|
|
1127
|
+
'migrator:after-migrate': {
|
|
1128
|
+
migrations: MigrationEntity[];
|
|
1129
|
+
};
|
|
1130
|
+
'migrator:before-rollback': {
|
|
1131
|
+
migrations: MigrationEntity[];
|
|
1132
|
+
};
|
|
1133
|
+
'migrator:after-rollback': {
|
|
1134
|
+
migrations: MigrationEntity[];
|
|
1135
|
+
};
|
|
1136
|
+
'user:before-create': {
|
|
1137
|
+
user: UserEntity$1;
|
|
1138
|
+
};
|
|
1139
|
+
'user:after-create': {
|
|
1140
|
+
user: UserEntity$1;
|
|
1141
|
+
};
|
|
1142
|
+
'user:before-update': {
|
|
1143
|
+
user: UserEntity$1;
|
|
1144
|
+
};
|
|
1145
|
+
'user:after-update': {
|
|
1146
|
+
user: UserEntity$1;
|
|
1147
|
+
};
|
|
1148
|
+
'user:before-delete': {
|
|
1149
|
+
user: UserEntity$1;
|
|
1150
|
+
};
|
|
1151
|
+
'user:after-delete': {
|
|
1152
|
+
user: UserEntity$1;
|
|
1153
|
+
};
|
|
1154
|
+
'page:request:start': PageRequestContextEntity;
|
|
1155
|
+
'page:request:before-render': PageRequestContextEntity;
|
|
1156
|
+
'page:request:after-render': PageRequestContextEntity;
|
|
1157
|
+
[key: string]: any;
|
|
1742
1158
|
}
|
|
1743
1159
|
//#endregion
|
|
1744
|
-
//#region src/server/
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1160
|
+
//#region src/server/services/EmmitterService.d.ts
|
|
1161
|
+
declare class EmmitterService extends EmmitterService$1<EventContract> {}
|
|
1162
|
+
//#endregion
|
|
1163
|
+
//#region src/server/services/EncryptService.d.ts
|
|
1164
|
+
interface URLOptions {
|
|
1165
|
+
data?: any;
|
|
1166
|
+
expires?: ms.StringValue;
|
|
1167
|
+
expireAt?: number | Date;
|
|
1748
1168
|
}
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
subject: string;
|
|
1755
|
-
conditions: string | null;
|
|
1756
|
-
created_at: string;
|
|
1757
|
-
updated_at: string;
|
|
1758
|
-
expires_at: string;
|
|
1759
|
-
}, number, PermissionRepositoryQueryOptions>>;
|
|
1760
|
-
declare class PermissionRepository extends PermissionRepository_base {
|
|
1761
|
-
constructor(db: DatabaseRepository['db']);
|
|
1762
|
-
query(options?: PermissionRepositoryQueryOptions): any;
|
|
1169
|
+
interface EncryptServiceOptions {
|
|
1170
|
+
key?: string;
|
|
1171
|
+
debug?: boolean;
|
|
1172
|
+
logger?: LoggerService;
|
|
1173
|
+
env?: EnvService;
|
|
1763
1174
|
}
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1175
|
+
declare class EncryptService {
|
|
1176
|
+
static __container_entry_key: string;
|
|
1177
|
+
debug: boolean;
|
|
1178
|
+
env: EnvService;
|
|
1179
|
+
logger: LoggerService;
|
|
1180
|
+
private readonly algorithm;
|
|
1181
|
+
private key;
|
|
1182
|
+
constructor(options: EncryptServiceOptions);
|
|
1183
|
+
static create(options: EncryptServiceOptions): EncryptService;
|
|
1184
|
+
setDebug(debug: boolean): void;
|
|
1185
|
+
setLogger(logger: LoggerService): void;
|
|
1186
|
+
setEnv(env: EnvService): void;
|
|
1187
|
+
setKey(key: string): void;
|
|
1188
|
+
encrypt(text: string): string;
|
|
1189
|
+
decrypt(options: string): string;
|
|
1190
|
+
encryptObject(obj: any): string;
|
|
1191
|
+
decryptObject<T>(encryptedString: string): T;
|
|
1192
|
+
url(path: string, options?: URLOptions): string;
|
|
1193
|
+
verifyUrl(encryptedKey: string): any;
|
|
1770
1194
|
}
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1195
|
+
//#endregion
|
|
1196
|
+
//#region src/server/gateways/GitGateway.d.ts
|
|
1197
|
+
interface GitRepoInfo {
|
|
1198
|
+
directory: string;
|
|
1199
|
+
head: string | null;
|
|
1200
|
+
shortHash: string;
|
|
1201
|
+
isDetachedHead: boolean;
|
|
1202
|
+
remotes: string[];
|
|
1203
|
+
}
|
|
1204
|
+
interface GitGatewayOptions {
|
|
1205
|
+
cwd: string;
|
|
1206
|
+
sshKey?: string;
|
|
1207
|
+
sshKeyFile?: string;
|
|
1208
|
+
sshKeyTmpFileName?: string;
|
|
1209
|
+
logger?: LoggerService;
|
|
1210
|
+
debug?: boolean;
|
|
1211
|
+
}
|
|
1212
|
+
declare class GitGateway {
|
|
1213
|
+
private readonly cwd;
|
|
1214
|
+
private readonly sshKey?;
|
|
1215
|
+
private readonly sshKeyFile?;
|
|
1216
|
+
private readonly sshKeyTmpFileName?;
|
|
1217
|
+
private readonly logger;
|
|
1218
|
+
private readonly debug;
|
|
1219
|
+
constructor(options: GitGatewayOptions);
|
|
1220
|
+
private buildEnv;
|
|
1221
|
+
run(args: string): Promise<string>;
|
|
1222
|
+
tryRun(args: string): Promise<string | null>;
|
|
1223
|
+
checkout(ref: string): Promise<void>;
|
|
1224
|
+
fetch(): Promise<void>;
|
|
1225
|
+
pull(): Promise<void>;
|
|
1226
|
+
getInfo(): Promise<GitRepoInfo>;
|
|
1785
1227
|
}
|
|
1786
1228
|
//#endregion
|
|
1787
|
-
//#region src/server/
|
|
1788
|
-
|
|
1229
|
+
//#region src/server/services/GitBranchRepository.d.ts
|
|
1230
|
+
interface GitBranch {
|
|
1231
|
+
name: string;
|
|
1232
|
+
remote: string | null;
|
|
1233
|
+
isCurrent: boolean;
|
|
1234
|
+
isRemote: boolean;
|
|
1235
|
+
}
|
|
1236
|
+
interface GitBranchFetchOptions {
|
|
1237
|
+
remote: string;
|
|
1238
|
+
branch: string;
|
|
1239
|
+
localName?: string;
|
|
1240
|
+
}
|
|
1241
|
+
declare class GitBranchRepository {
|
|
1242
|
+
private readonly gateway;
|
|
1243
|
+
constructor(gateway: GitGateway);
|
|
1244
|
+
list(): Promise<GitBranch[]>;
|
|
1245
|
+
fetch(options: GitBranchFetchOptions): Promise<void>;
|
|
1246
|
+
}
|
|
1789
1247
|
//#endregion
|
|
1790
|
-
//#region src/server/
|
|
1791
|
-
|
|
1248
|
+
//#region src/server/services/GitCommitRepository.d.ts
|
|
1249
|
+
interface GitCommitRef {
|
|
1250
|
+
name: string;
|
|
1251
|
+
shortName: string;
|
|
1252
|
+
type: 'branch' | 'tag' | 'remote' | 'other';
|
|
1253
|
+
}
|
|
1254
|
+
interface GitCommit {
|
|
1255
|
+
hash: string;
|
|
1256
|
+
shortHash: string;
|
|
1257
|
+
authorName: string;
|
|
1258
|
+
authorEmail: string;
|
|
1259
|
+
date: string;
|
|
1260
|
+
message: string;
|
|
1261
|
+
refs: GitCommitRef[];
|
|
1262
|
+
}
|
|
1263
|
+
interface GitCommitListOptions {
|
|
1264
|
+
branch?: string;
|
|
1265
|
+
page?: number;
|
|
1266
|
+
perPage?: number;
|
|
1267
|
+
}
|
|
1268
|
+
interface PaginatedCommits {
|
|
1269
|
+
items: GitCommit[];
|
|
1270
|
+
total: number;
|
|
1271
|
+
page: number;
|
|
1272
|
+
perPage: number;
|
|
1273
|
+
totalPages: number;
|
|
1274
|
+
}
|
|
1275
|
+
declare class GitCommitRepository {
|
|
1276
|
+
private readonly gateway;
|
|
1277
|
+
constructor(gateway: GitGateway);
|
|
1278
|
+
list(options?: GitCommitListOptions): Promise<PaginatedCommits>;
|
|
1279
|
+
}
|
|
1280
|
+
//#endregion
|
|
1281
|
+
//#region src/server/services/LifecycleService.d.ts
|
|
1282
|
+
declare class LifecycleService extends LifecycleService$1 {
|
|
1283
|
+
addDirectory(dirname: string): Promise<void>;
|
|
1284
|
+
}
|
|
1792
1285
|
//#endregion
|
|
1793
1286
|
//#region src/server/contracts/DatabaseContract.d.ts
|
|
1794
1287
|
interface SoftDeleteTable {
|
|
@@ -1927,19 +1420,698 @@ interface DatabaseContract {
|
|
|
1927
1420
|
oauth_tokens: OauthTokenTable;
|
|
1928
1421
|
}
|
|
1929
1422
|
//#endregion
|
|
1423
|
+
//#region src/server/services/MetadataQueryService.d.ts
|
|
1424
|
+
interface Metadafilter {
|
|
1425
|
+
eq?: string;
|
|
1426
|
+
neq?: string;
|
|
1427
|
+
like?: string;
|
|
1428
|
+
nlike?: string;
|
|
1429
|
+
in?: string[];
|
|
1430
|
+
nin?: string[];
|
|
1431
|
+
gt?: string;
|
|
1432
|
+
gte?: string;
|
|
1433
|
+
lt?: string;
|
|
1434
|
+
lte?: string;
|
|
1435
|
+
is_null?: boolean;
|
|
1436
|
+
exists?: boolean;
|
|
1437
|
+
}
|
|
1438
|
+
interface MetadataQueryPayload {
|
|
1439
|
+
[key: string]: string | Metadafilter;
|
|
1440
|
+
}
|
|
1441
|
+
declare class MetadataQueryService<T extends keyof DatabaseContract> {
|
|
1442
|
+
private payload;
|
|
1443
|
+
private table;
|
|
1444
|
+
private foreignKey;
|
|
1445
|
+
private parentKey;
|
|
1446
|
+
constructor(payload: MetadataQueryPayload, table: T, foreignKey: keyof DatabaseContract[T], parentKey?: string);
|
|
1447
|
+
get needWhereIn(): boolean;
|
|
1448
|
+
get needWhereNotIn(): boolean;
|
|
1449
|
+
apply(dbQuery: any): any;
|
|
1450
|
+
private buildRowConditions;
|
|
1451
|
+
whereIn: <DBQuery>(eb: ExpressionBuilder$1<any, any>) => DBQuery;
|
|
1452
|
+
whereNotIn: <DBQuery>(eb: ExpressionBuilder$1<any, any>) => DBQuery;
|
|
1453
|
+
}
|
|
1454
|
+
//#endregion
|
|
1455
|
+
//#region src/server/services/MetadataService.d.ts
|
|
1456
|
+
declare class MetadataService {
|
|
1457
|
+
id: number;
|
|
1458
|
+
table: string;
|
|
1459
|
+
foreignKey: string;
|
|
1460
|
+
constructor(payload: Pick<MetadataService, 'table' | 'foreignKey' | 'id'>);
|
|
1461
|
+
static parse(value: any): any;
|
|
1462
|
+
static flatten(items: Array<{
|
|
1463
|
+
name: string;
|
|
1464
|
+
value: any;
|
|
1465
|
+
}>): Record<string, any>;
|
|
1466
|
+
get<T = any>(name: string): Promise<T | undefined>;
|
|
1467
|
+
get<T = any>(name: string, defaultValue: T): Promise<T>;
|
|
1468
|
+
set(name: string, value: any): Promise<void>;
|
|
1469
|
+
list(): Promise<Array<{
|
|
1470
|
+
name: string;
|
|
1471
|
+
value: any;
|
|
1472
|
+
}>>;
|
|
1473
|
+
all(): Promise<Record<string, any>>;
|
|
1474
|
+
}
|
|
1475
|
+
//#endregion
|
|
1476
|
+
//#region src/server/services/MigratorService.d.ts
|
|
1477
|
+
interface MigrationSource {
|
|
1478
|
+
id: string;
|
|
1479
|
+
directory: string;
|
|
1480
|
+
}
|
|
1481
|
+
interface Migration {
|
|
1482
|
+
name: string;
|
|
1483
|
+
source: string | null;
|
|
1484
|
+
filename: string;
|
|
1485
|
+
executedAt: Date | null;
|
|
1486
|
+
}
|
|
1487
|
+
interface ListFilters {
|
|
1488
|
+
source?: string;
|
|
1489
|
+
}
|
|
1490
|
+
interface MigrationResult {
|
|
1491
|
+
name: string;
|
|
1492
|
+
filename: string;
|
|
1493
|
+
source: string | null;
|
|
1494
|
+
result: 'success' | 'failed';
|
|
1495
|
+
error?: any;
|
|
1496
|
+
}
|
|
1497
|
+
interface MigratorServiceOptions {
|
|
1498
|
+
sources: MigrationSource[];
|
|
1499
|
+
db: Kysely<any>;
|
|
1500
|
+
debug?: boolean;
|
|
1501
|
+
emmitter?: EmmitterService$1;
|
|
1502
|
+
logger?: LoggerService;
|
|
1503
|
+
}
|
|
1504
|
+
declare class MigratorService {
|
|
1505
|
+
static __container_entry_key: string;
|
|
1506
|
+
debug: boolean;
|
|
1507
|
+
emmitter: EmmitterService$1;
|
|
1508
|
+
logger: LoggerService;
|
|
1509
|
+
db: Kysely<any>;
|
|
1510
|
+
sources: MigrationSource[];
|
|
1511
|
+
constructor(options: MigratorServiceOptions);
|
|
1512
|
+
addSource(source: MigrationSource): void;
|
|
1513
|
+
private ensureMigrationsTable;
|
|
1514
|
+
listSource(source: MigrationSource): Promise<MigrationEntity[]>;
|
|
1515
|
+
list(filters?: ListFilters): Promise<MigrationEntity[]>;
|
|
1516
|
+
private migrateUp;
|
|
1517
|
+
private migrateDown;
|
|
1518
|
+
migrateFile(filename: string): Promise<MigrationResult>;
|
|
1519
|
+
rollbackFile(filename: string): Promise<MigrationResult>;
|
|
1520
|
+
migrate(filters?: ListFilters & {
|
|
1521
|
+
steps?: number;
|
|
1522
|
+
}): Promise<MigrationResult[]>;
|
|
1523
|
+
rollback(filters?: ListFilters & {
|
|
1524
|
+
steps?: number;
|
|
1525
|
+
}): Promise<MigrationResult[]>;
|
|
1526
|
+
up(steps?: number, filters?: ListFilters): Promise<MigrationResult[]>;
|
|
1527
|
+
down(steps?: number, filters?: ListFilters): Promise<MigrationResult[]>;
|
|
1528
|
+
latest(filters?: ListFilters): Promise<MigrationResult[]>;
|
|
1529
|
+
latestOrFail(filters?: ListFilters): Promise<MigrationResult[]>;
|
|
1530
|
+
fresh(filters?: ListFilters & {
|
|
1531
|
+
steps?: number;
|
|
1532
|
+
}): Promise<MigrationResult[]>;
|
|
1533
|
+
}
|
|
1534
|
+
//#endregion
|
|
1535
|
+
//#region src/server/services/PluginIpcClient.d.ts
|
|
1536
|
+
type IpcMessage<T = any> = {
|
|
1537
|
+
id: string;
|
|
1538
|
+
event: string;
|
|
1539
|
+
data: T;
|
|
1540
|
+
};
|
|
1541
|
+
type IpcListener$1<T = any> = (data: T) => void;
|
|
1542
|
+
declare class PluginIpcClient {
|
|
1543
|
+
private listeners;
|
|
1544
|
+
constructor();
|
|
1545
|
+
on<T = any>(event: string, callback: IpcListener$1<T>): void;
|
|
1546
|
+
off<T = any>(event: string, callback: IpcListener$1<T>): void;
|
|
1547
|
+
emit<T = any>(event: string, data?: T): string;
|
|
1548
|
+
}
|
|
1549
|
+
//#endregion
|
|
1550
|
+
//#region src/server/services/PluginIpcHost.d.ts
|
|
1551
|
+
type IpcListener<T = any> = (data: T) => void;
|
|
1552
|
+
declare class PluginIpcHost {
|
|
1553
|
+
private readonly child;
|
|
1554
|
+
private listeners;
|
|
1555
|
+
constructor(child: ChildProcess);
|
|
1556
|
+
on<T = any>(event: string, callback: IpcListener<T>): void;
|
|
1557
|
+
off<T = any>(event: string, callback: IpcListener<T>): void;
|
|
1558
|
+
emit<T = any>(event: string, data?: T): string;
|
|
1559
|
+
}
|
|
1560
|
+
//#endregion
|
|
1561
|
+
//#region src/server/services/PluginRouter.d.ts
|
|
1562
|
+
type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
1563
|
+
interface RouteDefinition {
|
|
1564
|
+
method: HttpMethod;
|
|
1565
|
+
path: string;
|
|
1566
|
+
}
|
|
1567
|
+
interface RouteRequest {
|
|
1568
|
+
requestId: string;
|
|
1569
|
+
method: HttpMethod;
|
|
1570
|
+
path: string;
|
|
1571
|
+
body?: any;
|
|
1572
|
+
headers?: Record<string, string>;
|
|
1573
|
+
query?: Record<string, string>;
|
|
1574
|
+
params?: Record<string, string>;
|
|
1575
|
+
}
|
|
1576
|
+
interface RouteResponsePayload {
|
|
1577
|
+
requestId: string;
|
|
1578
|
+
status: number;
|
|
1579
|
+
body?: any;
|
|
1580
|
+
headers?: Record<string, string>;
|
|
1581
|
+
}
|
|
1582
|
+
interface RouteReply {
|
|
1583
|
+
status(code: number): RouteReply;
|
|
1584
|
+
send(body?: any): void;
|
|
1585
|
+
}
|
|
1586
|
+
type RouteHandler = (req: RouteRequest, reply: RouteReply) => void | Promise<void>;
|
|
1587
|
+
declare class PluginRouter {
|
|
1588
|
+
private readonly client;
|
|
1589
|
+
private routes;
|
|
1590
|
+
constructor(client: PluginIpcClient);
|
|
1591
|
+
private dispatch;
|
|
1592
|
+
private register;
|
|
1593
|
+
get(path: string, handler: RouteHandler): void;
|
|
1594
|
+
post(path: string, handler: RouteHandler): void;
|
|
1595
|
+
put(path: string, handler: RouteHandler): void;
|
|
1596
|
+
patch(path: string, handler: RouteHandler): void;
|
|
1597
|
+
delete(path: string, handler: RouteHandler): void;
|
|
1598
|
+
}
|
|
1599
|
+
//#endregion
|
|
1600
|
+
//#region src/server/services/RouterFileBaseRoutingService.d.ts
|
|
1601
|
+
declare class RouterFileBaseRoutingService {
|
|
1602
|
+
private directory;
|
|
1603
|
+
private prefix;
|
|
1604
|
+
private module?;
|
|
1605
|
+
private router;
|
|
1606
|
+
private logger;
|
|
1607
|
+
private routes;
|
|
1608
|
+
debug: boolean;
|
|
1609
|
+
setDirectory(directory: string): this;
|
|
1610
|
+
setPrefix(prefix: string): this;
|
|
1611
|
+
setRouter(router: RouterService): this;
|
|
1612
|
+
setModule(module: string): this;
|
|
1613
|
+
setLogger(logger: LoggerService): this;
|
|
1614
|
+
setDebug(debug: boolean): this;
|
|
1615
|
+
static create(directory: string): RouterFileBaseRoutingService;
|
|
1616
|
+
loadFiles(): Promise<void>;
|
|
1617
|
+
registerRoutes(): Promise<void>;
|
|
1618
|
+
load(): Promise<void>;
|
|
1619
|
+
}
|
|
1620
|
+
//#endregion
|
|
1621
|
+
//#region src/server/services/RouterRegisterService.d.ts
|
|
1622
|
+
interface RouterRegisterEntry {
|
|
1623
|
+
filepath: string;
|
|
1624
|
+
metadata: Record<string, any>;
|
|
1625
|
+
}
|
|
1626
|
+
declare class RouterRegister<C = {}> extends RouterService<C> {
|
|
1627
|
+
files: Map<string, RouterRegisterEntry>;
|
|
1628
|
+
dirs: Map<string, RouterRegisterEntry>;
|
|
1629
|
+
constructor(router?: Partial<RouterService<C>>);
|
|
1630
|
+
addFile(filename: string, metadata?: Record<string, any>): void;
|
|
1631
|
+
addDir(dirname: string, metadata?: Record<string, any>): void;
|
|
1632
|
+
private loadFile;
|
|
1633
|
+
private loadDir;
|
|
1634
|
+
load(): Promise<void>;
|
|
1635
|
+
}
|
|
1636
|
+
//#endregion
|
|
1637
|
+
//#region src/server/services/RouterResourceService.d.ts
|
|
1638
|
+
type ResourceMethod = 'index' | 'show' | 'store' | 'update' | 'destroy';
|
|
1639
|
+
interface RouterResourceOptions {
|
|
1640
|
+
middleware?: Partial<Record<ResourceMethod | 'all', Middleware>>;
|
|
1641
|
+
except?: ResourceMethod[];
|
|
1642
|
+
}
|
|
1643
|
+
declare const RouterResourceService_base: {
|
|
1644
|
+
new (...args: any[]): {
|
|
1645
|
+
listeners: Listener[];
|
|
1646
|
+
on(event: string, listener: (...args: any[]) => void): void;
|
|
1647
|
+
off(event: string, listener: (...args: any[]) => void): void;
|
|
1648
|
+
emit(event: string, ...args: any[]): void;
|
|
1649
|
+
emitAsync(event: string, ...args: any[]): Promise<void>;
|
|
1650
|
+
};
|
|
1651
|
+
} & Constructor;
|
|
1652
|
+
declare class RouterResourceService extends RouterResourceService_base {
|
|
1653
|
+
private options;
|
|
1654
|
+
constructor(options?: RouterResourceOptions);
|
|
1655
|
+
index(ctx: HttpContext): Promise<any>;
|
|
1656
|
+
show(ctx: HttpContext): Promise<any>;
|
|
1657
|
+
store(ctx: HttpContext): Promise<any>;
|
|
1658
|
+
update(ctx: HttpContext): Promise<any>;
|
|
1659
|
+
destroy(ctx: HttpContext): Promise<any>;
|
|
1660
|
+
private wrap;
|
|
1661
|
+
register(router: RouterService): void;
|
|
1662
|
+
}
|
|
1663
|
+
//#endregion
|
|
1664
|
+
//#region src/server/mixins/ModelConfigMixin.d.ts
|
|
1665
|
+
type ConfigModel = ReturnType<ReturnType<typeof ModelConfig>>;
|
|
1666
|
+
interface Options$1 {
|
|
1667
|
+
readonly?: boolean;
|
|
1668
|
+
}
|
|
1669
|
+
declare function ModelConfig(key: string, options?: Options$1): <TBase extends Constructor>(Base: TBase) => {
|
|
1670
|
+
new (...args: any[]): {};
|
|
1671
|
+
__isConfigModel: boolean;
|
|
1672
|
+
serialize<T>(this: new (...args: any[]) => T, row: any): Promise<T>;
|
|
1673
|
+
list<T>(this: new (...args: any[]) => T): Promise<T[]>;
|
|
1674
|
+
find<T>(this: new (...args: any[]) => T, id: string): Promise<T | null>;
|
|
1675
|
+
findOrFail<T>(this: new (...args: any[]) => T, id: string): Promise<T>;
|
|
1676
|
+
create<T>(this: new (...args: any[]) => T, item: T & {
|
|
1677
|
+
id: string;
|
|
1678
|
+
}): Promise<void>;
|
|
1679
|
+
update<T>(this: new (...args: any[]) => T, id: string, data: T): Promise<void>;
|
|
1680
|
+
updateOrCreate<T>(this: new (...args: any[]) => T, id: string, data: Partial<T>): Promise<void>;
|
|
1681
|
+
destroy<T>(this: new (...args: any[]) => T, id: string): Promise<void>;
|
|
1682
|
+
} & TBase;
|
|
1683
|
+
//#endregion
|
|
1684
|
+
//#region src/server/services/RouterResourceConfigService.d.ts
|
|
1685
|
+
declare class RouterResourceConfig extends RouterResourceService {
|
|
1686
|
+
private model;
|
|
1687
|
+
constructor(model: ConfigModel, options?: RouterResourceOptions);
|
|
1688
|
+
index(ctx: HttpContext): Promise<{
|
|
1689
|
+
items: {}[];
|
|
1690
|
+
}>;
|
|
1691
|
+
show(ctx: HttpContext): Promise<{}>;
|
|
1692
|
+
store(ctx: HttpContext): Promise<{
|
|
1693
|
+
message: string;
|
|
1694
|
+
}>;
|
|
1695
|
+
update(ctx: HttpContext): Promise<void>;
|
|
1696
|
+
destroy(ctx: HttpContext): Promise<{
|
|
1697
|
+
success: boolean;
|
|
1698
|
+
}>;
|
|
1699
|
+
}
|
|
1700
|
+
//#endregion
|
|
1701
|
+
//#region src/server/services/ShellService.d.ts
|
|
1702
|
+
interface CommandOptions {
|
|
1703
|
+
cwd?: string;
|
|
1704
|
+
env?: NodeJS.ProcessEnv;
|
|
1705
|
+
shell?: boolean;
|
|
1706
|
+
}
|
|
1707
|
+
declare class ShellService {
|
|
1708
|
+
static __container_entry_key: string;
|
|
1709
|
+
debug: boolean;
|
|
1710
|
+
logger: LoggerService;
|
|
1711
|
+
init(data?: Partial<ShellService>): void;
|
|
1712
|
+
/**
|
|
1713
|
+
* Execute a shell command and return a promise
|
|
1714
|
+
*/
|
|
1715
|
+
command(bin: string, args: string[], options?: CommandOptions): Promise<void>;
|
|
1716
|
+
/**
|
|
1717
|
+
* Execute a shell command and return the output as a string
|
|
1718
|
+
*/
|
|
1719
|
+
executeCommandWithOutput(bin: string, args: string[], options?: CommandOptions): Promise<string>;
|
|
1720
|
+
}
|
|
1721
|
+
//#endregion
|
|
1722
|
+
//#region src/server/repositories/DatabaseRepository.d.ts
|
|
1723
|
+
interface Pagination<T = any> {
|
|
1724
|
+
items: T[];
|
|
1725
|
+
page: number;
|
|
1726
|
+
per_page: number;
|
|
1727
|
+
total: number;
|
|
1728
|
+
total_pages: number;
|
|
1729
|
+
}
|
|
1730
|
+
interface FindManyOptions {
|
|
1731
|
+
limit?: number;
|
|
1732
|
+
offset?: number;
|
|
1733
|
+
orderBy?: string | string[];
|
|
1734
|
+
orderDirection?: 'asc' | 'desc' | ('asc' | 'desc')[];
|
|
1735
|
+
}
|
|
1736
|
+
interface PaginateOptions$1 {
|
|
1737
|
+
page?: number;
|
|
1738
|
+
limit?: number;
|
|
1739
|
+
orderBy?: FindManyOptions['orderBy'];
|
|
1740
|
+
orderDirection?: FindManyOptions['orderDirection'];
|
|
1741
|
+
}
|
|
1742
|
+
interface DeleteManyOptions {
|
|
1743
|
+
limit?: number;
|
|
1744
|
+
}
|
|
1745
|
+
declare class DatabaseRepository<TEntity = Record<string, any>, TPrimaryKey = any, TOptions = Record<string, any>> {
|
|
1746
|
+
protected db: Kysely<any>;
|
|
1747
|
+
protected table: string;
|
|
1748
|
+
protected primaryKey: string;
|
|
1749
|
+
constructor(db: Kysely<any>, table: string, primaryKey: string);
|
|
1750
|
+
query(options?: {
|
|
1751
|
+
qb?: any;
|
|
1752
|
+
} & TOptions): any;
|
|
1753
|
+
count(options?: Record<string, any>): Promise<number>;
|
|
1754
|
+
findMany(options?: FindManyOptions & TOptions): Promise<TEntity[]>;
|
|
1755
|
+
findOne(options?: TOptions): Promise<TEntity | null>;
|
|
1756
|
+
findById(id: TPrimaryKey, options?: TOptions): Promise<TEntity | null>;
|
|
1757
|
+
findByIdOrFail(id: TPrimaryKey, options?: TOptions): Promise<NonNullable<Awaited<TEntity>>>;
|
|
1758
|
+
paginate(options?: PaginateOptions$1 & TOptions): Promise<Pagination>;
|
|
1759
|
+
create(data: Partial<TEntity>): Promise<any>;
|
|
1760
|
+
createMany(data: Partial<TEntity>[]): Promise<any[]>;
|
|
1761
|
+
updateById(id: TPrimaryKey, data: Partial<TEntity>): Promise<void>;
|
|
1762
|
+
deleteById(id: TPrimaryKey): Promise<void>;
|
|
1763
|
+
deleteMany(options?: DeleteManyOptions & TOptions): Promise<void>;
|
|
1764
|
+
}
|
|
1765
|
+
//#endregion
|
|
1766
|
+
//#region src/server/repositories/ConfigRepository.d.ts
|
|
1767
|
+
declare class ConfigRepository<TEntity = Record<string, any>, TOptions = Record<string, any>> {
|
|
1768
|
+
protected config: ConfigService;
|
|
1769
|
+
protected key: string;
|
|
1770
|
+
protected primaryKey: string;
|
|
1771
|
+
constructor(config: ConfigService, key: string, primaryKey?: string);
|
|
1772
|
+
protected getItems(): TEntity[];
|
|
1773
|
+
protected setItems(items: TEntity[]): void;
|
|
1774
|
+
query(options?: TOptions): TEntity[];
|
|
1775
|
+
count(options?: TOptions): Promise<number>;
|
|
1776
|
+
findMany(options?: FindManyOptions & TOptions): Promise<TEntity[]>;
|
|
1777
|
+
findOne(options?: TOptions): Promise<TEntity | null>;
|
|
1778
|
+
findById(id: string, options?: TOptions): Promise<TEntity | null>;
|
|
1779
|
+
findByIdOrFail(id: string, options?: TOptions): Promise<TEntity>;
|
|
1780
|
+
paginate(options?: PaginateOptions$1 & TOptions): Promise<Pagination<TEntity>>;
|
|
1781
|
+
create(data: Partial<TEntity>): Promise<TEntity>;
|
|
1782
|
+
createMany(data: Partial<TEntity>[]): Promise<TEntity[]>;
|
|
1783
|
+
updateById(id: string, data: Partial<TEntity>): Promise<TEntity>;
|
|
1784
|
+
deleteById(id: string): Promise<void>;
|
|
1785
|
+
deleteMany(options?: DeleteManyOptions & TOptions): Promise<void>;
|
|
1786
|
+
}
|
|
1787
|
+
//#endregion
|
|
1788
|
+
//#region src/server/repositories/FileRepository.d.ts
|
|
1789
|
+
interface FileRepositoryQueryOptions {
|
|
1790
|
+
id?: number | number[];
|
|
1791
|
+
search?: string;
|
|
1792
|
+
purpose?: string[];
|
|
1793
|
+
client_name?: string[];
|
|
1794
|
+
metas?: MetadataQueryPayload;
|
|
1795
|
+
}
|
|
1796
|
+
declare class FileRepository extends DatabaseRepository<FileEntity, FileEntity['id'], FileRepositoryQueryOptions> {
|
|
1797
|
+
constructor(db: DatabaseRepository['db']);
|
|
1798
|
+
query(options?: FileRepositoryQueryOptions): any;
|
|
1799
|
+
}
|
|
1800
|
+
//#endregion
|
|
1801
|
+
//#region src/server/repositories/PermissionAssignmentRepository.d.ts
|
|
1802
|
+
interface PermissionAssignmentRepositoryQueryOptions {
|
|
1803
|
+
id?: number | number[];
|
|
1804
|
+
permissionId?: number | number[];
|
|
1805
|
+
assignableId?: string | string[];
|
|
1806
|
+
assignableType?: string | string[];
|
|
1807
|
+
}
|
|
1808
|
+
declare class PermissionAssignmentRepository extends DatabaseRepository<PermissionAssignment, PermissionAssignment['id'], PermissionAssignmentRepositoryQueryOptions> {
|
|
1809
|
+
constructor(db: DatabaseRepository['db']);
|
|
1810
|
+
query(options?: PermissionAssignmentRepositoryQueryOptions): any;
|
|
1811
|
+
}
|
|
1812
|
+
//#endregion
|
|
1813
|
+
//#region src/server/repositories/PermissionRepository.d.ts
|
|
1814
|
+
interface PermissionRepositoryQueryOptions {
|
|
1815
|
+
id?: number | number[];
|
|
1816
|
+
search?: string;
|
|
1817
|
+
}
|
|
1818
|
+
declare class PermissionRepository extends DatabaseRepository<Permission, Permission['id'], PermissionRepositoryQueryOptions> {
|
|
1819
|
+
constructor(db: DatabaseRepository['db']);
|
|
1820
|
+
query(options?: PermissionRepositoryQueryOptions): any;
|
|
1821
|
+
}
|
|
1822
|
+
//#endregion
|
|
1823
|
+
//#region src/server/mixins/DatabaseRepositoryInferMixin.d.ts
|
|
1824
|
+
interface IRepositoryTypes<TEntity = Record<string, any>, TPrimaryKeyType = any, TOptions = Record<string, any>> {
|
|
1825
|
+
count(options?: TOptions): Promise<number>;
|
|
1826
|
+
findMany(options?: TOptions & FindManyOptions): Promise<TEntity[]>;
|
|
1827
|
+
findById(id: TPrimaryKeyType, options?: TOptions): Promise<TEntity | null>;
|
|
1828
|
+
findByIdOrFail(id: TPrimaryKeyType, options?: TOptions): Promise<TEntity>;
|
|
1829
|
+
paginate(options?: TOptions & PaginateOptions$1): Promise<Pagination>;
|
|
1830
|
+
create(data: Partial<TEntity>, options?: TOptions): Promise<TEntity>;
|
|
1831
|
+
createMany(data: Partial<TEntity>[], options?: TOptions): Promise<TEntity[]>;
|
|
1832
|
+
deleteById(id: TPrimaryKeyType): Promise<void>;
|
|
1833
|
+
destroyMany(options?: TOptions): Promise<void>;
|
|
1834
|
+
}
|
|
1835
|
+
declare function DatabaseRepositoryInferMixin<TEntity = Record<string, any>, TPrimaryKeyType = any, TOptions = Record<string, any>>(): <TBase extends Constructor>(Base: TBase) => TBase & Constructor<IRepositoryTypes<TEntity, TPrimaryKeyType, TOptions>>;
|
|
1836
|
+
//#endregion
|
|
1837
|
+
//#region src/server/repositories/TokenRepository.d.ts
|
|
1838
|
+
interface TokenRepositoryQueryOptions {
|
|
1839
|
+
id?: number | number[];
|
|
1840
|
+
search?: string;
|
|
1841
|
+
type?: string | string[];
|
|
1842
|
+
}
|
|
1843
|
+
declare const TokenRepository_base: Constructor & Constructor<IRepositoryTypes<{
|
|
1844
|
+
id: number;
|
|
1845
|
+
name: string | null;
|
|
1846
|
+
type: string;
|
|
1847
|
+
user_id: number;
|
|
1848
|
+
token: string;
|
|
1849
|
+
created_at: string;
|
|
1850
|
+
updated_at: string;
|
|
1851
|
+
expires_at: string;
|
|
1852
|
+
}, number, TokenRepositoryQueryOptions>> & Constructor<{}> & typeof DatabaseRepository;
|
|
1853
|
+
declare class TokenRepository extends TokenRepository_base {
|
|
1854
|
+
constructor(db: DatabaseRepository['db']);
|
|
1855
|
+
query(options?: TokenRepositoryQueryOptions): any;
|
|
1856
|
+
findByToken(token: string): Promise<Token$1 | null>;
|
|
1857
|
+
}
|
|
1858
|
+
//#endregion
|
|
1859
|
+
//#region src/server/repositories/UserRepository.d.ts
|
|
1860
|
+
interface UserRepositoryQueryOptions {
|
|
1861
|
+
email?: string;
|
|
1862
|
+
username?: string;
|
|
1863
|
+
id?: number;
|
|
1864
|
+
}
|
|
1865
|
+
declare class UserRepository extends DatabaseRepository<UserTable, string, UserRepositoryQueryOptions> {
|
|
1866
|
+
constructor(db: DatabaseRepository['db']);
|
|
1867
|
+
query(options?: UserRepositoryQueryOptions): any;
|
|
1868
|
+
}
|
|
1869
|
+
//#endregion
|
|
1870
|
+
//#region src/server/gateways/DriveFSGateway.d.ts
|
|
1871
|
+
interface DriveFSConfig {
|
|
1872
|
+
directory: string;
|
|
1873
|
+
}
|
|
1874
|
+
declare class DriveFS extends DriveBaseGateway {
|
|
1875
|
+
private schema;
|
|
1876
|
+
constructor(data: Pick<DriveBaseGateway, 'id' | 'name' | 'description' | 'config'>);
|
|
1877
|
+
get valid(): boolean;
|
|
1878
|
+
private checkValid;
|
|
1879
|
+
protected get rootPath(): string;
|
|
1880
|
+
exists: DriveBaseGateway['exists'];
|
|
1881
|
+
list: DriveBaseGateway['list'];
|
|
1882
|
+
find: DriveBaseGateway['find'];
|
|
1883
|
+
mkdir(filename: string): Promise<void>;
|
|
1884
|
+
read: DriveBaseGateway['read'];
|
|
1885
|
+
readStream(filename: string): Promise<fs.ReadStream>;
|
|
1886
|
+
write: DriveBaseGateway['write'];
|
|
1887
|
+
writeStream(filename: string, stream: NodeJS.ReadableStream): Promise<void>;
|
|
1888
|
+
delete: DriveBaseGateway['delete'];
|
|
1889
|
+
url: DriveBaseGateway['url'];
|
|
1890
|
+
uploadUrl: DriveBaseGateway['uploadUrl'];
|
|
1891
|
+
}
|
|
1892
|
+
//#endregion
|
|
1893
|
+
//#region src/server/mixins/MetadataMixin.d.ts
|
|
1894
|
+
declare function valueToString(value: any): string;
|
|
1895
|
+
declare function Metadata<Table extends keyof DatabaseContract>(metasTable: Table, foreignKey: keyof DatabaseContract[Table]): <TBase extends Constructor>(Base: TBase) => {
|
|
1896
|
+
new (...args: any[]): {
|
|
1897
|
+
get<T = any>(name: string): Promise<T | undefined>;
|
|
1898
|
+
get<T = any>(name: string, defaultValue: T): Promise<T>;
|
|
1899
|
+
set(name: string, value: any): Promise<void>;
|
|
1900
|
+
};
|
|
1901
|
+
} & TBase;
|
|
1902
|
+
//#endregion
|
|
1930
1903
|
//#region src/server/facades/database.d.ts
|
|
1931
1904
|
declare const key = "database";
|
|
1932
1905
|
declare const database: Kysely<DatabaseContract>;
|
|
1933
1906
|
//#endregion
|
|
1907
|
+
//#region src/server/queries/common.d.ts
|
|
1908
|
+
type SelectFrom<T extends keyof DatabaseContract> = ReturnType<typeof database.selectFrom<T>> | SelectQueryBuilder<DatabaseContract, T, any>;
|
|
1909
|
+
type InsertFrom<T extends keyof DatabaseContract> = ReturnType<typeof database.insertInto<T>>;
|
|
1910
|
+
type UpdateFrom<T extends keyof DatabaseContract> = ReturnType<typeof database.updateTable<T>>;
|
|
1911
|
+
type DeleteFrom<T extends keyof DatabaseContract> = ReturnType<typeof database.deleteFrom<T>>;
|
|
1912
|
+
type SelectBuilder<T extends keyof DatabaseContract> = SelectQueryBuilder<DatabaseContract, T, Selectable<DatabaseContract[T]>>;
|
|
1913
|
+
type ExpressionBuilder<T extends keyof DatabaseContract> = ExpressionBuilder$1<DatabaseContract, T>;
|
|
1914
|
+
declare const now: () => _$kysely.RawBuilder<string>;
|
|
1915
|
+
interface SerializeOptions<T extends keyof DatabaseContract> {
|
|
1916
|
+
serialize?: (row: Selectable<DatabaseContract[T]>) => any;
|
|
1917
|
+
}
|
|
1918
|
+
type SerializableResult<T extends keyof DatabaseContract, O extends SerializeOptions<T> | undefined> = O extends undefined ? Selectable<DatabaseContract[T]> : O extends {
|
|
1919
|
+
serialize: (row: Selectable<DatabaseContract[T]>) => infer R;
|
|
1920
|
+
} ? R : Selectable<DatabaseContract[T]>;
|
|
1921
|
+
//#endregion
|
|
1922
|
+
//#region src/server/queries/updateOrCreate.d.ts
|
|
1923
|
+
interface UpdateOrCreateOptions<T extends keyof DatabaseContract> extends SerializeOptions<T> {
|
|
1924
|
+
debug?: boolean;
|
|
1925
|
+
where?: (qb: ExpressionBuilder$1<DatabaseContract, T>) => ExpressionWrapper<DatabaseContract, T, any>;
|
|
1926
|
+
select?: (qb: SelectFrom<T>) => SelectFrom<T>;
|
|
1927
|
+
update?: (qb: UpdateFrom<T>) => UpdateFrom<T>;
|
|
1928
|
+
values: Insertable<DatabaseContract[T]> | Insertable<DatabaseContract[T]>[];
|
|
1929
|
+
}
|
|
1930
|
+
declare function updateOrCreate<T extends keyof DatabaseContract, O extends UpdateOrCreateOptions<T>>(table: T, options?: O): Promise<SerializableResult<T, O>>;
|
|
1931
|
+
//#endregion
|
|
1932
|
+
//#region src/server/queries/list.d.ts
|
|
1933
|
+
interface ListOptions<T extends keyof DatabaseContract> extends SerializeOptions<T> {
|
|
1934
|
+
limit?: number;
|
|
1935
|
+
offset?: number;
|
|
1936
|
+
debug?: boolean;
|
|
1937
|
+
where?: (qb: ExpressionBuilder$1<DatabaseContract, T>) => ExpressionWrapper<DatabaseContract, T, any>;
|
|
1938
|
+
query?: (qb: SelectFrom<T>) => SelectFrom<T>;
|
|
1939
|
+
}
|
|
1940
|
+
declare function list<T extends keyof DatabaseContract, O extends ListOptions<T>>(table: T, options?: O): Promise<SerializableResult<T, O>[]>;
|
|
1941
|
+
//#endregion
|
|
1942
|
+
//#region src/server/queries/paginate.d.ts
|
|
1943
|
+
interface PaginateOptions<T extends keyof DatabaseContract> {
|
|
1944
|
+
debug?: boolean;
|
|
1945
|
+
page?: number;
|
|
1946
|
+
limit?: number;
|
|
1947
|
+
orderBy?: DatabaseContract[T] | (keyof DatabaseContract[T])[];
|
|
1948
|
+
orderDesc?: ('asc' | 'desc') | ('asc' | 'desc')[];
|
|
1949
|
+
where?: (qb: ExpressionBuilder$1<DatabaseContract, T>) => ExpressionWrapper<DatabaseContract, T, any>;
|
|
1950
|
+
serialize?: (row: Selectable<DatabaseContract[T]>) => any;
|
|
1951
|
+
query?: (qb: SelectFrom<T>) => any;
|
|
1952
|
+
}
|
|
1953
|
+
type PaginateResult<T extends keyof DatabaseContract, O extends PaginateOptions<T> | undefined> = O extends undefined ? Selectable<DatabaseContract[T]> : O extends {
|
|
1954
|
+
serialize: (row: Selectable<DatabaseContract[T]>) => infer R;
|
|
1955
|
+
} ? R : Selectable<DatabaseContract[T]>;
|
|
1956
|
+
declare function paginate<T extends keyof DatabaseContract, O extends PaginateOptions<T>>(table: T, options?: O): Promise<PaginationEntity<PaginateResult<T, O>>>;
|
|
1957
|
+
//#endregion
|
|
1958
|
+
//#region src/server/queries/count.d.ts
|
|
1959
|
+
interface CountOptions<T extends keyof DatabaseContract> {
|
|
1960
|
+
query?: (qb: SelectFrom<T>) => SelectFrom<T>;
|
|
1961
|
+
debug?: boolean;
|
|
1962
|
+
}
|
|
1963
|
+
declare function count<T extends keyof DatabaseContract, O extends CountOptions<T>>(table: T, options?: O): Promise<number>;
|
|
1964
|
+
//#endregion
|
|
1965
|
+
//#region src/server/queries/create.d.ts
|
|
1966
|
+
interface CreateOptions<T extends keyof DatabaseContract> extends SerializeOptions<T> {
|
|
1967
|
+
values: Insertable<DatabaseContract[T]>;
|
|
1968
|
+
primaryKey?: string;
|
|
1969
|
+
normalize?: boolean | ((value: any) => any);
|
|
1970
|
+
}
|
|
1971
|
+
declare function createDefault<T extends keyof DatabaseContract, O extends CreateOptions<T>>(table: T, options?: O): Promise<SerializableResult<T, O>>;
|
|
1972
|
+
declare function createMysql<T extends keyof DatabaseContract, O extends CreateOptions<T>>(table: T, options?: O): Promise<SerializableResult<T, O>>;
|
|
1973
|
+
declare function create<T extends keyof DatabaseContract, O extends CreateOptions<T>>(table: T, options?: O): Promise<_$kysely.DrainOuterGeneric<{ [K_1 in (DatabaseContract[T] extends infer T_1 ? { [K in keyof T_1]: _$kysely.SelectType<T_1[K]> extends infer T_2 ? T_2 extends _$kysely.SelectType<T_1[K]> ? T_2 extends never ? never : K : never : never } : never)[keyof DatabaseContract[T]]]: _$kysely.SelectType<DatabaseContract[T][K_1]> }>>;
|
|
1974
|
+
//#endregion
|
|
1975
|
+
//#region src/server/queries/update.d.ts
|
|
1976
|
+
interface UpdateOptions<T extends keyof DatabaseContract> extends SerializeOptions<T> {
|
|
1977
|
+
debug?: boolean;
|
|
1978
|
+
values: Updateable<DatabaseContract[T]>;
|
|
1979
|
+
normalize?: boolean | ((value: any) => any);
|
|
1980
|
+
where?: (qb: ExpressionBuilder$1<DatabaseContract, T>) => ExpressionWrapper<DatabaseContract, T, any>;
|
|
1981
|
+
query?: (qb: UpdateFrom<T>) => UpdateFrom<T>;
|
|
1982
|
+
}
|
|
1983
|
+
declare function updateDefault<T extends keyof DatabaseContract, O extends UpdateOptions<T>>(table: T, options?: O): Promise<SerializableResult<T, O>[]>;
|
|
1984
|
+
declare function updateMysql<T extends keyof DatabaseContract, O extends UpdateOptions<T>>(table: T, options?: O): Promise<SerializableResult<T, O>[]>;
|
|
1985
|
+
declare function update<T extends keyof DatabaseContract, O extends UpdateOptions<T>>(table: T, options?: O): Promise<_$kysely.DrainOuterGeneric<{ [K_1 in (DatabaseContract[T] extends infer T_1 ? { [K in keyof T_1]: _$kysely.SelectType<T_1[K]> extends infer T_2 ? T_2 extends _$kysely.SelectType<T_1[K]> ? T_2 extends never ? never : K : never : never } : never)[keyof DatabaseContract[T]]]: _$kysely.SelectType<DatabaseContract[T][K_1]> }>[]>;
|
|
1986
|
+
//#endregion
|
|
1987
|
+
//#region src/server/queries/destroy.d.ts
|
|
1988
|
+
type DeleteFrom$1<T extends keyof DatabaseContract> = ReturnType<typeof database.deleteFrom<T>>;
|
|
1989
|
+
interface DestroyOptions<T extends keyof DatabaseContract> {
|
|
1990
|
+
query?: (qb: DeleteFrom$1<T>) => DeleteFrom$1<T>;
|
|
1991
|
+
where?: (qb: ExpressionBuilder$1<DatabaseContract, T>) => ExpressionWrapper<DatabaseContract, T, any>;
|
|
1992
|
+
}
|
|
1993
|
+
declare function destroy<T extends keyof DatabaseContract, O extends DestroyOptions<T>>(table: T, options?: O): Promise<void>;
|
|
1994
|
+
//#endregion
|
|
1995
|
+
//#region src/server/queries/firstOrCreate.d.ts
|
|
1996
|
+
interface FirstOrCreateOptions<T extends keyof DatabaseContract> extends SerializeOptions<T> {
|
|
1997
|
+
debug?: boolean;
|
|
1998
|
+
select?: (qb: SelectFrom<T>) => SelectFrom<T>;
|
|
1999
|
+
where?: (qb: ExpressionBuilder$1<DatabaseContract, T>) => ExpressionWrapper<DatabaseContract, T, any>;
|
|
2000
|
+
values: Insertable<DatabaseContract[T]> | Insertable<DatabaseContract[T]>[];
|
|
2001
|
+
}
|
|
2002
|
+
declare function firstOrCreate<T extends keyof DatabaseContract, O extends FirstOrCreateOptions<T>>(table: T, options?: O): Promise<SerializableResult<T, O>>;
|
|
2003
|
+
//#endregion
|
|
2004
|
+
//#region src/server/queries/findOne.d.ts
|
|
2005
|
+
interface FindOneOptions<T extends keyof DatabaseContract> extends SerializeOptions<T> {
|
|
2006
|
+
name?: string;
|
|
2007
|
+
query?: (qb: SelectFrom<T>) => SelectFrom<T>;
|
|
2008
|
+
where?: (qb: ExpressionBuilder$1<DatabaseContract, T>) => ExpressionWrapper<DatabaseContract, T, any>;
|
|
2009
|
+
}
|
|
2010
|
+
declare function findOne<T extends keyof DatabaseContract, O extends FindOneOptions<T>>(table: T, options?: O): Promise<SerializableResult<T, O> | null>;
|
|
2011
|
+
declare function findOneOrFail<T extends keyof DatabaseContract, O extends FindOneOptions<T>>(table: T, options?: O): Promise<NonNullable<Awaited<SerializableResult<T, O>>>>;
|
|
2012
|
+
//#endregion
|
|
2013
|
+
//#region src/server/mixins/ModelMixin.d.ts
|
|
2014
|
+
type ModelListOptions<T extends keyof DatabaseContract> = Omit<ListOptions<T>, 'serialize'>;
|
|
2015
|
+
type ModelFindOptions<T extends keyof DatabaseContract> = Omit<FindOneOptions<T>, 'serialize' | 'orderBy'>;
|
|
2016
|
+
type ModelPaginateOptions<T extends keyof DatabaseContract> = Omit<PaginateOptions<T>, 'serialize'>;
|
|
2017
|
+
type ModelCountOptions<T extends keyof DatabaseContract> = CountOptions<T>;
|
|
2018
|
+
type ModelCreateOptions<T extends keyof DatabaseContract> = Omit<CreateOptions<T>, 'serialize'>;
|
|
2019
|
+
type ModelUpdateOptions<T extends keyof DatabaseContract> = Omit<UpdateOptions<T>, 'serialize'>;
|
|
2020
|
+
type ModelDestroyOptions<T extends keyof DatabaseContract> = DestroyOptions<T>;
|
|
2021
|
+
type ModelFirstOrCreateOptions<T extends keyof DatabaseContract> = Omit<FirstOrCreateOptions<T>, 'serialize'>;
|
|
2022
|
+
type ModelUpdateOrCreateOptions<T extends keyof DatabaseContract> = Omit<UpdateOrCreateOptions<T>, 'serialize'>;
|
|
2023
|
+
type ModelEntity = ReturnType<ReturnType<typeof ModelMixin<any>>>;
|
|
2024
|
+
declare function ModelMixin<Table extends keyof DatabaseContract>(table: Table, primaryKey?: keyof DatabaseContract[Table]): <TBase extends Constructor>(Base: TBase) => {
|
|
2025
|
+
new (...args: any[]): {
|
|
2026
|
+
save(): Promise<void>;
|
|
2027
|
+
destroy(): Promise<void>;
|
|
2028
|
+
softDelete(): Promise<void>;
|
|
2029
|
+
};
|
|
2030
|
+
__model: {
|
|
2031
|
+
table: Table;
|
|
2032
|
+
primaryKey: keyof DatabaseContract[Table];
|
|
2033
|
+
};
|
|
2034
|
+
serialize<T>(this: new () => T, row: any): Promise<T>;
|
|
2035
|
+
select(): SelectQueryBuilder<DatabaseContract, Table, any>;
|
|
2036
|
+
paginate<T>(this: new () => T, o?: ModelPaginateOptions<Table>): Promise<PaginationEntity<T>>;
|
|
2037
|
+
list<T>(this: new () => T, o?: ModelListOptions<Table>): Promise<T[]>;
|
|
2038
|
+
findOne<T>(this: new () => T, o?: ModelFindOptions<Table>): Promise<T | undefined>;
|
|
2039
|
+
findOneOrFail<T>(this: new () => T, o?: ModelFindOptions<Table>): Promise<T>;
|
|
2040
|
+
find<T>(this: new () => T, id: any): Promise<T | null>;
|
|
2041
|
+
findOrFail<T>(this: new () => T, id: any): Promise<T>;
|
|
2042
|
+
findBy<T>(this: new () => T, column: keyof DatabaseContract[Table], value: any): Promise<T>;
|
|
2043
|
+
findByOrFail<T>(this: new () => T, column: keyof DatabaseContract[Table], value: any): Promise<T>;
|
|
2044
|
+
exists<T>(this: new () => T, o?: ModelListOptions<Table>): Promise<boolean>;
|
|
2045
|
+
count<T>(this: new () => T, o?: ModelCountOptions<Table>): Promise<number>;
|
|
2046
|
+
create<T>(this: new () => T, payload: ModelCreateOptions<Table>["values"]): Promise<T>;
|
|
2047
|
+
createMany<T>(this: new () => T, values: Array<ModelCreateOptions<Table>["values"]>): Promise<T[]>;
|
|
2048
|
+
update<T>(this: new () => T, o: ModelUpdateOptions<Table>): Promise<T>;
|
|
2049
|
+
updateById<T>(this: new () => T, id: any, values: ModelUpdateOptions<Table>["values"], options?: {
|
|
2050
|
+
debug?: boolean;
|
|
2051
|
+
}): Promise<T>;
|
|
2052
|
+
destroy<T>(this: new () => T, o?: ModelDestroyOptions<Table>): Promise<void>;
|
|
2053
|
+
firstOrCreate<T>(this: new () => T, o: ModelFirstOrCreateOptions<Table>): T;
|
|
2054
|
+
updateOrCreate<T>(this: new (...args: any[]) => T, o: ModelUpdateOrCreateOptions<Table>): T;
|
|
2055
|
+
destroyById<T>(this: new () => T, id: any): Promise<void>;
|
|
2056
|
+
} & TBase;
|
|
2057
|
+
//#endregion
|
|
2058
|
+
//#region src/server/mixins/RelationsMixin.d.ts
|
|
2059
|
+
interface Relation {
|
|
2060
|
+
load(entities: any[]): Promise<void>;
|
|
2061
|
+
}
|
|
2062
|
+
declare function Relation<R extends Record<string, Relation>>(relations: R): <TBase extends Constructor>(Base: TBase) => {
|
|
2063
|
+
new (...args: any[]): {};
|
|
2064
|
+
load<T>(this: new () => T, entities: T | T[], names: keyof R | (keyof R)[]): Promise<void>;
|
|
2065
|
+
} & TBase;
|
|
2066
|
+
//#endregion
|
|
2067
|
+
//#region src/server/facades/config.d.ts
|
|
2068
|
+
declare const config: ConfigService;
|
|
2069
|
+
//#endregion
|
|
2070
|
+
//#region src/server/facades/container.d.ts
|
|
2071
|
+
declare const _default: ContainerService;
|
|
2072
|
+
//#endregion
|
|
2073
|
+
//#region src/server/facades/download.d.ts
|
|
2074
|
+
declare const download: DownloadService;
|
|
2075
|
+
//#endregion
|
|
2076
|
+
//#region src/server/facades/drive.d.ts
|
|
2077
|
+
declare const drive: DriveService;
|
|
2078
|
+
//#endregion
|
|
2079
|
+
//#region src/server/facades/emmitter.d.ts
|
|
2080
|
+
declare const emmitter: EmmitterService$1<Record<string, any>>;
|
|
2081
|
+
//#endregion
|
|
2082
|
+
//#region src/server/facades/encrypt.d.ts
|
|
2083
|
+
declare const encrypt: EncryptService;
|
|
2084
|
+
//#endregion
|
|
2085
|
+
//#region src/server/facades/filesRepository.d.ts
|
|
2086
|
+
declare const fileRepository: FileRepository;
|
|
2087
|
+
//#endregion
|
|
1934
2088
|
//#region src/server/facades/logger.d.ts
|
|
1935
2089
|
declare const logger: LoggerService;
|
|
1936
2090
|
//#endregion
|
|
2091
|
+
//#region src/server/facades/migrator.d.ts
|
|
2092
|
+
declare const migrator: MigratorService;
|
|
2093
|
+
//#endregion
|
|
2094
|
+
//#region src/server/facades/permissionAssignmentRepository.d.ts
|
|
2095
|
+
declare const permissionAssignmentRepository: PermissionAssignmentRepository;
|
|
2096
|
+
//#endregion
|
|
2097
|
+
//#region src/server/facades/permissionRepository.d.ts
|
|
2098
|
+
declare const permissionRepository: PermissionRepository;
|
|
2099
|
+
//#endregion
|
|
1937
2100
|
//#region src/server/facades/router.d.ts
|
|
1938
|
-
declare const router:
|
|
2101
|
+
declare const router: RouterService<HttpContext>;
|
|
1939
2102
|
//#endregion
|
|
1940
2103
|
//#region src/server/facades/shell.d.ts
|
|
1941
2104
|
declare const shell: ShellService;
|
|
1942
2105
|
//#endregion
|
|
2106
|
+
//#region src/server/facades/tokenRepository.d.ts
|
|
2107
|
+
declare const tokenRepository: TokenRepository;
|
|
2108
|
+
//#endregion
|
|
2109
|
+
//#region src/server/facades/userRepository.d.ts
|
|
2110
|
+
declare const userRepository: UserRepository;
|
|
2111
|
+
//#endregion
|
|
2112
|
+
//#region src/server/contracts/KyselyContract.d.ts
|
|
2113
|
+
interface DatabaseKysely extends Kysely<DatabaseContract> {}
|
|
2114
|
+
//#endregion
|
|
1943
2115
|
//#region src/server/utils/defineLoader.d.ts
|
|
1944
2116
|
interface Loader<T = Record<string, any>> {
|
|
1945
2117
|
load(entities: T[]): Promise<void>;
|
|
@@ -1967,6 +2139,185 @@ interface HasManyThroughLoaderOptions<TEntity extends Record<string, any> = Reco
|
|
|
1967
2139
|
declare function loadHasManyThrough<TEntity extends Record<string, any> = Record<string, any>, TPivotEntity extends Record<string, any> = Record<string, any>, TTargetEntity extends Record<string, any> = Record<string, any>>(payload: any | any[], options: HasManyThroughLoaderOptions<TEntity, TPivotEntity, TTargetEntity>): Promise<void>;
|
|
1968
2140
|
declare function createHasManyThroughLoader<TEntity extends Record<string, any> = Record<string, any>, TPivotEntity extends Record<string, any> = Record<string, any>, TTargetEntity extends Record<string, any> = Record<string, any>>(options: HasManyThroughLoaderOptions<TEntity, TPivotEntity, TTargetEntity>): Loader<TEntity>;
|
|
1969
2141
|
//#endregion
|
|
2142
|
+
//#region src/server/entities/DriveConfigEntity.d.ts
|
|
2143
|
+
declare const DriveConfig_base: typeof DriveConfig$1 & {
|
|
2144
|
+
new (...args: any[]): {};
|
|
2145
|
+
__isConfigModel: boolean;
|
|
2146
|
+
serialize<T>(this: new (...args: any[]) => T, row: any): Promise<T>;
|
|
2147
|
+
list<T>(this: new (...args: any[]) => T): Promise<T[]>;
|
|
2148
|
+
find<T>(this: new (...args: any[]) => T, id: string): Promise<T | null>;
|
|
2149
|
+
findOrFail<T>(this: new (...args: any[]) => T, id: string): Promise<T>;
|
|
2150
|
+
create<T>(this: new (...args: any[]) => T, item: T & {
|
|
2151
|
+
id: string;
|
|
2152
|
+
}): Promise<void>;
|
|
2153
|
+
update<T>(this: new (...args: any[]) => T, id: string, data: T): Promise<void>;
|
|
2154
|
+
updateOrCreate<T>(this: new (...args: any[]) => T, id: string, data: Partial<T>): Promise<void>;
|
|
2155
|
+
destroy<T>(this: new (...args: any[]) => T, id: string): Promise<void>;
|
|
2156
|
+
} & Constructor;
|
|
2157
|
+
declare class DriveConfig extends DriveConfig_base {
|
|
2158
|
+
static serialize<T>(this: new (...args: any[]) => T, row: any): Promise<T>;
|
|
2159
|
+
}
|
|
2160
|
+
//#endregion
|
|
2161
|
+
//#region src/server/entities/FileEntity.d.ts
|
|
2162
|
+
interface URLCache {
|
|
2163
|
+
url: string;
|
|
2164
|
+
expires: number;
|
|
2165
|
+
}
|
|
2166
|
+
declare const File_base: typeof FileEntity & {
|
|
2167
|
+
new (...args: any[]): {
|
|
2168
|
+
listeners: Listener[];
|
|
2169
|
+
on(event: string, listener: (...args: any[]) => void): void;
|
|
2170
|
+
off(event: string, listener: (...args: any[]) => void): void;
|
|
2171
|
+
emit(event: string, ...args: any[]): void;
|
|
2172
|
+
emitAsync(event: string, ...args: any[]): Promise<void>;
|
|
2173
|
+
};
|
|
2174
|
+
} & Constructor & {
|
|
2175
|
+
new (...args: any[]): {
|
|
2176
|
+
save(): Promise<void>;
|
|
2177
|
+
destroy(): Promise<void>;
|
|
2178
|
+
softDelete(): Promise<void>;
|
|
2179
|
+
};
|
|
2180
|
+
__model: {
|
|
2181
|
+
table: "files";
|
|
2182
|
+
primaryKey: keyof FileTable;
|
|
2183
|
+
};
|
|
2184
|
+
serialize<T>(this: new () => T, row: any): Promise<T>;
|
|
2185
|
+
select(): _$kysely.SelectQueryBuilder<DatabaseContract, "files", any>;
|
|
2186
|
+
paginate<T>(this: new () => T, o?: ModelPaginateOptions<"files"> | undefined): Promise<PaginationEntity<T>>;
|
|
2187
|
+
list<T>(this: new () => T, o?: ModelListOptions<"files"> | undefined): Promise<T[]>;
|
|
2188
|
+
findOne<T>(this: new () => T, o?: ModelFindOptions<"files"> | undefined): Promise<T | undefined>;
|
|
2189
|
+
findOneOrFail<T>(this: new () => T, o?: ModelFindOptions<"files"> | undefined): Promise<T>;
|
|
2190
|
+
find<T>(this: new () => T, id: any): Promise<T | null>;
|
|
2191
|
+
findOrFail<T>(this: new () => T, id: any): Promise<T>;
|
|
2192
|
+
findBy<T>(this: new () => T, column: keyof FileTable, value: any): Promise<T>;
|
|
2193
|
+
findByOrFail<T>(this: new () => T, column: keyof FileTable, value: any): Promise<T>;
|
|
2194
|
+
exists<T>(this: new () => T, o?: ModelListOptions<"files"> | undefined): Promise<boolean>;
|
|
2195
|
+
count<T>(this: new () => T, o?: ModelCountOptions<"files"> | undefined): Promise<number>;
|
|
2196
|
+
create<T>(this: new () => T, payload: object & {
|
|
2197
|
+
drive: string;
|
|
2198
|
+
mimetype: string;
|
|
2199
|
+
client_name: string;
|
|
2200
|
+
filename: string;
|
|
2201
|
+
purpose: string;
|
|
2202
|
+
public: boolean;
|
|
2203
|
+
} & {
|
|
2204
|
+
id?: number | undefined;
|
|
2205
|
+
created_at?: string | undefined;
|
|
2206
|
+
updated_at?: string | undefined;
|
|
2207
|
+
deleted_at?: string | null | undefined;
|
|
2208
|
+
}): Promise<T>;
|
|
2209
|
+
createMany<T>(this: new () => T, values: (object & {
|
|
2210
|
+
drive: string;
|
|
2211
|
+
mimetype: string;
|
|
2212
|
+
client_name: string;
|
|
2213
|
+
filename: string;
|
|
2214
|
+
purpose: string;
|
|
2215
|
+
public: boolean;
|
|
2216
|
+
} & {
|
|
2217
|
+
id?: number | undefined;
|
|
2218
|
+
created_at?: string | undefined;
|
|
2219
|
+
updated_at?: string | undefined;
|
|
2220
|
+
deleted_at?: string | null | undefined;
|
|
2221
|
+
})[]): Promise<T[]>;
|
|
2222
|
+
update<T>(this: new () => T, o: ModelUpdateOptions<"files">): Promise<T>;
|
|
2223
|
+
updateById<T>(this: new () => T, id: any, values: {
|
|
2224
|
+
id?: number | undefined;
|
|
2225
|
+
deleted_at?: null | undefined;
|
|
2226
|
+
drive?: string | undefined;
|
|
2227
|
+
mimetype?: string | undefined;
|
|
2228
|
+
client_name?: string | undefined;
|
|
2229
|
+
filename?: string | undefined;
|
|
2230
|
+
purpose?: string | undefined;
|
|
2231
|
+
public?: boolean | undefined;
|
|
2232
|
+
}, options?: {
|
|
2233
|
+
debug?: boolean;
|
|
2234
|
+
} | undefined): Promise<T>;
|
|
2235
|
+
destroy<T>(this: new () => T, o?: ModelDestroyOptions<"files"> | undefined): Promise<void>;
|
|
2236
|
+
firstOrCreate<T>(this: new () => T, o: ModelFirstOrCreateOptions<"files">): T;
|
|
2237
|
+
updateOrCreate<T>(this: new (...args: any[]) => T, o: ModelUpdateOrCreateOptions<"files">): T;
|
|
2238
|
+
destroyById<T>(this: new () => T, id: any): Promise<void>;
|
|
2239
|
+
} & {
|
|
2240
|
+
new (...args: any[]): {};
|
|
2241
|
+
load<T>(this: new () => T, entities: T | T[], names: "metas" | "metas"[]): Promise<void>;
|
|
2242
|
+
} & {
|
|
2243
|
+
new (...args: any[]): {
|
|
2244
|
+
get<T = any>(name: string): Promise<T | undefined>;
|
|
2245
|
+
get<T = any>(name: string, defaultValue: T): Promise<T>;
|
|
2246
|
+
set(name: string, value: any): Promise<void>;
|
|
2247
|
+
};
|
|
2248
|
+
};
|
|
2249
|
+
declare class File extends File_base {
|
|
2250
|
+
static cache: Map<string, URLCache>;
|
|
2251
|
+
static has(filename: string): Promise<boolean>;
|
|
2252
|
+
static findByFilename(filename: string): Promise<File | undefined>;
|
|
2253
|
+
readStream(): Promise<NodeJS.ReadableStream>;
|
|
2254
|
+
read(): Promise<Uint8Array<ArrayBufferLike>>;
|
|
2255
|
+
loadUrl(options?: DriveUrlOptions): Promise<void>;
|
|
2256
|
+
static loadUrls(items: File[], options?: DriveUrlOptions): Promise<void>;
|
|
2257
|
+
static loadMetas(items: File[]): Promise<void>;
|
|
2258
|
+
deleteFromDrive(): Promise<void>;
|
|
2259
|
+
}
|
|
2260
|
+
//#endregion
|
|
2261
|
+
//#region src/server/entities/FileMetaEntity.d.ts
|
|
2262
|
+
declare const FileMeta_base: typeof FileMeta$1 & {
|
|
2263
|
+
new (...args: any[]): {
|
|
2264
|
+
save(): Promise<void>;
|
|
2265
|
+
destroy(): Promise<void>;
|
|
2266
|
+
softDelete(): Promise<void>;
|
|
2267
|
+
};
|
|
2268
|
+
__model: {
|
|
2269
|
+
table: "file_metas";
|
|
2270
|
+
primaryKey: keyof FileMetaTable;
|
|
2271
|
+
};
|
|
2272
|
+
serialize<T>(this: new () => T, row: any): Promise<T>;
|
|
2273
|
+
select(): _$kysely.SelectQueryBuilder<DatabaseContract, "file_metas", any>;
|
|
2274
|
+
paginate<T>(this: new () => T, o?: ModelPaginateOptions<"file_metas"> | undefined): Promise<PaginationEntity<T>>;
|
|
2275
|
+
list<T>(this: new () => T, o?: ModelListOptions<"file_metas"> | undefined): Promise<T[]>;
|
|
2276
|
+
findOne<T>(this: new () => T, o?: ModelFindOptions<"file_metas"> | undefined): Promise<T | undefined>;
|
|
2277
|
+
findOneOrFail<T>(this: new () => T, o?: ModelFindOptions<"file_metas"> | undefined): Promise<T>;
|
|
2278
|
+
find<T>(this: new () => T, id: any): Promise<T | null>;
|
|
2279
|
+
findOrFail<T>(this: new () => T, id: any): Promise<T>;
|
|
2280
|
+
findBy<T>(this: new () => T, column: keyof FileMetaTable, value: any): Promise<T>;
|
|
2281
|
+
findByOrFail<T>(this: new () => T, column: keyof FileMetaTable, value: any): Promise<T>;
|
|
2282
|
+
exists<T>(this: new () => T, o?: ModelListOptions<"file_metas"> | undefined): Promise<boolean>;
|
|
2283
|
+
count<T>(this: new () => T, o?: ModelCountOptions<"file_metas"> | undefined): Promise<number>;
|
|
2284
|
+
create<T>(this: new () => T, payload: object & {
|
|
2285
|
+
name: string;
|
|
2286
|
+
file_id: number;
|
|
2287
|
+
} & {
|
|
2288
|
+
id?: number | undefined;
|
|
2289
|
+
value?: string | null | undefined;
|
|
2290
|
+
created_at?: string | undefined;
|
|
2291
|
+
updated_at?: string | undefined;
|
|
2292
|
+
deleted_at?: string | null | undefined;
|
|
2293
|
+
}): Promise<T>;
|
|
2294
|
+
createMany<T>(this: new () => T, values: (object & {
|
|
2295
|
+
name: string;
|
|
2296
|
+
file_id: number;
|
|
2297
|
+
} & {
|
|
2298
|
+
id?: number | undefined;
|
|
2299
|
+
value?: string | null | undefined;
|
|
2300
|
+
created_at?: string | undefined;
|
|
2301
|
+
updated_at?: string | undefined;
|
|
2302
|
+
deleted_at?: string | null | undefined;
|
|
2303
|
+
})[]): Promise<T[]>;
|
|
2304
|
+
update<T>(this: new () => T, o: ModelUpdateOptions<"file_metas">): Promise<T>;
|
|
2305
|
+
updateById<T>(this: new () => T, id: any, values: {
|
|
2306
|
+
id?: number | undefined;
|
|
2307
|
+
name?: string | undefined;
|
|
2308
|
+
value?: string | null | undefined;
|
|
2309
|
+
file_id?: number | undefined;
|
|
2310
|
+
deleted_at?: null | undefined;
|
|
2311
|
+
}, options?: {
|
|
2312
|
+
debug?: boolean;
|
|
2313
|
+
} | undefined): Promise<T>;
|
|
2314
|
+
destroy<T>(this: new () => T, o?: ModelDestroyOptions<"file_metas"> | undefined): Promise<void>;
|
|
2315
|
+
firstOrCreate<T>(this: new () => T, o: ModelFirstOrCreateOptions<"file_metas">): T;
|
|
2316
|
+
updateOrCreate<T>(this: new (...args: any[]) => T, o: ModelUpdateOrCreateOptions<"file_metas">): T;
|
|
2317
|
+
destroyById<T>(this: new () => T, id: any): Promise<void>;
|
|
2318
|
+
} & Constructor;
|
|
2319
|
+
declare class FileMeta extends FileMeta_base {}
|
|
2320
|
+
//#endregion
|
|
1970
2321
|
//#region src/server/entities/ModuleEntity.d.ts
|
|
1971
2322
|
declare const Module_base: typeof Module$1;
|
|
1972
2323
|
declare class Module extends Module_base {
|
|
@@ -1975,10 +2326,121 @@ declare class Module extends Module_base {
|
|
|
1975
2326
|
staticPath(...parts: string[]): string;
|
|
1976
2327
|
command: typeof shell.command;
|
|
1977
2328
|
load(): void;
|
|
2329
|
+
findClientEntrypointFilename(context?: 'dev' | 'node' | 'browser'): string | null;
|
|
2330
|
+
}
|
|
2331
|
+
//#endregion
|
|
2332
|
+
//#region src/server/entities/PluginEntryEntity.d.ts
|
|
2333
|
+
declare const PluginEntryEntity_base: typeof PluginEntity$1;
|
|
2334
|
+
declare class PluginEntryEntity extends PluginEntryEntity_base {
|
|
2335
|
+
directory: string;
|
|
2336
|
+
makePath(...parts: string[]): string;
|
|
2337
|
+
}
|
|
2338
|
+
//#endregion
|
|
2339
|
+
//#region src/server/entities/PluginEntity.d.ts
|
|
2340
|
+
interface AddApiFolderOptions {
|
|
2341
|
+
prefix?: string;
|
|
2342
|
+
}
|
|
2343
|
+
declare class PluginEntity extends PluginEntryEntity {
|
|
2344
|
+
apiFolders: Map<string, AddApiFolderOptions>;
|
|
2345
|
+
apiDirectories: Set<string>;
|
|
2346
|
+
constructor();
|
|
2347
|
+
staticPath(...parts: string[]): string;
|
|
2348
|
+
load(): Promise<void>;
|
|
2349
|
+
onRouterRegistered(ctx: RouterEvents['router:registered']): Promise<void>;
|
|
2350
|
+
addApiFolder(directory: string, options?: AddApiFolderOptions): void;
|
|
2351
|
+
addRouterFolder(directory: string): void;
|
|
2352
|
+
static fromPluginDiscoverEntity<T>(this: new () => T, entity: PluginEntryEntity): T;
|
|
2353
|
+
}
|
|
2354
|
+
//#endregion
|
|
2355
|
+
//#region src/server/queries/exists.d.ts
|
|
2356
|
+
declare function exists<T extends keyof DatabaseContract, O extends ListOptions<T>>(table: T, options?: O): Promise<boolean>;
|
|
2357
|
+
//#endregion
|
|
2358
|
+
//#region src/server/queries/incremental.d.ts
|
|
2359
|
+
declare module 'kysely' {
|
|
2360
|
+
interface CreateTableBuilder<TB extends string, C extends string = never> {
|
|
2361
|
+
addIdColumn<CN extends string = 'id'>(col?: CN): CreateTableBuilder<TB, C | CN>;
|
|
2362
|
+
}
|
|
2363
|
+
}
|
|
2364
|
+
//#endregion
|
|
2365
|
+
//#region src/server/queries/softDelete.d.ts
|
|
2366
|
+
type WhereCapable<QB> = {
|
|
2367
|
+
where: (...args: any[]) => QB;
|
|
2368
|
+
};
|
|
2369
|
+
type UpdateFrom$1<T extends keyof DatabaseContract> = ReturnType<typeof database.updateTable<T>>;
|
|
2370
|
+
interface SoftDeleteOptions<T extends keyof DatabaseContract> {
|
|
2371
|
+
serialize?: (row: Selectable<DatabaseContract[T]>) => any;
|
|
2372
|
+
query: (qb: UpdateFrom$1<T>) => UpdateFrom$1<T>;
|
|
2373
|
+
}
|
|
2374
|
+
type SoftDeleteResult<T extends keyof DatabaseContract, O extends SoftDeleteOptions<T> | undefined> = O extends undefined ? Selectable<DatabaseContract[T]>[] : O extends {
|
|
2375
|
+
serialize: (row: Selectable<DatabaseContract[T]>) => infer R;
|
|
2376
|
+
} ? R[] : Selectable<DatabaseContract[T]>[];
|
|
2377
|
+
declare function whereNotDeleted<QB extends WhereCapable<QB>>(qb: QB): QB;
|
|
2378
|
+
declare function undeleted(qb: ExpressionBuilder$1<any, any>): _$kysely.ExpressionWrapper<any, any, _$kysely.SqlBool>;
|
|
2379
|
+
declare namespace undeleted {
|
|
2380
|
+
var column: (col: string) => (qb: ExpressionBuilder$1<any, any>) => _$kysely.ExpressionWrapper<any, any, _$kysely.SqlBool>;
|
|
2381
|
+
}
|
|
2382
|
+
declare const deleted: (qb: ExpressionBuilder$1<any, any>) => _$kysely.ExpressionWrapper<any, any, _$kysely.SqlBool>;
|
|
2383
|
+
declare const addSoftDeleteColumn: (ctb: CreateTableBuilder$1<any, any>) => CreateTableBuilder$1<any, any>;
|
|
2384
|
+
declare function softDelete<T extends keyof DatabaseContract, O extends SoftDeleteOptions<T>>(table: T, options?: O): Promise<SoftDeleteResult<T, O>>;
|
|
2385
|
+
declare module 'kysely' {
|
|
2386
|
+
interface CreateTableBuilder<TB extends string, C extends string = never> {
|
|
2387
|
+
addSoftDeleteColumn(): CreateTableBuilder$1<TB, C | 'deleted_at'>;
|
|
2388
|
+
}
|
|
2389
|
+
}
|
|
2390
|
+
//#endregion
|
|
2391
|
+
//#region src/server/queries/timestamp.d.ts
|
|
2392
|
+
declare const addCreatedColumn: (ctb: CreateTableBuilder$1<any, any>) => CreateTableBuilder$1<any, any>;
|
|
2393
|
+
declare const addUpdatedColumn: (ctb: CreateTableBuilder$1<any, any>) => CreateTableBuilder$1<any, any>;
|
|
2394
|
+
declare const addTimestampColumns: (ctb: CreateTableBuilder$1<any, any>) => CreateTableBuilder$1<any, any>;
|
|
2395
|
+
declare module 'kysely' {
|
|
2396
|
+
interface CreateTableBuilder<TB extends string, C extends string = never> {
|
|
2397
|
+
addTimestampColumns(): CreateTableBuilder$1<TB, C | 'created_at' | 'updated_at'>;
|
|
2398
|
+
addCreatedColumn(): CreateTableBuilder$1<TB, C | 'created_at'>;
|
|
2399
|
+
addUpdatedColumn(): CreateTableBuilder$1<TB, C | 'updated_at'>;
|
|
2400
|
+
}
|
|
2401
|
+
}
|
|
2402
|
+
//#endregion
|
|
2403
|
+
//#region src/server/middlewares/AuthMiddleware.d.ts
|
|
2404
|
+
type AuthMiddlewareContext = {
|
|
2405
|
+
user: UserEntity;
|
|
2406
|
+
token: Token;
|
|
2407
|
+
};
|
|
2408
|
+
declare class AuthMiddleware implements Middleware {
|
|
2409
|
+
handle(ctx: any): Promise<AuthMiddlewareContext>;
|
|
2410
|
+
}
|
|
2411
|
+
//#endregion
|
|
2412
|
+
//#region src/server/middlewares/AuthSilenceMiddleware.d.ts
|
|
2413
|
+
type AuthSilenceMiddlewareContext = {
|
|
2414
|
+
user?: UserEntity$1;
|
|
2415
|
+
token?: Token;
|
|
2416
|
+
};
|
|
2417
|
+
declare class AuthSilenceMiddleware implements Middleware {
|
|
2418
|
+
handle(ctx: HttpContext): Promise<AuthSilenceMiddlewareContext>;
|
|
2419
|
+
}
|
|
2420
|
+
//#endregion
|
|
2421
|
+
//#region src/server/middlewares/AuthorizationMiddleware.d.ts
|
|
2422
|
+
type AuthorizationContext = MiddlewareHandleResult<[AuthorizationMiddleware]>;
|
|
2423
|
+
interface AuthorizePermissionPayload {
|
|
2424
|
+
action: string;
|
|
2425
|
+
resource: string;
|
|
2426
|
+
conditions?: Record<string, any>;
|
|
2427
|
+
}
|
|
2428
|
+
declare class AuthorizePermission implements Middleware {
|
|
2429
|
+
private permissions;
|
|
2430
|
+
constructor(payload: AuthorizePermissionPayload | AuthorizePermissionPayload[]);
|
|
2431
|
+
handle(ctx: AuthorizationContext): Promise<void>;
|
|
2432
|
+
}
|
|
2433
|
+
declare class AuthorizationMiddleware implements Middleware {
|
|
2434
|
+
handle(ctx: AuthSilenceMiddlewareContext): Promise<{
|
|
2435
|
+
acl: Acl;
|
|
2436
|
+
}>;
|
|
2437
|
+
static create(payload: AuthorizePermissionPayload | AuthorizePermissionPayload[]): AuthorizePermission;
|
|
1978
2438
|
}
|
|
1979
2439
|
//#endregion
|
|
1980
2440
|
//#region src/server/utils/basePath.d.ts
|
|
1981
2441
|
declare function basePath(...args: string[]): string;
|
|
2442
|
+
declare function storagePath(...args: string[]): string;
|
|
2443
|
+
declare function relativeToBasePath(...args: string[]): string;
|
|
1982
2444
|
declare function tmpPath(...args: string[]): string;
|
|
1983
2445
|
//#endregion
|
|
1984
2446
|
//#region src/server/utils/createLoaderFactory.d.ts
|
|
@@ -1988,6 +2450,9 @@ declare function createLoaderFactory<E extends Record<string, any> = Record<stri
|
|
|
1988
2450
|
load: (entities: E | E[], names: keyof R | (keyof R)[]) => Promise<void>;
|
|
1989
2451
|
};
|
|
1990
2452
|
//#endregion
|
|
2453
|
+
//#region src/server/utils/defineHandler.d.ts
|
|
2454
|
+
declare function defineHandler(handler: (ctx: HttpContext) => (Promise<any> | (() => any))): (ctx: HttpContext) => (Promise<any> | (() => any));
|
|
2455
|
+
//#endregion
|
|
1991
2456
|
//#region src/server/utils/generateIndexFile.d.ts
|
|
1992
2457
|
declare function generateIndexFile(options: any): void;
|
|
1993
2458
|
//#endregion
|
|
@@ -2014,4 +2479,5 @@ declare function importAll(directory: string, options?: Options): Promise<Record
|
|
|
2014
2479
|
//#region src/server/utils/importOne.d.ts
|
|
2015
2480
|
declare function importOne(filenames: string[]): Promise<any>;
|
|
2016
2481
|
//#endregion
|
|
2017
|
-
export {
|
|
2482
|
+
export { Acl as AclEntity, AuthMiddleware, AuthMiddlewareContext, AuthSilenceMiddleware, AuthSilenceMiddlewareContext, AuthorizationContext, AuthorizationMiddleware, AuthorizePermission, AuthorizePermissionPayload, CliCommand, CliEvents, CliService, ArteTesterService as CliTesterService, CliWrapperService, ConfigFSService, ConfigFSServiceOptions, ConfigManagerOptions, ConfigManagerService, ConfigModel, ConfigRepository, ConfigS3Service, CookieMapEntity, CountOptions, CreateOptions, DatabaseContract, DatabaseKysely, DatabaseRepository, DatabaseRepositoryInferMixin, DeleteFrom, DeleteManyOptions, DestroyOptions, DownloadService, DownloadedFetchOptions, DriveBaseGateway, DriveConfig as DriveConfigEntity, DriveContract, DriveFSConfig, DriveFS as DriveFSGateway, DriveS3 as DriveS3Gateway, DriveService, DriveUploadUrlOptions, DriveUrlOptions, EmailTemplateMetaTable, EmailTemplateTable, EmmitterService, EncryptService, EnvService, EventContract, ExpressionBuilder, File as FileEntity, FileMeta as FileMetaEntity, FileMetaTable, FileRepository, FileRepositoryQueryOptions, FileTable, FindManyOptions, FindOneOptions, FirstOrCreateOptions, GitBranch, GitBranchFetchOptions, GitBranchRepository, GitCommit, GitCommitListOptions, GitCommitRef, GitCommitRepository, GitGateway, GitGatewayOptions, GitRepoInfo, HandleResult, Handler, HasManyThroughLoaderOptions, HttpContext, HttpMethod, IRepositoryTypes, InsertFrom, IpcMessage, JobTable, LifecycleService, ListOptions, Loader, LoaderRecord, Metadafilter, Metadata as MetadataMixin, MetadataQueryPayload, MetadataQueryService, MetadataService, Middleware, MiddlewareHandleResult, Migration, MigrationEntity, MigrationEntiyData, MigrationSource, MigrationsTable, MigratorService, MigratorServiceOptions, ModelConfig as ModelConfigMixin, ModelCountOptions, ModelCreateOptions, ModelDestroyOptions, ModelEntity, ModelFindOptions, ModelFirstOrCreateOptions, ModelListOptions, ModelMixin, ModelPaginateOptions, ModelUpdateOptions, ModelUpdateOrCreateOptions, Module as ModuleEntity, OauthAccountTable, OauthTokenTable, ObjectOptions, PageRequestContextEntity, PageRequestContextEntityOptions, PaginateResult, PaginatedCommits, Pagination, PermissionAssignmentRepository, PermissionAssignmentRepositoryQueryOptions, PermissionAssignmentTable, PermissionRepository, PermissionRepositoryQueryOptions, PermissionTable, PluginEntity, PluginEntryEntity, PluginIpcClient, PluginIpcHost, PluginRouter, Redirect, Relation as RelationsMixin, Request, ResourceMethod, Response, RoleTable, RouteDefinition, Route as RouteEntity, RouteHandler, RouteReply, RouteRequest, RouteResponsePayload, RouterEvents, RouterFileBaseRoutingService, RouterRegisterEntry, RouterRegister as RouterRegisterService, RouterResourceConfig as RouterResourceConfigService, RouterResourceOptions, RouterResourceService, RouterService, S3DriveConfig, SeederEntity, SeederEntiyData, SeederEvents, SeederResult, SeeederService as SeederService, SeederServiceOptions, SeederSource, SelectBuilder, SelectFrom, SerializableResult, SerializeOptions, ShellService, SoftDeleteOptions, SoftDeleteResult, TableColumn, TokenRepository, TokenRepositoryQueryOptions, TokenTable, UpdateFrom, UpdateOptions, UpdateOrCreateOptions, UploadSessionTable, UploadUrlOptions, UrlOptions, UserMetaTable, UserRepository, UserRepositoryQueryOptions, UserRoleTable, UserTable, addCreatedColumn, addSoftDeleteColumn, addTimestampColumns, addUpdatedColumn, basePath, config, _default as container, count, create, createDefault, createHasManyThroughLoader, createLoaderFactory, createMysql, database, defineHandler, defineLoader, deleted, destroy, download, drive, emmitter, encrypt, exists, fileRepository as filesRepository, findOne, findOneOrFail, firstOrCreate, generateIndexFile, importAll, importFiles, importGlob, importOne, key, list, loadHasManyThrough, logger, migrator, now, paginate, permissionAssignmentRepository, permissionRepository, printObject, printTable, relativeToBasePath, router, shell, softDelete, storagePath, tmpPath, tokenRepository, undeleted, update, updateDefault, updateMysql, updateOrCreate, userRepository, valueToString, whereNotDeleted };
|
|
2483
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC5tdHMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci91dGlscy9wcmludFRhYmxlLmQudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0NvbmZpZ1NlcnZpY2UuZC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvQ29udGFpbmVyU2VydmljZS5kLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLmQudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0VtbWl0dGVyU2VydmljZS5kLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9MaWZlY3ljbGVIb29rLmQudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL2NvbXBvc2UuZC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS5kLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zY2hlbWFzL3Blcm1pc3Npb25Bc3NpZ25tZW50U2NoZW1hLmQudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvblNjaGVtYS5kLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zY2hlbWFzL3Rva2VuU2NoZW1hLmQudHMiLCIuLi8uLi9zcmMvc2hhcmVkL21peGlucy9Ib29rc01peGluLmQudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1Blcm1pc3Npb25FbnRpdHkuZC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvQWNsRW50aXR5LmQudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0Nvb2tpZU1hcEVudGl0eS5kLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Ecml2ZUNvbmZpZ0VudGl0eS5kLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Ecml2ZUVudHJ5RW50aXR5LmQudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0ZpbGVFbnRpdHkuZC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRmlsZU1ldGFFbnRpdHkuZC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTW9kdWxlTWFuaWZlc3RFbnRpdHkuZC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTW9kdWxlRW50aXR5LmQudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1BhZ2luYXRpb25FbnRpdHkuZC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvUGx1Z2luRW50aXR5LmQudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1JvbGVFbnRpdHkuZC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvVXNlckVudGl0eS5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9DbGlTZXJ2aWNlLmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL0NsaVRlc3RlclNlcnZpY2UuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvQ2xpV3JhcHBlclNlcnZpY2UuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvQ29uZmlnRlNTZXJ2aWNlLmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NjaGVtYXMvZW52U2NoZW1hLmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL0VudlNlcnZpY2UuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvQ29uZmlnTWFuYWdlclNlcnZpY2UuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZ2F0ZXdheXMvRHJpdmVCYXNlR2F0ZXdheS5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9nYXRld2F5cy9Ecml2ZVMzR2F0ZXdheS5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9Db25maWdTM1NlcnZpY2UuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvRG93bmxvYWRTZXJ2aWNlLmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL2NvbnRyYWN0cy9Ecml2ZUNvbnRyYWN0LmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL0RyaXZlU2VydmljZS5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9NaWdyYXRpb25FbnRpdHkuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL2VudGl0aWVzL1BhZ2VSZXF1ZXN0Q29udGV4dEVudGl0eS5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9BY2xFbnRpdHkuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvY29udHJhY3RzL0h0dHBDb250ZXh0Q29udHJhY3QuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvY29udHJhY3RzL1JvdXRlckNvbnRyYWN0LmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL2VudGl0aWVzL1JvdXRlRW50aXR5LmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL1JvdXRlclNlcnZpY2UuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZW50aXRpZXMvU2VlZGVyRW50aXR5LmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL1NlZWRlclNlcnZpY2UuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvY29udHJhY3RzL0V2ZW50Q29udHJhY3QuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvRW1taXR0ZXJTZXJ2aWNlLmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL0VuY3J5cHRTZXJ2aWNlLmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL2dhdGV3YXlzL0dpdEdhdGV3YXkuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvR2l0QnJhbmNoUmVwb3NpdG9yeS5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9HaXRDb21taXRSZXBvc2l0b3J5LmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL0xpZmVjeWNsZVNlcnZpY2UuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvY29udHJhY3RzL0RhdGFiYXNlQ29udHJhY3QuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvTWV0YWRhdGFRdWVyeVNlcnZpY2UuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvTWV0YWRhdGFTZXJ2aWNlLmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL01pZ3JhdG9yU2VydmljZS5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9QbHVnaW5JcGNDbGllbnQuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvUGx1Z2luSXBjSG9zdC5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9QbHVnaW5Sb3V0ZXIuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvUm91dGVyRmlsZUJhc2VSb3V0aW5nU2VydmljZS5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9Sb3V0ZXJSZWdpc3RlclNlcnZpY2UuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvUm91dGVyUmVzb3VyY2VTZXJ2aWNlLmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL21peGlucy9Nb2RlbENvbmZpZ01peGluLmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL1JvdXRlclJlc291cmNlQ29uZmlnU2VydmljZS5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9TaGVsbFNlcnZpY2UuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcmVwb3NpdG9yaWVzL0RhdGFiYXNlUmVwb3NpdG9yeS5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9yZXBvc2l0b3JpZXMvQ29uZmlnUmVwb3NpdG9yeS5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9yZXBvc2l0b3JpZXMvRmlsZVJlcG9zaXRvcnkuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcmVwb3NpdG9yaWVzL1Blcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeS5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9yZXBvc2l0b3JpZXMvUGVybWlzc2lvblJlcG9zaXRvcnkuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbWl4aW5zL0RhdGFiYXNlUmVwb3NpdG9yeUluZmVyTWl4aW4uZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcmVwb3NpdG9yaWVzL1Rva2VuUmVwb3NpdG9yeS5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9yZXBvc2l0b3JpZXMvVXNlclJlcG9zaXRvcnkuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZ2F0ZXdheXMvRHJpdmVGU0dhdGV3YXkuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbWl4aW5zL01ldGFkYXRhTWl4aW4uZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9xdWVyaWVzL2NvbW1vbi5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9xdWVyaWVzL3VwZGF0ZU9yQ3JlYXRlLmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL3F1ZXJpZXMvbGlzdC5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9xdWVyaWVzL3BhZ2luYXRlLmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL3F1ZXJpZXMvY291bnQuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcXVlcmllcy9jcmVhdGUuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcXVlcmllcy91cGRhdGUuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcXVlcmllcy9kZXN0cm95LmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL3F1ZXJpZXMvZmlyc3RPckNyZWF0ZS5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9xdWVyaWVzL2ZpbmRPbmUuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbWl4aW5zL01vZGVsTWl4aW4uZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbWl4aW5zL1JlbGF0aW9uc01peGluLmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvY29uZmlnLmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvY29udGFpbmVyLmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvZG93bmxvYWQuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZmFjYWRlcy9kcml2ZS5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9mYWNhZGVzL2VtbWl0dGVyLmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvZW5jcnlwdC5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9mYWNhZGVzL2ZpbGVzUmVwb3NpdG9yeS5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9mYWNhZGVzL2xvZ2dlci5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9mYWNhZGVzL21pZ3JhdG9yLmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvcGVybWlzc2lvbkFzc2lnbm1lbnRSZXBvc2l0b3J5LmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvcGVybWlzc2lvblJlcG9zaXRvcnkuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZmFjYWRlcy9yb3V0ZXIuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZmFjYWRlcy9zaGVsbC5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9mYWNhZGVzL3Rva2VuUmVwb3NpdG9yeS5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9mYWNhZGVzL3VzZXJSZXBvc2l0b3J5LmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL2NvbnRyYWN0cy9LeXNlbHlDb250cmFjdC5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci91dGlscy9kZWZpbmVMb2FkZXIuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbG9hZGVycy9jcmVhdGVIYXNNYW55VGhyb3VnaExvYWRlci5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9Ecml2ZUNvbmZpZ0VudGl0eS5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9GaWxlRW50aXR5LmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL2VudGl0aWVzL0ZpbGVNZXRhRW50aXR5LmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL2VudGl0aWVzL01vZHVsZUVudGl0eS5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9QbHVnaW5FbnRyeUVudGl0eS5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9QbHVnaW5FbnRpdHkuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcXVlcmllcy9leGlzdHMuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcXVlcmllcy9pbmNyZW1lbnRhbC5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9xdWVyaWVzL3NvZnREZWxldGUuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcXVlcmllcy90aW1lc3RhbXAuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbWlkZGxld2FyZXMvQXV0aE1pZGRsZXdhcmUuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbWlkZGxld2FyZXMvQXV0aFNpbGVuY2VNaWRkbGV3YXJlLmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL21pZGRsZXdhcmVzL0F1dGhvcml6YXRpb25NaWRkbGV3YXJlLmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL3V0aWxzL2Jhc2VQYXRoLmQudHMiLCIuLi8uLi9zcmMvc2VydmVyL3V0aWxzL2NyZWF0ZUxvYWRlckZhY3RvcnkuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvdXRpbHMvZGVmaW5lSGFuZGxlci5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci91dGlscy9nZW5lcmF0ZUluZGV4RmlsZS5kLnRzIiwiLi4vLi4vc3JjL3NlcnZlci91dGlscy9pbXBvcnRBbGwuZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvdXRpbHMvaW1wb3J0T25lLmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBUYWJsZUNvbHVtbiB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICB2YWx1ZTogc3RyaW5nIHwgKChpdGVtOiBhbnkpID0+IHN0cmluZyk7XG4gICAgd2lkdGg/OiBudW1iZXI7XG4gICAgcmVhbFdpZHRoPzogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBPYmplY3RPcHRpb25zIHtcbiAgICBrZXlXaWR0aD86IG51bWJlcjtcbn1cbmV4cG9ydCBkZWNsYXJlIGZ1bmN0aW9uIHByaW50T2JqZWN0KG91dHB1dD86IGFueSwgb3B0aW9ucz86IE9iamVjdE9wdGlvbnMpOiB2b2lkO1xuZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gcHJpbnRUYWJsZShpdGVtczogYW55W10sIGNvbHVtbnM/OiBUYWJsZUNvbHVtbltdKTogdm9pZDtcbiIsImludGVyZmFjZSBFbnRyeSB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgdmFsdWU6IGFueTtcbiAgICBzb3VyY2U6IHN0cmluZztcbn1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbmZpZ1NlcnZpY2Uge1xuICAgIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXk6IHN0cmluZztcbiAgICBlbnRyaWVzOiBNYXA8c3RyaW5nLCBFbnRyeT47XG4gICAgY29uc3RydWN0b3IoKTtcbiAgICBsaXN0KCk6IEVudHJ5W107XG4gICAgcGFyc2VWYWx1ZSh2YWx1ZTogYW55KTogYW55O1xuICAgIGxvYWRGcm9tUmVjb3JkKHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55Piwgc291cmNlPzogc3RyaW5nKTogdm9pZDtcbiAgICBsb2FkRnJvbUVudHJpZXMoZW50cmllczogW3N0cmluZywgYW55XVtdLCBzb3VyY2U/OiBzdHJpbmcpOiB2b2lkO1xuICAgIHRvUmVjb3JkKCk6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgaGFzKGtleTogc3RyaW5nKTogYm9vbGVhbjtcbiAgICBnZXQ8VCA9IGFueSB8IHVuZGVmaW5lZD4oa2V5OiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IGFueSk6IFQ7XG4gICAgZ2V0T25lPFQgPSBhbnkgfCB1bmRlZmluZWQ+KGtleXM6IHN0cmluZ1tdLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBUO1xuICAgIHNldChrZXk6IHN0cmluZywgdmFsdWU6IGFueSwgc291cmNlPzogc3RyaW5nKTogdm9pZDtcbiAgICB1bnNldChrZXk6IHN0cmluZyk6IHZvaWQ7XG4gICAgY2xlYXIoKTogdm9pZDtcbiAgICBkdW1wKCk6IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5leHBvcnQge307XG4iLCJ0eXBlIENvbnN0cnVjdG9yPFQgPSBvYmplY3Q+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcbnR5cGUgRW50cnlLZXkgPSBzdHJpbmcgfCBzeW1ib2wgfCBDb25zdHJ1Y3RvcjtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRhaW5lclNlcnZpY2Uge1xuICAgIHByaXZhdGUgZW50cmllcztcbiAgICBsb2FkRnJvbVJlY29yZChyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkO1xuICAgIHRvUmVjb3JkKCk6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgcHJpdmF0ZSBnZXRLZXk7XG4gICAgc2V0KHBheWxvYWQ6IEVudHJ5S2V5LCB2YWx1ZTogYW55KTogdGhpcztcbiAgICBoYXMocGF5bG9hZDogRW50cnlLZXkpOiBib29sZWFuO1xuICAgIGdldDxUPihwYXlsb2FkOiBFbnRyeUtleSk6IFQ7XG4gICAgc2luZ2xldG9uPFQ+KGNsYXNzQ29uc3RydWN0b3I6IENvbnN0cnVjdG9yPFQ+KTogVDtcbiAgICBsb2FkKGVudHJpZXM6IFJlY29yZDxhbnksIGFueT4pOiB2b2lkO1xuICAgIHByb3h5PFQgPSB1bmtub3duPihrZXk6IEVudHJ5S2V5KTogVDtcbiAgICBrZXlzKCk6IEVudHJ5S2V5W107XG59XG5leHBvcnQge307XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBMb2dnZXJTZXJ2aWNlIHtcbiAgICBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5OiBzdHJpbmc7XG4gICAgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBhbnkpOiB2b2lkO1xuICAgIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQ7XG4gICAgd2FybihtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBhbnkpOiB2b2lkO1xuICAgIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQ7XG4gICAgY2hpbGQob3B0aW9uczogYW55KTogTG9nZ2VyU2VydmljZTtcbn1cbiIsImltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJy4vTG9nZ2VyU2VydmljZS50cyc7XG5pbnRlcmZhY2UgRW1taXR0ZXJIYW5kbGVyIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGV2ZW50OiBzdHJpbmc7XG4gICAgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuICAgIG9yaWdpbmFsTGlzdGVuZXI/OiAoLi4uYXJnczogYW55W10pID0+IGFueTtcbn1cbmludGVyZmFjZSBPbk9wdGlvbnMge1xuICAgIGlkPzogc3RyaW5nO1xuICAgIHVuaXF1ZT86IGJvb2xlYW47XG59XG5pbnRlcmZhY2UgT25EZWJvdW5jZU9wdGlvbnMgZXh0ZW5kcyBPbk9wdGlvbnMge1xuICAgIGRlYm91bmNlPzogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBFbW1pdHRlclNlcnZpY2VPcHRpb25zIHtcbiAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZTtcbn1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVtbWl0dGVyU2VydmljZTxFdmVudHMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXk6IHN0cmluZztcbiAgICBwcml2YXRlIGhhbmRsZXJzO1xuICAgIHByaXZhdGUgZGVidWc7XG4gICAgcHJpdmF0ZSBsb2dnZXI7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucz86IEVtbWl0dGVyU2VydmljZU9wdGlvbnMpO1xuICAgIHN0YXRpYyBjcmVhdGU8RXZlbnRzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+KG9wdGlvbnM/OiBFbW1pdHRlclNlcnZpY2VPcHRpb25zKTogRW1taXR0ZXJTZXJ2aWNlPEV2ZW50cz47XG4gICAgc2V0RGVidWcoZGVidWc6IGJvb2xlYW4pOiB2b2lkO1xuICAgIHNldExvZ2dlcihsb2dnZXI6IExvZ2dlclNlcnZpY2UpOiB2b2lkO1xuICAgIG9uPEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBsaXN0ZW5lcjogKGFyZ3M6IEV2ZW50c1tLXSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlcjtcbiAgICBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlcjtcbiAgICBvbmNlPEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBsaXN0ZW5lcjogKGFyZ3M6IEV2ZW50c1tLXSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlcjtcbiAgICBvbmNlKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoYXJnczogYW55KSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyO1xuICAgIG9uRGVib3VuY2U8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25EZWJvdW5jZU9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXI7XG4gICAgb25EZWJvdW5jZShldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uRGVib3VuY2VPcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyO1xuICAgIG9uQW55T2Y8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnRzOiBLW10sIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyW107XG4gICAgb25BbnlPZihldmVudHM6IHN0cmluZ1tdLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlcltdO1xuICAgIG9mZihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRnVuY3Rpb24pOiB2b2lkO1xuICAgIGVtaXQ8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGFyZ3M6IEV2ZW50c1tLXSk6IHZvaWQ7XG4gICAgZW1pdChldmVudDogc3RyaW5nLCBhcmdzPzogYW55KTogdm9pZDtcbiAgICBlbWl0QW5kV2FpdDxLIGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogSywgYXJnczogRXZlbnRzW0tdKTogUHJvbWlzZTx2b2lkPjtcbiAgICBlbWl0QW5kV2FpdChldmVudDogc3RyaW5nLCBhcmdzPzogYW55KTogUHJvbWlzZTx2b2lkPjtcbiAgICBsaXN0KCk6IEVtbWl0dGVySGFuZGxlcltdO1xuICAgIGxpc3RCeUV2ZW50KGV2ZW50OiBzdHJpbmcpOiBFbW1pdHRlckhhbmRsZXJbXTtcbiAgICByZW1vdmUocGF5bG9hZDogc3RyaW5nIHwgc3RyaW5nW10pOiB2b2lkO1xuICAgIGNsZWFyKCk6IHZvaWQ7XG4gICAgaGFzSGFuZGxlcnMoKTogYm9vbGVhbjtcbn1cbmV4cG9ydCB7fTtcbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZmVjeWNsZUhvb2sge1xuICAgIGhvb2tfaWQ6IHN0cmluZztcbiAgICBob29rX2FsaWFzZXM/OiBzdHJpbmdbXTtcbiAgICBvcmRlcj86IG51bWJlcjtcbiAgICBzdWJob29rcz86IExpZmVjeWNsZUhvb2tbXTtcbiAgICByZWdpc3RlcigpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGxvYWQoKTogUHJvbWlzZTx2b2lkPjtcbiAgICBib290KCk6IFByb21pc2U8dm9pZD47XG4gICAgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPjtcbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIHJlZ2lzdGVyICovXG4gICAgb25SZWdpc3RlcigpOiBQcm9taXNlPHZvaWQ+O1xuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgbG9hZCAqL1xuICAgIG9uTG9hZCgpOiBQcm9taXNlPHZvaWQ+O1xuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgYm9vdCAqL1xuICAgIG9uQm9vdCgpOiBQcm9taXNlPHZvaWQ+O1xuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2Ugc2h1dGRvd24gKi9cbiAgICBvblNodXRkb3duKCk6IFByb21pc2U8dm9pZD47XG59XG4iLCJpbXBvcnQgdHlwZSB7IFVuaW9uVG9JbnRlcnNlY3Rpb24gfSBmcm9tICcuL3R5cGluZy50cyc7XG5leHBvcnQgdHlwZSBBbnlDbGFzcyA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueTtcbmV4cG9ydCB0eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuZXhwb3J0IHR5cGUgTWl4aW48VD4gPSAoYmFzZTogQ29uc3RydWN0b3IpID0+IENvbnN0cnVjdG9yPFQ+O1xuLyoqXG4gKiBDb21wb3NlcyBtdWx0aXBsZSBtaXhpbnMgaW50byBhIHNpbmdsZSBjbGFzcyB0aGF0IGNhbiBiZSBleHRlbmRlZC5cbiAqIEFsbG93cyBmb3IgbXVsdGlwbGUgaW5oZXJpdGFuY2UtbGlrZSBiZWhhdmlvciBieSBhcHBseWluZyBtaXhpbnMgc2VxdWVudGlhbGx5LlxuICpcbiAqIEBwYXJhbSBtaXhpbnMgLSBBcnJheSBvZiBtaXhpbiBmdW5jdGlvbnMgdG8gY29tcG9zZVxuICogQHJldHVybnMgQSBjbGFzcyBjb25zdHJ1Y3RvciB0aGF0IGluY2x1ZGVzIGFsbCBtaXhpbiBmdW5jdGlvbmFsaXR5XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBjb21wb3NlKFRpbWVzdGFtcCwgU29mdERlbGV0ZSkge1xuICogICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoKVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gY29tcG9zZTxNIGV4dGVuZHMgQXJyYXk8KGJhc2U6IENvbnN0cnVjdG9yPGFueT4pID0+IENvbnN0cnVjdG9yPGFueT4+PiguLi5taXhpbnM6IE0pOiBVbmlvblRvSW50ZXJzZWN0aW9uPFJldHVyblR5cGU8TVtudW1iZXJdPj47XG4vKipcbiAqIEFsdGVybmF0aXZlIGNvbXBvc2UgZnVuY3Rpb24gdGhhdCBzdGFydHMgd2l0aCBhIGJhc2UgY2xhc3NcbiAqXG4gKiBAcGFyYW0gYmFzZUNsYXNzIC0gVGhlIGJhc2UgY2xhc3MgdG8gc3RhcnQgd2l0aFxuICogQHBhcmFtIG1peGlucyAtIEFycmF5IG9mIG1peGluIGZ1bmN0aW9ucyB0byBhcHBseVxuICogQHJldHVybnMgQSBjbGFzcyBjb25zdHJ1Y3RvciB0aGF0IGV4dGVuZHMgdGhlIGJhc2UgY2xhc3Mgd2l0aCBhbGwgbWl4aW4gZnVuY3Rpb25hbGl0eVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgY29tcG9zZVdpdGgoQmFzZUVudGl0eSwgVGltZXN0YW1wLCBTb2Z0RGVsZXRlKSB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAqICAgICBzdXBlcigpXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBjb21wb3NlV2l0aDxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yLCBNIGV4dGVuZHMgQXJyYXk8KGJhc2U6IENvbnN0cnVjdG9yKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+Pj4oYmFzZUNsYXNzOiBUQmFzZSwgLi4ubWl4aW5zOiBNKTogVEJhc2UgJiBVbmlvblRvSW50ZXJzZWN0aW9uPFJldHVyblR5cGU8TVtudW1iZXJdPj47XG5leHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBtaXhpbjxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihTb3VyY2U6IFRCYXNlKTogPFRUYXJnZXQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oVGFyZ2V0OiBUVGFyZ2V0KSA9PiBUVGFyZ2V0ICYgVEJhc2U7XG4iLCJpbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcuL0xvZ2dlclNlcnZpY2UudHMnO1xuaW1wb3J0IHR5cGUgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cyc7XG50eXBlIExpZmVjeWNsZU1ldGhvZCA9ICdyZWdpc3RlcicgfCAnbG9hZCcgfCAnYm9vdCcgfCAnc2h1dGRvd24nO1xuaW50ZXJmYWNlIExpc3RPcHRpb25zIHtcbiAgICBpbmNsdWRlPzogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgZXhjbHVkZT86IHN0cmluZyB8IHN0cmluZ1tdO1xufVxuZXhwb3J0IGludGVyZmFjZSBMaWZlY3ljbGVTZXJ2aWNlT3B0aW9ucyB7XG4gICAgZGVidWc/OiBib29sZWFuO1xuICAgIGhvb2tzPzogTWFwPHN0cmluZywgTGlmZWN5Y2xlSG9vaz47XG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZTtcbiAgICBvbkVycm9yPzogKGVycm9yOiBFcnJvciwgY29udGV4dDoge1xuICAgICAgICBob29rSWQ6IHN0cmluZztcbiAgICAgICAgbWV0aG9kOiBMaWZlY3ljbGVNZXRob2Q7XG4gICAgfSkgPT4gdm9pZDtcbn1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZmVjeWNsZVNlcnZpY2Uge1xuICAgIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXk6IHN0cmluZztcbiAgICBob29rczogTWFwPHN0cmluZywgTGlmZWN5Y2xlSG9vaz47XG4gICAgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlO1xuICAgIGRlYnVnOiBib29sZWFuO1xuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBMaWZlY3ljbGVTZXJ2aWNlT3B0aW9ucyk7XG4gICAgb25FcnJvcihlcnJvcjogRXJyb3IsIGNvbnRleHQ6IHtcbiAgICAgICAgaG9va0lkOiBzdHJpbmc7XG4gICAgICAgIG1ldGhvZDogTGlmZWN5Y2xlTWV0aG9kO1xuICAgIH0pOiB2b2lkO1xuICAgIG1hcEFsaWFzZXMoYXJnczogc3RyaW5nW10pOiBzdHJpbmdbXTtcbiAgICBsaXN0KG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IExpZmVjeWNsZUhvb2tbXTtcbiAgICBhZGQoLi4ucGF5bG9hZDogKExpZmVjeWNsZUhvb2sgfCBDb25zdHJ1Y3RvcjxMaWZlY3ljbGVIb29rPilbXSk6IHZvaWQ7XG4gICAgZW1pdE1ldGhvZChtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCwgb3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPjtcbiAgICBlbWl0KHBheWxvYWQ6IExpZmVjeWNsZU1ldGhvZCB8IExpZmVjeWNsZU1ldGhvZFtdLCBvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHJlZ2lzdGVyKG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD47XG4gICAgbG9hZChvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGJvb3Qob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPjtcbiAgICBzaHV0ZG93bihvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGNsZWFyKCk6IHZvaWQ7XG59XG5leHBvcnQge307XG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnO1xuZXhwb3J0IHR5cGUgUGVybWlzc2lvbkFzc2lnbm1lbnQgPSB2LkluZmVyT3V0cHV0PHR5cGVvZiBwZXJtaXNzaW9uQXNzaWdubWVudFNjaGVtYT47XG5leHBvcnQgZGVjbGFyZSBjb25zdCBwZXJtaXNzaW9uQXNzaWdubWVudFNjaGVtYTogdi5PYmplY3RTY2hlbWE8e1xuICAgIHJlYWRvbmx5IGlkOiB2Lk51bWJlclNjaGVtYTx1bmRlZmluZWQ+O1xuICAgIHJlYWRvbmx5IHBlcm1pc3Npb25faWQ6IHYuTnVtYmVyU2NoZW1hPHVuZGVmaW5lZD47XG4gICAgcmVhZG9ubHkgYXNzaWduYWJsZV90eXBlOiB2LlN0cmluZ1NjaGVtYTx1bmRlZmluZWQ+O1xuICAgIHJlYWRvbmx5IGFzc2lnbmFibGVfaWQ6IHYuU3RyaW5nU2NoZW1hPHVuZGVmaW5lZD47XG4gICAgcmVhZG9ubHkgY3JlYXRlZF9hdDogdi5TdHJpbmdTY2hlbWE8dW5kZWZpbmVkPjtcbiAgICByZWFkb25seSB1cGRhdGVkX2F0OiB2LlN0cmluZ1NjaGVtYTx1bmRlZmluZWQ+O1xufSwgdW5kZWZpbmVkPjtcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCc7XG5leHBvcnQgdHlwZSBQZXJtaXNzaW9uID0gdi5JbmZlck91dHB1dDx0eXBlb2YgcGVybWlzc2lvblNjaGVtYT47XG5leHBvcnQgZGVjbGFyZSBjb25zdCBwZXJtaXNzaW9uU2NoZW1hOiB2Lk9iamVjdFNjaGVtYTx7XG4gICAgcmVhZG9ubHkgaWQ6IHYuTnVtYmVyU2NoZW1hPHVuZGVmaW5lZD47XG4gICAgcmVhZG9ubHkgbmFtZTogdi5OdWxsYWJsZVNjaGVtYTx2LlN0cmluZ1NjaGVtYTx1bmRlZmluZWQ+LCB1bmRlZmluZWQ+O1xuICAgIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiB2Lk51bGxhYmxlU2NoZW1hPHYuU3RyaW5nU2NoZW1hPHVuZGVmaW5lZD4sIHVuZGVmaW5lZD47XG4gICAgcmVhZG9ubHkgYWN0aW9uOiB2LlN0cmluZ1NjaGVtYTx1bmRlZmluZWQ+O1xuICAgIHJlYWRvbmx5IHN1YmplY3Q6IHYuU3RyaW5nU2NoZW1hPHVuZGVmaW5lZD47XG4gICAgcmVhZG9ubHkgY29uZGl0aW9uczogdi5OdWxsYWJsZVNjaGVtYTx2LlN0cmluZ1NjaGVtYTx1bmRlZmluZWQ+LCB1bmRlZmluZWQ+O1xuICAgIHJlYWRvbmx5IGNyZWF0ZWRfYXQ6IHYuU3RyaW5nU2NoZW1hPHVuZGVmaW5lZD47XG4gICAgcmVhZG9ubHkgdXBkYXRlZF9hdDogdi5TdHJpbmdTY2hlbWE8dW5kZWZpbmVkPjtcbiAgICByZWFkb25seSBleHBpcmVzX2F0OiB2LlN0cmluZ1NjaGVtYTx1bmRlZmluZWQ+O1xufSwgdW5kZWZpbmVkPjtcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCc7XG5leHBvcnQgdHlwZSBUb2tlbiA9IHYuSW5mZXJPdXRwdXQ8dHlwZW9mIHRva2VuU2NoZW1hPjtcbmV4cG9ydCBkZWNsYXJlIGNvbnN0IHRva2VuU2NoZW1hOiB2Lk9iamVjdFNjaGVtYTx7XG4gICAgcmVhZG9ubHkgaWQ6IHYuTnVtYmVyU2NoZW1hPHVuZGVmaW5lZD47XG4gICAgcmVhZG9ubHkgbmFtZTogdi5OdWxsYWJsZVNjaGVtYTx2LlN0cmluZ1NjaGVtYTx1bmRlZmluZWQ+LCB1bmRlZmluZWQ+O1xuICAgIHJlYWRvbmx5IHR5cGU6IHYuU3RyaW5nU2NoZW1hPHVuZGVmaW5lZD47XG4gICAgcmVhZG9ubHkgdXNlcl9pZDogdi5OdW1iZXJTY2hlbWE8dW5kZWZpbmVkPjtcbiAgICByZWFkb25seSB0b2tlbjogdi5TdHJpbmdTY2hlbWE8dW5kZWZpbmVkPjtcbiAgICByZWFkb25seSBjcmVhdGVkX2F0OiB2LlN0cmluZ1NjaGVtYTx1bmRlZmluZWQ+O1xuICAgIHJlYWRvbmx5IHVwZGF0ZWRfYXQ6IHYuU3RyaW5nU2NoZW1hPHVuZGVmaW5lZD47XG4gICAgcmVhZG9ubHkgZXhwaXJlc19hdDogdi5TdHJpbmdTY2hlbWE8dW5kZWZpbmVkPjtcbn0sIHVuZGVmaW5lZD47XG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJztcbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGVuZXIge1xuICAgIGV2ZW50OiBzdHJpbmc7XG4gICAgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcbn1cbmV4cG9ydCBkZWNsYXJlIGZ1bmN0aW9uIGVtaXRIb29rKGNvbnN0cnVjdG9yOiBhbnksIGV2ZW50OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPjtcbmV4cG9ydCBkZWNsYXJlIGZ1bmN0aW9uIG9uSG9vayhjb25zdHJ1Y3RvcjogYW55LCBldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdm9pZDtcbmV4cG9ydCBkZWNsYXJlIGZ1bmN0aW9uIEhvb2tzU3RhdGljPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKToge1xuICAgIG5ldyAoLi4uYXJnczogYW55W10pOiB7fTtcbiAgICBsaXN0ZW5lcnM6IEFycmF5PCguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZD47XG4gICAgb24oZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHZvaWQ7XG4gICAgZW1pdChldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD47XG59ICYgVEJhc2U7XG5leHBvcnQgZGVjbGFyZSBuYW1lc3BhY2UgSG9va3NTdGF0aWMge1xuICAgIHZhciBlbWl0OiB0eXBlb2YgZW1pdEhvb2s7XG4gICAgdmFyIG9uOiB0eXBlb2Ygb25Ib29rO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gSG9va3M8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpOiB7XG4gICAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IHtcbiAgICAgICAgbGlzdGVuZXJzOiBMaXN0ZW5lcltdO1xuICAgICAgICBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdm9pZDtcbiAgICAgICAgb2ZmKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB2b2lkO1xuICAgICAgICBlbWl0KGV2ZW50OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogdm9pZDtcbiAgICAgICAgZW1pdEFzeW5jKGV2ZW50OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPjtcbiAgICB9O1xufSAmIFRCYXNlO1xuIiwiZGVjbGFyZSBjb25zdCBQZXJtaXNzaW9uRW50aXR5X2Jhc2U6IHtcbiAgICBuZXcgKC4uLmFyZ3M6IGFueVtdKToge1xuICAgICAgICBtZXJnZShkYXRhOiBQYXJ0aWFsPC8qZWxpZGVkKi8gYW55Pik6IC8qZWxpZGVkKi8gYW55O1xuICAgIH07XG4gICAgZnJvbTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgZGF0YTogUGFydGlhbDxUPik6IFQ7XG59ICYgaW1wb3J0KFwiI3NoYXJlZC91dGlscy9jb21wb3NlLnRzXCIpLkNvbnN0cnVjdG9yO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGVybWlzc2lvbkVudGl0eSBleHRlbmRzIFBlcm1pc3Npb25FbnRpdHlfYmFzZSB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgb3JpZ2luOiBzdHJpbmc7XG4gICAgc3ViamVjdDogc3RyaW5nO1xuICAgIGFjdGlvbjogc3RyaW5nO1xuICAgIGNvbmRpdGlvbnM6IHN0cmluZyB8IG51bGwgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGdldCBlZGl0YWJsZSgpOiBib29sZWFuO1xuICAgIGdldCBwYXJzZWRDb25kaXRpb25zKCk6IGFueTtcbn1cbmV4cG9ydCB7fTtcbiIsImltcG9ydCB7IGRlZmluZUFiaWxpdHkgfSBmcm9tICdAY2FzbC9hYmlsaXR5JztcbmltcG9ydCBQZXJtaXNzaW9uIGZyb20gJy4vUGVybWlzc2lvbkVudGl0eS50cyc7XG5pbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWNsRW50aXR5IHtcbiAgICBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5OiBzdHJpbmc7XG4gICAgYWJpbGl0eTogUmV0dXJuVHlwZTx0eXBlb2YgZGVmaW5lQWJpbGl0eT47XG4gICAgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25bXTtcbiAgICBkZWJ1ZzogYm9vbGVhbjtcbiAgICBsb2dnZXI6IExvZ2dlclNlcnZpY2U7XG4gICAgY29uc3RydWN0b3IoZGF0YT86IFBhcnRpYWw8QWNsRW50aXR5Pik7XG4gICAgY2FuKGFjdGlvbjogc3RyaW5nLCBzdWJqZWN0OiBhbnksIG9iamVjdD86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBib29sZWFuO1xuICAgIGNhbm5vdChhY3Rpb246IHN0cmluZywgc3ViamVjdDogYW55LCBvYmplY3Q/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYm9vbGVhbjtcbiAgICBzdWJqZWN0KHN1YmplY3Q6IHN0cmluZywgb2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiAmIGltcG9ydChcIkBjYXNsL2FiaWxpdHlcIikuRm9yY2VkU3ViamVjdDxzdHJpbmc+O1xufVxuIiwiZXhwb3J0IGludGVyZmFjZSBDb29raWVNYXBFbnRpdHlPcHRpb25zIHtcbiAgICBjb29raWVzPzogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgICBwcmVmaXg/OiBzdHJpbmc7XG59XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb29raWVNYXBFbnRpdHkge1xuICAgIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXk6IHN0cmluZztcbiAgICBjb29raWVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICAgIHByZWZpeDogc3RyaW5nO1xuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBDb29raWVNYXBFbnRpdHlPcHRpb25zKTtcbiAgICBsb2FkKGNvb2tpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBNYXA8c3RyaW5nLCBzdHJpbmc+KTogdm9pZDtcbiAgICBnZXQobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHwgbnVsbDtcbiAgICBzZXQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBvcHRpb25zPzogYW55KTogdm9pZDtcbiAgICB0b1JlY29yZCgpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuIiwiZXhwb3J0IGRlY2xhcmUgY29uc3QgVFlQRVM6ICgpID0+ICh7XG4gICAgaWQ6IHN0cmluZztcbiAgICBsYWJlbDogYW55O1xuICAgIGRlc2NyaXB0aW9uOiBhbnk7XG4gICAgY29uZmlnX2ZpZWxkczoge1xuICAgICAgICBkaXJlY3Rvcnk6IHtcbiAgICAgICAgICAgIGNvbXBvbmVudDogc3RyaW5nO1xuICAgICAgICAgICAgbGFiZWw6IGFueTtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBhbnk7XG4gICAgICAgICAgICBoaW50OiBhbnk7XG4gICAgICAgIH07XG4gICAgICAgIGFjY2Vzc0tleUlkPzogdW5kZWZpbmVkO1xuICAgICAgICBzZWNyZXRBY2Nlc3NLZXk/OiB1bmRlZmluZWQ7XG4gICAgICAgIGJ1Y2tldD86IHVuZGVmaW5lZDtcbiAgICAgICAgcmVnaW9uPzogdW5kZWZpbmVkO1xuICAgICAgICBwcmVmaXg/OiB1bmRlZmluZWQ7XG4gICAgICAgIGVuZHBvaW50PzogdW5kZWZpbmVkO1xuICAgIH07XG59IHwge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogYW55O1xuICAgIGNvbmZpZ19maWVsZHM6IHtcbiAgICAgICAgYWNjZXNzS2V5SWQ6IHtcbiAgICAgICAgICAgIGNvbXBvbmVudDogc3RyaW5nO1xuICAgICAgICAgICAgbGFiZWw6IGFueTtcbiAgICAgICAgICAgIGhpbnQ6IGFueTtcbiAgICAgICAgICAgIHR5cGU6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgICAgc2VjcmV0QWNjZXNzS2V5OiB7XG4gICAgICAgICAgICBjb21wb25lbnQ6IHN0cmluZztcbiAgICAgICAgICAgIGxhYmVsOiBhbnk7XG4gICAgICAgICAgICBoaW50OiBhbnk7XG4gICAgICAgICAgICB0eXBlOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICAgIGJ1Y2tldDoge1xuICAgICAgICAgICAgY29tcG9uZW50OiBzdHJpbmc7XG4gICAgICAgICAgICBsYWJlbDogYW55O1xuICAgICAgICAgICAgaGludDogYW55O1xuICAgICAgICB9O1xuICAgICAgICByZWdpb246IHtcbiAgICAgICAgICAgIGNvbXBvbmVudDogc3RyaW5nO1xuICAgICAgICAgICAgbGFiZWw6IGFueTtcbiAgICAgICAgICAgIGhpbnQ6IGFueTtcbiAgICAgICAgfTtcbiAgICAgICAgcHJlZml4OiB7XG4gICAgICAgICAgICBjb21wb25lbnQ6IHN0cmluZztcbiAgICAgICAgICAgIGxhYmVsOiBhbnk7XG4gICAgICAgICAgICBoaW50OiBhbnk7XG4gICAgICAgIH07XG4gICAgICAgIGVuZHBvaW50OiB7XG4gICAgICAgICAgICBjb21wb25lbnQ6IHN0cmluZztcbiAgICAgICAgICAgIGxhYmVsOiBhbnk7XG4gICAgICAgICAgICBoaW50OiBhbnk7XG4gICAgICAgIH07XG4gICAgICAgIGRpcmVjdG9yeT86IHVuZGVmaW5lZDtcbiAgICB9O1xufSlbXTtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyaXZlQ29uZmlnIHtcbiAgICBzdGF0aWMgZ2V0IFRZUEVTKCk6ICh7XG4gICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgIGxhYmVsOiBhbnk7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBhbnk7XG4gICAgICAgIGNvbmZpZ19maWVsZHM6IHtcbiAgICAgICAgICAgIGRpcmVjdG9yeToge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogc3RyaW5nO1xuICAgICAgICAgICAgICAgIGxhYmVsOiBhbnk7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGFueTtcbiAgICAgICAgICAgICAgICBoaW50OiBhbnk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYWNjZXNzS2V5SWQ/OiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBzZWNyZXRBY2Nlc3NLZXk/OiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBidWNrZXQ/OiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZWdpb24/OiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBwcmVmaXg/OiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBlbmRwb2ludD86IHVuZGVmaW5lZDtcbiAgICAgICAgfTtcbiAgICB9IHwge1xuICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICBsYWJlbDogc3RyaW5nO1xuICAgICAgICBkZXNjcmlwdGlvbjogYW55O1xuICAgICAgICBjb25maWdfZmllbGRzOiB7XG4gICAgICAgICAgICBhY2Nlc3NLZXlJZDoge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogc3RyaW5nO1xuICAgICAgICAgICAgICAgIGxhYmVsOiBhbnk7XG4gICAgICAgICAgICAgICAgaGludDogYW55O1xuICAgICAgICAgICAgICAgIHR5cGU6IHN0cmluZztcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzZWNyZXRBY2Nlc3NLZXk6IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHN0cmluZztcbiAgICAgICAgICAgICAgICBsYWJlbDogYW55O1xuICAgICAgICAgICAgICAgIGhpbnQ6IGFueTtcbiAgICAgICAgICAgICAgICB0eXBlOiBzdHJpbmc7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnVja2V0OiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgbGFiZWw6IGFueTtcbiAgICAgICAgICAgICAgICBoaW50OiBhbnk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVnaW9uOiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgbGFiZWw6IGFueTtcbiAgICAgICAgICAgICAgICBoaW50OiBhbnk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcHJlZml4OiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgbGFiZWw6IGFueTtcbiAgICAgICAgICAgICAgICBoaW50OiBhbnk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZW5kcG9pbnQ6IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHN0cmluZztcbiAgICAgICAgICAgICAgICBsYWJlbDogYW55O1xuICAgICAgICAgICAgICAgIGhpbnQ6IGFueTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBkaXJlY3Rvcnk/OiB1bmRlZmluZWQ7XG4gICAgICAgIH07XG4gICAgfSlbXTtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgaXNfZGVmYXVsdDogYm9vbGVhbjtcbiAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgY29uc3RydWN0b3IoZGF0YTogRHJpdmVDb25maWcpO1xuICAgIGdldCBjb25maWdfZmllbGRzKCk6IHt9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHJpdmVFbnRyeSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHBhdGg6IHN0cmluZztcbiAgICB0eXBlOiAnZmlsZScgfCAnZGlyZWN0b3J5JztcbiAgICBtZXRhczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBEcml2ZUVudHJ5KTtcbn1cbiIsImRlY2xhcmUgY29uc3QgRmlsZUVudGl0eV9iYXNlOiB7XG4gICAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IHtcbiAgICAgICAgbWVyZ2UoZGF0YTogUGFydGlhbDwvKmVsaWRlZCovIGFueT4pOiAvKmVsaWRlZCovIGFueTtcbiAgICB9O1xuICAgIGZyb208VD4odGhpczogbmV3ICgpID0+IFQsIGRhdGE6IFBhcnRpYWw8VD4pOiBUO1xufSAmIGltcG9ydChcIiNzaGFyZWQvdXRpbHMvY29tcG9zZS50c1wiKS5Db25zdHJ1Y3RvciAmIHtcbiAgICBuZXcgKC4uLmFyZ3M6IGFueVtdKToge1xuICAgICAgICBjcmVhdGVkX2F0OiBEYXRlIHwgc3RyaW5nO1xuICAgICAgICB1cGRhdGVkX2F0OiBEYXRlIHwgc3RyaW5nO1xuICAgIH07XG59ICYge1xuICAgIG5ldyAoLi4uYXJnczogYW55W10pOiB7XG4gICAgICAgIGRlbGV0ZWRfYXQ6IERhdGUgfCBzdHJpbmcgfCBudWxsO1xuICAgIH07XG59O1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmlsZUVudGl0eSBleHRlbmRzIEZpbGVFbnRpdHlfYmFzZSB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBkcml2ZTogc3RyaW5nO1xuICAgIG1pbWV0eXBlOiBzdHJpbmc7XG4gICAgcHVycG9zZTogc3RyaW5nO1xuICAgIGNsaWVudF9uYW1lOiBzdHJpbmc7XG4gICAgZmlsZW5hbWU6IHN0cmluZztcbiAgICBwdWJsaWM6IGJvb2xlYW47XG4gICAgdXJsPzogc3RyaW5nO1xuICAgIG1ldGFzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBpc0ltYWdlKCk6IGJvb2xlYW47XG59XG5leHBvcnQge307XG4iLCJkZWNsYXJlIGNvbnN0IEZpbGVNZXRhX2Jhc2U6IHtcbiAgICBuZXcgKC4uLmFyZ3M6IGFueVtdKToge1xuICAgICAgICBtZXJnZShkYXRhOiBQYXJ0aWFsPC8qZWxpZGVkKi8gYW55Pik6IC8qZWxpZGVkKi8gYW55O1xuICAgIH07XG4gICAgZnJvbTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgZGF0YTogUGFydGlhbDxUPik6IFQ7XG59ICYgaW1wb3J0KFwiI3NoYXJlZC91dGlscy9jb21wb3NlLnRzXCIpLkNvbnN0cnVjdG9yICYge1xuICAgIG5ldyAoLi4uYXJnczogYW55W10pOiB7XG4gICAgICAgIGNyZWF0ZWRfYXQ6IERhdGUgfCBzdHJpbmc7XG4gICAgICAgIHVwZGF0ZWRfYXQ6IERhdGUgfCBzdHJpbmc7XG4gICAgfTtcbn0gJiB7XG4gICAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IHtcbiAgICAgICAgZGVsZXRlZF9hdDogRGF0ZSB8IHN0cmluZyB8IG51bGw7XG4gICAgfTtcbn07XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWxlTWV0YSBleHRlbmRzIEZpbGVNZXRhX2Jhc2Uge1xuICAgIGlkOiBudW1iZXI7XG4gICAgZmlsZV9pZDogbnVtYmVyO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVsbDtcbn1cbmV4cG9ydCB7fTtcbiIsImV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RCdWlsZEltcG9ydCB7XG4gICAgZnJvbTogc3RyaW5nO1xuICAgIHRvPzogc3RyaW5nO1xuICAgIHR5cGU6ICdnbG9iYWxfaW1wb3J0Jztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RCdWlsZCB7XG4gICAgaW1wb3J0cz86IE1vZHVsZU1hbmlmZXN0QnVpbGRJbXBvcnRbXTtcbn1cbmRlY2xhcmUgY29uc3QgTW9kdWxlTWFuaWZlc3RfYmFzZToge1xuICAgIG5ldyAoLi4uYXJnczogYW55W10pOiB7XG4gICAgICAgIG1lcmdlKGRhdGE6IFBhcnRpYWw8LyplbGlkZWQqLyBhbnk+KTogLyplbGlkZWQqLyBhbnk7XG4gICAgfTtcbiAgICBmcm9tPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBkYXRhOiBQYXJ0aWFsPFQ+KTogVDtcbn0gJiBpbXBvcnQoXCIjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHNcIikuQ29uc3RydWN0b3I7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2R1bGVNYW5pZmVzdCBleHRlbmRzIE1vZHVsZU1hbmlmZXN0X2Jhc2Uge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICBlbmFibGVkOiBib29sZWFuO1xuICAgIGF1dGhvcj86IHN0cmluZztcbiAgICBkZXBlbmRlbmNpZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIGJ1aWxkPzogTW9kdWxlTWFuaWZlc3RCdWlsZDtcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5leHBvcnQge307XG4iLCJpbXBvcnQgdHlwZSBNb2R1bGVNYW5pZmVzdCBmcm9tICcuL01vZHVsZU1hbmlmZXN0RW50aXR5LnRzJztcbmltcG9ydCBMaWZlY3ljbGVIb29rIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cyc7XG5pbnRlcmZhY2UgTW9kdWxlVXBncmFkZUluZm8ge1xuICAgIHNvdXJjZTogJ2dpdCcgfCAnemlwJztcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5kZWNsYXJlIGNvbnN0IE1vZHVsZV9iYXNlOiB7XG4gICAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IHtcbiAgICAgICAgbWVyZ2UoZGF0YTogUGFydGlhbDwvKmVsaWRlZCovIGFueT4pOiAvKmVsaWRlZCovIGFueTtcbiAgICB9O1xuICAgIGZyb208VD4odGhpczogbmV3ICgpID0+IFQsIGRhdGE6IFBhcnRpYWw8VD4pOiBUO1xufSAmIGltcG9ydChcIiNzaGFyZWQvdXRpbHMvY29tcG9zZS50c1wiKS5Db25zdHJ1Y3RvciAmIGltcG9ydChcIiNzaGFyZWQvdXRpbHMvY29tcG9zZS50c1wiKS5Db25zdHJ1Y3Rvcjx7fT4gJiB0eXBlb2YgTGlmZWN5Y2xlSG9vaztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZHVsZSBleHRlbmRzIE1vZHVsZV9iYXNlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBlbmFibGVkOiBib29sZWFuO1xuICAgIGRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBidWlsZDogTW9kdWxlTWFuaWZlc3RbJ2J1aWxkJ107XG4gICAgZGlyZWN0b3J5OiBzdHJpbmc7XG4gICAgdXBncmFkZV9pbmZvPzogTW9kdWxlVXBncmFkZUluZm87XG4gICAgc2V0RGF0YShkYXRhOiBQYXJ0aWFsPE1vZHVsZSB8IE1vZHVsZU1hbmlmZXN0Pik6IHZvaWQ7XG59XG5leHBvcnQge307XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdpbmF0aW9uRW50aXR5PFQgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgaXRlbXM6IFRbXTtcbiAgICB0b3RhbDogbnVtYmVyO1xuICAgIHBhZ2U6IG51bWJlcjtcbiAgICBwZXJfcGFnZTogbnVtYmVyO1xuICAgIHRvdGFsX3BhZ2VzOiBudW1iZXI7XG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxQYWdpbmF0aW9uRW50aXR5Pik7XG4gICAgc3RhdGljIGZyb208VCA9IFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KHBheWxvYWQ6IFBhcnRpYWw8UGFnaW5hdGlvbkVudGl0eTxUPj4pOiBQYWdpbmF0aW9uRW50aXR5PFQ+O1xufVxuIiwiZGVjbGFyZSBjb25zdCBQbHVnaW5FbnRpdHlfYmFzZToge1xuICAgIG5ldyAoLi4uYXJnczogYW55W10pOiB7XG4gICAgICAgIG1lcmdlKGRhdGE6IFBhcnRpYWw8LyplbGlkZWQqLyBhbnk+KTogLyplbGlkZWQqLyBhbnk7XG4gICAgfTtcbiAgICBmcm9tPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBkYXRhOiBQYXJ0aWFsPFQ+KTogVDtcbn0gJiBpbXBvcnQoXCIjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHNcIikuQ29uc3RydWN0b3I7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5FbnRpdHkgZXh0ZW5kcyBQbHVnaW5FbnRpdHlfYmFzZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgYWxpYXNlczogc3RyaW5nW107XG59XG5leHBvcnQge307XG4iLCJkZWNsYXJlIGNvbnN0IFJvbGVfYmFzZToge1xuICAgIG5ldyAoLi4uYXJnczogYW55W10pOiB7XG4gICAgICAgIG1lcmdlKGRhdGE6IFBhcnRpYWw8LyplbGlkZWQqLyBhbnk+KTogLyplbGlkZWQqLyBhbnk7XG4gICAgfTtcbiAgICBmcm9tPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBkYXRhOiBQYXJ0aWFsPFQ+KTogVDtcbn0gJiBpbXBvcnQoXCIjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHNcIikuQ29uc3RydWN0b3IgJiB7XG4gICAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IHtcbiAgICAgICAgY3JlYXRlZF9hdDogRGF0ZSB8IHN0cmluZztcbiAgICAgICAgdXBkYXRlZF9hdDogRGF0ZSB8IHN0cmluZztcbiAgICB9O1xufSAmIHtcbiAgICBuZXcgKC4uLmFyZ3M6IGFueVtdKToge1xuICAgICAgICBkZWxldGVkX2F0OiBEYXRlIHwgc3RyaW5nIHwgbnVsbDtcbiAgICB9O1xufTtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvbGUgZXh0ZW5kcyBSb2xlX2Jhc2Uge1xuICAgIGlkOiBudW1iZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuZXhwb3J0IHt9O1xuIiwiaW1wb3J0IHR5cGUgUGVybWlzc2lvbiBmcm9tICcuL1Blcm1pc3Npb25FbnRpdHkudHMnO1xuaW1wb3J0IHR5cGUgUm9sZSBmcm9tICcuL1JvbGVFbnRpdHkudHMnO1xuZGVjbGFyZSBjb25zdCBVc2VyRW50aXR5X2Jhc2U6IHtcbiAgICBuZXcgKC4uLmFyZ3M6IGFueVtdKToge1xuICAgICAgICBtZXJnZShkYXRhOiBQYXJ0aWFsPC8qZWxpZGVkKi8gYW55Pik6IC8qZWxpZGVkKi8gYW55O1xuICAgIH07XG4gICAgZnJvbTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgZGF0YTogUGFydGlhbDxUPik6IFQ7XG59ICYgaW1wb3J0KFwiI3NoYXJlZC91dGlscy9jb21wb3NlLnRzXCIpLkNvbnN0cnVjdG9yICYge1xuICAgIG5ldyAoLi4uYXJnczogYW55W10pOiB7XG4gICAgICAgIGNyZWF0ZWRfYXQ6IERhdGUgfCBzdHJpbmc7XG4gICAgICAgIHVwZGF0ZWRfYXQ6IERhdGUgfCBzdHJpbmc7XG4gICAgfTtcbn0gJiB7XG4gICAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IHtcbiAgICAgICAgZGVsZXRlZF9hdDogRGF0ZSB8IHN0cmluZyB8IG51bGw7XG4gICAgfTtcbn07XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVc2VyRW50aXR5IGV4dGVuZHMgVXNlckVudGl0eV9iYXNlIHtcbiAgICBpZDogbnVtYmVyO1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gICAgcGFzc3dvcmQ/OiBzdHJpbmc7XG4gICAgdmVyaWZpZWRfYXQ/OiBEYXRlIHwgc3RyaW5nIHwgbnVsbDtcbiAgICBwZXJtaXNzaW9ucz86IFBlcm1pc3Npb25bXTtcbiAgICByb2xlcz86IFJvbGVbXTtcbiAgICBnZXQgaW5pdGlhbHMoKTogc3RyaW5nO1xufVxuZXhwb3J0IHt9O1xuIiwiaW1wb3J0IHsgQ29tbWFuZCBhcyBDb21tYW5kZXJDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBwcmludFRhYmxlLCBwcmludE9iamVjdCB9IGZyb20gJy4uL3V0aWxzL3ByaW50VGFibGUudHMnO1xuaW1wb3J0IHsgRW1taXR0ZXJTZXJ2aWNlLCBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnI3NoYXJlZC9pbmRleC50cyc7XG5leHBvcnQgaW50ZXJmYWNlIENsaUV2ZW50cyB7XG4gICAgJ2NsaTpyZWdpc3RlcmVkJzoge1xuICAgICAgICBjbGk6IENsaVNlcnZpY2U7XG4gICAgfTtcbn1cbmV4cG9ydCBkZWNsYXJlIGNsYXNzIENsaUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kZXJDb21tYW5kIHtcbiAgICBfX2lzX2NsaV9jb21tYW5kOiBib29sZWFuO1xuICAgIHRhYmxlOiB0eXBlb2YgcHJpbnRUYWJsZTtcbiAgICBvYmplY3Q6IHR5cGVvZiBwcmludE9iamVjdDtcbiAgICBjb2xvcnM6IGNoYWxrLkNoYWxrICYgY2hhbGsuQ2hhbGtGdW5jdGlvbiAmIHtcbiAgICAgICAgc3VwcG9ydHNDb2xvcjogY2hhbGsuQ29sb3JTdXBwb3J0IHwgZmFsc2U7XG4gICAgICAgIExldmVsOiBjaGFsay5MZXZlbDtcbiAgICAgICAgQ29sb3I6IChcImJsYWNrXCIgfCBcInJlZFwiIHwgXCJncmVlblwiIHwgXCJ5ZWxsb3dcIiB8IFwiYmx1ZVwiIHwgXCJtYWdlbnRhXCIgfCBcImN5YW5cIiB8IFwid2hpdGVcIiB8IFwiZ3JheVwiIHwgXCJncmV5XCIgfCBcImJsYWNrQnJpZ2h0XCIgfCBcInJlZEJyaWdodFwiIHwgXCJncmVlbkJyaWdodFwiIHwgXCJ5ZWxsb3dCcmlnaHRcIiB8IFwiYmx1ZUJyaWdodFwiIHwgXCJtYWdlbnRhQnJpZ2h0XCIgfCBcImN5YW5CcmlnaHRcIiB8IFwid2hpdGVCcmlnaHRcIikgfCAoXCJiZ0JsYWNrXCIgfCBcImJnUmVkXCIgfCBcImJnR3JlZW5cIiB8IFwiYmdZZWxsb3dcIiB8IFwiYmdCbHVlXCIgfCBcImJnTWFnZW50YVwiIHwgXCJiZ0N5YW5cIiB8IFwiYmdXaGl0ZVwiIHwgXCJiZ0dyYXlcIiB8IFwiYmdHcmV5XCIgfCBcImJnQmxhY2tCcmlnaHRcIiB8IFwiYmdSZWRCcmlnaHRcIiB8IFwiYmdHcmVlbkJyaWdodFwiIHwgXCJiZ1llbGxvd0JyaWdodFwiIHwgXCJiZ0JsdWVCcmlnaHRcIiB8IFwiYmdNYWdlbnRhQnJpZ2h0XCIgfCBcImJnQ3lhbkJyaWdodFwiIHwgXCJiZ1doaXRlQnJpZ2h0XCIpO1xuICAgICAgICBGb3JlZ3JvdW5kQ29sb3I6IFwiYmxhY2tcIiB8IFwicmVkXCIgfCBcImdyZWVuXCIgfCBcInllbGxvd1wiIHwgXCJibHVlXCIgfCBcIm1hZ2VudGFcIiB8IFwiY3lhblwiIHwgXCJ3aGl0ZVwiIHwgXCJncmF5XCIgfCBcImdyZXlcIiB8IFwiYmxhY2tCcmlnaHRcIiB8IFwicmVkQnJpZ2h0XCIgfCBcImdyZWVuQnJpZ2h0XCIgfCBcInllbGxvd0JyaWdodFwiIHwgXCJibHVlQnJpZ2h0XCIgfCBcIm1hZ2VudGFCcmlnaHRcIiB8IFwiY3lhbkJyaWdodFwiIHwgXCJ3aGl0ZUJyaWdodFwiO1xuICAgICAgICBCYWNrZ3JvdW5kQ29sb3I6IFwiYmdCbGFja1wiIHwgXCJiZ1JlZFwiIHwgXCJiZ0dyZWVuXCIgfCBcImJnWWVsbG93XCIgfCBcImJnQmx1ZVwiIHwgXCJiZ01hZ2VudGFcIiB8IFwiYmdDeWFuXCIgfCBcImJnV2hpdGVcIiB8IFwiYmdHcmF5XCIgfCBcImJnR3JleVwiIHwgXCJiZ0JsYWNrQnJpZ2h0XCIgfCBcImJnUmVkQnJpZ2h0XCIgfCBcImJnR3JlZW5CcmlnaHRcIiB8IFwiYmdZZWxsb3dCcmlnaHRcIiB8IFwiYmdCbHVlQnJpZ2h0XCIgfCBcImJnTWFnZW50YUJyaWdodFwiIHwgXCJiZ0N5YW5CcmlnaHRcIiB8IFwiYmdXaGl0ZUJyaWdodFwiO1xuICAgICAgICBNb2RpZmllcnM6IFwicmVzZXRcIiB8IFwiYm9sZFwiIHwgXCJkaW1cIiB8IFwiaXRhbGljXCIgfCBcInVuZGVybGluZVwiIHwgXCJpbnZlcnNlXCIgfCBcImhpZGRlblwiIHwgXCJzdHJpa2V0aHJvdWdoXCIgfCBcInZpc2libGVcIjtcbiAgICAgICAgc3RkZXJyOiBjaGFsay5DaGFsayAmIHtcbiAgICAgICAgICAgIHN1cHBvcnRzQ29sb3I6IGNoYWxrLkNvbG9yU3VwcG9ydCB8IGZhbHNlO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgbmVlZHM6IFNldDxzdHJpbmc+O1xuICAgIG5lZWQoLi4uYXJnczogc3RyaW5nW10pOiB0aGlzO1xuICAgIGNyZWF0ZUNvbW1hbmQobmFtZT86IHN0cmluZyk6IENsaUNvbW1hbmQ7XG59XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGlTZXJ2aWNlIGV4dGVuZHMgQ2xpQ29tbWFuZCB7XG4gICAgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleTogc3RyaW5nO1xuICAgIGRpcnM6IFNldDxzdHJpbmc+O1xuICAgIGxvZ2dlcjogTG9nZ2VyU2VydmljZTtcbiAgICBlbW1pdHRlcjogRW1taXR0ZXJTZXJ2aWNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuICAgIGRlYnVnOiBib29sZWFuO1xuICAgIHN0YXRpYyBjcmVhdGUobmFtZT86IHN0cmluZyk6IENsaVNlcnZpY2U7XG4gICAgc2V0TG9nZ2VyKGxvZ2dlcjogTG9nZ2VyU2VydmljZSk6IHRoaXM7XG4gICAgc2V0RGVidWcoZGVidWc6IGJvb2xlYW4pOiB0aGlzO1xuICAgIHNldEVtbWl0dGVyKGVtbWl0dGVyOiBFbW1pdHRlclNlcnZpY2UpOiB0aGlzO1xuICAgIGNyZWF0ZUNvbW1hbmQobmFtZT86IHN0cmluZyk6IENsaVNlcnZpY2U7XG4gICAgYWRkRGlyKGRpcjogc3RyaW5nKTogdGhpcztcbiAgICBsb2FkRGlyKGRpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgICBsb2FkKCk6IFByb21pc2U8dGhpcz47XG59XG4iLCJpbXBvcnQgQ2xpU2VydmljZSBmcm9tICcjc2VydmVyL3NlcnZpY2VzL0NsaVNlcnZpY2UudHMnO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXJ0ZVRlc3RlclNlcnZpY2UgZXh0ZW5kcyBDbGlTZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3RvcigpO1xuICAgIGFkZChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGV4ZWN1dGUoYXJnczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+O1xufVxuIiwiaW1wb3J0IGNwIGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgTG9nZ2VyU2VydmljZSB9IGZyb20gJyNzaGFyZWQvaW5kZXgudHMnO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2xpV3JhcHBlclNlcnZpY2Uge1xuICAgIHByb2Nlc3M6IGNwLkNoaWxkUHJvY2VzcyB8IG51bGw7XG4gICAgYXBwQmFzZVBhdGg6IHN0cmluZztcbiAgICBlbnY6IE1hcDxzdHJpbmcsIGFueT47XG4gICAgYXJnczogc3RyaW5nW107XG4gICAgY29uZmlnQXJndW1lbnRzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICAgIGNvbmZpZ0ZpbGVzOiBzdHJpbmdbXTtcbiAgICBkZWJ1ZzogYm9vbGVhbjtcbiAgICBsb2dnZXI6IExvZ2dlclNlcnZpY2U7XG4gICAgc3RhdGljIGNyZWF0ZSgpOiBDbGlXcmFwcGVyU2VydmljZTtcbiAgICBzZXRCYXNlUGF0aChwYXRoOiBzdHJpbmcpOiB0aGlzO1xuICAgIHNldERlYnVnKGRlYnVnOiBib29sZWFuKTogdGhpcztcbiAgICBzZXRMb2dnZXIobG9nZ2VyOiBMb2dnZXJTZXJ2aWNlKTogdGhpcztcbiAgICBhZGRDb25maWdBcmd1bWVudChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHRoaXM7XG4gICAgYWRkQ29uZmlnRmlsZSguLi5maWxlUGF0aHM6IHN0cmluZ1tdKTogdGhpcztcbiAgICBhZGRFbnYoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICAgIGxvYWRDb25maWdBcmd1bWVudHMoKTogdm9pZDtcbiAgICBsb2FkQ29uZmlnRmlsZXMoKTogdm9pZDtcbiAgICBsb2FkRW52aXJvbm1lbnQoKTogdm9pZDtcbiAgICBsb2FkQXJndW1lbnRzKGFyZ3M/OiBzdHJpbmdbXSk6IHZvaWQ7XG4gICAga2lsbChjb2RlPzogbnVtYmVyKTogdm9pZDtcbiAgICBydW4oYXJncz86IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPjtcbn1cbiIsImltcG9ydCBDb25maWdTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvQ29uZmlnU2VydmljZS50cyc7XG5pbXBvcnQgdHlwZSBMb2dnZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cyc7XG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZ0ZTU2VydmljZU9wdGlvbnMge1xuICAgIGRpcmVjdG9yeT86IHN0cmluZztcbiAgICBmb3JtYXQ/OiAnanNvbicgfCAneW1sJztcbiAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZTtcbn1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbmZpZ0ZTU2VydmljZSBleHRlbmRzIENvbmZpZ1NlcnZpY2Uge1xuICAgIGxvZ2dlcjogTG9nZ2VyU2VydmljZTtcbiAgICBkZWJ1ZzogYm9vbGVhbjtcbiAgICBmb3JtYXQ6ICdqc29uJyB8ICd5bWwnO1xuICAgIGRpcmVjdG9yeTogc3RyaW5nO1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBDb25maWdGU1NlcnZpY2VPcHRpb25zKTtcbiAgICB3cml0ZShlbnRyeTogc3RyaW5nLCBkYXRhOiBhbnkpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHdyaXRlU3luYyhlbnRyeTogc3RyaW5nLCBkYXRhOiBhbnkpOiB2b2lkO1xuICAgIGxvYWQoKTogUHJvbWlzZTx2b2lkPjtcbiAgICBwcml2YXRlIHBhcnNlS2V5O1xuICAgIHNldChmdWxsS2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIHNvdXJjZT86IHN0cmluZyk6IHZvaWQ7XG4gICAgdW5zZXQoZnVsbEtleTogc3RyaW5nKTogdm9pZDtcbn1cbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCc7XG5leHBvcnQgdHlwZSBFbnZTY2hlbWEgPSB2LkluZmVyT3V0cHV0PHR5cGVvZiBlbnZTY2hlbWE+O1xuZXhwb3J0IGRlY2xhcmUgY29uc3QgZW52U2NoZW1hOiB2Lkxvb3NlT2JqZWN0U2NoZW1hPHtcbiAgICByZWFkb25seSBOT0RFX0VOVjogdi5PcHRpb25hbFNjaGVtYTx2LlVuaW9uU2NoZW1hPFt2LkxpdGVyYWxTY2hlbWE8XCJkZXZlbG9wbWVudFwiLCB1bmRlZmluZWQ+LCB2LkxpdGVyYWxTY2hlbWE8XCJwcm9kdWN0aW9uXCIsIHVuZGVmaW5lZD4sIHYuTGl0ZXJhbFNjaGVtYTxcInRlc3RcIiwgdW5kZWZpbmVkPl0sIHVuZGVmaW5lZD4sIFwiZGV2ZWxvcG1lbnRcIj47XG4gICAgcmVhZG9ubHkgWkVOSVRIX0JBU0VfUEFUSDogdi5TdHJpbmdTY2hlbWE8dW5kZWZpbmVkPjtcbiAgICByZWFkb25seSBaRU5JVEhfU1RPUkFHRV9QQVRIOiB2Lk9wdGlvbmFsU2NoZW1hPHYuU3RyaW5nU2NoZW1hPHVuZGVmaW5lZD4sIHVuZGVmaW5lZD47XG4gICAgcmVhZG9ubHkgWkVOSVRIX0FQUF9VUkw6IHYuT3B0aW9uYWxTY2hlbWE8di5TdHJpbmdTY2hlbWE8dW5kZWZpbmVkPiwgXCJodHRwOi8vbG9jYWxob3N0OjMwMDBcIj47XG4gICAgcmVhZG9ubHkgWkVOSVRIX1BPUlQ6IHYuT3B0aW9uYWxTY2hlbWE8di5TY2hlbWFXaXRoUGlwZTxyZWFkb25seSBbdi5TdHJpbmdTY2hlbWE8dW5kZWZpbmVkPiwgdi5UcmFuc2Zvcm1BY3Rpb248c3RyaW5nLCBudW1iZXI+XT4sIFwiMzAwMFwiPjtcbiAgICByZWFkb25seSBaRU5JVEhfSE9TVDogdi5PcHRpb25hbFNjaGVtYTx2LlN0cmluZ1NjaGVtYTx1bmRlZmluZWQ+LCBcIjAuMC4wLjBcIj47XG4gICAgcmVhZG9ubHkgWkVOSVRIX0xPR19MRVZFTDogdi5PcHRpb25hbFNjaGVtYTx2LlBpY2tsaXN0U2NoZW1hPFtcImVycm9yXCIsIFwid2FyblwiLCBcImluZm9cIiwgXCJkZWJ1Z1wiXSwgdW5kZWZpbmVkPiwgXCJpbmZvXCI+O1xuICAgIHJlYWRvbmx5IFpFTklUSF9MSUZFQ1lDTEVfREVCVUc6IHYuT3B0aW9uYWxTY2hlbWE8di5TY2hlbWFXaXRoUGlwZTxyZWFkb25seSBbdi5VbmlvblNjaGVtYTxbdi5MaXRlcmFsU2NoZW1hPFwidHJ1ZVwiLCB1bmRlZmluZWQ+LCB2LkxpdGVyYWxTY2hlbWE8XCJmYWxzZVwiLCB1bmRlZmluZWQ+LCB2LkxpdGVyYWxTY2hlbWE8XCIxXCIsIHVuZGVmaW5lZD4sIHYuTGl0ZXJhbFNjaGVtYTxcIjBcIiwgdW5kZWZpbmVkPl0sIHVuZGVmaW5lZD4sIHYuVHJhbnNmb3JtQWN0aW9uPFwiMFwiIHwgXCIxXCIgfCBcInRydWVcIiB8IFwiZmFsc2VcIiwgYm9vbGVhbj4sIHYuQm9vbGVhblNjaGVtYTx1bmRlZmluZWQ+XT4sIFwiZmFsc2VcIj47XG4gICAgcmVhZG9ubHkgWkVOSVRIX0NMSUVOVF9DT05GSUc6IHYuT3B0aW9uYWxTY2hlbWE8di5TY2hlbWFXaXRoUGlwZTxyZWFkb25seSBbdi5TdHJpbmdTY2hlbWE8dW5kZWZpbmVkPiwgdi5UcmFuc2Zvcm1BY3Rpb248c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBhbnk+Pl0+LCBcIlwiPjtcbiAgICByZWFkb25seSBaRU5JVEhfQ09ORklHOiB2Lk9wdGlvbmFsU2NoZW1hPHYuU2NoZW1hV2l0aFBpcGU8cmVhZG9ubHkgW3YuU3RyaW5nU2NoZW1hPHVuZGVmaW5lZD4sIHYuVHJhbnNmb3JtQWN0aW9uPHN0cmluZywgUmVjb3JkPHN0cmluZywgYW55Pj5dPiwgXCJcIj47XG4gICAgcmVhZG9ubHkgWkVOSVRIX0NPTkZJR19BUkdVTUVOVFM6IHYuT3B0aW9uYWxTY2hlbWE8di5TY2hlbWFXaXRoUGlwZTxyZWFkb25seSBbdi5TdHJpbmdTY2hlbWE8dW5kZWZpbmVkPiwgdi5UcmFuc2Zvcm1BY3Rpb248c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBhbnk+Pl0+LCBcIlwiPjtcbiAgICByZWFkb25seSBaRU5JVEhfQ09ORklHX0ZJTEVTOiB2Lk9wdGlvbmFsU2NoZW1hPHYuU2NoZW1hV2l0aFBpcGU8cmVhZG9ubHkgW3YuU3RyaW5nU2NoZW1hPHVuZGVmaW5lZD4sIHYuVHJhbnNmb3JtQWN0aW9uPHN0cmluZywgc3RyaW5nW10+XT4sIFwiXCI+O1xuICAgIHJlYWRvbmx5IFpFTklUSF9DT05GSUdfREVCVUc6IHYuT3B0aW9uYWxTY2hlbWE8di5TY2hlbWFXaXRoUGlwZTxyZWFkb25seSBbdi5VbmlvblNjaGVtYTxbdi5MaXRlcmFsU2NoZW1hPFwidHJ1ZVwiLCB1bmRlZmluZWQ+LCB2LkxpdGVyYWxTY2hlbWE8XCJmYWxzZVwiLCB1bmRlZmluZWQ+LCB2LkxpdGVyYWxTY2hlbWE8XCIxXCIsIHVuZGVmaW5lZD4sIHYuTGl0ZXJhbFNjaGVtYTxcIjBcIiwgdW5kZWZpbmVkPl0sIHVuZGVmaW5lZD4sIHYuVHJhbnNmb3JtQWN0aW9uPFwiMFwiIHwgXCIxXCIgfCBcInRydWVcIiB8IFwiZmFsc2VcIiwgYm9vbGVhbj4sIHYuQm9vbGVhblNjaGVtYTx1bmRlZmluZWQ+XT4sIFwiZmFsc2VcIj47XG4gICAgcmVhZG9ubHkgWkVOSVRIX0NPTkZJR19EUklWRVI6IHYuT3B0aW9uYWxTY2hlbWE8di5QaWNrbGlzdFNjaGVtYTxbXCJmc1wiLCBcInMzXCJdLCB1bmRlZmluZWQ+LCBcImZzXCI+O1xuICAgIHJlYWRvbmx5IFpFTklUSF9DT05GSUdfRlNfUEFUSDogdi5PcHRpb25hbFNjaGVtYTx2LlN0cmluZ1NjaGVtYTx1bmRlZmluZWQ+LCB1bmRlZmluZWQ+O1xuICAgIHJlYWRvbmx5IFpFTklUSF9DT05GSUdfRlNfRk9STUFUOiB2Lk9wdGlvbmFsU2NoZW1hPHYuUGlja2xpc3RTY2hlbWE8W1wianNvblwiLCBcInltbFwiXSwgdW5kZWZpbmVkPiwgXCJqc29uXCI+O1xuICAgIHJlYWRvbmx5IFpFTklUSF9DT05GSUdfUzNfQlVDS0VUOiB2Lk9wdGlvbmFsU2NoZW1hPHYuU3RyaW5nU2NoZW1hPHVuZGVmaW5lZD4sIHVuZGVmaW5lZD47XG4gICAgcmVhZG9ubHkgWkVOSVRIX0NPTkZJR19TM19SRUdJT046IHYuT3B0aW9uYWxTY2hlbWE8di5TdHJpbmdTY2hlbWE8dW5kZWZpbmVkPiwgdW5kZWZpbmVkPjtcbiAgICByZWFkb25seSBaRU5JVEhfQ09ORklHX1MzX0FDQ0VTU19LRVlfSUQ6IHYuT3B0aW9uYWxTY2hlbWE8di5TdHJpbmdTY2hlbWE8dW5kZWZpbmVkPiwgdW5kZWZpbmVkPjtcbiAgICByZWFkb25seSBaRU5JVEhfQ09ORklHX1MzX1NFQ1JFVF9BQ0NFU1NfS0VZOiB2Lk9wdGlvbmFsU2NoZW1hPHYuU3RyaW5nU2NoZW1hPHVuZGVmaW5lZD4sIHVuZGVmaW5lZD47XG4gICAgcmVhZG9ubHkgWkVOSVRIX0NPTkZJR19TM19TRVNTSU9OX1RPS0VOOiB2Lk9wdGlvbmFsU2NoZW1hPHYuU3RyaW5nU2NoZW1hPHVuZGVmaW5lZD4sIHVuZGVmaW5lZD47XG4gICAgcmVhZG9ubHkgWkVOSVRIX0NPTkZJR19TM19FTkRQT0lOVDogdi5PcHRpb25hbFNjaGVtYTx2LlN0cmluZ1NjaGVtYTx1bmRlZmluZWQ+LCB1bmRlZmluZWQ+O1xuICAgIHJlYWRvbmx5IFpFTklUSF9DT05GSUdfUzNfUFJFRklYOiB2Lk9wdGlvbmFsU2NoZW1hPHYuU3RyaW5nU2NoZW1hPHVuZGVmaW5lZD4sIFwiXCI+O1xuICAgIHJlYWRvbmx5IFpFTklUSF9QTFVHSU5TX0RJUlM6IHYuT3B0aW9uYWxTY2hlbWE8di5TY2hlbWFXaXRoUGlwZTxyZWFkb25seSBbdi5TdHJpbmdTY2hlbWE8dW5kZWZpbmVkPiwgdi5UcmFuc2Zvcm1BY3Rpb248c3RyaW5nLCBzdHJpbmdbXT5dPiwgdW5kZWZpbmVkPjtcbn0sIHVuZGVmaW5lZD47XG4iLCJpbXBvcnQgZG90ZW52IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSB7IEVudlNjaGVtYSB9IGZyb20gJyNzZXJ2ZXIvc2NoZW1hcy9lbnZTY2hlbWEudHMnO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW52U2VydmljZSB7XG4gICAgcHJpdmF0ZSBlbnY7XG4gICAgcHJpdmF0ZSBmaWxlcztcbiAgICBzdGF0aWMgY3JlYXRlKCk6IEVudlNlcnZpY2U7XG4gICAgc3RhdGljIGRvdEVudkNvbmZpZyhvcHRpb25zPzogZG90ZW52LkRvdGVudkNvbmZpZ09wdGlvbnMpOiBkb3RlbnYuRG90ZW52Q29uZmlnT3V0cHV0O1xuICAgIHNldEZpbGVzKGZpbGVzOiBzdHJpbmdbXSk6IHRoaXM7XG4gICAgYWRkRmlsZShmaWxlOiBzdHJpbmcpOiB0aGlzO1xuICAgIGxvYWQoKTogdGhpcztcbiAgICBnZXQgcHJvZHVjdGlvbigpOiBib29sZWFuO1xuICAgIGdldCBkZXZlbG9wbWVudCgpOiBib29sZWFuO1xuICAgIGdldCB0ZXN0KCk6IGJvb2xlYW47XG4gICAgaGFzPEsgZXh0ZW5kcyBrZXlvZiBFbnZTY2hlbWE+KGtleTogSyk6IGJvb2xlYW47XG4gICAgZ2V0PEsgZXh0ZW5kcyBrZXlvZiBFbnZTY2hlbWE+KGtleTogSywgZGVmYXVsdFZhbHVlPzogYW55KTogRW52U2NoZW1hW0tdO1xuICAgIHNldDxLIGV4dGVuZHMga2V5b2YgRW52U2NoZW1hPihrZXk6IEssIHZhbHVlOiBFbnZTY2hlbWFbS10pOiB2b2lkO1xufVxuIiwiaW1wb3J0IHsgdHlwZSBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnI3NoYXJlZC9pbmRleC50cyc7XG5pbXBvcnQgQ29uZmlnU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0NvbmZpZ1NlcnZpY2UudHMnO1xuaW1wb3J0IHR5cGUgRW52U2VydmljZSBmcm9tICcuL0VudlNlcnZpY2UudHMnO1xuZXhwb3J0IGludGVyZmFjZSBDb25maWdNYW5hZ2VyT3B0aW9ucyB7XG4gICAgZW52OiBFbnZTZXJ2aWNlO1xuICAgIGxvZ2dlcjogTG9nZ2VyU2VydmljZTtcbiAgICBzaWxlbnQ/OiBib29sZWFuO1xufVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29uZmlnTWFuYWdlclNlcnZpY2Uge1xuICAgIGVudjogRW52U2VydmljZTtcbiAgICBsb2dnZXI6IExvZ2dlclNlcnZpY2U7XG4gICAgc2lsZW50OiBib29sZWFuO1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IENvbmZpZ01hbmFnZXJPcHRpb25zKTtcbiAgICBzdGF0aWMgY3JlYXRlKG9wdGlvbnM6IENvbmZpZ01hbmFnZXJPcHRpb25zKTogQ29uZmlnTWFuYWdlclNlcnZpY2U7XG4gICAgcHJpdmF0ZSBsb2FkUzNDb25maWc7XG4gICAgcHJpdmF0ZSBsb2FkRlNDb25maWc7XG4gICAgbG9hZENvbmZpZ0Zyb21FbnYoc2VydmljZTogQ29uZmlnU2VydmljZSk6IHZvaWQ7XG4gICAgbG9hZENvbmZpZ0Zyb21GaWxlKHNlcnZpY2U6IENvbmZpZ1NlcnZpY2UsIGZpbGU6IHN0cmluZyk6IHZvaWQ7XG4gICAgbG9hZENvbmZpZ0Zyb21GaWxlcyhzZXJ2aWNlOiBDb25maWdTZXJ2aWNlLCBmaWxlczogc3RyaW5nW10pOiB2b2lkO1xuICAgIGxvYWQoKTogUHJvbWlzZTxDb25maWdTZXJ2aWNlPjtcbn1cbiIsImltcG9ydCBtcyBmcm9tICdtcyc7XG5pbXBvcnQgdHlwZSBEcml2ZUVudHJ5IGZyb20gJyNzaGFyZWQvZW50aXRpZXMvRHJpdmVFbnRyeUVudGl0eS50cyc7XG5leHBvcnQgaW50ZXJmYWNlIFVybE9wdGlvbnMge1xuICAgIGV4cGlyZXM/OiBtcy5TdHJpbmdWYWx1ZTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgVXBsb2FkVXJsT3B0aW9ucyB7XG4gICAgZXhwaXJlcz86IG1zLlN0cmluZ1ZhbHVlO1xuICAgIG1pbWVfdHlwZXM/OiBzdHJpbmdbXTtcbiAgICBtYXhfc2l6ZT86IG51bWJlcjtcbn1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyaXZlQmFzZUdhdGV3YXkge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQaWNrPERyaXZlQmFzZUdhdGV3YXksICdpZCcgfCAnbmFtZScgfCAnZGVzY3JpcHRpb24nIHwgJ2NvbmZpZyc+KTtcbiAgICBsaXN0KGZvbGRlcj86IHN0cmluZyk6IFByb21pc2U8RHJpdmVFbnRyeVtdPjtcbiAgICBmaW5kKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPERyaXZlRW50cnk+O1xuICAgIGV4aXN0cyhmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPjtcbiAgICByZWFkKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFVpbnQ4QXJyYXk+O1xuICAgIHJlYWRTdHJlYW0oZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8Tm9kZUpTLlJlYWRhYmxlU3RyZWFtPjtcbiAgICB3cml0ZShmaWxlbmFtZTogc3RyaW5nLCBkYXRhOiBVaW50OEFycmF5KTogUHJvbWlzZTx2b2lkPjtcbiAgICB3cml0ZVN0cmVhbShmaWxlbmFtZTogc3RyaW5nLCBzdHJlYW06IE5vZGVKUy5SZWFkYWJsZVN0cmVhbSk6IFByb21pc2U8dm9pZD47XG4gICAgZGVsZXRlKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHVybChmaWxlbmFtZTogc3RyaW5nLCBvcHRpb25zPzogVXJsT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPjtcbiAgICB1cGxvYWRVcmwoZmlsZW5hbWU6IHN0cmluZywgb3B0aW9ucz86IFVwbG9hZFVybE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz47XG59XG4iLCJpbXBvcnQgeyBTM0NsaWVudCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zMyc7XG5pbXBvcnQgdHlwZSB7IEluZmVyT3V0cHV0IH0gZnJvbSAndmFsaWJvdCc7XG5pbXBvcnQgQmFzZURyaXZlIGZyb20gJyNzZXJ2ZXIvZ2F0ZXdheXMvRHJpdmVCYXNlR2F0ZXdheS50cyc7XG5kZWNsYXJlIGNvbnN0IHNjaGVtYTogaW1wb3J0KFwidmFsaWJvdFwiKS5PYmplY3RTY2hlbWE8e1xuICAgIHJlYWRvbmx5IGJ1Y2tldDogaW1wb3J0KFwidmFsaWJvdFwiKS5TY2hlbWFXaXRoUGlwZTxyZWFkb25seSBbaW1wb3J0KFwidmFsaWJvdFwiKS5TdHJpbmdTY2hlbWE8dW5kZWZpbmVkPiwgaW1wb3J0KFwidmFsaWJvdFwiKS5NaW5MZW5ndGhBY3Rpb248c3RyaW5nLCAxLCB1bmRlZmluZWQ+XT47XG4gICAgcmVhZG9ubHkgcmVnaW9uOiBpbXBvcnQoXCJ2YWxpYm90XCIpLk9wdGlvbmFsU2NoZW1hPGltcG9ydChcInZhbGlib3RcIikuU3RyaW5nU2NoZW1hPHVuZGVmaW5lZD4sIHVuZGVmaW5lZD47XG4gICAgcmVhZG9ubHkgYWNjZXNzS2V5SWQ6IGltcG9ydChcInZhbGlib3RcIikuU2NoZW1hV2l0aFBpcGU8cmVhZG9ubHkgW2ltcG9ydChcInZhbGlib3RcIikuU3RyaW5nU2NoZW1hPHVuZGVmaW5lZD4sIGltcG9ydChcInZhbGlib3RcIikuTWluTGVuZ3RoQWN0aW9uPHN0cmluZywgMSwgdW5kZWZpbmVkPl0+O1xuICAgIHJlYWRvbmx5IHNlY3JldEFjY2Vzc0tleTogaW1wb3J0KFwidmFsaWJvdFwiKS5TY2hlbWFXaXRoUGlwZTxyZWFkb25seSBbaW1wb3J0KFwidmFsaWJvdFwiKS5TdHJpbmdTY2hlbWE8dW5kZWZpbmVkPiwgaW1wb3J0KFwidmFsaWJvdFwiKS5NaW5MZW5ndGhBY3Rpb248c3RyaW5nLCAxLCB1bmRlZmluZWQ+XT47XG4gICAgcmVhZG9ubHkgc2Vzc2lvblRva2VuOiBpbXBvcnQoXCJ2YWxpYm90XCIpLk9wdGlvbmFsU2NoZW1hPGltcG9ydChcInZhbGlib3RcIikuU3RyaW5nU2NoZW1hPHVuZGVmaW5lZD4sIHVuZGVmaW5lZD47XG4gICAgcmVhZG9ubHkgZW5kcG9pbnQ6IGltcG9ydChcInZhbGlib3RcIikuT3B0aW9uYWxTY2hlbWE8aW1wb3J0KFwidmFsaWJvdFwiKS5TdHJpbmdTY2hlbWE8dW5kZWZpbmVkPiwgdW5kZWZpbmVkPjtcbiAgICByZWFkb25seSBwcmVmaXg6IGltcG9ydChcInZhbGlib3RcIikuT3B0aW9uYWxTY2hlbWE8aW1wb3J0KFwidmFsaWJvdFwiKS5TdHJpbmdTY2hlbWE8dW5kZWZpbmVkPiwgdW5kZWZpbmVkPjtcbn0sIHVuZGVmaW5lZD47XG5leHBvcnQgdHlwZSBTM0RyaXZlQ29uZmlnID0gSW5mZXJPdXRwdXQ8dHlwZW9mIHNjaGVtYT47XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEcml2ZVMzIGV4dGVuZHMgQmFzZURyaXZlIHtcbiAgICBwcml2YXRlIHNjaGVtYTtcbiAgICBwcml2YXRlIF9jbGllbnQ/O1xuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFBpY2s8QmFzZURyaXZlLCAnaWQnIHwgJ25hbWUnIHwgJ2Rlc2NyaXB0aW9uJyB8ICdjb25maWcnPik7XG4gICAgZ2V0IHZhbGlkKCk6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBjaGVja1ZhbGlkO1xuICAgIHByb3RlY3RlZCBnZXQgYnVja2V0KCk6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgZ2V0IHByZWZpeCgpOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBnZXRLZXk7XG4gICAgcHJvdGVjdGVkIGdldCBjbGllbnQoKTogUzNDbGllbnQ7XG4gICAgZXhpc3RzOiBCYXNlRHJpdmVbJ2V4aXN0cyddO1xuICAgIGxpc3Q6IEJhc2VEcml2ZVsnbGlzdCddO1xuICAgIGZpbmQ6IEJhc2VEcml2ZVsnZmluZCddO1xuICAgIG1rZGlyKF9maWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgICByZWFkOiBCYXNlRHJpdmVbJ3JlYWQnXTtcbiAgICByZWFkU3RyZWFtKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGFueT47XG4gICAgd3JpdGU6IEJhc2VEcml2ZVsnd3JpdGUnXTtcbiAgICB3cml0ZVN0cmVhbShmaWxlbmFtZTogc3RyaW5nLCBzdHJlYW06IE5vZGVKUy5SZWFkYWJsZVN0cmVhbSk6IFByb21pc2U8dm9pZD47XG4gICAgZGVsZXRlOiBCYXNlRHJpdmVbJ2RlbGV0ZSddO1xuICAgIHVybDogQmFzZURyaXZlWyd1cmwnXTtcbiAgICB1cGxvYWRVcmw6IEJhc2VEcml2ZVsndXBsb2FkVXJsJ107XG59XG5leHBvcnQge307XG4iLCJpbXBvcnQgQ29uZmlnU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0NvbmZpZ1NlcnZpY2UudHMnO1xuaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJztcbmltcG9ydCBTM0RyaXZlIGZyb20gJyNzZXJ2ZXIvZ2F0ZXdheXMvRHJpdmVTM0dhdGV3YXkudHMnO1xuaW1wb3J0IHR5cGUgeyBTM0RyaXZlQ29uZmlnIH0gZnJvbSAnI3NlcnZlci9nYXRld2F5cy9Ecml2ZVMzR2F0ZXdheS50cyc7XG5pbnRlcmZhY2UgSW5pdGlPcHRpb25zIGV4dGVuZHMgT21pdDxTM0RyaXZlQ29uZmlnLCAnbmFtZScgfCAnZGVzY3JpcHRpb24nPiB7XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIGRlYnVnPzogYm9vbGVhbjtcbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlO1xufVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29uZmlnUzNTZXJ2aWNlIGV4dGVuZHMgQ29uZmlnU2VydmljZSB7XG4gICAgcHJlZml4OiBzdHJpbmc7XG4gICAgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlO1xuICAgIGRlYnVnOiBib29sZWFuO1xuICAgIGRyaXZlOiBTM0RyaXZlO1xuICAgIGJ1Y2tldDogc3RyaW5nO1xuICAgIHJlZ2lvbjogc3RyaW5nO1xuICAgIGVuZHBvaW50Pzogc3RyaW5nO1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEluaXRpT3B0aW9ucyk7XG4gICAgcHJpdmF0ZSBwYXJzZUtleTtcbiAgICBsb2FkKCk6IFByb21pc2U8dm9pZD47XG4gICAgc2V0KGZ1bGxLZXk6IHN0cmluZywgdmFsdWU6IGFueSwgc291cmNlPzogc3RyaW5nKTogdm9pZDtcbiAgICB1bnNldChmdWxsS2V5OiBzdHJpbmcpOiB2b2lkO1xufVxuZXhwb3J0IHt9O1xuIiwiaW1wb3J0IHR5cGUgeyBSZXF1ZXN0SW5pdCB9IGZyb20gJ3VuZGljaSc7XG5leHBvcnQgaW50ZXJmYWNlIERvd25sb2FkZWRGZXRjaE9wdGlvbnMgZXh0ZW5kcyBSZXF1ZXN0SW5pdCB7XG4gICAgcHJveHk/OiBzdHJpbmc7XG59XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb3dubG9hZFNlcnZpY2Uge1xuICAgIGZldGNoKHVybDogc3RyaW5nLCBvcHRpb25zPzogRG93bmxvYWRlZEZldGNoT3B0aW9ucyk6IFByb21pc2U8aW1wb3J0KFwidW5kaWNpXCIpLlJlc3BvbnNlPjtcbiAgICBzdHJlYW0odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBEb3dubG9hZGVkRmV0Y2hPcHRpb25zKTogUHJvbWlzZTx7XG4gICAgICAgIHN0cmVhbTogTm9kZUpTLlJlYWRhYmxlU3RyZWFtO1xuICAgICAgICBjb250ZW50VHlwZTogc3RyaW5nO1xuICAgIH0+O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBSZWFkU3RyZWFtIH0gZnJvbSAnZnMnO1xuaW1wb3J0IHR5cGUgbXMgZnJvbSAnbXMnO1xuaW1wb3J0IHR5cGUgRHJpdmVFbnRyeSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0RyaXZlRW50cnlFbnRpdHkudHMnO1xuZXhwb3J0IGludGVyZmFjZSBEcml2ZVVybE9wdGlvbnMge1xuICAgIGV4cGlyZXM/OiBtcy5TdHJpbmdWYWx1ZTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRHJpdmVVcGxvYWRVcmxPcHRpb25zIHtcbiAgICBleHBpcmVzPzogbXMuU3RyaW5nVmFsdWU7XG4gICAgbWltZV90eXBlcz86IHN0cmluZ1tdO1xuICAgIG1heF9zaXplPzogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBEcml2ZUNvbnRyYWN0IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICBsaXN0KGZvbGRlcj86IHN0cmluZyk6IFByb21pc2U8RHJpdmVFbnRyeVtdPjtcbiAgICBmaW5kKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPERyaXZlRW50cnk+O1xuICAgIGV4aXN0cyhmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPjtcbiAgICByZWFkKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFVpbnQ4QXJyYXk+O1xuICAgIHdyaXRlKGZpbGVuYW1lOiBzdHJpbmcsIGRhdGE6IFVpbnQ4QXJyYXkpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHdyaXRlU3RyZWFtKGZpbGVuYW1lOiBzdHJpbmcsIHN0cmVhbTogTm9kZUpTLlJlYWRhYmxlU3RyZWFtKTogUHJvbWlzZTx2b2lkPjtcbiAgICBkZWxldGUoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gICAgdXJsKGZpbGVuYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBEcml2ZVVybE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz47XG4gICAgdXBsb2FkVXJsKGZpbGVuYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBEcml2ZVVwbG9hZFVybE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz47XG4gICAgcmVhZFN0cmVhbShmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZWFkU3RyZWFtPjtcbn1cbiIsImltcG9ydCBEcml2ZUVudHJ5IGZyb20gJyNzaGFyZWQvZW50aXRpZXMvRHJpdmVFbnRyeUVudGl0eS50cyc7XG5pbXBvcnQgdHlwZSB7IERyaXZlVXJsT3B0aW9ucyB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RyaXZlQ29udHJhY3QudHMnO1xuaW1wb3J0IEJhc2VEcml2ZSBmcm9tICcjc2VydmVyL2dhdGV3YXlzL0RyaXZlQmFzZUdhdGV3YXkudHMnO1xuaW1wb3J0IHR5cGUgTG9nZ2VyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnO1xuaW50ZXJmYWNlIFZhbGlkYXRlVXBsb2FkT3B0aW9ucyB7XG4gICAgbWltZV90eXBlczogc3RyaW5nO1xuICAgIG1heFNpemU/OiBudW1iZXI7XG59XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEcml2ZVNlcnZpY2Uge1xuICAgIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXk6IHN0cmluZztcbiAgICBnYXRld2F5czogTWFwPHN0cmluZywgdHlwZW9mIEJhc2VEcml2ZT47XG4gICAgZHJpdmVzOiBNYXA8c3RyaW5nLCBCYXNlRHJpdmU+O1xuICAgIHNlbGVjdGVkPzogc3RyaW5nO1xuICAgIGRlZmF1bHREcml2ZT86IHN0cmluZztcbiAgICBkZWJ1ZzogYm9vbGVhbjtcbiAgICBsb2dnZXI6IExvZ2dlclNlcnZpY2U7XG4gICAgZ2V0IGN1cnJlbnQoKTogQmFzZURyaXZlIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBQYXJ0aWFsPERyaXZlU2VydmljZT4pO1xuICAgIGxpc3REcml2ZXMoKToge1xuICAgICAgICBkZWZhdWx0OiBib29sZWFuO1xuICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgICAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgfVtdO1xuICAgIGdldChuYW1lPzogc3RyaW5nKTogQmFzZURyaXZlO1xuICAgIHVzZShuYW1lPzogc3RyaW5nKTogRHJpdmVTZXJ2aWNlO1xuICAgIGxpc3QoZm9sZGVyPzogc3RyaW5nKTogUHJvbWlzZTxEcml2ZUVudHJ5W10+O1xuICAgIGZpbmQoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8RHJpdmVFbnRyeT47XG4gICAgZXhpc3RzKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIHJlYWQoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8VWludDhBcnJheT47XG4gICAgcmVhZFN0cmVhbShmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxOb2RlSlMuUmVhZGFibGVTdHJlYW0+O1xuICAgIHJlYWRBc1RleHQoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPjtcbiAgICB3cml0ZShmaWxlbmFtZTogc3RyaW5nLCBwYXlsb2FkOiBVaW50OEFycmF5IHwgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+O1xuICAgIHdyaXRlU3RyZWFtKGZpbGVuYW1lOiBzdHJpbmcsIHN0cmVhbTogTm9kZUpTLlJlYWRhYmxlU3RyZWFtKTogUHJvbWlzZTx2b2lkPjtcbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZSBhIFVSTCBmb3IgYSBmaWxlIGluIHRoZSBkcml2ZS5cbiAgICAgKiBAcGFyYW0gcGF5bG9hZCAgRmlsZSBpbnN0YW5jZSwgRmlsZSBJRCwgRHJpdmVFbnRyeSBpbnN0YW5jZSBvciBmaWxlbmFtZSBzdHJpbmdcbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHN0cmluZ1xuICAgICAqL1xuICAgIHVybChmaWxlbmFtZTogc3RyaW5nLCBvcHRpb25zPzogRHJpdmVVcmxPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+O1xuICAgIHVwbG9hZFVybChmaWxlbmFtZTogc3RyaW5nLCBvcHRpb25zPzogRHJpdmVVcmxPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFVwbG9hZCBhIGZpbGUgZnJvbSB0aGUgbG9jYWwgZmlsZXN5c3RlbSB0byB0aGUgZHJpdmUuXG4gICAgICogQHBhcmFtIHNvdXJjZSBmaWxlbmFtZSBpbiBsb2NhbCBmaWxlc3lzdGVtXG4gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICB1cGxvYWQoc291cmNlOiBzdHJpbmcsIGRlc3RpbmF0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIERvd25sb2FkIGEgZmlsZSBmcm9tIHRoZSBkcml2ZSB0byB0aGUgbG9jYWwgZmlsZXN5c3RlbS5cbiAgICAgKiBAcGFyYW0gZmlsZW5hbWUgZmlsZW5hbWUgaW4gdGhlIGRyaXZlXG4gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBkb3dubG9hZChmaWxlbmFtZTogc3RyaW5nLCBkZXN0aW5hdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgICBkZWxldGUoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gICAgbG9hZCgpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGNyZWF0ZURlZmF1bHREcml2ZXMoKTogUHJvbWlzZTx2b2lkPjtcbiAgICB2YWxpZGF0ZVVwbG9hZChvcHRpb25zOiBWYWxpZGF0ZVVwbG9hZE9wdGlvbnMsIGZpbGU6IHtcbiAgICAgICAgbWltZXR5cGU6IHN0cmluZztcbiAgICAgICAgc2l6ZTogbnVtYmVyO1xuICAgIH0pOiB2b2lkO1xufVxuZXhwb3J0IHt9O1xuIiwiaW1wb3J0IHR5cGUgeyBLeXNlbHkgfSBmcm9tIFwia3lzZWx5XCI7XG5leHBvcnQgaW50ZXJmYWNlIE1pZ3JhdGlvbkVudGl5RGF0YSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHNvdXJjZTogc3RyaW5nIHwgbnVsbDtcbiAgICBmaWxlbmFtZTogc3RyaW5nO1xuICAgIGV4ZWN1dGVkQXQ6IERhdGUgfCBudWxsO1xufVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWlncmF0aW9uRW50aXR5IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgc291cmNlOiBzdHJpbmcgfCBudWxsO1xuICAgIGZpbGVuYW1lOiBzdHJpbmc7XG4gICAgZXhlY3V0ZWRBdDogRGF0ZSB8IG51bGw7XG4gICAgY29uc3RydWN0b3IoZGF0YTogTWlncmF0aW9uRW50aXlEYXRhKTtcbiAgICB1cChkYjogS3lzZWx5PGFueT4pOiBQcm9taXNlPHZvaWQ+O1xuICAgIGRvd24oZGI6IEt5c2VseTxhbnk+KTogUHJvbWlzZTx2b2lkPjtcbn1cbiIsImltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UsIENvb2tpZU9wdGlvbnMgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCBCYXNlIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LnRzJztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvb2tpZU1hcEVudGl0eSBleHRlbmRzIEJhc2Uge1xuICAgIHJlcXVlc3Q6IFJlcXVlc3Q7XG4gICAgcmVzcG9uc2U6IFJlc3BvbnNlO1xuICAgIGNvbnN0cnVjdG9yKHJlcXVlc3Q6IFJlcXVlc3QsIHJlc3BvbnNlOiBSZXNwb25zZSk7XG4gICAgc2V0KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgb3B0aW9ucz86IENvb2tpZU9wdGlvbnMpOiB2b2lkO1xufVxuIiwiaW1wb3J0IENvb2tpZU1hcEVudGl0eSBmcm9tIFwiI3NlcnZlci9lbnRpdGllcy9Db29raWVNYXBFbnRpdHkudHNcIjtcbmltcG9ydCBDb250YWluZXJTZXJ2aWNlIGZyb20gXCIjc2hhcmVkL3NlcnZpY2VzL0NvbnRhaW5lclNlcnZpY2UudHNcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB0eXBlIHsgUmVzb2x2YWJsZUhlYWQgfSBmcm9tICdAdW5oZWFkL3Z1ZSc7XG5pbXBvcnQgQ29uZmlnU2VydmljZSBmcm9tIFwiI3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzXCI7XG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VSZXF1ZXN0Q29udGV4dEVudGl0eU9wdGlvbnMge1xuICAgIHVybDogc3RyaW5nO1xuICAgIHJlcXVlc3Q6IFJlcXVlc3Q7XG4gICAgcmVzcG9uc2U6IFJlc3BvbnNlO1xuICAgIHN0YXRlPzogTWFwPHN0cmluZywgYW55PjtcbiAgICBub2RlQ29udGFpbmVyPzogQ29udGFpbmVyU2VydmljZTtcbiAgICBub2RlQ29uZmlnPzogQ29uZmlnU2VydmljZTtcbiAgICBub2RlU3RhdGU/OiBNYXA8c3RyaW5nLCBhbnk+O1xuICAgIGJyb3dzZXJDb250YWluZXI/OiBDb250YWluZXJTZXJ2aWNlO1xuICAgIGJyb3dzZXJDb25maWc/OiBDb25maWdTZXJ2aWNlO1xuICAgIGJyb3dzZXJTdGF0ZT86IE1hcDxzdHJpbmcsIGFueT47XG59XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdlUmVxdWVzdENvbnRleHRFbnRpdHkge1xuICAgIHVybDogc3RyaW5nO1xuICAgIHJlcXVlc3Q6IFJlcXVlc3Q7XG4gICAgcmVzcG9uc2U6IFJlc3BvbnNlO1xuICAgIGNvb2tpZXM6IENvb2tpZU1hcEVudGl0eTtcbiAgICBoZWFkOiBSZXNvbHZhYmxlSGVhZFtdO1xuICAgIG5vZGVDb250YWluZXI6IENvbnRhaW5lclNlcnZpY2U7XG4gICAgbm9kZUNvbmZpZzogQ29uZmlnU2VydmljZTtcbiAgICBub2RlU3RhdGU6IE1hcDxzdHJpbmcsIGFueT47XG4gICAgYnJvd3NlckNvbnRhaW5lcjogQ29udGFpbmVyU2VydmljZTtcbiAgICBicm93c2VyQ29uZmlnOiBDb25maWdTZXJ2aWNlO1xuICAgIGJyb3dzZXJTdGF0ZTogTWFwPHN0cmluZywgYW55PjtcbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQYWdlUmVxdWVzdENvbnRleHRFbnRpdHlPcHRpb25zKTtcbiAgICBzZXRCcm93c2VyU3RhdGUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkO1xuICAgIHNldE5vZGVTdGF0ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQ7XG4gICAgc2V0U3RhdGUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkO1xuICAgIHNldEJyb3dzZXJDb250YWluZXJWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQ7XG4gICAgc2V0Tm9kZUNvbnRhaW5lclZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZDtcbiAgICBzZXRDb250YWluZXJWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQ7XG4gICAgc2V0QnJvd3NlckNvbmZpZ1ZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZDtcbiAgICBzZXROb2RlQ29uZmlnVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkO1xuICAgIHNldENvbmZpZ1ZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZDtcbn1cbiIsImltcG9ydCBCYXNlQWNsIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvQWNsRW50aXR5LnRzJztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFjbCBleHRlbmRzIEJhc2VBY2wge1xuICAgIGF1dGhvcml6ZShhY3Rpb246IHN0cmluZywgc3ViamVjdDogYW55LCBvYmplY3Q/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZDtcbn1cbiIsImltcG9ydCB0eXBlIEFjbCBmcm9tICcjc2VydmVyL2VudGl0aWVzL0FjbEVudGl0eS50cyc7XG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3Qge1xuICAgIFtrZXk6IHN0cmluZ106IGFueTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IGFueTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cENvbnRleHQge1xuICAgIHVybDogc3RyaW5nO1xuICAgIG1ldGhvZDogc3RyaW5nO1xuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBxdWVyeTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+O1xuICAgIGJvZHk6IGFueTtcbiAgICBjb29raWU6IGFueTtcbiAgICB1cGxvYWQ6IGFueTtcbiAgICBhY2w6IEFjbDtcbiAgICByZXF1ZXN0OiBSZXF1ZXN0O1xuICAgIHJlc3BvbnNlOiBSZXNwb25zZTtcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5leHBvcnQge307XG4iLCJpbXBvcnQgdHlwZSB7IEh0dHBDb250ZXh0IH0gZnJvbSBcIi4vSHR0cENvbnRleHRDb250cmFjdFwiO1xuZXhwb3J0IGludGVyZmFjZSBSZWRpcmVjdCB7XG4gICAgcmVkaXJlY3Q6IHN0cmluZztcbn1cbmV4cG9ydCB0eXBlIEhhbmRsZVJlc3VsdCA9IFJlY29yZDxzdHJpbmcsIGFueT4gfCBSZWRpcmVjdCB8IHZvaWQ7XG5leHBvcnQgaW50ZXJmYWNlIE1pZGRsZXdhcmUge1xuICAgIGhhbmRsZShjdHg6IGFueSk6IEhhbmRsZVJlc3VsdCB8IFByb21pc2U8SGFuZGxlUmVzdWx0Pjtcbn1cbnR5cGUgRXh0cmFjdE1pZGRsZXdhcmVDb250ZXh0PE0gZXh0ZW5kcyBNaWRkbGV3YXJlPiA9IEF3YWl0ZWQ8UmV0dXJuVHlwZTxNWydoYW5kbGUnXT4+IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA/IEF3YWl0ZWQ8UmV0dXJuVHlwZTxNWydoYW5kbGUnXT4+IDoge307XG50eXBlIFByb2Nlc3NNaWRkbGV3YXJlQXJyYXk8VCBleHRlbmRzIHJlYWRvbmx5IE1pZGRsZXdhcmVbXT4gPSBUIGV4dGVuZHMgcmVhZG9ubHkgW2luZmVyIEZpcnN0IGV4dGVuZHMgTWlkZGxld2FyZSwgLi4uaW5mZXIgUmVzdCBleHRlbmRzIHJlYWRvbmx5IE1pZGRsZXdhcmVbXV0gPyBFeHRyYWN0TWlkZGxld2FyZUNvbnRleHQ8Rmlyc3Q+ICYgUHJvY2Vzc01pZGRsZXdhcmVBcnJheTxSZXN0PiA6IHt9O1xuZXhwb3J0IHR5cGUgTWlkZGxld2FyZUhhbmRsZVJlc3VsdDxUIGV4dGVuZHMgcmVhZG9ubHkgTWlkZGxld2FyZVtdID0gcmVhZG9ubHkgTWlkZGxld2FyZVtdPiA9IFByb2Nlc3NNaWRkbGV3YXJlQXJyYXk8VD47XG5leHBvcnQgaW50ZXJmYWNlIEhhbmRsZXI8VCA9IFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICAoY3R4OiBIdHRwQ29udGV4dCAmIFQpOiBQcm9taXNlPGFueT4gfCBhbnk7XG59XG5leHBvcnQge307XG4iLCJpbXBvcnQgdHlwZSB7IEhhbmRsZXIsIE1pZGRsZXdhcmUgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9Sb3V0ZXJDb250cmFjdC50cyc7XG50eXBlIFJvdXRlTWV0aG9kID0gJ2dldCcgfCAnR0VUJyB8ICdwb3N0JyB8ICdQT1NUJyB8ICdwdXQnIHwgJ1BVVCcgfCAncGF0Y2gnIHwgJ1BBVENIJyB8ICdkZWxldGUnIHwgJ0RFTEVURSc7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb3V0ZSB7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgIG1ldGhvZDogUm91dGVNZXRob2Q7XG4gICAgaGFuZGxlcjogSGFuZGxlcjxhbnk+IHwgbnVsbDtcbiAgICBtaWRkbGV3YXJlczogTWlkZGxld2FyZVtdO1xuICAgIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbDtcbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogUGFydGlhbDxSb3V0ZT4pO1xuICAgIHN0YXRpYyBwYXJhbXMocm91dGVQYXRoOiBzdHJpbmcsIHJlcXVlc3RQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIHN0YXRpYyBxdWVyeShyZXF1ZXN0UGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICB0b0pTT04oKToge1xuICAgICAgICBwYXRoOiBzdHJpbmc7XG4gICAgICAgIG1ldGhvZDogUm91dGVNZXRob2Q7XG4gICAgICAgIG1pZGRsZXdhcmVzOiBzdHJpbmdbXTtcbiAgICAgICAgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsO1xuICAgIH07XG59XG5leHBvcnQge307XG4iLCJpbXBvcnQgUm91dGUgZnJvbSAnI3NlcnZlci9lbnRpdGllcy9Sb3V0ZUVudGl0eS50cyc7XG5pbXBvcnQgdHlwZSB7IEhhbmRsZXIsIE1pZGRsZXdhcmUsIE1pZGRsZXdhcmVIYW5kbGVSZXN1bHQgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9Sb3V0ZXJDb250cmFjdC50cyc7XG5pbXBvcnQgeyBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnI3NoYXJlZC9pbmRleC50cyc7XG50eXBlIFJvdXRlQ29udGV4dCA9ICdnbG9iYWwnIHwgJ2dyb3VwJyB8ICdyb3V0ZSc7XG5pbnRlcmZhY2UgTWlkZGxld2FyZVJlZ2lzdGVyIHtcbiAgICBtaWRkbGV3YXJlOiBNaWRkbGV3YXJlO1xuICAgIGNvbnRleHQ6IFJvdXRlQ29udGV4dDtcbn1cbmludGVyZmFjZSBMb2FkT3B0aW9ucyB7XG4gICAgZGVidWc/OiBib29sZWFuO1xufVxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZXJFdmVudHMge1xuICAgICdyb3V0ZXI6cmVnaXN0ZXJlZCc6IHtcbiAgICAgICAgcm91dGVyOiBSb3V0ZXJTZXJ2aWNlO1xuICAgIH07XG4gICAgJ3JvdXRlcjpsb2FkZWQnOiB7XG4gICAgICAgIHJvdXRlcjogUm91dGVyU2VydmljZTtcbiAgICB9O1xufVxuZGVjbGFyZSBjb25zdCBSb3V0ZXJTZXJ2aWNlX2Jhc2U6IHtcbiAgICBuZXcgKC4uLmFyZ3M6IGFueVtdKToge1xuICAgICAgICBsaXN0ZW5lcnM6IGltcG9ydChcIiNzaGFyZWQvaW5kZXgudHNcIikuTGlzdGVuZXJbXTtcbiAgICAgICAgb24oZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHZvaWQ7XG4gICAgICAgIG9mZihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdm9pZDtcbiAgICAgICAgZW1pdChldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQ7XG4gICAgICAgIGVtaXRBc3luYyhldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD47XG4gICAgfTtcbn0gJiBpbXBvcnQoXCIjc2hhcmVkL2luZGV4LnRzXCIpLkNvbnN0cnVjdG9yO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm91dGVyU2VydmljZTxDID0ge30+IGV4dGVuZHMgUm91dGVyU2VydmljZV9iYXNlIHtcbiAgICBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5OiBzdHJpbmc7XG4gICAgcm91dGVzOiBSb3V0ZVtdO1xuICAgIG1pZGRsZXdhcmVzOiBNaWRkbGV3YXJlUmVnaXN0ZXJbXTtcbiAgICBwcmVmaXhlczogc3RyaW5nW107XG4gICAgZ3JvdXBzOiBSb3V0ZXJTZXJ2aWNlPGFueT5bXTtcbiAgICBncm91cFByZWZpeGVzOiBzdHJpbmdbXTtcbiAgICBkZWJ1ZzogYm9vbGVhbjtcbiAgICBsb2dnZXI6IExvZ2dlclNlcnZpY2U7XG4gICAgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgY29uc3RydWN0b3IoZGF0YT86IFBhcnRpYWw8Um91dGVyU2VydmljZTxDPj4pO1xuICAgIHVzZTxUIGV4dGVuZHMgTWlkZGxld2FyZT4obWlkZGxld2FyZTogVCwgY29udGV4dD86IFJvdXRlQ29udGV4dCk6IFJvdXRlclNlcnZpY2U8QyAmIE1pZGRsZXdhcmVIYW5kbGVSZXN1bHQ8W3R5cGVvZiBtaWRkbGV3YXJlXT4+O1xuICAgIHByZWZpeChwcmVmaXg6IHN0cmluZyk6IHRoaXM7XG4gICAgbWFrZVBhdGgoYXJnczogc3RyaW5nKTogc3RyaW5nO1xuICAgIGFkZChwYXlsb2FkOiBQaWNrPFJvdXRlLCAncGF0aCcgfCAnbWV0aG9kJyB8ICdoYW5kbGVyJz4pOiB2b2lkO1xuICAgIGdldChwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IEhhbmRsZXI8Qz4pOiB2b2lkO1xuICAgIHBvc3QocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBIYW5kbGVyPEM+KTogdm9pZDtcbiAgICBwdXQocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBIYW5kbGVyPEM+KTogdm9pZDtcbiAgICBwYXRjaChwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IEhhbmRsZXI8Qz4pOiB2b2lkO1xuICAgIG1hbnkobWV0aG9kczogUm91dGVbJ21ldGhvZCddW10sIHBhdGg6IHN0cmluZywgaGFuZGxlcjogSGFuZGxlcjxDPik6IHZvaWQ7XG4gICAgZGVsZXRlKHBhdGg6IHN0cmluZywgaGFuZGxlcjogSGFuZGxlcjxDPik6IHZvaWQ7XG4gICAgZ3JvdXAoKTogUm91dGVyU2VydmljZTxDPjtcbiAgICByZXNvbHZlKG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBSb3V0ZSB8IG51bGw7XG4gICAgZXhlY3V0ZShyb3V0ZTogUm91dGUsIGluaXRpYWxDdHg6IGFueSk6IFByb21pc2U8YW55PjtcbiAgICBtYXRjaFBhdGgocm91dGVQYXRoOiBzdHJpbmcsIHJlcXVlc3RQYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuICAgIGNsZWFyKCk6IHZvaWQ7XG4gICAgbGlzdCgpOiBSb3V0ZVtdO1xuICAgIGxvYWQob3B0aW9ucz86IExvYWRPcHRpb25zKTogUHJvbWlzZTx2b2lkPjtcbiAgICBsb2FkU3luYyhvcHRpb25zPzogTG9hZE9wdGlvbnMpOiB2b2lkO1xufVxuZXhwb3J0IHt9O1xuIiwiaW1wb3J0IHR5cGUgeyBLeXNlbHkgfSBmcm9tIFwia3lzZWx5XCI7XG5leHBvcnQgaW50ZXJmYWNlIFNlZWRlckVudGl5RGF0YSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHNvdXJjZTogc3RyaW5nIHwgbnVsbDtcbiAgICBmaWxlbmFtZTogc3RyaW5nO1xufVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VlZGVyRW50aXR5IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgc291cmNlOiBzdHJpbmcgfCBudWxsO1xuICAgIGZpbGVuYW1lOiBzdHJpbmc7XG4gICAgY29uc3RydWN0b3IoZGF0YTogU2VlZGVyRW50aXlEYXRhKTtcbiAgICBydW4oZGI6IEt5c2VseTxhbnk+KTogUHJvbWlzZTx2b2lkPjtcbn1cbiIsImltcG9ydCBFbW1pdHRlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9FbW1pdHRlclNlcnZpY2UudHMnO1xuaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJztcbmltcG9ydCB0eXBlIHsgS3lzZWx5IH0gZnJvbSAna3lzZWx5JztcbmltcG9ydCBTZWVkZXJFbnRpdHkgZnJvbSAnI3NlcnZlci9lbnRpdGllcy9TZWVkZXJFbnRpdHkudHMnO1xuZXhwb3J0IGludGVyZmFjZSBTZWVkZXJTb3VyY2Uge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZGlyZWN0b3J5OiBzdHJpbmc7XG59XG5leHBvcnQgaW50ZXJmYWNlIExpc3RGaWx0ZXJzIHtcbiAgICBzb3VyY2U/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICBuYW1lPzogc3RyaW5nIHwgc3RyaW5nW107XG59XG5leHBvcnQgaW50ZXJmYWNlIFNlZWRlclJlc3VsdCB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGZpbGVuYW1lOiBzdHJpbmc7XG4gICAgc291cmNlOiBzdHJpbmcgfCBudWxsO1xuICAgIHJlc3VsdDogJ3N1Y2Nlc3MnIHwgJ2ZhaWxlZCc7XG4gICAgZXJyb3I/OiBhbnk7XG59XG5leHBvcnQgaW50ZXJmYWNlIFNlZWRlckV2ZW50cyB7XG4gICAgJ3NlZWRlcjpiZWZvcmUtcnVuJzoge1xuICAgICAgICBzZWVkZXJzOiBzdHJpbmdbXTtcbiAgICB9O1xuICAgICdzZWVkZXI6YWZ0ZXItcnVuJzoge1xuICAgICAgICBzZWVkZXJzOiBzdHJpbmdbXTtcbiAgICB9O1xufVxuZXhwb3J0IGludGVyZmFjZSBTZWVkZXJTZXJ2aWNlT3B0aW9ucyB7XG4gICAgZGI6IEt5c2VseTxhbnk+O1xuICAgIHNvdXJjZXM/OiBTZWVkZXJTb3VyY2VbXTtcbiAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgZW1taXR0ZXI/OiBFbW1pdHRlclNlcnZpY2U7XG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZTtcbn1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlZWVkZXJTZXJ2aWNlIHtcbiAgICBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5OiBzdHJpbmc7XG4gICAgZGVidWc6IGJvb2xlYW47XG4gICAgZW1taXR0ZXI6IEVtbWl0dGVyU2VydmljZTtcbiAgICBsb2dnZXI6IExvZ2dlclNlcnZpY2U7XG4gICAgZGI6IEt5c2VseTxhbnk+O1xuICAgIHNvdXJjZXM6IFNlZWRlclNvdXJjZVtdO1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFNlZWRlclNlcnZpY2VPcHRpb25zKTtcbiAgICBhZGRTb3VyY2Uoc291cmNlOiBTZWVkZXJTb3VyY2UpOiB2b2lkO1xuICAgIGxpc3RTb3VyY2Uoc291cmNlOiBTZWVkZXJTb3VyY2UpOiBQcm9taXNlPFNlZWRlckVudGl0eVtdPjtcbiAgICBsaXN0KGZpbHRlcnM/OiBMaXN0RmlsdGVycyk6IFByb21pc2U8U2VlZGVyRW50aXR5W10+O1xuICAgIHJ1blNlZWRlcihzZWVkZXI6IFNlZWRlckVudGl0eSk6IFByb21pc2U8U2VlZGVyUmVzdWx0PjtcbiAgICBydW4oZmlsdGVycz86IExpc3RGaWx0ZXJzICYge1xuICAgICAgICBzdGVwcz86IG51bWJlcjtcbiAgICB9KTogUHJvbWlzZTxTZWVkZXJSZXN1bHRbXT47XG59XG4iLCJpbXBvcnQgdHlwZSBNaWdyYXRpb25FbnRpdHkgZnJvbSBcIiNzZXJ2ZXIvZW50aXRpZXMvTWlncmF0aW9uRW50aXR5LnRzXCI7XG5pbXBvcnQgdHlwZSBQYWdlUmVxdWVzdENvbnRleHRFbnRpdHkgZnJvbSBcIiNzZXJ2ZXIvZW50aXRpZXMvUGFnZVJlcXVlc3RDb250ZXh0RW50aXR5LnRzXCI7XG5pbXBvcnQgdHlwZSB7IENsaUV2ZW50cyB9IGZyb20gXCIjc2VydmVyL3NlcnZpY2VzL0NsaVNlcnZpY2UudHNcIjtcbmltcG9ydCB0eXBlIHsgUm91dGVyRXZlbnRzIH0gZnJvbSBcIiNzZXJ2ZXIvc2VydmljZXMvUm91dGVyU2VydmljZS50c1wiO1xuaW1wb3J0IHR5cGUgeyBTZWVkZXJFdmVudHMgfSBmcm9tIFwiI3NlcnZlci9zZXJ2aWNlcy9TZWVkZXJTZXJ2aWNlLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFVzZXJFbnRpdHkgfSBmcm9tIFwiI3NoYXJlZC9pbmRleC50c1wiO1xuZXhwb3J0IGludGVyZmFjZSBFdmVudENvbnRyYWN0IGV4dGVuZHMgU2VlZGVyRXZlbnRzLCBSb3V0ZXJFdmVudHMsIENsaUV2ZW50cyB7XG4gICAgJ21pZ3JhdG9yOmJlZm9yZS1taWdyYXRlJzoge1xuICAgICAgICBtaWdyYXRpb25zOiBNaWdyYXRpb25FbnRpdHlbXTtcbiAgICB9O1xuICAgICdtaWdyYXRvcjphZnRlci1taWdyYXRlJzoge1xuICAgICAgICBtaWdyYXRpb25zOiBNaWdyYXRpb25FbnRpdHlbXTtcbiAgICB9O1xuICAgICdtaWdyYXRvcjpiZWZvcmUtcm9sbGJhY2snOiB7XG4gICAgICAgIG1pZ3JhdGlvbnM6IE1pZ3JhdGlvbkVudGl0eVtdO1xuICAgIH07XG4gICAgJ21pZ3JhdG9yOmFmdGVyLXJvbGxiYWNrJzoge1xuICAgICAgICBtaWdyYXRpb25zOiBNaWdyYXRpb25FbnRpdHlbXTtcbiAgICB9O1xuICAgICd1c2VyOmJlZm9yZS1jcmVhdGUnOiB7XG4gICAgICAgIHVzZXI6IFVzZXJFbnRpdHk7XG4gICAgfTtcbiAgICAndXNlcjphZnRlci1jcmVhdGUnOiB7XG4gICAgICAgIHVzZXI6IFVzZXJFbnRpdHk7XG4gICAgfTtcbiAgICAndXNlcjpiZWZvcmUtdXBkYXRlJzoge1xuICAgICAgICB1c2VyOiBVc2VyRW50aXR5O1xuICAgIH07XG4gICAgJ3VzZXI6YWZ0ZXItdXBkYXRlJzoge1xuICAgICAgICB1c2VyOiBVc2VyRW50aXR5O1xuICAgIH07XG4gICAgJ3VzZXI6YmVmb3JlLWRlbGV0ZSc6IHtcbiAgICAgICAgdXNlcjogVXNlckVudGl0eTtcbiAgICB9O1xuICAgICd1c2VyOmFmdGVyLWRlbGV0ZSc6IHtcbiAgICAgICAgdXNlcjogVXNlckVudGl0eTtcbiAgICB9O1xuICAgICdwYWdlOnJlcXVlc3Q6c3RhcnQnOiBQYWdlUmVxdWVzdENvbnRleHRFbnRpdHk7XG4gICAgJ3BhZ2U6cmVxdWVzdDpiZWZvcmUtcmVuZGVyJzogUGFnZVJlcXVlc3RDb250ZXh0RW50aXR5O1xuICAgICdwYWdlOnJlcXVlc3Q6YWZ0ZXItcmVuZGVyJzogUGFnZVJlcXVlc3RDb250ZXh0RW50aXR5O1xuICAgIFtrZXk6IHN0cmluZ106IGFueTtcbn1cbmV4cG9ydCB7fTtcbiIsImltcG9ydCBCYXNlRW1taXR0ZXJTZXJ2aWNlIGZyb20gXCIuLi8uLi9zaGFyZWQvc2VydmljZXMvRW1taXR0ZXJTZXJ2aWNlXCI7XG5pbXBvcnQgdHlwZSB7IEV2ZW50Q29udHJhY3QgfSBmcm9tICcuLi9jb250cmFjdHMvRXZlbnRDb250cmFjdCc7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbW1pdHRlclNlcnZpY2UgZXh0ZW5kcyBCYXNlRW1taXR0ZXJTZXJ2aWNlPEV2ZW50Q29udHJhY3Q+IHtcbn1cbiIsImltcG9ydCBtcyBmcm9tICdtcyc7XG5pbXBvcnQgRW52U2VydmljZSBmcm9tICcuL0VudlNlcnZpY2UnO1xuaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJztcbmludGVyZmFjZSBVUkxPcHRpb25zIHtcbiAgICBkYXRhPzogYW55O1xuICAgIGV4cGlyZXM/OiBtcy5TdHJpbmdWYWx1ZTtcbiAgICBleHBpcmVBdD86IG51bWJlciB8IERhdGU7XG59XG5pbnRlcmZhY2UgRW5jcnlwdFNlcnZpY2VPcHRpb25zIHtcbiAgICBrZXk/OiBzdHJpbmc7XG4gICAgZGVidWc/OiBib29sZWFuO1xuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2U7XG4gICAgZW52PzogRW52U2VydmljZTtcbn1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVuY3J5cHRTZXJ2aWNlIHtcbiAgICBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5OiBzdHJpbmc7XG4gICAgZGVidWc6IGJvb2xlYW47XG4gICAgZW52OiBFbnZTZXJ2aWNlO1xuICAgIGxvZ2dlcjogTG9nZ2VyU2VydmljZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFsZ29yaXRobTtcbiAgICBwcml2YXRlIGtleTtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBFbmNyeXB0U2VydmljZU9wdGlvbnMpO1xuICAgIHN0YXRpYyBjcmVhdGUob3B0aW9uczogRW5jcnlwdFNlcnZpY2VPcHRpb25zKTogRW5jcnlwdFNlcnZpY2U7XG4gICAgc2V0RGVidWcoZGVidWc6IGJvb2xlYW4pOiB2b2lkO1xuICAgIHNldExvZ2dlcihsb2dnZXI6IExvZ2dlclNlcnZpY2UpOiB2b2lkO1xuICAgIHNldEVudihlbnY6IEVudlNlcnZpY2UpOiB2b2lkO1xuICAgIHNldEtleShrZXk6IHN0cmluZyk6IHZvaWQ7XG4gICAgZW5jcnlwdCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmc7XG4gICAgZGVjcnlwdChvcHRpb25zOiBzdHJpbmcpOiBzdHJpbmc7XG4gICAgZW5jcnlwdE9iamVjdChvYmo6IGFueSk6IHN0cmluZztcbiAgICBkZWNyeXB0T2JqZWN0PFQ+KGVuY3J5cHRlZFN0cmluZzogc3RyaW5nKTogVDtcbiAgICB1cmwocGF0aDogc3RyaW5nLCBvcHRpb25zPzogVVJMT3B0aW9ucyk6IHN0cmluZztcbiAgICB2ZXJpZnlVcmwoZW5jcnlwdGVkS2V5OiBzdHJpbmcpOiBhbnk7XG59XG5leHBvcnQge307XG4iLCJpbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cyc7XG5leHBvcnQgaW50ZXJmYWNlIEdpdFJlcG9JbmZvIHtcbiAgICBkaXJlY3Rvcnk6IHN0cmluZztcbiAgICBoZWFkOiBzdHJpbmcgfCBudWxsO1xuICAgIHNob3J0SGFzaDogc3RyaW5nO1xuICAgIGlzRGV0YWNoZWRIZWFkOiBib29sZWFuO1xuICAgIHJlbW90ZXM6IHN0cmluZ1tdO1xufVxuZXhwb3J0IGludGVyZmFjZSBHaXRHYXRld2F5T3B0aW9ucyB7XG4gICAgY3dkOiBzdHJpbmc7XG4gICAgc3NoS2V5Pzogc3RyaW5nO1xuICAgIHNzaEtleUZpbGU/OiBzdHJpbmc7XG4gICAgc3NoS2V5VG1wRmlsZU5hbWU/OiBzdHJpbmc7XG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZTtcbiAgICBkZWJ1Zz86IGJvb2xlYW47XG59XG5leHBvcnQgZGVjbGFyZSBjbGFzcyBHaXRHYXRld2F5IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN3ZDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNzaEtleT87XG4gICAgcHJpdmF0ZSByZWFkb25seSBzc2hLZXlGaWxlPztcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNzaEtleVRtcEZpbGVOYW1lPztcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlYnVnO1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEdpdEdhdGV3YXlPcHRpb25zKTtcbiAgICBwcml2YXRlIGJ1aWxkRW52O1xuICAgIHJ1bihhcmdzOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG4gICAgdHJ5UnVuKGFyZ3M6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gICAgY2hlY2tvdXQocmVmOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGZldGNoKCk6IFByb21pc2U8dm9pZD47XG4gICAgcHVsbCgpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGdldEluZm8oKTogUHJvbWlzZTxHaXRSZXBvSW5mbz47XG59XG4iLCJpbXBvcnQgdHlwZSB7IEdpdEdhdGV3YXkgfSBmcm9tICcuLi9nYXRld2F5cy9HaXRHYXRld2F5LnRzJztcbmV4cG9ydCBpbnRlcmZhY2UgR2l0QnJhbmNoIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgcmVtb3RlOiBzdHJpbmcgfCBudWxsO1xuICAgIGlzQ3VycmVudDogYm9vbGVhbjtcbiAgICBpc1JlbW90ZTogYm9vbGVhbjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgR2l0QnJhbmNoRmV0Y2hPcHRpb25zIHtcbiAgICByZW1vdGU6IHN0cmluZztcbiAgICBicmFuY2g6IHN0cmluZztcbiAgICBsb2NhbE5hbWU/OiBzdHJpbmc7XG59XG5leHBvcnQgZGVjbGFyZSBjbGFzcyBHaXRCcmFuY2hSZXBvc2l0b3J5IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGdhdGV3YXk7XG4gICAgY29uc3RydWN0b3IoZ2F0ZXdheTogR2l0R2F0ZXdheSk7XG4gICAgbGlzdCgpOiBQcm9taXNlPEdpdEJyYW5jaFtdPjtcbiAgICBmZXRjaChvcHRpb25zOiBHaXRCcmFuY2hGZXRjaE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBHaXRHYXRld2F5IH0gZnJvbSAnLi4vZ2F0ZXdheXMvR2l0R2F0ZXdheS50cyc7XG5leHBvcnQgaW50ZXJmYWNlIEdpdENvbW1pdFJlZiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHNob3J0TmFtZTogc3RyaW5nO1xuICAgIHR5cGU6ICdicmFuY2gnIHwgJ3RhZycgfCAncmVtb3RlJyB8ICdvdGhlcic7XG59XG5leHBvcnQgaW50ZXJmYWNlIEdpdENvbW1pdCB7XG4gICAgaGFzaDogc3RyaW5nO1xuICAgIHNob3J0SGFzaDogc3RyaW5nO1xuICAgIGF1dGhvck5hbWU6IHN0cmluZztcbiAgICBhdXRob3JFbWFpbDogc3RyaW5nO1xuICAgIGRhdGU6IHN0cmluZztcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgcmVmczogR2l0Q29tbWl0UmVmW107XG59XG5leHBvcnQgaW50ZXJmYWNlIEdpdENvbW1pdExpc3RPcHRpb25zIHtcbiAgICBicmFuY2g/OiBzdHJpbmc7XG4gICAgcGFnZT86IG51bWJlcjtcbiAgICBwZXJQYWdlPzogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0ZWRDb21taXRzIHtcbiAgICBpdGVtczogR2l0Q29tbWl0W107XG4gICAgdG90YWw6IG51bWJlcjtcbiAgICBwYWdlOiBudW1iZXI7XG4gICAgcGVyUGFnZTogbnVtYmVyO1xuICAgIHRvdGFsUGFnZXM6IG51bWJlcjtcbn1cbmV4cG9ydCBkZWNsYXJlIGNsYXNzIEdpdENvbW1pdFJlcG9zaXRvcnkge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZ2F0ZXdheTtcbiAgICBjb25zdHJ1Y3RvcihnYXRld2F5OiBHaXRHYXRld2F5KTtcbiAgICBsaXN0KG9wdGlvbnM/OiBHaXRDb21taXRMaXN0T3B0aW9ucyk6IFByb21pc2U8UGFnaW5hdGVkQ29tbWl0cz47XG59XG4iLCJpbXBvcnQgQmFzZUxpZmVjeWNsZVNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9MaWZlY3ljbGVTZXJ2aWNlLnRzJztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZmVjeWNsZVNlcnZpY2UgZXh0ZW5kcyBCYXNlTGlmZWN5Y2xlU2VydmljZSB7XG4gICAgYWRkRGlyZWN0b3J5KGRpcm5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbHVtblR5cGUsIEdlbmVyYXRlZCB9IGZyb20gJ2t5c2VseSc7XG5leHBvcnQgaW50ZXJmYWNlIFNvZnREZWxldGVUYWJsZSB7XG4gICAgZGVsZXRlZF9hdD86IENvbHVtblR5cGU8RGF0ZSwgc3RyaW5nIHwgdW5kZWZpbmVkLCBuZXZlcj4gfCBudWxsO1xufVxuZXhwb3J0IGludGVyZmFjZSBUaW1lc3RhbXBUYWJsZSB7XG4gICAgY3JlYXRlZF9hdDogQ29sdW1uVHlwZTxEYXRlLCBzdHJpbmcgfCB1bmRlZmluZWQsIG5ldmVyPjtcbiAgICB1cGRhdGVkX2F0OiBDb2x1bW5UeXBlPERhdGUsIHN0cmluZyB8IHVuZGVmaW5lZCwgbmV2ZXI+O1xufVxuZXhwb3J0IGludGVyZmFjZSBNaWdyYXRpb25zVGFibGUge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBtb2R1bGU6IHN0cmluZyB8IG51bGw7XG4gICAgZXhlY3V0ZWRfYXQ6IENvbHVtblR5cGU8RGF0ZSwgc3RyaW5nIHwgdW5kZWZpbmVkLCBuZXZlcj47XG59XG5leHBvcnQgaW50ZXJmYWNlIFVzZXJUYWJsZSBleHRlbmRzIFRpbWVzdGFtcFRhYmxlLCBTb2Z0RGVsZXRlVGFibGUge1xuICAgIGlkOiBHZW5lcmF0ZWQ8bnVtYmVyPjtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdXNlcm5hbWU6IHN0cmluZztcbiAgICBlbWFpbDogc3RyaW5nO1xuICAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gICAgdmVyaWZpZWRfYXQ/OiBEYXRlIHwgc3RyaW5nIHwgbnVsbDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgVXNlck1ldGFUYWJsZSBleHRlbmRzIFRpbWVzdGFtcFRhYmxlLCBTb2Z0RGVsZXRlVGFibGUge1xuICAgIGlkOiBHZW5lcmF0ZWQ8bnVtYmVyPjtcbiAgICB1c2VyX2lkOiBudW1iZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmcgfCBudWxsO1xufVxuZXhwb3J0IGludGVyZmFjZSBUb2tlblRhYmxlIGV4dGVuZHMgVGltZXN0YW1wVGFibGUge1xuICAgIGlkOiBHZW5lcmF0ZWQ8bnVtYmVyPjtcbiAgICB1c2VyX2lkOiBudW1iZXI7XG4gICAgdG9rZW46IHN0cmluZztcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgZXhwaXJlc19hdDogc3RyaW5nIHwgbnVsbDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZVRhYmxlIHtcbiAgICBpZDogR2VuZXJhdGVkPG51bWJlcj47XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xufVxuZXhwb3J0IGludGVyZmFjZSBVc2VyUm9sZVRhYmxlIHtcbiAgICB1c2VyX2lkOiBudW1iZXI7XG4gICAgcm9sZV9pZDogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBQZXJtaXNzaW9uVGFibGUgZXh0ZW5kcyBUaW1lc3RhbXBUYWJsZSwgU29mdERlbGV0ZVRhYmxlIHtcbiAgICBpZDogR2VuZXJhdGVkPG51bWJlcj47XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIG9yaWdpbjogc3RyaW5nO1xuICAgIHN1YmplY3Q6IHN0cmluZztcbiAgICBhY3Rpb246IHN0cmluZztcbiAgICBjb25kaXRpb25zOiBzdHJpbmcgfCBudWxsO1xufVxuZXhwb3J0IGludGVyZmFjZSBQZXJtaXNzaW9uQXNzaWdubWVudFRhYmxlIHtcbiAgICBpZDogR2VuZXJhdGVkPG51bWJlcj47XG4gICAgcGVybWlzc2lvbl9pZDogbnVtYmVyO1xuICAgIGFzc2lnbmFibGVfdHlwZTogc3RyaW5nO1xuICAgIGFzc2lnbmFibGVfaWQ6IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVRhYmxlIGV4dGVuZHMgVGltZXN0YW1wVGFibGUsIFNvZnREZWxldGVUYWJsZSB7XG4gICAgaWQ6IEdlbmVyYXRlZDxudW1iZXI+O1xuICAgIGRyaXZlOiBzdHJpbmc7XG4gICAgbWltZXR5cGU6IHN0cmluZztcbiAgICBjbGllbnRfbmFtZTogc3RyaW5nO1xuICAgIGZpbGVuYW1lOiBzdHJpbmc7XG4gICAgcHVycG9zZTogc3RyaW5nO1xuICAgIHB1YmxpYzogYm9vbGVhbjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZU1ldGFUYWJsZSBleHRlbmRzIFRpbWVzdGFtcFRhYmxlLCBTb2Z0RGVsZXRlVGFibGUge1xuICAgIGlkOiBHZW5lcmF0ZWQ8bnVtYmVyPjtcbiAgICBmaWxlX2lkOiBudW1iZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmcgfCBudWxsO1xufVxuZXhwb3J0IGludGVyZmFjZSBVcGxvYWRTZXNzaW9uVGFibGUge1xuICAgIGlkOiBHZW5lcmF0ZWQ8bnVtYmVyPjtcbiAgICBwdXJwb3NlOiBzdHJpbmc7XG4gICAgbWltZV90eXBlczogc3RyaW5nO1xuICAgIG1heF9zaXplOiBudW1iZXI7XG4gICAgZXhwaXJlc19hdDogc3RyaW5nO1xufVxuZXhwb3J0IGludGVyZmFjZSBKb2JUYWJsZSBleHRlbmRzIFRpbWVzdGFtcFRhYmxlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHF1ZXVlX2lkOiBzdHJpbmc7XG4gICAgc3RhdHVzOiAncGVuZGluZycgfCAnaW5fcHJvZ3Jlc3MnIHwgJ2NvbXBsZXRlZCcgfCAnZmFpbGVkJztcbiAgICBkYXRhOiBzdHJpbmcgfCBudWxsO1xuICAgIHJlc3VsdDogc3RyaW5nIHwgbnVsbDtcbiAgICBlcnJvcjogc3RyaW5nIHwgbnVsbDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWxUZW1wbGF0ZVRhYmxlIGV4dGVuZHMgVGltZXN0YW1wVGFibGUsIFNvZnREZWxldGVUYWJsZSB7XG4gICAgaWQ6IEdlbmVyYXRlZDxudW1iZXI+O1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBzdWJqZWN0OiBzdHJpbmc7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgYm9keTogc3RyaW5nIHwgbnVsbDtcbiAgICBlbmdpbmU6IHN0cmluZyB8IG51bGw7XG59XG5leHBvcnQgaW50ZXJmYWNlIEVtYWlsVGVtcGxhdGVNZXRhVGFibGUgZXh0ZW5kcyBUaW1lc3RhbXBUYWJsZSwgU29mdERlbGV0ZVRhYmxlIHtcbiAgICBpZDogR2VuZXJhdGVkPG51bWJlcj47XG4gICAgdGVtcGxhdGVfaWQ6IG51bWJlcjtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdmFsdWU6IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgT2F1dGhBY2NvdW50VGFibGUgZXh0ZW5kcyBUaW1lc3RhbXBUYWJsZSwgU29mdERlbGV0ZVRhYmxlIHtcbiAgICBpZDogR2VuZXJhdGVkPG51bWJlcj47XG4gICAgdXNlcl9pZDogbnVtYmVyO1xuICAgIHByb3ZpZGVyOiBzdHJpbmc7XG4gICAgcHJvdmlkZXJfdXNlcl9pZDogc3RyaW5nO1xuICAgIHByb3ZpZGVyX3VzZXJfZW1haWw6IHN0cmluZyB8IG51bGw7XG59XG5leHBvcnQgaW50ZXJmYWNlIE9hdXRoVG9rZW5UYWJsZSB7XG4gICAgaWQ6IEdlbmVyYXRlZDxudW1iZXI+O1xuICAgIHVzZXJfaWQ6IG51bWJlciB8IG51bGw7XG4gICAgcHJvdmlkZXI6IHN0cmluZyB8IG51bGw7XG4gICAgYWN0aW9uOiBzdHJpbmc7XG4gICAgdG9rZW46IHN0cmluZztcbiAgICBleHBpcmVzX2F0OiBzdHJpbmc7XG4gICAgbWV0YWRhdGE6IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJhc2VDb250cmFjdCB7XG4gICAgdXNlcnM6IFVzZXJUYWJsZTtcbiAgICB1c2VyX21ldGFzOiBVc2VyTWV0YVRhYmxlO1xuICAgIHRva2VuczogVG9rZW5UYWJsZTtcbiAgICBtaWdyYXRpb25zOiBNaWdyYXRpb25zVGFibGU7XG4gICAgZmlsZXM6IEZpbGVUYWJsZTtcbiAgICBmaWxlX21ldGFzOiBGaWxlTWV0YVRhYmxlO1xuICAgIGZpbGVfdXBsb2FkX3Nlc3Npb25zOiBVcGxvYWRTZXNzaW9uVGFibGU7XG4gICAgcm9sZXM6IFJvbGVUYWJsZTtcbiAgICB1c2VyX3JvbGVzOiBVc2VyUm9sZVRhYmxlO1xuICAgIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uVGFibGU7XG4gICAgcGVybWlzc2lvbnNfYXNzaWdubWVudHM6IFBlcm1pc3Npb25Bc3NpZ25tZW50VGFibGU7XG4gICAgam9iczogSm9iVGFibGU7XG4gICAgZW1haWxfdGVtcGxhdGVzOiBFbWFpbFRlbXBsYXRlVGFibGU7XG4gICAgZW1haWxfdGVtcGxhdGVfbWV0YXM6IEVtYWlsVGVtcGxhdGVNZXRhVGFibGU7XG4gICAgb2F1dGhfYWNjb3VudHM6IE9hdXRoQWNjb3VudFRhYmxlO1xuICAgIG9hdXRoX3Rva2VuczogT2F1dGhUb2tlblRhYmxlO1xufVxuZXhwb3J0IHt9O1xuIiwiaW1wb3J0IHR5cGUgeyBFeHByZXNzaW9uQnVpbGRlciB9IGZyb20gJ2t5c2VseSc7XG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29udHJhY3QgYXMgRGF0YWJhc2UgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJztcbmV4cG9ydCBpbnRlcmZhY2UgTWV0YWRhZmlsdGVyIHtcbiAgICBlcT86IHN0cmluZztcbiAgICBuZXE/OiBzdHJpbmc7XG4gICAgbGlrZT86IHN0cmluZztcbiAgICBubGlrZT86IHN0cmluZztcbiAgICBpbj86IHN0cmluZ1tdO1xuICAgIG5pbj86IHN0cmluZ1tdO1xuICAgIGd0Pzogc3RyaW5nO1xuICAgIGd0ZT86IHN0cmluZztcbiAgICBsdD86IHN0cmluZztcbiAgICBsdGU/OiBzdHJpbmc7XG4gICAgaXNfbnVsbD86IGJvb2xlYW47XG4gICAgZXhpc3RzPzogYm9vbGVhbjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgTWV0YWRhdGFRdWVyeVBheWxvYWQge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IE1ldGFkYWZpbHRlcjtcbn1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1ldGFkYXRhUXVlcnlTZXJ2aWNlPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4ge1xuICAgIHByaXZhdGUgcGF5bG9hZDtcbiAgICBwcml2YXRlIHRhYmxlO1xuICAgIHByaXZhdGUgZm9yZWlnbktleTtcbiAgICBwcml2YXRlIHBhcmVudEtleTtcbiAgICBjb25zdHJ1Y3RvcihwYXlsb2FkOiBNZXRhZGF0YVF1ZXJ5UGF5bG9hZCwgdGFibGU6IFQsIGZvcmVpZ25LZXk6IGtleW9mIERhdGFiYXNlW1RdLCBwYXJlbnRLZXk/OiBzdHJpbmcpO1xuICAgIGdldCBuZWVkV2hlcmVJbigpOiBib29sZWFuO1xuICAgIGdldCBuZWVkV2hlcmVOb3RJbigpOiBib29sZWFuO1xuICAgIGFwcGx5KGRiUXVlcnk6IGFueSk6IGFueTtcbiAgICBwcml2YXRlIGJ1aWxkUm93Q29uZGl0aW9ucztcbiAgICB3aGVyZUluOiA8REJRdWVyeT4oZWI6IEV4cHJlc3Npb25CdWlsZGVyPGFueSwgYW55PikgPT4gREJRdWVyeTtcbiAgICB3aGVyZU5vdEluOiA8REJRdWVyeT4oZWI6IEV4cHJlc3Npb25CdWlsZGVyPGFueSwgYW55PikgPT4gREJRdWVyeTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIE1ldGFkYXRhU2VydmljZSB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIGZvcmVpZ25LZXk6IHN0cmluZztcbiAgICBjb25zdHJ1Y3RvcihwYXlsb2FkOiBQaWNrPE1ldGFkYXRhU2VydmljZSwgJ3RhYmxlJyB8ICdmb3JlaWduS2V5JyB8ICdpZCc+KTtcbiAgICBzdGF0aWMgcGFyc2UodmFsdWU6IGFueSk6IGFueTtcbiAgICBzdGF0aWMgZmxhdHRlbihpdGVtczogQXJyYXk8e1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHZhbHVlOiBhbnk7XG4gICAgfT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGdldDxUID0gYW55PihuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+O1xuICAgIGdldDxUID0gYW55PihuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogVCk6IFByb21pc2U8VD47XG4gICAgc2V0KG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFByb21pc2U8dm9pZD47XG4gICAgbGlzdCgpOiBQcm9taXNlPEFycmF5PHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICB2YWx1ZTogYW55O1xuICAgIH0+PjtcbiAgICBhbGwoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pjtcbn1cbiIsImltcG9ydCBFbW1pdHRlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9FbW1pdHRlclNlcnZpY2UudHMnO1xuaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJztcbmltcG9ydCB0eXBlIHsgS3lzZWx5IH0gZnJvbSAna3lzZWx5JztcbmltcG9ydCBNaWdyYXRpb25FbnRpdHkgZnJvbSAnI3NlcnZlci9lbnRpdGllcy9NaWdyYXRpb25FbnRpdHkudHMnO1xuZXhwb3J0IGludGVyZmFjZSBNaWdyYXRpb25Tb3VyY2Uge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZGlyZWN0b3J5OiBzdHJpbmc7XG59XG5leHBvcnQgaW50ZXJmYWNlIE1pZ3JhdGlvbiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHNvdXJjZTogc3RyaW5nIHwgbnVsbDtcbiAgICBmaWxlbmFtZTogc3RyaW5nO1xuICAgIGV4ZWN1dGVkQXQ6IERhdGUgfCBudWxsO1xufVxuZXhwb3J0IGludGVyZmFjZSBMaXN0RmlsdGVycyB7XG4gICAgc291cmNlPzogc3RyaW5nO1xufVxuaW50ZXJmYWNlIE1pZ3JhdGlvblJlc3VsdCB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGZpbGVuYW1lOiBzdHJpbmc7XG4gICAgc291cmNlOiBzdHJpbmcgfCBudWxsO1xuICAgIHJlc3VsdDogJ3N1Y2Nlc3MnIHwgJ2ZhaWxlZCc7XG4gICAgZXJyb3I/OiBhbnk7XG59XG5leHBvcnQgaW50ZXJmYWNlIE1pZ3JhdG9yU2VydmljZU9wdGlvbnMge1xuICAgIHNvdXJjZXM6IE1pZ3JhdGlvblNvdXJjZVtdO1xuICAgIGRiOiBLeXNlbHk8YW55PjtcbiAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgZW1taXR0ZXI/OiBFbW1pdHRlclNlcnZpY2U7XG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZTtcbn1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1pZ3JhdG9yU2VydmljZSB7XG4gICAgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleTogc3RyaW5nO1xuICAgIGRlYnVnOiBib29sZWFuO1xuICAgIGVtbWl0dGVyOiBFbW1pdHRlclNlcnZpY2U7XG4gICAgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlO1xuICAgIGRiOiBLeXNlbHk8YW55PjtcbiAgICBzb3VyY2VzOiBNaWdyYXRpb25Tb3VyY2VbXTtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNaWdyYXRvclNlcnZpY2VPcHRpb25zKTtcbiAgICBhZGRTb3VyY2Uoc291cmNlOiBNaWdyYXRpb25Tb3VyY2UpOiB2b2lkO1xuICAgIHByaXZhdGUgZW5zdXJlTWlncmF0aW9uc1RhYmxlO1xuICAgIGxpc3RTb3VyY2Uoc291cmNlOiBNaWdyYXRpb25Tb3VyY2UpOiBQcm9taXNlPE1pZ3JhdGlvbkVudGl0eVtdPjtcbiAgICBsaXN0KGZpbHRlcnM/OiBMaXN0RmlsdGVycyk6IFByb21pc2U8TWlncmF0aW9uRW50aXR5W10+O1xuICAgIHByaXZhdGUgbWlncmF0ZVVwO1xuICAgIHByaXZhdGUgbWlncmF0ZURvd247XG4gICAgbWlncmF0ZUZpbGUoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PjtcbiAgICByb2xsYmFja0ZpbGUoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PjtcbiAgICBtaWdyYXRlKGZpbHRlcnM/OiBMaXN0RmlsdGVycyAmIHtcbiAgICAgICAgc3RlcHM/OiBudW1iZXI7XG4gICAgfSk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0W10+O1xuICAgIHJvbGxiYWNrKGZpbHRlcnM/OiBMaXN0RmlsdGVycyAmIHtcbiAgICAgICAgc3RlcHM/OiBudW1iZXI7XG4gICAgfSk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0W10+O1xuICAgIHVwKHN0ZXBzPzogbnVtYmVyLCBmaWx0ZXJzPzogTGlzdEZpbHRlcnMpOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdFtdPjtcbiAgICBkb3duKHN0ZXBzPzogbnVtYmVyLCBmaWx0ZXJzPzogTGlzdEZpbHRlcnMpOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdFtdPjtcbiAgICBsYXRlc3QoZmlsdGVycz86IExpc3RGaWx0ZXJzKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHRbXT47XG4gICAgbGF0ZXN0T3JGYWlsKGZpbHRlcnM/OiBMaXN0RmlsdGVycyk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0W10+O1xuICAgIGZyZXNoKGZpbHRlcnM/OiBMaXN0RmlsdGVycyAmIHtcbiAgICAgICAgc3RlcHM/OiBudW1iZXI7XG4gICAgfSk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0W10+O1xufVxuZXhwb3J0IHt9O1xuIiwiZXhwb3J0IHR5cGUgSXBjTWVzc2FnZTxUID0gYW55PiA9IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGV2ZW50OiBzdHJpbmc7XG4gICAgZGF0YTogVDtcbn07XG50eXBlIElwY0xpc3RlbmVyPFQgPSBhbnk+ID0gKGRhdGE6IFQpID0+IHZvaWQ7XG5leHBvcnQgZGVjbGFyZSBjbGFzcyBQbHVnaW5JcGNDbGllbnQge1xuICAgIHByaXZhdGUgbGlzdGVuZXJzO1xuICAgIGNvbnN0cnVjdG9yKCk7XG4gICAgb248VCA9IGFueT4oZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IElwY0xpc3RlbmVyPFQ+KTogdm9pZDtcbiAgICBvZmY8VCA9IGFueT4oZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IElwY0xpc3RlbmVyPFQ+KTogdm9pZDtcbiAgICBlbWl0PFQgPSBhbnk+KGV2ZW50OiBzdHJpbmcsIGRhdGE/OiBUKTogc3RyaW5nO1xufVxuZXhwb3J0IHt9O1xuIiwiaW1wb3J0IHR5cGUgeyBDaGlsZFByb2Nlc3MgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xudHlwZSBJcGNMaXN0ZW5lcjxUID0gYW55PiA9IChkYXRhOiBUKSA9PiB2b2lkO1xuZXhwb3J0IGRlY2xhcmUgY2xhc3MgUGx1Z2luSXBjSG9zdCB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjaGlsZDtcbiAgICBwcml2YXRlIGxpc3RlbmVycztcbiAgICBjb25zdHJ1Y3RvcihjaGlsZDogQ2hpbGRQcm9jZXNzKTtcbiAgICBvbjxUID0gYW55PihldmVudDogc3RyaW5nLCBjYWxsYmFjazogSXBjTGlzdGVuZXI8VD4pOiB2b2lkO1xuICAgIG9mZjxUID0gYW55PihldmVudDogc3RyaW5nLCBjYWxsYmFjazogSXBjTGlzdGVuZXI8VD4pOiB2b2lkO1xuICAgIGVtaXQ8VCA9IGFueT4oZXZlbnQ6IHN0cmluZywgZGF0YT86IFQpOiBzdHJpbmc7XG59XG5leHBvcnQge307XG4iLCJpbXBvcnQgeyBQbHVnaW5JcGNDbGllbnQgfSBmcm9tICcuL1BsdWdpbklwY0NsaWVudC50cyc7XG5leHBvcnQgdHlwZSBIdHRwTWV0aG9kID0gJ0dFVCcgfCAnUE9TVCcgfCAnUFVUJyB8ICdQQVRDSCcgfCAnREVMRVRFJztcbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVEZWZpbml0aW9uIHtcbiAgICBtZXRob2Q6IEh0dHBNZXRob2Q7XG4gICAgcGF0aDogc3RyaW5nO1xufVxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZVJlcXVlc3Qge1xuICAgIHJlcXVlc3RJZDogc3RyaW5nO1xuICAgIG1ldGhvZDogSHR0cE1ldGhvZDtcbiAgICBwYXRoOiBzdHJpbmc7XG4gICAgYm9keT86IGFueTtcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBxdWVyeT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVSZXNwb25zZVBheWxvYWQge1xuICAgIHJlcXVlc3RJZDogc3RyaW5nO1xuICAgIHN0YXR1czogbnVtYmVyO1xuICAgIGJvZHk/OiBhbnk7XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlUmVwbHkge1xuICAgIHN0YXR1cyhjb2RlOiBudW1iZXIpOiBSb3V0ZVJlcGx5O1xuICAgIHNlbmQoYm9keT86IGFueSk6IHZvaWQ7XG59XG5leHBvcnQgdHlwZSBSb3V0ZUhhbmRsZXIgPSAocmVxOiBSb3V0ZVJlcXVlc3QsIHJlcGx5OiBSb3V0ZVJlcGx5KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbmV4cG9ydCBkZWNsYXJlIGNsYXNzIFBsdWdpblJvdXRlciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ7XG4gICAgcHJpdmF0ZSByb3V0ZXM7XG4gICAgY29uc3RydWN0b3IoY2xpZW50OiBQbHVnaW5JcGNDbGllbnQpO1xuICAgIHByaXZhdGUgZGlzcGF0Y2g7XG4gICAgcHJpdmF0ZSByZWdpc3RlcjtcbiAgICBnZXQocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSb3V0ZUhhbmRsZXIpOiB2b2lkO1xuICAgIHBvc3QocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSb3V0ZUhhbmRsZXIpOiB2b2lkO1xuICAgIHB1dChwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJvdXRlSGFuZGxlcik6IHZvaWQ7XG4gICAgcGF0Y2gocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSb3V0ZUhhbmRsZXIpOiB2b2lkO1xuICAgIGRlbGV0ZShwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJvdXRlSGFuZGxlcik6IHZvaWQ7XG59XG4iLCJpbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9Sb3V0ZXJTZXJ2aWNlLnRzJztcbmltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cyc7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb3V0ZXJGaWxlQmFzZVJvdXRpbmdTZXJ2aWNlIHtcbiAgICBwcml2YXRlIGRpcmVjdG9yeTtcbiAgICBwcml2YXRlIHByZWZpeDtcbiAgICBwcml2YXRlIG1vZHVsZT87XG4gICAgcHJpdmF0ZSByb3V0ZXI7XG4gICAgcHJpdmF0ZSBsb2dnZXI7XG4gICAgcHJpdmF0ZSByb3V0ZXM7XG4gICAgZGVidWc6IGJvb2xlYW47XG4gICAgc2V0RGlyZWN0b3J5KGRpcmVjdG9yeTogc3RyaW5nKTogdGhpcztcbiAgICBzZXRQcmVmaXgocHJlZml4OiBzdHJpbmcpOiB0aGlzO1xuICAgIHNldFJvdXRlcihyb3V0ZXI6IFJvdXRlcik6IHRoaXM7XG4gICAgc2V0TW9kdWxlKG1vZHVsZTogc3RyaW5nKTogdGhpcztcbiAgICBzZXRMb2dnZXIobG9nZ2VyOiBMb2dnZXJTZXJ2aWNlKTogdGhpcztcbiAgICBzZXREZWJ1ZyhkZWJ1ZzogYm9vbGVhbik6IHRoaXM7XG4gICAgc3RhdGljIGNyZWF0ZShkaXJlY3Rvcnk6IHN0cmluZyk6IFJvdXRlckZpbGVCYXNlUm91dGluZ1NlcnZpY2U7XG4gICAgbG9hZEZpbGVzKCk6IFByb21pc2U8dm9pZD47XG4gICAgcmVnaXN0ZXJSb3V0ZXMoKTogUHJvbWlzZTx2b2lkPjtcbiAgICBsb2FkKCk6IFByb21pc2U8dm9pZD47XG59XG4iLCJpbXBvcnQgUm91dGVyU2VydmljZSBmcm9tICcuL1JvdXRlclNlcnZpY2UudHMnO1xuZXhwb3J0IGludGVyZmFjZSBSb3V0ZXJSZWdpc3RlckVudHJ5IHtcbiAgICBmaWxlcGF0aDogc3RyaW5nO1xuICAgIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm91dGVyUmVnaXN0ZXI8QyA9IHt9PiBleHRlbmRzIFJvdXRlclNlcnZpY2U8Qz4ge1xuICAgIGZpbGVzOiBNYXA8c3RyaW5nLCBSb3V0ZXJSZWdpc3RlckVudHJ5PjtcbiAgICBkaXJzOiBNYXA8c3RyaW5nLCBSb3V0ZXJSZWdpc3RlckVudHJ5PjtcbiAgICBjb25zdHJ1Y3Rvcihyb3V0ZXI/OiBQYXJ0aWFsPFJvdXRlclNlcnZpY2U8Qz4+KTtcbiAgICBhZGRGaWxlKGZpbGVuYW1lOiBzdHJpbmcsIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQ7XG4gICAgYWRkRGlyKGRpcm5hbWU6IHN0cmluZywgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZDtcbiAgICBwcml2YXRlIGxvYWRGaWxlO1xuICAgIHByaXZhdGUgbG9hZERpcjtcbiAgICBsb2FkKCk6IFByb21pc2U8dm9pZD47XG59XG4iLCJpbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSAnLi9Sb3V0ZXJTZXJ2aWNlLnRzJztcbmltcG9ydCB0eXBlIHsgTWlkZGxld2FyZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL1JvdXRlckNvbnRyYWN0LnRzJztcbmltcG9ydCB0eXBlIHsgSHR0cENvbnRleHQgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9IdHRwQ29udGV4dENvbnRyYWN0LnRzJztcbmV4cG9ydCB0eXBlIFJlc291cmNlTWV0aG9kID0gJ2luZGV4JyB8ICdzaG93JyB8ICdzdG9yZScgfCAndXBkYXRlJyB8ICdkZXN0cm95JztcbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVyUmVzb3VyY2VPcHRpb25zIHtcbiAgICBtaWRkbGV3YXJlPzogUGFydGlhbDxSZWNvcmQ8UmVzb3VyY2VNZXRob2QgfCAnYWxsJywgTWlkZGxld2FyZT4+O1xuICAgIGV4Y2VwdD86IFJlc291cmNlTWV0aG9kW107XG59XG5kZWNsYXJlIGNvbnN0IFJvdXRlclJlc291cmNlU2VydmljZV9iYXNlOiB7XG4gICAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IHtcbiAgICAgICAgbGlzdGVuZXJzOiBpbXBvcnQoXCIjc2hhcmVkL21peGlucy9Ib29rc01peGluLnRzXCIpLkxpc3RlbmVyW107XG4gICAgICAgIG9uKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB2b2lkO1xuICAgICAgICBvZmYoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHZvaWQ7XG4gICAgICAgIGVtaXQoZXZlbnQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiB2b2lkO1xuICAgICAgICBlbWl0QXN5bmMoZXZlbnQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+O1xuICAgIH07XG59ICYgaW1wb3J0KFwiI3NoYXJlZC91dGlscy9jb21wb3NlLnRzXCIpLkNvbnN0cnVjdG9yO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm91dGVyUmVzb3VyY2VTZXJ2aWNlIGV4dGVuZHMgUm91dGVyUmVzb3VyY2VTZXJ2aWNlX2Jhc2Uge1xuICAgIHByaXZhdGUgb3B0aW9ucztcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zPzogUm91dGVyUmVzb3VyY2VPcHRpb25zKTtcbiAgICBpbmRleChjdHg6IEh0dHBDb250ZXh0KTogUHJvbWlzZTxhbnk+O1xuICAgIHNob3coY3R4OiBIdHRwQ29udGV4dCk6IFByb21pc2U8YW55PjtcbiAgICBzdG9yZShjdHg6IEh0dHBDb250ZXh0KTogUHJvbWlzZTxhbnk+O1xuICAgIHVwZGF0ZShjdHg6IEh0dHBDb250ZXh0KTogUHJvbWlzZTxhbnk+O1xuICAgIGRlc3Ryb3koY3R4OiBIdHRwQ29udGV4dCk6IFByb21pc2U8YW55PjtcbiAgICBwcml2YXRlIHdyYXA7XG4gICAgcmVnaXN0ZXIocm91dGVyOiBSb3V0ZXIpOiB2b2lkO1xufVxuZXhwb3J0IHt9O1xuIiwiaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cyc7XG5leHBvcnQgdHlwZSBDb25maWdNb2RlbCA9IFJldHVyblR5cGU8UmV0dXJuVHlwZTx0eXBlb2YgTW9kZWxDb25maWc+PjtcbmludGVyZmFjZSBPcHRpb25zIHtcbiAgICByZWFkb25seT86IGJvb2xlYW47XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNb2RlbENvbmZpZyhrZXk6IHN0cmluZywgb3B0aW9ucz86IE9wdGlvbnMpOiA8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpID0+IHtcbiAgICBuZXcgKC4uLmFyZ3M6IGFueVtdKToge307XG4gICAgX19pc0NvbmZpZ01vZGVsOiBib29sZWFuO1xuICAgIHNlcmlhbGl6ZTxUPih0aGlzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBULCByb3c6IGFueSk6IFByb21pc2U8VD47XG4gICAgbGlzdDxUPih0aGlzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUKTogUHJvbWlzZTxUW10+O1xuICAgIGZpbmQ8VD4odGhpczogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVCwgaWQ6IHN0cmluZyk6IFByb21pc2U8VCB8IG51bGw+O1xuICAgIGZpbmRPckZhaWw8VD4odGhpczogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVCwgaWQ6IHN0cmluZyk6IFByb21pc2U8VD47XG4gICAgY3JlYXRlPFQ+KHRoaXM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsIGl0ZW06IFQgJiB7XG4gICAgICAgIGlkOiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8dm9pZD47XG4gICAgdXBkYXRlPFQ+KHRoaXM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsIGlkOiBzdHJpbmcsIGRhdGE6IFQpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHVwZGF0ZU9yQ3JlYXRlPFQ+KHRoaXM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsIGlkOiBzdHJpbmcsIGRhdGE6IFBhcnRpYWw8VD4pOiBQcm9taXNlPHZvaWQ+O1xuICAgIGRlc3Ryb3k8VD4odGhpczogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVCwgaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59ICYgVEJhc2U7XG5leHBvcnQge307XG4iLCJpbXBvcnQgUm91dGVyUmVzb3VyY2VTZXJ2aWNlIGZyb20gJy4vUm91dGVyUmVzb3VyY2VTZXJ2aWNlLnRzJztcbmltcG9ydCB0eXBlIHsgUm91dGVyUmVzb3VyY2VPcHRpb25zIH0gZnJvbSAnLi9Sb3V0ZXJSZXNvdXJjZVNlcnZpY2UudHMnO1xuaW1wb3J0IHR5cGUgeyBIdHRwQ29udGV4dCB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0h0dHBDb250ZXh0Q29udHJhY3QudHMnO1xuaW1wb3J0IHR5cGUgeyBDb25maWdNb2RlbCB9IGZyb20gJyNzZXJ2ZXIvbWl4aW5zL01vZGVsQ29uZmlnTWl4aW4udHMnO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm91dGVyUmVzb3VyY2VDb25maWcgZXh0ZW5kcyBSb3V0ZXJSZXNvdXJjZVNlcnZpY2Uge1xuICAgIHByaXZhdGUgbW9kZWw7XG4gICAgY29uc3RydWN0b3IobW9kZWw6IENvbmZpZ01vZGVsLCBvcHRpb25zPzogUm91dGVyUmVzb3VyY2VPcHRpb25zKTtcbiAgICBpbmRleChjdHg6IEh0dHBDb250ZXh0KTogUHJvbWlzZTx7XG4gICAgICAgIGl0ZW1zOiB7fVtdO1xuICAgIH0+O1xuICAgIHNob3coY3R4OiBIdHRwQ29udGV4dCk6IFByb21pc2U8e30+O1xuICAgIHN0b3JlKGN0eDogSHR0cENvbnRleHQpOiBQcm9taXNlPHtcbiAgICAgICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIH0+O1xuICAgIHVwZGF0ZShjdHg6IEh0dHBDb250ZXh0KTogUHJvbWlzZTx2b2lkPjtcbiAgICBkZXN0cm95KGN0eDogSHR0cENvbnRleHQpOiBQcm9taXNlPHtcbiAgICAgICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICB9Pjtcbn1cbiIsImltcG9ydCB0eXBlIExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJztcbmludGVyZmFjZSBDb21tYW5kT3B0aW9ucyB7XG4gICAgY3dkPzogc3RyaW5nO1xuICAgIGVudj86IE5vZGVKUy5Qcm9jZXNzRW52O1xuICAgIHNoZWxsPzogYm9vbGVhbjtcbn1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoZWxsU2VydmljZSB7XG4gICAgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleTogc3RyaW5nO1xuICAgIGRlYnVnOiBib29sZWFuO1xuICAgIGxvZ2dlcjogTG9nZ2VyU2VydmljZTtcbiAgICBpbml0KGRhdGE/OiBQYXJ0aWFsPFNoZWxsU2VydmljZT4pOiB2b2lkO1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgYSBzaGVsbCBjb21tYW5kIGFuZCByZXR1cm4gYSBwcm9taXNlXG4gICAgICovXG4gICAgY29tbWFuZChiaW46IHN0cmluZywgYXJnczogc3RyaW5nW10sIG9wdGlvbnM/OiBDb21tYW5kT3B0aW9ucyk6IFByb21pc2U8dm9pZD47XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSBhIHNoZWxsIGNvbW1hbmQgYW5kIHJldHVybiB0aGUgb3V0cHV0IGFzIGEgc3RyaW5nXG4gICAgICovXG4gICAgZXhlY3V0ZUNvbW1hbmRXaXRoT3V0cHV0KGJpbjogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgb3B0aW9ucz86IENvbW1hbmRPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+O1xufVxuZXhwb3J0IHt9O1xuIiwiaW1wb3J0IHR5cGUgeyBLeXNlbHkgfSBmcm9tICdreXNlbHknO1xuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0aW9uPFQgPSBhbnk+IHtcbiAgICBpdGVtczogVFtdO1xuICAgIHBhZ2U6IG51bWJlcjtcbiAgICBwZXJfcGFnZTogbnVtYmVyO1xuICAgIHRvdGFsOiBudW1iZXI7XG4gICAgdG90YWxfcGFnZXM6IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRmluZE1hbnlPcHRpb25zIHtcbiAgICBsaW1pdD86IG51bWJlcjtcbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgb3JkZXJCeT86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAgIG9yZGVyRGlyZWN0aW9uPzogJ2FzYycgfCAnZGVzYycgfCAoJ2FzYycgfCAnZGVzYycpW107XG59XG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRlT3B0aW9ucyB7XG4gICAgcGFnZT86IG51bWJlcjtcbiAgICBsaW1pdD86IG51bWJlcjtcbiAgICBvcmRlckJ5PzogRmluZE1hbnlPcHRpb25zWydvcmRlckJ5J107XG4gICAgb3JkZXJEaXJlY3Rpb24/OiBGaW5kTWFueU9wdGlvbnNbJ29yZGVyRGlyZWN0aW9uJ107XG59XG5leHBvcnQgaW50ZXJmYWNlIERlbGV0ZU1hbnlPcHRpb25zIHtcbiAgICBsaW1pdD86IG51bWJlcjtcbn1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhdGFiYXNlUmVwb3NpdG9yeTxURW50aXR5ID0gUmVjb3JkPHN0cmluZywgYW55PiwgVFByaW1hcnlLZXkgPSBhbnksIFRPcHRpb25zID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIHByb3RlY3RlZCBkYjogS3lzZWx5PGFueT47XG4gICAgcHJvdGVjdGVkIHRhYmxlOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHByaW1hcnlLZXk6IHN0cmluZztcbiAgICBjb25zdHJ1Y3RvcihkYjogS3lzZWx5PGFueT4sIHRhYmxlOiBzdHJpbmcsIHByaW1hcnlLZXk6IHN0cmluZyk7XG4gICAgcXVlcnkob3B0aW9ucz86IHtcbiAgICAgICAgcWI/OiBhbnk7XG4gICAgfSAmIFRPcHRpb25zKTogYW55O1xuICAgIGNvdW50KG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUHJvbWlzZTxudW1iZXI+O1xuICAgIGZpbmRNYW55KG9wdGlvbnM/OiBGaW5kTWFueU9wdGlvbnMgJiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eVtdPjtcbiAgICBmaW5kT25lKG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eSB8IG51bGw+O1xuICAgIGZpbmRCeUlkKGlkOiBUUHJpbWFyeUtleSwgb3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD47XG4gICAgZmluZEJ5SWRPckZhaWwoaWQ6IFRQcmltYXJ5S2V5LCBvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPE5vbk51bGxhYmxlPEF3YWl0ZWQ8VEVudGl0eT4+PjtcbiAgICBwYWdpbmF0ZShvcHRpb25zPzogUGFnaW5hdGVPcHRpb25zICYgVE9wdGlvbnMpOiBQcm9taXNlPFBhZ2luYXRpb24+O1xuICAgIGNyZWF0ZShkYXRhOiBQYXJ0aWFsPFRFbnRpdHk+KTogUHJvbWlzZTxhbnk+O1xuICAgIGNyZWF0ZU1hbnkoZGF0YTogUGFydGlhbDxURW50aXR5PltdKTogUHJvbWlzZTxhbnlbXT47XG4gICAgdXBkYXRlQnlJZChpZDogVFByaW1hcnlLZXksIGRhdGE6IFBhcnRpYWw8VEVudGl0eT4pOiBQcm9taXNlPHZvaWQ+O1xuICAgIGRlbGV0ZUJ5SWQoaWQ6IFRQcmltYXJ5S2V5KTogUHJvbWlzZTx2b2lkPjtcbiAgICBkZWxldGVNYW55KG9wdGlvbnM/OiBEZWxldGVNYW55T3B0aW9ucyAmIFRPcHRpb25zKTogUHJvbWlzZTx2b2lkPjtcbn1cbiIsImltcG9ydCB0eXBlIENvbmZpZ1NlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzJztcbmltcG9ydCB0eXBlIHsgUGFnaW5hdGlvbiwgRmluZE1hbnlPcHRpb25zLCBQYWdpbmF0ZU9wdGlvbnMsIERlbGV0ZU1hbnlPcHRpb25zIH0gZnJvbSAnI3NlcnZlci9yZXBvc2l0b3JpZXMvRGF0YWJhc2VSZXBvc2l0b3J5LnRzJztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbmZpZ1JlcG9zaXRvcnk8VEVudGl0eSA9IFJlY29yZDxzdHJpbmcsIGFueT4sIFRPcHRpb25zID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIHByb3RlY3RlZCBjb25maWc6IENvbmZpZ1NlcnZpY2U7XG4gICAgcHJvdGVjdGVkIGtleTogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBwcmltYXJ5S2V5OiBzdHJpbmc7XG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBDb25maWdTZXJ2aWNlLCBrZXk6IHN0cmluZywgcHJpbWFyeUtleT86IHN0cmluZyk7XG4gICAgcHJvdGVjdGVkIGdldEl0ZW1zKCk6IFRFbnRpdHlbXTtcbiAgICBwcm90ZWN0ZWQgc2V0SXRlbXMoaXRlbXM6IFRFbnRpdHlbXSk6IHZvaWQ7XG4gICAgcXVlcnkob3B0aW9ucz86IFRPcHRpb25zKTogVEVudGl0eVtdO1xuICAgIGNvdW50KG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8bnVtYmVyPjtcbiAgICBmaW5kTWFueShvcHRpb25zPzogRmluZE1hbnlPcHRpb25zICYgVE9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHlbXT47XG4gICAgZmluZE9uZShvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPjtcbiAgICBmaW5kQnlJZChpZDogc3RyaW5nLCBvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPjtcbiAgICBmaW5kQnlJZE9yRmFpbChpZDogc3RyaW5nLCBvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHk+O1xuICAgIHBhZ2luYXRlKG9wdGlvbnM/OiBQYWdpbmF0ZU9wdGlvbnMgJiBUT3B0aW9ucyk6IFByb21pc2U8UGFnaW5hdGlvbjxURW50aXR5Pj47XG4gICAgY3JlYXRlKGRhdGE6IFBhcnRpYWw8VEVudGl0eT4pOiBQcm9taXNlPFRFbnRpdHk+O1xuICAgIGNyZWF0ZU1hbnkoZGF0YTogUGFydGlhbDxURW50aXR5PltdKTogUHJvbWlzZTxURW50aXR5W10+O1xuICAgIHVwZGF0ZUJ5SWQoaWQ6IHN0cmluZywgZGF0YTogUGFydGlhbDxURW50aXR5Pik6IFByb21pc2U8VEVudGl0eT47XG4gICAgZGVsZXRlQnlJZChpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgICBkZWxldGVNYW55KG9wdGlvbnM/OiBEZWxldGVNYW55T3B0aW9ucyAmIFRPcHRpb25zKTogUHJvbWlzZTx2b2lkPjtcbn1cbiIsImltcG9ydCBEYXRhYmFzZVJlcG9zaXRvcnkgZnJvbSAnI3NlcnZlci9yZXBvc2l0b3JpZXMvRGF0YWJhc2VSZXBvc2l0b3J5LnRzJztcbmltcG9ydCB0eXBlIHsgTWV0YWRhdGFRdWVyeVBheWxvYWQgfSBmcm9tICcjc2VydmVyL3NlcnZpY2VzL01ldGFkYXRhUXVlcnlTZXJ2aWNlLnRzJztcbmltcG9ydCB0eXBlIEZpbGVFbnRpdHkgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9GaWxlRW50aXR5LnRzJztcbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVJlcG9zaXRvcnlRdWVyeU9wdGlvbnMge1xuICAgIGlkPzogbnVtYmVyIHwgbnVtYmVyW107XG4gICAgc2VhcmNoPzogc3RyaW5nO1xuICAgIHB1cnBvc2U/OiBzdHJpbmdbXTtcbiAgICBjbGllbnRfbmFtZT86IHN0cmluZ1tdO1xuICAgIG1ldGFzPzogTWV0YWRhdGFRdWVyeVBheWxvYWQ7XG59XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWxlUmVwb3NpdG9yeSBleHRlbmRzIERhdGFiYXNlUmVwb3NpdG9yeTxGaWxlRW50aXR5LCBGaWxlRW50aXR5WydpZCddLCBGaWxlUmVwb3NpdG9yeVF1ZXJ5T3B0aW9ucz4ge1xuICAgIGNvbnN0cnVjdG9yKGRiOiBEYXRhYmFzZVJlcG9zaXRvcnlbJ2RiJ10pO1xuICAgIHF1ZXJ5KG9wdGlvbnM/OiBGaWxlUmVwb3NpdG9yeVF1ZXJ5T3B0aW9ucyk6IGFueTtcbn1cbiIsImltcG9ydCBEYXRhYmFzZVJlcG9zaXRvcnkgZnJvbSAnI3NlcnZlci9yZXBvc2l0b3JpZXMvRGF0YWJhc2VSZXBvc2l0b3J5LnRzJztcbmltcG9ydCB0eXBlIHsgUGVybWlzc2lvbkFzc2lnbm1lbnQgfSBmcm9tICcjc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvbkFzc2lnbm1lbnRTY2hlbWEudHMnO1xuZXhwb3J0IGludGVyZmFjZSBQZXJtaXNzaW9uQXNzaWdubWVudFJlcG9zaXRvcnlRdWVyeU9wdGlvbnMge1xuICAgIGlkPzogbnVtYmVyIHwgbnVtYmVyW107XG4gICAgcGVybWlzc2lvbklkPzogbnVtYmVyIHwgbnVtYmVyW107XG4gICAgYXNzaWduYWJsZUlkPzogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgYXNzaWduYWJsZVR5cGU/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbn1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBlcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeSBleHRlbmRzIERhdGFiYXNlUmVwb3NpdG9yeTxQZXJtaXNzaW9uQXNzaWdubWVudCwgUGVybWlzc2lvbkFzc2lnbm1lbnRbJ2lkJ10sIFBlcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeVF1ZXJ5T3B0aW9ucz4ge1xuICAgIGNvbnN0cnVjdG9yKGRiOiBEYXRhYmFzZVJlcG9zaXRvcnlbJ2RiJ10pO1xuICAgIHF1ZXJ5KG9wdGlvbnM/OiBQZXJtaXNzaW9uQXNzaWdubWVudFJlcG9zaXRvcnlRdWVyeU9wdGlvbnMpOiBhbnk7XG59XG4iLCJpbXBvcnQgRGF0YWJhc2VSZXBvc2l0b3J5IGZyb20gJyNzZXJ2ZXIvcmVwb3NpdG9yaWVzL0RhdGFiYXNlUmVwb3NpdG9yeS50cyc7XG5pbXBvcnQgdHlwZSB7IFBlcm1pc3Npb24gfSBmcm9tICcjc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvblNjaGVtYS50cyc7XG5leHBvcnQgaW50ZXJmYWNlIFBlcm1pc3Npb25SZXBvc2l0b3J5UXVlcnlPcHRpb25zIHtcbiAgICBpZD86IG51bWJlciB8IG51bWJlcltdO1xuICAgIHNlYXJjaD86IHN0cmluZztcbn1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBlcm1pc3Npb25SZXBvc2l0b3J5IGV4dGVuZHMgRGF0YWJhc2VSZXBvc2l0b3J5PFBlcm1pc3Npb24sIFBlcm1pc3Npb25bJ2lkJ10sIFBlcm1pc3Npb25SZXBvc2l0b3J5UXVlcnlPcHRpb25zPiB7XG4gICAgY29uc3RydWN0b3IoZGI6IERhdGFiYXNlUmVwb3NpdG9yeVsnZGInXSk7XG4gICAgcXVlcnkob3B0aW9ucz86IFBlcm1pc3Npb25SZXBvc2l0b3J5UXVlcnlPcHRpb25zKTogYW55O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBGaW5kTWFueU9wdGlvbnMsIFBhZ2luYXRlT3B0aW9ucywgUGFnaW5hdGlvbiB9IGZyb20gJyNzZXJ2ZXIvcmVwb3NpdG9yaWVzL0RhdGFiYXNlUmVwb3NpdG9yeS50cyc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJztcbmV4cG9ydCBpbnRlcmZhY2UgSVJlcG9zaXRvcnlUeXBlczxURW50aXR5ID0gUmVjb3JkPHN0cmluZywgYW55PiwgVFByaW1hcnlLZXlUeXBlID0gYW55LCBUT3B0aW9ucyA9IFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb3VudChvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPG51bWJlcj47XG4gICAgZmluZE1hbnkob3B0aW9ucz86IFRPcHRpb25zICYgRmluZE1hbnlPcHRpb25zKTogUHJvbWlzZTxURW50aXR5W10+O1xuICAgIGZpbmRCeUlkKGlkOiBUUHJpbWFyeUtleVR5cGUsIG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eSB8IG51bGw+O1xuICAgIGZpbmRCeUlkT3JGYWlsKGlkOiBUUHJpbWFyeUtleVR5cGUsIG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eT47XG4gICAgcGFnaW5hdGUob3B0aW9ucz86IFRPcHRpb25zICYgUGFnaW5hdGVPcHRpb25zKTogUHJvbWlzZTxQYWdpbmF0aW9uPjtcbiAgICBjcmVhdGUoZGF0YTogUGFydGlhbDxURW50aXR5Piwgb3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTxURW50aXR5PjtcbiAgICBjcmVhdGVNYW55KGRhdGE6IFBhcnRpYWw8VEVudGl0eT5bXSwgb3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTxURW50aXR5W10+O1xuICAgIGRlbGV0ZUJ5SWQoaWQ6IFRQcmltYXJ5S2V5VHlwZSk6IFByb21pc2U8dm9pZD47XG4gICAgZGVzdHJveU1hbnkob3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTx2b2lkPjtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERhdGFiYXNlUmVwb3NpdG9yeUluZmVyTWl4aW48VEVudGl0eSA9IFJlY29yZDxzdHJpbmcsIGFueT4sIFRQcmltYXJ5S2V5VHlwZSA9IGFueSwgVE9wdGlvbnMgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PigpOiA8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpID0+IFRCYXNlICYgQ29uc3RydWN0b3I8SVJlcG9zaXRvcnlUeXBlczxURW50aXR5LCBUUHJpbWFyeUtleVR5cGUsIFRPcHRpb25zPj47XG4iLCJpbXBvcnQgRGF0YWJhc2VSZXBvc2l0b3J5IGZyb20gJyNzZXJ2ZXIvcmVwb3NpdG9yaWVzL0RhdGFiYXNlUmVwb3NpdG9yeS50cyc7XG5pbXBvcnQgdHlwZSB7IFRva2VuIH0gZnJvbSAnI3NoYXJlZC9zY2hlbWFzL3Rva2VuU2NoZW1hLnRzJztcbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5SZXBvc2l0b3J5UXVlcnlPcHRpb25zIHtcbiAgICBpZD86IG51bWJlciB8IG51bWJlcltdO1xuICAgIHNlYXJjaD86IHN0cmluZztcbiAgICB0eXBlPzogc3RyaW5nIHwgc3RyaW5nW107XG59XG5kZWNsYXJlIGNvbnN0IFRva2VuUmVwb3NpdG9yeV9iYXNlOiBpbXBvcnQoXCIjc2hhcmVkL3V0aWxzL2luZGV4LnRzXCIpLkNvbnN0cnVjdG9yICYgaW1wb3J0KFwiI3NoYXJlZC91dGlscy9pbmRleC50c1wiKS5Db25zdHJ1Y3RvcjxpbXBvcnQoXCIjc2VydmVyL21peGlucy9EYXRhYmFzZVJlcG9zaXRvcnlJbmZlck1peGluLnRzXCIpLklSZXBvc2l0b3J5VHlwZXM8e1xuICAgIGlkOiBudW1iZXI7XG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgdXNlcl9pZDogbnVtYmVyO1xuICAgIHRva2VuOiBzdHJpbmc7XG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICBleHBpcmVzX2F0OiBzdHJpbmc7XG59LCBudW1iZXIsIFRva2VuUmVwb3NpdG9yeVF1ZXJ5T3B0aW9ucz4+ICYgaW1wb3J0KFwiI3NoYXJlZC91dGlscy9pbmRleC50c1wiKS5Db25zdHJ1Y3Rvcjx7fT4gJiB0eXBlb2YgRGF0YWJhc2VSZXBvc2l0b3J5O1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVG9rZW5SZXBvc2l0b3J5IGV4dGVuZHMgVG9rZW5SZXBvc2l0b3J5X2Jhc2Uge1xuICAgIGNvbnN0cnVjdG9yKGRiOiBEYXRhYmFzZVJlcG9zaXRvcnlbJ2RiJ10pO1xuICAgIHF1ZXJ5KG9wdGlvbnM/OiBUb2tlblJlcG9zaXRvcnlRdWVyeU9wdGlvbnMpOiBhbnk7XG4gICAgZmluZEJ5VG9rZW4odG9rZW46IHN0cmluZyk6IFByb21pc2U8VG9rZW4gfCBudWxsPjtcbn1cbmV4cG9ydCB7fTtcbiIsImltcG9ydCB0eXBlIHsgVXNlclRhYmxlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cyc7XG5pbXBvcnQgRGF0YWJhc2VSZXBvc2l0b3J5IGZyb20gJy4vRGF0YWJhc2VSZXBvc2l0b3J5JztcbmV4cG9ydCBpbnRlcmZhY2UgVXNlclJlcG9zaXRvcnlRdWVyeU9wdGlvbnMge1xuICAgIGVtYWlsPzogc3RyaW5nO1xuICAgIHVzZXJuYW1lPzogc3RyaW5nO1xuICAgIGlkPzogbnVtYmVyO1xufVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXNlclJlcG9zaXRvcnkgZXh0ZW5kcyBEYXRhYmFzZVJlcG9zaXRvcnk8VXNlclRhYmxlLCBzdHJpbmcsIFVzZXJSZXBvc2l0b3J5UXVlcnlPcHRpb25zPiB7XG4gICAgY29uc3RydWN0b3IoZGI6IERhdGFiYXNlUmVwb3NpdG9yeVsnZGInXSk7XG4gICAgcXVlcnkob3B0aW9ucz86IFVzZXJSZXBvc2l0b3J5UXVlcnlPcHRpb25zKTogYW55O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBCYXNlRHJpdmUgZnJvbSAnI3NlcnZlci9nYXRld2F5cy9Ecml2ZUJhc2VHYXRld2F5LnRzJztcbmV4cG9ydCBpbnRlcmZhY2UgRHJpdmVGU0NvbmZpZyB7XG4gICAgZGlyZWN0b3J5OiBzdHJpbmc7XG59XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEcml2ZUZTIGV4dGVuZHMgQmFzZURyaXZlIHtcbiAgICBwcml2YXRlIHNjaGVtYTtcbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQaWNrPEJhc2VEcml2ZSwgJ2lkJyB8ICduYW1lJyB8ICdkZXNjcmlwdGlvbicgfCAnY29uZmlnJz4pO1xuICAgIGdldCB2YWxpZCgpOiBib29sZWFuO1xuICAgIHByaXZhdGUgY2hlY2tWYWxpZDtcbiAgICBwcm90ZWN0ZWQgZ2V0IHJvb3RQYXRoKCk6IHN0cmluZztcbiAgICBleGlzdHM6IEJhc2VEcml2ZVsnZXhpc3RzJ107XG4gICAgbGlzdDogQmFzZURyaXZlWydsaXN0J107XG4gICAgZmluZDogQmFzZURyaXZlWydmaW5kJ107XG4gICAgbWtkaXIoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gICAgcmVhZDogQmFzZURyaXZlWydyZWFkJ107XG4gICAgcmVhZFN0cmVhbShmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxmcy5SZWFkU3RyZWFtPjtcbiAgICB3cml0ZTogQmFzZURyaXZlWyd3cml0ZSddO1xuICAgIHdyaXRlU3RyZWFtKGZpbGVuYW1lOiBzdHJpbmcsIHN0cmVhbTogTm9kZUpTLlJlYWRhYmxlU3RyZWFtKTogUHJvbWlzZTx2b2lkPjtcbiAgICBkZWxldGU6IEJhc2VEcml2ZVsnZGVsZXRlJ107XG4gICAgdXJsOiBCYXNlRHJpdmVbJ3VybCddO1xuICAgIHVwbG9hZFVybDogQmFzZURyaXZlWyd1cGxvYWRVcmwnXTtcbn1cbiIsImltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyBEYXRhYmFzZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RhdGFiYXNlQ29udHJhY3QudHMnO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cyc7XG5leHBvcnQgZGVjbGFyZSBmdW5jdGlvbiB2YWx1ZVRvU3RyaW5nKHZhbHVlOiBhbnkpOiBzdHJpbmc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNZXRhZGF0YTxUYWJsZSBleHRlbmRzIGtleW9mIERhdGFiYXNlPihtZXRhc1RhYmxlOiBUYWJsZSwgZm9yZWlnbktleToga2V5b2YgRGF0YWJhc2VbVGFibGVdKTogPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSA9PiB7XG4gICAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IHtcbiAgICAgICAgZ2V0PFQgPSBhbnk+KG5hbWU6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD47XG4gICAgICAgIGdldDxUID0gYW55PihuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogVCk6IFByb21pc2U8VD47XG4gICAgICAgIHNldChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBQcm9taXNlPHZvaWQ+O1xuICAgIH07XG59ICYgVEJhc2U7XG4iLCJpbXBvcnQgdHlwZSB7IEt5c2VseSB9IGZyb20gJ2t5c2VseSc7XG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29udHJhY3QgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJztcbmV4cG9ydCBkZWNsYXJlIGNvbnN0IGtleSA9IFwiZGF0YWJhc2VcIjtcbmRlY2xhcmUgY29uc3QgZGF0YWJhc2U6IEt5c2VseTxEYXRhYmFzZUNvbnRyYWN0PjtcbmV4cG9ydCBkZWZhdWx0IGRhdGFiYXNlO1xuIiwiaW1wb3J0IHR5cGUgeyBTZWxlY3RhYmxlLCBTZWxlY3RRdWVyeUJ1aWxkZXIsIEV4cHJlc3Npb25CdWlsZGVyIGFzIEtFeHByZXNzaW9uQnVpbGRlciB9IGZyb20gJ2t5c2VseSc7XG5pbXBvcnQgZGIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2RhdGFiYXNlLnRzJztcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyBEYXRhYmFzZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RhdGFiYXNlQ29udHJhY3QudHMnO1xuZXhwb3J0IHR5cGUgU2VsZWN0RnJvbTxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gUmV0dXJuVHlwZTx0eXBlb2YgZGIuc2VsZWN0RnJvbTxUPj4gfCBTZWxlY3RRdWVyeUJ1aWxkZXI8RGF0YWJhc2UsIFQsIGFueT47XG5leHBvcnQgdHlwZSBJbnNlcnRGcm9tPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gPSBSZXR1cm5UeXBlPHR5cGVvZiBkYi5pbnNlcnRJbnRvPFQ+PjtcbmV4cG9ydCB0eXBlIFVwZGF0ZUZyb208VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiA9IFJldHVyblR5cGU8dHlwZW9mIGRiLnVwZGF0ZVRhYmxlPFQ+PjtcbmV4cG9ydCB0eXBlIERlbGV0ZUZyb208VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiA9IFJldHVyblR5cGU8dHlwZW9mIGRiLmRlbGV0ZUZyb208VD4+O1xuZXhwb3J0IHR5cGUgU2VsZWN0QnVpbGRlcjxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gU2VsZWN0UXVlcnlCdWlsZGVyPERhdGFiYXNlLCBULCBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPj47XG5leHBvcnQgdHlwZSBFeHByZXNzaW9uQnVpbGRlcjxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gS0V4cHJlc3Npb25CdWlsZGVyPERhdGFiYXNlLCBUPjtcbmV4cG9ydCBkZWNsYXJlIGNvbnN0IG5vdzogKCkgPT4gaW1wb3J0KFwia3lzZWx5XCIpLlJhd0J1aWxkZXI8c3RyaW5nPjtcbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXplT3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+IHtcbiAgICBzZXJpYWxpemU/OiAocm93OiBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPikgPT4gYW55O1xufVxuZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlUmVzdWx0PFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSwgTyBleHRlbmRzIFNlcmlhbGl6ZU9wdGlvbnM8VD4gfCB1bmRlZmluZWQ+ID0gTyBleHRlbmRzIHVuZGVmaW5lZCA/IFNlbGVjdGFibGU8RGF0YWJhc2VbVF0+IDogTyBleHRlbmRzIHtcbiAgICBzZXJpYWxpemU6IChyb3c6IFNlbGVjdGFibGU8RGF0YWJhc2VbVF0+KSA9PiBpbmZlciBSO1xufSA/IFIgOiBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPjtcbiIsImltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbkJ1aWxkZXIsIEV4cHJlc3Npb25XcmFwcGVyLCBJbnNlcnRhYmxlIH0gZnJvbSAna3lzZWx5JztcbmltcG9ydCB0eXBlIHsgU2VsZWN0RnJvbSwgU2VyaWFsaXphYmxlUmVzdWx0LCBTZXJpYWxpemVPcHRpb25zLCBVcGRhdGVGcm9tIH0gZnJvbSAnLi9jb21tb24udHMnO1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzIERhdGFiYXNlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cyc7XG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZU9yQ3JlYXRlT3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+IGV4dGVuZHMgU2VyaWFsaXplT3B0aW9uczxUPiB7XG4gICAgZGVidWc/OiBib29sZWFuO1xuICAgIHdoZXJlPzogKHFiOiBFeHByZXNzaW9uQnVpbGRlcjxEYXRhYmFzZSwgVD4pID0+IEV4cHJlc3Npb25XcmFwcGVyPERhdGFiYXNlLCBULCBhbnk+O1xuICAgIHNlbGVjdD86IChxYjogU2VsZWN0RnJvbTxUPikgPT4gU2VsZWN0RnJvbTxUPjtcbiAgICB1cGRhdGU/OiAocWI6IFVwZGF0ZUZyb208VD4pID0+IFVwZGF0ZUZyb208VD47XG4gICAgdmFsdWVzOiBJbnNlcnRhYmxlPERhdGFiYXNlW1RdPiB8IEluc2VydGFibGU8RGF0YWJhc2VbVF0+W107XG59XG5leHBvcnQgZGVjbGFyZSBmdW5jdGlvbiB1cGRhdGVPckNyZWF0ZTxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBVcGRhdGVPckNyZWF0ZU9wdGlvbnM8VD4+KHRhYmxlOiBULCBvcHRpb25zPzogTyk6IFByb21pc2U8U2VyaWFsaXphYmxlUmVzdWx0PFQsIE8+PjtcbiIsImltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbkJ1aWxkZXIsIEV4cHJlc3Npb25XcmFwcGVyIH0gZnJvbSAna3lzZWx5JztcbmltcG9ydCB0eXBlIHsgU2VsZWN0RnJvbSwgU2VyaWFsaXplT3B0aW9ucywgU2VyaWFsaXphYmxlUmVzdWx0IH0gZnJvbSAnLi9jb21tb24udHMnO1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzIERhdGFiYXNlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cyc7XG5leHBvcnQgaW50ZXJmYWNlIExpc3RPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gZXh0ZW5kcyBTZXJpYWxpemVPcHRpb25zPFQ+IHtcbiAgICBsaW1pdD86IG51bWJlcjtcbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgZGVidWc/OiBib29sZWFuO1xuICAgIHdoZXJlPzogKHFiOiBFeHByZXNzaW9uQnVpbGRlcjxEYXRhYmFzZSwgVD4pID0+IEV4cHJlc3Npb25XcmFwcGVyPERhdGFiYXNlLCBULCBhbnk+O1xuICAgIHF1ZXJ5PzogKHFiOiBTZWxlY3RGcm9tPFQ+KSA9PiBTZWxlY3RGcm9tPFQ+O1xufVxuZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gbGlzdDxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBMaXN0T3B0aW9uczxUPj4odGFibGU6IFQsIG9wdGlvbnM/OiBPKTogUHJvbWlzZTxTZXJpYWxpemFibGVSZXN1bHQ8VCwgTz5bXT47XG4iLCJpbXBvcnQgdHlwZSB7IEV4cHJlc3Npb25CdWlsZGVyLCBFeHByZXNzaW9uV3JhcHBlciwgU2VsZWN0YWJsZSB9IGZyb20gJ2t5c2VseSc7XG5pbXBvcnQgdHlwZSB7IFNlbGVjdEZyb20gfSBmcm9tICcuL2NvbW1vbi50cyc7XG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29udHJhY3QgYXMgRGF0YWJhc2UgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJztcbmltcG9ydCBQYWdpbmF0aW9uIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvUGFnaW5hdGlvbkVudGl0eS50cyc7XG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRlT3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+IHtcbiAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgcGFnZT86IG51bWJlcjtcbiAgICBsaW1pdD86IG51bWJlcjtcbiAgICBvcmRlckJ5PzogRGF0YWJhc2VbVF0gfCAoa2V5b2YgRGF0YWJhc2VbVF0pW107XG4gICAgb3JkZXJEZXNjPzogKCdhc2MnIHwgJ2Rlc2MnKSB8ICgnYXNjJyB8ICdkZXNjJylbXTtcbiAgICB3aGVyZT86IChxYjogRXhwcmVzc2lvbkJ1aWxkZXI8RGF0YWJhc2UsIFQ+KSA9PiBFeHByZXNzaW9uV3JhcHBlcjxEYXRhYmFzZSwgVCwgYW55PjtcbiAgICBzZXJpYWxpemU/OiAocm93OiBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPikgPT4gYW55O1xuICAgIHF1ZXJ5PzogKHFiOiBTZWxlY3RGcm9tPFQ+KSA9PiBhbnk7XG59XG5leHBvcnQgdHlwZSBQYWdpbmF0ZVJlc3VsdDxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBQYWdpbmF0ZU9wdGlvbnM8VD4gfCB1bmRlZmluZWQ+ID0gTyBleHRlbmRzIHVuZGVmaW5lZCA/IFNlbGVjdGFibGU8RGF0YWJhc2VbVF0+IDogTyBleHRlbmRzIHtcbiAgICBzZXJpYWxpemU6IChyb3c6IFNlbGVjdGFibGU8RGF0YWJhc2VbVF0+KSA9PiBpbmZlciBSO1xufSA/IFIgOiBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPjtcbmV4cG9ydCBkZWNsYXJlIGZ1bmN0aW9uIHBhZ2luYXRlPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSwgTyBleHRlbmRzIFBhZ2luYXRlT3B0aW9uczxUPj4odGFibGU6IFQsIG9wdGlvbnM/OiBPKTogUHJvbWlzZTxQYWdpbmF0aW9uPFBhZ2luYXRlUmVzdWx0PFQsIE8+Pj47XG4iLCJpbXBvcnQgdHlwZSB7IFNlbGVjdEZyb20gfSBmcm9tICcuL2NvbW1vbi50cyc7XG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29udHJhY3QgYXMgRGF0YWJhc2UgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJztcbmV4cG9ydCBpbnRlcmZhY2UgQ291bnRPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4ge1xuICAgIHF1ZXJ5PzogKHFiOiBTZWxlY3RGcm9tPFQ+KSA9PiBTZWxlY3RGcm9tPFQ+O1xuICAgIGRlYnVnPzogYm9vbGVhbjtcbn1cbmV4cG9ydCBkZWNsYXJlIGZ1bmN0aW9uIGNvdW50PFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSwgTyBleHRlbmRzIENvdW50T3B0aW9uczxUPj4odGFibGU6IFQsIG9wdGlvbnM/OiBPKTogUHJvbWlzZTxudW1iZXI+O1xuIiwiaW1wb3J0IHR5cGUgeyBJbnNlcnRhYmxlIH0gZnJvbSAna3lzZWx5JztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlUmVzdWx0LCBTZXJpYWxpemVPcHRpb25zIH0gZnJvbSAnLi9jb21tb24udHMnO1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzIERhdGFiYXNlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cyc7XG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZU9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiBleHRlbmRzIFNlcmlhbGl6ZU9wdGlvbnM8VD4ge1xuICAgIHZhbHVlczogSW5zZXJ0YWJsZTxEYXRhYmFzZVtUXT47XG4gICAgcHJpbWFyeUtleT86IHN0cmluZztcbiAgICBub3JtYWxpemU/OiBib29sZWFuIHwgKCh2YWx1ZTogYW55KSA9PiBhbnkpO1xufVxuZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdDxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBDcmVhdGVPcHRpb25zPFQ+Pih0YWJsZTogVCwgb3B0aW9ucz86IE8pOiBQcm9taXNlPFNlcmlhbGl6YWJsZVJlc3VsdDxULCBPPj47XG5leHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBjcmVhdGVNeXNxbDxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBDcmVhdGVPcHRpb25zPFQ+Pih0YWJsZTogVCwgb3B0aW9ucz86IE8pOiBQcm9taXNlPFNlcmlhbGl6YWJsZVJlc3VsdDxULCBPPj47XG5leHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBjcmVhdGU8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlLCBPIGV4dGVuZHMgQ3JlYXRlT3B0aW9uczxUPj4odGFibGU6IFQsIG9wdGlvbnM/OiBPKTogUHJvbWlzZTxpbXBvcnQoXCJreXNlbHlcIikuRHJhaW5PdXRlckdlbmVyaWM8eyBbS18xIGluIChEYXRhYmFzZVtUXSBleHRlbmRzIGluZmVyIFRfMSA/IHsgW0sgaW4ga2V5b2YgVF8xXTogaW1wb3J0KFwia3lzZWx5XCIpLlNlbGVjdFR5cGU8VF8xW0tdPiBleHRlbmRzIGluZmVyIFRfMiA/IFRfMiBleHRlbmRzIGltcG9ydChcImt5c2VseVwiKS5TZWxlY3RUeXBlPFRfMVtLXT4gPyBUXzIgZXh0ZW5kcyBuZXZlciA/IG5ldmVyIDogSyA6IG5ldmVyIDogbmV2ZXI7IH0gOiBuZXZlcilba2V5b2YgRGF0YWJhc2VbVF1dXTogaW1wb3J0KFwia3lzZWx5XCIpLlNlbGVjdFR5cGU8RGF0YWJhc2VbVF1bS18xXT47IH0+PjtcbiIsImltcG9ydCB0eXBlIHsgVXBkYXRlYWJsZSwgRXhwcmVzc2lvbkJ1aWxkZXIsIEV4cHJlc3Npb25XcmFwcGVyIH0gZnJvbSAna3lzZWx5JztcbmltcG9ydCB0eXBlIHsgVXBkYXRlRnJvbSwgU2VyaWFsaXphYmxlUmVzdWx0LCBTZXJpYWxpemVPcHRpb25zIH0gZnJvbSAnLi9jb21tb24udHMnO1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzIERhdGFiYXNlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cyc7XG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZU9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiBleHRlbmRzIFNlcmlhbGl6ZU9wdGlvbnM8VD4ge1xuICAgIGRlYnVnPzogYm9vbGVhbjtcbiAgICB2YWx1ZXM6IFVwZGF0ZWFibGU8RGF0YWJhc2VbVF0+O1xuICAgIG5vcm1hbGl6ZT86IGJvb2xlYW4gfCAoKHZhbHVlOiBhbnkpID0+IGFueSk7XG4gICAgd2hlcmU/OiAocWI6IEV4cHJlc3Npb25CdWlsZGVyPERhdGFiYXNlLCBUPikgPT4gRXhwcmVzc2lvbldyYXBwZXI8RGF0YWJhc2UsIFQsIGFueT47XG4gICAgcXVlcnk/OiAocWI6IFVwZGF0ZUZyb208VD4pID0+IFVwZGF0ZUZyb208VD47XG59XG5leHBvcnQgZGVjbGFyZSBmdW5jdGlvbiB1cGRhdGVEZWZhdWx0PFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSwgTyBleHRlbmRzIFVwZGF0ZU9wdGlvbnM8VD4+KHRhYmxlOiBULCBvcHRpb25zPzogTyk6IFByb21pc2U8U2VyaWFsaXphYmxlUmVzdWx0PFQsIE8+W10+O1xuZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gdXBkYXRlTXlzcWw8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlLCBPIGV4dGVuZHMgVXBkYXRlT3B0aW9uczxUPj4odGFibGU6IFQsIG9wdGlvbnM/OiBPKTogUHJvbWlzZTxTZXJpYWxpemFibGVSZXN1bHQ8VCwgTz5bXT47XG5leHBvcnQgZGVjbGFyZSBmdW5jdGlvbiB1cGRhdGU8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlLCBPIGV4dGVuZHMgVXBkYXRlT3B0aW9uczxUPj4odGFibGU6IFQsIG9wdGlvbnM/OiBPKTogUHJvbWlzZTxpbXBvcnQoXCJreXNlbHlcIikuRHJhaW5PdXRlckdlbmVyaWM8eyBbS18xIGluIChEYXRhYmFzZVtUXSBleHRlbmRzIGluZmVyIFRfMSA/IHsgW0sgaW4ga2V5b2YgVF8xXTogaW1wb3J0KFwia3lzZWx5XCIpLlNlbGVjdFR5cGU8VF8xW0tdPiBleHRlbmRzIGluZmVyIFRfMiA/IFRfMiBleHRlbmRzIGltcG9ydChcImt5c2VseVwiKS5TZWxlY3RUeXBlPFRfMVtLXT4gPyBUXzIgZXh0ZW5kcyBuZXZlciA/IG5ldmVyIDogSyA6IG5ldmVyIDogbmV2ZXI7IH0gOiBuZXZlcilba2V5b2YgRGF0YWJhc2VbVF1dXTogaW1wb3J0KFwia3lzZWx5XCIpLlNlbGVjdFR5cGU8RGF0YWJhc2VbVF1bS18xXT47IH0+W10+O1xuIiwiaW1wb3J0IHR5cGUgeyBFeHByZXNzaW9uV3JhcHBlciwgRXhwcmVzc2lvbkJ1aWxkZXIgfSBmcm9tICdreXNlbHknO1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzIERhdGFiYXNlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cyc7XG5pbXBvcnQgZGIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2RhdGFiYXNlLnRzJztcbnR5cGUgRGVsZXRlRnJvbTxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gUmV0dXJuVHlwZTx0eXBlb2YgZGIuZGVsZXRlRnJvbTxUPj47XG5leHBvcnQgaW50ZXJmYWNlIERlc3Ryb3lPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4ge1xuICAgIHF1ZXJ5PzogKHFiOiBEZWxldGVGcm9tPFQ+KSA9PiBEZWxldGVGcm9tPFQ+O1xuICAgIHdoZXJlPzogKHFiOiBFeHByZXNzaW9uQnVpbGRlcjxEYXRhYmFzZSwgVD4pID0+IEV4cHJlc3Npb25XcmFwcGVyPERhdGFiYXNlLCBULCBhbnk+O1xufVxuZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gZGVzdHJveTxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBEZXN0cm95T3B0aW9uczxUPj4odGFibGU6IFQsIG9wdGlvbnM/OiBPKTogUHJvbWlzZTx2b2lkPjtcbmV4cG9ydCB7fTtcbiIsImltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbkJ1aWxkZXIsIEV4cHJlc3Npb25XcmFwcGVyLCBJbnNlcnRhYmxlIH0gZnJvbSAna3lzZWx5JztcbmltcG9ydCB0eXBlIHsgU2VsZWN0RnJvbSwgU2VyaWFsaXphYmxlUmVzdWx0LCBTZXJpYWxpemVPcHRpb25zIH0gZnJvbSAnLi9jb21tb24udHMnO1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzIERhdGFiYXNlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cyc7XG5leHBvcnQgaW50ZXJmYWNlIEZpcnN0T3JDcmVhdGVPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gZXh0ZW5kcyBTZXJpYWxpemVPcHRpb25zPFQ+IHtcbiAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgc2VsZWN0PzogKHFiOiBTZWxlY3RGcm9tPFQ+KSA9PiBTZWxlY3RGcm9tPFQ+O1xuICAgIHdoZXJlPzogKHFiOiBFeHByZXNzaW9uQnVpbGRlcjxEYXRhYmFzZSwgVD4pID0+IEV4cHJlc3Npb25XcmFwcGVyPERhdGFiYXNlLCBULCBhbnk+O1xuICAgIHZhbHVlczogSW5zZXJ0YWJsZTxEYXRhYmFzZVtUXT4gfCBJbnNlcnRhYmxlPERhdGFiYXNlW1RdPltdO1xufVxuZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gZmlyc3RPckNyZWF0ZTxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBGaXJzdE9yQ3JlYXRlT3B0aW9uczxUPj4odGFibGU6IFQsIG9wdGlvbnM/OiBPKTogUHJvbWlzZTxTZXJpYWxpemFibGVSZXN1bHQ8VCwgTz4+O1xuIiwiaW1wb3J0IHR5cGUgeyBFeHByZXNzaW9uQnVpbGRlciwgRXhwcmVzc2lvbldyYXBwZXIgfSBmcm9tICdreXNlbHknO1xuaW1wb3J0IHR5cGUgeyBTZWxlY3RGcm9tLCBTZXJpYWxpemFibGVSZXN1bHQsIFNlcmlhbGl6ZU9wdGlvbnMgfSBmcm9tICcuL2NvbW1vbi50cyc7XG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29udHJhY3QgYXMgRGF0YWJhc2UgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJztcbmV4cG9ydCBpbnRlcmZhY2UgRmluZE9uZU9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiBleHRlbmRzIFNlcmlhbGl6ZU9wdGlvbnM8VD4ge1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgcXVlcnk/OiAocWI6IFNlbGVjdEZyb208VD4pID0+IFNlbGVjdEZyb208VD47XG4gICAgd2hlcmU/OiAocWI6IEV4cHJlc3Npb25CdWlsZGVyPERhdGFiYXNlLCBUPikgPT4gRXhwcmVzc2lvbldyYXBwZXI8RGF0YWJhc2UsIFQsIGFueT47XG59XG5leHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBmaW5kT25lPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSwgTyBleHRlbmRzIEZpbmRPbmVPcHRpb25zPFQ+Pih0YWJsZTogVCwgb3B0aW9ucz86IE8pOiBQcm9taXNlPFNlcmlhbGl6YWJsZVJlc3VsdDxULCBPPiB8IG51bGw+O1xuZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gZmluZE9uZU9yRmFpbDxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBGaW5kT25lT3B0aW9uczxUPj4odGFibGU6IFQsIG9wdGlvbnM/OiBPKTogUHJvbWlzZTxOb25OdWxsYWJsZTxBd2FpdGVkPFNlcmlhbGl6YWJsZVJlc3VsdDxULCBPPj4+PjtcbiIsImltcG9ydCB0eXBlIHsgVXBkYXRlT3JDcmVhdGVPcHRpb25zIH0gZnJvbSAnI3NlcnZlci9xdWVyaWVzL3VwZGF0ZU9yQ3JlYXRlLnRzJztcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyBEYXRhYmFzZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RhdGFiYXNlQ29udHJhY3QudHMnO1xuaW1wb3J0IHR5cGUgeyBMaXN0T3B0aW9ucyB9IGZyb20gJyNzZXJ2ZXIvcXVlcmllcy9saXN0LnRzJztcbmltcG9ydCB0eXBlIHsgUGFnaW5hdGVPcHRpb25zIH0gZnJvbSAnI3NlcnZlci9xdWVyaWVzL3BhZ2luYXRlLnRzJztcbmltcG9ydCB0eXBlIHsgQ291bnRPcHRpb25zIH0gZnJvbSAnI3NlcnZlci9xdWVyaWVzL2NvdW50LnRzJztcbmltcG9ydCB0eXBlIHsgQ3JlYXRlT3B0aW9ucyB9IGZyb20gJyNzZXJ2ZXIvcXVlcmllcy9jcmVhdGUudHMnO1xuaW1wb3J0IHR5cGUgeyBVcGRhdGVPcHRpb25zIH0gZnJvbSAnI3NlcnZlci9xdWVyaWVzL3VwZGF0ZS50cyc7XG5pbXBvcnQgdHlwZSB7IERlc3Ryb3lPcHRpb25zIH0gZnJvbSAnI3NlcnZlci9xdWVyaWVzL2Rlc3Ryb3kudHMnO1xuaW1wb3J0IHR5cGUgeyBGaXJzdE9yQ3JlYXRlT3B0aW9ucyB9IGZyb20gJyNzZXJ2ZXIvcXVlcmllcy9maXJzdE9yQ3JlYXRlLnRzJztcbmltcG9ydCB0eXBlIHsgRmluZE9uZU9wdGlvbnMgfSBmcm9tICcjc2VydmVyL3F1ZXJpZXMvZmluZE9uZS50cyc7XG5pbXBvcnQgdHlwZSBQYWdpbmF0aW9uIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvUGFnaW5hdGlvbkVudGl0eS50cyc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJztcbmltcG9ydCB0eXBlIHsgU2VsZWN0UXVlcnlCdWlsZGVyIH0gZnJvbSAna3lzZWx5JztcbmV4cG9ydCB0eXBlIE1vZGVsTGlzdE9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiA9IE9taXQ8TGlzdE9wdGlvbnM8VD4sICdzZXJpYWxpemUnPjtcbmV4cG9ydCB0eXBlIE1vZGVsRmluZE9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiA9IE9taXQ8RmluZE9uZU9wdGlvbnM8VD4sICdzZXJpYWxpemUnIHwgJ29yZGVyQnknPjtcbmV4cG9ydCB0eXBlIE1vZGVsUGFnaW5hdGVPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gPSBPbWl0PFBhZ2luYXRlT3B0aW9uczxUPiwgJ3NlcmlhbGl6ZSc+O1xuZXhwb3J0IHR5cGUgTW9kZWxDb3VudE9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiA9IENvdW50T3B0aW9uczxUPjtcbmV4cG9ydCB0eXBlIE1vZGVsQ3JlYXRlT3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gT21pdDxDcmVhdGVPcHRpb25zPFQ+LCAnc2VyaWFsaXplJz47XG5leHBvcnQgdHlwZSBNb2RlbFVwZGF0ZU9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiA9IE9taXQ8VXBkYXRlT3B0aW9uczxUPiwgJ3NlcmlhbGl6ZSc+O1xuZXhwb3J0IHR5cGUgTW9kZWxEZXN0cm95T3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gRGVzdHJveU9wdGlvbnM8VD47XG5leHBvcnQgdHlwZSBNb2RlbEZpcnN0T3JDcmVhdGVPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gPSBPbWl0PEZpcnN0T3JDcmVhdGVPcHRpb25zPFQ+LCAnc2VyaWFsaXplJz47XG5leHBvcnQgdHlwZSBNb2RlbFVwZGF0ZU9yQ3JlYXRlT3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gT21pdDxVcGRhdGVPckNyZWF0ZU9wdGlvbnM8VD4sICdzZXJpYWxpemUnPjtcbmV4cG9ydCB0eXBlIE1vZGVsRW50aXR5ID0gUmV0dXJuVHlwZTxSZXR1cm5UeXBlPHR5cGVvZiBNb2RlbE1peGluPGFueT4+PjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1vZGVsTWl4aW48VGFibGUgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4odGFibGU6IFRhYmxlLCBwcmltYXJ5S2V5Pzoga2V5b2YgRGF0YWJhc2VbVGFibGVdKTogPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSA9PiB7XG4gICAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IHtcbiAgICAgICAgc2F2ZSgpOiBQcm9taXNlPHZvaWQ+O1xuICAgICAgICBkZXN0cm95KCk6IFByb21pc2U8dm9pZD47XG4gICAgICAgIHNvZnREZWxldGUoKTogUHJvbWlzZTx2b2lkPjtcbiAgICB9O1xuICAgIF9fbW9kZWw6IHtcbiAgICAgICAgdGFibGU6IFRhYmxlO1xuICAgICAgICBwcmltYXJ5S2V5OiBrZXlvZiBEYXRhYmFzZVtUYWJsZV07XG4gICAgfTtcbiAgICBzZXJpYWxpemU8VD4odGhpczogbmV3ICgpID0+IFQsIHJvdzogYW55KTogUHJvbWlzZTxUPjtcbiAgICBzZWxlY3QoKTogU2VsZWN0UXVlcnlCdWlsZGVyPERhdGFiYXNlLCBUYWJsZSwgYW55PjtcbiAgICBwYWdpbmF0ZTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbz86IE1vZGVsUGFnaW5hdGVPcHRpb25zPFRhYmxlPik6IFByb21pc2U8UGFnaW5hdGlvbjxUPj47XG4gICAgbGlzdDxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbz86IE1vZGVsTGlzdE9wdGlvbnM8VGFibGU+KTogUHJvbWlzZTxUW10+O1xuICAgIGZpbmRPbmU8VD4odGhpczogbmV3ICgpID0+IFQsIG8/OiBNb2RlbEZpbmRPcHRpb25zPFRhYmxlPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD47XG4gICAgZmluZE9uZU9yRmFpbDxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbz86IE1vZGVsRmluZE9wdGlvbnM8VGFibGU+KTogUHJvbWlzZTxUPjtcbiAgICBmaW5kPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBpZDogYW55KTogUHJvbWlzZTxUIHwgbnVsbD47XG4gICAgZmluZE9yRmFpbDxUPih0aGlzOiBuZXcgKCkgPT4gVCwgaWQ6IGFueSk6IFByb21pc2U8VD47XG4gICAgZmluZEJ5PFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBjb2x1bW46IGtleW9mIERhdGFiYXNlW1RhYmxlXSwgdmFsdWU6IGFueSk6IFByb21pc2U8VD47XG4gICAgZmluZEJ5T3JGYWlsPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBjb2x1bW46IGtleW9mIERhdGFiYXNlW1RhYmxlXSwgdmFsdWU6IGFueSk6IFByb21pc2U8VD47XG4gICAgZXhpc3RzPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBvPzogTW9kZWxMaXN0T3B0aW9uczxUYWJsZT4pOiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIGNvdW50PFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBvPzogTW9kZWxDb3VudE9wdGlvbnM8VGFibGU+KTogUHJvbWlzZTxudW1iZXI+O1xuICAgIGNyZWF0ZTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgcGF5bG9hZDogTW9kZWxDcmVhdGVPcHRpb25zPFRhYmxlPltcInZhbHVlc1wiXSk6IFByb21pc2U8VD47XG4gICAgY3JlYXRlTWFueTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgdmFsdWVzOiBBcnJheTxNb2RlbENyZWF0ZU9wdGlvbnM8VGFibGU+W1widmFsdWVzXCJdPik6IFByb21pc2U8VFtdPjtcbiAgICB1cGRhdGU8VD4odGhpczogbmV3ICgpID0+IFQsIG86IE1vZGVsVXBkYXRlT3B0aW9uczxUYWJsZT4pOiBQcm9taXNlPFQ+O1xuICAgIHVwZGF0ZUJ5SWQ8VD4odGhpczogbmV3ICgpID0+IFQsIGlkOiBhbnksIHZhbHVlczogTW9kZWxVcGRhdGVPcHRpb25zPFRhYmxlPltcInZhbHVlc1wiXSwgb3B0aW9ucz86IHtcbiAgICAgICAgZGVidWc/OiBib29sZWFuO1xuICAgIH0pOiBQcm9taXNlPFQ+O1xuICAgIGRlc3Ryb3k8VD4odGhpczogbmV3ICgpID0+IFQsIG8/OiBNb2RlbERlc3Ryb3lPcHRpb25zPFRhYmxlPik6IFByb21pc2U8dm9pZD47XG4gICAgZmlyc3RPckNyZWF0ZTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbzogTW9kZWxGaXJzdE9yQ3JlYXRlT3B0aW9uczxUYWJsZT4pOiBUO1xuICAgIHVwZGF0ZU9yQ3JlYXRlPFQ+KHRoaXM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsIG86IE1vZGVsVXBkYXRlT3JDcmVhdGVPcHRpb25zPFRhYmxlPik6IFQ7XG4gICAgZGVzdHJveUJ5SWQ8VD4odGhpczogbmV3ICgpID0+IFQsIGlkOiBhbnkpOiBQcm9taXNlPHZvaWQ+O1xufSAmIFRCYXNlO1xuIiwiaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cyc7XG5pbnRlcmZhY2UgUmVsYXRpb24ge1xuICAgIGxvYWQoZW50aXRpZXM6IGFueVtdKTogUHJvbWlzZTx2b2lkPjtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFJlbGF0aW9uPFIgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBSZWxhdGlvbj4+KHJlbGF0aW9uczogUik6IDxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkgPT4ge1xuICAgIG5ldyAoLi4uYXJnczogYW55W10pOiB7fTtcbiAgICBsb2FkPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBlbnRpdGllczogVCB8IFRbXSwgbmFtZXM6IGtleW9mIFIgfCAoa2V5b2YgUilbXSk6IFByb21pc2U8dm9pZD47XG59ICYgVEJhc2U7XG5leHBvcnQge307XG4iLCJpbXBvcnQgQ29uZmlnU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0NvbmZpZ1NlcnZpY2UudHMnO1xuZGVjbGFyZSBjb25zdCBjb25maWc6IENvbmZpZ1NlcnZpY2U7XG5leHBvcnQgZGVmYXVsdCBjb25maWc7XG4iLCJpbXBvcnQgQ29udGFpbmVyU2VydmljZSBmcm9tIFwiI3NoYXJlZC9zZXJ2aWNlcy9Db250YWluZXJTZXJ2aWNlLnRzXCI7XG5kZWNsYXJlIGNvbnN0IF9kZWZhdWx0OiBDb250YWluZXJTZXJ2aWNlO1xuZXhwb3J0IGRlZmF1bHQgX2RlZmF1bHQ7XG4iLCJpbXBvcnQgRG93bmxvYWRTZXJ2aWNlIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvRG93bmxvYWRTZXJ2aWNlLnRzJztcbmRlY2xhcmUgY29uc3QgZG93bmxvYWQ6IERvd25sb2FkU2VydmljZTtcbmV4cG9ydCBkZWZhdWx0IGRvd25sb2FkO1xuIiwiaW1wb3J0IERyaXZlU2VydmljZSBmcm9tICcjc2VydmVyL3NlcnZpY2VzL0RyaXZlU2VydmljZS50cyc7XG5kZWNsYXJlIGNvbnN0IGRyaXZlOiBEcml2ZVNlcnZpY2U7XG5leHBvcnQgZGVmYXVsdCBkcml2ZTtcbiIsImltcG9ydCB7IEVtbWl0dGVyU2VydmljZSB9IGZyb20gJyNzaGFyZWQvaW5kZXgudHMnO1xuZGVjbGFyZSBjb25zdCBlbW1pdHRlcjogRW1taXR0ZXJTZXJ2aWNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuZXhwb3J0IGRlZmF1bHQgZW1taXR0ZXI7XG4iLCJpbXBvcnQgRW5jcnlwdFNlcnZpY2UgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9FbmNyeXB0U2VydmljZS50cyc7XG5kZWNsYXJlIGNvbnN0IGVuY3J5cHQ6IEVuY3J5cHRTZXJ2aWNlO1xuZXhwb3J0IGRlZmF1bHQgZW5jcnlwdDtcbiIsImltcG9ydCBGaWxlUmVwb3NpdG9yeSBmcm9tIFwiI3NlcnZlci9yZXBvc2l0b3JpZXMvRmlsZVJlcG9zaXRvcnkudHNcIjtcbmRlY2xhcmUgY29uc3QgZmlsZVJlcG9zaXRvcnk6IEZpbGVSZXBvc2l0b3J5O1xuZXhwb3J0IGRlZmF1bHQgZmlsZVJlcG9zaXRvcnk7XG4iLCJpbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnO1xuZGVjbGFyZSBjb25zdCBsb2dnZXI6IExvZ2dlclNlcnZpY2U7XG5leHBvcnQgZGVmYXVsdCBsb2dnZXI7XG4iLCJpbXBvcnQgTWlncmF0b3JTZXJ2aWNlIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvTWlncmF0b3JTZXJ2aWNlLnRzJztcbmRlY2xhcmUgY29uc3QgbWlncmF0b3I6IE1pZ3JhdG9yU2VydmljZTtcbmV4cG9ydCBkZWZhdWx0IG1pZ3JhdG9yO1xuIiwiaW1wb3J0IFBlcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeSBmcm9tICcjc2VydmVyL3JlcG9zaXRvcmllcy9QZXJtaXNzaW9uQXNzaWdubWVudFJlcG9zaXRvcnkudHMnO1xuZGVjbGFyZSBjb25zdCBwZXJtaXNzaW9uQXNzaWdubWVudFJlcG9zaXRvcnk6IFBlcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeTtcbmV4cG9ydCBkZWZhdWx0IHBlcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeTtcbiIsImltcG9ydCBQZXJtaXNzaW9uUmVwb3NpdG9yeSBmcm9tICcjc2VydmVyL3JlcG9zaXRvcmllcy9QZXJtaXNzaW9uUmVwb3NpdG9yeS50cyc7XG5kZWNsYXJlIGNvbnN0IHBlcm1pc3Npb25SZXBvc2l0b3J5OiBQZXJtaXNzaW9uUmVwb3NpdG9yeTtcbmV4cG9ydCBkZWZhdWx0IHBlcm1pc3Npb25SZXBvc2l0b3J5O1xuIiwiaW1wb3J0IHR5cGUgeyBIdHRwQ29udGV4dCB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0h0dHBDb250ZXh0Q29udHJhY3QudHMnO1xuaW1wb3J0IFJvdXRlclNlcnZpY2UgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9Sb3V0ZXJTZXJ2aWNlLnRzJztcbmRlY2xhcmUgY29uc3Qgcm91dGVyOiBSb3V0ZXJTZXJ2aWNlPEh0dHBDb250ZXh0PjtcbmV4cG9ydCBkZWZhdWx0IHJvdXRlcjtcbiIsImltcG9ydCBTaGVsbFNlcnZpY2UgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9TaGVsbFNlcnZpY2UudHMnO1xuZGVjbGFyZSBjb25zdCBzaGVsbDogU2hlbGxTZXJ2aWNlO1xuZXhwb3J0IGRlZmF1bHQgc2hlbGw7XG4iLCJpbXBvcnQgVG9rZW5SZXBvc2l0b3J5IGZyb20gJyNzZXJ2ZXIvcmVwb3NpdG9yaWVzL1Rva2VuUmVwb3NpdG9yeS50cyc7XG5kZWNsYXJlIGNvbnN0IHRva2VuUmVwb3NpdG9yeTogVG9rZW5SZXBvc2l0b3J5O1xuZXhwb3J0IGRlZmF1bHQgdG9rZW5SZXBvc2l0b3J5O1xuIiwiaW1wb3J0IFVzZXJSZXBvc2l0b3J5IGZyb20gJyNzZXJ2ZXIvcmVwb3NpdG9yaWVzL1VzZXJSZXBvc2l0b3J5LnRzJztcbmRlY2xhcmUgY29uc3QgdXNlclJlcG9zaXRvcnk6IFVzZXJSZXBvc2l0b3J5O1xuZXhwb3J0IGRlZmF1bHQgdXNlclJlcG9zaXRvcnk7XG4iLCJpbXBvcnQgdHlwZSB7IEt5c2VseSB9IGZyb20gJ2t5c2VseSc7XG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29udHJhY3QgfSBmcm9tICcuL0RhdGFiYXNlQ29udHJhY3QnO1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYmFzZUt5c2VseSBleHRlbmRzIEt5c2VseTxEYXRhYmFzZUNvbnRyYWN0PiB7XG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIExvYWRlcjxUID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGxvYWQoZW50aXRpZXM6IFRbXSk6IFByb21pc2U8dm9pZD47XG59XG5leHBvcnQgaW50ZXJmYWNlIExvYWRlclJlY29yZDxUID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIFtrZXk6IHN0cmluZ106IExvYWRlcjxUPjtcbn1cbmV4cG9ydCBkZWNsYXJlIGZ1bmN0aW9uIGRlZmluZUxvYWRlcjxUID0gUmVjb3JkPHN0cmluZywgYW55Pj4obG9hZGVyOiBMb2FkZXI8VD4pOiBMb2FkZXI8VD47XG4iLCJ0eXBlIEtleU9yRnVuY3Rpb248VD4gPSBrZXlvZiBUIHwgKChlbnRpdHk6IFQpID0+IGFueSk7XG5leHBvcnQgaW50ZXJmYWNlIEhhc01hbnlUaHJvdWdoTG9hZGVyT3B0aW9uczxURW50aXR5IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4sIFRQaXZvdEVudGl0eSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBUVGFyZ2V0RW50aXR5IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBrZXk6IHN0cmluZztcbiAgICBwaXZvdDoge1xuICAgICAgICBzb3VyY2VLZXk6IEtleU9yRnVuY3Rpb248VEVudGl0eT47XG4gICAgICAgIHRhcmdldEtleTogS2V5T3JGdW5jdGlvbjxUUGl2b3RFbnRpdHk+O1xuICAgICAgICBmaW5kRW50aXRpZXMoaWRzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogUHJvbWlzZTxUUGl2b3RFbnRpdHlbXT47XG4gICAgfTtcbiAgICB0YXJnZXQ6IHtcbiAgICAgICAgc291cmNlS2V5OiBLZXlPckZ1bmN0aW9uPFRQaXZvdEVudGl0eT47XG4gICAgICAgIHRhcmdldEtleTogS2V5T3JGdW5jdGlvbjxUVGFyZ2V0RW50aXR5PjtcbiAgICAgICAgZmluZEVudGl0aWVzKGlkczogKHN0cmluZyB8IG51bWJlcilbXSk6IFByb21pc2U8VFRhcmdldEVudGl0eVtdPjtcbiAgICB9O1xufVxuZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gbG9hZEhhc01hbnlUaHJvdWdoPFRFbnRpdHkgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PiwgVFBpdm90RW50aXR5IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4sIFRUYXJnZXRFbnRpdHkgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4ocGF5bG9hZDogYW55IHwgYW55W10sIG9wdGlvbnM6IEhhc01hbnlUaHJvdWdoTG9hZGVyT3B0aW9uczxURW50aXR5LCBUUGl2b3RFbnRpdHksIFRUYXJnZXRFbnRpdHk+KTogUHJvbWlzZTx2b2lkPjtcbmV4cG9ydCBkZWNsYXJlIGZ1bmN0aW9uIGNyZWF0ZUhhc01hbnlUaHJvdWdoTG9hZGVyPFRFbnRpdHkgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PiwgVFBpdm90RW50aXR5IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4sIFRUYXJnZXRFbnRpdHkgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4ob3B0aW9uczogSGFzTWFueVRocm91Z2hMb2FkZXJPcHRpb25zPFRFbnRpdHksIFRQaXZvdEVudGl0eSwgVFRhcmdldEVudGl0eT4pOiBpbXBvcnQoXCIjc2VydmVyL3V0aWxzL2RlZmluZUxvYWRlci50c1wiKS5Mb2FkZXI8VEVudGl0eT47XG5leHBvcnQge307XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0RyaXZlQ29uZmlnRW50aXR5LnRzJztcbmRlY2xhcmUgY29uc3QgRHJpdmVDb25maWdfYmFzZTogdHlwZW9mIEJhc2UgJiB7XG4gICAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IHt9O1xuICAgIF9faXNDb25maWdNb2RlbDogYm9vbGVhbjtcbiAgICBzZXJpYWxpemU8VD4odGhpczogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVCwgcm93OiBhbnkpOiBQcm9taXNlPFQ+O1xuICAgIGxpc3Q8VD4odGhpczogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVCk6IFByb21pc2U8VFtdPjtcbiAgICBmaW5kPFQ+KHRoaXM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsIGlkOiBzdHJpbmcpOiBQcm9taXNlPFQgfCBudWxsPjtcbiAgICBmaW5kT3JGYWlsPFQ+KHRoaXM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsIGlkOiBzdHJpbmcpOiBQcm9taXNlPFQ+O1xuICAgIGNyZWF0ZTxUPih0aGlzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBULCBpdGVtOiBUICYge1xuICAgICAgICBpZDogc3RyaW5nO1xuICAgIH0pOiBQcm9taXNlPHZvaWQ+O1xuICAgIHVwZGF0ZTxUPih0aGlzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBULCBpZDogc3RyaW5nLCBkYXRhOiBUKTogUHJvbWlzZTx2b2lkPjtcbiAgICB1cGRhdGVPckNyZWF0ZTxUPih0aGlzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBULCBpZDogc3RyaW5nLCBkYXRhOiBQYXJ0aWFsPFQ+KTogUHJvbWlzZTx2b2lkPjtcbiAgICBkZXN0cm95PFQ+KHRoaXM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsIGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xufSAmIGltcG9ydChcIiNzaGFyZWQvdXRpbHMvY29tcG9zZS50c1wiKS5Db25zdHJ1Y3RvcjtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyaXZlQ29uZmlnIGV4dGVuZHMgRHJpdmVDb25maWdfYmFzZSB7XG4gICAgc3RhdGljIHNlcmlhbGl6ZTxUPih0aGlzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBULCByb3c6IGFueSk6IFByb21pc2U8VD47XG59XG5leHBvcnQge307XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0ZpbGVFbnRpdHkudHMnO1xuaW1wb3J0IHR5cGUgeyBEcml2ZVVybE9wdGlvbnMgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9Ecml2ZUNvbnRyYWN0LnRzJztcbmludGVyZmFjZSBVUkxDYWNoZSB7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgZXhwaXJlczogbnVtYmVyO1xufVxuZGVjbGFyZSBjb25zdCBGaWxlX2Jhc2U6IHR5cGVvZiBCYXNlICYge1xuICAgIG5ldyAoLi4uYXJnczogYW55W10pOiB7XG4gICAgICAgIGxpc3RlbmVyczogaW1wb3J0KFwiI3NoYXJlZC9taXhpbnMvSG9va3NNaXhpbi50c1wiKS5MaXN0ZW5lcltdO1xuICAgICAgICBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdm9pZDtcbiAgICAgICAgb2ZmKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB2b2lkO1xuICAgICAgICBlbWl0KGV2ZW50OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogdm9pZDtcbiAgICAgICAgZW1pdEFzeW5jKGV2ZW50OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPjtcbiAgICB9O1xufSAmIGltcG9ydChcIiNzaGFyZWQvdXRpbHMvY29tcG9zZS50c1wiKS5Db25zdHJ1Y3RvciAmIHtcbiAgICBuZXcgKC4uLmFyZ3M6IGFueVtdKToge1xuICAgICAgICBzYXZlKCk6IFByb21pc2U8dm9pZD47XG4gICAgICAgIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPjtcbiAgICAgICAgc29mdERlbGV0ZSgpOiBQcm9taXNlPHZvaWQ+O1xuICAgIH07XG4gICAgX19tb2RlbDoge1xuICAgICAgICB0YWJsZTogXCJmaWxlc1wiO1xuICAgICAgICBwcmltYXJ5S2V5OiBrZXlvZiBpbXBvcnQoXCIuLi9pbmRleC50c1wiKS5GaWxlVGFibGU7XG4gICAgfTtcbiAgICBzZXJpYWxpemU8VD4odGhpczogbmV3ICgpID0+IFQsIHJvdzogYW55KTogUHJvbWlzZTxUPjtcbiAgICBzZWxlY3QoKTogaW1wb3J0KFwia3lzZWx5XCIpLlNlbGVjdFF1ZXJ5QnVpbGRlcjxpbXBvcnQoXCIuLi9pbmRleC50c1wiKS5EYXRhYmFzZUNvbnRyYWN0LCBcImZpbGVzXCIsIGFueT47XG4gICAgcGFnaW5hdGU8VD4odGhpczogbmV3ICgpID0+IFQsIG8/OiBpbXBvcnQoXCIjc2VydmVyL21peGlucy9Nb2RlbE1peGluLnRzXCIpLk1vZGVsUGFnaW5hdGVPcHRpb25zPFwiZmlsZXNcIj4gfCB1bmRlZmluZWQpOiBQcm9taXNlPGltcG9ydChcIi4uLy4uL3NoYXJlZC9pbmRleC50c1wiKS5QYWdpbmF0aW9uRW50aXR5PFQ+PjtcbiAgICBsaXN0PFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBvPzogaW1wb3J0KFwiI3NlcnZlci9taXhpbnMvTW9kZWxNaXhpbi50c1wiKS5Nb2RlbExpc3RPcHRpb25zPFwiZmlsZXNcIj4gfCB1bmRlZmluZWQpOiBQcm9taXNlPFRbXT47XG4gICAgZmluZE9uZTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbz86IGltcG9ydChcIiNzZXJ2ZXIvbWl4aW5zL01vZGVsTWl4aW4udHNcIikuTW9kZWxGaW5kT3B0aW9uczxcImZpbGVzXCI+IHwgdW5kZWZpbmVkKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPjtcbiAgICBmaW5kT25lT3JGYWlsPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBvPzogaW1wb3J0KFwiI3NlcnZlci9taXhpbnMvTW9kZWxNaXhpbi50c1wiKS5Nb2RlbEZpbmRPcHRpb25zPFwiZmlsZXNcIj4gfCB1bmRlZmluZWQpOiBQcm9taXNlPFQ+O1xuICAgIGZpbmQ8VD4odGhpczogbmV3ICgpID0+IFQsIGlkOiBhbnkpOiBQcm9taXNlPFQgfCBudWxsPjtcbiAgICBmaW5kT3JGYWlsPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBpZDogYW55KTogUHJvbWlzZTxUPjtcbiAgICBmaW5kQnk8VD4odGhpczogbmV3ICgpID0+IFQsIGNvbHVtbjoga2V5b2YgaW1wb3J0KFwiLi4vaW5kZXgudHNcIikuRmlsZVRhYmxlLCB2YWx1ZTogYW55KTogUHJvbWlzZTxUPjtcbiAgICBmaW5kQnlPckZhaWw8VD4odGhpczogbmV3ICgpID0+IFQsIGNvbHVtbjoga2V5b2YgaW1wb3J0KFwiLi4vaW5kZXgudHNcIikuRmlsZVRhYmxlLCB2YWx1ZTogYW55KTogUHJvbWlzZTxUPjtcbiAgICBleGlzdHM8VD4odGhpczogbmV3ICgpID0+IFQsIG8/OiBpbXBvcnQoXCIjc2VydmVyL21peGlucy9Nb2RlbE1peGluLnRzXCIpLk1vZGVsTGlzdE9wdGlvbnM8XCJmaWxlc1wiPiB8IHVuZGVmaW5lZCk6IFByb21pc2U8Ym9vbGVhbj47XG4gICAgY291bnQ8VD4odGhpczogbmV3ICgpID0+IFQsIG8/OiBpbXBvcnQoXCIjc2VydmVyL21peGlucy9Nb2RlbE1peGluLnRzXCIpLk1vZGVsQ291bnRPcHRpb25zPFwiZmlsZXNcIj4gfCB1bmRlZmluZWQpOiBQcm9taXNlPG51bWJlcj47XG4gICAgY3JlYXRlPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBwYXlsb2FkOiBvYmplY3QgJiB7XG4gICAgICAgIGRyaXZlOiBzdHJpbmc7XG4gICAgICAgIG1pbWV0eXBlOiBzdHJpbmc7XG4gICAgICAgIGNsaWVudF9uYW1lOiBzdHJpbmc7XG4gICAgICAgIGZpbGVuYW1lOiBzdHJpbmc7XG4gICAgICAgIHB1cnBvc2U6IHN0cmluZztcbiAgICAgICAgcHVibGljOiBib29sZWFuO1xuICAgIH0gJiB7XG4gICAgICAgIGlkPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBjcmVhdGVkX2F0Pzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICB1cGRhdGVkX2F0Pzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBkZWxldGVkX2F0Pzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICB9KTogUHJvbWlzZTxUPjtcbiAgICBjcmVhdGVNYW55PFQ+KHRoaXM6IG5ldyAoKSA9PiBULCB2YWx1ZXM6IChvYmplY3QgJiB7XG4gICAgICAgIGRyaXZlOiBzdHJpbmc7XG4gICAgICAgIG1pbWV0eXBlOiBzdHJpbmc7XG4gICAgICAgIGNsaWVudF9uYW1lOiBzdHJpbmc7XG4gICAgICAgIGZpbGVuYW1lOiBzdHJpbmc7XG4gICAgICAgIHB1cnBvc2U6IHN0cmluZztcbiAgICAgICAgcHVibGljOiBib29sZWFuO1xuICAgIH0gJiB7XG4gICAgICAgIGlkPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBjcmVhdGVkX2F0Pzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICB1cGRhdGVkX2F0Pzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBkZWxldGVkX2F0Pzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICB9KVtdKTogUHJvbWlzZTxUW10+O1xuICAgIHVwZGF0ZTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbzogaW1wb3J0KFwiI3NlcnZlci9taXhpbnMvTW9kZWxNaXhpbi50c1wiKS5Nb2RlbFVwZGF0ZU9wdGlvbnM8XCJmaWxlc1wiPik6IFByb21pc2U8VD47XG4gICAgdXBkYXRlQnlJZDxUPih0aGlzOiBuZXcgKCkgPT4gVCwgaWQ6IGFueSwgdmFsdWVzOiB7XG4gICAgICAgIGlkPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBkZWxldGVkX2F0PzogbnVsbCB8IHVuZGVmaW5lZDtcbiAgICAgICAgZHJpdmU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIG1pbWV0eXBlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBjbGllbnRfbmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgZmlsZW5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIHB1cnBvc2U/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIHB1YmxpYz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgfSwgb3B0aW9ucz86IHtcbiAgICAgICAgZGVidWc/OiBib29sZWFuO1xuICAgIH0gfCB1bmRlZmluZWQpOiBQcm9taXNlPFQ+O1xuICAgIGRlc3Ryb3k8VD4odGhpczogbmV3ICgpID0+IFQsIG8/OiBpbXBvcnQoXCIjc2VydmVyL21peGlucy9Nb2RlbE1peGluLnRzXCIpLk1vZGVsRGVzdHJveU9wdGlvbnM8XCJmaWxlc1wiPiB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD47XG4gICAgZmlyc3RPckNyZWF0ZTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbzogaW1wb3J0KFwiI3NlcnZlci9taXhpbnMvTW9kZWxNaXhpbi50c1wiKS5Nb2RlbEZpcnN0T3JDcmVhdGVPcHRpb25zPFwiZmlsZXNcIj4pOiBUO1xuICAgIHVwZGF0ZU9yQ3JlYXRlPFQ+KHRoaXM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsIG86IGltcG9ydChcIiNzZXJ2ZXIvbWl4aW5zL01vZGVsTWl4aW4udHNcIikuTW9kZWxVcGRhdGVPckNyZWF0ZU9wdGlvbnM8XCJmaWxlc1wiPik6IFQ7XG4gICAgZGVzdHJveUJ5SWQ8VD4odGhpczogbmV3ICgpID0+IFQsIGlkOiBhbnkpOiBQcm9taXNlPHZvaWQ+O1xufSAmIHtcbiAgICBuZXcgKC4uLmFyZ3M6IGFueVtdKToge307XG4gICAgbG9hZDxUPih0aGlzOiBuZXcgKCkgPT4gVCwgZW50aXRpZXM6IFQgfCBUW10sIG5hbWVzOiBcIm1ldGFzXCIgfCBcIm1ldGFzXCJbXSk6IFByb21pc2U8dm9pZD47XG59ICYge1xuICAgIG5ldyAoLi4uYXJnczogYW55W10pOiB7XG4gICAgICAgIGdldDxUID0gYW55PihuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+O1xuICAgICAgICBnZXQ8VCA9IGFueT4obmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IFQpOiBQcm9taXNlPFQ+O1xuICAgICAgICBzZXQobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJvbWlzZTx2b2lkPjtcbiAgICB9O1xufTtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbGUgZXh0ZW5kcyBGaWxlX2Jhc2Uge1xuICAgIHN0YXRpYyBjYWNoZTogTWFwPHN0cmluZywgVVJMQ2FjaGU+O1xuICAgIHN0YXRpYyBoYXMoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj47XG4gICAgc3RhdGljIGZpbmRCeUZpbGVuYW1lKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEZpbGUgfCB1bmRlZmluZWQ+O1xuICAgIHJlYWRTdHJlYW0oKTogUHJvbWlzZTxOb2RlSlMuUmVhZGFibGVTdHJlYW0+O1xuICAgIHJlYWQoKTogUHJvbWlzZTxVaW50OEFycmF5PEFycmF5QnVmZmVyTGlrZT4+O1xuICAgIGxvYWRVcmwob3B0aW9ucz86IERyaXZlVXJsT3B0aW9ucyk6IFByb21pc2U8dm9pZD47XG4gICAgc3RhdGljIGxvYWRVcmxzKGl0ZW1zOiBGaWxlW10sIG9wdGlvbnM/OiBEcml2ZVVybE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHN0YXRpYyBsb2FkTWV0YXMoaXRlbXM6IEZpbGVbXSk6IFByb21pc2U8dm9pZD47XG4gICAgZGVsZXRlRnJvbURyaXZlKCk6IFByb21pc2U8dm9pZD47XG59XG5leHBvcnQge307XG4iLCJpbXBvcnQgQmFzZU1ldGEgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9GaWxlTWV0YUVudGl0eS50cyc7XG5kZWNsYXJlIGNvbnN0IEZpbGVNZXRhX2Jhc2U6IHR5cGVvZiBCYXNlTWV0YSAmIHtcbiAgICBuZXcgKC4uLmFyZ3M6IGFueVtdKToge1xuICAgICAgICBzYXZlKCk6IFByb21pc2U8dm9pZD47XG4gICAgICAgIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPjtcbiAgICAgICAgc29mdERlbGV0ZSgpOiBQcm9taXNlPHZvaWQ+O1xuICAgIH07XG4gICAgX19tb2RlbDoge1xuICAgICAgICB0YWJsZTogXCJmaWxlX21ldGFzXCI7XG4gICAgICAgIHByaW1hcnlLZXk6IGtleW9mIGltcG9ydChcIi4uXCIpLkZpbGVNZXRhVGFibGU7XG4gICAgfTtcbiAgICBzZXJpYWxpemU8VD4odGhpczogbmV3ICgpID0+IFQsIHJvdzogYW55KTogUHJvbWlzZTxUPjtcbiAgICBzZWxlY3QoKTogaW1wb3J0KFwia3lzZWx5XCIpLlNlbGVjdFF1ZXJ5QnVpbGRlcjxpbXBvcnQoXCIuLlwiKS5EYXRhYmFzZUNvbnRyYWN0LCBcImZpbGVfbWV0YXNcIiwgYW55PjtcbiAgICBwYWdpbmF0ZTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbz86IGltcG9ydChcIiNzZXJ2ZXIvbWl4aW5zL01vZGVsTWl4aW4udHNcIikuTW9kZWxQYWdpbmF0ZU9wdGlvbnM8XCJmaWxlX21ldGFzXCI+IHwgdW5kZWZpbmVkKTogUHJvbWlzZTxpbXBvcnQoXCIuLi8uLi9zaGFyZWRcIikuUGFnaW5hdGlvbkVudGl0eTxUPj47XG4gICAgbGlzdDxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbz86IGltcG9ydChcIiNzZXJ2ZXIvbWl4aW5zL01vZGVsTWl4aW4udHNcIikuTW9kZWxMaXN0T3B0aW9uczxcImZpbGVfbWV0YXNcIj4gfCB1bmRlZmluZWQpOiBQcm9taXNlPFRbXT47XG4gICAgZmluZE9uZTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbz86IGltcG9ydChcIiNzZXJ2ZXIvbWl4aW5zL01vZGVsTWl4aW4udHNcIikuTW9kZWxGaW5kT3B0aW9uczxcImZpbGVfbWV0YXNcIj4gfCB1bmRlZmluZWQpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+O1xuICAgIGZpbmRPbmVPckZhaWw8VD4odGhpczogbmV3ICgpID0+IFQsIG8/OiBpbXBvcnQoXCIjc2VydmVyL21peGlucy9Nb2RlbE1peGluLnRzXCIpLk1vZGVsRmluZE9wdGlvbnM8XCJmaWxlX21ldGFzXCI+IHwgdW5kZWZpbmVkKTogUHJvbWlzZTxUPjtcbiAgICBmaW5kPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBpZDogYW55KTogUHJvbWlzZTxUIHwgbnVsbD47XG4gICAgZmluZE9yRmFpbDxUPih0aGlzOiBuZXcgKCkgPT4gVCwgaWQ6IGFueSk6IFByb21pc2U8VD47XG4gICAgZmluZEJ5PFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBjb2x1bW46IGtleW9mIGltcG9ydChcIi4uXCIpLkZpbGVNZXRhVGFibGUsIHZhbHVlOiBhbnkpOiBQcm9taXNlPFQ+O1xuICAgIGZpbmRCeU9yRmFpbDxUPih0aGlzOiBuZXcgKCkgPT4gVCwgY29sdW1uOiBrZXlvZiBpbXBvcnQoXCIuLlwiKS5GaWxlTWV0YVRhYmxlLCB2YWx1ZTogYW55KTogUHJvbWlzZTxUPjtcbiAgICBleGlzdHM8VD4odGhpczogbmV3ICgpID0+IFQsIG8/OiBpbXBvcnQoXCIjc2VydmVyL21peGlucy9Nb2RlbE1peGluLnRzXCIpLk1vZGVsTGlzdE9wdGlvbnM8XCJmaWxlX21ldGFzXCI+IHwgdW5kZWZpbmVkKTogUHJvbWlzZTxib29sZWFuPjtcbiAgICBjb3VudDxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbz86IGltcG9ydChcIiNzZXJ2ZXIvbWl4aW5zL01vZGVsTWl4aW4udHNcIikuTW9kZWxDb3VudE9wdGlvbnM8XCJmaWxlX21ldGFzXCI+IHwgdW5kZWZpbmVkKTogUHJvbWlzZTxudW1iZXI+O1xuICAgIGNyZWF0ZTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgcGF5bG9hZDogb2JqZWN0ICYge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGZpbGVfaWQ6IG51bWJlcjtcbiAgICB9ICYge1xuICAgICAgICBpZD86IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgdmFsdWU/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgICAgICBjcmVhdGVkX2F0Pzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICB1cGRhdGVkX2F0Pzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBkZWxldGVkX2F0Pzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICB9KTogUHJvbWlzZTxUPjtcbiAgICBjcmVhdGVNYW55PFQ+KHRoaXM6IG5ldyAoKSA9PiBULCB2YWx1ZXM6IChvYmplY3QgJiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgZmlsZV9pZDogbnVtYmVyO1xuICAgIH0gJiB7XG4gICAgICAgIGlkPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICB2YWx1ZT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNyZWF0ZWRfYXQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIHVwZGF0ZWRfYXQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGRlbGV0ZWRfYXQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIH0pW10pOiBQcm9taXNlPFRbXT47XG4gICAgdXBkYXRlPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBvOiBpbXBvcnQoXCIjc2VydmVyL21peGlucy9Nb2RlbE1peGluLnRzXCIpLk1vZGVsVXBkYXRlT3B0aW9uczxcImZpbGVfbWV0YXNcIj4pOiBQcm9taXNlPFQ+O1xuICAgIHVwZGF0ZUJ5SWQ8VD4odGhpczogbmV3ICgpID0+IFQsIGlkOiBhbnksIHZhbHVlczoge1xuICAgICAgICBpZD86IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgbmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgdmFsdWU/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgICAgICBmaWxlX2lkPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBkZWxldGVkX2F0PzogbnVsbCB8IHVuZGVmaW5lZDtcbiAgICB9LCBvcHRpb25zPzoge1xuICAgICAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgfSB8IHVuZGVmaW5lZCk6IFByb21pc2U8VD47XG4gICAgZGVzdHJveTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbz86IGltcG9ydChcIiNzZXJ2ZXIvbWl4aW5zL01vZGVsTWl4aW4udHNcIikuTW9kZWxEZXN0cm95T3B0aW9uczxcImZpbGVfbWV0YXNcIj4gfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGZpcnN0T3JDcmVhdGU8VD4odGhpczogbmV3ICgpID0+IFQsIG86IGltcG9ydChcIiNzZXJ2ZXIvbWl4aW5zL01vZGVsTWl4aW4udHNcIikuTW9kZWxGaXJzdE9yQ3JlYXRlT3B0aW9uczxcImZpbGVfbWV0YXNcIj4pOiBUO1xuICAgIHVwZGF0ZU9yQ3JlYXRlPFQ+KHRoaXM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsIG86IGltcG9ydChcIiNzZXJ2ZXIvbWl4aW5zL01vZGVsTWl4aW4udHNcIikuTW9kZWxVcGRhdGVPckNyZWF0ZU9wdGlvbnM8XCJmaWxlX21ldGFzXCI+KTogVDtcbiAgICBkZXN0cm95QnlJZDxUPih0aGlzOiBuZXcgKCkgPT4gVCwgaWQ6IGFueSk6IFByb21pc2U8dm9pZD47XG59ICYgaW1wb3J0KFwiI3NoYXJlZC91dGlscy9jb21wb3NlLnRzXCIpLkNvbnN0cnVjdG9yO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmlsZU1ldGEgZXh0ZW5kcyBGaWxlTWV0YV9iYXNlIHtcbn1cbmV4cG9ydCB7fTtcbiIsImltcG9ydCB7IEdpdEdhdGV3YXkgfSBmcm9tICcjc2VydmVyL2dhdGV3YXlzL0dpdEdhdGV3YXkudHMnO1xuaW1wb3J0IEJhc2UgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Nb2R1bGVFbnRpdHkudHMnO1xuaW1wb3J0IHNoZWxsIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9zaGVsbC50cyc7XG5kZWNsYXJlIGNvbnN0IE1vZHVsZV9iYXNlOiB0eXBlb2YgQmFzZTtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZHVsZSBleHRlbmRzIE1vZHVsZV9iYXNlIHtcbiAgICBnZXQgZ2l0KCk6IEdpdEdhdGV3YXk7XG4gICAgbWFrZVBhdGgoLi4ucGFydHM6IHN0cmluZ1tdKTogc3RyaW5nO1xuICAgIHN0YXRpY1BhdGgoLi4ucGFydHM6IHN0cmluZ1tdKTogc3RyaW5nO1xuICAgIGNvbW1hbmQ6IHR5cGVvZiBzaGVsbC5jb21tYW5kO1xuICAgIGxvYWQoKTogdm9pZDtcbiAgICBmaW5kQ2xpZW50RW50cnlwb2ludEZpbGVuYW1lKGNvbnRleHQ/OiAnZGV2JyB8ICdub2RlJyB8ICdicm93c2VyJyk6IHN0cmluZyB8IG51bGw7XG59XG5leHBvcnQge307XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL1BsdWdpbkVudGl0eS50cyc7XG5kZWNsYXJlIGNvbnN0IFBsdWdpbkVudHJ5RW50aXR5X2Jhc2U6IHR5cGVvZiBCYXNlO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luRW50cnlFbnRpdHkgZXh0ZW5kcyBQbHVnaW5FbnRyeUVudGl0eV9iYXNlIHtcbiAgICBkaXJlY3Rvcnk6IHN0cmluZztcbiAgICBtYWtlUGF0aCguLi5wYXJ0czogc3RyaW5nW10pOiBzdHJpbmc7XG59XG5leHBvcnQge307XG4iLCJpbXBvcnQgUGx1Z2luRW50cnlFbnRpdHkgZnJvbSAnLi9QbHVnaW5FbnRyeUVudGl0eS50cyc7XG5pbXBvcnQgdHlwZSB7IFJvdXRlckV2ZW50cyB9IGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvUm91dGVyU2VydmljZS50cyc7XG5pbnRlcmZhY2UgQWRkQXBpRm9sZGVyT3B0aW9ucyB7XG4gICAgcHJlZml4Pzogc3RyaW5nO1xufVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luRW50aXR5IGV4dGVuZHMgUGx1Z2luRW50cnlFbnRpdHkge1xuICAgIGFwaUZvbGRlcnM6IE1hcDxzdHJpbmcsIEFkZEFwaUZvbGRlck9wdGlvbnM+O1xuICAgIGFwaURpcmVjdG9yaWVzOiBTZXQ8c3RyaW5nPjtcbiAgICBjb25zdHJ1Y3RvcigpO1xuICAgIHN0YXRpY1BhdGgoLi4ucGFydHM6IHN0cmluZ1tdKTogc3RyaW5nO1xuICAgIGxvYWQoKTogUHJvbWlzZTx2b2lkPjtcbiAgICBvblJvdXRlclJlZ2lzdGVyZWQoY3R4OiBSb3V0ZXJFdmVudHNbJ3JvdXRlcjpyZWdpc3RlcmVkJ10pOiBQcm9taXNlPHZvaWQ+O1xuICAgIGFkZEFwaUZvbGRlcihkaXJlY3Rvcnk6IHN0cmluZywgb3B0aW9ucz86IEFkZEFwaUZvbGRlck9wdGlvbnMpOiB2b2lkO1xuICAgIGFkZFJvdXRlckZvbGRlcihkaXJlY3Rvcnk6IHN0cmluZyk6IHZvaWQ7XG4gICAgc3RhdGljIGZyb21QbHVnaW5EaXNjb3ZlckVudGl0eTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgZW50aXR5OiBQbHVnaW5FbnRyeUVudGl0eSk6IFQ7XG59XG5leHBvcnQge307XG4iLCJpbXBvcnQgdHlwZSB7IExpc3RPcHRpb25zIH0gZnJvbSAnLi9saXN0LnRzJztcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyBEYXRhYmFzZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RhdGFiYXNlQ29udHJhY3QudHMnO1xuZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gZXhpc3RzPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSwgTyBleHRlbmRzIExpc3RPcHRpb25zPFQ+Pih0YWJsZTogVCwgb3B0aW9ucz86IE8pOiBQcm9taXNlPGJvb2xlYW4+O1xuIiwiZGVjbGFyZSBtb2R1bGUgJ2t5c2VseScge1xuICAgIGludGVyZmFjZSBDcmVhdGVUYWJsZUJ1aWxkZXI8VEIgZXh0ZW5kcyBzdHJpbmcsIEMgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlcj4ge1xuICAgICAgICBhZGRJZENvbHVtbjxDTiBleHRlbmRzIHN0cmluZyA9ICdpZCc+KGNvbD86IENOKTogQ3JlYXRlVGFibGVCdWlsZGVyPFRCLCBDIHwgQ04+O1xuICAgIH1cbn1cbmV4cG9ydCB7fTtcbiIsImltcG9ydCB7IENyZWF0ZVRhYmxlQnVpbGRlciB9IGZyb20gJ2t5c2VseSc7XG5pbXBvcnQgdHlwZSB7IENvbHVtblR5cGUsIEV4cHJlc3Npb25CdWlsZGVyIH0gZnJvbSAna3lzZWx5JztcbmltcG9ydCB0eXBlIHsgU2VsZWN0YWJsZSB9IGZyb20gJ2t5c2VseSc7XG5pbXBvcnQgeyBub3cgfSBmcm9tICcuL2NvbW1vbi50cyc7XG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29udHJhY3QgYXMgRGF0YWJhc2UgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJztcbmltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnO1xudHlwZSBXaGVyZUNhcGFibGU8UUI+ID0ge1xuICAgIHdoZXJlOiAoLi4uYXJnczogYW55W10pID0+IFFCO1xufTtcbnR5cGUgVXBkYXRlRnJvbTxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gUmV0dXJuVHlwZTx0eXBlb2YgZGIudXBkYXRlVGFibGU8VD4+O1xuZXhwb3J0IGludGVyZmFjZSBTb2Z0RGVsZXRlT3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+IHtcbiAgICBzZXJpYWxpemU/OiAocm93OiBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPikgPT4gYW55O1xuICAgIHF1ZXJ5OiAocWI6IFVwZGF0ZUZyb208VD4pID0+IFVwZGF0ZUZyb208VD47XG59XG5leHBvcnQgdHlwZSBTb2Z0RGVsZXRlUmVzdWx0PFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSwgTyBleHRlbmRzIFNvZnREZWxldGVPcHRpb25zPFQ+IHwgdW5kZWZpbmVkPiA9IE8gZXh0ZW5kcyB1bmRlZmluZWQgPyBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPltdIDogTyBleHRlbmRzIHtcbiAgICBzZXJpYWxpemU6IChyb3c6IFNlbGVjdGFibGU8RGF0YWJhc2VbVF0+KSA9PiBpbmZlciBSO1xufSA/IFJbXSA6IFNlbGVjdGFibGU8RGF0YWJhc2VbVF0+W107XG5leHBvcnQgaW50ZXJmYWNlIFNvZnREZWxldGVUYWJsZSB7XG4gICAgZGVsZXRlZF9hdDogQ29sdW1uVHlwZTxEYXRlIHwgbnVsbCwgbmV2ZXIgfCBudWxsIHwgUmV0dXJuVHlwZTx0eXBlb2Ygbm93Piwgc3RyaW5nIHwgbnVsbCB8IFJldHVyblR5cGU8dHlwZW9mIG5vdz4+O1xufVxuZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gd2hlcmVOb3REZWxldGVkPFFCIGV4dGVuZHMgV2hlcmVDYXBhYmxlPFFCPj4ocWI6IFFCKTogUUI7XG5leHBvcnQgZGVjbGFyZSBmdW5jdGlvbiB1bmRlbGV0ZWQocWI6IEV4cHJlc3Npb25CdWlsZGVyPGFueSwgYW55Pik6IGltcG9ydChcImt5c2VseVwiKS5FeHByZXNzaW9uV3JhcHBlcjxhbnksIGFueSwgaW1wb3J0KFwia3lzZWx5XCIpLlNxbEJvb2w+O1xuZXhwb3J0IGRlY2xhcmUgbmFtZXNwYWNlIHVuZGVsZXRlZCB7XG4gICAgdmFyIGNvbHVtbjogKGNvbDogc3RyaW5nKSA9PiAocWI6IEV4cHJlc3Npb25CdWlsZGVyPGFueSwgYW55PikgPT4gaW1wb3J0KFwia3lzZWx5XCIpLkV4cHJlc3Npb25XcmFwcGVyPGFueSwgYW55LCBpbXBvcnQoXCJreXNlbHlcIikuU3FsQm9vbD47XG59XG5leHBvcnQgZGVjbGFyZSBjb25zdCBkZWxldGVkOiAocWI6IEV4cHJlc3Npb25CdWlsZGVyPGFueSwgYW55PikgPT4gaW1wb3J0KFwia3lzZWx5XCIpLkV4cHJlc3Npb25XcmFwcGVyPGFueSwgYW55LCBpbXBvcnQoXCJreXNlbHlcIikuU3FsQm9vbD47XG5leHBvcnQgZGVjbGFyZSBjb25zdCBhZGRTb2Z0RGVsZXRlQ29sdW1uOiAoY3RiOiBDcmVhdGVUYWJsZUJ1aWxkZXI8YW55LCBhbnk+KSA9PiBDcmVhdGVUYWJsZUJ1aWxkZXI8YW55LCBhbnk+O1xuZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gc29mdERlbGV0ZTxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBTb2Z0RGVsZXRlT3B0aW9uczxUPj4odGFibGU6IFQsIG9wdGlvbnM/OiBPKTogUHJvbWlzZTxTb2Z0RGVsZXRlUmVzdWx0PFQsIE8+PjtcbmRlY2xhcmUgbW9kdWxlICdreXNlbHknIHtcbiAgICBpbnRlcmZhY2UgQ3JlYXRlVGFibGVCdWlsZGVyPFRCIGV4dGVuZHMgc3RyaW5nLCBDIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXI+IHtcbiAgICAgICAgYWRkU29mdERlbGV0ZUNvbHVtbigpOiBDcmVhdGVUYWJsZUJ1aWxkZXI8VEIsIEMgfCAnZGVsZXRlZF9hdCc+O1xuICAgIH1cbn1cbmV4cG9ydCB7fTtcbiIsImltcG9ydCB7IENyZWF0ZVRhYmxlQnVpbGRlciB9IGZyb20gJ2t5c2VseSc7XG5pbXBvcnQgdHlwZSB7IENvbHVtblR5cGUgfSBmcm9tICdreXNlbHknO1xuaW1wb3J0IHsgbm93IH0gZnJvbSAnLi9jb21tb24udHMnO1xuZXhwb3J0IGludGVyZmFjZSBUaW1lc3RhbXBUYWJsZSB7XG4gICAgY3JlYXRlZF9hdDogQ29sdW1uVHlwZTxEYXRlLCBzdHJpbmcgfCB1bmRlZmluZWQsIG5ldmVyPjtcbiAgICB1cGRhdGVkX2F0OiBDb2x1bW5UeXBlPERhdGUsIHN0cmluZyB8IHVuZGVmaW5lZCwgRGF0ZSB8IHN0cmluZyB8IFJldHVyblR5cGU8dHlwZW9mIG5vdz4+O1xufVxuZXhwb3J0IGRlY2xhcmUgY29uc3QgYWRkQ3JlYXRlZENvbHVtbjogKGN0YjogQ3JlYXRlVGFibGVCdWlsZGVyPGFueSwgYW55PikgPT4gQ3JlYXRlVGFibGVCdWlsZGVyPGFueSwgYW55PjtcbmV4cG9ydCBkZWNsYXJlIGNvbnN0IGFkZFVwZGF0ZWRDb2x1bW46IChjdGI6IENyZWF0ZVRhYmxlQnVpbGRlcjxhbnksIGFueT4pID0+IENyZWF0ZVRhYmxlQnVpbGRlcjxhbnksIGFueT47XG5leHBvcnQgZGVjbGFyZSBjb25zdCBhZGRUaW1lc3RhbXBDb2x1bW5zOiAoY3RiOiBDcmVhdGVUYWJsZUJ1aWxkZXI8YW55LCBhbnk+KSA9PiBDcmVhdGVUYWJsZUJ1aWxkZXI8YW55LCBhbnk+O1xuZGVjbGFyZSBtb2R1bGUgJ2t5c2VseScge1xuICAgIGludGVyZmFjZSBDcmVhdGVUYWJsZUJ1aWxkZXI8VEIgZXh0ZW5kcyBzdHJpbmcsIEMgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlcj4ge1xuICAgICAgICBhZGRUaW1lc3RhbXBDb2x1bW5zKCk6IENyZWF0ZVRhYmxlQnVpbGRlcjxUQiwgQyB8ICdjcmVhdGVkX2F0JyB8ICd1cGRhdGVkX2F0Jz47XG4gICAgICAgIGFkZENyZWF0ZWRDb2x1bW4oKTogQ3JlYXRlVGFibGVCdWlsZGVyPFRCLCBDIHwgJ2NyZWF0ZWRfYXQnPjtcbiAgICAgICAgYWRkVXBkYXRlZENvbHVtbigpOiBDcmVhdGVUYWJsZUJ1aWxkZXI8VEIsIEMgfCAndXBkYXRlZF9hdCc+O1xuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgVG9rZW4sIFVzZXJFbnRpdHkgfSBmcm9tICdAc2lkZWtpY2stY29kZXIvemVuaXRoLWtpdC9zaGFyZWQnO1xuaW1wb3J0IHR5cGUgeyBNaWRkbGV3YXJlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvUm91dGVyQ29udHJhY3QudHMnO1xuZXhwb3J0IHR5cGUgQXV0aE1pZGRsZXdhcmVDb250ZXh0ID0ge1xuICAgIHVzZXI6IFVzZXJFbnRpdHk7XG4gICAgdG9rZW46IFRva2VuO1xufTtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF1dGhNaWRkbGV3YXJlIGltcGxlbWVudHMgTWlkZGxld2FyZSB7XG4gICAgaGFuZGxlKGN0eDogYW55KTogUHJvbWlzZTxBdXRoTWlkZGxld2FyZUNvbnRleHQ+O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBUb2tlbiB9IGZyb20gJ0BzaWRla2ljay1jb2Rlci96ZW5pdGgta2l0L3NoYXJlZCc7XG5pbXBvcnQgdHlwZSB7IE1pZGRsZXdhcmUgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9Sb3V0ZXJDb250cmFjdC50cyc7XG5pbXBvcnQgdHlwZSBVc2VyIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvVXNlckVudGl0eS50cyc7XG5pbXBvcnQgdHlwZSB7IEh0dHBDb250ZXh0IH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvSHR0cENvbnRleHRDb250cmFjdC50cyc7XG5leHBvcnQgdHlwZSBBdXRoU2lsZW5jZU1pZGRsZXdhcmVDb250ZXh0ID0ge1xuICAgIHVzZXI/OiBVc2VyO1xuICAgIHRva2VuPzogVG9rZW47XG59O1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXV0aFNpbGVuY2VNaWRkbGV3YXJlIGltcGxlbWVudHMgTWlkZGxld2FyZSB7XG4gICAgaGFuZGxlKGN0eDogSHR0cENvbnRleHQpOiBQcm9taXNlPEF1dGhTaWxlbmNlTWlkZGxld2FyZUNvbnRleHQ+O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBBdXRoU2lsZW5jZU1pZGRsZXdhcmVDb250ZXh0IH0gZnJvbSAnLi9BdXRoU2lsZW5jZU1pZGRsZXdhcmUudHMnO1xuaW1wb3J0IHR5cGUgeyBNaWRkbGV3YXJlLCBNaWRkbGV3YXJlSGFuZGxlUmVzdWx0IH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvUm91dGVyQ29udHJhY3QudHMnO1xuaW1wb3J0IEFjbCBmcm9tICcjc2VydmVyL2VudGl0aWVzL0FjbEVudGl0eS50cyc7XG5leHBvcnQgdHlwZSBBdXRob3JpemF0aW9uQ29udGV4dCA9IE1pZGRsZXdhcmVIYW5kbGVSZXN1bHQ8W0F1dGhvcml6YXRpb25NaWRkbGV3YXJlXT47XG5leHBvcnQgaW50ZXJmYWNlIEF1dGhvcml6ZVBlcm1pc3Npb25QYXlsb2FkIHtcbiAgICBhY3Rpb246IHN0cmluZztcbiAgICByZXNvdXJjZTogc3RyaW5nO1xuICAgIGNvbmRpdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgQXV0aG9yaXplUGVybWlzc2lvbiBpbXBsZW1lbnRzIE1pZGRsZXdhcmUge1xuICAgIHByaXZhdGUgcGVybWlzc2lvbnM7XG4gICAgY29uc3RydWN0b3IocGF5bG9hZDogQXV0aG9yaXplUGVybWlzc2lvblBheWxvYWQgfCBBdXRob3JpemVQZXJtaXNzaW9uUGF5bG9hZFtdKTtcbiAgICBoYW5kbGUoY3R4OiBBdXRob3JpemF0aW9uQ29udGV4dCk6IFByb21pc2U8dm9pZD47XG59XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBdXRob3JpemF0aW9uTWlkZGxld2FyZSBpbXBsZW1lbnRzIE1pZGRsZXdhcmUge1xuICAgIGhhbmRsZShjdHg6IEF1dGhTaWxlbmNlTWlkZGxld2FyZUNvbnRleHQpOiBQcm9taXNlPHtcbiAgICAgICAgYWNsOiBBY2w7XG4gICAgfT47XG4gICAgc3RhdGljIGNyZWF0ZShwYXlsb2FkOiBBdXRob3JpemVQZXJtaXNzaW9uUGF5bG9hZCB8IEF1dGhvcml6ZVBlcm1pc3Npb25QYXlsb2FkW10pOiBBdXRob3JpemVQZXJtaXNzaW9uO1xufVxuIiwiZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gYmFzZVBhdGgoLi4uYXJnczogc3RyaW5nW10pOiBzdHJpbmc7XG5leHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBzdG9yYWdlUGF0aCguLi5hcmdzOiBzdHJpbmdbXSk6IHN0cmluZztcbmV4cG9ydCBkZWNsYXJlIGZ1bmN0aW9uIHJlbGF0aXZlVG9CYXNlUGF0aCguLi5hcmdzOiBzdHJpbmdbXSk6IHN0cmluZztcbmV4cG9ydCBkZWNsYXJlIGZ1bmN0aW9uIHRtcFBhdGgoLi4uYXJnczogc3RyaW5nW10pOiBzdHJpbmc7XG4iLCJpbXBvcnQgdHlwZSB7IExvYWRlclJlY29yZCB9IGZyb20gJy4vZGVmaW5lTG9hZGVyLnRzJztcbmV4cG9ydCBkZWNsYXJlIGZ1bmN0aW9uIGNyZWF0ZUxvYWRlckZhY3Rvcnk8RSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBSIGV4dGVuZHMgTG9hZGVyUmVjb3JkPEU+ID0gTG9hZGVyUmVjb3JkPEU+Pihsb2FkZXJzOiBSKToge1xuICAgIGtleXM6IChrZXlvZiBSKVtdO1xuICAgIGxvYWRlcnM6IFI7XG4gICAgbG9hZDogKGVudGl0aWVzOiBFIHwgRVtdLCBuYW1lczoga2V5b2YgUiB8IChrZXlvZiBSKVtdKSA9PiBQcm9taXNlPHZvaWQ+O1xufTtcbiIsImltcG9ydCB0eXBlIHsgSHR0cENvbnRleHQgfSBmcm9tIFwiI3NlcnZlci9jb250cmFjdHMvSHR0cENvbnRleHRDb250cmFjdC50c1wiO1xuZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gZGVmaW5lSGFuZGxlcihoYW5kbGVyOiAoY3R4OiBIdHRwQ29udGV4dCkgPT4gKFByb21pc2U8YW55PiB8ICgoKSA9PiBhbnkpKSk6IChjdHg6IEh0dHBDb250ZXh0KSA9PiAoUHJvbWlzZTxhbnk+IHwgKCgpID0+IGFueSkpO1xuIiwiZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gZ2VuZXJhdGVJbmRleEZpbGUob3B0aW9uczogYW55KTogdm9pZDtcbiIsImludGVyZmFjZSBPcHRpb25zIHtcbiAgICBjYWNoZT86IGJvb2xlYW47XG4gICAgb25CZWZvcmVJbXBvcnQ/OiAoY3R4OiB7XG4gICAgICAgIGZpbGVuYW1lOiBzdHJpbmc7XG4gICAgfSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gICAgb25BZnRlckltcG9ydD86IChjdHg6IHtcbiAgICAgICAgZmlsZW5hbWU6IHN0cmluZztcbiAgICAgICAgbW9kdWxlOiBhbnk7XG4gICAgfSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gICAgb25FcnJvcj86IChjdHg6IHtcbiAgICAgICAgZmlsZW5hbWU6IHN0cmluZztcbiAgICAgICAgZXJyb3I6IEVycm9yO1xuICAgIH0pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAgIGV4Y2x1ZGU/OiBzdHJpbmdbXTtcbn1cbmV4cG9ydCBkZWNsYXJlIGZ1bmN0aW9uIGltcG9ydEZpbGVzKGZpbGVzOiBzdHJpbmdbXSwgb3B0aW9ucz86IE9wdGlvbnMpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gaW1wb3J0R2xvYihwYXR0ZXJuOiBzdHJpbmcsIG9wdGlvbnM/OiBPcHRpb25zKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcbmV4cG9ydCBkZWNsYXJlIGZ1bmN0aW9uIGltcG9ydEFsbChkaXJlY3Rvcnk6IHN0cmluZywgb3B0aW9ucz86IE9wdGlvbnMpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuZXhwb3J0IHt9O1xuIiwiZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gaW1wb3J0T25lKGZpbGVuYW1lczogc3RyaW5nW10pOiBQcm9taXNlPGFueT47XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQU8sY0FBVTtDQUFBO09BQVksRUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDN0IsSUFBVyxnQkFBTTtDQUFBO09BQUEsRUFBQTtDQUFBLENBQUEsR0FBQTtDQUFBO0FBQ2pCLElBQVcsY0FBVztDQUFJO09BQVUsQ0FBQSxjQUFPO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQzNDLElBQVcsYUFBTztDQUFBO09BQUEsQ0FBQSxZQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBOzs7O0FDSGxCLElBQUEsUUFBVTtDQUFBO09BQU0sRUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtBQUNoQixJQUFJLGdCQUFXO0NBQUE7RUFBQSxNQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBOzs7O0FDRGYsSUFBSSxnQkFBYztDQUFDO0VBQUUsTUFBUSxDQUFDLEVBQUM7Q0FBRztFQUFDO0VBQUk7RUFBSTtFQUFFO0NBQUE7QUFDN0MsSUFBSSxXQUFXO0NBQUM7T0FBUyxDQUFBLGNBQVM7Q0FBQSxDQUFBLEdBQVc7Q0FBQTtBQUM3QyxJQUFBLG1CQUFxQjtDQUFBO0VBQUEsTUFBQTtFQUFBO0VBQWlCO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTs7OztBQ0Z0QyxJQUFBLGdCQUFvQjtDQUFDO09BQUEsQ0FBQSxjQUFjO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7Ozs7QUNDbkMsSUFBQSxrQkFBVTtDQUFBO09BQWdCLEVBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDMUIsSUFBSSxZQUFVO0NBQUE7T0FBQSxFQUFBO0NBQUEsQ0FBQSxJQUFBLEdBQUE7Q0FBQTtBQUNkLElBQUksb0JBQWE7Q0FBQTtPQUFBLENBQUEsVUFBQTtDQUFBLENBQUEsSUFBQSxHQUFBO0NBQUE7QUFDakIsSUFBSSx5QkFBOEI7Q0FBRztPQUFBLENBQUEsY0FBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtBQUNyQyxJQUFJLG9CQUFrQjtDQUFDO0VBQUksUUFBVSxNQUFNO0VBQUE7RUFBRztFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTs7OztBQ0w5QyxJQUFBLGdCQUFvQjtDQUFDO09BQUE7RUFBQTtFQUFjO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTs7OztBQ0VuQyxJQUFXLGNBQWM7Q0FBQztFQUFLLE1BQUcsQ0FBRyxFQUFFO0NBQUU7RUFBQztFQUFJO0VBQUU7RUFBSztDQUFDOzs7O0FDQ3RELElBQUksa0JBQWtCO0NBQUM7T0FBVyxFQUFFO0NBQUMsRUFBQTtDQUFJO0FBQ3pDLElBQUEsZ0JBQVU7Q0FBQTtPQUFZLEVBQUE7Q0FBQSxDQUFBLElBQUEsR0FBQTtDQUFBO0FBQ3RCLElBQVcsMEJBQW9CO0NBQUE7T0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQy9CLElBQUkscUJBQW1CO0NBQUE7T0FBUTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7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QUc7RUFBQTtDQUFBOzs7O0FDQ2hELElBQUksa0JBQWtCO0NBQUM7RUFBRyxNQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDMUIsSUFBSSxlQUFVO0NBQUk7T0FBVztFQUFDO0VBQU07RUFBWTtFQUFNO0VBQU07Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTs7OztBQ0E1RCxJQUFPLFlBQVU7Q0FBQTtPQUFVLENBQUEsV0FBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtBQUMzQixJQUFTLGFBQWE7Q0FBQTtPQUFBO0VBQUE7RUFBQTtFQUFBLE1BQUE7RUFBQSxNQUFBO0VBQUEsTUFBQTtFQUFBLE1BQUE7RUFBQSxNQUFBO0VBQUEsTUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDdEIsSUFBSSxhQUFTO0NBQUE7T0FBVTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBOzs7O0FDTHZCLElBQUEsb0JBQXFCO0NBQUE7T0FBQTtFQUFBO0VBQWtCO0VBQVE7RUFBVztDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7Ozs7QUNDMUQsSUFBQSxvQkFBcUI7Q0FBQTtPQUFBO0VBQUEsR0FBaUI7RUFBQztFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBOzs7O0FDQXZDLElBQU8seUJBQVU7Q0FBQTtPQUF1QixDQUFBLGNBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQ3hDLElBQUksa0JBQWtCO0NBQUE7T0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBOzs7O0FDRnRCLElBQVcsWUFBWTtDQUFDO09BQUUsQ0FBQSxXQUFtQixFQUFBLFlBQVU7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDdkQsSUFBTyxZQUFjO0NBQUE7T0FBYTtFQUFBLEVBQUE7RUFBa0IsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7Ozs7QUNBcEQsSUFBQSxhQUFlO0NBQUE7RUFBTSxNQUFBO0VBQUE7RUFBVyxPQUFBO0VBQUEsT0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7Ozs7QUNDaEMsSUFBTyx1QkFBVTtDQUFBO09BQXFCLENBQUEsWUFBQSxjQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtBQUN0QyxJQUFJLHVCQUFlO0NBQUE7T0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTs7OztBQ0ZuQixJQUFPLGFBQVU7Q0FBQTtPQUFXLENBQUEsR0FBQSxZQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQzVCLElBQVcsbUJBQWlCO0NBQUE7T0FBQSxDQUFBLEdBQUEsWUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDNUIsSUFBQSxtQkFBQTtDQUFBO09BQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBLE9BQUE7RUFBQTtFQUFBO0VBQUE7RUFBQSxPQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBOzs7O0FDQUEsSUFBSSxTQUFTO0NBQUE7T0FBUTtFQUFBLEVBQVE7RUFBVSxFQUFlO0VBQWtCLEVBQVU7RUFBYSxFQUFZO0VBQWtCLEVBQUE7RUFBMkIsRUFBVTtFQUFFLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBLEVBQUE7RUFBQSxFQUFBO0VBQUEsRUFBQTtFQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDcEssSUFBSSxnQkFBdUI7Q0FBQztPQUFVLENBQUMsUUFBQSxZQUFlO0NBQU8sQ0FBQyxJQUFBLEdBQU87Q0FBQztBQUN0RSxJQUFJLFVBQVM7Q0FBQTtPQUFZO0VBQUM7RUFBUTtFQUFTO0VBQUM7RUFBZTtFQUFnQjtFQUFXO0VBQUM7RUFBYTtFQUFZO0VBQVEsT0FBVTtFQUFnQjtFQUFXO0VBQVk7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7Ozs7QUNGekssSUFBQSxlQUFVO0NBQUE7T0FBb0I7RUFBQztFQUFLO0VBQXlCO0VBQUE7Q0FBQTtFQUFBO0VBQVk7RUFBRTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDM0UsSUFBSSxrQkFBZTtDQUFBO09BQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTs7OztBQ0huQixJQUFXLHlCQUFPO0NBQUE7T0FBQSxDQUFBLFlBQUE7Q0FBQSxDQUFBLElBQUEsR0FBQTtDQUFBO0FBQ2xCLElBQUEsa0JBQUE7Q0FBQTtPQUFBO0VBQUE7RUFBQSxTQUFBO0VBQUE7RUFBQTtFQUFBLE9BQUE7RUFBQTtFQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBOzs7O0FDQUEsSUFBTyxrQkFBVTtDQUFBO09BQWdCLENBQUEsR0FBQSxZQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQ2pDLElBQVcsd0JBQWlCO0NBQUE7T0FBQSxDQUFBLEdBQUEsWUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDNUIsSUFBQSxnQkFBQTtDQUFBO09BQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQSxPQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7Ozs7QUNEQSxJQUFBLHdCQUFVO0NBQUE7T0FBc0IsRUFBQTtDQUFBLENBQUEsSUFBQSxHQUFBO0NBQUE7QUFDaEMsSUFBSSxlQUFZO0NBQUE7T0FBTTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBLE9BQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUEsT0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBOzs7O0FDSnRCLElBQU8scUJBQVU7Q0FBQTtPQUFtQixDQUFBLEtBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQ3BDLElBQUksa0JBQVk7Q0FBQTtPQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTs7OztBQ0FoQixJQUFBLGtCQUFxQjtDQUFBO09BQUE7RUFBQTtFQUF1QjtFQUFNO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7Ozs7QUNHbEQsSUFBTyxrQ0FBVTtDQUFBO09BQWdDO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtBQUNqRCxJQUFJLDJCQUFXO0NBQUE7T0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTs7OztBQ0xmLElBQUEsTUFBTztDQUFBO09BQWMsQ0FBQSxRQUFJLFVBQVE7Q0FBUTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7Ozs7QUNBekMsSUFBTyxVQUFVO0NBQUE7T0FBUSxFQUFBO0NBQUEsQ0FBQSxHQUFBO0NBQUE7QUFDekIsSUFBVSxXQUFZO0NBQUE7T0FBQSxFQUFBO0NBQUEsQ0FBQSxHQUFBO0NBQUE7QUFDdEIsSUFBQSxjQUFBO0NBQUE7T0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBOzs7O0FDRkEsSUFBTyxXQUFVO0NBQUE7T0FBUyxFQUFBO0NBQUEsQ0FBQSxHQUFBO0NBQUE7QUFDMUIsSUFBSSxlQUFnQjtDQUFBO09BQUEsQ0FBQSxRQUFBLFNBQUE7Q0FBQSxDQUFBLElBQUEsR0FBQTtDQUFBO0FBQ3BCLElBQUEsYUFBQTtDQUFBO09BQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDQSxJQUFBLDJCQUEyQjtDQUFBO0VBQU8sTUFBUTtFQUFBO0VBQU87RUFBUztFQUFNO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtBQUNoRSxJQUFBLHlCQUE0QjtDQUFBO0VBQUEsTUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDNUIsSUFBVyx5QkFBeUI7Q0FBQztFQUFBLE1BQVE7RUFBQTtFQUFhO0VBQUE7RUFBQTtFQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtBQUMxRCxJQUFBLFVBQUE7Q0FBQTtFQUFBLE1BQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBOzs7O0FDTkEsSUFBSSxjQUFjO0NBQUM7T0FBUyxFQUFJO0NBQUUsRUFBRTtDQUFBO0FBQ3BDLElBQUEsUUFBTztDQUFBO09BQWM7RUFBQTtFQUFNO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBOzs7O0FDRTNCLElBQUEsZUFBVTtDQUFBO09BQW1CLEVBQUE7Q0FBQSxFQUFBO0NBQUE7QUFDN0IsSUFBSSxxQkFBWTtDQUFVO09BQUEsQ0FBQSxZQUFBLGFBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtBQUMxQixJQUFJLGNBQVM7Q0FBQTtPQUFZLEVBQUE7Q0FBQSxDQUFBLEdBQUE7Q0FBQTtBQUN6QixJQUFBLGVBQUE7Q0FBQTtPQUFBLENBQUEsZUFBQSxjQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQ0EsSUFBQSxxQkFBc0I7Q0FBQTtPQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtBQUN0QixJQUFJLGdCQUFlO0NBQUE7RUFBQSxHQUFBLE1BQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7Ozs7QUNSbkIsSUFBTyxrQkFBVTtDQUFBO09BQWdCLEVBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDakMsSUFBSSxlQUFZO0NBQUE7T0FBQTtFQUFB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RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBOzs7O0FDakJ0QyxJQUFPLGVBQVU7Q0FBQTtPQUFhLEVBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDOUIsSUFBUyx1QkFBTTtDQUFBO09BQUEsQ0FBQSxhQUFBO0NBQUEsQ0FBQSxJQUFBLEdBQUE7Q0FBQTtBQUNmLElBQUksdUJBQVk7Q0FBQTtFQUFBLFNBQUEsTUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBOzs7O0FDSmhCLElBQUEsa0JBQXFCO0NBQUE7RUFBQSxNQUFBO0VBQUE7RUFBZ0I7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTs7OztBQ0lyQyxJQUFPLGtCQUFVO0NBQUE7T0FBZ0IsRUFBQTtDQUFBLENBQUEsSUFBQSxHQUFBO0NBQUE7QUFDakMsSUFBUSxZQUFNO0NBQUE7T0FBQSxDQUFBLEtBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQ2QsSUFBSSxjQUFpQjtDQUFBO09BQUEsRUFBQTtDQUFBLENBQUEsR0FBQTtDQUFBO0FBQ3JCLElBQUEsa0JBQUE7Q0FBQTtPQUFBLEVBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQ0EsSUFBTyx5QkFBb0I7Q0FBQTtPQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtBQUMzQixJQUFJLGtCQUFZO0NBQUE7T0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtF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O0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBOzs7O0FDR3BCLElBQUksaUJBQXFCO0NBQUE7T0FBTyxFQUFBO0NBQUEsRUFBQTtDQUFjO0FBQzlDLElBQVcsd0JBQWtCO0NBQUE7T0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQzdCLElBQUEsNkJBQUE7Q0FBQTtPQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtBQUNBLElBQUEsd0JBQWM7Q0FBQTtPQUFBO0VBQTBCO0VBQUU7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBOzs7O0FDUDFDLElBQVcsY0FBYztDQUFDO09BQVc7RUFBQTtFQUFXO0VBQU87RUFBYTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtBQUNwRSxJQUFBLFlBQVU7Q0FBQTtPQUFRLEVBQUE7Q0FBQSxDQUFBLEdBQUE7Q0FBQTtBQUNsQixJQUFJLGNBQVc7Q0FBQTtFQUFPLEdBQUEsVUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTs7OztBQ0N0QixJQUFBLHVCQUFxQjtDQUFBO09BQUE7RUFBQTtFQUE2QjtFQUFzQjtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7Ozs7QUNIeEUsSUFBQSxpQkFBVTtDQUFBO09BQWUsQ0FBQSxPQUFBLFdBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQ3pCLElBQUksZUFBWTtDQUFBO09BQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTs7OztBQ0RoQixJQUFPLGFBQVU7Q0FBQTtFQUFZLE1BQUcsQ0FBRyxFQUFFO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDckMsSUFBVyxrQkFBRztDQUFBO09BQUEsRUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQ2QsSUFBVSxvQkFBTTtDQUFBO09BQUEsQ0FBQSxpQkFBQSxnQkFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtBQUNoQixJQUFJLG9CQUFnQjtDQUFBO09BQUEsRUFBQTtDQUFBLENBQUEsR0FBQTtDQUFBO0FBQ3BCLElBQUkscUJBQWE7Q0FBQTtFQUFBLFNBQUEsYUFBQSxhQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTs7OztBQ0hqQixJQUFBLG1CQUFxQjtDQUFBO0VBQUEsU0FBaUIsYUFBVTtFQUFBO0VBQU87RUFBYTtFQUFZO0VBQWtCO0VBQUc7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFB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QUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQ3JELElBQUEscUJBQUE7Q0FBQTtFQUFBLEdBQUEsTUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7Ozs7QUNUQSxJQUFPLHdCQUFVO0NBQUE7RUFBd0IsTUFBQTtFQUFBO0VBQWM7RUFBQTtFQUFVO0VBQVE7RUFBbUI7RUFBQztFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQzdGLElBQVcsaUJBQVE7Q0FBQTtFQUFBLEdBQUEsTUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7Ozs7QUNEbkIsSUFBTyxjQUFVO0NBQUE7RUFBYyxNQUFBO0VBQUE7RUFBYztFQUFBO0VBQVU7RUFBUTtFQUFtQjtFQUFDO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDbkYsSUFBVyxPQUFPO0NBQUE7RUFBQSxHQUFBLE1BQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBOzs7O0FDQWxCLElBQU8sa0JBQVU7Q0FBQTtFQUFrQixNQUFBO0VBQUE7RUFBYztFQUFVO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQzNELElBQVcsaUJBQVE7Q0FBQTtFQUFBLEdBQUEsTUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDbkIsSUFBVyxXQUFNO0NBQUE7RUFBQSxHQUFBLE1BQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VB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QU87RUFBQTtFQUFjO0VBQUE7RUFBaUI7RUFBTztFQUFhO0VBQU07RUFBUztFQUFVO0VBQU07RUFBUTtFQUFZO0VBQU87RUFBQTtFQUFNO0VBQUk7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBOzs7O0FDdEJoSyxJQUFBLFdBQVU7Q0FBQTtPQUFTLENBQUEsUUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtBQUNuQixJQUFJLFdBQUs7Q0FBQTtFQUFhLEdBQUcsT0FBRSxNQUFRO0VBQUk7RUFBQztFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTs7OztBQ0R4QyxJ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QTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDWCxJQUFRLDZCQUFnQztDQUFDO0VBQUEsU0FBQSxjQUFBLGtCQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTs7OztBQ0Z6QyxJQUFJLG1CQUFtQjtDQUFDO0VBQUksTUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQzVCLElBQUksY0FBQTtDQUFlO0VBQUUsTUFBTztFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7Ozs7QUNLNUIsSUFBSSxXQUFJO0NBQUE7T0FBbUIsRUFBQztDQUFBLENBQUEsSUFBTyxHQUFBO0NBQUE7QUFDbkMsSUFBSSxZQUFZO0NBQUM7RUFBQyxNQUFRO0VBQUE7RUFBUTtFQUFpQztFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBLFNBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtBQUNuRSxJQUFJLE9BQU87Q0FBQztPQUFPO0VBQUE7RUFBUTtFQUFZO0VBQVE7RUFBTztFQUFTLE9BQUs7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTs7OztBQ0pwRSxJQUFJLGdCQUFDO0NBQUE7RUFBQSxNQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUEsU0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQ0wsSUFBSSxXQUFTO0NBQUE7T0FBQSxDQUFBLGNBQUE7Q0FBQSxDQUFBLEdBQUE7Q0FBQTs7OztBQ0piLElBQUEsY0FBYztDQUFBO09BQWEsQ0FBQSxTQUFPO0NBQUksQ0FBQSxHQUFBO0NBQUE7QUFDdEMsSUFBQSxTQUFPO0NBQU87T0FBTztFQUFBO0VBQWUsTUFBQTtFQUFZO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtF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
|